terça-feira, 31 de março de 2009

Instalando o Apache

O Apache pode ser dividido em duas grandes famílias: o Apache 2.x e o Apache 1.3 que, apesar de muito antigo, ainda é usado em muitos servidores. O Apache 2 trouxe muitas vantagens, sobretudo do ponto de vista do desempenho, além de oferecer novos módulos e mais opções de segurança, mas sua adoção foi retardada nos primeiros anos por um detalhe muito simples: o fato de ele ser incompatível com os módulos compilados para o Apache 1.3. Como os módulos são a alma do servidor web, muitos administradores ficavam amarrados ao Apache 1.3 devido à falta de disponibilidade de alguns módulos específicos para o Apache 2.

Conforme o tempo foi passando, mais e mais módulos foram portados, sem falar de novos módulos desenvolvidos diretamente para uso em conjunto com o Apache 2. Hoje em dia, o Apache 1.3 ainda sobrevive em muitas instalações devido à inércia natural que temos dentro do ramo de servidores, mas não existe nenhum bom motivo para usá-lo em uma nova instalação. O Apache 2 é simplesmente melhor em todos os quesitos.

Por enquanto, temos apenas uma versão básica do Apache, que simplesmente exibe arquivos html e executa scripts CGI. Por padrão, o diretório raiz do servidor Web é "/var/www" (no Debian) ou "/var/www/html" (no Fedora). Com isso, a página "http://seu.servidor/index.html" é, na verdade, o arquivo "/var/www/index.html" ou "/var/www/html/index.html".

Como de praxe, o diretório raiz é definido através de uma opção dentro do arquivo principal de configuração (a opção "DocumentRoot") e pode ser alterado caso desejado. Ao hospedar diversos sites no mesmo servidor, você define uma pasta raiz diferente para cada um. Como pode ver, a instalação do Apache propriamente dita é bastante simples, o grande desafio é configurar e otimizar o servidor, como veremos ao longo do restante deste capítulo.

Instalação a partir do código fonte: Muitos administradores preferem instalar o Apache a partir dos fontes, o que oferece um controle maior sobre os recursos que ficarão ou não ativos.

De uma forma geral, instalar a partir do código fonte só é uma boa idéia se você conhece muito bem o software e não está satisfeito com as opções de compilação usadas nos pacotes incluídos na distribuição. Além da instalação e da configuração inicial, você precisará também se preocupar com patches e atualizações de segurança, já que você não poderá contar com as atualizações disponibilizadas através do apt-get ou do yum. Ou seja, se você não está confiante de que vai ter o tempo e o conhecimento necessários para realizar um trabalho de manutenção melhor do que o realizado pelos mantenedores do Debian, Ubuntu, CentOS ou do Fedora, você estará melhor servido simplesmente usado os pacotes pré-compilados. :)

De qualquer forma, se você quer encarar o desafio, pode baixar o código fonte no: http://httpd.apache.org/. Lembre-se de que para instalar qualquer aplicativo a partir dos fontes, você precisa ter instalados os compiladores e bibliotecas de desenvolvimento.

Os passos básicos são descompactar o pacote, acessar a pasta que será criada e executar o trio "./configure", "make" e "make install", este último como root. Isso resultará em uma instalação padrão, onde todos os arquivos são instalados no diretório "/usr/local/apache2". Para personalizar as opções (que seria o principal motivo de instalar a partir dos fontes, afinal), você deve passar as opções desejadas ao executar o "./configure", como em:

$ ./configure --prefix=/etc/apache2 --exec-prefix=/usr --bindir=/usr/bin \
--sbindir=/usr/sbin --mandir=/usr/share/man --sysconfdir=/etc/apache2/conf \
--includedir=/usr/include/httpd --libexecdir=/usr/lib/httpd/modules \
--datadir=/var/www/ --with-mpm=prefork --enable-mods-shared="rewrite"

Como pode ver, as opções incluem não apenas os diretórios de instalação, mas também os módulos que serão ativados e diversas outras opções de configuração. Ao instalar a partir do código fonte, a ativação e a desativação do servidor é feita usando o script "apachectl", que substitui o "/etc/init.d/apache2" ou o "service httpd", como em:

# apachectl start

ou:
# apachectl restart

Apesar disso, ainda existem casos de distribuições que continuam oferecendo as duas versões, de forma a satisfazer os dois públicos. No Debian Etch, por exemplo, o Apache 1.3 é instalado através do pacote "apache", enquanto o Apache 2 (a versão recomendada) é instalado através do "apache2". Entretanto, no Debian Lenny já está disponível apenas o Apache 2, assim como no CentOS, no Fedora e em outras distribuições.

Ao instalar o Apache 2, o suporte a SSL é instalado automaticamente junto com o pacote principal (mas ainda é preciso ativá-lo na configuração, como veremos a seguir). Instale também o pacote apache2-utils, que contém diversos utilitários de gerenciamento que usaremos a seguir:

# apt-get install apache2 apache2-utils

Se desejar ativar o suporte a páginas seguras, você vai precisar também do pacote "ssl-cert", necessário para ativar o suporte a SSL e gerar os certificados. Ele não é instalado por padrão ao fazer uma instalação enxuta do Debian ou do Ubuntu:

# apt-get install ssl-cert

Se você estiver utilizando o CentOS ou o Fedora, instale o pacote "httpd", que contém o Apache 2 e os utilitários:

# yum install httpd

Diferente do Debian, o serviço não será configurado para ser ativado no boot por padrão e nem mesmo inicializado automaticamente após a instalação. Para ativá-lo, é necessário ativar o serviço e, em seguida, criar os links para início automático usando o chkconfig

# service httpd start
# chkconfig httpd on

Seguindo os nomes dos pacotes, no Debian o serviço se chama "apache2", enquanto no Fedora e no CentOS ele se chama "httpd". Para reiniciar o servidor você usa, respectivamente, os comandos "/etc/init.d/apache2 restart" e "service httpd restart".

Acessando o endereço "http://127.0.0.1", você verá uma página de boas-vindas, que indica que o servidor está funcionando. Se não houver nenhum firewall no caminho, ele já estará acessível a partir de outros micros da rede local ou da internet:

Discos Rígidos

Introdução Será que os discos rígidos são todos iguais? Será que a única diferença entre eles é a capacidade de armazenamento (medida atualmente na ordem de gigabytes)? Há marcas melhores e piores? Como podemos saber se um disco rígido é bom ou não?

Foi para responder estas e muitas outras perguntas que decidimos fazer um teste completo com diversos discos rígidos existentes hoje no mercado. Levamos para o nosso Laboratório no Instituto de Tecnologia ORT mais de 10 modelos das marcas mais vendidas (Quantum, Western Digital e Maxtor) e chegamos a resultados interessantíssimos para todos nós - como a conclusão, por exemplo, que dependendo do modelo de disco rígido que você possuir, o seu sistema operacional pode ser mais rápido.

Fora a capacidade de armazenamento, a grande diferença entre os diversos modelos de discos rígidos existentes é a velocidade. Há discos rígidos mais rápidos que outros e é justamente isto que nosso teste prova.

É bom notar que ter um disco rígido rápido não torna o micro "mais rápido"; a velocidade de processamento do computador (como cálculos e desenhos na tela, por exemplo) continua a mesma. A diferença é que arquivos e programas poderão ser lidos do disco rígido (ou seja, abertos) mais rapidamente - ou seja, em menos tempo.

Além disto o sistema operacional utiliza o disco rígido constantemente para um recurso chamado memória virtual, que consiste em criar um arquivo de troca no disco rígido para quando "acaba" a memória RAM disponível. Como isto ocorre o tempo todo, esse arquivo é acessado constantemente. Tendo-se um disco rígido veloz, a velocidade do sistema operacional é aumentada.

Você também pode testar o seu disco rígido!
É claro que não dava para testar todas as marcas disponíveis a venda no Brasil, por isto escolhemos as três marcas mais vendidas no mundo: Western Digital, Quantum e Maxtor. Desta forma, você sentirá falta de outras marcas, como Seagate, Samsung, NEC e Fujitsu.

Em nossos testes utilizamos um programa específico para teste de discos rígidos, chamado CheckHD (baixe o Check HD através da nossa área de Download). Este programa além de testar o disco rígido de todas as formas possíveis e imaginárias, ainda nos apresenta um relatório completo sobre as características do disco rígido.

Se você quiser fazer o teste em casa e comparar com nossos resultados, você deverá executar o programa dando um boot limpo em seu micro, pois caso contrário os resultados poderão ser falsos.

No caso de micros com MS-DOS, pressione a tecla [F5] quando aparecer a mensagem "Iniciando o MS-DOS...". No caso de micros com Windows 95, pressione a tecla [F8] quando aparecer a mensagem "Iniciando o Windows 95...", escolhendo a opção "somente prompt" do menu que aparecerá.

A velocidade do disco rígido A velocidade de um disco rígido pode ser mensurada através de duas características básicas: o tempo de acesso e a taxa de transferência.

O tempo de acesso é o tempo que o sistema mecânico do disco rígido demora para se deslocar de uma trilha a outra. Este tempo está na casa dos milissegundos (ms) (1 ms = 0,001 s). Quanto menor o tempo de acesso de um disco rígido, melhor.

A taxa de transferência mede a velocidade que dados saem do disco rígido para o micro. O programa que utilizamos em nossos testes - o CheckHD - nos apresenta duas taxas de transferência para cada disco rígido: a taxa de transferência máxima, que raramente é atingida (e que é justamente divulgada pelos fabricantes), e a taxa de transferência média, que é a taxa normalmente utilizada pelo disco rígido. Quanto maior a taxa de transferência de um disco rígido, melhor. Como a taxa de transferência média é a que efetivamente é utilizada, devemos dar preferência a um disco rígido com uma taxa de transferência média mais elevada.

Como um disco rígido pode ser mais rápido que outro? Esta pergunta não possui uma só resposta, pois há vários fatores técnicos que fazem aumentar ou diminuir a taxa de transferência e o tempo de acesso.

Para começar, a velocidade de rotação do disco rígido. Discos rígidos mais novos rodam a uma velocidade maior para atingir uma taxa de transferência mais elevada. Os discos rígidos tradicionalmente rodavam a 3.600 RPM (Rotações por Minuto). Atualmente os discos rígidos rodam a 4.800 RPM, 7.200 RPM ou mais.

Em segundo lugar, o tamanho do buffer interno do disco rígido. Este buffer é uma pequena memória existente no próprio disco rígido de modo a agilizar a transferência de dados. Por vezes este buffer é também chamado de cache de disco. Na tabela você poderá acompanhar todos os modelos que testamos e o tamanho de seu buffer interno. Repare que o disco rígido Maxtor de 1.75 GB possui um buffer interno de 256 KB, ao contrário dos demais discos rígidos testados, que possuem um buffer menor. Não à toa, a taxa de transferência média desse disco rígido foi a melhor entre todos os discos rígidos que testamos. Portanto, quanto maior o tamanho desta memória, melhor.

Outro fator que influi é a transferência múltipla de setores. Todo disco rígido pode transferir mais de um setor por vez, característica esta chamada blockmode. Compare a taxa de transferência média dos discos rígidos Quantum Sirocco de 1.7 GB e Quantum Fireball de 1.2 GB. Os dois possuem o tamanho do buffer muito parecido, porém o primeiro faz transferências a 8 setores por vez, enquanto o segundo opera a 16 setores por vez. Com isto, o segundo disco rígido é mais rápido, mesmo tendo uma capacidade de armazenamento inferior. Quanto mais setores por vez o disco rígido transferir, melhor.

A controladora do disco rígido seria o nosso último ponto. Todos os discos rígidos possuem sua controladora embutida em seus circuitos eletrônicos. Desta forma, há como controladoras mais rápidas serem feitas facilmente. Basta comparar os resultados dos dois discos rígidos de 2.1 GB da Western Digital que testamos, que são aparentemente iguais. Apesar de os dois terem o mesmo tamanho de buffer e utilizarem a mesma quantidade de setores em seu blockmode, o modelo AC32100H apresentou uma taxa de transferência bem maior.

Note que a maioria das pessoas chama o plugue onde o disco rígido é conectado ao micro de "controladora", o que está tecnicamente errado, pois a controladora do disco rígido está embutida nele mesmo. A porta onde o disco rígido é conectado ao micro - e que atualmente está embutida na própria placa-mãe - chama-se porta IDE, porta ATA ou interface ATA.

Breve Introdução à Programação

No começo, programar um microprocessador para executar uma determinada tarefa não era uma das coisas mais fáceis que existiam. O programador estava preso a utilizar-se da Linguagem de Máquina, que era a programação diretamente em binário ou em hexadecimal. Guardar o que cada código, ou seja, cada número binário ou seu equivalente em hexadecimal significava para o microprocessador, não era fácil. Logo foi criada a primeira linguagem de programação, a linguagem Assembly. Na linguagem assembly, cada código que possui um significado especial para o microprocessador - que é chamado de instrução - recebe um nome, chamado genericamente de Mnemônico. É muito mais fácil de se memorizar um nome do que um código qualquer, além de ser muito mais fácil de se programar por nomes. Por exemplo, uma comparação típica (você não precisa ainda saber o que exatamente significa tudo isto, o objetivo aqui é a comparação):

Microprocessador 8086

Ling. de máquina Assembly

B0 FF MOV AL, 0FFh

A2 00 20 MOV [2000h], AL

Microprocessador 6800

Ling. de máquina Assembly

86 FF LDA A, # FF

97 00 20 STA A, $2000

Microprocessador 6502

Ling. de máquina Assembly

A9 FF LDA # FF

8D 00 20 STA $2000

O que significa isto tudo e qual o nosso objetivo com isto ? Todos os três programas para os três microprocessadores apresentados executam a mesma tarefa: colocar o valor 255 na posição de memória 2000h. Você deve ter reparado duas coisas. A primeira, o assunto que nós estávamos discutindo: é muito mais fácil programar em assembly do que em linguagem de máquina (é muito mais fácil você guardar MOV AL do que B0, por exemplo). A segunda, que para cada microprocessador possuímos um conjunto de instruções próprio. Ou seja, não há qualquer correlação entre as instruções dos diversos tipos de microprocessadores existentes no mercado. O que estipulará uma família de microprocessadores será justamente a existência de uma similaridade no conjunto de instruções dos microprocessadores que constituam uma família. Por assim dizer, um 8086, um 8088, um 80286, um 80386 etc. constituem uma família de microprocessadores por possuírem instruções similares. Quem sabe programar em assembly em um 8086 saberá programar em um 80286, salvo, é claro, as instruções adicionais que cada microprocessador possuirá e que não será muito difícil aprender. Esta família de microprocessadores é chamada Intel Iapx86, 80x86 ou simplesmente Intel e é a família de microprocessadores que está presente no padrão IBM PC de microcomputadores. Outros microprocessadores como o 6800, o 68000, 68020, etc. constituem uma outra família de microprocessadores, por possuírem instruções similares entre si, porém completamente diferentes da família Intel. Esta outra família é chamada 680x0 ou simplesmente Motorola e é a família de microprocessadores que está presente em microcomputadores como o MacIntosh, o Amiga e estações de computação gráfica.

Porém devemos lembrar que mesmo sendo o Assembly uma linguagem de baixo nível, o microprocessador não a entende - ele entende somente linguagem de máquina. O microprocessador não sabe o que é MOV AL, o mnemônico para a instrução B0. Ele entende somente números, e portanto só sabe interpretar B0. Esta conversão pode ser feita basicamente de duas maneiras: ou “na mão” mesmo, utilizando-se a tabela de instruções fornecida pelo fabricante ou utilizando-se de um programa para tal. Este programa é chamado genericamente de Assembler, ou seja, montador. O Assembler lê um programa lido em Assembly e converte-o para linguagem de máquina. Entenda que não há qualquer tipo de tradução indireta: a linguagem Assembly é apenas os opcodes (números que representam instruções específicas) com um rótulo particular, chamado, como vimos, mnemônico.

LINGUAGENS DE ALTO NÍVEL

Em um microcomputador você necessita de recursos muito mais avançados do que a linguagem de máquina e o assembly - consideradas como linguagem de baixo nível pois trabalham intimamente com o microprocessador - podem oferecer. Assim surge um outro grupo de linguagens, as chamadas linguagens de alto nível. As linguagens de alto nível não estão tão íntimas do microprocessador, mas em compensação oferecem comandos, que são conjuntos de uma ou mais instruções, capazes de executar uma tarefa completa. Como exemplos de linguagens de alto nível, podemos citar BASIC, FORTRAN, Pascal e C, sendo esta última considerada uma linguagem de “médio nível”, por permitir tanto a programação em baixo nível como em alto nível. Mesmo sendo executadas em computadores - e conseqüentemente em microprocessadores - diferentes, as linguagens permanecem inalteradas. Isto porque você não estará programando o microprocessador diretamente: a linguagem será um programa sendo executado sobre o microprocessador. Logo, a linguagem de alto nível se encarregará de traduzir os comandos de seu programa em alto nível - que o microprocessador não conhece - para um programa de baixo nível - que o seu microprocessador conhece. Assim, temos a mesma linguagem de programação de alto nível para vários computadores diferentes, porém a maneira com que eles irão conversar com o microprocessador será diferente. E o mais importante: isto será transparente para o programador. Assim, um programa escrito em Turbo Pascal no Apple II será idêntico a um programa escrito em Turbo Pascal no IBM PC, salvo - é claro - alguns comandos que poderão existir ou não em virtude da exploração do máximo da potencialidade do computador, recursos que poderão existir em um computador porém em outro não, permanecendo a estrutura básica inalterada.

Dentro das próprias linguagens de alto nível existem linguagens "melhores" ou "piores" em termos de recursos e estruturação. Por exemplo o BASIC não é tão bem estruturado como o Pascal e nem tão rígido em suas declarações, também. Mas já vimos que o BASIC era uma linguagem que foi adotada como "padrão" nos primórdios da micro-informática, pois os fabricantes colocavam esta linguagem em forma residente em seus microcomputadores. Assim a linguagem BASIC tornou-se a linguagem de programação mais popular existente até hoje.

Mas mesmo sendo popular, o próprio BASIC difere-se de um microcomputador para o outro, dependendo, principalmente, do fabricante da linguagem (já que a linguagem será um programa sendo executado, como vimos) e do microprocessador que estava sendo utilizado. Por exemplo o AppleSoft Basic (Apple II) difere-se totalmente do GWBasic (CP/M, MSX e IBM PC). Apesar da estrutura ser basicamente igual, certos comandos são simplesmente criados ou então excluídos em virtude das capacidades principalmente de Hardware e do próprio microprocessador do microcomputador.

Voltando à questão de existirem linguagens de alto nível com "maior nível" do que outras, peguemos o exemplo do BASIC vs. Pascal vs. C. Se quiséssemos limpar a tela do computador e escrever no canto superior esquerdo da tela a frase "Oi, tudo bem ?". Teríamos:

GWBasic AppleSoft Basic

10 CLS 10 HOME

20 PRINT "Oi, tudo bem ?" 20 PRINT "Oi, tudo bem ?"

Comentários: CLS / HOME - Limpam a tela

PRINT - Imprime a mensagem entre aspas

Turbo Pascal

PROGRAM ESCREVE;

USES

CRT;

BEGIN

CLRSCR;

WRITE ('Oi, tudo bem ?');

END.

Comentários: USES CRT - Torna a tela disponível para uso

CLRSCR - Limpa a tela

WRITE - Imprime a mensagem entre apóstrofes

C

# include “stdio.h”

# include “conio.h”

void main ()

{

clrscr();

printf(“Oi, tudo bem ?”);

}

Comentários: INCLUDE - Incluem módulos, neste caso para utilização da tela

CLRSCR - Limpa a tela

PRINTF - Imprime a mensagem entre aspas

Nota-se claramente que tanto o Pascal quanto o C possuem uma estrutura muito mais rígida do que o BASIC, tornando o programa final muito melhor de ser lido por pessoas que não fizeram parte do processo de criação do mesmo - no BASIC, que não possui uma estrutura tão rígida, geralmente demora-se muito mais tempo até entendermos o funcionamento de um programa escrito por outra pessoa. Linguagens como Pascal e C são consideradas, portanto, linguagens estruturadas, por necessitarem de uma estrutura rígida de programação.

Mas como o computador entende os comandos programados ? Isto vai depender da forma que o microcomputador vai "encarar" a linguagem. Quando, por exemplo, a linguagem vem residente, como no caso do BASIC dos microcomputadores mais antigos, o microcomputador passa a dispor de um interpretador sendo esta linguagem considerada uma linguagem interpretada. Nas linguagens interpretadas, o interpretador faz com que o microprocessador "entenda" a linguagem como se fosse uma coisa "normal", ou seja, algo que já fizesse parte do microcomputador como um todo. Neste caso, a cada comando entrado, a linguagem (que é um programa, como já vimos) irá pegar o comando de alto nível, interpretá-lo e, caso tenha sido entrado com a sintaxe correta, será executado convertendo-o em um conjunto de instruções equivalentes em linguagem de máquina para que o microprocessador possa executar o que o programador deseje. Mas caso nós não tenhamos um interpretador, devemos nos utilizar de um compilador e neste caso a linguagem passa a ser considerada linguagem compilada. Nas linguagens compiladas, o compilador "converte" a linguagem de alto nível - que o microprocessador não entende - em linguagem de baixo nível. Um programa executado em linguagem compilada é muito mais rápido, pois está na verdade sendo executado integralmente em baixo nível, o que não acontece na linguagem interpretada. Em compensação durante o processo de criação e edição do programa toda vez que quisermos testar o programa deveremos compilá-lo antes, o que pode demorar um pouco - o que não acontece com as linguagens interpretadas, aonde o programa é executado na hora.

Video Aula Montando uma rede local

Este Video ensina como montar uma rede local:

segunda-feira, 30 de março de 2009

sexta-feira, 27 de março de 2009

Bug do milênio

Bug do milênio ou Bug do milénio foi o termo usado para se referir ao problema previsto ocorrer em todos os sistemas informatizados na passagem do ano de 1999 para 2000. Bug é um jargão internacional usado por profissionais e conhecedores de programação, que significa um erro de lógica na concepção de um determinado software.

Contexto histórico


Na década de 60, com a solidificação de vários sistemas computacionais e a ampliação de sua abrangência, foi necessária a adoção de diversos padrões para garantir a compatibilidade entre os diversos tipos de hardware e os softwares escritos para eles. Numa época em que cada byte de memória economizado representava economia de dinheiro muitos destes padrões adotavam formas resumidas para armazenar dados. Ainda hoje centenas destes padrões ainda estão em vigor, embora muitos tenham sido substituídos para se atualizar com a flexibilidade dos novos hardwares disponíveis.

Nos sistemas mais antigos, como aqueles na linguagem COBOL e semelhantes, as datas eram armazenadas com apenas 2 dígitos para o ano, ficando os restantes implicitamente entendidos como sendo "19". Desta forma cada data armazenada deixava de ocupar oito bytes (dois para o dia, dois para o mês e quatro para o ano), e passava a ocupar somente seis bytes (somente dois no ano). A opção por representar as datas desta forma vinha da necessidade real de economia de memória e espaço de armazenamento. Hoje isso parece insignificante mas na época isso foi o suficiente para justificar a adoção do padrão, tamanho o custo das memórias e dispositivos de armazenamento.

Para ter uma idéia imagine um banco de dados com vários campos, entre eles data de nascimento, data de casamento e data de cadastro. Para cada registro a economia nas três datas totaliza seis bytes. Se o banco de dados tiver dez mil registros são 60kB bytes a menos, o que era significativo numa época em que os discos tinham o tamanho de 180kB.

O problema


Como todas as datas eram representadas por somente 2 dígitos, os programas assumiam o "19" na frente para formar o ano completo. Assim, quando o calendário mudasse de 1999 para 2000 o computador iria entender que estava no ano de "19" + "00", ou seja, 1900. Os softwares mais modernos, que já utilizavam padrões mais atuais, não teriam problemas em lidar com isso e passariam corretamente para o ano 2000, mas constatou-se que uma infinidade de empresas e instituições de grande porte ainda mantinham em funcionamento programas antigos, em função da confiança adquirida por anos de uso e na sua estabilidade. Para além disso, temiam-se os efeitos que poderiam ser provocados no hardware pelo sistema BIOS, caso este reconhecesse apenas datas de dois dígitos.

Caso as datas realmente "voltassem" para 1900, clientes de bancos veriam suas aplicações dando juros negativos, credores passariam a ser devedores, e boletos de cobrança para o próximo mês seriam emitidos com 100 anos de atraso.

Soluções


O temor do Bug do milênio motivou uma renovação em massa dos recursos de informática (tanto de software como de hardware) e houve uma louca corrida para corrigir, atualizar e testar os sistemas antes que ocorresse a mudança do milênio. Velhos programadores de COBOL foram tirados da aposentadoria, para voltar a trabalhar em sistemas muitas vezes desenvolvidos por eles mesmos, vinte anos antes.

Na verdade, alguns dos sistemas desenvolvidos já possuíam alguma previsão para a virada do milênio. Um exemplo de técnica de compensação ao Bug pode ser encontrado no velho sistema em COBOL da empresa brasileira Espiral Informática: O sistema adicionava 1900 ao ano sempre que este fosse maior do que 25. E adicionava 2000 a todos os anos anteriores a 25. Assim, "24" seria interpretado como 2024, e "26", como "1926". Já "85" era interpretado como 1985. Este sistema tinha vida útil até 2025, data escolhida de forma arbitrária pelo desenvolvedores, possivelmente na crença de que em 2025 o sistema já teria sido substituído por simples obsolescência.

Nos computadores da Apple, era utilizado um sistema de contagem de segundos desde 1 de Janeiro de 1904, sendo que o sistema operativo se encarregava de converter os segundos em data.

Consequências

Surpreendentemente, houve poucas falhas decorrentes do Bug do milênio, que se revelou quase inofensivo apesar de ter gerado uma onda de pânico coletivo, especialmente nos países nos quais os computadores estavam mais popularizados. O assunto gerou muita polêmica devido aos grandes lucros gerados para as empresas de informática, foi alvo de matérias copiosas na imprensa e deu até origem a vários filmes. Hoje é considerado como um dos casos registrados pela História de pânico coletivo vazio de fundamentos, uma versão moderna do "temor do fim do mundo" que acometeu os povos da Europa Medieval na virada do ano de 999 para 1000.

História do hardware

O hardware do computador é um componente essencial no processo de cálculo e armazenamento de dados pois ele é necessário para o processamento e compartilhamento de dados. O primeiro computador que se tem notícia é literalmente duro. Os Fenícios armazenavam peças cerâmicas representando coisas como estoque e grãos em vasilhames, que não eram usados apenas pelo mercador mas pelos contadores e oficiais do governo.

Este texto apresenta os fatos mais significativos no desenvolvimento do hardware do computador.

Primeiros dispositivos para facilitar o cálculo

A Humanidade tem utilizado dispositivos para auxiliar a computação há milênios. Um exemplo é o dispositivo para estabelecer a igualdade pelo peso: as clássicas balanças, posteriormente utilizadas para simbolizar a igualdade na justiça. Um dispositivo mais orientado à aritmética é o ábaco mostrado na figura ao lado.

Primeiras calculadoras mecânicas


Em 1623 Wilhelm Schickard construiu a primeira calculadora mecânica e assim, tornou-se o pai da era da computação. Como sua máquina utilizava técnicas como engrenagens inicialmente desenvolvidas para relógios, ela foi também chamada de 'relógio calculador'. Ela foi colocada em uso prático por seu amigo Johannes Kepler, que revolucionou a astronomia.

A máquina de Blaise Pascal (a Pascalina, 1642) e Gottfried Wilhelm von Leibniz (1670) se seguiram.

Leibniz descreveu também o código binário, um ingrediente central de todos os computadores modernos. Entretanto, até 1940, muitos projetos (incluindo a máquina de Babbage do século 19 e mesmo o ENIAC de 1945) foram baseados no sistema decimal, mais difícil de implementar.

John Napier notou que a multiplicação e a divisão de números poderia ser feita pela adição e subtração, respectivamente, de logaritmos destes números. Como números reais podem ser representados pelas distâncias ou intervalos em uma linha, uma simples operação de translação ou movimentação de dois pedaços de madeira, corretamente marcados com intervalos logaritmos ou lineares, foi utilizada como a régua de cálculo por gerações de engenheiros e outros profissionais de ciências exatas, ate a invenção da calculadora de bolso . Assim os engenheiros do programa Apollo para enviar o homem à lua fizeram seus cálculos em réguas de cálculo.

Leitores de cartões perfurados 1801-1940


Em 1801, Joseph-Marie Jacquard desenvolveu uma máquina têxtil em que o padrão de saída era controlado por cartões perfurados. O conjunto de cartões poderia ser alterado sem alterar a estrutura da máquina têxtil. Este foi um marco na programação.

Em 1890 o censo dos Estados Unidos utilizou cartões perfurados e máquinas de ordenação desenhadas por Herman Hollerith para controlar os dados do censo da década conforme previsto na constituição. A companhia de Hollerith tornou-se posteriormente o núcleo da IBM.

No século 20, a eletricidade foi utilizada pela primeira vez em máquinas de calcular e ordenar. Em 1940, W.J. Eckert do Thomas J. Watson Astronomical Computing Bureau da Universidade de Columbia publicou o artigo Método dos cartões perfurados na computação científica que era suficientemente avançado para resolver equações diferenciais, multiplicar e dividir números de ponto flutuante, baseado unicamente em cartões perfurados e mesas de conexão similares às utilizadas por operadores de telefonia. Os cálculos astronômicos representaram o estado da arte na computação.

Primeiros projetos de máquinas programáveis 1835-1900s

A característica que define um "Computador Universal" é a "programabilidade" que permite ao computador emular qualquer outra máquina de calcular alterando a sequência de instruções armazenadas. Em 1835 Charles Babbage descreve sua Máquina Analítica. Esta máquina tratava-se de um projeto de um computador programável de propósito geral, empregando cartões perfurados para entrada e uma máquina de vapor para fornecer energia. Enquanto os projetos estavam provavelmente corretos, conflitos com o artesão que construía as partes, e o fim do financiamento do governo, tornaram impossível a sua construção. Ada Lovelace, filha de Lord Byron, traduziu e adicionou anotações ao Desenho da Máquina Analítica de L. F. Manabrea. Ela se tornou uma parceira bem próxima de Babbage. Alguns reivindicam que ela é a primeira programadora de computadores do mundo, entretanto essa reivindicação e a validade de suas outras contribuições são disputadas por muitos. A reconstrução da Máquina Diferencial está em operação desde 1991 no Museu de Ciências de Londres, ela trabalha como Babbage projetou e mostra que ele estava certo na teoria e permite a produção de partes da precisão requerida. Babbage falhou porque seus desenhos eram muito ambiciosos, ele teve problemas com relações de trabalho, e era politicamente inapto.

Outros tipos limitados de computação mecânica 1800s-1900s


No início do século 20 as primeiras calculadoras mecânicas, caixas registradoras e máquinas de cálculo em geral foram redesenhadas para utilizar motores elétricos, com a posição das engrenagens representando o estado de uma variável. Pessoas eram empregadas com o cargo de "computador", e utilizavam calculadoras para avaliar expressões. Durante o Projeto Manhattan, o futuro prêmio Nobel Richard Feynman foi o supervisor de uma sala cheia de computadores humanos, muitos deles mulheres, que entendiam as equações diferenciais que estavam sendo solucionadas para a guerra. Mesmo o renomado Stanislaw Marcin Ulam foi encarregado de trabalhar na tradução da matemática em um modelo computacional aproximado da bomba de hidrogênio, depois da guerra.

Durante a Segunda guerra mundial, Os planos de Curt Herzstark para uma calculadora mecânica de bolso literalmente salvaram sua vida. Veja: Cliff Stoll, Scientific American 290, no. 1, pp. 92-99. (Janeiro 2004)

Computadores analógicos, pré-1940

Antes da segunda guerra, computadores mecânicos e elétricos computadores analógicos foram considerados o 'estado da arte', e muitos pensavam que eles eram o futuro da computação. Computadores analógicos utilizam variações contínuas de variáveis físicas, como voltagem e corrente, ou a velocidade de rotação de um dispositivo, para representar as quantidades sendo processadas. Um exemplo ingênuo de tal máquina é o Integrator aquático construído em 1936. Ao contrário dos computadores digitais modernos, computadores analógicos não são muito flexíveis, e precisavam ser reconfigurados (reprogramados) manualmente para trocar o problema em que iriam trabalhar. Computadores analógicos tinham uma vantagem frente aos primeiros computadores digitais pois eram capazes de resolver problemas mais complexos. Desde que os programas de computador não eram ainda muito populares nesta época (apesar do trabalho pioneiro de Babbage), As soluções eram freqüentemente hard-coded na forma de gráficos e nomogramas, que podiam representar, por exemplo, uma analogia da solução de problemas como a distribuição de pressão e temperatura em um sistema de aquecimento. Mas à medida que os computadores digitais se tornavam mais rápidos e com mais memória (e.g., RAM ou armazenamento interno), eles praticamente substituíram inteiramente os computadores analógicos, e a profissão de programador surgiu.

Primeira geração dos computadores digitais 1940


A era da computação moderna começou com uma corrida de desenvolvimento antes e durante a Segunda guerra mundial, com circuitos eletrônicos, relés, capacitores e válvulas substituindo seus equivalentes mecânicos e o cálculo digital substituindo o cálculo analógico. Os computadores projetados e construídos nesta época foram chamados computadores de 'primeira geração'. Estes computadores eram normalmente construídos manualmente usando circuitos contendo relés e válvulas, e freqüentemente utilizavam cartões perfurados para a entrada e como a memória de armazenamento principal (não volátil). A memória temporária ou memória de trabalho, era fornecida por linhas de retardo acústicas (que utilizam a propagação do som no tempo como um meio para armazenar dados) ou por tubos de Williams (que utilizam a habilidade dos tubos de raios catódicos da televisão para armazenar dados). Em 1954, memórias de núcleo magnético rapidamente substituíram outras formas de armazenamento temporário, e dominaram até a metade da década de 1970.

Em 1936 Konrad Zuse iniciou a construção das primeiras calculadoras 'Z-series', calculadoras com memória e programáveis (inicialmente de forma limitada). A calculadora de Zuse totalmente mecânica, mas ainda utilizando o sistema binário foi finalizada em 1938, entretanto, nunca funcionou com confiabilidade por problemas de precisão em suas peças.

Em 1937, Claude Shannon finalizou sua tese de mestrado no MIT que implementava Álgebra booleana utilizando relés e chaves pela primeira vez na história. Intitulada Uma análise simbólica de relés e circuitos de comutação, A tese de Shannon forneceu as bases para o desenho prático de circuitos digitais.

A máquina seguinte de Zuse, o Z3, foi finalizado em 1941. Ela era baseada em relés telefônicos e funcionou satisfatoriamente. O Z3 passou a ser o primeiro computador programável. Em vários aspectos ele era muito semelhante às máquinas modernas, sendo pioneiro em vários avanços, como o uso de aritmética binária, e números de ponto flutuante. A troca do sistema decimal, mais difícil de implementar (utilizado no projeto de Charles Babbage) pelo simples sistema binário tornou a máquina de Zuse mais fácil de construir e potencialmente mais confiável, com a tecnologia disponível naquele tempo. Esta é algumas vezes vista como a principal razão do sucesso de Zuse onde Babbage falhou, entretanto, muitas das máquinas de hoje continuam a ter instruções de ajuste decimal, a aritmética decimal é ainda essencial para aplicações comerciais e financeiras e hardware para cálculos de ponto-flutuante decimais vem sendo adicionado em muitas novas máquinas (O sistema binário continua sendo utilizado em praticamente todas as máquinas).

Os Programas eram armazenados no Z3 em filmes perfurados. Desvios condicionais não existiam, mas na década de 1990 teóricos demonstraram que o Z3 ainda era um computador universal (ignorando sua limitação no seu espaço de armazenamento físico). Em duas patentes de 1937, Konrad Zuse antecipou que as instruções da máquina poderiam ser armazenadas no mesmo espaço de armazenamento utilizado para os dados - A primeira idéia do que viria a ser conhecida como a arquitetura de Von Neumann e que seria implementada no EDSAC britânico (1949). Zuse ainda projetou a primeira linguagem de alto nível, o (Plankalkül), em 1945, apesar desta não ser formalmente publicada até 1971, foi implementada pela primeira vez em 2000 pela universidade de Berlin -- cinco anos após a morte de Zuse.

Zuse sofreu dramáticas derrotas e perdeu muitos anos durante a Segunda Guerra Mundial quando os bombardeamentos ingleses e americanos destruíram as suas primeiras máquinas. Aparentemente seu trabalho permaneceu em grande parte desconhecida para os engenheiros americanos e britânicos por muito tempo, no entanto pelo menos a IBM estava a par do seu trabalho e financiou sua companhia após a guerra 1946 em troca de permissões em suas patentes.

Em 1940, a calculadora de número complexos, para aritmética de números complexos baseada em relés, foi construída. ela foi a primeira máquina a ser acessada remotamente via uma linha telefônica. Em 1938 John Vincent Atanasoff e Clifford E. Berry da universidade do estado de Iowa desenvolveram o Atanasoff Berry Computer (ABC), um computador com um propósito especial: resolver sistemas de equações lineares, e que empregava capacitores para sua memória. A máquina ABC não era programável, mas era um computador em outros aspectos.

Durante a Segunda Guerra Mundial, os ingleses fizeram esforços significativos em Bletchley Park para quebrar a comunicação militar alemã. O principal sistema de criptografia germânico era feito através de uma máquina codificadora (o Enigma com vária variantes) foi atacado com bombas especialmente projetadas que ajudaram a encontrar possíveis chaves para o Enigma, depois que outras técnicas não tiveram sucesso. Os alemães também desenvolveram uma série de sistemas cifradores (chamados cifradores Fish pelos ingleses e cifradores de Lorenz pelos alemães) que eram um pouco diferentes do Enigma. Como parte do ataque contra este cifradores, o professor Max Newman e seus colegas (incluindo Alan Turing) ajudaram a projetar o Colossus. O Colossus Mk I foi feito em um curto período de tempo por Tommy Flowers no centro de pesquisa dos correios em Dollis Hill, Londres e então enviado para Bletchley Park.

O Colossus foi o primeiro dispositivo de computação totalmente eletrônico. Ele utilizava apenas válvulas e não possuía relés. Ele tinha uma fita de papel como entrada e era capaz de fazer desvios condicionais. Nove Colossus Mk II foram construídos (O Mk I foi convertido para Mk II totalizando dez máquinas). Detalhes de sua existência, projeto e uso foram mantidos em segredo até a década de 1970. Dizem que Winston Churchill ordenou pessoalmente a destruição dos computadores em peças não maiores que uma mão humana. Devido a este segredo estes computadores não foram incluídos em muitas histórias da computação. Uma cópia reconstruída de uma das máquinas Colossus existe hoje em exposição em Bletchley Park.

O trabalho de Turing antes da Guerra teve uma grande influência na teoria da computação, e após a Guerra ele projetou, construiu e programou alguns dos primeiros computadores no National Physical Laboratory na Universidade de Manchester. Seu artigo de 1936 incluía uma reformulação dos resultados de 1931 de Kurt Gödel além de uma descrição do que agora é chamado de máquina de Turing, um dispositivo puramente teórico inventado para formalizar a noção da execução de algorítmos, substituindo a complicada linguagem universal de Gödel baseada em aritmética. Computadores modernos têm a capacidade de execução equivalente a uma máquina de Turing universal), exceto por sua memória finita. Esta limitação na memória é algumas vezes vista como uma fronteira que separa computadores de propósito geral dos computadores de propósito especial anteriores.

George Stibitz e colaboradores no Laboratório Bell em Nova Iorque produziram vários computadores baseados em relés no final da década de 1930 e início da década de 1940, mas foram concebidos principalmente para o controle do sistema de telefonia. Seus esforços foram um antecedente de outra máquina eletromecânica americana.

O Harvard Mark I (oficialmente, o Calculador Controlado por Sequência) foi um computador de propósito geral eletro-mecânico construído com o financiamento da IBM e com a assistência de alguns funcionários da IBM sob a direção de um matemático de Harvard Howard Aiken. Seu projeto foi influenciado pela máquina analítica. Ele era uma máquina decimal que utilizava rodas de armazenamento em chaves rotativas juntamente com relés. Ele era programado por cartões perfurados, e continha várias calculadoras trabalhando em paralelo. Modelos posteriores continham vários leitores de fita de papel e a máquina podia trocar de leitor dependendo de uma condição. O Desenvolvimento começou em 1939 no laboratório Endicott da IBM; o Mark I foi transferido para a Universidade de Harvard e começou a operar em maio de 1944.

O ENIAC (Electronic Numerical Integrator and Computer), freqüentemente chamado o primeiro computador eletrônico de propósito-geral, validou publicamente o uso da eletrônica para a computação em larga escala. Isto foi crucial para o desenvolvimento da computação moderna, inicialmente devido à enorme vantagem em velocidade e depois pelo potencial de miniaturização. Construído sob a direção de John Mauchly e J. Presper Eckert, ele era 1.000 vezes mais rápido que seus contemporâneos. O desenvolvimento e construção do ENIAC iniciou em 1941 e entrou em operação completa 1945. Quando seu projeto foi proposto, muitos pesquisadores acreditavam que milhares de delicadas válvulas iriam queimar com uma freqüência tal que o ENIAC estaria freqüentemente desligado para reparos e não teria uso prático. Ele foi, entretanto, capaz de fazer 100.000 cálculos simples por segundo por horas entre as falhas nas válvulas.

`Programar' o ENIAC, entretanto, significava modificar a sua fiação interna - podemos dizer que isto nem se qualifica como programação, de outro modo qualquer tipo de reconstrução de algum computador limitado pode ser visto como programação. Vários anos depois, entretanto, ele se tornou capaz de executar programas armazenados em uma tabela de funções na memória.

Todas as máquinas daquela data ainda deixavam de possuir o que passou a ser conhecido como a arquitetura de von Neumann: seus programas não eram armazenados no mesmo 'espaço' de memória que os dados e assim os programas não podiam ser manipulados como os dados.

A primeira máquina com a arquitetura von Neumann foi o Manchester "Baby" ou Máquina Experimental em pequena escala, construída na Universidade de Manchester em 1948; ela foi seguida pelo Manchester Mark I em 1949 que funcionava como um sistema completo utilizando o tubo de Williams para a memória e introduziu o uso de registradores de índice. O outro candidato ao título de "primeiro computador com programas armazenados de forma digital" foi o EDSAC, projetado e construído na Universidade de Cambridge. Operacional menos de um ano depois do Manchester "Baby", ele era capaz de resolver problemas reais. O EDSAC foi inspirado nos planos do EDVAC, o sucessor do ENIAC; estes planos existiam na época que o ENIAC ficou operacional. Ao contrário do ENIAC, que utilizava processamento paralelo, O EDVAC utilizava uma única unidade de processamento. Seu desenho era simples e foi o primeiro a ser implementado em cada nova onda de miniaturização, e aumento de confiabilidade. Muitos consideram o Manchester Mark I / EDSAC / EDVAC os pais dos quais derivaram a arquitetura de todos os computadores correntes.

O primeiro computador universal programável na Europa foi criado por um time de cientistas sob a direção de Segrey Alekseevich Lebedev do Instituto de Eletrotecnologia de Kiev, União Soviética (hoje Ucrânia). O computador MESM (МЭСМ, Pequena máquina eletrônica de cálculo) tornou-se operacional em 1950. Ele tinha cerca de 6.000 válvulas e consumia 25 kW de potência. Ele podia fazer aproximadamente 3.000 operações por segundo.

A máquina da Universidade de Manchester tornou-se o protótipo do Ferranti Mark I. O primeiro Ferranti Mark I foi entregue à Universidade em fevereiro de 1951, e no mínimo nove outros foram vendidos entre 1951 e 1957.

Em junho de 1951, o UNIVAC I (Universal Automatic Computer) foi entregue para o departamento de censo dos Estados Unidos da América. Mesmo tendo sido fabricado por Remington Rand, a máquina é freqüentemente chamada indevidamente de "IBM UNIVAC". Remington Rand vendeu 46 máquinas por mais de US$1 milhão cada. O UNIVAC foi o primeiro computador 'produzido em massa'; todos os predecessores foram feitos em pequena escala. Ele utilizava 5.200 válvulas e consumia 125 kW de potência. Utilizava uma linha de retardo de mercúrio capaz de armazenar 1.000 palavras de 11 dígitos decimais mais o sinal (palavras de 72 bits). Ao contrário das máquinas anteriores ele não utilizava cartões perfurados para entrada e sim uma fita de metal.

Em Novembro de 1951, A empresa J. Lyons começou uma operação semanal de contabilidade de uma padaria com o LEO (Lyons Electronic Office). Esta foi a primeira aplicação comercial em um computador programável.

Ainda em 1951 (Julho), Remington Rand demonstrou o primeiro protótipo do 409, uma calculadora programável com cartões perfurados e plugues. Ele foi instalado inicialmente, no serviço de receita interna de Baltimore, em 1952. Veja em Rowayton Historical Society's timeline maiores detalhes. O 409 evoluiu para se tornar o Univac 60 e 120 em 1953.

Segunda geração 1947-1960


O grande passo seguinte na história da computação foi a invenção do transístor em 1948. Ele substituiu as frágeis válvulas, que ainda eram maiores e gastavam mais energia, além de serem menos confiáveis. Computadores transistorizados são normalmente referidos como computadores da 'segunda geração' e dominaram o mercado nos anos entre 1950 e início de 1960. Apesar de utilizar transistores e placas de circuito impresso estes computadores ainda eram grandes e utilizados principalmente em universidades, órgãos públicos e grandes empresas. O IBM 650 baseado em válvulas de 1954 pesava 900 kg, a fonte de alimentação pesava cerca de 1350 kg e ambos eram mantidos em gabinetes separados de 1,5 metros por 0,9 metros por 1,8 metros. Ele custava US$500.000 ou podia ser alugado por US$3.500 por mês. Entretanto a memória tinha originalmente apenas 2000 palavras de 10 dígitos, uma limitação que forçava uma programação difícil, para obter resultados. Este tipo de limitação dominou a programação por décadas.

Em 1955, Maurice Wilkes inventou a microprogramação, hoje utilizada universalmente na implementação dos projetos de CPU. O conjunto de instruções da CPU é definido por uma programação especial.

Em 1956, A IBM vendeu seu primeiro disco magnético, RAMAC (Random Access Method of Accounting and Control). Ela utilizou 50 discos de metal de 24 polegadas, com 100 trilhas por lado. Ele podia armazenar 5 megabytes de dados a um custo de US$10.000 por megabyte.

A primeira linguagem de programação de alto nível criada, o FORTRAN, foi também desenvolvida na IBM naquela época. (O projeto de Konrad Zuse de 1945 de uma linguagem de alto nível, Plankalkül, não estava implementado ainda.)

Em 1959 a IBM construiu um mainframe baseado em transistores, o IBM 1401, que utilizava cartões perfurados. Ele se tornou um computador de propósito geral popular e 12.000 foram vendidos, tornando-se a mais bem sucedida máquina na história dos computadores. Ele utilizava uma memória principal magnética de 4000 caracteres (mais tarde expandida para 16.000). Muitos aspectos de seu projeto foram baseados no desejo de substituir as máquinas de cartões perfurados da década de 1920 que estavam em uso.

Em 1960 a IBM vendeu o mainframe IBM 1620 baseado em transistores, originalmente utilizava somente fita de papel perfurado, mas foi logo atualizado para cartões perfurados. Ele provou ser um computador científico popular e cerca de 2.000 foram vendidos. Ele utilizava uma memória de núcleo magnético de até 60.000 dígitos decimais.

Ainda em 1960, a DEC lançou o PDP-1 sua primeira máquina destinada ao uso por pessoal técnico em laboratórios e para pesquisa.

Em 1964 a IBM anunciou o System/360, que foi a primeira família de computadores que podia executar o mesmo programa em diferentes combinações de velocidade, capacidade e preço. Ele ainda foi pioneiro no uso comercial de microprogramas, com um conjunto estendido de instruções projetado para processar muitos tipos de dados, não apenas aritméticos. Além disto, ele unificou a linha de produtos da IBM, que anteriormente incluía uma linha "comercial" e uma linha "científica" separadas. O programa fornecido com o System/360 ainda incluía outros avanços, incluindo multiprogramação, novas linguagens de programação e independência dos programas dos dispositivos de entrada e saída. Mais de 14 000 System/360 foram vendidos até 1968.

Ainda em 1964, a DEC criou o PDP-8 uma máquina muito pequena, novamente destinada a técnicos e laboratórios de pesquisa.

Terceira geração e posterior, após-1958


A explosão no uso dos computadores começou com a 'Terceira Geração' de computadores. Estes se baseiam na invenção independente do circuito integrado (ou chip) por Jack St. Claire Kilby e Robert Noyce, que posteriormente levou à invenção do microprocessador por Ted Hoff da Intel.


No final da década de 1950, pesquisadores como George Gamow notaram que longas seqüências de nucleotídeos no DNA formavam um código genético, assim surge uma outra forma de codificação ou programação, desta vez com expressões genéticas. Na década de 1960, foi identificado análogos para a instrução de parada halt, por exemplo.

Na virada do milênio, pesquisadores notaram que o modelo descrito pela mecânica quântica poderia ser visto como elementos computacionais probabilísticos, com um poder de computação excedendo qualquer um dos computadores mencionados anteriormente, a Computação quântica.