30

Burrice bem-vinda - Linux Magazine Online · Editora de Arte Larissa Lima Zanini ... Aplicativo personalizado Olá pessoal, criei uma calculadora utilizando lingua- ... APIs ofi ciais,

  • Upload
    doannhu

  • View
    218

  • Download
    2

Embed Size (px)

Citation preview

3Linux Magazine #80 | Julho de 2011

ED

ITO

RIA

L

Burrice bem -vinda Embora raros, há sistemas na engenharia e na biologia que são tão efi cientes 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 mate-rial. 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” signifi ca 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 “termi-nal burro”, o qual fi cava 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 confi -guração semelhante chegando a uma grande parcela de usuários fi nais: 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 aplicati-vos 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 afi rmaçã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 apa-relhos 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. Afi nal, 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 ca-pacidade de processamento local (edição de vídeo ou CAD/CAM, por exemplo), os sistemas baseados em Linux que vão equipar nossos dispo-sitivos 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 SilvaDiretor de Redação

Expediente editorial

Diretor Geral Rafael Peregrino da Silva [email protected]

Editores Flávia Jobstraibizer [email protected]

Kemel Zaidan [email protected]

Editora de Arte Larissa Lima Zanini [email protected]

Estagiário Felipe Brumatti Sentelhas [email protected]

ColaboradoresAlexandre 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) [email protected] Tel.: +55 (0)11 3675-2600

Penny Wilby (Reino Unido e Irlanda) [email protected]

Amy Phalen (América do Norte) [email protected]

Hubert Wiest (Outros países) [email protected]

Diretor de operações Claudio Bazzoli [email protected]

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. Assu-me-se que qualquer correspondência recebida, tal como car-tas, emails, faxes, fotografi as, artigos e desenhos, sejam for-necidos para publicação ou licenciamento a terceiros de forma mundial não-exclusiva pela Linux New Media do Brasil, a me-nos 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/atendimentoSã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

4 www.linuxmagazine.com.br

ÍND

ICE

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áfi cos do computador.

Face a face 41

Softwares de reconhecimento facial estão se tornando cada vez mais populares, além de mais sofi sticados. Mostramos como usar o software de código livre libface para identifi car 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.

5

REDESAlternativa de peso 58

O iSCSI oferece uma alternativa rápida e fl exível para armazenamento de arquivos em rede. A ferramenta iSCSI permite que você confi gure o armazenamento de arquivos em sua própria rede, sem a necessidade de uso de equipamento ou cabeamento especializado.

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

VoIP com Asterisk – parte IX 70

O sistema telefônico ultrapassado, presente até pouco tempo atrás nas empresas, é prolífi co 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ÇÃOBusca com qualidade 72

Analisamos a ferramenta de indexação Open Search Server e mostramos como integrar o recurso de busca ao seu website utilizando PHP .

SERVIÇOSEditorial 03Emails 06Linux.local 78Preview 82

Linux Magazine #80 | Julho de 2011

| ÍNDICELinux Magazine 80

COLUNASKlaus Knopper 08

Charly Kühnast 10

Zack Brown 12

Augusto Campos 13

Kurt Seifried 16

Alexandre Borges 20

NOTÍCIASGeral 20

➧ Fim do Adobe AIR para Linux

➧ Xen completamente integrado ao Linux

CORPORATENotícias 22

➧ Cisco apresenta novo sistema ASR9000

➧ Red Hat lança soluções para gestão e desenvolvimento de nuvem

➧ eBay adquire Magento

➧ Oracle exige bilhões do Google

➧ Open Virtualization Alliance ganha 65 novos membros

Coluna: Jon “maddog” Hall 24

Coluna: Alexandre Santos 26

ANÁLISELições sobre localização 50

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

O Sentinella automatiza a forma com que o computador monitora problemas com recursos e outros estados de sistema.

6 www.linuxmagazine.com.br

CA

RTA

S

Emails para o editor

Permissão de escrita

sanja

gje

nero

– w

ww

.sxc

.hu

Escreva para nós! ✉ Sempre queremos sua opinião sobre a Linux Magazine e nossos artigos. Envie seus emails para

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

Aplicativo personalizado Olá pessoal, criei uma calculadora utilizando lingua-gem 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, coman-do de execução, ícone, e seção do menu onde o aplicativo deve ser exibido.

No Gnome este arquivo deve fi car no diretório /usr/share/applications/seu_programa.desktop .

Como exemplo, copio abaixo o conteúdo de um ar-quivo /usr/share/applications/gnome-terminal.desktop :

[Desktop Entry]Name=TerminalComment=Use the command lineTryExec=gnome-terminalExec=gnome-terminalIcon=utilities-terminalType=ApplicationX-GNOME-DocPath=gnome-terminal/index.html

X-GNOME-Bugzilla-Bugzilla=GNOMEX-GNOME-Bugzilla-Product=gnome-terminal

X-GNOME-Bugzilla-Component=BugBuddyBugs

X-GNOME-Bugzilla-Version=2.32.0Categories=GNOME;GTK;Utility;TerminalEmulator;

StartupNotify=trueOnlyShowIn=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 .

13Linux Magazine #XX | Mês de 200X

CO

LU

NA

Coluna do Augusto

Bons ventos sopram sobre o Android Novas iniciativas e alternativas estão surgindo no

universo do desenvolvimento Android.

Quem chega ao universo Android interessado no fato de ele ser (em grande parte) um sis-tema de código aberto (e por incluir o kernel

Linux) acaba tendo grande interesse pela possibilidade de modifi car 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, é interessan-te saber que ela está lá e que pode ser aproveitada por outros, de forma que possamos colher os frutos, afi nal, sempre há algum desenvolvedor interessado em adaptar os recursos do sistema, agregar acessórios e ir além das APIs ofi ciais, trocando a compatibilidade por utilidades adicionais e melhor desempenho.

No caso do Android, essa situação poderia ser simbo-lizada pelo CyanogenMod [1] , um fi rmware 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 fi cam de fora nas versões de Android embarcadas nos aparelhos por seus fabricantes e operadoras.

Normalmente, o desenvolvimento deste tipo de al-ternativa 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 pra-ticadas 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 fi nal do primeiro semestre, tivemos duas notícias muito positivas a respeito, in-dicando uma possível mudança de maré entre os fa-bricantes de aparelhos.

A primeira foi da HTC, cujo CEO veio a público agradecer a paciência dos seus usuários e afi rmar 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 difi cultar a instalação de sistemas alternativos.

Logo em seguida, foi noticiado algo ainda mais ex-tremo 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 al-ternativo para o novo smartphone da empresa.

Nada disso garante aproximações ou aberturas defi -nitivas, 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! ■

Augusto Campos é administrador de TI e, desde 1996, mantém o site BR-

linux.org, que cobre a cena do Software Livre no Brasil e no mundo.

Mais informações

[1] CyanogenMod: http://www.cyanogenmod.com/

O CyanogenMod é um fi rmware 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.

18 www.linuxmagazine.com.br

CO

LU

NA

Coluna do Alexandre

Introdução ao udev: controle seus dispositivos Relembre o uso do framework udev.

Nesta coluna (e possivelmente nas próximas), vou relembrar um assunto bastante interes-sante do Linux, mas que, no entanto, é por

muitas vezes esquecido pelos administradores: o fra-mework 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 an-temão qual hardware estaria presente na máquina, a instalação do sistema operacional criava previamen-te dezenas ou centenas de entradas ( block device fi le ou character device fi le ) 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 al-guns 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 de-terminado dispositivo. Explico: arquivos de dispositivos de bloco ( block device fi le ) que referenciam 4 discos

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 fi les , 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 devi-ce ; 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 des-tas 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 fi ca 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 atre-lados 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 desenvolve-dores 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

Listagem 1: ls -l /dev

01 brw -rw– - 1 root disk 8, 1 2011 -06 -12 12:48 sda102 brw -rw– - 1 root disk 8, 2 2011 -06 -12 12:48 sda203 brw -rw– - 1 root disk 8, 5 2011 -06 -12 12:48 sda504 brw -rw– - 1 root disk 7, 0 2011 -06 -12 12:48 loop005 brw -rw– - 1 root disk 7, 1 2011 -06 -12 12:48 loop106 crw - -w– - 1 root tty 4, 10 2011 -06 -12 12:48 tty1007 crw - -w– - 1 root tty 4, 11 2011 -06 -12 12:48 tty11

19Linux Magazine #80 | Julho de 2011

estes hardwares e as suas propriedades no arquivo de sistema ( fi lesystem ) 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 escon-da de ninguém que prefi ro 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:

# 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 verifi car 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 ([email protected], twitter: @ale_sp_brazil) é Es-

pecialista Sênior em Solaris, OpenSolaris e Linux. Trabalha com desen-

volvimento, segurança, administração e análise de desempenho desses

sistemas operacionais, atuando como instrutor e consultor. é pesquisa-

dor de novas tecnologias e assuntos relacionados ao kernel.

27Linux Magazine #80 | Julho de 2011

CA

PA

As novidades do mercado de tecnologia

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 dispo-sitivo lançado ou mesmo através de uma nova tec-

nologia que surge. Os benefi cios 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 profi s-sional 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 fi o 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 empre-sa 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 obsoles-cê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á exis-tem 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 fi zemos quando decidmos agrupar algumas dessas novidades nesta edição da Linux Ma-gazine , 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 desempe-nho e velocidade através de cálculos e scripts específi cos que as tornam mais efi cientes e efi cazes, com o openCL.

Na área de armazenamento e sistemas de arquivos, fa-laremos sobre o iSCSI, que oferece uma alternativa rápida e fl exível para armazenamento de arquivos em rede. A ferramenta permite que você confi gure 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 moder-no 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 sofi sticados. Aprenda como identifi car 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 atu-alizado e boa leitura! ■

Um novo começo para o HTML 28

Acelere ao máximo 34

Face a face 41

ZFS sob o sol 46

Matérias de capa

55

| ANÁLISEMonitoramento de redes e sistemas

Linux Magazine #80 | Julho de 2011

Monitoramento de redes e sistemas

Pequeno soldado O Sentinella automatiza a forma

com que o computador monitora

problemas com recursos e

outros estados de sistema.

Erik Bärwaldt

Ferramentas de monitoramen-to 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 confi gurar 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 determi-nado comando quando um pro-blema ocorre.

A ferramenta de monitoramen-to 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 ge-renciador de pacotes. Se os pacotes binários não estiverem disponíveis

para a sua distribuição, você pode baixar o arquivo do site do proje-to [1] e realizar uma instalação manual. O site tem informações detalhadas sobre como confi gurar a ferramenta.

Caso você não use o desktop KDE, para o qual o Sentinella está otimizado, instalar os arquivos bi-nários normalmente irá instalar o que é necessário para executar o Sentinella no Gnome, Xfce ou LXDE sem sacrifi car 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 fi ca no menu Aplicati-vos/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 seleciona-das ( fi gura 1 ).

As condições que disparam uma ação podem ser defi nidas de forma granular, graças a providenciais caixas de seleção e importação. Em vez de manter confi gurações padrão, você pode adicionar entradas personali-zadas. Dependendo das condições que você aciona, as confi gurações mudarão para refl etir o contexto. As categorias básicas incluem: carga da CPU, utilização de memória, tráfe-go 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 progra-mas. Nesse caso, o Sentinella exibe uma janela listando todos os proces-sos correntes e oferecendo escolhas para a visualização. Por exemplo, se você tem um grande número de pro-

AN

ÁLIS

E

56 www.linuxmagazine.com.br

ANÁLISE | Monitoramento de redes

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áqui-na, colocá -la para dormir ( sleep ) ou tocar um alarme de alerta. Três di-ferentes alarmes estão disponíveis. Um modo muito mais fl exível é executar um comando quando um evento específi co ocorre. Como alternativa, você pode fi nalizar o programa. Nesse caso, você verá novamente uma lista de processos para escolha ( fi gura 2 ).

Após fi nalizar as confi gurações, você pode começar a monitorar o sistema clicando em Start , no centro inferior da tela. A janela se tornará

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 fi nalizar 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 to-mar 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 confi gurado o Sentinella não dani-fi cará 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 percen-tual. Para evitar que o seu compu-tador execute uma ação defi nida antes que ocorra a condição, defi -na o período de tempo no qual a carga fi cará abaixo do limite espe-cifi cado para que o desligamento ocorra. É necessário entrar com um período válido de tempo para

Figura 1: O programa é fácil de usar, graças à sua

interface amigável.

Figura 2: Escolha de um programa ativo na janela de

processos.

Figura 3: O Sentinella pode ajudá -lo a economizar energia. Figura 4: Monitoramento preventivo.

57

| ANÁLISEMonitoramento de redes e sistemas

Linux Magazine #80 | Julho de 2011

que a confi guração seja concluída com sucesso. Abaixo, na janela do programa, habilite a ação Sleep e escolha Suspend ou Hibernate à direita. Certifi que -se de ter espaço em disco sufi ciente 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 identifi car e reportar ano-malias em tempo real. Você pode monitorar a entrada e a saída de da-dos por meio das interfaces ativas de rede. Se os volumes estiverem abai-xo 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 da-dos indesejados e em larga escala ocorressem no ambiente de servi-

dor. Em ambientes heterogêneos, em particular, essa é uma forma efi ciente de identifi car a infl uên-cia de um malware. Para esse tipo de monitoramento, simplesmente marque a opção Network traffi c , de-fi na 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 di-reito da janela ( fi gura 4 ).

Conclusão O software Sentinella assume a res-ponsabilidade de monitorar várias tarefas em um sistema e responde com ações predefi nidas quando cer-tos estados de sistema ocorrem. A ferramenta é fácil e intuitiva para instalar; no entanto, os usuários correm riscos. Por exemplo, o sof-tware não mostra uma mensagem de alerta quando um estado de

sistema defi nido ocorre antes do desligamento ou da execução da ação defi nida. O risco de perda de dados é real. Antes de implantar o programa, você deve considerar cuidadosamente quais ações são signifi cativas no contexto de estados específi cos do sistema. ■

Mais informações

[1] Sentinella: http://sourceforge.net/projects/sentinella

Gostou do artigo?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

http://lnm.com.br/article/5472

zine

so s

ua opin

om.b

go?o.

63

| TUTORIALApache Jena

Linux Magazine #80 | Julho de 2011

Apache Jena

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 Fa-cebook, dados científi cos 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 fi nais, com re-cursos 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 sim-ples análise de arquivos com valores separados por vírgulas (CSV) em pla-nilhas de dados, consulta em bancos de dados relacionais, chegando a fer-ramentas de larga escala e distribuídas de análise de informações na nuvem.

Como cada técnica possui vanta-gens e desvantagens, e ao invés de

fazer um levantamento completo de todas elas, vamos focar apenas em dados semânticos vinculados, mais especifi camente na plataforma Jena.

A web semântica Não por acaso, as técnicas e ideias da web semântica acabaram ganhando uma reputação de complexidade e difi culdade. O modelo de XML pa-drão do RDF ( Resource Description Framework ) é grosseiro, razão pela qual modelar o mundo real pode revelar nu-ances confl ituosas. No entanto, em seu núcleo estão duas ideias importantes. A primeira é a de que estruturas ricas e expressivas de dados, descrevendo in-formações sobre determinado assunto, podem ser construídas a partir de um conjunto de informações simples so-bre 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 identifi cador para o artigo que você está lendo é artigo123 (voltaremos a isso em breve); então, a sentença “Ian

é autor do artigo123, sobre Jena” po-deria ser escrito com a seguinte linha de código, podendo ser representado grafi camente como na fi gura 1 .

<ian> <autor-do> <artigo123>.<artigo123> <tem-o-assunto> “Jena”.

Matematicamente, a estrutura exem-plifi cada na fi gura é um gráfi co dire-cionado , que rotula os dois nós e suas extremidades. Para ser simples, irei me referir a ele apenas como um gráfi co . 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 impor-tantes é o nome das coisas que não são valores, que é representado por URIs. Um URI ( Uniform Resource Identifi er , ou Identifi cador de Recursos Uniforme) refere-se a um conjunto de identifi cadores defi nidos pela RFC 2396. O mais importante desse con-junto é que ele inclui identifi cadores http:// para websites familiares. O uso de URIs por identifi cadores tem duas consequências importantes: primei-ro, todos os identifi cadores formam efi cazmente um grande namespace , minimizando as chances de usar aci-dentalmente um mesmo nome para Figura 1: Uma representação gráfi ca da sentença.

TU

TO

RIA

L

64 www.linuxmagazine.com.br

TUTORIAL | Apache Jena

se referir a coisas diferentes. Segun-do, 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 identifi cado.

Além das consequências óbvias de ter o signifi cado, ou a semântica, declarado explicitamente, isso signi-fi ca também que o responsável pela manutenção do domínio web que hospeda o identifi cador tem alguma autoridade sobre o uso ou signifi ca-do pretendido do termo. Além dis-so, qualquer um pode reutilizar um termo publicado em um domínio. Aliás, a web semântica acaba enco-rajando esse tipo de ação. No entan-to, somente pessoas com direitos de

escrita direta sobre aquele domínio podem atualizar o signifi cado mais diretamente associado aos termos.

Então, para atualizar o exemplo com o uso de URIs, precisamos considerar quais identifi cadores 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 conhe-cidos”, 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 rascu-nho. Imagine portanto o URI padrão http://epimorphics.com/documents/draft#jena-1 . O URI para dar cré-

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á sufi ciente. Com essas mudanças, o exemplo fi ca 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 tecno-logias de web semântica: linguagens de consulta, armazenamento persis-tente, vocabulários específi cos e assim por diante. Para focar na prática, no entanto, falareremos apenas sobre como os triples podem ser manipu-lados 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 pes-quisadores 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 dei-xou a HP e, em 2009, o Jena se tornou um projeto incubado na Apache [4] .

Ao invés de listar os recursos téc-nicos 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áfi co descrito previamente é gerenciado no código Jena como um

Listagem 1: Código gerado pelo Schemagen no Doap.Java01 /** 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 TDB04 FileUtils.deleteQuietly( getTDBFile() );05 FileUtils.forceMkdir( getTDBFile() );06 Dataset dataset = TDBFactory.createDataset( getTdbLocation() );0708 // o nome do projeto é um argumento requisitado09 String projectName = getArgs()[0];10 String projectURI = projectNamespace() + projectName;11 Resource project = dataset.getDefaultModel(). createResource( projectURI );

1213 project.addProperty( RDF.type, DOAP.Project );14 project.addProperty( DOAP.name, projectName );1516 // adicione descrições a partir de opções de linhas de comando

17 addOptionalProperty( project, DOAP.shortdesc, "s" );18 addOptionalProperty( project, DOAP.description, "d" );1920 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 }

65

| TUTORIALApache Jena

Linux Magazine #80 | Julho de 2011

objeto Model . O objeto é, nos termos do Java, uma interface ou especifi cação abs-trata 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áfi co 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 compar-tilhar detalhes com outros desenvol-vedores de código aberto, como, por

exemplo, o nome do projeto, a locali-zaçã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 arqui-vos 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 arqui-vos 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 proje-to em particular; assim, eu presumirei

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 ar-mazenar 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 sim-ples arquivo RDF. No entanto, como meu o objetivo é ilustrar os vários recur-sos 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 arma-zenar um grande números de triples com efi ciê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 tor-na bem direta a tarefa de atualizar o banco de dados persistente.

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 combinado02 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();

0506 // poderíamos ser mais sofisticados sobre a proveniência dos recursos07 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 }

Quadro 1: Teste o código Para o projeto, você precisará de

um compilador Java que suporte

Java 1.6. Eu estou usando tam-

bém o Maven para gerenciar o

Jena e outras bibliotecas depen-

dentes. Então, você precisará da

versão mais recente do mvn. Final-

mente, 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 proje-

to, lista as dependências de soft-

ware. O Maven instalará todos au-

tomaticamente como necessário.

Para clonar o projeto do repositório

Git, use o seguinte comando:

git clone [email protected]: epimorphics/epimorphics-open/jena-plb-tutorial.git

66 www.linuxmagazine.com.br

TUTORIAL | Apache Jena

Início do projeto O problema tem quatro componen-tes: inicializar o projeto, atualizar a descrição DOAP manualmente, au-mentar a descrição automaticamen-te e reportar o perfi l 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 armazenamen-to) e adicionar um recurso root para representar o projeto DOAP que es-tou descrevendo. Criar um elemen-to 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 especifi camente no diretório TDB.

Dataset dataset = TDBFactory. createDataset( getTdbLocation() );

Criar o recurso root para o projeto é conceitualmente simples: é preciso so-mente 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://usefu-linc.com/ns/doap# , enquanto Project é o nome de uma classe RDFS. Matemati-camente, 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, é interes-sante 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 par-ticular, à 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,

um recurso pode ser membro de mui-tas 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 assun-to, 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á defi nido como constante. Embora seja possível escrever manualmente a declaração de uma constante no códi-go, correríamos o risco de fazer erros de transcrição e criar problemas de manu-tenção com a mudança de esquema.

Felizmente, o Jena oferece uma ferramenta que gera um código Java automaticamente a partir de um ar-quivo RDFS, o schemagen . A classe Java gerada defi ne constantes para cada uma das classes, propriedades e recursos in-

dividuais defi nidos no arquivo. A ferra-menta 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 dife-rentes utilizadas pelo DOAP. Assim, eu quero que meus usuários possam adicionar informações de forma in-cremental. 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 combinado02 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();

0506 // poderíamos ser mais sofisticados sobre a proveniência dos recursos07 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 consulta03 Query query = QueryFactory.create( queryString ) ;04 // vincule ao modelo05 QueryExecution qexec = QueryExecutionFactory.create( query, collected );

06 // faça a consulta07 dev.getModel().add( qexec.execDescribe() );

67

| TUTORIALApache Jena

Linux Magazine #80 | Julho de 2011

sentada aos usuários. Como não há modelo de dados fi xo, o RDF permite que qualquer predicado seja anexado a qualquer recurso, algumas vezes de-clarado como “qualquer um pode dizer qualquer coisa sobre qualquer coisa”.

Esse modelo pode ser muito pode-roso, mas tanta abertura pode difi cul-tar 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 namespa-ce. Os usuários digitarão algo como:

$> plb set language Java$> plb set -r release 1.0.1

Esses dois comandos adicio-nam valores para doap:language e doap:release ; a bandeira -r substi-tui um valor existente armazenado.

O código RDF específi co 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 defi niçã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 pergun-tar ao Resource pelos seus triples re-lacionados, ou seja, pergunto se um determinado URI corresponde ao recurso com um rdf:type em parti-cular (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 addPro-perty . Já que eu optei por usar um modelo baseado em TDB persistente, eu não preciso fazer uma chamada separada para salvar os triples atua-lizados 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 arma-zenagem triple, defi ni 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 desenvol-vedores. 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 fi el 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 gerencia-mento de recursos, posso listar todos eles facilmente. Nesse tutorial, vou presumir que o código é gerenciado por um repositório Git. Algum pro-cessamento 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 vo-cabulário RDF usado amplamen-te. 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: [email protected] " | < http://www.iandickinson.me.uk > |07 | plb:plb | "mailto: [email protected] " | < http://www.iandickinson.me.uk > |08 --------------------------------------------------------------------------------

Listagem 7: Listar todas as propriedades do projeto 01 $ tdbquery --loc=.plb/tdb "$sp select ?p ?o where {?proj a plb:root . ?proj ?p ?o} order by ?p"02 ----------------------------------------------------------------------------------------03 | p | o |04 ========================================================================================05 | doap:description | "A Jena tutorial showing how to create DOAP project descriptions" |06 | doap:developer | < http://www.iandickinson.me.uk/rdf/foaf#ian > |07 | doap:name | "plb" |08 | doap:shortdesc | "Jena PLB tutorial" |09 | rdf:type | doap:Project |10 ----------------------------------------------------------------------------------------

68 www.linuxmagazine.com.br

TUTORIAL | Apache Jena

websites, detalhes de contato, in-teresses e amigos que conhecem por referência de perfi s de outros amigos. A princípio, eu poderia usar esses detalhes do log inicial para procurar informações públicas dos membros e adicionar automa-ticamente 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, preci-samos buscar pela soma SHA1 dos endereços de e-mail dos meus de-senvolvedores. 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 armazena-gens triple RDF e é totalmente su-portada pelo Jena. Ela tem quatro verbos de consulta:

➧ select : entrega linha de valores correspondentes, semelhante às ar-mazenagens relacionais SQL;

➧ ask : confi rma se um padrão de consulta pode ser correspondido;

➧ construct : cria um novo gráfi co com o uso de templates e padrões e consultas;

➧ describe : transfere a responsa-bilidade de retornar uma descrição útil de um recurso para um servidor, suportando especifi camente o caso no qual o cliente não sabe a estrutu-ra do gráfi co contendo um recurso em particular.

Tipicamente, o servidor retorna algum tipo de descrição vinculada [9] .

O ponto chave, aqui, é que o clien-te – meu programa – não sabe os es-quemas 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 algo-ritmo, é que, no momento da escrita, um serviço disponível publicamente que agregava dados FOAF de múl-tiplos pontos de publicação fi cou 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 gerencia-mento, 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 en-dereç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 identi-dades dos desenvolvedores, apenas um dos endereços de e-mail, que recurso URI deve ser usado para denotar cada desenvolvedor? Eu poderia criar um identifi cador, porém o RDF também permite um tipo especial de recurso chamado recurso anônimo ( anonymous resource ). Esse recurso age como qual-quer outro, exceto pelo fato de não ter identidade conhecida. Por razões his-tóricas, é normalmente chamado de bNode , que pode ser usado como um alocador de recurso, sobre o qual co-nheç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 infor-maçõ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 si-nal 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 men-cionam 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.

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

mandos diferentes. Veja o exemplo:

plb init test-project

O script Bash plb chama um pro-

grama Java para desempenhar o

comando predefi nido 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 cami-

nho da classe, o script empacotador

executa o programa com mvn:exec , que, por sua vez, executa um pro-

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

69

| TUTORIALApache Jena

Linux Magazine #80 | Julho de 2011

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 documen-tos 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 mui-tas informações da web. O modelo inclui uma série de fontes denotan-do a mesma pessoa, alguma delas sendo bNodes; e eu gostaria de sim-plifi car o gráfi co, 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 resulta-dos 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 coman-do tdbquery está disponível na insta-laçã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 intro-duzir os recursos Jena para uma tarefa prática. Não pretendo, com isso, ofe-recer a melhor forma de gerar perfi s DOAP. Na verdade, o plugin Maven

faz esse trabalho. No entanto, a combi-nação de um formato fl exí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. ■

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/

Gostou do artigo?

Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

http://lnm.com.br/article/5494

osso

br/art

m

gazine.com

te:

/549

tigo?

ua opinião.

br

70

TU

TO

RIA

L

www.linuxmagazine.com.br

TUTORIAL | VoIP com Asterisk - parte IX

Asterisk descomplicado

VoIP com Asterisk – parte IX

O sistema telefônico ultrapassado, presente até pouco tempo atrás nas empresas, é prolífi co

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

Na edição 79 da Linux Maga-zine , você aprendeu sobre como provisionar suas exten-

sões através de DHCP, recursos de lista telefônica e redirecionamento de cha-madas. Nesta edição, vamos abordar o provisionamento de ramais via DHCP, para implantação em massa de ramais com um único arquivo de confi gura-ção. Vamos ver ainda como trabalhar com agenda telefônica. Mãos a obra!

Provisionamento por DHCP A implantação de ramais em massa, é defi nida como um processo onde vários telefones equipados com uma única confi guração passam a funcionar automaticamente. O software Amoo-ma 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 confi gu-ração. Um exemplo de confi guraçã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

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 confi guraçã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 en-dereço MAC do aparelho de “boo-tfi le-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 ; Chamar o ramal 1234567 03 ;–––––––––––-04 exten => 1234567,1,Verbose(${CALLERID(num)})05 exten => 1234567,n,GOToIf($[“${CALLINGPRES}”=”35”]?abuse1|1)06 exten => 1234567,n,Dial(SIP/1001,30)07 exten => 1234567,n,Playback(local/ed-greeting)08 exten => 1234567,n,VoiceMail(1001@default)09 exten => 1234567,n,Hangup()10 ;–––––––––––-11 ; Tratamento de chamadas anônimas12 ; Local dos arquivos de áudio abaixo13 ; /var/lib/asterisk/sounds/local14 ;–––––––––––-15 exten => abuse1,1,Answer16 exten => abuse1,n,Wait(1)17 exten => abuse1,n,Monitor()18 exten => abuse1,n,Playback(local/ed-greeting_offenders)19 exten => abuse1,n,WaitForSilence(500)20 exten => abuse1,n,Playback(local/ed-ola)21 exten => abuse1,n,WaitForSilence(500)22 exten => abuse1,n,Playback(local/ed-assinatura_nao_reconhecida)23 exten => abuse1,n,WaitForSilence(1200)24 exten =>25 abuse1,n,Playback(local/ed-entao_o_que_posso_fazer_por_voces)26 exten => abuse1,n,WaitForSilence(1000)27 exten =>28 abuse1,n,Playback(local/ed-o_que_especificamente)29 exten => abuse1,n,WaitForSilence(2000)30 exten => abuse1,n,Wait(1)31 exten => abuse1,n,Playback(local/ed-numero_restrito)32 exten =>33 abuse1,n,Playback(local/ed-infelizmente_sou_apenas_um_computador)34 exten => abuse1,n,StopMonitor()35 exten => abuse1,n,VoiceMail(1001@default)36 exten => abuse1,n,Hangup

71

| TUTORIALVoIP com Asterisk - parte IX

Linux Magazine #80 | Julho de 2011

o dispositivo MAC irá receber um cabeçalho HTTP com um nome, como por exemplo, “Snom 370”.

Um script PHP chamado gera a confi guração ao iniciar. A confi gura-ção para cada fabricante é diferente, com um telefone Snom em um caso simples como na listagem 2 você pode transformar qualquer extensão e per-sonalizar as teclas do telefone. Com o Comunidade também é possível confi gurar os botões em uma interface web ( fi gura 1 ). Já os telefones Aastra permitem que você selecione uma va-riedade de confi gurações do servidor de provisionamento – os telefones Snom tem muito a melhorar neste quesito.

Releitura da confi guração A maneira mais fácil de confi gurar um telefone Snom novo, é realizan-do 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 servi-dor Snom local (o do próprio aparelho) está habilitado e que não há nenhu-ma proteção por senha. Mas, se uma senha estiver confi gurada, informe-a no comando wget . Após a reinicializa-ção do aparelho, a nova confi guração do servidor de provisionamento do aparelho será lida. Alternativamente,

você pode enviar a confi guração e efetuar o reinício do aparelho através de um dispositivo SIP Notify persona-lizado, como o arquivo /etc/asterisk/sip_notify.conf ilustrado a seguir: [snom-check-cfg]Event=>check-sync;reboot=falseContent-Length=>0[snom-reboot]Event=>rebootContent-Length=>0

Agora digite o comando sip notify snom-check-cfg 1234 no terminal, para carregar a nova confi guraçã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 ( fi gura 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 confi guradas através da interface web ou um código de serviço no telefone.

Na próxima edição da Linux Ma-gazine , na última parte deste tutorial, você irá aprender como trabalhar com scripts automatizados. Até lá! ■

Listagem 2: Confi guração do telefone Snom 01 language: English02 time_24_format: on03 date_us_format: off04 user_host1: 192.168.1.13005 user_name1: 123406 user_pname1: 123407 user_pass1: Sippasswort08 user_realname1: Paula Plauder09 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?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

http://lnm.com.br/article/5515

osso

br/art

m

azine.com.

e:

551

tigo?pinião.

Figura 1: Agenda de telefones do software Comunidade.

Figura 2: O Snom 370 mostra a agenda de contatos

usando o navegador XML do servidor Asterisk.

72 www.linuxmagazine.com.br

PROGRAMAÇÃO | Open Search Server

Servidor de busca aberto

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 aborreci-mentos. Mas também há uma quantide de recursos impressionantes.

Indexação livre De acordo com seu fornecedor, o Open Search Server (OSS) vai “vas-culhar 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 ( fi gura 1 ).

O alicerce da ferramenta é o Java em um servidor Tomcat [2] . O meca-nismo de busca Lucene [3] permite que administradores e desenvolvedores usem sua sintaxe de interpretador de consultas e funções de classifi cação fora do gerenciamento da interface ( qua-dro 1 ). O OSS depende do Quartz [4] como agendador. A interface, rápida e

fl exível, é implementada em Zkoss [5] e funciona com qualquer navegador compatível com Ajax.

Suporte corporativo Além da variante livre, lançada sob mui-tas 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 re-curso avançado na forma de módulos instaláveis. O fornecedor também ofe-rece 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 servi-dor web e execute start.sh no shell ( start.bat no Windows). São neces-sários um servidor de web em fun-cionamento com PHP5, php5-curl e Java Runtime Environment .

O pacote não inclui um script init ; se você deseja executar o servidor per-manentemente, é 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.

PR

OG

RA

MA

ÇÃ

O

Figura 1 Lucene, Tomcat e uma API fl exível combinados no Open Research Server.

73

| PROGRAMAÇÃOOpen Search Server

Linux Magazine #80 | Julho de 2011

Primeiro contato A pasta apache-tomcat-6.0.32 no pacote compactado contém alguns caracte-res familiares: o aplicativo do servidor Tomcat vem pré-confi gurado com seus binários, arquivos de log e de confi guraçã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 fi cam no diretório data, onde você também encontrará um subdiretório com a confi guraçã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 fi rewall para evitar acessos não autorizados e deixá-la dis-ponível apenas para serviços locais. Se você usar seu nvegador para acessar a URL http://localhost:8080// , será levado à interface de gerenciamen-to, 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 car-regado o índice, marcações de tempo são adicionadas ao menu do OSS, como na fi gura 2 .

A falta de documentação pode fazer com que as abas, opções de confi gura-ção e itens secundários sejam um pou-co 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ífi cos permitam a conclusão de que sites idênticos existem.

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 fi elds (também presente na Query tab ) defi ne o formato de saída. Você pode defi nir os campos e seus

Quadro 1: Lucene O coração de qualquer mecanismo de busca moderno é o indexador. O in-

dexador escalonável criado usando a biblioteca livre do Lucene Java traba-

lha bem se comparado com mecanismos de busca comerciais.

Analisador, Indexador e Fields O princípio fundamental é simples: um analisador separa um documento e dis-

tribui os metadados deste e componentes de texto por campos predefi nidos.

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

duzido 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 arrisca-

da 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, en-

quanto 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 re-

alizar buscas com coringas ou tolerantes a erros. O objetivo aqui é não apenas

encontrar resultados com prefi xo idêntico (como em SQL com ‘Linux Mag%’ ), mas também com grafi as diferentes. Graças ao método Levenshtein Distance ,

você pode defi nir sua própria sintaxe para descobrir todas as variáveis ortográfi -

cas 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 proxi-

midade ( ~ ) 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 le-

vantamento de campos, isso signifi ca 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 in-

dexador do Lucene inclui um grande número de ferramentas para lidar com isso.

74 www.linuxmagazine.com.br

PROGRAMAÇÃO | Open Search Server

tamanhos aqui e, então, confi gurar a lista de resultados.

A aba Crawler é onde você es-pecifi ca o alvo de sua busca: web-sites, bancos de dados ou sistemas de arquivos. Vários fi ltros estão dis-poníveis para auxiliá-lo a modifi car isso. A fi gura 2 mostra a subjanela do Crawl process para uma máquina que está indexando o site inteiro da Linux Magazine.

Uma das confi guraçõ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 ser-vidor 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 índi-ce. Se você confi gurar este valor muito alto, usará memória RAM demais ou

possivelmente verá a mensagem de erro ilustrada na fi gura 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, certifi que-se de que tenha memória sufi ciente em seu sis-tema. Para alocar 2 GB de RAM no Java Virtual Machine, você simples-mente 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

Ferramentas de monitoramento, tais como Darkstat [7] , nos repositó-rios Debian, monitoram o tráfego que isso cria ao mesmo tempo ( fi gura 4 ).

Alguns fi rewalls ou servidores web classifi cam ondas de consultas muito frequentes como um ataque de negação de serviço (DoS) e blo-queiam o cliente.

De acordo com o fornecedor, o OSS é capaz de indexar 16 lingua-gens; pode identifi car palavas intei-ras, fragmentos, ou variantes de uma forma básica (radical [8] ). A lista dos formatos de documentos inclui XML, HTML/XHTML, PDF, Microsoft Word, PowerPoint, OpenOffi ce.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

Listagem 1: Consulta OSS 01 title:($$)^10 OR title:("$$")^1002 OR03 titleExact:($$)^10 OR titleExact:("$$")^1004 OR url:($$)^5 OR05 url:("$$")^506 OR urlSplit:($$)^5 OR urlSplit:("$$")^507 OR08 urlExact:($$)^509 OR urlExact:("$$")^510 OR content:($$) OR11 content:("$$")12 OR13 contentExact:($$) OR contentExact:("$$")

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.

75

| PROGRAMAÇÃOOpen Search Server

Linux Magazine #80 | Julho de 2011

PHP. A interface de gerenciamento também oferece uma tela de entra-da em Query/Edit/Query , que pode ser usada para buscas no índice. A listagem 1 mostra as especifi cações padrão para a versão anterior, mas que também funciona na 1.2 e é facil-mente extensível. A chave de busca é representada por $$; ̂ seguido de um número que defi ne o peso; pala-vras-chave como title ou urlSplit defi nem 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-sear-ch-server.com para a forma normali-zada 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 de-senvolvedores, o OSS usa diferentes analisadores para tal: o analisador de texto identifi ca grafi as 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 comen-tários a respeito do índice, do cache e dos estágios do sistema. O OSS é também bem equipado para confi gu-raçõ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-sear-ch-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-

ciona uma busca funcional de ponta a ponta, pelo menos parcialmente. Isso porque houve um lado negati-vo: a interface tem problemas com acentuação em alguns idiomas e não é completamente capaz de imple-mentar os parâmetros da linguagem de buscas Lucene. Realizar consul-ta na interface gráfi ca é melhor na maioria das vezes, mas não em todos os casos ( fi gura5 ).

Recomenda-se a API XML. De-senvolvedores podem usá-la para buscas no índice – em quase qual-quer linguagem de programação – e mostrar os resultados. Tudo o que você precisa fazer é adi-cionar os parâmetros necessários nos requerimentos corresponden-tes 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

contendo as combinações junto com a prévia do texto correspondente (ou snippets ). Em outras palavra, como um programador, você somente pre-cisa do seguinte:

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 confi guração.

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.

76 www.linuxmagazine.com.br

PROGRAMAÇÃO | Open Search Server

fi ltrar 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 re-tornado 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

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 autoritati-vo é livremente selecionável; este poderia ser o host ou o título da página. Usando esta abordagem, você pode ter associações seme-lhantes nos resultados até o usuá-rio clicar novamente, melhorando assim a legibilidade.

Na listagem 2 , este processo acon-tece da linha 9 à 11 . No modo clus-ter , a conta máxima é apenas 1 ; en-tretanto, você não pode omitir este parâmetro. A linha 21 fi nalmente concatena os parâmetros da busca com a URL do host e codifi ca 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 do-cumento XML como o mostrado na listagem 3 .

Os resultados fi nais estão dispo-níveis como doc in result , que in-terage com um loop foreach ($hits ->result->doc as $doc) para cada item. Os dois arquivos modelo PHP da Linux Magazine Online [9] tam-bém suportam as características do Lucene, incluindo a aplicação de buscas com coringas como com o caractere ~ , o que antes causava problemas ( fi gura 5 ).

Novidades na versão 1.2 e previsões A versão 1.2 apresenta diversas ca-racterísticas dignas de aplausos. O buscador web agora diz a você quando ele atualizou a página no índice, usa chaves únicas para lem-brar páginas idênticas e permite que você ignore arquivos robots.txt . O banco de dados do craw-ler também entende buscas SQL; você pode desabilitar tanto listas de padrões como de exclusão, e as

Listagem 2: build-query.php

01 function build_query($q){02 $params=array(); // todos os parâmetros são adicionados aqui e03 // são removidas as tags04 $this->q=substr(trim(strip_tags($q),0,80));05 // basic parameters06 $params[‘use']='myIndex'; // índice utilizado07 $params[‘qt']='search'; // Query Template 08 // Collapsing09 $params[‘collapse.mode']='cluster';10 $params[‘collapse.field']='host';11 $params[‘collapse.max']=1;12 // Pagination13 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 busca17 $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 }

Figura 6 Versões futuras incluem a função screenshot.

77

| PROGRAMAÇÃOOpen Search Server

Linux Magazine #80 | Julho de 2011

análises identifi cam documentos similares com mais confi abilidade.

A tag modified é ainda um pro-blema bastante substancial. No mo-mento, ela detecta se a página foi modifi cada, mas não detecta se so-mente a publicidade da página foi substituída ou se o conteúdo em si foi modifi cado 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 pro-gresso em relação a muitas caracte-rísticas: de acordo com o desenvol-vedor 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 rende-rização. ( fi guras 6 e 7 )

O OSS ainda não é perfeito, mas defi nitivamente está no caminho certo. E é rápido: quando execu-tado em um desktop, respondeu a uma consulta de 25.000 páginas do índice do site da Linux Magazine surpreendentemente rápido. Pou-quíssimas vezes levou mais de meio segundo, como confi rmado pelos nossos testes com centenas de URLs escolhidas aleatoriamente. ■

Gostou do artigo?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

http://lnm.com.br/article/5499

sso

br/art

m

gazine.co

te:

/549

sua opinião.

br

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

[5] Zkoss: http://www.zkoss.org/product/zk.dsp

[6] Wiki OSS: http://www.open -search-server.com/wiki/en/index.php/Main_Page

[7] Darkstat: http://dmr.ath.cx/net/darkstat/

[8] Lemma: http://en.wikipedia.org/wiki/Lemma_ (linguistics)

[9] Scripts PHP: http://www.linuxmagazine.com.br/issues/80/OSS.zip

Figura 7 Futuras versões incluem uma extensão de renderização.

82 www.linuxmagazine.com.br

Linux Magazine #81

PR

EVIE

W

Ubuntu User #22

Admin Magazine #3

IPv6Na 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, du-rante 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 11.04O novo Ubuntu 11.04, codinome “Natty Narwhal”, está saindo do forno. Muitas mudanças são espe-radas 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!

Conexão SeguraQuem precisa conectar computadores com sis-temas 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 fi rewall como os da Cisco, Juniper ou Checkpoint.