30

Linux Magazine 95

Embed Size (px)

Citation preview

Page 2: Linux Magazine 95

6 www.linuxmagazine.com.br

ED

ITO

RIA

L Eric Hobsbawm (1917 – 2012), historiador marxista britânico de renome internacional falecido recentemente, declarou em 2011 por ocasião do lan-çamento de seu último livro que não podemos confrontar os problemas do século XXI com soluções e sistemas oriundos do século XX. Apesar de essa afi rmação fazer alusão a matérias político-sociais e a sistemas econô-micos, sou pessoalmente da opinião de que questões de mesma ordem provenientes das ciências do conhecimento, aplicadas também ao desen-volvimento de software, à criação e distribuição do saber e da arte, bem como às próprias atividades sociais, fi guram como principais precursoras dos avanços de todo tipo que deverão ocorrer nos anos que virão. O que caracteriza todas essas soluções são os esforços colaborativos que embasam o seu desenvolvimento --- algo que o método científi co vem exercitando há mais de meio milênio, conforme publiquei anteriormente neste espaço.

Assim, a pesquisa científi ca, o conceito de Open Source, diversas iniciativas de Crowdsourcing (Wikipédia, OpenStreetMap etc.) e Crowdfunding (fi nanciamento coletivo), a instituição de padrões aber-tos, a criação de empresas sociais e de cooperativas, além das próprias redes sociais etc., são alternativas colaborativas para um sem-número de atividades através das quais o Homem já apreendeu que, quando se pensa simultaneamente no bem pessoal e no bem comum, as soluções produzidas são evolutivamente imbatíveis.

Estive recentemente no evento de lançamento do Samsung Galaxy Note 10.1 no Brasil, trazido ao mercado nacional com pompa e circuns-tância. Durante toda a apresentação do produto, não conseguia me furtar de imaginar que toda a tecnologia que equipava aquela “maquininha” advinha de décadas de esforço colaborativo hercúleo, na grande maio-ria das vezes voluntário, o mesmo acontecendo do lado da infraestrutura responsável pelo fornecimento dos dados necessários ao funcionamento satisfatório de seus aplicativos. Enquanto produto de massa, pouco im-porta ao consumidor fi nal o arcabouço tecnológico que faz essa solução primordial de computação pervasiva funcionar, mas o fato é que, sem os avanços oriundos do desenvolvimento colaborativo, é muitíssimo prová-vel que a criação desse tipo de dispositivo demandasse muito mais tempo para acontecer. O mesmo vale para praticamente todas as iniciativas de tecnologia de consumo existentes no mercado atual: elas assentam sobre atividades colaborativas, que têm o poder de democratizar o acesso à in-formação e de efetivar a inclusão digital nas sociedades. Essas iniciativas barateiam processos de produção, transformam a informação em bem coletivo, pavimentam o caminho para o DIY – Do It Yourself (do inglês, “Faça você mesmo”), o que resulta em uma civilização mais empreende-dora, produzindo cultura e conhecimento, e realimentando um círculo virtuoso capaz de reduzir desigualdades e de criar oportunidades a todos. Isso é o futuro, hoje, a frente do seu tempo, e os sistemas políticos e eco-nômicos deverão, pouco a pouco, assimilar esses princípios, de modo a permitir que o Homem se ocupe tão somente da sua evolução intelec-tual e moral, razão precípua para a qual vivemos, no fi nal das contas. ■

Rafael Peregrino da SilvaDiretor de Redação

À frente do seu tempoExpediente editorialDiretor Geral Rafael Peregrino da Silva [email protected]

Editores Flávia Jobstraibizer [email protected]

Laura Loenert Lopes [email protected]

Editora de Arte Larissa Lima Zanini [email protected]

Editor Online Felipe Brumatti Sentelhas [email protected]

ColaboradoresAlexandre Borges, Alexandre Santos, Augusto Campos, Ben Martin, Brian Proffi tt, Cezar Taurion, Charly Kühnast, David J. Dodd, Jon ‘maddog’ Hall, Klaus Knopper, Kurt Seifried, Marcin Teodorczyk, Markus Junginger, Michael Messner, Thomas Drilling, Tim Schürmann, Zack Brown.

Tradução Laura Loenert Lopes, Rodrigo Garcia,

Sebastião Luiz da Silva Guerra.

Revisão Ana Carolina Hunger.

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 95

8 www.linuxmagazine.com.br

CAPA

Sempre alerta! 33

Rápidos e silenciosos, invasores podem atacar uma rede, danifi cá-la e sair sem deixar rastros antes que você perceba. Saiba como evitar estes e outros problemas de segurança.

Rede de segurança 34

Não está interessado em depender da consultoria de um hacker profi ssional? Pode ser interessante confi ar um rastreador de vulnerabilidade a um software especializado neste tipo de tarefa, como o OpenVAS.

Agulha no palheiro 40

A beleza do Wireshark não está somente em seu funcionamento em tempo real. Ao salvar um histórico de atividades de rede em um arquivo pcap usando uma ferramenta como a tcdump, podemos fi ltrar os dados com o Wireshark para localizar evidências de invasão.

Análise de vulnerabilidades 44

Nesse artigo, demonstramos um ataque bem-sucedido a um servidor via IPv6 e explicamos como as principais ferramentas de segurança lidam com o protocolo.

ÍND

ICE

Page 4: Linux Magazine 95

9

SEGURANÇASegurança da informação 57

Pioneiro em detectar vulnerabilidades em sistemas antivírus, vice-presidente da Sourcefi re detalha solução de segurança ideal e comenta sobre o cenário brasileiro, inovador em malwares.

Olhar penetrante 60

Tire proveito do baixo consumo de energia oferecido por dispositivos NAS modernos para monitorar suas câmeras.

TUTORIALCríptico 66

A criptografi a é uma parte importante da segurança em TI, e o OpenSSL é uma conhecida ferramenta de criptografi a para o Linux. Especialistas confi am no OpenSSL porque é livre, possui muitos recursos e é fácil de usar em scripts Bash.

Computação pioneira 70

A súbita popularidade de computadores miniboard como o Raspberry Pi trouxe de volta o espírito pioneiro dos primeiros dias do Linux. Repentinamente, o “faça você mesmo” na comunidade de código aberto está de volta.

PROGRAMAÇÃOCentro do alvo? 72

A linguagem de programação Dart é a atual alternativa do Google ao JavaScript. Executada principalmente em navegadores, também pode ser utilizada em linha de comando e em servidores como substituta para o PHP .

SERVIÇOSEditorial 06

Emails 10

Linux.local 78

Preview 82

Linux Magazine #95 | Outubro de 2012

| ÍNDICELinux Magazine 95

COLUNASKlaus Knopper 12

Charly Kühnast 14

Augusto Campos 16

Alexandre Borges 18

Kurt Seifried 20

Zack Brown 22

NOTÍCIASGeral 24

➧ HTML5 deve estar completo até 2014

➧ A versão beta do RHEL 5.9 inclui drivers para o Hyper-V

➧ SUSE Manager 1.7 suporta PostgreSQL e IPv6

➧ Xen 4.2 traz nova coleção de ferramentas

CORPORATENotícias 26

➧ Red Hat com maior faturamento e menor lucro

➧ Rackspace entrega OpenStack para fundação independente

➧ Foxconn investirá R$1 bilhão no Estado de São Paulo

Coluna: Jon “maddog” Hall 28

Coluna: Cezar Taurion 30

Coluna: Alexandre Santos 32

ANDROIDToque perfeito 50

Com a versão 2.0 do Android, os desenvolvedores passaram a ter acesso a recursos multitoque anteriormente reservados a aplicativos do sistema. Mas atenção: é preciso ter cuidado ao manusear a API .

REDESSquid no meio 54

Como monitorar a rede quando os sistemas-clientes se conectam a servidores seguros através do protocolo HTTPS ? Mantenha o monitoramento em dia com o servidor proxy Squid.

Page 5: Linux Magazine 95

32

CO

RP

OR

ATE

www.linuxmagazine.com.br

Vivemos hoje um consenso de que a tecnologia da informação pode expandir nossa capacida-de de comunicação, colaboração, comparti-

lhamento de conhecimento e, por extensão, a nossa capacidade de descoberta e inovação.  

Até a chegada da era digital, a maioria das pes-soas aceitou um sistema padrão de conhecimento. Os alunos estudavam temas, ganhavam credenciais para provar sua profi ciência e tornavam-se especialis-tas. Parte destes especialistas conduziam pesquisas e transmitiam conhecimento escrevendo livros e artigos para compartilhar suas descobertas e conclusões com o meio acadêmico e profi ssional. Outros, ao aplicar o conhecimento na prática, comprovavam a teoria ou a derrubavam. Conforme essas novas descobertas iam ganhando aceitação, juntavam-se ao corpo de conhecimento estabelecido onde forneciam a base de conhecimento para o próximo nível de aprendi-zagem num ciclo seguro e lento.

Mas, desde 1961, quando o MIT demonstrou o pri-meiro sistema mundial de compartilhamento [1] , o embrião das mídias digitais passou a impulsionar o desenvolvimento e a adoção de tecnologias colabora-tivas cada vez mais sofi sticadas. Hoje usamos email, mídias sociais, mensagens instantâneas, fazemos con-ferências pela Internet e compartilhamos espaços de trabalho através de serviços online.

A abundância de informações na rede tornou ain-da mais difícil discernir o que é verdadeiro daquilo que é falso. O co-fundador da Wired, Kevin Kelly, recentemente escreveu que os seres humanos publi-caram pelo menos 32 milhões de livros, 750 milhões de artigos e ensaios, 25 milhões de músicas, 500 milhões de imagens, 500 mil filmes, 3 milhões de vídeos, programas de TV e curtas-metragens, além

de 100 bilhões de páginas públicas na Internet, e a maior parte desta explosão de conhecimento acon-teceu nos últimos 50 anos. Mesmo com o temor de que nossas mentes possam estar sendo modificadas pela natureza superficial da Internet [2] , o conheci-mento avança a um ritmo sem precedentes, alavan-cado por esta “Inteligência Darwiniana Coletiva” que surge dessa gororoba digital. Pessoas comuns oferecem abordagens e soluções inovadoras para problemas que antes só uns poucos privilegiados tinham acesso.  Agora e cada vez mais, “a pessoa mais inteligente da sala é a sala em si”. Uma rede digital que une pessoas e ideias na sala e se conecta aos que estão fora dela.

Por mais que reclamemos do excesso de lixo digital, prefi ro parafrasear o teórico organizacional Russell Ackoff que, em 1988, já dizia: “não é o excesso de informação; é falha nos nossos fi ltros”. Que venha a Web Semântica [3] para nos salvar. ■

Coluna do Alexandre Santos

Mais informações:

[1] Compatible Time-Sharing System:

http://en.wikipedia.org/wiki/Compatible_Time-Sharing_System

[2] What the Internet Is Doing to Our Brains, by

Nicholas Carr: http://www.theshallowsbook.com/nicholascarr/Nicholas_Carrs_The_Shallows.html

[3] W3C Web Semântica: http://www.w3.org/2001/sw/

Alexandre Santos ([email protected]) é gerente de estratégia e marke-ting de System z da IBM Brasil.

Inteligência coletivaConhecimento na era digital existe para ser compartilhado. E o volume

de dados armazenados na rede tende a crescer assustadoramente.

Cabe a nós, usuários, saber fi ltrar aquilo que realmente nos interessa.

Page 6: Linux Magazine 95

33Linux Magazine #XX | Mês de 200X 3333333333333333333Linux Magazine #XX | Mês de 200X

Prevenção contra invasão

Sempre alerta! Rápidos e silenciosos, invasores podem atacar uma rede, danifi cá-la e sair sem deixar rastros

antes que você perceba. Saiba como evitar estes e outros problemas de segurança.

por Flávia Jobstraibizer

A segurança de redes e sistemas e seu contínuo monitoramento é um assunto vasto e por vezes complicado no mundo da tecnologia da infor-

mação. No entanto, existe no arsenal do profi ssional de TI, diversas ferramentas úteis para o monitoramento, busca e prevenção de potenciais ataques ou problemas relacionados a segurança.

Entre tantas tarefas que um administrador de sis-temas precisa desempenhar durante sua jornada de trabalho, a segurança da rede e dos sistemas sob sua responsabilidade acaba sendo relegada para segundo plano. Isso se deve ao fato de que os profi ssionais de-legam a tarefa do monitoramento para determinadas ferramentas que, embora efi cientes, precisam de uma mãozinha para realizar seu trabalho com excelência.

Nesta edição da Linux Magazine vamos falar sobre o preocupante assunto da invasão de redes e sistemas. Os invasores modernos são muito mais efetivos do que antigamente. São rápidos, silenciosos e depois de atingirem seu objetivo – seja roubar informações, seja danifi car um sistema – vão embora sem deixar rastros, na maioria das vezes. E o problema mesmo, acaba fi cando na mão do profi ssional que agora terá uma grande dor de cabeça para resolver.

Um dos mais efi cientes monitores de rede, o Wireshark, será abordado nesta edição, em conjunto com algumas ferramentas menos conhecidas e que fazem parte da so-lução. Aprenda como ler e interpretar informações em busca de potenciais evidências de invasão.

O profi ssional que estiver engajado em encontrar vulnerabilidades que potencialmente podem ser uti-lizadas por invasores, deve conhecer a ferramenta OpenVAS. Indispensável no arsenal do analista de segurança, o OpenVAS é uma solução completa para busca de vulnerabilidades em locais específi cos como softwares, portas do servidor e serviços locais como os protocolos de email e web.

Realizamos também, uma variedade de testes de invasão em redes que já estão funcionando sob o novo protocolo IP, o IPv6. Descubra quais são as vulnerabilidades que o

novo protocolo IP esconde e prepare-se para, juntamen-te com a adoção do protocolo, manter sua rede segura!

A nova geração da tecnologia traz diversos benefí-cios como o IPv6, o HTML5, BIG DATA, HPC, novos sistemas de arquivos, novos kernels e toda uma sorte de ferramentas de segurança para manter os invasores longe dos seus dados. No entanto, nem toda essa avan-çada tecnologia fará com que você durma tranquilo. É preciso estar sempre alerta! ■

CA

PA

Matérias de capaRede de segurança 34

Agulha no palheiro 40

Análise de vulnerabilidades 44

Page 7: Linux Magazine 95

50 www.linuxmagazine.com.br

ANDROID | Multitoque

Android multitoque

Toque perfeito Com a versão 2.0

do Android, os

desenvolvedores passaram

a ter acesso a recursos

multitoque anteriormente

reservados a aplicativos

do sistema. Mas atenção:

é preciso ter cuidado

ao manusear a API .

por Markus Junginger

O sucesso do iPhone demons-tra que os controles mul-titoque oferecem muitos

benefícios práticos. Não é de se admirar que concorrentes do iPho-ne trabalhem duro no desenvolvi-mento de suas próprias tecnologias multitoque. O Google estendeu a versão 2.0 do Android API para que desenvolvedores e usuários pudes-sem se benefi ciar de recursos que envolvem toques e gestos.

Uma infi nidade de touchpads Ao contrário do iOS, o Android precisa lidar com uma variedade de combinações de hardware e soft-ware. Primeiro, é preciso trabalhar com uma API que suporte múltiplas entradas por toque. No caso do An-

droid, isto é o equivalente a uma API nível 5 (Android 2.0 ou mais recente). O hardware também infl uencia no nível de suporte multitoque, e a ver-dadeira extensão deste suporte nem sempre é transparente. Por exemplo, embora o HTC originalmente supor-tasse Android 1.0 em seu modelo G1 (antes mesmo do recurso multitoque ter sido anunciado), o hardware já era capaz de identifi car diversos ti-pos de gestos.

No entanto, o reconhecimento de gestos não é necessariamente o mesmo que suporta multitoque. Dispositivos com telas resistentes ao toque, em particular, frequente-mente detectam apenas um único toque – isto se aplica, por exemplo, ao HTC Tattoo.

Outros dispositivos retornam ape-nas uma caixa delimitadora: embora estes dispositivos possam identifi car uma caixa entre dois dedos, não são capazes de identifi car toques indivi-duais. A fi gura 1 ilustra estas restrições de hardware: o desenho mostra dois dedos posicionados de forma distin-ta em uma caixa delimitadora. Se os dedos do usuário se moverem de uma posição a outra, o dispositivo frequentemente confunde as posi-

ções dos dedos e só identifi cará a caixa com segurança. Muitos apa-relhos HTC, como o Desire, usam esta tecnologia.

O primeiro smartphone com An-droid 2.0, o Motorola Droid, de-tectava as posições dos dois dedos individualmente. O Galaxy S é ca-paz de identifi car e processar até quatro toques simultâneos. Os de-senvolvedores não devem assumir que a tecnologia multitoque estará disponível onde quer que Android esteja presente. Para aplicativos que dependem de múltiplas entradas por toque para recursos críticos, o desenvolvedor deve adicionar uma nota ao manifesto para garantir que somente os dispositivos multitoque sejam capazes de instalar o aplica-tivo no Google Play:

<uses-feature android:name = \"android.hardware.touchscreen. multitouch" />

Descoberta das entradas multitoque A API multitoque do Android é base-ada no recurso de toque, introduzido no Android 1.0. A extensão principal para multitoque está relacionada

Listagem 1: onTouchListener 01 public boolean onTouch(View v, MotionEvent event) {

02 if (event.getAction() == MotionEvent.ACTION_DOWN) {

03 int x = event.getX();04 int y = event.getX();05 doSomething(x,y);06 }07 }

AN

DR

OID

Page 8: Linux Magazine 95

51

| ANDROIDMultitoque

Linux Magazine #95 | Outubro de 2012

com a classe MotionEvent , que inclui recursos adicionais suportados pelo Android 2.0 [1] .

Para começar, aceite objetos MotionEvent . Um desenvolvedor normalmente instala um recursolistener para uma visualização usan-do setOnTouchListener() ou substi-tui as classes Activity ou View em onTouchEvent() . A listagem 1 mostra um esqueleto para o onTouchListener .

Como é possível notar na lista-gem 1 , o desenvolvedor acessa to-dos os dados relevantes, tais como a ação realizada ou coordenadas x e y , através dos métodos de acesso a objetos MotionEvent . Na sequência de um evento ACTION_DOWN , desen-cadeado pelo Android quando o usuário toca na tela pela primeira vez, o sistema operacional envia eventos ACTION_MOVE para movimen-tação de dedos.

Os eventos continuam até que o usuário pare de tocar na tela. O Android então informa ao aplicativo que o dedo deixou a tela, e envia um ACTION_UP . Como indica o método

de assinatura onTouch() , é possível registrar um OnTouchListener com múltiplas visualizações.

Na base desta curta atualização MotionEvent , o desenvolvedor pode-rá criar extensões de múltiplas en-tradas por toque. Se atualizarmos um aplicativo Android existente, não há necessidade de modifi car a estrutura do aplicativo pois os dados das entradas multitoque utilizam o mesmo caminho. Isto fornece um signifi cado adicional ao código do método getAction() : o número in-teiro de 32-bit codifi ca dois valores. Podemos isolar esses valores usando bitmasks apropriadas e deslocamen-tos de bits:

int action = event.getAction() & MotionEvent.ACTION_MASK;

int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_ MASK) >> MotionEvent.ACTION_ POINTER_ID_SHIFT;

A action é, portanto, equivalente e familiar ao código premultitoque. A variável pointerIndex contém um

índice para o indicador responsável pelo evento.

Liberdade para os dedos Se precisar manter cada dedo na tela por um período de tempo, será ne-cessário utilizar indicadores de ID. O getPointerId() , que pressupõe o indicador de index como parâme-tro, cuida desta tarefa. O exemplo a seguir demonstra o uso de IDs: o indicador e o dedo médio tocam na tela, um após o outro. Se o usuário manter um dedo da tela, o programa não consegue identifi car o dedo sem conhecer o ID do indicador.

No exemplo, o dedo indicador fornece um indicador ID de 0 por ser o primeiro a tocar na tela, e ao dedo médio é atribuído o próximo indicador ID de 1 . Com base nos IDs, o programa pode identifi car cada dedo individualmente e, assim, sabe qual dedo ainda está tocando a tela.

A utilização de indicadores múl-tiplos introduz dois novos códi-

Listagem 3: View mostra os valores 01 class TouchView extends View {02 public TouchView(Context context) {03 super(context);04 setBackgroundColor(Color.WHITE);05 }0607 protected void onDraw(Canvas canvas) {08 super.onDraw(canvas);09 for (int i = 0; i < MAX_POINTERS; i++) {10 PointF point = points[i];11 if (point != null) {12 paint.setColor(getColor(i));13 canvas.drawCircle(point.x, point.y,14 radius, paint);15 String text = getActionText(i);16 float width = paint.measureText(text);17 canvas.drawText(text, point.x - width / 2,18 point.y - radius - calcDevicePixels(8),19 paint);20 }21 }22 canvas.drawText(“Pointer: “ + pointerCount,23 10, calcDevicePixels(30), paintInfoText);24 }25 }

Listagem 2: onTouchListener recebendo Motion Events 01 public boolean onTouch(View v, MotionEvent e) {02 int action = e.getAction() & 03 MotionEvent.ACTION_MASK;04 int pointerIndex = (e.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;

05 int actionId = e.getPointerId(pointerIndex);06 pointerCount = e.getPointerCount();07 if (actionId < MAX_POINTERS) {08 lastActions[actionId] = action;09 }10 for (int i = 0; i < pointerCount; i++) {11 int pointerId = e.getPointerId(i);12 if (pointerId < MAX_POINTERS) {13 points[pointerId] = new PointF(e.getX(i),14 e.getY(i));15 if (action == MotionEvent.ACTION_MOVE) {16 lastActions[pointerId] = action;17 }18 }19 }20 touchView.invalidate();21 return true;22 }

Page 9: Linux Magazine 95

52 www.linuxmagazine.com.br

ANDROID | Multitoque

gos de ação: ACTION_POINTER_DOWN e ACTION_POINTER_UP correspondem a ACTION_DOWN e ACTION_UP ; a diferença é que o Android não os utiliza até que um segundo dedo toque na tela.

O exemplo demonstra a sequê-ncia de ações. Primeiro o dedo 1 toca a tela, desencadeando assim uma ACTION_DOWN . Quando o dedo 2 toca a tela, é disparado um evento ACTION_POINTER_DOWN . Se os dedos se moverem em seguida, o Android re-gistrará um ACTION_MOVE . Se o dedo 1 então se erguer para fora da tela, o código fornecerá um ACTION_POINTER_UP , considerando que este se trata de um evento ACTION_UP para o dedo 2.

O aplicativo Multitouch Test , dis-posto na fi gura 2 , resume os principais aspectos relacionados às múltiplas entradas por toque no Android. O aplicativo, disponível no Google Play, serve para visualizar os even-tos multitoque e é útil como ponto de partida para experimentação de extensões próprias.

Teste de múltiplos toques O recurso oferecido pelo aplicativo de teste é limitado: ajuda a visualizar cada indicador a partir de um círculo, que assume diferentes cores dependen-

do do código utilizado para chamar a ação. O círculo fi ca azul quando o usuário toca a tela, verde quando o usuário move um dedo, ou cinza quando acionado o código para um dedo sendo levantado fora da tela. O aplicativo mostra também nos círculos o ID do indicador e o último código utilizado para chamar a ação.

É preciso implementar o código do aplicativo no contexto de uma atividade. A listagem 2 mostra a im-plementação do OnTouchListener , que vincula-se à exibição usando o setOnTouchListener() , conforme ilustrado na listagem 3 . Para econo-mizar espaço, deixamos de fora as defi nições de membros, tais como as arrays points[] e lastActions[] . O código-fonte completo está disponí-vel online [2] .

As primeiras linhas da listagem 2 resumem o código da ação e o índi-ce do indicador. Após este passo, o código da ação e da posição do in-dicador estão descritos para as arrays lastActions[] ou points[] . O índice de ambas as arrays corresponde à identifi cação do indicador, em cada caso. O número de indicadores é li-mitado pelas constantes MAX_POINTERS : o aplicativo gerencia um número máximo de 20 indicadores.

Um caso especial ocorre quando são defi nidos os códigos para uma determinada ação. O MotionEvent para o ACTION_POINTER_DOWN retorna múltiplos valores, desde que o AC-TION_POINTER_DOWN refi ra-se apenas a um único indicador ID. O único caso em que é possível usar os valores lastActions() para todos os indica-dores no MotionEvent é o ACTION_MOVE . Por fi m, o touchView.invalidate() na linha 20 dispara uma atualização de status e mostra os novos valores.

A visualização neste aplicativo é uma classe separada, diretamente derivada da View , como mostra a listagem 3 . O objeto Canvas fornece um método simples de desenhar cír-culos em um loop. Os códigos para

Quadro 2: Máscaras e deslocamentos O Google adicionou recursos que facilitam a estimativa do código de chama-

da de ação e indicadores de índice. Os desenvolvedores não precisam mais

de bitmasks e deslocamentos de bits. Em vez disso, o getActionMasked() e o

getActionIndex() retornam os valores exigidos pelo MotionEvent .

Incidentalmente, o Android 2.2 modifi ca as constantes ACTION_POINTER_ID_MASK

e ACTION_POINTER_ID_SHIFT que ocorrem nos exemplos mostrados neste arti-

go. Porque eles se relacionam com o indicador de índice mais do que com o

ID, são agora mais corretamente entitulados de ACTION_POINTER_INDEX_MASK

e ACTION_POINTER_INDEX_SHIFT .

Quadro 1: Indicadores Nos círculos multitoque do Android, um indicador é representado por um

dedo que interage com a tela. Em outras palavras, um indicador pode ser

alguma outra fonte de entrada, como um cursor do mouse. Os desen-

volvedores enumeram indicadores usando o getPointerCount() . Ao in-

vés de métodos de acesso sem parâmetros do MotionEvent , temos ago-

ra métodos sobrecarregados, cada um com o indicador de índice, como o

getX(int pointerIndex) . Dependendo do aplicativo, o desenvolvedor pode

não precisar de mais nada além de informações para projetar um aplicativo

que suporte múltiplas entradas por toque.

Figura 1 Dedos cruzados causam problemas, a caixa de vínculo para as posi-

ções dos dedos é a mesma para ambas as variantes, o que signifi ca

que o dispositivo não pode identifi car precisamente as posições.

Page 10: Linux Magazine 95

53

| ANDROIDMultitoque

Linux Magazine #95 | Outubro de 2012

coordenadas e chamadas de ação necessários para desenhar círculos são coletados pelo onTouchListener da listagem 2 nas arrays points[] e lastActions[] . A cor e o texto de um círculo são defi nidos pelos métodos getColor() e getActionText() . A múl-tipla escolha determina o valor de retorno, que depende do código da última ação atribuída ao indicador.

Finalmente, o aplicativo também desenha o número de indicadores contidos no MotionEvent em formato texto. O método calcDevicePixels() é auxiliar e verifi ca o número espe-cífi co de pixels do dispositivo, que por sua vez depende da profundidade de pixels dispostos na tela.

Pinch e zoom Possivelmente, a novidade mais in-teressante é o ScaleGestureDetector , que detecta e amplia gestos. Três etapas são necessárias para utilizá-lo:primeiro, é preciso instanciar um ScaleGestureDetector ; em segui-da, passar cada MotionEvent para o ScaleGesture-Detector ; por último,é necessário um listener especial para coletar os novos dados.

A listagem 4 mostra estas três etapas nos métodos init() e onTouchEvent() , e na classe MyScaleListener . O método onScale() escalona a visualização ao

multiplicar a propriedade ScaleFactor pelo ScaleGestureDetector .

Com os métodos getFocusX() e getFocusY() é possível verifi car o foco do dimensionamento.

Conclusão Hardware e software em dispositivos Android possuem uma enorme infl u-ência no suporte multitoque. Telas que suportam múltiplas entradas

por toque dependem do Android 2.0 ou mais recente e muitas vezes apresentam capacidades limitadas – um fato que os desenvolvedores precisam ter em mente na constru-ção de seus aplicativos.

A API multitoque, com suas MotionEvents e diversos indicadores, asseguram um lugar no pódio para o Android no que se refere a dispositi-vos dotados deste recurso. ■

Mais informações

[1] API multitoque para Android:

http://developer.android.com/reference/android/view/MotionEvent.html

[2] Código-fonte para este artigo:

http://smart-developer.com/Resources/Article-Code

Gostou do artigo?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

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

so sit

article

zine.com.

648

o?a opinião.

Listagem 4: Pinch e Zoom 01 // called in constructor, for example02 private void init(Context context) {03 scaleDetector = new ScaleGestureDetector(context, new MyScaleListener());

04 }0506 public boolean onTouchEvent(MotionEvent ev) {07 scaleDetector.onTouchEvent(ev);08 // ...09 }10 private class MyScaleListener11 extends ScaleGestureDetector.SimpleOnScaleGestureListener {12 public boolean13 onScale(ScaleGestureDetector detector) {14 skalierung *= detector.getScaleFactor();15 invalidate();16 return true;17 }18 }

Figura 2 O aplicativo Multitouch Test permite que programadores depurem

eventos e os exibam em cores.

Page 11: Linux Magazine 95

60 www.linuxmagazine.com.br

SSEGURANÇA | Monitoramento com NAS

Monitoramento com NAS

Olhar penetrante Tire proveito do baixo consumo de energia

oferecido por dispositivos NAS modernos

para monitorar suas câmeras.

por Ben Martin

O moderno hardware NAS possui a CPU embutida que muitas vezes oferece grande

desempenho com baixo consumo de energia. Muitas destas unidades ne-cessitam de menos de 10 watts para operar com uma conexão de rede gigabit e a CPU a 100% de uso. Um NAS com baixo consumo de energia pode consumir de 10% a 20% da ele-tricidade que um hardware desktop precisa para funcionar. A principal questão passa a ser então: seria a CPU do NAS “rápida o sufi ciente” para monitorar e detectar o movimento de uma ou mais câmeras?

Neste artigo, examinaremos se o QNAP TS-219P II [1] , com uma CPU ARM Marvell de 2 GHz e 512MB de RAM, está pronto para o desafi o de detecção de movimento em tempo real ( fi gura 1 ). Note que grande parte do artigo também deve ser diretamen-te aplicável ao seu primo mais barato

de carcaça única, o QNAP TS-119p II , que ostenta a mesma CPU/RAM.

Uma solução popular para moni-toramento com câmera e detecção de movimento é a suite ZoneMinder [2] . As câmeras podem ser tanto de rede IP como câmeras USB conectadas diretamente ao servidor ou em outra máquina na rede. O ZoneMinder pode monitorar todas as suas câmeras, detectar movimento em áreas-chaveou zonas, e notifi cá-lo sobre a ativi-dade em áreas de interesse. As zonas limitam a área de monitoramento, de modo que o ZoneMinder pode ver quando alguém caminha até sua garagem sem que o vento nas árvores acione um alarme falso.

Duas empresas que fazem hardware NAS usando CPU ARM de alto nível são a Synology e a QNAP . Produtos de baixa capacidade com CPUs de 1.2GHz e 256MB de RAM também estão disponíveis, assim como modelos

mais sofi sticados com CPUs de 2GHz e 512MB de RAM. No intervalo dos 1,2 GHzz estão o Synology DS212j e o QNAP TS-212; no intervalo dos 2 GHz estão o Synology DS212+ e o QNAP TS-219P II, juntamente com o de carcaça única QNAP TS-119p II.

Tanto o produto da QNAP quanto o da Synology vem com sua própria distribuição Linux. Ambas as unidades NAS permitem usar o gerenciador de pacotes ipkg para instalar aplicativos de código aberto adicionais e complementar o software embarcado. Por exemplo, o leitor pode instalar o padrão CoreUtils ao invés dos binários-padrão BusyBox .

Instalação Se o usuário não possuir um dispositivo NAS instalado, a confi guração inicial para este aparelho exige que seja feita a remoção de uma (ou mais) bandejas individuais de disco rígido, um parafuso do disco da bandeja, e o deslizamento de volta para a unidade. Uma vez que os cabos de energia e rede estiverem conectados, teremos completado a confi guração de hardware. Por outro lado, o Synology DS212j desliza em duas partes separadas, e fi xamos o disco rígido diretamente em um gabinete de disco rígido interno antes de fazer-mos o mesmo com a capa exterior do Synology NAS.

Quando ligamos o TS-219P II, o dispositivo tentará obter um endereço

Listagem 1: Instalação do Debian Wheezy 01 # for if in `seq 1 6`; do02 cat /dev/mtdblock$if > mtd$if03 done04 # cp mtd* /share/external/sdi1/05 # sync06 # export DIST= ftp://ftp.debian.org/debian/dists/wheezy/main/ installer -armel/current/images/kirkwood/network-console/qnap/ts-219/

07 # wget $DIST/flash-debian $DIST/initrd.gz $DIST/kernel $DIST/model08 # sh flash-debian09 Your MAC address is 00:08:9B:C8:D7:1110 # reboot11 # exit

SE

GU

RA

A

Page 12: Linux Magazine 95

61

| SEGURANÇAMonitoramento com NAS

Linux Magazine #95 | Outubro de 2012

IP via DHCP, após o qual podemos efetuar login em uma interface online do dispositivo NAS e concluir a instala-ção. A confi guração inicial do TS-219P II envolve o upload de um arquivo de imagem “fi rmware” de 140 MB ( fi gura 2 ). Após o NAS reinicializar e cair na distribuição Linux que acabamos de carregar, é preciso responder algumas perguntas sobre localidade, senhas e preferências do aplicativo ( fi gura 3 ).

Para muitos fi ns, a combinação de pacotes nativos do fornecedor NAS complementada com pacotes dispo-níveis através do ipkg é sufi ciente. Se o aplicativo que o usuário necessita não está incluso no ipkg, é possível compilá--lo e instalá-lo. Este processo geralmente envolve a criação de um ambiente em máquina virtual para a CPU ARM em uma máquina desktop, bem como a compilação do software. Normalmente, os cabeçalhos de desenvolvimento de software no NAS não estão disponíveis facilmente sob a forma de pacotes para instalação no próprio equipamento.

Como instalar o Debian no ARM Para uma personalização mais avança-da, temos a opção de instalar o Debian ao invés de utilizar o fi rmware de fábri-ca. Instalar o Debian permite acessar o ZoneMinder através do gerenciador de pacotes e compilar o software mais facilmente na máquina NAS.

A instalação do Debian em uma máquina ARM personalizada [3] pode parecer assustadora pela primeira vez. Histórias de pessoas com instalação pela metade que viram apenas “tijolos caros” são folclore comum; para tornar as coisas mais intrigantes, não temos qualquer tela ligada ao dispositivo que permita descobrir o que deu errado. Além disso, teremos que confi gurar o suporte de opções personalizadas para o hardware fornecido, como alto-falantes, LEDs e fans.

Dito isto, o processo de instala-ção do Debian é bastante simples e

provavelmente mais até que a confi -guração do ambiente de compilação necessário para ampliar o número de softwares se continuarmos a usar o fi rmware fornecido [4] . Para prosse-guir, siga os seguintes passos:

1. Opcionalmente, faça uma cópia de segurança do fi rmware do cartão de memória no NAS.

2. Baixe o Debian fl asher, kernel, metadados, e arquivos de instalação initrd.

3. Instale os arquivos na memória fl ash do NAS.

4. Reinicie.5. Conecte-se via SSH no NAS e

conclua o processo com a interface

de instalação do Debian, que é ba-seada em console.

Uma vez que o passo 5 tenha sido concluído, o programa irá reinstalar a memória do NAS para iniciar em um novo sistema Debian.

Além do kernel e o initrd residente na memória fl ash do NAS, as etapas restantes para instalar o Debian são exatamente as mesmas que existem em uma máquina desktop. Como ve-remos mais adiante, o primeiro passo para fazer uma cópia de segurança do fi rmware existente é opcional.

O instalador Debian convenien-temente pega as confi gurações de hosts e de rede que havíamos feito

Figura 2 Enviando a imagem mais recente do fi rmware do site da QNAP.

Figura 1 Equipamentos: QNAP TS-219P II NAS, uma câmera

TP-Link TL-SC3171G, e um disco de 2TB WD Green.

Page 13: Linux Magazine 95

62 www.linuxmagazine.com.br

SSEGURANÇA | Monitoramento com NAS

com o fi rmware QNAP normal e as reutiliza para a instalação do Debian. A maioria das perguntas são sobre localização e como desejamos que discos e partições sejam confi gurados.

Em nossa instalação do Debian “Wheezy” ( listagem 1 ), os primeiros cinco comandos criam uma cópia de segurança da memória fl ash existente em um pendrive. Na linha 6 , os qua-tro arquivos de instalação do Debian mencionados no passo 2 são baixados, enquanto um comando flash-debian na linha 8 nos coloca na memória fl ash do QNAP, pronto para ser carregado quando o NAS for reiniciado.

Após o NAS ser reiniciado, devemos ser capazes de fazer ssh nele como instal-ler@NAS usando a senha install . Prova-velmente teremos que remover a chave do host do arquivo ~/.ssh/known_hosts para o SSH não considere que o host mudou sua chave de forma inespera-

da desde a última conexão. Em segui-da, o usuário deverá ver um menu deboas-vindas como o da fi gura 4 .

Perto do fi nal da instalação, tere-mos a chance de alterar a seleção de aplicativos. É muito importante que o usuário não se esqueça de instalar a opção de servidor SSH, para que possa conectar-se facilmente no NAS quan-do o Debian instalado for executado. Além disso, precisaremos de um servi-dor online, um banco de dados SQL, e um servidor de arquivos enquanto estivermos neste menu. Apesar de um servidor de arquivos não ser realmente necessário para o ZoneMinder, se o u-suário possuir algum espaço sobrando no seu disco rígido, pode desejar acessá-lo através da rede para outros fi ns.

Quando a instalação estiver con-cluída, o instalador pede que sejam removidos todos os discos CD-ROM ou de instalação (que não temos). Na

reinicialização, devemos ser capazes de fazer um ssh como root e encontrar uma ótima máquina Debian nos aguardando. Com um disco WD Green de 2TB exe-cutando, o NAS ocioso deve consumir cerca de 10 watts de energia ( tabela 1 ).

Fora das cinzas Uma desvantagem de usar fi rmware personalizado em um hardware especia-lizado é descobrir o que fazer quando as coisas dão errado. Tínhamos um drive Green de 2TB sobrando e, enquanto este artigo estava sendo escrito, descobrimos por que ele não estava em uso ativo.

Depois que substituímos o kernel na memória fl ash do NAS com o ker-nel e a imagem initrd do Debian, o sistema queria encontrar uma insta-lação Debian para inicializar a partir do disco rígido. O problema era que o disco não queria mais funcionar e, para os objetivos desta análise, não tí-nhamos nos dado ao trabalho de criar um RAID espelhado agradável para o caso de uma simples falha de disco.

Esta situação parece ser um ce-nário do pior caso: um disco rígido danifi cado; o fi rmware na memória fl ash sobrescrito com software que espera que o disco esteja por ali; sem inicialização; sem visor.

Felizmente, mesmo quando sobres-crevemos a memória fl ash do equi-pamento QNAP, podemos colocá-lo em um modo que tentará recuperar a partir da rede a informação que deve estar na memória fl ash [5] . Melhor ainda, o QNAP oferece uma ima-gem de boot do Linux que contém um servidor TFTP para transmitir a imagem fl ash para o NAS.

Ao ligar o laptop diretamente no NAS, iniciar a partir do disco de recuperação no laptop e segurar o botão reset enquanto liga o NAS, o usuário poderá ativar esse modo de recuperação. Uma vez que o NAS ligar, serão ouvidos bipes e diferentes cores LEDs piscarão para que esteja ciente de que algo está acontecendo; no fi nal, terá o NAS com o mesmo

Figura 3 Uma vez que o fi rmware é gravado em disco, confi gure seu login,

localização, IP, e serviços de informação.

Figura 4 Iniciando a instalação do Debian via SSH.

Page 14: Linux Magazine 95

63

| SEGURANÇAMonitoramento com NAS

Linux Magazine #95 | Outubro de 2012

software no fi rmware de quando o comprou, poupando-o de um NAS personalizado que não iria inicializar.

Em seguida, podemos colocar o ins-talador do Debian de volta na memó-ria fl ash do NAS e escolher com mais sabedoria na pilha de discos rígidos disponíveis. É claro que, em produção, todo mundo usa um RAID espelhado ou tem um sólido, automatizado e tes-tado sistema de backup incremental em funcionamento, não é mesmo?

ZoneMinder As principais dependências do Zone-Minder são Perl, MySQL, OpenSSL, a biblioteca JPEG, alguns módulos Perl, e (opcionalmente) FFmpeg. O ZoneMinder inclui código PHP, C++ e Perl. Depois de instalar o Debian no sistema, podemos tirar proveito dos repositórios de pacotes para instalar o ZoneMinder sem ter que compilá-lo. A instalação é simples como chamar um :

apt-get install zoneminder

resultando em cerca de 170 MB de espaço adicional usado no NAS.

Para iniciar a interface online do ZoneMinder, temos que criar um link do arquivo de confi guração do site no diretório conf.d do Apache:

# ln -s /etc/zm/apache.conf /etc/ apache2/conf.d/zoneminder.conf

# /etc/init.d/apache2 restart

Com este link no lugar e o Apa-che reiniciado, devemos ver a in-terface online do ZoneMinder em http://NAS/zm/, supondo que NAS é o endereço IP da unidade NAS.

O botão Add New Monitor na parte inferior da interface do ZoneMinder permite que adicionemos uma nova câmera no sistema ( fi gura 5 ). Para este exemplo, usaremos duas câmeras: a TP-Link TLSC3171G 640x480 IP e a Logitech C910 USB 1080p . A par-te complicada na confi guração de câmeras é saber o que o caminho do host remoto ( Remote Host Path ) deve ser e ter a certeza de que a re-

solução da imagem, largura e altura em pixels coincide com a saída da câmera ( fi gura 6 ).

Além disso, precisamos saber o endereço IP e a porta da câmera e, via HTTP, pode ser necessário entrar com o URL para começar a usar os dados da câmera. Para uma câmera de 640x480, espere utilizar cerca de 10% da CPU somente do ZoneMinder para transmitir dados a uma baixa taxa de quadros [6] . Adicionar zonas para detectar movi-mento em áreas críticas da imagem irá adicionar mais uso de CPU neste valor. Nossa confi guração NAS teve que usar até 25% da CPU para aten-der ao streaming de vídeo a partir de uma webcam com 640x480 para o Firefox ( fi gura 7 ).

Com a câmera TP-Link aponta-da para uma cena escura ao ar livre à noite, a detecção de movimento manteve-se em cerca de 15% da CPU para quadro cheio ( full frame – 640x480) de detecção em uma taxa de quadros baixa ( tabela 2 ).

Memória compartilhada O ZoneMinder precisa manter as imagens recentes que recebe das câ-meras em algum lugar na memória. Nas versões anteriores, o ZoneMin-der usava memória compartilhada para armazená-las. Agora, ele cria e usa arquivos de memória mapeados em /dev/shm . Independentemente de qual sistema esteja em uso, pode ser necessário adequar o NAS para fazer o armazenamento correto de memó-ria disponível para estas imagens.

O ZoneMinder 1.25.0 do Debian Wheezy utilizado neste artigo usa o dospositivo /dev/shm para as imagens. A instalação padrão criou um sistema de arquivos tmpfs com um tamanho limite de 100MB. O ZoneMinder precisa de cerca de 100MB para uma única câmera de 1280x720, e cerca de 35MB para uma única câmera de

640x480. Para calcular a quantidade de memória necessária para o arma-zenamento de imagens da câmera, encontre a memória (bytes) para um único quadro: largura(px) x altura(px) x 3(RGB). Estas imagens são arma-zenadas numa área de buffer na me-mória. O padrão que utilizamos foi de 40 imagens no buffer para uma câmera. O comando :

mount -o remount,size=256m /dev/shm

vai dedicar mais memória para imagens do ZoneMinder. Para fazer isso fun-cionar após uma reinicialização, edite o arquivo /etc/default/tmpfs e defi na shm_size para o tamanho que desejar.

Para economizar memória para câmeras maiores, ajuste o tamanho de buffer para quadros de imagem mostrado na guia Buffers das confi -

Figura 5 Inclusão de uma nova

câmera no ZoneMinder.

Figura 6 Confi guração de uma câmera

de rede no ZoneMinder.

Page 15: Linux Magazine 95

64 www.linuxmagazine.com.br

SSEGURANÇA | Monitoramento com NAS

gurações da câmera. Descobrimos que para usar menos quadros tivemos que excluir, por exemplo, zm.mmap.2 de /dev/shm e fazer o ZoneMinder re-criar um novo arquivo menor quando aceitamos a confi guração da câmera. Usar 20 quadros para uma câmera de 720p requer apenas 53MB de RAM.

Como detectar eventos O que faz o ZoneMinder interessante é a sua capacidade de detectar movi-mento em áreas críticas de um quadro da câmera e gravar o vídeo automati-camente quando o movimento ocorre. Depois de colocar a câmera no modo de detecção de movimento clicando no link Função da câmera na página inicial de instalação do ZoneMinder, podemos mascarar partes do quadro de vídeo clicando no link Zonas da câmera. Desta forma, o ZoneMinder ignora movimento fora da sua área de interesse.

Muitos fatores determinam a quan-tidade de CPU que é necessária para a detecção de movimentos: o tamanho da imagem da câmera, imagens em cores ou imagens em escala de cinza, o número de qua-dros por segundo de um processo, a dimensão das zonas de detecção, e os parâmetros utilizados no algo-ritmo de detecção.

Quando clicamos no nome de uma câmera no ZoneMinder, é mostrada uma visualização ao vivo do que a câmera está captando, junto com uma lista dos eventos que foram de-tectados recentemente e a capacidade de forçar o disparo de um alarme. O disparo de um alarme tem o mesmo efeito que forçar o ZoneMinder a pensar que um movimento signifi -cativo ocorreu na câmera.

Em nosso primeiro teste, usamos uma câmera TPLink com 640x480 a 5fps. O monitoramento usou 15% da CPU, e forçar um estado de alarme causou um salto de até 26% da CPU. Após a confi rmação de um alarme disparado pelo ZoneMinder indi-cando movimento real na câmera, foi confi rmado o mesmo salto para 26% de uso de CPU no NAS.

Monitoramento com uma C910 Logitech através da rede com reso-lução de 1280x720 a 10fps consumiu 72% de CPU do NAS. Baixando para 2fps com a mesma câmera usou até 22% da CPU. A visualização ao vivo a 2fps consumiu um adicional de 40% de CPU. Claramente, câmeras de monitoramento de 720p a 30fps estão além do que a CPU no NAS pode segurar, e detecção de movimento a 10fps provavelmente não é possível, mas se voltarmos alguns quadros por segundo com a mesma câmera, pode ser bom a 720p se o usuário desejar utilizar apenas uma câmera.

Uma câmera USB ultrabarata com 640x480 que só pode produzir vídeo YUYV conectada à porta USB2 do NAS sendo usada a 5fps precisa de cerca de 15% da CPU para monitorar e 50% para transmitir. A detecção de movimento em quadro cheio nesta câmara requer um adicional de 40% de CPU, que tem picos de até 80% se um estado de alarme é disparado.

O uso da CPU não mudou muito entre as predefi nições rápida e me-lhor com baixa, média e altas sensi-bilidades. Reduzir para uma área de alarme de 100x100 diminuiu o uso da CPU a 35%.

Mudar a câmera ligada local-mente para a C910 da Logitech e tentar a resolução de 1280x720 a 5fps dividiu o uso de CPU 50-50 entre monitorar a câmera e verifi -car movimentos nos quadros. Tal divisão de 50-50 parecia suspeita, já que a detecção de movimento deve ser mais custosa do que o simples monitoramento. Depois de voltar para 3fps, o monitoramento usou apenas 30% da CPU e a detecção de movimento usou 68%. Depois de voltar para 640x480 a 4 fps, o moni-toramento consumiu 12% de CPU e a detecção de movimento, 28%. Logo, se o usuário quiser usar este processador, qualquer coisa acima de 640x480 é susceptível a causar problemas de desempenho.

Mergulho no código Pelo fato de não vermos muita diferen-ça no uso de CPU para cada um dos algoritmos de detecção de movimento que o ZoneMinder oferece, decidi-mos dissecar um pouco o código. O código chama Monitor::DetectMotion() a cada quadro para trabalhar a pon-tuação (quantidade de movimento) e se um alarme foi acionado. Tendo esse método retornar “sem alarme” de imediato ao invés de detecção de movimento real resultou em cerca de 8% da CPU a ser utilizada para uma câmera de 640x480 executando a 6fps.

Tabela 1 Uso de energia com o fi rmware de fábrica .

Watts Ação

1 NAS desligado, mas com cabo plugado

7 Disco com giro baixo e nenhum cabo de rede

8 Disco com giro baixo

10 Em execução com o disco girando

13 Discos girando e executando o OpenSSL

Tabela 2 Uso de CPU e RAM da TP-Link (5fps) .

% CPU RAM (MB) Tarefa (Processo)

6-12 43 Monitorar apenas à noite (zmc)

15-25 41 Visualizar no Firefox (nph-zms)

15 42 Detecção de movimento, quadro completo, à noite (zma)

Page 16: Linux Magazine 95

65

| SEGURANÇAMonitoramento com NAS

Linux Magazine #95 | Outubro de 2012

Uma das primeiras coisas que De-tectMotion() faz é criar uma imagem delta, medindo o quanto o quadro atual difere de um quadro de referên-cia. A imagem delta apenas registra a intensidade da diferença para cada pixel em vez da diferença de cada vermelho, verde e azul. Para fazer a imagem delta e excluí-la novamente antes de retornar nenhum alarme, 15% da CPU foi necessária – antes de qualquer detecção de movimento ter ocorrido.

O núcleo do método Imagem::Delta() cria uma imagem delta e registra quan-to cada pixel é diferente de uma ima-gem de referência:

...red = y_r_table[*psrc++ - *pref++];green = y_g_table[*psrc++ - *pref++];blue = y_b_table[*psrc++ - *pref++];*pdiff++ = abs_table red + green + ;...

As variáveis são pref , a imagem de referência; psrc , o quadro atual e pdiff , a imagem delta. Este códi-go pode ser modifi cado e executado mais rapidamente em CPUs ARM com a extensão NEON [7] . De acor-

do com o comando /proc/cpuinfo , a CPU neste equipamento QNAP só tinha disponível as extensões swp half thumb fastmult edsp .

Pelo fato de os valores de referên-cia apresentados na tabela 2 variarem mais com a resolução de imagem e taxa de quadros, apenas preparar e produzir todos os quadros estava consumindo uma quantidade subs-tancial da CPU.

Considerações fi nais Os chips ARM top de linha que equipam alguns hardwares NAS modernos fornecem uma platafor-ma para computação em tempo real bastante interessante, com consu-mo de energia reduzido. A CPU de 2GHz Kirkwood do NAS testa-da aqui poderia realmente apenas lidar com detecção de movimento em uma taxa de quadros baixa em duas câmeras IP com 640x480 ao mesmo tempo.

Tenha em mente que o disposi-tivo pode fazer isso com menos de 15 watts, incluindo o disco rígido. Quando não há eventos acontecen-

do, o equipamento pode cair para menos de 10 watts enquanto ainda monitora ativamente as câmeras em busca de movimentos interessantes.

Monitoramento de câmera é nor-malmente uma proposta de três turnos. A próxima vez que o leitor considerar realocar um PC com con-sumo de 75 watts a 100 watts para este propósito, poderá considerar a alter-nativa NAS, já que a mesma poderia muito bem pagar-se nos primeiros 12-18 meses se levarmos em conta a economia de energia.

Com uma instalação Debian, o NAS tem acesso a uma quantida-de enorme de pacotes de software que permitem a personalização do dispositivo para lidar com uma tarefa específica. ■

Mais informações[1] Página do QNAP TS-

219P II: http://web.qnap.com/pro_detail_feature.asp?p_id=211/

[2] ZoneMinder: http://www.zoneminder.com/

[3] Debian no QNAP NAS: http://www.cyrius.com/debian/kirkwood/qnap/ts-219/

[4] Documentação do instalador

do Debian ARM: http://www.debian.org/releases/lenny/arm/install.pdf.pt_BR

[5] Recuperação de fi rmware do

QNAP: http://wiki.qnap.com/wiki/Firmware_Recovery/

[6] Discussão sobre uso de CPU

pelo ZoneMinder: http://www.zoneminder.com/wiki/index.php/FAQ#Why_is_ZoneMinder_using_so_much_CPU.3F

[7] Arquitetura ARM: http://en.wikipedia.org/wiki/ARM_architecture

Gostou do artigo?Queremos ouvir sua opinião.

Fale conosco em

[email protected]

Este artigo no nosso site:

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

osso s

r/artic

m

ne.com

e:

693

igo?nião.

Figura 7 Monitoramento de uma peça de madeira com o ZoneMinder no NAS.

Page 17: Linux Magazine 95

66 www.linuxmagazine.com.br

TUTORIAL | OpenSSL com Bash

Como usar OpenSSL com Bash

Críptico A criptografi a é uma parte importante da segurança

em TI, e o OpenSSL é uma conhecida ferramenta

de criptografi a para o Linux. Especialistas confi am

no OpenSSL porque é livre, possui muitos

recursos e é fácil de usar em scripts Bash.

por Marcin Teodorczyk

O OpenSSL [1] faz uso da entrada e saída padrões, e suporta uma ampla gama

de parâmetros, tais como opções de linha de comando, variáveis de am-biente, pipes, arquivos e descritores de arquivos. Podemos aproveitar estes recursos para escrever rapidamente scripts Bash [2] que automatizam tarefas, tais como teste de conexões SSL/TLS, conversões massivas entre diferentes formatos de chaves crip-tográfi cas e certifi cados, assinatura/criptografi a em lote de arquivos, auditoria de arquivos protegidos por senha, e implementar ou testar uma infraestrutura de chaves públicas PKI ( Public Key Infrastructure ).

As ferramentas do OpenSSL fornecem muitos módulos que executam tarefas específi cas. Cada módulo não é um executável sepa-rado mas, ao invés disso, é selecio-nado com o primeiro parâmetro do executável openssl . Por outro lado, cada módulo tem uma página de manual separada. Por exemplo, um módulo chamado x509 geren-cia certifi cados digitais X.509 e um módulo chamado pkcs12 gerencia pacotes PKCS12.

Para usar o x509 , devemos execu-tar o seguinte comando:

openssl x509 -param1 param1value

mas, para ver sua página de manual, devemos digitar man x509 .

Como testar conexões SSL/TLS O OpenSSL fornece três módulos que permitem testar as conexões SSL: s_client , s_server e s_time . Os dois primeiros, como os nomes sugerem, são para simular um clien-te e um servidor em uma conexão SSL. O terceiro é para os testes de tempo de conexão. Vamos come-çar com uma análise detalhada no módulo s_client .

O s_client é particularmente útil para verificar quais proto-colos e cifras o servidor aceita utilizar. Esta informação é útil em auditorias de segurança e re-cursos. Por exemplo, podemos usar esta informação de protoco-lo para encontrar servidores que não aceitam um protocolo ou cifra legítimo, evitando assim que um cliente legítimo se conecte. Tam-

bém podemos localizar servidores que aceitam protocolos ou cifras fracos e poderiam assim permitir um ataque malicioso. Com uma pequena ajuda do Bash, é possível automatizar esse processo.

Suponha que os nomes do cliente e do servidor são cliente e servidor , e que o servidor escuta conexões SSL/TLS na porta 443.

Para verifi car quais protocolos o servidor aceita, podemos usar os seguintes parâmetros: -ssl2 , -ssl3 , -tls1 , -no_ssl2 , -no_ssl3 , ou -no_tls1 .

Pelo fato de o SSL2 ser conhecido por ter falhas de segurança, podemos tentar nos conectar ao servidor usan-do o seguinte comando:

openssl s_client -connect server:443 -no_ssl3 -no_tls1

Se o servidor aceita qualquer ou-tro protocolo exceto SSL3 ou TLS1, o comando anterior abre uma co-nexão e espera por dados é claro, esta abordagem não é a ideal se o usuário pretende inserir o comando em um script Bash). Para fechar a conexão imediatamente depois de estabelecê-la, escreva na entrada padrão do s_client :

TU

TO

RIA

L

Page 18: Linux Magazine 95

67

| TUTORIALOpenSSL com Bash

Linux Magazine #95 | Outubro de 2012

echo "x" | openssl s_client -connect server:443 -no_ssl3 -no_tls1

Da mesma forma, podemos verifi -car cifras permitidas com o parâmetro -cipher . Para comodidade do utiliza-dor, o OpenSSL permite especifi car conjuntos de cifras específi cas (por exemplo, DES-CBC3-SHA ) ou grupos de cifras (por exemplo, LOW , MEDIUM , HIGH , NULL , ALL ). Descubra nomes de grupo e cifras com man ciphers .

Para verifi car se o servidor aceita conexões usando cifras do grupo NULL ou LOW , use o seguinte:

echo "x" | openssl s_client -connect $server:443 -cipher NULL,LOW

Em scripts Bash, é uma boa ideia executar módulos OpenSSL com um tempo limite especifi cado. Caso contrário, quando uma máquina não puder ser resolvida, o script fi cará es-perando por um longo tempo. Um utilitário Linux especial permite executar qualquer comando com um tempo limite. Surpreendente-mente, o utilitário se chama timeout . Por exemplo, para verifi car se uma conexão SSL2 pode ser estabelecida, mas não esperar por ela mais de 10 segundos, use:

echo "x" | timeout 10 openssl s_client -connect server:443 -ssl2

Finalmente, para tornar o coman-do mais automático, podemos usar a variável $? para verifi car o códi-go de retorno do último comando executado pelo Bash. Se a cone-xão for estabelecida, o OpenSSLretorna 0 .

A listagem 1 mostra um exemplo de script simples, com tudo que fi -zemos até agora. O script lê nomes de hosts da entrada padrão e verifi ca se uma conexão diferente de SSL3 ou TLS1 pode ser estabelecida com a porta 443. Ele espera não mais do que três segundos. Nomes de hosts

que permitem tais conexões são gra-vados no arquivo bad_protocol.txt . Da mesma forma, os hosts que permi-tem conexões com cifras NULL ou LOW são listados em bad_cipher.txt .

Como manipular formatos PEM/DER e PKCS12 Alguns formatos e containers são usados para pares de chaves de criptografi a públicas e certifi cados digitais. Sem entrar em detalhes, os formatos mais comuns da nossa rede são PEM , DER , PKCS12 , ou JKS . Destes, apenas o formato JKS não é suportado pelo aplicativo OpenSSL. O PEM e o DER são formatos codifi cados – o PEM é um formato codifi cado em Base64. O DER é binário. O PKCS12 é um container que pode armazenar cha-ves privadas e públicas, bem como certifi cados assinados e cadeias de certifi cados.

Para converter entre os formatos de arquivo PEM e DER, podemos usar os parâmetros -inform e -ou-tform . Por exemplo, para converter todos os certifi cados X.509 de PEM para DER, usamos o seguinte loop:

for file in * pem;do openssl x509 -inform PEM -in $file -outform DER -out $file.der;

done

Outra tarefa comum é a extração de chaves/certifi cados de um pacote PKCS12, que geralmente é protegido com uma senha. É possível lidar com

tal operação no Bash com a opção –passin do OpenSSL. Esta opção nos permite especifi car senhas para acessar dados em arquivos protegidos por senhas de cinco maneiras. Ela é útil não só para o PKCS12, mas para toda ação que requer uma se-nha; por exemplo, chaves privadas ou dados criptografados.

Primeiro, especifi camos uma senha como pass:password_text e, neste caso, password_text é a senha atual. Este não é um método seguro, porque a senha é armazenada no histórico do Bash e pode ser vista com um comando ps durante a exe-cução. Segundo, especifi camos a senha com env:var . Este método é mais seguro, porque a senha é ma-nipulada na variável de ambiente var . Outra abordagem é a de arma-zenar a senha como file:pathname , que diz ao OpenSSL para ler a senha da primeira linha de um arquivo localizado em pathname .Ou ainda poderíamos usar fd:number , o que faz o OpenSSL ler a senha do descritor de arquivo number . Finalmen-te, podemos simplesmente usar stdin para ler senhas da entrada padrão.

Em seguida, extrairemos todos os certifi cados de arquivos PKCS12 pro-tegidos por senha em um diretório de trabalho e tratamos de armazená-lossem senha. Isto pode ser feito da se-guinte forma:

for file in *.p12; doopenssl pkcs12 -in $file -passin file:$file.pass -nokeys -nodes -out $file.nokeys

done

Listagem 1: Como verifi car protocolos permitidos 01 #!/bin/bash02 while read server ; do03 timeout 3 openssl s_client -connect $server:443 -no_ssl3 -no_tls104 if [ $? -eq 0 ] ; then05 echo $server >> bad_protocol.txt06 fi07 timeout 3 openssl s_client -connect $server:443 -cipher NULL,LOW08 if [ $? -eq 0 ] ; then09 echo $server >> bad_cipher.txt10 fi11 done

Page 19: Linux Magazine 95

68 www.linuxmagazine.com.br

TUTORIAL | OpenSSL com Bash

Supomos que temos uma senha para cada arquivo PKCS12 escrita em um arquivo com a extensão .pass .

Criptografar e descriptografar em massa Tarefas comuns de criptografi a de arquivos incluem encriptação e de-criptação. A criptografi a simétrica utiliza uma chave para criptografar e descriptografar. A criptografi a assi-métrica usa uma chave pública para criptografar e uma chave privada para descriptografar (normalmente implementada com PKI e certifi ca-dos X.509).

Criptografi a simétrica é mais rá-pida que a criptografi a assimétrica, e é uma escolha melhor quando não há necessidade de acesso público para a chave.

Para criptografar o arquivo plain.txt com criptografi a simétrica e es-crever o arquivo de saída cipher.enc , usamos o seguinte comando:

openssl [ciphername] -a -salt -in plain.txt -out cipher.enc

O sistema solicitará uma senha criptográfi ca, que também tem de ser digitada quando for descripto-grafada mais tarde. Não é a melhor opção para operações em massa, mas já descrevemos vários métodos para especifi car uma senha parao OpenSSL.

Assim, para criptografar todos os arquivos .txt no diretório atual e gravá-los no diretório ../enc com a cifra aes-256-cbc , é possível usar o seguinte loop (supondo que a senha está escrita no arquivo de pass ):

for file in *.txt; doopenssl aes-256-cbc -a -salt -in "$file" -out "../enc/$file" -passin file:pass

done

Podemos descriptografar todos os arquivos .txt no diretório atual e gravá-los no diretório ../dec com:

for file in *.txt; doopenssl aes-256-cbc -d -a -salt -in "$file" -out "../dec/$file" -passin file:pass

done

novamente supondo que tenhamos uma senha no arquivo pass .

OpenSSL e a entrada/saída padrão De acordo com a fi losofi a Unix, cada argumento que é passado com o parâmetro –in pode ser passado também usando a entrada padrão. Se não especifi carmos a saída com o parâmetro -out , o resultado será mostrado na saída padrão. Assim, podemos usar o OpenSSL para pro-cessar saídas de outros comandos e gerar entradas para outros programas com um pipe. Para verifi car se um certifi cado com o número de série 44A2FC741D8C1755 foi revogado, usa-mos o seguinte comando:

curl -s http://localhost/crl.pem | openssl crl -text -noout | grep "Serial Number: 44A2FC741D8C1755"

Este comando irá recuperar uma lista de certifi cados revogados (da sigla CRL, de Certifi cate Revocation List ) e decodifi cá-la com o OpenSSL. Em seguida, pesquisará por um número de série. Da mesma forma, como com os scripts Bash anteriores, podemos adi-cionar um timeout e verifi car a saída do comando grep com a variável $? .

Como auditar senhas criptografadas A chave privada quase sempre deve ser protegida com uma senha. Mui-tas vezes, arquivos PKCS12 também são protegidos com senhas. Com o OpenSSL e o Bash, fazemos uma rápida verifi cação das senhas usadas para proteger os arquivos. Vamos su-por que temos um arquivo de texto com as senhas mais comuns, uma em cada linha, chamado passwords.txt .

Verifi camos cada arquivo protegido por senha no diretório atual com

while read pass; dofor file in *.p12; doopenssl pkcs12 -in $file -noout -passin pass:$pass 2>/dev/null

if [ $? -eq 0 ] ; thenecho "Senha adivinhada para $file: $pass"

fidonedone < passwords.txt

utilizando cada senha do arquivo passwords.txt .

Teste do PKI O último grande recurso do OpenS-SL é o de implementar uma infra-estrutura de chave pública (PKI). Uma PKI muitas vezes tem um papel crucial na segurança, e o OpenSSL pode ser usado para implementar e testar uma PKI.

Primeiro, podemos usar o OpenSSL para gerar pares de chaves e pedidos de assinatura de certifi cado correspon-dentes (da sigla CSRs, de Certifi cate Signing Request ). Segundo, podemos assinar CSRs, criando assim certifi cados válidos. Terceiro, podemos revogar e gerar CRLs. Quarto, podemos assinar/criptografar e verifi car/descriptografar. E fi nalmente, podemos alterar os pa-râmetros em tempo real e manipular valores, tais como algoritmos, compri-mentos de chave ou conteúdo DN. É possível usar estes dados como entrada para outros aplicativos.

A listagem 2 mostra alguns exem-plos de recursos que usamos para testar vários elementos de uma PKI. A função create_config foi cortada para melhor legibilidade. Utilize o conteúdo de seu arquivo de confi -guração padrão do OpenSSL para confi gurações adicionais. O arqui-vo de confi guração normalmente se chama openssl.cnf e fi ca em /etc .

Por padrão, o OpenSSL lê o ar-quivo de confi guração de um local especifi cado (normalmente /etc/openssl.cnf ); mas, para nossos tes-tes, foi mais fácil criar um arquivo

Page 20: Linux Magazine 95

69

| TUTORIALOpenSSL com Bash

Linux Magazine #95 | Outubro de 2012

de confi guração na hora. A função de script create_config cuida disso escrevendo a confi guração no arquivo ./config . Mais tarde, o arquivo cria-do por esta função é apontado no OpenSSL com o parâmetro -config .

Em seguida, temos funções create_root_ca , create_crl , create_client_req , sign_client_req , e revoke_client_cert ; os nomes delas são auto-explicativos. Todas estas funções recebem parâ-metros que especifi cam tarefas como uma string DN (de “nome exclusi-vo” ou distinguished name ), prazo de validade, tamanho de chave etc.

A parte principal do script (não mostrada na listagem) pode utilizar as funções para gerar um número específi co de certifi cados de autori-

dade certifi cadora (da sigla CA, de Certifi cation Authority ) e um deter-minado número de certifi cados de cliente para cada CA. Além disso, poderíamos revogar certifi cados de algum cliente logo após a geração. Desta forma, a saída do script pos-suiria vários certifi cados CA, certifi -cados de cliente revogado, e CRLs.

Conclusão O OpenSSL é uma ferramenta muito fl exível. Pelo fato de podermos especi-fi car todos os parâmetros necessários usando a linha de comando, arquivos, pipes e variáveis de ambiente, é perfei-tamente adequado para os scripts Bash.

Este artigo descreveu alguns usos para o OpenSSL, mas tenha em men-

te que esta é apenas a ponta de um iceberg. Encorajamos nosso leitor a olhar o manual e fazer experimentos com suas próprias ideias. Apenas não confunda a chave privada de outra pessoa com a sua própria. ■

Mais informações [1] OpenSSL: http://

www.openssl.org/

[2] Bash: http://www.gnu.org/software/bash/

Listagem 2: Como testar uma PKI 01 function create_config { 02 {03 echo “HOME= .”04 echo “RANDFILE= $ENV::HOME/.rnd”05 06 ...07 cortado para melhor legibilidade08 ...09 10 echo “oid_section = new_oids”11 echo ‘subjectKeyIdentifier=hash’ 12 echo ‘authorityKeyIdentifier=keyid,issuer’ 13 echo ‘proxyCertInfo=critical,language: id-ppl-anyLanguage,pathlen:3,policy:foo’

14 } > “$config”15 }16 17 function create_root_ca {18 local keysize=$119 local country=$220 local org=$321 local name=$422 local days=$523 local certfile=$624 local keyfile=$725 openssl req -newkey rsa:$keysize -x509 -days $days -keyout $keyfile -nodes -out $certfile -config $config -subj /C=$country/O=$org/CN=$name

26 return $?27 }28 29 function create_crl {30 local cakey=$131 local cacert=$232 local crlfile=$333 openssl ca -gencrl -config $config -keyfile $cakey -cert $cacert -out $crlfile

34 }35 36 function create_client_req {

Listagem 2: Como testar uma PKI (continuação)37 local keysize=$138 local country=$239 local org=$340 local name=$441 local keyfile=$542 local reqfile=$643 openssl req -new -newkey rsa:$keysize -nodes -keyout $keyfile -out $reqfile -config $config -subj /C=$country/O=$org/CN=$name

44 }45 46 function sign_client_req {47 local clientreq=$148 local days=$249 local cacert=$350 local cakey=$451 local clientcert=$552 openssl x509 -req -days $days -CA $cacert -CAkey $cakey -CAcreateserial -in $clientreq -out $clientcert

53 }54 55 function revoke_client_cert {56 local clientcert=$157 local cakey=$258 local cacert=$359 openssl ca -revoke $clientcert -keyfile $cakey -cert $cacert -config $config

60 }61 62 function get_cacountry {63 cacountry=”DC”64 }65 66 function get_caorg {67 caorg=”Dummy org”68 }69 70 function get_caname {72 }

Gostou do artigo?Queremos ouvir sua opinião. Fale conosco em [email protected]

Este artigo no nosso site: http://lnm.com.br/article/7639

sso sr/artic

sua om

ne.com

e:763

igo?nião.

Page 21: Linux Magazine 95

70

TU

TO

RIA

L

www.linuxmagazine.com.br

TUTORIAL | Raspberry Pi

Raspberry Pi

Computação pioneira A súbita popularidade de computadores miniboard como

o Raspberry Pi trouxe de volta o espírito pioneiro dos

primeiros dias do Linux. Repentinamente, o “faça você

mesmo” na comunidade de código aberto está de volta.

por Brian Proffi tt

Até agora, a maioria dos nerds já ouviu falar do Raspberry Pi [1] , mas caso o leitor ainda não

tenha ouvido falar a respeito, oferece-mos um panorama sobre o assunto.

O projeto Raspberry Pi começou em 2006, quando um grupo de pes-quisadores do laboratório de compu-tação da Universidade de Cambrid-ge, no Reino Unido, observava os conhecimentos de informática em declínio para estudantes de Nível A que acessavam seus programas. O que viam não era nada positivo, e era uma tendência que se repetia também em outras nações, além do Reino Unido.

Apesar da proliferação dos compu-tadores pessoais, ou talvez por causa dela, as crianças já não experimenta-vam massivamente os PCs. Em vez disso, elas utilizavam aplicativos como eles eram apresentados ou apenas compravam e baixavam novos para fazer o que queriam; hackear, ao que parecia, estava saindo de moda.

Os primórdios A equipe de Cambridge, liderada pelo designer Eben Upton, começou a mon-tar um dispositivo pequeno, portátil, e muito barato que iria inicializar direta-mente em um ambiente de programa-ção. A partir daí, estudantes de qualquer idade poderiam começar a programar para o que lhes fosse mais interessante.

Nos EUA, a carência de conhe-cimentos em informática no ensino para jovens signifi ca que o país deverá enfrentar uma séria lacuna de talentos para o desenvolvimento de aplicativos no futuro. Os EUA já possuem uma falta de talentos no que se refere à aná-lise de dados massivos, logo não é nada improvável que essa lacuna na progra-mação surja um pouco mais adiante.

Esta não é uma coisa boa, e não pe-los habituais argumentos geopolíticos que condenam os EUA ou o Reino Unido de fi car para trás de uma nação ou de outra. Como sociedades autos-sufi cientes, são nações que desejam a gestão de informações e conteúdos puramente nas mãos de poucos e se-letos magos da programação?

Dadas as devidas proporções, o declínio da alfabetização na progra-mação se espelha no declínio da al-fabetização após a queda do Império Romano, e todos nós sabemos o que aconteceu depois. A centralização do controle dos nossos dados pode ser um pouco diferente para a nossa sociedade de como foi a centraliza-ção da palavra escrita pelo clero e pela aristrocracia na Idade Média.

Tal é a visão que engloba o con-texto no qual se insere o projeto do Raspberry Pi.

Em 2008, o dispositivo conhecido como Raspberry Pi tinha concluído

a fase de projeto e estava pronto para ser produzido. A fundação Raspber-ry Pi foi criada naquele ano e, após três anos de captação de recursos e produção, os dispositivos Pi foram saindo da linha de montagem.

O presente Existem dois modelos do Raspberry Pi disponíveis: o modelo A por 25 dólares em modelo B por 35 dólares. Ambos possuem um processador ARM de 700 MHz em uma placa monolítica da Broadcom, com 256 MB de RAM e um slot de cartão SD/MMC/SDIO para armazenamento. A única grande diferença entre os dois modelos é que com mais 10 dólares é possível obter um conector Ethernet 10/100 e uma segunda porta USB no modelo B.

Esse pequeno diferencial de preço e a popularidade de um dispositivo conectado à rede poderia explicar por que o tempo de espera em qualquer lugar é, em média, de 5 a 12 sema-nas para adquirir um modelo B, de acordo com o fornecedor.

E ele não está mais sozinho: novos dispositivos, como o Cotton Candy, o Mele A1000, o MK802 e o Oval Elephant fazem parte desta crescente família de “mini-PCs”.

É claro que é possível fazer muitas coisas além de simples programação com um Raspberry Pi nas mãos. Exis-

Page 22: Linux Magazine 95

71

| TUTORIALRaspberry Pi

Linux Magazine #95 | Outubro de 2012

tem pessoas que descobriram que o dispositivo, por exemplo, pode ser um viável media streamer [2] e um reprodutor de rádio Internet [3] . Para este artigo, no entanto, cobriremos o objetivo geral do dispositivo: exe-cutar um sistema operacional Linux no qual o leitor possa programar.

Há um sem número de distribuições que podem ser executadas no RaspberryPi. Basicamente tudo que precisamos é de uma distribuição compilada para um processador ARM11 em uma ima-gem de disco que vai caber em pelo menos um cartão SD de 2GB. No entanto, a equipe do Raspberry Pi atualmente recomenda uma das três distribuições listadas em sua página de downloads [4] : Raspbian “wheezy” , Arch Linux ARM , e QtonPi .

Para os iniciantes, a Raspberry Pi recomenda a variante do Debian, Raspbian , que é consideravelmente otimizada para o dispositivo Pi e tem o LXDE, o Midori, e outras ferramentas de desenvolvimento. A Raspbian é a que instalamos para este artigo, mas para as outras imagens o procedimen-to será o mesmo; apenas mudam os nomes dos arquivos. Nota: os nomes de arquivos são os disponíveis no mo-mento em que escrevemos esta maté-ria. Eles podem variar um pouco após a publicação desta edição.

Para começar, visite a página de downloads do Raspberry Pi e baixe a última edição do arquivo ZIP do Raspbian “wheezy”.

No diretório em que baixar o ar-quivo, extraia a imagem com

unzip 2012-07-15-wheezy-raspbian.zip

Insira um cartão SD no leitor do computador e digite : df -h

Este comando irá listar os dispo-sitivos que estão montados. Veremos um nome do dispositivo que não corresponde à confi guração atual de unidades do seu sistema. Esse dispositivo extra é seu cartão SD. Se o cartão possuir um nome como /dev/sdd1 , ignore o 1 (ou qualquer outro número ao fi nal do nome).

Os números indicam partições, e quando gravarmos a imagem de disco do Raspbian no cartão, precisaremos do nome do dispositivo, que neste exemplo será /dev/sdd . Também é necessário desmontar todas as parti-ções que estão no cartão. A maioria dos cartões SD terá apenas uma par-tição, mas para o caso de haver mais de uma, desmontar todas elas limpará o caminho para a nova imagem de disco. Presumindo que o nome do dispositivo é /dev/sdd , digite

umount /dev/sdd1

Repita o comando umount para todas as partições com sdd no nome.

Em seguida, escreva a imagem do Raspbian no cartão SD com o comando dd . Cuidados devem ser tomados aqui para que não sejam utilizados como destino o disco rí-gido ao invés do cartão SD. Ainda no terminal, navegue até o diretório /2012-07-15-wheezy-raspbian e digite

sudo dd bs=1M if=2012-07-15- wheezy-raspbian.img of=/dev/sdd

Esta etapa pode levar algum tem-po, portanto seja paciente e não pense que o processo está travado. Quando

o prompt de comando retornar o re-sultado da operação, digite

sudo sync

para limpar o cache de gravação. Agora podemos remover o cartão SD e usá-loem nosso dispositivo Raspberry Pi.

Com a porta HDMI gerenciando vídeo e duas portas USB cuidando dos controles do mouse e do teclado, o leitor poderá indagar se o tamanho do cartão SD estará limitado ao armaze-namento. Através de um hub USB, porém, também é possível expandir as portas e começar a usar drives USB externos para armazenamento.

O futuro Uma das maiores atrações para o dispositivo Raspberry não é apenas o dispositivo em si; a comunidade em volta deste pequeno dispositivo é muito forte e está crescendo rápido.

Quem não teve a felicidade de viver os primeiros dias do Linux, quando as coisas eram rápidas e livres – e a informação muito mais complicada de se obter – então esta será uma ex-periência nova que remeterá a esses dias. Veteranos do Linux se sentirão em casa com a comunidade Raspberry.

A convergência de dispositivos baratos e poderosos como este deve abrir caminho para uma série de projetos inovadores e o Raspberry Pi já desperta atenção na produção de robôs terrestres [5] e dispositivos de realidade extraterrestre [6] . As pos-sibilidades, como aconteceu com o velho Linux, são infi nitas. ■

Mais informações [1] Raspberry Pi: http://www.raspberrypi.org/

[2] Media streamer: http://wiki.xbmc.org/index.php?title=Raspberry_Pi

[3] Rádio Internet: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=9&t=4031

[4] Downloads: http://www.raspberrypi.org/downloads

[5] Robôs: http://www.raspberrypi.org/forum/projects -and-collaboration-general/starwars-r5-d4-astromech

[6] Balão Meteorológico: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=9&t=2059

Gostou do artigo?Queremos ouvir sua opinião. Fale conosco em [email protected]

Este artigo no nosso site: http://lnm.com.br/article/7652

osso sr/artic

sua om

e.com

e:765

igo?nião.

Page 23: Linux Magazine 95

72 www.linuxmagazine.com.br

PROGRAMAÇÃO | Dart

Dart, a alternativa do Google ao JavaScript

Centro do alvo? A linguagem de programação Dart é a atual alternativa

do Google ao JavaScript. Executada principalmente em

navegadores, também pode ser utilizada em linha de

comando e em servidores como substituta para o PHP .

por Tim Schürmann

O código escrito na linguagem de programação Dart do Goo-gle se parece muito com uma

mistura de JavaScript e Java com uma pitada de Scala. Essa semelhança é in-tencional: a linguagem de programação [1] foi projetada com base no desejo de eliminar alguns problemas e o las-tro legado do JavaScript. A premissa é que os programas Dart possam ser

executados mais rapidamente e com melhor segurança, que trabalhem em qualquer dispositivo compatível com Internet e que sejam adequados para projetos ainda maiores [2] . Se uma pessoa tem experiência com lingua-gens de programação – e essa descrição encaixa-se para quase qualquer progra-mador web – irá também rapidamente sentir-se à vontade com o Dart.

Programas escritos em Dart se-rão executados em uma máquina virtual especial no navegador. O projeto fornece uma implementa-ção de referência em um site, que ainda é capaz de executar programas Dart em linha de comando ou em um servidor de Internet. O Dart é, sobretudo, um substituto adequado do PHP. Além da máquina virtual, o projeto oferece um par de biblio-tecas cujas funções – entre outras coisas – oferecem suporte à mani-pulação conveniente da árvore de um site DOM (sigla para Document Object Model ou modelo de objeto de documentos). Um par de outras ferramentas também facilita a vida de programadores, como o editor Dart baseado no Eclipse ( fi gura 1 ).

Trabalho em andamento

Tudo isso soa muito atraente, com uma desvantagem pequena: o Dart está atualmente em um estágio muito inicial de desenvolvimento e, portanto, não é adequado para uso em produção. Os inventores do Dart intencionalmente lançaram a sua

Figura 1 O Editor Dart é um ambiente de desenvolvimento baseado no

Eclipse, fornecendo acesso direto aos exemplos de código.

PR

OG

RA

MA

ÇÃ

O

Page 24: Linux Magazine 95

73

| PROGRAMAÇÃODart

Linux Magazine #95 | Outubro de 2012

especifi cação em um estágio inicial para coletar tantas sugestões de me-lhorias quanto fosse possível, bem como para melhorar a aceitação. É também precisamente por isso que a especifi cação da linguagem tem sido colocada sob a licença Creati-ve Commons Atribution 3.0 e o có-digo do programa publicado pelo projeto sob a licença BSD Google [3] . Quando este artigo foi escrito, a versão mais recente do Dart era a 0.08, e esta é a versão na qual a visão geral a seguir se baseia.

main() e Classes O ponto de partida para um programa Dart, como em Java, é o main() . Para os programadores de JavaScript, es-pecialmente, isso pode parecer novo: main() { // Um pequeno comentário print("Olá Mundo!");}

Os programadores de JavaScript irão tossir novamente: Dart é uma linguagem orientada a objetos em todos os senti-dos. A listagem 1 mostra a declaração de uma classe chamada Carro . A classe começa por defi nir uma nova variável cor . Como a palavra-chave var sugere, as variáveis podem assumir valores ar-bitrários a qualquer momento – como no JavaScript, Dart é uma linguagem sem tipos. Esta é seguida pelo cons-trutor Carro() , que deve usar o mesmo nome de classe. O this representa o objeto atual, como em Java; em outras palavras, this.cor garante que o valor não acabe em uma variável global ou em uma nova variável.

A linha 8 mostra duas caracterís-ticas do Dart. Em linguagens como Java, o desenvolvedor pode defi nir vários construtores com parâmetros diferentes (sobrecarga). Quando um objeto é criado, a linguagem, então, automaticamente chama o constru-tor correspondente. Em linguagens como Dart, tal escolha não é tão simples. Para resolver o problema, a linguagem utiliza construtores co-

Listagem 1: Uma classe simples 01 class Carro {02 var cor;0304 Carro() {05 this.cor = "azul";06 }0708 Carro.pintura(this.cor);09 }1011 main() {12 Carro ferrari = new Carro.pintura("vermelho");13 Carro bmw = new Carro();14 print(ferrari.cor); // saída vermelha15 print(bmw.cor); // saída azul16 }

Listagem 2: Interface e extends 01 interface Superficie { 02 int superficie_conteudo(); 03 } 04 05 class Quadrado implements Superficie { 06 int largura; 07 Quadrado(int this.largura); 08 int superficie_conteudo() => largura*largura; 09 } 10 11 class Retangulo extends Quadrado { 12 int _altura; 13 Retangulo( int this._altura, int br) : super(br); 14 int superficie_conteudo() => largura * _altura; 15 } 16 17 main() { 18 Quadrado q = new Quadrado(3); 19 Retangulo r = new Retangulo(2,3); 20 print(q.superficie_conteudo()); 21 print(r. superficie_conteudo()); 22 }

Listagem 3: Padrão factory 01 class Carro {02 String fabricadopor;03 static Map garagem;0405 factory Carro(String fabricante){06 if (Carro.garagem == null) Carro.garagem=new Map();0708 if (Carro.garagem.containsKey(fabricante)!=null) return Carro.garagem[fabricante];

09 else {10 Carro newcarro = new Carro.compra(fabricante);11 Carro.garagem[fabricante] = newcarro;12 return newcarro;13 }14 }1516 Carro.compra(this.fabricadopor);17 }1819 main() {20 var umcarro = new Carro("Ferrari");21 var outrocarro = new Carro("Ferrari");22 }

Page 25: Linux Magazine 95

74 www.linuxmagazine.com.br

PROGRAMAÇÃO | Dart

nhecidos. Na listagem 1 , o segundo construtor é chamado de pintura, e caso se queira chamar precisamente esse construtor ao criar uma instân-cia Carro na função main() , é preciso especifi car o nome lá:

Carro ferrari = new Carro.pintura("vermelho");

Em contraste, new Carro() iria apenas chamar o construtor normal.

Como um segundo recurso es-pecial, o construtor Carro.pintura() usa uma abreviação: o Dart atribui o valor passado para ele diretamente para a variável cor . Claro, se preferir, use a versão longa:

Carro.pintura(var umacor) { this.color = umacor;}

As variáveis que podem assumir valores arbitrários podem ser muito convenientes, mas esta abordagem tende a causar alguma negligência por parte dos programadores no mundo real, o que leva a erros que podem ser difíceis de resolver. Por este motivo, os programadores po-dem, opcionalmente, especifi car um tipo de uma variável:

class Carro { String cor; [...]

Se o programa Dart tenta arma-zenar um número em cor em algum estágio posterior do programa, a má-quina virtual cria um aviso. Como

foi dito, este é apenas um aviso e não um erro – o programa continuará a funcionar com um número em cor . Esse comportamento chama a atenção do programador para erros de atribuição e torna o código mais legível, e os usuários não precisam temer uma falha súbita do progra-ma. Além do tipo String , o Dart também suporta os tipos listados na tabela 1 .

Aliás, todos estes são objetos in-ternos. É possível até criar listas e mapas com um new :

var autos = new List();

As variáveis que ainda não tiveram um valor atribuído automaticamente têm o valor especial null .

Como no PHP, o Dart pode inserir o conteúdo de variáveis em strings. O código :

String nome = "John Doe"; print ("Olá ${nome}");

geraria um Olá John Doe . Dentro dos colchetes {} pode até haver expressões completas ou chamadas de função.

Versão em linha Usuários Dart podem abreviar uma defi nição de função individual como a seguir:

int quadrado(int numero) { return numero*numero; }

com => int quadrado(int numero) => numero*numero;

(por exemplo, => e signifi ca {re-turn e;} ). No Dart, é possível pas-sar uma função para outra, o que é muito útil em loops:

digaOla(String nome) => print("Ola ${nome}");

List nomes = ["Tim", "Joe", "Henry"];

nomes.forEach(digaOla);

A função digaOla escreve a string passada para ela após Olá e exibe os resultados na tela. A segunda linha cria uma lista com três nomes que, por sua vez, são empurrados um após o outro e entregues para a função pelo forEach – neste caso, a função é digaOla() . Em outras palavras, este trecho de três linhas de código exibe Olá Tim , Olá Joe e Olá Henry .

Pelo fato de o digaOla só ocorrer em nomes.forEach() , podemos de-clarar a função de lá diretamente e exibir seus nomes da mesma forma:

List nomes = ["Tim", "Joe", "Henry"];

nomes.forEach( (String nome) => print("Olá ${nome}") );

Esta forma compacta de codifi -cação funciona bem aqui mas, em funções mais complexas, pode-se facilmente perder de vista o que se está fazendo. Os suspeitos de costu-me estão disponíveis para controle de fl uxo: for , if , switch e while , e agem exatamente como seus homó-logos em Java ou JavaScript. Além disso, é possível usar exceções para detectar erros.

Tipo Conteúdo Exemplo

String String (32-bit Unicode) String nome = “Joe”;

int Inteiro int numero = 12;

double Números de ponto fl utuante de 64 bits (em

conformidade com o padrão IEEE 754)double numero = 1.3456;

num Números inteiros, números de ponto fl utuante, ou ambos num y = mx + b

bool verdadeiro/falso bool pegacookies = true;

List Uma lista de valores, também conhecida como array List nomes = [“Tim”, “Joe”, “Henry”];

Map Array associativo, também conhecido como

um mapa hash ou dicionário de dadosMap traducao = {“house” : “casa”,“car” : “carro”, “chair” : “cadeira”};

Tabela 1 Tipos suportados pelo Dart.

Page 26: Linux Magazine 95

75

| PROGRAMAÇÃODart

Linux Magazine #95 | Outubro de 2012

Clássico O Dart herdou interfaces do Java. Quando uma classe implementa uma interface, ela garante que a função especifi cada na interface seja fornecida. A listagem 2 fornece um exemplo de herança.

Uma classe pode implementar várias interfaces, mas apenas herda exatamente uma classe (ou seja, usa extends para estender a classe). Na listagem 2 , todas as variáveis e funções são públicas, com uma exceção, _al-tura . Se o nome da variável ou uma função começa com um sublinhado, ela é privada, e só é possível acessar a variável ou função dentro da própria classe. Na listagem 2 , isso signifi ca que não se pode retroativamente modifi car a altura de um retângulo.

Oferta de Factory Padrões de projeto [4] têm sido par-te do repertório do desenvolvedor profi ssional por muitos anos. Assim, não há nenhuma surpresa em que o Dart também suporte este recurso. Por exemplo, o padrão Factory já faz parte da linguagem: se o construtor for prefi xado com a palavra-chave factory , o Dart não cria automaticamente um objeto desta classe, mas deixa para o construtor. O programador pode en-tão olhar em um cache para ver se um objeto correspondente já existe, como pode ser visto na listagem 3 .

A variável outrocarro neste exem-plo aponta para o mesmo objeto como umcarro . A palavra-chave static garante que garagem só existe uma vez; todos os objetos Carro acessam a mesma variável.

O padrão Factory pode também ser combinado com interfaces. Para fazer isso, atribui-se a classe padrão factory a uma interface, e a classe factory retorna objetos para coincidir com a interface. A listagem 4 mos-tra um exemplo disso. A interface defi ne a assinatura do construtor, que em seguida gera objetos para coincidir com a interface. O Carro-

Factory na listagem 4 irá retornar um objeto Carrodecorrida ou Conversível dependendo do fabricante que lhe for passado. Durante a instância em main() , parece que se está criando um Carro diretamente.

Além disso, a palavra-chave is tes-ta para ver se um objeto é um tipo específi co. Aliás, a palavra-chave fi-nal na frente do fabricante garante que à variável só possa ser atribuído um valor exato e somente uma vez durante sua inicialização.

Serviço de Contêiner O Dart contém os tipos genéricos, também conhecidos como generics , com os quais provavelmente estamos familiarizados por causa do Java. Pro-gramadores C++ também conhecem esse conceito como templates . É pos-

sível usá-los para criar rapidamente recipientes para objetos arbitrários. As listas de funções embutidas e mapas são genéricos. Por exemplo, List<Car> cria uma lista de objetos Carro: main() { List<Carro> listadecarros = new List<Carro>();

listadecarros.add(new Carro("Ferrari"));

Carro umcarro = listadecarros[0];

}

Como as variáveis podem assu-mir conteúdo arbitrário, o Dart não impedirá isso: List<Carro> listadecarros = new List<Carro>();

List<LKW> listadecaminhoes = listadecarros;

Essa experiência pode explodir mais tarde, se o desenvolvedor ten-

Figura 2 O SDK Dart inclui uma máquina virtual para linha de comando.

Figura 3 A ferramenta online Dartboard permite aos desenvolvedores testarem

pequenos programas Dart diretamente no navegador.

Page 27: Linux Magazine 95

76 www.linuxmagazine.com.br

PROGRAMAÇÃO | Dart

tar fazer algo com o que assumiu ser um caminhão da listadecaminhoes .

Paralelismo Programadores normalmente mudam as tarefas que precisam ser executa-das em processos paralelos separados e, em seguida, trabalham duro para unir os resultados intermediários. O Dart remove as dores de cabeça desse processo: um objeto derivado

da classe Isolate básica, se assim se deseja, é executado separadamente do programa principal em seu pró-prio processo.

Para ser capaz de trocar resultados intermediários, os Isolates podem enviar mensagens uns para os ou-tros. Essas mensagens são primeiro enfi leiradas até que o receptor Iso-late pegue o que é conhecido como uma porta. Este modelo lembra

muito o modelo atual do Erlang ou Scala. A listagem 5 mostra um exemplo completo.

O programa de exemplo primeiro recebe um novo objeto Receiver , que é despejado em um processo sepa-rado com spawn() . Depois disso, ele envia o objeto de quatro palavras em sucessão. Assim que o objeto recebe uma palavra, escreve-a na tela.

O Isolate sempre dá uma porta para o objeto que enviou a mensagem na forma de replyTo . Isso signifi ca que ele pode responder diretamente para o seu solicitante.

Os Isolates executam em um espaço de memória separado. Um efeito colateral positivo disto é que a coleta de lixo pode lidar com cada Isolate individualmen-te. No retorno, a máquina virtual precisa copiar as mensagens entre o Isolate. No futuro, os Isolates serão inclusive capazes de usar as diferentes bibliotecas Dart com diferentes versões.

Acesso DOM Pelo fato de o Dart ser projetado para substituir o JavaScript, os pro-gramadores devem ser capazes de usar a linguagem para acessar a ár-vore DOM de um site. Para que isso aconteça, o Dart inclui a sua própria biblioteca, que pode ser importada como a seguir:

#import("dart:html");

Depois, pode-se usar a seguinte expressão para acessar uma <div> com a ID menu :

document.query("#menu");

Os elementos podem assim ser localizados através de seletores CSS em um estilo muito semelhante ao jQuery. O Dart pode usar progra-mas de outras classes e funções para confi gurar conexões HTTP ( Ajax keyword ), dados de processo JSON, e até mesmo acessar o sistema de arquivos, entre outras coisas. Para

Listagem 4: Combinando interface e factory 01 interface Carro default CarroFactory {02 Carro(fabricante);03 final fabricante;04 }0506 class CarroFactory {07 factory Carro(fabricante) {08 if (fabricante == "Ferrari") {09 return new Carrodecorrida(fabricante);10 }11 return new Conversivel(fabricante);12 }13 }1415 class Carrodecorrida implements Carro {16 Carrodecorrida(this.fabricante);17 String fabricante;18 }1920 class Conversivel implements Carro {21 Conversivel(this.fabricante);22 String fabricante;23 }2425 main() {26 print( new Carro("Ferrari") é CarrodeCorrida);27 print( new Carro("VW") is Carrodecorrida);28 }

Listagem 5: Comunicando com um Isolate 01 class Receiver extends Isolate {02 main() {03 port.receive((mensagem, replyTo) {04 if (mensagem == null) port.close();05 else print("Recebend: ${mensagem}");06 });07 }08 }0910 main() {11 new Receiver().spawn().then((port) {12 for (var mensagem in ['Esse', 'é', 'um', 'teste']) {13 port.send(mensagem);14 }15 port.send(null);16 });17 }

Page 28: Linux Magazine 95

77

| PROGRAMAÇÃODart

Linux Magazine #95 | Outubro de 2012

obter uma lista completa, leia a Re-ferência da API [5] .

Executado Como os navegadores de hoje atual-mente não compreendem programas Dart, o projeto desenvolveu o com-pilador Dartc , que converte progra-mas Dart em código JavaScript. No entanto, o Dartc tinha a reputação de criar programas JavaScript muito grandes, que executam muito lenta-mente. Para resolver este problema, um compilador GNU chamado Frog foi criado (e inclusive é escrito em Dart), que gera código JavaScript muito mais compacto. O Frog é uma máquina virtual para a linha de comando ( fi gura 2 ) incluída no SDK Dart, que está disponível gra-tuitamente na página do projeto [6] . Tudo que é necessário fazer é baixar o arquivo ZIP correspondente, des-compactar, e então compilar o seu próprio programa Dart (por exemplo, test.dart ) usando o Frog a partir do diretório bin ,

./frogc --enable_type_checks test.dart

ou executar o programa diretamente na máquina virtual:

./dart --enable_type_checks test.dart

O parâmetro --enable_type_che-cks garante que o compilador, ou a máquina virtual, possibilite a verifi -cação do tipo.

Caso prefi ra não usar o SDK ago-ra, é possível executar seus próprios programas diretamente no site do projeto Dart, que é conhecido como Dartboard [7] ( fi gura 3 ). O Dartbo-ard integra a maioria das bibliote-

cas embutidas da linguagem (com exceção da dart:html ), para quando os programadores precisarem usar a declaração de importação se eles trabalharem com a máquina virtual de linha de comando.

Finalmente, também é possível usar o Dartium , uma versão especial do navegador Chromium com uma máquina virtual Dart embutida [8] . É possível verifi car a especifi cação completa da linguagem Dart [9] e o código fonte de vários dos maiores programas de exemplo Dart [10] no site do dartlang.org .

Conclusão Com exceção do Dartium, todos os atuais navegadores ignoram o Dart, e não se pode culpá-los; afi -nal, a linguagem de programação não está totalmente completa. Ao mesmo tempo, o Dart está enfren-tando fortes críticas: a maioria dos observadores acredita que o apoio a outra linguagem web é supérfl uo e contraproducente.

O futuro do Dart dependerá em grande parte da seriedade que o Google vem demonstrando no mercado; a empresa tem o poder

de fazer valer essa linguagem, e se o faz no que se refere a dispositivos Android e navegador Chrome – outros fabricantes de navegadores serão incapazes de desviar o olhar. No entanto, o perigo é que uma comunidade de adversários do Dart possa vir a existir, o que signifi ca-ria mais uma vez a fragmentação da Internet.

Dito isto, até mesmo os críticos devem reconhecer que os programas Dart são mais fáceis de ler e com-preender do que suas contrapartidas em JavaScript. Graças à orientação a objetos genuína, aplicativos maiores e de mais fácil manutenção também são possíveis. A perspectiva de uma linguagem única para o cliente e o servidor também é atraente – progra-madores web não precisariam mais alternar entre JavaScript e, digamos, PHP. Mas mesmo quem não vem do mundo Java deve ser capaz de encontrar seu espaço em um tempo muito curto. Por fi m, a linguagem é organizada de forma aberta, em contraste com o Java, e qualquer u-suário pode apresentar propostas de melhorias. Pelo menos, assim tem sido o processo até agora. ■

Mais informações

[1] Projeto Dart: http://www.dartlang.org/

[2] Objetivos do projeto Dart: http://www.dartlang.org/docs/technical-overview/#goals

[3] Licença BSD Google: http://code.google.com/intl/de-DE/google_bsd_license.html

[4] Padrões de Projeto: http://en.wikipedia.org/wiki/Software_design_pattern

[5] Referência da API Dart: http://api.dartlang.org/

[6] SDK Dart: http://www.dartlang.org/docs/getting-started/sdk/

[7] Dartboard: http://try.dartlang.org/

[8] Navegador Dartium: http://www.dartlang.org/dartium/

[9] Sintaxe da linguagem Dart: http://www.dartlang.org/docs/spec/

[10] Programas Dart de exemplo: http://www.dartlang.org/samples/

[11] Listagens deste artigo: http://www.lnm.com.br/issues/95/dart.zip

Gostou do artigo?Queremos ouvir sua opinião. Fale conosco em [email protected]

Este artigo no nosso site: http://lnm.com.br/article/7291

osso sr/artic

mzine.com

e:729

igo?inião.

r

Page 29: Linux Magazine 95

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 30: Linux Magazine 95

82 www.linuxmagazine.com.br

Linux Magazine #96

PR

EVIE

W

Admin Magazine #08

BIG DATAEstamos em um momento tecno-lógico onde tudo gira em torno da geração e consumo de grandes vo-lumes de dados. Na próxima edição da Linux Magazine você vai conhe-cer mais sobre o conceito de Big Data e formas de armazenamento de informações em larga escala, de forma que seja possível acessá-las e analisá-las sempre que necessário com desempenho e praticidade. Entre os temas que serão abordados na próxima edição estão o Apache Hadoop e construção de clusters. Não perca! ■

Controle de tráfego Melhore o desempenho da sua rede com versões do kernel apropriadas para o controle de tráfego. Compa-ramos 6 diferentes sistemas de arqui-vos, saiba qual é o mais adequado para as suas necessidades. Realize backups dos dados de toda a sua rede através de ferramentas como Burp, Obnam e Backshift. Você conhece o mais novo modelo de fornecimento de sistemas de bancos de dados para a nuvem? O modelo database-as-a-service também é um dos destaques da próxima edição da Admin Magazine , não perca!