Linux Magazine Community Edition 89

30

Transcript of Linux Magazine Community Edition 89

Page 2: Linux Magazine Community Edition 89

3Linux Magazine #89 | Abril de 2012

ED

ITO

RIA

L

Gerar valor em tempos de Internet criando soluções passa inevitavel-mente pela consolidação de informações e o seu fornecimento em tempo real aos usuários, de modo que ele disponha dos dados de que necessita na hora certa. Esse é um desejo que povoa o imaginário coletivo desde muito antes de Gene Roddenberry (1921 – 1991) criar o seriado Jornada nas Estrelas, com seu computador onisciente, que está sempre de pron-tidão, “escutando” e preparado para responder a qualquer comando imediatamente. Não é de hoje, inclusive, que sabemos que não somente a referida série estadunidense como também o pensamento de diversos autores de fi cção científi ca, gênero historicamente criado pelo francês Júlio Verne (1828 – 1905), passando pelo britânico Arthur C. Clarke (1917 – 2008) e pelo russo Isaac Asimov (1920 – 1992), infl uenciaram a invenção de incontáveis sistemas e gadgets que hoje fazem parte da nossa realidade.

O “laboratório secreto” do Google, alcunhado pela empresa de Google X, foi recentemente autor da mais recente iniciativa para transformar em realidade esse objeto de desejo da humanidade de tornar a realidade aumen-tada parte integrante de nossas vidas: o projeto Glass. O dispositivo-conceito, um óculos equipado com sistema operacional Android e aplicativos que combinam comandos de voz e sistema de aquisição de dados geoposicio-nado, interações com mensagens instantâneas e redes sociais, um guia de rota em tempo real, compras orientadas e vídeo conferência, permite que o usuário execute uma grande quantidade de tarefas, se comunique com outros usuários e obtenha informações de diversas fontes ao mesmo tem-po, tudo isso usando apenas uma pequena tela de vidro próxima ao olho.

É claro que o motivo que nos leva a citar essa nova iniciativa do Google é o fato de que a base de todo esse aparato tecnológico é Open Source. En-tretanto, essa base de tecnologia não equipa somente as inovações dignas de fi cção científi ca do Google. Em uma pesquisa recente, a Linux Founda-tion auferiu que atualmente mais de 850.000 smartphones equipados com Android são ativados todos os dias. Além disso, aproximadamente 700.000 televisores inteligentes são vendidos diariamente, a grande maioria deles equipados com Linux. 80% das bolsas de valores existentes no mundo têm seus sistemas de controle de transações funcionando sobre servidores Linux, e 9 dos 10 maiores supercomputadores do mundo são equipados com o sistema do pinguim. Assim, o Linux se transformou no maior projeto de desenvolvimento colaborativo da história da computação, resultando em um sistema operacional com nada menos que 15 milhões de linhas de código, com aproximadamente 10.000 modifi cações sendo realizadas no sistema a cada nova versão, lançadas em intervalos de dois ou três meses. O Linux é o sistema operacional dominante nos dispositivos móveis, no ambiente corporativo, em infraestrutura de Internet, em data centers, nos supercomputadores e em diversas outras áreas com as quais você tem con-tato todos os dias. E a Red Hat, um dos maiores fornecedores de tecnologia Linux e Open Souce do mundo, fundada em 1993, acabou de fechar o seu primeiro ano fi scal com mais de um bilhão de dólares de faturamento.

Gerar valor em tecnologia nunca foi tão fácil. Se você tiver a ideia, o Linux vai ajudá-lo a transformá-la em realidade. E rápido... ■

Rafael Peregrino da SilvaDiretor de Redação

PanoramaExpediente editorialDiretor 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]

ColaboradoresAlessandro de Oliveira Faria, Alexandre Borges, Alexandre Santos, Augusto Campos, Charly Kühnast, James Stanger, Jan Seidl, Jon ‘maddog’ Hall, Juliet Kemp, Klaus Knopper, Kristian Kißling, Kurt Seifried, Marta Vuelma, Ralf Spenneberg, Tim Schürmann, Wolfgang Mauerer, Zack Brown.

Tradução Jefferson Prestes, Luciano Hagge Dias, Rodrigo

Garcia, Sebastião Luiz da Silva Guerra

Revisão Cristiana Ferraz Coimbra.

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 - 2012:Linux New Media do Brasil Editora Ltda.Impressão e Acabamento: IBEP Gráfi ca.

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

Page 3: Linux Magazine Community Edition 89

4 www.linuxmagazine.com.br

CAPA

Servidores com sabres de luz 27

Pode se dizer que a blindagem de servidores é a “técnica Jedi” para administradores de rede. Você está preparado para utilizar a força a seu favor?

Blindagem com metais nobres 28

Você sabe quais são as melhores práticas para aumentar ou melhorar a segurança dos seus servidores?

Destruidores 32

A exclusão de dados de forma segura é um assunto importante, mas muitas vezes negligenciado pela infraestrutura de segurança. Vamos mostrar algumas ferramentas populares para garantir que os dados excluídos realmente se foram.

O vigilante 40

O Suricata é uma ferramenta livre para detecção de invasão em parte patrocinada pelo Departamento de Segurança Interna dos Estados Unidos. Ela usa o CUDA (da NVidia) para aproveitar o poder da GPU e assim trabalhar com dados que entram em redes de alta velocidade.

Você tem proteção? 44

Você já pode ter tentado usar a chave pública de criptografi a PGP /GPG para seus documentos e emails, mas sabe o que ocorre por debaixo dos panos e qual o nível de segurança que ela apresenta atualmente? Examinaremos em detalhes a criptografi a GnuPG.

ÍND

ICE

© z

hev

- Fo

tolia

.com

Page 4: Linux Magazine Community Edition 89

5

TUTORIALCurvas elegantes 72

Adicionar gráfi cos informativos e atrativos aos seu trabalhos normalmente exige uma boa quantidade de paciência. A ferramenta ggplot2 proporciona estrutura para gráfi cos e simplifi ca a vida dos usuários.

ANÁLISEVisão computacional para todos 58

Aprenda como obter desempenho e precisão através do uso de todos os recursos disponíveis em sua infraestrutura.

Verifi cação de fl uxo 66

O UPnP e o DLNA prometem streaming de conteúdo multimídia sem complicações em redes domésticas, mas o mundo real nunca está livre de complicações.

SERVIÇOSEditorial 03

Emails 06

Linux.local 78

Preview 82

Linux Magazine #89 | Abril de 2012

| ÍNDICELinux Magazine 89

COLUNASCharly Kühnast 07

Klaus Knopper 08

Augusto Campos 10

Alexandre Borges 12

Kurt Seifried 14

Zack Brown 16

NOTÍCIASGeral 20

➧ Rackspace abre seu framework de testes

➧ Sony disponibiliza código-fonte para o Xperia S

➧ HP libera o código-fonte do webOS 3.0.5

➧ Hyper-V no OpenNebula

➧ GTK+ 3.4 com suporte a multitoque e Windows

CORPORATENotícias 22

➧ D-Link traz conceito de computação em nuvem para seus produtos

➧ Dell compra a SonicWALL

➧ IBM investe R$ 40 milhões para trazer nuvem pública corporativa ao Brasil

➧ Ubuntu ultrapassa o Red Hat Enterprise Linux

Coluna: Jon “maddog” Hall 24

Coluna: Alexandre Santos 26

ANDROIDLei e ordem 50

O Android tem por premissa manter os usuários longe de aplicativos espaçosos e folgados, que demandam permissão total do dispositivo. Mesmo assim, durante a instalação, muitos deles pedem que você baixe a guarda. Será que você deve permitir isso?

Page 5: Linux Magazine Community Edition 89

10

CO

LU

NA

www.linuxmagazine.com.br

Coluna do Augusto

Linux From ScratchProjeto ensina como criar seu próprio sistema Linux

a partir do código fonte de seus componentes.

O mês de março testemunhou o lançamento da versão 7.1 do Linux From Scratch [1], um projeto muitas vezes mal compreendido, mas

cujo bom uso pode valer muito mais do que muitos dos treinamentos existentes para compreender o funciona-mento interno de uma distribuição Linux qualquer.

Ao contrário do que muitos imaginam à primeira vis-ta, porém, o Linux From Scratch não é propriamente uma distribuição Linux. É um livro (de autoria de Ge-rard Beekmans) que explica detalhadamente e passo a passo como criar seu próprio sistema Linux a partir do código fonte de todos seus componentes.

Para algumas pessoas, em casos raros, a construção de um sistema Linux assim pode até ter utilidade prática diretamente. Mas creio ser possível afi rmar que a maior parte dos usuários que se benefi ciaram do Linux From Scratch não deram continuidade por muito tempo ao uso do sistema que construíram: seu grande benefício foi o aprendizado e a visão do tudo o que o processo de cons-trução proporciona. E não se engane: o resultado fi nal do Linux From Scratch não é um sistema tão completo e utilizável quanto as distribuições Linux mais comuns (como Ubuntu ou Fedora). O que ele tem, além do ker-nel, são as ferramentas de desenvolvimento necessárias para compilar os demais componentes (em especial o compilador C e seus acessórios), juntamente com com-ponentes essenciais como o Shell Bash, o sistema de inicialização sysvinit , o editor Vim, utilitários essenciais como gzip , less e grep , sistemas básicos como os que ge-renciam itens como o sistema de arquivos E2fsprogs e o reconhecimento de hardware – e pouco mais do que isso.

Mesmo em se tratando de componentes que não são usados por outras distribuições, o tipo de visão que a prática da construção do LFS proporciona sobre o re-lacionamento entre eles – por exemplo, como o kernel aciona o init durante o boot, qual a parte de cada um deles no processo e como gerenciar a ordem em que as

coisas ocorrem nesta etapa tão crucial do funcionamento de qualquer equipamento com Linux – pode ser muito superior ao que se obtém estudando confi gurações pre-viamente prontas empregadas por qualquer distribuição específi ca feita para ser usada, e não para ser aprendida.

Apesar de o Linux From Scratch em si fi car restrito apenas aos recursos mais básicos do sistema, existem projetos adicionais e mantidos pelo mesmo grupo que oferecem a oportunidade de conhecer a construção de aspectos mais avançados, como o BLFS ( Beyond Linux From Scratch ), que acrescenta componentes como LVM, RAID, outros editores e Shells, ambientes e aplicativos gráfi cos, suporte a redes locais e remotas, outras lingua-gens de programação, navegador web, email, multimídia, impressão e muito mais [2] . Outro projeto que comple-menta bem o aprendizado é o HLFS ( Hardened Linux From Scratch ), cujo foco é a segurança [3] .

Jamais segui as instruções do Linux From Scratch diretamente: quando passei por uma experiência pare-cida, ainda no século XX, segui instruções de diversas fontes e, com certeza, precisei me esforçar muito mais para aprender as mesmas coisas. Mas o conhecimento obtido por esta construção “no braço” para aprender um sistema Linux foi útil muitas vezes desde então (até mesmo em exames para certifi cação), e continua sendo até hoje, mesmo sendo eu um mero usuário de Linux no desktop. Ele pode até mesmo aplicado em outros sistemas operacionais com base UNIX. Recomendo! ■

Augusto César 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] Linux From Scratch: http://www.linuxfromscratch.org/ [2] Beyond Linux From Scratch: http://

www.linuxfromscratch.org/blfs/ [3] Hardened Linux From Scratch: http://

www.linuxfromscratch.org/hlfs/

Page 6: Linux Magazine Community Edition 89

11Linux Magazine #88 | Março de 2012

computaçãoe tecnologia

Adquira o seu exemplar nas melhores bancas

ou pelo site

www.lnm.com.br/shopping

Já chegou ao Brasila maior revista alemã

de informática e tecnologia

Page 7: Linux Magazine Community Edition 89

12

CO

LU

NA

www.linuxmagazine.com.br

Coluna do Alexandre Borges

HashesAprenda como funcionam os algoritmos de hash.

Um dos recursos mais importantes do framework de criptografi a, como exposto na primeira co-luna desta série, são os algoritmos de hash.

Eles estão ligados ao conceito de integridade, que faz parte de um dos princípios fundamentais da segurança (CIA – Confi dentiality, Integrity and Availability ).

Imagine a seguinte situação: precisamos enviar pacotes de uma máquina A para uma máquina B. Entretanto, isso deve ser feito de modo a garantir que os pacotes saiam da máquina A e cheguem à máquina B íntegros. Como é possível obter esse efeito? Simples: executam-se algumas operações matemáticas (algoritmos), usando como entrada o próprio pacote, anexando o resultado dessa conta no pacote antes de enviá-lo (na máquina A). Depois que o pacote atinge a máquina B, faz-se a mesma conta (usando-se o mesmo pacote como entra-da) e obtém-se um número. Se o valor obtido coincidir com aquele anexo antes do envio do pacote (na máqui-na A), quer dizer então que o pacote chegou íntegro à máquina B. Caso contrário, o pacote chegou corrom-pido e será necessário retransmití-lo.

Dentre os algoritmos de hash mais importantes, po-demos citar o MD5 (que gera uma saída de 128 bits, processa blocos de 512 bits e está descrito na RFC 1321) [1] , o SHA-1 (gerando saída de 160 bits, processando blocos de 512 bits e descrito na RFC3174) [2] e outras variantes (chamada de SHA-2) do mesmo SHA, como SHA-256 (256 bits), SHA-384 (384 bits) e SHA-512 (512 bits). Desde 2007, o NIST lançou uma concorrência para grupos inscreverem algoritmos dentre os quais será escolhido um vencedor para se tornar o SHA-3, com a meta de substituir o SHA-1 e o SHA-2. Esta competi-ção ainda está aberta e espera-se para este ano (2012) o anúncio do vencedor [3] .

Todos esses algoritmos são seguros e podem ser uti-lizados em operações cotidianas. No entanto, para am-bientes de grande segurança, o recomendado é usar o

SHA-1. Por qual motivo? Porque hoje em dia é possível, sob certas condições, quebrar o MD5. E o que se en-tende disso? Pelo fundamento dos algoritmos de hash, não deveria haver a menor possibilidade de duas en-tradas diferentes (no nosso exemplo, pacotes) gerarem a mesma saída, ou seja: duas entradas diferentes não resultam no mesmo valor através do cálculo do hash. Todavia, um conceito de ataque chamado “ataque de aniversário” prova matematicamente que, se escolhermos 23 pessoas aleatoriamente, há uma chance de 50,7% de duas delas fazerem aniversário no mesmo dia do ano. E essa probabilidade sobe para 99% quando escolhe-mos 57 pessoas. Recomendo vivamente que o leitor se familiarize com o Paradoxo do aniversário [4] , pois a prova matemática é muito interessante e simples (há apenas uma expansão trivial em Taylor que não apre-sentará difi culdades).

Engana-se quem acredita que os algoritmos de hash podem ser usados apenas em ambientes de criptografi a e segurança. Nos dias de hoje é muito comum quem trabalha com armazenamento, por exemplo, lidar dia-riamente com o termo “deduplicação”. Deduplicar é não guardar dados repetidos, isto é: superfi cialmente podemos supor que, se tenho dez cópias do mesmo email, guardo apenas a primeira cópia como original e as outras viram referência para aquele email original. Isso produz um efeito interessante: passamos a ocu-par menos espaço em disco, e de maneira única. Para atingirmos esse resultado temos que usar algoritmos de hash da seguinte maneira genérica: para cada bloco ou conjunto de dados armazenados, calcula-se um hash MD5. Estes hashes calculados são guardados em uma área à parte do sistema de arquivos. Se houver novos blocos de dados para armazenar, calcula-se o hash MD5 novamente, comparando-o com os hashes que já estão armazenados. Se o hash coincidir, quer dizer que o blo-co já existe e é possível descartá-lo, criando-se apenas

Page 8: Linux Magazine Community Edition 89

13Linux Magazine #88 | Março de 2012

uma referência à cópia já existente. Se o bloco não existir ainda, este deve ser armazenado como um dado novo, em conjunto com seu respectivo hash. Qual é o custo disso? Tempo de CPU para calcular o hash para cada bloco de dados.

Alguns sistemas de arquivos que suportam esta técnica são o VxFS (Symantec) e o ZFS (Oracle), assim como produtos de backup como o Netbackup e o Backup Exec (ambos da Symantec). Em Linux, duas excelentes alternativas são o LessFS [5] e o Opendedup [6] .

Mudando de assunto, é possível expor de maneira muito sim-plifi cada os algoritmos de assinatura digital que, como o leitor se recorda, não têm por objetivo fornecer a confi dencialidade, e sim comprovar a identidade de uma pessoa por meio do seu par de cha-ves assimétricas (pública e privada), no qual um pacote de dados assinado com a chave privada (que somente o usuário conhece) pode ser verifi cado apenas com a respectiva chave pública (que todos podem conhecer). Os algoritmos mais usados são o RSA e o DSA ( Digital Signature Algorithm ). O DSA foi proposto e hoje já se encontra na terceira revisão [7] .

Espero o leitor tenha se divertido e possa aproveitar algo desta leitura. Até o mês que vem. ■

Alexandre Borges ([email protected]) é instrutor independente e ministra regularmente treina-

mentos de tecnologia Oracle (áreas de Solaris, LDAP, Cluster, Containers/OracleVM, MySQL, e Hard-

ware), Symantec (Netbackup, Veritas Cluster,Backup Exec, Storage Foundation e SEP) e EC-Council

(CEH e CHFI), além de estar sempre envolvido com assuntos relacionados ao kernel Linux.

Mais informações

[1] The MD5 Message-Digest Algorithm:

http://www.ietf.org/rfc/rfc1321.txt

[2] US Secure Hash Algorithm 1 (SHA1):

http://www.ietf.org/rfc/rfc3174.txt

[3] Cryptographic Hash Algorithm

Competition: http://csrc.nist.gov/groups/ST/hash/sha-3/index.html

[4] Paradoxo do aniversário: http://pt.wikipedia.org/wiki/Paradoxo_do_anivers%C3%A1rio

[5] LessFS: http://sourceforge.net/projects/lessfs/

[6] Openedup: http://code.google.com/p/opendedup/

[7] Digital Signature Standard (DSS):

http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf

Page 9: Linux Magazine Community Edition 89

25Linux Magazine #88 | Março de 2012

ERP – SISTEMA DE GESTÃO

A micro e pequena empresa ganha uma solução de classe mundial de sistemas de gestão ERP no modelo comercial com a melhor relação custo/benefício. O Kontroller dispensa aquisição de hardware, licenças de software, técnicos de suporte ou sistema de backup. Garante alta disponibilidade e oferece fácil acesso via browser.

* Verificar termos e condições de usso no site.

Agora você tem o controle sobre o desempenho do seu negócio.

Gratuitamente*.

SOFTWARE

Compras

Estoques

Clientes

Vendas

Finanças

NF-e

Fornecedores

Solução completa hospedada em nuvem (Cloud Computing)

Saiba mais em:www.vectory.com.br/kontroller

+55 11 3104 6652

Page 10: Linux Magazine Community Edition 89

27Linux Magazine #89 | Abril de 2012

CA

PA

Blindagem de servidores

Servidores com sabres de luz Pode se dizer que a blindagem de servidores é a “técnica Jedi” para

administradores de rede. Você está preparado para utilizar a força a seu favor?

por Kemel Zaidan

A prática de blindagem ( hardening ) de servidores não é muito difundida no Brasil, mas é muito adotada no exterior. O nome pode ser compli-

cado, mas trata-se apenas de fazer uso de confi gura-ções e processos que previnam eventuais ataques e/ou invasões. Parece fácil, mas no entanto, para que tais medidas preventidas possam ser colocadas em prática, é preciso conhecer em profundidades as possibilidades dos serviços em uso, as técnicas maliciosas mais uti-lizadas por invasores e as ferramentas que podem ser usadas na sua defesa.

Para isso não há outra saída, a não ser estudar muito, conhecer a documentação completa dos programas uti-lizados e que fi cam mais expostos a ataques – tais como servidores HTTP, DNS, SAMBA, LDAP etc. – frequentar fóruns de segurança para se atualizar das novas técnicas que os crackers lançam e aprender com aqueles que sa-bem mais do que você e tem algo a ensinar.

Para facilitar essa tarefa, a Linux Magazine desse mês traz uma edição recheada de matérias para você, que não tem tempo a perder e quer saber sempre mais. Um dos destaques é “O Vigilante”, artigo que apresenta o software Suricata, que chega para tentar desbancar o monopólio do Snort como IDS mais comumente empregado. Seu diferencial é o uso que ele faz da ar-quitetura CUDA, de forma a utilizar o poder de pro-cessamento das poderosas GPUs atuais para dar conta do tráfego intenso de algumas redes nos dias de hoje.

Apesar de ser uma tecnologia bastante difundida, é incrível como algumas pessoas a ignoram completa-mente, sem se dar conta do quão inseguro é o sistema de emails, criado a mais de 40 anos. Estamos falando do PGP/GPG. Em “Você tem proteção?”, Juliet Kemp explica os detalhes de como a criptografi a oferecida pelo GnuPG funciona e até onde se pode chegar com ela.

Se isso ainda não for sufi ciente, é possível saber mais sobre a destruição segura de dados – algo muito importante caso você lide com arquivos sigilosos – e

tomar contato com as melhores práticas em blindagem de serviços de rede, ao ler o artigo “Blindagem com metais nobres”, contribuição da gaúcha especialista em segurança, Marta Vuelma.

Se depois de tudo isso, você já se sentir seguro, é bem provável que esteja se esquecendo da caracterís-tica mais desejável a um especialista em segurança: humildade. Afi nal, há sempre uma brecha por ser descoberta, admirável padawan! ■

Matérias de capaBlindagem com metais nobres 28

Destruidores 32

O vigilante 40

Você tem proteção? 44

Page 11: Linux Magazine Community Edition 89

58 www.linuxmagazine.com.br

ANÁLISE | Visão computacional

Visão computacional

Visão computacional para todos

Aprenda como obter desempenho e precisão através do uso

de todos os recursos disponíveis em sua infraestrutura.

por Alessandro de Oliveira Faria (Cabelo)

Com o avanço da tecnologia de hardware, os sistemas conseguem evoluir com

uma velocidade inacreditável. Da mesma forma isso acontece com a tecnologia de visão computacional de código aberto, onde podemos ci-tar a biblioteca openCV [1] ( Open Source Computer Vision ), que na sua versão atual proporciona pro-cessamento de imagens utilizando todos os recursos disponíveis à nossa volta, ou seja: CPU, processamen-

to paralelo, GPU e processadores ARM com a badalada plataforma Android, presente nos celulares e tablets. Agora, projetos de robótica, biometria, realidade aumentada, reconhecimento de padrão e/ou processamento de imagens contam com todo esse artefato tecnológico para desenvolver soluções.

A openCV evoluiu muito, embora o processamento de video em tempo real e o processamento de imagens, sempre serão tarefas pesadas, uma

vez que as câmeras estão chegando ao mercado com resoluções e defi -nições cada vez mais altas.

Neste contexto, somente será possível obter desempenho e preci-são se utilizarmos todos os recursos disponíveis em nosso hardware, pois o processamento matemático exige grande consumo computacional da CPU, mas agora, em pleno século XXI, contamos com algumas técni-cas que tornarão o resultado menos propenso à sobrecarga de sistemas como um todo.

Programação multinúcleo A programação paralela é necessária para obter o máximo desempenho no que tange à computação de alto de-sempenho. Para isto existem algumas alternativas como openMP ou TBB ( Threading Building Blocks ) [2] da Intel, que se encarregam da “adap-tação” do software ao ambiente, ou seja, determina o número ideal de threads (processos), tornando uma realidade a programação paralela e aproveitando os recursos de hardware de forma mais inteligente.

Assim, utilizando uma dessas al-ternativas, podemos explorar o po-

AN

ÁLIS

E

Figura 1 Reconhecimento de rostos com programação paralela.

Page 12: Linux Magazine Community Edition 89

59

| ANÁLISEVisão computacional

Linux Magazine #89 | Abril de 2012

tencial do processamento multinu-clear sem a necessidade de mágica. Outra grande vantagem é a compa-tibilidade entre as threads POSIX e Windows. A instalação é bem sim-ples: basta acessar o item download no site ofi cial e baixar a versão 3 ou superior. Em seguida, descompacte o arquivo e execute a instalação por meio do comando make , como no exemplo a seguir: $ wget http://www. threadingbuildingblocks.org/ uploads/78/154/3.0/ tbb30_018oss_src.tgz

$ tar -zxvf tbb30_018oss_src.tgz$ make$ cd examples/$ make

GPU Para continuar a incansável gincana com o objetivo de obter leveza e su-avidade em sistemas de visão com-putacional, é saudável, juntamente com a programação paralela, fazer uso orquestrado das GPU e CPUs. Resumidamente, 30 fps foi o núme-ro máximo obtido com uma rotina convencional escrita em C++ para localizar um rosto diante do video ao vivo ( facefi nder ). A mesma roti-na compilada para trabalhar com GPU chegou a aproximados 100 fps e com a programação paralela foi possível atingir aproximados 170 fps ( fi gura 1 ) [3] .

Como escrevi na revista Linux Magazine #64, de março de 2010, no artigo sobre GPU, escrever códigos para processar visão computacional em fl uxos de video ao vivo é uma tare-fa morosa em função do grande con-sumo de processamento matemático. Até mesmos os processadores atuais precisam de apoio para não gerar so-brecarga no sistema. Não podemos esquecer que trabalhar com fl uxo de video signifi ca analisar 30 quadros por segundo em dimensões mínimas de 640x480. É neste momento que entram as técnicas utilizando a pro-gramação multinuclear com a GPU.

Neste documento usei a tecnologia NVIDIA® CUDA™ para processar imagens utilizando a GPU.

Mão na massa A biblioteca openCV, atualmente na versão 2.3, é simples de utilizar e poderosa. Seus recursos e fl exibi-lidade, porém, tornam um pouco trabalhoso o aprendizado. Este soft-ware foi desenvolvido pela Intel em 2000, é multiplataforma e livre para fi ns de pesquisa e comerciais – claro que seguido da licença BSD Intel. Possui módulos de processamento de imagens e videos (leitura e grava-ção), álgebra linear, interface gráfi ca básica proporcionando sistema de janelas independentes, manipulação do mouse e teclado e mais de 2500 algoritmos de visão computacional, como fi ltros de imagem, calibração de câmera, reconhecimento de ob-jetos, análise estrutural e outros. Foi originalmente desenvolvida nas linguagens de programação C/C++, mas atualmente suporta as linguagens Java e Python, entre outras.

O software Harpia [3] é um projeto aprovado dentro do edital CT-INFO 2003 – Software Livre da FINEP. Nele há uma interface RAD sob a

forma de diagramas de blocos, que permite a criação rápida em C de programas com visão computacional. Basta arrastar os recursos represen-tados por cada bloco e interligá-los com um fl uxo lógico funcional. As-sim, o processo de estudo fi ca mais intuitivo, uma vez que o pacote ex-porta todo o diagrama em código C. Resumidamente, este projeto torna acessível a tecnologia openCV de maneira muito efi ciente ( fi gura 2 ).

Instalação na plataforma x86 Efetue o download dos códigos -fontes na página do projeto hospedada no SourceForge [5] e obtenha o pacote OpenCV-2.3.1a.tar.bz2 ou superior. As instruções de compilação e con-fi guração a seguir foram testadas na versão 2.3.0 e 2.3.1, as demais versões poderão sofrer pequenas modifi cações. Após o download, descompacte o pacote:

$ wget http://sourceforge.net/ projects/opencvlibrary/files/ opencv-unix/2.3.1/ OpenCV-2.3.1a.tar.bz2

$ tar -jxvf tars/OpenCV-2.3.1a.tar.bz2

Figura 2 Processamento de imagens com Harpia.

Page 13: Linux Magazine Community Edition 89

60 www.linuxmagazine.com.br

ANÁLISE | Visão computacional

Feito isso, inicie a compilação do código-fonte:

$ cd OpenCV-2.3.1/$ mkdir opencv.build$ cd opencv.build

Parâmetros de compilação Os parâmetros de compilação ou di-retivas de compilação do comando cmake determinarão quais recursos estarão disponíveis na biblioteca openCV. A seguir temos o comando que devemos executar (instalando previamente as bibliotecas TBB e CUDA). Há diversos parâmetros, porém os mencionados abaixo são os principais para obtermos sucesso nos teste iniciais.

$ cmake -DBUILD_DOCS=ON \ -DCMAKE_BUILD_TYPE= RELEASE -DBUILD_LATEX_DOCS=ON \

-DBUILD_OCTAVE_SUPPORT=ON -DBUILD_PYTHON_SUPPORT=ON \

-DBUILD_SWIG_PYTHON_ SUPPORT=ONF -DBUILD_TESTS=ON \

-DENABLE_OPENMP=OFF -DENABLE_PROFILING=OFF \

-DBUILD_PYTHON_SUPPORT=ON -DBUILD_NEW_PYTHON_SUPPORT=ON \

-DBUILD_EXAMPLES=ON -DINSTALL_C_EXAMPLES=ON \

-DINSTALL_OCTAVE_ EXAMPLES=ON -DINSTALL_PYTHON_ EXAMPLES=ON \

-DWITH_1394=ON -DWITH_TBB=ON -DWITH_CUDA=ON -DWITH_FFMPEG=ON \

-DWITH_GSTREAMER=OFF -DWITH_QT=ON -DWITH_GTK=ON \

-DWITH_JASPER=ON -DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON \

-DWITH_V4L=ON -DWITH_XINE=ON -DENABLE_SSE=ON -DENABLE_SSE2=ON \

-DENABLE_SSE3=ON -DENABLE_SSSE3=ON -DENABLE_SSE41=ON \

-DENABLE_SSE42=ON -DWITH_QT=ON -DWITH_QT_OPENGL=ON \

-DCUDA_NPP_LIBRARY_ ROOT_DIR=/usr/local/cuda/NPP/ SDK/ ..

Veremos a seguir o motivo da utilização das principais diretivas

Listagem 1: Exemplo de cmake da biblioteca openCV 01 General configuration for opencv 2.3.1 ============================02 03 Built as dynamic libs?: YES04 Compiler: /usr/bin/c++05 C++ flags (Release): -Wall -Wno-long-long -pthread -ffunction-sections -O3 -DNDEBUG -fomit-frame-pointer -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -DNDEBUG

06 C++ flags (Debug): -Wall -Wno-long-long -pthread -ffunction-sections -g -O0 -DDEBUG -D_DEBUG -ggdb3

07 Linker flags (Release):08 Linker flags (Debug):09 10 GUI: 11 QT 4.x: YES12 QT OpenGL support: YES13 14 Media I/O: 15 ZLib: YES16 JPEG: TRUE17 PNG: TRUE18 TIFF: TRUE19 JPEG 2000: TRUE20 OpenEXR: NO21 OpenNI: NO22 OpenNI PrimeSensor Modules: NO23 XIMEA: NO24 25 Video I/O:26 DC1394 1.x: NO27 DC1394 2.x: YES28 FFMPEG: YES29 codec: YES30 format: YES31 util: YES32 swscale: YES33 gentoo-style: YES34 GStreamer: NO35 UniCap: NO36 PvAPI: NO37 V4L/V4L2: 1/138 Xine: YES39 40 Other third-party libraries:41 Use IPP: NO42 Use TBB: YES43 Use ThreadingFramework: NO44 Use Cuda: YES45 Use Eigen: NO46 47 Interfaces:48 Python: YES49 Python interpreter: /usr/bin/python2.7 -B (ver 2.7)50 Python numpy: YES51 Java: NO52 53 Documentation:54 Sphinx: NO55 PdfLaTeX compiler: /usr/bin/pdflatex56 Build Documentation: NO57 58 Tests and samples:59 Tests: YES60 Examples: YES61 62 Install path: /usr/local63 64 cvconfig.h is in: /tmp/OpenCV-2.3.1/opencv.build65 –––––––––––––––––––––--66 Configuring done67 Generating done68 Build files have been written to: /tmp/OpenCV-2.3.1/opencv.build

Page 14: Linux Magazine Community Edition 89

61

| ANÁLISEVisão computacional

Linux Magazine #89 | Abril de 2012

de compilação utilizadas no co-mando acima:

➧ BUILD_DOCS , BUILD_LATEX_DOCS : habilite para disponibilizar toda a documentação presente no paco-te openCV. Mesmo aos usuários experientes, sugiro utilizar esta opção para comparação com a versão anterior.

➧ BUILD_OCTAVE_SUPPORT , BUILD_PYTHON_SUPPORT : utilize estas opções para habilitar o suporte da bibliote-ca na linguagem Python e também no Octave.

➧ BUILD_TESTS , BUILD_EXAMPLES , INSTALL_C_EXAMPLES , INSTALL_OCTA-VE_EXAMPLES , INSTALL_PYTHON_EXAM-PLES : estes itens disponibilizam os respectivos exemplos nas linguagens C, Python e Octave.

➧ ENABLE_OPENMP , WITH_TBB : é muito racional que, ao habilitar a opção TBB para utilizar os recursos de programação paralela, a utiliza-ção da biblioteca OpenMP seja desabilitada.

➧ WITH_1394 , WITH_CUDA , WITH_FFMPEG : como o assunto é processamento de imagem, a interface FireWire (IEEE 1394), as bibliotecas ffmpeg e CUDA são imprescindíveis.

➧ WITH_JPEG, WITH_PNG , WITH_TIFF : sugiro habilitar os principais ti-pos de imagem para obter total compatibilidade de processamen-to com arquivos disponíveis no seu disco.

➧ WITH_V4L : este item defi ne os dispositivos de video captura USB ou PCI compatíveis com a API do kernel V4L 1/2 que serão utilizados.

➧ ENABLE_SSE , ENABLE_SSE2 , ENA-BLE_SSE3 , ENABLE_SSSE3 , ENABLE_SSE41 , ENABLE_SSE42 : para processamento de imagens e cálculo de número de ponto fl utuante, as instruções SSE são mais do que obrigatórias.

➧ CUDA_NPP_LIBRARY_ROOT_DIR=/usr/local/cuda/NPP/SDK/ : esta linha infor-ma a localização do CUDA SDK. Esta é obtida durante a instalação do pacote SDK da NVIDIA.

➧ WITH_QT : exemplos com a bi-blioteca QT estão disponíveis no pacote, então não hesite em habi-litar esta opção.

Se tudo estiver corretamente instalado e confi gurado, o resulta-do será semelhante ao exemplo na listagem 1 . Faça uma comparação

e se algo estiver desabilitado, veri-fi que as dependências de pacotes em seu sistema.

Para iniciar na íntegra a compi-lação, efetue o comando make . No término da compilação basta, como super-usuário, utilizar o comando make install e ldconfig .

Figura 4 Imagem submetida ao

processo de binarização.

Figura 5 Motorola Dext utilizado para processar imagens.

Figura 3 Detecção de um corpo

humano em um video em

tempo real.

Figura 6 Imagem HelloAndroid.png criada pelo aplicativo.

Page 15: Linux Magazine Community Edition 89

62 www.linuxmagazine.com.br

ANÁLISE | Visão computacional

Existem inúmeros assuntos, fun-ções, recursos e exemplos para re-latar sobre a tecnologia openCV. O código fonte em C++ presente na pasta samples/cpp (cujo nome é peopledetect.cpp ) demonstra o potencial para detectar um corpo humano presente em imagens ou video em tempo real com pequenas adaptações ( figura 3 ) [6] . Não será possível neste documento detalhar

todos os recursos e possibilidades da biblioteca, então irei direto para os assuntos emergentes, ou seja, GPU e Android.

GPU e openCV em ação Para desmistifi car o uso da GPU com a biblioteca openCV, temos abaixo um simples programa para a bina-

rização da imagem, muito utilizado em realidade aumentada e em mui-tos outros aplicativos que requerem processamento de imagem.

No exemplo a seguir encontramos a imagem passada como parâmetro na linha de comando, que é carregada no objeto Mat e posteriormente en-viada ao GpuMat com o método upload .

Com a imagem já presente no ob-jeto src ( GpuMat ), a função threshold é processada na GPU com a chamada CV_THRESH_BINARY . O resultado do pro-cessamento é armazenado no objeto dst e, por sua vez, copiado no objeto result_host ( Mat ) para exibição. Como podemos analisar na listagem 2 , a biblioteca openCV abstraiu toda a complexidade (não tanta assim) da programação na GPU.

Para compilar o programa apre-sentado na listagem 2 , utilize uma das sintaxes a seguir:

$ g++ `pkg-config --cflags opencv` -I/usr/local/cuda/ include -o teste teste.cpp `pkg-config --libs opencv` -lopencv_gpu;

ou $ g++ -I/usr/include/opencv -I/usr/local/cuda/include -o teste teste.cpp -L/usr/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_ features2d -lopencv_calib3d -lopencv_objdetect -lopencv_ contrib -lopencv_legacy -lopencv_flann -lopencv_gpu;

Agora execute o programa recém compilado seguido do nome do ar-quivo imagem que será submetido ao processamento de binarização. Se tudo estiver funcionando corre-tamente, teremos como resultado algo similar à fi gura 4 .

$ ./teste image.png

Um pouco de QT O pacote openCV suporta a biblioteca QT, mas geralmente o principal objeti-vo ou interesse é a conversão da classe

Listagem 2: Binarização de imagem com o openCV 01 #include <iostream>02 #include “opencv2/opencv.hpp”03 #include “opencv2/gpu/gpu.hpp”04 05 int main (int argc, char* argv[])06 {07 try08 {09 cv::Mat src_host = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);

10 cv::gpu::GpuMat dst, src;11 src.upload(src_host);12 13 cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);14 15 cv::Mat result_host = dst;16 cv::imshow(“Result”, result_host);17 cv::waitKey();18 }19 catch(const cv::Exception& ex)20 {21 std::cout << “Error: “ << ex.what() << std::endl;22 }23 return 0;24 }

Listagem 3: Conversão de QImage para IplImage 01 static IplImage* qImage2IplImage(const QImag&E qImage)02 {03 int width = qImage.width();04 int height = qImage.height();05 IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);

06 char * imgBuffer = img->imageData;07 int jump = (qImage.hasAlphaChannel()) ? 4 : 3;08 for (int y=0;y<img->height;y++){09 QByteArray a((const char*)qImage.scanLine(y), qImage.bytesPerLine());

10 for (int i=0; i<a.size(); i+=jump){11 imgBuffer[2] = a[i];12 imgBuffer[1] = a[i+1];13 imgBuffer[0] = a[i+2];14 imgBuffer+=3;15 }16 }17 return img;18 }

Page 16: Linux Magazine Community Edition 89

63

| ANÁLISEVisão computacional

Linux Magazine #89 | Abril de 2012

QImage para a estrutura IplImage e vice e versa. O real motivo dessa necessi-dade é o fato de que quase todo pro-cessamento de imagem na biblioteca openCV utiliza a estrutura IplImage .

A estrutura IplImage carrega diver-sas informações da imagem, como

a quantidade de canais de cores, profundidade de bits, dimensão, ta-manho da linha alinhada em bits e um vetor com a imagem Data . Como a QImage é uma classe utilizada para armazenar, manipular e visualizar imagens, nada mais coerente do que obter técnicas para trocar imagens entre esses tipos. As listagens 3 e 4 apresentam uma receita de bolo mui-

to simples que pode ser encontrada facilmente em fóruns de discussão.

Android e OpenCV Como se não bastasse tanta aplica-bilidade, aparelhos como o Atrix, da Motorola, possuem processadores de 2 núcleos e Tegra 2 [7] , ou seja: tudo o que mencionamos até agora neste documento está na palma das nossas mãos. Mas obter desempenho em celulares potentes de última geração é fácil. O problema está em conse-guir o mesmo efeito em dispositivos mais antigos. Sendo assim, utilizei o Motorola DEXT, conhecido no ex-terior como CLIQ, que possui um modesto processador de 528 Mhz ( fi gura 5 ) [8] .

Para iniciar a compilação na plata-forma Android, defi na as variáveis de ambiente ANDROID_NDK e ANDROID_NDK_TO-OLCHAIN conforme o exemplo abaixo:

$ export ANDROID_NDK=/home/ cabelo/android-ndk-r5c

$ export ANDROID_NDK_TOOLCHAIN_ ROOT=/home/cabelo/ android-ndk-r5c/toolchains

Entre no diretório android e exe-cute o script cmake com sh ./scripts/cmake_android_armeabi.sh .

Caso o seu equipamento Android suporte a tecnologia ARM® NEON™, que permite a aceleração multimídia, video, encode e decode 2D/3D, uti-

Figura 7 Aplicativo instalado no

dispositivo Android.

Figura 8 Aplicativo em execução.

Listagem 4: Conversão de IplImage para QImage 01 static QImage IplImage2QImage(const IplImage *iplImage)02 {03 int height = iplImage->height;04 int width = iplImage->width;05 if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 3)

06 {07 const uchar *qImageBuffer = (const uchar*)iplImage->imageData;

08 QImage img(qImageBuffer, width, height, QImage::Format_RGB888);

09 return img.rgbSwapped();10 } else if (iplImage->depth == IPL_DEPTH_8U && iplImage->nChannels == 1){

11 const uchar *qImageBuffer = (const uchar*)iplImage->imageData;

12 QImage img(qImageBuffer, width, height, QImage::Format_Indexed8);

13 QVector<QRgb> colorTable;14 for (int i = 0; i < 256; i++){15 colorTable.push_back(qRgb(i, i, i));16 }17 img.setColorTable(colorTable);18 return img;19 }else{20 qWarning() << “Image cannot be converted.”;21 return QImage();22 }23 }

Page 17: Linux Magazine Community Edition 89

64 www.linuxmagazine.com.br

ANÁLISE | Visão computacional

lize o o script cmake_android_neon.sh para executar esta tarefa.

Resta apenas executar o tradi-cional ritual de compilação: make , make install . Execute os comandos conforme o exemplo seguinte e vá tomar outro café.

$ cd build_armeabi$ make

Após alguns minutos utilize o co-mando make install para concluir a

instalação. Para testar os exemplos, basta entrar na pasta bin e fazer a festa.

Veremos agora como instalar um programa nativo e um pacote .apk para Android.

Instalação e execução de programa nativo consistem em cópia, atribuição do direito de escrita e execução na íntegra.

$ adb push HelloAndroid /data$ adb shell chmod 777 /data/HelloAndroid

$ adb shell /data/HelloAndroid

Se o programa foi executado cor-retamente, no cartão microSD tere-mos a imagem mostrada na fi gura 6 .

$ adb pull /mnt/sdcard/ HelloAndroid.png

$ xv HelloAndroid.png

A instalação do pacote .apk é tran-quila; basta invocar o comando adb install e pronto, o aplicativo apare-cerá no seu aparelho restando apenas a tarefa de executá-lo ( fi guras 7 e 8 ). $ adb install tutorial-1-addopencv.apk

Conclusão Vou encerrar aqui, pois este documento é apenas um átomo da ponta do ice-berg no que tange à visão computacio-nal com openCV. Estou, em minhas poucas horas vagas, escrevendo um aplicativo de visão computacional utili-zando openCV e a API do AR.Drone, ou seja, robótica livre com openCV.

Em breve (não tão breve assim) pretendo disponibilizar toda docu-mentação e tutorial de como fazer um quadricóptero AR.Drone acom-panhar um corpo humano utilizan-do técnicas de reconhecimento de padrão ( fi gura 9 ) [9] . ■

Mais informações

[1] openCV: http://opencv.willowgarage.com/wiki/

[2] Threading Building Blocks: http://www.threadingbuildingblocks.org/

[3] NVIDIA CUDA 4, GPU e openCV no openSUSE 11.4:

http://www.youtube.com/watch?v=EkuFlpdFkGk

[4] Projeto Harpia: http://s2i.das.ufsc.br/harpia/home.html

[5] Open Computer Vision Library: http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.3.1/

[6] Contando e reconhecendo pessoas no openSUSE Linux com

openCV na CPU: http://www.youtube.com/watch?v=aVA5PvlaAp0

[7] Tegra Android Development Pack: http://developer.nvidia.com/tegra-android-development-pack

[8] OpenCV + Android: http://www.youtube.com/watch?v=rFMU8sQTp8U

[9] AR.Drone with openCV in the openSUSE 11.4: http://www.youtube.com/watch?v=Rk9usAaM7po

Gostou do artigo?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

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

o site

ticle

ne.com.b

03

o?opinião.

O autorAlessandro Faria (Cabelo) é sócio-

proprietário da NETi TECNOLOGIA, fun-

dada em Junho de 1996 (http://www.

netitec.com.br) e especializada em de-

senvolvimento de software e soluções

biométricas. Consultor Biométrico na

tecnologia de reconhecimento facial,

atuando na área de tecnologia desde

1986. Leva o Linux a sério desde 1998

com desenvolvimento de soluções

open-source, é membro colaborador da

comunidade Viva O Linux e mantene-

dor da biblioteca open-source de vídeo

captura, entre outros projetos.

Figura 9 Técnicas de reconhecimento padrão de humanos em videos.

Page 18: Linux Magazine Community Edition 89

65

| ANÁLISEVisão computacional

Linux Magazine #89 | Abril de 2012

Luciano Antonio Siqueira

Máquinas virtuais com VirtualBox

Administração de infraestrutura de máquinas virtuais com Sun VirtualBox®. Como trabalhar com sistemas operacionais – Windows, Linux etc – na mesma máquina e simultaneamente.

Criação de diferentes modalidades de conexões virtuais, exportação/importação de máquinas virtuais e criação de pontos de recuperação (snapshots).

Luciano Antonio Siqueira

Infraestrutura de Redes

Passo a passo da montagem de uma rede de computadores, desde o cabeamento e roteadores até a confi guração das máquinas clientes.

Confi guração e manutenção de serviços essenciais como DNS, compartilhamento de arquivos e acesso remoto.

Paulo Henrique Alkmin da Costa

Samba: com Windows

e Linux

Como permitir a comunicação de diferentes sistemas operacionais em rede: Windows, Linux, Mac OS X etc. Defi nição de compartilhamentos de arquivos, impressoras – incluindo a instalação automática de drivers – e utilização do Samba como controlador de domínio

(PDC) também para clientes Windows Vista e Windows 7.

O conteúdo e o formato dos livros foram desenvolvidos a partir da experiência prática e educacional de seus autores, com foco principal no desenvolvimento de competências, através de conceitos, exemplos detalhados e dicas de quem realmente entende do assunto.O material é indicado tanto para autodidatas que desejam se aperfeiçoar quanto para utilização em escolas. O professor irá se sentir confortável para desenvolver as atividades a partir do livro, que procura atender tanto à expectativa do aprendiz quanto à demanda profissional do mercado de TI.

Disponível no site www.LinuxMagazine.com.br

Conheça a coleção Academyda Linux New Media

Os livros da Coleção Academy são roteiros práticos e objetivos, com didática adequada tanto ao profissional

quanto ao estudante da área de TI.

Page 19: Linux Magazine Community Edition 89

66 www.linuxmagazine.com.br

ANÁLISE | Streaming de conteúdo multimídia em rede

Comparação de ferramentas UPnP para streaming em rede

Verifi cação de fl uxo O U PnP e o DLNA prometem streaming de conteúdo

multimídia sem complicações em redes domésticas,

mas o mundo real nunca está livre de complicações.

por Kristian Kissling

O Universal Plug-and-Play (ou UPnP, para abreviar) é ótimo. Suponhamos que

você queira ver um fi lme na sua TV. O arquivo de mídia com o fi l-me não está no PC conectado ao seu aparelho de TV, mas no com-putador. Numa situação dessas, o UPnP elimina a necessidade de copiar via rede ou usar um pendri-ve para mover o arquivo. Em vez disso é possível executar um servi-dor UPnP no computador com o fi lme e compartilhá-lo para fazer streaming. O cliente em sua sala de estar descobre o compartilhamento e usa um leitor de UPnP que lhe permite assisti-lo. Ou pelo menos é assim que funciona na teoria.

UPnP e DLNA O fórum do UPnP, uma iniciativa da indústria fundada em 1999, é uma organização protetora para milhares de fornecedores de TI e fabricantes de hardware, que juntaram forças

para criar uma norma técnica para a publicação de dados multimídia em harmonia com aplicativos lei-tores de mídia. Players multimídia, TVs de tela plana e smartphones agora usam UPnP para procurar conteúdo reproduzível na rede lo-cal. O padrão foi desenvolvido para conectar os meios de comunicação e reprodutores correspondentes automaticamente na rede local – e de preferência, sem que o usuá-rio precise intervir nesse processo.

O UPnP baseia-se em uma rede peer-to-peer (ponto a ponto) local, compreendendo clientes, pontos de controle e servidores que utilizam um protocolo comum. O protocolo UPnP é baseado em padrões abertos da Internet como o XML, o Simple Service Discovery Protocol (SSDP) e o HTTPU (uma extensão de HTTP 1.1 que usa o UDP em vez do TCP como protocolo de transporte). Os dispositivos primeiro obtém um en-dereço IP de forma autônoma e, em

seguida, anunciam sua existência na rede. Embora os servidores (UPnP AV MediaServer, ou servidores de mídia UPnP) ofereçam conteúdo, os clientes (UPnP MediaRenderers, ou reprodutores de mídia UPnP) apenas o reproduzem.

Para permitir que isso aconteça, os clientes verifi cam os recursos que o servidor oferece e fornecem uma interface para gerenciá-las. Pontos de controle conectam clientes e servidores. Um ponto de controle consegue descobrir e ler compar-tilhamentos nos servidores.

A Digital Living Network Alliance (DLNA) [1] é muitas vezes associada com o UPnP. A DLNA é um orga-nismo industrial fundado em 2003 pela Sony e a Intel. A organização emite uma certifi cação “Kitemark” para o hardware multimídia que cumpre orientações específi cas, conhecidas como “Diretrizes para Interoperabilidade de Dispositivos em Redes Domésticas”. A versão

AN

ÁLIS

E

Page 20: Linux Magazine Community Edition 89

67

| ANÁLISEStreaming de conteúdo multimídia em rede

Linux Magazine #89 | Abril de 2012

1.5 dessas diretrizes foi lançada em 2006, e está disponível apenas para membros da DLNA ou clientes pagantes. Com base nessas orien-tações, os membros da DLNA po-dem realizar vários testes com seus dispositivos em diversos laboratórios e usar o selo de aprovação da DLNA [2] se as verifi cações forem bem sucedidas. Se você examinar mais de perto, tudo isso signifi ca que os dispositivos certifi cados podem se comunicar sem problemas. Como os dispositivos DLNA só precisam suportar um mínimo de formatos multimídia (JPEG, LPCM, MPEG-2), é uma boa ideia descobrir quais deles o equipamento de sua escolha realmente suporta antes de fazer uma compra ( quadro 1 ).

Um número surpreendentemente grande de servidores com software baseado em UPnP suporta Linux – alguns deles de código aberto e outros comerciais. Para descobrir quais recursos os servidores ofe-recem e como eles se comparam com os concorrentes comerciais e servidores para outros sistemas operacionais, consulte a tabela de visão geral na Wikipedia [3] . Em nosso laboratório, nós nos concen-tramos nos candidatos licenciados

pela GPL: Rygel, MediaTomb e uShare. Nossa escolha de servidor plataforma foi o Ubuntu 11.10, que lhe permite instalar os três candida-tos através da Central de Programas . No lado cliente, também fomos para o Ubuntu com vários clientes UPnP, e além disso testamos um aplicativo gratuito para Android chamado UPnPlay [4] .

Servidor Rygel O Rygel [5] está em desenvolvimen-to há algum tempo. Pode-se iniciar o servidor digitando o comando rygel em um terminal. Se não conseguir encontrar uma confi guração espe-cífi ca do usuário, o Rygel primei-ro usa o arquivo global do sistema /etc/rygel.conf .

De acordo com as instruções en-contras lá, o servidor procura em

diretórios padrão do Ubuntu por imagens ( ~/Imagens ), música ( ~/Música ) e fi lmes ( ~/Video ). Se você quiser acrescentar algo mais aos pa-drões, copie o arquivo de confi guração para seu diretório home e modifi que a cópia para atender às suas neces-sidades. Para fazê-lo, acrescente os nomes das pastas de mídia desejadas nas linhas, começando com uris= na parte [MediaExport] ( fi gura 1 ). Se você quiser, por exemplo, que o Rygel use o diretório ~/Downloads , irá precisar da linha:

uris=@MUSIC@;@VIDEOS@; @PICTURES@;$HOME/Downloads

Depois de concluir as altera-ções, reinicie o servidor. O Rygel em seguida verifi ca os arquivos nos diretórios e emite uma mensagem quando completa a inclusão do

Quadro 1: O UPnP agrega valores Embora este artigo foque na capaci-

dade do UPnP de compartilhar arqui-

vos multimídia, ele também é utilizado

para controlar roteadores e imple-

mentar o Internet Gateway Device

Protocol (IGD). O UPnP libera auto-

maticamente as portas caso aplica-

tivos específi cos perguntem. Claro,

há algum risco envolvido, e é por isso

que você verá muitas vezes a reco-

mendação de desativar os controles

UPnP no seu roteador. O comple-

mento do Firefox Fox!Box [9] usa o

protocolo UPnP, por exemplo, para

ler e renovar os endereços IP públicos

em roteadores FRITZ! e ultimamente,

o UPnP também tem sido utilizado

para conectar impressoras na rede. Figura 1 Você pode confi gurar o Rygel editando o arquivo de confi guração

para incluir os diretórios adicionais que deseja compartilhar na rede.

Figura 2 Quando iniciado, o Rygel procura por mídia nos diretórios especifi cados.

Page 21: Linux Magazine Community Edition 89

68 www.linuxmagazine.com.br

ANÁLISE | Streaming de conteúdo multimídia em rede

diretório ( fi gura 2 ). Uma pequena armadilha: se você copiar novos ar-quivos para uma de suas pastas de mídia enquanto o servidor estiver em execução, o Rygel percebe a mudança, mas o cliente UPnP na outra extremidade da cadeia inicial-mente não percebe. Será necessário reiniciar o Rygel para que os clientes saibam das mudanças.

Se você não se sente bem edi-tando os arquivos de configuração manualmente, pode instalar uma interface gráfica para ajudá-lo com a configuração. Para fazê-lo, instale

o pacote rygel-preferences e, em seguida, inicie o programa. Em uma janela principal autoexpli-cativa, você pode agora gerenciar seus compartilhamentos do Rygel ( figura 3 ). Para aplicar as alterações, será necessário ainda reiniciar o Rygel manualmente após concluir a configuração.

Clientes com Rygel Embora haja uma série de apli-cativos clientes que pretendem apoiar o UPnP no Linux, nosso laboratório descobriu que muitos

dos projetos e seus fornecedores estavam exagerando. Um aplica-tivo Android chamado UPnPlay pelo menos prova que os recursos básicos conseguem ser executados em compartilhamentos do Rygel (e de outros servidores) nos aplicativos previstos, sem causar grandes pro-blemas: imagens no visualizador de imagens, músicas no player de áudio e fi lmes no tocador de fi lmes. As soluções para desktop que testa-mos não foram tão efi cazes.

É possível, por exemplo, adicio-nar o framework Coherence para o player multimídia Totem obter recursos UPnP, o que implica ins-talar os pacotes python-coherence e totem-plugins-extra . Então, no To-tem, vá até Editar/Plug-ins , marque Coherence DLNA/UPnP-Cliente e reinicie o player. Selecione a entra-da Coherence DLNA/UPnP-Cl a partir do menu suspenso à direita do Totem e os compartilhamentos UPnP aparecerão à direita.

Embora o Totem tenha tocado arquivos de áudio e video em nosso laboratório, ele se recusou a exibir imagens. No Ubuntu 11.10 também se recusou a cooperar com o Cohe-rence, embora isso tenha funcionado no Ubuntu 11.04. No laboratório, o Totem tocou os arquivos de áu-dio do Rygel rapidamente quando solicitado, mas quando abrimos uma lista, o player simplesmente morreu. Além disso, o aplicativo eventualmente congelava quando reproduzia música e não exibiu as imagens completamente.

O XBMC Media Center tam-bém não exibiu imagens em am-bas as versões testadas no Ubuntu 11.04 e 11.10 (instalamos o XBMC a partir de um PPA). Além disso, o

Listagem 1: Reconfi guração do uShare 01 $ sudo service ushare start02 $ sudo service ushare stop03 $ sudo dpkg-reconfigure ushare

Figura 3 Confi guração do servidor UPnP com uma interface gráfi ca.

Figura 4 O XBMC do PPA tomava um café antes de tocar faixas via UPnP.

Page 22: Linux Magazine Community Edition 89

69

| ANÁLISEStreaming de conteúdo multimídia em rede

Linux Magazine #89 | Abril de 2012

XBMC teve êxito limitado para tocar música. No Ubuntu 11.04, a central de mídia levava cerca de um minu-to para começar a tocar a próxima faixa, e o XBMC congelou durante a espera. O aplicativo também teve longas pausas antes de tocar faixas no Ubuntu 11.10 ( fi gura 4 ).

Embora o XBMC no Ubun-tu 11.04 tenha tocado formatos MPEG4 sem nenhum problema, ele se recusou a reproduzir fi lmes com a extensão .mov . O motivo é que o Rygel suporta apenas MP3, MPEG TS e formatos de saída PCM.

A versão XBMC no Ubuntu 11.10 travou ao tentar reproduzir fi lmes. O motivo foi provavelmente a falta de um driver 3D para a placa de ví-deo ATI. Ambos, Totem e XBMC, têm alguns problemas sérios a se-rem resolvidos, embora o XBMC funcione melhor com o Rygel do que com o Totem.

O VLC também pode oficial-mente tocar fluxos UPnP. Mas ten-do o Rygel como servidor, a versão que veio com o Ubuntu 11.10 só trabalhou de forma intermitente e não exibiu recursos UPnP. Por ou-

tro lado, um player UPnP baseado em Java com o nome de eezUPnP ( figura 5 ) foi muito bem, embora apenas no caso das músicas. É possível descompactar o arquivo do aplicativo baixado a partir do site [6] , mudar para o novo sub-diretório e depois chamar o apli-cativo em um terminal digitando ./CP . O player mostra os recursos que encontrou à esquerda, então você pode selecioná-los e jogá-los para a lista de reprodução. Uma coisa incomum é a capacidade do eezUPnP de armazenar faixas localmente: isso não é exatamen-te o que os fabricantes do UPnP tinham em mente, mas pode ser interessante se você está acessando compartilhamentos em máquinas de outras pessoas.

Servidor uShare O uShare [7] confi gura um ser-viço independente no diretório /etc/init.d/ e é preciso iniciá-lo com privilégios de root ( listagem 1 , linha 1 ). Se você se esquecer de lhe dizer quais diretórios com-partilhar, só verá uma mensagem inútil: No shares available (“Sem compartilhamentos disponíveis”) na hora da inicialização. Neste caso, é necessário parar o serviço ( listagem 1 , linha 2 ) e reconfi gurá-lo através de uma interface de texto ( linha 3 ).

Para fazê-lo, comece digitando um nome para o compartilhamen-to ( fi gura 6 ). Na caixa de diálogo seguinte, selecione um adaptador de rede para executar o serviço. Por fi m, digite uma lista separada por vírgula com os diretórios que você quer que o uShare compartilhe.

Clientes com uShare Testar o uShare com os clientes que já tinham sido testados com Rygel tornou óbvia a diferença que as capacidades dos servidores UPnP podem ter.

Figura 5 O eezUPnP funcionou bem com todos os nossos servidores, mas

apenas tocou a música .

Figura 6 O uShare é confi gurável através de uma interface baseada em texto.

Além da placa de rede para distribuir os arquivos, você também

precisa especifi car os diretórios a compartilhar.

Page 23: Linux Magazine Community Edition 89

70 www.linuxmagazine.com.br

ANÁLISE | Streaming de conteúdo multimídia em rede

O cliente VLC, por exemplo, trabalhou praticamente em per-feita combinação com uShare no Ubuntu 11.04 e 11.10 – ele falhou com as imagens, mas os outros clientes tiveram problemas com elas também. Dito isso, o VLC não varreu suas capacidades UPnP para debaixo do tapete. Para habilitar o UPnP, pressione [L] após iniciar o aplicativo para abrir a lista de re-produção, e em seguida selecione Rede local na esquerda e Universal Plug&Play na parte de baixo. Você verá, então, os compartilhamentos do uShare à direita.

Também notamos algumas mu-danças com o XBMC: a versão no Ubuntu 11.10 continuou falhando (por causa dos drivers proprietá-rios) e ainda não conseguiu exibir imagens, mas pelo menos tocava música sem nenhuma lacuna visí-vel. O arquivo MOV, que o Rygel não conseguiu transmitir, agora

apareceu no XBMC no 11.04. Além disso, o XBMC tocou os arquivos de uShare com um atraso muito mais curto, de cerca de 10 a 15 segundos por música.

A versão Totem do Ubuntu 11.10 não conseguiu identifi car o plugin Coherence, e isso deixou o player de fora do jogo. Por outro lado, o Totem tocou as faixas no 11.04 sem praticamente nenhum congela-mento, e pareceu trabalhar bem com uShare de modo geral. Por exemplo, ele identifi cou o arquivo MOV e conseguiu reproduzi-lo, bem como tocar arquivos MPEG-4 sem nenhuma falha.

Estranhamente o aplicativo An-droid UPnPlay de repente deixou de reproduzir filmes neste teste – coisa que nos surpreendeu ne-gativamente. Ele não reconheceu totalmente um filme no formato Flash e tentou tocar dois outros filmes no player de áudio. Apesar

de funcionar, não faz exatamente o que seu mestre mandou. O único arquivo de filme que o UPnPlay identificou corretamente como sendo um vídeo foi o MOV, mas isso não significa que ele de fato exibiu o filme. Para encerrar com um comentário mais positivo, po-rém, o aplicativo Android traba-lhou com imagens e músicas do uShare corretamente.

Servidor MediaTomb O MediaTomb [8] é o único ser-vidor dentre os três em nosso teste a oferecer uma interface baseada em navegador, e isso oferece aos usuários uma opção de controle bastante conveniente. O Media-Tomb é instalado como serviço e inicia automaticamente no momen-to da inicialização. Para fi nalizar o MediaTomb em qualquer fase posterior, não é sufi ciente fechar o navegador com a interface: você precisa digitar sudo mediatomb ser-vice stop para parar o serviço.

Dito isso, o servidor não publica seus arquivos na rede local até que você execute explicitamente o apli-cativo através do comando mediatomb. Isso também diz ao aplicativo para iniciar a interface web, e então você encontrará a URL correspondente na saída de linha de comando (fi gura 7). Se ignorar esse passo intermediário, tudo o que você verá no navegador é uma mensagem dizendo: MediaTomb UI is disabled. Check your confi gura-tion (O MediaTomb está desativado. Verifi que sua confi guração).

Para compartilhar o conteúdo que você quer tornar público, clique em Filesystem na interfa-ce web do MediaTomb e depois navegue até os diretórios deseja-dos para mostrar seu conteúdo no lado direito da janela (figura 8). Se você deseja indexar um diretório inteiro, clique no sinal + no lado superior direito ao lado do nome do diretório. É importante ressal-

Figura 7 Depois de iniciar o MediaTomb na linha de comando, ele lhe mostra

uma URL que você precisa digitar no seu navegador para acessar a

interface web.

Figura 8 Com o MediaTomb, os usuários podem gerenciar suas ações

convenientemente em uma interface gráfi ca via navegador.

Page 24: Linux Magazine Community Edition 89

71

| ANÁLISEStreaming de conteúdo multimídia em rede

Linux Magazine #89 | Abril de 2012

tar que, se um computador com a versão MediaTomb servidor está executando um firewall, pode ser que você não consiga ver os compartilhamentos do servidor. Neste caso, será necessário abrir as duas portas usadas pelo UPnP: 1900/ udp e 2869/ tcp. Além disso, o MediaTomb exige que você abra as portas 49152-49154.

Se quiser que o MediaTomb ve-rifi que regularmente a pasta para encontrar novos arquivos, use o ícone com as duas setas circulares. Para adicionar arquivos individual-mente, use o sinal + à direita – isso é tudo o que a interface lhe oferece em termos de controles.

Se clicar em Database , você co-meça a ver os arquivos e pastas que acabou de selecionar. Mais uma vez, serão exibidos alguns ícones úteis no canto superior direito, mas desta vez eles lhe permitem remo-ver a mídia.

Clientes com MediaTomb Novamente, o UPnPlay não conse-guiu reproduzir vídeos em conjunto com o MediaTomb, e apenas exibiu um fi lme em MPEG. O aplicativo Android, por outro lado, manipulou imagens e músicas perfeitamente. O

aplicativo Java eezUPnP mais uma vez trabalhou em conjunto com o MediaTomb e não teve problemas para reproduzir as faixas.

Já o XBMC no Ubuntu 11.04 nos impressionou positivamente pela reprodução de um fi lme Flash. O aplicativo novamente deu longos intervalos entre as faixas tocadas (como com o Rygel), o que torna o player praticamente inútil para essa tarefa. E o XBMC não exibiu ima-gens no Ubuntu 11.04. Sua variante no Ubuntu 11.10 reagiu exatamente como antes, deixando de funcionar quando lhe requisitaram que re-produzisse fi lmes, tocando músicas com poucas falhas e não exibindo imagens totalmente.

O VLC no Ubuntu 11.04 nos mostrou os diretórios, mas não conseguiu exibir seu conteúdo. Em comparação, no Ubuntu 11.10 ele tocou todo o áudio e os arquivos de video que o MediaTomb distri-buiu. Mais uma vez, não mostrou nenhuma imagem.

O Totem também tocou todos os fi lmes sem nenhum problema – pelo menos no Ubuntu 11.04. Percebemos pausas curtas entre as faixas mas, fora isso, o aplicativo tra-tou a coleção de faixas muito bem. Mas, mais uma vez, simplesmente ignorou as imagens.

Conclusão Quando o UPnP funciona, poupa aos usuários longas sessões de cópia e proporciona um fácil compartilha-mento de coleções de mídia. Quando se trata do âmago da questão, porém, o conceito revela uma série de fra-quezas, e não apenas no Linux. É preciso experimentar combinações cliente/servidor para encontrar uma que realmente funcione.

Em nosso laboratório, o streaming de MP3 causou o menor número de problemas. Todos os aplicativos tiveram difi culdade na exibição de imagens. O único aplicativo que mostrou imagens corretamente foi o Android UPnPlay, mas ele não conseguiu reproduzir fi lmes em de-terminadas situações. Dependendo da capacidade do servidor, os clientes UPnP tocaram ou alguns formatos específi cos ou todos. Alguns clientes se recusaram a processar os arquivos compartilhados na rede local.

Nos testes mais recentes, a me-lhor combinação foi VLC 1.1.12 no Ubuntu 11.10/openSUSE 11.4/12.1 com o Media-Tomb 0.12.1 como servidor (que toca também formatos Flash), embora você tenha que reiniciar o MediaTomb depois de comparti-lhar um diretório (caso contrário o compartilhamento não aparecerá no VLC). Se você estiver usando o Rygel, o XBMC provavelmente será sua melhor escolha de cliente, assim que o aplicativo parar de tra-var ao tentar reproduzir fi lmes. Se você só precisa de UPnP para ouvir música, por que não instalar somen-te o eezUPnP? Ele faz esse trabalho de maneira nada espetacular, porém confi ável – em combinação com to-dos os três servidores. ■

Mais informações [1] Digital Living Network Alliance: http://www.dlna.org/

[2] Certifi cação DLNA: http://tinyurl.com/lu0212-dlna-cert

[3] Comparação de servidores UPnP (Wikipedia):

http://tinyurl.com/lu0212-upnp-server

[4] UPnPLay: https://market.android.com/details?id=cx.hoohol.silanoid&hl=en

[5] Rygel: http://live.gnome.org/Rygel

[6] eezUPnP: http://eezupnp.de/

[7] uShare: http://ushare.geexbox.org/

[8] MediaTomb: http://mediatomb.cc/

[9] Fox!Box: https://addons.mozilla.org/en-US/firefox/addon/foxbox/

Gostou do artigo?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

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

o site

ticle

ne.com.b

78

o?opinião.

Page 25: Linux Magazine Community Edition 89

72 www.linuxmagazine.com.br

TUTORIAL | Geração de gráficos com ggplot

Geração de gráfi cos com ggplot

Curvas elegantes Adicionar gráfi cos informativos

e atrativos aos seu trabalhos

normalmente exige uma boa

quantidade de paciência.

A ferramenta ggplot2

proporciona estrutura

para gráfi cos e simplifi ca

a vida dos usuários.

por Wolfgang Mauerer

Os estatísticos e cientistas tendem a ver o mundo como uma enorme fonte

de dados a serem explorados e en-tendidos, mas você não precisa ter um grande acelerador de partículas para gerar dados interessantes. As métricas de desempenho de software e estatísticas de acesso a servidores web, por exemplo, poderão lhe for-necer material sufi ciente que não se torna informativo ou defi nitivo, até que você encontre o jeito certo de visualizar as pilhas de dados.

Uma questão de estrutura Existem vários programas que lhe permitem criar gráfi cos tais como os do tipo planilhas numéricas, Gnu-plot ou o framework em Python, Matplotlib; mas eles seguem a abordagem imperativa tradicional. Dependendo do tipo de dado, você normalmente escolhe a melhor combinação de gráfi co a partir de uma seleção – gráfi cos de barra, pontos, linhas ou alguma coisa

parecida – e adiciona um número maior ou menor de parâmetros ou clica em caixas para selecionar os detalhes de formatação.

Em muitos casos, essa é uma ta-refa demorada, especialmente se os dados mudarem continuamente ou se for difícil dizer com antecedên-cia que tipo de visualização exibirá os melhores resultados. Afi nal de contas, a maior parte das pessoas quer se concentrar na análise dos dados e não nos detalhes técnicos de sua representação.

Essas questões não são exatamen-te novas para estatísticos e outros afi cionados por dados. Uma solução atraente foi criada pelo estatístico Leland Wilkinson [1] , que criou A Gramática dos Gráfi cos ( The Grammar of Graphics ) e a expandiu por diversas décadas, descrevendo como mapear os vários aspectos de grupos de componentes de um grá-fi co sem ter que focar nos detalhes explícitos da formatação.

No ggplot2 [2] , uma poderosa – porém não muito conhecida – ferramenta de plotagem construí-

da a partir da linguagem GNU R de estatísticas ( GNU R statistics language ), Hadley Wickham im-plementou os conceitos da “gra-mática dos gráfi cos”.

A sintaxe e os conceitos do gg-plot2 e do GNU R podem parecer não convencionais. Apesar disso, a linguagem não lembra em nada uma coisa impraticável ou incon-sistente. A curva de aprendizagem é um pouco mais íngreme do que em outras abordagens, mas seus esforços serão recompensados com ganhos de fl exibilidade e com a publicação de gráfi cos de alta qualidade estética, que você poderá criar sem pensar muito nos parâmetros necessários.

O grande R O GNU R está incluído em quase todas as distribuições Linux como pacote binário. Ele vem com um Shell interativo que você pode ini-ciar a partir da linha de comando (ao digitar R ) e com diversas inter-faces (por exemplo, o modo ESS do Emacs). Para acessar o ggplot2 de dentro de uma sessão R, tudo

TU

TO

RIA

L

Page 26: Linux Magazine Community Edition 89

73

| TUTORIALGeração de gráficos com ggplot

Linux Magazine #89 | Abril de 2012

que você precisa fazer é executar o comando library(ggplot2) .

Se o ggplot2 não estiver incluído pelo método de instalação padrão da sua distribuição, é possível instalar todas as dependências ao digitar o seguinte comando no shell do R:

install.packages ("ggplot2", dependencies=T)

Você pode sair da sessão do R digitando quit() ou pressionando o atalho de teclado [Ctrl] + [D] .

Linhas de dados O conjunto de dados de exemplo da listagem 1 ajuda a demonstrar o princípio por trás do ggplot2. Os dados encontram-se em um arquivo

CSV – um formato de dados sim-ples, mas universal, que quase todo aplicativo pode exportar – que des-creve um experimento que mede o desempenho do algoritmo foo , bar e hyper aplicado a conjuntos de dados de diferentes tamanhos ( Escopo de dados ). A coluna Volume de dados é a velocidade ou o volu-me de dados processados por uni-dade de tempo. Simultaneamente, os dados diferenciam-se em três confi gurações: A , B e C .

Essa situação é semelhante a muitas que acontecem durante a lida diária de um programador ou administrador de sistemas. Na vida real, seria provavelmente necessá-rio extrair os dados dos arquivos de

log ou de outras fontes, mas pelo fato de esse passo não ter relação nenhuma com a visualização dos dados, ignorarei a fonte aqui.

Os dados são representados no ggplot2 como data frames (quadros de dados), uma estrutura de dados do R que se parece com listas de arrays usadas em outras linguagens. Cada quadro de dados compreende um número arbitrário de linhas e colunas, as quais podem ser indi-vudualmente nomeadas.

A listagem 2 exibe como o co-mando read.csv do R cria um qua-dro de dados a partir do arquivo CSV. O argumento header=T diz ao R para utilizar rótulos a partir da primeira linha das colunas de tex-to. O operador <- do R armazena os dados na variável dat . O coman-do print() fi nal permite verifi car e certifi car-se de que os dados foram lidos corretamente.

Para simplifi car as coisas, abor-darei agora um subset, o algoritmo foo . O GNU R fornece um subset de comandos que cria um quadro de dados menor:

dat.sub <- subset(dat, Algorithm=="foo")

Para converter os dados puros em um gráfi co ( fi gura 1 ), é necessário usar duas chamadas do R:

g <- ggplot(data=dat.sub, aes( x=DataScope, y=Throughput, colour=Configuration)) + geom_point() + geom_line()

print(g)

A transformação é realizada em dois passos: o objeto base ggplot defi ne um mapeamento estético independentemente da fonte dos dados, que é o quadro de dados dat.sub criado previamente. O ma-peamento descreve quais aspectos dos dados serão mapeados para quais componentes no gráfi co. O coman-do especifi ca que o Volume de dados (eixo y ) será plotado sobre o Volume de dados (eixo x ). Outro componen-

Figura 1 Primeiras tentativas de visualização: medidas de desempenho para o

algoritmo foo .

Figura 2 Uma pequena seleção de objetos gráfi cos suportados pelo ggplot2.

Page 27: Linux Magazine Community Edition 89

74 www.linuxmagazine.com.br

TUTORIAL | Geração de gráficos com ggplot

te nos dados, Configuração , tem seu código colorido com colour . Em ou-tras palavras, o ggplot2 utiliza a cor para identifi car cada confi guração.

O objeto base ainda não des-creve quais objetos gráfi cos serão usados como ponto de partida para os dados. O ggplot2 administra os objetos gráfi cos nas camadas, onde cada uma contém um objeto. Uma plotagem pode compreender várias camadas sobrepostas – o ggplot2 assegura automaticamente que os parâmetros externos ao gráfi co (por exemplo, seu tamanho e o rótulo dos eixos) são os mesmos em todas as camadas. Para criar uma camada de objetos, são necessárias funções como geom_<tipo> , no qual tipo defi ne os objetos gráfi cos em uso.

O comando anterior utiliza duas camadas com objetos gráfi cos sim-ples: pontos ( geom_point() ) e linhas ( geom_line() ). O ggplot2 adiciona ambos ao objeto base, transferindo as defi nições para este último (fontes

de dados e mapeamentos estéticos) para as camadas. Combinar o objeto base com os objetos de camadas cria um objeto R novo e combinado, que pode ser exibido com o comando print genérico. Entretanto, você pode salvar as plotagens permanen-temente. O comando :

ggsave("/tmp/graph.pdf", g)

escreve a plotagem contida em g para um arquivo no formato PDF especifi cado. O ggplot2 identifi ca o formato de arquivo desejado atra-vés do sufi xo do arquivo. Além do PDF, você pode escolher também PNG, JPG, EPS e SVG. Por padrão, o software cria fi guras com 9.75 x 4.6 polegadas (aproximadamente 24,76 por 11,68 cm).

Para mudar isso, use os parâ-metros height e width . Para grá-fi cos como JPG e BPM utilize a resolução padrão de 300 pontos por polegada; é possível, porém, modifi cá-la através do parâmetro

dpi . Para criar um gráfi co PNG quadrado, com uma aresta de 5 polegadas em alta resolução, ex-perimente o comando:

ggsave("plot.png", g, height=5, width=5, dpi=1200)

É claro que faz mais sentido utilizar formatos vetoriais para pre-venir o problema da escala, tanto quanto contornos quadriculados e desenhos que fi cam horríveis quan-do você tenta reutilizá-los.

Uma questão de visualização Como os dados brutos tornam-se cada vez mais complexos, as mensa-gens por trás deles nem sempre são claras. Contudo, é preciso descobrir a melhor forma de visualizá-los para revelar a mensagem oculta – em estatísticas, esse processo é cha-mado de estatística exploratória. O ggplot2 suporta essa abordagem ao lhe permitir melhorar as plotagens interativamente e passo a passo para melhor entender e visualizar os re-sultados. Em cada passo, é possível observar os diferentes aspectos dos

Listagem 1: Amostra de dados01 Algotitmo,Escopo de dados, Volume de dados, Configuração

02 foo,32,6.67,A 03 foo,64,7.19,A 04 foo,128,7.60,A 05 foo,256,8.03,A 06 foo,512,8.21A 07 foo,32,6.79,B 08 foo,64,6.60,B 09 foo,128,7.45,B 10 [...] 11 foo,512,8.21,C 12 bar,32,4.00,A 13 bar,64,6.92,A 14 bar,128,11.17,A 15 [...] 16 bar,256,16.01,C 17 bar,512,19.97,C 18 hyper,32,6.62,A 19 hyper,64,8.40,A 20 [...]

Figura 3 Plotagem completa do conjunto de dados de teste com vários

símbolos para os algoritmos.

Page 28: Linux Magazine Community Edition 89

75

| TUTORIALGeração de gráficos com ggplot

Linux Magazine #89 | Abril de 2012

dados na plotagem até alcançar uma imagem consistente.

Além dos objetos gráfi cos sim-ples vistos até agora, como pontos e linhas, o ggplot2 suporta uma grande seleção de outros elemen-tos gráfi cos que os usuários podem combinar sem nenhuma restrição prática. A figura 2 mostra uma pe-

quena seleção, mas você encontra-rá uma lista completa no site do ggplot2 [2] .

O conjunto completo de dados, comparado com um conjunto li-mitado, contém diversos tipos de algoritmos, que podem ser dife-renciados por diferentes formatos ( shape ) para os símbolos da plota-

gem. O comando a seguir cria a plotagem da figura 3 :

g <- ggplot(data=dat, aes(x=DataScope, y=Throughput, colour=Configuration, shape=Algorithm)) + geom_point(size=3) + geom_line() + scale_x_log10()

Além da fonte completa de da-dos, dat em vez do subset dat.sub , e da estética shape , o código con-tém também outro novo recurso. Utilizei o comando size para defi -nir o tamanho dos pontos criados por geom_point() para 3 , de forma a criá-los maiores do que o padrão 2 .

Comparado com o conjunto es-tético utilizado diretamente pelo objeto ggplot() , o geom_point não está ligado aos dados. Em vez disso ele usa um valor fi xo, o que explica por que ele não está incluído com o parâmetro aes() – o ajuste é uti-lizado diretamente. Além disso, o padrão aplica-se apenas aos pontos das camadas, o que não afeta as li-nhas – como é possível ver na figura 3 . O último pedaço acrescentado ao comando scale_x_log10() efetua uma transformação de escala: em vez de uma escala linear, o eixo x agora utiliza uma escala logarít-mica. O ggplot2 modifi ca o eixo do exemplo e certifi ca-se de que todas as camadas foram modifi ca-das adequadamente.

Diferentes faces Um gráfi co defi nitivo precisa con-ter tanta informação quanto possí-vel para refl etir diferentes aspectos dos dados. O perigo neste caso é o sobrecarregamento de dados e, sem os devidos cuidados, suas plotagens podem se tornar ilegíveis (o limite aqui não é fácil de se encontrar, pois se um leitor de monografi as científi cas pode levar 10 minutos analisando um gráfi co, um leitor de jornais pode não ser assim tão entusiástico). Uma solução possível é não representar aspectos de dados

Figura 4 Dimensionamento unidimensional: existe um subgráfi co para

cada confi guração.

Figura 5 Dimensionamento bidimensional sem cores.

Page 29: Linux Magazine Community Edition 89

76 www.linuxmagazine.com.br

TUTORIAL | Geração de gráficos com ggplot

implícitos como cores e símbolos, mas explicitá-los na forma de subgrá-fi cos. Esse conceito é implementado no ggplot2 com facet_grid .

Para distribuir os dados em vá-rios gráficos como mostrado na figura 4 , é necessário utilizar o seguinte comando:

g <- ggplot(data=dat, aes(x=Escopo de dados, y=Volume de dados, colour=Algoritmo)) + geom_point(aes(colour=Algoritmo)) + facet_grid(~Configuração)

A expressão facet_grid(~Configuração) estipula a criação de plotagens separadas para todas as confi gurações possíveis (isto é, A, B e C). Cada subgráfi co exibe seu próprio subconjunto de dados, mas com o uso de camadas idênticas e mapeamento estético.

Os dimensionamentos podem ser aplicados vertical e horizon-talmente com o comando facet_grid(<Variável>~.) . Tome cuidado para não esquecer o ponto fi nal, que é necessário por razões técni-cas. Combinar ambas as variáveis com expressão:

face_grid(Algorithm~Configuration)

produz o resultado mostrado na fi gura 5 . O comando colour agora é supér-

fl uo, portanto está omitido: quando o gráfi co for publicado de forma im-pressa, uma visualização monocro-mática pode ser vantajosa, pois evita

o uso de impressão colorida mais cara. Por outro lado, você pode plo-tar mais variações com as cores que não está utilizando para acrescentar ainda mais informações ao gráfi co.

O dimensionamento funciona muito bem se as variáveis que você separar contiverem apenas algumas

categorias, como Configuration nes-te exemplo. Até um certo limite, é possível não utilizar cores, mas no caso de muitas categorias, faz sentido usar símbolos de diferentes tamanhos (o comando size ). Outra maneira é pré-processar os dados com um número grande de categorias (e o R faz um ótimo trabalho neste caso) para criar uma quantidade razoável de categorias combinadas.

Enquanto a fi gura 3 ameaça afun-dar os leitores em um mar de deta-lhes, as fi guras alternativas de número 4 e 5 são mais legíveis. Será preci-so decidir caso a caso que formato servirá melhor aos seus propósitos.

Listagem 2: Criação um quadro de dados 01 dat ← read.csv(“data.txt”,header=T)02 print(dat) 03 Algoritmo Escopo de dados Volume de dados Configuração 04 1foo326.675104 A 05 2foo647.190872 A06 3foo1287.684894 A07 4foo2568.038377 A08 [...]

Listagem 3: Ajuste fi no 01 <-#ggplot(data=latency, aes(x=total_observed_delay)) + geom_histogram(binwidth=1) + scale_y_log10 (breaks=c(1, 10, 100, 1000), labels=c(“1”, “10”, “100”, “1000”)) + xlim(1,500) + facet_grid(type~CPU) + xlab(expression(paste(“Latência [“, mu, “s]”))) + ylab(“ # exemplos [a.u.]”) + theme_bw()

Figura 6 Exemplo de histograma: medidas de latência de kernels Linux.

Page 30: Linux Magazine Community Edition 89

77

| TUTORIALGeração de gráficos com ggplot

Linux Magazine #89 | Abril de 2012

Se necessitar de alguma ajuda para fazê-lo, recomendo ler um bom tex-to de sobre gráfi cos estatísticos [3] .

O importante, do ponto de vista do usuário, é que as variáveis não envolvem maiores esforços: o ggplot2 manipula automaticamente detalhes irritantes como o posicionamento de sub-coordenadas ou o layout dos ei-xos – e se você tentou criar gráfi cos com outros programas, está provavel-mente familiarizado com os detalhes entediantes que envolvem alcançar um resultado satisfatório.

Ajuste fi no Na vida real, infelizmente é impos-sível fi car sem revisão manual. No caso do ggplot2, o sobretrabalho é normalmente pequeno. Como exemplo prático, veja os resultados das métricas de latência feitas em um sistema dual-core executando uma versão em tempo real (RT) e não tempo real (non-RT) do Linux. Cada medida armazena um atraso (latência) junto com qual CPU e em qual modo (RT e não-RT) a medição foi extraída.

Ao contrário do exemplo ante-rior, um número grande de valores é medido (alguns milhares), o que signifi ca que um histograma resu-mido será o formato escolhido. A listagem 3 mostra o código que cria a plotagem da fi gura 6 (os dados brutos estão disponíveis online [4] ).

As correções manuais relacio-nam-se principalmente aos eixos:

novas palavras chave restringem os dados na direção x de 1 a 500 ( xlim() ) o que também torna o rótulo do eixo logarítmico y mais legível (argumen-tos para scale_y_log10() ). A função theme_bw() seleciona um estilo al-ternativo que otimiza o gráfi co para uma representação monocromática. A maior novidade está escondida no objeto gráfi co. A plotagem não exibe uma representação dos dados origi-nais, mas realiza uma transformação estatística implícita.

O histograma ( geom_histogram() ) correlaciona todas as latências que ocorrem em um intervalo com um escopo de tempo defi nido. Cada intervalo é representado por uma barra cuja altura é proporcional ao número de pontos de medida que ele contêm. Ao contrário de pontos e linhas, os objetos gráfi cos mais complexos não são sempre basea-dos em uma representação direta do dado original.

Abordar as opções de transforma-ção estatística explícitas no processo de plotagem vai além dos objetivos deste artigo, mas uma extensa cole-ção de palavras-chave (geométricas, transformações estatísticas, escalas, parâmetros de layout etc.) está dis-ponível no site do ggplot2 e é um bom lugar para começar, caso você precise de mais informação.

Um companheiro útil que você não vai querer fi car sem em seu tra-balho diário com este software é o livro escrito pelo autor do ggplot2,

Wickhan [5] . Infelizmente, uma introdução realmente compreen-sível sobre o ggplot2 não está dis-ponível gratuitamente na Internet, mas o investimento no livro vale a pena e provavelmente contribuirá para o desenvolvimento contínuo do programa.

Além dos recursos mencionados até agora, você pode buscar referên-cias (bastante esparsas) nas páginas man de cada um dos comandos. O mecanismo clássico para páginas de manual não é utilizado, mas está disponível diretamente no R quando você digitar ?<palavra-chave> , como em ?geom_line .

Conclusão Você fi nalmente tem duas opções para utilizar o ggplot2 de forma não interativa, a qual é realmente necessária em casos de avaliação automatizada de dados. Você pode apenas armazenar os comandos de que necessita, incluindo ggsave() e o comando para carregar a bibliote-ca ggplot2 em um arquivo de texto e executá-lo na linha de comando do Linux digitando R CMD BATCH <arquivo>.r . Você pode colocar os gráfi cos que criar dessa maneira em um servidor web, por exemplo.

Uma forma mais sofi sticada, mas também mais difícil de utilizar, é a função Sweave do R. O sistema com-bina o R e o ggplot2 com com o siste-ma de layout do LaTeX para produzir uma dupla dinâmica que entrega um documento imprimível com gráfi cos elegantes, gerados por fontes combi-nadas a partir de código R e LaTeX. Os espíritos destemidos encontrarão todos os detalhes no manual [6] . ■

Gostou do artigo?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

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

sso s

r/artic

azine.com

6690

gosua opinião.

r

Mais informações [1] Wilkinson, L. The Grammar of Graphics, 2nd ed. Springer, 2005.

[2] Site do ggplot2: http://had.co.nz/ggplot2

[3] Tufte, E. R. The Visual Display of Quantitative

Information, 2nd ed. Graphics Press, 2001.

[4] Listagens e dados para este artigo: http://www.lnm.com.br/issues/89/ggplot.zip

[5] Wickham, H. ggplot2: Elegant Graphics for

Data Analysis. Springer, 2009.

[6] Homepage do Sweave: http://www.statistik.lmu.de/~leisch/Sweave/