Burrice bem-vinda
Expediente editorial Diretor Geral Rafael Peregrino da Silva rperegrino@linuxmagazine.com.br Editores Flávia Jobstraibizer fjobs@linuxmagazine.com.br
Editora de Arte Larissa Lima Zanini llima@linuxmagazine.com.br Estagiário Felipe Brumatti Sentelhas fsentelhas@linuxmagazine.com.br Colaboradores Alexandre Borges, Alexandre Santos, Augusto Campos, Brice Goglin, Charly Kühnast, Erik Bärwaldt, Hans-Peter Merkel, Ian Dickinson, Jeff Squyres, Jon ‘maddog’ Hall, Kai-Thorsten Hambrecht, Klaus Knopper, Kurt Seifried, Marcel Gagné, Markus Feilner, Markus Heller, Markus Roth, Peter Kreussel, Samuel Thibault, Thomas Pfeiffer, Zack Brown. Editores internacionais Uli Bantle, Andreas Bohle, Jens-Christoph Brendel, Hans-Georg Eßer, Markus Feilner, Oliver Frommel, Marcel Hilzinger, Mathias Huber, Anika Kehrer, Kristian Kißling, Jan Kleinert, Daniel Kottmair, Thomas Leichtenstern, Jörg Luther, Nils Magnus. Anúncios: Rafael Peregrino da Silva (Brasil) anuncios@linuxmagazine.com.br Tel.: +55 (0)11 3675-2600 Penny Wilby (Reino Unido e Irlanda) pwilby@linux-magazine.com Amy Phalen (América do Norte) aphalen@linuxpromagazine.com Hubert Wiest (Outros países) hwiest@linuxnewmedia.de Diretor de operações Claudio Bazzoli cbazzoli@linuxmagazine.com.br Na Internet: www.linuxmagazine.com.br – Brasil www.linux-magazin.de – Alemanha www.linux-magazine.com – Portal Mundial www.linuxmagazine.com.au – Austrália www.linux-magazine.es – Espanha www.linux-magazine.pl – Polônia www.linux-magazine.co.uk – Reino Unido www.linuxpromagazine.com – América do Norte Apesar de todos os cuidados possíveis terem sido tomados durante a produção desta revista, a editora não é responsável por eventuais imprecisões nela contidas ou por consequências que advenham de seu uso. A utilização de qualquer material da revista ocorre por conta e risco do leitor. Nenhum material pode ser reproduzido em qualquer meio, em parte ou no todo, sem permissão expressa da editora. Assume-se que qualquer correspondência recebida, tal como cartas, emails, faxes, fotografias, artigos e desenhos, sejam fornecidos para publicação ou licenciamento a terceiros de forma mundial não-exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado. Linux é uma marca registrada de Linus Torvalds. Linux Magazine é publicada mensalmente por: Linux New Media do Brasil Editora Ltda. Rua São Bento, 500 Conj. 802 – Sé 01010-001 – São Paulo – SP – Brasil Tel.: +55 (0)11 3675-2600 Direitos Autorais e Marcas Registradas © 2004 - 2011–: Linux New Media do Brasil Editora Ltda. Impressão e Acabamento: RR Donnelley Distribuída em todo o país pela Dinap S.A., Distribuidora Nacional de Publicações, São Paulo. Atendimento Assinante www.linuxnewmedia.com.br/atendimento São Paulo: +55 (0)11 3675-2600 Rio de Janeiro: +55 (0)21 3512 0888 Belo Horizonte: +55 (0)31 3516 1280 ISSN 1806-9428
Impresso no Brasil
EDITORIAL
Kemel Zaidan kzaidan@linuxmagazine.com.br
Embora raros, há sistemas na engenharia e na biologia que são tão eficientes que acabam por gerar problemas estruturais e/ou operacionais. A velocidade na entrega de obras na construção civil leva empresas de engenharia a usar determinados aditivos na cura do concreto que aceleram o seu processo de endurecimento e secagem, mas que podem resultar em porosidade do material. Do lado da medicina, há certas cirurgias cuja realização é recomendada após os cinquenta anos de idade, pois antes disso o processo de cicatrização é tão célere que acaba resultando em recidiva anos mais tarde. Antes da idade recomendada, o paciente deve tentar amenizar o problema usando paliativos. Até certo tempo atrás – e, na minha idade, “certo tempo” significa pelo menos umas três décadas, ou seja, na era pré-PC –, operadores de computador estavam habituados a trabalhar no que se convencionou chamar de “terminal burro”, o qual ficava conectado a um computador de grande porte, onde todo o processamento ocorria de fato. O terminal, normalmente conectado via porta serial ao mainframe, praticamente não fazia nada além de mostrar na tela os comandos digitados e eventuais resultados, bem como realizar a leitura dos dados inseridos via teclado. Esse modo de operar ainda é utilizado (com variações) por muitas empresas até hoje, como, por exemplo, a Casas Bahia. A diferença é que, atualmente, o terminal é um programa que simula o comportamento da máquina burra de outros tempos. No servidor, que ainda pode ser um mainframe, o sistema operacional agora é em geral Linux (em operação virtualizada nesses sistemas de grande porte), apesar de haver ainda sistemas operacionais para mainframes, como o z/OS da IBM, por exemplo. Com o advento da computação em nuvem, vamos presenciar uma configuração semelhante chegando a uma grande parcela de usuários finais: como a maioria dos aplicativos vai funcionar diretamente a partir “da nuvem”, a capacidade de processamento da máquina local – que pode ser um PC mais modesto, um netbook, um tablet ou mesmo um celular – poderá ser muito menor. Isso vai democratizar ainda mais o acesso à Internet e aos aplicativos fornecidos como serviços monetizados via publicidade hospedados na nuvem: ponto para o Google! E iniciativas como o lançamento do iCloud, realizado recentemente pela Apple, “transferem a central digital do usuário para a nuvem”, em uma tradução livre da afirmação feita por Steve Jobs por ocasião do lançamento do novo serviço. Com isso, o denominador comum da vida digital do usuário muda, e, assim, o PC perde a posição de destaque que ocupou durante cerca de trinta anos. Os dispositivos móveis serão os aparelhos utilizados para realizar esse acesso. Ponto para o Linux, que já equipa a maior parte dos dispositivos embarcados no mundo – tendência que cresce exponencialmente. Afinal, em um mundo em que não há aprisionamento de plataforma operacional, onde um sistema livre, aberto, seguro e rápido está disponível gratuitamente para qualquer empresa desenvolver produtos e soluções, que outra opção mais vantajosa poderia ser adotada? Assim, à exceção dos sistemas que de fato necessitam de grande capacidade de processamento local (edição de vídeo ou CAD/CAM, por exemplo), os sistemas baseados em Linux que vão equipar nossos dispositivos móveis poderão ser mais simples e, assim, menos inteligentes, já que a inteligência dos aplicativos estará hospedada na nuvem. O terminal burro 2.0 chegou! Saúdem essa burrice bem-vinda! ■ Rafael Peregrino da Silva Diretor de Redação
Linux Magazine #80 | Julho de 2011
3
ÍNDICE
CAPA Novas tecnologias
27
Como é possível manter-se atualizado diante da revolução de lançamentos no mercado de tecnologia, com o qual somos bombardeados todos os dias? Um novo começo para o HTML
28
Em 1999, quando o padrão HTML 4.01 apareceu pela primeira vez, ninguém era capaz de prever o surgimento de blogs de video, redes sociais e ferramentas de produtividade web. O padrão HTML5 transformará a Internet em uma nova geração de tecnologia e serviços. Acelere ao máximo
34
O OpenCL permite ao programador acelerar um aplicativo transferindo alguns cálculos para o processador de gráficos do computador. Face a face
41
Softwares de reconhecimento facial estão se tornando cada vez mais populares, além de mais sofisticados. Mostramos como usar o software de código livre libface para identificar pessoas em suas fotos. ZFS sob o sol
46
O formato ZFS, da Sun, é geralmente reverenciado como o mais moderno sistema de arquivos disponível atualmente. O kernel Linux não proporciona suporte direto para o ZFS, mas o usuário pode encontrar alternativas para usá-lo tanto no espaço do kernel quanto do usuário.
4
www.linuxmagazine.com.br
Linux Magazine 80 | ÍNDICE
REDES
COLUNAS Klaus Knopper
08
Charly Kühnast
10
Zack Brown
12
Augusto Campos
13
Kurt Seifried
16
Alexandre Borges
20
Alternativa de peso
58
NOTÍCIAS Geral
20
➧ Fim do Adobe AIR para Linux ➧ Xen completamente integrado ao Linux
CORPORATE Notícias
O iSCSI oferece uma alternativa rápida e flexível para armazenamento de arquivos em rede. A ferramenta iSCSI permite que você configure o armazenamento de arquivos em sua própria rede, sem a necessidade de uso de equipamento ou cabeamento especializado.
TUTORIAL 22
➧ Cisco apresenta novo sistema ASR9000
Elo perdido
63
Conheça um novo método para processar, combinar, analisar e apresentar informações ocultas em dados brutos usando a plataforma Jena: web semântica e dados vinculados (linked data) para Java.
➧ Red Hat lança soluções para gestão e desenvolvimento de nuvem ➧ eBay adquire Magento ➧ Oracle exige bilhões do Google
VoIP com Asterisk – parte IX
➧ Open Virtualization Alliance ganha 65 novos membros Coluna: Jon “maddog” Hall
24
Coluna: Alexandre Santos
26
70
ANÁLISE Lições sobre localização
50
O sistema telefônico ultrapassado, presente até pouco tempo atrás nas empresas, é prolífico em cobranças: cada novo recurso ativado requer uma nova ativação de serviço, com o preço adicionado ao pagamento mensal. É hora de mudar. É hora de criar sua própria central VoIP
PROGRAMAÇÃO Busca com qualidade
72
A topologia do servidor interno está se tornando cada vez mais complexa. Entender onde os processos estão sendo executados no servidor pode ter um grande impacto no desempenho geral do sistema.
Pequeno soldado
55
Analisamos a ferramenta de indexação Open Search Server e mostramos como integrar o recurso de busca ao seu website utilizando PHP.
SERVIÇOS Editorial O Sentinella automatiza a forma com que o computador monitora problemas com recursos e outros estados de sistema.
Linux Magazine #80 | Julho de 2011
03
Emails
06
Linux.local
78
Preview
82
5
u c.h ww .s x –w ro gje
ne
CARTAS
sa
nja
Emails para o editor
Permissão de escrita Aplicativo personalizado Olá pessoal, criei uma calculadora utilizando linguagem C com GTK e compactei o programa em um pacote .deb. Gostaria de saber como faço para que o programa seja exibido na aba acessórios da minha distribuição Linux. João Vieira
Resposta Caro João, para que o atalho seja exibido no menu Acessórios do Gnome ou do KDE basta que você inclua no seu pacote um arquivo do tipo .desktop com os dados do aplicativo, como: nome, comando de execução, ícone, e seção do menu onde o aplicativo deve ser exibido. No Gnome este arquivo deve ficar no diretório /usr/ share/applications/seu_programa.desktop. Como exemplo, copio abaixo o conteúdo de um arquivo /usr/share/applications/gnome-terminal.desktop:
Escreva para nós!
[Desktop Entry] Name=Terminal Comment=Use the command line TryExec=gnome-terminal Exec=gnome-terminal Icon=utilities-terminal Type=Application X-GNOME-DocPath=gnome-terminal/ index.html X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product= gnome-terminal X-GNOME-BugzillaComponent=BugBuddyBugs X-GNOME-Bugzilla-Version=2.32.0 Categories=GNOME;GTK;Utility; TerminalEmulator; StartupNotify=true OnlyShowIn=GNOME; X-Ubuntu-Gettext-Domain= gnome-terminal
Mais informações podem ser encontradas na documentação do Gnome no endereço http://live.gnome.org/GnomeLove.
✉
Sempre queremos sua opinião sobre a Linux Magazine e nossos artigos. Envie seus emails para cartas@linuxmagazine.com.br e compartilhe suas dúvidas, opiniões, sugestões e críticas. Infelizmente, devido ao volume de emails, não podemos garantir que seu email seja publicado, mas é certo que ele será lido e analisado.
6
www.linuxmagazine.com.br
Coluna do Augusto
COLUNA
Bons ventos sopram sobre o Android Novas iniciativas e alternativas estão surgindo no universo do desenvolvimento Android.
Q
uem chega ao universo Android interessado no fato de ele ser (em grande parte) um sistema de código aberto (e por incluir o kernel Linux) acaba tendo grande interesse pela possibilidade de modificar o sistema e interagir com ele em níveis mais avançados, assim como usualmente é possível fazer em distribuições Linux no desktop. Mesmo quando essa possibilidade não é colocada em prática, é interessante saber que ela está lá e que pode ser aproveitada por outros, de forma que possamos colher os frutos, afinal, sempre há algum desenvolvedor interessado em adaptar os recursos do sistema, agregar acessórios e ir além das APIs oficiais, trocando a compatibilidade por utilidades adicionais e melhor desempenho. No caso do Android, essa situação poderia ser simbolizada pelo CyanogenMod [1], um firmware alternativo para smartphones, e-readers e tablets, que é mantido por uma comunidade de fãs do Android e compatível com dezenas de modelos de aparelhos. Ele oferece a seus usuários recursos que frequentemente ficam de fora nas versões de Android embarcadas nos aparelhos por seus fabricantes e operadoras.
O CyanogenMod é um firmware alternativo para smartphones, e-readers e tablets, que é mantido por uma comunidade de fãs do Android e compatível com dezenas de modelos de aparelhos. Linux Magazine #XX | Mês de 200X
Normalmente, o desenvolvimento deste tipo de alternativa se dá sem qualquer apoio dos fabricantes e desenvolvedores originais ou, em determinados casos, tendo de lidar com a resistência e obstrução ativas praticadas por eles, inclusive com travamentos feitos no hardware para evitar a execução de sistemas alternativos. Isso já foi tendência quase geral, e vai continuar a acontecer. Porém, no final do primeiro semestre, tivemos duas notícias muito positivas a respeito, indicando uma possível mudança de maré entre os fabricantes de aparelhos. A primeira foi da HTC, cujo CEO veio a público agradecer a paciência dos seus usuários e afirmar que vai cessar com a prática de “travar” o boot dos seus aparelhos equipados com Android – acabando assim com a medida antipática cujo objetivo era dificultar a instalação de sistemas alternativos. Logo em seguida, foi noticiado algo ainda mais extremo na aproximação entre fabricantes e hackers: a Samsung doou um aparelho Galaxy S II para um dos desenvolvedores do CyanogenMod, com o objetivo expresso de facilitar a portabilidade deste software alternativo para o novo smartphone da empresa. Nada disso garante aproximações ou aberturas definitivas, mas são excelentes notícias que podem ajudar a ampliar o nível de abertura das plataformas móveis, ao mesmo tempo em que certamente constituem critérios adicionais a considerar na hora de escolher o fabricante de nossos próximos produtos! ■
Mais informações [1] CyanogenMod: http://www.cyanogenmod.com/ Augusto Campos é administrador de TI e, desde 1996, mantém o site BRlinux.org, que cobre a cena do Software Livre no Brasil e no mundo.
13
Coluna do Alexandre
COLUNA
Introdução ao udev: controle seus dispositivos Relembre o uso do framework udev.
N
esta coluna (e possivelmente nas próximas), vou relembrar um assunto bastante interessante do Linux, mas que, no entanto, é por muitas vezes esquecido pelos administradores: o framework udev. Antigamente, os sistemas Unix (e aqui também incluímos o Linux), que referenciam todo e qualquer hardware através de arquivos no sistema (ou ainda device nodes, se preferir), possuíam uma maneira bastante rudimentar de criar referências para tais dispositivos, pois, como nunca se conhecia de antemão qual hardware estaria presente na máquina, a instalação do sistema operacional criava previamente dezenas ou centenas de entradas (block device file ou character device file) no diretório /dev, tentando, assim, se antecipar ao administrador e garantir que aquele dispositivo teria um arquivo representativo válido daquele hardware. Estes arquivos criados no diretório /dev possuem alguns atributos especiais como major number e minor number, sendo que o primeiro explicita qual é o driver usado para acessar aquele dispositivo e o segundo diz qual instância deste driver é utilizada para acessar determinado dispositivo. Explico: arquivos de dispositivos de bloco (block device file) que referenciam 4 discos
Listagem 1: ls -l /dev 01 02 03 04 05 06 07
18
brw-rw–brw-rw–brw-rw–brw-rw–brw-rw–crw--w–crw--w–-
1 1 1 1 1 1 1
root root root root root root root
disk 8, 1 disk 8, 2 disk 8, 5 disk 7, 0 disk 7, 1 tty 4, 10 tty 4, 11
2011-06-12 2011-06-12 2011-06-12 2011-06-12 2011-06-12 2011-06-12 2011-06-12
12:48 12:48 12:48 12:48 12:48 12:48 12:48
sda1 sda2 sda5 loop0 loop1 tty10 tty11
SCSI/SATA idênticos (sda, sdb, sdc...) têm o mesmo major number (pois o Linux faz uso do mesmo driver para acessá-los), mas minor numbers diferentes, já que é usada uma cópia diferente do driver para acessar cada um dos discos rígidos. A mesma lógica se aplica para um único disco com múltiplas partições, loop device files, usado para montar ISOs ou que tenha character devices para acesso a terminais (tty´s). Note a saída de alguns arquivos de dispositivo do diretório /dev na listagem 1, onde b é block device e c é character device; o primeiro número após o tipo do dispositivo é o major number e o segundo número é o minor number. Toda esta prestatividade em criar este enorme conjunto de entradas em /dev é muito nobre, porém traz diversos problemas, já que, como a criação destas entradas é antecipada, muitos dispositivos jamais existirão na máquina. Isso deixa praticamente todos estes arquivos sem função alguma e ainda complicam a sua vida quando você tiver de examinar o diretório em questão, pois fica difícil saber quais hardwares existem realmente na sua máquina. Pior: imagine que você deseja utilizar seu tablet (com Android, espero), sua câmera digital e seu pendrive. Cada vez que você conectar estes dispositivos, eles serão atrelados a um arquivo de dispositivo diferente (sda, sdb, sdc...), dependendo da ordem em que você executar esta operação ou da ordem em que os seus drivers forem carregados. Depois de diversas evoluções, passando pelo DevFS que foi excluído da árvore do kernel, os desenvolvedores do Linux chegaram ao udev, que possui funções de gerenciamento do diretório /dev para resolver estes problemas e tornar o manuseio de dispositivos muito mais simples, com o bônus de disponibilizar
www.linuxmagazine.com.br
estes hardwares e as suas propriedades no arquivo de sistema (filesystem) montado no diretório /sys. Algumas vantagens do udev são: ➧ Criação dinâmica de entradas para dispositivos em /dev; ➧ Controle na criação dos nomes dos dispositivos em /dev através de regras; ➧ Inicialização dos dispositivos de hardware de maneira dinâmica (hotplug); ➧ Possibilidade de renomeação de interfaces de rede; ➧ Vinculação de scripts para serem executados na adição ou remoção de um hardware; ➧ Mudança da propriedade e permissão de um dispositivo. O leitor pode utilizar qualquer distribuição, como Ubuntu, Red Hat ou Suse, para fazer testes com o udev. Estou usando Ubuntu 11.04, pois é aquela que está instalada no meu netbook, embora não esconda de ninguém que prefiro Red Hat ou Suse para ambientes críticos. Caso o leitor ainda queira, pode realizar o download do código do udev e compilá-lo. Para fazer isso (no seu sistema podem ser exigidos outros pacotes adicionais), a partir da raiz e como usuário root, digite:
Linux Magazine #80 | Julho de 2011
# git clone git://git.kernel.org/pub/scm/linux/ hotplug/udev.git udev-lm # apt-get install libacl1-dev # apt-get install glib-2.0 # apt-get install gobject-* # apt-get install gperf # apt-get install gtk-doc-tools # cd /udev-lm # ./autogen.sh –without-selinux –disable-introspection # make # make udev/test-udev
Agora você pode executar o script Perl de teste que vem junto com o udev, o qual simula a inclusão e a remoção de dispositivos no sistema, de modo a verificar se está tudo funcionando bem: # perl test/udev-test.pl
No mês que vem continuamos a relembrar o uso e funcionamento do udev. Até a próxima. ■ Alexandre Borges (alex_sun@terra.com.br, twitter: @ale_sp_brazil) é Especialista Sênior em Solaris, OpenSolaris e Linux. Trabalha com desenvolvimento, segurança, administração e análise de desempenho desses sistemas operacionais, atuando como instrutor e consultor. é pesquisador de novas tecnologias e assuntos relacionados ao kernel.
19
As novidades do mercado de tecnologia
CAPA
Novas tecnologias Como é possível manter-se atualizado diante da revolução de lançamentos no mercado de tecnologia, com o qual somos bombardeados todos os dias? por Flávia Jobstraibizer
A
cada dia descobrimos uma nova forma de realizar tarefas corriqueiras, seja através de um novo dispositivo lançado ou mesmo através de uma nova tecnologia que surge. Os beneficios sessas novas tecnologias, são inúmeros: todos os dias são lançados dispositivos que facilitam a vida do usuário de telefonia celular, o profissional que desenvolve sistemas conta com computadores cada vez menores, o gestor que necessita de conexão a todo momento, pode montar um ponto de acesso sem fio de onde estiver, a escola que deve fornecer recursos para seus alunos e pode utilizar uma nova plataforma de aprendizagem online, o departamento de uma empresa que através da implementação de uma nova forma de armazenamento de arquivos, economizou ao evitar a compra de outro servidor etc., são muitas as vertentes que precisam da tecnologia e é claro, se movimentam em torno dela e de suas novidades. Algumas novas tecnologias tem um nível de obsolescência tão grande, que já nascem desatualizadas. É o caso dos tablets, dispositivos móveis com celulares e até mesmo notebooks. Lançado um hoje, amanhã já existem outros melhores ou com mais recursos. Não raro, quando sequer descobrimos que uma nova tecnologia foi lançada, existem outras várias iniciativas em torno dela, melhoradas e mais úteis. Como acompanhá-las? É esta a pergunta que nos fizemos quando decidmos agrupar algumas dessas novidades nesta edição da Linux Magazine, uma vez que, assim como a vida, a tecnologia se reinventa e se renova todos os dias. Vamos abordar algumas novidades tecnológicas que estão acendendo o mercado, como é o caso do HTML5,
que promete ser principal ator para o desenvolvimento web da nova era da Internet. Apresentamos ainda a tecnologia por trás das placas de vídeo. Seus processadores, como obter melhor desempenho e velocidade através de cálculos e scripts específicos que as tornam mais eficientes e eficazes, com o openCL. Na área de armazenamento e sistemas de arquivos, falaremos sobre o iSCSI, que oferece uma alternativa rápida e flexível para armazenamento de arquivos em rede. A ferramenta permite que você configure o armazenamento de arquivos em sua própria rede, sem a necessidade de uso de equipamento ou cabeamento especializado. Outra opção é o ZFS, da Sun, que é tido como o mais moderno sistema de arquivos disponível atualmente. O kernel Linux não proporciona suporte direto para o ZFS, mas mostaremos as alternativas para usá-lo tanto no espaço do kernel quanto do usuário. E para fechar esta edição, demonstraremos como funcionam os softwares de reconhecimento facial, que estão se tornando cada vez mais populares, além de mais sofisticados. Aprenda como identificar pessoas em fotos e montar uma base para automatização de reconhecimento facial em lotes de imagens. A nova era tecnológica já começou, mantenha-se atualizado e boa leitura! ■
Matérias de capa Um novo começo para o HTML
28
Acelere ao máximo
34
Face a face
41
ZFS sob o sol
46
Linux Magazine #80 | Julho de 2011
27
Monitoramento de redes e sistemas | ANÁLISE
Monitoramento de redes e sistemas
ANÁLISE
Pequeno soldado O Sentinella automatiza a forma com que o computador monitora problemas com recursos e outros estados de sistema. Erik Bärwaldt
F
erramentas de monitoramento de rede como o Nagios observam toda a sua rede e mandam um alerta caso aconteça algum problema. Isso se você tiver tempo e energia para configurar a infraestrutura completa de alertas no programa. Se você opera em menor escala, talvez seja melhor usar um pequeno soldado, em vez de um exército completo. O Sentinella é um desses aplicativos práticos que supervisionam o seu processador, espaço em disco ou interface de rede e mandam um alarme ou executam um determinado comando quando um problema ocorre. A ferramenta de monitoramento Sentinella já conquistou o seu espaço nos repositórios de muitas distribuições, e é possível que você possa instalá-lo convenientemente com o Synaptic, YaST ou outro gerenciador de pacotes. Se os pacotes binários não estiverem disponíveis
Linux Magazine #80 | Julho de 2011
para a sua distribuição, você pode baixar o arquivo do site do projeto [1] e realizar uma instalação manual. O site tem informações detalhadas sobre como configurar a ferramenta. Caso você não use o desktop KDE, para o qual o Sentinella está otimizado, instalar os arquivos binários normalmente irá instalar o que é necessário para executar o Sentinella no Gnome, Xfce ou LXDE sem sacrificar recursos da ferramenta.
Executar o Sentinella Dependendo da sua distribuição Linux, o processo de instalação do pacote cria um item no menu da área de trabalho. No Ubuntu 10.10, o Sentinella fica no menu Aplicativos/Ferramentas de sistema. Quando aberto, o Sentinella é exibido em uma janela simples. Não se incomode em procurar por uma barra de botões ou menus, pois um
grupo de opções no topo e no meio da janela já abrangem as principais funções. Outros botões na metade inferior da tela oferecem ações que dependem das condições selecionadas (figura 1). As condições que disparam uma ação podem ser definidas de forma granular, graças a providenciais caixas de seleção e importação. Em vez de manter configurações padrão, você pode adicionar entradas personalizadas. Dependendo das condições que você aciona, as configurações mudarão para refletir o contexto. As categorias básicas incluem: carga da CPU, utilização de memória, tráfego de rede, além de dia e hora. É possível também selecionar ações a serem disparadas de acordo com o comportamento de outros programas. Nesse caso, o Sentinella exibe uma janela listando todos os processos correntes e oferecendo escolhas para a visualização. Por exemplo, se você tem um grande número de pro-
55
ANÁLISE | Monitoramento de redes
Figura 1: O programa é fácil de usar, graças à sua interface amigável.
processos.
Figura 3: O Sentinella pode ajudá-lo a economizar energia.
cessos ativos, pode querer destacar somente os de usuários. Na parte inferior da janela, você encontra seis ações que pode atribuir às condições selecionadas. Quando o evento selecionado ocorre, você pode reiniciar ou desligar a máquina, colocá-la para dormir (sleep) ou tocar um alarme de alerta. Três diferentes alarmes estão disponíveis. Um modo muito mais flexível é executar um comando quando um evento específico ocorre. Como alternativa, você pode finalizar o programa. Nesse caso, você verá novamente uma lista de processos para escolha (figura 2). Após finalizar as configurações, você pode começar a monitorar o sistema clicando em Start, no centro inferior da tela. A janela se tornará
56
Figura 2: Escolha de um programa ativo na janela de
Figura 4: Monitoramento preventivo.
acinzentada e você não poderá ver entradas adicionais. O Sentinella exibe um ícone de mensagem no painel para que você possa fechar a janela. Quando você clica no ícone, a janela do programa é exibida no desktop. Para finalizar o programa, você deve clicar com o botão direito do mouse no ícone no painel e clicar e selecionar a opção Quit.
Risco O Sentinella é capaz de desligar o computador quando a carga da CPU é menor do que 5% se você assim escolher; contudo, você precisa tomar cuidado com esse tipo de ação. Efeitos indesejados podem ocorrer, incluindo perda de dados, caso o Sentinella feche o sistema durante uma rotina de backup, por exemplo.
Não se preocupe, pois mesmo mal configurado o Sentinella não danificará seu hardware.
Cenários de aplicativos O Sentinella poderá ajudá-lo a economizar energia se você usa o software no laptop ou notebook. Após selecionar CPU load como condição, entre com o mínimo de carga à direita do sinal de percentual. Para evitar que o seu computador execute uma ação definida antes que ocorra a condição, defina o período de tempo no qual a carga ficará abaixo do limite especificado para que o desligamento ocorra. É necessário entrar com um período válido de tempo para
www.linuxmagazine.com.br
Monitoramento de redes e sistemas | ANÁLISE
que a configuração seja concluída com sucesso. Abaixo, na janela do programa, habilite a ação Sleep e escolha Suspend ou Hibernate à direita. Certifique-se de ter espaço em disco suficiente ou a ação pode provocar perda de dados (figura 3). Em outro cenário, o Sentinella pode ser útil para administradores de rede. Uma vez que o programa é capaz de monitorar tráfego de rede, ele pode identificar e reportar anomalias em tempo real. Você pode monitorar a entrada e a saída de dados por meio das interfaces ativas de rede. Se os volumes estiverem abaixo de limites determinados por um período de tempo, você pode pedir para disparar um alarme. Um cenário como esse poderia prevenir que transferências de dados indesejados e em larga escala ocorressem no ambiente de servi-
Linux Magazine #80 | Julho de 2011
dor. Em ambientes heterogêneos, em particular, essa é uma forma eficiente de identificar a influência de um malware. Para esse tipo de monitoramento, simplesmente marque a opção Network traffic, defina as interfaces de rede do sistema e volumes de dados e programe o alarme na seção de ações – há três melodias para escolher no lado direito da janela (figura 4).
Conclusão O software Sentinella assume a responsabilidade de monitorar várias tarefas em um sistema e responde com ações predefinidas quando certos estados de sistema ocorrem. A ferramenta é fácil e intuitiva para instalar; no entanto, os usuários correm riscos. Por exemplo, o software não mostra uma mensagem de alerta quando um estado de
sistema definido ocorre antes do desligamento ou da execução da ação definida. O risco de perda de dados é real. Antes de implantar o programa, você deve considerar cuidadosamente quais ações são significativas no contexto de estados específicos do sistema. ■
Mais informações [1] Sentinella: http://sourceforge.net/ projects/sentinella
Gostou do artigo? go? Queremos ouvir sua ua opinião. opin o. Fale conosco em cartas@linuxmagazine.com.br zine om.b Este artigo no nosso so site: s http://lnm.com.br/article/5472
57
Apache Jena | TUTORIAL
Apache Jena
TUTORIAL
Elo perdido Conheça um novo método para processar, combinar, analisar e apresentar informações ocultas em dados brutos usando a plataforma Jena: web semântica e dados vinculados (linked data) para Java. por Ian Dickinson
O
compartilhamento de dados é um dos tópicos mais quentes atualmente na computação. As fontes podem ser desde APIs do Facebook, dados científicos abertos e até dados públicos gerados pelo governo e disponibilizados gratuitamente. Por todos os lados, há alguém liberando novos dados para serem explorados por desenvolvedores e cientistas de dados [1]. Nesse cenário, espera-se que projetistas, exploradores de dados e desenvolvedores criem aplicativos de valor para usuários finais, com recursos novos e interessantes. Sendo um desenvolvedor, como abordar essa montanha de informações? Que ferramentas e técnicas serão úteis? Muitas abordagens estão disponíveis, variando desde de simples análise de arquivos com valores separados por vírgulas (CSV) em planilhas de dados, consulta em bancos de dados relacionais, chegando a ferramentas de larga escala e distribuídas de análise de informações na nuvem. Como cada técnica possui vantagens e desvantagens, e ao invés de
fazer um levantamento completo de todas elas, vamos focar apenas em dados semânticos vinculados, mais especificamente na plataforma Jena.
é autor do artigo123, sobre Jena” poderia ser escrito com a seguinte linha de código, podendo ser representado graficamente como na figura 1.
A web semântica
<ian> <autor-do> <artigo123>. <artigo123> <tem-o-assunto> “Jena”.
Não por acaso, as técnicas e ideias da web semântica acabaram ganhando uma reputação de complexidade e dificuldade. O modelo de XML padrão do RDF (Resource Description Framework) é grosseiro, razão pela qual modelar o mundo real pode revelar nuances conflituosas. No entanto, em seu núcleo estão duas ideias importantes. A primeira é a de que estruturas ricas e expressivas de dados, descrevendo informações sobre determinado assunto, podem ser construídas a partir de um conjunto de informações simples sobre o relacionamento entre pares de elementos: duas entidades nomeadas ou uma entidade nomeada e um valor, como um número. Um exemplo simples: suponhamos que o identificador para o artigo que você está lendo é artigo123 (voltaremos a isso em breve); então, a sentença “Ian
Figura 1: Uma representação gráfica da sentença.
Linux Magazine #80 | Julho de 2011
Matematicamente, a estrutura exemplificada na figura é um gráfico direcionado, que rotula os dois nós e suas extremidades. Para ser simples, irei me referir a ele apenas como um gráfico. Uma vez que cada declaração contém tipicamente três elementos – o assunto, o objeto e o nome do predicado que os liga –, o termo triple é usado para denotar tal declaração. Isso leva a outras expressões como triplestore, para um banco de dados constituído de triples. A segunda das duas ideias importantes é o nome das coisas que não são valores, que é representado por URIs. Um URI (Uniform Resource Identifier, ou Identificador de Recursos Uniforme) refere-se a um conjunto de identificadores definidos pela RFC 2396. O mais importante desse conjunto é que ele inclui identificadores http:// para websites familiares. O uso de URIs por identificadores tem duas consequências importantes: primeiro, todos os identificadores formam eficazmente um grande namespace, minimizando as chances de usar acidentalmente um mesmo nome para
63
TUTORIAL | Apache Jena
se referir a coisas diferentes. Segundo, a maioria dos URIs podem ser “resolvidos” ou procurados com um navegador de Internet, de forma que dê informações sobre o termo que está sendo identificado. Além das consequências óbvias de ter o significado, ou a semântica, declarado explicitamente, isso significa também que o responsável pela manutenção do domínio web que hospeda o identificador tem alguma autoridade sobre o uso ou significado pretendido do termo. Além disso, qualquer um pode reutilizar um termo publicado em um domínio. Aliás, a web semântica acaba encorajando esse tipo de ação. No entanto, somente pessoas com direitos de
escrita direta sobre aquele domínio podem atualizar o significado mais diretamente associado aos termos. Então, para atualizar o exemplo com o uso de URIs, precisamos considerar quais identificadores usar. Sempre que possível, deve-se tentar reutilizar vocabulários existentes. O vocabulário Dublin Core Metadata Initiative [2] possui um conjunto bem estabelecido de vocábulos para “metadados conhecidos”, como o autor de uma matéria. O próprio artigo, aliás, eventualmente ganhará uma identidade no espaço web de quem publica. Por enquanto, isso é um rascunho. Imagine portanto o URI padrão http://epimorphics.com/documents/ draft#jena-1. O URI para dar cré-
Listagem 1: Código gerado pelo Schemagen no Doap.Java 01 /** URL de uma homepage de um projeto, associada com exatamente um projeto. */ 02 public static final Property homepage = m_model.createProperty( "http://usefulinc.com/ns/doap#homepage" )
Listagem 2: O núcleo do Init.java 01 public void run() { 02 if (noTDB() || hasOption( "f" )) { 03 // (re)criar a imagem TDB 04 FileUtils.deleteQuietly( getTDBFile() ); 05 FileUtils.forceMkdir( getTDBFile() ); 06 Dataset dataset = TDBFactory.createDataset( getTdbLocation() ); 07 08 // o nome do projeto é um argumento requisitado 09 String projectName = getArgs()[0]; 10 String projectURI = projectNamespace() + projectName; 11 Resource project = dataset.getDefaultModel(). createResource( projectURI ); 12 13 project.addProperty( RDF.type, DOAP.Project ); 14 project.addProperty( DOAP.name, projectName ); 15 16 // adicione descrições a partir de opções de linhas de comando 17 addOptionalProperty( project, DOAP.shortdesc, "s" ); 18 addOptionalProperty( project, DOAP.description, "d" ); 19 20 System.out.println( String.format( "Criada nova descrição DOAP para %s projetos com %s triples", projectName, dataset.getDefaultModel().size() ) ); 21 } 22 else { 23 System.out.println( "Logbook já existe, nenhuma ação sendo tomada" ); 24 } 25 }
64
ditos ao autor deve ser tratado com cuidado, porque uma pessoa não é um recurso de informação na web. Essa questão, amplamente debatida, tem uma série de soluções que vão além do escopo deste artigo. Um URI elaborado com a classe Person do vocabulário Friend of a Friend (FOAF, ou amigo do amigo) [3], será suficiente. Com essas mudanças, o exemplo fica assim: <http://epimorphics.com/rdf/ staff#ian> rdf:type foaf:Person. <http://epimorphics.com/rdf/ staff#ian> dcterms:creator. <http://epimorphics.com/documents/ drafts/jena-1>. <http://epimorphics.com/documents/ drafts/jena-1> dcterms:subject “Jena”. <http://epimorphics.com/documents/ drafts/jena-1> rdf:type foaf:Document.
Claro que poderíamos entrar em muitos detalhes sobre as várias tecnologias de web semântica: linguagens de consulta, armazenamento persistente, vocabulários específicos e assim por diante. Para focar na prática, no entanto, falareremos apenas sobre como os triples podem ser manipulados com código Java usando o Jena.
Apache Jena O Jena é um framework Java de código aberto para criar, armazenar, manipular e consultar dados semânticos na web. Foi desenvolvido originalmente por pesquisadores dos laboratórios da HP no Reino Unido e tem sido amplamente utilizado desde seu primeiro lançamento em 2001. Em 2008, o time do Jena deixou a HP e, em 2009, o Jena se tornou um projeto incubado na Apache [4]. Ao invés de listar os recursos técnicos do Jena, vamos introduzir a abordagem de algumas partes do framework enquanto trabalhamos por meio de exemplos. Algumas linhas de terminologia básica, no entanto, ajudarão. O gráfico descrito previamente é gerenciado no código Jena como um
www.linuxmagazine.com.br
Apache Jena | TUTORIAL
objeto Model. O objeto é, nos termos do Java, uma interface ou especificação abstrata que permite ao Jena fornecer vários tipos de objetos Model (armazenado na memória, no disco, sem interferência de disco etc.) com uma API comum. O Model é uma das abstrações chaves do Jena para lidar com RDF. Um recurso no modelo, denotado por uma URI, é representado por um objeto Resource, enquanto um valor, como um número, é um Literal. O predicado que liga os nós do gráfico são objetos Property, e Property é uma subclasse de Resource. Finalmente, um objeto Statement representa um triple. Um determinado Statement terá um assunto Resource, um predicado Property e um objeto, que pode ser tanto um Resource quanto um Literal. Chega de teoria. Vamos ver um pouco de código.
Exemplo de aplicativo Suponhamos que você queira compartilhar detalhes com outros desenvolvedores de código aberto, como, por
exemplo, o nome do projeto, a localização do repositório fonte, quem está trabalhando nele e assim por diante. Felizmente, um vocabulário já existe para gravar esse tipo de informação: DOAP (Description of a Project, ou descrição de um projeto) [5] [6]. Coincidentemente, os projetos da Apache são encorajados a usar arquivos DOAP. Embora o DOAP forme o núcleo de um caderno de notas de um aplicativo, você deve ter a possibilidade de adicionar outras informações que pareçam relevantes sem ser restringido por esquemas rígidos de dados. Projetar uma ferramenta visual rica em recursos para criar e editar arquivos DOAP está além do escopo deste artigo. Em vez disso, tenho a meta de criar um conjunto de ferramentas de linhas de comando e atualizar um diário de bordo, imprimir um relatório e enriquecê-lo ao mesclar informações a partir de uma fonte externa. O objetivo deste miniprojeto é gerar e manter dados DOAP para um projeto em particular; assim, eu presumirei
Listagem 3: Consultar o ref:type 01 /** O recurso com URI tem rdf:type t? */ 02 public boolean hasType( String u, Resource t ) { 03 return getModel().getResource( u ).hasProperty( RDF.type, t ); 04 }
Listagem 4: Acumular documentos RDF descobertos por meio do sindice.com 01 // fase de leitura: adicione os documentos em um modelo combinado 02 Model m = ModelFactory.createDefaultModel(); 03 for (ResIterator i = sIndex.listSubjectsWithProperty( RDF.type, Sindice.Result ); i.hasNext(); ) { 04 String docURL = i.next().getPropertyResourceValue( Sindice.link ).getURI(); 05 06 // poderíamos ser mais sofisticados sobre a proveniência dos recursos 07 try { 08 m.read( docURL ); 09 } 10 catch (RuntimeException e) { 11 // alerte sobre falha de leitura, mas siga na leitura de outros documentos 12 log.warn( String.format( “Failed to retrieve from %s because: %s”, docURL, e.getMessage() ) ); 13 } 14 }
Linux Magazine #80 | Julho de 2011
que os dados DOAP estão armazenados no diretório do próprio projeto. Com o tempo, meu objetivo poderá ser o de desenvolver a ferramenta para armazenar mais do que simples dados DOAP, talvez até incluir controle de tempo, entre outras informações. Por essa razão, vou generalizar o nome e chamá-lo simplesmente de “Projeto Diário de Bordo”, representado pelo termo plb. Para brincar com o código, veja o quadro 1. Uma escolha razoável para o projeto seria armazenar os dados em um simples arquivo RDF. No entanto, como meu o objetivo é ilustrar os vários recursos do Jena, vamos armazenar o RDF gerado em um triplestore persistente. O Jena tem uma série de soluções de armazenamento RDF persistentes. Vamos usar o TDB, customizado para triplestore, com a capacidade de armazenar um grande números de triples com eficiência sem requerer um banco de dados relacional adicional, como o MySQL, por exemplo. O TDB pode suportar ordens de magnitude muito maior que aquelas que eu vou gerar agora, mas ele torna bem direta a tarefa de atualizar o banco de dados persistente.
Quadro 1: Teste o código Para o projeto, você precisará de um compilador Java que suporte Java 1.6. Eu estou usando também o Maven para gerenciar o Jena e outras bibliotecas dependentes. Então, você precisará da versão mais recente do mvn. Finalmente, o código está no repositório Git e o exemplo também lida com metadata Git, de modo que você precisará do Git instalado. O pom.xml, no diretório raiz do projeto, lista as dependências de software. O Maven instalará todos automaticamente como necessário. Para clonar o projeto do repositório Git, use o seguinte comando: git clone git@codebasehq.com: epimorphics/epimorphics-open/ jena-plb-tutorial.git
65
TUTORIAL | Apache Jena
Início do projeto O problema tem quatro componentes: inicializar o projeto, atualizar a descrição DOAP manualmente, aumentar a descrição automaticamente e reportar o perfil DOAP. Cada componente é chamado pela linha de comando (quadro 2). Inicializar o projeto é algo direto: você precisará criar o elemento de armazenamento TDB (ou recriar se o usuário quiser forçar a criação de um novo elemento de armazenamento) e adicionar um recurso root para representar o projeto DOAP que estou descrevendo. Criar um elemento de armazenamento TDB requer um diretório para os dados – vamos usar o ./.plb/tdb por padrão – e um chamado Java. O chamado é uma linha getTdbLocation(), método que retorna uma string especificamente no diretório TDB. Dataset dataset = TDBFactory. createDataset( getTdbLocation() );
Criar o recurso root para o projeto é conceitualmente simples: é preciso somente um URI para denotar o projeto e esse deve ser atribuído ao doap:Project. Aqui, doap: é o componente namespace do URI e se expande para http://usefulinc.com/ns/doap#, enquanto Project é o nome de uma classe RDFS. Matematicamente, classes RDFS (RDF Schema ou Esquema RDF) correspondem a conjuntos de coisas que compartilham características semelhantes – o conjunto de todas as coisas que são descrições de projetos, por exemplo. Para desenvolvedores, é interessante pensar nas classes RDFS como análogas aos types na linguagem Java ou outras linguagens de programação. Tenha em mente, no entanto, que as classes Java e as classes RDFS têm diferenças importantes. Em particular, à medida que você descobre mais informações sobre um recurso, você poderá achar que se trata de um membro de uma classe que você não sabia de que fazia parte. Além disso,
66
um recurso pode ser membro de muitas classes ao mesmo tempo. Obter o código Java para fazer com que o recém criado projeto seja membro da classe doap:Project vai requerer um novo triple, com o projeto como assunto, o predicado especial rdf:type como propriedade e um recurso denotando a classe doap:Project como um objeto. O URI doap:Project não muda (a não ser que o esquema mude), então este será definido como constante. Embora seja possível escrever manualmente a declaração de uma constante no código, correríamos o risco de fazer erros de transcrição e criar problemas de manutenção com a mudança de esquema. Felizmente, o Jena oferece uma ferramenta que gera um código Java automaticamente a partir de um arquivo RDFS, o schemagen. A classe Java gerada define constantes para cada uma das classes, propriedades e recursos in-
dividuais definidos no arquivo. A ferramenta Schemagen pode ser executada a partir da linha de comando ou como um plugin Maven [7]. Uma amostra do código gerado aparece na listagem 1. Os vocabulários completos estão incluídos no projeto para download. Considerando que eu tenho acesso às propriedades e classes DOAP por meio da classe DOAP.java, o início do projeto é direto, como mostrado na listagem 2.
Inclusão manual no diário de bordo Muitos bits de informação útil sobre um projeto devem ser capturados, inclusive as várias propriedades diferentes utilizadas pelo DOAP. Assim, eu quero que meus usuários possam adicionar informações de forma incremental. No entanto, é necessário atingir um balanço na interface apre-
Listagem 4: Acumular documentos RDF descobertos por meio do sindice.com 01 // fase de leitura: adicione os documentos em um modelo combinado 02 Model m = ModelFactory.createDefaultModel(); 03 for (ResIterator i = sIndex.listSubjectsWithProperty( RDF.type, Sindice.Result ); i.hasNext(); ) { 04 String docURL = i.next().getPropertyResourceValue( Sindice.link ).getURI(); 05 06 // poderíamos ser mais sofisticados sobre a proveniência dos recursos 07 try { 08 m.read( docURL ); 09 } 10 catch (RuntimeException e) { 11 // alerte sobre falha de leitura, mas siga na leitura de outros documentos 12 log.warn( String.format( "Failed to retrieve from %s because: %s", docURL, e.getMessage() ) ); 13 } 14 }
Listagem 5: Modelo de consulta 01 String queryString = String.format( "describe ?s where {?s <%s> \"%s\"}", FOAF.mbox_sha1sum.getURI(), mboxSha1 ); 02 // analise a consulta 03 Query query = QueryFactory.create( queryString ) ; 04 // vincule ao modelo 05 QueryExecution qexec = QueryExecutionFactory.create( query, collected ); 06 // faça a consulta 07 dev.getModel().add( qexec.execDescribe() );
www.linuxmagazine.com.br
Apache Jena | TUTORIAL
sentada aos usuários. Como não há modelo de dados fixo, o RDF permite que qualquer predicado seja anexado a qualquer recurso, algumas vezes declarado como “qualquer um pode dizer qualquer coisa sobre qualquer coisa”. Esse modelo pode ser muito poderoso, mas tanta abertura pode dificultar as coisas. Por exemplo, há algumas restrições na estruturação da interação do usuário. Nesse caso, não espero que os usuários digitem uma propriedade URI completa ou linha de comando só para adicionar um triple para a descrição do projeto; então, permitirei que qualquer propriedade no vocabulário do DOAP seja abreviada somente com seu nome de local, menos o namespace. Os usuários digitarão algo como: $> plb set language Java $> plb set -r release 1.0.1
Esses dois comandos adicionam valores para doap:language e doap:release; a bandeira -r substitui um valor existente armazenado. O código RDF específico na classe de ação Set é pequeno: a maior parte do código é ocupada com checagem de rotina e manipulação de argumen-
tos. A definição da classe completa pode ser encontrada no download. Com Jena, toda informação de estado é mantida no objeto Model. No entanto, um objeto Resource contém referência para o Model que o contém. Então, eu posso perguntar ao Resource pelos seus triples relacionados, ou seja, pergunto se um determinado URI corresponde ao recurso com um rdf:type em particular (aqui atribuído ao parâmetro type; listagem 3). Dado um Resource denotando o projeto, posso adicionar um novo triple com esse recurso como um assunto, usando o método addProperty. Já que eu optei por usar um modelo baseado em TDB persistente, eu não preciso fazer uma chamada separada para salvar os triples atualizados no disco.
Dados automáticos no diário de bordo Até então, eu criei um novo diário de bordo usando TDB e uma armazenagem triple, defini um recurso para representar o projeto e permiti
que os usuários anexassem algumas propriedades à linha de comando. É um começo sólido, mas não fez muito ainda pela web semântica e os princípios de dados ligados. Meu projeto tem alguns desenvolvedores. Deste modo, vamos assumir que eu quero anotar no meu diário de bordo quaisquer informações que possam ser coletadas sobre eles para ter a visão mais fiel possível sobre o projeto. Para evitar questões de privacidade, vamos usar somente informações públicas. Qual seria a estratégia? Se o projeto está usando um sistema de gerenciamento de recursos, posso listar todos eles facilmente. Nesse tutorial, vou presumir que o código é gerenciado por um repositório Git. Algum processamento simples do log do Git listará os desenvolvedores por nome e e-mail e podemos usar o endereço de e-mail como uma chave para reunir mais dados. Amigo do amigo (Friend of a Friend ou FOAF [8]) é outro vocabulário RDF usado amplamente. As pessoas utilizam FOAF para publicar dados pessoais, como
Listagem 6: Listar todos os desenvolvedores do projeto 01 $ sp="prefix foaf: <http://xmlns.com/foaf/0.1/> prefix doap: <http://usefulinc.com/ns/doap#> prefix plb: <http://www.epimorphics.com/tutorial/plb#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 02 $ tdbquery --loc=.plb/tdb "$sp select ?p ?e ?w {?p a doap:Project . ?p doap:developer ?d. optional {?d foaf:mbox ?e ; foaf:homepage ?w}}" 03 -------------------------------------------------------------------------------04 | p | e | w | 05 ================================================================================ 06 | plb:plb | "mailto:i.j.dickinson@gmail.com" | <http://www.iandickinson.me.uk> | 07 | plb:plb | "mailto:ian@epimorphics.com" | <http://www.iandickinson.me.uk> | 08 --------------------------------------------------------------------------------
Listagem 7: Listar todas as propriedades do projeto 01 02 03 04 05 06 07 08 09 10
$ tdbquery --loc=.plb/tdb "$sp select ?p ?o where {?proj a plb:root . ?proj ?p ?o} order by ?p" ---------------------------------------------------------------------------------------| p | o | ======================================================================================== | doap:description | "A Jena tutorial showing how to create DOAP project descriptions" | | doap:developer | <http://www.iandickinson.me.uk/rdf/foaf#ian> | | doap:name | "plb" | | doap:shortdesc | "Jena PLB tutorial" | | rdf:type | doap:Project | ----------------------------------------------------------------------------------------
Linux Magazine #80 | Julho de 2011
67
TUTORIAL | Apache Jena
websites, detalhes de contato, interesses e amigos que conhecem por referência de perfis de outros amigos. A princípio, eu poderia usar esses detalhes do log inicial para procurar informações públicas dos membros e adicionar automaticamente ao diário de bordo. Na história inicial do FOAF, a prática de disfarçar endereços de e-mail para evitar spams era uma medida comum contra estes; assim, precisamos buscar pela soma SHA1 dos endereços de e-mail dos meus desenvolvedores. Um algoritmo ideal para obter essa informação seria: for each unique committer C let m be the email address of C let s be sha1( m ) run the sparql query: describe ?person where {?person foaf:mbox_sha1sum “value of s”}
A linguagem SPARQL é a padrão para fazer consultas em armazenagens triple RDF e é totalmente suportada pelo Jena. Ela tem quatro verbos de consulta:
Quadro 2: Empacotador de linhas de comando Uma variedade de comandos pode ser executada de um shell. Em vez de um script Bash para cada um deles, um script empacotado, plb, pode chamar um conjunto de comandos diferentes. Veja o exemplo: plb init test-project O script Bash plb chama um programa Java para desempenhar o comando predefinido no primeiro argumento, com a convenção de que um comando cmd corresponde a classe Java com.epimorphics.plb. Cmd. Para ter dependências no caminho da classe, o script empacotador executa o programa com mvn:exec, que, por sua vez, executa um programa Java arbitrário com todas as dependências do pom.xml, baixando as dependências que faltam antes, se necessário. O script Bash está no diretório bin do projeto plb.
68
➧ select: entrega linha de valores correspondentes, semelhante às armazenagens relacionais SQL; ➧ ask: confirma se um padrão de consulta pode ser correspondido; ➧ construct: cria um novo gráfico com o uso de templates e padrões e consultas; ➧ describe: transfere a responsabilidade de retornar uma descrição útil de um recurso para um servidor, suportando especificamente o caso no qual o cliente não sabe a estrutura do gráfico contendo um recurso em particular. Tipicamente, o servidor retorna algum tipo de descrição vinculada [9]. O ponto chave, aqui, é que o cliente – meu programa – não sabe os esquemas que podem ser usados para anotar um recurso particular, razão pela qual os verbos descritos são úteis para obter um conjunto de dados que podem ser processados localmente. O único problema com meu algoritmo, é que, no momento da escrita, um serviço disponível publicamente que agregava dados FOAF de múltiplos pontos de publicação ficou indisponível. No entanto, o projeto de serviço de pesquisa Sindice [10] proporciona um índice navegável para todos os documentos RDF que possam ser detectados. Posso emendar meu algoritmo da seguinte maneira: for each unique committer C let m be the email address of C let s be sha1( m ) query sindice.com for docs mentioning s for each found document accumulate the doc into local model L run the sparql query against model L: describe ?person where {?person foaf:mbox_sha1sum “valor do s”}
A princípio, o programa poderia obter uma lista de desenvolvedores de qualquer fonte de sistema de gerenciamento, no entanto o tutorial somente lida com o repositório Git. O retorno daquela parte de código é um Model do
Jena, contendo recursos denotando os desenvolvedores no projeto, cada um com um foaf:mbox denotando seu endereço de e-mail como dado ao Git. O que são esses recursos, no entanto? Uma vez que eu não sei as reais identidades dos desenvolvedores, apenas um dos endereços de e-mail, que recurso URI deve ser usado para denotar cada desenvolvedor? Eu poderia criar um identificador, porém o RDF também permite um tipo especial de recurso chamado recurso anônimo (anonymous resource). Esse recurso age como qualquer outro, exceto pelo fato de não ter identidade conhecida. Por razões históricas, é normalmente chamado de bNode, que pode ser usado como um alocador de recurso, sobre o qual conheço a existência e propriedades, mas não conheço a identidade. No exemplo plb, eu crio bNodes para denotar os desenvolvedores antes de reunir informações sobre eles de fontes públicas. A API Sindice é muito fácil: é só chamar http://sindice.com/search?q= com o termo de busca depois do sinal de igual (=). Esse endereço usa negociação de conteúdo HTTP para determinar o formato no qual deve retornar resultados, o que faz da busca algo muito natural para o Jena, uma vez que o método Model. read() faz com que o tipo favorito de conteúdo vá ao RDF. Para procurar por todos os documentos que mencionam uma caixa de correio SHA1 em particular, mboxSha1, tudo o que eu tenho de fazer é digitar: Model sIndex = ModelFactory. createDefaultModel(); sIndex.read( “http://api.sindice. com/v2/search?q=” + mboxSha1 );
O Model resultante contém um conjunto de recursos sindice:Result denotando as buscas. Para cada uma das buscas, eu tento executar o link para o documento original, tendo em mente que isso pode falhar se o documento foi indexado há algum tempo. A listagem 4 mostra o processo.
www.linuxmagazine.com.br
Apache Jena | TUTORIAL
Dado um modelo que contenha triples potencialmente relevantes e acumuladas, eu posso executar a consulta descrita (listagem 5). Aqui, collected (linha 5) é o modelo contendo os triples dos documentos que foram coletados da web e dev (linha 7) são os recursos para o desenvolvedor sendo adicionados à descrição do projeto. Resta um passo. Eu utilizei muitas informações da web. O modelo inclui uma série de fontes denotando a mesma pessoa, alguma delas sendo bNodes; e eu gostaria de simplificar o gráfico, mesclando essas fontes redundantes. O Jena não tem uma ferramenta interna para fazer isso, mas não é difícil com a propriedade foaf:mbox_ sha1sum, que é uma boa chave de desambiguação. Em geral, esse tipo de mesclagem de informação pode ser bem complexo, mas não com essa simples abordagem. Finalmente, adicionei os resultados da consulta describe para meu modelo TDB persistente.
Relatórios A SPARQL é útil também quando quero produzir relatórios simples a partir do diário de bordo. O comando tdbquery está disponível na instalação completa do Jena e executa uma consulta contra um modelo TDB da linha de comando. Por exemplo, eu poderia listar todos os desenvolvedores no projeto com os seus sites, se conhecidos (listagem 6), ou listar cada propriedade do projeto (listagem 7). Obviamente, eu poderia escrever relatórios muito mais abrangentes, mas precisaria de tutoriais separados para isso.
Conclusão Meu objetivo com este artigo foi introduzir os recursos Jena para uma tarefa prática. Não pretendo, com isso, oferecer a melhor forma de gerar perfis DOAP. Na verdade, o plugin Maven
Linux Magazine #80 | Julho de 2011
faz esse trabalho. No entanto, a combinação de um formato flexível de dados e a habilidade de mesclar informações de múltiplas fontes na web mostra as possibilidades tanto do Jena em relação à abordagem de web semântica e dados vinculados em geral. O Jena está, atualmente, incubado na Apache, e contribuições são bem vindas: bugs, sugestões, correções etc. Mais informações estão disponíveis no site do Jena. ■
Gostou do artigo? tigo? Queremos ouvir sua ua opinião. Fale conosco em m cartas@linuxmagazine.com.br gazine.com br Este artigo no nosso osso site: te: http://lnm.com.br/article/5494 br/art /549
Mais informações [1] “What is Data Science?” por Mike Loukides, O’Reilly Radar, junho de 2010: http://radar. oreilly.com/2010/06/ what-is-data-science.html [2] Dublin Core Metadata Initiative: http:// dublincore.org/ [3] Vocabulário FOAF: http:// xmlns.com/foaf/spec/ [4] Projeto Apache Jena: http:// incubator.apache.org/jena [5] Vocabulário DOAP: http:// usefulinc.com/ns/doap# [6] Página DOAP: http:// trac.usefulinc.com/doap [7] Código-fonte Jena: http:// jena.sourceforge. net/downloads.html [8] Projeto Friend of a Friend: http://www. foaf-project.org/ [9] Descrição vinculada: http://goo.gl/rOjmt [10] Serviço Sindice: http:// www.sindice.com/
69
TUTORIAL | VoIP com Asterisk - parte IX
Asterisk descomplicado
TUTORIAL
VoIP com Asterisk – parte IX O sistema telefônico ultrapassado, presente até pouco tempo atrás nas empresas, é prolífico em cobranças: cada novo recurso ativado requer uma nova ativação de serviço, com o preço adicionado ao pagamento mensal. É hora de mudar. É hora de criar sua própria central VoIP. por Stefan Wintermeyer
N
a edição 79 da Linux Magazine, você aprendeu sobre como provisionar suas extensões através de DHCP, recursos de lista telefônica e redirecionamento de chamadas. Nesta edição, vamos abordar o provisionamento de ramais via DHCP, para implantação em massa de ramais com um único arquivo de configuração. Vamos ver ainda como trabalhar com agenda telefônica. Mãos a obra!
Provisionamento por DHCP A implantação de ramais em massa, é definida como um processo onde vários telefones equipados com uma única configuração passam a funcionar automaticamente. O software Amooma Gemeinschaft, (Comunidade) [1] abordado na edição anterior, usa para o provisionamento coletivo de ramais, um método que poderia ser aplicado em instalações de outros procesos tecnológicos: um servidor DHCP busca todos os telefones e confere a cada um uma URL que corresponde ao seu respectivo arquivo de configuração. Um exemplo de configuração de ramais em massa via DHCP pode ser conferido na listagem 1. Comumente utilizados na telefonia VoIP, os telefones Snom [2] lêem os logs do servidor DHCP, sendo assim, o aparelho reconhece os três primeiros
70
bytes do endereço MAC do dispositivo e cria uma sequência de ramais. Então, para o servidor DHCP, o telefone não é apenas uma configuração de rede, mas também é o nome de um servidor TFTP e um arquivo de inicialização do ramal com seu respectivo nome.
O telefone Snom converte o endereço MAC do aparelho de “bootfile-name” por um endereço “{} mac” (para outros telefones pode ser necessário instalar o módulo Mod_rewrite do Apache). Isto garante ao servidor de provisionamento que
Listagem 1: dhcpd.conf 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
;–––––––––––; Chamar o ramal 1234567 ;–––––––––––exten => 1234567,1,Verbose(${CALLERID(num)}) exten => 1234567,n,GOToIf($[“${CALLINGPRES}”=”35”]?abuse1|1) exten => 1234567,n,Dial(SIP/1001,30) exten => 1234567,n,Playback(local/ed-greeting) exten => 1234567,n,VoiceMail(1001@default) exten => 1234567,n,Hangup() ;–––––––––––; Tratamento de chamadas anônimas ; Local dos arquivos de áudio abaixo ; /var/lib/asterisk/sounds/local ;–––––––––––exten => abuse1,1,Answer exten => abuse1,n,Wait(1) exten => abuse1,n,Monitor() exten => abuse1,n,Playback(local/ed-greeting_offenders) exten => abuse1,n,WaitForSilence(500) exten => abuse1,n,Playback(local/ed-ola) exten => abuse1,n,WaitForSilence(500) exten => abuse1,n,Playback(local/ed-assinatura_nao_reconhecida) exten => abuse1,n,WaitForSilence(1200) exten => abuse1,n,Playback(local/ed-entao_o_que_posso_fazer_por_voces) exten => abuse1,n,WaitForSilence(1000) exten => abuse1,n,Playback(local/ed-o_que_especificamente) exten => abuse1,n,WaitForSilence(2000) exten => abuse1,n,Wait(1) exten => abuse1,n,Playback(local/ed-numero_restrito) exten => abuse1,n,Playback(local/ed-infelizmente_sou_apenas_um_computador) exten => abuse1,n,StopMonitor() exten => abuse1,n,VoiceMail(1001@default) exten => abuse1,n,Hangup
www.linuxmagazine.com.br
VoIP com Asterisk - parte IX | TUTORIAL
Figura 2: O Snom 370 mostra a agenda de contatos Figura 1: Agenda de telefones do software Comunidade.
o dispositivo MAC irá receber um cabeçalho HTTP com um nome, como por exemplo, “Snom 370”. Um script PHP chamado gera a configuração ao iniciar. A configuração para cada fabricante é diferente, com um telefone Snom em um caso simples como na listagem 2 você pode transformar qualquer extensão e personalizar as teclas do telefone. Com o Comunidade também é possível configurar os botões em uma interface web (figura 1). Já os telefones Aastra permitem que você selecione uma variedade de configurações do servidor de provisionamento – os telefones Snom tem muito a melhorar neste quesito.
Releitura da configuração A maneira mais fácil de configurar um telefone Snom novo, é realizando um reboot neste, chamando em conjunto o script: wget -q -O /dev/null -o /dev/null http://UIP_do_ telefone/confirm.htm?REBOOT=yes
No entanto, assume-se que o servidor Snom local (o do próprio aparelho) está habilitado e que não há nenhuma proteção por senha. Mas, se uma senha estiver configurada, informe-a no comando wget. Após a reinicialização do aparelho, a nova configuração do servidor de provisionamento do aparelho será lida. Alternativamente,
Linux Magazine #80 | Julho de 2011
usando o navegador XML do servidor Asterisk.
você pode enviar a configuração e efetuar o reinício do aparelho através de um dispositivo SIP Notify personalizado, como o arquivo /etc/asterisk/ sip_notify.conf ilustrado a seguir: [snom-check-cfg] Event=>check-sync;reboot=false Content-Length=>0 [snom-reboot] Event=>reboot Content-Length=>0
Agora digite o comando sip notify snom-check-cfg 1234 no terminal, para carregar a nova configuração no telefone. O comando no Shell é uma chamada equivalente ao comando asterisk -rx \’sip notify snom-check-cfg 1234\’.
Agenda e encaminhamento Em uma empresa, não pode faltar uma agenda telefônica centralizada, com a qual todos os telefones se comuniquem e todos os seus usuários tenham acesso. Todos os kits de ferramentas do Asterisk fornecem uma agenda de telefones em uma interface web interativa, e que pode ser personalizada de acordo com a necessidade do usuário, conforto que depende do telefone conectado (alguns telefones não interagem bem com o Comunidade). O software também permite que a agenda de telefones seja exibida no visor do aparelho (figura 2), através de um navegador XML. Outros recursos presentes no visor do telefone incluem função de busca e ordenação.
Muitos usuários usam o recurso de encaminhamento de chamadas para os telefones, e o Comunidade as efetua de forma centralizada no servidor, gravando logs de cada uma delas. Elas podem ser configuradas através da interface web ou um código de serviço no telefone. Na próxima edição da Linux Magazine, na última parte deste tutorial, você irá aprender como trabalhar com scripts automatizados. Até lá! ■
Listagem 2: Configuração do telefone Snom 01 02 03 04 05 06 07 08 09
language: English time_24_format: on date_us_format: off user_host1: 192.168.1.130 user_name1: 1234 user_pname1: 1234 user_pass1: Sippasswort user_realname1: Paula Plauder active_line: 1
Mais informações [1] Amooma Gemeinschaft ou Comunidade: http://www. amooma.de/gemeinschaft/ [2] Série de telefones Snom: http://www.snom.com/ de/products.html
Gostou do artigo? tigo? Queremos ouvir sua opinião. pinião. m Fale conosco em cartas@linuxmagazine.com.br azine.com. Este artigo no nosso osso site: e: br/art 551 http://lnm.com.br/article/5515
71
PROGRAMAÇÃO | Open Search Server
Servidor de busca aberto
PROGRAMAÇÃO
Busca com qualidade Analisamos a ferramenta de indexação Open Search Server e mostramos como integrar o recurso de busca ao seu website utilizando PHP. por Markus Feilner, Thomas Pfeiffer e Markus Heller
A
startup (empresa de tecnologia recém criada) francesa Jaeksoft foi criada em fevereiro de 2010. Apenas um anos depois, o fabricante lançou a versão 1.2 de sua ferramenta de busca e indexação, o Open Search Server [1]. Sua relativa imaturidade é evidente, assim como alguns aborrecimentos. Mas também há uma quantide de recursos impressionantes.
Indexação livre De acordo com seu fornecedor, o Open Search Server (OSS) vai “vasculhar sistemas de arquivos, bancos de dados e sites para criar rapidamente índices confiáveis e dar suporte a um processo preciso de investigação”. Em outras palavras, você pode usar o OSS
para adicionar funções de busca a um website ou outro banco de dados e pode até construir uma máquina de busca agregada para indexar e buscar dados de múltiplas fontes na Internet. O indexador OSS suporta uma longa lista de formatos de arquivos. Uma API está disponível para acesso rápido e sem complicação a resultados e a maioria de seus muitos recursos (figura 1). O alicerce da ferramenta é o Java em um servidor Tomcat [2]. O mecanismo de busca Lucene [3] permite que administradores e desenvolvedores usem sua sintaxe de interpretador de consultas e funções de classificação fora do gerenciamento da interface (quadro 1). O OSS depende do Quartz [4] como agendador. A interface, rápida e
Figura 1 Lucene, Tomcat e uma API flexível combinados no Open Research Server.
72
flexível, é implementada em Zkoss [5] e funciona com qualquer navegador compatível com Ajax.
Suporte corporativo Além da variante livre, lançada sob muitas licenças (incluindo AGPL e GPLv3) por conta de sua estrutura modular, o fornecedor, a Jaeksoft, também oferece uma versão corporativa, com suporte opcional, acordo de nível de serviço (Service Level Agreement - SLA) e recurso avançado na forma de módulos instaláveis. O fornecedor também oferece desenvolvimento, implementação e otimização dos módulos adicionais. A versão Community é facil de instalar: faça o download do arquivo tar.gz do site, abra-o em um servidor web e execute start.sh no shell (start.bat no Windows). São necessários um servidor de web em funcionamento com PHP5, php5-curl e Java Runtime Environment. O pacote não inclui um script init; se você deseja executar o servidor permanentemente, é importante prestar atenção no manual. Infelizmente, o wiki do OSS [6] não oferece mais do que detalhes sobre o procedimento de instalação. Para esse artigo, usamos a versão open-search-server-1.2.1-r987. tar.gz de 30 de março de 2011.
www.linuxmagazine.com.br
Open Search Server | PROGRAMAÇÃO
Primeiro contato A pasta apache-tomcat-6.0.32 no pacote compactado contém alguns caracteres familiares: o aplicativo do servidor Tomcat vem pré-configurado com seus binários, arquivos de log e de configuração. Se algo não funciona, cheque o arquivo de log catalina.out. O Tomcat oferece dicas úteis caso algo não funcione em sua instalação. Os índices ficam no diretório data, onde você também encontrará um subdiretório com a configuração em arquivos HTML. Você pode usar um script ou adicionar URLs e padrões aqui, mas vai precisar reiniciar o OSS depois de fazer isso.
A interface web Depois de iniciar, o Tomcat escuta a porta padrão 8080. Você deve manter essa porta atrás do firewall para evitar acessos não autorizados e deixá-la disponível apenas para serviços locais. Se você usar seu nvegador para acessar a URL http://localhost:8080//, será levado à interface de gerenciamento, que inicialmente apenas mostra as abas Index e Privileges. Você pode começar criando um novo índice ou usuário com privilégios. Modelos estão disponíveis para índices (índice vazio, buscador de arquivo e buscador web). Depois, você pode selecionar um índice para editar. Uma vez carregado o índice, marcações de tempo são adicionadas ao menu do OSS, como na figura 2. A falta de documentação pode fazer com que as abas, opções de configuração e itens secundários sejam um pouco confusos. Entretanto, os modelos (templates) e funções autoexplicativas são fáceis de serem iniciados. O atributo Schema permite a edição de detalhes nas funções de busca; Query permite a formulação de buscas ou coordena o formato do resultado de saída. O OSS pode confrontar os resultados (Query > Collapsing) caso critérios específicos permitam a conclusão de que sites idênticos existem.
Linux Magazine #80 | Julho de 2011
Os modos disponíveis aqui são full, cluster e optimized. Por causa da falta de documentação, a única forma de descobrir qual modo é melhor para
o seu projeto é experimentando. Snippet fields (também presente na Query tab) define o formato de saída. Você pode definir os campos e seus
Quadro 1: Lucene O coração de qualquer mecanismo de busca moderno é o indexador. O indexador escalonável criado usando a biblioteca livre do Lucene Java trabalha bem se comparado com mecanismos de busca comerciais.
Analisador, Indexador e Fields O princípio fundamental é simples: um analisador separa um documento e distribui os metadados deste e componentes de texto por campos predefinidos. Então, o criador de índice cria o índice em si. O criador de índice é tipicamente um transdutor automático, que leva você a uma lista de links quando é introduzido um termo. Especialistas referem-se a isto como “arquivos invertidos”, porque um índice corresponde mais ou menos ao trabalho original. Entretanto, os trabalhos não são mais armazenados na sua ordem natural, mas sim em ordem alfabética com um apontador para suas posições originais. Criar e manter a máquina em funcionamento e garantir armazenamento compacto dos link no arquivo do sistema normalmente é uma tarefa arriscada que o Lucene realiza de uma forma muito elegante. Ele facilmente alcança um desempenho de indexação de 30MBps em uma máquina moderna, enquanto reduz o texto original em torno de 20% no índice. Obviamente, esse processo depende da extensão para a qual o mecanismo de busca acessa o documento e o distribui pelos campos.
Boost e Page Rank Um programador pode usar os campos oferecidos para dar, por exemplo, uma atenção especial aos títulos, dando mais peso a esse elemento, ou usando metadados externos, como nome ou autor do arquivo. Se o termo de busca ocorre nestes campos, o elemento indexado recebe um valor de ranking mais alto do que se apenas ocorresse em algum lugar no corpo do texto. O levantamento correto destes campos vai levar ao tipo de ranking que os usuários querem encontrar. O Lucene pode também analisar campos individuais de uma forma focada ou usá-los para busca de resultados. Além das análises booleanas relativamente entediantes, você pode também realizar buscas com coringas ou tolerantes a erros. O objetivo aqui é não apenas encontrar resultados com prefixo idêntico (como em SQL com ‘Linux Mag%’), mas também com grafias diferentes. Graças ao método Levenshtein Distance, você pode definir sua própria sintaxe para descobrir todas as variáveis ortográficas do Schmie?[dt] + (Schmid/Schmit/Schmidt, com ou sem um e depois do i) ou M[ae][iy]e?r (Meyer/Mayer/Maier/etc.) sem comprometer o desempenho.
Mantenha distância! Qualquer tipo de análise a distância recebe suporte do operador de proximidade (~) em análises com múltiplas palavras. Ele encontra todos os tipos de seções de textos nos quais várias palavras ocorrem até a distância máxima de uma para a outra. Em contraste com documentos estáticos ou levantamento de campos, isso significa que você pode levantar mais termos que os outros durante o tempo de execução. O termo operador de boost (^) também permite que você interprete chaves de busca individuais como mais importantes do que outras com consultas de múltiplas palavras. Resumindo, usuários típicos não precisarão se preocupar com estas coisas em um mecanismo de busca ideal, porque os resultados mais relevantes estarão no topo da lista de qualquer forma – mesmo que não seja utilizado operadores. O indexador do Lucene inclui um grande número de ferramentas para lidar com isso.
73
PROGRAMAÇÃO | Open Search Server
tamanhos aqui e, então, configurar a lista de resultados. A aba Crawler é onde você especifica o alvo de sua busca: websites, bancos de dados ou sistemas de arquivos. Vários filtros estão disponíveis para auxiliá-lo a modificar isso. A figura 2 mostra a subjanela do Crawl process para uma máquina que está indexando o site inteiro da Linux Magazine.
Uma das configurações pode ser mal interpretada: se você for levado a achar que precisa aumentar ao máximo o número de sites por host para um servidor web com grande quantidade de conteúdo, vai provavelmente cair em uma armadilha. O valor somente diz ao OSS quantas páginas recuperar na sessão antes de adicioná-las em seu índice. Se você configurar este valor muito alto, usará memória RAM demais ou
possivelmente verá a mensagem de erro ilustrada na figura 3. Em muitos casos, o OSS ou Java congela quando não tem mais memória. Se você quer criar um índice de um site grande, certifique-se de que tenha memória suficiente em seu sistema. Para alocar 2 GB de RAM no Java Virtual Machine, você simplesmente precisa adicionar as duas linhas seguintes ao seu script de inicialização: CATALINA_OPTS=”-Xms2G -Xmx2G -server” export CATALINA_OPTS
É possível usar mais do que 2 GB em um sistema operacional de 64 bits com Java de 64 bits. Neste caso, as opções a seguir permitem 6 GB de memória RAM para o Java: CATALINA_OPTS=”-d64 -Xms6G -Xmx6G -server” export CATALINA_OPTS
Figura 2 OSS pesquisando o website da Linux Magazine. O número máximo de URLs por campo de host é completamente equivocado. Se você entrar com um valor mais alto aqui, a memória se esgotará rapidamente.
Figura 3 Zkoss apontando um aviso do Java heap space – essa mensagem tipicamente refere-se à falta de memória RAM para o JVM.
Listagem 1: Consulta OSS 01 02 03 04 05 06 07 08 09 10 11 12 13
74
title:($$)^10 OR title:("$$")^10 OR titleExact:($$)^10 OR titleExact:("$$")^10 OR url:($$)^5 OR url:("$$")^5 OR urlSplit:($$)^5 OR urlSplit:("$$")^5 OR urlExact:($$)^5 OR urlExact:("$$")^5 OR content:($$) OR content:("$$") OR contentExact:($$) OR contentExact:("$$")
Ferramentas de monitoramento, tais como Darkstat [7], nos repositórios Debian, monitoram o tráfego que isso cria ao mesmo tempo (figura 4). Alguns firewalls ou servidores web classificam ondas de consultas muito frequentes como um ataque de negação de serviço (DoS) e bloqueiam o cliente. De acordo com o fornecedor, o OSS é capaz de indexar 16 linguagens; pode identificar palavas inteiras, fragmentos, ou variantes de uma forma básica (radical [8]). A lista dos formatos de documentos inclui XML, HTML/XHTML, PDF, Microsoft Word, PowerPoint, OpenOffice.org, RTF, texto puro (plaintext), Torrent, arquivos de áudio (MP3/MP4, OGG, FLAC, WMA) e muitos outros. Para uma completa lista da instalação atual, veja em Schema/Parser list.
Consulta e lema Consultas podem ser implementadas como consultas HTTP via interface XML e integradas ao seu website por meio de uma biblioteca de cliente
www.linuxmagazine.com.br
Open Search Server | PROGRAMAÇÃO
PHP. A interface de gerenciamento também oferece uma tela de entrada em Query/Edit/Query, que pode ser usada para buscas no índice. A listagem 1 mostra as especificações padrão para a versão anterior, mas que também funciona na 1.2 e é facilmente extensível. A chave de busca é representada por $$; ^ seguido de um número que define o peso; palavras-chave como title ou urlSplit definem onde e como exatamente o termo de busca pode ocorrer. O problema está frequentemente nos detalhes: enquanto o urlSplit reduz a URL http://www.open-search-server.com para a forma normalizada http, www, ope, search e serv, o urlExact interpreta a mesma URL como os elementos http, www, open, search e server. De acordo com os desenvolvedores, o OSS usa diferentes analisadores para tal: o analisador de texto identifica grafias similares, enquanto o urlExact, titleExact e contentExact usam o analisador padrão. Na aba Scheduler, você pode criar cronjobs para controlar o OSS – por exemplo, para as reconstruções dos índices (Optimize). A opção Runtime oferece importantes opiniões e comentários a respeito do índice, do cache e dos estágios do sistema. O OSS é também bem equipado para configurações de alta disponibilidade: a aba Replication inclui caixas de entrada para as URLs e indexa nomes para instâncias de OSS mais detalhadas.
API e PHP Os subdiretórios open-search-server/ examples/php/OSSquery e open-search-server/php/example contem alguns exemplos de scripts PHP simples que você pode simplesmente integrar à sua própria página web, retirando, assim, funções de busca da interface de gerenciamento para o navegador do cliente. Em webSearch.php, por exemplo, você pode adicionar seu próprio índice como padrão, o que propor-
Linux Magazine #80 | Julho de 2011
Figura 4 O Open Search Server local está analisando o servidor de web local a menos de 100KBps porque o administrador restringiu ao máximo o número de linhas de execução e frequência de consultas na configuração.
ciona uma busca funcional de ponta a ponta, pelo menos parcialmente. Isso porque houve um lado negativo: a interface tem problemas com acentuação em alguns idiomas e não é completamente capaz de implementar os parâmetros da linguagem de buscas Lucene. Realizar consulta na interface gráfica é melhor na maioria das vezes, mas não em todos os casos (figura5). Recomenda-se a API XML. Desenvolvedores podem usá-la para buscas no índice – em quase qualquer linguagem de programação – e mostrar os resultados. Tudo o que você precisa fazer é adicionar os parâmetros necessários nos requerimentos correspondentes de HTTP na forma de um requerimento GET: http://localhost:8080/select? use=Index&qt=Query&q=Keyword
Quando vê este tipo de consulta, o servidor retorna um arquivo XML
Figura 5 Se você tentar usar parâmetros mais exóticos para o Lucene diretamente na consulta (por exemplo, a busca com ~), você pode falhar por causa da implementação do OSS.
contendo as combinações junto com a prévia do texto correspondente (ou snippets). Em outras palavra, como um programador, você somente precisa do seguinte:
75
PROGRAMAÇÃO | Open Search Server
Figura 6 Versões futuras incluem a função screenshot.
filtrar e validar o user input (tome cuidado, a API também pode deletar os documentos do índice!). agrupar a string para consultar a API. analisar o documento XML retornado e formatar a saída. A listagem 2 mostra um resumo de um simples script de API. As linhas 4 e 20 implementam uma proteção mínima contra códigos maliciosos. A linha 4 proporciona proteção contra scripts de cross site (técnica de programação malicio-
sa), enquanto a linha 20 remove um delete se um ataque for bem sucedido. A matriz associativa params coleta todos os parâmetros para a análise de API, sendo que os parâmetros use, qt e q são obrigatórios e todos os outros são opcionais. O template de busca está disponível na distribuição e oferece uma análise bem simples do índice. O próximo passo é definir quais campos você quer retornar na resposta XML; isso é feito na aba Query/Returned Fields. Neste
Listagem 2: build-query.php 01 function build_query($q){ 02 $params=array(); // todos os parâmetros são adicionados aqui e 03 // são removidas as tags 04 $this->q=substr(trim(strip_tags($q),0,80)); 05 // basic parameters 06 $params[‘use']='myIndex'; // índice utilizado 07 $params[‘qt']='search'; // Query Template 08 // Collapsing 09 $params[‘collapse.mode']='cluster'; 10 $params[‘collapse.field']='host'; 11 $params[‘collapse.max']=1; 12 // Pagination 13 if (isset($_GET[‘page'])) $params[‘start']=((int) $_GET[‘page']*10)-9; 14 else $params[‘start']=1; 15 $params[‘rows']=$this->rpp; 16 $params[‘query']=trim($q); // chave de busca 17 $params[‘sort']='score'; 18 $host= ‘http://127.0.0.1:8080/select'; // URL do host OSS 19 // In case somebody injected a "Delete" parameter: 20 unset($params[‘delete']); 21 $this->query=$host.'?'.http_build_query($params); 22 }
76
exemplo, os campos são url e host (listagem 3). Os três parâmetros de colapso especificam se o OSS deve agrupar os resultados. O campo autoritativo é livremente selecionável; este poderia ser o host ou o título da página. Usando esta abordagem, você pode ter associações semelhantes nos resultados até o usuário clicar novamente, melhorando assim a legibilidade. Na listagem 2, este processo acontece da linha 9 à 11. No modo cluster, a conta máxima é apenas 1; entretanto, você não pode omitir este parâmetro. A linha 21 finalmente concatena os parâmetros da busca com a URL do host e codifica os resultados. Um simples chamado ao simplexml_load_file($this->query) é o bastante para executar qualquer pedido API formulado deste modo. Você obterá, como retorno, um documento XML como o mostrado na listagem 3. Os resultados finais estão disponíveis como doc in result, que interage com um loop foreach ($hits ->result->doc as $doc) para cada item. Os dois arquivos modelo PHP da Linux Magazine Online [9] também suportam as características do Lucene, incluindo a aplicação de buscas com coringas como com o caractere ~, o que antes causava problemas (figura 5).
Novidades na versão 1.2 e previsões A versão 1.2 apresenta diversas características dignas de aplausos. O buscador web agora diz a você quando ele atualizou a página no índice, usa chaves únicas para lembrar páginas idênticas e permite que você ignore arquivos robots. txt. O banco de dados do crawler também entende buscas SQL; você pode desabilitar tanto listas de padrões como de exclusão, e as
www.linuxmagazine.com.br
Open Search Server | PROGRAMAÇÃO
análises identificam documentos similares com mais confiabilidade. A tag modified é ainda um problema bastante substancial. No momento, ela detecta se a página foi modificada, mas não detecta se somente a publicidade da página foi substituída ou se o conteúdo em si foi modificado porque a página, por exemplo, contém um feed RSS. Você pode usar o CSS para melhorar esta característica em seus próprios servidores de web usando a tag div para esconder menus, propagandas e feeds do indexador: <div class=”opensearchserver. ignore”></div>
O desenvolvimento está em progresso em relação a muitas características: de acordo com o desenvolvedor Emmanuel Keller, um tipo de page rank (baseado na função score do Lucene) foi parcialmente implementado. As funções score, ord, rord, byte, float, int, e short estão completas. Um exemplo válido de consulta, então, seria assim: score() + rord(‘modified_date’). A próxima versão incluirá também uma função screenshot e uma extensão de renderização. (figuras 6 e 7) O OSS ainda não é perfeito, mas definitivamente está no caminho certo. E é rápido: quando executado em um desktop, respondeu a uma consulta de 25.000 páginas do índice do site da Linux Magazine surpreendentemente rápido. Pouquíssimas vezes levou mais de meio segundo, como confirmado pelos nossos testes com centenas de URLs escolhidas aleatoriamente. ■
Figura 7 Futuras versões incluem uma extensão de renderização.
Listagem 3: bResposta XML 01 <?xml version="1.0" encoding="UTF-8"?> 02 <response> 03 <header> 04 <status>0</status> 05 <query>Query_Name</query> 06 </header> 07 <result name= "response" numFound="111" collapsedDocCount="0" start="1" rows="10" maxScore="NaN" time="11"> 08 <doc score="0.4523" pos="1"> 09 <field name= "url">http://www.myserver.com/path/file.html </field> 10 <field name="host">www.myserver.com</field> 11 <snippet name= "title" highlighted="yes">Page title</snippet> 12 <snippet name="content" highlighted="yes">brief preview of matches and neighborhood ...</snippet> 13 </doc> 14 </xml>
Mais informações [1] Servidor Open Search: http://www.open-search-server.com/ [2] Tomcat: http://tomcat.apache.org/ [3] Lucene no Apache: http://lucene.apache.org/java/docs/index.html [4] Agendador Quartz: http://www.quartz-scheduler.org
Gostou do artigo?
[5] Zkoss: http://www.zkoss.org/product/zk.dsp
Queremos ouvir sua opinião. Fale conosco em m cartas@linuxmagazine.com.br gazine.co br
[6] Wiki OSS: http://www.open-search-server. com/wiki/en/index.php/Main_Page
Este artigo no nosso sso site: te: http://lnm.com.br/article/5499 br/art /549
[8] Lemma: http://en.wikipedia.org/wiki/Lemma_(linguistics)
Linux Magazine #80 | Julho de 2011
[7] Darkstat: http://dmr.ath.cx/net/darkstat/
[9] Scripts PHP: http://www.linuxmagazine.com.br/issues/80/OSS.zip
77
Linux Magazine #81 PREVIEW
IPv6 Na próxima edição, você irá conhecer mais sobre as vantagens e facilidades da implementação da nova versão do protocolo IP, o Ipv6. Esta nova versão, promete resolver os já presentes --- e os futuros, durante um bom tempo, esperamos --- problemas de endereçamento IP da Internet. A versão 6 do protocolo IP não é somente uma mera atualização da versão atual; pode ser considerada como um protocolo praticamente novo, desenhado para fazer todo o sentido no mundo em que vivemos hoje. O que vai mudar? Como implementar a nova versão? ■
Ubuntu User #22 Ubuntu 11.04 O novo Ubuntu 11.04, codinome “Natty Narwhal”, está saindo do forno. Muitas mudanças são esperadas e previstas para este lançamento. Entre elas, podemos destacar o novo modo de organização da área de trabalho, que agora utiliza o Unity, a polêmica interface de usuário da versão netbook, que foi totalmente reescrita para a versão 11.04. Os recursos multitouch também vêm aperfeiçoados e com muitas novidades. Não perca!
Admin Magazine #3 Conexão Segura Quem precisa conectar computadores com sistemas operacionais diferentes frequentemente precisa procurar por soluções adequadas. O tema de capa da próxima edição da Admin apresenta softwares propiciam uma estreita relação entre Windows e Linux e que também servem para conexões com roteadores e firewall como os da Cisco, Juniper ou Checkpoint.
82
www.linuxmagazine.com.br