Expediente editorial
À frente do seu tempo
EDITORIAL
Diretor Geral Rafael Peregrino da Silva rperegrino@linuxmagazine.com.br Editores Flávia 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 Kühnast, David J. Dodd, Jon ‘maddog’ Hall, Klaus Knopper, Kurt Seifried, Marcin Teodorczyk, Markus Junginger, Michael Messner, Thomas Drilling, Tim Schürmann, Zack Brown. Tradução Laura Loenert Lopes, Rodrigo Garcia, Sebastião Luiz da Silva Guerra. Revisão Ana Carolina Hunger. Editores internacionais Uli Bantle, Andreas Bohle, Jens-Christoph Brendel, Hans-Georg Eßer, Markus Feilner, Oliver Frommel, Marcel Hilzinger, Mathias Huber, Anika Kehrer, Kristian Kißling, Jan Kleinert, Daniel Kottmair, Thomas Leichtenstern, Jörg Luther, Nils Magnus. Anúncios: Rafael Peregrino da Silva (Brasil) anuncios@linuxmagazine.com.br Tel.: +55 (0)11 3675-2600 Penny Wilby (Reino Unido e Irlanda) pwilby@linux-magazine.com Amy Phalen (América do Norte) aphalen@linuxpromagazine.com Hubert Wiest (Outros países) hwiest@linuxnewmedia.de Diretor de operações Claudio Bazzoli cbazzoli@linuxmagazine.com.br Na Internet: www.linuxmagazine.com.br – Brasil www.linux-magazin.de – Alemanha www.linux-magazine.com – Portal Mundial www.linuxmagazine.com.au – Austrália www.linux-magazine.es – Espanha www.linux-magazine.pl – Polônia www.linux-magazine.co.uk – Reino Unido www.linuxpromagazine.com – América do Norte Apesar de todos os cuidados possíveis terem sido tomados durante a produção desta revista, a editora não é responsável por eventuais imprecisões nela contidas ou por consequências que advenham de seu uso. A utilização de qualquer material da revista ocorre por conta e risco do leitor. Nenhum material pode ser reproduzido em qualquer meio, em parte ou no todo, sem permissão expressa da editora. Assume-se que qualquer correspondência recebida, tal como cartas, emails, faxes, fotografias, artigos e desenhos, sejam fornecidos para publicação ou licenciamento a terceiros de forma mundial não-exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado. Linux é uma marca registrada de Linus Torvalds. Linux Magazine é publicada mensalmente por: Linux New Media do Brasil Editora Ltda. Rua São Bento, 500 Conj. 802 – Sé 01010-001 – São Paulo – SP – Brasil Tel.: +55 (0)11 3675-2600 Direitos Autorais e Marcas Registradas © 2004 - 2012: Linux New Media do Brasil Editora Ltda. Impressão e Acabamento: IBEP Gráfica. Atendimento Assinante www.linuxnewmedia.com.br/atendimento São Paulo: +55 (0)11 3675-2600 Rio de Janeiro: +55 (0)21 3512 0888 Belo Horizonte: +55 (0)31 3516 1280 ISSN 1806-9428
6
Impresso no Brasil
Eric Hobsbawm (1917 – 2012), historiador marxista britânico de renome internacional falecido recentemente, declarou em 2011 por ocasião do lançamento de seu último livro que não podemos confrontar os problemas do século XXI com soluções e sistemas oriundos do século XX. Apesar de essa afirmação fazer alusão a matérias político-sociais e a sistemas econômicos, sou pessoalmente da opinião de que questões de mesma ordem provenientes das ciências do conhecimento, aplicadas também ao desenvolvimento de software, à criação e distribuição do saber e da arte, bem como às próprias atividades sociais, figuram como principais precursoras dos avanços de todo tipo que deverão ocorrer nos anos que virão. O que caracteriza todas essas soluções são os esforços colaborativos que embasam o seu desenvolvimento --- algo que o método científico vem exercitando há mais de meio milênio, conforme publiquei anteriormente neste espaço. Assim, a pesquisa científica, o conceito de Open Source, diversas iniciativas de Crowdsourcing (Wikipédia, OpenStreetMap etc.) e Crowdfunding (financiamento coletivo), a instituição de padrões abertos, a criação de empresas sociais e de cooperativas, além das próprias redes sociais etc., são alternativas colaborativas para um sem-número de atividades através das quais o Homem já apreendeu que, quando se pensa simultaneamente no bem pessoal e no bem comum, as soluções produzidas são evolutivamente imbatíveis. Estive recentemente no evento de lançamento do Samsung Galaxy Note 10.1 no Brasil, trazido ao mercado nacional com pompa e circunstância. Durante toda a apresentação do produto, não conseguia me furtar de imaginar que toda a tecnologia que equipava aquela “maquininha” advinha de décadas de esforço colaborativo hercúleo, na grande maioria das vezes voluntário, o mesmo acontecendo do lado da infraestrutura responsável pelo fornecimento dos dados necessários ao funcionamento satisfatório de seus aplicativos. Enquanto produto de massa, pouco importa ao consumidor final o arcabouço tecnológico que faz essa solução primordial de computação pervasiva funcionar, mas o fato é que, sem os avanços oriundos do desenvolvimento colaborativo, é muitíssimo provável que a criação desse tipo de dispositivo demandasse muito mais tempo para acontecer. O mesmo vale para praticamente todas as iniciativas de tecnologia de consumo existentes no mercado atual: elas assentam sobre atividades colaborativas, que têm o poder de democratizar o acesso à informação e de efetivar a inclusão digital nas sociedades. Essas iniciativas barateiam processos de produção, transformam a informação em bem coletivo, pavimentam o caminho para o DIY – Do It Yourself (do inglês, “Faça você mesmo”), o que resulta em uma civilização mais empreendedora, produzindo cultura e conhecimento, e realimentando um círculo virtuoso capaz de reduzir desigualdades e de criar oportunidades a todos. Isso é o futuro, hoje, a frente do seu tempo, e os sistemas políticos e econômicos deverão, pouco a pouco, assimilar esses princípios, de modo a permitir que o Homem se ocupe tão somente da sua evolução intelectual e moral, razão precípua para a qual vivemos, no final das contas. ■ Rafael Peregrino da Silva Diretor de Redação www.linuxmagazine.com.br
ÍNDICE
CAPA Sempre alerta!
33
Rápidos 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 segurança.
Rede de segurança
34
Não 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 não está somente em seu funcionamento em tempo real. Ao salvar um histórico de atividades de rede em um arquivo pcap usando uma ferramenta como a tcdump, podemos filtrar os dados com o Wireshark para localizar evidências de invasão.
Análise de vulnerabilidades
44
Nesse artigo, demonstramos um ataque bem-sucedido a um servidor via IPv6 e explicamos como as principais ferramentas de segurança lidam com o protocolo.
8
www.linuxmagazine.com.br
Linux Magazine 95 | ÍNDICE
SEGURANÇA
COLUNAS Klaus Knopper
12
Charly Kühnast
14
Augusto Campos
16
Alexandre Borges
18
Kurt Seifried
20
Zack Brown
22
Segurança da informação
57
Pioneiro em detectar vulnerabilidades em sistemas antivírus, vice-presidente da Sourcefire detalha solução de segurança ideal e comenta sobre o cenário brasileiro, inovador em malwares. Olhar penetrante
60
NOTÍCIAS Geral
24
➧ HTML5 deve estar completo até 2014 ➧ A versão 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 câmeras.
➧ SUSE Manager 1.7 suporta PostgreSQL e IPv6 ➧ Xen 4.2 traz nova coleção de ferramentas
TUTORIAL
CORPORATE
Críptico Notícias
66
26
➧ Red Hat com maior faturamento e menor lucro ➧ Rackspace entrega OpenStack para fundação independente ➧ Foxconn investirá R$1 bilhão no Estado de São Paulo Coluna: Jon “maddog” Hall
28
Coluna: Cezar Taurion
30
Coluna: Alexandre Santos
32
ANDROID Toque perfeito
50
A criptografia é uma parte importante da segurança em TI, e o OpenSSL é uma conhecida ferramenta de criptografia para o Linux. Especialistas confiam no OpenSSL porque é livre, possui muitos recursos e é fácil de usar em scripts Bash. Computação pioneira
70
A súbita popularidade de computadores miniboard como o Raspberry Pi trouxe de volta o espírito pioneiro dos primeiros dias do Linux. Repentinamente, o “faça você mesmo” na comunidade de código aberto está de volta.
PROGRAMAÇÃO Centro do alvo?
72
Com a versão 2.0 do Android, os desenvolvedores passaram a ter acesso a recursos multitoque anteriormente reservados a aplicativos do sistema. Mas atenção: é preciso ter cuidado ao manusear a API.
REDES Squid no meio
54 A linguagem de programação Dart é a atual alternativa do Google ao JavaScript. Executada principalmente em navegadores, também pode ser utilizada em linha de comando e em servidores como substituta para o PHP.
SERVIÇOS Como monitorar a rede quando os sistemas-clientes se conectam a servidores seguros através do protocolo HTTPS? Mantenha o monitoramento em dia com o servidor proxy Squid.
Linux Magazine #95 | Outubro de 2012
Editorial
06
Emails
10
Linux.local
78
Preview
82
9
Coluna do Alexandre Santos
CORPORATE
Inteligência coletiva Conhecimento na era digital existe para ser compartilhado. E o volume de dados armazenados na rede tende a crescer assustadoramente. Cabe a nós, usuários, saber filtrar aquilo que realmente nos interessa.
V
ivemos hoje um consenso de que a tecnologia da informação pode expandir nossa capacidade de comunicação, colaboração, compartilhamento de conhecimento e, por extensão, a nossa capacidade de descoberta e inovação. Até a chegada da era digital, a maioria das pessoas aceitou um sistema padrão de conhecimento. Os alunos estudavam temas, ganhavam credenciais para provar sua proficiência e tornavam-se especialistas. Parte destes especialistas conduziam pesquisas e transmitiam conhecimento escrevendo livros e artigos para compartilhar suas descobertas e conclusões com o meio acadêmico e profissional. Outros, ao aplicar o conhecimento na prática, comprovavam a teoria ou a derrubavam. Conforme essas novas descobertas iam ganhando aceitação, juntavam-se ao corpo de conhecimento estabelecido onde forneciam a base de conhecimento para o próximo nível de aprendizagem num ciclo seguro e lento. Mas, desde 1961, quando o MIT demonstrou o primeiro sistema mundial de compartilhamento [1], o embrião das mídias digitais passou a impulsionar o desenvolvimento e a adoção de tecnologias colaborativas cada vez mais sofisticadas. Hoje usamos email, mídias sociais, mensagens instantâneas, fazemos conferências pela Internet e compartilhamos espaços de trabalho através de serviços online. A abundância de informações na rede tornou ainda mais difícil discernir o que é verdadeiro daquilo que é falso. O co-fundador da Wired, Kevin Kelly, recentemente escreveu que os seres humanos publicaram pelo menos 32 milhões de livros, 750 milhões de artigos e ensaios, 25 milhões de músicas, 500 milhões de imagens, 500 mil filmes, 3 milhões de vídeos, programas de TV e curtas-metragens, além
32
de 100 bilhões de páginas públicas na Internet, e a maior parte desta explosão 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 avança a um ritmo sem precedentes, alavancado por esta “Inteligência Darwiniana Coletiva” que surge dessa gororoba digital. Pessoas comuns oferecem abordagens e soluções inovadoras para problemas que antes só uns poucos privilegiados tinham acesso. Agora e cada vez mais, “a pessoa mais inteligente da sala é a sala em si”. Uma rede digital que une pessoas e ideias na sala e se conecta aos que estão fora dela. Por mais que reclamemos do excesso de lixo digital, prefiro parafrasear o teórico organizacional Russell Ackoff que, em 1988, já dizia: “não é o excesso de informação; é falha nos nossos filtros”. Que venha a Web Semântica [3] para nos salvar. ■
Mais informações: [1] Compatible Time-Sharing System: http://en.wikipedia.org/wiki/ Compatible_Time-Sharing_System [2] What the Internet Is Doing to Our Brains, by Nicholas Carr: http://www.theshallowsbook.com/ nicholascarr/Nicholas_Carrs_The_Shallows.html [3] W3C Web Semântica: http:// www.w3.org/2001/sw/
Alexandre Santos (alexos@br.ibm.com) é gerente de estratégia e marketing de System z da IBM Brasil.
www.linuxmagazine.com.br
Prevenção contra invasão
CAPA
Sempre alerta! Rápidos 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 segurança. por Flávia Jobstraibizer
A
segurança de redes e sistemas e seu contínuo monitoramento é um assunto vasto e por vezes complicado no mundo da tecnologia da informação. No entanto, existe no arsenal do profissional de TI, diversas ferramentas úteis para o monitoramento, busca e prevenção de potenciais ataques ou problemas relacionados a segurança. Entre tantas tarefas que um administrador de sistemas precisa desempenhar durante sua jornada de trabalho, a segurança da rede e dos sistemas sob sua responsabilidade acaba sendo relegada para segundo plano. Isso se deve ao fato de que os profissionais delegam a tarefa do monitoramento para determinadas ferramentas que, embora eficientes, precisam de uma mãozinha para realizar seu trabalho com excelência. Nesta edição da Linux Magazine vamos falar sobre o preocupante assunto da invasão de redes e sistemas. Os invasores modernos são muito mais efetivos do que antigamente. São rápidos, silenciosos e depois de atingirem seu objetivo – seja roubar informações, seja danificar um sistema – vão embora sem deixar rastros, na maioria das vezes. E o problema mesmo, acaba ficando na mão do profissional que agora terá uma grande dor de cabeça para resolver. Um dos mais eficientes monitores de rede, o Wireshark, será abordado nesta edição, em conjunto com algumas ferramentas menos conhecidas e que fazem parte da solução. Aprenda como ler e interpretar informações em busca de potenciais evidências de invasão. O profissional que estiver engajado em encontrar vulnerabilidades que potencialmente podem ser utilizadas por invasores, deve conhecer a ferramenta OpenVAS. Indispensável no arsenal do analista de segurança, o OpenVAS é uma solução completa para busca de vulnerabilidades em locais específicos como softwares, portas do servidor e serviços locais como os protocolos de email e web. Realizamos também, uma variedade de testes de invasão em redes que já estão funcionando sob o novo protocolo IP, o IPv6. Descubra quais são as vulnerabilidades que o
Linux Magazine #XX | Mês de 200X
novo protocolo IP esconde e prepare-se para, juntamente com a adoção do protocolo, manter sua rede segura! A nova geração da tecnologia traz diversos benefícios como o IPv6, o HTML5, BIG DATA, HPC, novos sistemas de arquivos, novos kernels e toda uma sorte de ferramentas de segurança para manter os invasores longe dos seus dados. No entanto, nem toda essa avançada tecnologia fará com que você durma tranquilo. É preciso estar sempre alerta! ■
Matérias de capa Rede de segurança
34
Agulha no palheiro
40
Análise de vulnerabilidades
44
33 3
ANDROID | Multitoque
Android multitoque
ANDROID
Toque perfeito Com a versão 2.0 do Android, os desenvolvedores passaram a ter acesso a recursos multitoque anteriormente reservados a aplicativos do sistema. Mas atenção: é preciso ter cuidado ao manusear a API. por Markus Junginger
O
sucesso do iPhone demonstra que os controles multitoque oferecem muitos benefícios práticos. Não é de se admirar que concorrentes do iPhone trabalhem duro no desenvolvimento de suas próprias tecnologias multitoque. O Google estendeu a versão 2.0 do Android API para que desenvolvedores e usuários pudessem se beneficiar de recursos que envolvem toques e gestos.
Uma infinidade de touchpads Ao contrário do iOS, o Android precisa lidar com uma variedade de combinações de hardware e software. Primeiro, é preciso trabalhar com uma API que suporte múltiplas 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 nível 5 (Android 2.0 ou mais recente). O hardware também influencia no nível de suporte multitoque, e a verdadeira extensão 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 não é 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, não são capazes de identificar toques individuais. A figura 1 ilustra estas restrições de hardware: o desenho mostra dois dedos posicionados de forma distinta em uma caixa delimitadora. Se os dedos do usuário se moverem de uma posição a outra, o dispositivo frequentemente confunde as posi-
ções dos dedos e só identificará a caixa com segurança. Muitos aparelhos HTC, como o Desire, usam esta tecnologia. O primeiro smartphone com Android 2.0, o Motorola Droid, detectava as posições dos dois dedos individualmente. O Galaxy S é capaz de identificar e processar até quatro toques simultâneos. Os desenvolvedores não devem assumir que a tecnologia multitoque estará disponível onde quer que Android esteja presente. Para aplicativos que dependem de múltiplas entradas por toque para recursos críticos, o desenvolvedor deve adicionar uma nota ao manifesto para garantir que somente os dispositivos multitoque sejam capazes de instalar o 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 extensão 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 começar, aceite objetos MotionEvent. Um desenvolvedor normalmente instala um recurso listener para uma visualização usando setOnTouchListener() ou substitui as classes Activity ou View em onTouchEvent(). A listagem 1 mostra um esqueleto para o onTouchListener. Como é possível notar na listagem 1, o desenvolvedor acessa todos os dados relevantes, tais como a ação realizada ou coordenadas x e y, através dos métodos de acesso a objetos MotionEvent. Na sequência de um evento ACTION_DOWN, desencadeado pelo Android quando o usuário toca na tela pela primeira vez, o sistema operacional envia eventos ACTION_MOVE para movimentação de dedos. Os eventos continuam até que o usuário pare de tocar na tela. O Android então informa ao aplicativo que o dedo deixou a tela, e envia um ACTION_UP. Como indica o método
de assinatura onTouch(), é possível registrar um OnTouchListener com múltiplas visualizações. Na base desta curta atualização MotionEvent, o desenvolvedor poderá criar extensões de múltiplas entradas por toque. Se atualizarmos um aplicativo Android existente, não há necessidade de modificar a estrutura do aplicativo pois os dados das entradas multitoque utilizam o mesmo caminho. Isto fornece um significado adicional ao código do método getAction(): o número 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 código premultitoque. A variável pointerIndex contém 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 responsável pelo evento.
Liberdade para os dedos Se precisar manter cada dedo na tela por um período de tempo, será necessário utilizar indicadores de ID. O getPointerId(), que pressupõe o indicador de index como parâmetro, cuida desta tarefa. O exemplo a seguir demonstra o uso de IDs: o indicador e o dedo médio tocam na tela, um após o outro. Se o usuário manter um dedo da tela, o programa não consegue 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 médio é atribuído o próximo 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 utilização de indicadores múltiplos introduz dois novos códi-
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 vínculo para as posições dos dedos é a mesma para ambas as variantes, o que significa que o dispositivo não pode identificar precisamente as posições.
gos de ação: ACTION_POINTER_DOWN e ACTION_POINTER_UP correspondem a ACTION_DOWN e ACTION_UP; a diferença é que o Android não os utiliza até que um segundo dedo toque na tela. O exemplo demonstra a sequência de ações. Primeiro o dedo 1 toca a tela, desencadeando assim uma ACTION_DOWN. Quando o dedo 2 toca a tela, é disparado um evento ACTION_POINTER_DOWN. Se os dedos se moverem em seguida, o Android registrará um ACTION_MOVE. Se o dedo 1 então se erguer para fora da tela, o código fornecerá um ACTION_POINTER_ UP, considerando que este se trata de um evento ACTION_UP para o dedo 2.
O aplicativo Multitouch Test, disposto na figura 2, resume os principais aspectos relacionados às múltiplas entradas por toque no Android. O aplicativo, disponível no Google Play, serve para visualizar os eventos multitoque e é útil como ponto de partida para experimentação de extensões próprias.
Teste de múltiplos toques O recurso oferecido pelo aplicativo de teste é limitado: ajuda a visualizar cada indicador a partir de um círculo, que assume diferentes cores dependen-
Quadro 1: Indicadores Nos círculos multitoque do Android, um indicador é representado por um dedo que interage com a tela. Em outras palavras, um indicador pode ser alguma outra fonte de entrada, como um cursor do mouse. Os desenvolvedores enumeram indicadores usando o getPointerCount(). Ao invés de métodos de acesso sem parâmetros do MotionEvent, temos agora métodos sobrecarregados, cada um com o indicador de índice, como o getX(int pointerIndex). Dependendo do aplicativo, o desenvolvedor pode não precisar de mais nada além de informações para projetar um aplicativo que suporte múltiplas entradas por toque.
Quadro 2: Máscaras e deslocamentos O Google adicionou recursos que facilitam a estimativa do código de chamada de ação e indicadores de índice. Os desenvolvedores não precisam mais de bitmasks e deslocamentos de bits. Em vez disso, o getActionMasked() e o getActionIndex() retornam os valores exigidos pelo MotionEvent. Incidentalmente, o Android 2.2 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, são agora mais corretamente entitulados de ACTION_POINTER_INDEX_MASK e ACTION_POINTER_INDEX_SHIFT.
52
do do código utilizado para chamar a ação. O círculo fica azul quando o usuário toca a tela, verde quando o usuário move um dedo, ou cinza quando acionado o código para um dedo sendo levantado fora da tela. O aplicativo mostra também nos círculos o ID do indicador e o último código utilizado para chamar a ação. É preciso implementar o código do aplicativo no contexto de uma atividade. A listagem 2 mostra a implementação do OnTouchListener, que vincula-se à exibição usando o setOnTouchListener(), conforme ilustrado na listagem 3. Para economizar espaço, deixamos de fora as definições de membros, tais como as arrays points[] e lastActions[]. O código-fonte completo está disponível online [2]. As primeiras linhas da listagem 2 resumem o código da ação e o índice do indicador. Após este passo, o código da ação e da posição do indicador estão descritos para as arrays lastActions[] ou points[]. O índice de ambas as arrays corresponde à identificação do indicador, em cada caso. O número de indicadores é limitado pelas constantes MAX_POINTERS: o aplicativo gerencia um número máximo de 20 indicadores. Um caso especial ocorre quando são definidos os códigos para uma determinada ação. O MotionEvent para o ACTION_POINTER_DOWN retorna múltiplos valores, desde que o ACTION_POINTER_DOWN refira-se apenas a um único indicador ID. O único caso em que é possível usar os valores lastActions() para todos os indicadores no MotionEvent é o ACTION_MOVE. Por fim, o touchView.invalidate() na linha 20 dispara uma atualização de status e mostra os novos valores. A visualização neste aplicativo é uma classe separada, diretamente derivada da View, como mostra a listagem 3. O objeto Canvas fornece um método simples de desenhar círculos em um loop. Os códigos para
www.linuxmagazine.com.br
Multitoque | ANDROID
coordenadas e chamadas de ação necessários para desenhar círculos são coletados pelo onTouchListener da listagem 2 nas arrays points[] e lastActions[]. A cor e o texto de um círculo são definidos pelos métodos getColor() e getActionText(). A múltipla escolha determina o valor de retorno, que depende do código da última ação atribuída ao indicador. Finalmente, o aplicativo também desenha o número de indicadores contidos no MotionEvent em formato texto. O método calcDevicePixels() é auxiliar e verifica o número específico de pixels do dispositivo, que por sua vez depende da profundidade de pixels dispostos na tela.
multiplicar a propriedade ScaleFactor pelo ScaleGestureDetector. Com os métodos getFocusX() e getFocusY() é possível verificar o foco do dimensionamento.
Conclusão Hardware e software em dispositivos Android possuem uma enorme influência no suporte multitoque. Telas que suportam múltiplas entradas
por toque dependem do Android 2.0 ou mais recente e muitas vezes apresentam capacidades limitadas – um fato que os desenvolvedores precisam ter em mente na construção de seus aplicativos. A API multitoque, com suas MotionEvents e diversos indicadores, asseguram um lugar no pódio para o Android no que se refere a dispositivos dotados deste recurso. ■
Pinch e zoom Possivelmente, a novidade mais interessante é o ScaleGestureDetector, que detecta e amplia gestos. Três etapas são necessárias para utilizá-lo: primeiro, é preciso instanciar um ScaleGestureDetector; em seguida, passar cada MotionEvent para o ScaleGesture-Detector; por último, é necessário um listener especial para coletar os novos dados. A listagem 4 mostra estas três etapas nos métodos init() e onTouchEvent(), e na classe MyScaleListener. O método onScale() escalona a visualização ao
Mais informações [1] API multitoque para Android: http://developer.android. com/reference/android/ view/MotionEvent.html [2] Código-fonte para este artigo: http://smart-developer.com/ Resources/Article-Code
Gostou do artigo? o? Queremos ouvir sua a opinião. 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
SSEGURANÇA | Monitoramento com NAS
SEGURANÇA
Monitoramento com NAS
Olhar penetrante Tire proveito do baixo consumo de energia oferecido por dispositivos NAS modernos para monitorar suas câmeras. por Ben Martin
O
moderno hardware NAS possui a CPU embutida que muitas vezes oferece grande desempenho com baixo consumo de energia. Muitas destas unidades necessitam de menos de 10 watts para operar com uma conexão de rede gigabit e a CPU a 100% de uso. Um NAS com baixo consumo de energia pode consumir de 10% a 20% da eletricidade que um hardware desktop precisa para funcionar. A principal questão passa a ser então: seria a CPU do NAS “rápida o suficiente” para monitorar e detectar o movimento de uma ou mais câmeras? Neste artigo, examinaremos se o QNAP TS-219P II [1], com uma CPU ARM Marvell de 2 GHz e 512MB de RAM, está pronto para o desafio de detecção de movimento em tempo real (figura 1). Note que grande parte do artigo também deve ser diretamente aplicável ao seu primo mais barato
de carcaça única, o QNAP TS-119p II, que ostenta a mesma CPU/RAM. Uma solução popular para monitoramento com câmera e detecção de movimento é a suite ZoneMinder [2]. As câmeras podem ser tanto de rede IP como câmeras USB conectadas diretamente ao servidor ou em outra máquina na rede. O ZoneMinder pode monitorar todas as suas câmeras, detectar movimento em áreas-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 alguém caminha até sua garagem sem que o vento nas árvores acione um alarme falso. Duas empresas que fazem hardware NAS usando CPU ARM de alto nível são a Synology e a QNAP. Produtos de baixa capacidade com CPUs de 1.2GHz e 256MB de RAM também estão disponíveis, assim como modelos
Listagem 1: Instalação 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 estão o Synology DS212j e o QNAP TS-212; no intervalo dos 2 GHz estão o Synology DS212+ e o QNAP TS-219P II, juntamente com o de carcaça única QNAP TS-119p II. Tanto o produto da QNAP quanto o da Synology vem com sua própria distribuição Linux. Ambas as unidades NAS permitem usar o gerenciador de pacotes ipkg para instalar aplicativos de código aberto adicionais e complementar o software embarcado. Por exemplo, o leitor pode instalar o padrão CoreUtils ao invés dos binários-padrão BusyBox.
Instalação Se o usuário não possuir um dispositivo NAS instalado, a configuração inicial para este aparelho exige que seja feita a remoção de uma (ou mais) bandejas individuais de disco rígido, um parafuso do disco da bandeja, e o deslizamento de volta para a unidade. Uma vez que os cabos de energia e rede estiverem conectados, teremos completado a configuração de hardware. Por outro lado, o Synology DS212j desliza em duas partes separadas, e fixamos o disco rígido diretamente em um gabinete de disco rígido interno antes de fazermos o mesmo com a capa exterior do Synology NAS. Quando ligamos o TS-219P II, o dispositivo tentará obter um endereço
www.linuxmagazine.com.br
Monitoramento com NAS | SEGURANÇA
IP via DHCP, após o qual podemos efetuar login em uma interface online do dispositivo NAS e concluir a instalação. A configuração inicial do TS-219P II envolve o upload de um arquivo de imagem “firmware” de 140 MB (figura 2). Após o NAS reinicializar e cair na distribuição Linux que acabamos de carregar, é preciso responder algumas perguntas sobre localidade, senhas e preferências do aplicativo (figura 3). Para muitos fins, a combinação de pacotes nativos do fornecedor NAS complementada com pacotes disponíveis através do ipkg é suficiente. Se o aplicativo que o usuário necessita não está incluso no ipkg, é possível compilá-lo e instalá-lo. Este processo geralmente envolve a criação de um ambiente em máquina virtual para a CPU ARM em uma máquina desktop, bem como a compilação do software. Normalmente, os cabeçalhos de desenvolvimento de software no NAS não estão disponíveis facilmente sob a forma de pacotes para instalação no próprio equipamento.
Como instalar o Debian no ARM Para uma personalização mais avançada, temos a opção de instalar o Debian ao invés de utilizar o firmware de fábrica. Instalar o Debian permite acessar o ZoneMinder através do gerenciador de pacotes e compilar o software mais facilmente na máquina NAS. A instalação do Debian em uma máquina ARM personalizada [3] pode parecer assustadora pela primeira vez. Histórias de pessoas com instalação pela metade que viram apenas “tijolos caros” são folclore comum; para tornar as coisas mais intrigantes, não temos qualquer tela ligada ao dispositivo que permita descobrir o que deu errado. Além disso, teremos que configurar o suporte de opções personalizadas para o hardware fornecido, como alto-falantes, LEDs e fans. Dito isto, o processo de instalação do Debian é bastante simples e
Linux Magazine #95 | Outubro de 2012
Figura 1 Equipamentos: QNAP TS-219P II NAS, uma câmera TP-Link TL-SC3171G, e um disco de 2TB WD Green.
provavelmente mais até que a configuração do ambiente de compilação necessário para ampliar o número de softwares se continuarmos a usar o firmware fornecido [4]. Para prosseguir, siga os seguintes passos: 1. Opcionalmente, faça uma cópia de segurança do firmware do cartão de memória no NAS. 2. Baixe o Debian flasher, kernel, metadados, e arquivos de instalação initrd. 3. Instale os arquivos na memória flash do NAS. 4. Reinicie. 5. Conecte-se via SSH no NAS e conclua o processo com a interface
de instalação do Debian, que é baseada em console. Uma vez que o passo 5 tenha sido concluído, o programa irá reinstalar a memória do NAS para iniciar em um novo sistema Debian. Além do kernel e o initrd residente na memória flash do NAS, as etapas restantes para instalar o Debian são exatamente as mesmas que existem em uma máquina desktop. Como veremos mais adiante, o primeiro passo para fazer uma cópia de segurança do firmware existente é opcional. O instalador Debian convenientemente pega as configurações de hosts e de rede que havíamos feito
Figura 2 Enviando a imagem mais recente do firmware do site da QNAP.
61
SSEGURANÇA | Monitoramento com NAS
reinicialização, devemos ser capazes de fazer um ssh como root e encontrar uma ótima máquina Debian nos aguardando. Com um disco WD Green de 2TB 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, localização, IP, e serviços de informação.
com o firmware QNAP normal e as reutiliza para a instalação do Debian. A maioria das perguntas são sobre localização e como desejamos que discos e partições sejam configurados. Em nossa instalação do Debian “Wheezy” (listagem 1), os primeiros cinco comandos criam uma cópia de segurança da memória flash existente em um pendrive. Na linha 6, os quatro arquivos de instalação do Debian mencionados no passo 2 são baixados, enquanto um comando flash-debian na linha 8 nos coloca na memória flash do QNAP, pronto para ser carregado quando o NAS for reiniciado. Após o NAS ser reiniciado, devemos ser capazes de fazer ssh nele como installer@NAS usando a senha install. Provavelmente teremos que remover a chave do host do arquivo ~/.ssh/known_hosts para o SSH não considere que o host mudou sua chave de forma inespera-
da desde a última conexão. Em seguida, o usuário deverá ver um menu de boas-vindas como o da figura 4. Perto do final da instalação, teremos a chance de alterar a seleção de aplicativos. É muito importante que o usuário não se esqueça de instalar a opção de servidor SSH, para que possa conectar-se facilmente no NAS quando o Debian instalado for executado. Além 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 não ser realmente necessário para o ZoneMinder, se o usuário possuir algum espaço sobrando no seu disco rígido, pode desejar acessá-lo através da rede para outros fins. Quando a instalação estiver concluída, o instalador pede que sejam removidos todos os discos CD-ROM ou de instalação (que não temos). Na
Figura 4 Iniciando a instalação do Debian via SSH.
62
Uma desvantagem de usar firmware personalizado em um hardware especializado é descobrir o que fazer quando as coisas dão errado. Tínhamos um drive Green de 2TB sobrando e, enquanto este artigo estava sendo escrito, descobrimos por que ele não estava em uso ativo. Depois que substituímos o kernel na memória flash do NAS com o kernel e a imagem initrd do Debian, o sistema queria encontrar uma instalação Debian para inicializar a partir do disco rígido. O problema era que o disco não queria mais funcionar e, para os objetivos desta análise, não tínhamos nos dado ao trabalho de criar um RAID espelhado agradável para o caso de uma simples falha de disco. Esta situação parece ser um cenário do pior caso: um disco rígido danificado; o firmware na memória flash sobrescrito com software que espera que o disco esteja por ali; sem inicialização; sem visor. Felizmente, mesmo quando sobrescrevemos a memória flash do equipamento QNAP, podemos colocá-lo em um modo que tentará recuperar a partir da rede a informação que deve estar na memória flash [5]. Melhor ainda, o QNAP oferece uma imagem de boot do Linux que contém um servidor TFTP para transmitir a imagem flash para o NAS. Ao ligar o laptop diretamente no NAS, iniciar a partir do disco de recuperação no laptop e segurar o botão reset enquanto liga o NAS, o usuário poderá ativar esse modo de recuperação. Uma vez que o NAS ligar, serão ouvidos bipes e diferentes cores LEDs piscarão para que esteja ciente de que algo está acontecendo; no final, terá o NAS com o mesmo
www.linuxmagazine.com.br
Monitoramento com NAS | SEGURANÇA
software no firmware de quando o comprou, poupando-o de um NAS personalizado que não iria inicializar. Em seguida, podemos colocar o instalador do Debian de volta na memória flash do NAS e escolher com mais sabedoria na pilha de discos rígidos disponíveis. É claro que, em produção, todo mundo usa um RAID espelhado ou tem um sólido, automatizado e testado sistema de backup incremental em funcionamento, não é mesmo?
ZoneMinder As principais dependências do ZoneMinder são Perl, MySQL, OpenSSL, a biblioteca JPEG, alguns módulos Perl, e (opcionalmente) FFmpeg. O ZoneMinder inclui código PHP, C++ e Perl. Depois de instalar o Debian no sistema, podemos tirar proveito dos repositórios de pacotes para instalar o ZoneMinder sem ter que compilá-lo. A instalação é simples como chamar um: apt-get install zoneminder
resultando em cerca de 170 MB de espaço adicional usado no NAS. Para iniciar a interface online do ZoneMinder, temos que criar um link do arquivo de configuração do site no diretório conf.d do Apache: # ln -s /etc/zm/apache.conf /etc/ apache2/conf.d/zoneminder.conf # /etc/init.d/apache2 restart
Com este link no lugar e o Apache reiniciado, devemos ver a interface online do ZoneMinder em http://NAS/zm/, supondo que NAS é o endereço IP da unidade NAS. O botão Add New Monitor na parte inferior da interface do ZoneMinder permite que adicionemos uma nova câmera no sistema (figura 5). Para este exemplo, usaremos duas câmeras: a TP-Link TLSC3171G 640x480 IP e a Logitech C910 USB 1080p. A parte complicada na configuração de câmeras é saber o que o caminho do host remoto (Remote Host Path) deve ser e ter a certeza de que a re-
Linux Magazine #95 | Outubro de 2012
solução da imagem, largura e altura em pixels coincide com a saída da câmera (figura 6). Além disso, precisamos saber o endereço IP e a porta da câmera e, via HTTP, pode ser necessário entrar com o URL para começar a usar os dados da câmera. Para uma câmera de 640x480, espere utilizar cerca de 10% da CPU somente do ZoneMinder para transmitir dados a uma baixa taxa de quadros [6]. Adicionar zonas para detectar movimento em áreas críticas da imagem irá adicionar mais uso de CPU neste valor. Nossa configuração NAS teve que usar até 25% da CPU para atender ao streaming de vídeo a partir de uma webcam com 640x480 para o Firefox (figura 7). Com a câmera TP-Link apontada para uma cena escura ao ar livre à noite, a detecção de movimento manteve-se em cerca de 15% da CPU para quadro cheio (full frame – 640x480) de detecção em uma taxa de quadros baixa (tabela 2).
Memória compartilhada O ZoneMinder precisa manter as imagens recentes que recebe das câmeras em algum lugar na memória. Nas versões anteriores, o ZoneMinder usava memória compartilhada para armazená-las. Agora, ele cria e usa arquivos de memória mapeados em /dev/shm. Independentemente de qual sistema esteja em uso, pode ser necessário adequar o NAS para fazer o armazenamento correto de memória disponível para estas imagens. O ZoneMinder 1.25.0 do Debian Wheezy utilizado neste artigo usa o dospositivo /dev/shm para as imagens. A instalação padrão criou um sistema de arquivos tmpfs com um tamanho limite de 100MB. O ZoneMinder precisa de cerca de 100MB para uma única câmera de 1280x720, e cerca de 35MB para uma única câmera de
Figura 5 Inclusão de uma nova câmera no ZoneMinder.
640x480. Para calcular a quantidade de memória necessária para o armazenamento de imagens da câmera, encontre a memória (bytes) para um único quadro: largura(px) x altura(px) x 3(RGB). Estas imagens são armazenadas numa área de buffer na memória. O padrão que utilizamos foi de 40 imagens no buffer para uma câmera. O comando: mount -o remount,size=256m /dev/shm
vai dedicar mais memória para imagens do ZoneMinder. Para fazer isso funcionar após uma reinicialização, edite o arquivo /etc/default/tmpfs e defina shm_size para o tamanho que desejar. Para economizar memória para câmeras maiores, ajuste o tamanho de buffer para quadros de imagem mostrado na guia Buffers das confi-
Figura 6 Configuração de uma câmera de rede no ZoneMinder.
63
SSEGURANÇA | Monitoramento com NAS
gurações da câmera. Descobrimos que para usar menos quadros tivemos que excluir, por exemplo, zm.mmap.2 de /dev/shm e fazer o ZoneMinder recriar um novo arquivo menor quando aceitamos a configuração da câmera. Usar 20 quadros para uma câmera de 720p requer apenas 53MB de RAM.
Como detectar eventos O que faz o ZoneMinder interessante é a sua capacidade de detectar movimento em áreas críticas de um quadro da câmera e gravar o vídeo automaticamente quando o movimento ocorre. Depois de colocar a câmera no modo de detecção de movimento clicando no link Função da câmera na página inicial de instalação do ZoneMinder, podemos mascarar partes do quadro de vídeo clicando no link Zonas da câmera. Desta forma, o ZoneMinder ignora movimento fora da sua área de interesse. Muitos fatores determinam a quantidade de CPU que é necessária para a detecção de movimentos: o tamanho da imagem da câmera, imagens em cores ou imagens em escala de cinza, o número de quadros por segundo de um processo, a dimensão das zonas de detecção, e os parâmetros utilizados no algoritmo de detecção.
Quando clicamos no nome de uma câmera no ZoneMinder, é mostrada uma visualização ao vivo do que a câmera está captando, junto com uma lista dos eventos que foram detectados recentemente e a capacidade de forçar o disparo de um alarme. O disparo de um alarme tem o mesmo efeito que forçar o ZoneMinder a pensar que um movimento significativo ocorreu na câmera. Em nosso primeiro teste, usamos uma câmera TPLink com 640x480 a 5fps. O monitoramento usou 15% da CPU, e forçar um estado de alarme causou um salto de até 26% da CPU. Após a confirmação de um alarme disparado pelo ZoneMinder indicando movimento real na câmera, foi confirmado o mesmo salto para 26% de uso de CPU no NAS. Monitoramento com uma C910 Logitech através da rede com resolução de 1280x720 a 10fps consumiu 72% de CPU do NAS. Baixando para 2fps com a mesma câmera usou até 22% da CPU. A visualização ao vivo a 2fps consumiu um adicional de 40% de CPU. Claramente, câmeras de monitoramento de 720p a 30fps estão além do que a CPU no NAS pode segurar, e detecção de movimento a 10fps provavelmente não é possível, mas se voltarmos alguns quadros por segundo com a mesma câmera, pode ser bom a 720p se o usuário desejar utilizar apenas uma câmera.
Watts
Ação
1
NAS desligado, mas com cabo plugado
7
Disco com giro baixo e nenhum cabo de rede
8
Disco com giro baixo
10
Em execução com o disco girando
13
Discos girando e executando o OpenSSL
Tabela 1 Uso de energia com o firmware de fábrica. % CPU RAM (MB) Tarefa (Processo) 6-12
43
Monitorar apenas à noite (zmc)
15-25
41
Visualizar no Firefox (nph-zms)
15
42
Detecção de movimento, quadro completo, à noite (zma)
Tabela 2 Uso de CPU e RAM da TP-Link (5fps).
64
Uma câmera USB ultrabarata com 640x480 que só pode produzir vídeo YUYV conectada à porta USB2 do NAS sendo usada a 5fps precisa de cerca de 15% da CPU para monitorar e 50% para transmitir. A detecção de movimento em quadro cheio nesta câmara requer um adicional de 40% de CPU, que tem picos de até 80% se um estado de alarme é disparado. O uso da CPU não mudou muito entre as predefinições rápida e melhor com baixa, média e altas sensibilidades. Reduzir para uma área de alarme de 100x100 diminuiu o uso da CPU a 35%. Mudar a câmera ligada localmente para a C910 da Logitech e tentar a resolução de 1280x720 a 5fps dividiu o uso de CPU 50-50 entre monitorar a câmera e verificar movimentos nos quadros. Tal divisão de 50-50 parecia suspeita, já que a detecção de movimento deve ser mais custosa do que o simples monitoramento. Depois de voltar para 3fps, o monitoramento usou apenas 30% da CPU e a detecção de movimento usou 68%. Depois de voltar para 640x480 a 4 fps, o monitoramento consumiu 12% de CPU e a detecção de movimento, 28%. Logo, se o usuário quiser usar este processador, qualquer coisa acima de 640x480 é susceptível a causar problemas de desempenho.
Mergulho no código Pelo fato de não vermos muita diferença no uso de CPU para cada um dos algoritmos de detecção de movimento que o ZoneMinder oferece, decidimos dissecar um pouco o código. O código chama Monitor::DetectMotion() a cada quadro para trabalhar a pontuação (quantidade de movimento) e se um alarme foi acionado. Tendo esse método retornar “sem alarme” de imediato ao invés de detecção de movimento real resultou em cerca de 8% da CPU a ser utilizada para uma câmera de 640x480 executando a 6fps.
www.linuxmagazine.com.br
Monitoramento com NAS | SEGURANÇA
Uma das primeiras coisas que DetectMotion() faz é criar uma imagem delta, medindo o quanto o quadro atual difere de um quadro de referência. A imagem delta apenas registra a intensidade da diferença para cada pixel em vez da diferença de cada vermelho, verde e azul. Para fazer a imagem delta e excluí-la novamente antes de retornar nenhum alarme, 15% da CPU foi necessária – antes de qualquer detecção de movimento ter ocorrido. O núcleo do método Imagem::Delta() cria uma imagem delta e registra quanto cada pixel é diferente de uma imagem de referência: ... red = y_r_table[*psrc++ - *pref++]; green = y_g_table[*psrc++ - *pref++]; blue = y_b_table[*psrc++ - *pref++]; *pdiff++ = abs_tablered + green +; ...
As variáveis são pref, a imagem de referência; psrc, o quadro atual e pdiff, a imagem delta. Este código pode ser modificado e executado mais rapidamente em CPUs ARM com a extensão NEON [7]. De acor-
do com o comando /proc/cpuinfo, a CPU neste equipamento QNAP só tinha disponível as extensões swp half thumb fastmult edsp. Pelo fato de os valores de referência apresentados na tabela 2 variarem mais com a resolução de imagem e taxa de quadros, apenas preparar e produzir todos os quadros estava consumindo uma quantidade substancial da CPU.
Considerações finais Os chips ARM top de linha que equipam alguns hardwares NAS modernos fornecem uma plataforma para computação em tempo real bastante interessante, com consumo de energia reduzido. A CPU de 2GHz Kirkwood do NAS testada aqui poderia realmente apenas lidar com detecção de movimento em uma taxa de quadros baixa em duas câmeras IP com 640x480 ao mesmo tempo. Tenha em mente que o dispositivo pode fazer isso com menos de 15 watts, incluindo o disco rígido. Quando não há eventos acontecen-
do, o equipamento pode cair para menos de 10 watts enquanto ainda monitora ativamente as câmeras em busca de movimentos interessantes. Monitoramento de câmera é normalmente uma proposta de três turnos. A próxima vez que o leitor considerar realocar um PC com consumo de 75 watts a 100 watts para este propósito, 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 instalação Debian, o NAS tem acesso a uma quantidade enorme de pacotes de software que permitem a personalização do dispositivo para lidar com uma tarefa específica. ■
Mais informações [1] Página do QNAP 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] Documentação do instalador do Debian ARM: http://www. debian.org/releases/lenny/ arm/install.pdf.pt_BR [5] Recuperação de firmware do QNAP: http://wiki.qnap. com/wiki/Firmware_Recovery/ [6] Discussão sobre uso de CPU pelo ZoneMinder: http://www. zoneminder.com/wiki/index. php/FAQ#Why_is_ZoneMinder_ using_so_much_CPU.3F [7] Arquitetura ARM: http:// en.wikipedia.org/wiki/ ARM_architecture
Gostou do artigo? igo?
Figura 7 Monitoramento de uma peça de madeira com o ZoneMinder no NAS.
Linux Magazine #95 | Outubro de 2012
Queremos ouvir sua opinião. nião. 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
Críptico A criptografia é uma parte importante da segurança em TI, e o OpenSSL é uma conhecida ferramenta de criptografia para o Linux. Especialistas confiam no OpenSSL porque é livre, possui muitos recursos e é fácil de usar em scripts Bash. por Marcin Teodorczyk
O
OpenSSL [1] faz uso da entrada e saída padrões, e suporta uma ampla gama de parâmetros, tais como opções de linha de comando, variáveis de ambiente, pipes, arquivos e descritores de arquivos. Podemos aproveitar estes recursos para escrever rapidamente scripts Bash [2] que automatizam tarefas, tais como teste de conexões SSL/TLS, conversões massivas entre diferentes formatos de chaves criptográficas e certificados, assinatura/ criptografia em lote de arquivos, auditoria de arquivos protegidos por senha, e implementar ou testar uma infraestrutura de chaves públicas PKI (Public Key Infrastructure). As ferramentas do OpenSSL fornecem muitos módulos que executam tarefas específicas. Cada módulo não é um executável separado mas, ao invés disso, é selecionado com o primeiro parâmetro do executável openssl. Por outro lado, cada módulo tem uma página de manual separada. Por exemplo, um módulo chamado x509 gerencia certificados digitais X.509 e um módulo chamado pkcs12 gerencia pacotes PKCS12.
66
Para usar o x509, devemos executar o seguinte comando: openssl x509 -param1 param1value
mas, para ver sua página de manual, devemos digitar man x509.
Como testar conexões SSL/TLS O OpenSSL fornece três módulos que permitem testar as conexões SSL: s_client, s_server e s_time. Os dois primeiros, como os nomes sugerem, são para simular um cliente e um servidor em uma conexão SSL. O terceiro é para os testes de tempo de conexão. Vamos começar com uma análise detalhada no módulo s_client. O s_client é particularmente útil para verificar quais protocolos e cifras o servidor aceita utilizar. Esta informação é útil em auditorias de segurança e recursos. Por exemplo, podemos usar esta informação de protocolo para encontrar servidores que não aceitam um protocolo ou cifra legítimo, evitando assim que um cliente legítimo se conecte. Tam-
bém podemos localizar servidores que aceitam protocolos ou cifras fracos e poderiam assim permitir um ataque malicioso. Com uma pequena ajuda do Bash, é possível automatizar esse processo. Suponha que os nomes do cliente e do servidor são cliente e servidor, e que o servidor escuta conexões SSL/ TLS na porta 443. Para verificar quais protocolos o servidor aceita, podemos usar os seguintes parâmetros: -ssl2, -ssl3, -tls1, -no_ssl2, -no_ssl3, ou -no_tls1. Pelo fato de o SSL2 ser conhecido por ter falhas de segurança, podemos tentar nos conectar ao servidor 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 conexão e espera por dados é claro, esta abordagem não é a ideal se o usuário pretende inserir o comando em um script Bash). Para fechar a conexão imediatamente depois de estabelecê-la, escreva na entrada padrão do s_client:
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 parâmetro -cipher. Para comodidade do utilizador, o OpenSSL permite especificar conjuntos de cifras específicas (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 conexões usando cifras do grupo NULL ou LOW, use o seguinte: echo "x" | openssl s_client -connect $server:443 -cipher NULL,LOW
Em scripts Bash, é uma boa ideia executar módulos OpenSSL com um tempo limite especificado. Caso contrário, quando uma máquina não puder ser resolvida, o script ficará esperando por um longo tempo. Um utilitário Linux especial permite executar qualquer comando com um tempo limite. Surpreendentemente, o utilitário se chama timeout. Por exemplo, para verificar se uma conexão SSL2 pode ser estabelecida, mas não esperar por ela mais de 10 segundos, use: echo "x" | timeout 10 openssl s_client -connect server:443 -ssl2
Finalmente, para tornar o comando mais automático, podemos usar a variável $? para verificar o código de retorno do último comando executado pelo Bash. Se a conexão 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 padrão e verifica se uma conexão diferente de SSL3 ou TLS1 pode ser estabelecida com a porta 443. Ele espera não mais do que três segundos. Nomes de hosts
Linux Magazine #95 | Outubro de 2012
que permitem tais conexões são gravados no arquivo bad_protocol.txt. Da mesma forma, os hosts que permitem conexões com cifras NULL ou LOW são listados em bad_cipher.txt.
Como manipular formatos PEM/ DER e PKCS12 Alguns formatos e containers são usados para pares de chaves de criptografia públicas e certificados digitais. Sem entrar em detalhes, os formatos mais comuns da nossa rede são PEM, DER, PKCS12, ou JKS. Destes, apenas o formato JKS não é suportado pelo aplicativo OpenSSL. O PEM e o DER são formatos codificados – o PEM é um formato codificado em Base64. O DER é binário. O PKCS12 é um container que pode armazenar chaves privadas e públicas, bem como certificados assinados e cadeias de certificados. Para converter entre os formatos de arquivo PEM e DER, podemos usar os parâmetros -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 extração de chaves/certificados de um pacote PKCS12, que geralmente é protegido com uma senha. É possível lidar com
tal operação no Bash com a opção –passin do OpenSSL. Esta opção nos permite especificar senhas para acessar dados em arquivos protegidos por senhas de cinco maneiras. Ela é útil não só para o PKCS12, mas para toda ação que requer uma 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 não é um método seguro, porque a senha é armazenada no histórico do Bash e pode ser vista com um comando ps durante a execução. Segundo, especificamos a senha com env:var. Este método é mais seguro, porque a senha é manipulada na variável 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 poderíamos 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 padrão. Em seguida, extrairemos todos os certificados de arquivos PKCS12 protegidos por senha em um diretório 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 extensão .pass.
Criptografar e descriptografar em massa Tarefas comuns de criptografia de arquivos incluem encriptação e decriptação. A criptografia simétrica utiliza uma chave para criptografar e descriptografar. A criptografia assimétrica usa uma chave pública para criptografar e uma chave privada para descriptografar (normalmente implementada com PKI e certificados X.509). Criptografia simétrica é mais rápida que a criptografia assimétrica, e é uma escolha melhor quando não há necessidade de acesso público para a chave. Para criptografar o arquivo plain. txt com criptografia simétrica e escrever o arquivo de saída cipher.enc, usamos o seguinte comando: openssl [ciphername] -a -salt -in plain.txt -out cipher.enc
O sistema solicitará uma senha criptográfica, que também tem de ser digitada quando for descriptografada mais tarde. Não é a melhor opção para operações em massa, mas já descrevemos vários métodos para especificar uma senha para o OpenSSL. Assim, para criptografar todos os arquivos .txt no diretório atual e gravá-los no diretório ../enc com a cifra aes-256-cbc, é possível usar o seguinte loop (supondo que a senha está escrita no arquivo de pass): for file in *.txt; do openssl aes-256-cbc -a -salt -in "$file" -out "../enc/$file" -passin file:pass done
Podemos descriptografar todos os arquivos .txt no diretório atual e gravá-los no diretório ../dec com:
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/ saída padrão De acordo com a filosofia Unix, cada argumento que é passado com o parâmetro –in pode ser passado também usando a entrada padrão. Se não especificarmos a saída com o parâmetro -out, o resultado será mostrado na saída padrão. Assim, podemos usar o OpenSSL para processar saídas de outros comandos e gerar entradas para outros programas com um pipe. Para verificar se um certificado com o número de série 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 número de série. Da mesma forma, como com os scripts Bash anteriores, podemos adicionar um timeout e verificar a saída do comando grep com a variável $?.
Como auditar senhas criptografadas A chave privada quase sempre deve ser protegida com uma senha. Muitas vezes, arquivos PKCS12 também são protegidos com senhas. Com o OpenSSL e o Bash, fazemos uma rápida verificação 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 diretório 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 pública (PKI). Uma PKI muitas vezes tem um papel crucial na segurança, e o OpenSSL pode ser usado para implementar e testar uma PKI. Primeiro, podemos usar o OpenSSL para gerar pares de chaves e pedidos de assinatura de certificado correspondentes (da sigla CSRs, de Certificate Signing Request). Segundo, podemos assinar CSRs, criando assim certificados válidos. Terceiro, podemos revogar e gerar CRLs. Quarto, podemos assinar/ criptografar e verificar/descriptografar. E finalmente, podemos alterar os parâmetros em tempo real e manipular valores, tais como algoritmos, comprimentos de chave ou conteúdo DN. É possível usar estes dados como entrada para outros aplicativos. A listagem 2 mostra alguns exemplos de recursos que usamos para testar vários elementos de uma PKI. A função create_config foi cortada para melhor legibilidade. Utilize o conteúdo de seu arquivo de configuração padrão do OpenSSL para configurações adicionais. O arquivo de configuração normalmente se chama openssl.cnf e fica em /etc. Por padrão, o OpenSSL lê o arquivo de configuração de um local especificado (normalmente /etc/ openssl.cnf); mas, para nossos testes, foi mais fácil criar um arquivo
www.linuxmagazine.com.br
OpenSSL com Bash | TUTORIAL
de configuração na hora. A função de script create_config cuida disso escrevendo a configuração no arquivo ./config. Mais tarde, o arquivo criado por esta função é apontado no OpenSSL com o parâmetro -config. Em seguida, temos funções create_ root_ca, create_crl, create_client_req, sign_client_req, e revoke_client_cert; os nomes delas são auto-explicativos. Todas estas funções recebem parâmetros que especificam tarefas como uma string DN (de “nome exclusivo” ou distinguished name), prazo de validade, tamanho de chave etc. A parte principal do script (não mostrada na listagem) pode utilizar as funções para gerar um número específico de certificados de autori-
dade certificadora (da sigla CA, de Certification Authority) e um determinado número de certificados de cliente para cada CA. Além disso, poderíamos revogar certificados de algum cliente logo após a geração. Desta forma, a saída do script possuiria vários certificados CA, certificados de cliente revogado, e CRLs.
Conclusão O OpenSSL é uma ferramenta muito flexível. Pelo fato de podermos especificar todos os parâmetros necessários usando a linha de comando, arquivos, pipes e variáveis 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 próprias ideias. Apenas não confunda a chave privada de outra pessoa com a sua própria. ■
Mais informações [1] OpenSSL: http:// www.openssl.org/ [2] Bash: http://www.gnu. org/software/bash/
Gostou do artigo? igo? Queremos ouvir sua opinião. o nião. 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 (continuação)
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
Computação pioneira A súbita popularidade de computadores miniboard como o Raspberry Pi trouxe de volta o espírito pioneiro dos primeiros dias do Linux. Repentinamente, o “faça você mesmo” na comunidade de código aberto está de volta. por Brian Proffitt
A
té agora, a maioria dos nerds já ouviu falar do Raspberry Pi [1], mas caso o leitor ainda não tenha ouvido falar a respeito, oferecemos um panorama sobre o assunto. O projeto Raspberry Pi começou em 2006, quando um grupo de pesquisadores do laboratório de computação da Universidade de Cambridge, no Reino Unido, observava os conhecimentos de informática em declínio para estudantes de Nível A que acessavam seus programas. O que viam não era nada positivo, e era uma tendência que se repetia também em outras nações, além do Reino Unido. Apesar da proliferação dos computadores pessoais, ou talvez por causa dela, as crianças já não 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 primórdios A equipe de Cambridge, liderada pelo designer Eben Upton, começou a montar um dispositivo pequeno, portátil, e muito barato que iria inicializar diretamente em um ambiente de programação. A partir daí, estudantes de qualquer idade poderiam começar a programar para o que lhes fosse mais interessante.
70
Nos EUA, a carência de conhecimentos em informática no ensino para jovens significa que o país deverá enfrentar uma séria lacuna de talentos para o desenvolvimento de aplicativos no futuro. Os EUA já possuem uma falta de talentos no que se refere à análise de dados massivos, logo não é nada improvável que essa lacuna na programação surja um pouco mais adiante. Esta não é uma coisa boa, e não pelos habituais argumentos geopolíticos que condenam os EUA ou o Reino Unido de ficar para trás de uma nação ou de outra. Como sociedades autossuficientes, são nações que desejam a gestão de informações e conteúdos puramente nas mãos de poucos e seletos magos da programação? Dadas as devidas proporções, o declínio da alfabetização na programação se espelha no declínio da alfabetização após a queda do Império Romano, e todos nós sabemos o que aconteceu depois. A centralização do controle dos nossos dados pode ser um pouco diferente para a nossa sociedade de como foi a centralização da palavra escrita pelo clero e pela aristrocracia na Idade Média. Tal é a visão que engloba o contexto no qual se insere o projeto do Raspberry Pi. Em 2008, o dispositivo conhecido como Raspberry Pi tinha concluído
a fase de projeto e estava pronto para ser produzido. A fundação Raspberry Pi foi criada naquele ano e, após três anos de captação de recursos e produção, os dispositivos Pi foram saindo da linha de montagem.
O presente Existem dois modelos do Raspberry Pi disponíveis: o modelo A por 25 dólares em modelo B por 35 dólares. Ambos possuem um processador ARM de 700 MHz em uma placa monolítica da Broadcom, com 256 MB de RAM e um slot de cartão SD/MMC/SDIO para armazenamento. A única grande diferença entre os dois modelos é que com mais 10 dólares é possível obter um conector Ethernet 10/100 e uma segunda porta USB no modelo B. Esse pequeno diferencial de preço e a popularidade de um dispositivo conectado à rede poderia explicar por que o tempo de espera em qualquer lugar é, em média, de 5 a 12 semanas para adquirir um modelo B, de acordo com o fornecedor. E ele não está mais sozinho: novos dispositivos, como o Cotton Candy, o Mele A1000, o MK802 e o Oval Elephant fazem parte desta crescente família de “mini-PCs”. É claro que é possível fazer muitas coisas além de simples programação com um Raspberry Pi nas mãos. Exis-
www.linuxmagazine.com.br
Raspberry Pi | TUTORIAL
tem pessoas que descobriram que o dispositivo, por exemplo, pode ser um viável media streamer [2] e um reprodutor de rádio Internet [3]. Para este artigo, no entanto, cobriremos o objetivo geral do dispositivo: executar um sistema operacional Linux no qual o leitor possa programar. Há um sem número de distribuições que podem ser executadas no Raspberry Pi. Basicamente tudo que precisamos é de uma distribuição compilada para um processador ARM11 em uma imagem de disco que vai caber em pelo menos um cartão SD de 2GB. No entanto, a equipe do Raspberry Pi atualmente recomenda uma das três distribuições listadas em sua página de downloads [4]: Raspbian “wheezy”, Arch Linux ARM, e QtonPi. Para os iniciantes, a Raspberry Pi recomenda a variante do Debian, Raspbian, que é consideravelmente otimizada para o dispositivo Pi e tem o LXDE, o Midori, e outras ferramentas de desenvolvimento. A Raspbian é a que instalamos para este artigo, mas para as outras imagens o procedimento será o mesmo; apenas mudam os nomes dos arquivos. Nota: os nomes de arquivos são os disponíveis no momento em que escrevemos esta matéria. Eles podem variar um pouco após a publicação desta edição. Para começar, visite a página de downloads do Raspberry Pi e baixe a última edição do arquivo ZIP do Raspbian “wheezy”. No diretório em que baixar o arquivo, extraia a imagem com
Este comando irá listar os dispositivos que estão montados. Veremos um nome do dispositivo que não corresponde à configuração atual de unidades do seu sistema. Esse dispositivo extra é seu cartão SD. Se o cartão possuir um nome como /dev/sdd1, ignore o 1 (ou qualquer outro número ao final do nome). Os números indicam partições, e quando gravarmos a imagem de disco do Raspbian no cartão, precisaremos do nome do dispositivo, que neste exemplo será /dev/sdd. Também é necessário desmontar todas as partições que estão no cartão. A maioria dos cartões SD terá apenas uma partição, mas para o caso de haver mais de uma, desmontar todas elas limpará o caminho para a nova imagem de disco. Presumindo que o nome do dispositivo é /dev/sdd, digite umount /dev/sdd1
Repita o comando umount para todas as partições com sdd no nome. Em seguida, escreva a imagem do Raspbian no cartão SD com o comando dd. Cuidados devem ser tomados aqui para que não sejam utilizados como destino o disco rígido ao invés do cartão SD. Ainda no terminal, navegue até o diretório /2012-07-15-wheezy-raspbian e digite sudo dd bs=1M if=2012-07-15wheezy-raspbian.img of=/dev/sdd
Esta etapa pode levar algum tempo, portanto seja paciente e não pense que o processo está travado. Quando
o prompt de comando retornar o resultado da operação, digite sudo sync
para limpar o cache de gravação. Agora podemos remover o cartão SD e usá-lo em nosso dispositivo Raspberry Pi. Com a porta HDMI gerenciando vídeo e duas portas USB cuidando dos controles do mouse e do teclado, o leitor poderá indagar se o tamanho do cartão SD estará limitado ao armazenamento. Através de um hub USB, porém, também é possível expandir as portas e começar a usar drives USB externos para armazenamento.
O futuro Uma das maiores atrações para o dispositivo Raspberry não é apenas o dispositivo em si; a comunidade em volta deste pequeno dispositivo é muito forte e está crescendo rápido. Quem não teve a felicidade de viver os primeiros dias do Linux, quando as coisas eram rápidas e livres – e a informação muito mais complicada de se obter – então esta será uma experiência nova que remeterá a esses dias. Veteranos do Linux se sentirão em casa com a comunidade Raspberry. A convergência de dispositivos baratos e poderosos como este deve abrir caminho para uma série de projetos inovadores e o Raspberry Pi já desperta atenção na produção de robôs terrestres [5] e dispositivos de realidade extraterrestre [6]. As possibilidades, como aconteceu com o velho Linux, são infinitas. ■
unzip 2012-07-15-wheezy-raspbian.zip
Mais informações
Insira um cartão SD no leitor do computador e digite:
[1] Raspberry Pi: http://www.raspberrypi.org/
df -h
Gostou do artigo? igo? Queremos ouvir sua opinião. o nião. 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] Rádio Internet: http://www.raspberrypi.org/ phpBB3/viewtopic.php?f=9&t=4031 [4] Downloads: http://www.raspberrypi.org/downloads [5] Robôs: http://www.raspberrypi.org/forum/ projects-and-collaboration-general/starwars-r5-d4-astromech [6] Balão Meteorológico: http://www.raspberrypi. org/phpBB3/viewtopic.php?f=9&t=2059
71
PROGRAMAÇÃO
PROGRAMAÇÃO | Dart
Dart, a alternativa do Google ao JavaScript
Centro do alvo? A linguagem de programação Dart é a atual alternativa do Google ao JavaScript. Executada principalmente em navegadores, também pode ser utilizada em linha de comando e em servidores como substituta para o PHP. por Tim Schürmann
O
código escrito na linguagem de programação Dart do Google se parece muito com uma mistura de JavaScript e Java com uma pitada de Scala. Essa semelhança é intencional: a linguagem de programação [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 segurança, que trabalhem em qualquer dispositivo compatível com Internet e que sejam adequados para projetos ainda maiores [2]. Se uma pessoa tem experiência com linguagens de programação – e essa descrição encaixa-se para quase qualquer programador web – irá também rapidamente sentir-se à vontade com o Dart.
Programas escritos em Dart serão executados em uma máquina virtual especial no navegador. O projeto fornece uma implementação de referência em um site, que ainda é capaz de executar programas Dart em linha de comando ou em um servidor de Internet. O Dart é, sobretudo, um substituto adequado do PHP. Além da máquina virtual, o projeto oferece um par de bibliotecas cujas funções – entre outras coisas – oferecem suporte à manipulação conveniente da árvore de um site DOM (sigla para Document Object Model ou modelo de objeto de documentos). Um par de outras ferramentas também facilita a vida de programadores, como o editor Dart baseado no Eclipse (figura 1).
Trabalho em andamento
Figura 1 O Editor Dart é um ambiente de desenvolvimento baseado no Eclipse, fornecendo acesso direto aos exemplos de código.
72
Tudo isso soa muito atraente, com uma desvantagem pequena: o Dart está atualmente em um estágio muito inicial de desenvolvimento e, portanto, não é adequado para uso em produção. Os inventores do Dart intencionalmente lançaram a sua
www.linuxmagazine.com.br
Dart | PROGRAMAÇÃO
especificação em um estágio inicial para coletar tantas sugestões de melhorias quanto fosse possível, bem como para melhorar a aceitação. É também precisamente por isso que a especificação da linguagem tem sido colocada sob a licença Creative Commons Atribution 3.0 e o código do programa publicado pelo projeto sob a licença BSD Google [3]. Quando este artigo foi escrito, a versão mais recente do Dart era a 0.08, e esta é a versão na qual a visão geral a seguir se baseia.
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 comentário print("Olá Mundo!"); }
Os programadores de JavaScript irão tossir novamente: Dart é uma linguagem orientada a objetos em todos os sentidos. A listagem 1 mostra a declaração de uma classe chamada Carro. A classe começa por definir uma nova variável cor. Como a palavra-chave var sugere, as variáveis podem assumir valores arbitrários 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 não acabe em uma variável global ou em uma nova variável. A linha 8 mostra duas características do Dart. Em linguagens como Java, o desenvolvedor pode definir vários construtores com parâmetros diferentes (sobrecarga). Quando um objeto é criado, a linguagem, então, automaticamente chama o construtor correspondente. Em linguagens como Dart, tal escolha não é tão 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); // saída vermelha print(bmw.cor); // saída 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: Padrão 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
PROGRAMAÇÃO | Dart
nhecidos. Na listagem 1, o segundo construtor é chamado de pintura, e caso se queira chamar precisamente esse construtor ao criar uma instância Carro na função 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 abreviação: o Dart atribui o valor passado para ele diretamente para a variável cor. Claro, se preferir, use a versão longa: Carro.pintura(var umacor) { this.color = umacor; }
As variáveis que podem assumir valores arbitrários podem ser muito convenientes, mas esta abordagem tende a causar alguma negligência por parte dos programadores no mundo real, o que leva a erros que podem ser difíceis de resolver. Por este motivo, os programadores podem, opcionalmente, especificar um tipo de uma variável: class Carro { String cor; [...]
Se o programa Dart tenta armazenar um número em cor em algum estágio posterior do programa, a máquina virtual cria um aviso. Como
foi dito, este é apenas um aviso e não um erro – o programa continuará a funcionar com um número em cor. Esse comportamento chama a atenção do programador para erros de atribuição e torna o código mais legível, e os usuários não precisam temer uma falha súbita do programa. Além do tipo String, o Dart também suporta os tipos listados na tabela 1. Aliás, todos estes são objetos internos. É possível até criar listas e mapas com um new: var autos = new List();
As variáveis que ainda não tiveram um valor atribuído automaticamente têm o valor especial null. Como no PHP, o Dart pode inserir o conteúdo de variáveis em strings. O código: String nome = "John Doe"; print ("Olá ${nome}");
geraria um Olá John Doe. Dentro dos colchetes {} pode até haver expressões completas ou chamadas de função.
Versão em linha Usuários Dart podem abreviar uma definição de função individual como a seguir: int quadrado(int numero) { return numero*numero; }
com => int quadrado(int numero) => numero*numero;
(por exemplo, => e significa {return e;}). No Dart, é possível passar uma função para outra, o que é muito útil em loops: digaOla(String nome) => print("Ola ${nome}"); List nomes = ["Tim", "Joe", "Henry"]; nomes.forEach(digaOla);
A função digaOla escreve a string passada para ela após Olá e exibe os resultados na tela. A segunda linha cria uma lista com três nomes que, por sua vez, são empurrados um após o outro e entregues para a função pelo forEach – neste caso, a função é digaOla(). Em outras palavras, este trecho de três linhas de código exibe Olá Tim, Olá Joe e Olá Henry. Pelo fato de o digaOla só ocorrer em nomes.forEach(), podemos declarar a função de lá diretamente e exibir seus nomes da mesma forma: List nomes = ["Tim", "Joe", "Henry"]; nomes.forEach( (String nome) => print("Olá ${nome}") );
Esta forma compacta de codificação funciona bem aqui mas, em funções mais complexas, pode-se facilmente perder de vista o que se está fazendo. Os suspeitos de costume estão disponíveis para controle de fluxo: for, if, switch e while, e agem exatamente como seus homólogos em Java ou JavaScript. Além disso, é possível usar exceções para detectar erros.
Tipo
Conteúdo
Exemplo
String
String (32-bit Unicode)
String nome = “Joe”;
int
Inteiro
int numero = 12;
double
Números de ponto flutuante de 64 bits (em conformidade com o padrão IEEE 754)
double numero = 1.3456;
num
Números inteiros, números de ponto flutuante, ou ambos
num y = mx + b
bool
verdadeiro/falso
bool pegacookies = true;
List
Uma lista de valores, também conhecida como array
List nomes = [“Tim”, “Joe”, “Henry”];
Map
Array associativo, também conhecido como um mapa hash ou dicionário de dados
Map traducao = {“house” : “casa”, “car” : “carro”, “chair” : “cadeira”};
Tabela 1 Tipos suportados pelo Dart.
74
www.linuxmagazine.com.br
Dart | PROGRAMAÇÃO
Clássico O Dart herdou interfaces do Java. Quando uma classe implementa uma interface, ela garante que a função especificada na interface seja fornecida. A listagem 2 fornece um exemplo de herança. Uma classe pode implementar várias interfaces, mas apenas herda exatamente uma classe (ou seja, usa extends para estender a classe). Na listagem 2, todas as variáveis e funções são públicas, com uma exceção, _altura. Se o nome da variável ou uma função começa com um sublinhado, ela é privada, e só é possível acessar a variável ou função dentro da própria classe. Na listagem 2, isso significa que não se pode retroativamente modificar a altura de um retângulo.
Figura 2 O SDK Dart inclui uma máquina virtual para linha de comando.
Oferta de Factory Padrões de projeto [4] têm sido parte do repertório do desenvolvedor profissional por muitos anos. Assim, não há nenhuma surpresa em que o Dart também suporte este recurso. Por exemplo, o padrão Factory já faz parte da linguagem: se o construtor for prefixado com a palavra-chave factory, o Dart não cria automaticamente um objeto desta classe, mas deixa para o construtor. O programador pode então olhar em um cache para ver se um objeto correspondente já existe, como pode ser visto na listagem 3. A variável outrocarro neste 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 variável. O padrão Factory pode também ser combinado com interfaces. Para fazer isso, atribui-se a classe padrão factory a uma interface, e a classe factory retorna objetos para coincidir com a interface. A listagem 4 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 Conversível dependendo do fabricante que lhe
for passado. Durante a instância em main(), parece que se está criando um Carro diretamente. Além disso, a palavra-chave is testa para ver se um objeto é um tipo específico. Aliás, a palavra-chave final na frente do fabricante garante que à variável só possa ser atribuído um valor exato e somente uma vez durante sua inicialização.
Serviço de Contêiner O Dart contém os tipos genéricos, também conhecidos como generics, com os quais provavelmente estamos familiarizados por causa do Java. Programadores C++ também conhecem esse conceito como templates. É pos-
sível usá-los para criar rapidamente recipientes para objetos arbitrários. As listas de funções embutidas e mapas são genéricos. Por exemplo, List<Car> cria uma lista de objetos Carro: main() { List<Carro> listadecarros = new List<Carro>(); listadecarros.add(new Carro("Ferrari")); Carro umcarro = listadecarros[0]; }
Como as variáveis podem assumir conteúdo arbitrário, o Dart não impedirá isso: List<Carro> listadecarros = new List<Carro>(); List<LKW> listadecaminhoes = listadecarros;
Essa experiência pode explodir mais tarde, se o desenvolvedor ten-
75
PROGRAMAÇÃO | Dart
tar fazer algo com o que assumiu ser um caminhão da listadecaminhoes.
Paralelismo Programadores normalmente mudam as tarefas que precisam ser executadas em processos paralelos separados e, em seguida, trabalham duro para unir os resultados intermediários. O Dart remove as dores de cabeça desse processo: um objeto derivado
da classe Isolate básica, se assim se deseja, é executado separadamente do programa principal em seu próprio processo. Para ser capaz de trocar resultados intermediários, os Isolates podem enviar mensagens uns para os outros. Essas mensagens são 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 sucessão. Assim que o objeto recebe uma palavra, escreve-a na tela. O Isolate sempre dá uma porta para o objeto que enviou a mensagem na forma de replyTo. Isso significa que ele pode responder diretamente para o seu solicitante. Os Isolates executam em um espaço de memória separado. Um efeito colateral positivo disto é que a coleta de lixo pode lidar com cada Isolate individualmente. No retorno, a máquina virtual precisa copiar as mensagens entre o Isolate. No futuro, os Isolates serão inclusive capazes de usar as diferentes bibliotecas Dart com diferentes versões.
Acesso DOM Pelo fato de o Dart ser projetado para substituir o JavaScript, os programadores devem ser capazes de usar a linguagem para acessar a árvore DOM de um site. Para que isso aconteça, o Dart inclui a sua própria 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 expressão 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 através de seletores CSS em um estilo muito semelhante ao jQuery. O Dart pode usar programas de outras classes e funções para configurar conexões HTTP (Ajax keyword), dados de processo JSON, e até mesmo acessar o sistema de arquivos, entre outras coisas. Para
www.linuxmagazine.com.br
Dart | PROGRAMAÇÃO
obter uma lista completa, leia a Referência da API [5].
Executado Como os navegadores de hoje atualmente não compreendem programas Dart, o projeto desenvolveu o compilador Dartc, que converte programas Dart em código JavaScript. No entanto, o Dartc tinha a reputação 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 código JavaScript muito mais compacto. O Frog é uma máquina virtual para a linha de comando (figura 2) incluída no SDK Dart, que está disponível gratuitamente na página do projeto [6]. Tudo que é necessário fazer é baixar o arquivo ZIP correspondente, descompactar, e então compilar o seu próprio programa Dart (por exemplo, test.dart) usando o Frog a partir do diretório bin, ./frogc --enable_type_checks test.dart
ou executar o programa diretamente na máquina virtual: ./dart --enable_type_checks test.dart
O parâmetro --enable_type_checks garante que o compilador, ou a máquina virtual, possibilite a verificação do tipo. Caso prefira não usar o SDK agora, é possível executar seus próprios 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 exceção da dart:html), para quando os programadores precisarem usar a declaração de importação se eles trabalharem com a máquina virtual de linha de comando. Finalmente, também é possível usar o Dartium, uma versão especial do navegador Chromium com uma máquina virtual Dart embutida [8]. É possível verificar a especificação completa da linguagem Dart [9] e o código fonte de vários dos maiores programas de exemplo Dart [10] no site do dartlang.org.
Conclusão Com exceção do Dartium, todos os atuais navegadores ignoram o Dart, e não se pode culpá-los; afinal, a linguagem de programação não está totalmente completa. Ao mesmo tempo, o Dart está enfrentando fortes críticas: a maioria dos observadores acredita que o apoio a outra linguagem web é supérfluo e contraproducente. O futuro do Dart dependerá em grande parte da seriedade que o Google vem demonstrando no mercado; a empresa tem o poder
de fazer valer essa linguagem, e se o faz no que se refere a dispositivos Android e navegador Chrome – outros fabricantes de navegadores serão incapazes de desviar o olhar. No entanto, o perigo é que uma comunidade de adversários do Dart possa vir a existir, o que significaria mais uma vez a fragmentação da Internet. Dito isto, até mesmo os críticos devem reconhecer que os programas Dart são mais fáceis de ler e compreender do que suas contrapartidas em JavaScript. Graças à orientação a objetos genuína, aplicativos maiores e de mais fácil manutenção também são possíveis. A perspectiva de uma linguagem única para o cliente e o servidor também é atraente – programadores web não precisariam mais alternar entre JavaScript e, digamos, PHP. Mas mesmo quem não vem do mundo Java deve ser capaz de encontrar seu espaço em um tempo muito curto. Por fim, a linguagem é organizada de forma aberta, em contraste com o Java, e qualquer usuário pode apresentar propostas de melhorias. Pelo menos, assim tem sido o processo até agora. ■
Mais informações [1] Projeto Dart: http://www.dartlang.org/ [2] Objetivos do projeto Dart: http://www.dartlang. org/docs/technical-overview/#goals [3] Licença BSD Google: http://code.google.com/ intl/de-DE/google_bsd_license.html [4] Padrões de Projeto: http://en.wikipedia. org/wiki/Software_design_pattern [5] Referência da API Dart: http://api.dartlang.org/ [6] SDK Dart: http://www.dartlang.org/docs/getting-started/sdk/ [7] Dartboard: http://try.dartlang.org/
Gostou do artigo? igo?
[8] Navegador Dartium: http://www.dartlang.org/dartium/
Queremos ouvir sua opinião. inião. 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
Conheça a coleção Academy da Linux New Media Os livros da Coleção Academy são roteiros práticos e objetivos, com didática adequada tanto ao profissional quanto ao estudante da área de TI.
Luciano Antonio Siqueira
Infraestrutura de Redes Passo a passo da montagem de uma rede de computadores, desde o cabeamento e roteadores até a configuração das máquinas clientes.
Configuração e manutenção de serviços essenciais como DNS, compartilhamento de arquivos e acesso remoto.
Paulo Henrique Alkmin da Costa
Luciano Antonio Siqueira
Samba:
Máquinas virtuais com VirtualBox
com Windows e Linux Como permitir a comunicação de diferentes sistemas operacionais em rede: Windows, Linux, Mac OS X etc. Definição de compartilhamentos de arquivos, impressoras – incluindo a instalação automática de drivers – e utilização do Samba como controlador de domínio (PDC) também para clientes Windows Vista e Windows 7.
O conteúdo e o formato dos livros foram desenvolvidos a partir da experiência prática e educacional de seus autores, com foco principal no desenvolvimento de competências, através de conceitos, exemplos detalhados e dicas de quem realmente entende do assunto. O material é indicado tanto para autodidatas que desejam se aperfeiçoar quanto para utilização em escolas. O professor irá se sentir confortável para desenvolver as atividades a partir do livro, que procura atender tanto à expectativa do aprendiz quanto à demanda profissional do mercado de TI.
Disponível no site www.LinuxMagazine.com.br
Administração de infraestrutura de máquinas virtuais com Sun VirtualBox®. Como trabalhar com sistemas operacionais – Windows, Linux etc – na mesma máquina e simultaneamente.
Criação de diferentes modalidades de conexões virtuais, exportação/importação de máquinas virtuais e criação de pontos de recuperação (snapshots).
PREVIEW
Linux Magazine #96 BIG DATA Estamos em um momento tecnológico onde tudo gira em torno da geração e consumo de grandes volumes de dados. Na próxima edição da Linux Magazine você vai conhecer mais sobre o conceito de Big Data e formas de armazenamento de informações em larga escala, de forma que seja possível acessá-las e analisá-las sempre que necessário com desempenho e praticidade. Entre os temas que serão abordados na próxima edição estão o Apache Hadoop e construção de clusters. Não perca! ■
Admin Magazine #08 Controle de tráfego Melhore o desempenho da sua rede com versões do kernel apropriadas para o controle de tráfego. Comparamos 6 diferentes sistemas de arquivos, saiba qual é o mais adequado para as suas necessidades. Realize backups dos dados de toda a sua rede através de ferramentas como Burp, Obnam e Backshift. Você conhece o mais novo modelo de fornecimento de sistemas de bancos de dados para a nuvem? O modelo database-as-a-service também é um dos destaques da próxima edição da Admin Magazine, não perca!
82
www.linuxmagazine.com.br