Pouco tempo tive um problema em meu Leopard, todos os comando que dava no Rails como script/server ou script/generate entre outro me informavam que o RubyGem não estava instalado, isso ocorreu após uma atualização de gem utilizando o comando sudo gem update, antes de tudo fui buscar pelo erro o por que disso está acontecendo, e logo achei a resposta, sempre fiz minhas instalações pelo MacPort logo tudo era instalado em /opt/local e por algum motivo que não sei, o RubyGem não estava nesse lugar e sim em /usr/local, assim como também o MySql e o Rails, então a solução foi excluí o MacPorts pra ter certeza que não me traria mas confusão, excluí tudo em /opt/local nesse momento já não tinha mais o Ruby e então fui instalando tudo manualmente como mostrarei abaixo.

A primeira coisa a fazer é mudar nosso PATH no profile de seu usuário, para quem tem o Textmate darei um mate no caminho pra quem não tem é somente utilizar um editor de texto preferido no caminho ~/.profile, segue abaixo como fiz:

mate ~/.profile

Comente seu PATH na linha que inicia em export PATH e inclua a instrução abaixo:

export PATH=”/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH”

Dessa forma informamos os nossos locais para instalações, e agora precisaremos executa-lo assim:

~/.profile

Agora vamos criar um diretório com permissões de ROOT para que possamos baixar e compilar direto desse diretório.

sudo mkdir -p /usr/local/src
sudo chgrp admin /usr/local/src
sudo chmod -R 775 /usr/local/src

O próximo passo é baixar e compilar o Ruby 1.8 via Terminal:

cd /usr/local/src
curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
tar xzvf ruby-1.8.7-p72.tar.gz
cd ruby-1.8.7-p72
./configure –enable-shared –enable-pthread CFLAGS=-D_XOPEN_SOURCE=1
make && sudo make install

Vamos ver se o Ruby foi instalado e verificar se o diretório da instalação está correto:

which ruby

Se tudo ocorreu bem deverá aparecer o seguinte caminho:

/usr/local/bin/ruby

Pronto terminamos a instalação do Ruby manualmente, e com um ruby -v algo como ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.6.0] deverá ser mostrado.

Instalando o RubyGem

cd /usr/local/src
curl -O http://rubyforge.iasi.roedu.net/files/rubygems/rubygems-1.3.1.tgz
tar xzvf rubygems-1.3.1.tgz
cd rubygems-1.3.1
sudo /usr/local/bin/ruby setup.rb

sudo gem install rails

Instalação do Mongrel e Capistrano

sudo gem install mongrel
sudo gem install capistrano

Para finalizar nosso Tutorial falta então instalarmos o Mysql, vamos lá:

Lembro que para instalação do Mysql na Gem, precisamos antes te-lo instalado no Mac, o arquivo pode ser baixado no site do Mysql em formato DMG ou PKG, como instalei a versão 5 utilizei o endereço http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg , após instalarem devemos utilizar o comando a seguir para então instalarmos no Ruby:

sudo gem install mysql — –with-mysql-dir=/usr/local/mysql

Pronto,

Pessoal, feito isso, temos nosso ambiente para desenvolvermos aplicações ruby on rails com mysql funcionando.

Um abraço a todos, e caso tenham dúvidas, deixem um comentário.

Em breve vou mostrar como é facil configurar com o NetBeans!

 

 

A declaração DOCTYPE deve ser a primeira coisa em um documento HTML, antes da tag .

A declaração DOCTYPE não é uma tag HTML, que é uma instrução para o navegador web sobre qual versão da linguagem de marcação da página está escrito dentro

A declaração doctype se refere a uma Document Type Definition (DTD). O DTD especifica regras para a linguagem de marcação, para que os browsers pode tornar o conteúdo corretamente.HTML / XHTML e elementos válidos DTDs

Doctypes Disponível nas Recomendações do W3C
HTML 4.01 Strict

Esta DTD contém todos os elementos HTML e atributos, mas não inclui elementos de apresentação ou obsoleto (como fonte). Framesets não são permitidos.

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>

 

HTML 4.01 Transitional

Esta DTD contém todos os elementos HTML e atributos, incluindo elementos de apresentação e obsoleto (como fonte). Framesets não são permitidos.

<! DOCTYPE HTML PUBLIC “- / / W3C / / DTD HTML 4.01 Transitional / / EN” http://www.w3.org/TR/html4/loose.dtd “>

HTML Frameset 4,01

Esta DTD é igual ao HTML 4.01 Transitional, mas permite a utilização de conteúdos frameset.

<! DOCTYPE HTML PUBLIC “- / / W3C / / DTD HTML 4.01 Frameset / / EN” “http://www.w3.org/TR/html4/frameset.dtd”>

XHTML 1.0 Strict

Esta DTD contém todos os elementos HTML e atributos, mas não inclui elementos de apresentação ou obsoleto (como fonte). Framesets não são permitidos. A marcação deve também ser escrito como XML bem formado.

 

<! DOCTYPE html PUBLIC “- / / W3C / / DTD XHTML 1.0 Strict / / EN” http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd “>

 

XHTML 1.0 Transitional

Esta DTD contém todos os elementos HTML e atributos, incluindo elementos de apresentação e obsoleto (como fonte). Framesets não são permitidos. A marcação deve também ser escrito como XML bem formado.

<! DOCTYPE html PUBLIC “- / / W3C / / DTD XHTML 1.0 Transitional / / EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

XHTML Frameset 1,0

Esta DTD é igual XHTML 1.0 Transitional, mas permite a utilização de conteúdos frameset.

<! DOCTYPE html PUBLIC “- / / W3C / / DTD XHTML 1.0 Frameset / / EN” http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd”>

XHTML 1.1

Esta DTD é igual XHTML 1.0 Strict, mas permite que você adicione módulos (por exemplo, para fornecer suporte a Ruby para idiomas do leste asiático).

<! DOCTYPE html PUBLIC “- / / W3C / / DTD XHTML 1.1 / / EN” http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

Porem com o HTML 5 a coisa muda de rumo e vira somente <!DOCTYPE> muito mais fácil de memorizar, e convenhamos que não precisamos mais abrir outro arquivo php ou html pronto pra copiar o Doctype.

Tradução de [W3School ]

 

O Computador e a Programação

On 30 de abril de 2011, in CSS, PHP, Programação, by esandre

O computador digital surgiu em resposta à necessidade do homem quanto a maneiras mais rápidas e eficientes de realizar grandes computações numéricas. Tais computações originam-se em situações práticas, como na solução de problemas de projeto de engenharia, bem como no decorrer de tentativas teóricas, tal como a de procurar localizar números primos. Tarefas como estas podiam ser executadas sem o auxilio da tecnologia do computador, mas em muitos exemplos seus valores seriam negados pelos seus custos em homem-horas e em resistência humana.

Qualquer pessoa que tenha vivido num período onde estas máquinas não eram assim tão populares consegue entender o quanto se evoluiu nesta área, atingindo-se um alto e crescente nível de automatização.
Este nível de desenvolvimento da informática tem permitido acelerar a realização de tarefas e torna possível a realização de atividades impensáveis há alguns anos atrás. A automação bancária, os equipamentos informatizados para a medicina, as redes de computadores, os sistemas multimídias, os videogames, são apenas alguns poucos exemplos de serviços e de alternativas de lazer que os computadores têm oferecido ao ser humano. Neste artigo, será relatada uma parte da “aventura” que nos permitiu ter, nos dias as poderosas máquinas e aplicações que nos rodeiam, através de como funcionam as arquiteturas de computadores, desde os primórdios da informática ou da Ciência da Computação.
Conceito de Computador Digital e Sua Estrutura
Mas o que seria um computador? – este pode ser definido como sendo uma máquina capaz de sistematicamente coletar, manipular e fornecer os resultados da manipulação de informações para um ou mais objetivos. Também pode ser definido como sendo uma máquina cuja função é resolver problemas através da execução de instruções que lhe são fornecidas. É constituído basicamente de dispositivos eletrônicos e eletromecânicos que permitem transmitir, guardar e manipular informações. Daí também ser chamado de equipamento de processamento eletrônico de dados.
O Processamento de dados consiste em extrair informação de dados. A extração de informação não é nada mais do que uma análise de conteúdo dos dados em questão e as relações retiradas dessa análise. Poderá também ser apenas a análise a frio, como por exemplo, número de dias do ano em que choveu número de cidades com problemas de tráfego, altura média de pessoas do sexo masculino em Portugal. A figura abaixo ilustra as etapas básicas de um processamento de dados. Dentro do contexto de computação, é importante diferenciar os termos dado e informação, embora, algumas vezes, eles possam ser tratados como sinônimos.
Os dados referem-se a uma recolha de informações organizadas, normalmente o resultado da experiência ou observação de outras informações dentro de um sistema de computador, ou um conjunto de instalações. Os dados podem consistir em números, palavras ou imagens, as medições e observações de um conjunto de variáveis; informações, registro que identifica alguma coisa tanto objeto ou animal. Informação é o resultado do processamento, manipulação e organização de dados, de tal forma que represente uma modificação (quantitativa ou qualitativa) no conhecimento do sistema (pessoa, animal ou máquina) que a recebe.
Dados os conceitos de dado e informação, podemos novamente definir computador como sendo um sistema coordenado de procedimentos e equipamentos capazes de manipular e transformar dados segundo um plano determinado, produzindo resultados informativos a partir destes dados. Tais resultados são utilizados para tomada de decisões mais precisas a cerca de pesquisas, planejamentos e gerenciamentos.
O que diferencia o computador de outras máquinas é o fato de não ter sua utilização pré-estabelecida em seu projeto, sua função é estabelecida conforme os procedimentos considerados para se alcançar determinados objetivos. Tais procedimentos controlam os equipamentos, sendo a parte lógica de um sistema de computação, o que é denominado software (soft: leve, intangível; ware: equipamentos). A parte física, visível de um computador (seus equipamentos eletromecânicos e circuitos eletrônicos) é denominada hardware (hard: duro, sólido e ware: equipamento).
Programação e o Conceito de Algoritmo
Programação é o processo de escrita, teste e manutenção de um programa de computador. O programa é escrito em uma linguagem de programação, embora seja possível, com alguma dificuldade, escrevê-lo diretamente em linguagem de máquina. Diferentes partes de um programa podem ser escritas em diferentes linguagens. Cada linguagem de programação tem a sua semâtica e sintaxe, como em qualquer linguagem, por exemplo, a lingua portuguesa. Por esse motivo, os programadores podem criar programas muito diferentes para diferentes linguagens; muito embora, teoricamente, a maioria das linguagens possa ser usada para criar qualquer programa.
Um Software é composto por instruções que podem ser executadas diretamente por um processador dizemos que está escrito em linguagem de máquina. A execução de um software também pode ser intermediada por um programa interpretador, responsável por interpretar e executar cada uma de suas instruções. Um programa de computador é composto por uma sequência de instruções (algoritmos), que é interpretada e executada por um processador ou por uma máquina virtual. Em um programa correto e funcional, essa sequência segue padrões específicos que resultam em um comportamento desejado. Um programa pode ser executado por qualquer dispositivo capaz de interpretar e executar as instruções de que é formado. Para realizar uma determinada ação, um computador necessita de instruções precisas, completas e finitas sobre cada passo a executar. Por exemplo, para um computador calcular a área do círculo usando a fórmula p.r2, com um valor numérico para o raio do circulo (r) como dado de entrada, temos os seguintes passos:
  1. Ler o valor numérico para o raio do circulo e armazená-lo na memória.
  2. Calcular o valor da área usando a fórmula p.r2 e armazená-lo na memória.
  3. Imprimir e/ou mostrar no monitor os valores dos raios e áreas correspondentes.
  4. Parar.
Os passos ordenados constituem o que é denominado algoritmo. Um algoritmo é um conjunto finito de regras que fornece uma sequência de operações para resolver um problema específico. Um algoritmo opera sobre um conjunto de entradas (no caso do bolo, farinha ovos, fermento, etc.) de modo a gerar uma saída que seja útil (ou agradável) para o usuário (o bolo pronto). Um algoritmo tem cinco características importantes:
Finitude:
Um algoritmo deve sempre terminar após um número finito de passos.
Definição:
Cada passo de um algoritmo deve ser precisamente definido. As ações devem ser definidas rigorosamente e sem ambiguidades.
Entradas:
Um algoritmo deve ter zero ou mais entradas, isto é informações que são lhe são fornecidas antes do algoritmo iniciar.
Saídas:
Um algoritmo deve ter uma ou mais saídas, isto é quantidades que tem uma relação específica com as entradas.
Efetividade:
Um algoritmo deve ser efetivo. Isto significa que todas as operações devem ser suficientemente básicas de modo que possam ser em princípio executadas com precisão em um tempo finito por um humano usando papel e lápis.
Os passos de um algoritmo são as instruções que serão executadas pelas máquinas, as quais devem ser com uma linguagem que o computador “entenda”. Assim, “um programa é a formalização de um algoritmo em linguagem inteligível pelo computador” (Guimarães/Lages). Linguagem de computador é uma coleção de cadeias de símbolos, de comprimento finito. Estas cadeias são denominadas sentenças de linguagem e são formadas pela justaposição de elementos individuais ou símbolos. A linguagem de um computador é baseada em impulsos elétricos (desligado (0) e ligado (1)). É uma linguagem de difícil manipulação e entendimento pelo ser humano, por isso foram desenvolvidas linguagens de programação mais próximas da linguagem humana (Pascal, Fortran, C etc.). Estas linguagens apresentam uma sintaxe rígida sobre a qual são construídas as descrições de cada passo de um algoritmo e são denominados linguagens de alto nível. As linguagens de alto nível são transformadas em linguagem de computador (linguagem de baixo nível ou de máquina) por programas interpretadores e tradutores.
Programas tradutores substituem cada instrução da linguagem de maior nível por uma sequência equivalente de instruções em linguagem de baixo nível. O computador então executa o novo programa em linguagem de baixo nível em vez do programa em uma linguagem de maior nível. Programas interpretadores recebem os programas escritos em linguagem de maior nível como dados de entrada e efetuam a execução examinando uma instrução de cada vez e executando a sequência equivalente de instruções em linguagem de baixo nível diretamente.
Estrutura de Controle
Estrutura de controle refere-se à ordem em que instruções, expressões e chamadas de função são executadas ou avaliadas em programas de computador sob programação imperativa ou funcional.
Os tipos de estruturas de controle disponíveis diferem de linguagem para linguagem, mas podem ser cruamente caracterizados por seus efeitos. O primeiro é a continuação da execução em outra instrução, como na estrutura sequencial ou em uma instrução jump. O segundo é a execução de um bloco de código somente se uma condição é verdadeira, uma estrutura de seleção. O terceiro é a execução de um bloco de código enquanto uma condição é verdadeira, ou de forma a iterar uma coleção de dados, uma estrutura de repetição. O quarto é a execução de instruções distantes entre si, em que o controle de fluxo possivelmente volte para a posição original posteriormente, como chamadas de subrotinas e corotinas. O quinto é a parada do programa de computador. Em nível de linguagem de máquina, as instruções de estruturas de controle geralmente funcionam ao alterar o contador de programa. Para algumas CPUs, as únicas instruções de estruturas de controle disponíveis são os diversos tipos de jump condicional.
A importância dos Algoritmos para a Computação
No começo, quando alguém precisava desenvolver um programa, tinha que se preocupar com todos os aspectos relacionados ao seu desenvolvimento, desde como usar os recursos da máquina como disco, impressoras e tudo mais, até criar as soluções para o problema do usuário propriamente dito. Com o tempo começou-se a usar rotinas e bibliotecas bem definidas do sistema operacional para fazer a parte de mais baixo nível e os programadores passaram a se concentrar especificamente nos problemas de programas dos usuários. Em pouco tempo percebeu-se que muitas coisas eram feitas por todos os programadores com os mesmos objetivos, mas de formas um pouco diferentes, esse tipo de trabalho dobrado acabava por consumir muito tempo.
Então sabendo que um algoritmo é uma forma de resolver um problema podemos falar de sua importância. Se precisarmos resolver um problema para o qual existe um algoritmo, basta consultar os livros e materiais sem ter que se preocupar em inventar novamente a solução. Embora pareça óbvio pode não ser, muitas vezes as pessoas acabam refazendo as coisas que já estão documentadas por aí. Existem diversos motivos para isso acontecer e um dos mais fortes é a vontade individual de desenvolver uma ferramenta ou biblioteca que faz alguma coisa interessante. A maior parte do desenvolvimento que temos no mercado se concentra em criar soluções para problemas do usuário utilizando o máximo possível de ferramentas fornecidas por alguma empresa. O resultado é que alguns dos programadores acabam ficando frustrados por nunca fazer alguma coisa realmente desafiadora.
Conhecer os algoritmos existentes e (pelo menos onde encontrar) suas implementações pode economizar tempo precioso na entrega de um produto de software. Durante os cursos nas faculdades aprendemos, por exemplo, alguns algoritmos de ordenação de dados e como se aplicam as diversas estruturas de dados que existem. Em algumas linguagens de programação esses algoritmos já estão disponíveis, e quando não é o caso já existem bibliotecas para usá-los. Saber usar esse recurso torna-se vantajoso não só porque agiliza o desenvolvimento, mas porque muitas vezes aumenta a qualidade do produto final. Quando criamos um código inteiro por nossa conta, temos que executar muitos testes para garantir que tudo está funcionando como deveria, mas se estivermos criando uma biblioteca de funções ao mesmo tempo em que criamos um produto que se utiliza dessa biblioteca dificilmente teremos o tempo necessário para realizar a quantidade de testes necessária a garantir a qualidade esperada.
A mistura de visões pode ser um grande problema para o programador. É necessário conhecer bem os diferentes papéis que podemos exercer durante o desenvolvimento e conhecer as ferramentas a mão. O conhecimento de formas de solução de problemas á um grande aliado na entrega de produtos de forma rápida e com maior qualidade. O Computador é uma máquina capaz de executar variados tipos de tratamento automático de informações ou processamento de dados. Exemplos de computadores incluem o ábaco, a calculadora, o computador analógico e o computador digital. Um computador pode prover-se de inúmeros atributos, dentre eles armazenamento de dados, processamento de dados, cálculo em grande escala, desenho industrial, tratamento de imagens gráficas, realidade virtual, entretenimento e cultura.
No passado, o termo já foi aplicado a pessoas responsáveis por algum cálculo. Em geral, entende-se por computador um sistema físico que realiza algum tipo de computação. Existe ainda o conceito matemático rigoroso, utilizado na teoria da computação. Os computadores fazem parte da vida corrente e são, hoje em dia, aparelhos quase tão familiares como os telefones, os televisores e os frigoríficos. Se ainda há pessoas (cada vez menos) que os olham com desconfiança, é porque foram condicionadas nesse sentido. É um pouco como os peles-vermelhas, que tinham medo que os fotografassem, porque isso lhes roubava a alma. Quem quisesse mesmo tirar-lhes o retrato, ou o fazia às escondidas, ou explicava pacientemente que aquilo não interferia com a vida eterna.
Tal como os computadores, os programas são coisas diferentes para pessoas diferentes. Ou até coisas diferentes para a mesma pessoa, consoante a perspectiva em que ela se coloque. Uma definição circular: um computador é uma máquina programável e um programa é uma sequência de instruções para um computador! Não faz mal, que a gente percebe. No entanto, há uma certa vantagem em libertar a noção de programa da de computador.

O computador digital surgiu em resposta à necessidade do homem quanto a maneiras mais rápidas e eficientes de realizar grandes computações numéricas. Tais computações originam-se em situações práticas, como na solução de problemas de projeto de engenharia, bem como no decorrer de tentativas teóricas, tal como a de procurar localizar números primos. Tarefas como estas podiam ser executadas sem o auxilio da tecnologia do computador, mas em muitos exemplos seus valores seriam negados pelos seus custos em homem-horas e em resistência humana.
Qualquer pessoa que tenha vivido num período onde estas máquinas não eram assim tão populares consegue entender o quanto se evoluiu nesta área, atingindo-se um alto e crescente nível de automatização.
Este nível de desenvolvimento da informática tem permitido acelerar a realização de tarefas e torna possível a realização de atividades impensáveis há alguns anos atrás. A automação bancária, os equipamentos informatizados para a medicina, as redes de computadores, os sistemas multimídias, os videogames, são apenas alguns poucos exemplos de serviços e de alternativas de lazer que os computadores têm oferecido ao ser humano. Neste artigo, será relatada uma parte da “aventura” que nos permitiu ter, nos dias as poderosas máquinas e aplicações que nos rodeiam, através de como funcionam as arquiteturas de computadores, desde os primórdios da informática ou da Ciência da Computação.

Conceito de Computador Digital e Sua Estrutura

Mas o que seria um computador? – este pode ser definido como sendo uma máquina capaz de sistematicamente coletar, manipular e fornecer os resultados da manipulação de informações para um ou mais objetivos. Também pode ser definido como sendo uma máquina cuja função é resolver problemas através da execução de instruções que lhe são fornecidas. É constituído basicamente de dispositivos eletrônicos e eletromecânicos que permitem transmitir, guardar e manipular informações. Daí também ser chamado de equipamento de processamento eletrônico de dados.

O Processamento de dados consiste em extrair informação de dados. A extração de informação não é nada mais do que uma análise de conteúdo dos dados em questão e as relações retiradas dessa análise. Poderá também ser apenas a análise a frio, como por exemplo, número de dias do ano em que choveu número de cidades com problemas de tráfego, altura média de pessoas do sexo masculino em Portugal. A figura abaixo ilustra as etapas básicas de um processamento de dados. Dentro do contexto de computação, é importante diferenciar os termos dado e informação, embora, algumas vezes, eles possam ser tratados como sinônimos.
Os dados referem-se a uma recolha de informações organizadas, normalmente o resultado da experiência ou observação de outras informações dentro de um sistema de computador, ou um conjunto de instalações. Os dados podem consistir em números, palavras ou imagens, as medições e observações de um conjunto de variáveis; informações, registro que identifica alguma coisa tanto objeto ou animal. Informação é o resultado do processamento, manipulação e organização de dados, de tal forma que represente uma modificação (quantitativa ou qualitativa) no conhecimento do sistema (pessoa, animal ou máquina) que a recebe.
Dados os conceitos de dado e informação, podemos novamente definir computador como sendo um sistema coordenado de procedimentos e equipamentos capazes de manipular e transformar dados segundo um plano determinado, produzindo resultados informativos a partir destes dados. Tais resultados são utilizados para tomada de decisões mais precisas a cerca de pesquisas, planejamentos e gerenciamentos.
O que diferencia o computador de outras máquinas é o fato de não ter sua utilização pré-estabelecida em seu projeto, sua função é estabelecida conforme os procedimentos considerados para se alcançar determinados objetivos. Tais procedimentos controlam os equipamentos, sendo a parte lógica de um sistema de computação, o que é denominado software (soft: leve, intangível; ware: equipamentos). A parte física, visível de um computador (seus equipamentos eletromecânicos e circuitos eletrônicos) é denominada hardware (hard: duro, sólido e ware: equipamento).

Programação e o Conceito de Algoritmo
Programação é o processo de escrita, teste e manutenção de um programa de computador. O programa é escrito em uma linguagem de programação, embora seja possível, com alguma dificuldade, escrevê-lo diretamente em linguagem de máquina. Diferentes partes de um programa podem ser escritas em diferentes linguagens. Cada linguagem de programação tem a sua semâtica e sintaxe, como em qualquer linguagem, por exemplo, a lingua portuguesa. Por esse motivo, os programadores podem criar programas muito diferentes para diferentes linguagens; muito embora, teoricamente, a maioria das linguagens possa ser usada para criar qualquer programa.
Um Software é composto por instruções que podem ser executadas diretamente por um processador dizemos que está escrito em linguagem de máquina. A execução de um software também pode ser intermediada por um programa interpretador, responsável por interpretar e executar cada uma de suas instruções. Um programa de computador é composto por uma sequência de instruções (algoritmos), que é interpretada e executada por um processador ou por uma máquina virtual. Em um programa correto e funcional, essa sequência segue padrões específicos que resultam em um comportamento desejado. Um programa pode ser executado por qualquer dispositivo capaz de interpretar e executar as instruções de que é formado. Para realizar uma determinada ação, um computador necessita de instruções precisas, completas e finitas sobre cada passo a executar. Por exemplo, para um computador calcular a área do círculo usando a fórmula p.r2, com um valor numérico para o raio do circulo (r) como dado de entrada, temos os seguintes passos:
Ler o valor numérico para o raio do circulo e armazená-lo na memória.Calcular o valor da área usando a fórmula p.r2 e armazená-lo na memória.Imprimir e/ou mostrar no monitor os valores dos raios e áreas correspondentes.Parar.
Os passos ordenados constituem o que é denominado algoritmo. Um algoritmo é um conjunto finito de regras que fornece uma sequência de operações para resolver um problema específico. Um algoritmo opera sobre um conjunto de entradas (no caso do bolo, farinha ovos, fermento, etc.) de modo a gerar uma saída que seja útil (ou agradável) para o usuário (o bolo pronto). Um algoritmo tem cinco características importantes:
Finitude: Um algoritmo deve sempre terminar após um número finito de passos.
Definição: Cada passo de um algoritmo deve ser precisamente definido. As ações devem ser definidas rigorosamente e sem ambiguidades.
Entradas: Um algoritmo deve ter zero ou mais entradas, isto é informações que são lhe são fornecidas antes do algoritmo iniciar.
Saídas: Um algoritmo deve ter uma ou mais saídas, isto é quantidades que tem uma relação específica com as entradas.
Efetividade: Um algoritmo deve ser efetivo. Isto significa que todas as operações devem ser suficientemente básicas de modo que possam ser em princípio executadas com precisão em um tempo finito por um humano usando papel e lápis.
Os passos de um algoritmo são as instruções que serão executadas pelas máquinas, as quais devem ser com uma linguagem que o computador “entenda”. Assim, “um programa é a formalização de um algoritmo em linguagem inteligível pelo computador” (Guimarães/Lages). Linguagem de computador é uma coleção de cadeias de símbolos, de comprimento finito. Estas cadeias são denominadas sentenças de linguagem e são formadas pela justaposição de elementos individuais ou símbolos. A linguagem de um computador é baseada em impulsos elétricos (desligado (0) e ligado (1)). É uma linguagem de difícil manipulação e entendimento pelo ser humano, por isso foram desenvolvidas linguagens de programação mais próximas da linguagem humana (Pascal, Fortran, C etc.). Estas linguagens apresentam uma sintaxe rígida sobre a qual são construídas as descrições de cada passo de um algoritmo e são denominados linguagens de alto nível. As linguagens de alto nível são transformadas em linguagem de computador (linguagem de baixo nível ou de máquina) por programas interpretadores e tradutores.
Programas tradutores substituem cada instrução da linguagem de maior nível por uma sequência equivalente de instruções em linguagem de baixo nível. O computador então executa o novo programa em linguagem de baixo nível em vez do programa em uma linguagem de maior nível. Programas interpretadores recebem os programas escritos em linguagem de maior nível como dados de entrada e efetuam a execução examinando uma instrução de cada vez e executando a sequência equivalente de instruções em linguagem de baixo nível diretamente.

Estrutura de Controle
Estrutura de controle refere-se à ordem em que instruções, expressões e chamadas de função são executadas ou avaliadas em programas de computador sob programação imperativa ou funcional.Os tipos de estruturas de controle disponíveis diferem de linguagem para linguagem, mas podem ser cruamente caracterizados por seus efeitos. O primeiro é a continuação da execução em outra instrução, como na estrutura sequencial ou em uma instrução jump. O segundo é a execução de um bloco de código somente se uma condição é verdadeira, uma estrutura de seleção. O terceiro é a execução de um bloco de código enquanto uma condição é verdadeira, ou de forma a iterar uma coleção de dados, uma estrutura de repetição. O quarto é a execução de instruções distantes entre si, em que o controle de fluxo possivelmente volte para a posição original posteriormente, como chamadas de subrotinas e corotinas. O quinto é a parada do programa de computador. Em nível de linguagem de máquina, as instruções de estruturas de controle geralmente funcionam ao alterar o contador de programa. Para algumas CPUs, as únicas instruções de estruturas de controle disponíveis são os diversos tipos de jump condicional.

A importância dos Algoritmos para a Computação
No começo, quando alguém precisava desenvolver um programa, tinha que se preocupar com todos os aspectos relacionados ao seu desenvolvimento, desde como usar os recursos da máquina como disco, impressoras e tudo mais, até criar as soluções para o problema do usuário propriamente dito. Com o tempo começou-se a usar rotinas e bibliotecas bem definidas do sistema operacional para fazer a parte de mais baixo nível e os programadores passaram a se concentrar especificamente nos problemas de programas dos usuários. Em pouco tempo percebeu-se que muitas coisas eram feitas por todos os programadores com os mesmos objetivos, mas de formas um pouco diferentes, esse tipo de trabalho dobrado acabava por consumir muito tempo.
Então sabendo que um algoritmo é uma forma de resolver um problema podemos falar de sua importância. Se precisarmos resolver um problema para o qual existe um algoritmo, basta consultar os livros e materiais sem ter que se preocupar em inventar novamente a solução. Embora pareça óbvio pode não ser, muitas vezes as pessoas acabam refazendo as coisas que já estão documentadas por aí. Existem diversos motivos para isso acontecer e um dos mais fortes é a vontade individual de desenvolver uma ferramenta ou biblioteca que faz alguma coisa interessante. A maior parte do desenvolvimento que temos no mercado se concentra em criar soluções para problemas do usuário utilizando o máximo possível de ferramentas fornecidas por alguma empresa. O resultado é que alguns dos programadores acabam ficando frustrados por nunca fazer alguma coisa realmente desafiadora.
Conhecer os algoritmos existentes e (pelo menos onde encontrar) suas implementações pode economizar tempo precioso na entrega de um produto de software. Durante os cursos nas faculdades aprendemos, por exemplo, alguns algoritmos de ordenação de dados e como se aplicam as diversas estruturas de dados que existem. Em algumas linguagens de programação esses algoritmos já estão disponíveis, e quando não é o caso já existem bibliotecas para usá-los. Saber usar esse recurso torna-se vantajoso não só porque agiliza o desenvolvimento, mas porque muitas vezes aumenta a qualidade do produto final. Quando criamos um código inteiro por nossa conta, temos que executar muitos testes para garantir que tudo está funcionando como deveria, mas se estivermos criando uma biblioteca de funções ao mesmo tempo em que criamos um produto que se utiliza dessa biblioteca dificilmente teremos o tempo necessário para realizar a quantidade de testes necessária a garantir a qualidade esperada.
A mistura de visões pode ser um grande problema para o programador. É necessário conhecer bem os diferentes papéis que podemos exercer durante o desenvolvimento e conhecer as ferramentas a mão. O conhecimento de formas de solução de problemas á um grande aliado na entrega de produtos de forma rápida e com maior qualidade. O Computador é uma máquina capaz de executar variados tipos de tratamento automático de informações ou processamento de dados. Exemplos de computadores incluem o ábaco, a calculadora, o computador analógico e o computador digital. Um computador pode prover-se de inúmeros atributos, dentre eles armazenamento de dados, processamento de dados, cálculo em grande escala, desenho industrial, tratamento de imagens gráficas, realidade virtual, entretenimento e cultura.
No passado, o termo já foi aplicado a pessoas responsáveis por algum cálculo. Em geral, entende-se por computador um sistema físico que realiza algum tipo de computação. Existe ainda o conceito matemático rigoroso, utilizado na teoria da computação. Os computadores fazem parte da vida corrente e são, hoje em dia, aparelhos quase tão familiares como os telefones, os televisores e os frigoríficos. Se ainda há pessoas (cada vez menos) que os olham com desconfiança, é porque foram condicionadas nesse sentido. É um pouco como os peles-vermelhas, que tinham medo que os fotografassem, porque isso lhes roubava a alma. Quem quisesse mesmo tirar-lhes o retrato, ou o fazia às escondidas, ou explicava pacientemente que aquilo não interferia com a vida eterna.
Tal como os computadores, os programas são coisas diferentes para pessoas diferentes. Ou até coisas diferentes para a mesma pessoa, consoante a perspectiva em que ela se coloque. Uma definição circular: um computador é uma máquina programável e um programa é uma sequência de instruções para um computador! Não faz mal, que a gente percebe. No entanto, há uma certa vantagem em libertar a noção de programa da de computador.

Fonte: 30/04/2011 – oficinadanet.com.br

 

O comando GREP

On 18 de março de 2011, in Linux, SSH, by esandre

O comando grep é muito útil quando usado para filtrar saída de comandos:

$ ps aux | grep root
root 1 0.0 0.0 1120 52 ? S Aug24 0:04 init [3]
root 2 0.0 0.0 0 0 ? SW Aug24 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Aug24 0:00 [kupdate]
root 4 0.0 0.0 0 0 ? SW Aug24 0:00 [kpiod]
root 5 0.0 0.0 0 0 ? SW Aug24 0:12 [kswapd]
O comando acima irá gerar a lista de todos os processos e jogar a saída para o duto (ps aux |). A comando após o duto (grep root), receberá a lista de processos e só jogará para a tela as linhas que contiverem a expressão “root”.
Outra utilidade do comando grep é a de buscar por ocorrências de expressões dentro de 1 ou mais arquivos.Exemplo:
$ grep -s servidor /etc/*
/etc/bashrc:alias servidor=’rlogin -l fabio servidor’
/etc/fstab:servidor:/home /home nfs defaults 0 0
/etc/hosts:192.168.1.1 servidor servidor.linux.br
/etc/mtab:servidor:/home /home nfs rw,addr=192.168.1.1 0 0
/etc/mtab:servidor:/var/spool/mail /var/spool/mail nfs rw,addr=192.168.1.1 0 0
No exemplo acima, grep pesquisou pela expressão “servidor” dentro de todos os arquivos do diretório /etc. O resultado foi exibido na tela da seguinte forma:

O comando grep é muito útil quando usado para filtrar saída de comandos:

$ ps aux | grep rootroot 1 0.0 0.0 1120 52 ? S Aug24 0:04 init [3]root 2 0.0 0.0 0 0 ? SW Aug24 0:00 [kflushd]root 3 0.0 0.0 0 0 ? SW Aug24 0:00 [kupdate]root 4 0.0 0.0 0 0 ? SW Aug24 0:00 [kpiod]root 5 0.0 0.0 0 0 ? SW Aug24 0:12 [kswapd]

O comando acima irá gerar a lista de todos os processos e jogar a saída para o duto (ps aux |). A comando após o duto (grep root), receberá a lista de processos e só jogará para a tela as linhas que contiverem a expressão “root”.

Outra utilidade do comando grep é a de buscar por ocorrências de expressões dentro de 1 ou mais arquivos.Exemplo:

$ grep -s servidor /etc/*/etc/bashrc:alias servidor=’rlogin -l fabio servidor’/etc/fstab:servidor:/home /home nfs defaults 0 0/etc/hosts:192.168.1.1 servidor servidor.linux.br/etc/mtab:servidor:/home /home nfs rw,addr=192.168.1.1 0 0/etc/mtab:servidor:/var/spool/mail /var/spool/mail nfs rw,addr=192.168.1.1 0 0

No exemplo acima, grep pesquisou pela expressão “servidor” dentro de todos os arquivos do diretório /etc. O resultado foi exibido na tela da seguinte forma:

nome do arquivo: linha que contém a expressão

 

O que é Linux

On 18 de março de 2011, in Linux, Sistema Operacionais, by esandre

Linux é ao mesmo tempo um kernel (ou núcleo) e o sistema operacional que roda sobre ele, dependendo do contexto em que você encontrar a referência. O kernel Linux foi criado em 1991 por Linus Torvalds, então um estudante finlandês, e hoje é mantido por uma comunidade mundial de desenvolvedores (que inclui programadores individuais e empresas como a IBM, a HP e a Hitachi), coordenada pelo mesmo Linus, agora um desenvolvedor reconhecido mundialmente e mais representativo integrante da Linux Foundation.
Linus Torvalds

O Linux adota a GPL, uma licença de software livre – o que significa, entre outras coisas, que todos os interessados podem usá-lo e redistribuí-lo, nos termos da licença. Aliado a diversos outros softwares livres, como o KDE, oGNOME, o Apache, o Firefox, os softwares do sistema GNU e o OpenOffice.org, o Linux pode formar um ambiente moderno, seguro e estável para desktops, servidores e sistemas embarcados.

Acima você vê 4 telas do sistema operacional Linux em ambiente PC desktop. Mas o sistema funciona em dezenas de outras plataformas, desde mainframes até relógios de pulso, passando por várias arquiteturas: Intel, StrongARM, PowerPC, Alpha etc., com grande penetração também em dispositivos embarcados, como handhelds, PVR, videogames e centrais de entretenimento – nos quais há expoentes como o sistema Android, mantido pelo Google.

O que é Linux

por Augusto Campos

Este artigo responde a diversas dúvidas comuns de novos usuários, desenvolvedores interessados, ou alunos às voltas com trabalhos acadêmicos. Entre as questões, estão incluídas:

  • O que é Linux
  • Linux ou GNU/Linux
  • O kernel Linux
  • O sistema operacional Linux (ou GNU/Linux)
  • Como fazer download ou adquirir o Linux

e muitas outras. Ao final há um guia de referências adicionais sobre o assunto. Leia também O que é uma distribuição de Linux e a FAQ BR-Linux – Lista de Perguntas Freqüentes.

Linux ou GNU/Linux?

Free Software Foundation advoga que o sistema operacional formado pelo núcleo Linux e o conjunto de utilitários e aplicativos que incluem aqueles desenvolvidos pelo seu projeto GNU deve ser chamado de GNU/Linux, e não simplesmente de Linux. A questão tem sido objeto de intensos debates há anos, sem que um posicionamento geral e definitivo seja alcançado.

Naturalmente a posição da FSF não é a única existente. São conhecidas as declarações de Linus Torvalds (que acharia interessante a existência de uma distribuição chamada GNU Linux e mantida pelo projeto GNU), de Eric Raymond e de John Dvorak, entre outros. Há ainda uma interessante citação da própria FSF afirmando que um nome como GNU/X11/Apache/Linux/TeX/Perl/Python/FreeCiv seria absurdo, portanto é necessário estabelecer um limite. Mas, diz ela, “Não pode ser justo dar todo o crédito para uma contribuição secundária (Linux) enquanto se omite a contribuição principal (GNU).” Outra citação digna de nota vem de um editorial do veterano Linux Journal: “Talvez Richard Stallman esteja frustrado porque Linus recebeu as glórias por ter feito aquilo que Stallman pretendia fazer.”

O kernel Linux

(inclui trechos da Wikipédia)

Inicialmente, o kernel Linux foi desenvolvido como um hobby por Linus Torvalds (então um estudante) com o objetivo de desenvolver seu próprio sistema operacional “Unix-like” que rodasse em processadores Intel 80386. Linus chegou a estudar o Minix, um sistema similar de autoria do famoso acadêmico Andrew Tanenbaum, mas não ficou satisfeito com a arquitetura deste (que não era um software livre, inclusive) e resolveu criar o seu próprio sistema. O projeto Linux foi publicamente lançado em 1991 em uma famosa mensagem para a Usenet.
Tux, o logo e mascote do Linux

Hoje o Linux é um kernel híbrido monolítico. Drivers de dispositivo e extensões do kernel tipicamente rodam com acesso total ao hardware, embora alguns rodem em espaço de usuário. Ao contrário dos kernels monolíticos padrão, os drivers de dispositivo são facilmente configurados como módulos, e carregados e descarregados enquanto o sistema está rodando. Também ao contrário de kernels monolíticos padrão, drivers de dispositivo podem ser pré-inseridos sob certas condições. Essa última característica foi adicionada para corrigir o acesso a interrupções de hardware, e para melhorar o suporte a multiprocessamento simétrico.

Embora Linus Torvalds não tenha tido como objetivo inicial tornar o Linux um sistema portável, ele evoluiu nessa direção. Linux é hoje, na verdade, um dos kernels de sistema operacional mais portados, rodando em sistemas desde o iPaq (um computador portátil) até o IBM S/390 (um volumoso e altamente custoso mainframe), passando por várias arquiteturas: Intel, StrongARM, PowerPC, Alpha etc., com grande penetração também em dispositivos embarcados, como handhelds, PVR, vídeogames e centrais de entretenimento.

De qualquer modo, é importante notar que os esforços de Linus foram também dirigidos a um outro tipo de portabilidade. Portabilidade, de acordo com Linus, era a habilidade de facilmente compilar aplicativos de uma variedade de origens no seu sistema; portanto o Linux originalmente se tornou popular em parte devido ao esforço para que fosse fácil fazer com que códigos de aplicativos disponíveis para outros sistemas (inclusive no Unix e no sistema GNU) rodassem no Linux.

Hoje, Linus Torvalds continua a dirigir o desenvolvimento do kernel, enquanto outros subsistemas (como ferramentas de desenvolvimento, ambientes gráficos e aplicativos) são desenvolvidos independentemente. A tarefa de integrar todos estes componentes para formar um sistema completo é desempenhada pelas empresas e organizações que mantêm distribuições de Linux.

O sistema operacional Linux (ou GNU/Linux)

(inclui trechos da Wikipédia)

Logo que Linus Torvalds passou a disponibilizar o Linux, ele apenas disponibilizava o kernel (núcleo) de sua autoria juntamente com alguns utilitários básicos. O próprio usuário devia encontrar os outros programas, compilá-los e configurá-los e, talvez por isso, o Linux tenha começado a ter a fama de sistema operacional apenas para técnicos. Foi neste ambiente que surgiu a MCC (Manchester Computer Centre), a primeira distribuição Linux, feita pela Universidade de Manchester, na tentativa de poupar algum esforço na instalação do Linux.

Hoje em dia, um sistema operacional Linux completo (ou uma “distribuição de Linux”) é uma coleção de softwares (livres ou não) criados por indivíduos, grupos e organizações ao redor do mundo, tendo o Linux como seu núcleo. Companhias como a Red Hat, a Novell/SUSE, a Mandriva (união da Mandrake com a Conectiva), bem como projetos de comunidades como o Debian, o Ubuntu, o Gentoo e o Slackware, compilam o software e fornecem um sistema completo, pronto para instalação e uso.

As distribuições de GNU/Linux começaram a ter maior popularidade a partir da segunda metade da década de 1990, como uma alternativa livre para os sistemas operacionais Microsoft Windows e Mac OS, principalmente por parte de pessoas acostumadas com o Unix na escola e no trabalho. O sistema tornou-se popular no mercado de servidores, principalmente para a Web e servidores de bancos de dados, inclusive no ambiente corporativo – onde também começou a ser adotado em desktops especializados.

No decorrer do tempo várias distribuições surgiram e desapareceram, cada qual com sua característica. Algumas distribuições são maiores outras menores, dependendo do número de aplicativos e sua finalidade. Algumas distribuições de tamanhos menores cabem em um disquete com 1,44 MB, outras precisam de vários CDs, existem até algumas que tem versões em DVD. Cada uma tem seu público e sua finalidade.

Veja também a questão O que é uma distribuição de Linux.

Download ou aquisição do Linux

Embora provavelmente a forma mais fácil de obter o Linux seja através dos CDs distribuídos como brinde em diversas revistas nacionais (escolha sempre uma versão recente!), o jeito mais fácil de obter sua cópia sem desembolsar nada a mais é através do download de imagens ISO, que são arquivos (geralmente por volta de 650MB cada um) trazendo o conteúdo completo de um CD-ROM, prontos para serem gravados em um CD, permitindo assim que você obtenha cópias idênticas de um CD original. Verifique na ajuda do seu programa favorito de gravação de CDs como fazer para gravar a partir de uma imagem ISO – quase todos os programas populares dispõem deste recurso, e a operação em geral é simples.

Algumas distribuições (como o Knoppix e o brasileiro Kurumin) são especialmente disponibilizadas na forma de Live CDs, capazes de rodar diretamente do CD e dispensando instalação no disco de seu computador – é uma boa forma de ter seu primeiro contato.

Como o Linux é um software livre, a maior parte dos produtores disponibiliza imagens ISO contendo exatamente o mesmo conteúdo dos CDs vendidos em lojas ou na Internet, e você pode fazer o que quiser com elas – até mesmo gravar em CDs para revendê-las (e se você quiser comprar CDs deste tipo, lojas virtuais brasileiras como a Tempo Real e a LinuxMall estão à disposição). Quando se trata de Linux, este tipo de cópia e revenda não é irregular nem anti-ético, pois é da essência do software livre.

Você pode procurar suas imagens ISO no site de sua distribuição preferida – às vezes será necessário fazer o download de mais do que uma imagem, e em outros casos o download da primeira imagem é obrigatório, e o das outras é opcional. Raras são as distribuições que não disponibilizam imagens ISO de instalação.

Se preferir, procure no site linuxiso.org, cuja especialidade é apontar links para imagens ISO dos CDs das distribuições de Linux do mundo todo.

Como se trata de um download grande (uma distribuição em 3 CDs corresponde a quase 2GB de dados), certifique-se de ter espaço suficiente no seu HD, e utilize um bom gerenciador de download.

Veja também o artigo Escolhendo, obtendo e gravando o Linux: como fazer o download ou comprar.

 

Se você já utiliza algumas propriedades  CSS3, mas em contrapartida precisa adaptar o layout ao IEca 6, as ferramentas que citarei a seguir o ajudarão nas duas coisas! vamos a elas então.

IE6 css fixer:

Esta ferramenta gera os hacks para IE6 necessários para corrigir a maioria dos problemas, como  a margem duplicada quando os elementos tem float(left ou right), transparência para imagens .png, zoom:1 para elementos com position:relative, entre outras gambiarras(:D), mas atenção ela não vai resolver seus problemas em 100% dos casos, porém ajuda muito você a localizar os erros. Você pode usar um arquivo .CSS, de uma URL, do seu computador ou colar o código no campo indicado no site.

CSS3 Generator:

Gera e mostra o resultado das novas propriedades do CSS3, além dos browsers que suportam aquela nova propriedade.

Pure css menu:

Gera menus dropdown em CSS, com opção de formação de itens, cor de fundo, fonte, além de disponibilizar alguns modelos prontos e os arquivos gerados tem compatibilidade com os IEs, para obter o código é necessário se registrar.

CSS Compressor:

Compactador de arquivos .CSS que basicamente retira os espaços e quebras de linhas inúteis deixando seu arquivo .CSS mais leve, no modo avançado há a possibilidade maior de customização, como por exemplo, retirar os espaços entre os caracteres :  ;  {  } , entre os seletores e propriedade.

Tagged with:  

VIM – Comandos básicos e Sintaxe

On 14 de janeiro de 2011, in PHP, Programação, SSH, by esandre

Primeiro vamos habilitar a sintaxe colorida e já usaremos o vim pra isso, como root:

nas outras distros: “vim /etc/vim/vimrc” | no Mandriva: “vim /usr/share/vim/vimrc”

Procure pela palavra “syntax”. Para procurar digite /syntax e aperte enter, ele irá procurar pela palavra syntax por todo o texto, e vai achar isto: #syntax on aperte a tecla i, com isso você entra no modo de edição… descomente a linha encontrada acime:

#syntax on

e ela irá ficar assim:

syntax on

agora salve o arquivo, para salvar você precisa sair do modo de edição, para isso aperte ESC.

Seguem comando básicos:

i entra no modo de edição
:w salva o arquivo
:wq salva o arquivo e sai do vim
:q! fecha o arquivo sem salvar nada
:%s /troca isto/por isto/g substituição de texto

Para salvar o texto que acabamos de editar digite :wq

Abraço a todos!

 

Entendendo o SSH

On 14 de janeiro de 2011, in Programação, SSH, by esandre
O SSH é a minha ferramenta preferida. Ele permite administrar máquinas remotamente (executando tanto comandos em modo texto quanto aplicativos gráficos), permite transferir arquivos de várias formas diferentes e, como se não bastasse, permite também encapsular outros protocolos, permitindo, por exemplo, acessar uma sessão do VNC através de um túnel seguro.
A grande vantagem do SSH sobre outras ferramentas de acesso remoto é a grande ênfase na segurança. Um servidor SSH bem configurado é virtualmente impenetrável e você pode acessá-lo de forma segura, mesmo que a sua rede local esteja comprometida. Ele utiliza um conjunto de técnicas de criptografia para assegurar que apenas as pessoas autorizadas tenham acesso ao servidor, que todos os dados transmitidos sejam impossíveis de decifrar e que a integridade da conexão seja mantida.
São previstas respostas para diversos tipos de ataques conhecidos. O SSH detecta casos em que o servidor tenha sido substituído por outra máquina, situações nas quais se tenta injetar dados na conexão (ou seja, tirar proveito de uma conexão aberta para incluir pacotes com comandos adicionais) e inclui até mesmo técnicas de “despiste”, que tornam muito mais complicado descobrir em qual pacote encriptado foi transmitida a senha de acesso, por exemplo, dificultando a vida de quem pretende descobrir a senha usando um ataque de força bruta.
A idéia central é que, mesmo em situações onde seja fácil interceptar a transmissão (como no caso de uma rede wireless pública), seja impossível descobrir o conteúdo dos pacotes, devido à encriptação. É possível ainda, utilizar um par de chaves em vez de uma senha como forma de autenticação. Nesse caso, além de possuir a chave privada (um arquivo que pode ser salvo no HD, em um pendrive ou mesmo em um smartcard), é preciso saber a passphrase, que pode ser uma senha especialmente longa e difícil de adivinhar.
Você poderia argumentar que qualquer algoritmo de encriptação pode ser quebrado via força bruta (onde simplesmente são testadas todas as possibilidades possíveis, até encontrar a combinação correta), de forma que nenhum sistema de encriptação é inteiramente seguro. Entretanto, ataques de força bruta só são realmente viáveis contra chaves de 40 ou 64 bits; acima disso é inviável, pois a cada bit adicionado, o processo torna-se exponencialmente mais demorado.
Um exemplo de protocolo pouco seguro é o WEP de 64 bits (que na verdade utiliza uma chave de 40 bits), usado em redes wireless pouco protegidas. Ele pode ser quebrado em pouco tempo, caso você consiga capturar um volume considerável de transmissões usando um sniffer (um programa que captura a transmissão da rede, como o Kismet). O DES, um dos algoritmos mais tradicionais, que usa chaves de 64 bits (reais), pode ser quebrado em menos de um dia, caso você tenha acesso a um cluster de 100 máquinas com processadores Xeon ou Opteron quad-core.
Uma chave de 64 bits é cerca de 16 milhões de vezes mais difícil de quebrar via força bruta do que uma de 40 bits, como as que eram utilizadas no SSL dos navegadores a até poucos anos. Uma chave de 128 bits por sua vez, é (arredondando) 18.447.000.000.000.000.000 vezes mais demorada de quebrar que uma de 64 bits, de forma que, uma chave de 64 bits pode ser quebrada caso você tenha o tempo e os recursos necessários à disposição, mas uma de 128 (sem brechas conhecidas) é impossível de quebrar com tecnologia atual.
O perigo no caso dos algoritmos de encriptação não são propriamente os ataques de força bruta (que exigem muito tempo e recursos), mas sim falhas que permitam descobrir a chave usada em menos tempo. As versões originais do WEP (o sistema de encriptação para redes wireless anterior ao WPA), por exemplo, podiam ser quebradas rapidamente devido a um conjunto de falhas no algoritmo usado, o que levou os fabricantes a atualizarem rapidamente todos os seus produtos. Outro exemplo é o sistema usado na encriptação dos DVDs, que é quebrado em poucos segundos por uma máquina atual, utilizando um algoritmo de poucas linhas.
Felizmente, este não é o caso dos algoritmos usados no SSH. Por serem abertos, qualquer falha similar que pudesse eventualmente existir já teria sido descoberta e corrigida. O SSH é usado em tantos servidores importantes que uma brecha grave poderia (literalmente) parar o mundo. Por isso, todo o código é exaustivamente auditado por uma variedade de empresas e órgãos governamentais.
O SSH utiliza chaves assimétricas para fazer a autenticação. As chaves assimétricas são um sistema muito interessante, onde temos um par de chaves em vez de uma única chave simétrica. Uma (a chave pública), permite apenas encriptar dados, enquanto a segunda (a chave privada) permite desencriptar as informações embaralhadas pela primeira. O grande segredo é que qualquer informação embaralhada usando a chave pública pode ser recuperada apenas usando a chave privada correspondente. Como o nome sugere, a chave pública pode ser distribuída livremente, pois serve apenas para gerar as mensagens encriptadas, sem permitir lê-las posteriormente.
Quando você se conecta a um servidor SSH, seu micro e o servidor trocam suas respectivas chaves públicas, permitindo que um envie informações para o outro de forma segura. Através deste canal inicial é feita a autenticação, seja utilizando login e senha, seja utilizando chave e passphrase (como veremos a seguir).
Até aqui, tudo é feito utilizando chaves de 512 bits ou mais (de acordo com a configuração). O problema é que, embora virtualmente impossível de quebrar, este nível de encriptação demanda um volume muito grande de processamento. Se todas as informações fossem transmitidas desta forma, o SSH seria muito lento.
Para solucionar este problema, depois de fazer a autenticação, o SSH passa a utilizar um algoritmo mais simples (que demanda muito menos processamento) para transmitir os dados. Por padrão é utilizado o 3DES (triple-DES), que utiliza uma combinação de três chaves DES, de 64 bits cada. As chaves são trocadas periodicamente durante a conexão, o que torna o sistema quase impossível de quebrar. Na configuração do servidor e/ou cliente, é possível especificar outro algoritmo, como o Blowfish. Isso garante uma boa relação entre segurança e desempenho.
O SSH é dividido em dois módulos. O sshd é o módulo servidor, um serviço que fica residente na máquina que será acessada, enquanto ossh é o módulo cliente, um utilitário que você utiliza para acessá-lo.
Para instalar o SSH no servidor, basta instalar o pacote “openssh-server” usando o gerenciador de pacotes, como em:

# apt-get install openssh-server

ou:

# yum install openssh-server

Na maioria dos casos, ao fazer uma instalação em modo servidor do sistema o SSH será instalado e configurado para subir no boot automaticamente, mas, de qualquer forma, não custa verificar. Nas distribuições derivadas do Debian, ele é ativado usando o serviço “ssh”, como em:

# /etc/init.d/ssh start

Nas derivadas do Red Hat, incluindo o Mandriva e o CentOS o serviço se chama sshd:

# service sshd start

No caso do CentOS, você precisa usar o comando “chkconfig sshd on” para ativar a inicialização automática do serviço caso o pacote seja instalado depois da instalação do sistema:

# chkconfig sshd on

Como de praxe, é necessário manter a porta 22 usada pelo SSH aberta no firewall do servidor. O SSH permite fazer quase tudo através dessa única porta, atendendo a diversos clientes simultâneos.

Concluindo, para usar o SSH no seu micro de trabalho é necessário ter instalado apenas o pacote “openssh-client”. Veja que o cliente e o servidor são intencionalmente mantidos em pacotes separados justamente para permitir que você instale apenas um ou outro conforme necessário.

A configuração do servidor, independentemente da distribuição usada, vai no arquivo “/etc/ssh/sshd_config”, enquanto a configuração do cliente vai no “/etc/ssh/ssh_config”. Note que muda apenas um “d” entre os dois; cuidado para não confundir cará com batata doce. ;)

Outra observação é que além do OpenSSH, que abordo aqui, existem outras versões do SSH, como o Tectia (uma versão comercial, disponível no http://ssh.com) e o SunSSH que, embora conservem diferenças no funcionamento e na configuração, são compatíveis entre si. O SSH é, na verdade, um protocolo aberto e não o nome de uma solução específica.

O uso básico do SSH é bastante simples, já que basta usar o comando “ssh login@servidor” para acessar o servidor remoto e, a partir daí, rodar os comandos desejados. Entretanto, essa é apenas a ponta do iceberg. O SSH é tão rico em funções que até mesmo os administradores mais experientes raramente usam mais do que um punhado das funções disponíveis. Vamos então a uma visão mais aprofundada do SSH, começando com dicas de configuração:

Tagged with:  

CSS RESET

On 13 de janeiro de 2011, in CSS, Programação, by esandre

O objetivo de um estilo reset é reduzir as inconsistências do browser em coisas como altura padrão da linha, margens e tamanhos de letra dos títulos, e assim por diante.

Os estilos do reset dadas aqui são intencionalmente muito genérico. Não há qualquer padrão ou cor de fundo definida para o elemento body, por exemplo. Eu particularmente não recomendo que você acabe usando isso em seu estado inalterado em seus próprios projetos. Deve ser mexido, editado, estendida e outra sintonia para corresponder à sua base específica reset. Preencha as suas cores preferidas para a página, links e assim por diante.

Em outras palavras, este é um ponto de partida, e não uma auto-contido caixa preta sem melindre.

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
	margin: 0;
	padding: 0;
	border: 0;
	outline: 0;
	font-size: 100%;
	vertical-align: baseline;
	background: transparent;
}
body {
	line-height: 1;
}
ol, ul {
	list-style: none;
}
blockquote, q {
	quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
	content: '';
	content: none;
}

/* remember to define focus styles! */
:focus {
	outline: 0;
}

/* remember to highlight inserts somehow! */
ins {
	text-decoration: none;
}
del {
	text-decoration: line-through;
}

/* tables still need 'cellspacing="0"' in the markup */
table {
	border-collapse: collapse;
	border-spacing: 0;
}
 
Se você quiser usar o meu estilo de reset, então fique à vontade!
Você pode pegar uma cópia do arquivo para usar e ajustar como desejar.
 
 

Introdução SSH

On 13 de janeiro de 2011, in Programação, SSH, by esandre

Introdução

Uma vantagem no uso do Linux, apontada por muitos administradores de rede, é a facilidade de administrar o sistema remotamente, tanto via linha de comando (usando o SSH) quanto com acesso à interface gráfica (usando o NX Server, o VNC ou o próprio SSH). Essa é uma necessidade básica para qualquer um que administra diversos servidores.

Hoje em dia, poucas empresas hospedam seus websites “in house”, ou seja, em servidores instalados dentro da própria empresa. Quase sempre os servidores ficam hospedados em datacenters, complexos que oferecem toda a estrutura necessária para que os servidores fiquem no ar de forma confiável, incluindo links redundantes (se o link principal cai, existe um segundo de reserva), no-breaks de grande porte, geradores, refrigeração (a temperatura ambiente mais baixa ajuda os componentes a trabalharem de forma mais estável) e assim por diante.

Isso significa que apesar do servidor ser “seu”, você não tem nenhum tipo de acesso físico a ele. Não pode usar o teclado ou mouse por exemplo, tudo precisa ser feito a distância. No Linux, toda a configuração do sistema, instalação de novos programas, etc. pode ser feita a partir do modo texto, o que permite configurar o servidor e mantê-lo atualizado remotamente, via SSH. Outro ponto interessante é que, apesar de ele ser uma ferramenta nativa do Unix, existem clientes SSH também para Windows e outras plataformas, permitindo que o responsável administre o servidor mesmo a partir de uma estação Windows.

Outra possibilidade interessante para o SSH é o suporte a distância. Praticamente tudo pode ser feito remotamente, desde alterações na configuração do sistema, instalação de novos programas ou atualizações de segurança, até a instalação de um novo kernel (você instala, configura o grub e em seguida reinicia a máquina torcendo para que tudo esteja correto e ela volte depois de dois minutos). É possível até mesmo fazer uma reinstalação completa do sistema remotamente. Nesse caso, você instalaria a nova cópia em uma partição separada, usando um chroot, e configuraria o gerenciador de boot para iniciá-la por default depois do reboot.

Outro uso comum, desta vez dentro das redes locais, é o uso remoto de aplicativos. Em muitas situações faz sentido instalar determinados aplicativos em um servidor central e abrir sessões remotas nos clientes. Isso permite centralizar as informações no servidor (facilitando os backups) e, ao mesmo tempo, usar menos recursos nos clientes, permitindo o uso de micros mais antigos. O exemplo mais desenvolvido é o LTSP, que permite usar micros antigos, de praticamente qualquer configuração, como clientes de um servidor rápido. Um único servidor pode atender a 20 ou até mesmo 30 clientes.

Tagged with: