Você está na página 1de 30

Expediente editorial

frente do seu tempo

EDITORIAL

Diretor Geral
Rafael Peregrino da Silva
rperegrino@linuxmagazine.com.br
Editores
Flvia Jobstraibizer
fjobs@linuxmagazine.com.br
Laura Loenert Lopes
llopes@linuxmagazine.com.br
Editora de Arte
Larissa Lima Zanini
llima@linuxmagazine.com.br
Editor Online
Felipe Brumatti Sentelhas
fsentelhas@linuxmagazine.com.br
Colaboradores
Alexandre Borges, Alexandre Santos, Augusto Campos,
Ben Martin, Brian Proffitt, Cezar Taurion, Charly Khnast,
David J. Dodd, Jon maddog Hall, Klaus Knopper, Kurt
Seifried, Marcin Teodorczyk, Markus Junginger, Michael
Messner, Thomas Drilling, Tim Schrmann, Zack Brown.
Traduo
Laura Loenert Lopes, Rodrigo Garcia,
Sebastio Luiz da Silva Guerra.
Reviso
Ana Carolina Hunger.
Editores internacionais
Uli Bantle, Andreas Bohle, Jens-Christoph Brendel,
Hans-Georg Eer, Markus Feilner, Oliver Frommel,
Marcel Hilzinger, Mathias Huber, Anika Kehrer,
Kristian Kiling, Jan Kleinert, Daniel Kottmair,
Thomas Leichtenstern, Jrg Luther, Nils Magnus.
Anncios:
Rafael Peregrino da Silva (Brasil)
anuncios@linuxmagazine.com.br
Tel.: +55 (0)11 3675-2600
Penny Wilby (Reino Unido e Irlanda)
pwilby@linux-magazine.com
Amy Phalen (Amrica do Norte)
aphalen@linuxpromagazine.com
Hubert Wiest (Outros pases)
hwiest@linuxnewmedia.de
Diretor de operaes
Claudio Bazzoli
cbazzoli@linuxmagazine.com.br
Na Internet:
www.linuxmagazine.com.br Brasil
www.linux-magazin.de Alemanha
www.linux-magazine.com Portal Mundial
www.linuxmagazine.com.au Austrlia
www.linux-magazine.es Espanha
www.linux-magazine.pl Polnia
www.linux-magazine.co.uk Reino Unido
www.linuxpromagazine.com Amrica do Norte
Apesar de todos os cuidados possveis terem sido tomados
durante a produo desta revista, a editora no responsvel
por eventuais imprecises nela contidas ou por consequncias
que advenham de seu uso. A utilizao 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 permisso expressa da editora. Assume-se que qualquer correspondncia recebida, tal como cartas, emails, faxes, fotografias, artigos e desenhos, sejam fornecidos para publicao ou licenciamento a terceiros de forma
mundial no-exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado.
Linux uma marca registrada de Linus Torvalds.
Linux Magazine publicada mensalmente por:
Linux New Media do Brasil Editora Ltda.
Rua So Bento, 500
Conj. 802 S
01010-001 So Paulo SP Brasil
Tel.: +55 (0)11 3675-2600
Direitos Autorais e Marcas Registradas 2004 - 2012:
Linux New Media do Brasil Editora Ltda.
Impresso e Acabamento: IBEP Grfica.
Atendimento Assinante
www.linuxnewmedia.com.br/atendimento
So 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

Eric Hobsbawm (1917 2012), historiador marxista britnico de renome


internacional falecido recentemente, declarou em 2011 por ocasio do lanamento de seu ltimo livro que no podemos confrontar os problemas
do sculo XXI com solues e sistemas oriundos do sculo XX. Apesar de
essa afirmao fazer aluso a matrias poltico-sociais e a sistemas econmicos, sou pessoalmente da opinio de que questes de mesma ordem
provenientes das cincias do conhecimento, aplicadas tambm ao desenvolvimento de software, criao e distribuio do saber e da arte, bem
como s prprias atividades sociais, figuram como principais precursoras
dos avanos de todo tipo que devero ocorrer nos anos que viro. O que
caracteriza todas essas solues so os esforos colaborativos que embasam
o seu desenvolvimento --- algo que o mtodo cientfico vem exercitando
h mais de meio milnio, conforme publiquei anteriormente neste espao.
Assim, a pesquisa cientfica, o conceito de Open Source, diversas
iniciativas de Crowdsourcing (Wikipdia, OpenStreetMap etc.) e
Crowdfunding (financiamento coletivo), a instituio de padres abertos, a criao de empresas sociais e de cooperativas, alm das prprias
redes sociais etc., so alternativas colaborativas para um sem-nmero
de atividades atravs das quais o Homem j apreendeu que, quando se
pensa simultaneamente no bem pessoal e no bem comum, as solues
produzidas so evolutivamente imbatveis.
Estive recentemente no evento de lanamento do Samsung Galaxy
Note 10.1 no Brasil, trazido ao mercado nacional com pompa e circunstncia. Durante toda a apresentao do produto, no conseguia me furtar
de imaginar que toda a tecnologia que equipava aquela maquininha
advinha de dcadas de esforo colaborativo hercleo, na grande maioria das vezes voluntrio, o mesmo acontecendo do lado da infraestrutura
responsvel pelo fornecimento dos dados necessrios ao funcionamento
satisfatrio de seus aplicativos. Enquanto produto de massa, pouco importa ao consumidor final o arcabouo tecnolgico que faz essa soluo
primordial de computao pervasiva funcionar, mas o fato que, sem os
avanos oriundos do desenvolvimento colaborativo, muitssimo provvel que a criao 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 tm o poder de democratizar o acesso informao e de efetivar a incluso digital nas sociedades. Essas iniciativas
barateiam processos de produo, transformam a informao em bem
coletivo, pavimentam o caminho para o DIY Do It Yourself (do ingls,
Faa voc mesmo), o que resulta em uma civilizao mais empreendedora, produzindo cultura e conhecimento, e realimentando um crculo
virtuoso capaz de reduzir desigualdades e de criar oportunidades a todos.
Isso o futuro, hoje, a frente do seu tempo, e os sistemas polticos e econmicos devero, pouco a pouco, assimilar esses princpios, de modo a
permitir que o Homem se ocupe to somente da sua evoluo intelectual e moral, razo precpua para a qual vivemos, no final das contas.
Rafael Peregrino da Silva
Diretor de Redao
www.linuxmagazine.com.br

NDICE

CAPA
Sempre alerta!

33

Rpidos e silenciosos, invasores podem atacar uma rede, danificla e sair sem deixar rastros antes que voc perceba. Saiba
como evitar estes e outros problemas de segurana.

Rede de segurana

34

No est interessado em depender da consultoria de um hacker profissional?


Pode ser interessante confiar um rastreador de vulnerabilidade a um
software especializado neste tipo de tarefa, como o OpenVAS.

Agulha no palheiro

40

A beleza do Wireshark no est somente em seu funcionamento


em tempo real. Ao salvar um histrico de atividades de rede em um
arquivo pcap usando uma ferramenta como a tcdump, podemos filtrar
os dados com o Wireshark para localizar evidncias de invaso.

Anlise de vulnerabilidades

44

Nesse artigo, demonstramos um ataque bem-sucedido


a um servidor via IPv6 e explicamos como as principais
ferramentas de segurana lidam com o protocolo.

www.linuxmagazine.com.br

Linux Magazine 95 | NDICE

SEGURANA

COLUNAS
Klaus Knopper

12

Charly Khnast

14

Augusto Campos

16

Alexandre Borges

18

Kurt Seifried

20

Zack Brown

22

Segurana da informao

57

Pioneiro em detectar vulnerabilidades em sistemas antivrus,


vice-presidente da Sourcefire detalha soluo de segurana ideal
e comenta sobre o cenrio brasileiro, inovador em malwares.
Olhar penetrante

60

NOTCIAS
Geral

24

HTML5 deve estar completo at 2014


A verso beta do RHEL 5.9 inclui drivers para o Hyper-V

Tire proveito do baixo consumo de energia oferecido por


dispositivos NAS modernos para monitorar suas cmeras.

SUSE Manager 1.7 suporta PostgreSQL e IPv6


Xen 4.2 traz nova coleo de ferramentas

TUTORIAL

CORPORATE

Crptico
Notcias

66

26

Red Hat com maior faturamento e menor lucro


Rackspace entrega OpenStack para fundao independente
Foxconn investir R$1 bilho no Estado de So Paulo
Coluna: Jon maddog Hall

28

Coluna: Cezar Taurion

30

Coluna: Alexandre Santos

32

ANDROID
Toque perfeito

50

A criptografia uma parte importante da segurana em TI, e


o OpenSSL uma conhecida ferramenta de criptografia para
o Linux. Especialistas confiam no OpenSSL porque livre,
possui muitos recursos e fcil de usar em scripts Bash.
Computao pioneira

70

A sbita popularidade de computadores miniboard como


o Raspberry Pi trouxe de volta o esprito pioneiro dos
primeiros dias do Linux. Repentinamente, o faa voc
mesmo na comunidade de cdigo aberto est de volta.

PROGRAMAO
Centro do alvo?

72

Com a verso 2.0 do Android, os desenvolvedores


passaram a ter acesso a recursos multitoque
anteriormente reservados a aplicativos do sistema. Mas
ateno: preciso ter cuidado ao manusear a API.

REDES
Squid no meio

54
A linguagem de programao Dart a atual alternativa
do Google ao JavaScript. Executada principalmente em
navegadores, tambm pode ser utilizada em linha de
comando e em servidores como substituta para o PHP.

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

Linux Magazine #95 | Outubro de 2012

Editorial

06

Emails

10

Linux.local

78

Preview

82

Coluna do Alexandre Santos

CORPORATE

Inteligncia
coletiva
Conhecimento na era digital existe para ser compartilhado. E o volume
de dados armazenados na rede tende a crescer assustadoramente.
Cabe a ns, usurios, saber filtrar aquilo que realmente nos interessa.

ivemos hoje um consenso de que a tecnologia


da informao pode expandir nossa capacidade de comunicao, colaborao, compartilhamento de conhecimento e, por extenso, a nossa
capacidade de descoberta e inovao.
At a chegada da era digital, a maioria das pessoas aceitou um sistema padro de conhecimento.
Os alunos estudavam temas, ganhavam credenciais
para provar sua proficincia e tornavam-se especialistas. Parte destes especialistas conduziam pesquisas e
transmitiam conhecimento escrevendo livros e artigos
para compartilhar suas descobertas e concluses com
o meio acadmico e profissional. Outros, ao aplicar
o conhecimento na prtica, comprovavam a teoria
ou a derrubavam. Conforme essas novas descobertas
iam ganhando aceitao, juntavam-se ao corpo de
conhecimento estabelecido onde forneciam a base
de conhecimento para o prximo nvel de aprendizagem num ciclo seguro e lento.
Mas, desde 1961, quando o MIT demonstrou o primeiro sistema mundial de compartilhamento [1], o
embrio dasmdias digitais passou a impulsionar o
desenvolvimento e a adoo de tecnologias colaborativas cada vez mais sofisticadas. Hoje usamos email,
mdias sociais, mensagens instantneas, fazemos conferncias pela Internet e compartilhamos espaos de
trabalho atravs de servios online.
A abundncia de informaes na rede tornou ainda mais difcil discernir o que verdadeiro daquilo
que falso. O co-fundador da Wired, Kevin Kelly,
recentemente escreveu que os seres humanos publicaram pelo menos 32 milhes de livros, 750 milhes
de artigos e ensaios, 25 milhes de msicas, 500
milhes de imagens, 500 mil filmes, 3 milhes de
vdeos, programas de TV e curtas-metragens, alm

32

de 100 bilhes de pginas pblicas na Internet, e a


maior parte desta exploso de conhecimento aconteceu nos ltimos 50 anos. Mesmo com o temor de
que nossas mentes possam estar sendo modificadas
pela natureza superficial da Internet [2], o conhecimento avana a um ritmo sem precedentes, alavancado por esta Inteligncia Darwiniana Coletiva
que surge dessa gororoba digital. Pessoas comuns
oferecem abordagens e solues 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 esto fora dela.
Por mais que reclamemos do excesso de lixo digital,
prefiro parafrasear o terico organizacional Russell
Ackoff que, em 1988, j dizia: no o excesso de
informao; falha nos nossos filtros. Que venha a
Web Semntica [3] para nos salvar.

Mais informaes:
[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 Semntica: http://
www.w3.org/2001/sw/

Alexandre Santos (alexos@br.ibm.com) gerente de estratgia e marketing de System z da IBM Brasil.

www.linuxmagazine.com.br

Preveno contra invaso

CAPA

Sempre alerta!
Rpidos e silenciosos, invasores podem atacar uma rede, danific-la e sair sem deixar rastros
antes que voc perceba. Saiba como evitar estes e outros problemas de segurana.
por Flvia Jobstraibizer

segurana de redes e sistemas e seu contnuo


monitoramento um assunto vasto e por vezes
complicado no mundo da tecnologia da informao. No entanto, existe no arsenal do profissional de
TI, diversas ferramentas teis para o monitoramento,
busca e preveno de potenciais ataques ou problemas
relacionados a segurana.
Entre tantas tarefas que um administrador de sistemas precisa desempenhar durante sua jornada de
trabalho, a segurana da rede e dos sistemas sob sua
responsabilidade acaba sendo relegada para segundo
plano. Isso se deve ao fato de que os profissionais delegam a tarefa do monitoramento para determinadas
ferramentas que, embora eficientes, precisam de uma
mozinha para realizar seu trabalho com excelncia.
Nesta edio da Linux Magazine vamos falar sobre
o preocupante assunto da invaso de redes e sistemas.
Os invasores modernos so muito mais efetivos do
que antigamente. So rpidos, silenciosos e depois de
atingirem seu objetivo seja roubar informaes, seja
danificar um sistema vo embora sem deixar rastros,
na maioria das vezes. E o problema mesmo, acaba
ficando na mo do profissional que agora ter uma
grande dor de cabea para resolver.
Um dos mais eficientes monitores de rede, o Wireshark,
ser abordado nesta edio, em conjunto com algumas
ferramentas menos conhecidas e que fazem parte da soluo. Aprenda como ler e interpretar informaes em
busca de potenciais evidncias de invaso.
O profissional que estiver engajado em encontrar
vulnerabilidades que potencialmente podem ser utilizadas por invasores, deve conhecer a ferramenta
OpenVAS. Indispensvel no arsenal do analista de
segurana, o OpenVAS uma soluo completa para
busca de vulnerabilidades em locais especficos como
softwares, portas do servidor e servios locais como os
protocolos de email e web.
Realizamos tambm, uma variedade de testes de invaso
em redes que j esto funcionando sob o novo protocolo
IP, o IPv6. Descubra quais so as vulnerabilidades que o

Linux Magazine #XX | Ms de 200X

novo protocolo IP esconde e prepare-se para, juntamente com a adoo do protocolo, manter sua rede segura!
A nova gerao da tecnologia traz diversos benefcios como o IPv6, o HTML5, BIG DATA, HPC, novos
sistemas de arquivos, novos kernels e toda uma sorte
de ferramentas de segurana para manter os invasores
longe dos seus dados. No entanto, nem toda essa avanada tecnologia far com que voc durma tranquilo.
preciso estar sempre alerta!

Matrias de capa
Rede de segurana

34

Agulha no palheiro

40

Anlise de vulnerabilidades

44

33
3

ANDROID | Multitoque

Android multitoque

ANDROID

Toque perfeito
Com a verso 2.0
do Android, os
desenvolvedores passaram
a ter acesso a recursos
multitoque anteriormente
reservados a aplicativos
do sistema. Mas ateno:
preciso ter cuidado
ao manusear a API.
por Markus Junginger

sucesso do iPhone demonstra que os controles multitoque oferecem muitos


benefcios prticos. No de se
admirar que concorrentes do iPhone trabalhem duro no desenvolvimento de suas prprias tecnologias
multitoque. O Google estendeu a
verso 2.0 do Android API para que
desenvolvedores e usurios pudessem se beneficiar de recursos que
envolvem toques e gestos.

Uma infinidade
de touchpads
Ao contrrio do iOS, o Android
precisa lidar com uma variedade
de combinaes de hardware e software. Primeiro, preciso trabalhar
com uma API que suporte mltiplas
entradas por toque. No caso do An-

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 }

50

droid, isto o equivalente a uma API


nvel 5 (Android 2.0 ou mais recente).
O hardware tambm influencia no
nvel de suporte multitoque, e a verdadeira extenso deste suporte nem
sempre transparente. Por exemplo,
embora o HTC originalmente suportasse Android 1.0 em seu modelo G1
(antes mesmo do recurso multitoque
ter sido anunciado), o hardware j
era capaz de identificar diversos tipos de gestos.
No entanto, o reconhecimento
de gestos no necessariamente
o mesmo que suporta multitoque.
Dispositivos com telas resistentes
ao toque, em particular, frequentemente detectam apenas um nico
toque isto se aplica, por exemplo,
ao HTC Tattoo.
Outros dispositivos retornam apenas uma caixa delimitadora: embora
estes dispositivos possam identificar
uma caixa entre dois dedos, no so
capazes de identificar toques individuais. A figura 1 ilustra estas restries
de hardware: o desenho mostra dois
dedos posicionados de forma distinta em uma caixa delimitadora. Se
os dedos do usurio se moverem de
uma posio a outra, o dispositivo
frequentemente confunde as posi-

es dos dedos e s identificar a


caixa com segurana. Muitos aparelhos HTC, como o Desire, usam
esta tecnologia.
O primeiro smartphone com Android 2.0, o Motorola Droid, detectava as posies dos dois dedos
individualmente. O Galaxy S capaz de identificar e processar at
quatro toques simultneos. Os desenvolvedores no devem assumir
que a tecnologia multitoque estar
disponvel onde quer que Android
esteja presente. Para aplicativos que
dependem de mltiplas entradas
por toque para recursos crticos, o
desenvolvedor deve adicionar uma
nota ao manifesto para garantir que
somente os dispositivos multitoque
sejam capazes de instalar o aplicativo no Google Play:
<uses-feature android:name = \
"android.hardware.touchscreen.
multitouch" />

Descoberta das
entradas multitoque
A API multitoque do Android baseada no recurso de toque, introduzido
no Android 1.0. A extenso principal
para multitoque est relacionada

www.linuxmagazine.com.br

Multitoque | ANDROID

com a classe MotionEvent, que inclui


recursos adicionais suportados pelo
Android 2.0 [1].
Para comear, aceite objetos
MotionEvent. Um desenvolvedor
normalmente instala um recurso
listener para uma visualizao usando setOnTouchListener() ou substitui as classes Activity ou View em
onTouchEvent(). A listagem 1 mostra
um esqueleto para o onTouchListener.
Como possvel notar na listagem 1, o desenvolvedor acessa todos os dados relevantes, tais como
a ao realizada ou coordenadas x
e y, atravs dos mtodos de acesso a
objetos MotionEvent. Na sequncia
de um evento ACTION_DOWN, desencadeado pelo Android quando o
usurio toca na tela pela primeira
vez, o sistema operacional envia
eventos ACTION_MOVE para movimentao de dedos.
Os eventos continuam at que
o usurio pare de tocar na tela. O
Android ento informa ao aplicativo
que o dedo deixou a tela, e envia um
ACTION_UP. Como indica o mtodo

de assinatura onTouch(), possvel


registrar um OnTouchListener com
mltiplas visualizaes.
Na base desta curta atualizao
MotionEvent, o desenvolvedor poder criar extenses de mltiplas entradas por toque. Se atualizarmos
um aplicativo Android existente,
no h necessidade de modificar a
estrutura do aplicativo pois os dados
das entradas multitoque utilizam o
mesmo caminho. Isto fornece um
significado adicional ao cdigo do
mtodo getAction(): o nmero inteiro de 32-bit codifica dois valores.
Podemos isolar esses valores usando
bitmasks apropriadas e deslocamentos 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 cdigo premultitoque.
A varivel pointerIndex contm um

Listagem 2: onTouchListener
recebendo Motion Events
01
02
03
04

public boolean onTouch(View v, MotionEvent e) {


int action = e.getAction() &
MotionEvent.ACTION_MASK;
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 }

Linux Magazine #95 | Outubro de 2012

ndice para o indicador responsvel


pelo evento.

Liberdade para
os dedos
Se precisar manter cada dedo na tela
por um perodo de tempo, ser necessrio utilizar indicadores de ID.
O getPointerId(), que pressupe o
indicador de index como parmetro, cuida desta tarefa. O exemplo
a seguir demonstra o uso de IDs: o
indicador e o dedo mdio tocam na
tela, um aps o outro. Se o usurio
manter um dedo da tela, o programa
no consegue identificar 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 mdio atribudo o prximo
indicador ID de 1. Com base nos IDs,
o programa pode identificar cada
dedo individualmente e, assim, sabe
qual dedo ainda est tocando a tela.
A utilizao de indicadores mltiplos introduz dois novos cdi-

Listagem 3: View mostra os valores


01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

class TouchView extends View {


public TouchView(Context context) {
super(context);
setBackgroundColor(Color.WHITE);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < MAX_POINTERS; i++) {
PointF point = points[i];
if (point != null) {
paint.setColor(getColor(i));
canvas.drawCircle(point.x, point.y,
radius, paint);
String text = getActionText(i);
float width = paint.measureText(text);
canvas.drawText(text, point.x - width / 2,
point.y - radius - calcDevicePixels(8),
paint);
}
}
canvas.drawText(Pointer: + pointerCount,
10, calcDevicePixels(30), paintInfoText);
}
}

51

ANDROID | Multitoque

Figura 1 Dedos cruzados causam problemas, a caixa de vnculo para as posies dos dedos a mesma para ambas as variantes, o que significa
que o dispositivo no pode identificar precisamente as posies.

gos de ao: ACTION_POINTER_DOWN e


ACTION_POINTER_UP correspondem a
ACTION_DOWN e ACTION_UP; a diferena
que o Android no os utiliza at
que um segundo dedo toque na tela.
O exemplo demonstra a sequncia de aes. 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 registrar um ACTION_MOVE. Se o dedo 1
ento se erguer para fora da tela, o
cdigo fornecer um ACTION_POINTER_
UP, considerando que este se trata de
um evento ACTION_UP para o dedo 2.

O aplicativo Multitouch Test, disposto na figura 2, resume os principais


aspectos relacionados s mltiplas
entradas por toque no Android. O
aplicativo, disponvel no Google
Play, serve para visualizar os eventos multitoque e til como ponto
de partida para experimentao de
extenses prprias.

Teste de mltiplos
toques
O recurso oferecido pelo aplicativo
de teste limitado: ajuda a visualizar
cada indicador a partir de um crculo,
que assume diferentes cores dependen-

Quadro 1: Indicadores
Nos crculos 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 desenvolvedores enumeram indicadores usando o getPointerCount(). Ao invs de mtodos de acesso sem parmetros do MotionEvent, temos agora mtodos sobrecarregados, cada um com o indicador de ndice, como o
getX(int pointerIndex). Dependendo do aplicativo, o desenvolvedor pode
no precisar de mais nada alm de informaes para projetar um aplicativo
que suporte mltiplas entradas por toque.

Quadro 2: Mscaras e deslocamentos


O Google adicionou recursos que facilitam a estimativa do cdigo de chamada de ao e indicadores de ndice. Os desenvolvedores no 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 modifica as constantes ACTION_POINTER_ID_MASK
e ACTION_POINTER_ID_SHIFTque ocorrem nos exemplos mostrados neste artigo. Porque eles se relacionam com o indicador de ndice mais do que com o
ID, so agora mais corretamente entitulados de ACTION_POINTER_INDEX_MASK
e ACTION_POINTER_INDEX_SHIFT.

52

do do cdigo utilizado para chamar


a ao. O crculo fica azul quando
o usurio toca a tela, verde quando
o usurio move um dedo, ou cinza
quando acionado o cdigo para um
dedo sendo levantado fora da tela. O
aplicativo mostra tambm nos crculos
o ID do indicador e o ltimo cdigo
utilizado para chamar a ao.
preciso implementar o cdigo
do aplicativo no contexto de uma
atividade. A listagem 2 mostra a implementao do OnTouchListener,
que vincula-se exibio usando
o setOnTouchListener(), conforme
ilustrado na listagem 3. Para economizar espao, deixamos de fora as
definies de membros, tais como
as arrays points[] e lastActions[]. O
cdigo-fonte completo est disponvel online [2].
As primeiras linhas da listagem 2
resumem o cdigo da ao e o ndice do indicador. Aps este passo, o
cdigo da ao e da posio do indicador esto descritos para as arrays
lastActions[] ou points[]. O ndice
de ambas as arrays corresponde
identificao do indicador, em cada
caso. O nmero de indicadores limitado pelas constantes MAX_POINTERS:
o aplicativo gerencia um nmero
mximo de 20 indicadores.
Um caso especial ocorre quando
so definidos os cdigos para uma
determinada ao. O MotionEvent
para o ACTION_POINTER_DOWN retorna
mltiplos valores, desde que o ACTION_POINTER_DOWN refira-se apenas
a um nico indicador ID. O nico
caso em que possvel usar os valores
lastActions() para todos os indicadores no MotionEvent o ACTION_MOVE.
Por fim, o touchView.invalidate()
na linha 20 dispara uma atualizao
de status e mostra os novos valores.
A visualizao neste aplicativo
uma classe separada, diretamente
derivada da View, como mostra a
listagem 3. O objeto Canvas fornece
um mtodo simples de desenhar crculos em um loop. Os cdigos para

www.linuxmagazine.com.br

Multitoque | ANDROID

coordenadas e chamadas de ao
necessrios para desenhar crculos
so coletados pelo onTouchListener
da listagem 2 nas arrays points[] e
lastActions[]. A cor e o texto de um
crculo so definidos pelos mtodos
getColor() e getActionText(). A mltipla escolha determina o valor de
retorno, que depende do cdigo da
ltima ao atribuda ao indicador.
Finalmente, o aplicativo tambm
desenha o nmero de indicadores
contidos no MotionEvent em formato
texto. O mtodo calcDevicePixels()
auxiliar e verifica o nmero especfico de pixels do dispositivo, que
por sua vez depende da profundidade
de pixels dispostos na tela.

multiplicar a propriedade ScaleFactor


pelo ScaleGestureDetector.
Com os mtodos getFocusX() e
getFocusY() possvel verificar o foco
do dimensionamento.

Concluso
Hardware e software em dispositivos
Android possuem uma enorme influncia no suporte multitoque. Telas
que suportam mltiplas 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 construo de seus aplicativos.
A API multitoque, com suas
MotionEvents e diversos indicadores,
asseguram um lugar no pdio para o
Android no que se refere a dispositivos dotados deste recurso.

Pinch e zoom
Possivelmente, a novidade mais interessante o ScaleGestureDetector,
que detecta e amplia gestos. Trs
etapas so necessrias para utiliz-lo:
primeiro, preciso instanciar um
ScaleGestureDetector; em seguida, passar cada MotionEvent para o
ScaleGesture-Detector; por ltimo,
necessrio um listener especial
para coletar os novos dados.
A listagem 4 mostra estas trs etapas
nos mtodos init() e onTouchEvent(),
e na classe MyScaleListener. O mtodo
onScale() escalona a visualizao ao

Mais informaes
[1] API multitoque para Android:
http://developer.android.
com/reference/android/
view/MotionEvent.html
[2] Cdigo-fonte para este artigo:
http://smart-developer.com/
Resources/Article-Code

Gostou do artigo?
o?
Queremos ouvir sua
a opinio.
Fale conosco em
cartas@linuxmagazine.com.br
zine.com.
Este artigo no nosso
so site:
sit
http://lnm.com.br/article/7648
article 648

Linux Magazine #95 | Outubro de 2012

Figura 2 O aplicativo Multitouch Test permite que programadores depurem


eventos e os exibam em cores.

Listagem 4: Pinch e Zoom


01 // called in constructor, for example
02 private void init(Context context) {
03 scaleDetector = new ScaleGestureDetector(context,
new MyScaleListener());
04 }
05
06 public boolean onTouchEvent(MotionEvent ev) {
07 scaleDetector.onTouchEvent(ev);
08 // ...
09 }
10 private class MyScaleListener
11 extends ScaleGestureDetector.SimpleOnScaleGestureListener {
12 public boolean
13 onScale(ScaleGestureDetector detector) {
14
skalierung *= detector.getScaleFactor();
15
invalidate();
16
return true;
17 }
18 }

53

SSEGURANA | Monitoramento com NAS

SEGURANA

Monitoramento com NAS

Olhar penetrante
Tire proveito do baixo consumo de energia
oferecido por dispositivos NAS modernos
para monitorar suas cmeras.
por Ben Martin

moderno hardware NAS


possui a CPU embutida que
muitas vezes oferece grande
desempenho com baixo consumo de
energia. Muitas destas unidades necessitam de menos de 10 watts para
operar com uma conexo de rede
gigabit e a CPU a 100% de uso. Um
NAS com baixo consumo de energia
pode consumir de 10% a 20% da eletricidade que um hardware desktop
precisa para funcionar. A principal
questo passa a ser ento: seria a CPU
do NAS rpida o suficiente para
monitorar e detectar o movimento
de uma ou mais cmeras?
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 desafio de
deteco de movimento em tempo
real (figura 1). Note que grande parte
do artigo tambm deve ser diretamente aplicvel ao seu primo mais barato

de carcaa nica, o QNAP TS-119p


II, que ostenta a mesma CPU/RAM.
Uma soluo popular para monitoramento com cmera e deteco de
movimento a suite ZoneMinder [2].
As cmeras podem ser tanto de rede
IP como cmeras USB conectadas
diretamente ao servidor ou em outra
mquina na rede. O ZoneMinder
pode monitorar todas as suas cmeras,
detectar movimento em reas-chave
ou zonas, e notific-lo sobre a atividade em reas de interesse. As zonas
limitam a rea de monitoramento,
de modo que o ZoneMinder pode
ver quando algum 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 nvel
so a Synology e a QNAP. Produtos
de baixa capacidade com CPUs de
1.2GHz e 256MB de RAM tambm
esto disponveis, assim como modelos

Listagem 1: Instalao do Debian Wheezy


01
02
03
04
05
06

# for if in `seq 1 6`; do


cat /dev/mtdblock$if > mtd$if
done
# cp mtd* /share/external/sdi1/
# sync
# 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/model
08 # sh flash-debian
09 Your MAC address is 00:08:9B:C8:D7:11
10 # reboot
11 # exit

60

mais sofisticados com CPUs de 2GHz


e 512MB de RAM. No intervalo dos
1,2 GHzz esto o Synology DS212j e
o QNAP TS-212; no intervalo dos 2
GHz esto o Synology DS212+ e o
QNAP TS-219P II, juntamente com
o de carcaa nica QNAP TS-119p II.
Tanto o produto da QNAP quanto
o da Synology vem com sua prpria
distribuio Linux. Ambas as unidades
NAS permitem usar o gerenciador de
pacotes ipkg para instalar aplicativos de
cdigo aberto adicionais e complementar
o software embarcado. Por exemplo, o
leitor pode instalar o padro CoreUtils
ao invs dos binrios-padro BusyBox.

Instalao
Se o usurio no possuir um dispositivo
NAS instalado, a configurao inicial
para este aparelho exige que seja feita
a remoo de uma (ou mais) bandejas
individuais de disco rgido, 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
configurao de hardware. Por outro
lado, o Synology DS212j desliza em
duas partes separadas, e fixamos o disco
rgido diretamente em um gabinete
de disco rgido interno antes de fazermos o mesmo com a capa exterior do
Synology NAS.
Quando ligamos o TS-219P II, o
dispositivo tentar obter um endereo

www.linuxmagazine.com.br

Monitoramento com NAS | SEGURANA

IP via DHCP, aps o qual podemos


efetuar login em uma interface online
do dispositivo NAS e concluir a instalao. A configurao inicial do TS-219P
II envolve o upload de um arquivo de
imagem firmware de 140 MB (figura
2). Aps o NAS reinicializar e cair na
distribuio Linux que acabamos de
carregar, preciso responder algumas
perguntas sobre localidade, senhas e
preferncias do aplicativo (figura 3).
Para muitos fins, a combinao de
pacotes nativos do fornecedor NAS
complementada com pacotes disponveis atravs do ipkg suficiente. Se o
aplicativo que o usurio necessita no
est incluso no ipkg, possvel compil-lo e instal-lo. Este processo geralmente
envolve a criao de um ambiente em
mquina virtual para a CPU ARM em
uma mquina desktop, bem como a
compilao do software. Normalmente,
os cabealhos de desenvolvimento de
software no NAS no esto disponveis
facilmente sob a forma de pacotes para
instalao no prprio equipamento.

Como instalar o
Debian no ARM
Para uma personalizao mais avanada, temos a opo de instalar o Debian
ao invs de utilizar o firmware de fbrica. Instalar o Debian permite acessar
o ZoneMinder atravs do gerenciador
de pacotes e compilar o software mais
facilmente na mquina NAS.
A instalao do Debian em uma
mquina ARM personalizada [3] pode
parecer assustadora pela primeira vez.
Histrias de pessoas com instalao
pela metade que viram apenas tijolos
caros so folclore comum; para tornar
as coisas mais intrigantes, no temos
qualquer tela ligada ao dispositivo que
permita descobrir o que deu errado.
Alm disso, teremos que configurar
o suporte de opes personalizadas
para o hardware fornecido, como
alto-falantes, LEDs e fans.
Dito isto, o processo de instalao do Debian bastante simples e

Linux Magazine #95 | Outubro de 2012

Figura 1 Equipamentos: QNAP TS-219P II NAS, uma cmera


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

provavelmente mais at que a configurao do ambiente de compilao


necessrio para ampliar o nmero de
softwares se continuarmos a usar o
firmware fornecido [4]. Para prosseguir, siga os seguintes passos:
1. Opcionalmente, faa uma cpia
de segurana do firmware do carto
de memria no NAS.
2. Baixe o Debian flasher, kernel,
metadados, e arquivos de instalao
initrd.
3. Instale os arquivos na memria
flash do NAS.
4. Reinicie.
5. Conecte-se via SSH no NAS e
conclua o processo com a interface

de instalao do Debian, que baseada em console.


Uma vez que o passo 5 tenha sido
concludo, o programa ir reinstalar
a memria do NAS para iniciar em
um novo sistema Debian.
Alm do kernel e o initrd residente
na memria flash do NAS, as etapas
restantes para instalar o Debian so
exatamente as mesmas que existem
em uma mquina desktop. Como veremos mais adiante, o primeiro passo
para fazer uma cpia de segurana
do firmware existente opcional.
O instalador Debian convenientemente pega as configuraes de
hosts e de rede que havamos feito

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

61

SSEGURANA | Monitoramento com NAS

reinicializao, devemos ser capazes de


fazer um ssh como root e encontrar uma
tima mquina Debian nos aguardando.
Com um disco WD Green de 2TB executando, o NAS ocioso deve consumir
cerca de 10 watts de energia (tabela 1).

Fora das cinzas

Figura 3 Uma vez que o firmware gravado em disco, configure seu login,
localizao, IP, e servios de informao.

com o firmware QNAP normal e as


reutiliza para a instalao do Debian.
A maioria das perguntas so sobre
localizao e como desejamos que
discos e parties sejam configurados.
Em nossa instalao do Debian
Wheezy (listagem 1), os primeiros
cinco comandos criam uma cpia de
segurana da memria flash existente
em um pendrive. Na linha 6, os quatro arquivos de instalao do Debian
mencionados no passo 2 so baixados,
enquanto um comando flash-debian
na linha 8 nos coloca na memria flash
do QNAP, pronto para ser carregado
quando o NAS for reiniciado.
Aps o NAS ser reiniciado, devemos
ser capazes de fazer ssh nele como installer@NAS usando a senha install. Provavelmente teremos que remover a chave
do host do arquivo ~/.ssh/known_hosts
para o SSH no considere que o host
mudou sua chave de forma inespera-

da desde a ltima conexo. Em seguida, o usurio dever ver um menu de


boas-vindas como o da figura 4.
Perto do final da instalao, teremos a chance de alterar a seleo de
aplicativos. muito importante que
o usurio no se esquea de instalar a
opo de servidor SSH, para que possa
conectar-se facilmente no NAS quando o Debian instalado for executado.
Alm disso, precisaremos de um servidor online, um banco de dados SQL,
e um servidor de arquivos enquanto
estivermos neste menu. Apesar de um
servidor de arquivos no ser realmente
necessrio para o ZoneMinder, se o usurio possuir algum espao sobrando no
seu disco rgido, pode desejar acess-lo
atravs da rede para outros fins.
Quando a instalao estiver concluda, o instalador pede que sejam
removidos todos os discos CD-ROM
ou de instalao (que no temos). Na

Figura 4 Iniciando a instalao do Debian via SSH.

62

Uma desvantagem de usar firmware


personalizado em um hardware especializado descobrir o que fazer quando as
coisas do errado. Tnhamos um drive
Green de 2TB sobrando e, enquanto este
artigo estava sendo escrito, descobrimos
por que ele no estava em uso ativo.
Depois que substitumos o kernel
na memria flash do NAS com o kernel e a imagem initrd do Debian, o
sistema queria encontrar uma instalao Debian para inicializar a partir
do disco rgido. O problema era que
o disco no queria mais funcionar e,
para os objetivos desta anlise, no tnhamos nos dado ao trabalho de criar
um RAID espelhado agradvel para o
caso de uma simples falha de disco.
Esta situao parece ser um cenrio do pior caso: um disco rgido
danificado; o firmware na memria
flash sobrescrito com software que
espera que o disco esteja por ali; sem
inicializao; sem visor.
Felizmente, mesmo quando sobrescrevemos a memria flash do equipamento QNAP, podemos coloc-lo
em um modo que tentar recuperar a
partir da rede a informao que deve
estar na memria flash [5]. Melhor
ainda, o QNAP oferece uma imagem de boot do Linux que contm
um servidor TFTP para transmitir a
imagem flash para o NAS.
Ao ligar o laptop diretamente no
NAS, iniciar a partir do disco de
recuperao no laptop e segurar o
boto reset enquanto liga o NAS, o
usurio poder ativar esse modo de
recuperao. Uma vez que o NAS
ligar, sero ouvidos bipes e diferentes
cores LEDs piscaro para que esteja
ciente de que algo est acontecendo;
no final, ter o NAS com o mesmo

www.linuxmagazine.com.br

Monitoramento com NAS | SEGURANA

software no firmware de quando o


comprou, poupando-o de um NAS
personalizado que no iria inicializar.
Em seguida, podemos colocar o instalador do Debian de volta na memria flash do NAS e escolher com mais
sabedoria na pilha de discos rgidos
disponveis. claro que, em produo,
todo mundo usa um RAID espelhado
ou tem um slido, automatizado e testado sistema de backup incremental
em funcionamento, no mesmo?

ZoneMinder
As principais dependncias do ZoneMinder so Perl, MySQL, OpenSSL,
a biblioteca JPEG, alguns mdulos
Perl, e (opcionalmente) FFmpeg. O
ZoneMinder inclui cdigo PHP, C++
e Perl. Depois de instalar o Debian no
sistema, podemos tirar proveito dos
repositrios de pacotes para instalar o
ZoneMinder sem ter que compil-lo. A
instalao simples como chamar um:
apt-get install zoneminder

resultando em cerca de 170 MB de


espao adicional usado no NAS.
Para iniciar a interface online do
ZoneMinder, temos que criar um
link do arquivo de configurao do
site no diretrio 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 Apache reiniciado, devemos ver a interface online do ZoneMinder em
http://NAS/zm/, supondo que NAS
o endereo IP da unidade NAS.
O boto Add New Monitor na parte
inferior da interface do ZoneMinder
permite que adicionemos uma nova
cmera no sistema (figura 5). Para este
exemplo, usaremos duas cmeras: a
TP-Link TLSC3171G 640x480 IP e
a Logitech C910 USB 1080p. A parte complicada na configurao de
cmeras saber o que o caminho
do host remoto (Remote Host Path)
deve ser e ter a certeza de que a re-

Linux Magazine #95 | Outubro de 2012

soluo da imagem, largura e altura


em pixels coincide com a sada da
cmera (figura 6).
Alm disso, precisamos saber o
endereo IP e a porta da cmera
e, via HTTP, pode ser necessrio
entrar com o URL para comear a
usar os dados da cmera. Para uma
cmera 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 movimento em reas crticas da imagem
ir adicionar mais uso de CPU neste
valor. Nossa configurao NAS teve
que usar at 25% da CPU para atender ao streaming de vdeo a partir de
uma webcam com 640x480 para o
Firefox (figura 7).
Com a cmera TP-Link apontada para uma cena escura ao ar livre
noite, a deteco de movimento
manteve-se em cerca de 15% da
CPU para quadro cheio (full frame
640x480) de deteco em uma taxa
de quadros baixa (tabela 2).

Memria
compartilhada
O ZoneMinder precisa manter as
imagens recentes que recebe das cmeras em algum lugar na memria.
Nas verses anteriores, o ZoneMinder usava memria compartilhada
para armazen-las. Agora, ele cria e
usa arquivos de memria mapeados
em /dev/shm. Independentemente de
qual sistema esteja em uso, pode ser
necessrio adequar o NAS para fazer
o armazenamento correto de memria disponvel para estas imagens.
O ZoneMinder 1.25.0 do Debian
Wheezy utilizado neste artigo usa o
dospositivo /dev/shm para as imagens.
A instalao padro criou um sistema
de arquivos tmpfs com um tamanho
limite de 100MB. O ZoneMinder
precisa de cerca de 100MB para uma
nica cmera de 1280x720, e cerca
de 35MB para uma nica cmera de

Figura 5 Incluso de uma nova


cmera no ZoneMinder.

640x480. Para calcular a quantidade


de memria necessria para o armazenamento de imagens da cmera,
encontre a memria (bytes) para um
nico quadro: largura(px) x altura(px)
x 3(RGB). Estas imagens so armazenadas numa rea de buffer na memria. O padro que utilizamos foi
de 40 imagens no buffer para uma
cmera. O comando:
mount -o remount,size=256m /dev/shm

vai dedicar mais memria para imagens


do ZoneMinder. Para fazer isso funcionar aps uma reinicializao, edite
o arquivo /etc/default/tmpfs e defina
shm_size para o tamanho que desejar.
Para economizar memria para
cmeras maiores, ajuste o tamanho
de buffer para quadros de imagem
mostrado na guia Buffers das confi-

Figura 6 Configurao de uma cmera


de rede no ZoneMinder.

63

SSEGURANA | Monitoramento com NAS

guraes da cmera. Descobrimos


que para usar menos quadros tivemos
que excluir, por exemplo, zm.mmap.2
de /dev/shm e fazer o ZoneMinder recriar um novo arquivo menor quando
aceitamos a configurao da cmera.
Usar 20 quadros para uma cmera de
720p requer apenas 53MB de RAM.

Como detectar
eventos
O que faz o ZoneMinder interessante
a sua capacidade de detectar movimento em reas crticas de um quadro
da cmera e gravar o vdeo automaticamente quando o movimento ocorre.
Depois de colocar a cmera no modo
de deteco de movimento clicando
no link Funo da cmera na pgina
inicial de instalao do ZoneMinder,
podemos mascarar partes do quadro
de vdeo clicando no link Zonas da
cmera. Desta forma, o ZoneMinder
ignora movimento fora da sua rea
de interesse.
Muitos fatores determinam a quantidade de CPU que necessria
para a deteco de movimentos:
o tamanho da imagem da cmera,
imagens em cores ou imagens em
escala de cinza, o nmero de quadros por segundo de um processo,
a dimenso das zonas de deteco,
e os parmetros utilizados no algoritmo de deteco.

Quando clicamos no nome de uma


cmera no ZoneMinder, mostrada
uma visualizao ao vivo do que a
cmera est captando, junto com
uma lista dos eventos que foram detectados recentemente e a capacidade
de forar o disparo de um alarme. O
disparo de um alarme tem o mesmo
efeito que forar o ZoneMinder a
pensar que um movimento significativo ocorreu na cmera.
Em nosso primeiro teste, usamos
uma cmera TPLink com 640x480 a
5fps. O monitoramento usou 15% da
CPU, e forar um estado de alarme
causou um salto de at 26% da CPU.
Aps a confirmao de um alarme
disparado pelo ZoneMinder indicando movimento real na cmera,
foi confirmado o mesmo salto para
26% de uso de CPU no NAS.
Monitoramento com uma C910
Logitech atravs da rede com resoluo de 1280x720 a 10fps consumiu
72% de CPU do NAS. Baixando para
2fps com a mesma cmera usou at
22% da CPU. A visualizao ao vivo a
2fps consumiu um adicional de 40%
de CPU. Claramente, cmeras de
monitoramento de 720p a 30fps esto
alm do que a CPU no NAS pode
segurar, e deteco de movimento a
10fps provavelmente no possvel,
mas se voltarmos alguns quadros por
segundo com a mesma cmera, pode
ser bom a 720p se o usurio desejar
utilizar apenas uma cmera.

Watts

Ao

NAS desligado, mas com cabo plugado

Disco com giro baixo e nenhum cabo de rede

Disco com giro baixo

10

Em execuo com o disco girando

13

Discos girando e executando o OpenSSL

Tabela 1 Uso de energia com o firmware de fbrica.


% CPU RAM (MB) Tarefa (Processo)
6-12

43

Monitorar apenas noite (zmc)

15-25

41

Visualizar no Firefox (nph-zms)

15

42

Deteco de movimento, quadro completo, noite (zma)

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

64

Uma cmera USB ultrabarata com


640x480 que s pode produzir vdeo
YUYV conectada porta USB2 do
NAS sendo usada a 5fps precisa de
cerca de 15% da CPU para monitorar
e 50% para transmitir. A deteco de
movimento em quadro cheio nesta
cmara requer um adicional de 40%
de CPU, que tem picos de at 80%
se um estado de alarme disparado.
O uso da CPU no mudou muito
entre as predefinies rpida e melhor com baixa, mdia e altas sensibilidades. Reduzir para uma rea de
alarme de 100x100 diminuiu o uso
da CPU a 35%.
Mudar a cmera ligada localmente para a C910 da Logitech e
tentar a resoluo de 1280x720 a
5fps dividiu o uso de CPU 50-50
entre monitorar a cmera e verificar movimentos nos quadros. Tal
diviso de 50-50 parecia suspeita, j
que a deteco 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 deteco
de movimento usou 68%. Depois de
voltar para 640x480 a 4 fps, o monitoramento consumiu 12% de CPU
e a deteco de movimento, 28%.
Logo, se o usurio quiser usar este
processador, qualquer coisa acima
de 640x480 susceptvel a causar
problemas de desempenho.

Mergulho no cdigo
Pelo fato de no vermos muita diferena no uso de CPU para cada um dos
algoritmos de deteco de movimento
que o ZoneMinder oferece, decidimos dissecar um pouco o cdigo. O
cdigo chama Monitor::DetectMotion()
a cada quadro para trabalhar a pontuao (quantidade de movimento)
e se um alarme foi acionado. Tendo
esse mtodo retornar sem alarme
de imediato ao invs de deteco de
movimento real resultou em cerca de
8% da CPU a ser utilizada para uma
cmera de 640x480 executando a 6fps.

www.linuxmagazine.com.br

Monitoramento com NAS | SEGURANA

Uma das primeiras coisas que DetectMotion() faz criar uma imagem
delta, medindo o quanto o quadro
atual difere de um quadro de referncia. A imagem delta apenas registra
a intensidade da diferena para cada
pixel em vez da diferena de cada
vermelho, verde e azul. Para fazer a
imagem delta e exclu-la novamente
antes de retornar nenhum alarme,
15% da CPU foi necessria antes
de qualquer deteco de movimento
ter ocorrido.
O ncleo do mtodo Imagem::Delta()
cria uma imagem delta e registra quanto cada pixel diferente de uma imagem de referncia:
...
red = y_r_table[*psrc++ - *pref++];
green = y_g_table[*psrc++ - *pref++];
blue = y_b_table[*psrc++ - *pref++];
*pdiff++ = abs_tablered + green +;
...

As variveis so pref, a imagem


de referncia; psrc, o quadro atual
e pdiff, a imagem delta. Este cdigo pode ser modificado e executado
mais rapidamente em CPUs ARM
com a extenso NEON [7]. De acor-

do com o comando /proc/cpuinfo,


a CPU neste equipamento QNAP
s tinha disponvel as extenses swp
half thumb fastmult edsp.
Pelo fato de os valores de referncia apresentados na tabela 2 variarem
mais com a resoluo de imagem
e taxa de quadros, apenas preparar
e produzir todos os quadros estava
consumindo uma quantidade substancial da CPU.

Consideraes finais
Os chips ARM top de linha que
equipam alguns hardwares NAS
modernos fornecem uma plataforma para computao em tempo real
bastante interessante, com consumo de energia reduzido. A CPU
de 2GHz Kirkwood do NAS testada aqui poderia realmente apenas
lidar com deteco de movimento
em uma taxa de quadros baixa em
duas cmeras IP com 640x480 ao
mesmo tempo.
Tenha em mente que o dispositivo pode fazer isso com menos de
15 watts, incluindo o disco rgido.
Quando no h eventos acontecen-

do, o equipamento pode cair para


menos de 10 watts enquanto ainda
monitora ativamente as cmeras em
busca de movimentos interessantes.
Monitoramento de cmera normalmente uma proposta de trs
turnos. A prxima vez que o leitor
considerar realocar um PC com consumo de 75 watts a 100 watts para este
propsito, poder considerar a alternativa 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 instalao Debian, o
NAS tem acesso a uma quantidade enorme de pacotes de software
que permitem a personalizao
do dispositivo para lidar com uma
tarefa especfica.

Mais informaes
[1] Pgina do QNAP TS219P 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] Documentao do instalador
do Debian ARM: http://www.
debian.org/releases/lenny/
arm/install.pdf.pt_BR
[5] Recuperao de firmware do
QNAP: http://wiki.qnap.
com/wiki/Firmware_Recovery/
[6] Discusso 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?
igo?

Figura 7 Monitoramento de uma pea de madeira com o ZoneMinder no NAS.

Linux Magazine #95 | Outubro de 2012

Queremos ouvir sua opinio.


nio.
m
Fale conosco em
cartas@linuxmagazine.com.br
ne.com
Este artigo no nosso
osso site:
s e:
r/artic 693
http://lnm.com.br/article/6938

65

TUTORIAL | OpenSSL com Bash

Como usar OpenSSL com Bash

TUTORIAL

Crptico
A criptografia uma parte importante da segurana
em TI, e o OpenSSL uma conhecida ferramenta
de criptografia para o Linux. Especialistas confiam
no OpenSSL porque livre, possui muitos
recursos e fcil de usar em scripts Bash.
por Marcin Teodorczyk

OpenSSL [1] faz uso da


entrada e sada padres, e
suporta uma ampla gama
de parmetros, tais como opes de
linha de comando, variveis de ambiente, pipes, arquivos e descritores
de arquivos. Podemos aproveitar estes
recursos para escrever rapidamente
scripts Bash [2] que automatizam
tarefas, tais como teste de conexes
SSL/TLS, converses massivas entre
diferentes formatos de chaves criptogrficas e certificados, assinatura/
criptografia em lote de arquivos,
auditoria de arquivos protegidos por
senha, e implementar ou testar uma
infraestrutura de chaves pblicas PKI
(Public Key Infrastructure).
As ferramentas do OpenSSL
fornecem muitos mdulos que
executam tarefas especficas. Cada
mdulo no um executvel separado mas, ao invs disso, selecionado com o primeiro parmetro do
executvel openssl. Por outro lado,
cada mdulo tem uma pgina de
manual separada. Por exemplo,
um mdulo chamado x509 gerencia certificados digitais X.509 e um
mdulo chamado pkcs12 gerencia
pacotes PKCS12.

66

Para usar o x509, devemos executar o seguinte comando:


openssl x509 -param1 param1value

mas, para ver sua pgina de manual,


devemos digitar man x509.

Como testar
conexes SSL/TLS
O OpenSSL fornece trs mdulos
que permitem testar as conexes
SSL: s_client, s_server e s_time.
Os dois primeiros, como os nomes
sugerem, so para simular um cliente e um servidor em uma conexo
SSL. O terceiro para os testes de
tempo de conexo. Vamos comear com uma anlise detalhada no
mdulo s_client.
O s_client particularmente
til para verificar quais protocolos e cifras o servidor aceita
utilizar. Esta informao til
em auditorias de segurana e recursos. Por exemplo, podemos
usar esta informao de protocolo para encontrar servidores que
no aceitam um protocolo ou cifra
legtimo, evitando assim que um
cliente legtimo se conecte. Tam-

bm podemos localizar servidores


que aceitam protocolos ou cifras
fracos e poderiam assim permitir
um ataque malicioso. Com uma
pequena ajuda do Bash, possvel
automatizar esse processo.
Suponha que os nomes do cliente
e do servidor so cliente e servidor, e
que o servidor escuta conexes SSL/
TLS na porta 443.
Para verificar quais protocolos
o servidor aceita, podemos usar os
seguintes parmetros: -ssl2, -ssl3,
-tls1, -no_ssl2, -no_ssl3, ou -no_tls1.
Pelo fato de o SSL2 ser conhecido
por ter falhas de segurana, podemos
tentar nos conectar ao servidor usando o seguinte comando:
openssl s_client -connect
server:443 -no_ssl3 -no_tls1

Se o servidor aceita qualquer outro protocolo exceto SSL3 ou TLS1,


o comando anterior abre uma conexo e espera por dados claro,
esta abordagem no a ideal se o
usurio pretende inserir o comando
em um script Bash). Para fechar a
conexo imediatamente depois de
estabelec-la, escreva na entrada
padro do s_client:

www.linuxmagazine.com.br

OpenSSL com Bash | TUTORIAL

echo "x" | openssl s_client


-connect server:443 -no_ssl3
-no_tls1

Da mesma forma, podemos verificar cifras permitidas com o parmetro


-cipher. Para comodidade do utilizador, o OpenSSL permite especificar
conjuntos de cifras especficas (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 verificar se o servidor aceita
conexes 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 mdulos OpenSSL com
um tempo limite especificado. Caso
contrrio, quando uma mquina no
puder ser resolvida, o script ficar esperando por um longo tempo. Um
utilitrio Linux especial permite
executar qualquer comando com
um tempo limite. Surpreendentemente, o utilitrio se chama timeout.
Por exemplo, para verificar se uma
conexo SSL2 pode ser estabelecida,
mas no esperar por ela mais de 10
segundos, use:
echo "x" | timeout 10 openssl
s_client -connect
server:443 -ssl2

Finalmente, para tornar o comando mais automtico, podemos usar


a varivel $? para verificar o cdigo de retorno do ltimo comando
executado pelo Bash. Se a conexo for estabelecida, o OpenSSL
retorna 0.
A listagem 1 mostra um exemplo
de script simples, com tudo que fizemos at agora. O script l nomes
de hosts da entrada padro e verifica
se uma conexo diferente de SSL3
ou TLS1 pode ser estabelecida com
a porta 443. Ele espera no mais do
que trs segundos. Nomes de hosts

Linux Magazine #95 | Outubro de 2012

que permitem tais conexes so gravados no arquivo bad_protocol.txt. Da


mesma forma, os hosts que permitem conexes com cifras NULL ou
LOW so listados em bad_cipher.txt.

Como manipular
formatos PEM/
DER e PKCS12
Alguns formatos e containers so
usados para pares de chaves de
criptografia pblicas e certificados
digitais. Sem entrar em detalhes,
os formatos mais comuns da nossa
rede so PEM, DER, PKCS12, ou
JKS. Destes, apenas o formato JKS
no suportado pelo aplicativo
OpenSSL. O PEM e o DER so
formatos codificados o PEM
um formato codificado em Base64.
O DER binrio. O PKCS12 um
container que pode armazenar chaves privadas e pblicas, bem como
certificados assinados e cadeias de
certificados.
Para converter entre os formatos
de arquivo PEM e DER, podemos
usar os parmetros -inform e -outform. Por exemplo, para converter
todos os certificados 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 extrao


de chaves/certificados de um pacote
PKCS12, que geralmente protegido
com uma senha. possvel lidar com

tal operao no Bash com a opo


passin do OpenSSL. Esta opo
nos permite especificar senhas para
acessar dados em arquivos protegidos
por senhas de cinco maneiras. Ela
til no s para o PKCS12, mas
para toda ao que requer uma senha; por exemplo, chaves privadas
ou dados criptografados.
Primeiro, especificamos uma
senha como pass:password_text e,
neste caso, password_text a senha
atual. Este no um mtodo seguro,
porque a senha armazenada no
histrico do Bash e pode ser vista
com um comando ps durante a execuo. Segundo, especificamos a
senha com env:var. Este mtodo
mais seguro, porque a senha manipulada na varivel de ambiente
var. Outra abordagem a de armazenar a senha como file:pathname,
que diz ao OpenSSL para ler a
senha da primeira linha de um
arquivo localizado em pathname.
Ou ainda poderamos usar fd:number,
o que faz o OpenSSL ler a senha do
descritor de arquivo number. Finalmente, podemos simplesmente usar stdin
para ler senhas da entrada padro.
Em seguida, extrairemos todos os
certificados de arquivos PKCS12 protegidos por senha em um diretrio de
trabalho e tratamos de armazen-los
sem senha. Isto pode ser feito da seguinte forma:
for file in *.p12; do
openssl pkcs12 -in $file -passin
file:$file.pass -nokeys -nodes
-out $file.nokeys
done

Listagem 1: Como verificar protocolos permitidos


01 #!/bin/bash
02 while read server ; do
03
timeout 3 openssl s_client -connect $server:443 -no_ssl3 -no_tls1
04
if [ $? -eq 0 ] ; then
05
echo $server >> bad_protocol.txt
06
fi
07
timeout 3 openssl s_client -connect $server:443 -cipher NULL,LOW
08
if [ $? -eq 0 ] ; then
09
echo $server >> bad_cipher.txt
10
fi
11 done

67

TUTORIAL | OpenSSL com Bash

Supomos que temos uma senha


para cada arquivo PKCS12 escrita em
um arquivo com a extenso .pass.

Criptografar e
descriptografar
em massa
Tarefas comuns de criptografia de
arquivos incluem encriptao e decriptao. A criptografia simtrica
utiliza uma chave para criptografar
e descriptografar. A criptografia assimtrica usa uma chave pblica para
criptografar e uma chave privada
para descriptografar (normalmente
implementada com PKI e certificados X.509).
Criptografia simtrica mais rpida que a criptografia assimtrica,
e uma escolha melhor quando no
h necessidade de acesso pblico
para a chave.
Para criptografar o arquivo plain.
txt com criptografia simtrica e escrever o arquivo de sada cipher.enc,
usamos o seguinte comando:
openssl [ciphername] -a -salt -in
plain.txt -out cipher.enc

O sistema solicitar uma senha


criptogrfica, que tambm tem de
ser digitada quando for descriptografada mais tarde. No a melhor
opo para operaes em massa,
mas j descrevemos vrios mtodos
para especificar uma senha para
o OpenSSL.
Assim, para criptografar todos os
arquivos .txt no diretrio atual e
grav-los no diretrio ../enc com a
cifra aes-256-cbc, possvel usar o
seguinte loop (supondo que a senha
est escrita no arquivo de pass):
for file in *.txt; do
openssl aes-256-cbc -a -salt -in
"$file" -out "../enc/$file"
-passin file:pass
done

Podemos descriptografar todos


os arquivos .txt no diretrio atual
e grav-los no diretrio ../dec com:

68

for file in *.txt; do


openssl 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/
sada padro
De acordo com a filosofia Unix,
cada argumento que passado com
o parmetro in pode ser passado
tambm usando a entrada padro.
Se no especificarmos a sada com
o parmetro -out, o resultado ser
mostrado na sada padro. Assim,
podemos usar o OpenSSL para processar sadas de outros comandos e
gerar entradas para outros programas
com um pipe. Para verificar se um
certificado com o nmero de srie
44A2FC741D8C1755 foi revogado, usamos o seguinte comando:
curl -s http://localhost/crl.pem |
openssl crl -text -noout | grep
"Serial Number: 44A2FC741D8C1755"

Este comando ir recuperar uma


lista de certificados revogados (da sigla
CRL, de Certificate Revocation List)
e decodific-la com o OpenSSL. Em
seguida, pesquisar por um nmero de
srie. Da mesma forma, como com os
scripts Bash anteriores, podemos adicionar um timeout e verificar a sada
do comando grep com a varivel $?.

Como auditar senhas


criptografadas
A chave privada quase sempre deve
ser protegida com uma senha. Muitas vezes, arquivos PKCS12 tambm
so protegidos com senhas. Com o
OpenSSL e o Bash, fazemos uma
rpida verificao das senhas usadas
para proteger os arquivos. Vamos supor que temos um arquivo de texto
com as senhas mais comuns, uma em
cada linha, chamado passwords.txt.

Verificamos cada arquivo protegido


por senha no diretrio atual com
while read pass; do
for file in *.p12; do
openssl pkcs12 -in $file -noout
-passin pass:$pass 2>/dev/null
if [ $? -eq 0 ] ; then
echo "Senha adivinhada para
$file: $pass"
fi
done
done < passwords.txt

utilizando cada senha do arquivo


passwords.txt.

Teste do PKI
O ltimo grande recurso do OpenSSL o de implementar uma infraestrutura de chave pblica (PKI).
Uma PKI muitas vezes tem um papel
crucial na segurana, 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 certificado correspondentes (da sigla CSRs, de Certificate
Signing Request). Segundo, podemos
assinar CSRs, criando assim certificados
vlidos. Terceiro, podemos revogar e
gerar CRLs. Quarto, podemos assinar/
criptografar e verificar/descriptografar.
E finalmente, podemos alterar os parmetros em tempo real e manipular
valores, tais como algoritmos, comprimentos de chave ou contedo DN.
possvel usar estes dados como entrada
para outros aplicativos.
A listagem 2 mostra alguns exemplos de recursos que usamos para
testar vrios elementos de uma PKI.
A funo create_config foi cortada
para melhor legibilidade. Utilize o
contedo de seu arquivo de configurao padro do OpenSSL para
configuraes adicionais. O arquivo de configurao normalmente
se chama openssl.cnf e fica em /etc.
Por padro, o OpenSSL l o arquivo de configurao de um local
especificado (normalmente /etc/
openssl.cnf); mas, para nossos testes, foi mais fcil criar um arquivo

www.linuxmagazine.com.br

OpenSSL com Bash | TUTORIAL

de configurao na hora. A funo


de script create_config cuida disso
escrevendo a configurao no arquivo
./config. Mais tarde, o arquivo criado por esta funo apontado no
OpenSSL com o parmetro -config.
Em seguida, temos funes create_
root_ca, create_crl, create_client_req,
sign_client_req, e revoke_client_cert;
os nomes delas so auto-explicativos.
Todas estas funes recebem parmetros que especificam tarefas como
uma string DN (de nome exclusivo ou distinguished name), prazo
de validade, tamanho de chave etc.
A parte principal do script (no
mostrada na listagem) pode utilizar
as funes para gerar um nmero
especfico de certificados de autori-

dade certificadora (da sigla CA, de


Certification Authority) e um determinado nmero de certificados de
cliente para cada CA. Alm disso,
poderamos revogar certificados de
algum cliente logo aps a gerao.
Desta forma, a sada do script possuiria vrios certificados CA, certificados de cliente revogado, e CRLs.

Concluso
O OpenSSL uma ferramenta muito
flexvel. Pelo fato de podermos especificar todos os parmetros necessrios
usando a linha de comando, arquivos,
pipes e variveis de ambiente, perfeitamente 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 prprias ideias. Apenas no
confunda a chave privada de outra
pessoa com a sua prpria.

Mais informaes
[1] OpenSSL: http://
www.openssl.org/
[2] Bash: http://www.gnu.
org/software/bash/

Gostou do artigo?
igo?
Queremos ouvir sua opinio.
o nio.
m
Fale conosco em
cartas@linuxmagazine.com.br
ne.com
Este artigo no nosso
sso site:
s e:
r/artic 763
http://lnm.com.br/article/7639

Listagem 2: Como testar uma PKI

Listagem 2: Como testar uma PKI (continuao)

01 function create_config {
02
{
03
echo HOME= .
04
echo RANDFILE= $ENV::HOME/.rnd
05
06
...
07
cortado para melhor legibilidade
08
...
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=$1
19
local country=$2
20
local org=$3
21
local name=$4
22
local days=$5
23
local certfile=$6
24
local keyfile=$7
25
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=$1
31
local cacert=$2
32
local crlfile=$3
33
openssl ca -gencrl -config $config -keyfile
$cakey -cert $cacert -out $crlfile
34 }
35
36 function create_client_req {

37
38
39
40
41
42
43

Linux Magazine #95 | Outubro de 2012

local keysize=$1
local country=$2
local org=$3
local name=$4
local keyfile=$5
local reqfile=$6
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=$1
48
local days=$2
49
local cacert=$3
50
local cakey=$4
51
local clientcert=$5
52
openssl x509 -req -days $days -CA $cacert
-CAkey $cakey -CAcreateserial -in $clientreq
-out $clientcert
53 }
54
55 function revoke_client_cert {
56
local clientcert=$1
57
local cakey=$2
58
local cacert=$3
59
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 }

69

TUTORIAL | Raspberry Pi

Raspberry Pi

TUTORIAL

Computao
pioneira
A sbita popularidade de computadores miniboard como
o Raspberry Pi trouxe de volta o esprito pioneiro dos
primeiros dias do Linux. Repentinamente, o faa voc
mesmo na comunidade de cdigo aberto est de volta.
por Brian Proffitt

t agora, a maioria dos nerds


j ouviu falar do Raspberry Pi
[1], mas caso o leitor ainda no
tenha ouvido falar a respeito, oferecemos um panorama sobre o assunto.
O projeto Raspberry Pi comeou
em 2006, quando um grupo de pesquisadores do laboratrio de computao da Universidade de Cambridge, no Reino Unido, observava os
conhecimentos de informtica em
declnio para estudantes de Nvel A
que acessavam seus programas. O que
viam no era nada positivo, e era uma
tendncia que se repetia tambm em
outras naes, alm do Reino Unido.
Apesar da proliferao dos computadores pessoais, ou talvez por causa
dela, as crianas j no experimentavam 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 primrdios
A equipe de Cambridge, liderada pelo
designer Eben Upton, comeou a montar um dispositivo pequeno, porttil, e
muito barato que iria inicializar diretamente em um ambiente de programao. A partir da, estudantes de qualquer
idade poderiam comear a programar
para o que lhes fosse mais interessante.

70

Nos EUA, a carncia de conhecimentos em informtica no ensino


para jovens significa que o pas dever
enfrentar uma sria lacuna de talentos
para o desenvolvimento de aplicativos
no futuro. Os EUA j possuem uma
falta de talentos no que se refere anlise de dados massivos, logo no nada
improvvel que essa lacuna na programao surja um pouco mais adiante.
Esta no uma coisa boa, e no pelos habituais argumentos geopolticos
que condenam os EUA ou o Reino
Unido de ficar para trs de uma nao
ou de outra. Como sociedades autossuficientes, so naes que desejam
a gesto de informaes e contedos
puramente nas mos de poucos e seletos magos da programao?
Dadas as devidas propores, o
declnio da alfabetizao na programao se espelha no declnio da alfabetizao aps a queda do Imprio
Romano, e todos ns sabemos o que
aconteceu depois. A centralizao
do controle dos nossos dados pode
ser um pouco diferente para a nossa
sociedade de como foi a centralizao da palavra escrita pelo clero e
pela aristrocracia na Idade Mdia.
Tal a viso que engloba o contexto no qual se insere o projeto do
Raspberry Pi.
Em 2008, o dispositivo conhecido
como Raspberry Pi tinha concludo

a fase de projeto e estava pronto para


ser produzido. A fundao Raspberry Pi foi criada naquele ano e, aps
trs anos de captao de recursos e
produo, os dispositivos Pi foram
saindo da linha de montagem.

O presente
Existem dois modelos do Raspberry Pi
disponveis: o modelo A por 25 dlares
em modelo B por 35 dlares. Ambos
possuem um processador ARM de 700
MHz em uma placa monoltica da
Broadcom, com 256 MB de RAM e
um slot de carto SD/MMC/SDIO
para armazenamento. A nica grande
diferena entre os dois modelos que
com mais 10 dlares possvel obter
um conector Ethernet 10/100 e uma
segunda porta USB no modelo B.
Esse pequeno diferencial de preo
e a popularidade de um dispositivo
conectado rede poderia explicar por
que o tempo de espera em qualquer
lugar , em mdia, de 5 a 12 semanas para adquirir um modelo B, de
acordo com o fornecedor.
E ele no est mais sozinho: novos
dispositivos, como o Cotton Candy,
o Mele A1000, o MK802 e o Oval
Elephant fazem parte desta crescente
famlia de mini-PCs.
claro que possvel fazer muitas
coisas alm de simples programao
com um Raspberry Pi nas mos. Exis-

www.linuxmagazine.com.br

Raspberry Pi | TUTORIAL

tem pessoas que descobriram que o


dispositivo, por exemplo, pode ser
um vivel media streamer [2] e um
reprodutor de rdio Internet [3]. Para
este artigo, no entanto, cobriremos
o objetivo geral do dispositivo: executar um sistema operacional Linux
no qual o leitor possa programar.
H um sem nmero de distribuies
que podem ser executadas no Raspberry
Pi. Basicamente tudo que precisamos
de uma distribuio compilada para
um processador ARM11 em uma imagem de disco que vai caber em pelo
menos um carto SD de 2GB. No
entanto, a equipe do Raspberry Pi
atualmente recomenda uma das trs
distribuies listadas em sua pgina
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 procedimento ser o mesmo; apenas mudam os
nomes dos arquivos. Nota: os nomes
de arquivos so os disponveis no momento em que escrevemos esta matria. Eles podem variar um pouco aps
a publicao desta edio.
Para comear, visite a pgina de
downloads do Raspberry Pi e baixe
a ltima edio do arquivo ZIP do
Raspbian wheezy.
No diretrio em que baixar o arquivo, extraia a imagem com

Este comando ir listar os dispositivos que esto montados. Veremos


um nome do dispositivo que no
corresponde configurao atual
de unidades do seu sistema. Esse
dispositivo extra seu carto SD.
Se o carto possuir um nome como
/dev/sdd1, ignore o 1 (ou qualquer
outro nmero ao final do nome).
Os nmeros indicam parties, e
quando gravarmos a imagem de disco
do Raspbian no carto, precisaremos
do nome do dispositivo, que neste
exemplo ser /dev/sdd. Tambm
necessrio desmontar todas as parties que esto no carto. A maioria
dos cartes SD ter apenas uma partio, 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 parties com sdd no nome.
Em seguida, escreva a imagem
do Raspbian no carto SD com o
comando dd. Cuidados devem ser
tomados aqui para que no sejam
utilizados como destino o disco rgido ao invs do carto SD. Ainda
no terminal, navegue at o diretrio
/2012-07-15-wheezy-raspbian e digite
sudo dd bs=1M if=2012-07-15wheezy-raspbian.img of=/dev/sdd

Esta etapa pode levar algum tempo, portanto seja paciente e no pense
que o processo est travado. Quando

o prompt de comando retornar o resultado da operao, digite


sudo sync

para limpar o cache de gravao. Agora


podemos remover o carto SD e us-lo
em nosso dispositivo Raspberry Pi.
Com a porta HDMI gerenciando
vdeo e duas portas USB cuidando dos
controles do mouse e do teclado, o
leitor poder indagar se o tamanho do
carto SD estar limitado ao armazenamento. Atravs de um hub USB,
porm, tambm possvel expandir
as portas e comear a usar drives USB
externos para armazenamento.

O futuro
Uma das maiores atraes para o
dispositivo Raspberry no apenas
o dispositivo em si; a comunidade
em volta deste pequeno dispositivo
muito forte e est crescendo rpido.
Quem no teve a felicidade de viver
os primeiros dias do Linux, quando
as coisas eram rpidas e livres e a
informao muito mais complicada
de se obter ento esta ser uma experincia nova que remeter a esses
dias. Veteranos do Linux se sentiro
em casa com a comunidade Raspberry.
A convergncia de dispositivos
baratos e poderosos como este deve
abrir caminho para uma srie de
projetos inovadores e o Raspberry Pi
j desperta ateno na produo de
robs terrestres [5] e dispositivos de
realidade extraterrestre [6]. As possibilidades, como aconteceu com o
velho Linux, so infinitas.

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

Mais informaes

Insira um carto SD no leitor do


computador e digite:

[1] Raspberry Pi: http://www.raspberrypi.org/

df -h

Gostou do artigo?
igo?
Queremos ouvir sua opinio.
o nio.
Fale conosco em
m
cartas@linuxmagazine.com.br
e.com
Este artigo no nosso
osso site:
s e:
http://lnm.com.br/article/7652
r/artic 765

Linux Magazine #95 | Outubro de 2012

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


[3] Rdio Internet: http://www.raspberrypi.org/
phpBB3/viewtopic.php?f=9&t=4031
[4] Downloads: http://www.raspberrypi.org/downloads
[5] Robs: http://www.raspberrypi.org/forum/
projects-and-collaboration-general/starwars-r5-d4-astromech
[6] Balo Meteorolgico: http://www.raspberrypi.
org/phpBB3/viewtopic.php?f=9&t=2059

71

PROGRAMAO

PROGRAMAO | Dart

Dart, a alternativa do Google ao JavaScript

Centro do alvo?
A linguagem de programao Dart a atual alternativa
do Google ao JavaScript. Executada principalmente em
navegadores, tambm pode ser utilizada em linha de
comando e em servidores como substituta para o PHP.
por Tim Schrmann

cdigo escrito na linguagem


de programao Dart do Google se parece muito com uma
mistura de JavaScript e Java com uma
pitada de Scala. Essa semelhana intencional: a linguagem de programao
[1] foi projetada com base no desejo
de eliminar alguns problemas e o lastro legado do JavaScript. A premissa
que os programas Dart possam ser

executados mais rapidamente e com


melhor segurana, que trabalhem em
qualquer dispositivo compatvel com
Internet e que sejam adequados para
projetos ainda maiores [2]. Se uma
pessoa tem experincia com linguagens de programao e essa descrio
encaixa-se para quase qualquer programador web ir tambm rapidamente
sentir-se vontade com o Dart.

Programas escritos em Dart sero executados em uma mquina


virtual especial no navegador. O
projeto fornece uma implementao de referncia 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. Alm da mquina virtual,
o projeto oferece um par de bibliotecas cujas funes entre outras
coisas oferecem suporte manipulao conveniente da rvore de
um site DOM (sigla para Document
Object Model ou modelo de objeto
de documentos). Um par de outras
ferramentas tambm facilita a vida
de programadores, como o editor
Dart baseado no Eclipse (figura 1).

Trabalho em
andamento

Figura 1 O Editor Dart um ambiente de desenvolvimento baseado no


Eclipse, fornecendo acesso direto aos exemplos de cdigo.

72

Tudo isso soa muito atraente,


com uma desvantagem pequena: o
Dart est atualmente em um estgio
muito inicial de desenvolvimento e,
portanto, no adequado para uso
em produo. Os inventores do Dart
intencionalmente lanaram a sua

www.linuxmagazine.com.br

Dart | PROGRAMAO

especificao em um estgio inicial


para coletar tantas sugestes de melhorias quanto fosse possvel, bem
como para melhorar a aceitao.
tambm precisamente por isso que
a especificao da linguagem tem
sido colocada sob a licena Creative Commons Atribution 3.0 e o cdigo do programa publicado pelo
projeto sob a licena BSD Google
[3]. Quando este artigo foi escrito,
a verso mais recente do Dart era a
0.08, e esta a verso na qual a viso
geral a seguir se baseia.

Listagem 1: Uma classe simples

main() e Classes

Listagem 2: Interface e extends

O ponto de partida para um programa


Dart, como em Java, o main(). Para
os programadores de JavaScript, especialmente, isso pode parecer novo:
main() {
// Um pequeno comentrio
print("Ol Mundo!");
}

Os programadores de JavaScript iro


tossir novamente: Dart uma linguagem
orientada a objetos em todos os sentidos. A listagem 1 mostra a declarao
de uma classe chamada Carro. A classe
comea por definir uma nova varivel
cor. Como a palavra-chave var sugere,
as variveis podem assumir valores arbitrrios a qualquer momento como
no JavaScript, Dart uma linguagem
sem tipos. Esta seguida pelo construtor 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
no acabe em uma varivel global ou
em uma nova varivel.
A linha 8 mostra duas caractersticas do Dart. Em linguagens como
Java, o desenvolvedor pode definir
vrios construtores com parmetros
diferentes (sobrecarga). Quando um
objeto criado, a linguagem, ento,
automaticamente chama o construtor correspondente. Em linguagens
como Dart, tal escolha no to
simples. Para resolver o problema,
a linguagem utiliza construtores co-

Linux Magazine #95 | Outubro de 2012

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22

class Carro {
var cor;
Carro() {
this.cor = "azul";
}
Carro.pintura(this.cor);
}
main() {
Carro ferrari = new Carro.pintura("vermelho");
Carro bmw = new Carro();
print(ferrari.cor); // sada vermelha
print(bmw.cor); // sada azul
}

interface Superficie {
int superficie_conteudo();
}
class Quadrado implements Superficie {
int largura;
Quadrado(int this.largura);
int superficie_conteudo() => largura*largura;
}
class Retangulo extends Quadrado {
int _altura;
Retangulo( int this._altura, int br) : super(br);
int superficie_conteudo() => largura * _altura;
}
main() {
Quadrado q = new Quadrado(3);
Retangulo r = new Retangulo(2,3);
print(q.superficie_conteudo());
print(r. superficie_conteudo());
}

Listagem 3: Padro factory


01 class Carro {
02 String fabricadopor;
03 static Map garagem;
04
05 factory Carro(String fabricante){
06
if (Carro.garagem == null) Carro.garagem=new Map();
07
if (Carro.garagem.containsKey(fabricante)!=null) return
08
Carro.garagem[fabricante];
09
else {
10
Carro newcarro = new Carro.compra(fabricante);
11
Carro.garagem[fabricante] = newcarro;
12
return newcarro;
13
}
14 }
15
16 Carro.compra(this.fabricadopor);
17 }
18
19 main() {
20 var umcarro = new Carro("Ferrari");
21 var outrocarro = new Carro("Ferrari");
22 }

73

PROGRAMAO | Dart

nhecidos. Na listagem 1, o segundo


construtor chamado de pintura, e
caso se queira chamar precisamente
esse construtor ao criar uma instncia Carro na funo main(), preciso
especificar o nome l:
Carro ferrari = new
Carro.pintura("vermelho");

Em contraste, new Carro() iria


apenas chamar o construtor normal.
Como um segundo recurso especial, o construtor Carro.pintura()
usa uma abreviao: o Dart atribui
o valor passado para ele diretamente
para a varivel cor. Claro, se preferir,
use a verso longa:
Carro.pintura(var umacor) {
this.color = umacor;
}

As variveis que podem assumir


valores arbitrrios podem ser muito
convenientes, mas esta abordagem
tende a causar alguma negligncia
por parte dos programadores no
mundo real, o que leva a erros que
podem ser difceis de resolver. Por
este motivo, os programadores podem, opcionalmente, especificar
um tipo de uma varivel:
class Carro {
String cor;
[...]

Se o programa Dart tenta armazenar um nmero em cor em algum


estgio posterior do programa, a mquina virtual cria um aviso. Como

foi dito, este apenas um aviso e no


um erro o programa continuar
a funcionar com um nmero em
cor. Esse comportamento chama a
ateno do programador para erros
de atribuio e torna o cdigo mais
legvel, e os usurios no precisam
temer uma falha sbita do programa. Alm do tipo String, o Dart
tambm suporta os tipos listados
na tabela 1.
Alis, todos estes so objetos internos. possvel at criar listas e
mapas com um new:
var autos = new List();

As variveis que ainda no tiveram


um valor atribudo automaticamente
tm o valor especial null.
Como no PHP, o Dart pode inserir
o contedo de variveis em strings.
O cdigo:
String nome = "John Doe";
print ("Ol ${nome}");

geraria um Ol John Doe. Dentro dos


colchetes {} pode at haver expresses
completas ou chamadas de funo.

Verso em linha
Usurios Dart podem abreviar uma
definio de funo individual como
a seguir:
int quadrado(int numero)
{ return numero*numero; }

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

(por exemplo, => e significa {return e;}). No Dart, possvel passar uma funo para outra, o que
muito til em loops:
digaOla(String nome) =>
print("Ola ${nome}");
List nomes = ["Tim", "Joe",
"Henry"];
nomes.forEach(digaOla);

A funo digaOla escreve a string


passada para ela aps Ol e exibe os
resultados na tela. A segunda linha
cria uma lista com trs nomes que,
por sua vez, so empurrados um aps
o outro e entregues para a funo
pelo forEach neste caso, a funo
digaOla(). Em outras palavras, este
trecho de trs linhas de cdigo exibe
Ol Tim, Ol Joe e Ol Henry.
Pelo fato de o digaOla s ocorrer
em nomes.forEach(), podemos declarar a funo 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 codificao funciona bem aqui mas, em


funes mais complexas, pode-se
facilmente perder de vista o que se
est fazendo. Os suspeitos de costume esto disponveis para controle
de fluxo: for, if, switch e while, e
agem exatamente como seus homlogos em Java ou JavaScript. Alm
disso, possvel usar excees para
detectar erros.

Tipo

Contedo

Exemplo

String

String (32-bit Unicode)

String nome = Joe;

int

Inteiro

int numero = 12;

double

Nmeros de ponto flutuante de 64 bits (em


conformidade com o padro IEEE 754)

double numero = 1.3456;

num

Nmeros inteiros, nmeros de ponto flutuante, ou ambos

num y = mx + b

bool

verdadeiro/falso

bool pegacookies = true;

List

Uma lista de valores, tambm conhecida como array

List nomes = [Tim, Joe, Henry];

Map

Array associativo, tambm conhecido como


um mapa hash ou dicionrio de dados

Map traducao = {house : casa,


car : carro, chair : cadeira};

Tabela 1 Tipos suportados pelo Dart.

74

www.linuxmagazine.com.br

Dart | PROGRAMAO

Clssico
O Dart herdou interfaces do Java.
Quando uma classe implementa
uma interface, ela garante que a
funo especificada na interface seja
fornecida. A listagem 2 fornece um
exemplo de herana.
Uma classe pode implementar
vrias interfaces, mas apenas herda
exatamente uma classe (ou seja, usa
extends para estender a classe). Na
listagem 2, todas as variveis e funes
so pblicas, com uma exceo, _altura. Se o nome da varivel ou uma
funo comea com um sublinhado,
ela privada, e s possvel acessar a
varivel ou funo dentro da prpria
classe. Na listagem 2, isso significa
que no se pode retroativamente
modificar a altura de um retngulo.

Figura 2 O SDK Dart inclui uma mquina virtual para linha de comando.

Oferta de Factory
Padres de projeto [4] tm sido parte do repertrio do desenvolvedor
profissional por muitos anos. Assim,
no h nenhuma surpresa em que o
Dart tambm suporte este recurso.
Por exemplo, o padro Factory j faz
parte da linguagem: se o construtor for
prefixado com a palavra-chave factory,
o Dart no cria automaticamente um
objeto desta classe, mas deixa para o
construtor. O programador pode ento olhar em um cache para ver se
um objeto correspondente j existe,
como pode ser visto na listagem 3.
A varivel outrocarro neste exemplo 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 varivel.
O padro Factory pode tambm
ser combinado com interfaces. Para
fazer isso, atribui-se a classe padro
factory a uma interface, e a classe
factory retorna objetos para coincidir
com a interface. A listagem 4 mostra um exemplo disso. A interface
define a assinatura do construtor,
que em seguida gera objetos para
coincidir com a interface. O Carro-

Linux Magazine #95 | Outubro de 2012

Figura 3 A ferramenta online Dartboard permite aos desenvolvedores testarem


pequenos programas Dart diretamente no navegador.
Factory na listagem 4 ir retornar um
objeto Carrodecorrida ou Conversvel
dependendo do fabricante que lhe

for passado. Durante a instncia em


main(), parece que se est criando
um Carro diretamente.
Alm disso, a palavra-chave is testa para ver se um objeto um tipo
especfico. Alis, a palavra-chave final na frente do fabricante garante
que varivel s possa ser atribudo
um valor exato e somente uma vez
durante sua inicializao.

Servio de Continer
O Dart contm os tipos genricos,
tambm conhecidos como generics,
com os quais provavelmente estamos
familiarizados por causa do Java. Programadores C++ tambm conhecem
esse conceito como templates. pos-

svel us-los para criar rapidamente


recipientes para objetos arbitrrios. As
listas de funes embutidas e mapas
so genricos. 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 variveis podem assumir contedo arbitrrio, o Dart no


impedir isso:
List<Carro> listadecarros =
new List<Carro>();
List<LKW> listadecaminhoes =
listadecarros;

Essa experincia pode explodir


mais tarde, se o desenvolvedor ten-

75

PROGRAMAO | Dart

tar fazer algo com o que assumiu ser


um caminho da listadecaminhoes.

Paralelismo
Programadores normalmente mudam
as tarefas que precisam ser executadas em processos paralelos separados
e, em seguida, trabalham duro para
unir os resultados intermedirios.
O Dart remove as dores de cabea
desse processo: um objeto derivado

da classe Isolate bsica, se assim se


deseja, executado separadamente
do programa principal em seu prprio processo.
Para ser capaz de trocar resultados
intermedirios, os Isolates podem
enviar mensagens uns para os outros. Essas mensagens so primeiro
enfileiradas at que o receptor Isolate pegue o que conhecido como
uma porta. Este modelo lembra

Listagem 4: Combinando interface e factory


01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

76

interface Carro default CarroFactory {


Carro(fabricante);
final fabricante;
}
class CarroFactory {
factory Carro(fabricante) {
if (fabricante == "Ferrari") {
return new Carrodecorrida(fabricante);
}
return new Conversivel(fabricante);
}
}
class Carrodecorrida implements Carro {
Carrodecorrida(this.fabricante);
String fabricante;
}
class Conversivel implements Carro {
Conversivel(this.fabricante);
String fabricante;
}
main() {
print( new Carro("Ferrari") CarrodeCorrida);
print( new Carro("VW") is Carrodecorrida);
}

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 separado com spawn(). Depois disso, ele
envia o objeto de quatro palavras em
sucesso. 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 significa que
ele pode responder diretamente para
o seu solicitante.
Os Isolates executam em um
espao de memria separado.
Um efeito colateral positivo disto
que a coleta de lixo pode lidar
com cada Isolate individualmente. No retorno, a mquina virtual
precisa copiar as mensagens entre
o Isolate. No futuro, os Isolates
sero inclusive capazes de usar
as diferentes bibliotecas Dart com
diferentes verses.

Acesso DOM
Pelo fato de o Dart ser projetado
para substituir o JavaScript, os programadores devem ser capazes de
usar a linguagem para acessar a rvore DOM de um site. Para que isso
acontea, o Dart inclui a sua prpria
biblioteca, que pode ser importada
como a seguir:

Listagem 5: Comunicando com um Isolate

#import("dart:html");

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17

Depois, pode-se usar a seguinte


expresso para acessar uma <div>
com a ID menu:

class Receiver extends Isolate {


main() {
port.receive((mensagem, replyTo) {
if (mensagem == null) port.close();
else print("Recebend: ${mensagem}");
});
}
}
main() {
new Receiver().spawn().then((port) {
for (var mensagem in ['Esse', '', 'um', 'teste']) {
port.send(mensagem);
}
port.send(null);
});
}

document.query("#menu");

Os elementos podem assim ser


localizados atravs de seletores CSS
em um estilo muito semelhante ao
jQuery. O Dart pode usar programas de outras classes e funes para
configurar conexes HTTP (Ajax
keyword), dados de processo JSON,
e at mesmo acessar o sistema de
arquivos, entre outras coisas. Para

www.linuxmagazine.com.br

Dart | PROGRAMAO

obter uma lista completa, leia a Referncia da API [5].

Executado
Como os navegadores de hoje atualmente no compreendem programas
Dart, o projeto desenvolveu o compilador Dartc, que converte programas Dart em cdigo JavaScript. No
entanto, o Dartc tinha a reputao
de criar programas JavaScript muito
grandes, que executam muito lentamente. Para resolver este problema,
um compilador GNU chamado Frog
foi criado (e inclusive escrito em
Dart), que gera cdigo JavaScript
muito mais compacto. O Frog
uma mquina virtual para a linha
de comando (figura 2) includa no
SDK Dart, que est disponvel gratuitamente na pgina do projeto [6].
Tudo que necessrio fazer baixar
o arquivo ZIP correspondente, descompactar, e ento compilar o seu
prprio programa Dart (por exemplo,
test.dart) usando o Frog a partir do
diretrio bin,
./frogc --enable_type_checks
test.dart

ou executar o programa diretamente


na mquina virtual:
./dart --enable_type_checks
test.dart

O parmetro --enable_type_checks garante que o compilador, ou a


mquina virtual, possibilite a verificao do tipo.
Caso prefira no usar o SDK agora, possvel executar seus prprios
programas diretamente no site do
projeto Dart, que conhecido como
Dartboard [7] (figura 3). O Dartboard integra a maioria das bibliote-

cas embutidas da linguagem (com


exceo da dart:html), para quando
os programadores precisarem usar
a declarao de importao se eles
trabalharem com a mquina virtual
de linha de comando.
Finalmente, tambm possvel
usar o Dartium, uma verso especial
do navegador Chromium com uma
mquina virtual Dart embutida [8].
possvel verificar a especificao
completa da linguagem Dart [9] e
o cdigo fonte de vrios dos maiores
programas de exemplo Dart [10] no
site do dartlang.org.

Concluso
Com exceo do Dartium, todos
os atuais navegadores ignoram o
Dart, e no se pode culp-los; afinal, a linguagem de programao
no est totalmente completa. Ao
mesmo tempo, o Dart est enfrentando fortes crticas: a maioria dos
observadores acredita que o apoio a
outra linguagem web suprfluo 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
sero incapazes de desviar o olhar.
No entanto, o perigo que uma
comunidade de adversrios do Dart
possa vir a existir, o que significaria mais uma vez a fragmentao
da Internet.
Dito isto, at mesmo os crticos
devem reconhecer que os programas
Dart so mais fceis de ler e compreender do que suas contrapartidas
em JavaScript. Graas orientao a
objetos genuna, aplicativos maiores
e de mais fcil manuteno tambm
so possveis. A perspectiva de uma
linguagem nica para o cliente e o
servidor tambm atraente programadores web no precisariam mais
alternar entre JavaScript e, digamos,
PHP. Mas mesmo quem no vem
do mundo Java deve ser capaz de
encontrar seu espao em um tempo
muito curto. Por fim, a linguagem
organizada de forma aberta, em
contraste com o Java, e qualquer usurio pode apresentar propostas de
melhorias. Pelo menos, assim tem
sido o processo at agora.

Mais informaes
[1] Projeto Dart: http://www.dartlang.org/
[2] Objetivos do projeto Dart: http://www.dartlang.
org/docs/technical-overview/#goals
[3] Licena BSD Google: http://code.google.com/
intl/de-DE/google_bsd_license.html
[4] Padres de Projeto: http://en.wikipedia.
org/wiki/Software_design_pattern
[5] Referncia da API Dart: http://api.dartlang.org/
[6] SDK Dart: http://www.dartlang.org/docs/getting-started/sdk/
[7] Dartboard: http://try.dartlang.org/

Gostou do artigo?
igo?

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

Queremos ouvir sua opinio.


inio.
Fale conosco em
m
cartas@linuxmagazine.com.br
zine.com r

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

Este artigo no nosso


osso site:
s e:
http://lnm.com.br/article/7291
r/artic 729

Linux Magazine #95 | Outubro de 2012

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


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

77

Conhea a coleo Academy


da Linux New Media
Os livros da Coleo Academy so roteiros prticos e
objetivos, com didtica adequada tanto ao profissional
quanto ao estudante da rea de TI.

Luciano Antonio Siqueira

Infraestrutura
de Redes
Passo a passo da montagem de uma rede
de computadores, desde o cabeamento
e roteadores at a congurao das
mquinas clientes.

Congurao e manuteno de servios


essenciais como DNS, compartilhamento
de arquivos e acesso remoto.

Paulo Henrique Alkmin da Costa

Luciano Antonio Siqueira

Samba:

Mquinas
virtuais com
VirtualBox

com Windows
e Linux
Como permitir a comunicao de diferentes sistemas operacionais em rede: Windows,
Linux, Mac OS X etc. Denio de compartilhamentos de arquivos, impressoras incluindo
a instalao automtica de drivers e utilizao do Samba como controlador de domnio
(PDC) tambm para clientes Windows Vista e Windows 7.

O contedo e o formato dos livros foram desenvolvidos a partir da experincia prtica e


educacional de seus autores, com foco principal no desenvolvimento de competncias,
atravs de conceitos, exemplos detalhados e dicas de quem realmente entende do assunto.
O material indicado tanto para autodidatas que desejam se aperfeioar quanto para
utilizao em escolas. O professor ir se sentir confortvel para desenvolver as atividades a
partir do livro, que procura atender tanto expectativa do aprendiz quanto demanda
profissional do mercado de TI.

Disponvel no site www.LinuxMagazine.com.br

Administrao de infraestrutura de
mquinas virtuais com Sun VirtualBox.
Como trabalhar com sistemas operacionais
Windows, Linux etc na mesma mquina
e simultaneamente.

Criao de diferentes modalidades de


conexes virtuais, exportao/importao
de mquinas virtuais e criao de pontos
de recuperao (snapshots).

PREVIEW

Linux Magazine #96


BIG DATA
Estamos em um momento tecnolgico onde tudo gira em torno da
gerao e consumo de grandes volumes de dados. Na prxima edio
da Linux Magazine voc vai conhecer mais sobre o conceito de Big
Data e formas de armazenamento
de informaes em larga escala, de
forma que seja possvel acess-las e
analis-las sempre que necessrio
com desempenho e praticidade.
Entre os temas que sero abordados
na prxima edio esto o Apache
Hadoop e construo de clusters.
No perca!

Admin Magazine #08


Controle de trfego
Melhore o desempenho da sua rede
com verses do kernel apropriadas
para o controle de trfego. Comparamos 6 diferentes sistemas de arquivos, saiba qual o mais adequado
para as suas necessidades. Realize
backups dos dados de toda a sua
rede atravs 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 tambm um
dos destaques da prxima edio
da Admin Magazine, no perca!

82

www.linuxmagazine.com.br

Você também pode gostar