Lm 89 ce

Page 1


Panorama

Expediente editorial Diretor Geral Rafael Peregrino da Silva rperegrino@linuxmagazine.com.br

Kemel Zaidan kzaidan@linuxmagazine.com.br Editora de Arte Larissa Lima Zanini llima@linuxmagazine.com.br Estagiário Felipe Brumatti Sentelhas fsentelhas@linuxmagazine.com.br Colaboradores Alessandro 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) anuncios@linuxmagazine.com.br Tel.: +55 (0)11 3675-2600 Penny Wilby (Reino Unido e Irlanda) pwilby@linux-magazine.com Amy Phalen (América do Norte) aphalen@linuxpromagazine.com Hubert Wiest (Outros países) hwiest@linuxnewmedia.de Diretor de operações Claudio Bazzoli cbazzoli@linuxmagazine.com.br Na Internet: www.linuxmagazine.com.br – Brasil www.linux-magazin.de – Alemanha www.linux-magazine.com – Portal Mundial www.linuxmagazine.com.au – Austrália www.linux-magazine.es – Espanha www.linux-magazine.pl – Polônia www.linux-magazine.co.uk – Reino Unido www.linuxpromagazine.com – América do Norte Apesar de todos os cuidados possíveis terem sido tomados durante a produção desta revista, a editora não é responsável por eventuais imprecisões nela contidas ou por consequências que advenham de seu uso. A utilização de qualquer material da revista ocorre por conta e risco do leitor. Nenhum material pode ser reproduzido em qualquer meio, em parte ou no todo, sem permissão expressa da editora. Assume-se que qualquer correspondência recebida, tal como cartas, emails, faxes, fotografias, artigos e desenhos, sejam fornecidos para publicação ou licenciamento a terceiros de forma mundial não-exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado. Linux é uma marca registrada de Linus Torvalds. Linux Magazine é publicada mensalmente por: Linux New Media do Brasil Editora Ltda. Rua São Bento, 500 Conj. 802 – Sé 01010-001 – São Paulo – SP – Brasil Tel.: +55 (0)11 3675-2600 Direitos Autorais e Marcas Registradas © 2004 - 2012: Linux New Media do Brasil Editora Ltda. Impressão e Acabamento: IBEP Gráfica. Atendimento Assinante www.linuxnewmedia.com.br/atendimento São Paulo: +55 (0)11 3675-2600 Rio de Janeiro: +55 (0)21 3512 0888 Belo Horizonte: +55 (0)31 3516 1280 ISSN 1806-9428

Linux Magazine #89 | Abril de 2012

Impresso no Brasil

Gerar valor em tempos de Internet criando soluções passa inevitavelmente 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 prontidã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 ficção científica, 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), influenciaram 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 aumentada 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 geoposicionado, 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 tempo, 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. Entretanto, essa base de tecnologia não equipa somente as inovações dignas de ficção científica do Google. Em uma pesquisa recente, a Linux Foundation 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 modificaçõ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 contato 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 fiscal 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... ■

EDITORIAL

Editores Flávia Jobstraibizer fjobs@linuxmagazine.com.br

Rafael Peregrino da Silva Diretor de Redação 3


© zhev - Fotolia.com

ÍNDICE

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 criptografia 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 criptografia GnuPG.

4

www.linuxmagazine.com.br


Linux Magazine 89 | ÍNDICE

TUTORIAL

COLUNAS Charly Kühnast

07

Klaus Knopper

08

Augusto Campos

10

Alexandre Borges

12

Kurt Seifried

14

Zack Brown

16

Curvas elegantes

72

NOTÍCIAS Geral

20

➧ Rackspace abre seu framework de testes

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

➧ 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

ANÁLISE

CORPORATE Notícias

Visão computacional para todos

58

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

ANDROID Lei e ordem

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

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ÇOS 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?

Linux Magazine #89 | Abril de 2012

Editorial

03

Emails

06

Linux.local

78

Preview

82

5


Coluna do Augusto

COLUNA

Linux From Scratch Projeto 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 funcionamento interno de uma distribuição Linux qualquer. Ao contrário do que muitos imaginam à primeira vista, porém, o Linux From Scratch não é propriamente uma distribuição Linux. É um livro (de autoria de Gerard 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 afirmar que a maior parte dos usuários que se beneficiaram 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 construção proporciona. E não se engane: o resultado final 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 kernel, são as ferramentas de desenvolvimento necessárias para compilar os demais componentes (em especial o compilador C e seus acessórios), juntamente com componentes 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 gerenciam 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 relacionamento 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

10

coisas ocorrem nesta etapa tão crucial do funcionamento de qualquer equipamento com Linux – pode ser muito superior ao que se obtém estudando configurações previamente prontas empregadas por qualquer distribuição específica feita para ser usada, e não para ser aprendida. Apesar de o Linux From Scratch em si ficar 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áficos, suporte a redes locais e remotas, outras linguagens de programação, navegador web, email, multimídia, impressão e muito mais [2]. Outro projeto que complementa 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 parecida, 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 certificaçã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! ■

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

www.linuxmagazine.com.br


Já chegou ao Brasil a maior revista alemã de informática e tecnologia

computação e tecnologia

Adquira o seu exemplar nas melhores bancas ou pelo site

www.lnm.com.br/shopping Linux Magazine #88 | Março de 2012

11


COLUNA

Coluna do Alexandre Borges

Hashes Aprenda como funcionam os algoritmos de hash.

U

m dos recursos mais importantes do framework de criptografia, como exposto na primeira coluna 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 – Confidentiality, 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 entrada) e obtém-se um número. Se o valor obtido coincidir com aquele anexo antes do envio do pacote (na máquina A), quer dizer então que o pacote chegou íntegro à máquina B. Caso contrário, o pacote chegou corrompido e será necessário retransmití-lo. Dentre os algoritmos de hash mais importantes, podemos 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 utilizados em operações cotidianas. No entanto, para ambientes de grande segurança, o recomendado é usar o

12

SHA-1. Por qual motivo? Porque hoje em dia é possível, sob certas condições, quebrar o MD5. E o que se entende disso? Pelo fundamento dos algoritmos de hash, não deveria haver a menor possibilidade de duas entradas 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 escolhemos 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 apresentará dificuldades). Engana-se quem acredita que os algoritmos de hash podem ser usados apenas em ambientes de criptografia e segurança. Nos dias de hoje é muito comum quem trabalha com armazenamento, por exemplo, lidar diariamente com o termo “deduplicação”. Deduplicar é não guardar dados repetidos, isto é: superficialmente 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 ocupar 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 bloco já existe e é possível descartá-lo, criando-se apenas

www.linuxmagazine.com.br


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 simplificada os algoritmos de assinatura digital que, como o leitor se recorda, não têm por objetivo fornecer a confidencialidade, e sim comprovar a identidade de uma pessoa por meio do seu par de chaves 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 verificado 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 (alex_sun@terra.com.br) é instrutor independente e ministra regularmente treinamentos de tecnologia Oracle (áreas de Solaris, LDAP, Cluster, Containers/OracleVM, MySQL, e Hardware), 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.

Linux Magazine #88 | Março de 2012

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

13


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

Compras

Finanças

Estoques

NF-e

Vendas Fornecedores Clientes

ERP – SISTEMA DE GESTÃO

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

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

Linux Magazine #88 | Março de 2012

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.

Saiba mais em: www.vectory.com.br/kontroller +55 11 3104 6652

SOFTWARE

25


Blindagem de servidores

CAPA

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 complicado, mas trata-se apenas de fazer uso de configuraçõ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 utilizadas 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 utilizados e que ficam 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 sabem 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 arquitetura CUDA, de forma a utilizar o poder de processamento 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 completamente, 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 criptografia oferecida pelo GnuPG funciona e até onde se pode chegar com ela. Se isso ainda não for suficiente, é possível saber mais sobre a destruição segura de dados – algo muito importante caso você lide com arquivos sigilosos – e

Linux Magazine #89 | Abril de 2012

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ística mais desejável a um especialista em segurança: humildade. Afinal, há sempre uma brecha por ser descoberta, admirável padawan! ■

Matérias de capa Blindagem com metais nobres

28

Destruidores

32

O vigilante

40

Você tem proteção?

44

27


ANÁLISE | Visão computacional

ANÁLISE

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)

C

om 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 citar a biblioteca openCV [1] (Open Source Computer Vision), que na sua versão atual proporciona processamento 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 definições cada vez mais altas. Neste contexto, somente será possível obter desempenho e precisã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écnicas que tornarão o resultado menos propenso à sobrecarga de sistemas como um todo.

Programação multinúcleo

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

58

A programação paralela é necessária para obter o máximo desempenho no que tange à computação de alto desempenho. Para isto existem algumas alternativas como openMP ou TBB (Threading Building Blocks) [2] da Intel, que se encarregam da “adaptaçã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 alternativas, podemos explorar o po-

www.linuxmagazine.com.br


Visão computacional | ANÁLISE

tencial do processamento multinuclear sem a necessidade de mágica. Outra grande vantagem é a compatibilidade entre as threads POSIX e Windows. A instalação é bem simples: basta acessar o item download no site oficial 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 suavidade em sistemas de visão computacional, é saudável, juntamente com a programação paralela, fazer uso orquestrado das GPU e CPUs. Resumidamente, 30 fps foi o número máximo obtido com uma rotina convencional escrita em C++ para localizar um rosto diante do video ao vivo (facefinder). A mesma rotina compilada para trabalhar com GPU chegou a aproximados 100 fps e com a programação paralela foi possível atingir aproximados 170 fps (figura 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 fluxos de video ao vivo é uma tarefa morosa em função do grande consumo de processamento matemático. Até mesmos os processadores atuais precisam de apoio para não gerar sobrecarga no sistema. Não podemos esquecer que trabalhar com fluxo de video significa analisar 30 quadros por segundo em dimensões mínimas de 640x480. É neste momento que entram as técnicas utilizando a programação multinuclear com a GPU.

Linux Magazine #89 | Abril de 2012

Figura 2 Processamento de imagens com Harpia.

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 flexibilidade, porém, tornam um pouco trabalhoso o aprendizado. Este software foi desenvolvido pela Intel em 2000, é multiplataforma e livre para fins 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áfica básica proporcionando sistema de janelas independentes, manipulação do mouse e teclado e mais de 2500 algoritmos de visão computacional, como filtros de imagem, calibração de câmera, reconhecimento de objetos, 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 representados por cada bloco e interligá-los com um fluxo lógico funcional. Assim, o processo de estudo fica mais intuitivo, uma vez que o pacote exporta todo o diagrama em código C. Resumidamente, este projeto torna acessível a tecnologia openCV de maneira muito eficiente (figura 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 configuração a seguir foram testadas na versão 2.3.0 e 2.3.1, as demais versões poderão sofrer pequenas modificaçõ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

59


ANÁLISE | Visão computacional

Listagem 1: Exemplo de cmake da biblioteca openCV 01 General configuration for opencv 2.3.1 ============================ 02 03 Built as dynamic libs?: YES 04 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: YES 12 QT OpenGL support: YES 13 14 Media I/O: 15 ZLib: YES 16 JPEG: TRUE 17 PNG: TRUE 18 TIFF: TRUE 19 JPEG 2000: TRUE 20 OpenEXR: NO 21 OpenNI: NO 22 OpenNI PrimeSensor Modules: NO 23 XIMEA: NO 24 25 Video I/O: 26 DC1394 1.x: NO 27 DC1394 2.x: YES 28 FFMPEG: YES 29 codec: YES 30 format: YES 31 util: YES 32 swscale: YES 33 gentoo-style: YES 34 GStreamer: NO 35 UniCap: NO 36 PvAPI: NO 37 V4L/V4L2: 1/1 38 Xine: YES 39 40 Other third-party libraries: 41 Use IPP: NO 42 Use TBB: YES 43 Use ThreadingFramework: NO 44 Use Cuda: YES 45 Use Eigen: NO 46 47 Interfaces: 48 Python: YES 49 Python interpreter: /usr/bin/python2.7 -B (ver 2.7) 50 Python numpy: YES 51 Java: NO 52 53 Documentation: 54 Sphinx: NO 55 PdfLaTeX compiler: /usr/bin/pdflatex 56 Build Documentation: NO 57 58 Tests and samples: 59 Tests: YES 60 Examples: YES 61 62 Install path: /usr/local 63 64 cvconfig.h is in: /tmp/OpenCV-2.3.1/opencv.build 65 –––––––––––––––––––––-66 Configuring done 67 Generating done 68 Build files have been written to: /tmp/OpenCV-2.3.1/opencv.build

60

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

www.linuxmagazine.com.br


Visão computacional | ANÁLISE

de compilação utilizadas no comando acima: ➧ BUILD_DOCS, BUILD_LATEX_DOCS: habilite para disponibilizar toda a documentação presente no pacote 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 biblioteca na linguagem Python e também no Octave. ➧ BUILD_TESTS , BUILD_EXAMPLES , INSTALL_C_EXAMPLES, INSTALL_OCTAVE_EXAMPLES, INSTALL_PYTHON_EXAMPLES: 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 tipos de imagem para obter total compatibilidade de processamento com arquivos disponíveis no seu disco. ➧ WITH_V4L: este item define 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, ENABLE_SSE3, ENABLE_SSSE3, ENABLE_SSE41, ENABLE_SSE42: para processamento de imagens e cálculo de número de ponto flutuante, as instruções SSE são mais do que obrigatórias.

➧ WITH_QT: exemplos com a biblioteca QT estão disponíveis no pacote, então não hesite em habilitar esta opção. Se tudo estiver corretamente instalado e configurado, o resultado será semelhante ao exemplo na listagem 1. Faça uma comparação

Figura 3 Detecção de um corpo humano em um video em tempo real.

e se algo estiver desabilitado, verifique as dependências de pacotes em seu sistema. Para iniciar na íntegra a compilaçã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.

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

Linux Magazine #89 | Abril de 2012

Figura 6 Imagem HelloAndroid.png criada pelo aplicativo.

61


ANÁLISE | Visão computacional

Existem inúmeros assuntos, funções, recursos e exemplos para relatar 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 desmistificar o uso da GPU com a biblioteca openCV, temos abaixo um simples programa para a bina-

Listagem 2: Binarização de imagem com o openCV 01 02 03 04 05 06 07 08 09

#include <iostream> #include “opencv2/opencv.hpp” #include “opencv2/gpu/gpu.hpp”

int main (int argc, char* argv[]) { try { 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 }

62

rização da imagem, muito utilizado em realidade aumentada e em muitos 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 enviada ao GpuMat com o método upload. Com a imagem já presente no objeto src (GpuMat), a função threshold é processada na GPU com a chamada CV_THRESH_BINARY. O resultado do processamento é 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 apresentado 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 arquivo imagem que será submetido ao processamento de binarização. Se tudo estiver funcionando corretamente, teremos como resultado algo similar à figura 4. $ ./teste image.png

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

www.linuxmagazine.com.br


Visão computacional | ANÁLISE

Figura 8 Aplicativo em execução. Figura 7 Aplicativo instalado no dispositivo Android. QImage para a estrutura IplImage e vice e versa. O real motivo dessa necessidade é o fato de que quase todo processamento de imagem na biblioteca openCV utiliza a estrutura IplImage. A estrutura IplImage carrega diversas informações da imagem, como

a quantidade de canais de cores, profundidade de bits, dimensão, tamanho 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-

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 }

Linux Magazine #89 | Abril de 2012

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

Android e OpenCV Como se não bastasse tanta aplicabilidade, 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 conseguir o mesmo efeito em dispositivos mais antigos. Sendo assim, utilizei o Motorola DEXT, conhecido no exterior como CLIQ, que possui um modesto processador de 528 Mhz (figura 5) [8]. Para iniciar a compilação na plataforma Android, defina as variáveis de ambiente ANDROID_NDK e ANDROID_NDK_TOOLCHAIN 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 execute 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-

63


ANÁLISE | Visão computacional

Se o programa foi executado corretamente, no cartão microSD teremos a imagem mostrada na figura 6. $ adb pull /mnt/sdcard/ HelloAndroid.png $ xv HelloAndroid.png

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

Conclusão Figura 9 Técnicas de reconhecimento padrão de humanos em videos. lize o o script cmake_android_neon.sh instalação. Para testar os exemplos, para executar esta tarefa. basta entrar na pasta bin e fazer a festa. Resta apenas executar o tradiVeremos agora como instalar um cional ritual de compilação: make, programa nativo e um pacote .apk make install. Execute os comandos para Android. Instalação e execução de programa conforme o exemplo seguinte e vá nativo consistem em cópia, atribuição do tomar outro café. direito de escrita e execução na íntegra. $ cd build_armeabi $ make

Após alguns minutos utilize o comando make install para concluir a

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

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

64

Vou encerrar aqui, pois este documento é apenas um átomo da ponta do iceberg no que tange à visão computacional com openCV. Estou, em minhas poucas horas vagas, escrevendo um aplicativo de visão computacional utilizando 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 documentação e tutorial de como fazer um quadricóptero AR.Drone acompanhar um corpo humano utilizando técnicas de reconhecimento de padrão (figura 9) [9]. ■

O autor Alessandro Faria (Cabelo) é sócioproprietário da NETi TECNOLOGIA, fundada em Junho de 1996 (http://www. netitec.com.br) e especializada em desenvolvimento 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 mantenedor da biblioteca open-source de vídeo captura, entre outros projetos.

Gostou do artigo? o?

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

Queremos ouvir sua opinião. Fale conosco em cartas@linuxmagazine.com.br ne.com.b

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

Este artigo no nosso o site: site http://lnm.com.br/article/6703 ticle 03

www.linuxmagazine.com.br


Visão computacional | ANÁLISE

Conheça a coleção Academy da 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.

Luciano Antonio Siqueira

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

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

Paulo Henrique Alkmin da Costa

Luciano Antonio Siqueira

Samba:

Máquinas virtuais com VirtualBox

com Windows e Linux Como permitir a comunicação de diferentes sistemas operacionais em rede: Windows, Linux, Mac OS X etc. Definiçã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.

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

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 Linux Magazine #89 | Abril de 2012

65


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

Comparação de ferramentas UPnP para streaming em rede

ANÁLISE

Verificação de fluxo 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. por Kristian Kissling

O

Universal Plug-and-Play (ou UPnP, para abreviar) é ótimo. Suponhamos que você queira ver um filme na sua TV. O arquivo de mídia com o filme não está no PC conectado ao seu aparelho de TV, mas no computador. Numa situação dessas, o UPnP elimina a necessidade de copiar via rede ou usar um pendrive para mover o arquivo. Em vez disso é possível executar um servidor UPnP no computador com o filme 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

66

para criar uma norma técnica para a publicação de dados multimídia em harmonia com aplicativos leitores de mídia. Players multimídia, TVs de tela plana e smartphones agora usam UPnP para procurar conteúdo reproduzível na rede local. 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 endereç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 verificam 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 compartilhamentos nos servidores. A Digital Living Network Alliance (DLNA) [1] é muitas vezes associada com o UPnP. A DLNA é um organismo industrial fundado em 2003 pela Sony e a Intel. A organização emite uma certificação “Kitemark” para o hardware multimídia que cumpre orientações específicas, conhecidas como “Diretrizes para Interoperabilidade de Dispositivos em Redes Domésticas”. A versão

www.linuxmagazine.com.br


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

Quadro 1: O UPnP agrega valores Embora este artigo foque na capacidade do UPnP de compartilhar arquivos multimídia, ele também é utilizado para controlar roteadores e implementar o Internet Gateway Device Protocol (IGD). O UPnP libera automaticamente as portas caso aplicativos específicos perguntem. Claro, há algum risco envolvido, e é por isso que você verá muitas vezes a recomendação de desativar os controles UPnP no seu roteador. O complemento 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.

1.5 dessas diretrizes foi lançada em 2006, e está disponível apenas para membros da DLNA ou clientes pagantes. Com base nessas orientações, os membros da DLNA podem realizar vários testes com seus dispositivos em diversos laboratórios e usar o selo de aprovação da DLNA [2] se as verificações forem bem sucedidas. Se você examinar mais de perto, tudo isso significa que os dispositivos certificados podem se comunicar sem problemas. Como os dispositivos DLNA só precisam suportar um mínimo de formatos multimídia (JPEG, LPCM, MPEG2), é 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 oferecem 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 concentramos nos candidatos licenciados

Linux Magazine #89 | Abril de 2012

Figura 1 Você pode configurar o Rygel editando o arquivo de configuração para incluir os diretórios adicionais que deseja compartilhar na rede.

pela GPL: Rygel, MediaTomb e uShare. Nossa escolha de servidor plataforma foi o Ubuntu 11.10, que lhe permite instalar os três candidatos 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 desenvolvimento há algum tempo. Pode-se iniciar o servidor digitando o comando rygel em um terminal. Se não conseguir encontrar uma configuração específica do usuário, o Rygel primeiro usa o arquivo global do sistema /etc/rygel.conf. De acordo com as instruções encontras lá, o servidor procura em

diretórios padrão do Ubuntu por imagens (~/Imagens), música (~/ Música) e filmes (~/Video). Se você quiser acrescentar algo mais aos padrões, copie o arquivo de configuração para seu diretório home e modifique a cópia para atender às suas necessidades. Para fazê-lo, acrescente os nomes das pastas de mídia desejadas nas linhas, começando com uris= na parte [MediaExport] (figura 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 verifica os arquivos nos diretórios e emite uma mensagem quando completa a inclusão do

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

67


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

Figura 3 Configuração do servidor UPnP com uma interface gráfica.

diretório (figura 2). Uma pequena armadilha: se você copiar novos arquivos 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 inicialmente não percebe. Será necessário reiniciar o Rygel para que os clientes saibam das mudanças. Se você não se sente bem editando 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 autoexplicativa, 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 aplicativos clientes que pretendem apoiar o UPnP no Linux, nosso laboratório descobriu que muitos

dos projetos e seus fornecedores estavam exagerando. Um aplicativo 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 problemas: imagens no visualizador de imagens, músicas no player de áudio e filmes no tocador de filmes. As soluções para desktop que testamos não foram tão eficazes. É possível, por exemplo, adicionar o framework Coherence para o player multimídia Totem obter recursos UPnP, o que implica instalar os pacotes python-coherence e totem-plugins-extra. Então, no Totem, vá até Editar/Plug-ins, marque Coherence DLNA/UPnP-Cliente e reinicie o player. Selecione a entrada 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 Coherence, embora isso tenha funcionado no Ubuntu 11.04. No laboratório, o Totem tocou os arquivos de áudio 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 também não exibiu imagens em ambas 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: Reconfiguração do uShare Figura 4 O XBMC do PPA tomava um café antes de tocar faixas via UPnP.

68

01 $ sudo service ushare start 02 $ sudo service ushare stop 03 $ sudo dpkg-reconfigure ushare

www.linuxmagazine.com.br


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

Figura 5 O eezUPnP funcionou bem com todos os nossos servidores, mas apenas tocou a música.

XBMC teve êxito limitado para tocar música. No Ubuntu 11.04, a central de mídia levava cerca de um minuto 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 (figura 4). Embora o XBMC no Ubuntu 11.04 tenha tocado formatos MPEG4 sem nenhum problema, ele se recusou a reproduzir filmes 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 filmes. 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 serem resolvidos, embora o XBMC funcione melhor com o Rygel do que com o Totem. O VLC também pode oficialmente tocar fluxos UPnP. Mas tendo 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 subdiretório e depois chamar o aplicativo 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 é exatamente 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] configura um serviç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 compartilhar, 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 reconfigurá-lo através de uma interface de texto (linha 3). Para fazê-lo, comece digitando um nome para o compartilhamento (figura 6). Na caixa de diálogo seguinte, selecione um adaptador de rede para executar o serviço. Por fim, digite uma lista separada por vírgula com os diretórios que você quer que o uShare compartilhe.

Clientes com uShare Figura 6 O uShare é configurável através de uma interface baseada em texto. Além da placa de rede para distribuir os arquivos, você também precisa especificar os diretórios a compartilhar.

Linux Magazine #89 | Abril de 2012

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.

69


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

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.

O cliente VLC, por exemplo, trabalhou praticamente em perfeita 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 reproduçã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 mudanç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 identificar 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 congelamento, e pareceu trabalhar bem com uShare de modo geral. Por exemplo, ele identificou o arquivo MOV e conseguiu reproduzi-lo, bem como tocar arquivos MPEG4 sem nenhuma falha. Estranhamente o aplicativo Android UPnPlay de repente deixou de reproduzir filmes neste teste – coisa que nos surpreendeu negativamente. Ele não reconheceu totalmente um filme no formato Flash e tentou tocar dois outros filmes no player de áudio. Apesar

Figura 8 Com o MediaTomb, os usuários podem gerenciar suas ações convenientemente em uma interface gráfica via navegador.

70

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, porém, o aplicativo Android trabalhou com imagens e músicas do uShare corretamente.

Servidor MediaTomb O MediaTomb [8] é o único servidor 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 MediaTomb é instalado como serviço e inicia automaticamente no momento da inicialização. Para finalizar o MediaTomb em qualquer fase posterior, não é suficiente fechar o navegador com a interface: você precisa digitar sudo mediatomb service stop para parar o serviço. Dito isso, o servidor não publica seus arquivos na rede local até que você execute explicitamente o aplicativo 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 (figura 7). Se ignorar esse passo intermediário, tudo o que você verá no navegador é uma mensagem dizendo: MediaTomb UI is disabled. Check your configuration (O MediaTomb está desativado. Verifique sua configuração). Para compartilhar o conteúdo que você quer tornar público, clique em Filesystem na interface web do MediaTomb e depois navegue até os diretórios desejados 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-

www.linuxmagazine.com.br


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

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 verifique regularmente a pasta para encontrar novos arquivos, use o ícone com as duas setas circulares. Para adicionar arquivos individualmente, use o sinal + à direita – isso é tudo o que a interface lhe oferece em termos de controles. Se clicar em Database, você começ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 remover a mídia.

Clientes com MediaTomb Novamente, o UPnPlay não conseguiu reproduzir vídeos em conjunto com o MediaTomb, e apenas exibiu um filme 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 filme 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 imagens no Ubuntu 11.04. Sua variante no Ubuntu 11.10 reagiu exatamente como antes, deixando de funcionar quando lhe requisitaram que reproduzisse filmes, 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 distribuiu. Mais uma vez, não mostrou nenhuma imagem. O Totem também tocou todos os filmes sem nenhum problema – pelo menos no Ubuntu 11.04. Percebemos pausas curtas entre as faixas mas, fora isso, o aplicativo tratou a coleção de faixas muito bem. Mas, mais uma vez, simplesmente ignorou as imagens.

Mais informações [1] Digital Living Network Alliance: http://www.dlna.org/ [2] Certificaçã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/

Linux Magazine #89 | Abril de 2012

Conclusão Quando o UPnP funciona, poupa aos usuários longas sessões de cópia e proporciona um fácil compartilhamento de coleções de mídia. Quando se trata do âmago da questão, porém, o conceito revela uma série de fraquezas, 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 dificuldade na exibição de imagens. O único aplicativo que mostrou imagens corretamente foi o Android UPnPlay, mas ele não conseguiu reproduzir filmes em determinadas situações. Dependendo da capacidade do servidor, os clientes UPnP tocaram ou alguns formatos específicos ou todos. Alguns clientes se recusaram a processar os arquivos compartilhados na rede local. Nos testes mais recentes, a melhor 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 compartilhar 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 travar ao tentar reproduzir filmes. Se você só precisa de UPnP para ouvir música, por que não instalar somente o eezUPnP? Ele faz esse trabalho de maneira nada espetacular, porém confiável – em combinação com todos os três servidores. ■

Gostou do artigo? o? Queremos ouvir sua opinião. Fale conosco em cartas@linuxmagazine.com.br ne.com.b Este artigo no nosso o site: site http://lnm.com.br/article/6678 ticle 78

71


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

Geração de gráficos com ggplot

TUTORIAL

Curvas elegantes Adicionar gráficos informativos e atrativos aos seu trabalhos normalmente exige uma boa quantidade de paciência. A ferramenta ggplot2 proporciona estrutura para gráficos e simplifica a vida dos usuários. por Wolfgang Mauerer

O

s estatísticos e cientistas tendem a ver o mundo como uma enorme fonte de dados a serem explorados e entendidos, 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 fornecer material suficiente que não se torna informativo ou definitivo, 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áficos tais como os do tipo planilhas numéricas, Gnuplot 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áfico a partir de uma seleção – gráficos de barra, pontos, linhas ou alguma coisa

72

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 tarefa demorada, especialmente se os dados mudarem continuamente ou se for difícil dizer com antecedência que tipo de visualização exibirá os melhores resultados. Afinal 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 exatamente novas para estatísticos e outros aficionados por dados. Uma solução atraente foi criada pelo estatístico Leland Wilkinson [1], que criou A Gramática dos Gráficos (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áfico 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 implementou os conceitos da “gramática dos gráficos”. A sintaxe e os conceitos do ggplot2 e do GNU R podem parecer não convencionais. Apesar disso, a linguagem não lembra em nada uma coisa impraticável ou inconsistente. A curva de aprendizagem é um pouco mais íngreme do que em outras abordagens, mas seus esforços serão recompensados com ganhos de flexibilidade e com a publicação de gráficos 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 iniciar a partir da linha de comando (ao digitar R) e com diversas interfaces (por exemplo, o modo ESS do Emacs). Para acessar o ggplot2 de dentro de uma sessão R, tudo

www.linuxmagazine.com.br


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

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

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 simples, mas universal, que quase todo aplicativo pode exportar – que descreve 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 volume de dados processados por unidade de tempo. Simultaneamente, os dados diferenciam-se em três configuraçõ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

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

Linux Magazine #89 | Abril de 2012

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 indivudualmente nomeadas. A listagem 2 exibe como o comando read.csv do R cria um quadro 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 texto. O operador <- do R armazena os dados na variável dat. O comando print() final permite verificar e certificar-se de que os dados foram lidos corretamente. Para simplificar as coisas, abordarei 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áfico (figura 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 define um mapeamento estético independentemente da fonte dos dados, que é o quadro de dados dat.sub criado previamente. O mapeamento descreve quais aspectos dos dados serão mapeados para quais componentes no gráfico. O comando especifica que o Volume de dados (eixo y) será plotado sobre o Volume de dados (eixo x). Outro componen-

73


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

te nos dados, Configuração, tem seu código colorido com colour. Em outras palavras, o ggplot2 utiliza a cor para identificar cada configuração. O objeto base ainda não descreve quais objetos gráficos serão usados como ponto de partida para os dados. O ggplot2 administra os objetos gráficos 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áfico (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 define os objetos gráficos em uso. O comando anterior utiliza duas camadas com objetos gráficos simples: pontos (geom_point()) e linhas (geom_line()). O ggplot2 adiciona ambos ao objeto base, transferindo as definiçõ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 permanentemente. O comando: ggsave("/tmp/graph.pdf", g)

escreve a plotagem contida em g para um arquivo no formato PDF especificado. O ggplot2 identifica o formato de arquivo desejado através do sufixo do arquivo. Além do PDF, você pode escolher também PNG, JPG, EPS e SVG. Por padrão, o software cria figuras 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áficos como JPG e BPM utilize a resolução padrão de 300 pontos por polegada; é possível, porém, modificá-la através do parâmetro

dpi. Para criar um gráfico PNG

quadrado, com uma aresta de 5 polegadas em alta resolução, experimente o comando: ggsave("plot.png", g, height=5, width=5, dpi=1200)

É claro que faz mais sentido utilizar formatos vetoriais para prevenir o problema da escala, tanto quanto contornos quadriculados e desenhos que ficam horríveis quando você tenta reutilizá-los.

Uma questão de visualização Como os dados brutos tornam-se cada vez mais complexos, as mensagens 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 é chamado 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 resultados. Em cada passo, é possível observar os diferentes aspectos dos

Listagem 1: Amostra de dados

Figura 3 Plotagem completa do conjunto de dados de teste com vários símbolos para os algoritmos.

74

01 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 [...]

www.linuxmagazine.com.br


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

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

Figura 4 Dimensionamento unidimensional: existe um subgráfico para cada configuração.

dados na plotagem até alcançar uma imagem consistente. Além dos objetos gráficos simples vistos até agora, como pontos e linhas, o ggplot2 suporta uma grande seleção de outros elementos gráficos que os usuários podem combinar sem nenhuma restrição prática. A figura 2 mostra uma pe-

quena seleção, mas você encontrará uma lista completa no site do ggplot2 [2]. O conjunto completo de dados, comparado com um conjunto limitado, contém diversos tipos de algoritmos, que podem ser diferenciados por diferentes formatos (shape) para os símbolos da plota-

Além da fonte completa de dados, dat em vez do subset dat.sub, e da estética shape, o código contém também outro novo recurso. Utilizei o comando size para definir 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 estético utilizado diretamente pelo objeto ggplot(), o geom_point não está ligado aos dados. Em vez disso ele usa um valor fixo, o que explica por que ele não está incluído com o parâmetro aes() – o ajuste é utilizado diretamente. Além disso, o padrão aplica-se apenas aos pontos das camadas, o que não afeta as linhas – 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ítmica. O ggplot2 modifica o eixo do exemplo e certifica-se de que todas as camadas foram modificadas adequadamente.

Diferentes faces

Figura 5 Dimensionamento bidimensional sem cores.

Linux Magazine #89 | Abril de 2012

Um gráfico definitivo precisa conter tanta informação quanto possível para refletir 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 monografias científicas pode levar 10 minutos analisando um gráfico, um leitor de jornais pode não ser assim tão entusiástico). Uma solução possível é não representar aspectos de dados

75


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

implícitos como cores e símbolos, mas explicitá-los na forma de subgráficos. 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 f a c e t _ g r i d (~Configuração) estipula a criação de plotagens separadas para todas as configurações possíveis (isto é, A, B e C). Cada subgráfico 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 horizontalmente com o comando facet_ grid(<Variável>~.). Tome cuidado para não esquecer o ponto final, que é necessário por razões técnicas. Combinar ambas as variáveis com expressão: face_grid(Algorithm~Configuration)

produz o resultado mostrado na figura 5. O comando colour agora é supérfluo, portanto está omitido: quando o gráfico for publicado de forma impressa, uma visualização monocromática pode ser vantajosa, pois evita

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

o uso de impressão colorida mais cara. Por outro lado, você pode plotar mais variações com as cores que não está utilizando para acrescentar ainda mais informações ao gráfico. O dimensionamento funciona muito bem se as variáveis que você separar contiverem apenas algumas

Listagem 2: Criação um quadro de dados 01 02 03 04 05 06 07 08

dat ← read.csv(“data.txt”,header=T) print(dat) Algoritmo Escopo de dados Volume de dados Configuração 1foo326.675104 A 2foo647.190872 A 3foo1287.684894 A 4foo2568.038377 A [...]

categorias, como Configuration neste 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 figura 3 ameaça afundar os leitores em um mar de detalhes, as figuras alternativas de número 4 e 5 são mais legíveis. Será preciso decidir caso a caso que formato servirá melhor aos seus propósitos.

Listagem 3: Ajuste fino 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()

76

www.linuxmagazine.com.br


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

Se necessitar de alguma ajuda para fazê-lo, recomendo ler um bom texto de sobre gráficos 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 eixos – e se você tentou criar gráficos com outros programas, está provavelmente familiarizado com os detalhes entediantes que envolvem alcançar um resultado satisfatório.

Ajuste fino Na vida real, infelizmente é impossível ficar 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 anterior, um número grande de valores é medido (alguns milhares), o que significa que um histograma resumido será o formato escolhido. A listagem 3 mostra o código que cria a plotagem da figura 6 (os dados brutos estão disponíveis online [4]). As correções manuais relacionam-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 (argumentos para scale_y_log10()). A função theme_bw() seleciona um estilo alternativo que otimiza o gráfico para uma representação monocromática. A maior novidade está escondida no objeto gráfico. A plotagem não exibe uma representação dos dados originais, 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 definido. 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áficos mais complexos não são sempre baseados 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á disponí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 ficar sem em seu trabalho diário com este software é o livro escrito pelo autor do ggplot2,

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/

Linux Magazine #89 | Abril de 2012

Wickhan [5]. Infelizmente, uma introdução realmente compreensível sobre o ggplot2 não está disponí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ências (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ê finalmente 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 biblioteca 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áficos que criar dessa maneira em um servidor web, por exemplo. Uma forma mais sofisticada, mas também mais difícil de utilizar, é a função Sweave do R. O sistema combina o R e o ggplot2 com com o sistema de layout do LaTeX para produzir uma dupla dinâmica que entrega um documento imprimível com gráficos elegantes, gerados por fontes combinadas a partir de código R e LaTeX. Os espíritos destemidos encontrarão todos os detalhes no manual [6]. ■

Gostou do artigo? go Queremos ouvir sua opinião. Fale conosco em cartas@linuxmagazine.com.br azine.com r Este artigo no nosso sso site: s http://lnm.com.br/article/6690 r/artic 6690

77


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.