23 - lamp_set_2006

84
#23 09/06 R$ 13,90 7,50 9 771806 942009 00023 A REVISTA DO PROFISSIONAL DE TI # 23 Setembro 2006 WWW.LINUXMAGAZINE.COM.BR NOVO PROJETO GRÁFICO E EDITORIAL! 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 » Apache, servidor web profissional p.32 » Programação orientada a objetos no PHP p.49 » Buscas mais velozes no PostgreSQL p.42 » Novidades do MySQL 5 p.36 » Websites AJAX com Python p.73 LAMP SERVIDORES WEB COM 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 RAID NO LINUX p.56 Segurança e desempenho TERMINAIS LEVES p.66 Acesso mais rápido com NBD LINUX, APACHE, MYSQL, POSTGRESQL, PHP, PYTHON exemplar de Assinante venda proibida http://supertuxbr.blogspot.com

Upload: -

Post on 13-Mar-2016

254 views

Category:

Documents


8 download

DESCRIPTION

# 23 Setembro 2006 Segurança e desempenho Acesso mais rápido com NBD VEJA TAMBÉM NESTA EDIÇÃO: LINUX, APACHE, MYSQL, POSTGRESQL, PHP, PYTHON » Apache, servidor web profissional p.32 » 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 MULTIMÍDIA MÓVEL p.22 Instituto Nokia de Tecnologia em PE SHOPTOUR p.26 Linux para vender melhor 00023 9 771806 942009 http://supertuxbr.blogspot.com

TRANSCRIPT

Page 1: 23 - LAMP_set_2006

#23 09/06

R$ 13,90 € 7,50

97

71

80

69

42

00

9

00

02

3

A REVISTA DO PROFISSIONAL DE TI

Linu

x M

agazin

e

# 23 # 23

S

ete

mb

ro 2

006

09/2006

WWW.LINUXMAGAZINE.COM.BR NOVO PROJETO GRÁFICO E EDITORIAL!

SHOPTOUR p.26Linux para vender melhor

MULTIMÍDIA MÓVEL p.22Instituto Nokia de Tecnologia em PE

CEZAR TAURION p.28Código aberto e inteligência coletiva

» Apache, servidor web profissional p.32

» Programação orientada a objetos no PHP p.49

» Buscas mais velozes no PostgreSQL p.42

» Novidades do MySQL 5 p.36

» Websites AJAX com Python p.73

LAMPSERVIDORES WEB COM

������������������� ��������������������

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

RAID NO LINUX p.56

Segurança e desempenho

TERMINAIS LEVES p.66

Acesso mais rápido com NBD

LAM

P

A

pach

e

M

ySQ

L

PH

P

P

ostg

reS

QL

A

JAX

RA

ID

N

BD

TOR

& P

rivox

y

Pe

ssulu

s & S

abayo

n

B

otn

ets

R

sync

LINUX, APACHE, MYSQL, POSTGRESQL, PHP, PYTHON

ex

em

pla

r d

e

Ass

inan

teve

nd

a

pro

ibid

a

http://supertuxbr.blogspot.com

Page 2: 23 - LAMP_set_2006

http://supertuxbr.blogspot.com

Page 3: 23 - LAMP_set_2006

3

Prezado leitor, prezada leitora da Linux Magazine, é notório que somente a disponibilidade do código-fonte de um sistema, en-quanto 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 quan-to 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 erra-do na sua empresa ao usar Linux, quem vai pagar o pato?”

Quando se fala em software proprietário, fica muito fácil iden-tificar “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 segui-rem 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 pa-drões abertos, o resultado final é termos o melhor dos dois mun-dos: soluções sem aprisionamento a um determinado fornece-dor 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 funcio-ne na segunda. Se houver algum problema, há uma liberdade muito grande de experimentar os serviços de um outro fornece-dor. E como o código da solução está disponível, podemos até nos dar ao luxo de auditar toda e qualquer modificação efetu-ada. Tudo isso contribui ainda mais fortemente para o aumen-to 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 aditiva-do ideal para fazer qualquer departamento de TI ter um de-sempenho superior, com mais segurança e menor custo.

Rafael Peregrino da SilvaDiretor Editorial

Padrões abertos e Software Livre

ED

ITOR

IAL

Expediente editorialDiretor Editorial Rafael Peregrino da Silva [email protected] Editorial e Diretor de Arte Luciano Hagge Dias [email protected] Tadeu Carmona [email protected] Pablo Hess [email protected]ção e Revisão Livea Marchiori [email protected] da Capa Luciano Hagge Dias [email protected] de Competência Centro de Competência em Software: Oliver Frommel [email protected] Centro de Competência em Hardware: Mirko Dölle [email protected] Centro de Competência em Redes e Segurança: Achim Leitner [email protected] & Colaboradores Augusto Campos, Carsten Schnober, Cezar

Taurion, Charly Kühnast, Dirk von Suchodo-letz, Heike Jurzik, Jorge Pereira, José Maria Ruiz, Klaus Knopper, Kristian Kissling, Larkin Cunningham, Marcus Nasarek, Nabucodo-nosor Coutinho Costa, Pedro Orantes, Rú-ben Lício, Thorsten Zitterell e Zack Brown.

Diretor Comercial Claudio Bazzoli [email protected]úncios: Claudio Bazzoli (Brasil) [email protected] Tel.: +55 (0)11 2161 5400 Fax: +55 (0)11 2161 5410 Osmund Schmidt (Alemanha, Áustria e Suíça) [email protected] Brian Osborn (Outros países) [email protected]: www.linuxnewmedia.com.br [email protected] 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êniaApesar de todos os cuidados possíveis terem sido tomados durante a produção desta revista, a editora não é responsável por eventuais impre-cisõ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 qual-quer 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 forneci-dos 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

Direitos Autorais e Marcas Registradas © 2004 - 2006: Linux New Media do Brasil Editora Ltda.Distribuição: DistmagImpressão e Acabamento: ParmaISSN 1806-9428 Impresso no Brasil

em processo de filiaçãoINSTITUTO VERIFICADOR DE CIRCULAÇÃO

Linux Magazine #23 | Setembro de 2006http://supertuxbr.blogspot.com

Page 4: 23 - LAMP_set_2006

4 http://www.linuxmagazine.com.br

CAPALAMP, uma introdução 30

A base de um sistema LAMP deve ser robusta, podero-

sa 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áqui-

nas Linux. Extremamente poderoso e flexível, co-

nheç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 me-

lhorarã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 lin-

guagem preferida de muitos webmasters, e atualmen-

te é uma das estrelas do código aberto no mundo.

ÍND

ICE

http://supertuxbr.blogspot.com

Page 5: 23 - LAMP_set_2006

5

COLUNASAugusto Campos 09Charly Kühnast 10Klaus Knopper 12Zack Brown 14

NOTÍCIASSegurança 16➧ Múltiplas falhas no Mozilla Firefox

➧ Samba

➧ krb5

➧ Apache

➧ libtiff

Geral 18➧ ATI nega driver aberto para Linux

➧ 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

➧ Apple e o código aberto

CORPORATENotícias 20➧ Drogaria Onofre adota o Linux

➧ Microsoft Vista sairá quando estiver pronto

➧ Alta disponibilidade na Rolls-Royce

➧ Banco de Brasília aumenta efi ciê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

Artigo: Pela liberdade de escolha 24Entrevista: Shop Tour 26Coluna: Cezar Taurion 28

ANÁLISEPessulus e Sabayon :: Sob encomenda 54 A versão 2.14 do Gnome inclui novos recursos para res-

tringir o acesso do usuário ao sistema. Os edito-res Pessulus e Sabayon vão direto ao ponto e auxi-liam a administração das restrições dos usuários.

TUTORIALRAID :: Easy Rider 56 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.

TOR & Privoxy :: Anônimo na multidão 59 Ao navegar na Internet, você normalmente revela seu en-

dereço IP, o que permite que empresas compilem um perfi l das suas atividades na Internet. O Tor e o Privo-xy podem ajudar você a proteger sua privacidade

Rsync :: Sincronizado 62 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 criptografi a do tráfego dos dados.

SYSADMINBots :: Gangue virtual 64 Durante suas atividade diárias normais, o colunista da Linux

Magazine Charly Kühnast foi atingido por um ataque malévo-lo. O servidor anti-spam do Charly, que é acionado antes do servidor de emails, salvou-o da tempestade de mensagens.

Thin Clients :: O bloco está na rede 66

Você não precisa do Samba ou do NFS para usar um clien-te sem disco. Um dispositivo de blocos remoto pode aju-dar a melhorar muito o desempenho e a efi ciência.

PROGRAMAÇÃOAJAX 73 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?

SERVIÇOSEditorial 03Emails 06Linux.local 78Eventos 80Índice de anunciantes 80

Linux Magazine #23 | Setembro de 2006

| ÍNDICELinux Magazine 23

http://supertuxbr.blogspot.com

Page 6: 23 - LAMP_set_2006

6 http://www.linuxmagazine.com.br

sanj

a gj

ener

o –

ww

w.s

xc.h

u

✎ ColaborativoMeu 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 sa-ber 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 con-teú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 proce-dimento da empresa, mas se fosse enviado de modo anteci-pado 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 CostaSão Paulo, por e-mailCaro 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-

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 mui-to 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 [email protected]. Todas as su-gestõ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 es-tará 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çõesOlá, 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 Inter-nacional. 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 emailCaro Pedro, agradecemos pelos elogios dispensados à Linux

Magazine, em ambas as versões. A questão das matérias abor-dando 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? ■

Emails para o editor

Permissão de EscritaSe 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: [email protected]. 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.

EM

AIL

S

http://supertuxbr.blogspot.com

Page 7: 23 - LAMP_set_2006

www.itautecshop.com.brC O M P R E D I R E T A M E N T E D O F A B R I C A N T E

0800 121 444De 2ª a 6ª, das 8h às 20h. Sábado, das 9h às 18h. Domingo, das 9h às 15h.

PRESENTE EM MAISDE 2.700 CIDADES.

Ofer ta 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 fil iais nos Estados Unidos e em outros países. (1)Consulte nossa Central de Atendimento para informações sobre outras condições definanciamento 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ãonecessários uma linha telefônica ou banda larga e um provedor à sua escolha. (4)Garantia balcão de um ano para par tes, peças e ser viços. Preços com impostos inclusos para São Paulo. Frete não incluso. Demais características técnicas e decomercialização estão disponíveis em nosso site e no Televendas. Fica ressalvada eventual retificação das ofer tas aqui veiculadas. Quantidade: 10 unidades de cada. Empresa/produto beneficiado pela Lei de Informática. Fotos meramente ilustrativas.

DPZ

Foto

ilu

stra

tiva

.

SEJA LIBRIX NA RUA, SEJA LIBRIX EM CASA,SEJA LIBRIX NO TRABALHO.

Itautec InfoWay Tiny TowerCó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ídeointegrada • Placa de rede 10/100 integrada • Fax/Modem 56 Kbps(2) • Teclado, mouse, caixasacústicas e microfone • LIBRIX - Distribuição Linux Itautec • 1 ano de garantia balcão(4)

Agora, além do Librix (Linux da Itautec), a sua empresa podecontar com o melhor e mais estável pacote de hardware e software do mercado, testado e homologado pela Itautec.

Toda a liberdade que você precisa para trabalhar com maismobilidade, usando a internet sem fio, e ainda operar comsoftware livre.

• Monitor LCD de 17” incluso• 512 MB de memória

• Gravador de CD

10x R$173,90 sem juros

ou R$ 1.739,00 à vistaConsulte opções de financiamento(1)

A solução completa.

É mais segurança, porque a Itautec oferece suporte técnicoespecializado via internet ou pelo telefone, serviços de tuninge configuração e ainda atendimento nacional on site.

Tem alta tecnologia para os aplicativos como editor de textos,planilha eletrônica, editor de imagens e apresentações. É maisfacilidade e maior flexibilidade no seu dia-a-dia. Na hora detrabalhar, não se sinta preso. Seja Librix.

Cyan Magenta Yellow Black

Os: 606174_U Form: 204x275 Operador: IlthonAgência: DPZ Cliente: ITAUTECMídia: Anuncio Perfil: Analogico Prova: Cromedot

606174_204x275_U 8/16/06 11:03 PM Page 1

http://supertuxbr.blogspot.com

Page 8: 23 - LAMP_set_2006

8 http://www.linuxmagazine.com.br

✎ Thunderbird voa baixoPreciso 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 MeloSão Paulo, por emailWladimir, 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 pro-blema 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 [email protected], 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 [email protected] 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 ca-sos, 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 mensa-gens 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 proble-ma, 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, uti-lizando 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 atualiza-da 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 CarmonaEditor-chefe Linux Magazine

EMAILS | [email protected]

http://supertuxbr.blogspot.com

Page 9: 23 - LAMP_set_2006

9

Um aspecto muito importante, embora às vezes negligenciado, da manutenção de servidores Web – seja na Internet, em uma Intranet ou no seu

pequeno servidor doméstico – é a análise dos logs. É im-pressionante quanta informação útil e interessante pode ser obtida a partir dos registros de acesso, tanto no que diz respeito a análises de tráfego e segurança, quanto em aspectos relacionados ao conteúdo.

A partir dos logs você pode descobrir o que seus novos usuários estavam procurando em páginas de busca quando chegaram ao seu site, ou que links de outros sites eles seguiram para chegar ao seu. Você pode descobrir quais as suas páginas mais populares, com que navegadores e sistemas operacionais o seu site é acessado, e cruzar todas essas informações entre si, com os dias da semana, com os diversos horários ou com muitos outros dados ao seu alcance.

Claro que é possível, para um administrador de sistemas experiente, desenvolver sua própria ferramenta de análise personalizada, usando linguagens e ferramentas comuns para manipulação de texto estruturado (como AWK ou Perl). Mas é muito mais fácil e rápido adotar uma das muitas soluções prontas para essa finalidade, disponíveis como software livre.

A minha ferramenta livre preferida para análise de logs do Apache é o AWStats [1], capaz de gerar estatísticas e gráficos bastante avançados de servidores Web, FTP, strea-ming e e-mail. Operando a partir do próprio servidor Web (como um script CGI) ou diretamente a partir da linha de comando, ele tem recursos bastante interessantes, incluin-do o armazenamento de dados históricos para facilitar o processamento freqüente de arquivos volumosos, suporte a servidores virtuais, suporte ao nosso idioma e possibilidade de rodar sem uso de bibliotecas Perl raramente instaladas por default em servidores.

Além das informações mais básicas, como número de páginas exibidas e número de visitantes únicos, o AWStats também calcula e exibe vários dados derivados ou cumu-lativos, 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 domínio, país e localização geográfica (GeoIP) do usuá-rio, páginas mais acessadas, quais as páginas pelas quais os usuários entram ou saem mais freqüentemente do seu site e visitas de robôs, indexadores e worms. Também é possível identificar pesquisas usadas em sites de busca para localizar seu site, inclusão de seu site nos favoritos de

um determinado navegador, tamanho da tela do usuário, percentual de navegadores de seus usuários com suporte a Java, Flash e PDF. Alguns destes cálculos, entretanto, exigem configurações específicas – que constam na do-cumentação do sistema.

Como você pode ver, uma boa ferramenta de análise de logs dá ao webmaster e ao webdesigner informações importantíssimas para melhor desenvolver e direcionar seus serviços e conteúdo. Entretanto, felizmente o AWStats não

é a única opção; há diver-sas outras alternativas em software livre. Investigue o popular (mas pouco atualizado) webalizer [2], o seu irmão mais novo webalizer xtended [3] e o veteraníssimo analog [4], que completou 10 anos em 2005.

Se você prefere uma solução rápida e não se preocupa com o fato de informações sobre o tráfego de seu site ficarem na posse de outras empre-sas, uma alternativa adicional é o Google Analytics [5], que exibe praticamente todas as informações relevantes sobre o tráfego do seu site a partir de uma configuração especial (e simples) em seu conteúdo. Para aplicações pessoais, pode ser uma alternativa interessante, mas para uso corporativo as desvantagens superam a vantagem da praticidade.

Não fique no escuro, sempre saiba o que o seu servidor Web fez na madrugada passada ;-). ■

Análise de acesso a servidores Web

Augusto CamposSão 2 da manhã. Você sabe o que o seu website está fazendo?

O autorAugusto César Campos é administra-dor de TI e, desde 1996, mantém o site BR-linux.org, que cobre a cena do Soft-ware Livre no Brasil e no mundo.

Mais Informações[1] http://awstats.sourceforge.net/

[2] http://www.mrunix.net/webalizer/

[3] http://www.patrickfrei.ch/webalizer

[4] http://www.analog.cx/

[5] http://www.google.com/analytics/

Uma boa ferramenta de análise de logs dá ao webmaster informações

importantíssimas.

CO

LUN

A

Linux Magazine #23 | Setembro de 2006http://supertuxbr.blogspot.com

Page 10: 23 - LAMP_set_2006

10 http://www.linuxmagazine.com.br

Os 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.

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 ope-rador do hotspot (que já deve estar incrivel-mente rico) tinha uma idéia diferente da mi-nha sobre o termo “co-nexão à Internet”. Eu conseguiria sobreviver com o proxy obrigatório, mas praticamente tudo que não fosse HTTP(S), POP e IMAP era filtra-do. Eu uso o Mutt para acessar algumas caixas de mensagem críticas que rodam sob o screen no meu servidor do-méstico. Sem SSH, é 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üís-sima - mas ainda utilizável - delas em [1] para mais deta-lhes). 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 casaApó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 weird-mind.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 su-porte 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 obri-gou 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! ■

Túneis nas praias holandesas

Charly KühnastQual 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

Mais Informações[1] Ferramentas remotas:

http://anyterm.org/compared.html

[2] Weird Mind: http://www.tam.cornell.edu/

Figura 1: O Weird Mind no meu servidor doméstico me ajudou a fazer um túnel através da rede restritiva nas férias.

O autorCharly Kühnast é administrador de sis-temas Unix no datacenter Moers, per-to do famoso rio Reno, na Alemanha. Lá ele cuida, principalmente, dos firewalls.

É verdade que existem maneiras de transmitir dados através de túneis nesse tipo de rede, mas isso não seria justo.

CO

LUN

A

http://supertuxbr.blogspot.com

Page 11: 23 - LAMP_set_2006

© 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 Statesand other countries. *Other names and brands maybe claimed as the property of others.

Itautec0800 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

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 ToolsLocaliza os problemas de threadings latentes com visualização em tempo real.

Compiladores Intel C++ e FortranAumenta 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 BatalliDiretora de Desenvolvimento do RenderMan

Pixar

LinuxMag80206.qxp 8/2/06 10:00 AM Page 1

http://supertuxbr.blogspot.com

Page 12: 23 - LAMP_set_2006

12 http://www.linuxmagazine.com.br

✎ Procurando driversVocê poderia me explicar como o Knoppix descobre quais drivers usar para um item específi co do hardware? Eu cos-tumava 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 compo-nentes pode extrair o nome do fabricante e qualquer ou-tro 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?

RespostaO arquivo que você

procura é /usr/sha-re/misc/pci.ids (e veja também http://pciids.sf.net/).

A maioria dos com-ponentes de hardware têm IDs de fabricante e produto gravados como números hexadecimais. Digite:

lspci -n

Ou, para uma saída mais explicativa:

lspci -v

Isso também vale para dispositivos que não sejam re-almente PCI.

Em kernels mais antigos, o kernel tinha sua própria forma de pci.ids, com os nomes de produtos incluídos em seu código. Como existem MUITOS componentes de hardware agora, essa solução tornou-se um enorme desperdício de espaço, então um novo esquema foi im-plementado para manter a tabela legível (por pessoas) fora do kernel. Nele, os IDs de fabricante e produto são lidos do barramento do sistema.

Agora, para a detecção do hardware, ainda precisamos de um mapeamento entre as IDs PCI e o nome do mó-dulo do kernel a ser carregado pelo modprobe. O hwsetup do Knoppix usa uma tabela pci.ids de texto modifi cada para buscar nomes de módulos nas IDs PCI, e simplesmente

carrega os módulos listados lá. Mas isso só é feito em ca-sos 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 de-tecção de hardware do Linux, utiliza um recurso que foi embutido no kernel, ou melhor, em cada módulo indivi-dual, 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 mos-tra 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 car-regar para um componente específi co. Às vezes, o Udev carrega um módulo que alega conhecer um dispositivo que, na realidade, não conhece. Às vezes existem módu-los concorrentes para o mesmo dispositivo. Atualmente, estamos investigando como lidar com esses casos para placas de rede sem fi o no Knoppix, pois elas também são gerenciadas pelo Udev.

Ocasionalmente, quando só temos umas poucas es-colhas, como com controladores USB, a melhor forma parece ser simplesmente carregar todos os módulos, um por um, e deixar que aqueles que não batem falhem si-lenciosamente. No Knoppix, você pode olhar no script /linuxrc essa detecção de erro clara e simples, baseada em tentativa-e-erro, caso nenhum sistema sofi sticado de procura de hardware ou carregamento de módulos esteja disponível. ■

Pergunte ao Klaus!

Klaus KnopperEsta coluna é baseada na seção “Ask Klaus!”, publicada na Linux Magazine International.

O autorKlaus Knopper é o criador do Knop-pix e co-fundador do evento Linux-Tag. Atualmente ele trabalha como pro-fessor, programador e consultor.

Infelizmente, o driver perfeito nem sempre vence a corrida do Udev para decidir qual módulo carregar para um componente específi co.

CO

LUN

A

http://supertuxbr.blogspot.com

Page 13: 23 - LAMP_set_2006

Please examine materials carefully. For concerns, immediately contact Jamie Isanhart at 312.220.3629.

Client: Oracle Corporation

File Name: 405G1029.indd

Description Short: Grid_ConnectDbSrvr/

Brazil#

Production Category: Print

Palette: 4/C

Release Date: 04.20.05

Size: Page

Non Bleed:

Bleed: 215 x 295 mm

Trim: 205 x 275 mm

Live:

Java

Oracle Grid

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.

oracle.com/gridou ligue para 0800.901.985

Oracle GridÉ rápido... é barato...

E está sempre disponível

Obs.: “Sempre disponível” indica que, se um servidor cair, seus aplicativos continuam rodando.

Todos os seus bancos de dados

Em GRIDSem desperdício de capacidade

Sem desperdício de dinheiro

Sem ponto único de falha

http://supertuxbr.blogspot.com

Page 14: 23 - LAMP_set_2006

14 http://www.linuxmagazine.com.br

No debate sobre o Reiser4, cada lado acha que o outro tem motivos políticos. Hans Reiser reclama que os desenvolvedores do kernel não gostam dele,

e por isso recusam-se a incluir o Reiser4, enquanto já têm planos de incluir até o ext4, que ainda nem saiu do papel. Ele diz que os desenvolvedores do kernel têm talento em afastar bons programadores para outros sistemas operacio-nais, ao invés de recebê-los calorosamente.

Do outro lado, os desenvolvedores do kernel alegam que o código do Reiser4 tem problemas técnicos que

o impedem de intera-gir direito com o resto do kernel. Dizem que Reiser responde aos ar-gumentos técnicos com “linguagem de marke-ting”, ataques pessoais e acusações e, por isso, aqueles que estariam em posição de ajudar o Reiser4 a ser aceito recu-sam-se a olhar qualquer código de Hans.

A falta de revisores para o código do Reiser4 dificulta ainda mais sua inclusão no kernel. Tal-vez seja hora de Hans

delegar a tarefa de interagir com os desenvolvedores do kernel para alguma outra pessoa de sua empresa, como sugeriram os desenvolvedores do Linux, já que os funcio-nários de Hans conseguem ater-se aos pontos técnicos sem descambar para ataques pessoais.

Status da suspensãoNigel 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

seu próprio projeto concorrente, o uswsusp, de onde Nigel originalmente fez o fork para criar o Suspend2.

Como mantenedor do software suspend, Pavel tem forte poder de veto sobre qualquer código nessa área. E ninguém pode culpá-lo por se sentir mal com o fork pro-movido por Nigel, seguido de (alguns dizem) um trabalho melhor que o de Pavel.

Ainda assim, parece que o Suspend2 vem ganhando muitos seguidores, e sua ausência da árvore -mm está co-meçando a chamar a atenção, dado seu bom funciona-mento e a quantidade de pessoas que o adoram.

Questão de mantenedorAndrew Morton foi oficialmente nomeado mantenedor do sistema de gerenciamento de memória há alguns anos, mas nunca foi listado no arquivo MAINTAINERS. Ste-ven Rostedt inadvertidamente adicionou a entrada com Christoph Lameter como provável candidato. Depois, ex-plicaram a Steven que essa não é a forma como as coisas funcionam no Linux.

Não há um mantenedor do sistema de gerenciamen-to de memória listado explicitamente. Esse código é tão sensível e interage com tantos outros subsistemas que não seria possível uma só pessoa vislumbrá-lo de todos os ângulos possíveis. Por isso, atualmente, Linus, Andrew e Hugh são os responsáveis.

No final das contas, optou-se por listar o gerenciamen-to de memória no arquivo MAINTAINERS, com as respecti-vas listas de e-mails e websites, mas sem um mantenedor específico. ■

Crônicas do kernel

Zack BrownEsta 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.

Os desenvolvedores do kernel alegam que o código do Reiser4 tem problemas técnicos que o impedem de interagir direito com o resto do kernel.

O autorA 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 newslet-ter Kernel Traffic já está completando 5 anos.

CO

LUN

A

http://supertuxbr.blogspot.com

Page 15: 23 - LAMP_set_2006

Hospedagemde Sites e Servidores

INTERNET PARA PROFISSIONAIS DE INTERNET

Monitoramentode Rede

InternetData Center

Servidoresde Alta Disponibilidade

4003-1001 www.plugin.com.br

Gab

arit

o

Anu_Lunix_015.qxd 7/5/06 4:23 PM Page 1

http://supertuxbr.blogspot.com

Page 16: 23 - LAMP_set_2006

16 http://www.linuxmagazine.com.br

➧ Múltiplas falhas no Mozilla Firefox

Postura das principais distribuições Linux quanto à segurançaDistribuição Referência de Segurança Comentários

Conectiva Info: distro2.conectiva.com.br/ Lista: [email protected] 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 prin-cipal. 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 atualiza-dos 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 dis-tribuídos como arquivos HTML com links para os patches. O anún-cio 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 Info: www.mandriva.com/security Lista: www1.mandrdrivalinux.com/en/flists.php3#2security Referência: MDKSA-… 1

A Mandriva tem seu próprio site sobre segurança. Entre outras coisas, inclui alertas e referência a listas de discussão. Os aler-tas são arquivos HTML, mas não há links para os patches.

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”. Proble-mas 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 lis-ta de discussão sobre segurança. Nenhuma informação adi-cional 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 so-bre segurança, que contém informações sobre a lista de discus-sã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 cur-ta descrição da vulnerabilidade corrigida pelo patch é fornecida.

1 Todas as distribuições indicam, no assunto da mensagem, que o tema é segurança.

O Mozilla Firefox é um navegador de código aberto. Espe-cialistas descobriram algumas falhas de segurança no Fire-fox. 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 ins-talar programas mal intencionados no navegador.(CVE-

2006-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 encon-trada na maneira como o Firefox processa Unicode Byte-Order-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 Fire-fox 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 en-contrada 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 arqui-vo 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-

SE

GU

RA

A

http://supertuxbr.blogspot.com

Page 17: 23 - LAMP_set_2006

17

Segurança

➧ SambaO 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 comparti-lhamentos. 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

Suse: SUSE-SR:2006:017

Ubuntu: USN-314-1

➧ krb5O Kerberos (krb5) é um sistema de autenticação que permite que clientes autentiquem uns aos outros através do método de crip-tografia simétrica e um terceiro elemento confiável, o KDC.

Uma falha de segurança foi encontrada, com a qual apli-cações compatíveis com o Kerberos falhariam ao verificar o resultado da chamada setuid(). No kernel Linux 2.6, a cha-mada 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. (CVE-

2006-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

➧ ApacheO 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

a forma de uma mensagem de erro. Isso poderia permitir a um invasor realizar um ataque do tipo XSS (cross-site scrip-ting), 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 componen-te mod_rewrite do Apache. Em algumas situações, um agressor remoto poderia explorar isso para executar código arbitrário. (CVE-2006-3747). ■Referência no Debian: DSA-1131-1

Referência no Gentoo: GLSA 200608-01

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

➧ libtiffO pacote libtiff contém uma biblioteca de funções para ma-nipular 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

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

| NOTÍCIAS

Linux Magazine #23 | Setembro de 2006

ç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)

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 prepa-rado, 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

http://supertuxbr.blogspot.com

Page 18: 23 - LAMP_set_2006

18 http://www.linuxmagazine.com.br

O Governo da Extremadura, na Espanha, finalmen-te 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á ado-tado 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 adminis-trações da Europa e da América Latina, a Rede Internacional de Administrações Públicas pelo Software Livre. ■

Enquanto a Intel recentemente liberava o código dos dri-vers 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 de-vem, 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 pro-nunciou sobre o assunto. ■

➧ ATI nega driver aberto para Linux

➧ Suporte à gravação em NTFS à vista

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. ■

➧ Linux embarcado em aeronave militar

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 aerona-ve 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. ■

➧ Extremadura muda completamente para SL e ODF

NO

TÍC

IAS

http://supertuxbr.blogspot.com

Page 19: 23 - LAMP_set_2006

19

CurtasNova versão de testes do Fedora Core 6A 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 2007Já é 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 JavaA 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 progra-mas feitos em Java. Isso permitirá que, no futuro, quando a tec-nologia estiver bem sedimentada, programas em Java possuam visual e comportamento nativos do sistema operacional onde estiverem rodan-do, seja ele Linux, Mac OS ou Windows®.

Flash Player 9 para LinuxEmmy Huang, gerente de produtos da Ado-be, 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 tor-no dos componentes do sistema que o novo Flash Player usará.

Cliente BitTorrent recebe capital de riscoA BV Capital, uma empresa de capital de risco, investiu uma quantia não revelada no desenvolvimento do cliente BitTor-rent Azureus. Com a implementação de uma camada de con-teú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 importan-tíssimo personagem na vida dos internautas no futuro.

SGI bate recorde com LinuxA Silicon Graphics bateu um novo recorde de largura de ban-da 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 componen-te 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 rodan-do 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 FirefoxOnze meses e onze dias após o lança-mento da versão 1.0, o navegador Fire-fox 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 down-loads, de acordo com o site Spread Firefox.

Linux nos thin clients dos novos telecentrosA 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.

➧ Windows Media no LinuxA 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 RealNe-tworks contra a Microsoft, que obrigou a empresa de Red-mond a pagar uma grande multa e prestar 18 meses de suporte à vencedora da ação. ■

➧ 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 acres-centa o suporte a muito mais dispositivos (atingindo a marca dos 700) do que a versão anterior, Gimp-Print 4.2. ■

| NOTÍCIASGeral

➧ Apple e o código abertoRecentemente a Apple anunciou o fim do projeto Open Dar-win, 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 desenvolvedo-res 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. ■

Linux Magazine #23 | Setembro de 2006http://supertuxbr.blogspot.com

Page 20: 23 - LAMP_set_2006

20 http://www.linuxmagazine.com.br

Com o objetivo de aumentar a eficiência e reduzir os cus-tos, 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 es-tabilidade 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%. ■

➧ Drogaria Onofre adota o Linux

CurtasSite nacional da Mandriva Conectiva está no arOs 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 atu-alizadas sobre seus produtos e serviços. Para informações in-ternacionais em português, pode-se continuar utilizando o en-dereço www.mandriva.com. Sugestões e comentários sobre a nova página podem ser enviados a [email protected].

Linux para viajarA Amadeus, fornecedora de soluções de TI para o merca-do de viagens e turismo, anunciou um crescimento de 12,7% em seu faturamento no primeiro semestre de 2006, resul-tado de seu aumento no market share. O presidente e CEO da empresa afirmou que o crescimento é resultado do in-vestimento contínuo em tecnologia, especialmente na tran-sição para sistemas abertos baseados em Linux e Unix.

Seminários sobre Linux embarcadoA Mandriva Conectiva e a Freescale, parceiras no desenvolvimen-to 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.

➧ Alta disponibilidade na Rolls-Royce

A Rolls-Royce Brasil realiza manutenção e revisão em turbinas de aviação e geração de energia, e implemen-tou 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 in-fra-estrutura de alta disponibilidade. Por isso, montamos uma estrutura com servidores em cluster, com os dados armazenados em dispositivos externos”, afirmou o geren-te 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 sis-tema 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 decorren-tes 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. ■

➧ Microsoft Vista sairá quando estiver pronto

Após vários adiamentos na data de lançamento da próxi-ma 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, nova-mente já é coisa do passado. Steve Ballmer, CEO da Mi-crosoft, 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. ■

CO

RP

OR

ATE

http://supertuxbr.blogspot.com

Page 21: 23 - LAMP_set_2006

21

Notícias

➧ Banco de Brasília aumenta eficiência com Linux

O Banco de Brasília (BRB) acaba de modernizar seu am-biente 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 armazenamen-to e acesso mais ágil e econômica para os dados corporativos do banco”. ■

➧ PalmSource perde licença da Palm

A PalmSource, recentemente separa-da da Palm, e responsável pelo siste-ma operacional utilizado em seus han-dhelds, 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 famo-sos do mundo. ■

➧ Intel apresenta seus melhores processadores

A Intel lançou finalmente sua nova arquitetura de processa-dores, denominada Core 2 Duo. Fortemente baseada na ar-quitetura 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 paralelis-mo 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 impor-tante 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 ofe-rece 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. ■

CurtasMicrosoft Office para Linux é inevitávelDe 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 pre-sença do Linux no ambiente corporativo, a Microsoft será força-da 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 comer-cial baseado nele, o CrossOver Office, da empresa CodeWeavers.

União pela telefonia móvel baseada em LinuxDuas das principais agremiações de apoio ao Linux como plata-forma 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 aber-to 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 HPAlém da Red Hat, Suse e uma série de outras distribuições Li-nux 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 so-lução thin client, o HP t5725, baseada no Debian GNU/Linux, que pode ser utilizada, por exemplo, como terminal de consultas.

| CORPORATE

➧ Compromisso da Motorola com LinuxA 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). ■

Linux Magazine #23 | Setembro de 2006http://supertuxbr.blogspot.com

Page 22: 23 - LAMP_set_2006

22 http://www.linuxmagazine.com.br

O Instituto Nokia de Tecnologia (INdT) inaugurou no dia 27 de julho de 2006, em Recife, PE,

sua terceira unidade no Brasil. As ativi-dades do novo centro de pesquisas são voltadas especialmente para o desenvol-vimento de aplicações multimídia e para dispositivos móveis baseados em Software Livre, utilizando como ambiente de de-senvolvimento a plataforma Maemo [1], de autoria do próprio INdT.

Participaram da cerimônia de inaugura-ção do Instituto o governador de Pernam-buco, Mendonça Filho, e seu secretário estadual de Planejamento, Cláudio Ma-rinho, que conheceram as instalações da

nova unidade do INdT e deram as boas-vindas à equipe da instituição.

As áreas de aplicação dos projetos desenvolvidos pelo instituto compre-enderã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 dis-põe de interfaces Bluetooth e Wi-Fi, reconhecimento de escrita, navegador de Internet, aplicativos para escritório (AbiWord e Gnumeric), compartilhamen-to de música, além de um cliente VoIP baseado no framework Tapioca, também desenvolvido pelo próprio INdT. O na-vegador 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 é acon-dicionado 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 fa-bricantes 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 Tecno-logia 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 pes-quisa e desenvolvimento, da mesma forma que abre oportunidades para profissionais recém-formados. ■

Nova unidade em Recife do

Instituto Nokia de TecnologiaNovo centro de pesquisas especializado em Software Livre desenvolverá aplicações móveis e multimídia.por Rafael Peregrino da Silva

Mais Informações[1] Maemo: http://www.maemo.org/

CO

RP

OR

ATE

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 (Diretor-Presidente do INdT).

http://supertuxbr.blogspot.com

Page 23: 23 - LAMP_set_2006

http://supertuxbr.blogspot.com

Page 24: 23 - LAMP_set_2006

24 http://www.linuxmagazine.com.br

Um dos assuntos mais discutidos nas rodas de TI é a adoção preferencial de Software Livre em to-das 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 Sof-

tware Livre obrigatório em todas as agências governamentais. Outras iniciativas também estão sendo tomadas no âm-bito 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 softwa-re de código aberto em comparação ao software comercial ou proprie-tário) até questões de ordem ideológica.

Entretanto, será que essa é a melhor política? Segundo algumas fontes governamentais, há esti-mativas que indicam que

apenas a migração de um modelo para o outro custaria en-tre 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 van-tagens de um modelo ou de outro, pois ambos são capa-zes 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

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 ex-cluí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 con-centrados no desenvolvimento de software proprietário.

O Software Livre já compete efetivamente nos merca-dos 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 dei-xar que a livre escolha e o mérito técnico determinem o melhor valor para a TI do nosso país? ■

Quando a adoção obrigatória de um único padrão de software pode se tornar estranha.

Pela liberdade de escolhaA 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

CO

RP

OR

ATE

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), atuan-do 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çamen-to 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 traba-lhos em políticas públicas por meio da Iniciativa de Liberdade de Escolha do Software (ISC- Initiative for Software Choice).

NotaAs opiniões do autor do artigo não devem ser encara-das como a opinião oficial da revista Linux Magazine.

http://supertuxbr.blogspot.com

Page 25: 23 - LAMP_set_2006

http://supertuxbr.blogspot.com

Page 26: 23 - LAMP_set_2006

26 http://www.linuxmagazine.com.br

O Shop Tour é um canal de ven-das 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 pou-cos 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 ven-da 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.

Linux Magazine» Por que vocês escolhe-ram o Linux?Eduardo Carmo» Tínhamos uma infra-estrutura toda baseada em Windows®. Porém, quando nosso banco de dados atingiu os 6 GB, a aplicação começou a sofrer de lentidão excessiva, travamentos freqüentes e outros sinais de que se apro-ximava do limite de operabilidade. Foi então que a empresa começou a buscar alternativas, e a empresa contratada para cuidar da infraestrutura de TI sugeriu o Linux. Uma grande ajuda nessa época veio do fato de os gestores de ambas as empresas já se conhecerem previamente, pois assim o Shop Tour depositava total confiança nas sugestões propostas. Ain-da assim, existia a barreira de substituir um produto bancado por uma empresa (a Microsoft) por outro “sem dono”. No entanto, quando vimos as vantagens que o Linux trazia, o passo decisivo foi tomado em direção à solução livre. A aceitação foi total.

LM» Como foi a migração?EC» Não investimos um centavo no hardware, apenas fizemos uma certa

reestruturação. A empresa terceirizada, a AMIX, nos garantiu que a solução livre funcionaria bem, e por isso nem buscamos alternativas proprietárias. Ins-talamos o Fedora Core 1 nos servidores principais, e o Kurumin em nosso servidor de desenvolvimento. Os sistemas atuais foram todos desenvolvidos sobre essa plataforma. Temos ainda um desktop com Kurumin, que desfruta de grande aceitação de seus usuários e funciona como estação de impressão.

Além disso, instalamos ainda um firewall, que antes simplesmente não existia, um proxy e um servidor de email. Nossa aplicação roda inteiramente na Web, o que permite o uso de qualquer plataforma por parte dos clientes, que, aliás, também rodam Linux. Essa solu-ção toda foi implementada pela empresa terceirizada, mas nós continuamos seu desenvolvimento internamente.

LM» De que consiste exatamente a so-lução de vocês?EC» Nosso sistema é fortemente baseado num banco de dados. Optamos pelo Pos-tgreSQL, pois o MySQL (na época, na

Vanessa Makita e Eduardo Carmo, gerente de redes e analista de sistemas do Shop Tour

Linux para vender melhorO 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

CO

RP

OR

ATE

http://supertuxbr.blogspot.com

Page 27: 23 - LAMP_set_2006

27

| CORPORATEEntrevista

Linux Magazine #23 | Setembro de 2006

versão 4) ainda não supria nossas neces-sidades. 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, incluin-do 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 proces-sados e por fim são enviados ao sistema de transmissão, este proprietário, por ser altamente específico.

LM» Quanto tempo levou a migração?EC» O estudo das alternativas começou em julho de 2004. O primeiro mês foi todo gasto com o levantamento das ne-cessidades e tecnologias disponíveis. No mês de agosto, foi feito o desenvolvimen-to, seguido da homologação por mais duas semanas. No final de setembro co-meçou o treinamento, e em outubro os servidores já foram colocados no ar, em paralelo com a solução pré-existente. Em fevereiro, a nova solução estava rodando perfeitamente. Foi um processo surpreen-dentemente rápido. É claro que o fato de termos nos baseado na solução anterior facilitou bastante, pois já sabíamos o que o usuário esperava. Isso teve efeito seme-lhante na aceitação por parte dos usuá-rios, que foram presenteados com uma interface semelhante à anterior, porém mais limpa, simples e eficiente.

LM» E a partir daí, o que ocorreu? Algo mais foi ou será feito?EC» Após pouco tempo, vimos que a nossa solução, baseada na anterior, precisava de melhorias. Por tratar-se de Software Livre, o código-fonte estava disponível, e não dependíamos do fornecedor. Por isso, bastou nossa equipe interna para desenvolver as melhorias necessárias. Detectamos a necessidade de unir todos os subsistemas que rodavam em partes específicas da empresa, e começamos a centralizar todos eles de maneira mo-dular num único hardware. O primeiro desses módulos foi o do sistema de chamadas, de fundamental importância para nós. Com ele, já conseguimos descobrir os princi-pais motivos de demora no aten-dimento, 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-

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 comu-nicam 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, que dispõe de uma boa quantidade de pro-fissionais de qualidade. É muito boa essa liberdade de poder escolher o tamanho do investimento de acordo com a magnitude do que será desenvolvido, variando desde uma única pessoa da nossa equipe até uma empresa terceirizada, que implementou a nossa solução no início.

Por isso mesmo, pretendemos trabalhar agora na criação de uma Intranet, que integre ambos os sistemas, de forma a “humanizar” nosso ambiente de TI.

LM» Quais foram os benefícios técnicos e econômicos?EC» Na parte técnica e operacional, os re-latórios ficaram muito mais ágeis desde a primeira etapa da migração. Os usuários ficaram atônitos, pois os resultados que leva-vam três horas para ficar prontos passaram a ser quase instantâneos. Além disso, nossa aplicação está no ar há quase dois anos, e continua “tinindo”. Todos ainda estão maravilhados, inclusive os diretores.

Em relação à economia, o fato de não termos gasto nada com aquisição de novo hardware ou de licenças, aliado à indepen-dência do fornecedor (o chamado vendor lock-in) nos permitiu grande economia de recursos. Como eu disse, os diretores adoraram a vinda de tantas melhorias com uma redução no custo.

LM» Na opinião de vocês, o que falta para o Linux ser mais utilizado em empresas?

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 interfa-ce e, principalmente, incompatibilidade com documentos do MS Office. Como fizemos esse teste com a versão 1.x do Ope-nOffice.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 to-tal familiaridade com seu ambiente de trabalho. O suporte a nossas impressoras também só foi conseguido após contac-tarmos 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 publici-dade 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 volta-ram 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 pro-fissionalismo 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 in-

comparável, visto que consegui-mos desenvolver, em conjunto com uma outra empresa, todo um sistema para o fluxo dos da-dos aqui dentro, feito de acordo com nossos desejos, expectativas e necessidades. A economia ad-vinda 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

Page 28: 23 - LAMP_set_2006

28 http://www.linuxmagazine.com.br

Esta é a minha primeira coluna aqui na Linux Magazi-ne. 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 exem-

plos fantásticos de uso de “inteligências coleti-vas” 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 compa-ra a Wikipédia com a famosa Enciclopédia Britannica (http://www.nature.com/nature/jour-nal/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 es-pontânea (e voluntária, sem ganhos financeiros) sobre qualquer tema. Imagine desenhar os workflows para ge-renciar o processo de captação de artigos, validar o seu conteúdo (checando consistência e ortografia, em múl-tiplas 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 armaze-nar 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 tra-dicional, é provável que ainda estivéssemos debatendo exaustivamente suas especificações. Mas... simplesmen-te 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 geren-te 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 pre-conceituosos ou parciais.

Para um projeto desses dar certo, é importante quebrar paradigmas. A rede social é um fator que não pode ser igno-rado. 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 pu-blicou recentemente em conjunto com a empresa Inter-brand, 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 Wiki-pé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. ■

Um paralelo entre tecnologias livres e colaborativas e o futuro.

Cezar TaurionSerá 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

O autorCezar Taurion é Gerente de Novas Tecnologias Aplicadas da IBM.

CO

RP

OR

ATE

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.

http://supertuxbr.blogspot.com

Page 29: 23 - LAMP_set_2006

http://supertuxbr.blogspot.com

Page 30: 23 - LAMP_set_2006

30 http://www.linuxmagazine.com.br

Sistema 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 sis-temas 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, Ne-tBSD 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 repre-sentantes “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 tama-nha 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 soft-ware livre como um todo.

PingüimComo 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 configu-raçã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é-compi-lados para esses aplicativos. Há também metapacotes, que são feitos somente para depender de todos aqueles neces-sá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 instala-dos. 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 felizmen-te ainda permite a seleção dos pacotes durante a instalação. Também é possível selecionar a instalação de vários aplicati-vos 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 possi-bilidade, embora de uma forma não muito intuitiva, de sele-cionar 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 to-talmente 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.

ProgressoPode-se ver que a concorrência é grande em todas as esfe-ras. Entretanto, como sabemos, é absolutamente saudável. Afinal de contas, se a concorrência leva ao aumento da efi-ciência, o software livre é, atualmente, o maior promotor do progresso em matéria de software. No final, todos nós saímos ganhando. ■

A base do poder

LAMP, uma introduçãoA 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

CA

PA

http://supertuxbr.blogspot.com

Page 31: 23 - LAMP_set_2006

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 32MySQL5: Truques com dados 36PostgreSQL: Busca bonita e veloz 42PHP: Para dar liga 49

31

| CAPALAMP

Linux Magazine #23 | Setembro de 2006http://supertuxbr.blogspot.com

Page 32: 23 - LAMP_set_2006

32 http://www.linuxmagazine.com.br

Muitas 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 tam-bé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 (Li-nux, Apache, MySQL, PHP).

O servidor ApacheO Apache Server – oficialmente cha-mado HTTP Server Project, já que existe uma infinidade de outros pro-dutos com a chancela Apache – ini-ciou 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. Paralela-mente, a série anteriormente conside-rada 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 servi-dores Web, constatou, em sua última pesquisa, que mais de 60% dos servi-dores utiliza mundialmente o Apache como software. Essa preferência pode ser tratada, informalmente, como uma garantia que comprova a quali-dade e segurança anexos ao projeto (quadro 1).

O melhor servidor Web do mundo

Forte ApacheO 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

Quadro 1: Pesquisa Netcraft entre agosto/1995 e julho/2006Empresa Junho/2006 Percentual Julho/2006 Percentual Mudanças

Apache 52389885 61.25 55622584 63.09 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

CA

PA

Sarah Williams – www.sxc.hu

http://supertuxbr.blogspot.com

Page 33: 23 - LAMP_set_2006

33

| CAPAApache

Linux Magazine #23 | Setembro de 2006

Canivete suíçoO 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 conhe-cida é 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 re-lação às versões anteriores. Os recursos e mudanças mais importantes são listados nos próximos parágrafos.

Módulos de multi-processamentoA primeira mudança importante no Apache 2.0 é a introdução dos módu-los de multiprocessamento (MPMs, ou Multi Processing Modules). Para en-tender 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 pro-cesso 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 elimi-nava processos filhos de acordo com a quantidade de solicitações recebidas. Após muitos estudos e testes desse mo-delo, 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 respon-sável por iniciar os processos servidores e por atender à solicitação por meio de processos filhos ou threads, dependen-do da implementação do MPM. Vários MPMs estão disponíveis, alguns deles serão descritos abaixo.

PreforkO MPM de prefork reproduz a arquite-tura 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 iniciar-mos 30 processos filhos, o Apache po-derá atender às 30 solicitações simulta-

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 acrescen-tados, 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 threadedEsse 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 espe-cificado 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 soli-citaçã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 experimen-tal 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 siste-ma, esse MPM contribui muito para a escalabilidade.

MPM per childEssa é 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 thre-ads. 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ági-na 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

➧ Suporte a virtual hosting, sendo possível servir duas ou mais pági-nas, com endereços e portas diferentes, através do mesmo proces-so, ou usar mais de um processo para controlar mais de um endereço

➧ Suporte a servidor proxy FTP e HTTP, com limite de aces-so 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 for-ma a utilizar menos recursos da máquina

http://supertuxbr.blogspot.com

Page 34: 23 - LAMP_set_2006

34 http://www.linuxmagazine.com.br

CAPA | Apache

MPM WinNTEsse é o MPM para a plataforma Win-dows, incluindo o Windows 2000, Win-dows NT e Windows 9x. É um módulo multithreaded. Com esse módulo, o Apache criará um processo pai e um processo filho, e o processo filho ge-rará todos os threads que atenderão às requisições feitas ao servidor. Além disso, agora esse módulo também aproveita algumas chamadas de funções nativas do Windows. Dessa forma, é possível que ele funcione melhor que as versões anteriores do servidor Apache desenvol-vidas para essa plataforma.

Filtragem de entrada e saídaO Apache 2.0 inclui a arquitetura de E/S em camadas. Isso significa que a saída de um módulo pode se tornar a entrada de outro. Esse efeito de filtra-gem é muito interessante. Por exemplo, a saída produzida por scripts CGI é processada pelo módulo mod_cgi, e pode então ser entregue ao módulo mod_include responsável pelas SSI (Server Side Includes). Em outras pala-vras, os scripts CGI podem produzir a

saída sob a forma de etiquetas de SSI, que podem ser processadas antes da saída do conteúdo final para a Web. Segundo os próprios desenvolvedores do Apache, diversas outras aplicações da filtragem de E/S estarão disponí-veis no futuro.

APR (Apache Portable Runtime)Como se não bastasse a forma como o Apache Group desenvolveu o servidor Web mais popular no mundo, a versão 2.0 trouxe a necessidade de cuidar da sua portabilidade. Nas versões ante-riores, o Apache lidava internamente com a portabilidade, o que tornava a base de código menos flexível, dificul-tando um pouco o seu entendimento e manutenção. Pensando nisso, o Apa-che Group introduziu o APR (Apache Portable Runtime). A finalidade do APR é oferecer uma única interface, em linguagem C, para funções espe-cíficas da plataforma, de tal forma que o código possa ser escrito uma única vez, aumentando o nível de desenvol-vimento de novas aplicações com uma mesma API. Isso torna o Apache capaz

de funcionar de forma mais fluida e natural em plataformas diversas, como Windows, BeOS, Amiga e OS/2. Graças ao APR, programas como o ApacheBen-ch [2] podem ser utilizados em todas as plataformas.

Mão na massaAgora que entramos um pouco mais na arquitetura e funcionamento do servidor Apache, vamos instalar nossa primeira ver-são a partir do código-fonte. Nessa tarefa, naturalmente são necessários o compi-lador GCC, as ferramentas Autotools e a biblioteca libc6. Com os comandos a seguir, realizamos a configuração, com-pilação e instalação do Apache.

# wget -c http://www.apache.org/dist/➥httpd/httpd-2.0.59.tar.gz# tar -xzvf httpd-2.0.59.tar.gz# cd httpd-2.0.59/# ./configure➥ --sysconfdir=/etc/apache2 \ --prefix=/usr/local \ --localstatedir=/var/log/apache2 \ --datadir=/dominios/default# make# make install

Note que, de acordo com nossa ins-talação acima, todas as configurações do nosso servidor ficarão em /etc/apache2, os registros de logs em /var/log/apache2, e os binários executáveis em /usr/local/bin. Os dados com o conteúdo de nosso domínio padrão serão armazenados em /dominios/default, enquan-to os dos outros domínios adicionais naturalmente serão depositados em /dominios/outro_domínio. Para mais informações sobre os parâmetros de compilação, basta abrir o arquivo INSTALL dentro do diretório dos fontes do Apache.

Pontapé inicialNosso servidor possui um aplicativo chamado apachectl, que é utilizado para a manipulação do daemon httpd. Vamos ini-

Exemplo 1: Configurações globais do Apache01 IP ou host padrão: neste caso vamos utilizar uma configuração para responder em todas as interfaces de rede02 ServerName *:800304 # E-mail do administrador do servidor05 ServerAdmin [email protected] # Diretório raiz de conteúdo08 DocumentRoot /dominios/default/htdocs0910 # Configurando os Nomes dos Arquivos Padrão11 DirectoryIndex index.html main.html index.cgi1213 # Acesso apenas aos diretórios devidos14 <Directory “/dominios/*/htdocs”>15 Options Indexes FollowSymLinks16 AllowOverride None17 </Directory>1819 # Acesso para execução de scripts CGI20 <Directory “/dominios/*/cgi-bin”>21 Options -Indexes +ExecCGI22 AllowOverride None23 </Directory>2425 # Configurando os Nomes dos Arquivos Padrão a serem exibidos antes de ser listado o conteúdo de um diretório26 DirectoryIndex index.html index.html index.cgi2728 # Diretório com os scripts CGI29 ScriptAlias “/cgi-bin/” /dominios/default/cgi-bin/3031 # Habilitando execução de scripts CGI32 AddHandler cgi-script .cgi

http://supertuxbr.blogspot.com

Page 35: 23 - LAMP_set_2006

35

| CAPAApache

Linux Magazine #23 | Setembro de 2006

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 ar-mazenamento 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/exem-plo, 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 desco-mentando 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 [email protected] 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 lem-bre-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 /domi-nios/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 exibi-rá o conteúdo do diretório /dominios/de-fault/htdocs. ■

Exemplo 2: Configurações para domínios virtuais01 # Caso queira que o Apache responda por todas as requisições feitas às todas

➥ interfaces de rede, basta seguir este exemplo02 NameVirtualHost *:800304 # 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.0506 <VirtualHost *:80>07 ServerAdmin [email protected] DocumentRoot /dominios/default/htdocs09 ServerName localhost10 </VirtualHost>

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

Page 36: 23 - LAMP_set_2006

36 http://www.linuxmagazine.com.br

O sistema de bancos de dados de código aberto MySQL serve muitas das maiores empresas

no mundo, como Yahoo e Ticketmas-ter. 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 MyS-QL 5 [1], os desenvolvedores do MySQL começaram a introduzir uma gama de recursos profissionais que acabarão tor-nando-o mais competitivo com sistemas de bancos de dados comerciais. Este arti-go examina alguns dos recursos profissio-nais 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 Ora-cle, 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 proce-durais para SQL. Todavia, triggers, views

e stored procedures ainda são uma adição muito bem vinda ao MySQL.

Deve-se notar que alguns desses recur-sos profissionais do MySQL ainda estão em estágio inicial de desenvolvimento. Muitos desses recursos ainda estão incom-pletos ou não atingem níveis ótimos de desempenho. A versão 5.1 resolveu algu-mas dessas questões, e os novos recursos sem dúvida continuarão melhorando nas versões mais novas do MySQL.

Ao longo deste artigo, haverá referên-cias às tabelas produtos, cabecalhos_pedi-dos, linhas_pedidos, estoque e clientes, para melhor ilustrar os exemplos. O Exemplo 1 mostra os comandos SQL create table que criam as tabelas. Ao dar exemplos de stored procedures, triggers e views, serão feitas referências às tabelas do Exemplo.

Stored proceduresAntes de explicar o que são stored procedu-res, é importante explicar que esse termo será usado aqui geralmente em referên-cia à combinação de stored procedures e stored functions (funções armazenadas). Uma stored procedure aceita múltiplos parâmetros de entrada e saída. Uma stored function também aceita múltiplos parâ-metros de entrada, mas retorna somente um único valor a quem a chamou. Essa restrição permite o uso de stored func-tions dentro de comandos SQL, o que efetivamente proporciona uma extensão das capacidades do SQL.

As stored procedures são uma ferra-menta poderosa para um desenvolvedor ter em seu arsenal. Elas podem ofere-cer grandes benefícios em termos de desempenho e desenho de aplicações. Em relação ao desempenho, é possível reduzir muito tráfego de rede realizan-do um maior processamento de dados dentro do banco de dados. Ao reduzir o tráfego de rede, pode-se eliminar a latên-cia associada à comunicação do servidor de aplicação com o servidor de banco de dados, principalmente quando eles residem em servidores separados, como é o caso na maioria das aplicações de grande escala.

Com stored procedures, é possível usar uma abordagem de caixa preta para o desenho e desenvolvimento de aplica-ções. Um desenvolvedor programando em Java, PHP, Ruby ou qualquer outra linguagem com suporte ao MySQL não precisa ter grandes conhecimentos em SQL ou PL/SQL. Em equipes de de-senvolvimento com diversos membros, pode-se ter desenvolvedores de stored procedures concentrados no desenvol-vimento de stored procedures, enquanto desenvolvedores de Java, PHP ou Ruby se dedicam a suas linguagens de pro-gramação específicas. Contanto que cada desenvolvedor esteja ciente das entradas e saídas esperadas, ambos os desenvolvedores podem trabalhar em paralelo. Essa pode ser uma forma de utilizar melhor os conhecimentos de seus desenvolvedores, caso o projeto

Stored procedures, triggers e views no MySQL 5

Truques com dadosMostramos 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

CA

PA

Alfonso Romero – www.sxc.hu

http://supertuxbr.blogspot.com

Page 37: 23 - LAMP_set_2006

37

| CAPAMySQL 5

Linux Magazine #23 | Setembro de 2006

seja grande o suficiente para garantir os recursos de desenvolvimento.

A portabilidade também é favorecida por um maior desenvolvimento da sua lógica no banco de dados. Seria possível, por exemplo, desenvolver um programa em lote escrito em C, um aplicativo web usando Ruby on Rails, e um web service em Java, e todos utilizarem o mesmo conjunto de stored procedures.

A abordagem de várias pessoas ao desenvolver aplicativos que usem um banco de dados relacional é ou embutir todo o SQL dentro de seu código, ou em-butir todo o SQL em stored procedures e simplesmente chamá-las a partir de seu código. Muitos desenvolvedores se baseiam em mapeadores objeto-relacio-nais como o Hibernate [3] (para Java) e o ActiveRecord [4] (para Ruby on Rails), onde stored procedures são altamente ir-relevantes. Decidir qual abordagem usar para lidar com o processamento dos dados nas suas aplicações dependerá de fatores como desempenho e portabilidade. Se o desempenho não for importante, você pode considerar um mapeador objeto-re-lacional para gerar seu SQL dinamica-mente. Mas, se você se importar com o desempenho e tiver necessidade de um certo número de transações por segundo, ou de um tempo de resposta em deter-minado número de milissegundos, você provavelmente terá interesse nos méritos do uso de stored procedures. Se você tra-balha em um ambiente heterogêneo com muitas plataformas de desenvolvimento, então as stored procedures podem ser uma forma de você desenvolver sua ló-gica de processamento de dados só uma vez e numa localização central. Afinal, as stored procedures não se importam com a linguagem que faz a chamada.

TriggersOs triggers têm muitos usos, incluindo tarefas básicas de manutenção, como au-ditoria e arquivamento. Eles podem ter diversos outros usos também. Um cenário comum é quando um trigger é aciona-do após uma linha ser criada, como por exemplo a adição de uma linha à tabela linhas_pedidos. Um trigger poderia ser acionado depois de a linha ser inserida para atualizar a quantidade do produto em estoque na tabela estoque.

Onde o arquivamento é necessário, pode-se ter mais uma tabela de arquiva-mento para cada tabela, onde se guardará a informação sobre os arquivamentos. Por exemplo, a tabela produtos pode ter uma

tabela associada arquivo_produtos com as mesmas colunas da tabela de produtos. Para arquivar automaticamente, você criaria triggers na tabela dos produtos para inserir uma linha na tabela arqui-vo_produtos após cada atualização ou re-moção. Você não deve criar um trigger que seja acionado após uma inserção, pois ao buscar todo o histórico de um produ-to, seria retornada a união da linha da tabela produtos com as linhas associadas da tabela arquivo_produtos.

A abordagem é semelhante quando a auditoria é necessária. Em vez de ter uma tabela de arquivamento associada nos locais que precisam de arquivamento, é possível ter uma única tabela de audi-toria. Para as tabelas para as quais você desejar manter uma trilha de atividades de auditoria, você pode ter triggers acio-nados após qualquer operação de adição, atualização ou remoção. Esses triggers inseririam uma linha na tabela de au-ditoria contendo a natureza da ação, a tabela afetada, o usuário que realizou a operação, a hora em que isso foi realiza-do e quaisquer outros dados que se julgar importantes. A abordagem de usar triggers no banco de dados para auditoria e não no código da sua aplicação pode reduzir o trabalho de programação de seus desen-volvedores e encorajar a consistência em ambientes onde diversas aplicações aces-sam o mesmo banco de dados. Existem muitas boas abordagens para a auditoria que podem ser empregadas no código da sua aplicação, então cada caso deve ser examinado em seu contexto.

Sobre viewsUma view é uma tabela virtual gerada a partir de uma consulta armazenada. A consulta armazenada freqüentemente é composta por múltiplas operações de join que usam dados de diversas tabelas com algumas condições em comum. Num nível mais simples, pode ser só um subconjunto de uma tabela maior. Um exemplo trivial, novamente usando a ta-bela produtos, é criar uma view chamada produtos_sem_estoque, que une a tabela produtos à tabela estoque, nos itens com estoque zero.

As views podem ajudar a reduzir o código SQL para conjuntos de dados freqüentemente acessados. As views também melhoram a eficiência, pois a consulta respectiva pode sofrer cache e ser carregada mais rápido que as diver-sas versões da mesma consulta rodando a partir de diferentes locais.

Linguagem procedural do MySQLO MySQL 5 oferece uma linguagem procedural que você pode usar para criar suas stored procedures e triggers. Ao invés de usar uma linguagem proce-dural baseada em C ou Python, os de-senvolvedores do MySQL criaram uma linguagem procedural de acordo com o padrão ANSI SQL:2003 [5]. O padrão ANSI é usado em diferentes graus pelos desenvolvedores de outros sistemas ge-renciadores de bancos de dados, então, ao seguir o padrão, os conhecimentos adquiridos no desenvolvimento de sto-red procedures e triggers para o MySQL é transferível a outros bancos de dados como Oracle, DB2 e PostgreSQL, que possuem implementações semelhantes de linguagens procedurais.

Assim como as linguagens de pro-gramação com as quais você deve ter

Exemplo 1: O esquema do banco de dados01 CREATE TABLE produtos (02 id MEDIUMINT NOT NULL AUTO_INCREMENT,03 nome CHAR(40) NOT NULL,04 custo DOUBLE(9,2) UNSIGNED DEFAULT 0.0,05 PRIMARY KEY (id)06 );07 08 CREATE TABLE estoque (09 id MEDIUMINT NOT NULL AUTO_INCREMENT,10 id_produto MEDIUMINT NOT NULL,11 quantidade MEDIUMINT NOT NULL DEFAULT 0,12 PRIMARY KEY (id)13 );1415 CREATE TABLE cabecalhos_pedidos (16 id MEDIUMINT NOT NULL AUTO_INCREMENT,17 id_cliente MEDIUMINT NOT NULL,18 data_pedido DATETIME NOT NULL,19 status_pedido CHAR(1) DEFAULT ‘O’,20 PRIMARY KEY (id)21 );2223 CREATE TABLE linhas_pedidos (24 id MEDIUMINT NOT NULL AUTO_INCREMENT,25 id_pedido MEDIUMINT NOT NULL,26 id_produto MEDIUMINT NOT NULL,27 quantidade MEDIUMINT NOT NULL DEFAULT 0,28 PRIMARY KEY (id)29 );3031 CREATE TABLE clientes (32 id MEDIUMINT NOT NULL AUTO_INCREMENT,33 nome VARCHAR(70) NOT NULL,34 endereco VARCHAR(200) NOT NULL,35 telefone VARCHAR(20) NOT NULL,36 email VARCHAR(40) NOT NULL,37 PRIMARY KEY (id)38 );

http://supertuxbr.blogspot.com

Page 38: 23 - LAMP_set_2006

38 http://www.linuxmagazine.com.br

CAPA | MySQL 5

intimidade, como PHP e Java, a lin-guagem procedural do MySQL pos-sui as estruturas de que você precisa para escrever códigos úteis. Isso in-clui comandos condicionais (IF-THEN-ELSE e CASE-WHEN) e comandos iterativos (REPEAT-UNTIL e WHILE-DO).

O comprimento deste artigo não nos permite apresentar todos os recursos da linguagem procedural do MySQL. Em vez disso, será explicado como as stored procedures e triggers do MyS-QL são estruturados e oferecem alguns exemplos simples que mostram, ainda que basicamente, o que as stored pro-cedures, triggers e views realmente são. Se você for um programador experien-te em qualquer linguagem moderna, a linguagem procedural do MySQL parecerá bastante simplista. Ela foi pensada como uma forma de oferecer entrada a comandos SQL e manipu-lar seus resultados, e não como uma linguagem para competir com outras como PHP ou Java.

Estrutura de uma stored procedureAs 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 MyS-QL informará o desenvolvedor quando este tentar criá-la.

A figura 1 mostra uma stored proce-dure que aceita um valor inteiro para

uma quantidade a ser adicionada ao estoque. Como o delimitador padrão no MySQL é um ponto-e-vírgula, e a linguagem procedu-ral do MySQL utiliza esse caractere para ter-minar cada comando, precisamos mandar o MySQL mudar o deli-mitador ao tentarmos criar nossa procedure. A convenção normal é usar como delimitador dois cifrões seguidos, com o comando DE-LIMITER $$ (linha 1). O

próximo comando (linha 3) manda o MySQL destruir a stored procedure de mesmo nome, caso exista uma. Caso contrário, esse comando é ignorado e o parser MySQL continua processando os comandos. A linha 4 faz o MySQL criar uma nova stored procedure com o nome e parâmetros fornecidos. Toda a lógica das stored procedures começa com o comando BEGIN (linha 7). Vários comandos declarativos, seqüenciais, condicionais e iterativos podem ser usados antes de terminar a lógica da stored procedure com o comando END (linha 26). Note como o comando END é seguido de nossos delimitadores tem-porários, os dois cifrões. Isso acontece porque agora deixamos a stored pro-cedure e voltamos a parsear o SQL do MySQL normalmente. Nesse ponto, vamos voltar ao delimitador padrão de ponto-e-vírgula (linha 28).

Variáveis, parâmetros e tipos de dadosNa 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, re-tornar 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 explicita-mente 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 de-senvolvedores acostumados com lingua-gens 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 ou-tros tipos de dados, como TEXT (até 64 KB) e BLOB (grande objeto binário – te-oricamente é possível armazenar até 4 TB em um LONGLOB).

Figura 1 Uma stored procedure simples no navegador de consultas do MySQL.

Figura 2 Uma procedure feita para retornar um conjunto de resultados a quem a chamou.

http://supertuxbr.blogspot.com

Page 39: 23 - LAMP_set_2006

39

| CAPAMySQL 5

Linux Magazine #23 | Setembro de 2006

SQL em stored proceduresDiferentemente de outras linguagens de programação, como PHP e Java, não existem drivers com os quais se preocu-par, 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 direta-mente 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 seguin-te (linha 16), um valor é selecionado e enviado diretamente para um parâme-tro 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 cha-ve única, como uma coluna de id usan-do 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.

CursoresUm 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, quan-do uma condição NOT FOUND for encontrada, como por exemplo quando o cursor ultra-passa 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

Exemplo 2: Uma storedprocedure com uso de um cursor01 DELIMITER $$0203 DROP PROCEDURE IF EXISTS mostrar_pedidos_processados $$04 CREATE PROCEDURE mostrar_pedidos_processados ()05 BEGIN0607 DECLARE v_p_id MEDIUMINT;08 DECLARE v_c_nome VARCHAR(70);09 DECLARE v_c_telefone VARCHAR(20);10 DECLARE v_p_data DATETIME;11 DECLARE v_p_total DOUBLE(9,2);12 DECLARE nao_encontrado TINYINT;1314 /* Selecionar todos os pedidos processados */15 DECLARE resumo_pedido_atual CURSOR FOR16 SELECT oh.id17 , c.nome18 , c.telefone19 , oh.data_pedido20 , SUM(p.custo * ol.quantidade) AS custo_total21 FROM produtos p22 , clientes c23 , cabecalhos_pedidos oh24 , linhas_pedidos ol25 WHERE c.id = oh.id_cliente26 AND oh.id = ol.id_pedido27 AND ol.id_produto = p.id28 AND oh.status_pedido = ‘P’29 GROUP BY oh.id30 , c.nome31 , c.telefone32 , oh.data_pedido;3334 DECLARE CONTINUE HANDLER FOR35 NOT FOUND36 SET nao_encontrado = 1;3738 SET nao_encontrado = 0;3940 OPEN resumo_pedido_atual;4142 laco_resumo_pedido:REPEAT4344 FETCH resumo_pedido_atual45 INTO v_p_id46 , v_c_nome47 , v_c_telefone48 , v_p_data49 , v_p_total;5051 IF nao_encontrado THEN52 LEAVE laco_resumo_pedido;53 END IF;5455 SELECT CONCAT(‘ID do pedido: ‘, v_p_id, ‘, Nome: ‘,

➥ v_c_nome,56 ‘, Telefone: ‘, v_c_telefone, ‘,

➥ Data do pedido: ‘, v_p_data,57 ‘, Total do pedido: ‘, v_p_total);5859 UNTIL nao_encontrado60 END REPEAT laco_resumo_pedido;6162 CLOSE resumo_pedido_atual;6364 END $$6566 DELIMITER ;

Figura 3 Exemplo de chamada de stored procedure em PHP usando mysqli.

http://supertuxbr.blogspot.com

Page 40: 23 - LAMP_set_2006

40 http://www.linuxmagazine.com.br

CAPA | MySQL 5

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 ite-rativo. 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 con-dição UNTIL seja atingida. Para isso, usamos um rótulo para a iteração, laco_resumo_pedi-do. 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, re-sultará num erro do MySQL.

O comando SELECT CONCAT pode parecer um pouco estranho, mas é como exibi-mos os valores retornados pela consulta do nosso cursor.

Retornar conjuntos de resultadosSe você for um programador experiente que usa algo como PHP, Java, Python ou Ruby, pode estar se perguntando qual o ob-jetivo de uma stored procedure como a do exemplo 2, já que ela só mostra o resultado no console ou no navegador de consultas

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 co-locado 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 simplesmen-te 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 potencial-mente 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.

Chamada de uma stored procedureA 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 pa-rece ser diferente de uma chamada SQL comum. A diretiva while na linha 21 itera através das linhas no conjunto de resulta-dos retornado, assim como um conjunto de dados retornado a partir da execução de uma consulta SQL normal.

Usando triggersEnquanto as stored procedures são inicia-das 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, po-demos 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ça-lho de um pedido e uma linha de pedido, e depois atualiza a quantidade estocada do produto. Outra abordagem seria que, sem-pre 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 con-cretas embutidas no banco de dados.

Figura 4 O SQL para criar a view. Figura 5 Uso de uma view como uma consulta normal.

Exemplo 3: Um trigger simples pós-atualização01 DELIMITER $$02 CREATE TRIGGER trg_ins_linhas_pedidos03 AFTER UPDATE ON linhas_pedidos FOR EACH ROW04 BEGIN05 UPDATE estoque06 SET quantidade = quantidade - NEW.quantidade07 WHERE id_produto = NEW.id_produto;08 END $$09 DELIMITER ;

http://supertuxbr.blogspot.com

Page 41: 23 - LAMP_set_2006

41

| CAPAMySQL 5

Linux Magazine #23 | Setembro de 2006

NO

ME

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.

Usando viewsO 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 me-canismo para armazenarmos e reutilizar-mos 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 passosEsse artigo apresentou alguns dos recur-sos 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 desenvol-vimento 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, prova-velmente ainda terá consultas SQL inefi-cientes em suas stored procedures.

Os recursos apresentados são comple-tamente novos no MySQL, mas quem já trabalhou com stored procedures em outros bancos de dados, como Oracle, DB2 e Post-greSQL, 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 ar-tigo foi escrito) e talvez o MySQL 6 devem aumentar o conjunto de recursos conside-ravelmente, 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. ■

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 Objeto-relacional 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

O autorLarkin 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 rela-cionado a Linux. Ele pode ser contacta-do em [email protected].

http://supertuxbr.blogspot.com

Page 42: 23 - LAMP_set_2006

42 http://www.linuxmagazine.com.br

Se você já tem o ambiente de de-senvolvimento LAMP instalado e configurado, e tem também insta-

lado o PostgreSQL em sua máquina, só nos falta configurar o PHP para carregar a extensão php_psql.so.

Se você instalou o PHP a partir do có-digo-fonte, é necessário rodar novamente o configure com a opção --with-pgsql e informar o caminho para a instalação do PostgreSQL, ou instalar pelo gerencia-dor de pacotes da sua distribuição. Em seguida, você deve editar seu arquivo php.ini, que se localiza em /etc ou /usr/local/etc, dependendo da forma de instalação usada, e descomentar a linha:

extension=php_pgsql.so

Com isso, seu ambiente de desen-volvimento estará pronto. Agora, é só reiniciar o Apache e verificar se a exten-são foi carregada. Para isso, criaremos a boa e velha página de informações com o seguinte código:

<?php phpinfo();?>

Salve essa página com o nome teste.php dentro do diretório que está sendo servido pelo Apache. Se você se esque-ceu, ou não sabe qual é esse diretório, veja a diretiva DocumentRoot em seu /etc/httpd.conf. A partir de agora, tra-

taremos essa pasta apenas como Do-cumentRoot.

Agora vamos acessar nossa página de teste pelo navegador, e conferir se o PHP carregou o módulo de acesso ao PostgreSQL. Abra seu navegador e acesse http://localhost/teste.php, e verifique as informações sobre o módulo, que devem ser semelhantes à figura 1.

Nossa base de dadosVamos agora criar uma base de dados chamada linux_magazine, na qual criare-mos a nossa tabela de notícias.

(coutinho@coitada - ~ @21:26:10)0: psql -U postgresWelcome to psql 8.1.4, the PostgreSQL➥ interactive terminal.

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

postgres=# create database linux_magazine;CREATE DATABASEpostgres=#

Conectando ao banco de dados➥ linux_magazine:

\c linux_magazine;You are now connected to database➥ “linux_magazine”.linux_magazine=#

Agora vamos criar a tabela de notícias executando a seguinte definição SQL:

linux_magazine=# CREATE TABLE news (linux_magazine(# id serial primary key,linux_magazine(# title varchar,linux_magazine(# content textlinux_magazine(# );CREATE TABLElinux_magazine=#

Nossa tabela fica assim:

linux_magazine=# \d newsTable “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 via-gem no PostgreSQL, o primeiro campo da nossa tabela é do tipo inteiro e será numerado de forma seqüencial e auto-má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’); ➧

Indexação de Textos com o Tsearch 2

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

CA

PA

Gaston THAUVIN – www.sxc.hu

http://supertuxbr.blogspot.com

Page 43: 23 - LAMP_set_2006

43

| CAPAPostgreSQL

Linux Magazine #23 | Setembro de 2006

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 sufi-cientemente populada para começarmos a brincadeira.

A página de buscaAntes 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 compre-ensível possível. Salve esse arquivo com o nome index.php na pasta DocumentRoot. Para testar nossa busca, abra seu navega-dor e acesse http://localhost/.

Milagres do Tsearch2Ainda podemos melhorar a velocidade da nossa busca. Com o módulo Tsearch2 ([1]), podemos indexar os textos de nos-sas 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 en-contrada, 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çãoSe 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 PostgreSQL01 index.php02 03 <html>04 05 <head>06 <title>Utilizando PHP com PostgreSQL</title>07 </head>0809 <body>10 11 <h1>Testando uma busca no banco de dados</h1>12 13 <form method=”post”>14 Buscar: <input type=”text” name=”q”> <input type=”submit” value=”Buscar”>15 </form>16 17 <?php1819 if ($_POST[“q”]) {20 21 echo “<br/><h2>Resultado da busca</h2>”;22 23 $conn = pg_connect(“host=localhost dbname=linux_magazine user=postgres”);24 $sql = “select * from news where content ilike ‘%” . $_POST[“q”] . “%’”;25 $dados = pg_query($sql);26 27 for ($i=0;$i<pg_num_rows($dados);$i++)28 {29 echo pg_result($dados,$i,”content”);30 echo “<hr/>”; 31 }32 33 $conn = null;34 }35 36 ?>37 38 </body>39 </html>

http://supertuxbr.blogspot.com

Page 44: 23 - LAMP_set_2006

44 http://www.linuxmagazine.com.br

CAPA | PostgreSQL

Na pasta contrib, temos vários módu-los 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/➥tsearch2makesumake install

Depois disso, o Tsearch2 já estará instalado na sua máquina.

O Tsearch é basicamente uma bibliote-ca de funções escritas em C e compiladas como Shared Object (.so). Quando man-damos instalar o Tsearch2, essa biblioteca foi colocada dentro da pasta lib abaixo da sua instalação do PostgreSQL. No meu caso, essa pasta é /usr/local/pgsql/lib. Com isso, as funções da biblioteca do Tsearch ficam disponíveis para o uso no PostgreSQL. No entanto, ainda é neces-sário que essas funções sejam registradas no banco de dados onde pretendemos usar suas funcionalidades.

O Tsearch também é composto por alguns componentes personalizados co-muns de bancos de dados, como tabelas, tipos e operadores.

Para registrar as funções em seu ban-co de dados e criar os demais objetos, o

Tsearch2 coloca um arquivo com exten-são .sql dentro da pasta share/contrib da instalação do PostgreSQL.

# ls /usr/local/pgsql/share/contrib/english.stop russian.stop tsearch2.sql➥ untsearch2.sql

Para instalar o Tsearch2 no banco de dados linux_magazine que criamos, usaremos o arquivo .sql fornecido pelo Tsearch2 para registrar as funções e criar

todos os objetos necessários para o fun-cionamento da biblioteca.

linux_magazine=# \i /usr/local/➥pgsql/share/contrib/tsearch2.sql

Verifiquemos se deu certo...

linux_magazine=# \dList of relationsSchema | Name | Type | Owner--------+--------------+----------+--------public | news | table | postgrespublic | news_id_seq | sequence | postgrespublic | pg_ts_cfg | table | postgrespublic | pg_ts_cfgmap | table | postgrespublic | pg_ts_dict | table | postgrespublic | pg_ts_parser | table | postgres(6 rows)

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 testandoPara ver se o Tsearch2 está funcionan-do 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:

Quadro 1: Criando um campo para a indexaçãolinux_magazine=# alter table news add column vectors tsvector; ALTER TABLElinux_magazine=# create index my_full_text_index on news using gist(vectors); CREATE INDEX

Exemplo 2: Função para popular a tabela01 create or replace function popula_texto(int4) returns int4 as $$02 declare03 reg record;04 qtde alias for $1;05 i int4;06 begin0708 i := 1;09 for reg in select * from news limit 1 offst 0 LOOP10 while i <= qtde LOOP11 insert into news (title,content,vectors)12 values (reg.title, reg.content, reg.vectors);13 raise notice ‘linha %’, i;14 i := i + 1;15 end loop;16 end loop;1718 return i - 1;1920 end;21 $$ language ‘plpgsql’;

Figura 2 Resultado mais nítido com o destaque dos trechos de resultado.

http://supertuxbr.blogspot.com

Page 45: 23 - LAMP_set_2006

45

| CAPAPostgreSQL

Linux Magazine #23 | Setembro de 2006

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 textA primeira grande vantagem do uso do Tsearch2 é que ele traz uma funciona-lidade 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 des-se 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, adiciona-mos um campo chamado vectors à tabela

news, e em seguida criamos um índice gist para esse campo. A nova estrutura de nossa tabela agora é essa:

linux_magazine=# \d newsTable “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)

Agora, vamos fazer o que seria nos-so trabalho de indexação dessa tabela, depois de o Tsearch2 pegar as palavras-chave do campo content e colocar no campo vectors.

A função to_tsvector() do Tsearch2 é usada para converter cadeias de caracteres para o tipo tsvector. Vejamos:

linux_magazine=# select to_tsvector(‘meu➥ nome eh coutinho’);to_tsvector--------------------------------------‘eh’:3 ‘meu’:1 ‘nome’:2 ‘coutinho’:4

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.

linux_magazine=# update news set➥ vectors=to_tsvector(content); UPDATE 3

Análise de desempenhoPara ver se isso realmente funciona, o exemplo 2 mostra uma pequena função em plpgsql para popular a tabela auto-maticamente.

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 utilizados dez registros:

linux_magazine=# select *➥ from popula_texto(10);NOTICE: linha 1NOTICE: linha 2NOTICE: linha 3NOTICE: linha 4NOTICE: linha 5NOTICE: linha 6NOTICE: linha 7NOTICE: linha 8NOTICE: linha 9NOTICE: linha 10popula_texto--------------10

Após atingir algo em torno de 500 regis-tros na sua tabela, é possível ver a diferença entre fazer uma busca comum com like e uma utilizando o nosso índice:

linux_magazine=# select count(id) from➥ news; ➧

Figura 3 Resultado da busca por “python ruby” em nosso sistema.

http://supertuxbr.blogspot.com

Page 46: 23 - LAMP_set_2006

46 http://www.linuxmagazine.com.br

CAPA | PostgreSQL

count-------1376(1 row)

Nesse exemplo, a tabela news tinha 1376 registros. Vamos ver o resultado do comando explain para uma busca co-mum 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, visi-velmente mais rápida, não usou o ope-rador 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.

A função statCom o uso da função stat(text), é possível obter estatísticas das pala-vras por número de documentos ou por número de ocorrências por do-cumento. 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 | 53python | 34 | 34php | 5 | 296(3 rows)

Segundo a saída do comando aci-ma, a palavra postgresql aparece em 35 documentos (registros), totalizan-do 53 ocorrências distribuídas nesses 35 documentos.

A função rankA função rank gera um número que re-presenta a classificação do registro na nossa consulta. Por exemplo, se pes-quisarmos 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 imple-mentar 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:

selecttitle,rank(vectors, to_tsquery(‘ruby’))➥ as rankfrom newswhere vectors➥ @@ to_tsquery(‘ruby’);

title | rank---------------------------------+---------Ruby | 0.0759909O elefante que fala sua língua | 0.0607927PostgreSQL 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

Exemplo 3: Nossa página de busca com visual melhorado01 <head>02 <title>Utilizando PHP com PostgreSQL</title>03 </head>0405 <body>0607 <h1>Testando uma busca no banco de dados</h1>0809 <form method=”post”>10 Buscar: <input type=”text” name=”q”> <input type=”submit” value=”Buscar”>11 </form>1213 <?php1415 if ($_POST[“q”]) {1617 echo “<br/><h2>Resultado da busca</h2>”;1819 $conn = pg_connect(“host=localhost dbname=linux_magazine user=postgres”);2021 $sql = “select”;22 $sql += “title,”;23 $sql += “headline(content,to_tsquery(‘” . $_POST[“q”] . “’) as content,” ;24 $sql += “rank(vectors, to_tsquery(‘” . $_POST[“q”] . “’)) as rank”;25 $sql += “from news”;26 $sql += “where content ilike ‘%” . $_POST[“q”] . “%’”;27 $sql += “order by rank desc”;282930 $dados = pg_query($sql);313233 for ($i=0;$i<pg_num_rows($dados);$i++)34 {35 echo “<p><b>” . pg_result($dados,$i,”title”) . “</b><br/>”;36 echo pg_result($dados,$i,”content”);37 echo “</p>”;38 }3940 $conn = null;41 }4243 ?>4445 </body>46 </html>

http://supertuxbr.blogspot.com

Page 47: 23 - LAMP_set_2006

47

| CAPAPostgreSQL

Linux Magazine #23 | Setembro de 2006

pela classificação, e a notícia com o título Ruby veio em primeiro, pois sua classifi-cação é maior que a das demais.

A função headlineA função headline é bem interessante, e seu resultado sozinho já tornaria o Tsearch2 um produto bastante atraente. Ela traz um trecho do texto contendo a palavra encontrada em cada documen-to. Esse recurso já é bem conhecido por qualquer pessoa que utilize sites de busca na Internet.

Vamos a um pequeno exemplo:

selecttitle,headline(content,to_tsquery(‘ruby’)),rank(vectors, to_tsquery(‘ruby’)) as rankfrom newswhere 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 re-sultado 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 extre-mamente agradável.

Melhorando a buscaVamos agora melhorar nossa feiosa página de busca. Para isso, vamos alterar o seguin-te 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 di-ferença na renderização da página, principalmente o trecho do texto contendo em negrito a palavra que procuramos. Como já tínhamos im-plementado antes, nossa busca con-tinua classificada.

Mais fácilPodemos ainda escrever uma peque-na 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 nos-so tipo de dados personalizado, pois nossa função irá retornar dados nes-se formato.

CREATE TYPE tp_search as ( ➧

id int4,title varchar,content text,rank float4);

Agora vamos fazer a função que exe-cutará aquela busca e nos retornará os dados no formato especificado pelo tipo tp_search:

CREATE OR REPLACE FUNCTION➥ my_search(varchar) RETURNS SETOF tp_search AS $$SELECT id, title,headline(content,my_query) as content,rank(vectors,my_query) as rankFROM 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);...

...E alémO 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 pes-quisar 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 comple-xas, envolvendo, por exemplo, mais de uma palavra, precisaremos fazer uso dos operadores do Tsearch2. Para informar a ele se desejamos, por exemplo, resul-

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 rankFROM news, to_tsquery($1) AS my_query WHERE vectors @@ my_query ORDER BY rank DESC; ➧

Figura 5 Resultado de uma busca com o uso do operador booleano AND.

Figura 4 Uso do operador booleano OR.

http://supertuxbr.blogspot.com

Page 48: 23 - LAMP_set_2006

48 http://www.linuxmagazine.com.br

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 rankFROM 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 TsearchPara 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 qual-quer uma delas.

Vamos supor que queiramos pes-quisar textos que contenham qualquer uma das palavras que digitei. Para isso,

usaremos o operador OR do Tsearch2, que é representado pelo caractere | (barra vertical, ou pipe). Para procu-rar textos com a palavra Ruby ou com a palavra Python, teríamos que digitar ruby|python (figura 4).

Observe que com essa consulta eu obtive registros que continham a palavra Ruby ou a palavra Python.

A figura 5 ilustra a situação do ope-rador booleano AND do Tsearch2. Nesse caso, para realizar a consulta, digitei python&ruby. Com isso, obtive apenas os registros que contêm a palavra Python e a palavra Ruby.

Operadores na páginaVamos 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 Tsear-ch2 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 ➧

</form>...

O trecho que foi adicionado ao formu-lário acrescenta à página dois botões de rádio, que permitem ao usuário definir o tipo de operação booleana a ser usada na consulta.

Agora precisamos alterar o códi-go PHP para substituir os espaços em branco pelo operador correto do Tsearch2 na cadeia de caracteres a ser pesquisada:

...$conn = pg_connect(“host=localhost➥ dbname=linux_magazine user=postgres”);

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ãoEsse 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 desenvolvi-mento 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 dia-a-dia, mais interessante e mais parecido com grandes sistemas de busca como Google e Altavista. ■

Mais Informações[1] Página do Tsearch2:

http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/

[2] Google :http://www.google.com

O autorNabucodonosor Coutinho Cos-ta é administrador de bancos de da-dos PostgreSQL e pode ser contactado pelo email [email protected]

Figura 6 Nossa página de busca, com botões de rádio que permitem definir o tipo de busca.

http://supertuxbr.blogspot.com

Page 49: 23 - LAMP_set_2006

49Linux Magazine #23 | Setembro de 2006

Em 1995, Rasmus Lerdorf achou que seria interessante ter estatís-ticas geradas de forma dinâmi-

ca em seu currículo online. Para isso, criou um sistema de scripts simples e veloz, capaz de realizar somente algu-mas funções básicas, a fim de atender às suas necessidades. Logo percebeu as possibilidades que isso lhe propor-cionava, 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. De-cidiu abrir o código-fonte do PHP/FI (que teve seu nome mudado para PHP na versão 3). Desde então, diversas pes-soas ao redor do mundo começaram a contribuir e usar essa (então) nova linguagem. A decisão de abrir o códi-go-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 in-terpretador 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 ser-vidor web e o MySQL 5.1 como servidor de banco de dados.

Scripts mais segurosApós seguir as instruções do quadro Apache mais seguro, o usuário do Apa-che 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 segu-ranç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/ -Rchmod 400 /usr/local/apache/htdocs -R

Lembre-se que, caso o usuário do Apache não tenha permissão

Integrando o banco de dados ao servidor Web

Para dar ligaDe 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

Apache mais seguroPor padrão, o Apache rodará sob o usuário root, o que não é seguro, pois se alguém con-seguir invadir o sistema através do Apache, terá acesso irrestrito ao sistema. Para resolver-mos 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 gru-po 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.

CA

PA

http://supertuxbr.blogspot.com

Page 50: 23 - LAMP_set_2006

50 http://www.linuxmagazine.com.br

CAPA | PHP

para ler seus scripts, isso causará um erro na hora de requisitá-los no navegador.

Para mais informações sobre o Apa-che, a documentação oficial pode ser obtida em [3].

Instalando o PHP 5.1A ú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 baixado com tar -jxf php-5.1.4.tar.bz2, e depois entre no diretório criado com cd php-5.1.4.

Configure-o para ser um módulo dinâmico do Apache com a opção --with-apxs2, e também para poder ser executado por linha de comando, com --enable-cli, e ainda para ati-

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 an-tiga 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

O PHP necessita de um programa chamado Flex [7] para ser compilado. Caso a configuração peça, você pode instalá-lo usando apenas ./configure && make && make install.

Agora que o PHP já está configurado, basta compilarmos e instalarmos:

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. Toda-via, caso você não os encontre, procure em [8].

Apache, esse é o PHPPor si só, o Apache não interpreta na-tivamente a extensão .php. Temos que fazer isso manualmente. Edite o arqui-vo httpd.conf, adicionando ao final do arquivo a linha:

Instalação e segurança do MySQL 5.1O MySQL 5.1, que está na versão beta no momento da escri-ta deste artigo, pode ser baixado em [4]. A versão binária se en-contra 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:

# tar -zxf mysql-5.1.11-beta.tar.gz

# cd mysql-5.1.11-beta

# ./configure --prefix=/usr/local/mysql

# make

# 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 insta-lar um banco de dados para configurações dos demais ban-cos 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 es-tar ativo. Para confirmar, use os seguintes comandos:

$ mysql -uroot

mysql> show databases;

Isso mostrará as bases de dados existentes no seu servidor. É importan-te 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 es-tiver corretamente instalado, o funcionamento de todo o servidor MyS-QL 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

Com o usuário criado, já se pode iniciar o servi-dor rodando sobre ele da seguinte forma:

# /usr/local/mysql/bin/./mysqld_safe --user=mysql

Outra opção é especificar o usuário mysql como padrão no ar-quivo de configuração do MySQL. Para isso, só precisamos acres-centar a linha à sessão [mysqld] de /etc/my.cnf:

user=mysql

Podemos também tornar os dados físicos mais segu-ros, mudando o usuário e grupo para mysql. Dessa forma, ape-nas o daemon será capaz de acessar seus dados:

# 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> FLUSH PRIVILEGES;

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 pre-ferência, tornando mais difícil uma possível tentativa de invasão.

Depois desses comandos executados, tente entrar novamente usando o co-mando 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 aces-sar a documentação oficial em [5].

http://supertuxbr.blogspot.com

Page 51: 23 - LAMP_set_2006

51

| CAPAPHP

Linux Magazine #23 | Setembro de 2006

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 MVCO MVC (Model-View-Control) é uma forma de organização de código que pro-move uma separação da estrutura de uma aplicação qualquer em três partes princi-pais. 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 de-finição mais exata de cada camada:➧ View: É toda a interface do sistema, po-

dendo ser tanto para pessoas quanto para outros programas (API). Exemplifican-do, 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 inter-faces 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 <?php0203 class LoginController04 {05 private $view = null;06 private $model = null;0708 function __construct($acao)09 {10 $this->view = new LoginView();11 $this->model = new LoginModel();1213 if (method_exists($this, $acao))14 $this->{$acao}();15 else16 $this->loginForm();17 }1819 public function validarLogin()20 {21 global $_POST;2223 $dados = $_POST;24 $resultadoValidacao = $this->model->validaUsuario($dados);25 if ($resultadoValidacao) {26 // Redireciona para pagina interna do sistema27 } else {28 $this->loginForm();29 }30 }3132 public function loginForm()33 {34 $this->view->formLogin();35 }3637 public function cadastrarLoginForm()38 {39 $this->view->formNovoUsuario();40 }4142 public function alterarLoginForm()43 {44 global $_GET;4546 $idUsuario = $_GET[‘idu’];4748 $dados = $this->model->recuperarUsuario($idUsuario);

49 $this->view->formEditarUsuario($dados);50 }5152 public function alterarLogin();53 public function cadastrarLogin();54 }5556 $lg = new LoginController($_GET[‘acao’]);5758 ?>5960 <?php6162 class LoginModel63 {64 private $link = null;6566 public function __construct()67 {68 $this->link = mysqli_pconnect(‘localhost’,’root’,’rootlocalhost’);69 mysqli_select_db($this->link, ‘mvc’);70 }7172 public function validaUsuario($dados)73 {74 $sql = ‘SELECT count(*) as total75 FROM usuarios76 WHERE usuario = “’.$dados[‘usuario’].’”’77 .’ AND senha = “’.$dados[‘senha’].’”’;7879 $query = mysqli_query($this->link, $sql);80 $row = mysqli_num_rows($query);8182 if ($row == 1)83 return true;84 else85 return false;86 }8788 public function inserirUsuario($dados);89 public function alterarUsuario($dados);90 public function listarUsuarios();91 public function deletarUsuario($idUsuario);92 public function recuperarUsuario($idUsuario);93 }9495 ?>

http://supertuxbr.blogspot.com

Page 52: 23 - LAMP_set_2006

52 http://www.linuxmagazine.com.br

CAPA | PHP

nosso sistema para quem o acessar, nada mais que isso.

➧ Model: Define o que o sistema vai fa-zer 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 re-latório dos últimos dez registros mo-dificados, 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 [email protected], junto com um rela-tório dos últimos visitantes. Podemos ter inúmeros recursos, independente-mente 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 exem-plo, 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 se-rão implementadas. A implementação fica a cargo da View e do Model.

Isso não significa que devamos simples-mente 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 MVCNa nossa aplicação do exemplo 1, usare-mos três classes, divididas em três arqui-vos. Não será uma aplicação completa. Há muitas camadas que podem ser im-plementadas, as quais mencionarei pos-teriormente. Por questões didáticas, não as implementaremos agora. Na figura 1, podemos ver um diagrama das três clas-ses exemplificadas.

Nosso sistema de exemplo servirá para demonstrar como funciona um MVC em PHP. Não me aprofundarei em como fun-ciona 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, re-ceberá 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 propositada-mente 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éto-dos 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 du-plicidade 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 quan-do 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. Construi-ríamos um método que validasse os dados, e o usaríamos tanto no método inserirUsu-ario() 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 é chama-do 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 cons-trução de grandes sistemas, pois facilita

Figura 1 Três camadas distintas para o processamento do login de um usuário, de acordo com a estrutura MVC.

http://supertuxbr.blogspot.com

Page 53: 23 - LAMP_set_2006

53

| CAPAPHP

Linux Magazine #23 | Setembro de 2006

enormemente a manutenção. Esse é um dos métodos mais utilizados para criar classes abstratas, pois podemos atualizar uma classe sem interferirmos no funcio-namento do resto do sistema.

Note também que existe um método correspondente a cada ação possível, que será chamado de acordo com a ação infor-mada. Isso foi feito para podermos adicionar recursos a essa classe sem termos que alterar o construtor, podendo tratar cada ação de forma inteiramente personalizada.

Além disso tudo, temos o contexto bem explícito. Veja que a controladora não faz absolutamente nada além de delegar as ações pertinentes às classes de Model e View; podemos a qualquer hora trocar o Model, ou o View, sem deixarmos que nossa controladora pare de funcionar.

A classe Model cria uma conexão com o banco de dados ao ser instanciada. Isso serve apenas para demonstrar uma forma de fazer, pois, numa aplicação real, é re-comendado que nunca se utilize acesso direto ao banco de dados. Você pode usar alguma classe de abstração de dados pronta como pear::MDB2 [9].

Talvez você esteja em dúvida a res-peito da implementação, na classe mo-del, de métodos muito similares aos da controladora, ao invés de fazer a imple-

mentação, diretamente, nela própria, eliminando assim a necessidade de mais uma classe e mais um arquivo. A razão é a facilidade na manutenção e até na criação dessa classe:➧ Na criação, por possibilitar o desenvol-

vimento simultâneo por mais de uma pessoa na controladora, nas Views e no Model; também individualmente em cada uma dessas classes, por manter um contexto menor, tornando mais claro e rápido o desenvolvimento. O Model só terá as regras de negócio, não sendo necessário se preocupar em como será exibida a informação, nem em como será feito o controle do fluxo.

➧ Na manutenção, por ser muito mais fácil e rápido mexer em arquivos pequenos e, principalmente, porque podemos mudar todas as regras de negócio do sistema, sem alterar absolutamente nada na View e na controladora. Imagine, por exemplo, que nosso cliente não queira mais que os dados de administradores estejam alocados em um banco de dados, e sim num arquivo XML; poderíamos criar uma outra classe model específica para XML, e mudar a controladora para chamar a nova classe. Nossa an-tiga classe continuaria lá e poderia ser utilizada em outro projeto, ou mesmo

nesse, caso o cliente mudasse de idéia novamente. Nessa última hipótese, gastaríamos poucos minutos para vol-tar 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

Page 54: 23 - LAMP_set_2006

54 http://www.linuxmagazine.com.br

O modo kiosk do KDE auxilia ad-ministradores a restringir o uso de computadores públicos a um

navegador ou a um aplicativo específico. Neste cenário, o usuário fica limitado à linha de comando ou a um pequeno con-junto de aplicativos. O editor de restrições Pessulus [1] e o editor de perfis Sabayon [2] oferecem benefícios semelhantes para o ambiente Gnome.

Desde a versão 2.0, o Gnome guarda suas configurações em arquivos XML

gerenciados pelo sistema gconf. Na ini-cialização do Gnome, esses arquivos são examinados em busca das configurações padrão do sistema, que geralmente ficam em /etc/gconf, embora o Suse utilize o /etc/opt/gnome/gconf. Depois, o Gnome adiciona os arquivos do diretório .gconf logo abaixo do home do usuário. Como de costume, as preferências do usuário têm prioridade sobre os padrões do sistema.

O Gconf também permite que os ad-ministradores do sistema definam chaves

do Gconf, as quais não podem ser sobrescritas pelos usuários. A maioria das distribuições coloca essas chaves, chamadas de mandatórias, em /etc/gconf/gcon.xml.mandatory. Até hoje, as chaves man-datórias sempre ajuda-ram os administradores a definir a aparência do desktop, desde o menu, passando pelo papel de parede, até a configu-ração de aplicativos in-dividuais.

A versão 2.14 do Gno-me adiciona novas cha-ves de restrição ao Gconf, impedindo o acesso de usuários a aplicativos in-dividuais. Essas chaves ficam armazenadas sob

/desktop/gnome/lockdown na árvore XML do Gconf, e podem desativar, por exemplo, o atalho de teclado [Alt]+[F2] para cha-mar a linha de comando, ou bloquear a impressora, ou negar o acesso à gravação no disco rígido.

Caso seja necessário, o painel do Gno-me também pode ser restrito. O Gconf então proibirá os usuários de modificarem a configuração padrão do painel em qual-quer aspecto, ou então vai impedi-los de adicionar ou remover applets individuais. Além disso, o Gnome 2.14 dá aos adminis-tradores a capacidade de impedir que os usuários saiam da sessão do Gnome ou travar a tela automaticamente quando o protetor de tela for ativado.

ConveniênciaEditar arquivos XML com um editor de texto não é visto por todos como diversão, e o editor do Gconf tem a reputação de ser pouco intuitivo. Existe um front-end em Python para essa tarefa, chamado Pessulus, que pode ser de grande ajuda. (figura 1).

O Pessulus fornece uma interface útil para as funções de restrição discutidas acima. Você pode clicar para selecio-nar uma função para negar o acesso dos usuários. Na seção Painel, você simples-mente seleciona os applets visíveis para os usuários a partir de uma lista de ap-plets instalados.

Área de trabalho dedicada com Pessulus e Sabayon

Sob encomenda

AN

ÁLI

SE

Figura 1 O editor de restrições Pessulus ativa chaves do gconf para negar funções específicas do Gnome aos usuários.

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

Richard S – www.sxc.hu

http://supertuxbr.blogspot.com

Page 55: 23 - LAMP_set_2006

55

| ANÁLISESabayon e Pessulus

Linux Magazine #23 | Setembro de 2006

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 espe-cíficos. Se necessário, os administrado-res podem até impedir que os usuários saiam do Epiphany, ou forçar o modo de tela cheia do navegador para con-verter 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 sim-plesmente 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.

PerfisOs administradores que quiserem dar privilégios diferentes a usuários distin-tos 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 es-tã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 Pes-sulus 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 guar-dadas no perfil desse usuário.

O arquivo com a configuração do perfil tem o nome de acordo com o perfil, se-

guido da extensão .zip. Não é necessário iniciar uma sessão XNest para modificar as configurações do Sabayon; em vez dis-so, pode-se editar os arquivos do Gconf diretamente no arquivo ZIP.

O Sabayon oferece mais uma abor-dagem para fazer modificações sim-ples num perfil. Pressionar o botão Detalhes leva o administrador a uma lista que detalhe as diferenças de con-figuração entre este e o padrão; é pos-sí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 Sa-bayon para uma categoria específica serão deletadas. Outros arquivos de configuração que você tenha acres-centado ou modificado podem ser apagados individualmente.

Primeiro passoAs 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 confian-te, muitos desenvolvedores do Gnome

simplesmente vêem isso como o pri-meiro passo em direção a preferência de desktop para os administradores. Há planos para estender os recursos do Sa-bayon e cooperar com o Stateless Linux [3] em algum momento no futuro. Os perfis de usuário guardariam então arqui-vos 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 Gno-me se concentraram em eliminar as falhas menores no Pessulus e Sabayon. Ainda resta vermos se essas ferramentas de res-triçã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 computa-dores 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

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.

http://supertuxbr.blogspot.com

Page 56: 23 - LAMP_set_2006

56 http://www.linuxmagazine.com.br

Nos ú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 computado-res 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á aproximada-mente 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 capa-cidade de armazenamento, tinha que es-colher 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 úni-ca 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 in-titulado “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 for-mar 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 Mon-te 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 cha-madas 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 StripingO 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 contro-lador 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 pro-babilidade de falha aumenta conforme a adição de discos ao conjunto. Assim, o RAID 0 é recomendado somente para sis-temas onde a velocidade seja muito mais importante que a redundância.

Segurança no espelhamentoO espelhamento (RAID 1) é exatamente o contrário do striping. Ele usa os dis-cos 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 ca-pacidade 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 aces-so 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 es-pelhados para o outro disco em tempo real. Em outras palavras, o RAID 1 não protege contra erro humano ou falhas de software.

Opções de RAID para o Desktop Linux

Easy RaiderO 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 NasarekTU

TOR

IAL

xbauerx’s – www.sxc.hu

http://supertuxbr.blogspot.com

Page 57: 23 - LAMP_set_2006

57

| TUTORIALRAID

Linux Magazine #23 | Setembro de 2006

RAID 1.5Para 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. HardwareOs vários desenhos de RAID foram imple-mentados originalmente como soluções de software. Com o esforço computacio-nal 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 pode-rosa 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 Li-nux. 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 ex-plorar com drivers de software.

O RAID tornou-se mais popular com usuários domésticos quando os

Níveis RAIDAlé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 acrescenta-dos 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 bastan-te 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 velo-cidade de acesso. A capacidade total do conjunto é igual à soma das capacidades dos dois dis-cos. 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 capaci-dade total do conjunto é igual à capacidade de um único disco. A velocidade de leitura normal-mente é mais rápida do que com um único disco, enquan-to a de gravação é igual.

O RAID 2, antigamente, era bas-tante comum em mainframes, mas agora é insignificante. Um conjunto RAID 2 precisa de no mínimo dez discos. Uma sofisti-cada verificação de erro permi-te que os usuários descubram tanto as falhas de disco quanto os erros de gravação. Supon-do dez discos, a taxa de tempo de acesso de leitura e grava-ção é de um para oito quando comparadas a um disco único.

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 parida-de do conjunto todo num único disco. Como o disco de paridade é muito mais usado que os discos de dados, ele tem uma tendên-cia natural de falhar primeiro.

O RAID 4 representa uma pe-quena modificação no RAID 3:

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ê acres-centar, melhores ficam os núme-ros. O RAID 5 distribui dados e informação de paridade igual-mente entre todos os discos do conjunto, o que significa que os discos exibem a mesma proba-bilidade de falhar por excesso de uso. Todavia, reconstruir o RAID após uma falha de disco leva mui-to mais tempo que no RAID 1.

Dependendo da aplicação, é pos-sível combinar os níveis básicos de RAID mais ou menos arbitra-riamente. O RAID 10 implemen-ta 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 dis-cos, 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 do-méstico, e atualmente têm rece-bido 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ân-cia, 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 proprieda-des 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).

RAID 0 Velocidade aumentada pela operação em paralelo

RAID 1 Redundância por espelha-mento

RAID 2 Segurança em números

RAID 3 Striping com paridade

RAID 4 RAID 3 para arquivos pequenos

RAID 5 Redundância e desempenho de leitura

RAID 10 Combinações de RAID

http://supertuxbr.blogspot.com

Page 58: 23 - LAMP_set_2006

58 http://www.linuxmagazine.com.br

TUTORIAL | RAID

fabricantes de placas-mãe passaram a incluir chips controladores RAID. Hoje em dia, a maioria das placas mo-dernas, 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 geren-ciamento, deixando o trabalho pesado para os drivers. E fazer isso funcionar nem sempre é trivial.

Explorando o RAIDRAID por software foi introduzido no Linux há muito tempo. Os computado-res 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 ba-seadas na placa-mãe oferecem podem ser mínimos, pois baseiam-se fortemente em drivers de software.

Para iniciar com o RAID, é perfeita-mente aceitável instalar uma variante baseada em software. Para isso, você pre-cisará 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 en-volve os seguintes passos:

➧ Criar ao menos duas partições do mesmo tamanho

➧ Usar o mdadm para combinar as parti-ções e criar a área de RAID

➧ Formatar o dispositivo RAID com um sistema de arquivos

➧ Acessar a nova partição RAID➧ Usar o mdadm para monitorar o conjunto

RAIDO exemplo a seguir usa um dispo-

sitivo USB referido como /dev/sdc e duas partições referidas como /dev/sdc1 e /dev/sdc2. Para construir um conjunto RAID 1 a partir dessas partições, use o seguinte comando mdadm:

mdadm --create --verbose /dev/md0➥ --level=1 -raid-devices=2 /dev/sdc1➥ /dev/sdc2

A opção --create cria o RAID; --ver-bose dá informações mais detalhadas do progresso; /dev/md0 é o nome do disposi-tivo RAID resultante, e --level=1 define o nível de redundância do RAID nível 1. O último parâmetro passa o número de partições RAID e seus nomes.

Antes de você usar o conjunto RAID recém-criado, é necessário formatá-lo (usando XFS em nosso exemplo) e montar o sistema de arquivos resultante:

mkfs.xfs /dev/md0mkdir /media/RAIDmount /dev/md0 /media/RAID

Agora você pode usar o diretório /me-dia/RAID como qualquer disco normal. Porém, por trás dos panos, seus dados

estarão sendo gravados em duas partições para oferecer redundância. O comando mdadm --detail /dev/md0 fornece informa-ções sobre o status do conjunto RAID a qualquer hora que você quiser. A figura 2 mostra a saída desse comando em nossa máquina de testes.

Mas será que a partição do nosso con-junto espelhado é realmente importante? Para descobrir, desmonte o RAID com o comando umount /media/RAID e saia do conjunto RAID com um mdadm -S /dev/md0. Depois, crie dois diretórios chamados /me-dia/sd1 e /media/sd2, e monte as partições /dev/sdc1 e /dev/sdc2 nesses diretórios. Você descobrirá que os mesmos dados estão armazenados nas duas partições.

ConclusõesO RAID oferece diversos benefícios para usuários domésticos. Ele oferece uma maior redundância de dados e acelera o acesso ao disco com o RAID. Confi-gurar um conjunto RAID por software no Linux é fácil e só precisa de algumas etapas. A ferramenta Mdadm nos ajuda a implementar todos os níveis de RAID explicados neste artigo. ■

Mais Informações[1] RAID na Wikipédia:

http://pt.wikipedia.org/ wiki/RAID

[2] mdadm: http://cgi.cse.unsw.edu.au/ ~neilb/mdadm

Figura 1 O RAID nível 1.5 combina características do RAID 0 e RAID 1.

Figura 2 O Mdadm fornece informações sobre o status do dispositivo RAID.

http://supertuxbr.blogspot.com

Page 59: 23 - LAMP_set_2006

59Linux Magazine #23 | Setembro de 2006

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 espiona-gem. 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 navega-dor 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 enca-minhados 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 roda-rã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 o seu tráfego. É por isso que uma chave secreta é negociada, entre o seu Onion Proxy em casa e cada um dos nós no ca-minho, até o nó de saída. A chave impede que nós não autorizados se intrometam na conversa em andamento.

Ao criptografar os dados em diversas ca-madas, somente o Onion Proxy na sua máquina é capaz de acessar os da-dos – o sistema também impede que operadores de nós descriptografem os dados que passarem. Dessa forma, os dados ficam como uma cebo-la – 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 te-nha como saber em qual máquina se originou o pedido. Nenhum dos Onion Routers conhece o Onion Proxy, o que sig-nifica que os operadores de Onion Routers são incapazes de descobrir

a quem pertencem os dados que eles estão repassando.

Na volta do alvo, a informação é nova-mente empacotada e permanece cripto-grafada até o proxy da sua máquina retirar as camadas criptográficas para revelar os dados. Isso torna impossível que outros, incluindo o provedor, saibam que dados

Navegação segura com um proxy local

Anônimo na multidãoAo 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

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.

Bartlomiej Stroinski – www.sxc.hu

TUTO

RIA

L

http://supertuxbr.blogspot.com

Page 60: 23 - LAMP_set_2006

60 http://www.linuxmagazine.com.br

TUTORIAL | Tor e Privoxy

você pede ou envia; a pessoa responsável pela máquina-alvo só consegue saber o endereço IP do nó de saída, que pode estar em qualquer parte do mundo.

Instalação do TorO Tor ainda é um programa bastante jovem, como mostra o número da ver-são; ele ainda nem tem uma interface. Usuários do Suse podem baixar o código-fonte da versão estável 0.1.0.16, e começar instalando as ferramentas Automake. Se você tiver o Suse 9.3 ou 10.0, o Autoconf e o Automake já estarão instalados. Além disso, você precisa dos compiladores gcc e g++. O YaST automaticamente car-rega as bibliotecas necessárias. Não se esqueça de instalar o Openssl-devel e os arquivos de cabeçalho Zlib-devel, além da biblioteca Libevent.

Usuários do Suse 9.3 não podem usar o YaST para instalar a biblioteca; em vez disso, devem baixar o código-fonte de [2] e seguir os passos padrão de instala-ção: ./configure, make e make install. Isso deve funcionar a contento. O Suse 9.3 ainda precisa de uma nova entrada em /etc/ld.so.conf para conseguir encontrar 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:

deb http://mirror.noreply.org/➥pub/tor sarge maindeb-src http://mirror.noreply.org/➥pub/tor sarge main

Depois, torne-se root e rode apt-get update para atualizar a lista de paco-tes com os disponibilizados pelo novo repositório, e apt-get install tor para instalar o Tor.

Lá vamos nós...Vamos testar o Tor. Abra uma janela de terminal e digite tor. Após um curto inter-valo, você deve ver uma mensagem dizen-do Tor has successfully opened a circuit.

Looks like it’s working (figura

2). Se você ain-da não estiver convencido e quiser ter cer-teza, simples-

mente busque no Google os termos my pc. Você verá algumas páginas que não só informam o IP do seu computador, 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ê visitou recentemente.

Para bagunçar essas páginas, primeiro mande o navegador rotear todo o tráfe-go pelo Tor Onion Proxy. Se você tiver o Firefox, simplesmente vá em Preferên-cias, e selecione Configurações da Co-nexão | Configuração Manual do Proxy. Digite 127.0.0.1 como seu Host SOCKS, e 9050 como sua Porta (figura 3). Agora se-lecione a entrada SOCKS v4 e termine a configuração: seu navegador agora vai rotear todo o tráfego primeiro para a porta 9050, e o Tor vai encaminhá-lo à Internet. Usuários do Mozilla devem se-lecionar Editar | Preferências | Avançado | Proxies para isso.

Agora, quando você consultar seu en-dereço IP, os resultados devem ser bem diferentes de como costumavam ser: o servidor Web agora pensa que você mora na Alemanha (figura 4) – parece que o Tor está funcionando mesmo.

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 anoni-mização: a criptografia tende a retardar sensivelmente a comunicação com ser-vidores remotos.

Privoxy para sobremesaO Tor não elimina todo o risco de na-vegar. Como você talvez já saiba, o seu navegador precisa buscar o endereço da máquina-alvo enviando um pedido a um servidor DNS. O servidor então resolve o nome da máquina (como www.linuxmagazine.com.br, por exemplo) para o endereço IP (212.227.96.14). O servidor DNS depois envia o endereço resolvido de volta ao navegador. Se alguém veri-ficar os arquivos de registro do servidor DNS, poderá descobrir quais máquinas buscaram o endereço www.linuxmagazine.com.br, e quando. O Privoxy pode impedir isso utilizando o Socks 4a que, diferente-mente do Socks 4 e Socks 5, não precisa converter nomes de máquina em ende-reços IP antes.

Figura 2 O Tor conseguiu abrir um circuito com sucesso.

Figura 3 Configurando o Tor como servidor proxy para seu navegador.

http://supertuxbr.blogspot.com

Page 61: 23 - LAMP_set_2006

61

| TUTORIALTor e Privoxy

Linux Magazine #23 | Setembro de 2006

O Privoxy é um proxy de filtragem para HTTP comumente usado em con-junto 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 geralmen-te é 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/etc/privoxy/config e entrar a seguinte li-nha abaixo do item 5, FORWARDING:

forward-socks4a / 127.0.0.1:9050 .

Não esqueça o ponto depois da porta, caso contrário, nada será repassado. É necessário modificar o mesmo arquivo no Debian. Porém, nesse caso, o arquivo fica em /etc/privoxy.

Agora mude as suas configurações de proxy do Firefox e Mozilla para refletir as mudanças. Entre 127.0.0.1 como en-dereço IP, e 8118 como a porta em todos os casos, e depois navegue para o website que mostrou seu endereço IP antes. Se seu endereço IP for mostrado corretamen-te, o Privoxy está funcionando direito; e se você vir o endereço IP errado, o Tor também está funcionando.

Mudança rápidaAntes, 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. Entretan-to, 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, sele-cione 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 MicrosoftJá que estamos aqui, quais são os motivos para você dizer a todos que usa Linux e prefere o navegador Firefox? Não há um bom motivo para você revelar essa infor-mação, apesar de algumas páginas pedirem exatamente essa informação para você, e algumas páginas menos educadas baterem a porta na cara dos usuários de Linux.

A extensão User Agent Switcher [4] ajuda a mudar esse comportamento. De-pois de instalá-la e reiniciar o navegador, selecione User Agent Switcher no menu Ferramentas, e escolha Internet Explorer 6, ou Opera 9, se preferir. Vá novamen-te àquele site onde você já fez várias verificações; agora ele deve identificar 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. ■

Figura 4 O website pensa que você mora na Alemanha, pois é lá que está o nó de saída que o contactou.

Figura 5 A extensão Switch Proxy do Firefox oferece uma solução simples para ativar e desativar proxies.

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: http://chrispederick.com/work/useragentswitcher/

http://supertuxbr.blogspot.com

Page 62: 23 - LAMP_set_2006

62 http://www.linuxmagazine.com.br

O Rsync mantém seus dados atualizados e ajuda usuários a manterem-se a par das mu-

danças de versão. A ferramenta de sincronização Rsync oferece opções para ajudar a gerenciar as proprie-dades de arquivos; ele funciona bem com SSH, e é perfeito para transferir grandes volumes de dados se o recep-tor 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 des-tino. 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 per-da 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 ope-raçã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_xskipping directory dir1/subdir_yskipping non-regular file “foobar.tex”capitulo01.texcapitulo02.texcapitulo03.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 combi-nação dessas opções é possível:

$ rsync -rl diretorio1/* diretorio2/building file list ... donefoobar.tex -> foobar_novo.texcapitulo01.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 barraColocar 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 dantesSe você for usar o Rsync para criar beca-pes, 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 preser-vam dados dos arquivos, como dono e grupo, ou para suportarem arquivos de dispositivos. Para manter as permissões,

Uso do Rsync para sincronização de dados

SincronizadoO 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

TUTO

RIA

L

alexandre jaeger – www.sxc.hu

http://supertuxbr.blogspot.com

Page 63: 23 - LAMP_set_2006

63

| TUTORIALRsync

Linux Magazine #23 | Setembro de 2006

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õesO Rsync possui uma opção muito prá-tica para permitir que o usuário exclua certos arquivos do processo de sincroni-zaçã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 termi-nam 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.

Pode-se economizar tempo armaze-nando suas exclusões num arquivo texto. É necessária uma linha para cada pa-drão de busca. Especifique o parâmetro --exclude-from=Arquivo-de-exclusão para usar o arquivo.

CooperaçãoO 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áqui-nas, 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 absolu-to 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 ar-quivo seja novamente interpretado.

Montes de dadosO Rsync é perfeito para transferir grandes volumes de dados. Ao es-pecificar o parâmetro --partial, se a transferência foi interrompida por algum motivo, é possível retomar a transferência do ponto onde ela parou. Especificar a opção --progress ainda mostra um indicador de progresso para o usuário acompanhar o processo de transferência:

$ rsync --progress --partial debian.iso➥ transpluto:/scratch/debian/Password:debian.iso 22543992 3% 5.15MB/s0:02:14

No outro extremo da conexão, o ar-quivo parcial fica inicialmente oculto no diretório de destino. Digitar ls -a lá revela um arquivo semelhante a .debian.iso.wtKNr7. O ponto mantém o arquivo oculto, e a extensão arbitrária elimina o perigo de se sobrescrever arquivos já existentes.

Quando a transferência termina, o arquivo recebe de volta seu nome origi-nal. Se a transferência for interrompida, é possível reiniciar especificando nova-mente a opção --partial.

A desvantagem da opção --par-tial é que, se você usar o Rsync para atualizar um arquivo já existente e a transferência for interrompida, o arquivo anterior na máquina de des-tino desaparece e é substituído pelo arquivo parcial já transferido. Pode-se contornar isso criando antes um hardlink para o arquivo original: ln debian.iso debian_orig.iso. Se a trans-ferência falhar agora, o arquivo ISO não será perdido; em vez disso, o ar-quivo parcial recebe um novo nome, sem apagar o original. ■

Dados em uníssonoO Unison [1] é outra ótima ferramenta de sincronização que não somente sincroniza em am-bas as direções, como também suporta sistemas não-Linux. O programa está disponível para Li-nux, Windows®, Mac OS X e Irix, como nos informa a área de download de seu website.

É 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.

Se o conteúdo dos dois diretórios for diferente, o Unison lhe a visará, mostrará o sen-tido da sincronização e dirá se o arquivo é novo ou se foi modificado:

diretório1 diretório2new file ----> capitulo01.tex [f]<---- changed capitulo02.tex [f]

Para aceitar essa sugestão, apenas pressione [F]. Se surgir algum conflito que o Unison não con-siga 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 verifi-ca mais uma vez se você quer aplicar as mudanças: pressionar [y] inicia a sincronização.

Proceed with propagating updates? [] yPropagating updatesUNISON 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 stateSynchronization 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 uni-son -ui texto diretorio1 ssh://usuario@maquinadestino/diretório.

A sintaxe é um pouco diferente em relação à do Rsync: em vez de dois-pontos (:), usa-se uma barra (/). Para usar um caminho absoluto, é necessário acrescentar outra barra: uni-son -ui texto diretório1 ssh://usuario@maquinadestino //outrodir/diretório1.

Mais Informações[1] Página do Unison:

http://www.cis.upenn.edu/ ~bcpierce/unison/

http://supertuxbr.blogspot.com

Page 64: 23 - LAMP_set_2006

64 http://www.linuxmagazine.com.br

Era uma terça-feira ensolarada de Maio. Eu estava escrevendo minha coluna para a Linux Magazine.

Eram duas horas da tarde quando eu olhei para o monitor e vi os últimos dados de carga e tráfego dos servidores críticos que gerencio. Fiquei absolutamente pasmo ao ver que a linha reject do gráfico do filtro de spam estava nas alturas (veja figura 1). O artigo teria que esperar.

Então o servidor estava rejeitando enormes quantidades de mensagens nos estágios iniciais do diálogo SMTP. Suspeitei de uma onda de spam com envelopes mal forjados. Isso não seria nenhuma novidade: para cada e-mail legítimo que eu recebo, chegam dois e-mails. Mas ainda decidi abrir uma cone-xão SSH com o filtro de spam, que roda numa máquina separada, e não acreditei quando encontrei 140 conexões SMTP

paralelas, e aumentando. Aquilo era dez vezes o nível normal. E é bastante inco-mum o servidor simplesmente perder as conexões daquela forma.

A curiosidade me levou a investigar o arquivo de registro. Conforme esperado, cada mensagem vinha de uma fonte di-ferente. Dois terços dos IPs pertenciam a provedores europeus, e o resto aos EUA e Brasil. Os computadores gentilmente forneciam seus nomes completos na mensagem HELO, os quais nem pareciam ter sido forjados, o que é bem raro, pois HELO forjados são o padrão em spam.

Atacantes-vítimasUsei o nmap para varrer algumas portas. Também rodei o nmap com a opção --osscan-guess para obter um perfil dos siste-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 opção. Todas as máquinas rodavam Win-dows® XP, e ninguém usa Windows XP como servidor de e-mails ou Web – acabo de ser apresentado a uma botnet.

Botnet é um grupo de máquinas inde-pendentes 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 juntos eles se tornam uma arma perigo-sa. Felizmente, a botnet que me atacou parecia ter só 200 máquinas.

E agora, nosso patrocinadorEu 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 tar-de), e aceitar as mensagens na segunda tentativa.

Explicação: Spambots geralmente não têm uma fila para guardar temporaria-mente 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 es-tã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.

Uma insistente botnet ataca Charly

Gangue virtualDurante 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

Figura 1 A linha reject no gráfico do filtro de spam de repente sobe – fui atacado por um exército de bots de spam.

Figura 2 Depois de retirar o limite do SMTP, os zumbis reforçaram o ataque contra o servidor. O loadavg mostrava 0.3 – e tudo estava bem.

SY

SA

DM

IN

Lorenzo González – www.sxc.hu

http://supertuxbr.blogspot.com

Page 65: 23 - LAMP_set_2006

65

| SYSADMINAtaque dos Bots

Linux Magazine #23 | Setembro de 2006

Verificar destinatárioDe volta ao registro: o envelope infini-tamente forjável do remetente é sem-pre o mesmo, ou seja, <>, o remetente nulo. A vantagem desse endereço para o spammer é que qualquer servidor de e-mail em conformidade com a RFC o aceitará. E diversas medidas anti-spam que se baseiam na verificação do en-dereço do remetente, tais como o SAV (Sender Address Verification), são inúteis se você tiver um remetente nulo.

Os endereços dos destinatários usa-dos pela botnet de spam são ainda mais interessantes: nenhum deles existe, e todos são palavras de um dialeto cópti-co extinto – ou mais provavelmente de algum gerador de caracteres aleatórios. Isso explica por que o filtro de spam ignora a mensagem antes mesmo de o diálogo SMTP chegar à fase do comando DATA. O filtro realiza Recipient Address Verification (Verificação do Endereço do Destinatário), a contraparte do SAV.

O RAV é baseado num princípio simples: se o servidor de envio citar o endereço do destinatário em RCPT TO:, o filtro de spam primeiro verificará aonde o e-mail tem que ir, ou seja, para o meu servidor de e-mail (mail.kuehnast.com, na linha 3 do exemplo 1). Ele abre um diálogo SMTP e obtém a resposta para o RCPT TO:. Que é user unknown, no caso dos zumbis. Isso faz o filtro de spam terminar o diálogo com o spammer (linha 4), o que se reflete na massa de rejeições mostradas no gráfico dos e-mails.

Comecei a entender por que o filtro de spam estava relativamente tranqüilo apesar de estar lidando com mais de

500 processos SMTP. Mais ou menos nenhum desses processos chegou a entregar de fato uma mensagem, pois a Verificação de Endereço do Des-tinatário bloqueou todas elas antes desse estágio.

Agora, se eu tivesse jogado as mensa-gens no Spamassassin antes de verificar o endereço do destinatário, o filtro de spam estaria quase parando, simples-mente devido ao volume de mensagens que chegavam. Meu conselho para os administradores de sistemas é: a Verifi-cação do Endereço de Destinatário torna a vida menos cheia de surpresa.

Decidi capturar alguns dos spams que chegavam porque eu queria saber o que a mensagem tinha que o exército de bots estava tentando enfiar através do meu filtro de spam nas últimas horas. Eu esperava o lixo padrão junto com um cavalo-de-tróia, talvez disfarçado de GIF ou PDF. Ou os anúncios comuns de auxílios à ereção, drogas para fes-tas ou aumento de seios (infelizmen-te ninguém parece ter um tratamento para barriga de chope). Mas o que eu descobri era somente um conjunto de caracteres ASCII.

Há dois possíveis motivos para isso: ou o spammer só estava tentando me chatear, ou ele não entende MIME. Achei que fosse o segundo, e até pensei em passar a sopa de letrinhas por um decodificador Base64. Mas caramba, será que eu preciso mesmo saber o preço do Viagra essa semana? Acho que vou ficar só no arquivo de registro vendo as mensagens serem rebatidas pelo filtro de spam. Posso terminar o artigo hoje à noite. ■

Exemplo 1: Trecho do arquivo de registroMay 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=<>, [email protected], 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 <[email protected]>: Recipient address rejected: unverified address:➥ host mail.kuehnast.com[80.190.243.62] said:

550 <[email protected]>:no such user (in reply to RCPT TO command);➥ from=<> to=<[email protected]>

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

Page 66: 23 - LAMP_set_2006

66 http://www.linuxmagazine.com.br

Os 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 apli-cativos 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 sobre-carga 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 interes-sante para melhorar o desempenho com clientes sem disco é ter um sistema de arquivos raiz localizado em um dispo-sitivo 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 Uni-versidade 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çãoQuando 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 sobrecar-ga significativa nos dois servidores. Para resolver esse problema, iniciamos uma busca sistemática de otimizações poten-ciais, sem no entanto mexer no servidor e no hardware de rede.

Mais uma missão para os network block devices

O bloco está na redeVocê 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

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.

SY

SA

DM

IN

hilary quinn – www.sxc.hu

http://supertuxbr.blogspot.com

Page 67: 23 - LAMP_set_2006

67

| SYSADMINNBD

Linux Magazine #23 | Setembro de 2006

Logo descobrimos que o comporta-mento 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 legadoO 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 confi-gurar, 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 cegamen-te 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 dire-tó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 abor-dagem 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 desem-penho, porém reduz a integridade dos dados. Sem outras medidas, não se pode garantir que os dados no ca-che 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 blocoIsso 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 arma-zenamento, ou SAN), que geralmente baseiam-se numa malha fiber channel independente da rede. Dito isso, deve-mos 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.

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.

Aplicação

VFS

Sistema de arquivos

Block device

Aplicação

VFS

Sistema de arquivos

Block device

FTP, SCP, HTTP

ISCSI, AoE, NBD

NFS, SMB

LUFS

Cliente ServidorRede

Blocos e arquivosOs sistemas de arquivos controlam o acesso aos arquivos; dispositivos de blocos geralmente abstraem o hardware (dis-cos 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. Siste-mas operacionais modernos devem aumentar o desempe-nho através do cache em RAM das transferências de dados.

Os sistemas de arquivos de rede disponíveis diferem quan-to aos tipos e tamanhos de arquivos que suportam, e tam-bém quanto ao controle de acesso. Por exemplo, o Sam-ba 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. Disposi-tivos 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

Page 68: 23 - LAMP_set_2006

68 http://www.linuxmagazine.com.br

SYSADMIN | NBD

O kernel “oficial” já possui o recurso NBD há quatro anos. O módulo é bem simples, e deixa a verificação da inte-gridade dos dados transferidos para a camada TCP subjacente.

Uso de NBDsPode-se executar modprobe nbd para ver se o seu kernel possui um módulo NBD configurado. Não deve aparecer nenhu-ma mensagem de erro. As ferramentas respectivas do espaço do usuário, como /usr;bin;nbd-server, são fornecidas pela maioria das distribuições num pacote se-parado. A versão 2.8.4 era a atual quando este artigo foi escrito, e está disponível em [1]. O Suse Linux 10.0 ainda utiliza a versão 2.7.4, que funcionará muito bem para o que queremos.

Para os testes ini-ciais, talvez você queira eliminar a possibilida-de de surgirem proble-mas de rede e rodar o cliente e o servidor na mesma máquina. A for-ma mais fácil de fazer isso é com uma parti-ção livre. Se você não tiver uma, um arquivo contêiner com algum

sistema de arquivos servirá (exemplo

1). Testamos essa configuração com ReiserFS, Ext2 e XFS, com sucesso. As ferramentas de formatação dirão que o arquivo não é um dispositivo de blocos (linha 8), mas você pode ignorar esse aviso.

Em nosso exemplo, o administrador cria um arquivo de 100 MB (linhas 1 e 2), adiciona um sistema de arquivos Ext 2 (linha 6), inicia o servidor NBD na por-ta 5000 (linha 14), e monta o dispositivo na mesma máquina (linha 15). A esco-lha do número da porta é arbitrária, o que permite iniciar múltiplos servidores para vários contêineres. O cliente NBD precisa do módulo do kernel e espera o endereço IP e o número da porta do ser-vidor, seguidos do nome do dispositivo de blocos local.

RemotoPara iniciar o cliente e o servidor em má-quinas separadas, simplesmente substitua o endereço 127.0.0.1 na linha de comando do nbd-client pelo IP do servidor. O nbd-server consegue exportar volumes LVM ou partições, em vez de simples arquivos contêiner. Para isso, simplesmente subs-titua o nome do arquivo pelo do disposi-tivo: nbd-server 5001 /dev/sda4.

O cliente fecha a conexão com o servidor da seguinte forma: nbd-client -d dispositivo; mas certifique-se de des-montar o dispositivo de blocos antes de fechar a conexão:

umount /mntnbd-client -d /dev/nbd0

Conforme explicado no quadro Blocos

e arquivos, permitir que múltiplas máqui-nas gravem em um NBD compartilhado leva ao caos. Em vários casos, nem existe essa necessidade. O acesso de leitura é suficiente para o sistema de arquivos raiz de um cliente sem disco, para um diretó-rio de aplicativos compartilhado, ou para um repositório de documentos.

Somente leituraA opção -r inicia o servidor de dispositivos de bloco em modo somente leitura, evi-tando assim que os clientes modifiquem o dispositivo de bloco. Obviamente, isso também desqualifica os sistemas de arqui-vo com journal. Não conseguimos montar sistemas Ext 3, ReiserFS ou XFS através de dispositivos de bloco somente leitura em nosso laboratório. Dependendo do sistema de arquivos, mensagens de erro das mais variadas proporções foram mostradas; a fi-

gura 3 mostra o que o ReiserFS tem a dizer sobre isso. Especificar a opção de montagem -o ro não melhorou as coisas; sistemas de arquivo com journal sempre querem gravar em seus journals. Entretanto, o SquashFS e o Ext 2 aceitaram bem.

Alternativamente, o NBD oferece a opção -c para copiar ao gravar (exemplo

2, linha 1). Para suportar essa opção, o ser-vidor cria um arquivo para cada cliente, onde guarda as modificações realizadas pelo cliente. A linha 9 exemplifica isso. Quando o cliente desconecta, as mu-danças são perdidas, apesar de o arqui-vo propriamente dito ser mantido. Os próprios desenvolvedores dizem que o desempenho da opção -c não é muito bom, então talvez você prefira uma so-lução implementada no cliente, como o UnionFS ou o módulo COW (copy on write, ou copiar ao gravar).

Infelizmente, a segurança do NBD é, no máximo, rudimentar. É semelhante à do NFS, mas menos flexível. Os ad-ministradores podem especificar uma lista de máquinas que receberão direito de acesso ao dispositivo. O NBD não tem qualquer recurso avançado, como autenticação, verificação de integridade ou criptografia.

Escrita direcionadaClientes sem disco precisam criar ou modificar arquivos em várias posições do sistema de arquivos durante sua exe-cução – o diretório /etc/resolv.conf ou vários outros diretórios temporários, por exemplo. Uma solução envolve o uso de sistemas de arquivos translúcidos, como o UnionFS, para suportar mudanças através de um ramdisk superposto. Entretanto, essas modificações não são persistentes, e o sistema volta ao estado original na próxima inicialização.

O Cowloop (Copy On Write Loopback Device, ou dispositivo loopback com cópia na gravação) [2] é outra abordagem para dispositivos de blocos somente leitura. O Cowloop torna um dispositivo de blocos

Sem permissão de escritaAssim como com um sistema de arquivos remoto, um dis-positivo de bloco de rede pode ser exportado para suportar acesso completo ou somente leitura. Existe uma diferença marcante quando se examina o acesso de gravação com-partilhado num recurso: os sistemas de arquivos de rede oferecem mecanismos de travamento ou acesso coordena-do aos arquivos para evitar danos aos arquivos. Os disposi-tivos de rede fazem muito menos esforço, e ficam satisfei-tos desde que o acesso de leitura ou escrita fique restrito a blocos individuais. A única proteção que oferecem é a garantia de que as transferências de bloco sejam atômicas.

Os dispositivos de bloco não têm interesse especial em sa-ber se os blocos na verdade pertencem a algum sistema de arquivos – eles ignoram solenemente as camadas de da-dos subjacentes e a forma como se organizam. Entretan-to, isso pode dificultar o suporte ao uso distribuído de um dispositivo de blocos de rede com um sistema de arquivos comum baseado em blocos. Se vários clientes tentassem gravar dados num NBD compartilhado, não tomariam co-nhecimento de seus colegas, e destruiriam as estruturas de dados uns dos outros por causa da falta de coordena-ção. O caching local nos clientes torna esse caos perfeito e deixa os sistemas de arquivos com um lixo ininteligível.

Isso não é uma fonte de preocupação para as operações sem disco. Contanto que ninguém tente gravar no NBD, qualquer número de clientes pode compartilhá-lo. Mas para gravar, é necessário impedir que um segundo cliente monte o dis-positivo de blocos caso outro cliente queira gravar nele.

Figura 3 Nossa tentativa de montar o ReiserFS num dispositivo de blocos somente leitura. O sistema de arquivos precisa acrescentar entradas ao journal, mas NBDs compartilhados não podem ser graváveis.

http://supertuxbr.blogspot.com

Page 69: 23 - LAMP_set_2006

69

| SYSADMINNBD

Linux Magazine #23 | Setembro de 2006

gravável, gravando as mudanças separa-damente 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.

CowloopDepois de descompactar, compilar e ins-talar 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 cowloopcowdev -a /dev/nbd0 /tmp/nbd.cowmkdir /mnt/nbd-rwmount /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/cowmknod /dev/cow/ctl b 241 255ln -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óriaClientes sem disco não dispõem de ar-mazenamento local, e portanto puxam da rede todas as informações de que ne-cessitam. Normalmente, o carregador de boot ou algum parâmetro do kernel informa ao kernel onde se localiza o sis-tema de arquivos raiz. Mas, se o sistema de arquivos raiz estiver em algum lugar de uma rede local, será necessário for-necer 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 pri-

meiras 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 ferra-mentas, 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 NBD01 hermes:~ # mkdir /exports02 hermes:~ # dd if=/dev/zero of=/exports/nbd-export bs=1024 count=10000003 100000+0 records in04 100000+0 records out05 102400000 bytes (102 MB) copied, 0,987222 seconds, 84 MB/s06 hermes:~ # mke2fs nbd-export07 mke2fs 1.38 (30-Jun-2005)08 /exports/nbd-export is not a special block device.09 Continue anyway? (y,n) y10 Filesystem-Label=11 OS-Typ: Linux12 Block size=1024 (log=0)13 [...]14 hermes:~ # nbd-server 5000 /exports/nbd-export15 hermes:~ # nbd-client 127.0.0.1 5000 /dev/nbd016 Negotiation: ..size = 100000KB17 bs=1024, sz=10000018 hermes:~ # mount /dev/nbd0 /mnt19 hermes:~ # ls /mnt20 . .. lost+found21 hermes:~ # df22 Filesystem 1K blocks Used Available Used% Mounted as23 [...]24 /dev/nbd0 96828 13 91815 1% /mnt25 hermes:/ # time dd if=/dev/zero of=/mnt/text count=8192 bs=102426 8192+027 8192+028 8388608 bytes (8,4 MB) copied, 0,038112 seconds, 220 MB/s2930 real 0m0.046s31 user 0m0.008s32 sys 0m0.036s

Exemplo 2: Copiar ao gravar01 hermes:~ # nbd-server 5000 /exports/nbd-export -c02 hermes:~ # nbd-client 127.0.0.1 5000 /dev/nbd003 hermes:~ # mount -t xfs /dev/nbd0 /mnt04 hermes:~ # ls -al /exports05 insgesamt 10000806 drwxr-xr-x 2 root root 60 2006-04-03 12:39 .07 drwxr-xr-x 23 root root 4096 2006-03-25 21:16 ..08 -rw-r--r-- 1 root root 102400000 2006-04-03 12:33 nbd-export09 -rw------- 1 root root 270336 2006-04-03 12:39 nbd-export-127.0.0.1-7812.diff

http://supertuxbr.blogspot.com

Page 70: 23 - LAMP_set_2006

70 http://www.linuxmagazine.com.br

SYSADMIN | NBD

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 padroni-zado, que pode tanto ser embutido no kernel sob um TempFS (de forma se-melhante 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 (lo-calizada na Klibc) apaga os dados antes guardados nesse ponto.

AlternativasAlém do NBD, várias outras implemen-taçõ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ódigo-fonte, o ENBD suporta o tratamento de erros, reconexão automática em caso de queda, canais múltiplos, entre outros recursos.

Dispensando os fiosO DNBD [5] (Distributed Network Blo-ck 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 é piora-do 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 trans-ferê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 meca-nismos 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 monitoramen-to. 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 conse-guir acessar um dispositivo de blocos de rede, ele primeiro tenta descobrir um servidor, enviando um pacote especial

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.

Cowloop Dispositivo de bloco

Somente leituraDispositivo de bloco

Arquivo editável(Arquivo esparso)

Leitura Leitura e escrita

Sistema de arquivos

Variantes do NBDNome Explicação

NBDO Network Block Device é o predecessor de todos os dispositivos de blocos de rede do Linux. No momento, só existe um desenvolvedor ati-vo e uma lista de discussão com volume razoável de tráfego. [1]

ANBDO Another Network Block Device é uma extensão compatí-vel com NBD criada em 2003. Suporta multithreading e prome-te melhores mensagens de erro que seu antecessor. [3]

ENBD

O Enhanced Network Block Device está sendo impulsionado por so-mente um desenvolvedor ativo; existe uma lista de discussão com al-gumas mensagens por mês. O ENBD estende o NBD, adicionando reco-nexão automática, autenticação e suporte a mídias removíveis. [4]

DNBDO Distributed Network Block Device usa UDP como protocolo de transpor-te, e portanto suporte multicasting, caching pelo lado do cliente e redun-dâ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

Page 71: 23 - LAMP_set_2006

71

| SYSADMINNBD

Linux Magazine #23 | Setembro de 2006

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 pres-supõ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 funcio-na 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 fon-tes ou dos cabeçalhos do kernel, sendo

que talvez seja preciso modificar o ca-minho 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 sis-temas de arquivos, principalmente em operações sem disco.

Apesar de o PXE Linux (Pre-boot Exe-cution 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

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.

Ext 2 Ext 3Squash-FS

Cowloop

NBD ISCSIDNBD

Union-FS

Tmp-FSNFS

Dispositivo de bloco

Para o servidor

Para o servidor

Cache do buffer

Sistemas de arquivos

Fone: (61) 3366-1333Skype: ThinNetworks

[email protected]

101001010101010101010

10100101010 101010101010101010101 1100110101100101101010001011

O TC-NET revoluciona o mercado de ThinClients aoapresentar um sistema operacional baseado em Linuxe funcionalidades exclusivas, o TC-OS. Compatívelcom a maioria dos servidores de terminal existentes, essa solução agrega redução de custos de aquisição eatualização, facilidade de instalação e manutenção,maior estabilidade e confiabilidade, maiorsegurança, baixo consumo de energia e tamanhocompacto.

10100101010 101010101010101010101 1100110101100101101010001011

Os Thin Clients da ThinNetworks

Melhor relação custo benefício domercado e funcionalidades exclusivas

O sistema Operacional TC-OS

Recursos de centralizados;administração

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;

Diversos aplicativos para uso local (navegador, Java, Skype,protetor de tela e outros).

Servidor VNC para permitir o controle remoto de cada ThinClient;

http://supertuxbr.blogspot.com

Page 72: 23 - LAMP_set_2006

72 http://www.linuxmagazine.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 rece-be a tarefa adicional de configurar os parâmetros da rede sem fio antes da configuração do IP.

Bem bloqueadoO NFS causa uma sobre-carga considerável, o que é um grande problema se você lidar com mui-tos arquivos pequenos. Mais especificamente, os scripts típicos de runlevel, configuração do sistema e administração de um sis-tema Linux dificultam a vida do NFS. E a situação é agravada pelos novos truques que as distribuições modernas empregam nos monitores de sistemas de arquivo e outros componentes, gerando um fluxo constante de dados NFS.

Dispositivos de blocos de rede funcionam melhor com o cache interno do kernel, e um sistema inativo então não gerará quase nenhum tráfego de rede. Ao abrir um ar-quivo, o Linux só lê o bloco uma vez para ter certeza das permissões, dono, ou data da última alteração, e para obter um ponteiro para o arquivo. O NFS necessita de várias chamadas RPC para o mesmo fim.

As operações com NFS também podem ser otimizadas. Deixar a confi-guração e as rotinas típicas rodarem em um ramdisk inicial diminui a distância entre o NFS e o dispositivo de blocos. Usar o compacto SquashFS [9] também é uma opção interessante: em cenários somente leitura, a pré-compactação do sistema de arquivos pode diminuir o tráfego de rede e fazer melhor uso do cache de blocos.

Usar o UnionFS ou o Cowloop tem um forte efeito. O uso do segundo é res-trito a um dispositivo de blocos com sis-tema de arquivos gravável. O UnionFS é útil em qualquer cenário, e também ajudará a diminuir o tráfego. Além disso, o UnionFS ajuda a reduzir a carga sobre o dispendioso TempFS na RAM, princi-palmente em relação aos normalmente pequenos arquivos de configuração.

A alta disponibilidade é difícil de atin-gir com NFS. O DNBD é especializado

nisso, mostrando-se muito mais compe-tente em alternar transparentemente entre servidores, do ponto de vista do cliente. Os administradores podem até acrescentar e remover servidores dinami-camente sem que os usuários percebam, oferecendo assim uma forma elegante de contornar um ponto singular de falhas potencialmente desastroso em caso de falhas do servidor.

EspecialistaOs dispositivos de blocos de rede no Linux não foram feitos para aposentar o tradicional sistema de arquivos de rede, mas certamente oferecem uma opção interessante para clientes sem disco. As técnicas descritas neste arti-go ajudarão na tarefa de fornecer um serviço de arquivos rápido e confiável na sua própria rede. ■

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 cliente precisar do mesmo bloco.

Cache do cliente

Cache do cliente

Cache do cliente

Mais Informações[1] NBD (Network Block Device): http://nbd.sourceforge.net

[2] Cowloop: http://www.atconsultancy.nl/cowloop/

[3] ANBD (Another Network Block Device): http://www.aros.net/~ldl/anbd/

[4] ENBD (Enhanced Network Block Device): http://www.it.uc3m.es/ptb/nbd/

[5] DNBD (Distributed Network Block Device): http://lp-srv02a.ruf.uni-freiburg.de/trac/dnbd/

[6] GNBD (Global Network Block Device): http://sources.redhat.com/cluster/gnbd/

[7] PXE-Linux: http://syslinux.zytor.com/pxe.php

[8] Etherboot: http://etherboot.sourceforge.net

[9] SquashFS: http://squashfs.sourceforge.net

Os autoresThorsten Zitterell trabalha para o departamento de sistemas operacio-nais da Universidade de Freiburg, onde faz suas pesquisas sobre siste-mas operacionais de tempo real em microssistemas embarcados.

Dirk von Suchodoletz é assistente no departamento de sistemas de comunicação e está constantemente buscando desenhos inteligentes para suportar clientes sem disco no Linux.

http://supertuxbr.blogspot.com

Page 73: 23 - LAMP_set_2006

73Linux Magazine #23 | Setembro de 2006

“Brave New World” (“Admirável mundo novo”) é o nome do famoso romance de Aldous

Huxley, que nos mostra um mundo di-ferente 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ítu-lo 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 – inter-faces gráfi cas de usuário – dominaram a informática. Os profi ssionais da Web esta-vam sempre tentando convencer o mun-do 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 com-pletados 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, Macro-media Flash...

Mas todas falhavam, de uma maneira ou de outra. No caso do Java, para se exe-cutar 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 “ins-talação do software adequado” estava

solucionado, os desenvolvedores criavam (como ainda criam) páginas horríveis, cheias de coisas se movendo, que distra-em 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 fe-lizmente 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 ter-mo “AJAX” consiste de um acrônimo de Asynchronous JavaScript And XML (JavaScript e XML assíncronos), e curio-samente 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, fi zermos com que esse código

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 uni-versal. Além disso, o resultado é que podemos modifi car o conteúdo da pá-gina em tempo real, usando a chamada árvore DOM. Como se isso não fosse sufi ciente, quando o AJAX foi defi nido, 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

A nova tecnologia da Web

AJAXAJAX é 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

Os problemas com o IEO Internet Explorer, apesar de ter sido o primeiro a in-troduzir o XMLHTTPRequest, é o que mais apresen-ta problemas de uso. O código aqui mostrado nem se-quer funciona no IE, devido ao fato de ele utilizar um componente ActiveX para estabelecer a conexão.

Existem diversas técnicas para permitir a compatibilida-de entre navegadores, mas devido à limitação de pági-nas deste artigo e sua complexidade, não iremos mos-trá-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].

PR

OG

RA

MA

ÇÃ

O

massimo bassi – www.sxc.hu

http://supertuxbr.blogspot.com

Page 74: 23 - LAMP_set_2006

74 http://www.linuxmagazine.com.br

PROGRAMAÇÃO | Python

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 pos-sibilidades 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.

E onde entra o Python?Vamos construir um pequeno servidor de conteúdo em Python, que possa ser con-sultado 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 mo-dificará o aspecto da página Web.

Os cinco ingredientesOs cinco ingredientes necessários para ela-borar nosso produto são CSS, JavaScript, HTML, XML e Python, conforme mos-trado 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 proprie-dades 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 inter-câmbio de informações. Praticamente qualquer linguagem já dispõe de biblio-tecas 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.py01 #!/usr/local/bin/python0203 import BaseHTTPServer04 import os05 import cgi0607 class AJAXHTTPRequestHandler (BaseHTTPServer.BaseHTTPRequestHandler):08 “””09 Responde a requisições HTTP10 “””11 def do_GET(self):12 “Gerencia os GET”13 acoes = {14 “/” : [“envia_arquivo”,”index.html”],15 “/ps.xml” : [“envia_comando”, “ps afx”],16 “/df.xml”: [“envia_comando”, “df”],17 “/who.xml”: [“envia_comando”,”who”],18 “/uname.xml”: [“envia_comando”,”uname -a”]}1920 if self.path in acoes.keys():21 acao = acoes[self.path]22 (getattr(self,acao[0]))(self.path,acao[1])23 else:24 if (self.path[-3:] == “.js” or25 self.path[-4:] == “.css”):26 self.envia_arquivo(“”,self.path[1:])27 else:28 self.envia_arquivo(“”,”404.html”)29 def envia_arquivo(self,caminho,arquivo):30 # Não usamos caminho, mas assim simplificamos o código31 p = Pagina(arquivo)32 self.enviar_resposta(p.tipo(), p.conteudo())3334 def envia_comando(self,caminho,comando):35 c = Comando(comando)36 self.enviar_resposta(c.tipo(), c.conteudo())37 def enviar_resposta(self, tipo, conteudo):38 self.enviar_cabecalho(tipo)39 self.wfile.write(conteudo)4041 def enviar_cabecalho(self, tipo):42 self.send_response(200)43 self.send_header(“Content-type”,”text/” + tipo)

44 self.end_headers()45 class Pagina:46 def __init__(self,nome):47 self.nome = nome48 self.texto = “”49 arquivo = file(self.nome)50 self.texto = arquivo.read()51 arquivo.close()52 def conteudo(self):53 return self.texto54 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 tipo64 class Comando:65 def __init__(self,comando):66 self.lixo = os.popen(comando)67 self.xml = “”6869 def conteudo(self):70 # arquivo XML71 if not self.xml:72 self.xml = “<?xml version=\”1.0\” ?>”73 self.xml += “<saida>”74 linha = self.lixo.readline()[:-1] # para eliminar \n75 while linha:76 self.xml += “<linha>” + cgi.escape(linha) + “</linha>”77 linha = self.lixo.readline()[:-1]78 self.xml += “</saida>”79 return self.xml80 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()

Figura 1 Esquema da nossa aplicação AJAX com todos os seus componentes.

http://supertuxbr.blogspot.com

Page 75: 23 - LAMP_set_2006

75

| PROGRAMAÇÃOPython

Linux Magazine #23 | Setembro de 2006

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 encarre-gará tanto da realização das tarefas de servidor HTTP quanto de recolher in-formação importante e usá-la para gerar arquivos XML.

Teremos que reunir todos esses ele-mentos 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 de-vem 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: BaseHTTPRequestO Python dispõe, em suas bibliotecas pa-drão, de muitos “esqueletos” para diferentes tipos de servidores. Entre elas encontramos a BaseHttpRequest. Essa classe nos permite construir servidores HTTP sem muito es-forço, e por isso vamos empregá-la.

Mas não devemos usá-la diretamente, a não ser através da classe BaseHttpReques-tHandler, 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 va-mos 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á devolvi-do ao cliente que fez a solicitação.

Além do arquivo index.html, ofere-cemos uma série de serviços em forma de arquivos XML. Esses serviços se ba-searã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çosPara permitir que a definição de serviços seja a mais simples possível, basta intro-duzir 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. 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 um novo serviço consiste em introduzir uma nova linha de código.

Há um detalhe importante: todo arqui-vo devolvido usando HTTP deve ter um cabeçalho com uma série de linhas com

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 corresponden-tes aos diferentes comandos enviados. A classe BaseHTTPRequest gera uma entrada para cada uma (ver figura 2).

Gestores de serviçosPara administrar os serviços, foram criadas as classes Pagina e Comando, que respondem aos mesmos métodos. A primeira se encar-rega dos pedidos de arquivos de texto, que em nosso programa resumem-se ao arquivo index.html e seus arquivos suplementares,

Exemplo 2: arquivo index.html01 <html>02 <head>03 <title>Testes com AJAX</title>04 <link rel=”stylesheet” href=”estilo.css” type=”text/css” />05 <script language=”JavaScript”06 src=”ajax.js”>07 </script>08 </head>09 <body>10 <div id=”documento”>11 <h3 id=”titulo”>Informação do sistema</h3>12 <input type=”button” name=”button” value=”Processos”13 onclick=”JavaScript:Requisita(‘ps.xml’);” />14 <input type=”button” name=”button” value=”Disco”15 onclick=”JavaScript:Requisita(‘df.xml’);” />16 <input type=”button” name=”button” value=”Usuários”17 onclick=”JavaScript:Requisita(‘who.xml’);” />18 <input type=”button” name=”button” value=”Máquina”19 onclick=”JavaScript:Requisita(‘uname.xml’);” />20 <div id=”contêiner”>21 <div id=”dados”></div>22 </div>23 </div>24 </body>25 </html>

Figura 2 A classe BaseHTTPRequest gera uma entrada por comando.

http://supertuxbr.blogspot.com

Page 76: 23 - LAMP_set_2006

76

NO

ME

DA

SE

ÇÃ

O

http://www.linuxmagazine.com.br

PROGRAMAÇÃO | Python

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 defini-do para que se preserve a compatibilidade com a classe Comando.

A classe Comando executa um comando especificado e permite o acesso ao texto de-volvido 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 de-volve. 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 uti-lizar 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 vi-sualizado corretamente pelo navegador web. O problema se agrava porque certos caracte-res, 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.

HTMLTalvez 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 especialmen-te no uso do atributo id em várias etique-tas HTML. Graças a esses id, poderemos manipulá-las através do JavaScript.

JavaScript por outra perspectivaMuita gente tem uma má impressão do JavaScript. Essa linguagem é rara e, sem exagero, não muito útil. Ela permite mo-dificar cores em páginas Web ou inserir faixas sem muito efeito. Isso para não falar das famosas janelas pop-up.

Exemplo 3: ajax.js.01 // GLOBAIS02 var http_request = false;0304 function Requisita(url) {05 http_request = false;06 http_request= new XMLHttpRequest();07 if (http_request.overrideMimeType) {08 http_request.overrideMimeType(‘text/xml’);09 }1011 if (!http_request) {12 alert(‘Erro criando a instancia de XMLHttpRequest.’);13 return false;14 }1516 // Isso eh um callback, que se dispara ao terminar de17 // baixar o arquivo XML.18 http_request.onreadystatechange = modificaConteudo;19 http_request.open(‘GET’, url, true);20 http_request.send(null);21 }22 // Elimina todos os elementos com id “linha”23 function esvaziaConteudo(){24 var d = document.getElementById(“conteiner”);25 while(document.getElementById(“linha0”) ||26 document.getElementById(“linha1”)){27 nodo = document.getElementById(“linha0”);28 if (! noh){29 noh = document.getElementById(“linha1”);30 }31 var noh_varredura = d.removeChild(noh);32 }33 }3435 // Carrega o resultado do XML36 function modificaConteudo() {37 if (http_request.readyState == 4) {38 if (http_request.status == 200) {39 esvaziaConteudo();4041 var xmldoc = http_request.responseXML;42 var root = xmldoc.getElementsByTagName(‘saida’).item(0);4344 var fundo = 0;4546 for(var i = 0; i < root.childNodes.length; i++){47 var noh = root.childNodes.item(i);4849 var conteiner = document.getElementById(“conteiner”);50 var p = document.createElement(“p”);5152 // Truque para as cores ;)53 if (fundo == 0) {54 p.setAttribute(“id”,”linha0”);}55 else {56 p.setAttribute(“id”,”linha1”);57 }58 fundo = 1 - fundo;5960 var titulo = document.getElementById(“dados”);61 p.textContent = noh.firstChild.data;6263 conteiner.insertBefore(p,titulo);64 }6566 } else {67 alert(‘Houve um problema com a requisição.’);68 }69 }70 }

http://supertuxbr.blogspot.com

Page 77: 23 - LAMP_set_2006

77

| PROGRAMAÇÃOPython

Linux Magazine #23 | Setembro de 2006

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 lin-guagens (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 mani-pular, 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 neces-sidade 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 ob-jeto XMLHttpRequest e, depois de alguns

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 es-tado 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 ob-jeto 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ági-na, 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-

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ãoEsse negócio de AJAX é tão complicado assim? Mas é claro que não! Acontece que essa é uma palavra que está se trans-formando em um mito, mas não deixa de ser uma astuta combinação de progra-maçã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 cur-rículos. Quem sabe, dentro de dois anos essa palavra tenha tanto poder quanto outra de quatro letras: J2EE. ■

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

Exemplo 4: estilo.css01 #documento{02 margin-left: 100px;03 }0405 #titulo{06 text-decoration: underline;07 }0809 #linha0 {10 margin: 0px;11 padding-left: 20px;12 background: #e0e0e0;13 font-family: monospace;14 }1516 #linha1 {17 margin: 0px;18 padding-left: 20px;19 font-family: monospace;20 }2122 #conteiner{23 border-style: dashed;24 border-width: 1px;25 width: 600px;26 border-color: black;27 }

Figura 3 Nossa página mostra os resultados da consulta sem precisarmos recarregá-la.

http://supertuxbr.blogspot.com

Page 78: 23 - LAMP_set_2006

78 http://www.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

Linux.local

Empresa Cidade Endereço Telefone Web 1 2 3 4 5 6

Espírito SantoLinux Shopp Vila Velha Rua São Simão (Correspondência), 18 – CEP: 29113-120 27 3082-0932 www.linuxshopp.com.br ✔ ✔ ✔ ✔

Megawork Consul-toria e Sistemas

Vitória Rua Chapot Presvot, 389 – Praia do Can-to – 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 GeraisInstituto 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 ✔ ✔ ✔ ✔

Rio de JaneiroNSI 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 ✔ ✔ ✔ ✔

Rio Grande do SulSolis Lajeado Rua Comandante Wagner, 12 – São Cris-

tóvão – CEP: 95900-00051 3714-6653 www.solis.coop.br ✔ ✔ ✔ ✔ ✔

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 Comer-cial 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 – Hi-gienópolis – CEP: 90540-140

51 3018-1007 www.lm2.com.br ✔ ✔ ✔

Lnx-IT Informação e Tecnologia Porto Alegre Av. Venâncio Aires, 1137 – Rio Branco – CEP: 90.040.193 51 3331-1446 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 ✔ ✔

Santa CatarinaRedix Blumenau Rua 02 de Setembro, 733, sl 08. CEP 89052-000 47 3323-7313 www.redix.com.br ✔ ✔ ✔ ✔

São PauloWs 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 Uni-versidades – 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 Mon-tanhas – CEP: 06263-270

11 2106-9392 www.redentor.ind.br ✔

Go-Global Santana de Parnaíba Av. Yojiro Takaoca, 4384, Ed. Shopping Ser-vice, 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 ✔ ✔

SE

RV

IÇO

S 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 [email protected]

http://supertuxbr.blogspot.com

Page 79: 23 - LAMP_set_2006

79

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áca-ra 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 Co-mé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º an-dar 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º an-dar – Morumbi – CEP: 04794-000

11 5503-1011 www.commlogik.com.br ✔ ✔ ✔ ✔ ✔

Computer Consulting Pro-jeto 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, Siste-mas 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ô Con-ceiçã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 Solu-tions 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º an-dar 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º an-dar – 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 Tecnolo-gia 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º an-dar – 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º an-dar 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º an-dar, Ed. Birmann 11 – CEP: 04717-004

11 3305-7000 www.unisys.com.br ✔ ✔ ✔ ✔

Utah São Paulo Av. Paulista, 925, 13º andar – Cerquei-ra César – CEP: 01311-916

11 3145-5888 www.utah.com.br ✔ ✔ ✔

Visuelles São Paulo R. Eng. Domicio Diele Pacheco e Sil-va, 585 – Interlagos – CEP 04455-310

11 5614-1010 www.visuelles.com.br ✔ ✔ ✔

Webnow São Paulo Av. Nações Unidas, 12.995, 10º andar, Ed. Plaza Cen-tenário – Chácara Itaim – CEP: 04578-000

11 5503-6510 www.webnow.com.br ✔ ✔ ✔

WRL Informática Ltda. São Paulo Rua Santa Ifigênia, 211/213, Box 02– Centro – CEP: 01207-001 11 3362-1334 www.wrl.com.br ✔ ✔ ✔

Systech Taquaritinga Rua São José, 1126 – Centro - Cai-xa Postal 71 – CEP: 15.900-000

16 3252-7308 www.systech-ltd.com.br ✔ ✔ ✔

| SERVIÇOSLinux.local

Linux Magazine #23 | Setembro de 2006http://supertuxbr.blogspot.com

Page 80: 23 - LAMP_set_2006

80 http://www.linuxmagazine.com.br

Calendário de eventosEvento Data Local Website

ISC Brasil – Congresso e Fei-ra 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 Fei-ra 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

SE

RV

IÇO

S

Í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

Page 81: 23 - LAMP_set_2006

����������������

�����������������������������������������������������������������

�������������������������������

���������� ������������������� �����������������������

���������� ��������������� �������������������������

�������� ����������������������� ���������������������

������� ����������������������� ������������������������

�������� ������������������������ ���������������������

���������� ������������������������ �����������������������

��������� ����������������������� ����������������������

������������ ����������������������������� �������������������������

�������� ������������������������ �����������������������

������������� ����������� �������������������������

������ ����������� �����������������������

���������� ����������� �������������������������

������� ������������ ���������������������������

������ ������������ �����������������������

�������������� �������������������� ����������������������

���������������������������http://supertuxbr.blogspot.com

Page 82: 23 - LAMP_set_2006

82 http://www.linuxmagazine.com.br

Novembro de 2006

Na Linux Magazine #25…

PR

EV

IEW

TUTORIAL

SETI@ sua empresaMilhões de voluntários já oferece-ram seus ciclos ociosos de CPU para colaborar com a busca de vida extra-terrestre no projeto SETI@home. O BOINC (Berkeley Open Infras-tructure 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. ■

CAPA

BashishCansado da tela preta? O bashish oferece interessantíssimas possibili-dades 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 dadosCelulares, 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 sin-cronizados e administrar uma única base de dados integrada. Nossa matéria de capa vai mostrar como configurar essas fer-ramentas de maneira correta e quais alternativas existem para os conhecidos programas de sincronização. ■

DESTAQUE

Criptografia de arquivosSeus 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 arqui-vos é uma forma bastante eficiente e já madura para proteger seus dados contra o acesso não permitido. Mes-mo 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 segura-mente, sem acessos indevidos, em CD ou DVD? Mostraremos as me-lhores formas de criptografar o con-teúdo dessas mídias, para que você possa carregar dados confidenciais sem ficar paranóico. ■

DESTAQUE

Linux de bolsoVocê 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 confor-tavelmente com imagens, editar textos e planilhas, ouvir MP3, além de navegador web e cliente de email. ■

http://supertuxbr.blogspot.com

Page 83: 23 - LAMP_set_2006

http://supertuxbr.blogspot.com

Page 84: 23 - LAMP_set_2006

#23 09/06

R$ 13,90 € 7,50

97

71

80

69

42

00

9

00

02

3

A REVISTA DO PROFISSIONAL DE TI

Linu

x M

agazin

e

# 23 # 23

S

ete

mb

ro 2

006

09/2006

WWW.LINUXMAGAZINE.COM.BR NOVO PROJETO GRÁFICO E EDITORIAL!

SHOPTOUR p.26Linux para vender melhor

MULTIMÍDIA MÓVEL p.22Instituto Nokia de Tecnologia em PE

CEZAR TAURION p.28Código aberto e inteligência coletiva

» Apache, servidor web profissional p.32

» Programação orientada a objetos no PHP p.49

» Buscas mais velozes no PostgreSQL p.42

» Novidades do MySQL 5 p.36

» Websites AJAX com Python p.73

LAMPSERVIDORES WEB COM

������������������� ��������������������

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

RAID NO LINUX p.56

Segurança e desempenho

TERMINAIS LEVES p.66

Acesso mais rápido com NBD

LAM

P

A

pach

e

M

ySQ

L

PH

P

P

ostg

reS

QL

A

JAX

RA

ID

N

BD

TOR

& P

rivox

y

Pe

ssulu

s & S

abayo

n

B

otn

ets

R

sync

LINUX, APACHE, MYSQL, POSTGRESQL, PHP, PYTHON

ex

em

pla

r d

e

Ass

inan

teve

nd

a

pro

ibid

a

http://supertuxbr.blogspot.com