09/2006
SHOPTOUR p.26 Linux para vender melhor
MULTIMÍDIA MÓVEL p.22 Instituto Nokia de Tecnologia em PE
CEZAR TAURION p.28 Código aberto e inteligência coletiva
00023 exemplar de
A REVISTA DO PROFISSIONAL DE TI
ven d a p ro i b i d a 9 771806 942009
# 23
Assinante
R$ 13,90 € 7,50
# 23
Linux Magazine
Setembro 2006
#23 09/06
LAMP Apache MySQL PHP PostgreSQL
LAMP SERVIDORES WEB COM
LINUX, APACHE, MYSQL, POSTGRESQL, PHP, PYTHON
AJAX
» Apache, servidor web profissional
p.32
» Programação orientada a objetos no PHP
RAID
» Buscas mais velozes no PostgreSQL » Novidades do MySQL 5
p.49 p.42
p.36
» Websites AJAX com Python
p.73
NBD TOR & Privoxy
RAID NO LINUX p.56 Segurança e desempenho
Pessulus & Sabayon
TERMINAIS LEVES p.66 Acesso mais rápido com NBD
Botnets
VEJA TAMBÉM NESTA EDIÇÃO:
Rsync
» Navegação anônima com Tor & Privoxy p.59 » Enjaulando o gnomo: Pessulus e Sabayon p.54 » Botnets, a nova modalidade de DDoS p.64 » Sincronização eficiente com Rsync p.62
http://supertuxbr.blogspot.com
WWW.LINUXMAGAZINE.COM.BR
NOVO PROJETO GRÁFICO E EDITORIAL!
http://supertuxbr.blogspot.com
Expediente editorial
Direitos Autorais e Marcas Registradas © 2004 - 2006: Linux New Media do Brasil Editora Ltda. Distribuição: Distmag Impressão e Acabamento: Parma ISSN 1806-9428 Impresso no Brasil
INSTITUTO VERIFICADOR DE CIRCULAÇÃO
em processo de filiação
Padrões abertos e Software Livre
EDITORIAL
Diretor Editorial Rafael Peregrino da Silva peregrino@linuxmagazine.com.br Coordenador Editorial e Diretor de Arte Luciano Hagge Dias lhagge@linuxmagazine.com.br Editores Tadeu Carmona tcarmona@linuxmagazine.com.br Pablo Hess phess@linuxmagazine.com.br Tradução e Revisão Livea Marchiori lmarchiori@linuxnewmedia.com.br Design da Capa Luciano Hagge Dias lhagge@linuxmagazine.com.br Centros de Competência Centro de Competência em Software: Oliver Frommel ofrommel@linux-magazine.com Centro de Competência em Hardware: Mirko Dölle mdoelle@linux-magazine.com Centro de Competência em Redes e Segurança: Achim Leitner aleitner@linux-magazine.com Correspondentes & Colaboradores Augusto Campos, Carsten Schnober, Cezar Taurion, Charly Kühnast, Dirk von Suchodoletz, Heike Jurzik, Jorge Pereira, José Maria Ruiz, Klaus Knopper, Kristian Kissling, Larkin Cunningham, Marcus Nasarek, Nabucodonosor Coutinho Costa, Pedro Orantes, Rúben Lício, Thorsten Zitterell e Zack Brown. Diretor Comercial Claudio Bazzoli cbazzoli@linuxmagazine.com.br Anúncios: Claudio Bazzoli (Brasil) anuncios@linuxmagazine.com.br Tel.: +55 (0)11 2161 5400 Fax: +55 (0)11 2161 5410 Osmund Schmidt (Alemanha, Áustria e Suíça) anzeigen@linux-magazine.com Brian Osborn (Outros países) ads@linux-magazine.com Assinaturas: www.linuxnewmedia.com.br assinaturas@linuxmagazine.com.br Na Internet: www.linuxmagazine.com.br – Brasil www.linux-magazin.de – Alemanha www.linux-magazine.com – Portal Mundial www.linuxmagazine.com.au – Austrália www.linux-magazine.ca – Canadá www.linux-magazine.es – Espanha www.linux-magazine.pl – Polônia www.linux-magazine.co.uk – Reino Unido www.linux-magazin.ro – Romênia Apesar de todos os cuidados possíveis terem sido tomados durante a produção desta revista, a editora não é responsável por eventuais imprecisões nela contidas ou por conseqüências que advenham de seu uso. A utilização de qualquer material da revista ocorre por conta e risco do leitor. Nenhum material pode ser reproduzido em qualquer meio, em parte ou no todo, sem permissão expressa da editora. Assume-se que qualquer correspondência recebida, tal como cartas, emails, faxes, fotografias, artigos e desenhos, são fornecidos para publicação ou licenciamento a terceiros de forma mundial não exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado. Linux é uma marca registrada de Linus Torvalds. Linux Magazine é publicada mensalmente por: Linux New Media do Brasil Editora Ltda. Rua Arizona, 1349 Conj. 5B – Cidade Monções 04567-003 – São Paulo – SP – Brasil Tel.: +55 (0)11 2161 5400 Fax: +55 (0)11 2161 5410
Prezado leitor, prezada leitora da Linux Magazine, é notório que somente a disponibilidade do código-fonte de um sistema, enquanto extremamente importante, não é suficiente para que o Linux “ganhe o jogo” contra os sistemas proprietários disponíveis no mercado. Uma outra necessidade, tão premente quanto a abertura do código, é a utilização de padrões abertos.
Todo mundo gosta de ter “alguém para estrangular” quando as coisas dão errado. Aquela empresa localizada em Redmond sempre fez questão de disseminar o medo, a incerteza e a dúvida no mercado, lançando no ar a questão: “Se algo der errado na sua empresa ao usar Linux, quem vai pagar o pato?” Quando se fala em software proprietário, fica muito fácil identificar “quem estrangular”: é o fornecedor do aplicativo ou sistema. O problema, entretanto, é que o uso desse tipo de sistema causa o que se convencionou chamar de “aprisionamento ao fornecedor” vendor lock-in – algo especialmente crítico em casos de monopólio. No caso do Linux e do Software Livre, o fornecedor da solução é que fica responsável pelo suporte técnico e pelas atualizações dos sistemas. Há apenas um porém: se essas soluções não seguirem padrões abertos, o aprisionamento com o fornecedor está de volta, mesmo que em menores proporções. Afinal, se padrões como a LSB (Linux Standard Base) não forem seguidos, as soluções de um fornecedor não irão funcionar na plataforma do outro. No final das contas, quando aliamos o Software Livre a padrões abertos, o resultado final é termos o melhor dos dois mundos: soluções sem aprisionamento a um determinado fornecedor e vários “responsáveis para estrangular”. Se uma empresa não me atende, posso contratar uma outra, sem medo de que a solução que rodava na plataforma da primeira não funcione na segunda. Se houver algum problema, há uma liberdade muito grande de experimentar os serviços de um outro fornecedor. E como o código da solução está disponível, podemos até nos dar ao luxo de auditar toda e qualquer modificação efetuada. Tudo isso contribui ainda mais fortemente para o aumento da excelência dos serviços dos diversos fornecedores, bem como na redução dos custos, oriunda da competição entre eles. Padrões e código abertos são assim o combustível aditivado ideal para fazer qualquer departamento de TI ter um desempenho superior, com mais segurança e menor custo.
Rafael Peregrino da Silva Diretor Editorial
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
3
ÍNDICE
CAPA LAMP, uma introdução
30
A base de um sistema LAMP deve ser robusta, poderosa e veloz, mas ao mesmo tempo, flexível. Naturalmente, ninguém melhor que o Linux para cumprir esse papel. Forte Apache
32
O Apache é o servidor Web mais usado em máquinas Linux. Extremamente poderoso e flexível, conheça em profundidade o “A” do “LAMP”. MySQL 5: Truques com dados
36
Mostramos como alguns novos recursos do MySQL 5 ajudarão a melhorar o desenho de programas e melhorarão muito o desempenho dos aplicativos. PostgreSQL: Busca bonita e veloz
42
Vamos realizar buscas em um portal jornalístico fictício para verificar a necessidade da indexação de textos e de outros recursos oferecidos pelo módulo Tsearch2 do PostgreSQL. PHP: Para dar liga
49
De nada adianta ter um banco de dados e um servidor Web se não houver algo para integrá-los. O PHP é a linguagem preferida de muitos webmasters, e atualmente é uma das estrelas do código aberto no mundo.
http://supertuxbr.blogspot.com 4
http://www.linuxmagazine.com.br
Linux Magazine 23 | ÍNDICE
TUTORIAL
COLUNAS Augusto Campos Charly Kühnast Klaus Knopper Zack Brown
09 10 12 14
NOTÍCIAS Segurança ➧ Múltiplas falhas no Mozilla Firefox
16
RAID :: Easy Rider O Linux oferece várias opções para cumprir o papel do RAID de fornecer acesso rápido e segurança aos dados do disco rígido.
56
TOR & Privoxy :: Anônimo na multidão Ao navegar na Internet, você normalmente revela seu endereço IP, o que permite que empresas compilem um perfil das suas atividades na Internet. O Tor e o Privoxy podem ajudar você a proteger sua privacidade
59
Rsync :: Sincronizado O Rsync foi feito para sincronizar conjuntos de dados, seja em máquinas distintas ou em um único computador. Até o SSH pode ser usado para a criptografia do tráfego dos dados.
62
➧ Samba ➧ krb5 ➧ Apache ➧ libtiff Geral ➧ ATI nega driver aberto para Linux
18
➧ Linux embarcado em aeronave militar ➧ Suporte à gravação NTFS à vista ➧ Extremadura muda completamente para SL e ODF ➧ Nova versão do driver de impressão Gutenprint ➧ Windows Media no Linux
SYSADMIN
➧ Apple e o código aberto
CORPORATE Notícias ➧ Drogaria Onofre adota o Linux
20
Bots :: Gangue virtual Durante suas atividade diárias normais, o colunista da Linux Magazine Charly Kühnast foi atingido por um ataque malévolo. O servidor anti-spam do Charly, que é acionado antes do servidor de emails, salvou-o da tempestade de mensagens.
64
Thin Clients :: O bloco está na rede
66
➧ Microsoft Vista sairá quando estiver pronto ➧ Alta disponibilidade na Rolls-Royce ➧ Banco de Brasília aumenta eficiência com Linux ➧ PalmSource perde licença da Palm ➧ Intel apresenta seus melhores processadores ➧ Compromisso da Motorola com Linux Artigo: Instituto Nokia de Tecnologia
22
Você não precisa do Samba ou do NFS para usar um cliente sem disco. Um dispositivo de blocos remoto pode ajudar a melhorar muito o desempenho e a eficiência.
PROGRAMAÇÃO Artigo: Pela liberdade de escolha Entrevista: Shop Tour Coluna: Cezar Taurion
24 26 28
AJAX AJAX é o termo da moda. O Google usa AJAX, o Yahoo usa AJAX...todo mundo quer usar o AJAX. Mas, e você, usa? E, o mais importante: que diabos é AJAX?
73
ANÁLISE Pessulus e Sabayon :: Sob encomenda A versão 2.14 do Gnome inclui novos recursos para restringir o acesso do usuário ao sistema. Os editores Pessulus e Sabayon vão direto ao ponto e auxiliam a administração das restrições dos usuários.
54
SERVIÇOS Editorial Emails Linux.local Eventos Índice de anunciantes
03 06 78 80 80
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
5
Emails para o editor
u c.h ww . sx
EMAILS
Permissão de Escrita
✎ Colaborativo
Meu nome é João Carlos e hoje trabalho no Hospital das Clínicas cuidando da Administração de Redes (Linux e Microsoft) de um dos Institutos do complexo hospitalar, ajudando na administração de um controlador de domínio, DNS, DHCP, proxy e outras ferramentas de monitoria de segurança. Estudo e trabalho com Linux há algum tempo, e por isso manifesto meu interesse em ser um autor. Gostaria de poder ajudar a revista na medida do possível, mas antes gostaria que fosse esclarecida uma dúvida. A cada mês, a revista procura dar mais atenção a determinado assunto. Eu gostaria de saber se é feito algum planejamento e como fica o calendário. Quanto tempo antes a equipe sabe ou decide os assuntos que serão abordados? Eu pergunto isso por que gostaria de poder participar e ajudar, mas não tenho idéia de que tipo de conteúdo posso começar a enviar para a revista. Minha cisma é que eu envie um determinado conteúdo que seja interessante para mim, mas que não seja legal para a revista publicar no momento e ficar a impressão que eu não pude colaborar. Eu não sei se isso é possível, até por questões de procedimento da empresa, mas se fosse enviado de modo antecipado os tópicos que a revista abordaria na próxima edição, acredito que eu possa ajudar. Não sei se sempre e em todas as edições, até por conta de minha rotina exaustiva, mas dentro do possível eu enviaria aquilo que fosse interessante para a Linux Magazine. Muito obrigado. João Carlos Gomes da Costa São Paulo, por e-mail Caro João Carlos, seu oferecimento é um exemplo do que esperamos dos demais leitores da revista: a contribuição dos membros da comunidade Open Source no Brasil é essencial para o enriquecimento na troca de experiências entre os leitores da Linux Magazine. Além disso, o envio de contribuições ajuda a dar uma cara mais colaborativa à revista - uma tendência de vanguarda mundial puxada pelo sucesso da Wikipédia, como mostramos na coluna de Cesar Torion nesta edição. Quanto ao nosso planejamento para as próximas edições, ele segue duas linhas mestras: a tradução das matérias prin-
sa
nja
g je
ne
ro
–w
Se você tem dúvidas sobre o mundo Linux, críticas ou sugestões que possam ajudar a melhorar a nossa revista, escreva para o seguinte endereço: cartas@linuxmagazine.com.br. Devido ao volume de correspondência, é impossível responder a todas as dúvidas sobre aplicativos, configurações e problemas de hardware que chegam à redação, mas garantimos que elas são lidas e analisadas. As mais interessantes são publicadas nesta seção.
cipais da Linux Magazine Internacional e a observação dos assuntos que estão “estourando” no mundo do Código Aberto aqui no Brasil. Como as coisas evoluem e se transformam muito rápido - e, acredite, é assim que elas devem ser - fica muito difícil criar um cronograma anual de assuntos. Vamos deixar as coisas mais fáceis para você e os demais leitores da revista: sobre o que vocês gostariam de escrever ou que assunto gostariam de ver na revista? Enviem sugestões e matérias para material@linuxmagazine.com.br. Todas as sugestões e matérias serão bem recebidas e avaliadas com todo o cuidado. Esse esforço colaborativo pode, no entanto, transcender as fronteiras da revista. Em breve a nova versão do nosso site estará no ar, com espaço para comentários, notícias e também envio de matérias dos nossos leitores. Se ter um artigo de sua autoria publicado na revista já é bom, imagine ter seus escritos publicados no site da maior editora de Linux do Brasil! ■
➧ Outras distribuições
Olá, antes de tudo quero parabenizar a revista pelas boas matérias que costuma trazer e por publicar, em português, material originário da famosa revista Linux Magazine Internacional. Gostaria de pedir, ao mesmo tempo, que a revista publicasse matérias sobre outros sabores do Linux, dando menos ênfase ao Suse e ao Fedora. Obrigado Pedro Fonseca, por email Caro Pedro, agradecemos pelos elogios dispensados à Linux Magazine, em ambas as versões. A questão das matérias abordando outras distribuições é respondida por você próprio, em sua carta: boa parte dos artigos da Linux Magazine International e da Linux Magazine alemã abordam o Suse e o Fedora, um por ser muito popular na Alemanha e o outro por ser praticamente o padrão do mercado de TI atrelado ao Linux, em conjunto com a Red Hat. Isso não significa que não possamos produzir matérias nacionais, abordando distribuições mais “hardcore” como o Debian, o Slackware e o Gentoo e nem que tenhamos nada contra essas distribuições - muito pelo contrário! Você quer participar escrevendo um artigo? ■
http://supertuxbr.blogspot.com 6
http://www.linuxmagazine.com.br
SEJA LIBRIX NA RUA, SEJA LIBRIX EM CASA, SEJA LIBRIX NO TRABALHO.
A solução completa.
Agora, além do Librix (Linux da Itautec), a sua empresa pode contar com o melhor e mais estável pacote de hardware e software do mercado, testado e homologado pela Itautec.
É mais segurança, porque a Itautec oferece suporte técnico especializado via internet ou pelo telefone, serviços de tuning e configuração e ainda atendimento nacional on site.
Toda a liberdade que você precisa para trabalhar com mais mobilidade, usando a internet sem fio, e ainda operar com software livre.
Tem alta tecnologia para os aplicativos como editor de textos, planilha eletrônica, editor de imagens e apresentações. É mais facilidade e maior flexibilidade no seu dia-a-dia. Na hora de trabalhar, não se sinta preso. Seja Librix.
DPZ
Foto ilustrativa.
• Monitor LCD de 17” incluso • 512 MB de memória • Gravador de CD
Itautec InfoWay Tiny Tower Código da oferta: IN526LI
IDEAL PARA ACESSO À INTERNET E COMUNICAÇÃO.(3)
• Processador Intel® Celeron® D 315 (256 KB de cache L2, 2.26 GHz, FSB 533 MHz) • Monitor LCD 17” • 512 MB de memória • HD 80 GB • Floppy • CD-RW • Placa de vídeo integrada • Placa de rede 10/100 integrada • Fax/Modem 56 Kbps(2) • Teclado, mouse, caixas acústicas e microfone • LIBRIX - Distribuição Linux Itautec • 1 ano de garantia balcão(4)
10x R$
173,90
sem juros
ou R$ 1.739,00 à vista
Consulte opções de financiamento(1)
www.itautecshop.com.br CO M P R E D I R E TA M E N T E D O FA B R I C A N T E
PRESENTE EM MAIS DE 2.700 CIDADES.
0800 121 444
De 2ª a 6ª, das 8h às 20h. Sábado, das 9h às 18h. Domingo, das 9h às 15h.
http://supertuxbr.blogspot.com Oferta válida até 14/9/2006 ou enquanto durarem os estoques. Celeron, Celeron Inside, Centrino, o logotipo Centrino, Core Inside, Intel, o logotipo Intel, Intel Core, Intel Inside, o logotipo Intel Inside, Intel SpeedStep, Intel Viiv, Itanium, Itanium Inside, Pentium, Pentium Inside, Xeon e Xeon Inside são marcas registradas ou marcas da Intel Corporation ou de suas filiais nos Estados Unidos e em outros países. (1)Consulte nossa Central de Atendimento para informações sobre outras condições de financiamento para pessoa física ou jurídica pelo telefone 0800-121-444. (2)A velocidade de comunicação de 56 Kbps depende e pode variar de acordo com o tipo e a qualidade da linha telefônica utilizada. (3)Para possibilitar o acesso à internet são necessários uma linha telefônica ou banda larga e um provedor à sua escolha. (4)Garantia balcão de um ano para partes, peças e serviços. Preços com impostos inclusos para São Paulo. Frete não incluso. Demais características técnicas e de comercialização estão disponíveis em nosso site e no Televendas. Fica ressalvada eventual retificação das ofertas aqui veiculadas. Quantidade: 10 unidades de cada. Empresa/produto beneficiado pela Lei de Informática. Fotos meramente ilustrativas.
EMAILS | cartas@linuxmagazine.com.br
✎ Thunderbird voa baixo
Preciso de sua ajuda: Estou com problemas no meu Suse, já que meu cliente de email, que é o Thunderbird, apresenta diversos erros durante o envio e recebimento de emails.E quanto ao Kmail, ele é realmente melhor do que os outros? Como faço para instalá-lo? Wladimir Pereira de Melo São Paulo, por email Wladimir, recomendamos que você revise as configurações do seu Thunderbird, pois não há motivo aparente para que as mensagens não sejam enviadas nem recebidas - esse tipo de problema normalmente se deve mais a erro na escolha do protocolo de correio eletrônico ou declaração incorreta do login ou senha do usuário, do que a erros recorrentes. Senão, vejamos: Ao iniciar a configuração do Thunderbird (tela Configurar conta), clique em Conta de email e em seguida em Avançar. Na tela seguinte (Identidade), vá até Endereço de email e digite o nome de sua conta. Em alguns serviços gratuitos de email, como o BOL, basta digitar o nome da conta. Na conta pedro@bol.com. br, por exemplo, deve-se digitar apenas Pedro. Em alguns outros serviços, como o Yahoo, deve-se digitar todo o endereço de email, incluindo o nome do domínio. Por exemplo, o email tadeu@yahoo. com.br deve ser declarado exatamente dessa maneira. Clique em Avançar. Na tela Informações do Servidor, há outro detalhe importante: para a maioria dos serviços de correio eletrônico, o padrão é o formato POP (Post Office Protocol); em alguns casos, no entanto, o formato é o IMAP (Internet Message Access Protocol). A principal diferença entre ambos é que o POP baixa as mensagens para a caixa de emails local (no disco rígido do usuário), ao contrário do IMAP, que permite o acesso remoto à caixa de emails do servidor, sem baixar as mensagens.
Se você utiliza o protocolo POP, vá à linha Receber mensagens por este servidor e digite o endereço do servidor. Na maioria dos serviços, o padrão POP utilizado é pop3.nome_do_provedor. com. Alguns servidores POP, no entanto, utilizam o padrão pop. nome_do_provedor_com. Alguns outros, como é o caso do Yahoo, utilizam mail em seus endereços como, por exemplo, em pop. mail.yahoo.com.br. Se o serviço utilizado é acessado via IMAP utilize, na linha Receber mensagens por este servidor, o padrão de endereço mailbox.nome_do_servidor.com. Para o envio correto das mensagens, vá à linha Enviar mensagens por este servidor SMTP e utilize o padrão smtp.nome_do_servidor.com. O Yahoo novamente é exceção, já que ele usa a forma smtp.mail.yahoo.com. Apesar de ser a principal fonte de erros no Thunderbird, ela não é a única: o cliente pode estar configurado para trabalhar em modo off-line, situação em que ele não faz a requisição das mensagens armazenadas no servidor. Para resolver esse problema, acesse o menu Arquivo | Modo Offline, e retire a seleção da caixa Entrar no modo off-line. Se, apesar de todo esse troubleshooting, seu Thunderbird continua se recusando a funcionar, o KMail é sim uma boa opção. Você pode realizar a instalação via YaST no Suse, utilizando seus CDs ou DVD da distribuição - como o Suse em modo gráfico depende em grande parte do KDE, a integração é extremamente simples. Se você preferir uma versão atualizada do KMail, no entanto, deve baixar os pacotes kdepim no repositório KDE de sua preferência. No caso do Suse 10.1, os pacotes podem ser baixados, só para exemplificar, no servidor oficial http://software.opensuse.org/download/repositories/ KDE:/KDE3/SUSE_Linux_10.1/i586_ . ■ Tadeu Carmona Editor-chefe Linux Magazine
http://supertuxbr.blogspot.com 8
http://www.linuxmagazine.com.br
Análise de acesso a servidores Web
COLUNA
Augusto Campos São 2 da manhã. Você sabe o que o seu website está fazendo?
U
m aspecto muito importante, embora às vezes um determinado navegador, tamanho da tela do usuário, negligenciado, da manutenção de servidores Web percentual de navegadores de seus usuários com suporte – seja na Internet, em uma Intranet ou no seu a Java, Flash e PDF. Alguns destes cálculos, entretanto, pequeno servidor doméstico – é a análise dos logs. É im- exigem configurações específicas – que constam na dopressionante quanta informação útil e interessante pode cumentação do sistema. ser obtida a partir dos registros de acesso, tanto no que Como você pode ver, uma boa ferramenta de análise diz respeito a análises de tráfego e segurança, quanto em de logs dá ao webmaster e ao webdesigner informações importantíssimas para melhor desenvolver e direcionar seus aspectos relacionados ao conteúdo. A partir dos logs você pode descobrir o que seus novos serviços e conteúdo. Entretanto, felizmente o AWStats não usuários estavam procurando em é a única opção; há diverpáginas de busca quando chegaram sas outras alternativas em ao seu site, ou que links de outros software livre. Investigue sites eles seguiram para chegar ao o popular (mas pouco seu. Você pode descobrir quais atualizado) webalizer [2], as suas páginas mais populares, o seu irmão mais novo com que navegadores e sistemas webalizer xtended [3] e operacionais o seu site é acessado, o veteraníssimo analog e cruzar todas essas informações [4], que completou 10 anos em 2005. entre si, com os dias da semana, Se você prefere uma com os diversos horários ou com solução rápida e não se preocupa com o fato de informações muitos outros dados ao seu alcance. Claro que é possível, para um administrador de sistemas sobre o tráfego de seu site ficarem na posse de outras empreexperiente, desenvolver sua própria ferramenta de análise sas, uma alternativa adicional é o Google Analytics [5], que personalizada, usando linguagens e ferramentas comuns exibe praticamente todas as informações relevantes sobre o para manipulação de texto estruturado (como AWK ou tráfego do seu site a partir de uma configuração especial (e Perl). Mas é muito mais fácil e rápido adotar uma das simples) em seu conteúdo. Para aplicações pessoais, pode muitas soluções prontas para essa finalidade, disponíveis ser uma alternativa interessante, mas para uso corporativo as desvantagens superam a vantagem da praticidade. como software livre. A minha ferramenta livre preferida para análise de logs Não fique no escuro, sempre saiba o que o seu servidor do Apache é o AWStats [1], capaz de gerar estatísticas e Web fez na madrugada passada ;-). ■ gráficos bastante avançados de servidores Web, FTP, streaming e e-mail. Operando a partir do próprio servidor Web (como um script CGI) ou diretamente a partir da linha de Mais Informações comando, ele tem recursos bastante interessantes, incluindo o armazenamento de dados históricos para facilitar o [1] http://awstats.sourceforge.net/ processamento freqüente de arquivos volumosos, suporte a [2] http://www.mrunix.net/webalizer/ servidores virtuais, suporte ao nosso idioma e possibilidade de rodar sem uso de bibliotecas Perl raramente instaladas [3] http://www.patrickfrei.ch/webalizer por default em servidores. [4] http://www.analog.cx/ Além das informações mais básicas, como número de páginas exibidas e número de visitantes únicos, o AWStats [5] http://www.google.com/analytics/ também calcula e exibe vários dados derivados ou cumulativos, como o tempo médio de duração das visitas ao seu site, análise por horário e dia da semana, análise por O autor domínio, país e localização geográfica (GeoIP) do usuário, páginas mais acessadas, quais as páginas pelas quais Augusto César Campos é administraos usuários entram ou saem mais freqüentemente do seu dor de TI e, desde 1996, mantém o site site e visitas de robôs, indexadores e worms. Também é BR-linux.org, que cobre a cena do Software Livre no Brasil e no mundo. possível identificar pesquisas usadas em sites de busca para localizar seu site, inclusão de seu site nos favoritos de
Uma boa ferramenta de análise de logs dá ao webmaster informações importantíssimas.
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
9
Túneis nas praias holandesas
COLUNA
Charly Kühnast Qual a relação entre as férias de duas semanas do Charly na Holanda e uma sessão SSH? A princípio, nenhuma. Eis uma fábula. Charly Kühnast
O
s alemães da região do Baixo Reno têm uma atitude ambivalente em relação a seus vizinhos holandeses do outro lado da fronteira. Mas eu gosto dos holandeses; até tive uma namorada holandesa uma vez, de Zwolle. E como tinham me garantido que a Holanda tem uma boa oferta de hotspots de Internet, decidi ir para a província da Holanda do Norte. Infelizmente, não havia holandeses lá – todos tinham ido assistir à Copa do Mundo na Alemanha. Pelo menos, isso me salvou da vergonha de tentar falar holandês. O acesso à Internet estava disponível, mas não em nossa casa de veraneio, e sim num pequeno café a uma certa distância.
É verdade que existem maneiras de transmitir dados através de túneis nesse tipo de rede, mas isso não seria justo.
Figura 1:
O hotspot Wi-Fi prometia acesso a quem quisesse pagar seu preço indecente. É verdade que existem maneiras de transmitir dados através de túneis nesse tipo de rede, mas isso não seria justo, então eu acabei pagando. Infelizmente, o operador do hotspot (que já deve estar incrivelmente rico) tinha uma idéia diferente da minha sobre o termo “conexão à Internet”. Eu conseguiria sobreviver com o proxy obrigatório, mas praticamente tudo que não fosse HTTP(S), POP e IMAP era filtrado. Eu uso o Mutt para acessar algumas caixas de mensagem críticas que rodam sob o screen no meu servidor doO Weird Mind no meu servidor doméstico me ajudou méstico. Sem SSH, é a fazer um túnel através da rede restritiva nas férias. impossível.
Por sorte, eu instalei no meu servidor web há algum tempo uma ferramenta que roteia SSH através de HTTP. Existem várias opções (você pode ver uma lista antiqüíssima - mas ainda utilizável - delas em [1] para mais detalhes). Mas resumindo, meu servidor roda o Weird Mind [2], uma ferramenta fácil de instalar e disposta a servir, mas que só usa SSH 1.
Apache em casa
Após descompactar o tarball, copiei os arquivos weirdmind. html, weirdmind.jar e props para um diretório acessível pelo Apache. Tive que alterar algumas configurações em weirdmind.html, começando pelo servidor ao qual o Weird Mind se conecta. Também tive que especificar o caminho até o arquivo props: <param name=”server” value=”127.0.0.1”> <param name=”properties_url” ➥ value=”http://127.0.0.1/weirdmind/props”>
Na realidade, props é o arquivo de configuração do cliente SSH, que é escrito em Java. As configurações estão bem comentadas, e os padrões são decentes para brincar com o SSH. Porém, é importante que o daemon SSH suporte a autenticação por senha no sshd_config: PasswordAuthentication yes
De volta à Holanda, eu simplesmente usei o navegador para acessar a página weirdmind.html no meu servidor de casa, e não havia mais nada para me impedir de ir fazer castelos de areia na praia. É claro que ninguém me obrigou a carregar 20 quilos de hardware para a Holanda, mas o pensamento de ficar duas semanas sem nada além do sol e das praias era demais para mim! ■
Mais Informações [1] Ferramentas remotas: http://anyterm.org/compared.html [2] Weird Mind: http://www.tam.cornell.edu/
O autor Charly Kühnast é administrador de sistemas Unix no datacenter Moers, perto do famoso rio Reno, na Alemanha. Lá ele cuida, principalmente, dos firewalls.
http://supertuxbr.blogspot.com 10
http://www.linuxmagazine.com.br
Transforme o poder do MultiCore em aplicativos de alto-desempenho. Tenha seus aplicativos preparados para o processamento paralelo e escalável. Faça certo na primeira vez: Intel® Threading Analysis Tools Localiza os problemas de threadings latentes com visualização em tempo real. Compiladores Intel C++ e Fortran Aumenta o desempenho sem mudar o ambiente de desenvolvimento Analisadores de Desempenho Intel VTune™ Identifica de forma bastante rápida gargalos de desempenho nos aplicativos Intel Integrated Performance Primitives Acesse bibliotecas de rotinas multimídia otimizadas para múltiplas plataformas Intel Math Kernel Library Aumenta o desempenho de aplicativos através do uso de rotinas otimizadas como BLAS, FFT, LAPACK, incluindo suporte a MPI
“As ferramentas de threading da Intel tem acelerado nosso ciclo de desenvolvimento imensamente”. Dana Batalli Diretora de Desenvolvimento do RenderMan Pixar
Itautec 0800 121444 www.itautec.com.br/intel Katalogo 0800 7729897 www.katalogo.com.br/intel MStech (11) 5080-3838 www.mstech.com.br/intel Strattus (11) 3531-6550 www.strattus.com.br/intel Tech Digital (11) 5181-1852 www.techdigital.com.br/intel
http://supertuxbr.blogspot.com © 2006 Intel Corporation, Intel, the Intel logo, Pentium, Itanium, Intel Xeon and VTune are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries. *Other names and brands maybe claimed as the property of others.
Pergunte ao Klaus!
COLUNA
Klaus Knopper Esta coluna é baseada na seção “Ask Klaus!”, publicada na Linux Magazine International.
✎ Procurando drivers
Você poderia me explicar como o Knoppix descobre quais drivers usar para um item específico do hardware? Eu costumava ter visões de uma grande tabela de banco de dados no ciberespaço que listava os drivers necessários para cada peça de hardware. Só nos meus sonhos! Sondar componentes pode extrair o nome do fabricante e qualquer outro dado que o fabricante tenha incluído, mas como você determina o que é necessário para fazer o componente funcionar? Você acha que chegará o dia quando qualquer PC funcionará facilmente com impressoras e scanners em qualquer distribuição de Linux? Resposta O arquivo que você procura é /usr/share/misc/pci.ids (e veja também http://pciids. sf.net/). A maioria dos componentes de hardware têm IDs de fabricante e produto gravados como números hexadecimais. Digite:
carrega os módulos listados lá. Mas isso só é feito em casos especiais que não possuem um mapeamento ou são detectados de forma errada por outras ferramentas. O daemon Udev, que é o plug play moderno da detecção de hardware do Linux, utiliza um recurso que foi embutido no kernel, ou melhor, em cada módulo individual, há algumas versões. Simplesmente execute: modinfo ipw2100
Caso você não tenha esse módulo, escolha outro. Além de algumas informações talvez úteis sobre os parâmetros, licença e autores do módulo, esse comando também mostra uma lista de aliases PCI para o módulo, isso é, quais dispositivos devem ser vinculados a ele. Toda vez que o Udev varrer o sistema e detectar um hardware que não tenha sido ativado antes, ele procurará na lista de módulos algum que coincida com os IDs de fabricante e produto, e carregará o módulo contendo o “melhor casamento” para o dispositivo. Parece bom? Infelizmente, o driver perfeito nem sempre vence a corrida do Udev para decidir qual módulo carregar para um componente específico. Às vezes, o Udev carrega um módulo que alega conhecer um dispositivo que, na realidade, não conhece. Às vezes existem módulos concorrentes para o mesmo dispositivo. Atualmente, lspci -n estamos investigando como lidar com esses casos para placas de rede sem fio no Knoppix, pois elas também são Ou, para uma saída mais explicativa: gerenciadas pelo Udev. Ocasionalmente, quando só temos umas poucas eslspci -v colhas, como com controladores USB, a melhor forma parece ser simplesmente carregar todos os módulos, um Isso também vale para dispositivos que não sejam re- por um, e deixar que aqueles que não batem falhem sialmente PCI. lenciosamente. No Knoppix, você pode olhar no script Em kernels mais antigos, o kernel tinha sua própria /linuxrc essa detecção de erro clara e simples, baseada forma de pci.ids, com os nomes de produtos incluídos em tentativa-e-erro, caso nenhum sistema sofisticado em seu código. Como existem MUITOS componentes de procura de hardware ou carregamento de módulos de hardware agora, essa solução tornou-se um enorme esteja disponível. ■ desperdício de espaço, então um novo esquema foi implementado para manter a tabela legível (por pessoas) fora do kernel. Nele, os IDs de fabricante e produto são lidos O autor do barramento do sistema. Agora, para a detecção do hardware, ainda precisamos Klaus Knopper é o criador do Knopde um mapeamento entre as IDs PCI e o nome do mópix e co-fundador do evento Linuxdulo do kernel a ser carregado pelo modprobe. O hwsetup do Tag. Atualmente ele trabalha como professor, programador e consultor. Knoppix usa uma tabela pci.ids de texto modificada para buscar nomes de módulos nas IDs PCI, e simplesmente
Infelizmente, o driver perfeito nem sempre vence a corrida do Udev para decidir qual módulo carregar para um componente específico.
http://supertuxbr.blogspot.com 12
http://www.linuxmagazine.com.br
Oracle Grid
Todos os seus bancos de dados
Em GRID Sem desperdício de capacidade Sem desperdício de dinheiro Sem ponto único de falha
Oracle Grid É rápido... é barato... E está sempre disponível
oracle.com/grid ou ligue para 0800.901.985 Obs.: “Sempre disponível” indica que, se um servidor cair, seus aplicativos continuam rodando.
http://supertuxbr.blogspot.com Copyright © 2005, Oracle. Todos os direitos reservados. Oracle é uma marca registrada da Oracle Corporation e/ou de suas afi liadas. Outros nomes podem ser marca registrada de seus respectivos proprietários.
Crônicas do kernel
COLUNA
Zack Brown Esta coluna é baseada na seção “Zack’s Kernel News”, publicada na Linux Magazine International, e sintetiza o intenso tráfego da lista de discussão do kernel.
N
o debate sobre o Reiser4, cada lado acha que o seu próprio projeto concorrente, o uswsusp, de onde Nigel outro tem motivos políticos. Hans Reiser reclama originalmente fez o fork para criar o Suspend2. que os desenvolvedores do kernel não gostam dele, Como mantenedor do software suspend, Pavel tem e por isso recusam-se a incluir o Reiser4, enquanto já têm forte poder de veto sobre qualquer código nessa área. E planos de incluir até o ext4, que ainda nem saiu do papel. ninguém pode culpá-lo por se sentir mal com o fork proEle diz que os desenvolvedores do kernel têm talento em movido por Nigel, seguido de (alguns dizem) um trabalho afastar bons programadores para outros sistemas operacio- melhor que o de Pavel. nais, ao invés de recebê-los calorosamente. Ainda assim, parece que o Suspend2 vem ganhando Do outro lado, os desenvolvedores do kernel alegam muitos seguidores, e sua ausência da árvore -mm está coque o código do Reiser4 tem problemas técnicos que meçando a chamar a atenção, dado seu bom funcionao impedem de intera- mento e a quantidade de pessoas que o adoram. gir direito com o resto do kernel. Dizem que s desenvolvedores do Reiser responde aos argumentos técnicos com Andrew Morton foi oficialmente nomeado mantenedor “linguagem de marke- do sistema de gerenciamento de memória há alguns kernel alegam que o ting”, ataques pessoais anos, mas nunca foi listado no arquivo MAINTAINERS. Stee acusações e, por isso, ven Rostedt inadvertidamente adicionou a entrada com código do Reiser4 tem aqueles que estariam Christoph Lameter como provável candidato. Depois, exem posição de ajudar o plicaram a Steven que essa não é a forma como as coisas problemas técnicos Reiser4 a ser aceito recu- funcionam no Linux. sam-se a olhar qualquer Não há um mantenedor do sistema de gerenciamenque o impedem de código de Hans. to de memória listado explicitamente. Esse código é tão A falta de revisores sensível e interage com tantos outros subsistemas que interagir direito com para o código do Reiser4 não seria possível uma só pessoa vislumbrá-lo de todos os dificulta ainda mais sua ângulos possíveis. Por isso, atualmente, Linus, Andrew e o resto do kernel. inclusão no kernel. Tal- Hugh são os responsáveis. vez seja hora de Hans No final das contas, optou-se por listar o gerenciamendelegar a tarefa de interagir com os desenvolvedores do to de memória no arquivo MAINTAINERS, com as respectikernel para alguma outra pessoa de sua empresa, como vas listas de e-mails e websites, mas sem um mantenedor sugeriram os desenvolvedores do Linux, já que os funcio- específico. ■ nários de Hans conseguem ater-se aos pontos técnicos sem descambar para ataques pessoais.
O
Questão de mantenedor
Status da suspensão
Nigel Cunningham submeteu o Suspend2 para Andrew Morton para inclusão na árvore -mm, com o objetivo de incluí-la na árvore principal do kernel. Pavel Machek se opôs à inclusão durante muito tempo, pois trabalhava em
O autor A lista de discussão Linux-Kernel é o núcleo das atividades de desenvolvimento do Kernel. Zack Brown consegue se perder nesse oceano de mensagens e extrair significado! Sua newsletter Kernel Traffic já está completando 5 anos.
http://supertuxbr.blogspot.com 14
http://www.linuxmagazine.com.br
Gabarito
Hospedagem de Sites e Servidores
INTERNET PARA PROFISSIONAIS DE INTERNET
Monitoramento de Rede
Internet Data Center
Servidores de Alta Disponibilidade
4003-1001 www.plugin.com.br http://supertuxbr.blogspot.com
SEGURANÇA
➧ Múltiplas falhas no Mozilla Firefox O Mozilla Firefox é um navegador de código aberto. Especialistas descobriram algumas falhas de segurança no Firefox. A maioria dos problemas também se aplica ao cliente de emails e newsgroup Mozilla Thunderbird. Várias falhas foram encontradas na maneira como o Firefox processa certas ações de JavaScript. Uma página web contendo código malicioso poderia executar instruções JavaScript arbitrárias com as permissões do chrome, permitindo à página roubar informações sensíveis ou instalar programas mal intencionados no navegador.( CVE2006-2776 , CVE-2006-2784 , CVE-2006-2785 , CVE-2006-2787 , CVE-2006-3807, CVE-2006-3809, CVE-2006-3812) Várias falhas de negação de serviço foram encontradas na maneira como o Firefox processa certos conteúdos da Web. Uma página da Web contendo código malicioso poderia causar travamento do navegador ou possivelmente executar códigos arbitrários como o usuário ativo. (CVE-2006-2779, CVE-2006-2780, CVE-2006-3801, CVE-2006-3677, CVE-2006-3113, CVE-2006-3803, CVE-2006-3805, CVE-2006-3806, CVE-2006-3811) Uma falha do tipo XSS (cross-site scripting) foi encontrada na maneira como o Firefox processa Unicode ByteOrder-Mark (BOM) em páginas web em UTF-8. Uma pá-
gina da Web contendo código malicioso poderia executar um script no navegador, que um filtro de entrada da Web poderia deixar passar devido a uma marcação de “script” mal formada. (CVE-2006-2783) Várias falhas foram encontradas na maneira como o Firefox processa certas ações de JavaScript. Uma página da Web contendo código malicioso poderia conduzir a um ataque tipo XSS ou roubar informações importantes (como cookies de outros domínios). (CVE-2006-3802, CVE-2006-3810) Uma falha no formulário de envio de arquivo foi encontrada na maneira como o Firefox trata mudanças de objetos de entrada em JavaScript. Uma página da Web contendo código malicioso poderia transmitir um arquivo arbitrário local durante o envio do formulário sem a interação do usuário. ( CVE-2006-2782) Uma falha de negação de serviço foi encontrada na forma como o Firefox chama a função JavaScript crypto. signText(). Uma página da Web contendo código malicioso poderia travar o navegador se a vítima estivesse com um certificado cliente carregado. (CVE-2006-2778) Duas falhas de resposta do tipo HTTP smuggling foram encontradas na forma como o Firefox processa certos cabe-
Postura das principais distribuições Linux quanto à segurança Distribuição
Referência de Segurança
Comentários
Conectiva
Info: distro2.conectiva.com.br/ Lista: seguranca-admin@distro.conectiva.com.br e distro2.conectiva.com.br/lista Referência: CLSA-... 1
Possui uma página específica; não há link para ela na página principal. Os alertas são sobre segurança, mas distribuídos através de emails assinados com a chave PGP da empresa para assegurar sua autenticidade. Contém também links para os pacotes atualizados e para fontes de referência sobre o problema sendo corrigido.
Debian
Info: www.debian.org/security Lista: lists.debian.org/debian-security-announce Referência: DSA-… 1
Alertas de segurança recentes são colocados na homepage e distribuídos como arquivos HTML com links para os patches. O anúncio também contém uma referência à lista de discussão.
Gentoo
Info: www.gentoo.org/security/en/gsla/index.html Fórum: forums.gentoo.org Lista: www.gentoo.org/main/en/lists.xml Referência: GLSA: … 1
Os alertas de segurança são listados no site de segurança da distribuição, com link na homepage. São distribuídos como páginas HTML e mostram os comandos necessários para baixar versões corrigidas dos softwares afetados.
Mandriva
A Mandriva tem seu próprio site sobre segurança. Entre outras Info: www.mandriva.com/security Lista: www1.mandrdrivalinux.com/en/flists.php3#2security coisas, inclui alertas e referência a listas de discussão. Os alertas são arquivos HTML, mas não há links para os patches. Referência: MDKSA-… 1
Red Hat
Info: www.redhat.com/errata Lista: www.redhat.com/mailing-lists Referência: RHSA-… 1
A Red Hat classifica os alertas de segurança como “Erratas”. Problemas com cada versão do Red Hat Linux são agrupados. Os alertas são distribuídos na forma de páginas HTML com links para os patches.
Slackware
Info: www.slackware.com/security Lista: www.slackware.com/lists (slackware-security) Referência: [slackware-security] … 1
A página principal contém links para os arquivos da lista de discussão sobre segurança. Nenhuma informação adicional sobre segurança no Slackware está disponível.
SUSE
Info: www.novell.com/linux/security Lista: www.novell.com/linux/download/updates Referência: suse-security-announce Referência: SUSE-SA … 1
Após mudanças no site, não há mais um link para a página sobre segurança, que contém informações sobre a lista de discussão e os alertas. Patches de segurança para cada versão do Suse são mostrados em vermelho na página de atualizações. Uma curta descrição da vulnerabilidade corrigida pelo patch é fornecida.
1 Todas as distribuições indicam, no assunto da mensagem, que o tema é segurança.
http://supertuxbr.blogspot.com 16
http://www.linuxmagazine.com.br
Segurança | NOTÍCIAS
çalhos inválidos de resposta HTTP. Uma página da Web mal intencionada poderia devolver cabeçalhos de resposta HTTP especialmente trabalhados que poderiam passar incólumes por restrições de um proxy HTTP. (CVE-2006-2786) Uma falha foi encontrada na maneira como o Firefox processa os scripts de auto-configuração de proxy. Um servidor proxy de auto-configuração mal intencionado poderia executar instruções JavaScript arbitrárias com a permissão do chrome, permitindo à página roubar informações sensíveis ou instalar software de conteúdo malicioso no navegador. (CVE-2006-3808)
➧ Samba
Uma chamada dupla da função free() foi encontrada na maneira como o método nsIX509::getRawDER era chamado. Se uma vítima visitasse um site cuidadosamente preparado, seria possível executar códigos arbitrários como o usuário atual do Firefox. ( CVE-2006-2788). ■ Referência no Debian: DSA-1120-1, DSA-1134-1 Referência no Gentoo: GLSA 200608-03, GLSA 200606-21 Referência no Red Hat: RHSA-2006:0610-4, RHSA-2006:0611-3 Referência no Slackware: SSA:2006-208-01 Referência no Suse: SUSE-SR:2006:018 Referência no Ubuntu: USN-296-2, USN-297-3, USN-327-1, USN-329-1
Suse: SUSE-SR:2006:017
a forma de uma mensagem de erro. Isso poderia permitir a um invasor realizar um ataque do tipo XSS (cross-site scripting), se a vítima fosse levada a se conectar com um site e enviasse o cabeçalho Expect manipulado. (CVE-2006-3918) Apesar de um navegador web não poder ser forçado por um terceiro (agressor) a enviar um cabeçalho Expect arbitrário, foi descoberto recentemente que certas versões do plugin Flash podem manipular cabeçalhos de requisição. Se usuários usando tais versões puderem ser persuadidos a carregar páginas da Web com applets Flash mal intencionados, um ataque por XSS poderia ser desferido. Mark Dowd descobriu um estouro de pilha no componente mod_rewrite do Apache. Em algumas situações, um agressor remoto poderia explorar isso para executar código arbitrário. (CVE-2006-3747). ■
Ubuntu: USN-314-1
Referência no Debian: DSA-1131-1
O Samba fornece serviços de compartilhamento de arquivos e impressoras para clientes SMB/CIFS. Uma falha de negação de serviço foi encontrada na maneira como o daemon smbd rastreia conexões ativas para compartilhamentos. Essa falha tornava possível que um invasor remoto fizesse o daemon smbd consumir uma grande quantidade de memória do sistema enviando solicitações smb cuidadosamente manipuladas. (CVE-2006-3403). ■ Debian: DSA-1110-1 Gentoo: GLSA 200607-10 Mandriva: MDKSA-2006:120 Red Hat: RHSA-2006:0591-6 Slackware: SSA:2006-195-01
Referência no Gentoo: GLSA 200608-01
➧ krb5
O Kerberos (krb5) é um sistema de autenticação que permite que clientes autentiquem uns aos outros através do método de criptografia simétrica e um terceiro elemento confiável, o KDC. Uma falha de segurança foi encontrada, com a qual aplicações compatíveis com o Kerberos falhariam ao verificar o resultado da chamada setuid(). No kernel Linux 2.6, a chamada setuid() pode falhar se certos limites de usuário forem alcançados. Um usuário local poderia manipular seu ambiente de forma que os aplicativos continuassem a rodar como root, potencialmente levando a uma escalada de privilégios. (CVE2006-3083). ■ Referência no Debian: DSA-1146-1 Referência no Gentoo: GLSA 200608-15 Referência no Mandriva: MDKSA-2006:139 Referência no Red Hat: RHSA-2006:0612-8
Referência no Mandriva: MDKSA-2006:133 Referência no Red Hat: RHSA-2006:0619-9 Referência no Slackware: SSA:2006-209-01 Referência no Suse: SUSE-SA:2006:043 Referência no Ubuntu: USN-328-1
➧ libtiff
O pacote libtiff contém uma biblioteca de funções para manipular arquivos TIFF (Tagged Image File Format). Tavis Ormandy, do Google, descobriu várias falhas na libtiff durante uma auditoria de segurança. Um invasor poderia criar um arquivo TIFF cuidadosamente trabalhado de maneira a tornar possível que uma aplicação ligada à libtiff travasse ou possivelmente executasse código arbitrário. (CVE-2006-3459, CVE-2006-3460, CVE-2006-3461, CVE-2006-3462, CVE-2006-3463, CVE-2006-3464, CVE-2006-3465). ■ Referência no Debian: DSA-1137-1
➧ Apache
O servidor HTTP Apache é um popular servidor web livre. Uma falha foi encontrada no Apache onde um cabeçalho Expect inválido enviado ao servidor retornava ao usuário sob
Referência no Gentoo: GLSA 200608-07 Referência no Mandriva: MDKSA-2006:137 Referência no Red Hat: RHSA-2006:0603-4 Referência no Suse: SUSE-SA:2006:044 Referência no Ubuntu: USN-330-1
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
17
NOTÍCIAS
➧ ATI nega driver aberto para Linux Enquanto a Intel recentemente liberava o código dos drivers para suas placas gráficas, a rival ATI afirmou que gosta de seus drivers proprietários. De acordo com a companhia, “otimizações proprietárias e patenteadas são parte do valor oferecido a nossos clientes, e não temos intenção de liberar o código desses drivers”. “Além disso,” afirmou a empresa, “elementos multimídia como a proteção de conteúdo não devem, por sua própria natureza, ter o código liberado”. Ainda é possível que haja mudanças nessa tendência, se a compra da ATI pela AMD se efetivar, mas a AMD ainda não se pronunciou sobre o assunto. ■
➧ Linux embarcado em aeronave militar
➧ Suporte à gravação em NTFS à vista
A Boeing, gigante da construção de aeronaves civis, contratou a Wind River Systems para desenvolver um sistema embarcado baseado em Linux. O software em questão equipará a aeronave marítima multi-missão P-8A da Marinha norte-americana, que na realidade consiste de um 737 alterado. O avião será usado em missões como a busca de submarinos, e o Linux não fará parte do sistema de controle. Porém, o sistema do pingüim controlará as tarefas computacionais e de vigilância. A Wind River é especialista na aplicação de Linux na esfera militar e aeroespacial, e recentemente doou 300 mil linhas de código à Eclipse Foundation, responsável pelo ambiente de desenvolvimento de mesmo nome. ■
Muito esforço vem sendo aplicado ao desenvolvimento e melhoria do suporte à gravação em sistemas de arquivos NTFS no Linux. A nova versão contém tantas melhorias que é chamada de NTFS-3G (terceira geração), e está em estágio pré-beta. Muitos usuários já baixaram as novas versões do aplicativo ntfsmount e da biblioteca libntfs, e até agora nenhum incidente foi relatado. Após muitos testes, a versão beta poderá ser considerada para inclusão no kernel do Linux, onde será de enorme utilidade para muitos usuários, tanto de Linux quanto de Windows®, pois será possível remover pelo sistema do pingüim aqueles vírus que infestaram o sistema das janelas na mesma máquina. ■
➧ Extremadura muda completamente para SL e ODF O Governo da Extremadura, na Espanha, finalmente migrará todas as suas estações de trabalho para o GNU/LinEx, distribuição Linux desenvolvida pelo próprio governo. Além do Linux, também será adotado o formato aberto para documentos ODF (Open Document Format), utilizado por padrão pelo OpenO-
ffice.org. A Extremadura já possui 80 mil estações de trabalho 100% livres, e portanto a decisão significará mais 15 mil máquinas. A Extremadura integra, juntamente com outras 30 administrações da Europa e da América Latina, a Rede Internacional de Administrações Públicas pelo Software Livre. ■
http://supertuxbr.blogspot.com 18
http://www.linuxmagazine.com.br
Geral | NOTÍCIAS
➧ Nova versão do driver de impressão Gutenprint O projeto Gutenprint, antes chamado de Gimp-Print, visa ao desenvolvimento de drivers de altíssima qualidade para impressoras no Linux, para uso com o CUPS, LPR, LPRng ou outros sistemas de impressão. Recentemente, foi lançada a versão 5.0, primeira versão pública estável do pacote, que acrescenta o suporte a muito mais dispositivos (atingindo a marca dos 700) do que a versão anterior, Gimp-Print 4.2. ■
➧ Windows Media no Linux
A Novell, fabricante do SUSE Linux, e a RealNetworks, que produz o Real Player, fecharam um acordo para distribuição do Real Player no SUSE Linux Enterprise Desktop 10, além do Helix Banshee Music Player, a partir de dezembro. Essa nova versão do Real Player para Linux conseguirá reproduzir arquivos MP3, Ogg Vorbis e Windows Media Audio e Video. As novas capacidades não ficarão restritas ao Real Player, e serão incluídas também no cliente de código aberto Helix DNA Player. Isso só foi viabilizado devido a uma vitória legal da RealNetworks contra a Microsoft, que obrigou a empresa de Redmond a pagar uma grande multa e prestar 18 meses de suporte à vencedora da ação. ■
Curtas Nova versão de testes do Fedora Core 6 A Fundação Fedora anunciou o lançamento do Fedora Core 6 teste 2, a mais recente versão de testes do sistema operacional que dá origem ao Red Hat Enterprise Linux. Entre as novidades, a que mais chama a atenção, visualmente, é a mudança da fonte padrão, da Bitstream Vera para a DejaVu. Disponível segundo beta do Mandriva 2007 Já é possível baixar gratuitamente a segunda versão beta (Odin) do Mandriva 2007. A principal novidade é a adoção do tema la Ora, em substituição ao antigo Galaxy. Qt agora funciona com Java A empresa Trolltech, desenvolvedora da biblioteca gráfica Qt, cujo principal expoente no Linux é o ambiente gráfico KDE, lançou o Jambi, ferramenta que permite o uso da Qt com programas feitos em Java. Isso permitirá que, no futuro, quando a tecnologia estiver bem sedimentada, programas em Java possuam visual e comportamento nativos do sistema operacional onde estiverem rodando, seja ele Linux, Mac OS ou Windows®. Flash Player 9 para Linux Emmy Huang, gerente de produtos da Adobe, disse em seu blog que ainda esse ano deve ser lançada uma versão beta do Flash Player 9 para Linux. As discussões atuais giram em torno dos componentes do sistema que o novo Flash Player usará. Cliente BitTorrent recebe capital de risco A BV Capital, uma empresa de capital de risco, investiu uma quantia não revelada no desenvolvimento do cliente BitTorrent Azureus. Com a implementação de uma camada de conteúdo no cliente p2p, associada à crescente demanda por vídeos de alta qualidade e resolução na Internet, o Azureus teve o potencial reconhecido para tornar-se um importantíssimo personagem na vida dos internautas no futuro.
➧ Apple e o código aberto
Recentemente a Apple anunciou o fim do projeto Open Darwin, no que parecia o término do relacionamento já morno da fabricante do Mac OS com a comunidade do código aberto. Pouco tempo depois, no entanto, após intensas demonstrações de desaprovação por parte da comunidade de desenvolvedores e usuários da Apple (mas não necessariamente por causa disso), a empresa anunciou a criação do Mac OS Forge, um site comunitário hospedado e patrocinado pela companhia. Os projetos hospedados, dessa vez, não serão mais limitados ao kernel, abrangendo também o iCal Calendar Server, que será parte do Leopard Server; o Bonjour Service Discovery, o Launchd, o kernel XNU do Mac OS X e o Apple Web Kit. As maiores novidades nesse sentido são a adoção da licença Apache pelo Calendar Server (no lugar da mais restritiva Apple Public Source License, ou APSL) e a inclusão dos fontes do kernel para arquitetura Intel, com promessas de atualização num ritmo igual ao mostrado para a arquitetura PowerPC, que era uma das reclamações dos usuários com relação ao Open Darwin. ■
SGI bate recorde com Linux A Silicon Graphics bateu um novo recorde de largura de banda de memória, auxiliada pelo Linux. O novo recorde foi atingido com o benchmark STREAM Triad, desenvolvido pela University of Virginia, que se destina a testar justamente esse componente em sistemas que lidem com dados muito maiores que o cache disponível. O sistema de teste era um Altix 4700, impulsionado por 1024 processadores Itanium e 4 TB de memória, e rodando o SUSE Linux Enterprise Server 10, o que o classifica como o maior sistema de imagem única alcançável com o Linux. 200 milhões de downloads do Firefox Onze meses e onze dias após o lançamento da versão 1.0, o navegador Firefox alcançou a marca de 100 milhões de cópias baixadas. Em apenas mais nove meses e onze dias, esse número dobrou, atingindo 200 milhões de downloads, de acordo com o site Spread Firefox. Linux nos thin clients dos novos telecentros A Prefeitura Municipal da cidade de São Paulo adquiriu 600 thin clients da fabricante brasileira Tecnoworld para equipar os novos telecentros. As novas máquinas serão utilizadas para promover a inclusão digital da população desfavorecida da capital paulista.
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
19
CORPORATE
➧ Drogaria Onofre adota o Linux
Com o objetivo de aumentar a eficiência e reduzir os custos, a Drogaria Onofre, atuante nas cidades de São Paulo e Rio de Janeiro há mais de 70 anos, encerrou a primeira etapa de seu plano de migração para Linux. Ao final, a empreitada demandará um investimento da ordem de R$ 3 milhões de reais. Até agora, foram investidos R$ 220 mil em aquisição de novo hardware, instalação e treinamento
dos funcionários. Embora o ambiente tenda a permanecer misto, com máquinas Linux e Windows®, a operação do Linux nos pontos-de-venda de 30 lojas já garante maior estabilidade e velocidade no processamento das transações, além de ter reduzido em 70% o número de problemas de queda no sistema. No campo das licenças e da manutenção, a economia já é de 35%. ■
➧ Microsoft Vista sairá quando estiver pronto
➧ Alta disponibilidade na Rolls-Royce
Após vários adiamentos na data de lançamento da próxima versão de seu sistema operacional, a Microsoft disse que o Vista será lançado quando estiver pronto. O último adiamento para janeiro de 2007, após grandes esforços da empresa para manter a data ainda no ano de 2006, novamente já é coisa do passado. Steve Ballmer, CEO da Microsoft, deixou escapar o possível atraso ao informar que a empresa está se esforçando ao máximo para lançar um produto de altíssima qualidade, assim que ficar pronto. Os analistas do instituto Gartner prevêem que o sistema não sairá antes do segundo trimestre de 2007. ■
A Rolls-Royce Brasil realiza manutenção e revisão em turbinas de aviação e geração de energia, e implementou recentemente um sistema de alta disponibilidade. A solução foi viabilizada pelo Red Hat Enterprise Linux, com a combinação do Red Hat Cluster Suite com o Red Hat GFS (Global File System). “A migração para Linux resolveu os problemas de estabilidade e capacidade de processamento que tínhamos no ambiente anterior. Em 2005, a área de TI identificou a necessidade de uma infra-estrutura de alta disponibilidade. Por isso, montamos uma estrutura com servidores em cluster, com os dados armazenados em dispositivos externos”, afirmou o gerente de operações de outsourcing da empresa. O hardware empregado na solução consiste de dois servidores HP Proliant DL380 biprocessados, com o segundo entrando em ação somente em caso de falha do primeiro. O sistema de ERP da empresa roda sobre a super-máquina, tirando proveito de sua maior estabilidade, segurança e performance, comparados à solução anterior. Boa parte dos avanços atingidos com o novo sistema são decorrentes do uso do GFS, um sistema de arquivos distribuído e de alto desempenho, que oferece grande segurança aos dados. Antes da implementação do Linux, a reindexação dos bancos de dados demorava 12 horas, passando para 45 minutos após a migração para Linux, e para incríveis 15 minutos com a adoção do GFS. ■
Curtas Site nacional da Mandriva Conectiva está no ar Os clientes brasileiros da Mandriva Conectiva não dependem mais do antigo site da Conectiva, em www.conectiva.com.br. O novo site voltado aos clientes nacionais da empresa já está no ar, no endereço www.mandriva.com.br, com informações atualizadas sobre seus produtos e serviços. Para informações internacionais em português, pode-se continuar utilizando o endereço www.mandriva.com. Sugestões e comentários sobre a nova página podem ser enviados a sac@mandriva.com. Linux para viajar A Amadeus, fornecedora de soluções de TI para o mercado de viagens e turismo, anunciou um crescimento de 12,7% em seu faturamento no primeiro semestre de 2006, resultado de seu aumento no market share. O presidente e CEO da empresa afirmou que o crescimento é resultado do investimento contínuo em tecnologia, especialmente na transição para sistemas abertos baseados em Linux e Unix. Seminários sobre Linux embarcado A Mandriva Conectiva e a Freescale, parceiras no desenvolvimento de dispositivos eletrônicos com Linux embarcado, anunciaram a realização, nas próximas semanas, de seminários sobre Linux embarcado em São Paulo e Campinas. Os seminários abordarão o uso do Linux nas plataformas Coldfire e i.MX, ambas da Freescale, e são direcionados a parceiros e clientes da Freescale. Os seminários acontecerão nos dias 23, em São Paulo, e 30, em Campinas.
http://supertuxbr.blogspot.com 20
http://www.linuxmagazine.com.br
Notícias | CORPORATE
➧ Banco de Brasília aumenta eficiência com Linux O Banco de Brasília (BRB) acaba de modernizar seu ambiente de TI com 18 novas máquinas, sendo dois mainframes e 16 servidores, dos quais dois rodam Linux. A solução visa a reduzir o custo total de propriedade (CTO) e adequar os gastos com o gerenciamento das informações às necessidades do banco. Nas palavras do diretor de recursos administrativos e tecnológicos, “a implantação do ILM no BRB atenderá as necessidades de definição de uma política de armazenamento e acesso mais ágil e econômica para os dados corporativos do banco”. ■
➧ PalmSource perde licença da Palm A PalmSource, recentemente separada da Palm, e responsável pelo sistema operacional utilizado em seus handhelds, perdeu o prazo para cumprir certas obrigações do contrato de fornecimento do sistema para a fabricante dos handhelds. Combinado com o fato de que a Palm vem desenvolvendo um sistema operacional baseado em Linux, o Access Linux Platform, o futuro parece apontar para uma solução de código aberto para os PDAs mais famosos do mundo. ■
➧ Intel apresenta seus melhores processadores A Intel lançou finalmente sua nova arquitetura de processadores, denominada Core 2 Duo. Fortemente baseada na arquitetura anterior, voltada ao processamento pessoal (isso é, notebooks e desktops), a nova arquitetura mantém os pontos fortes e tendências da Core, com seu alto nível de paralelismo em nível de instrução (ILP, na sigla em inglês) e baixo consumo de energia. Além disso, finalmente, após um longo intervalo, todas as linhas de processadores x86 da empresa utilizam novamente uma mesma arquitetura. Uma importante novidade do Core 2 Duo é o suporte total a EM64T, versão da Intel para a arquitetura x86 de 64 bits desenvolvida pela concorrente AMD. A linha voltada aos servidores oferece agora suporte à tecnologia de virtualização da Intel, o que, aliado ao núcleo duplo presente em todos os produtos da nova linha, permite um ótimo desempenho na execução de múltiplos sistemas operacionais. ■
Curtas Microsoft Office para Linux é inevitável De acordo com Stuart Cohen, diretor executivo do Open Source Development Labs (OSDL), a Microsoft deverá lançar uma versão para Linux do seu conjunto de aplicativos para escritório. Devido à crescente popularidade do OpenOffice.org, bem como da presença do Linux no ambiente corporativo, a Microsoft será forçada a lançar uma versão do Office para o sistema do pingüim. No entanto, Cohen não acredita na abertura do código dessa versão. Atualmente, já é possível rodar o Microsoft Office no Linux, para isso é necessário entretanto lançar mão da replicação da API do Windows® oferecida pelo projeto Wine – ou pelo sistema comercial baseado nele, o CrossOver Office, da empresa CodeWeavers. União pela telefonia móvel baseada em Linux Duas das principais agremiações de apoio ao Linux como plataforma para telefonia móvel estão intensificando sua cooperação. A Mobile Linux Initiative (MLI), dos Open Source Development Labs (OSDL), e o Linux Phone Standards Forum (LIPS), trabalharão a partir de agora oficialmente contra a fragmentação das iniciativas na área de telefonia móvel utilizando o sistema de código aberto criado por Linus Torvalds. Atualmente há diversas iniciativas tentando criar padrões abertos para a plataforma. Os esforços da MLI e do LPIS devem ser complementares: enquanto a primeira irá se concentrar no desenvolvimento da plataforma móvel em nível do Kernel do sistema, o segundo trabalhará preferencialmente na definição de APIs (interfaces de programação) para aplicativos, bem como para definir os serviços disponibilizados pelo sistema. Debian com suporte HP Além da Red Hat, Suse e uma série de outras distribuições Linux comerciais, a Hewlett-Packard deverá fornecer suporte ativo à distribuição Debian GNU/Linux. A partir de agora, os servidores Proliant e os sistemas Blade da empresa poderão vir equipados com Debian, para o qual a empresa passa a oferecer manutenção e serviços extensivos. A empresa já dispõe até de uma solução thin client, o HP t5725, baseada no Debian GNU/Linux, que pode ser utilizada, por exemplo, como terminal de consultas.
➧ Compromisso da Motorola com Linux A Motorola reafirmou seu compromisso de continuar com a adoção do Linux em suas linhas de telefones celulares. A empresa tem como objetivo desenvolver grande número de programas para seus aparelhos. Além disso, pretende suprir as demandas de alguns mercados que atualmente utilizam Windows Mobile ou Symbian OS, mantendo-se fiel à idéia do código aberto. O segundo maior fabricante de celulares do mundo diz que pretende tirar proveito da enorme base de desenvolvedores oferecida pelo sistema operacional do pingüim. “A adoção do Linux permite à Motorola ter acesso a uma equipe global de desenvolvimento, que trabalha com hardware de outros fabricantes”, disse Mark Vandenbrink, executivo da empresa, durante a LinuxWorld Conference & Expo em São Fransisco. Diferentemente das plataformas proprietárias, com o Linux não é necessário ficar aguardando por atualizações do sistema operacional. Isso é uma grande vantagem para empresas que atuam no concorrido mercado de telefonia móvel. Além disso a utilização do Linux é parte da estratégia geral de desenvolvimento da Motorola, que deve também embarcar o Linux em seus decodificadores de TV Digital (Settop Boxes). ■
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
21
CORPORATE Nova unidade em Recife do
Instituto Nokia de Tecnologia Novo centro de pesquisas especializado em Software Livre desenvolverá aplicações móveis e multimídia. por Rafael Peregrino da Silva
O
Instituto Nokia de Tecnologia (INdT) inaugurou no dia 27 de julho de 2006, em Recife, PE, sua terceira unidade no Brasil. As atividades do novo centro de pesquisas são voltadas especialmente para o desenvolvimento de aplicações multimídia e para dispositivos móveis baseados em Software Livre, utilizando como ambiente de desenvolvimento a plataforma Maemo [1], de autoria do próprio INdT. Participaram da cerimônia de inauguração do Instituto o governador de Pernambuco, Mendonça Filho, e seu secretário estadual de Planejamento, Cláudio Marinho, que conheceram as instalações da
Figura 1
Da esquerda para a direita: Aldenor Martins (Gerente Técnico do INdT), Jarmo Järvenpää (Diretor de Tecnologia da Nokia), Sandro Alves (Gerente de Negócios do INdT) e Geraldo Feitoza (DiretorPresidente do INdT).
nova unidade do INdT e deram as boasvindas à equipe da instituição. As áreas de aplicação dos projetos desenvolvidos pelo instituto compreenderão especialmente as tecnologias para TV digital, entretenimento, Voz sobre IP (VoIP) e tecnologias de rádio, como Bluetooth e Wi-Fi. Para isso, a nova unidade deverá explorar suas competências técnicas, que vão desde a programação de sistemas DSP (Digital Signal Processor – microprocessadores especializados em processar sinais de áudio e vídeo) até o desenvolvimento de interfaces gráficas. Durante a inauguração, a equipe de desenvolvimento de sistemas do INdT aproveitou a oportunidade para mostrar o dispositivo móvel Nokia 770 Internet Tablet em funcionamento. Baseado na arquitetura ARM, o equipamento dispõe de interfaces Bluetooth e Wi-Fi, reconhecimento de escrita, navegador de Internet, aplicativos para escritório (AbiWord e Gnumeric), compartilhamento de música, além de um cliente VoIP baseado no framework Tapioca, também desenvolvido pelo próprio INdT. O navegador de Internet, baseado no projeto ManaOS, também de autoria do IndT, dispõe até mesmo de um plugin Flash embarcado, compilado especialmente para a plataforma pela Adobe, bem como um visualizador de PDFs integrado.
Todo esse aparato tecnológico é acondicionado em um dispositivo pouco maior que um celular, com uma tela de 800 x 600 pixels com até 65 mil cores. Ainda não disponível no Brasil, o dispositivo deve chegar ao mercado nacional no ano que vem. Ao contrário de outros fabricantes de celular, que terceirizaram o fornecimento da plataforma Linux de desenvolvimento para seus aparelhos, a Nokia, através das atividades do INdT de Recife, pretende dominar diretamente as tecnologias de código aberto. Jarmo Järvenpäa, Diretor de Tecnologia da Nokia presente na inauguração, informou que a empresa pretende adotar o Linux como plataforma apenas para dispositivos móveis como o 770. A utilização em celulares não estaria programada para o futuro imediato. De acordo com Geraldo Feitoza, diretor presidente do IndT, o principal objetivo da instituição é a criação de empregos e a geração de novas oportunidades de trabalho para profissionais que hoje se destacam por sua experiência em pesquisa e desenvolvimento, da mesma forma que abre oportunidades para profissionais recém-formados. ■
Mais Informações [1] Maemo: http://www.maemo.org/
http://supertuxbr.blogspot.com 22
http://www.linuxmagazine.com.br
http://supertuxbr.blogspot.com
Quando a adoção obrigatória de um único padrão de software pode se tornar estranha.
CORPORATE
Pela liberdade de escolha A adoção obrigatória de Software Livre por parte do Governo Federal pode gerar desconforto ao se escolher a melhor solução de TI? É o que defende Gilberto Galan, da CompTIA. por Gilberto Galan
U
m dos assuntos mais discutidos nas rodas de TI é a adoção preferencial de Software Livre em todas as esferas do Governo Federal. Por enquanto, embora haja nítida preferência pelo Software Livre aqui no Brasil, cada órgão teoricamente ainda pode escolher o produto que melhor atenda suas necessidades, seja ele um software livre ou proprietário. Setores, principalmente dentro do Governo Federal, lutam para mudar esse cenário. Os seus representantes brigam pela criação de uma legislação que torne o Software Livre obrigatório em todas as agências governamentais. Outras iniciativas também estão sendo tomadas no âmbito legislativo, federal, estadual e municipal. A argumentação vai desde a divulgação da redução de custos com licenças (com o uso do software de código aberto em comparação ao software comercial ou proprietário) até questões de ordem ideológica. Entretanto, será que essa é a melhor política? Segundo algumas fontes governamentais, há estimativas que indicam que apenas a migração de um modelo para o outro custaria entre R$ 2 mil e R$ 3 mil por microcomputador. O total disso poderia chegar de R$ 300 a R$ 400 milhões. Note-se: não há orçamento para esse objetivo. Isso, sem levar em conta os riscos de uma migração total, sem que se tenha avaliado plenamente o peso dos obstáculos técnicos, de capacitação e de certificação dos profissionais envolvidos. De qualquer maneira, aqui não cabe discutir as vantagens de um modelo ou de outro, pois ambos são capazes de gerar excelentes resultados. A questão é: por que o governo resiste em optar pela livre escolha? Não seria melhor o software ser escolhido pelos seus próprios méritos, como na iniciativa privada? O modelo de software selecionado como solução para o Ministério da Ciência e da Tecnologia pode não ser tão bom e eficiente para o
Por que não se espelhar no posicionamento do Peru e deixar que a livre escolha e o mérito técnico determinem o melhor valor para a TI do nosso país?
Ministério da Saúde ou dos Transportes, por exemplo. Os técnicos especializados em TI, seja no mercado privado ou governamental, sabem o que é mais adequado. As leis feitas por burocratas e parlamentares, com todo o respeito pelas suas boas intenções, estão muito distantes da realidade do dia-a-dia desses profissionais e das empresas. Como resultado das políticas e leis de preferência, os grandes desenvolvedores de software, além dos milhares de médios e pequenos existentes no Brasil, acabarão sendo excluídos das licitações públicas. Mais, fere-se a Constituição quando se discrimina determinados grupos, que se tornam excluídos das licitações pelo fato de estarem hoje mais concentrados no desenvolvimento de software proprietário. O Software Livre já compete efetivamente nos mercados globais, não sendo necessárias leis de preferência para favorecer esse mercado. O Brasil deveria olhar para um dos seus países vizinhos: o Peru, por exemplo, que, em outubro de 2005, aprovou uma lei que tem por base a neutralidade da escolha do software pela administração pública. Isso foi feito, acredito eu, porque os legisladores perceberam que um número maior de escolhas traria melhor retorno para todas as partes interessadas, principalmente os cidadãos. Por que não se espelhar no posicionamento do Peru e deixar que a livre escolha e o mérito técnico determinem o melhor valor para a TI do nosso país? ■
O autor Gilberto Galan é consultor e representante da CompTIA-The Computing Technology Industry Association, na América Latina. A CompTIA é hoje a maior associação de classe da indústria de TI&C (Tecnologia da Informação e Comunicações), atuando em 102 países e contando com mais de 20.000 membros associados. Fundada em 1982, no Estado de Illinois, Estados Unidos, a CompTIA foi a responsável, em 1992, pelo lançamento da certificação profissional A+ (CompTIA A+ Certification), o primeiro exame da indústria para profissionais de nível básico como forma de validar a habilidade e know-how de quem está iniciando no mercado. No Brasil, a CompTIA foca seus trabalhos em políticas públicas por meio da Iniciativa de Liberdade de Escolha do Software (ISC- Initiative for Software Choice).
Nota As opiniões do autor do artigo não devem ser encaradas como a opinião oficial da revista Linux Magazine.
http://supertuxbr.blogspot.com 24
http://www.linuxmagazine.com.br
http://supertuxbr.blogspot.com
Vanessa Makita e Eduardo Carmo, gerente de redes e analista de sistemas do Shop Tour
CORPORATE
Linux para vender melhor O Shop Tour atingiu o limite de seu ambiente de TI. Com a adoção do Linux, nada foi mexido no hardware, e agora todas as tarefas são mais ágeis e flexíveis. Os responsáveis pela migração na empresa contam por que e como ocorreu a migração. por Pablo Hess
O
Shop Tour é um canal de vendas pela TV com programação 24 horas que abrange 50 cidades em 10 estados, atingindo 17 milhões de telespectadores. As vendas englobam produtos desde automóveis e imóveis, a tecnologia e turismo. Fundado em 1987 por iniciativa do publicitário Luiz Antonio Cury Galebe, o Shop Tour começou como um programa de apenas dez minutos diários, com poucos anunciantes e lojistas. Hoje, emprega 250 funcionários e dez apresentadores, e destaca-se por ser o responsável por todas as etapas de seu processo de trabalho, desde a comercialização de publicidade até a gravação dos comerciais. O Shop Tour é uma empresa de venda de produtos que atua há mais de dez anos na televisão brasileira. Inicialmente, consistia de um programa veiculado em outras emissoras, mas, com o crescimento, tornou-se um canal independente, com transmissão 24 horas por dia para 10 estados. A Linux Magazine entrevistou a gerente de redes da empresa, Vanessa Makita, e o analista de sistemas, Eduardo Carmo, a respeito da adoção do Linux.
reestruturação. A empresa terceirizada, a AMIX, nos garantiu que a solução Eduardo Carmo» Tínhamos uma infra- livre funcionaria bem, e por isso nem estrutura toda baseada em Windows®. buscamos alternativas proprietárias. InsPorém, quando nosso banco de dados talamos o Fedora Core 1 nos servidores atingiu os 6 GB, a aplicação começou a principais, e o Kurumin em nosso servidor sofrer de lentidão excessiva, travamentos de desenvolvimento. Os sistemas atuais freqüentes e outros sinais de que se apro- foram todos desenvolvidos sobre essa ximava do limite de operabilidade. Foi plataforma. Temos ainda um desktop então que a empresa começou a buscar com Kurumin, que desfruta de grande alternativas, e a empresa contratada para aceitação de seus usuários e funciona cuidar da infraestrutura de TI sugeriu o como estação de impressão. Além disso, instalamos ainda um Linux. Uma grande ajuda nessa época veio do fato de os gestores de ambas as firewall, que antes simplesmente não empresas já se conhecerem previamente, existia, um proxy e um servidor de email. pois assim o Shop Tour depositava total Nossa aplicação roda inteiramente na confiança nas sugestões propostas. Ain- Web, o que permite o uso de qualquer da assim, existia a barreira de substituir plataforma por parte dos clientes, que, um produto bancado por uma empresa aliás, também rodam Linux. Essa solu(a Microsoft) por outro “sem dono”. No ção toda foi implementada pela empresa entanto, quando vimos as vantagens terceirizada, mas nós continuamos seu que o Linux trazia, o passo decisivo foi desenvolvimento internamente. tomado em direção à solução livre. A aceitação foi total. LM» De que consiste exatamente a solução de vocês? LM» Como foi a migração? EC» Nosso sistema é fortemente baseado EC» Não investimos um centavo no num banco de dados. Optamos pelo Poshardware, apenas fizemos uma certa tgreSQL, pois o MySQL (na época, na Linux Magazine»
ram o Linux?
Por que vocês escolhe-
http://supertuxbr.blogspot.com 26
http://www.linuxmagazine.com.br
Entrevista | CORPORATE
ce no SAC, algo que antes era impossível. No final das contas, atualmente temos dois sistemas complementares, sendo que um deles foi desenvolvido por nós a partir do zero. Como ambos os sistemas se comunicam entre si – e ainda por cima rodam na mesma máquina (um HP DL380) –, o resultado é como se fosse um sistema único. Nem mesmo precisamos atualizar os softwares para versões mais recentes, pois a combinação como está nos atende perfeitamente. Além disso, por ser uma plataforma web, o desenvolvimento é todo em PHP, LM» Quanto tempo levou a migração? que dispõe de uma boa quantidade de proEC» O estudo das alternativas começou fissionais de qualidade. É muito boa essa em julho de 2004. O primeiro mês foi liberdade de poder escolher o tamanho do todo gasto com o levantamento das ne- investimento de acordo com a magnitude cessidades e tecnologias disponíveis. No do que será desenvolvido, variando desde mês de agosto, foi feito o desenvolvimen- uma única pessoa da nossa equipe até uma to, seguido da homologação por mais empresa terceirizada, que implementou a duas semanas. No final de setembro co- nossa solução no início. Por isso mesmo, pretendemos trabalhar meçou o treinamento, e em outubro os servidores já foram colocados no ar, em agora na criação de uma Intranet, que paralelo com a solução pré-existente. Em integre ambos os sistemas, de forma a fevereiro, a nova solução estava rodando “humanizar” nosso ambiente de TI. perfeitamente. Foi um processo surpreendentemente rápido. É claro que o fato de LM» Quais foram os benefícios técnicos termos nos baseado na solução anterior e econômicos? facilitou bastante, pois já sabíamos o que EC» Na parte técnica e operacional, os reo usuário esperava. Isso teve efeito seme- latórios ficaram muito mais ágeis desde a lhante na aceitação por parte dos usuá- primeira etapa da migração. Os usuários rios, que foram presenteados com uma ficaram atônitos, pois os resultados que levainterface semelhante à anterior, porém vam três horas para ficar prontos passaram a ser quase instantâneos. Além disso, nossa mais limpa, simples e eficiente. aplicação está no ar há quase dois anos, LM» E a partir daí, o que ocorreu? Algo e continua “tinindo”. Todos ainda estão mais foi ou será feito? maravilhados, inclusive os diretores. EC» Após pouco tempo, vimos que a nossa Em relação à economia, o fato de não solução, baseada na anterior, precisava termos gasto nada com aquisição de novo de melhorias. Por tratar-se de Software hardware ou de licenças, aliado à indepenLivre, o código-fonte estava disponível, dência do fornecedor (o chamado vendor e não dependíamos do fornecedor. Por lock-in) nos permitiu grande economia isso, bastou nossa equipe interna para de recursos. Como eu disse, os diretores desenvolver as melhorias necessárias. adoraram a vinda de tantas melhorias Detectamos a necessidade de unir todos com uma redução no custo. os subsistemas que rodavam em partes específicas da empresa, e começamos a LM» Na opinião de vocês, o que falta centralizar todos eles de maneira mo- para o Linux ser mais utilizado em dular num único hardware. O primeiro empresas? desses módulos foi o do sistema de chamadas, de fundamental importância para nós. Com ele, já conseguimos descobrir os principais motivos de demora no atendimento, por exemplo. E com o desenvolvimento dos outros módulos, atingimos uma integração ainda maior entre as diversas áreas da empresa. Atualmente, os departamentos já conseguem saber o que aconte-
versão 4) ainda não supria nossas necessidades. O sistema controla toda a parte de produção da empresa, desde o início de um contrato ou pedido até o momento do “sorteio” do anúncio ir ao ar, incluindo a pauta. Ainda falta o departamento de edição (dos vídeos de anúncios) ser integrado ao sistema, o que será feito no futuro. Após a edição, os dados voltam ao sistema, onde são novamente processados e por fim são enviados ao sistema de transmissão, este proprietário, por ser altamente específico.
EC» Nos servidores, vemos que o Linux já
está estabelecido, principalmente na parte dos bancos de dados, que são maduros e gratuitos. Já nos desktops, é necessário que a curva de aprendizado seja facilitada para quem está acostumado ao Windows. Há algum tempo testamos o OpenOffice.org aqui na empresa, e o resultado foi uma boa quantidade de reclamações dos usuários em relação a mudanças na interface e, principalmente, incompatibilidade com documentos do MS Office. Como fizemos esse teste com a versão 1.x do OpenOffice.org, reconhecemos que é possível que todos esses problemas tenham sido resolvidos na nova versão 2.0. Além disso, verificamos que a adoção do OpenOffice. org exige treinamento de pessoal. Fora a suíte de escritórios, os usuários que adotaram o Kurumin aqui ficaram um pouco espantados no início, mas, em menos de um mês, já demonstravam total familiaridade com seu ambiente de trabalho. O suporte a nossas impressoras também só foi conseguido após contactarmos o fabricante e explicarmos nossa situação, à qual eles responderam com um programa que está suprindo a nossa demanda satisfatoriamente. De uma forma geral, sentimos que falta informação a respeito do Linux no ambiente corporativo. Há muita publicidade negativa contra o sistema, com inúmeros relatos de empresas que migraram para Linux e Software Livre mas, após certo tempo, se arrependeram e voltaram a adotar os sistemas proprietários de antes. Parece-nos que a propaganda negativa do Linux (boatos como falta de profissionais, falta de um fornecedor de quem depender) é mais eficiente do que a positiva, e muitas vezes falta profissionalismo por parte de quem sugere e implementa as soluções. LM» O que vocês gostariam de dizer aos
nossos leitores?
EC» Migrar para Linux vale a pena. Nós
obtivemos uma escalabilidade muito maior, junto com uma flexibilidade incomparável, visto que conseguimos desenvolver, em conjunto com uma outra empresa, todo um sistema para o fluxo dos dados aqui dentro, feito de acordo com nossos desejos, expectativas e necessidades. A economia advinda da licença gratuita pode e deve ser gasta com mão-de-obra de melhor qualidade e, no final, o custo total de propriedade ainda é muito menor. ■
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
27
Um paralelo entre tecnologias livres e colaborativas e o futuro.
CORPORATE
Cezar Taurion Será que a Wikipédia é um bom exemplo de projeto de sucesso? O autor mostra, em sua primeira coluna, como a livre colaboração e o Software Livre podem ser utilizados para criar novas estruturas de produção e ameaçar alguns gigantes... por Cezar Taurion
E
sta é a minha primeira coluna aqui na Linux Magazine. E para começar, vamos falar um pouco de Open Source e seus modelos de desenvolvimento. Acredito que ninguém tenha, ainda, a clara percepção de até onde o modelo Open Source poderá ir. Muitas vezes pensamos de forma linear, baseados nas nossas próprias experiências. Mas talvez estejamos vendo um fenômeno que muda significativamente a nossa percepção, além da própria realidade da indústria de software. Vemos exemplos fantásticos de uso de “inteligências coletivas” como a enciclopédia Wikipédia, em que qualquer um de nós pode colaborar, e que acabou gerando uma enciclopédia que não deve nada às tradicionais. Palavra da revista Nature em seu artigo que compara a Wikipédia com a famosa Enciclopédia Britannica (http://www.
Vemos exemplos fantásticos de uso de “inteligências coletivas” como a enciclopédia Wikipédia, em que qualquer um de nós pode colaborar.
nature.com/nature/journal/v438/n7070/full/ 438900a.html).
Se imaginarmos o desenvolvimento de um projeto deste tipo nos moldes tradicionais, o que teríamos? Para começar, seria uma especificação fantasticamente ambiciosa: criar um sistema de autoria colaborativa que abrangesse todo o conhecimento humano, envolvendo colaboração de centenas de milhares de pessoas em todo o mundo, que poderiam colaborar de forma livre e espontânea (e voluntária, sem ganhos financeiros) sobre qualquer tema. Imagine desenhar os workflows para gerenciar o processo de captação de artigos, validar o seu conteúdo (checando consistência e ortografia, em múltiplas linguagens), gerenciar as alterações, implementar controles de segurança e direitos de acesso, e tudo o mais que um complexo sistema como esse demandaria. Além disso, imagine a capacidade computacional para armazenar esse imenso conteúdo que cresce rapidamente (são mais de 1500 novos artigos escritos por dia), ao mesmo tempo preservando todo o histórico dos textos, pois cada
colaboração e suas subseqüentes modificações devem ser preservadas por toda a vida. Se tentássemos desenvolver esse sistema da forma tradicional, é provável que ainda estivéssemos debatendo exaustivamente suas especificações. Mas... simplesmente foi feito! Criaram-se algumas normas e procedimentos (regras de conduta, que são baseadas fundamentalmente em comportamento social), especificou-se um conjunto de formatos para criação de textos, definiu-se uma visão clara e consistente e lançou-se o projeto no ciberespaço! Claro que ele não é perfeito - muitas regras foram criadas ou adaptadas ao longo do tempo; ajustadas pela própria comunidade. Um ponto interessante: não existe um gerente de projeto que dê ordens ou determine o que pode ou não ser inserido na enciclopédia. A própria comunidade é que resolve por si, fazendo as modificações, corrigindo erros e até mesmo eliminando textos considerados preconceituosos ou parciais. Para um projeto desses dar certo, é importante quebrar paradigmas. A rede social é um fator que não pode ser ignorado. A Internet faz com que cada um dos desenvolvedores envolvidos esteja a apenas um clique de distância um do outro, não importando a real distância geográfica que os separa. Isso muda muita coisa: projetos como o Linux e o Apache são exemplos de como o processo colaborativo pode transformar uma indústria. Esse impacto pode ser visto na última lista das 100 marcas mais valiosas do mundo que a Business Week publicou recentemente em conjunto com a empresa Interbrand, consultoria especializada em avaliação de marcas. A Microsoft, segundo os analistas, perdeu valor de marca por uma combinação de três fatores: o avanço do Google, a expansão do Linux e o afastamento progressivo de seu fundador Bill Gates. A propósito, os servidores da Wikipédia e do Google rodam Linux. Portanto, a combinação de Open Source e “inteligência coletiva” pode estar engendrando um novo mundo. Vamos acompanhá-lo e debatê-lo aqui, com vocês. ■
O autor Cezar Taurion é Gerente de Novas Tecnologias Aplicadas da IBM.
http://supertuxbr.blogspot.com 28
http://www.linuxmagazine.com.br
http://supertuxbr.blogspot.com
A base do poder
LAMP, uma introdução CAPA
A base de um sistema LAMP deve ser robusta, poderosa e veloz, mas ao mesmo tempo, flexível. Naturalmente, ninguém melhor que o Linux para cumprir esse papel. por Pablo Hess
S
istema operacional, servidor web, sistema gerenciador de banco de dados e linguagem de programação voltada à Web. Esses são os quatro componentes absolutamente necessários para se montar um servidor web. Usuários de sistemas operacionais proprietários têm a (in)felicidade de não sofrer de dúvidas quanto às escolhas para cada uma dessas tarefas. Mas como todos sabemos, software livre e de código aberto é sinônimo de liberdade de escolha, e cada um desses quatro componentes pode ser preenchido por uma ampla gama de candidatos. Na área dos sistemas operacionais, Linux, FreeBSD, NetBSD e OpenBSD, para citar somente os membros mais proeminentes, são perfeitamente capazes de satisfazer essas necessidades. Entre os servidores web, o Apache realmente não possui um concorrente à altura, mas merecem menção os pequenos e velozes Lighttpd [1] e Monkeyd [2]. Os sistemas gerenciadores de bancos de dados são um terreno dominado por grandes estrelas, com MySQL [3], PostgreSQL [4] e Firebird [5] representando o mundo do código aberto. Entre as linguagens de programação, ninguém supera as linguagens de código aberto. Além dos famosíssimos representantes “P” (PHP, Perl e Python), o mundo livre nos oferece ainda excelentes opções, como Ruby [6] e Lua [7]. Com essa enorme e saudável diversidade, é no mínimo surpreendente que haja um conjunto de opções com tamanha adoção (e consenso!) entre personagens tão distintos quanto empresas, usuários e entusiastas. O conjunto LAMP, um acrônimo para Linux, Apache, MySQL e PHP, oferece estabilidade, velocidade, escalabilidade e flexibilidade a custo zero. Perfeitamente integrados, esses componentes satisfazem os desejos e necessidades de quase todo mundo. Mais ainda, eles atraem a atenção e comprovam a alta qualidade do software livre como um todo.
Pingüim
Como se não bastasse a multiplicidade de escolhas na esfera dos aplicativos, as várias distribuições de Linux compõem mais um elo desse livre mercado. Naturalmente, a instalação e configuração de um sistema LAMP começa pelo sistema operacional. Já faz alguns anos que a instalação de uma distribuição de Linux
tornou-se uma tarefa bastante simples. Até mesmo as distribuições voltadas aos usuários menos experientes têm a opção de instalar os pacotes para servidor web, banco de dados e PHP, embora isso possa exigir que a instalação seja feita em modo expert, ou, mais intuitivamente, em modo servidor. Em distribuições como Ubuntu, (open)SUSE, Fedora Core e Mandriva, por exemplo, existem pacotes pré-compilados para esses aplicativos. Há também metapacotes, que são feitos somente para depender de todos aqueles necessários para o funcionamento de um certo recurso, como o Apache, por exemplo. No Ubuntu 6.06, mesmo escolhendo a instalação do tipo servidor, não é possível selecionar os pacotes a serem instalados. Assim, a única forma de ter somente os pacotes que você quer na sua instalação é seguir o procedimento padrão e, ao final, com uma distribuição completa já instalada, selecionar os pacotes a serem removidos e instalados. No Fedora Core 5, o ótimo instalador Anaconda felizmente ainda permite a seleção dos pacotes durante a instalação. Também é possível selecionar a instalação de vários aplicativos de uma vez, de acordo com a aplicação. São oferecidas as categorias Escritório, Servidor web e Desenvolvimento. No SUSE Linux 10.0, a instalação padrão oferece a possibilidade, embora de uma forma não muito intuitiva, de selecionar conjuntos de pacotes de acordo com a tarefa, como no Fedora 5, mas com maior diversidade e flexibilidade. A instalação do Mandriva 2006 Free Edition favorece totalmente o usuário inexperiente, e assim não há qualquer opção para se instalar algum dos quatro componentes do nosso servidor. Distribuições voltadas para usuários mais avançados, como Debian, Slackware e Gentoo, naturalmente oferecem ao usuário todas as opções de personalização da seleção dos pacotes desde o início.
Progresso
Pode-se ver que a concorrência é grande em todas as esferas. Entretanto, como sabemos, é absolutamente saudável. Afinal de contas, se a concorrência leva ao aumento da eficiência, o software livre é, atualmente, o maior promotor do progresso em matéria de software. No final, todos nós saímos ganhando. ■
http://supertuxbr.blogspot.com 30
http://www.linuxmagazine.com.br
LAMP | CAPA
Mais Informações [1] Lighttpd: http://www.lighttpd.net/ [2] Monkeyd: http://monkeyd.sourceforge.net/ [3] MySQL: http://www.mysql.com/ [4] PostgreSQL: http://www.postgresql.org/ [5] Firebird: http://firebird.sourceforge.net/ [6] Ruby: http://www.ruby-lang.org/ [7] Lua: http://www.lua.org/
Forte Apache MySQL5: Truques com dados PostgreSQL: Busca bonita e veloz PHP: Para dar liga
32 36 42 49
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
31
O melhor servidor Web do mundo
CAPA
Forte Apache O Apache é o servidor Web mais usado em máquinas Linux. Extremamente poderoso e flexível, conheça em profundidade o “A” do “LAMP”. por Jorge Pereira
Sarah Williams – www.sxc.hu
M
uitas pessoas que trabalham com informática, principalmente na área de redes, já devem ter ouvido falar algo sobre o Apache, um software muito conhecido, presente em praticamente todas as distribuições GNU/ Linux e cotado como um dos softwares mais respeitados no mundo. Após mostrar a gênese do Apache, este artigo aborda também o processo de instalação do servidor e estuda a criação de uma configuração inicial do Apache, suficiente para torná-lo operacional em conjunto com os demais componentes de uma solução LAMP (Linux, Apache, MySQL, PHP).
O servidor Apache
O Apache Server – oficialmente chamado HTTP Server Project, já que existe uma infinidade de outros produtos com a chancela Apache – iniciou seus trabalhos de forma oficial em 1995, quando foi lançada a versão inicial 0.6.2. A última versão estável é a 2.2.3, que desponta, segundo os próprios desenvolvedores, para uma nova versão, mais estável e com novas funcionalidades, do Apache. Paralelamente, a série anteriormente considerada estável do Apache ganhou uma nova versão legacy, ou seja, de compa-
tibilidade com sistemas anteriores. É a versão 2.0.59, que apresenta alguns patches de segurança para o módulo mod_rewrite. A conceituada empresa inglesa Netcraft [1], responsável por realizar periodicamente pesquisas sobre servidores Web, constatou, em sua última pesquisa, que mais de 60% dos servidores utiliza mundialmente o Apache como software. Essa preferência pode ser tratada, informalmente, como uma garantia que comprova a qualidade e segurança anexos ao projeto (quadro 1).
Quadro 1: Pesquisa Netcraft entre agosto/1995 e julho/2006 Empresa
Junho/2006
Percentual
Julho/2006
Percentual
Apache
52389885
61.25
55622584
63.09
Mudanças 1.84
Microsoft
25415611
29.71
25988099
29.48
-0.23
Zeus
531399
0.62
518503
0.59
-0.03
Sun
1311822
1.53
347037
0.39
-1.14
http://supertuxbr.blogspot.com 32
http://www.linuxmagazine.com.br
Apache | CAPA
Canivete suíço
O servidor Apache é capaz de executar scripts nas linguagens PHP, Perl, TCL, Python, CGI (quadro 2) e até mesmo ASP (embora com suporte deficiente), podendo atuar como servidor FTP, HTTP, entre outros. Sua utilização mais conhecida é a que combina o Servidor Apache com a linguagem de programação para Web PHP e o banco de dados MySQL ou PostgreSQL. As versões 1.x e 2.x do Apache possuem diferentes arquiteturas. A mais recente oferece muitos aperfeiçoamentos em relação às versões anteriores. Os recursos e mudanças mais importantes são listados nos próximos parágrafos.
Módulos de multiprocessamento A primeira mudança importante no Apache 2.0 é a introdução dos módulos de multiprocessamento (MPMs, ou Multi Processing Modules). Para entender por que os MPMs são criados, é preciso compreender como o Apache funcionava antes, pois nas versões 1.3 e anteriores utilizava-se uma arquitetura de preforking. Nessa arquitetura, o processo pai do Apache sofria forks para um conjunto de processos filhos, cada um atendendo a uma das solicitações que chegavam. O processo pai simplesmente monitorava os filhos e criava ou eliminava processos filhos de acordo com a quantidade de solicitações recebidas. Após muitos estudos e testes desse modelo, concluiu-se que ele não oferecia um desempenho aceitável em sistemas não concentrados em processo, como é o caso do Windows®. Dessa forma, a utilização dos MPMs passa a ser responsável por iniciar os processos servidores e por atender à solicitação por meio de processos filhos ou threads, dependendo da implementação do MPM. Vários MPMs estão disponíveis, alguns deles serão descritos abaixo.
neamente. Caso ocorra algum erro e o processo venha a morrer ou receber um sinal SIGTERM ou SIGKILL, somente uma solicitação se perderá, pois o número de processos filhos é controlado pelo arquivo de configuração. Quando o número de requisições aumentar, os novos processos filhos serão acrescentados, até ser alcançado o número máximo. De modo semelhante, quando as requisições diminuem, todos os processos filhos extras são eliminados.
MPM threaded
Esse MPM é responsável pelo suporte a threads na série 2.0 do Apache, e é semelhante ao MPM Prefork. Porém, em vez de ter uma única thread, cada processo filho pode ter um número especificado de threads. Cada processo filho pode ter um número predeterminado de threads, e cada thread dentro de um processo filho pode atender a uma solicitação diferente. No caso, se o Apache iniciar 30 processos filhos e cada filho tiver permissão para ter no máximo 10 threads, então o Apache poderá atender a 30 x 10 = 300 requisições simultâneas. Por exemplo, se um módulo experimental fizer a thread receber um sinal para morrer, o processo inteiro morrerá. Isso significa que todas as solicitações que estiverem sendo atendidas pelas thre-
ads dentro daquele mesmo processo filho serão perdidas. Devido ao fato de as solicitações se distribuírem entre as threads em processos filhos separados, a morte de um deles somente causa a queda das conexões atendidas pelo mesmo processo filho. Considerando que threads são mais eficientes do que processos no uso de recursos do sistema, esse MPM contribui muito para a escalabilidade.
MPM per child
Essa é uma novidade controversa da série 2.0, pois esse módulo MPM, inicia um número pré-definido de processos filhos com um número predeterminado de threads. À medida que a carga de requisições aumenta, os processos abrem novas threads, conforme necessário. Quando a contagem de requisições reduz, os processos condensam sua contagem de threads, empregando uma configuração de contagem mínima e máxima de threads. A diferença fundamental entre esse módulo e o MPM threaded é que, nele, o número de processos é estático, e cada processo pode funcionar utilizando um UID ou GID diferente, o que facilita a execução de múltiplos websites virtuais. O uso do módulo per child aumenta o nível de segurança, pois limita o acesso a determinados pontos do servidor. ➧
Quadro 2: Recursos do Apache ➧ Possui suporte a scripts CGI utilizando linguagens como Perl, PHP, Shell Script, ASP etc ➧ Suporte à autorização de acesso, podendo ser especificadas restrições para cada endereço, arquivo, diretório ou grupo de usuários acessado no servidor ➧ Autenticação por nome de usuário e senha para acesso a alguma página, subdiretório ou arquivo (com suporte a criptografia via Crypt e MD5), e autenticação em banco de dados ➧ Negociação de conteúdo, permitindo a exibição da página Web no idioma requisitado pelo navegador cliente ➧ Suporte a tipos MIME ➧ Suporte a IP virtual hosting ➧ Suporte a name virtual hosting ➧ Personalização de logs e mensagens de erro
Prefork
O MPM de prefork reproduz a arquitetura utilizada nas versões do Apache 1.3 e anteriores, nas quais era criado todo um conjunto de processos filhos para atender às solicitações. Com o prefork, cada processo filho obtém uma única thread. Vejamos o exemplo: se iniciarmos 30 processos filhos, o Apache poderá atender às 30 solicitações simulta-
➧ Suporte a virtual hosting, sendo possível servir duas ou mais páginas, com endereços e portas diferentes, através do mesmo processo, ou usar mais de um processo para controlar mais de um endereço ➧ Suporte a servidor proxy FTP e HTTP, com limite de acesso e caching (todos flexivelmente configuráveis) ➧ Suporte a proxy e redirecionamentos baseados em URLs para endereços internos ➧ Suporte a criptografia via SSL e certificados digitais ➧ Por ser um software modular, pode ser personalizado de forma a utilizar menos recursos da máquina
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
33
CAPA | Apache
MPM WinNT
saída sob a forma de etiquetas de SSI, de funcionar de forma mais fluida e Esse é o MPM para a plataforma Win- que podem ser processadas antes da natural em plataformas diversas, como dows, incluindo o Windows 2000, Win- saída do conteúdo final para a Web. Windows, BeOS, Amiga e OS/2. Graças dows NT e Windows 9x. É um módulo Segundo os próprios desenvolvedores ao APR, programas como o ApacheBenmultithreaded. Com esse módulo, o do Apache, diversas outras aplicações ch [2] podem ser utilizados em todas Apache criará um processo pai e um da filtragem de E/S estarão disponí- as plataformas. processo filho, e o processo filho ge- veis no futuro. rará todos os threads que atenderão às requisições feitas ao servidor. Além disso, agora esse módulo também aproveita Agora que entramos um pouco mais na arquitetura e funcionamento do servidor algumas chamadas de funções nativas Apache, vamos instalar nossa primeira verdo Windows. Dessa forma, é possível que ele funcione melhor que as versões Como se não bastasse a forma como o são a partir do código-fonte. Nessa tarefa, anteriores do servidor Apache desenvol- Apache Group desenvolveu o servidor naturalmente são necessários o compividas para essa plataforma. Web mais popular no mundo, a versão lador GCC, as ferramentas Autotools e 2.0 trouxe a necessidade de cuidar da a biblioteca libc6. Com os comandos a sua portabilidade. Nas versões ante- seguir, realizamos a configuração, comriores, o Apache lidava internamente pilação e instalação do Apache. com a portabilidade, o que tornava a base de código menos flexível, dificul- # wget -c http://www.apache.org/dist/ O Apache 2.0 inclui a arquitetura de tando um pouco o seu entendimento ➥httpd/httpd-2.0.59.tar.gz # tar -xzvf httpd-2.0.59.tar.gz E/S em camadas. Isso significa que a e manutenção. Pensando nisso, o Apa- # cd httpd-2.0.59/ saída de um módulo pode se tornar a che Group introduziu o APR (Apache # ./configure entrada de outro. Esse efeito de filtra- Portable Runtime). A finalidade do ➥ --sysconfdir=/etc/apache2 \ --prefix=/usr/local \ gem é muito interessante. Por exemplo, APR é oferecer uma única interface, --localstatedir=/var/log/apache2 \ a saída produzida por scripts CGI é em linguagem C, para funções espe--datadir=/dominios/default processada pelo módulo mod_cgi, e cíficas da plataforma, de tal forma que # make pode então ser entregue ao módulo o código possa ser escrito uma única # make install mod_include responsável pelas SSI vez, aumentando o nível de desenvol(Server Side Includes). Em outras pala- vimento de novas aplicações com uma vras, os scripts CGI podem produzir a mesma API. Isso torna o Apache capaz Note que, de acordo com nossa instalação acima, todas as configurações do nosso servidor ficarão em /etc/ Exemplo 1: Configurações globais do Apache apache2, os registros de 01 IP ou host padrão: neste caso vamos utilizar uma configuração para responder em todas as interfaces de rede logs em /var/log/apache2, 02 ServerName *:80 e os binários executáveis 03 em /usr/local/bin. Os 04 # E-mail do administrador do servidor 05 ServerAdmin sys-admin@meuhost.com.br dados com o conteúdo 06 de nosso domínio padrão 07 # Diretório raiz de conteúdo serão armazenados em / 08 DocumentRoot /dominios/default/htdocs dominios/default, enquan09 to os dos outros domínios 10 # Configurando os Nomes dos Arquivos Padrão 11 DirectoryIndex index.html main.html index.cgi adicionais naturalmente 12 serão depositados em 13 # Acesso apenas aos diretórios devidos /dominios/outro_domínio. 14 <Directory “/dominios/*/htdocs”> Para mais informações 15 Options Indexes FollowSymLinks sobre os parâmetros de 16 AllowOverride None 17 </Directory> compilação, basta abrir 18 o arquivo INSTALL dentro 19 # Acesso para execução de scripts CGI do diretório dos fontes 20 <Directory “/dominios/*/cgi-bin”> do Apache. 21 Options -Indexes +ExecCGI
APR (Apache Portable Runtime)
Mão na massa
Filtragem de entrada e saída
22 23 24 25 26 27 28 29 30 31 32
AllowOverride None </Directory> # Configurando os Nomes dos Arquivos Padrão a serem exibidos antes de ser listado o conteúdo de um diretório DirectoryIndex index.html index.html index.cgi # Diretório com os scripts CGI ScriptAlias “/cgi-bin/” /dominios/default/cgi-bin/ # Habilitando execução de scripts CGI AddHandler cgi-script .cgi
Pontapé inicial Nosso servidor possui um aplicativo chamado apachectl, que é utilizado para a manipulação do daemon httpd. Vamos ini-
http://supertuxbr.blogspot.com 34
http://www.linuxmagazine.com.br
Apache | CAPA
Exemplo 2: Configurações para domínios virtuais 01 # Caso queira que o Apache responda por todas as requisições feitas às todas ➥ interfaces de rede, basta seguir este exemplo 02 NameVirtualHost *:80 03 04 # Primeiramente, devemos ter uma configuração padrão para os domínios virtuais, ➥ para ser exibido o conteúdo quando o host solicitado não existir no servidor. 05 06 <VirtualHost *:80> 07 ServerAdmin sys-admin@meuhost.com.br 08 DocumentRoot /dominios/default/htdocs 09 ServerName localhost 10 </VirtualHost>
cializar o serviço por meio do comando
/usr/local/bin/apachectl start. Caso apa-
reça alguma mensagem de erro, verifique nos arquivos de log em /var/log/apache2. Se tudo ocorreu tranqüilamente, basta acessar a página inicial do Apache no seu navegador, utilizando o endereço IP da máquina local, ou utilizando o endereço http://localhost. Antes de começarmos a configuração, devemos sempre definir a forma de armazenamento dos websites hospedados pelo nosso servidor. Em nosso exemplo, aprenderemos a configurar um domínio virtual, e utilizaremos como ponto de armazenamento o diretório /dominios. Então, os arquivos do domínio exemplo serão armazenados em /domínios/exemplo, com os documentos HTML ficando no subdiretório htdocs e os scripts CGI em cgi-bin. Supondo que tenhamos o domínio meuhost.com.br já registrado num servidor DNS, e que queiramos hospedá-lo em nosso servidor recém-instalado, vamos preparar os diretórios para armazenar o website. Mas primeiro, vamos aprender um pouco sobre as configurações disponíveis no arquivo principal, /etc/apache2/httpd. conf. Abra esse arquivo com seu editor de texto predileto e, caso as configurações já existam, basta ir comentando ou descomentando as diversas opções, de acordo com os exemplos 1 e 2. Para adicionar um domínio virtual ao nosso servidor, devemos primeiramente criar o diretório a partir de /dominios e, logo em seguida, criar as entradas de configuração no httpd.conf. O primeiro passo é criar os diretórios: # mkdir -p /dominios/meuhost.com.br/htdocs # mkdir -p /dominios/meuhost.com.br/ ➥cgi-bin
Depois, podemos alterar o arquivo
/etc/apache2/httpd.conf:
<VirtualHost *:80> ServerAdmin webmaster@meuhost.com.br DocumentRoot /dominios/meuhost.com.br/ ➥htdocs/ ServerName www.meuhost.com.br ScriptAlias “/cgi-bin/” ➥ /dominios/meuhost.com.br/cgi-bin/ </VirtualHost>
Feito isso, basta agora parar e iniciar o servidor Apache. Caso não funcione, procure refazer todo o processo, e lembre-se de que qualquer tipo de erro será relatado pelo Apache no arquivo /var/ log/apache2/logs/error_log. Funcionando, reinicie o servidor com /usr/local/bin/ apachectl restart. Teste o acesso através de um navegador Web e informe o domínio configurado (em nosso exemplo, www.meuhost.com. br). Todo o conteúdo dentro de /dominios/meuhost.com.br/htdocs/ será exibido. Caso você informe qualquer outro domínio que esteja direcionado para seu IP e que não esteja cadastrado no Apache como um “Domínio Virtual”, ele exibirá o conteúdo do diretório /dominios/default/htdocs. ■
Mais Informações [1] Pesquisa realizada em 2005 pela Netcraft:
http://news.netcraft.com/ archives/2005/12/02/ december_2005_Web_ server_survey.html [2] ApacheBench: http://freshmeat.net/ projects/apachebench/ [3] W3C HTML: http://www.w3.org/TR/REC-html40/ [4] W3C CGI: http://www.w3.org/CGI/ [5] CGI utilizando scripts de shell : http://www.thobias.org/ doc/cgi_shell.html
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
35
Stored procedures, triggers e views no MySQL 5
CAPA
Truques com dados Mostramos como alguns novos recursos do MySQL 5 ajudarão a melhorar o desenho de programas e melhorarão muito o desempenho dos aplicativos. por Larkin Cunningham
Alfonso Romero – www.sxc.hu
O
sistema de bancos de dados de código aberto MySQL serve muitas das maiores empresas no mundo, como Yahoo e Ticketmaster. Também está presente num grande número de websites com tráfego intenso, como a Wikipédia. Diversas organizações, no entanto, tradicionalmente preterem o MySQL em troca de sistemas de bancos de dados comerciais ricos em recursos, como o Oracle e o DB2. A partir do MySQL 5 [1], os desenvolvedores do MySQL começaram a introduzir uma gama de recursos profissionais que acabarão tornando-o mais competitivo com sistemas de bancos de dados comerciais. Este artigo examina alguns dos recursos profissionais agora presentes no MySQL. Muitos deles foram introduzidos na versão 5.0, e alguns podem vir a sê-lo na versão 5.1, que ainda estava em fase beta durante a confecção deste artigo, mas possivelmente já terá sido lançado quando você o ler. Neste artigo foi usada a versão 5.1.9-beta para confecção dos exemplos. Três dos novos recursos mais atraentes no MySQL 5.x são os stored procedures (procedimentos armazenados), triggers (gatilhos), e views (visualizações). Esses recursos não são novos na indústria. A Oracle, por exemplo, primeiro apresentou o PL/SQL [2], sua implementação de uma linguagem procedural para SQL, em 1991. O Sybase, PostreSQL e DB2 estão entre os outros sistemas de gerenciamento de bancos de dados com linguagens procedurais para SQL. Todavia, triggers, views
e stored procedures ainda são uma adição As stored procedures são uma ferramuito bem vinda ao MySQL. menta poderosa para um desenvolvedor Deve-se notar que alguns desses recur- ter em seu arsenal. Elas podem oferesos profissionais do MySQL ainda estão cer grandes benefícios em termos de em estágio inicial de desenvolvimento. desempenho e desenho de aplicações. Muitos desses recursos ainda estão incom- Em relação ao desempenho, é possível pletos ou não atingem níveis ótimos de reduzir muito tráfego de rede realizandesempenho. A versão 5.1 resolveu algu- do um maior processamento de dados mas dessas questões, e os novos recursos dentro do banco de dados. Ao reduzir o sem dúvida continuarão melhorando nas tráfego de rede, pode-se eliminar a latênversões mais novas do MySQL. cia associada à comunicação do servidor Ao longo deste artigo, haverá referên- de aplicação com o servidor de banco cias às tabelas produtos, cabecalhos_pedi- de dados, principalmente quando eles dos, linhas_pedidos, estoque e clientes, residem em servidores separados, como para melhor ilustrar os exemplos. O é o caso na maioria das aplicações de Exemplo 1 mostra os comandos SQL grande escala. create table que criam as tabelas. Ao dar Com stored procedures, é possível exemplos de stored procedures, triggers e usar uma abordagem de caixa preta para views, serão feitas referências às tabelas o desenho e desenvolvimento de aplicações. Um desenvolvedor programando do Exemplo. em Java, PHP, Ruby ou qualquer outra linguagem com suporte ao MySQL não precisa ter grandes conhecimentos em Antes de explicar o que são stored procedu- SQL ou PL/SQL. Em equipes de deres, é importante explicar que esse termo senvolvimento com diversos membros, será usado aqui geralmente em referên- pode-se ter desenvolvedores de stored cia à combinação de stored procedures e procedures concentrados no desenvolstored functions (funções armazenadas). vimento de stored procedures, enquanto Uma stored procedure aceita múltiplos desenvolvedores de Java, PHP ou Ruby parâmetros de entrada e saída. Uma stored se dedicam a suas linguagens de profunction também aceita múltiplos parâ- gramação específicas. Contanto que metros de entrada, mas retorna somente cada desenvolvedor esteja ciente das um único valor a quem a chamou. Essa entradas e saídas esperadas, ambos os restrição permite o uso de stored func- desenvolvedores podem trabalhar em tions dentro de comandos SQL, o que paralelo. Essa pode ser uma forma de efetivamente proporciona uma extensão utilizar melhor os conhecimentos de das capacidades do SQL. seus desenvolvedores, caso o projeto
Stored procedures
http://supertuxbr.blogspot.com 36
http://www.linuxmagazine.com.br
MySQL 5 | CAPA
Linguagem procedural do MySQL
seja grande o suficiente para garantir tabela associada arquivo_produtos com as os recursos de desenvolvimento. mesmas colunas da tabela de produtos. A portabilidade também é favorecida Para arquivar automaticamente, você por um maior desenvolvimento da sua criaria triggers na tabela dos produtos lógica no banco de dados. Seria possível, para inserir uma linha na tabela arquipor exemplo, desenvolver um programa vo_produtos após cada atualização ou re- O MySQL 5 oferece uma linguagem em lote escrito em C, um aplicativo web moção. Você não deve criar um trigger procedural que você pode usar para usando Ruby on Rails, e um web service que seja acionado após uma inserção, pois criar suas stored procedures e triggers. em Java, e todos utilizarem o mesmo ao buscar todo o histórico de um produ- Ao invés de usar uma linguagem proceconjunto de stored procedures. to, seria retornada a união da linha da dural baseada em C ou Python, os deA abordagem de várias pessoas ao tabela produtos com as linhas associadas senvolvedores do MySQL criaram uma desenvolver aplicativos que usem um da tabela arquivo_produtos. linguagem procedural de acordo com o banco de dados relacional é ou embutir A abordagem é semelhante quando padrão ANSI SQL:2003 [5]. O padrão todo o SQL dentro de seu código, ou em- a auditoria é necessária. Em vez de ter ANSI é usado em diferentes graus pelos butir todo o SQL em stored procedures uma tabela de arquivamento associada desenvolvedores de outros sistemas gee simplesmente chamá-las a partir de nos locais que precisam de arquivamento, renciadores de bancos de dados, então, seu código. Muitos desenvolvedores se é possível ter uma única tabela de audi- ao seguir o padrão, os conhecimentos baseiam em mapeadores objeto-relacio- toria. Para as tabelas para as quais você adquiridos no desenvolvimento de stonais como o Hibernate [3] (para Java) e desejar manter uma trilha de atividades red procedures e triggers para o MySQL o ActiveRecord [4] (para Ruby on Rails), de auditoria, você pode ter triggers acio- é transferível a outros bancos de dados onde stored procedures são altamente ir- nados após qualquer operação de adição, como Oracle, DB2 e PostgreSQL, que relevantes. Decidir qual abordagem usar atualização ou remoção. Esses triggers possuem implementações semelhantes para lidar com o processamento dos dados inseririam uma linha na tabela de au- de linguagens procedurais. nas suas aplicações dependerá de fatores ditoria contendo a natureza da ação, a Assim como as linguagens de procomo desempenho e portabilidade. Se tabela afetada, o usuário que realizou a gramação com as quais você deve ter o desempenho não for importante, você operação, a hora em que isso foi realizapode considerar um mapeador objeto-re- do e quaisquer outros dados que se julgar Exemplo 1: O esquema lacional para gerar seu SQL dinamica- importantes. A abordagem de usar triggers mente. Mas, se você se importar com o no banco de dados para auditoria e não do banco de dados desempenho e tiver necessidade de um no código da sua aplicação pode reduzir 01 CREATE TABLE produtos ( certo número de transações por segundo, o trabalho de programação de seus desen02 id MEDIUMINT NOT NULL AUTO_INCREMENT, ou de um tempo de resposta em deter- volvedores e encorajar a consistência em 03 nome CHAR(40) NOT NULL, 04 custo DOUBLE(9,2) UNSIGNED DEFAULT 0.0, minado número de milissegundos, você ambientes onde diversas aplicações aces05 PRIMARY KEY (id) provavelmente terá interesse nos méritos sam o mesmo banco de dados. Existem 06 ); do uso de stored procedures. Se você tra- muitas boas abordagens para a auditoria 07 balha em um ambiente heterogêneo com que podem ser empregadas no código da 08 CREATE TABLE estoque ( muitas plataformas de desenvolvimento, sua aplicação, então cada caso deve ser 09 id MEDIUMINT NOT NULL AUTO_INCREMENT, então as stored procedures podem ser examinado em seu contexto. 10 id_produto MEDIUMINT NOT NULL, 11 quantidade MEDIUMINT NOT NULL DEFAULT 0, uma forma de você desenvolver sua ló12 PRIMARY KEY (id) gica de processamento de dados só uma 13 ); vez e numa localização central. Afinal, as 14 stored procedures não se importam com Uma view é uma tabela virtual gerada a 15 CREATE TABLE cabecalhos_pedidos ( a linguagem que faz a chamada. partir de uma consulta armazenada. A 16 id MEDIUMINT NOT NULL AUTO_INCREMENT, 17 id_cliente MEDIUMINT NOT NULL, consulta armazenada freqüentemente 18 data_pedido DATETIME NOT NULL, é composta por múltiplas operações de 19 status_pedido CHAR(1) DEFAULT ‘O’, join que usam dados de diversas tabelas 20 PRIMARY KEY (id) Os triggers têm muitos usos, incluindo com algumas condições em comum. 21 ); tarefas básicas de manutenção, como au- Num nível mais simples, pode ser só um 22 23 CREATE TABLE linhas_pedidos ( ditoria e arquivamento. Eles podem ter subconjunto de uma tabela maior. Um 24 id MEDIUMINT NOT NULL AUTO_INCREMENT, diversos outros usos também. Um cenário exemplo trivial, novamente usando a ta25 id_pedido MEDIUMINT NOT NULL, comum é quando um trigger é aciona- bela produtos, é criar uma view chamada 26 id_produto MEDIUMINT NOT NULL, do após uma linha ser criada, como por produtos_sem_estoque, que une a tabela 27 quantidade MEDIUMINT NOT NULL DEFAULT 0, exemplo a adição de uma linha à tabela produtos à tabela estoque, nos itens com 28 PRIMARY KEY (id) 29 ); linhas_pedidos. Um trigger poderia ser estoque zero. 30 acionado depois de a linha ser inserida As views podem ajudar a reduzir o 31 CREATE TABLE clientes ( para atualizar a quantidade do produto código SQL para conjuntos de dados 32 id MEDIUMINT NOT NULL AUTO_INCREMENT, freqüentemente acessados. As views em estoque na tabela estoque. 33 nome VARCHAR(70) NOT NULL, Onde o arquivamento é necessário, também melhoram a eficiência, pois a 34 endereco VARCHAR(200) NOT NULL, 35 telefone VARCHAR(20) NOT NULL, pode-se ter mais uma tabela de arquiva- consulta respectiva pode sofrer cache e 36 email VARCHAR(40) NOT NULL, mento para cada tabela, onde se guardará ser carregada mais rápido que as diver37 PRIMARY KEY (id) a informação sobre os arquivamentos. Por sas versões da mesma consulta rodando 38 ); exemplo, a tabela produtos pode ter uma a partir de diferentes locais.
Sobre views
Triggers
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
37
CAPA | MySQL 5
Figura 1
uma quantidade a ser adicionada ao estoque. Como o delimitador padrão no MySQL é um ponto-e-vírgula, e a linguagem procedural do MySQL utiliza esse caractere para terminar cada comando, precisamos mandar o MySQL mudar o delimitador ao tentarmos criar nossa procedure. A convenção normal é usar como delimitador dois cifrões seguidos, Uma stored procedure simples no navegador de consultas do MySQL. com o comando DELIMITER $$ (linha 1). O intimidade, como PHP e Java, a lin- próximo comando (linha 3) manda o guagem procedural do MySQL pos- MySQL destruir a stored procedure de sui as estruturas de que você precisa mesmo nome, caso exista uma. Caso para escrever códigos úteis. Isso in- contrário, esse comando é ignorado e clui comandos condicionais (IF-THEN- o parser MySQL continua processando ELSE e CASE-WHEN) e comandos iterativos os comandos. A linha 4 faz o MySQL (REPEAT-UNTIL e WHILE-DO). criar uma nova stored procedure com O comprimento deste artigo não nos o nome e parâmetros fornecidos. Toda permite apresentar todos os recursos a lógica das stored procedures começa da linguagem procedural do MySQL. com o comando BEGIN (linha 7). Vários Em vez disso, será explicado como as comandos declarativos, seqüenciais, stored procedures e triggers do MyS- condicionais e iterativos podem ser QL são estruturados e oferecem alguns usados antes de terminar a lógica da exemplos simples que mostram, ainda stored procedure com o comando END que basicamente, o que as stored pro- (linha 26). Note como o comando END cedures, triggers e views realmente são. é seguido de nossos delimitadores temSe você for um programador experien- porários, os dois cifrões. Isso acontece te em qualquer linguagem moderna, porque agora deixamos a stored proa linguagem procedural do MySQL cedure e voltamos a parsear o SQL do parecerá bastante simplista. Ela foi MySQL normalmente. Nesse ponto, pensada como uma forma de oferecer vamos voltar ao delimitador padrão de entrada a comandos SQL e manipu- ponto-e-vírgula (linha 28). lar seus resultados, e não como uma linguagem para competir com outras como PHP ou Java.
Variáveis, parâmetros e tipos de dados Na
figura 1,
declaramos uma variável
adicao_maxima (linha 8) e três parâmetros adicao_estoque, id_produto e novo_estoque (linhas 4 a 6). As palavras-chave IN e OUT
informam ao MySQL que o parâmetro pode receber um valor de entrada, retornar um valor a quem o chamou, ou ambos (declarando que um parâmetro é IN OUT). Os parâmetros podem ser usados como variáveis normais, mas somente os OUT devem ter seus valores mudados na procedure. As variáveis têm que ser explicitamente declaradas e receber um tipo e um valor padrão opcional. Os tipos a escolher pertencem aos tipos de dados SQL padrão que o MySQL suporta para colunas de tabelas. Todos os tipos de dados são escalares, ou seja, só podem guardar um único valor discreto. Isso elimina tipos de dados como vetores, que podem ser frustrantes para os desenvolvedores acostumados com linguagens como PHP e Java. Entretanto, há formas de contornar isso, como tabelas temporárias que usam um mecanismo de armazenamento em memória. Alguns dos tipos de dados típicos incluem CHAR e VARCHAR (para caracteres e strings), DATE, DATETIME, INT (incluindo TINYINT, SMALLINT, MEDIUMINT e BIGINT), DECIMAL, FLOAT, DOUBLE e outros. Grandes quantidades de dados podem ser armazenadas usando-se outros tipos de dados, como TEXT (até 64 KB) e BLOB (grande objeto binário – teoricamente é possível armazenar até 4 TB em um LONGLOB).
Estrutura de uma stored procedure As stored procedures são escritas de forma a permitir que sejam criadas por qualquer ferramenta que execute SQL. Alguns dos exemplos aqui são mostrados no navegador de consultas do MySQL [6], uma ferramenta livre e muito útil do MySQL. Elas são escritas como scripts SQL, que basicamente informam ao MySQL o nome e os conteúdos da stored procedure. Se ela contiver erros, o MySQL informará o desenvolvedor quando este tentar criá-la. A figura 1 mostra uma stored procedure que aceita um valor inteiro para
Figura 2 Uma procedure feita para retornar um conjunto de resultados a quem a chamou.
http://supertuxbr.blogspot.com 38
http://www.linuxmagazine.com.br
MySQL 5 | CAPA
Exemplo 2: Uma stored procedure com uso de um cursor
Figura 3 Exemplo de chamada de stored procedure em PHP usando mysqli.
SQL em stored procedures Diferentemente de outras linguagens de programação, como PHP e Java, não existem drivers com os quais se preocupar, nem funções ou métodos especiais para executar seu SQL. No lugar disso, os comandos SQL podem ser executados dinamicamente e os resultados inseridos diretamente das variáveis. Os comandos UPDATE e INSERT podem ler valores diretamente das variáveis e parâmetros. Na figura 1, um comando UPDATE (linha 12) mistura nomes de tabelas, de colunas e parâmetros. No comando SELECT seguinte (linha 16), um valor é selecionado e enviado diretamente para um parâmetro OUT. Como já foi dito, a linguagem procedural do MySQL é, no final das contas, uma forma de entrar dados em SQL e processar os resultados. No comando SELECT (linha 16), na figura 1, um valor foi selecionado e enviado para um parâmetro OUT. Supondo que a coluna id garanta que cada dado é único, isso não deve ter problemas. Mas e se o comando SQL retornar vários valores? Você só deve selecionar algo e enviar para uma variável se tiver certeza absoluta de que somente um valor será retornado. Esse será o caso quando o discriminador (os argumentos após a palavra-chave WHERE) usar uma chave única, como uma coluna de id usando um auto_increment, ou quando você selecionar enviar o valor de uma função
para uma variável, com SUM() ou MAX(), por exemplo. Como as variáveis são escalares e só conseguem guardar valores unitários, é eliminada a possibilidade de se retornar uma lista de valores diretamente para uma variável. É aí que o conceito de cursores chega para ajudar.
Cursores
Um cursor é um ponteiro para um conjunto de resultados retornados por uma consulta SELECT. Embora seja usado principalmente quando esse tipo de consulta retorna mais de uma linha, também é possível usar um cursor mesmo quando somente uma linha é retornada. Mesmo que nenhuma linha seja retornada, isso não gerará um erro. Porém, se tentarmos buscar uma linha de um resultado nulo ou se tentarmos buscar além da última linha dos resultados, um erro do MySQL será relatado. O exemplo 2 mostra uma forma possível para se utilizar cursores com REPEAT-UNTIL. Começamos a procedure declarando algumas variáveis padrão, incluindo uma com o nome de nao_encontrado. Essa variável é usada junto com um HANDLER para a condição NOT FOUND (NÃO ENCONTRADO). Ou seja, quando uma condição NOT FOUND for encontrada, como por exemplo quando o cursor ultrapassa seus limites, o valor de nao_encontrado será definido como 1 ou TRUE. Nosso cursor resumo_pedido_atual, não é nada mais que um valor dado a uma variável de mesmo nome até que consigamos abri-la
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
DELIMITER $$ DROP PROCEDURE IF EXISTS mostrar_pedidos_processados $$ CREATE PROCEDURE mostrar_pedidos_processados () BEGIN DECLARE DECLARE DECLARE DECLARE DECLARE DECLARE
v_p_id v_c_nome v_c_telefone v_p_data v_p_total nao_encontrado
MEDIUMINT; VARCHAR(70); VARCHAR(20); DATETIME; DOUBLE(9,2); TINYINT;
/* Selecionar todos os pedidos processados */ DECLARE resumo_pedido_atual CURSOR FOR SELECT oh.id , c.nome , c.telefone , oh.data_pedido , SUM(p.custo * ol.quantidade) AS custo_total FROM produtos p , clientes c , cabecalhos_pedidos oh , linhas_pedidos ol WHERE c.id = oh.id_cliente AND oh.id = ol.id_pedido AND ol.id_produto = p.id AND oh.status_pedido = ‘P’ GROUP BY oh.id , c.nome , c.telefone , oh.data_pedido; DECLARE CONTINUE HANDLER FOR NOT FOUND SET nao_encontrado = 1; SET nao_encontrado = 0; OPEN resumo_pedido_atual; laco_resumo_pedido:REPEAT FETCH resumo_pedido_atual INTO v_p_id , v_c_nome , v_c_telefone , v_p_data , v_p_total; IF nao_encontrado THEN LEAVE laco_resumo_pedido; END IF; SELECT CONCAT(‘ID do pedido: ‘, v_p_id, ‘, Nome: ‘, ➥ v_c_nome, ‘, Telefone: ‘, v_c_telefone, ‘, ➥ Data do pedido: ‘, v_p_data, ‘, Total do pedido: ‘, v_p_total); UNTIL nao_encontrado END REPEAT laco_resumo_pedido; CLOSE resumo_pedido_atual; END $$ DELIMITER ;
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
39
CAPA | MySQL 5
Figura 4 O SQL para criar a view.
com OPEN. Após a abertura, podemos começar buscando nosso cursor e enviando-o a variáveis na mesma ordem das colunas no comando SELECT do cursor. Para buscar todas as linhas retornadas pela nossa consulta de seleção, precisamos usar um comando iterativo. Existem muitas formas de fazer isso, e uma delas é REPEAT-UNTIL. Apesar de o nosso comando REPEAT continuar ATÉ (UNTIL) uma condição específica ser verdadeira (a variável nao_encontrado, no caso), nós temos a opção de sair (LEAVE) da iteração antes que a condição UNTIL seja atingida. Para isso, usamos um rótulo para a iteração, laco_resumo_pedido. Isso nos permite sair da iteração antes de usar alguma das variáveis buscadas, as quais, no caso de buscar além da última linha, resultará num erro do MySQL. O comando SELECT CONCAT pode parecer um pouco estranho, mas é como exibimos os valores retornados pela consulta do nosso cursor.
Retornar conjuntos de resultados Se você for um programador experiente que usa algo como PHP, Java, Python ou Ruby, pode estar se perguntando qual o objetivo de uma stored procedure como a do exemplo 2, já que ela só mostra o resultado no console ou no navegador de consultas
Figura 5 Uso de uma view como uma consulta normal.
do MySQL. Ela não é muito útil se você quiser manipular os dados do conjunto de resultados do cursor. Porém, é possível retornar um conjunto de resultados ao programa que o gerou sem o cursor ou o código de manipulação. Um comando SQL simples pode ser colocado numa stored procedure sem declarar um cursor e sem realizar um SELECT para alguma variável. Ele é escrito exatamente como você o escreveria, caso fosse executar seu SQL no navegador de consultas do MySQL ou no phpMyAdmin [7]. No exemplo 2, vocè pode simplesmente abandonar todos os comandos entre BEGIN e END que não sejam a consulta SQL. A figura 2 mostra essa pequena stored procedure. Note como agora a stored procedure foi mudada para receber um parâmetro para selecionar pedidos de um status específico. Essa procedure ordenada pode potencialmente retornar o conjunto de resultados da consulta para um programa, supondo que a linguagem de programação desse programa suporte a busca desses conjuntos de resultados sem limites fixos. É possível ter múltiplas consultas SQL como a da figura 2. Isso pode ser útil para conjuntos de dados relacionados, porém, é melhor ficar longe dessa abordagem e usar consultas únicas que retornem conjuntos de dados únicos.
Exemplo 3: Um trigger simples pós-atualização 01 02 03 04 05 06 07 08 09
DELIMITER $$ CREATE TRIGGER trg_ins_linhas_pedidos AFTER UPDATE ON linhas_pedidos FOR EACH ROW BEGIN UPDATE estoque SET quantidade = quantidade - NEW.quantidade WHERE id_produto = NEW.id_produto; END $$ DELIMITER ;
Chamada de uma stored procedure A figura 2 mostra um exemplo de código de chamada de uma stored procedure em PHP. No MySQL 5, deve-se ter instalada a extensão mysqli, para orientação a objetos, carregada ou compilada no PHP. A figura 3 mostra as chamadas de métodos usando o mysqli. A linha 10 demonstra a chamada à stored procedure. Note que ela não parece ser diferente de uma chamada SQL comum. A diretiva while na linha 21 itera através das linhas no conjunto de resultados retornado, assim como um conjunto de dados retornado a partir da execução de uma consulta SQL normal.
Usando triggers
Enquanto as stored procedures são iniciadas por chamadas diretas de acordo com sua necessidade, os triggers, por outro lado, são iniciados por eventos que causam o acionamento dos triggers. Esses eventos são inserções, atualizações e remoções. De volta às tabelas do exemplo 1, podemos imaginar uma situação em que o cliente A pede o produto B. Uma saída para registrar isso em nosso sistema é executar uma stored procedure que insere o cabeçalho de um pedido e uma linha de pedido, e depois atualiza a quantidade estocada do produto. Outra abordagem seria que, sempre que uma linha de pedido fosse criada, a quantidade estocada correspondente ao tamanho do pedido fosse subtraída. Podemos considerar essa uma das nossas regras. Em vez de gravar a atualização a cada vez que um pedido é feito, podemos simplesmente criar um trigger que seja executado a cada vez que uma linha de pedido for inserida. Isso nos permite ter regras de negócios concretas embutidas no banco de dados.
http://supertuxbr.blogspot.com 40
http://www.linuxmagazine.com.br
MySQL 5 | CAPA
Usando views
O exemplo 2, mostrou um atraente trecho de SQL que consultava resumos de pedidos processados. Em diversas aplicações, isso pode ser um útil conjunto de resultados para ter por perto e reutilizar em diversos pontos da aplicação. Uma view é um mecanismo para armazenarmos e reutilizarmos essas consultas úteis como se fossem tabelas normais. Assim, a complexidade subjacente da consulta fica escondida de nós, e podemos simplesmente selecionar as colunas dessa tabela virtual. Views não podem aceitar parâmetros. Se você precisar que sua consulta aceite parâmetros, tem que criar uma stored procedure para ela. A figura 4 mostra a consulta do exemplo 3 criada como uma view. A figura 5 exibe os resultados da execução de uma consulta usando a view. Note como ela se parece com uma consulta a qualquer tabela normal.
Próximos passos
Esse artigo apresentou alguns dos recursos das stored procedures, triggers e views do MySQL 5. Os exemplos tentam passar uma idéia sobre a utilidade (ou não) desses recursos para os seus esforços de desenvolvimento de software. Não se esqueça que, afinal de contas, as stored procedures são somente consultas SQL. Se você escrever SQL ineficiente em seu programa, provavelmente ainda terá consultas SQL ineficientes em suas stored procedures. Os recursos apresentados são completamente novos no MySQL, mas quem já trabalhou com stored procedures em outros bancos de dados, como Oracle, DB2 e PostgreSQL, provavelmente se interessará mais pelas diferenças entre a implementação no MySQL e as outras. A linguagem procedu-
ral do MySQL ainda não está finalizada. As próximas versões do MySQL 5 (a 5.1 estava próxima da liberação geral quando este artigo foi escrito) e talvez o MySQL 6 devem aumentar o conjunto de recursos consideravelmente, e também melhorar algumas áreas onde a implementação do MySQL está pior que a dos adversários. Uma avaliação gentil da documentação [9] dos novos recursos do MySQL no site diria que ela é, no máximo, adequada. Porém, diversos livros estão sendo publicados pela MySQL Press e outras editoras, mostrando mais detalhes dos novos recursos. ■
NOME DA SEÇÃO
O exemplo 3 mostra um trigger acionado após cada atualização. A palavra-chave NEW se refere aos novos valores da linha, da forma como estão após o término da atualização. A palavra-chave OLD também está disponível, e contém os valores da linha da forma como estavam antes de uma atualização ou remoção. Para o arquivamento, por exemplo, você pode inserir os valores antigos da linha numa tabela de arquivamentos para acesso a dados de histórico. Para auditoria, você pode inserir tanto valores antigos quanto novos numa tabela de trilhas de auditoria. Também é possível acionar um trigger antes de uma atualização, inserção ou remoção. Isso pode ser útil quando você quiser modificar os valores NEW da coluna, por exemplo, para validação.
O autor Larkin Cunningham ama programas de código aberto. Começando em breve um doutorado, Larkin atualmente trabalha com Oracle PL/SQL e Java, mas encontra tempo para se aventurar em tudo relacionado a Linux. Ele pode ser contactado em larkin.cunningham@gmail.com.
Mais Informações [1] MySQL 5.0 Community Edition: http://www.mysql.com/ products/database/mysql/ community_edition.html [2] Centro de tecnologia PL/SQL da Oracle:
http://www.oracle.com/ technology/tech/pl_sql/ index.html [3] Mapeador Hibernate Objetorelacional para Java e .NET:
http://www.hibernate.org/ [4] Mapeador ActiveRecord Objeto-relacional para Ruby:
http://rubyforge.org/ projects/activerecord/ [5] Uma publicação sobre o ANSI SQL: http://www.sigmod.org/ sigmod/record/issues/0403/ E.JimAndrew-standard.pdf [6] Navegador de consultas do MySQL: http://www.mysql.com/ products/tools/query-browser/ [7] phpMyAdmin: http://sourceforge.net/ projects/phpmyadmin [8] Extensão mysqli para PHP: http://www.php.net/mysqli [9] Documentação online escassa sobre stored procedures do MySQL:
http://dev.mysql.com/doc/ refman/5.0/en/ stored-procedures.html
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
41
Indexação de Textos com o Tsearch 2
CAPA
Busca bonita e veloz Vamos realizar buscas em um portal jornalístico fictício para verificar a necessidade da indexação de textos e de outros recursos oferecidos pelo módulo Tsearch2 do PostgreSQL. por Nabucodonosor Coutinho Costa
S
e você já tem o ambiente de de- taremos essa pasta apenas como Dosenvolvimento LAMP instalado e cumentRoot. Agora vamos acessar nossa página configurado, e tem também instalado o PostgreSQL em sua máquina, só de teste pelo navegador, e conferir se o nos falta configurar o PHP para carregar PHP carregou o módulo de acesso ao PostgreSQL. Abra seu navegador e acesse a extensão php_psql.so. Se você instalou o PHP a partir do có- http://localhost/teste.php, e verifique as digo-fonte, é necessário rodar novamente informações sobre o módulo, que devem o configure com a opção --with-pgsql e ser semelhantes à figura 1. informar o caminho para a instalação do PostgreSQL, ou instalar pelo gerenciador de pacotes da sua distribuição. Em seguida, você deve editar seu arquivo php. Vamos agora criar uma base de dados ini, que se localiza em /etc ou /usr/local/ chamada linux_magazine, na qual criareetc, dependendo da forma de instalação mos a nossa tabela de notícias. usada, e descomentar a linha:
Nossa base de dados
extension=php_pgsql.so
(coutinho@coitada - ~ @21:26:10) 0: psql -U postgres Welcome to psql 8.1.4, the PostgreSQL ➥ interactive terminal.
Com isso, seu ambiente de desenvolvimento estará pronto. Agora, é só reiniciar o Apache e verificar se a extensão foi carregada. Para isso, criaremos a boa e velha página de informações com o seguinte código:
Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon ➥ to execute query \q to quit
<?php phpinfo(); ?>
postgres=# create database linux_magazine; CREATE DATABASE postgres=#
Salve essa página com o nome teste. php dentro do diretório que está sendo servido pelo Apache. Se você se esqueceu, ou não sabe qual é esse diretório, veja a diretiva DocumentRoot em seu /etc/httpd.conf. A partir de agora, tra-
Conectando ao banco de dados ➥ linux_magazine: \c linux_magazine; You are now connected to database ➥ “linux_magazine”. linux_magazine=#
Gaston THAUVIN – www.sxc.hu
Agora vamos criar a tabela de notícias executando a seguinte definição SQL: linux_magazine=# linux_magazine(# linux_magazine(# linux_magazine(# linux_magazine(# CREATE TABLE linux_magazine=#
CREATE TABLE news ( id serial primary key, title varchar, content text );
Nossa tabela fica assim: linux_magazine=# \d news Table “public.news” Column | Type | Modifiers ---------+-------------------+------------id | integer | not null default ➥ nextval(‘news_id_seq’::regclass) title | character varying | content | text | Indexes: “news_pkey” PRIMARY KEY, btree (id)
Para os marinheiros de primeira viagem no PostgreSQL, o primeiro campo da nossa tabela é do tipo inteiro e será numerado de forma seqüencial e automática pelo PostgreSQL. Precisamos agora inserir alguns dados em nossa tabela, para depois simularmos nosso sistema de busca. INSERT INTO news (title, content) VALUES ( ‘Python e PostgreSQL’, ‘É possível escrever funções em python ➥ dentro do PostgreSQL’ ); ➧
http://supertuxbr.blogspot.com 42
http://www.linuxmagazine.com.br
PostgreSQL | CAPA
INSERT INTO news (title, content) VALUES ( ‘Ruby’, ‘Após o “Ruby on Rails” a linguagem Ruby ➥ vem se popularizando’ ); INSERT INTO news (title, content) VALUES ( ‘O elefante que fala sua língua’, ‘No postgreSQL é possível desenvolver ➥ funções em c, python, java, ruby, php, ➥ perl, tcl e em muitas outras’ );
Com isso, temos nossa tabela suficientemente populada para começarmos a brincadeira.
A página de busca
Antes de iniciarmos, é importante saber que o código HTML no exemplo 1 não é uma apologia ao esquecimento das boas práticas de programação; ele apenas tem o objetivo de ser o mais enxuto e compreensível possível. Salve esse arquivo com o nome index.php na pasta DocumentRoot. Para testar nossa busca, abra seu navegador e acesse http://localhost/.
Milagres do Tsearch2
Ainda podemos melhorar a velocidade da nossa busca. Com o módulo Tsearch2 ([1]), podemos indexar os textos de nossas notícias para que sejam encontrados mais rapidamente pelo motor de busca do PostgreSQL. Outras vantagens do uso do Tsearch2 são o uso de funções que ajudam a fazer a classificação de relevância dos resultados encontrados, de acordo com o que foi pesquisado. Outra função muito interessante é a headline, que mostra um trecho do texto onde a palavra pesquisada foi encontrada, e ainda destaca-a em negrito dentro do trecho de amostra (figura 2), como acontece em sites de busca como o Google [2].
Instalação e configuração Se você não instalou o PostgreSQL a partir do código-fonte, deve procurar o módulo Tsearch2 adequado para o tipo de instalação da sua distribuição. Se você gosta de obter o máximo em performance e ter flexibilidade para instalar novos módulos, patches etc, você provavelmente instalou a partir dos fontes. Nesse caso, existe uma pasta contrib junto com os fontes do PostgreSQL. ➧
Figura 1 Página de teste de acesso ao PostgreSQL pelo PHP.
Exemplo 1: PHP com PostgreSQL 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
index.php <html> <head> <title>Utilizando PHP com PostgreSQL</title> </head> <body> <h1>Testando uma busca no banco de dados</h1> <form method=”post”> Buscar: <input type=”text” name=”q”> <input type=”submit” value=”Buscar”> </form> <?php if ($_POST[“q”]) { echo “<br/><h2>Resultado da busca</h2>”; $conn = pg_connect(“host=localhost dbname=linux_magazine user=postgres”); $sql = “select * from news where content ilike ‘%” . $_POST[“q”] . “%’”; $dados = pg_query($sql); for ($i=0;$i<pg_num_rows($dados);$i++) { echo pg_result($dados,$i,”content”); echo “<hr/>”; } $conn = null; } ?> </body> </html>
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
43
CAPA | PostgreSQL
Na pasta contrib, temos vários módulos não oficiais, frutos de contribuições voluntárias. Temos desde utilitários para benchmarks até módulos para migração de dados. É lá que iremos encontrar uma pasta chamada tsearch2. Para instalar o Tsearch2, é só acessar a pasta, compilar e instalar: cd /usr/src/postgresql-8.1.4/contrib/ ➥tsearch2 make su make install
Depois disso, o Tsearch2 já estará instalado na sua máquina. O Tsearch é basicamente uma biblioteca de funções escritas em C e compiladas como Shared Object (.so). Quando mandamos instalar o Tsearch2, essa biblioteca foi colocada dentro da pasta lib abaixo da Figura 2 Resultado mais nítido com o destaque dos trechos de resultado. sua instalação do PostgreSQL. No meu caso, essa pasta é /usr/local/pgsql/lib. Com isso, as funções da biblioteca do Tsearch2 coloca um arquivo com exten- todos os objetos necessários para o funTsearch ficam disponíveis para o uso no são .sql dentro da pasta share/contrib da cionamento da biblioteca. PostgreSQL. No entanto, ainda é neces- instalação do PostgreSQL. linux_magazine=# \i /usr/local/ sário que essas funções sejam registradas ➥pgsql/share/contrib/tsearch2.sql # ls /usr/local/pgsql/share/contrib/ no banco de dados onde pretendemos english.stop russian.stop tsearch2.sql usar suas funcionalidades. ➥ untsearch2.sql Verifiquemos se deu certo... O Tsearch também é composto por alguns componentes personalizados comuns de bancos de dados, como tabelas, Para instalar o Tsearch2 no banco linux_magazine=# \d tipos e operadores. de dados linux_magazine que criamos, List of relations Schema | Name | Type | Owner Para registrar as funções em seu ban- usaremos o arquivo .sql fornecido pelo --------+--------------+----------+-------co de dados e criar os demais objetos, o Tsearch2 para registrar as funções e criar public | news | table | postgres
Exemplo 2: Função para popular a tabela 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21
create or replace function popula_texto(int4) returns int4 as $$ declare reg record; qtde alias for $1; i int4; begin i := 1; for reg in select * from news limit 1 offst 0 LOOP while i <= qtde LOOP insert into news (title,content,vectors) values (reg.title, reg.content, reg.vectors); raise notice ‘linha %’, i; i := i + 1; end loop; end loop; return i - 1; end; $$ language ‘plpgsql’;
Quadro 1: Criando um campo para a indexação linux_magazine=# alter table news add column vectors tsvector; ALTER TABLE linux_magazine=# create index my_full_text_index on news using gist(vectors); CREATE INDEX
public | public | public | public | public | (6 rows)
news_id_seq | sequence | postgres pg_ts_cfg | table | postgres pg_ts_cfgmap | table | postgres pg_ts_dict | table | postgres pg_ts_parser | table | postgres
Vemos na lista quatro tabelas com o prefixo pg_ts_. Essas são as tabelas de configuração do Tsearch2. Também podemos usar os comandos \dT, \do e \df para listar também os tipos, operadores e funções respectivamente, criados pelo arquivo tsearch2.sql.
Testando, configurando e testando Para ver se o Tsearch2 está funcionando corretamente no banco de dados, podemos tentar usar uma de suas funções e ver se ela retorna algo que não seja um erro:
http://supertuxbr.blogspot.com 44
http://www.linuxmagazine.com.br
PostgreSQL | CAPA
linux_magazine=# select ➥ to_tsquery(‘teste’); ERROR: could not find tsearch config ➥ by locale
Isso pode não funcionar, como foi meu caso. A maioria dos usuários terá que configurar o local e padrão do Tsearch2 antes de usá-lo, e ele deve ser o mesmo usado pelo banco de dados. O comando show exibe o local e padrão: linux_magazine=# show lc_ctype; lc_ctype ---------en_US (1 row)
Se o do Tsearch2 não for o mesmo, podemos corrigi-lo com: linux_magazine=# update pg_ts_cfg set ➥ locale = ‘en_US’ where ts_name = ➥ ‘default’;
E testá-lo novamente: linux_magazine=# ➥ select to_tsquery(‘teste’); to_tsquery -----------‘test’ (1 row)
Agora o retorno não foi um erro. Isso quer dizer que o Tsearch2 está instalado e configurado corretamente.
Índices full text
A primeira grande vantagem do uso do Tsearch2 é que ele traz uma funcionalidade que não está presente no kernel do PostgreSQL: um poderoso sistema de indexação de textos. Não é o objetivo deste artigo dar uma aula sobre o funcionamento de índices no PostgreSQL, mas vou explicar como funciona a indexação do Tsearch2. Primeiramente, criaremos um campo extra do tipo ts_vector , que é um dos tipos criados pelo tsearch. Esse campo irá guardar as palavras-chave do nosso texto em forma de vetor, que é uma estrutura rapidamente legível pelo PostgreSQL. Nosso índice trabalhará em cima desse novo campo, e não do campo com o texto real, o que nos economiza mais tempo ainda durante as buscas. O quadro 1 demonstra a criação do campo para indexação. Com as duas linhas acima, adicionamos um campo chamado vectors à tabela
news, e em seguida criamos um índice gist para esse campo. A nova estrutura
de nossa tabela agora é essa:
Análise de desempenho
Para ver se isso realmente funciona, o exemplo 2 mostra uma pequena função em plpgsql para popular a tabela automaticamente. Agora, tenho mais de 700 registros em minha tabela news. Para quem desejar usar essa função, é necessário instalar a plpgsql no banco com o comando linux_magazine=# \!createlang -U postgres plpgsql. Em seguida, chame a função, passando como argumento o número de registros a serem gerados. No exemplo abaixo, são Agora, vamos fazer o que seria nos- utilizados dez registros: so trabalho de indexação dessa tabela, depois de o Tsearch2 pegar as palavras- linux_magazine=# select * chave do campo content e colocar no ➥ from popula_texto(10); NOTICE: linha 1 campo vectors. NOTICE: linha 2 A função to_tsvector() do Tsearch2 é NOTICE: linha 3 usada para converter cadeias de caracteres NOTICE: linha 4 NOTICE: linha 5 para o tipo tsvector. Vejamos:
linux_magazine=# \d news Table “public.news” Column | Type | Modifiers ---------+-------------------+------------id | integer | not null default ➥ nextval(‘news_id_seq’::regclass) title | character varying | content | text | vectors | tsvector | Indexes: “news_pkey” PRIMARY KEY, btree (id) “my_full_text_index” gist (vectors)
linux_magazine=# select to_tsvector(‘meu ➥ nome eh coutinho’); to_tsvector -------------------------------------‘eh’:3 ‘meu’:1 ‘nome’:2 ‘coutinho’:4
NOTICE: linha 6 NOTICE: linha 7 NOTICE: linha 8 NOTICE: linha 9 NOTICE: linha 10 popula_texto -------------10
A função to_tsvector() cria um hash com as palavras do texto. É assim que pegaremos as palavras do campo content para colocá-las no campo vectors, que é o campo que indexamos.
Após atingir algo em torno de 500 registros na sua tabela, é possível ver a diferença entre fazer uma busca comum com like e uma utilizando o nosso índice:
linux_magazine=# update news set ➥ vectors=to_tsvector(content); UPDATE 3
linux_magazine=# select count(id) from ➥ news;
➧
Figura 3 Resultado da busca por “python ruby” em nosso sistema.
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
45
CAPA | PostgreSQL
count ------1376 (1 row)
Nesse exemplo, a tabela news tinha 1376 registros. Vamos ver o resultado do comando explain para uma busca comum com like: linux_magazine=# explain select * from ➥ news where content like ‘%postgresql%’; QUERY PLAN ------------------------------------------Seq Scan on news (cost=0.00..19.71 rows=1 ➥ width=100) Filter: (content ~~ ‘%postgresql%’::text) (2 rows)
Agora, a saída do comando explain para uma consulta usando a indexação:
linux_magazine=# explain select * from ➥ news where vectors @@ ➥ to_tsquery(‘postgresql’); QUERY PLAN -----------------------------------------Index Scan using my_full_text_index on ➥ news (cost=0.00..4.91 rows=1 width=100) Index Cond: (vectors @@ ➥ ‘’’postgresql’’’::tsquery) Filter: (vectors @@ ➥ ‘’’postgresql’’’::tsquery) (3 rows)
Vejam que a consulta indexada, visivelmente mais rápida, não usou o operador like com o campo content, e sim o operador @@, para verificar a ocorrência da palavra-chave php no campo indexado vectors. Podemos ver ainda, de acordo com a segunda linha do explain, que a condição de busca foi indexada.
Exemplo 3: Nossa página de busca com visual melhorado 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
<head> <title>Utilizando PHP com PostgreSQL</title> </head> <body> <h1>Testando uma busca no banco de dados</h1> <form method=”post”> Buscar: <input type=”text” name=”q”> <input type=”submit” value=”Buscar”> </form> <?php if ($_POST[“q”]) { echo “<br/><h2>Resultado da busca</h2>”; $conn = pg_connect(“host=localhost dbname=linux_magazine user=postgres”); $sql $sql $sql $sql $sql $sql $sql
= “select”; += “title,”; += “headline(content,to_tsquery(‘” . $_POST[“q”] . “’) as content,” ; += “rank(vectors, to_tsquery(‘” . $_POST[“q”] . “’)) as rank”; += “from news”; += “where content ilike ‘%” . $_POST[“q”] . “%’”; += “order by rank desc”;
$dados = pg_query($sql);
for ($i=0;$i<pg_num_rows($dados);$i++) { echo “<p><b>” . pg_result($dados,$i,”title”) . “</b><br/>”; echo pg_result($dados,$i,”content”); echo “</p>”; } $conn = null; } ?> </body> </html>
A função stat
Com o uso da função stat(text), é possível obter estatísticas das palavras por número de documentos ou por número de ocorrências por documento. Vejamos como listar as três palavras mais presentes em números de documentos: linux_magazine=# select * from ➥ stat(‘select vectors from news’) ➥ order by ndoc desc limit 3; word | ndoc | nentry ------------+------+-------postgresql | 35 | 53 python | 34 | 34 php | 5 | 296 (3 rows)
Segundo a saída do comando acima, a palavra postgresql aparece em 35 documentos (registros), totalizando 53 ocorrências distribuídas nesses 35 documentos.
A função rank
A função rank gera um número que representa a classificação do registro na nossa consulta. Por exemplo, se pesquisarmos a palavra postgresql, e um registro tiver apenas uma ocorrência dessa palavra, ele recebe um valor x de classificação. Se outro registro possuir uma quantidade maior de ocorrências de postgresql, esse outro registro recebe uma classificação maior. Com esse recurso, podemos implementar uma funcionalidade semelhante à utilizada pelo Google, ordenando os registros pela classificação e facilitando a vida do usuário. Vamos ver agora um exemplo da função de classificação rank: select title, rank(vectors, to_tsquery(‘ruby’)) ➥ as rank from news where vectors ➥ @@ to_tsquery(‘ruby’); title | rank ---------------------------------+--------Ruby | 0.0759909 O elefante que fala sua língua | 0.0607927 PostgreSQL README | 0.0607927 (3 rows)
Veja que passamos para a função rank dois argumentos. O primeiro foi o campo vectors, e o segundo foi nossa consulta, a mesma que usamos no where, e a mágica foi feita; os registros vieram ordenados
http://supertuxbr.blogspot.com 46
http://www.linuxmagazine.com.br
PostgreSQL | CAPA
pela classificação, e a notícia com o título Ruby veio em primeiro, pois sua classificação é maior que a das demais.
A função headline
id int4, title varchar, content text, rank float4 );
A função headline é bem interessante, Agora vamos fazer a função que exee seu resultado sozinho já tornaria o cutará aquela busca e nos retornará os Tsearch2 um produto bastante atraente. dados no formato especificado pelo tipo Ela traz um trecho do texto contendo a tp_search: palavra encontrada em cada documento. Esse recurso já é bem conhecido por CREATE OR REPLACE FUNCTION qualquer pessoa que utilize sites de busca ➥ my_search(varchar) RETURNS SETOF tp_search AS na Internet. $$ Vamos a um pequeno exemplo: SELECT select title, headline(content,to_tsquery(‘ruby’)), rank(vectors, to_tsquery(‘ruby’)) as rank from news where vectors @@ to_tsquery(‘ruby’) order by rank;
Essa consulta vai fazer a mesma coisa que a anterior, e vai aplicar a função headline no campo content . Testando-a diretamente no psql, o resultado vem um tanto feio, mas vamos levá-la para dentro de nossa página PHP com o formulário de busca para vermos como o resultado fica extremamente agradável.
Melhorando a busca
Vamos agora melhorar nossa feiosa página de busca. Para isso, vamos alterar o seguinte trecho de código para implementar a consulta com o Tsearch2. Nossa página deve ficar assim: Agora vamos acessar nossa página de busca novamente e, ao pesquisar por alguma palavra, vamos ver a diferença na renderização da página, principalmente o trecho do texto contendo em negrito a palavra que procuramos. Como já tínhamos implementado antes, nossa busca continua classificada.
Mais fácil
Podemos ainda escrever uma pequena função para facilitar de vez a vida do programador na hora de escrever as consultas SQL para o Tsearch2. Mas antes de criá-la, criaremos nosso tipo de dados personalizado, pois nossa função irá retornar dados nesse formato. CREATE TYPE tp_search as (
➧
id, title, headline(content,my_query) as content, rank(vectors,my_query) as rank FROM news, to_tsquery($1) AS my_query WHERE vectors @@ my_query ORDER BY rank DESC; $$ LANGUAGE ‘SQL’;
Criada a nossa função, podemos usar um SQL mais simples para fazer nossa busca com o Tsearch2: select * from my_search(‘ruby’);
Fazendo a substituição no HTML de nossa página, teremos uma redução considerável no nosso código, bem no trecho que conecta ao banco de dados e faz a pesquisa: ... $conn = pg_connect(“host=localhost ➥ dbname=linux_magazine user=postgres”); $sql = “select * from my_search(‘” . ➥ $_POST[“q”] . “’)”; $dados = pg_query($sql); ...
Figura 4 Uso do operador booleano OR.
tados com uma das palavras ou com as duas palavras. Quando digitei a frase python ruby na minha página de busca, o SQL enviado ao PostgreSQL foi o seguinte: select * from my_search(‘python ruby’);
Vamos relembrar o que nossa função faz na realidade. Ela pega a cadeia de caracteres passada como parâmetro e conta ao SQL qual final será executado no banco de dados. Vejamos o SQL montado por nossa função: SELECT id, title, headline(content,my_query) as content, rank(vectors,my_query) as rank FROM news, to_tsquery($1) AS my_query WHERE vectors @@ my_query ORDER BY rank DESC;
➧
...E além
O Tsearch2 pode ir muito além. Nós ainda não fomos muito longe, já que nossa busca nem sequer aceita que digitemos mais de uma palavra para ser pesquisada. A figura 3 mostra o que acontece se você mandar pesquisar por mais de uma palavra em sua página de busca. Nesse caso, eu digitei python ruby na caixa de texto de pesquisa. Para fazermos pesquisas mais complexas, envolvendo, por exemplo, mais de uma palavra, precisaremos fazer uso dos operadores do Tsearch2. Para informar a ele se desejamos, por exemplo, resul-
Figura 5 Resultado de uma busca com o uso do operador booleano AND.
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
47
CAPA | PostgreSQL
No trecho to_tsquery($1), a variável $1 é substituída pela cadeia de caracteres que enviamos. No meu caso, esses comandos SQL foram enviados ao banco dados da seguinte forma: SELECT id, title, headline(content,my_query) as content, rank(vectors,my_query) as rank FROM news, to_tsquery(‘python ruby’) AS my_query WHERE vectors @@ my_query ORDER BY rank DESC;
O Tsearch2 gera um erro com essa busca, pois o parâmetro passado não está no formato esperado.
Operadores no Tsearch Para enviarmos consultas complexas ao Tsearch2, é necessário fazer uso de seus “operadores especiais”, os quais usamos dentro do parâmetro que passamos a ele. Por exemplo, ao digitar python ruby na caixa de texto de pesquisa, eu deveria ter levado em conta se eu desejava que o resultado contivesse ambas as palavras ou qualquer uma delas. Vamos supor que queiramos pesquisar textos que contenham qualquer uma das palavras que digitei. Para isso,
</form>
usaremos o operador OR do Tsearch2, ... que é representado pelo caractere | (barra vertical, ou pipe). Para procurar textos com a palavra Ruby ou com O trecho que foi adicionado ao formua palavra Python, teríamos que digitar lário acrescenta à página dois botões de ruby|python (figura 4). rádio, que permitem ao usuário definir Observe que com essa consulta eu o tipo de operação booleana a ser usada obtive registros que continham a palavra na consulta. Ruby ou a palavra Python. Agora precisamos alterar o códiA figura 5 ilustra a situação do ope- go PHP para substituir os espaços rador booleano AND do Tsearch2. Nesse em branco pelo operador correto do caso, para realizar a consulta, digitei Tsearch2 na cadeia de caracteres a ser pesquisada: python&ruby. Com isso, obtive apenas os registros que contêm a palavra Python e ... a palavra Ruby. $conn = pg_connect(“host=localhost ➥ dbname=linux_magazine user=postgres”);
Operadores na página Vamos mexer novamente em nossa página HTML, dessa vez para inserir no formulário de busca controles através dos quais o usuário possa determinar o tipo de busca que está fazendo, e para que assim nosso sistema de busca possa saber qual operador do Tsearch2 deve ser usado. Nosso formulário ficará assim: ... <form method=”post”> Buscar: <input type=”text” name=”q”> <input type=”submit” value=”Buscar”><br/> <input type=”radio” name=”op” ➥ value=”or”>Uma ou outra <input type=”radio” name=”op” ➥ value=”and”>Todas as palavras
if ($_POST[“op”] == “or”) { $query = str_replace(‘ ‘,’|’,$_POST[“q”]); } else { $query = str_replace(‘ ‘,’&’,$_POST[“q”]); } $sql = “select * from my_search(‘” . ➥ $query . “’)”; $dados = pg_query($sql); ...
O resultado final de nossa página seria igual ao da figura 6.
Conclusão
➧
Esse minissistema de busca ilustrou como o Tsearch2 traz, além da indexação de textos, diversos outros recursos, os quais tornam o PostgreSQL ainda mais interessante para o desenvolvimento Web. Além do que foi apresentado neste artigo, o Tsearch2 possui ainda recursos de dicionário de idiomas e de sinônimos, que podem ser usados para tornar seu sistema de busca ainda mais útil no diaa-dia, mais interessante e mais parecido com grandes sistemas de busca como Google e Altavista. ■
O autor Nabucodonosor Coutinho Costa é administrador de bancos de dados PostgreSQL e pode ser contactado pelo email coutinho.php@gmail.com
Mais Informações [1] Página do Tsearch2: http://www.sai.msu.su/~megera/ postgres/gist/tsearch/V2/ Figura 6 Nossa página de busca, com botões de rádio que permitem definir o tipo de busca.
[2] Google :http://www.google.com
http://supertuxbr.blogspot.com 48
http://www.linuxmagazine.com.br
CAPA
Integrando o banco de dados ao servidor Web
Para dar liga De nada adianta ter um banco de dados e um servidor Web se não houver algo para integrá-los. O PHP é a linguagem preferida de muitos webmasters, e atualmente é uma das estrelas do código aberto no mundo. por Rúben Lício
E
m 1995, Rasmus Lerdorf achou que seria interessante ter estatísticas geradas de forma dinâmica em seu currículo online. Para isso, criou um sistema de scripts simples e veloz, capaz de realizar somente algumas funções básicas, a fim de atender às suas necessidades. Logo percebeu as possibilidades que isso lhe proporcionava, e começou a aperfeiçoar o script, com diversos recursos. Rasmus necessitava de cada vez mais tempo para adicionar recursos e ajustar os já existentes, quando pensou que seria muito mais fácil se houvesse pessoas colaborando no desenvolvimento. Decidiu abrir o código-fonte do PHP/FI (que teve seu nome mudado para PHP na versão 3). Desde então, diversas pessoas ao redor do mundo começaram a contribuir e usar essa (então) nova linguagem. A decisão de abrir o código-fonte fez com que o PHP crescesse de forma muito rápida. Hoje em dia, o PHP é uma das linguagens de script mais fáceis de se aprender, e também uma das mais usadas. A evolução do código-fonte pode ser vista em [1], e a história completa em [2]. O PHP, por si só, é apenas um interpretador de scripts, sendo necessário um servidor web para que ele seja visto
no navegador. Neste artigo, usaremos como exemplo o Apache 2.2 como servidor web e o MySQL 5.1 como servidor de banco de dados.
Scripts mais seguros
Após seguir as instruções do quadro Apache mais seguro, o usuário do Apache será www, e os arquivos do servidor web terão permissão de leitura para esse usuário, a fim de serem processa-
dos pelo servidor. Podemos atribuir 444 como permissão para todos os arquivos abaixo de htdocs, ou, para maior segurança, mudar o usuário e grupo dos arquivos para www e atribuir 400 como permissão a eles. chown www.www /usr/local/apache/htdocs/ -R chmod 400 /usr/local/apache/htdocs -R
Lembre-se que, caso o usuário do Apache não tenha permissão
Apache mais seguro Por padrão, o Apache rodará sob o usuário root, o que não é seguro, pois se alguém conseguir invadir o sistema através do Apache, terá acesso irrestrito ao sistema. Para resolvermos isso, basta adicionarmos um usuário e grupo exclusivos para o daemon do Apache:
# groupadd www www # useradd -g www www Depois, altere o seu arquivo httpd.conf, onde provavelmente já há um usuário e um grupo ativados. Troque-os pelo usuário e grupo que adicionamos acima desta forma:
User www Group www Pronto, agora tudo que o Apache fizer no seu sistema será como usuário www, impedindo assim que ele faça qualquer estrago no sistema.
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
49
CAPA | PHP
para ler seus scripts, isso causará um erro na hora de requisitá-los no navegador. Para mais informações sobre o Apache, a documentação oficial pode ser obtida em [3].
Instalando o PHP 5.1
var o suporte a MySQL e MySQLi. A MySQLi é uma biblioteca mais recente e mais rápida, e por isso seu uso é recomendado, no lugar da antiga MySQL. ./configure \ --with-apxs2=/usr/local/apache/bin/apxs \ --enable-cli \ --with-mysql=/usr/local/mysql/bin \ --with-mysqli=/usr/local/mysql/bin/ ➥mysql_config
A última versão do PHP está disponível em [6]. Compilaremos nosso PHP manualmente, usando a versão bz2 do código-fonte. Descompacte o arquivo O PHP necessita de um programa baixado com tar -jxf php-5.1.4.tar.bz2, chamado Flex [7] para ser compilado. e depois entre no diretório criado com Caso a configuração peça, você pode cd php-5.1.4. instalá-lo usando apenas ./configure && Configure-o para ser um módulo make && make install. Agora que o PHP já está configurado, dinâmico do Apache com a opção -with-apxs2 , e também para poder ser basta compilarmos e instalarmos: executado por linha de comando, com --enable-cli , e ainda para ati- make && make install
Para quem usa distribuições baseadas no Debian, é possível instalar tudo com um único comando: apt-get install mysql-client mysql-server ➥ apache2 libapache2-mod-php5 php5 ➥ php5-mysql php5-cli
Esses pacotes estão em praticamente qualquer repositório do Debian. Todavia, caso você não os encontre, procure em [8].
Apache, esse é o PHP
Por si só, o Apache não interpreta nativamente a extensão .php. Temos que fazer isso manualmente. Edite o arquivo httpd.conf, adicionando ao final do arquivo a linha:
Instalação e segurança do MySQL 5.1 O MySQL 5.1, que está na versão beta no momento da escrita deste artigo, pode ser baixado em [4]. A versão binária se encontra no final da página. Com o arquivo no formato tarball em mãos, entre no diretório onde foi baixado o arquivo e execute:
Com o usuário criado, já se pode iniciar o servidor rodando sobre ele da seguinte forma: # /usr/local/mysql/bin/./mysqld_safe --user=mysql
# cd mysql-5.1.11-beta
Outra opção é especificar o usuário mysql como padrão no arquivo de configuração do MySQL. Para isso, só precisamos acrescentar a linha à sessão [mysqld] de /etc/my.cnf:
# ./configure --prefix=/usr/local/mysql
user=mysql
# make
Podemos também tornar os dados físicos mais seguros, mudando o usuário e grupo para mysql. Dessa forma, apenas o daemon será capaz de acessar seus dados:
# tar -zxf mysql-5.1.11-beta.tar.gz
# make install Utilizamos apenas a opção --prefix para definir o local onde os binários serão instalados. Com o MySQL instalado, devemos criar o arquivo de configuração: # cp support-files/my-medium.cnf /etc/my.cnf Para que o servidor funcione corretamente, precisamos instalar um banco de dados para configurações dos demais bancos do seu servidor. Esse banco por padrão se chama mysql. # /usr/local/mysql/bin/./mysql_install_db Para iniciar o banco de dados para testes, use: # /usr/local/mysql/bin/./mysqld_safe Caso não tenham ocorrido problemas, o MySQL deve estar ativo. Para confirmar, use os seguintes comandos:
# chown -R root.mysql /usr/local/mysql # chmod -R o-rwx /usr/local/mysql Ainda temos brechas de segurança com relação aos usuários do MySQL, já que, por padrão, nem mesmo o usuário root possui senha. Entre no prompt do MySQL e digite: mysql> DELETE FROM mysql.user WHERE User = ‘’; mysql> FLUSH PRIVILEGES; mysql> SELECT Host, User FROM mysql.user; mysql> SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘rootlocalhost’); mysql> SET PASSWORD FOR ‘root’@’192.168.0.2’ = PASSWORD(‘rootoutropc2’);
$ mysql -uroot
mysql> FLUSH PRIVILEGES;
mysql> show databases;
Note que root recebeu senhas diferentes para localhost e 192.168.0.2. O MySQL permite que você atribua senhas diferentes para o mesmo usuário, de acordo com a máquina de origem da requisição. Note também que você pode trocar o usuário root por qualquer outro nome de sua preferência, tornando mais difícil uma possível tentativa de invasão.
Isso mostrará as bases de dados existentes no seu servidor. É importante que haja um banco com o nome mysql: lembre-se que ele é usado pelo próprio MySQL para configurar os usuários, entre outras coisas. Se não estiver corretamente instalado, o funcionamento de todo o servidor MySQL ficará comprometido. Use quit para sair do console do MySQL. O daemon do MySQL por padrão roda sob root. Devemos começar criando um usuário só para executar o servidor MySQL: # groupadd mysql # useradd -g mysql mysql
Depois desses comandos executados, tente entrar novamente usando o comando mysql -uroot. Você verá que ele vai negar seu acesso. Agora você irá necessitar de senha toda vez que entrar no MySQL, como no exemplo: mysql -u root -p rootlocalhost Para maiores informações sobre o MySQL, pode-se acessar a documentação oficial em [5].
http://supertuxbr.blogspot.com 50
http://www.linuxmagazine.com.br
PHP | CAPA
AddType application/x-httpd-php .php
Caso você queira, também é possível especificar a extensão .html como um script PHP. Entretanto, lembre-se que isso fará com que o Apache passe a interpretação de todos os arquivos HTML para o PHP, o que provavelmente será um desperdício de recursos do sistema. Uma dica adicional é incluir também a extensão .inc aos arquivos interpretados pelo PHP, a fim de garantir a segurança para alguns desenvolvedores que usem esses arquivos de inclusão.
Estrutura MVC
O MVC (Model-View-Control) é uma forma de organização de código que promove uma separação da estrutura de uma aplicação qualquer em três partes principais. Essas partes são: a regra de negócios (Model), a interface da aplicação (View) e o controle da execução (Control). Isso significa que cada classe deve se limitar exclusivamente àquilo que se propõe a fazer, mantendo tudo em seu contexto a fim de tornar transparente a localização de cada parte do código. Isso possibilita que se mude uma das camadas do seu sistema sem que as demais parem de funcionar. Além disso, esse recurso
fornece as bases para que o código seja construído por diversas pessoas ao mesmo tempo, sem que elas se preocupem tanto com a comunicação. Vamos ver uma definição mais exata de cada camada: ➧ View: É toda a interface do sistema, podendo ser tanto para pessoas quanto para outros programas (API). Exemplificando, um sistema pode ter uma interface por linha de comando, uma por Web e outra por Web-service em XML. Temos então o mesmo sistema com três interfaces diferentes, uma independente da outra, e todas independentes da regra de negócios e do fluxo de execução. Essa camada deve saber como apresentar
Exemplo 1: A classe controladora da operação de login. 01 <?php 02 03 class LoginController 04 { 05 private $view = null; 06 private $model = null; 07 08 function __construct($acao) 09 { 10 $this->view = new LoginView(); 11 $this->model = new LoginModel(); 12 13 if (method_exists($this, $acao)) 14 $this->{$acao}(); 15 else 16 $this->loginForm(); 17 } 18 19 public function validarLogin() 20 { 21 global $_POST; 22 23 $dados = $_POST; 24 $resultadoValidacao = $this->model->validaUsuario($dados); 25 if ($resultadoValidacao) { 26 // Redireciona para pagina interna do sistema 27 } else { 28 $this->loginForm(); 29 } 30 } 31 32 public function loginForm() 33 { 34 $this->view->formLogin(); 35 } 36 37 public function cadastrarLoginForm() 38 { 39 $this->view->formNovoUsuario(); 40 } 41 42 public function alterarLoginForm() 43 { 44 global $_GET; 45 46 $idUsuario = $_GET[‘idu’]; 47 48 $dados = $this->model->recuperarUsuario($idUsuario);
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
$this->view->formEditarUsuario($dados); } public function alterarLogin(); public function cadastrarLogin(); } $lg = new LoginController($_GET[‘acao’]); ?> <?php class LoginModel { private $link = null; public function __construct() { $this->link = mysqli_pconnect(‘localhost’,’root’,’rootlocalhost’); mysqli_select_db($this->link, ‘mvc’); } public function validaUsuario($dados) { $sql = ‘SELECT count(*) as total FROM usuarios WHERE usuario = “’.$dados[‘usuario’].’”’ .’ AND senha = “’.$dados[‘senha’].’”’; $query = mysqli_query($this->link, $sql); $row = mysqli_num_rows($query); if ($row == 1) return true; else return false; } public public public public public
function function function function function
inserirUsuario($dados); alterarUsuario($dados); listarUsuarios(); deletarUsuario($idUsuario); recuperarUsuario($idUsuario);
} ?>
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
51
CAPA | PHP
Figura 1 Três camadas distintas para o processamento do login de um usuário, de acordo com a estrutura MVC.
nosso sistema para quem o acessar, nada mais que isso. ➧ Model: Define o que o sistema vai fazer e como vai fazer, ou seja, as regras de negócio do sistema. Por exemplo, nosso sistema pode cadastrar, editar ou deletar um registro, gerar um relatório dos últimos dez registros modificados, adicionados ou deletados, contar visualizações de cada registro etc. O sistema fará isso através de um banco de dados. Todo cadastro terá de ser enviado também por e-mail para xxxx@site.com.br, junto com um relatório dos últimos visitantes. Podemos ter inúmeros recursos, independentemente da forma como será a interface e do momento em que será executado. Essa camada deve saber somente como executar cada recurso do sistema. ➧ Control: faz o controle entre o usuário, as Views e o Model. Por exemplo, nosso usuário acabou de entrar no sistema. O controle é acionado e verifica que a ação pertinente é exibir o formulário de login. O controle não sabe como fazer isso, somente sabe o que tem que fazer, e então chama a View, que sabe como exibir o formulário de login. O usuário tenta fazer um login, e o controle sabe que, quando isso acontece, tem que verificar com o Model se ele foi bem sucedido. Em caso de sucesso, o usuário deve ser redirecionado para a página inicial do sistema; caso negativo, uma tela de erro deve ser exibida. O Control deve saber apenas as possíveis ações a serem executadas, e não como elas serão implementadas. A implementação fica a cargo da View e do Model.
Isso não significa que devamos simplesmente tentar dividir um módulo em três arquivos, ou três classes, ou algo do tipo. A divisão requer no mínimo três camadas pois, sem elas, não teríamos um MVC.
Projetos grandes com PHP e MVC Na nossa aplicação do exemplo 1, usaremos três classes, divididas em três arquivos. Não será uma aplicação completa. Há muitas camadas que podem ser implementadas, as quais mencionarei posteriormente. Por questões didáticas, não as implementaremos agora. Na figura 1, podemos ver um diagrama das três classes exemplificadas. Nosso sistema de exemplo servirá para demonstrar como funciona um MVC em PHP. Não me aprofundarei em como funciona o PHP, nem tampouco em como fazer sua programação específica. O sistema funcionará da seguinte forma: toda vez que for iniciado, será instanciada a classe de controle, e a ação será passada como argumento. O construtor da classe de controle receberá essa ação e tentará achar um método nela mesma referente a essa ação. Caso esse método exista, receberá do construtor o controle; caso não exista, mostraremos o método padrão, que é loginForm(). Poderíamos ter disparado um erro ou registrado a ação inválida para que fosse analisada mais tarde. A divisão de ações foi feita propositadamente dessa forma para demonstrar uma das melhores práticas em programação orientada a objetos, que é a definição de cada método como algo extremamente
específico, sendo preferível que não faça nada além de uma ação absolutamente específica, e não fuja de forma alguma do contexto para o qual se destina. Isso promove uma reutilização de código muito maior, por evitar métodos muito amplos, que fazem tantas coisas que acabam sendo inutilizáveis em outras situações. Quando um método é decomposto em vários métodos pequenos e específicos, podemos, caso não consigamos reaproveitar o método principal, construir um semelhante que reutilize todos os pequenos métodos, ou boa parte deles. Isso também evita a duplicidade de código, auxiliando assim a manutenção dos scripts. Como exemplo, vamos examinar nossa classe de controle. Veja que no método validarLogin(), quando é retornado que o login é inválido (falso), nós exibimos o formulário novamente, através do método loginForm(), que é o mesmo usado quando iniciamos o sistema. Poderíamos ter apenas copiado o conteúdo do método, que aparentemente jamais necessitará de algo mais que isso. Entretanto, da forma como fizemos, caso precisemos mudá-lo por algum motivo (por exemplo, nosso formulário usa um outro método para exibi-lo), podemos trocar somente um lugar, sendo que o restante continuará funcionando normalmente. Outro exemplo é nossa classe de Model. Suponha que queiramos validar os dados antes de enviá-los para o banco. Construiríamos um método que validasse os dados, e o usaríamos tanto no método inserirUsuario() quanto no alterarUsuario(). Ambos teriam as mesmas funcionalidades, sem qualquer duplicidade de código. Outro ponto importante é a forma como foi modelada a controladora. Veja que o construtor recebe a ação ao invés de recuperá-la por POST ou GET. Isso foi feito justamente para maximizar a reutilização de código! Se tivessem sido usados POST, GET ou qualquer outra forma direta de recuperar a ação, ficaríamos limitados a essa forma. O jeito utilizado torna a classe transparente ao resto do sistema (ou sistemas), podendo utilizá-la em diversos sistemas diferentes, sem ter que alterar nenhuma linha. Posso ter num sistema uma chamada de ação por GET, enquanto em outro a chamada ocorre por um web-service (que é chamado pelo cliente), e num terceiro sistema a ação é definida por um arquivo XML. Qualquer que seja o método específico do sistema, a classe não será alterada. Isso se torna muito importante para a construção de grandes sistemas, pois facilita
http://supertuxbr.blogspot.com 52
http://www.linuxmagazine.com.br
PHP | CAPA
enormemente a manutenção. Esse é um mentação, diretamente, nela própria, dos métodos mais utilizados para criar eliminando assim a necessidade de mais classes abstratas, pois podemos atualizar uma classe e mais um arquivo. A razão uma classe sem interferirmos no funcio- é a facilidade na manutenção e até na namento do resto do sistema. criação dessa classe: Note também que existe um método ➧ Na criação, por possibilitar o desenvolvimento simultâneo por mais de uma correspondente a cada ação possível, que pessoa na controladora, nas Views e no será chamado de acordo com a ação informada. Isso foi feito para podermos adicionar Model; também individualmente em recursos a essa classe sem termos que alterar cada uma dessas classes, por manter um o construtor, podendo tratar cada ação de contexto menor, tornando mais claro e rápido o desenvolvimento. O Model forma inteiramente personalizada. Além disso tudo, temos o contexto bem só terá as regras de negócio, não sendo explícito. Veja que a controladora não faz necessário se preocupar em como será absolutamente nada além de delegar as exibida a informação, nem em como ações pertinentes às classes de Model e será feito o controle do fluxo. View; podemos a qualquer hora trocar o ➧ Na manutenção, por ser muito mais fácil e rápido mexer em arquivos pequenos e, Model, ou o View, sem deixarmos que principalmente, porque podemos mudar nossa controladora pare de funcionar. A classe Model cria uma conexão com todas as regras de negócio do sistema, o banco de dados ao ser instanciada. Isso sem alterar absolutamente nada na serve apenas para demonstrar uma forma View e na controladora. Imagine, por de fazer, pois, numa aplicação real, é reexemplo, que nosso cliente não queira comendado que nunca se utilize acesso mais que os dados de administradores estejam alocados em um banco de dados, direto ao banco de dados. Você pode usar alguma classe de abstração de dados e sim num arquivo XML; poderíamos pronta como pear::MDB2 [9]. criar uma outra classe model específica Talvez você esteja em dúvida a respara XML, e mudar a controladora peito da implementação, na classe mopara chamar a nova classe. Nossa andel, de métodos muito similares aos da tiga classe continuaria lá e poderia ser controladora, ao invés de fazer a impleutilizada em outro projeto, ou mesmo
nesse, caso o cliente mudasse de idéia novamente. Nessa última hipótese, gastaríamos poucos minutos para voltar tudo para a forma anterior, já que só precisaríamos mudar a controladora para chamar novamente o Model do banco de dados. ■
Mais Informações [1] Museu PHP: http://museum.php.net [2] História do PHP e projetos relacionados:
http://php.net/history [3] Documentação do Apache 2.2: http://httpd.apache.org/ docs/2.2/ [4] MySQL 5.1: http://dev.mysql.com/ downloads/mysql/5.1.html [5] Documentação do MySQL: http://dev.mysql.com/doc/ [6] Código-fonte e binários do PHP: http://www.php.net/downloads.php [7] Flex: http://flex.sourceforge.net/ [8] Apt-get: http://apt-get.org [9] MDB2: http://pear.php.net/ package/MDB2
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
53
Área de trabalho dedicada com Pessulus e Sabayon
ANÁLISE
Sob encomenda A versão 2.14 do Gnome inclui novos recursos para restringir o acesso do usuário ao sistema. Os editores Pessulus e Sabayon vão direto ao ponto e auxiliam a administração das restrições dos usuários. por Carsten Schnober
R ich
S ard
–w
. s xc ww
.hu
O
modo kiosk do KDE auxilia ad- gerenciados pelo sistema gconf. Na ini- /desktop/gnome/lockdown na árvore XML do ministradores a restringir o uso cialização do Gnome, esses arquivos são Gconf, e podem desativar, por exemplo, de computadores públicos a um examinados em busca das configurações o atalho de teclado [Alt]+[F2] para chanavegador ou a um aplicativo específico. padrão do sistema, que geralmente ficam mar a linha de comando, ou bloquear a Neste cenário, o usuário fica limitado à em /etc/gconf, embora o Suse utilize o impressora, ou negar o acesso à gravação linha de comando ou a um pequeno con- /etc/opt/gnome/gconf. Depois, o Gnome no disco rígido. junto de aplicativos. O editor de restrições adiciona os arquivos do diretório .gconf Caso seja necessário, o painel do GnoPessulus [1] e o editor de perfis Sabayon logo abaixo do home do usuário. Como de me também pode ser restrito. O Gconf [2] oferecem benefícios semelhantes para costume, as preferências do usuário têm então proibirá os usuários de modificarem o ambiente Gnome. prioridade sobre os padrões do sistema. a configuração padrão do painel em qualDesde a versão 2.0, o Gnome guarda O Gconf também permite que os ad- quer aspecto, ou então vai impedi-los de suas configurações em arquivos XML ministradores do sistema definam chaves adicionar ou remover applets individuais. do Gconf, as quais não Além disso, o Gnome 2.14 dá aos adminispodem ser sobrescritas tradores a capacidade de impedir que os pelos usuários. A maioria usuários saiam da sessão do Gnome ou das distribuições coloca travar a tela automaticamente quando o essas chaves, chamadas protetor de tela for ativado. de mandatórias, em /etc/ gconf/gcon.xml.mandatory. Até hoje, as chaves mandatórias sempre ajuda- Editar arquivos XML com um editor de ram os administradores texto não é visto por todos como diversão, a definir a aparência do e o editor do Gconf tem a reputação de desktop, desde o menu, ser pouco intuitivo. Existe um front-end passando pelo papel de em Python para essa tarefa, chamado parede, até a configu- Pessulus, que pode ser de grande ajuda. ração de aplicativos in- (figura 1). O Pessulus fornece uma interface útil dividuais. A versão 2.14 do Gno- para as funções de restrição discutidas me adiciona novas cha- acima. Você pode clicar para selecioves de restrição ao Gconf, nar uma função para negar o acesso dos impedindo o acesso de usuários. Na seção Painel, você simplesusuários a aplicativos in- mente seleciona os applets visíveis para O editor de restrições Pessulus ativa chaves do gconf para negar funções dividuais. Essas chaves os usuários a partir de uma lista de apespecíficas do Gnome aos usuários. ficam armazenadas sob plets instalados.
Conveniência
Figura 1
http://supertuxbr.blogspot.com 54
http://www.linuxmagazine.com.br
Sabayon e Pessulus | ANÁLISE
O Pessulus também pode configurar o navegador Web padrão do Gnome, o Epiphany. Pode-se mandar o Epiphany restringir algumas funções, tais como Javascript, e bloquear protocolos específicos. Se necessário, os administradores podem até impedir que os usuários saiam do Epiphany, ou forçar o modo de tela cheia do navegador para converter um desktop completo numa simples estação de navegação para uso como quiosque. Quando o Pessulus é iniciado com permissões de usuário normal, é possível aplicar restrições à conta atual. Essa abordagem pode parecer bastante inútil a princípio, já que o usuário poderia simplesmente desfazer as alterações, mas ela é efetiva se o Epiphany só estiver disponível em modo de tela cheia e o acesso a todos os outros programas for negado.
Perfis
Os administradores que quiserem dar privilégios diferentes a usuários distintos acharão o Sabayon uma ferramenta ainda mais poderosa para configurar o Gnome (figura 2). O programa inicia uma sessão do Gnome em uma janela XNest, onde o administrador pode modificar várias configurações para fazer o ajuste fino do ambiente. Todas as ferramentas normais de configuração do Gnome estão disponíveis, o que significa que você pode definir itens do menu ou o papel de parede exatamente como numa seção normal. Além disso, o Sabayon integra o Pessulus para aplicar suas restrições. Após configurar um ambiente que lhe agrade, você pode salvar o desktop num perfil, e depois associar o perfil a contas de usuários para aplicá-lo a uma sessão do Gnome quando um usuário fizer login. O Sabayon não utiliza a configuração do Gconf. Em vez disso, ele armazena quaisquer perfis de áreas de trabalho que você criar como arquivos ZIP num diretório próprio – /etc/desktop_profiles por padrão, embora o caminho possa variar dependendo da distribuição. Os arquivos contêm todos os arquivos de configuração do Gnome diferentes dos padrões do sistema, isto é, os dois arquivos XML do Gconf e os arquivos adicionados ao desktop. Quando um usuário inicia uma sessão do Gnome, o Sabayon aplica as configurações guardadas no perfil desse usuário. O arquivo com a configuração do perfil tem o nome de acordo com o perfil, se-
Figura 2 O Sabayon cria perfis de áreas de trabalho que pré-configuram e restringem sessões do Gnome para os usuários aos quais elas estão associadas. Os administradores usam uma janela XNest para definir as configurações.
guido da extensão .zip. Não é necessário iniciar uma sessão XNest para modificar as configurações do Sabayon; em vez disso, pode-se editar os arquivos do Gconf diretamente no arquivo ZIP. O Sabayon oferece mais uma abordagem para fazer modificações simples num perfil. Pressionar o botão Detalhes leva o administrador a uma lista que detalhe as diferenças de configuração entre este e o padrão; é possível apagar os itens um por um para removê-los do perfil. Há uma opção Configurações mandatórias do Gconf para chaves mandatórias e uma opção Configurações padrão do Gconf para padrões configuráveis pelo usuário. Ao apagar uma dessas entradas, todas as entradas com configurações do Sabayon para uma categoria específica serão deletadas. Outros arquivos de configuração que você tenha acrescentado ou modificado podem ser apagados individualmente.
Primeiro passo
As novas ferramentas Pessulus e Sabayon dão aos administradores a liberdade de escolher o Gnome para aplicações de quiosque. Com seu típico jeito confiante, muitos desenvolvedores do Gnome
simplesmente vêem isso como o primeiro passo em direção a preferência de desktop para os administradores. Há planos para estender os recursos do Sabayon e cooperar com o Stateless Linux [3] em algum momento no futuro. Os perfis de usuário guardariam então arquivos importantes para o usuário, os quais ficariam disponíveis através de uma rede. Independentemente de onde o usuário fizer login, ele sempre terá a mesma área de trabalho. Até agora, os desenvolvedores do Gnome se concentraram em eliminar as falhas menores no Pessulus e Sabayon. Ainda resta vermos se essas ferramentas de restrição algum dia cumprirão o prometido. Mas uma coisa é certa: O Gnome agora é uma opção para administradores que quiserem restringir o uso de computadores públicos. ■
Mais Informações [1] Pessulus: http://www.gnome.org/ ~vuntz/pessulus [2] Sabayon: http://www.gnome.org/ projects/sabayon [3] Stateless Linux: http://fedoraproject.org/ wiki/StatelessLinux
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
55
Opções de RAID para o Desktop Linux
TUTORIAL
Easy Raider
xbauerx’s – www.sxc.hu
O Linux oferece várias opções para cumprir o papel do RAID de fornecer acesso rápido e segurança aos dados do disco rígido. por Marcus Nasarek
N
os últimos 15 anos, a capacidade dos discos rígidos cresceu quase mil vezes. Há 15 anos, um disco típico tinha uma capacidade entre 300 e 500 MB, e eram tão caros quanto os atuais de 300 a 500 GB. Como atualmente computadores com dois ou mais discos tornaram-se comuns, até usuários domésticos podem pagar pela redundância de dados e o maior desempenho antes restritos aos servidores corporativos. A tecnologia que possibilita isso é conhecida como RAID. O RAID [1] foi criado há aproximadamente 20 anos pelos pós-graduandos de Berkeley David Patterson, Garth Gibson e Randy Katz. Naquela época, o RAID era a solução para um problema difícil: se você precisasse de uma grande capacidade de armazenamento, tinha que escolher usar um único disco grande, que era confiável, mas caro, ou um monte de discos menores, pouco confiáveis e significativamente mais baratos. Um problema com os discos menores era o enorme esforço de gerenciamento envolvido na troca de um disco grande único por diversos discos pequenos. O RAID era um esquema para acessar um conjunto de vários discos como uma única unidade. A solução proposta também resolvia o risco da perda de dados em caso de falha de um disco no conjunto. O artigo publicado pelos autores foi intitulado “A Case for Redundant Array of Inexpensive Disks (RAID)”. Quando o preço de discos grandes deixou de ser um problema, poucos anos depois, a palavra “Inexpensive” (baratos) foi substituída por “Independent” (Independentes). No cenário mais simples de RAID, pode-se agrupar alguns discos para formar uma única unidade, e apresentar
essa unidade à camada de aplicativos como um único disco lógico. É isso que os geeks geralmente chamam de JBOD (“Just a Bundle of Disks”, Só Um Monte de Discos). Mas o RAID pode fazer muito mais. O RAID funciona como uma camada de gerenciamento entre o sistema de arquivos e o hardware, que nos permite explorar as características físicas do conjunto de discos. Várias alternativas oferecem uma gama de soluções para melhorar o desempenho ou reduzir o risco de falhas de disco. As várias alternativas de RAID são chamadas de níveis RAID, apesar de o termo nível não ter o sentido de hierarquia; em vez disso, os diferentes níveis RAID possuem desenhos completamente diferentes. Os sete níveis RAID básicos são conhecidos como RAID 0 a RAID 7. Veja o quadro Níveis RAID para mais informações sobre as alternativas de RAID.
Desempenho com Striping O striping (RAID 0) envolve juntar discos e utilizá-los em blocos. Quando um aplicativo precisar gravar dados, o controlador RAID distribui a carga por todos os discos. Do ponto de vista técnico, o controlador simplesmente despeja os dados no cache do disco rígido e parte para o próximo disco. Quando o controlador falar novamente com o primeiro disco, esse já terá tido tempo para finalizar a tarefa e já deve ter os resultados prontos para o controlador acessar. Se você usar dois discos, os tempos de acesso teoricamente devem ter o dobro da velocidade.
Obviamente, o RAID 0 não distribui os dados caractere por caractere; em vez disso, ele usa blocos de dados com uma certa granularidade de separação. A probabilidade de falha aumenta conforme a adição de discos ao conjunto. Assim, o RAID 0 é recomendado somente para sistemas onde a velocidade seja muito mais importante que a redundância.
Segurança no espelhamento O espelhamento (RAID 1) é exatamente o contrário do striping. Ele usa os discos em séries, e grava os dados em cada disco do conjunto. Em outras palavras, o RAID 1 espelha os dados. Entretanto, armazenar cópias idênticas dos dados em cada disco rígido significa que a capacidade total do conjunto não será maior que a de um disco sozinho. Se você usar dois discos de 200 GB, a capacidade líquida será de somente 200 GB, e não 400. Apesar de o tempo de acesso de gravação não ser diferente daquele para um disco sozinho, o acesso de leitura é bem mais rápido, pois o controlador consegue ler de ambos os discos em paralelo, justamente como em RAID 0. A grande vantagem do RAID 1 é que, se um disco falhar, os dados ainda ficarão disponíveis no outro disco. Todavia, isso só se aplica a defeitos físicos: erros lógicos, como apagar, modificar ou sobrescrever arquivos do sistema de arquivos, são espelhados para o outro disco em tempo real. Em outras palavras, o RAID 1 não protege contra erro humano ou falhas de software.
http://supertuxbr.blogspot.com 56
http://www.linuxmagazine.com.br
RAID | TUTORIAL
RAID 1.5
Para desfrutar dos benefícios do RAID 0 e 1 ao mesmo tempo, é necessário ter no mínimo quatro discos para uma abordagem combinada RAID 10 (veja o quadro Níveis de RAID) – essa não é uma opção válida para a maioria dos usuários domésticos. Alguns fabricantes sabem que a maioria dos usuários de desktops não querem usar quatro discos, e oferecem um compromisso elegante que utiliza somente dois discos. O RAID 1.5, como é conhecida essa abordagem, divide cada um dos dois discos em duas áreas. O controlador combina uma dessas áreas de cada disco para fazer um conjunto RAID 1, enquanto também combina as outras duas áreas para formar um conjunto RAID 0. Essa abordagem é mostrada no lado direito da figura 1. A DFI e a EPox foram os primeiros fabricantes a introduzir essa variante de RAID. Porém, não conseguiram oferecer os benefícios; ambas as placas somente criavam conjuntos RAID 1. Os ganhos de desempenho vinham de uma maior velocidade de leitura. Finalmente, a Intel apresentou o controlador de E/S ICH6R para os novos discos Serial ATA, e com ele o “Intel Matrix RAID”, que oferece suporte genuíno a RAID 1.5.
Software vs. Hardware Os vários desenhos de RAID foram implementados originalmente como soluções de software. Com o esforço computacional das abordagens dependentes somente de software vinha se mostrando grande demais para os processadores da época, não demorou muito para aparecerem as primeiras placas controladoras RAID, oferecendo uma abordagem mais poderosa e baseada em hardware. Esse tipo de implementação é chamada de RAID por hardware. Quanto mais poderosas as CPUs se tornavam, mais fácil era implementar RAID somente por software. O RAID barato por software tornou-se comum em máquinas domésticas rodando Linux. Os conjuntos de RAID por software normalmente não são tão rápidos quanto seus equivalentes em hardware. A carga sobre a CPU geralmente é perceptível em operações cotidianas. Os benefícios como acesso paralelo são difíceis de explorar com drivers de software. O RAID tornou-se mais popular com usuários domésticos quando os
Níveis RAID Além dos já conhecidos níveis 0 e 1 de RAID, há vários outros desenhos de RAID. O trabalho original de Patterson, Gibson e Katz cobria os níveis 1 a 5. Os níveis 0 e 6 foram acrescentados depois, assim como diversas soluções proprietárias. O RAID níveis 2 a 4, 6 e 7 são menos populares e tornaram-se bastante insignificantes. Combinações dos outros desenhos levaram aos níveis conhecidos como 0+1, 10, 30, 15, 50, 51, 55 e RAID-Z. O RAID 0 agrupa discos e distribui a carga igualmente entre eles. Isso aumenta brutalmente a velocidade de acesso. A capacidade total do conjunto é igual à soma das capacidades dos dois discos. O risco de falha é bastante alto, pois esse nível não oferece qualquer redundância de dados. O RAID 1 grava dados idênticos simultaneamente em todos os discos do conjunto. A capacidade total do conjunto é igual à capacidade de um único disco. A velocidade de leitura normalmente é mais rápida do que com um único disco, enquanto a de gravação é igual. O RAID 2, antigamente, era bastante comum em mainframes, mas agora é insignificante. Um conjunto RAID 2 precisa de no mínimo dez discos. Uma sofisticada verificação de erro permite que os usuários descubram tanto as falhas de disco quanto os erros de gravação. Supondo dez discos, a taxa de tempo de acesso de leitura e gravação é de um para oito quando comparadas a um disco único.
RAID 0 Velocidade aumentada pela operação em paralelo
RAID 1 Redundância por espelhamento
RAID 2 Segurança em números
RAID 3 Striping com paridade
RAID 4 RAID 3 para arquivos pequenos
Ao adicionar os dados do disco rígido bit por bit, e guardar os resultados, é possível restaurar os dados perdidos quando um disco falhar, através da referência aos dados existentes e resultados da adição. O resultado da adição é chamado de paridade. O RAID 3 armazena os dados de paridade do conjunto todo num único disco. Como o disco de paridade é muito mais usado que os discos de dados, ele tem uma tendência natural de falhar primeiro.
RAID 5 Redundância e desempenho de leitura
O RAID 4 representa uma pequena modificação no RAID 3:
RAID 10 Combinações de RAID
enquanto o RAID 3 faz striping dos bytes, o RAID 4 processa blocos inteiros de dados. Como resultado, o RAID 4 consegue lidar mais eficientemente com arquivos menores, enquanto o RAID 3 só mostra benefícios com arquivos contíguos. Assim como o RAID 3, o RAID 4 utiliza um disco separado para paridade. O RAID 5 é a versão mais barata do armazenamento redundante de dados. Supondo o uso de pelo menos três discos no conjunto, ele fornece 66% da capacidade bruta para armazenamento, em contraste com os 50% do RAID 1. Quanto mais discos você acrescentar, melhores ficam os números. O RAID 5 distribui dados e informação de paridade igualmente entre todos os discos do conjunto, o que significa que os discos exibem a mesma probabilidade de falhar por excesso de uso. Todavia, reconstruir o RAID após uma falha de disco leva muito mais tempo que no RAID 1. Dependendo da aplicação, é possível combinar os níveis básicos de RAID mais ou menos arbitrariamente. O RAID 10 implementa um conjunto RAID 0 usando dois conjuntos RAID 1. O RAID 1 oferece a redundância para maior segurança dos dados, enquanto o RAID 0 acrescenta o desempenho. Se você tiver ao menos seis discos, uma combinação de RAID 5 e 0 (RAID 50) é ainda mais eficiente. Os níveis de RAID 0 e 1 são os mais importantes para o uso doméstico, e atualmente têm recebido muita atenção também em ambientes corporativos. O nível 0, também conhecido como striping, oferece o melhor desempenho possível. O nível 1 oferece a maior redundância e é conhecido como espelhamento (mirroring). Para quem não consegue se decidir entre desempenho e redundância, existe um nível especial para usuários domésticos conhecido como RAID 1.5. Entretanto, esse nível é uma troca: pelo menos quatro discos são necessários para combinar as propriedades dos níveis 0 e 1. O RAID 1.5 combina os níveis 0 e 1 usando somente dois discos, e apresenta os discos RAID separadamente à camada de aplicação (figura 1).
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
57
TUTORIAL | RAID
➧ Criar ao menos duas partições do estarão sendo gravados em duas partições mesmo tamanho para oferecer redundância. O comando ➧ Usar o mdadm para combinar as parti- mdadm --detail /dev/md0 fornece informações e criar a área de RAID ções sobre o status do conjunto RAID a ➧ Formatar o dispositivo RAID com um qualquer hora que você quiser. A figura 2 sistema de arquivos mostra a saída desse comando em nossa ➧ Acessar a nova partição RAID máquina de testes. ➧ Usar o mdadm para monitorar o conjunto Mas será que a partição do nosso conRAID junto espelhado é realmente importante? O exemplo a seguir usa um dispo- Para descobrir, desmonte o RAID com sitivo USB referido como /dev/sdc e o comando umount /media/RAID e saia do duas partições referidas como /dev/sdc1 conjunto RAID com um mdadm -S /dev/md0. e /dev/sdc2. Para construir um conjunto Depois, crie dois diretórios chamados /meRAID 1 a partir dessas partições, use o dia/sd1 e /media/sd2, e monte as partições /dev/sdc1 e /dev/sdc2 nesses diretórios. Você seguinte comando mdadm: descobrirá que os mesmos dados estão mdadm --create --verbose /dev/md0 armazenados nas duas partições.
Figura 1 O RAID nível 1.5 combina características do RAID 0 e RAID 1.
fabricantes de placas-mãe passaram a incluir chips controladores RAID. Hoje em dia, a maioria das placas modernas, principalmente as portadoras de conectores SATA, oferecem alguma forma de suporte a RAID. Os chips integrados da maioria das placas-mãe somente lidam com parte do gerenciamento, deixando o trabalho pesado para os drivers. E fazer isso funcionar nem sempre é trivial.
Explorando o RAID
RAID por software foi introduzido no Linux há muito tempo. Os computadores agora exibem poder suficiente para lidar com a carga adicional de gerenciar um conjunto de discos de forma quase transparente. Porém, os benefícios de desempenho que algumas soluções baseadas na placa-mãe oferecem podem ser mínimos, pois baseiam-se fortemente em drivers de software. Para iniciar com o RAID, é perfeitamente aceitável instalar uma variante baseada em software. Para isso, você precisará de privilégios de root na máquina em questão, assim como pelo menos duas partições livres e a ferramenta Mdadm ([2]). Certifique-se de que as partições estão realmente livres, pois apagaremos seus sistemas de arquivos durante nossos experimentos. Pode-se usar até um pendrive USB para esses experimentos com RAID; você precisará particionar o pendrive com uma ferramenta como o gparted, Qtparted ou cfdisk. O experimento envolve os seguintes passos:
➥ --level=1 -raid-devices=2 /dev/sdc1 ➥ /dev/sdc2
Conclusões
A opção --create cria o RAID; --ver- O RAID oferece diversos benefícios para bose dá informações mais detalhadas do usuários domésticos. Ele oferece uma progresso; /dev/md0 é o nome do disposi- maior redundância de dados e acelera tivo RAID resultante, e --level=1 define o acesso ao disco com o RAID. Confio nível de redundância do RAID nível 1. gurar um conjunto RAID por software O último parâmetro passa o número de no Linux é fácil e só precisa de algumas partições RAID e seus nomes. etapas. A ferramenta Mdadm nos ajuda Antes de você usar o conjunto RAID a implementar todos os níveis de RAID recém-criado, é necessário formatá-lo explicados neste artigo. ■ (usando XFS em nosso exemplo) e montar o sistema de arquivos resultante:
Mais Informações
mkfs.xfs /dev/md0 mkdir /media/RAID mount /dev/md0 /media/RAID
Agora você pode usar o diretório /media/RAID como qualquer disco normal. Porém, por trás dos panos, seus dados
[1] RAID na Wikipédia: http://pt.wikipedia.org/ wiki/RAID [2] mdadm: http://cgi.cse.unsw.edu.au/ ~neilb/mdadm
Figura 2 O Mdadm fornece informações sobre o status do dispositivo RAID.
http://supertuxbr.blogspot.com 58
http://www.linuxmagazine.com.br
Navegação segura com um proxy local
TUTORIAL
Anônimo na multidão
Ao navegar na Internet, você normalmente revela seu endereço IP, o que permite que empresas compilem um perfil das suas atividades na Internet. O Tor e o Privoxy podem ajudar você a proteger sua privacidade. por Kristian Kißling Bartlomiej Stroinski – www.sxc.hu
A
epidemia de pesquisas de mercado baseadas na Web continua: muitas empresas costumam investigar os hábitos de seus clientes na Internet – uma forma barata e transparente de espionagem. Em alguns países repressores, até mesmo o governo pode estar espionando seus passos no ciberespaço. O Privoxy [1] e o Tor [2] despistam os espiões. Normalmente, um navegador conversa diretamente com um alvo remoto, geralmente um website, e o servidor que o hospeda registra os dados correspondentes ao acesso. O cliente Tor impede que os seus pedidos sigam direto para o alvo; em vez disso, eles são encaminhados por um proxy que roda na sua própria máquina, através de vários nós, até um chamado nó de saída, que finalmente se comunica com a máquina-alvo (figura 1). A versão servidor do Tor atua como um dos nós intermediários na corrente. O nome Tor é um acrônimo para The Onion Router, ou O Roteador Cebola. Usuários privados normalmente rodarão o Tor como um cliente, geralmente chamado de Onion Proxy. Essa estrutura tem um problema: se os dados que você pedir passarem por vários nós operados de forma privativa antes de chegarem à sua máquina, qualquer opera-
dor do Tor teoricamente poderá registrar a quem pertencem os dados que eles o seu tráfego. É por isso que uma chave estão repassando. Na volta do alvo, a informação é novasecreta é negociada, entre o seu Onion Proxy em casa e cada um dos nós no ca- mente empacotada e permanece criptominho, até o nó de saída. A chave impede grafada até o proxy da sua máquina retirar que nós não autorizados se intrometam as camadas criptográficas para revelar os dados. Isso torna impossível que outros, na conversa em andamento. Ao criptografar os dados em diversas ca- incluindo o provedor, saibam que dados madas, somente o Onion Proxy na sua máquina é capaz de acessar os dados – o sistema também impede que operadores de nós descriptografem os dados que passarem. Dessa forma, os dados ficam como uma cebola – cobertos por várias camadas de criptografia. O nó de saída corta as camadas e repassa os dados para o alvo final, embora esse nó não tenha como saber em qual máquina se originou o pedido. Nenhum dos Onion Routers conhece o Onion Proxy, o que significa que os operadores de Onion Routers são Figura 1 O Tor encaminha um pedido Web através de uma série de nós intermediários para esconder a identidade do usuário. incapazes de descobrir
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
59
TUTORIAL | Tor e Privoxy
Looks like it’s working (figura
2). Se você ain-
Se você tiver o Suse e quiser iniciar o Tor automaticamente na inicialização, torne-se root e acrescente uma linha com /usr/bin/tor & ao arquivo /etc/rc.d/boot. local; no Debian, um arquivo com o nome /etc/rc0.d/K20tor assegura que o Tor será iniciado automaticamente sempre que você ligar a máquina. O Tor tem um problema comum à maioria dos programas de criptografia e anonimização: a criptografia tende a retardar sensivelmente a comunicação com servidores remotos.
da não estiver convencido e Figura 2 O Tor conseguiu abrir um circuito com sucesso. quiser ter certeza, simplesvocê pede ou envia; a pessoa responsável mente busque no Google os termos my pela máquina-alvo só consegue saber o pc. Você verá algumas páginas que não endereço IP do nó de saída, que pode só informam o IP do seu computador, estar em qualquer parte do mundo. como também outros detalhes como o país onde você provavelmente está, seu sistema operacional, e o navegador que você utiliza, ou até as páginas que você O Tor ainda é um programa bastante visitou recentemente. jovem, como mostra o número da verPara bagunçar essas páginas, primeiro são; ele ainda nem tem uma interface. mande o navegador rotear todo o tráfeUsuários do Suse podem baixar o código- go pelo Tor Onion Proxy. Se você tiver fonte da versão estável 0.1.0.16, e começar o Firefox, simplesmente vá em Preferên- O Tor não elimina todo o risco de nainstalando as ferramentas Automake. Se cias, e selecione Configurações da Co- vegar. Como você talvez já saiba, o seu você tiver o Suse 9.3 ou 10.0, o Autoconf nexão | Configuração Manual do Proxy. navegador precisa buscar o endereço e o Automake já estarão instalados. Além Digite 127.0.0.1 como seu Host SOCKS, e da máquina-alvo enviando um pedido disso, você precisa dos compiladores gcc 9050 como sua Porta (figura 3). Agora se- a um servidor DNS. O servidor então e g++. O YaST automaticamente car- lecione a entrada SOCKS v4 e termine a resolve o nome da máquina (como www. rega as bibliotecas necessárias. Não se configuração: seu navegador agora vai linuxmagazine.com.br, por exemplo) para esqueça de instalar o Openssl-devel e os rotear todo o tráfego primeiro para a o endereço IP (212.227.96.14). O servidor arquivos de cabeçalho Zlib-devel, além porta 9050, e o Tor vai encaminhá-lo à DNS depois envia o endereço resolvido Internet. Usuários do Mozilla devem se- de volta ao navegador. Se alguém verida biblioteca Libevent. Usuários do Suse 9.3 não podem usar lecionar Editar | Preferências | Avançado ficar os arquivos de registro do servidor o YaST para instalar a biblioteca; em vez | Proxies para isso. DNS, poderá descobrir quais máquinas disso, devem baixar o código-fonte de Agora, quando você consultar seu en- buscaram o endereço www.linuxmagazine. [2] e seguir os passos padrão de instala- dereço IP, os resultados devem ser bem com.br, e quando. O Privoxy pode impedir ção: ./configure, make e make install. Isso diferentes de como costumavam ser: o isso utilizando o Socks 4a que, diferentedeve funcionar a contento. O Suse 9.3 servidor Web agora pensa que você mora mente do Socks 4 e Socks 5, não precisa ainda precisa de uma nova entrada em na Alemanha (figura 4) – parece que o converter nomes de máquina em ende/etc/ld.so.conf para conseguir encontrar Tor está funcionando mesmo. reços IP antes. a biblioteca. Acrescente o caminho para /usr/lib, e depois (como root) execute ldconfig para atualizar suas informações de caminho. A situação é um pouco mais fácil para usuários de Debian; simplesmente adicione as entradas em seu /etc/apt/ sources.list:
Instalação do Tor
Privoxy para sobremesa
deb http://mirror.noreply.org/ ➥pub/tor sarge main deb-src http://mirror.noreply.org/ ➥pub/tor sarge main
Depois, torne-se root e rode apt-get para atualizar a lista de pacotes com os disponibilizados pelo novo repositório, e apt-get install tor para instalar o Tor.
update
Lá vamos nós...
Vamos testar o Tor. Abra uma janela de terminal e digite tor. Após um curto intervalo, você deve ver uma mensagem dizendo Tor has successfully opened a circuit.
Figura 3 Configurando o Tor como servidor proxy para seu navegador.
http://supertuxbr.blogspot.com 60
http://www.linuxmagazine.com.br
Tor e Privoxy | TUTORIAL
Mudança rápida
Figura 4 O website pensa que você mora na Alemanha, pois é lá que está o nó de saída que o contactou.
O Privoxy é um proxy de filtragem para HTTP comumente usado em conjunto com o Tor. Usuários do Suse 9.3 e 10.0 podem simplesmente executar o YaST para instalar o Privoxy. Se você usar o Debian, apenas digite apt-get install privoxy. Depois de terminar a instalação, o Suse iniciará o Privoxy automaticamente a cada vez que você iniciar a máquina. Para impedir que isso aconteça, deve-se rodar o YaST, ir à aba Sistema e clicar no botão do Editor de Runlevels. Para desativar o serviço Privoxy, clique em Desativar. O Suse Linux roda o Privoxy em uma “jaula” chroot. No Debian, o Privoxy geralmente é iniciado automaticamente depois da instalação; senão, pode-se iniciá-lo tornando-se root e digitando o comando /etc/init.d/privoxy restart. O próximo passo é fazer o Privoxy repassar pedidos Socks ao Tor. Para isso,
usuários do Suse devem abrir /var/lib/ e entrar a seguinte linha abaixo do item 5, FORWARDING:
etc/privoxy/config
forward-socks4a / 127.0.0.1:9050 .
Antes, se você usava seu navegador em modo misto, isso é, anonimamente em alguns casos e abertamente em outros, não existia uma alternativa para ligar e desligar o proxy manualmente. Entretanto, isso felizmente mudou: agora existe a extensão Switch Proxy para o Mozilla e o Firefox, que você pode instalar dando um duplo clique no link Ver mais extensões na janela Extensões [3]. Depois de reiniciar o navegador, você verá uma nova barra de status do Switch Proxy (figura 5). Para configurar o Tor e o Privoxy como um novo proxy, clique em Adicionar, selecione a entrada Padrão e clique em Próximo. Uma janela aparecerá, permitindo que você configure seu novo proxy. Não se esqueça de dar um nome a essas configurações para conseguir identificá-las depois. Quando terminar, clique em Ok. Use a lista ao lado da entrada Proxy para alternar entre as várias configurações de Proxy.
Agente da Microsoft
Já que estamos aqui, quais são os motivos Não esqueça o ponto depois da porta, para você dizer a todos que usa Linux e caso contrário, nada será repassado. É prefere o navegador Firefox? Não há um necessário modificar o mesmo arquivo bom motivo para você revelar essa inforno Debian. Porém, nesse caso, o arquivo mação, apesar de algumas páginas pedirem fica em /etc/privoxy. exatamente essa informação para você, e Agora mude as suas configurações de algumas páginas menos educadas baterem proxy do Firefox e Mozilla para refletir a porta na cara dos usuários de Linux. A extensão User Agent Switcher [4] as mudanças. Entre 127.0.0.1 como endereço IP, e 8118 como a porta em todos ajuda a mudar esse comportamento. Deos casos, e depois navegue para o website pois de instalá-la e reiniciar o navegador, que mostrou seu endereço IP antes. Se selecione User Agent Switcher no menu seu endereço IP for mostrado corretamen- Ferramentas, e escolha Internet Explorer te, o Privoxy está funcionando direito; e 6, ou Opera 9, se preferir. Vá novamense você vir o endereço IP errado, o Tor te àquele site onde você já fez várias verificações; agora ele deve identificar também está funcionando. seu navegador como Internet Explorer – felizmente isso não significa que você instalará junto as falhas de segurança que vêm de brinde nesse navegador. ■
Mais Informações [1] Projeto Privoxy: http://www.privoxy.org/ [2] Tor: http://tor.eff.org/ [3] Extensão Switch Proxy para Firefox e Mozilla:
https://addons.mozilla.org/ extensions/moreinfo.php? application=firefox&id=125 [4] Extensão User Agent Switcher para Mozilla e Firefox: Figura 5 A extensão Switch Proxy do Firefox oferece uma solução simples para ativar e desativar proxies.
http://chrispederick.com/ work/useragentswitcher/
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
61
TUTORIAL
alexandre jaeger – www.sxc.hu
Uso do Rsync para sincronização de dados
Sincronizado O Rsync foi feito para sincronizar conjuntos de dados, seja em máquinas distintas ou em um único computador. Até o SSH pode ser usado para a criptografia do tráfego dos dados. por Heike Jurzik
O
Rsync mantém seus dados atualizados e ajuda usuários a manterem-se a par das mudanças de versão. A ferramenta de sincronização Rsync oferece opções para ajudar a gerenciar as propriedades de arquivos; ele funciona bem com SSH, e é perfeito para transferir grandes volumes de dados se o receptor já tiver uma cópia mais antiga dos dados. O Rsync verifica as diferenças entre as versões na origem e destino dos dados, e só transfere aqueles que tiverem mudado. O Rsync compara os dados entre duas máquinas. A sintaxe genérica do programa é rsync [opções] origem destino. A escolha da origem e do destino é importantíssima. É necessário decidir cuidadosamente qual será a direção da transferência dos dados para evitar a perda das informações. O quadro Dados em uníssono discute uma alternativa para essa rua de mão única baseada na ferramenta Unison, que consegue sincronizar nas duas direções. O Rsync permite que se monitore a operação de transferência de dados: chamar o Rsync com a opção -n faz o programa realizar uma rodada de testes:
$ rsync -n dir1/* dir2/ skipping directory dir1/subdir_x skipping directory dir1/subdir_y skipping non-regular file “foobar.tex” capitulo01.tex capitulo02.tex capitulo03.tex ...
Como mostra a saída, o Rsync transferiria os arquivos normais e diretórios, mas deixaria os links simbólicos. A ferramenta se refere aos links como non-regular files, ou arquivos não-regulares. Para transferir subdiretórios recursivamente até o nível mais baixo, utilize a opção -r. Acrescentar também a opção -l faz o Rsync incluir os links simbólicos na transferência: naturalmente, uma combinação dessas opções é possível: $ rsync -rl diretorio1/* diretorio2/ building file list ... done foobar.tex -> foobar_novo.tex capitulo01.tex ...
O Rsync usa uma abordagem alternativa para lidar com symlinks: se você substituir o -l por um -L, o programa resolverá o link, e os antigos symlinks serão corretamente transferidos para o diretório de destino.
Briga contra a barra
Colocar uma barra no final do nome de um diretório influencia radicalmente a operação do Rsync. Por exemplo, se você usar o comando rsync -a diretorio/ de/origem destino, o Rsync transferirá o diretório origem e seus conteúdos para o diretório de destino. Se você colocar uma barra ao final do diretório de destino, o Rsync somente transferirá o conteúdo do diretório origem para o destino, sem criar dentro dele um diretório origem.
Como dantes
Se você for usar o Rsync para criar becapes, faz sentido manter os atributos dos arquivos originais. Os atributos incluem tanto as permissões de leitura, gravação e execução quanto os tempos de acesso, ou seja, informações sobre a hora do último acesso (atime), a hora da última mudança de status (ctime) e a hora da última modificação (mtime). Além disso, os administradores podem se beneficiar de parâmetros que preservam dados dos arquivos, como dono e grupo, ou para suportarem arquivos de dispositivos. Para manter as permissões,
http://supertuxbr.blogspot.com 62
http://www.linuxmagazine.com.br
Rsync | TUTORIAL
apenas passe a opção -p; o -t lida com as informações de tempo, e o -g mantém a informação de grupo. Enquanto qualquer usuário normal pode utilizar esses parâmetros, as opções -o (manter dados do dono) e -D (atributos de dispositivo) só estão disponíveis para o superusuário. A linha de comando completa, com todas essas opções, seria rsync -rlptgoD home/usuario/* backup/. Mas existe um atalho: o Rsync possui uma opção especial que combina todas essas, -a (archive, ou arquivar).
Exclusões
O Rsync possui uma opção muito prática para permitir que o usuário exclua certos arquivos do processo de sincronização. Consiste de especificar uma opção --exclude= e um padrão de busca, e definir os arquivos a excluir. Pode-se usar curingas para isso: rsync -a --exclude=*. bak ~/artigo/* /backup/. Isso exclui os arquivos que terminam em .bak. Se você precisar excluir arquivos que terminam com um til (~), apenas adicione novamente a opção: rsync -a --exclude=*.bak --exclude=*~ origem destino.
Montes de dados
Quando a transferência termina, o O Rsync é perfeito para transferir arquivo recebe de volta seu nome origigrandes volumes de dados. Ao es- nal. Se a transferência for interrompida, pecificar o parâmetro --partial , se é possível reiniciar especificando novaa transferência foi interrompida por mente a opção --partial. A desvantagem da opção --paralgum motivo, é possível retomar a transferência do ponto onde ela parou. tial é que, se você usar o Rsync para Especificar a opção --progress ainda atualizar um arquivo já existente e mostra um indicador de progresso para a transferência for interrompida, o o usuário acompanhar o processo de arquivo anterior na máquina de destransferência: tino desaparece e é substituído pelo arquivo parcial já transferido. Pode$ rsync --progress --partial debian.iso se contornar isso criando antes um ➥ transpluto:/scratch/debian/ hardlink para o arquivo original: ln Password: debian.iso debian_orig.iso . Se a transdebian.iso ferência falhar agora, o arquivo ISO 22543992 3% 5.15MB/s não será perdido; em vez disso, o ar0:02:14 quivo parcial recebe um novo nome, No outro extremo da conexão, o ar- sem apagar o original. ■ quivo parcial fica inicialmente oculto no diretório de destino. Digitar ls -a lá revela um arquivo semelhante a .debian. Mais Informações iso.wtKNr7. O ponto mantém o arquivo [1] Página do Unison: oculto, e a extensão arbitrária elimina http://www.cis.upenn.edu/ o perigo de se sobrescrever arquivos já ~bcpierce/unison/ existentes.
Dados em uníssono O Unison [1] é outra ótima ferramenta de sincronização que não somente sincroniza em ambas as direções, como também suporta sistemas não-Linux. O programa está disponível para Linux, Windows®, Mac OS X e Irix, como nos informa a área de download de seu website.
Pode-se economizar tempo armazenando suas exclusões num arquivo texto. É necessária uma linha para cada padrão de busca. Especifique o parâmetro --exclude-from=Arquivo-de-exclusão para usar o arquivo.
É possível executar o Unison a partir da linha de comando, assim como por sua interface gráfica. Para sincronizar dois diretórios em sua máquina, simplesmente digite: unison -ui texto diretório1 diretório2, por exemplo.
Cooperação
diretório1 new file ----> <---- changed
O Rsync consegue sincronizar dados até através de uma rede. Apenas passe a opção -e ssh para criptografar e transferir os arquivos por SSH. É necessário substituir a origem e o destino pelo nome ou endereço IP das máquinas local e remota. Caso você tenha nomes de usuário diferentes nas duas máquinas, adicione seu nome na máquina remota seguido de uma arroba, como em rsync -e ssh origem usuario@remoto:destino/. Digite o caminho relativo para o seu diretório home ou o caminho absoluto após o :. Uma variável de ambiente evita que você digite os parâmetros para a criptografia SSH toda vez que usar o comando. Para o Bash, o comando é: export RSYNC_RSH=ssh. Como a variável só é válida no contexto atual da shell, é necessário adicionar sua linha ao arquivo de configuração ~/.bashrc para defini-la permanentemente, e depois executar source ~/.bashrc para que o arquivo seja novamente interpretado.
Se o conteúdo dos dois diretórios for diferente, o Unison lhe a visará, mostrará o sentido da sincronização e dirá se o arquivo é novo ou se foi modificado: diretório2 capitulo01.tex [f] capitulo02.tex [f]
Para aceitar essa sugestão, apenas pressione [F]. Se surgir algum conflito que o Unison não consiga resolver, devido a, digamos, ambas as versões do mesmo arquivo possuírem diferenças desde a última vez que o programa foi executado, o Unison exibe um ponto de interrogação (?), pedindo que o usuário faça uma decisão. Ou então, o usuário pode digitar or, ou pressionar / (barra) para adiar a decisão, ou pressionar [Shift]+[i] para adiar indefinidamente. Digite um ponto de interrogação para ver os comandos disponíveis. No final, o programa verifica mais uma vez se você quer aplicar as mudanças: pressionar [y] inicia a sincronização. Proceed with propagating updates? [] y Propagating updates UNISON started propagating changes at 20:20:34 on 28 Feb 2006 [BGN] Copying foobar.tex from /home/usuario/diretorio1 to /home/usuario/diretorio2 ... Saving synchronizer state Synchronization complete Também é muito fácil sincronizar com máquinas remotas. Primeiro, certifique-se de que a mesma versão do Unison está instalada nas duas máquinas, e depois digite unison -ui texto diretorio1 ssh://usuario@maquinadestino/diretório. A sintaxe é um pouco diferente em relação à do Rsync: em vez de dois-pontos (:), usase uma barra (/). Para usar um caminho absoluto, é necessário acrescentar outra barra: unison -ui texto diretório1 ssh://usuario@maquinadestino //outrodir/diretório1.
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
63
Uma insistente botnet ataca Charly
SYSADMIN
Gangue virtual Durante suas atividade diárias normais, o colunista da Linux Magazine Charly Kühnast foi atingido por um ataque malévolo. O servidor anti-spam do Charly, que é acionado antes do servidor de emails, salvou-o da tempestade de mensagens. por Charly Kühnast
E
ra uma terça-feira ensolarada de paralelas, e aumentando. Aquilo era dez Maio. Eu estava escrevendo minha vezes o nível normal. E é bastante incocoluna para a Linux Magazine. mum o servidor simplesmente perder as Eram duas horas da tarde quando eu olhei conexões daquela forma. para o monitor e vi os últimos dados de A curiosidade me levou a investigar o carga e tráfego dos servidores críticos que arquivo de registro. Conforme esperado, gerencio. Fiquei absolutamente pasmo ao cada mensagem vinha de uma fonte diver que a linha reject do gráfico do filtro ferente. Dois terços dos IPs pertenciam a de spam estava nas alturas (veja figura 1). provedores europeus, e o resto aos EUA O artigo teria que esperar. e Brasil. Os computadores gentilmente Então o servidor estava rejeitando forneciam seus nomes completos na enormes quantidades de mensagens mensagem HELO, os quais nem pareciam nos estágios iniciais do diálogo SMTP. ter sido forjados, o que é bem raro, pois Suspeitei de uma onda de spam com HELO forjados são o padrão em spam. envelopes mal forjados. Isso não seria nenhuma novidade: para cada e-mail legítimo que eu recebo, chegam dois emails. Mas ainda decidi abrir uma cone- Usei o nmap para varrer algumas portas. xão SSH com o filtro de spam, que roda Também rodei o nmap com a opção -numa máquina separada, e não acreditei osscan-guess para obter um perfil dos sistequando encontrei 140 conexões SMTP mas operacionais nas máquinas de spam. O que eu queria era saber se tratavam-se de relays abertos, máquinas invadidas e seqüestradas, servidores de e-mail mal configurados, servidores Web tomados de exploits, ou simplesmente computadores particulares possuídos por cavalos-de-tróia. A resposta do nmap foi clara: era a última Figura 1 A linha reject no gráfico do filtro de spam opção. Todas as máquinas rodavam Winde repente sobe – fui atacado por um dows® XP, e ninguém usa Windows XP exército de bots de spam. como servidor de e-mails ou Web – acabo de ser apresentado a uma botnet. Botnet é um grupo de máquinas independentes tomadas por um programa que permite que um cracker as controle de um único ponto remoto. Os computadores de uma botnet são chamados freqüentemente de leafbots ou zumbis. Individualmente, um zumbi é bastante inofensivo, mas Figura 2 Depois de retirar o limite do SMTP, os zumbis reforçaram o ataque contra o juntos eles se tornam uma arma perigoservidor. O loadavg mostrava 0.3 – e tudo sa. Felizmente, a botnet que me atacou estava bem. parecia ter só 200 máquinas.
Atacantes-vítimas
Lorenzo González – www.sxc.hu
E agora, nosso patrocinador Eu ainda não tinha conseguido terminar meu artigo para a Linux Magazine, porque os intervalos entre as chegadas de spam só encurtavam. Como eu restringi o número de processos SMTP simultâneos, havia um sério risco de mensagens legítimas não chegarem aos destinatários devido a uma falta de recursos para cuidar delas. Olhando a carga do sistema, vi que o filtro de spam ainda tinha recursos para usar, e portanto retirei a limitação, e a botnet pisou fundo no acelerador: alguns minutos depois, eu já tinha 580 conexões SMTP paralelas (figura 2). Mas uma coisa que eu realmente não gosto – e isso contradiz minha experiência anterior com botnets – é o fato de estas mensagens estarem passando da minha lista cinza (graylisting). Um lista cinza manda o servidor normalmente rejeitar as mensagens entrantes com um erro temporário (450 favor tentar mais tarde), e aceitar as mensagens na segunda tentativa. Explicação: Spambots geralmente não têm uma fila para guardar temporariamente mensagens que não puderam ser enviadas antes de enviá-las pela segunda vez. Parece que as listas cinzas são tão usadas hoje em dia que os spammers estão pensando em formas de contorná-las. O exemplo 1 demonstra o efeito que isso teve no meu site. A linha 1 deste trecho do arquivo de registro mostra como um zumbi se conectou ao meu servidor. O greylist=update na linha 2 mostra o zumbi fazendo uma segunda tentativa depois do meu servidor rejeitar a primeira com uma mensagem de erro temporário.
http://supertuxbr.blogspot.com 64
http://www.linuxmagazine.com.br
Ataque dos Bots | SYSADMIN
Verificar destinatário
500 processos SMTP. Mais ou menos De volta ao registro: o envelope infini- nenhum desses processos chegou a tamente forjável do remetente é sem- entregar de fato uma mensagem, pois pre o mesmo, ou seja, <>, o remetente a Verificação de Endereço do Desnulo. A vantagem desse endereço para tinatário bloqueou todas elas antes o spammer é que qualquer servidor de desse estágio. e-mail em conformidade com a RFC o Agora, se eu tivesse jogado as mensaaceitará. E diversas medidas anti-spam gens no Spamassassin antes de verificar que se baseiam na verificação do en- o endereço do destinatário, o filtro de dereço do remetente, tais como o SAV spam estaria quase parando, simples(Sender Address Verification), são inúteis mente devido ao volume de mensagens se você tiver um remetente nulo. que chegavam. Meu conselho para os Os endereços dos destinatários usa- administradores de sistemas é: a Verifidos pela botnet de spam são ainda mais cação do Endereço de Destinatário torna interessantes: nenhum deles existe, e a vida menos cheia de surpresa. todos são palavras de um dialeto cóptiDecidi capturar alguns dos spams co extinto – ou mais provavelmente de que chegavam porque eu queria saber algum gerador de caracteres aleatórios. o que a mensagem tinha que o exército Isso explica por que o filtro de spam de bots estava tentando enfiar através do ignora a mensagem antes mesmo de o meu filtro de spam nas últimas horas. diálogo SMTP chegar à fase do comando Eu esperava o lixo padrão junto com DATA. O filtro realiza Recipient Address um cavalo-de-tróia, talvez disfarçado de Verification (Verificação do Endereço do GIF ou PDF. Ou os anúncios comuns Destinatário), a contraparte do SAV. de auxílios à ereção, drogas para fesO RAV é baseado num princípio tas ou aumento de seios (infelizmensimples: se o servidor de envio citar o te ninguém parece ter um tratamento endereço do destinatário em RCPT TO:, para barriga de chope). Mas o que eu o filtro de spam primeiro verificará descobri era somente um conjunto de aonde o e-mail tem que ir, ou seja, caracteres ASCII. para o meu servidor de e-mail (mail. Há dois possíveis motivos para isso: kuehnast.com, na linha 3 do exemplo 1). ou o spammer só estava tentando me Ele abre um diálogo SMTP e obtém chatear, ou ele não entende MIME. a resposta para o RCPT TO:. Que é user Achei que fosse o segundo, e até pensei unknown, no caso dos zumbis. Isso faz o em passar a sopa de letrinhas por um filtro de spam terminar o diálogo com decodificador Base64. Mas caramba, será o spammer (linha 4), o que se reflete que eu preciso mesmo saber o preço na massa de rejeições mostradas no do Viagra essa semana? Acho que vou gráfico dos e-mails. ficar só no arquivo de registro vendo as Comecei a entender por que o filtro mensagens serem rebatidas pelo filtro de spam estava relativamente tranqüilo de spam. Posso terminar o artigo hoje apesar de estar lidando com mais de à noite. ■
Exemplo 1: Trecho do arquivo de registro May 12 04:16:07 spamfilter2 postfix/smtpd[32629]: connect ➥ from hcm-ms-185.vnn.vn[203.162.4.185] May 12 04:16:07 spamfilter2 policyd: rcpt=598727, greylist=update, host=203.162.4.185 ➥ (hcm-ms-185.vnn.vn), from=<>, to=shaynsimo@kuehnast.com, size=5228 May 12 04:16:07 spamfilter2 postfix/smtpd[29010]: NOQUEUE: reject: RCPT ➥ from hcm-ms-185.vnn.vn[203.162.4.185]: 550 <shaynsimo@kuehnast.com>: Recipient address rejected: unverified address: ➥ host mail.kuehnast.com[80.190.243.62] said: 550 <shaynsimo@kuehnast.com>:no such user (in reply to RCPT TO command); ➥ from=<> to=<shaynsimo@kuehnast.com> proto=ESMTP helo=<HCM-MS-185.vnn.vn> May 12 04:16:07 spamfilter2 postfix/smtpd[32629]: disconnect ➥ from hcm-ms-185.vnn.vn[203.162.4.185]
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
65
Mais uma missão para os network block devices
SYSADMIN
O bloco está na rede Você não precisa do Samba ou do NFS para usar um cliente sem disco. Um dispositivo de blocos remoto pode ajudar a melhorar muito o desempenho e a eficiência. por Dirk von Suchodoletz e Thorsten Zitterell
hilary quinn – www.sxc.hu
O
s experts sabem muito bem que o modelo tradicional de redes de computadores desperdiça muito espaço com o armazenamento de dados redundantes. Máquinas pessoais geralmente dispõem de um disco rígido, apesar de o sistema operacional e os aplicativos que rodam no computador serem os mesmos em toda a empresa.
Uma alternativa para essa abordagem é o gerenciamento centralizado dos dados, com clientes sem disco. Naturalmente, isso exige uma rede rápida e confiável, além de servidores poderosos. Um cliente sem disco típico baixa todos os dados através de um sistema de arquivos de rede. Esse cenário, no entanto, causa uma sobrecarga desnecessária nos servidores e na
rede. Quando um servidor distribui um sistema de arquivos que os clientes não modificam, a maioria da funcionalidade é desperdiçada. Uma alternativa interessante para melhorar o desempenho com clientes sem disco é ter um sistema de arquivos raiz localizado em um dispositivo de blocos da rede (network block device, ou NBD), em vez de um sistema de arquivos baseado na rede, como o NFS, por exemplo. Nosso ponto de partida nessa busca por um sistema de arquivos raiz de alto desempenho para redes locais consistiu de um conjunto de 60 clientes Linux sem disco (figura 1), instalados na Universidade de Freiburg há três anos. O ambiente anterior, que foi usado três vezes para processamento de matrículas, baseava-se em dois servidores NFS, com a configuração de tarefas gerenciada na inicialização dos clientes.
Inicialização
Figura 1 As máquinas no conjunto CIP estão configuradas como clientes sem disco. Para evitar a sobrecarga da rede na inicialização, fomos fundo em nossa caixa de truques e substituímos o sistema de arquivos de rede por dispositivos de blocos remotos.
Quando o usuário terminava de negociar o login no KDE, cada cliente já tinha baixado até 350 MB do servidor, o que levava no mínimo um minuto. Como se pode imaginar, iniciar 15 máquinas simultaneamente gerava uma sobrecarga significativa nos dois servidores. Para resolver esse problema, iniciamos uma busca sistemática de otimizações potenciais, sem no entanto mexer no servidor e no hardware de rede.
http://supertuxbr.blogspot.com 66
http://www.linuxmagazine.com.br
NBD | SYSADMIN
Cliente Aplicação
VFS
Sistema de arquivos
Block device
Rede FTP, SCP, HTTP
LUFS
NFS, SMB ISCSI, AoE, NBD
Servidor Aplicação
VFS
Sistema de arquivos
Block device
Figura 2 Servidor e cliente podem trocar arquivos e blocos em diversos níveis. A figura mostra a interpretação dos dados, mas não a implementação em software. A implementação especial LUFS (Linux Userland Filesystem), por exemplo, consegue montar um servidor FTP como se fosse um sistema de arquivos.
Logo descobrimos que o comportamento dos clientes na inicialização afetava fortemente o desempenho. Decidimos manipular a configuração no disco RAM inicial e paralelizar os passos sempre que fosse interessante. Também investigamos sistemas de arquivos de rede alternativos e NBDs com um sistema de arquivos adequado. A combinação dessas duas abordagens reduziu o volume de dados que precisávamos transferir pela rede, de 350 MB para menos de 50 MB. Como conseqüência, o tempo de inicialização foi quase reduzido à metade.
NFS legado
O kernel Linux não se importa muito se o sistema de arquivos raiz se encontra num disco rígido local, um dispositivo RAID SCSI, um dispositivo flash ou um servidor de rede remoto. Nesse último caso, o Linux geralmente recai no uso do sistema de arquivos de rede NFS. O NFS é bastante usado e simples de configurar, e faz parte do kernel há anos. Mas está começando a aparentar sua idade: antes da versão 3, não havia a menor segurança. O servidor confia cegamente na autenticação feita nos clientes, e distingue os clientes somente pelos seus endereços IP. O NFS baseia-se em RPC (Remote Procedure Call) e usa chamadas de funções remotas para realizar todo tipo de acesso. Do ponto de vista do desenvol-
vedor, essa é uma abordagem elegante, mas que sofre de uma séria sobrecarga, principalmente se você tiver de lidar com arquivos pequenos. Usuários com um diretório pessoal em NFS talvez possam viver com isso, mas, se você tiver um sistema de arquivos raiz compartilhado com um número maior de clientes, os problemas começam a aparecer. O procedimento de inicialização do tipo System V, com sua infinidade de pequenos scripts de inicialização, é particularmente sujeito a sobrecargas. Enquanto procurávamos uma abordagem mais rápida, ficou claro que nossos requisitos – escalabilidade, desempenho, integridade dos dados e disponibilidade – eram contraditórios. Por exemplo, o caching tende a melhorar a escalabilidade e o desempenho, porém reduz a integridade dos dados. Sem outras medidas, não se pode garantir que os dados no cache do cliente sejam idênticos aos do servidor. E embora a sincronização melhore a integridade, novamente isso afeta a escalabilidade.
SAN e dispositivos de bloco Isso nos deixou uma rota de fuga pelos níveis mais baixos: em vez de centralizar o sistema de arquivos, podemos controlar discos rígidos remotamente no nível de
blocos (veja o quadro Blocos e arquivos). Esse princípio é popular com Storage Area Networks (Redes de área de armazenamento, ou SAN), que geralmente baseiam-se numa malha fiber channel independente da rede. Dito isso, devemos dizer que essa tecnologia é cara. O padrão industrial ISCSI é mais barato, e o kernel Linux possui suporte a ele, mas a sobrecarga do ISCSI é demais para um desktop normal. Uma forma mais barata de evitar os problemas do NFS operando no nível de bloco seria através do recurso de dispositivo de bloco de rede do Linux.
Blocos e arquivos Os sistemas de arquivos controlam o acesso aos arquivos; dispositivos de blocos geralmente abstraem o hardware (discos rígidos, por exemplo) e suportam o intercâmbio de dados em blocos (veja a figura 2). Os dois se encontram quando um sistema de arquivos normal é baseado num dispositivo de blocos que suporta o armazenamento em blocos. Sistemas operacionais modernos devem aumentar o desempenho através do cache em RAM das transferências de dados. Os sistemas de arquivos de rede disponíveis diferem quanto aos tipos e tamanhos de arquivos que suportam, e também quanto ao controle de acesso. Por exemplo, o Samba não suporta arquivos especiais Unix como soquetes e named pipes na configuração padrão, o que pode impedir alguns aplicativos e ambientes gráficos do Linux. Dispositivos de blocos suportam o uso de sistemas de arquivos arbitrários baseados em blocos, independentemente de o dispositivo de bloco estar montado localmente ou acessível remotamente pela rede. Isso nos dá uma gama bem maior de escolhas do que os sistemas de arquivos de redes.
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
67
SYSADMIN | NBD
Somente leitura
Para os testes iniciais, talvez você queira A opção -r inicia o servidor de dispositivos eliminar a possibilida- de bloco em modo somente leitura, evide de surgirem proble- tando assim que os clientes modifiquem mas de rede e rodar o o dispositivo de bloco. Obviamente, isso cliente e o servidor na também desqualifica os sistemas de arquimesma máquina. A for- vo com journal. Não conseguimos montar ma mais fácil de fazer sistemas Ext 3, ReiserFS ou XFS através de Figura 3 Nossa tentativa de montar o ReiserFS num dispositivo de blocos somente leitura. O sistema de arquivos precisa acrescentar isso é com uma parti- dispositivos de bloco somente leitura em entradas ao journal, mas NBDs compartilhados não podem ser ção livre. Se você não nosso laboratório. Dependendo do sistema graváveis. tiver uma, um arquivo de arquivos, mensagens de erro das mais contêiner com algum variadas proporções foram mostradas; a fiO kernel “oficial” já possui o recurso sistema de arquivos servirá ( exemplo gura 3 mostra o que o ReiserFS tem a dizer NBD há quatro anos. O módulo é bem 1). Testamos essa configuração com sobre isso. Especificar a opção de montagem simples, e deixa a verificação da inte- ReiserFS, Ext2 e XFS, com sucesso. -o ro não melhorou as coisas; sistemas de gridade dos dados transferidos para a As ferramentas de formatação dirão arquivo com journal sempre querem gravar que o arquivo não é um dispositivo em seus journals. Entretanto, o SquashFS camada TCP subjacente. de blocos ( linha 8), mas você pode e o Ext 2 aceitaram bem. ignorar esse aviso. Alternativamente, o NBD oferece a Em nosso exemplo, o administrador opção -c para copiar ao gravar (exemplo Pode-se executar modprobe nbd para ver se cria um arquivo de 100 MB (linhas 1 e 2, linha 1). Para suportar essa opção, o sero seu kernel possui um módulo NBD 2), adiciona um sistema de arquivos Ext vidor cria um arquivo para cada cliente, configurado. Não deve aparecer nenhu- 2 (linha 6), inicia o servidor NBD na por- onde guarda as modificações realizadas ma mensagem de erro. As ferramentas ta 5000 (linha 14), e monta o dispositivo pelo cliente. A linha 9 exemplifica isso. respectivas do espaço do usuário, como na mesma máquina (linha 15). A esco- Quando o cliente desconecta, as mu/usr;bin;nbd-server, são fornecidas pela lha do número da porta é arbitrária, o danças são perdidas, apesar de o arquimaioria das distribuições num pacote se- que permite iniciar múltiplos servidores vo propriamente dito ser mantido. Os parado. A versão 2.8.4 era a atual quando para vários contêineres. O cliente NBD próprios desenvolvedores dizem que o este artigo foi escrito, e está disponível precisa do módulo do kernel e espera o desempenho da opção -c não é muito em [1]. O Suse Linux 10.0 ainda utiliza endereço IP e o número da porta do ser- bom, então talvez você prefira uma soa versão 2.7.4, que funcionará muito bem vidor, seguidos do nome do dispositivo lução implementada no cliente, como para o que queremos. o UnionFS ou o módulo COW (copy on de blocos local. write, ou copiar ao gravar). Infelizmente, a segurança do NBD é, no máximo, rudimentar. É semelhante Sem permissão de escrita Para iniciar o cliente e o servidor em má- à do NFS, mas menos flexível. Os adAssim como com um sistema de arquivos remoto, um disquinas separadas, simplesmente substitua ministradores podem especificar uma positivo de bloco de rede pode ser exportado para suportar o endereço 127.0.0.1 na linha de comando lista de máquinas que receberão direito acesso completo ou somente leitura. Existe uma diferença do nbd-client pelo IP do servidor. O nbd- de acesso ao dispositivo. O NBD não marcante quando se examina o acesso de gravação comserver consegue exportar volumes LVM tem qualquer recurso avançado, como partilhado num recurso: os sistemas de arquivos de rede oferecem mecanismos de travamento ou acesso coordenaou partições, em vez de simples arquivos autenticação, verificação de integridade do aos arquivos para evitar danos aos arquivos. Os disposicontêiner. Para isso, simplesmente subs- ou criptografia. tivos de rede fazem muito menos esforço, e ficam satisfeititua o nome do arquivo pelo do dispositos desde que o acesso de leitura ou escrita fique restrito tivo: nbd-server 5001 /dev/sda4. a blocos individuais. A única proteção que oferecem é a O cliente fecha a conexão com o garantia de que as transferências de bloco sejam atômicas. servidor da seguinte forma: nbd-client Clientes sem disco precisam criar ou Os dispositivos de bloco não têm interesse especial em sa-d dispositivo; mas certifique-se de des- modificar arquivos em várias posições ber se os blocos na verdade pertencem a algum sistema de montar o dispositivo de blocos antes de do sistema de arquivos durante sua exearquivos – eles ignoram solenemente as camadas de dacução – o diretório /etc/resolv.conf ou fechar a conexão: dos subjacentes e a forma como se organizam. Entretanvários outros diretórios temporários, por to, isso pode dificultar o suporte ao uso distribuído de um umount /mnt exemplo. Uma solução envolve o uso de dispositivo de blocos de rede com um sistema de arquivos nbd-client -d /dev/nbd0 sistemas de arquivos translúcidos, como o comum baseado em blocos. Se vários clientes tentassem gravar dados num NBD compartilhado, não tomariam coUnionFS, para suportar mudanças através nhecimento de seus colegas, e destruiriam as estruturas Conforme explicado no quadro Blocos de um ramdisk superposto. Entretanto, de dados uns dos outros por causa da falta de coordenae arquivos, permitir que múltiplas máqui- essas modificações não são persistentes, ção. O caching local nos clientes torna esse caos perfeito nas gravem em um NBD compartilhado e o sistema volta ao estado original na e deixa os sistemas de arquivos com um lixo ininteligível. leva ao caos. Em vários casos, nem existe próxima inicialização. Isso não é uma fonte de preocupação para as operações sem essa necessidade. O acesso de leitura é O Cowloop (Copy On Write Loopback disco. Contanto que ninguém tente gravar no NBD, qualquer suficiente para o sistema de arquivos raiz Device, ou dispositivo loopback com cópia número de clientes pode compartilhá-lo. Mas para gravar, é de um cliente sem disco, para um diretó- na gravação) [2] é outra abordagem para necessário impedir que um segundo cliente monte o disrio de aplicativos compartilhado, ou para dispositivos de blocos somente leitura. O positivo de blocos caso outro cliente queira gravar nele. um repositório de documentos. Cowloop torna um dispositivo de blocos
Uso de NBDs
Remoto
Escrita direcionada
http://supertuxbr.blogspot.com 68
http://www.linuxmagazine.com.br
NBD | SYSADMIN
gravável, gravando as mudanças separadamente num arquivo esparso (figura 4), que novamente pode residir num ramdisk. Em comparação com o UnionFS, que precisa copiar um arquivo inteiro para a camada gravável para refletir até as menores mudanças, o Cowloop é bem mais moderado no uso de espaço, e só armazena os blocos alterados.
Cowloop
Depois de descompactar, compilar e instalar o código-fonte a partir de [2], você deve ter um módulo do kernel e uma ferramenta. Pode-se usar o Cowloop em combinação com o NBD: modprobe cowloop cowdev -a /dev/nbd0 /tmp/nbd.cow mkdir /mnt/nbd-rw mount /dev/cow/0 /mnt/nbd-rw
Esse exemplo liga o NBD nbgd0 ao arquivo gravável /tmp/nbd.cow e monta o novo dispositivo de blocos. As operações de leitura no nbd-rw não afetam o NBD. Se o Cowloop reclamar da falta de um /dev/cow/ctl ou /dev/cow/0, as seguintes linhas devem ajudar: mkdir /dev/cow mknod /dev/cow/ctl b 241 255 ln -s /dev/cowloop0 /dev/cow/0
Depois de desmontar o dispositivo de blocos combinado, cowdev -d /dev/cow/0 removerá o Cowloop. Em comparação com essa solução, o UnionFS roda em um nível mais alto do sistema de arquivos. Ele guarda os arquivos modificados em outro sistema de arquivos, fácil de rastrear. De fato, pode-se utilizar as ferramentas padrão do Linux para fazer buscas no sistema de arquivos superposto.
Gancho de memória
Clientes sem disco não dispõem de armazenamento local, e portanto puxam da rede todas as informações de que necessitam. Normalmente, o carregador de boot ou algum parâmetro do kernel informa ao kernel onde se localiza o sistema de arquivos raiz. Mas, se o sistema de arquivos raiz estiver em algum lugar de uma rede local, será necessário fornecer uma forma de ativar as interfaces de rede e a configuração de IP logo no início, sendo que ambos precisam de um sistema de arquivos raiz. Há três so-
luções possíveis para o problema de ter um sistema de arquivos raiz e ativar a configuração inicial de IP: ➧ Raiz do kernel sobre NFS – As primeiras versões do Linux eram capazes de usar a raiz do kernel sobre NFS, o que envolve a montagem do sistema de arquivos raiz diretamente por NFS. Entretanto, isso pressupõe que todos os componentes necessários estejam embutidos no kernel, incluindo as configurações da placa de rede e do NFS, além da auto-configuração do IP, que por sua vez precisa que haja um cliente DHCP em funcionamento. Problemas afloram quando se troca a placa de rede ou quando se necessita aplicar patches ao driver. Em ambos os casos, você precisaria recompilar todo o kernel.
➧ Ramdisk inicial – Um ramdisk inicial, tecnicamente, é um dispositivo de blocos na RAM. O ramdisk tem um sistema de arquivos formatado com todas as ferramentas, scripts e módulos necessários para a configuração até o momento em que o sistema de arquivos raiz é montado. Essa abordagem tem suas desvantagens, como o esforço envolvido na criação do ramdisk inicial, a sobrecarga devida ao dispositivo de blocos com seu sistema de arquivos, e as complexas transições do pequeno sistema de arquivos raiz do ramdisk inicial para o novo sistema raiz montado no outro dispositivo. A chamada pivot_root lida com a transição, e freeramdisk libera a memória do ramdisk após a transição. ➧ Early userspace – Um desenvolvimento recente, chamado early userspace (ou
Exemplo 1: Testando o NBD 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
hermes:~ # mkdir /exports hermes:~ # dd if=/dev/zero of=/exports/nbd-export bs=1024 count=100000 100000+0 records in 100000+0 records out 102400000 bytes (102 MB) copied, 0,987222 seconds, 84 MB/s hermes:~ # mke2fs nbd-export mke2fs 1.38 (30-Jun-2005) /exports/nbd-export is not a special block device. Continue anyway? (y,n) y Filesystem-Label= OS-Typ: Linux Block size=1024 (log=0) [...] hermes:~ # nbd-server 5000 /exports/nbd-export hermes:~ # nbd-client 127.0.0.1 5000 /dev/nbd0 Negotiation: ..size = 100000KB bs=1024, sz=100000 hermes:~ # mount /dev/nbd0 /mnt hermes:~ # ls /mnt . .. lost+found hermes:~ # df Filesystem 1K blocks Used Available Used% Mounted as [...] /mnt /dev/nbd0 96828 13 91815 1% hermes:/ # time dd if=/dev/zero of=/mnt/text count=8192 bs=1024 8192+0 8192+0 8388608 bytes (8,4 MB) copied, 0,038112 seconds, 220 MB/s real user sys
0m0.046s 0m0.008s 0m0.036s
Exemplo 2: Copiar ao gravar 01 02 03 04 05 06 07 08 09
hermes:~ # nbd-server 5000 /exports/nbd-export -c hermes:~ # nbd-client 127.0.0.1 5000 /dev/nbd0 hermes:~ # mount -t xfs /dev/nbd0 /mnt hermes:~ # ls -al /exports insgesamt 100008 drwxr-xr-x 2 root root 60 2006-04-03 12:39 drwxr-xr-x 23 root root 4096 2006-03-25 21:16 -rw-r--r-- 1 root root 102400000 2006-04-03 12:33 -rw------- 1 root root 270336 2006-04-03 12:39
. .. nbd-export nbd-export-127.0.0.1-7812.diff
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
69
SYSADMIN | NBD
Sistema de arquivos
Dispositivo de bloco Cowloop Leitura
Leitura e escrita
(Arquivo esparso) Arquivo editável
Dispositivo de bloco Somente leitura
Figura 4 O dispositivo de blocos Cowloop (no alto) depende de dois recursos: um dispositivo somente leitura (esquerda) é a base, e todos os blocos modificados são armazenados num arquivo separado (direita). O conteúdo do dispositivo de blocos original permanece inalterado.
espaço de usuário adiantado) parece uma possibilidade para substituir as duas soluções anteriores num futuro não muito distante. InitramFS é um conjunto de estruturas especiais do kernel que podem ser mapeadas para um sistema de arquivos raiz padronizado, que pode tanto ser embutido no kernel sob um TempFS (de forma semelhante ao ramdisk inicial) quanto ser mantido e carregado separadamente como um arquivo CPIO. O kernel Linux 2.6.15 e posteriores não usam mais pivot_root para mudar para o outro sistema de arquivos raiz. Ao invés disso, você pode simplesmente redirecionar o ponto de montagem para /. Uma ferramenta chamada run-init (localizada na Klibc) apaga os dados antes guardados nesse ponto.
Alternativas
Além do NBD, várias outras implementações livres dos dispositivos de blocos de rede também estão disponíveis, como ENBD [4], GNBD [6] e ANBD [3] (veja a tabela Variantes do NBD). Esses drivers de dispositivos de blocos não fazem parte do kernel atualmente, e a maioria das distribuições não os inclui. Embora a instalação seja mais complexa, pois é
necessário compilar a partir do códigofonte, o ENBD suporta o tratamento de erros, reconexão automática em caso de queda, canais múltiplos, entre outros recursos.
Dispensando os fios
O DNBD [5] (Distributed Network Block Device) foi feito especialmente para operações sem disco em redes sem fio. Nesse cenário, os clientes se associam a um ponto de acesso e compartilham
freqüências. Somente um cliente pode transmitir por vez, um fato que é piorado pela banda restrita de 54Mbps dos padrões atuais IEEE 802.11b/a/g. Como todos os clientes compartilham o meio de transmissão da rede, a taxa de transferência de dados disponível é reduzida para cada dispositivo adicional que tenta inicializar simultaneamente. O DNBD tenta minimizar o volume de dados tanto quanto possível, enquanto ao mesmo tempo aumenta as capacidades da rede sem fio. Para atingir esse objetivo, o DNBD consegue funcionar sem mecanismos de travamento e só suporta o acesso de leitura. Além disso, o tráfego de dados do DNBD é visível para todos os clientes ligados à rede (figura 6), e os clientes fazem cache de todos os blocos que o servidor transmite, independentemente de para qual cliente ele objetivar. Afinal, é provável que os outros clientes venham a precisar do bloco em algum momento. Apesar de o meio compartilhado numa rede sem fio permitir que clientes escutem as conversas de outros clientes, nenhuma placa de rede sem fio suporta os modos promíscuo ou de monitoramento. Para contornar isso, o DNBD usa IP multicasting para se comunicar com um grupo de clientes simultaneamente. Para permitir que isso aconteça, o DNBD se baseia no protocolo UDP independente de conexão. O DNBD cuida sozinho dos pacotes perdidos e outros problemas de comunicação. Ele usa IP multicast de endereços na faixa de rede 224.0.0.0/4, mas 239.0.0.0/8 é o recomendado para você experimentar. Antes de um cliente DNBD conseguir acessar um dispositivo de blocos de rede, ele primeiro tenta descobrir um servidor, enviando um pacote especial
Variantes do NBD Nome
Explicação
NBD
O Network Block Device é o predecessor de todos os dispositivos de blocos de rede do Linux. No momento, só existe um desenvolvedor ativo e uma lista de discussão com volume razoável de tráfego. [1]
ANBD
O Another Network Block Device é uma extensão compatível com NBD criada em 2003. Suporta multithreading e promete melhores mensagens de erro que seu antecessor. [3]
ENBD
O Enhanced Network Block Device está sendo impulsionado por somente um desenvolvedor ativo; existe uma lista de discussão com algumas mensagens por mês. O ENBD estende o NBD, adicionando reconexão automática, autenticação e suporte a mídias removíveis. [4]
DNBD
O Distributed Network Block Device usa UDP como protocolo de transporte, e portanto suporte multicasting, caching pelo lado do cliente e redundância de servidores. Mas só suporta exportações somente leitura. [5]
GNBD
O Global Network Block Device é a base do GFS (Global Filesystem). [6]
http://supertuxbr.blogspot.com 70
http://www.linuxmagazine.com.br
NBD | SYSADMIN
para um endereço multicast específico. A resposta do servidor inclui informações sobre o dispositivo de blocos de rede existente, que os clientes podem usar para configuração. Depois, os clientes podem pedir blocos. Servidores DNBD podem ser replicados em cenários de alta disponibilidade. Os clientes descobrem os servidores automaticamente; coletam dados estatísticos continuamente para conseguirem escolher o servidor com o menor tempo de resposta. Um caching significativo sempre pressupõe propriedades da localidade. Os clientes necessitam da possibilidade de acessar o mesmo bloco por um período de tempo limitado para tirarem proveito dessa solução. Essas condições se aplicam quando um grande número de clientes sem disco inicializam simultaneamente numa rede sem fio. Mas também funciona para conteúdo multimídia: múltiplos clientes podem reproduzir um DVD através de uma WLAN, e o cache ainda vai funcionar se cada cliente estiver num ponto diferente da reprodução. A página do projeto DNBD inclui um Howto de instalação que descreve o download do DNBD pelo Subversion e sua compilação. Você necessita dos fontes ou dos cabeçalhos do kernel, sendo
NFS
Para o servidor
Union-FS
Ext 2
Tmp-FS
Squash-FS
Ext 3
Sistemas de arquivos Cache do buffer Dispositivo de bloco Cowloop
NBD
DNBD
ISCSI
Para o servidor Figura 5 Uma combinação das técnicas discutidas neste artigo é possível. A maioria dos dispositivos de blocos possuem sistemas de arquivos baseados em blocos. As exceções são o Cowloop e o UnionFS, que fornecem uma nova camada gravável baseada em dispositivos de blocos ou sistemas de arquivos.
que talvez seja preciso modificar o caminho até o kernel em kernel/Makefile. Assim como qualquer outro dispositivo de blocos de rede, o DNBD tem alguns problemas com várias combinações de agendadores de entrada e saída com sistemas de arquivos, principalmente em operações sem disco.
Apesar de o PXE Linux (Pre-boot Execution Environment) [7] e o Etherboot [8] terem sido criados para suportar a inicialização de PCs por Ethernet, um padrão para a mesma tarefa em redes sem fio ainda não surgiu. Ao invés de utilizar a rede para enviar o kernel e o ramdisk para a máquina, chaveiros USB
Os Thin Clients da ThinNetworks
Melhor relação custo benefício do mercado e funcionalidades exclusivas O TC-NET revoluciona o mercado de ThinClients ao apresentar um sistema operacional baseado em Linux e funcionalidades exclusivas, o TC-OS. Compatível com a maioria dos servidores de terminal existentes, essa solução agrega redução de custos de aquisição e atualização, facilidade de instalação e manutenção, maior estabilidade e confiabilidade, maior segurança, baixo consumo de energia e tamanho compacto.
10100101010 101010101010101010101
10100101010 101010101010101010101
1100110101100101101010001011
1100110101100101101010001011
101001010101010101010
O sistema Operacional TC-OS Recursos de administração centralizados; Servidor VNC para permitir o controle remoto de cada ThinClient; Disponível com Flash (64mb ou 128mb) ou na versão PXE para uso com LTSP; Clientes para CITRIX-ICA, Microsoft RDP 5.1, XDMCP e VNC e Tarantella;
http://supertuxbr.blogspot.com Diversos aplicativos para uso local (navegador, Java, Skype, Linux Magazinede #23 tela | Setembro de 2006 protetor e outros).
Fone: (61) 3366-1333 Skype: ThinNetworks 71 vendas@thinnet.com.br www.thinnetworks.com.br
SYSADMIN | NBD
e cartões Compact Flash conectados à porta IDE são bons carregadores do kernel. Além disso, o init no InitramFS recebe a tarefa adicional de configurar os parâmetros da rede sem fio antes da configuração do IP.
Bem bloqueado
Cache do cliente
Cache do cliente
O NFS causa uma sobrecarga considerável, o que Cache do cliente é um grande problema se você lidar com muitos arquivos pequenos. Mais especificamente, os scripts típicos de runlevel, configuração do sistema e Figura 6 O Distributed NBD é mais apropriado para redes sem fio. Quando um computador pede um bloco, o servidor envia o bloco para todos os clientes por multicast. Isso economiza tempo e banda se o próximo administração de um siscliente precisar do mesmo bloco. tema Linux dificultam a vida do NFS. E a situação é agravada pelos novos truques que as distribuições modernas nisso, mostrando-se muito mais compeempregam nos monitores de sistemas de tente em alternar transparentemente Os dispositivos de blocos de rede no arquivo e outros componentes, gerando entre servidores, do ponto de vista do Linux não foram feitos para aposentar cliente. Os administradores podem até o tradicional sistema de arquivos de um fluxo constante de dados NFS. Dispositivos de blocos de rede funcionam acrescentar e remover servidores dinami- rede, mas certamente oferecem uma melhor com o cache interno do kernel, e camente sem que os usuários percebam, opção interessante para clientes sem um sistema inativo então não gerará quase oferecendo assim uma forma elegante de disco. As técnicas descritas neste artinenhum tráfego de rede. Ao abrir um ar- contornar um ponto singular de falhas go ajudarão na tarefa de fornecer um quivo, o Linux só lê o bloco uma vez para potencialmente desastroso em caso de serviço de arquivos rápido e confiável ter certeza das permissões, dono, ou data da falhas do servidor. na sua própria rede. ■ última alteração, e para obter um ponteiro para o arquivo. O NFS necessita de várias chamadas RPC para o mesmo fim. Mais Informações As operações com NFS também [1] NBD (Network Block Device): http://nbd.sourceforge.net podem ser otimizadas. Deixar a configuração e as rotinas típicas rodarem em [2] Cowloop: http://www.atconsultancy.nl/cowloop/ um ramdisk inicial diminui a distância [3] ANBD (Another Network Block Device): http://www.aros.net/~ldl/anbd/ entre o NFS e o dispositivo de blocos. Usar o compacto SquashFS [9] também [4] ENBD (Enhanced Network Block Device): http://www.it.uc3m.es/ptb/nbd/ é uma opção interessante: em cenários [5] DNBD (Distributed Network Block Device): somente leitura, a pré-compactação do http://lp-srv02a.ruf.uni-freiburg.de/trac/dnbd/ sistema de arquivos pode diminuir o tráfego de rede e fazer melhor uso do [6] GNBD (Global Network Block Device): http://sources.redhat.com/cluster/gnbd/ cache de blocos. [7] PXE-Linux: http://syslinux.zytor.com/pxe.php Usar o UnionFS ou o Cowloop tem um forte efeito. O uso do segundo é res[8] Etherboot: http://etherboot.sourceforge.net trito a um dispositivo de blocos com sis[9] SquashFS: http://squashfs.sourceforge.net tema de arquivos gravável. O UnionFS é útil em qualquer cenário, e também ajudará a diminuir o tráfego. Além disso, Os autores o UnionFS ajuda a reduzir a carga sobre Thorsten Zitterell trabalha para o departamento de sistemas operacioo dispendioso TempFS na RAM, princinais da Universidade de Freiburg, onde faz suas pesquisas sobre sistepalmente em relação aos normalmente mas operacionais de tempo real em microssistemas embarcados. pequenos arquivos de configuração. Dirk von Suchodoletz é assistente no departamento de sistemas de comunicação e está A alta disponibilidade é difícil de atinconstantemente buscando desenhos inteligentes para suportar clientes sem disco no Linux. gir com NFS. O DNBD é especializado
Especialista
http://supertuxbr.blogspot.com 72
http://www.linuxmagazine.com.br
A nova tecnologia da Web
PROGRAMAÇÃO
AJAX
AJAX é o termo da moda. O Google usa AJAX, o Yahoo usa AJAX...todo mundo quer usar o AJAX. Mas, e você, usa? E, o mais importante: que diabos é AJAX? por José María Ruiz e Pedro Orantes
massimo bassi
“B
rave New World” (“Admirável mundo novo”) é o nome do famoso romance de Aldous Huxley, que nos mostra um mundo diferente e aterrador, mas que parecia e parece cada vez mais próximo. Não temos uma visão tão pessimista do mundo, mas é provável que esse título explique todo o alvoroço que o AJAX vem causando. O termo foi cunhado por Jesse James Garrett em [1]. Durante muito tempo as GUIs – interfaces gráficas de usuário – dominaram a informática. Os profissionais da Web estavam sempre tentando convencer o mundo de que, para a maioria dos programas, uma interface Web era o bastante. Mas os usuários estavam acostumados a certas características, como campos que são completados automaticamente, ou o arrastar e soltar, que eram impossíveis na Web. Com o passar do tempo, cada vez mais pessoas propunham soluções. A lista é interminável: JavaScript, Java Applets, Active X, Tcl, VBScript, Macromedia Flash... Mas todas falhavam, de uma maneira ou de outra. No caso do Java, para se executar o applet era necessário ter instalado a máquina virtual Java, e a maioria dos usuários nem sabiam o que era aquilo que estava sendo pedido. O mesmo ocorria com o Macromedia Flash. O pior era que quando o tema “instalação do software adequado” estava
solucionado, os desenvolvedores criavam (como ainda criam) páginas horríveis, cheias de coisas se movendo, que distraem e irritam. Sentiam-se impulsionados a usar até a última funcionalidade das novas ferramentas e acabavam gerando monstruosidades. Essa fase quase já passou, e agora felizmente se busca a simplicidade, e nesse exato momento surgiu o AJAX. Para mais informações, veja o site em [2].
O que é AJAX?
Muito boa pergunta. A verdade é que o AJAX estava o tempo todo debaixo de nossos narizes, esperando que alguma mente mais atenta o descobrisse. O termo “AJAX” consiste de um acrônimo de Asynchronous JavaScript And XML (JavaScript e XML assíncronos), e curiosamente sua existência se deve a uma dessas famosas violações dos padrões que a Microsoft costuma realizar com seus produtos. Em 1998, a Microsoft introduziu dentro de seus produtos uma biblioteca que permitia fazer consultas usando o protocolo HTTP de maneira autônoma e assíncrona. Quando o seu navegador acessa uma página que contém código JavaScript, esse código por sua vez pode trazer informações dessa ou de outras páginas de maneira independente. Se, além disso, fizermos com que esse código
– ww w.sxc.hu
permaneça em execução respondendo a eventos, teremos nas mãos a possibilidade de trazer informação para o navegador sem carregar a página. Isso é útil para algumas tarefas, mas não muito, já que faltam algumas peças em nosso quebra-cabeças. A primeira peça é a adoção dessa biblioteca por quase todos os navegadores, para que o código possa ser de aplicação universal. Além disso, o resultado é que podemos modificar o conteúdo da página em tempo real, usando a chamada árvore DOM. Como se isso não fosse suficiente, quando o AJAX foi definido, os programadores começaram a usar protocolos XML para se comunicarem com servidores. E o que isso quer dizer? Que agora, com o AJAX, podemos carregar uma página e, sem ter que recarregá-la, obter
Os problemas com o IE O Internet Explorer, apesar de ter sido o primeiro a introduzir o XMLHTTPRequest, é o que mais apresenta problemas de uso. O código aqui mostrado nem sequer funciona no IE, devido ao fato de ele utilizar um componente ActiveX para estabelecer a conexão. Existem diversas técnicas para permitir a compatibilidade entre navegadores, mas devido à limitação de páginas deste artigo e sua complexidade, não iremos mostrá-las. O leitor que estiver interessado na compatibilidade pode estudar o código de sistemas de código livre que implementam AJAX, como é o caso do Sarissa [3].
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
73
PROGRAMAÇÃO | Python
E onde entra o Python?
Figura 1 Esquema da nossa aplicação AJAX com todos os seus componentes.
informação, modificar a página em tempo real e interagir com servidores remotos usando protocolos XML. Basicamente, uma vez carregada a página Web, temos em mãos todas as possibilidades de programação de uma GUI tradicional. E tudo isso sem a necessidade de plugins nem instalações – toda essa tecnologia está em nossos computadores, esperando para ser usada.
Vamos construir um pequeno servidor de conteúdo em Python, que possa ser consultado usando-se AJAX. Criaremos uma página Web com um pouco de código JavaScript, que acessará nosso servidor Python em intervalos pré-definidos e modificará o aspecto da página Web.
Os cinco ingredientes
Os cinco ingredientes necessários para elaborar nosso produto são CSS, JavaScript, HTML, XML e Python, conforme mostrado na figura 1. Cada um deles terá uma função específica em nosso projeto. O HTML é a base sobre a qual iremos trabalhar; definiremos uma página Web onde tudo vai acontecer. Na verdade, com o passar do tempo, o próprio HTML aca-
bou se convertendo em uma espécie de palmilha na qual o CSS e o JavaScript se moldam confortavelmente. O CSS nos permite outorgar propriedades visuais aos elementos do HTML. O JavaScript é o encarregado de atuar na máquina cliente, mais especificamente no navegador, e pode modificar tanto o HTML como as propriedades visuais que o CSS define. Com a chamada XMLHttpResponse, são disparadas as suas atribuições. Agora o HTML é visto como uma linguagem de programação de pleno direito. Nos próximos anos, pode ser que adquira muito mais importância do que tem tido até agora. O XML é a nova linguagem de intercâmbio de informações. Praticamente qualquer linguagem já dispõe de bibliotecas para gerar e analisar documentos XML. Dentro do círculo de profissionais Web, o AJAX tornou-se o padrão para o intercâmbio de informações com o servi-
Exemplo 1: python.py 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#!/usr/local/bin/python import BaseHTTPServer import os import cgi class AJAXHTTPRequestHandler (BaseHTTPServer.BaseHTTPRequestHandler): “”” Responde a requisições HTTP “”” def do_GET(self): “Gerencia os GET” acoes = { “/” : [“envia_arquivo”,”index.html”], “/ps.xml” : [“envia_comando”, “ps afx”], “/df.xml”: [“envia_comando”, “df”], “/who.xml”: [“envia_comando”,”who”], “/uname.xml”: [“envia_comando”,”uname -a”]} if self.path in acoes.keys(): acao = acoes[self.path] (getattr(self,acao[0]))(self.path,acao[1]) else: if (self.path[-3:] == “.js” or self.path[-4:] == “.css”): self.envia_arquivo(“”,self.path[1:]) else: self.envia_arquivo(“”,”404.html”) def envia_arquivo(self,caminho,arquivo): # Não usamos caminho, mas assim simplificamos o código p = Pagina(arquivo) self.enviar_resposta(p.tipo(), p.conteudo()) def envia_comando(self,caminho,comando): c = Comando(comando) self.enviar_resposta(c.tipo(), c.conteudo()) def enviar_resposta(self, tipo, conteudo): self.enviar_cabecalho(tipo) self.wfile.write(conteudo) def enviar_cabecalho(self, tipo): self.send_response(200) self.send_header(“Content-type”,”text/” + tipo)
44 self.end_headers() 45 class Pagina: 46 def __init__(self,nome): 47 self.nome = nome 48 self.texto = “” 49 arquivo = file(self.nome) 50 self.texto = arquivo.read() 51 arquivo.close() 52 def conteudo(self): 53 return self.texto 54 def tipo(self): 55 tipo = “html” 56 ext = self.nome[-4:] 57 if (ext == “html”): 58 tipo = “html” 59 elif (ext == “.xml”): 60 tipo = “xml” 61 elif (ext == “.css”): 62 tipo = “css” 63 return tipo 64 class Comando: 65 def __init__(self,comando): 66 self.lixo = os.popen(comando) 67 self.xml = “” 68 69 def conteudo(self): 70 # arquivo XML 71 if not self.xml: 72 self.xml = “<?xml version=\”1.0\” ?>” 73 self.xml += “<saida>” 74 linha = self.lixo.readline()[:-1] # para eliminar \n 75 while linha: 76 self.xml += “<linha>” + cgi.escape(linha) + “</linha>” 77 linha = self.lixo.readline()[:-1] 78 self.xml += “</saida>” 79 return self.xml 80 def tipo(self): 81 return “xml” 82 def test(HandlerClass = AJAXHTTPRequestHandler, ServerClass = BaseHTTPServer.HTTPServer): 83 BaseHTTPServer.test(HandlerClass, ServerClass) 84 if __name__ == ‘__main__’: 85 test()
http://supertuxbr.blogspot.com 74
http://www.linuxmagazine.com.br
Python | PROGRAMAÇÃO
dor e para a serialização de objetos com protocolos como JSON. E, como não poderia deixar de ser, o Python. Em nosso caso, ele se encarregará tanto da realização das tarefas de servidor HTTP quanto de recolher informação importante e usá-la para gerar arquivos XML. Teremos que reunir todos esses elementos para realizar nosso projeto. O objetivo é que os componentes HTML, JavaScript, CSS e XML sejam os mais estáticos possíveis, já que todos eles devem interagir com o usuário. É no servidor Python que devemos depositar a flexibilidade necessária, como adicionar novas características sem ter que mudar nenhum dos outros elementos.
A parte do Python: BaseHTTPRequest O Python dispõe, em suas bibliotecas padrão, de muitos “esqueletos” para diferentes tipos de servidores. Entre elas encontramos a BaseHttpRequest. Essa classe nos permite construir servidores HTTP sem muito esforço, e por isso vamos empregá-la. Mas não devemos usá-la diretamente, a não ser através da classe BaseHttpRequestHandler, que é a encarregada de gerenciar os eventos que acontecem no servidor. Portanto, partiremos dela e criaremos uma classe chamada AJAXHttpRequestHandler – ver exemplo 1 (todos os exemplos deste artigo podem ser baixados em [4], em sua versão original em espanhol). Um servidor HTTP recebe diferentes tipos de comandos, mas o que nos interessa é o comando GET. Ele é usado para solicitar informação ao servidor. Cada vez que uma solicitação GET é realizada, o método do_GET de BaseHTTPRequest é invocado. Por isso vamos redefini-lo em nossa classe. Ao se invocar do_GET na variável de instância self.path, é encontrada a rota solicitada pelo cliente. Iremos confrontar essa rota com as que aceitamos. Caso não se encontre entre elas, respondemos com a célebre página 404, indicando que a página solicitada não existe. A informação é devolvida usando-se o método self.wfile. write(); o que for escrito nele será devolvido ao cliente que fez a solicitação. Além do arquivo index.html, oferecemos uma série de serviços em forma de arquivos XML. Esses serviços se basearão na execução de um comando de sistema, e a conversão de sua saída em um arquivo XML. O formato do arquivo será muito simples:
<?xml version=\”1.0\” ?> <saida> <linha>linha de saida</linha> ... <linha>linha de saida</linha> ... <linha>linha de saida</linha> </saida>
Por isso iremos gerar o arquivo XML à mão, sem fazer uso de bibliotecas. Dessa maneira, quando o cliente solicitar o arquivo ps.xml, nosso servidor executará o comando ps afx, criará o arquivo ps.xml com a saída do comando e o enviará ao cliente.
Definição de serviços
Para permitir que a definição de serviços seja a mais simples possível, basta introduzir uma nova entrada no dicionário acoes da classe AJAXHTTPRequestHandler, com a seguinte estrutura: <caminho> : [<metodo_a_invocar> ➥.<comando_a_executar>],
Quando se solicita o comando HTTP
GET, o caminho é buscado nesse dicionário.
Figura 2 A classe BaseHTTPRequest gera uma entrada por comando.
formato chave: valor, que dá informação ao cliente – o navegador – sobre o arquivo devolvido. Devido a problemas de espaço, decidimos devolver apenas o formato do arquivo. Para isso, invocamos o método envia_cabecalho a partir de envia_resposta, antes de enviar o arquivo em si. É dessa maneira que o navegador determina o tipo de arquivo que vai receber e suas características. Ao iniciarmos o servidor, veremos que vão aparecendo mensagens correspondentes aos diferentes comandos enviados. A classe BaseHTTPRequest gera uma entrada para cada uma (ver figura 2).
Caso ele esteja presente, será executado o método armazenado, usando como parâmetro o caminho e o comando. Isso nos dá uma grande flexibilidade; adicionar Para administrar os serviços, foram criadas um novo serviço consiste em introduzir as classes Pagina e Comando, que respondem aos mesmos métodos. A primeira se encaruma nova linha de código. Há um detalhe importante: todo arqui- rega dos pedidos de arquivos de texto, que vo devolvido usando HTTP deve ter um em nosso programa resumem-se ao arquivo cabeçalho com uma série de linhas com index.html e seus arquivos suplementares,
Gestores de serviços
Exemplo 2: arquivo index.html 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
<html> <head> <title>Testes com AJAX</title> <link rel=”stylesheet” href=”estilo.css” type=”text/css” /> <script language=”JavaScript” src=”ajax.js”> </script> </head> <body> <div id=”documento”> <h3 id=”titulo”>Informação do sistema</h3> <input type=”button” name=”button” value=”Processos” onclick=”JavaScript:Requisita(‘ps.xml’);” /> <input type=”button” name=”button” value=”Disco” onclick=”JavaScript:Requisita(‘df.xml’);” /> <input type=”button” name=”button” value=”Usuários” onclick=”JavaScript:Requisita(‘who.xml’);” /> <input type=”button” name=”button” value=”Máquina” onclick=”JavaScript:Requisita(‘uname.xml’);” /> <div id=”contêiner”> <div id=”dados”></div> </div> </div> </body> </html>
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
75
PROGRAMAÇÃO | Python
Exemplo 3: ajax.js.
NOME DA SEÇÃO
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
// GLOBAIS var http_request = false; function Requisita(url) { http_request = false; http_request= new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType(‘text/xml’); } if (!http_request) { alert(‘Erro criando a instancia de XMLHttpRequest.’); return false; } // Isso eh um callback, que se dispara ao terminar de // baixar o arquivo XML. http_request.onreadystatechange = modificaConteudo; http_request.open(‘GET’, url, true); http_request.send(null); } // Elimina todos os elementos com id “linha” function esvaziaConteudo(){ var d = document.getElementById(“conteiner”); while(document.getElementById(“linha0”) || document.getElementById(“linha1”)){ nodo = document.getElementById(“linha0”); if (! noh){ noh = document.getElementById(“linha1”); } var noh_varredura = d.removeChild(noh); } } // Carrega o resultado do XML function modificaConteudo() { if (http_request.readyState == 4) { if (http_request.status == 200) { esvaziaConteudo(); var xmldoc = http_request.responseXML; var root = xmldoc.getElementsByTagName(‘saida’).item(0); var fundo = 0; for(var i = 0; i < root.childNodes.length; i++){ var noh = root.childNodes.item(i); var conteiner = document.getElementById(“conteiner”); var p = document.createElement(“p”); // Truque para as cores ;) if (fundo == 0) { p.setAttribute(“id”,”linha0”);} else { p.setAttribute(“id”,”linha1”); } fundo = 1 - fundo; var titulo = document.getElementById(“dados”); p.textContent = noh.firstChild.data; conteiner.insertBefore(p,titulo); } } else { alert(‘Houve um problema com a requisição.’); } } }
arquivo JavaScript e CSS. Basicamente, eles são carregados em uma variável e, mediante o método conteudo, as demais classes têm acesso aos mesmos. Nesse caso, o parâmetro caminho não afeta essa classe, mas foi definido para que se preserve a compatibilidade com a classe Comando. A classe Comando executa um comando especificado e permite o acesso ao texto devolvido por esse comando, através do mesmo método que a classe Pagina. Dessa maneira, as duas classes são intercambiáveis. Ambas as classes possuem um método tipo(), que devolve o tipo de arquivo que armazenam. No caso de Comando, sempre será um arquivo XML, mas Pagina deve “adivinhar” o tipo dos arquivos que devolve. Para isso, ela examina a extensão do arquivo. Para manter a simplicidade, consideramos três extensões. Quando um comando é executado por Comando, tem-se um cuidado especial em utilizar a função cgi.escape em cada linha. Essa função realiza algumas conversões dentro do texto que lhe é passado, para que possa ser visualizado corretamente pelo navegador web. O problema se agrava porque certos caracteres, tais como “<” ou “ (aspas) são especiais e, se não forem omitidos, ou forem precedidos de um “\“, causarão problemas. Com isso, conseguimos definir um servidor web básico. O Python nos permite realizar tarefas complexas com pouco código, e esse é um desses casos. Agora vamos colocar o AJAX para compreendê-lo e interpretá-lo.
HTML
Talvez este seja um dos artigos onde o Python tenha o papel menos importante. Mas com cinco outros atores de peso, a situação tende a ser complicada. Vejamos o HTML. O exemplo 2 mostra a página index.html. Basicamente, o código carrega um arquivo JavaScript, um arquivo CSS e mostra um título junto de alguns botões, os quais invocam ações em JavaScript. Devemos nos concentrar especialmente no uso do atributo id em várias etiquetas HTML. Graças a esses id, poderemos manipulá-las através do JavaScript.
JavaScript por outra perspectiva Muita gente tem uma má impressão do JavaScript. Essa linguagem é rara e, sem exagero, não muito útil. Ela permite modificar cores em páginas Web ou inserir faixas sem muito efeito. Isso para não falar das famosas janelas pop-up.
http://supertuxbr.blogspot.com 76
http://www.linuxmagazine.com.br
Python | PROGRAMAÇÃO
Isso fez com que ela ganhasse má fama, tanto que quase todos nós temos restrições em nossos navegadores em relação às ações que o JavaScript pode ou não realizar. O mais comum é que tenhamos um desses famosos bloqueadores de pop-ups. Mas o JavaScript se reintegrou à sociedade dos programadores pela porta da frente graças a um único objeto. Estamos nos referindo ao famoso XMLHttpRequest. No código do exemplo 3, vemos uma linguagem que talvez nos lembre Java. Na verdade, não tem nada a ver, exceto pelo nome. Em nosso exemplo, vemos três funções: ➧ Requisita() ➧ modificaConteudo() ➧ esvaziaConteudo() O JavaScript, além de muitas das características presentes em outras linguagens (e algumas ausentes), dispõe de uma coleção de objetos que lhe permitem realizar operações. Hoje em dia, as mais importantes são: ➧ Manipulação DOM ➧ Manipulação XML ➧ XMLHTTP O DOM permite ao JavaScript manipular, em tempo real, o conteúdo da página Web. Pode acrescentar, modificar ou finalizar etiquetas e atributos, através dos quais podemos operar sobre o documento de todas as formas possíveis. O JavaScript pode manipular um arquivo XML da mesma forma que o DOM faz. E a grande novidade: o JavaScript pode realizar conexões assíncronas com o servidor. Assíncronas está destacado em negrito porque é aí que está a chave. Isso significa que podemos fazer conexões, baixar documentos XML do servidor e realizar operações DOM ou de qualquer outro tipo, quando quisermos! O usuário carrega sua página Web e, uma vez carregada, sem que haja necessidade de recarregá-la, pode modificá-la a seu gosto com base na informação que pede ao servidor, a qualquer momento. De volta às nossas funções, a função Requisita() recebe uma URL, cria o objeto XMLHttpRequest e, depois de alguns
Figura 3 Nossa página mostra os resultados da consulta sem precisarmos recarregá-la.
testes, concede uma função para invocar quando for completamente descarregado o arquivo que essa URL especifica. Isso significa que, enquanto lemos nossa Web, o JavaScript estará baixando um arquivo e, ao terminar, vai chamar a função modificaConteudo. Mas o que essa função faz? Verifica o estado da solicitação (200 significa totalmente correto, e 404 é para “sentimos muito, mas o arquivo solicitado não está disponível”), e então obtém o documento XML do objeto que administra a conexão. Mas, antes, invoca esvaziaConteudo(), que localiza todas as etiquetas com as ids linha0 ou linha1 e as elimina da página. Fazemos isso porque em seguida voltaremos a introduzi-las na página, mas dessa vez com os dados frescos do servidor. Não queremos entrar em detalhes, já que, em teoria, este é um artigo sobre Python e não JavaScript, mas basicamente é isso que faz o arquivo ajax.js. O arquivo estilo.c, que aparece no exemplo 4, simplesmente configura as cores e características de algumas das etiquetas, para que o aspecto fique melhor. Pronto, aqui temos nossa aplicação AJAX. A figura 3 mostra o resultado final. Quando pressionarmos qualquer um dos botões, será carregada a saída de texto da execução associada a cada um deles na tela, mas sem carregar a página. Se quisermos acrescentar um novo coman-
Mais Informações [1] AJAX, por Jesse James Garret: http://www.adaptivepath.com/publications/essays/archives/000385.php [2] AJAX na Wikipédia: http://en.wikipedia.org/wiki/AJAX [3] Sarissa: http://sarissa.sourceforge.net/doc/ [4] Exemplos completos de código deste artigo, comentados: http://www.linux-magazine.es/Magazine/Downloads/12
do, temos apenas que introduzir a linha correspondente em acoes em server.py e acrescentar um novo botão como os que já existem em index.html.
Conclusão
Esse negócio de AJAX é tão complicado assim? Mas é claro que não! Acontece que essa é uma palavra que está se transformando em um mito, mas não deixa de ser uma astuta combinação de programação no servidor e no cliente, além do uso intensivo de HTMLHttpRequest. Pouco a pouco o AJAX está povoando todas as páginas Web e a maioria dos currículos. Quem sabe, dentro de dois anos essa palavra tenha tanto poder quanto outra de quatro letras: J2EE. ■
Exemplo 4: estilo.css 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#documento{ margin-left: 100px; } #titulo{ text-decoration: underline; } #linha0 { margin: 0px; padding-left: 20px; background: #e0e0e0; font-family: monospace; } #linha1 { margin: 0px; padding-left: 20px; font-family: monospace; } #conteiner{ border-style: dashed; border-width: 1px; width: 600px; border-color: black; }
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
77
Linux.local
SERVIÇOS
O maior diretório de empresas que oferecem produtos, soluções e serviços em Linux e Software Livre, organizado por estado. Sentiu falta do nome de sua empresa aqui? Entre em contato com a gente: 11 2161-5400 ou anuncios@linuxmagazine.com.br
Fornecedor de Hardware = 1 Redes e Telefonia / PBX = 2 Integrador de Soluções = 3 Literatura / Editora = 4 Fornecedor de Software = 5 Consultoria / Treinamento = 6
Empresa
Cidade
Endereço
Telefone
Web
1 2 3 4 5 6 ✔ ✔
Espírito Santo Linux Shopp
Vila Velha
Rua São Simão (Correspondência), 18 – CEP: 29113-120
27 3082-0932
www.linuxshopp.com.br
Megawork Consultoria e Sistemas
Vitória
Rua Chapot Presvot, 389 – Praia do Canto – CEP: 29055-410 sl 201, 202
27 3315-2370
www.megawork.com.br
✔
✔ ✔
Spirit Linux
Vitória
Rua Marins Alvarino, 150 – CEP: 29047-660
27 3227-5543
www.spiritlinux.com.br
✔
✔ ✔
✔ ✔
Minas Gerais Instituto Online
Belo Horizonte
Av. Bias Fortes, 932, Sala 204 – CEP: 30170-011
31 3224-7920
www.institutoonline.com.br
Linux Place
Belo Horizonte
Rua do Ouro, 136, Sala 301 – Serra – CEP: 30220-000
31 3284-0575
corporate.linuxplace.com.br
✔ ✔ ✔
✔ ✔ ✔
TurboSite
Belo Horizonte
Rua Paraíba, 966, Sala 303 – Savassi – CEP: 30130-141
0800 702-9004
www.turbosite.com.br
✔
✔ ✔
Microhard
Belo Horizonte
Rua República da Argentina, 520 – Sion – CEP: 30315-490
31 3281-5522
www.microhard.com.br
✔ ✔ ✔
✔ ✔
✔ ✔
✔
Paraná iSolve
Curitiba
Av. Cândido de Abreu, 526, Cj. 1206B – CEP: 80530-000
41 252-2977
www.isolve.com.br
Mandriva Conectiva
Curitiba
Rua Tocantins, 89 – Cristo Rei – CEP: 80050-430
41 3360-2600
www.mandriva.com.br
NSI Training
Rio de Janeiro
Rua Araújo Porto Alegre, 71, 4ºandar Centro – CEP: 20030-012 21 2220-7055
www.nsi.com.br
✔
✔
Open IT
Rio de Janeiro
Rua do Mercado, 34, Sl, 402 – Centro – CEP: 20010-120
21 2508-9103
www.openit.com.br
✔
✔
Unipi Tecnologias
Campos dos Goytacazes
Av. Alberto Torres, 303, 1ºandar - Centro – CEP 28035-581
22 2725-1041
www.unipi.com.br
✔ ✔ ✔ ✔
Solis
Lajeado
Rua Comandante Wagner, 12 – São Cristóvão – CEP: 95900-000
51 3714-6653
www.solis.coop.br
✔ ✔ ✔ ✔ ✔
✔ ✔ ✔ ✔
Rio de Janeiro
Rio Grande do Sul
DualCon
Novo Hamburgo
Rua Joaquim Pedro Soares, 1099, Sl. 305 – Centro
51 3593-5437
www.dualcon.com.br
✔
✔
Datarecover
Porto Alegre
Av. Carlos Gomes, 403, Sala 908, Centro Comercial Atrium Center – Bela Vista – CEP: 90480-003
51 3018-1200
www.datarecover.com.br
✔
✔
LM2 Consulting
Porto Alegre
Rua Germano Petersen Junior, 101-Sl 202 – Higienópolis – CEP: 90540-140
51 3018-1007
www.lm2.com.br
Av. Venâncio Aires, 1137 – Rio Branco – CEP: 90.040.193
51 3331-1446
Lnx-IT Informação e Tecnologia Porto Alegre
✔ ✔
✔
✔ ✔
www.lnx-it.inf.br
✔
✔
✔ ✔
Plugin
Porto Alegre
Av. Júlio de Castilhos, 132, 11º andar Centro – CEP: 90030-130 51 4003-1001
www.plugin.com.br
✔
✔
✔
TeHospedo
Porto Alegre
Rua dos Andradas, 1234/610 – Centro – CEP: 90020-008
51 3286-3799
www.tehospedo.com.br
✔ ✔
Redix
Blumenau
Rua 02 de Setembro, 733, sl 08. CEP 89052-000
47 3323-7313
www.redix.com.br
Santa Catarina ✔ ✔
✔ ✔
São Paulo Ws Host
Arthur Nogueira
Rua Jerere, 36 – Vista Alegre – CEP: 13280-000
19 3846-1137
www.wshost.com.br
✔
DigiVoice
Barueri
Al. Juruá, 159, Térreo – Alphaville – CEP: 06455-010
11 4195-2557
www.digivoice.com.br
✔ ✔ ✔
✔ ✔
Dextra Sistemas
Campinas
Rua Antônio Paioli, 320 – Pq. das Universidades – CEP: 13086-045
19 3256-6722
www.dextra.com.br
✔
✔ ✔
✔
Insigne Free Software do Brasil Campinas
Av. Andrades Neves, 1579 – Castelo – CEP: 13070-001
19 3213-2100
www.insignesoftware.com
Microcamp
Campinas
Av. Thomaz Alves, 20 – Centro – CEP: 13010-160
19 3236-1915
www.microcamp.com.br
Savant Tecnologia
Diadema
Av. Senador Vitorino Freire, 465 – CEP: 09910-550
11 5034-4199
www.savant.com.br
Epopéia Informática
Marília
Rua Goiás, 392 – Bairro Cascata – CEP 17509-140
14 3413-1137
www.epopeia.com.br
Redentor
Osasco
Rua Costante Piovan, 150 – Jd. Três Montanhas – CEP: 06263-270
11 2106-9392
www.redentor.ind.br
Go-Global
Santana de Parnaíba Av. Yojiro Takaoca, 4384, Ed. Shopping Service, Cj. 1013 – CEP: 06541-038
11 2173-4211
www.go-global.com.br
AW2NET
Santo André
Rua Edson Soares, 59 – CEP: 09760-350
11 4990-0065
www.aw2net.com.br
Async Open Source
São Carlos
Rua Orlando Damiano, 2212 – CEP 13560-450
16 3376-0125
www.async.com.br
✔
Delix Internet
São José do Rio Preto
Rua Voluntário de São Paulo, 3066 9º – Centro – CEP: 15015-909
11 4062-9889
www.delixhosting.com.br
✔
4Linux
São Paulo
Rua Teixeira da Silva, 660, 6º andar – CEP: 04002-031
11 2125-4747
www.4linux.com.br
✔
✔
✔ ✔ ✔
✔
✔ ✔ ✔
✔ ✔
✔ ✔ ✔
✔ ✔ ✔ ✔ ✔ ✔
✔
✔ ✔ ✔
http://supertuxbr.blogspot.com 78
http://www.linuxmagazine.com.br
Linux.local | SERVIÇOS
Empresa
Cidade
Endereço
Telefone
Web
1 2 3 4 5 6
São Paulo (continuação) A Casa do Linux
São Paulo
Al. Jaú, 490 – Jd. Paulista – CEP 01420-000
11 3549-5151
www.acasadolinux.com.br
✔
✔ ✔
Accenture do Brasil Ltda.
São Paulo
Rua Alexandre Dumas, 2051 – Chácara Santo Antônio – CEP: 04717-004
11 5188-3000
www.accenture.com.br
✔
✔ ✔
ACR Informática
São Paulo
Rua Lincoln de Albuquerque, 65 –Perdizes – CEP: 05004-010
11 3873-1515
www.acrinformatica.com.br
✔
✔
Agit Informática
São Paulo
Rua Major Quedinho, 111, 5º andar, Cj. 508 – Centro – CEP: 01050-030
11 3255-4945
www.agit.com.br
✔ ✔
✔
Altbit - Informática Comércio e Serviços LTDA.
São Paulo
Av. Francisco Matarazzo, 229, Cj. 57 – Água Branca – CEP 05001-000
11 3879-9390
www.altbit.com.br
✔
AS2M -WPC Consultoria
São Paulo
Av. Tiradentes, 615, Ed. Santiago, 2º andar Bom Retiro – CEP: 01101-010
11 3228-3709
www.wpc.com.br
✔
✔ ✔
✔
✔ ✔
Big Host
São Paulo
Rua Dr. Miguel Couto, 58 – Centro – CEP: 01008-010
11 3033-4000
www.bighost.com.br
✔
✔ ✔
Blanes
São Paulo
Rua André Ampére, 153 – 9º andar – Conj. 91 CEP: 04562-907 (próx. Av. L. C. Berrini)
11 5506-9677
www.blanes.com.br
✔ ✔ ✔
✔ ✔
Commlogik do Brasil Ltda.
São Paulo
Av. das Nações Unidas, 13.797, Bloco II, 6º andar – Morumbi – CEP: 04794-000
11 5503-1011
www.commlogik.com.br
✔ ✔ ✔
✔ ✔
Computer Consulting Projeto e Consultoria Ltda.
São Paulo
Rua Vergueiro, 6455, Cj. 06 – Alto do Ipiranga – CEP: 04273-100 11 5062-3927
www.computerconsulting.com.br
✔
✔ ✔
Consist Consultoria, Sistemas e Representações Ltda.
São Paulo
Av. das Nações Unidas, 20.727 – CEP: 04795-100
11 5693-7210
www.consist.com.br
Domínio Tecnologia
São Paulo
Rua das Carnaubeiras, 98 – Metrô Conceição – CEP: 04343-080
11 5017-0040
www.dominiotecnologia.com.br
EDS do Brasil
São Paulo
Av. Pres. Juscelino Kubistcheck, 1830 Torre 4 - 5º andar
11 3707-4100
www.eds.com
Ética Tecnologia
São Paulo
Rua Nova York, 945 – Brooklin – CEP:04560-002
11 5093-3025
www.etica.net
Getronics ICT Solutions and Services
São Paulo
Rua Verbo Divino, 1207 – CEP: 04719-002
11 5187-2700
www.getronics.com/br
✔
✔ ✔ ✔ ✔ ✔
✔ ✔ ✔
✔
✔
✔ ✔
✔
✔ ✔
✔
Hewlett-Packard Brasil Ltda.
São Paulo
Av. das Nações Unidas, 12.901, 25º andar – CEP: 04578-000
11 5502-5000
www.hp.com.br
✔
✔ ✔ ✔ ✔
IBM Brasil Ltda.
São Paulo
Rua Tutóia, 1157 – CEP: 04007-900
0800-7074 837
www.br.ibm.com
✔
✔
iFractal
São Paulo
Rua Fiação da Saúde, 145, Conj. 66 – Saúde – CEP: 04144-020 11 5078-6618
www.ifractal.com.br
Integral
São Paulo
Rua Dr. Gentil Leite Martins, 295, 2º andar Jd. Prudência – CEP: 04648-001
11 5545-2600
www.integral.com.br
✔
Itautec S.A.
São Paulo
Rua Santa Catarina, 1 – Tatuapé – CEP: 03086-025
11 6097-3000
www.itautec.com.br
✔ ✔ ✔
Linux Komputer Informática
São Paulo
Av. Dr. Lino de Moraes Leme, 185 – CEP: 04360-001
11 5034-4191
www.komputer.com.br
✔
Linux Mall
São Paulo
Rua Machado Bittencourt, 190, Cj. 2087 – CEP: 04044-001
11 5087-9441
www.linuxmall.com.br
✔
Livraria Tempo Real
São Paulo
Al. Santos, 1202 – Cerqueira César – CEP: 01418-100
11 3266-2988
www.temporeal.com.br
Locasite Internet Service
São Paulo
Av. Brigadeiro Luiz Antonio, 2482, 3º andar – Centro – CEP: 01402-000
11 2121-4555
www.locasite.com.br
Microsiga
São Paulo
Av. Braz Leme, 1631 – CEP: 02511-000
11 3981-7200
www.microsiga.com.br
Novatec Editora Ltda.
São Paulo
R. Luis Antonio dos Santos, 110 – Santana – 02460-000
11 6979-0071
www.novateceditora.com.br
Novell América Latina
São Paulo
✔ ✔
✔
✔ ✔ ✔ ✔ ✔
✔
✔ ✔ ✔ ✔ ✔ ✔ ✔
✔
✔ ✔ ✔
✔ ✔ ✔
Rua Funchal, 418 – Vila Olímpia
11 3345-3900
www.novell.com/brasil
Oracle do Brasil Sistemas Ltda. São Paulo
Av. Alfredo Egídio de Souza Aranha, 100 – Bloco B – 5º andar – CEP: 04726-170
11 5189-3000
www.oracle.com.br
Proelbra Tecnologia Eletrônica Ltda.
São Paulo
Av. Rouxinol, 1.041, Cj. 204, 2º andar Moema – CEP: 04516-001 11 5052- 8044
www.proelbra.com.br
Provider
São Paulo
Av. Cardoso de Melo, 1450, 6º andar – Vila Olímpia – CEP: 04548-005
11 2165-6500
www.e-provider.com.br
Red Hat Brasil
São Paulo
Av. Angélica, 2503, 8º andar Consolação – CEP: 01227-200
11 3124-6000
www.latinsourcetech.com.br
Samurai Projetos Especiais
São Paulo
Rua Barão do Triunfo, 550, 6º andar – CEP: 04602-002
11 5097-3014
www.samurai.com.br
✔
✔ ✔
SAP Brasil
São Paulo
Av. das Nações Unidas, 11.541, 16º andar – CEP: 04578-000
11 5503-2400
www.sap.com.br
✔
✔ ✔
Simples Consultoria
São Paulo
Rua Mourato Coelho, 299, Cj. 02 Pinheiros – CEP: 05417-010
11 3898-2121
www.simplesconsultoria.com.br
✔
✔ ✔
Smart Solutions
São Paulo
Av. Jabaquara, 2940 cj 56 e 57
11 5052-5958
www.smart-tec.com.br
Snap IT
São Paulo
Rua João Gomes Junior, 131 – Jd. Bonfiglioli – CEP: 05299-000
11 3731-8008
www.snapit.com.br
Stefanini IT Solutions
São Paulo
Av. Brig. Faria Lima, 1355, 19º – Pinheiros – CEP: 01452-919
11- 3039-2000
www.stefanini.com.br
Sun Microsystems
São Paulo
Rua Alexandre Dumas, 2016 – CEP: 04717-004
11 5187-2100
www.sun.com.br
Sybase Brasil
São Paulo
Av. Juscelino Kubitschek, 510, 9º andar Itaim Bibi – CEP: 04543-000
11 3046-7388
www.sybase.com.br
The Source
São Paulo
Rua Marquês de Abrantes, 203 – Chácara Tatuapé – CEP: 03060-020
11 6698-5090
www.thesource.com.br
Unisys Brasil Ltda.
São Paulo
Rua Alexandre Dumas, 1711, 10º andar, Ed. Birmann 11 – CEP: 04717-004
11 3305-7000
www.unisys.com.br
Utah
São Paulo
Av. Paulista, 925, 13º andar – Cerqueira César – CEP: 01311-916
11 3145-5888
Visuelles
São Paulo
R. Eng. Domicio Diele Pacheco e Silva, 585 – Interlagos – CEP 04455-310
Webnow
São Paulo
Av. Nações Unidas, 12.995, 10º andar, Ed. Plaza Centenário – Chácara Itaim – CEP: 04578-000
WRL Informática Ltda.
São Paulo
Systech
Taquaritinga
✔
✔ ✔ ✔ ✔
✔
✔
✔
✔
✔ ✔ ✔
✔
✔ ✔
✔ ✔
✔
✔ ✔
✔
✔ ✔
✔
✔ ✔
✔
✔ ✔ ✔
✔ ✔
✔
✔ ✔
www.utah.com.br
✔
✔ ✔
11 5614-1010
www.visuelles.com.br
✔
✔ ✔
11 5503-6510
www.webnow.com.br
✔
✔
✔
Rua Santa Ifigênia, 211/213, Box 02– Centro – CEP: 01207-001 11 3362-1334
www.wrl.com.br
✔
✔
Rua São José, 1126 – Centro - Caixa Postal 71 – CEP: 15.900-000
www.systech-ltd.com.br
✔ ✔
16 3252-7308
✔
✔ ✔
http://supertuxbr.blogspot.com Linux Magazine #23 | Setembro de 2006
79
SERVIÇOS
Calendário de eventos Evento
Data
Local
Website
ISC Brasil – Congresso e Feira de Segurança Eletrônica
30 de Agoso a 1 de Setembro
São Paulo, SP
www.iscexpo.com.br
4º Encontro Nacional Linuxchix Brasil
8 e 9 de Setembro
Florianópolis, SC
www.linuxchix.org.br
OpenOffice.org Conference 2006
11 a 13 de Setembro
Lyon, França
www.marketing.openoffice.org/ooocon2006
III Festival do Software Livre
16 e 17 de Setembro
Juiz de Fora, MG
www.festsol.com.br
O'Reilly EuroOSCON 2006
18 a 21 de Setembro
Bruxelas, Bélgica
www.conferences.oreillynet.com/euos2006
III Seminário LinuxPark'06
20 de Setembro
São Paulo, SP
www.linuxpark.com.br
III Fórum Reg. de Soft. Livre do ABCD
21 e 23 de Setembro
Diadema, SP
www.psl-abcd.org/forum/2006/
Seminário Web com Ruby on Rails
23 de Setembro
São Paulo, SP
www.temporealeventos.com.br
KDE Dev. and Users Conf 2006 “aKademy”
23 a 30 de Setembro
Dublin, Irlanda
www.conference2006.kde.org
Mão na Massa Plone – Básico
30 de Setembro
São Paulo, SP
www.temporealeventos.com.br
Mão na Massa Plone – Avançado
30 de Setembro
São Paulo, SP
www.temporealeventos.com.br
2ª Semana Software Livre Univale
20 e 21 de Outubro
Ivaiporã, PR
www.univale.com.br/livre
SECCOMP 2006 (XIV Sem. Ciência Comp.)
23 a 27 de Outubro
Rio Claro , SP
www.rc.unesp.br/seccomp
ISC East – Congresso e Feira de Segurança Eletrônica
24 e 25 de Outubro
Nova York, EUA
www.iscexpo.com.br
LinuxWorld Conference & Expo UK
25 e 26 de Outubro
Londres, Inglaterra
www.linuxworldexpo.co.uk
III Fórum Goiano de Software Livre
27 e 28 de Outubro
Goiânia, GO
fgsl.aslgo.org.br
Conisli 2006
3 a 5 de Novembro
São Paulo, SP
www.conisli.org
International PHP Conference 2006
5 a 8 de Novembro
Frankfurt, Alemanha
www.phpconference.com
Web 2.0 Conference
7 a 9 de Novembro
Califórnia, EUA
www.web2con.com
Índice de anunciantes Empresa
Pág.
BRConnection
35
EasyLinux
65
Guia de Tecnologia da Informação
02
IBM
84
Intel
11
Intelig
82
Itautec
07
LinuxWorld Expo
81
Linux.local
29
Linux Magazine
23, 83
Oracle
13
Plugin
15
SnapIT
41
Thin Networks
71
VIPware
25
http://supertuxbr.blogspot.com 80
http://www.linuxmagazine.com.br
�������������������������������
���������������� ����������
�������������������
�����������������������
����������
���������������
�������������������������
��������
�����������������������
���������������������
�������
�����������������������
������������������������
��������
������������������������
���������������������
����������
������������������������
�����������������������
���������
�����������������������
����������������������
������������
����������������������������� �������������������������
��������
������������������������
�����������������������
�������������
�����������
�������������������������
������
�����������
�����������������������
����������
�����������
�������������������������
�������
������������
���������������������������
������
������������
�����������������������
��������������
��������������������
����������������������
http://supertuxbr.blogspot.com �����������������������������������������������������������������
���������������������������
Novembro de 2006
PREVIEW
Na Linux Magazine #25… DESTAQUE
TUTORIAL
Seus dados estão seguros? Quando seu notebook for para a manutenção, ninguém vai tentar ler seus dados? E se você por acaso esquecer seu notebook no internet café? A criptografia de sistemas de arquivos é uma forma bastante eficiente e já madura para proteger seus dados contra o acesso não permitido. Mesmo que o disco rígido seja retirado da máquina, os dados permanecem legíveis somente para quem tiver autorização para tal. Quer transportar dados seguramente, sem acessos indevidos, em CD ou DVD? Mostraremos as melhores formas de criptografar o conteúdo dessas mídias, para que você possa carregar dados confidenciais sem ficar paranóico. ■
Milhões de voluntários já ofereceram seus ciclos ociosos de CPU para colaborar com a busca de vida extraterrestre no projeto SETI@home. O BOINC (Berkeley Open Infrastructure for Network Computing) permite que a sua empresa aproveite seu parque de máquinas para usá-lo como um grande grid para tarefas que necessitem de processamento intensivo. ■
Criptografia de arquivos
SETI@ sua empresa
CAPA
Bashish
Cansado da tela preta? O bashish oferece interessantíssimas possibilidades de configuração de temas para seu Bash. Personalize suas fontes, cores e papel de parede, como se fosse um ambiente desktop! ■
Novembro de 2006
Na EasyLinux #08… DESTAQUE
Sincronização de dados
Celulares, PDAs e computadores armazenam endereços, emails e outros dados. O laptop trabalha como armazenador móvel desses documentos. Para que esses aparelhos não se tornem soluções isoladas, existem protocolos que sincronizam dados uns com os outros. O Linux dispõe de uma série de ferramen-
tas com as quais é possível manter dois ou mais aparelhos sincronizados e administrar uma única base de dados integrada. Nossa matéria de capa vai mostrar como configurar essas ferramentas de maneira correta e quais alternativas existem para os conhecidos programas de sincronização. ■
DESTAQUE
Linux de bolso Você pode conhecer e desfrutar do sistema operacional livre sem ter que instalá-lo em seu computador ou utilizar um live CD. Distribuições compactas como o Damn Small Linux e o Puppy Linux, com cerca de 50 MBytes de tamanho, podem
ser facilmente carregadas em um chaveiro USB, deixando ainda espaço para documentos após a instalação. E provando que tamanho não é documento, ambas reúnem todos os aplicativos necessários para se trabalhar confortavelmente com imagens, editar textos e planilhas, ouvir MP3, além de navegador web e cliente de email. ■
http://supertuxbr.blogspot.com 82
http://www.linuxmagazine.com.br
http://supertuxbr.blogspot.com
09/2006
SHOPTOUR p.26 Linux para vender melhor
MULTIMÍDIA MÓVEL p.22 Instituto Nokia de Tecnologia em PE
CEZAR TAURION p.28 Código aberto e inteligência coletiva
00023 exemplar de
A REVISTA DO PROFISSIONAL DE TI
ven d a p ro i b i d a 9 771806 942009
# 23
Assinante
R$ 13,90 € 7,50
# 23
Linux Magazine
Setembro 2006
#23 09/06
LAMP Apache MySQL PHP PostgreSQL
LAMP SERVIDORES WEB COM
LINUX, APACHE, MYSQL, POSTGRESQL, PHP, PYTHON
AJAX
» Apache, servidor web profissional
p.32
» Programação orientada a objetos no PHP
RAID
» Buscas mais velozes no PostgreSQL » Novidades do MySQL 5
p.49 p.42
p.36
» Websites AJAX com Python
p.73
NBD TOR & Privoxy Pessulus & Sabayon Botnets Rsync
http://supertuxbr.blogspot.com
RAID NO LINUX p.56 Segurança e desempenho
TERMINAIS LEVES p.66 Acesso mais rápido com NBD
VEJA TAMBÉM NESTA EDIÇÃO: » Navegação anônima com Tor & Privoxy p.59 » Enjaulando o gnomo: Pessulus e Sabayon p.54 » Botnets, a nova modalidade de DDoS p.64 » Sincronização eficiente com Rsync p.62 WWW.LINUXMAGAZINE.COM.BR
NOVO PROJETO GRÁFICO E EDITORIAL!