Anda di halaman 1dari 52

EDITORIAL

EQUIPA PROGRAMAR

Coordenador
Antnio Pedro Cunha Santos
Editor
Antnio Pedro Cunha Santos
Design
Srgio Alves
Twitter: @scorpion_blood
Ilustrao
Sara Freixo
Redaco
Antnio Pedro Cunha Santos
Diego Andrade
Fbio Pinho
Jorge Paulino
Nuno Silva
Paulo Afonso Parreira Jnior
Paulo Henrique Lima Oliveira
Ricardo Trindade
Rita Peres
Sara Silva
Srgio Ribeiro

Guest@system
Em Janeiro passado, com muita tristeza tomei conhecimento em segundos,
do que acabava de acontecer em Paris. Um atentado liberdade de expresso de
todos ns e pensei: Felizmente a internet no tem censura! Posso ler a noticia!
Com a mesma tristeza com que a li, pensei para mim: Que sociedade esta, onde
vivemos? e este pensamento assaltou-me nas horas seguintes, no dia de trabalho,
nas linhas de cdigo que escrevi.
Pensei nas vezes em que ns programadores criamos software, tecnologia,
algo do nada e nem sequer nos apercebemos que aquilo que criamos pode ser
usado para fins completamente dispares dos que ns idealizamos! estranho!
Parece que, de certa forma, ns, enquanto "indivduo", somos um utilizador "guest"
no sistema que a sociedade em que vivemos.
Quer dizer, no propriamente guest, mas quase parece que estamos num
sistema estranho, ou com updates to radicais que por vezes nos passam ao lado!
Com este pensamento de guest@system, decidi deixar o editorial curto, mudando
apenas a prompt, valendo-me das palavras do poeta Jos Rgio, que escreveu no
sei para onde vou, mas sei que no vou por a, para deixar na prompt, o rumo para
onde a revista continuar a ir, no respeito pela pluralidade e liberdade de opinio,
sem mais demoras: todos@liberdade ~: $

At prxima edio.

Antnio Santos

Staff
Antnio Pedro Cunha Santos
Rita Peres
Rui Gonalves
Sara Freixo
Tiago Sousa
Contacto
revistaprogramar@portugal-aprogramar.org
Website
http://www.revista-programar.info
ISSN
1 647-071 0

A revista PROGRAMAR um projecto voluntrio sem fins lucrativos. Todos os artigos so da responsabilidade dos autores, no
podendo a revista ou a comunidade ser responsvel por alguma impreciso ou erro.
Para qualquer dvida ou esclarecimento poder sempre contactar-nos.

NDICE
TEMA
8

DE CAPA
Criar um Cluster de Processamento Paralelo MPI com Raspberries - Antnio Santos

A PROGRAMAR
15

Como fazer merge de diferentes verses de cdigo gerado pelo Windows AppStudio - Sara Silva

19

Cortana: A assistente pessoal digital da Microsoft chega ao PC e Tablets - Nuno Silva

22

Produzir ficheiros no formtado ODF Open Document Format em .NET - Ricardo Trindade

26

Ordenao Genrica em C - Paulo Afonso Parreira Jnior e Paulo Henrique Lima Oliveira

COLUNAS
32

C# Aplicao auxiliar de actualizao - Fabio Pinho

ANLISES
37

Compiladores Da Teoria Prtica - Srgio Ribeiro

39

Gesto de Projetos de Software (5. Edio Atualizada) - Jorge Paulino

NO CODE
41

Raspberry Pi2 Evoluo ou Revoluo? - Rita Peres

45

Estratgias de jogos Aplicadas a Segurana Computacional - Diego Andrade

EVENTOS
ENEI 2015 - 27 30 de Maro
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-programar.pt

NOTICIAS
Anunciando o Guia de
Portabilidade Ubuntu 2.0

se ir fazer histria. Isto porque, destacou Artur Santos Silva, esta ser a estreia em Portugal do Ttulo de Impacto Social, um mecanismo atravs do qual um investidor financia um
projecto com fins sociais desenvolvido por uma entidade do
sector pblico.

Nas ltimas semanas, o Ubuntu atingiu um marco importante com as primeiras vendas relmpago do Aquarius BQ
- Ubuntu Edition. Este apenas o incio de ver o Ubuntu numa vasta seleco de telefones e tablets, e graas a uma
comunidade de portabilidade incrivelmente entusiasta, mais
dispositivos de tm feito parte desse espetculo. Alguns destes portadores qualificados chegaram a configurar o seu prprio servidor de imagens para fornecer atualizaes over-theair!
Para facilitar o processo de portabilidade, o Guia de
Portabilidade foi atualizado para refletir o atual procedimento
de permisso de novos dispositivos. Desde a criao de seu
ambiente de desenvolvimento, a configurar o kernel e depurar
o AppArmor, abrange os principais pontos de fazer uma portao em pleno funcionamento. Atualmente focado nas portaes AOSP, ser alargado no devido tempo a processos detalhados e especficos CyanogenMod.
Se est interessado em portabilidade, por favor, certifique-se
de que fornece feedback sobre quaisquer problemas e obstculos que possam surgir, quer no Launchpad ou na mailinglist do Ubuntu-phone.
Obrigado e bom trabalho, colegas aventureiros de dispositivos!

As aulas de programao a 65 crianas de trs escolas


do 1. ciclo do ensino bsico da rede pblica de Lisboa - Aida
Vieira (Carnide), Bairro do Armador (Marvila) e S. Joo de
Deus (Areeiro) - comearam no passado ms de Janeiro.
Desde ento, os alunos tm estado a aprender linguagem de
cdigo, atravs da utilizao de um programa (Scratch), que
foi desenvolvido no Massachusetts Institute of Technology.

Fonte: developer.ubuntu.com
Traduo: Sara Santos

Trata-se, como frisou o presidente do municpio numa


apresentao pblica que se realizou esta sexta-feira, de uma
iniciativa dois em um no que inovao diz respeito: inovadora no modo de financiamento e tambm naquilo que representa em termos de oferta educativa. No futuro vai ser to
importante aprender programao como foi ler e fazer contas
no tempo dos nossos avs ou aprender lnguas estrangeiras
na nossa gerao, constatou Antnio Costa.

Cmara de Lisboa e Gulbenkian levam programao informtica s escolas


A Cmara de Lisboa e a Fundao Calouste Gulbenkian uniram-se para lanar a Academia de Cdigo Jnior, um
programa de ensino de programao informtica a crianas
do 1. ciclo com o qual o presidente da fundao acredita que

Nesta fase aquilo que vai acontecer que a Fundao Calouste Gulbenkian vai investir cerca de 120 mil euros no pro-

NOTICIAS
grama Academia de Cdigo Jnior, valor que ser mais tarde

para IoT atravs da apresentao de uma verso do Windows


10 que suporta o Raspberry Pi 2. Esta verso do Windows 10
ser gratuita para a comunidade Maker atravs do Programa
de Desenvolvimento do Windows para a Internet das coisas.

reembolsado pela cmara se se concluir que foram alcanados os objectivos previamente definidos. Segundo explicou
Artur Santos Silva, a melhoria da capacidade lgica de resoluo de problemas e o desempenho escolar sero os dois
indicadores com base num quais ser feita a avaliao do
sucesso desta iniciativa, avaliao que s dever estar concluda em Janeiro de 2017.

O Windows 10 o primeiro passo para uma era de


computao mais pessoal. Esta viso enquadrou o nosso
trabalho no Windows 10, em que estamos a mover o Windows para um mundo que mais mvel, natural e fundamentado em confiana. Com o Windows para o programa de desenvolvedor de IoT estamos a trazer as nossas principais
ferramentas de desenvolvimento, servios e ecossistema para
a comunidade Raspberry Pi!

O presidente da fundao sublinhou a importncia daquele que o primeiro Ttulo de Impacto Social em Portugal.
Lembrando que o terceiro sector se v confrontado com uma
queda de recursos num momento em que se v obrigado a
multiplicar respostas, Artur Santos Silva considerou que a
discusso sobre novos modelos de financiamento como
aquele que agora foi lanado no apenas oportuna como
absolutamente necessria.
com muito agrado que a cmara se oferece como
cobaia, reagiu Antnio Costa, dando conta do seu agrado
com o facto de se estar a experimentar uma nova forma de
financiamento de projectos com elevado retorno social. Este
no um projecto com retorno financeiro, frisou, notando que
o municpio s sairia a ganhar em termos monetrios se os
alunos da Aida Vieira, do Bairro do Armador e de S. Joo de
Deus no melhorassem as suas capacidades cognitivas e se aumentassem as taxas de reteno e de insucesso
escolar.

Vemos que a comunidade Maker tem uma espantosa


fonte de inovao para dispositivos inteligentes e ligados que
representa o verdadeiro fundamento para a prxima onda de
computao, e estamos entusiasmados por fazer parte desta
comunidade.

Caso este projecto-piloto se revele bem sucedido, a


inteno
do
autarca
socialista

estend-lo
progressivamente a outras escolas do 1. ciclo do ensino
bsico. Com este e outros programas de enriquecimento, como o de Apoio Natao Curricular, aquilo que Antnio Costa
e o seu executivo ambicionam que a rede pblica de Lisboa
tenha a melhor oferta educativa da cidade.

Estamos entusiasmados com a nossa parceria com a


Fundao Raspberry Pi e apresentando uma verso do Windows 10 que suporta o Raspberry Pi 2, e iremos partilhar mais
detalhes sobre os nossos planos de Windows 10 para IoT nos
prximos meses.

Segundo foi j anunciado, em Abril ter incio uma segunda


vertente da Academia de Cdigo: a cmara vai promover, em
parceria com o Instituto de Emprego e Formao Profissional,
formaes na rea da programao informtica para desempregados. A ideia, explicou o presidente da cmara,
reconvert-los para actividades onde h uma elevada procura e no h oferta no mercado.

Fonte: dev.Windows.com
Traduo: Sara Santos

ESOP: e se o futuro das TI fosse decidido por crowdsourcing?

Segundo informaes transmitidas pelo municpio ao


PBLICO, no primeiro ano devero ser formados 90 alunos,
nmero que dever aumentar para 150 por ano nas edies
seguintes.

A Associao de Empresas de Software Open Source


Portuguesas (ESOP) quer ajudar o governo a definir uma estratgia para as tecnologias e tambm para a promoo
das normas abertas. E por isso lanou plataforma de crowdsourcing, que pretende recolher os contributos dos aficionados das tecnologias de cdigo aberto na criao de um modelo de crescimento e desenvolvimento sustentvel para Portugal.

Fonte: Publico

Windows 10
Raspberry Pi 2

para

Estamos entusiasmados por anunciar que estamos a


expandir o nosso Programa para Programadores do Windows

A iniciativa, que d pelo nome de Portugal Open Source 2020 (POS 2020), vai recolher contributos dos internautas

NOTICIAS
at 31 de maro. Das propostas dos diferentes utilizadores,

poder dar novas capacidades aos pilotos e reduzir os riscos


das misses, e queremos disponibilizar estas vantagens para
o mercado com produtos inovadores.

resultar a formulao de um documento que dever servir de


guio para as diferentes aes da ESOP.
O POS 2020 consiste na recolha de ideias e elaborao de um plano estratgico para a utilizao das tecnologias
e normas abertas como motor do crescimento e desenvolvimento da economia e da sociedade portuguesa durante o
perodo de 2015-2020, refere um comunicado da associao.

Antes do teste Vila Franca, o projeto Brainflight contemplou testes com simuladores para veculos tripulados e
no tripulados. Em ambos os casos, os testes de simulador
foram bem sucedidos, mas no se prev que venham a ser
feitos voos em "ambiente real" nos tempos mais prximos.
Ricardo Mendes recorda que ainda h pelo menos dois
tipos de desafios a superar: Hoje, no possvel testar esta
tecnologia em veculos areos tripulados por questes de
segurana e por isso apenas podemos faz-lo em ambiente
de simulao. Esta uma soluo inicial. Ainda no um
produto, mas esse caminho que queremos fazer. Se vai
demorar dois anos ou mais at termos um produto, algo que
no se sabe ainda.

Na POS 2020, os cidados vo poder pronunciar-se


sobre mobilidade, educao, telecomunicaes, big data,
cloud, entre outros temas.
Fonte: Exame Informtica

Drone sobrevoa Lezria comandado apenas por ondas cerebrais


Uma touca, um drone e alguns computadores pelo
meio. Na pista, nas imediaes de Vila Franca de Xira e com
a Lezria por cenrio, no faltou a expectativa tpica das estreias. Conseguiriam os mentores do projeto Brainflght demonstrar que possvel comandar um drone apenas e s
com o pensamento de um ser humano? No ter sido necessrio esperar muito at prova final: como previsto, o drone
da Tekever rasgou os cus e sobrevoou, durante a manh de
ontem, os hangares do aerdromo da cidade ribatejana, comandado pelas ondas cerebrais de um tcnico da Tekever
sentado secretria, em terra, a olhar para um ecr de computador como se estivesse dentro do pequeno cockpit do drone que se encontra a vrias dezenas de metros de distncia.

Ricardo Mendes acredita que a tecnologia usada no


projeto Brainflight acabar por entrar, um dia, nos cockpits
dos avies tripulados, mas tambm lembra que, antes desse
momento, ser necessrio produzir legislao de mbito internacional que regule o uso dos sistemas de "leitura do pensamento" no apoio pilotagem.

No projeto Brainflght, no s a Tekever que tem direito a parangonas de jornal: a iniciativa financiada pela Comisso Europeia contou ainda com a participao de investigadores da Fundao Champalimaud, a Eagle Science, da Holanda, e a Universidade Tcnica de Munique, da Alemanha.
Como que se consegue controlar um drone com o
pensamento?: EEG, a sigla de eletroencefalograma, a resposta mais concisa. Uma resposta mais descritiva remeter
obrigatoriamente para a touca e para os respetivos sensores
colocados em pontos precisos, que facilitam a captao de
ondas cerebrais que, depois, so convertidas em comandos
de drone por algoritmos que correm num computador.

Fonte: Exame Informtica

Ricardo Mendes, diretor operacional da Tekever, recorda que a demonstrao pblica, efetuada ontem num aerdromo, marca uma nova etapa neste projeto: um projeto com
grandes riscos e tambm com grandes recompensas, que
pode ter um impacto a longo prazo, mas que j comeou a
produzir os primeiros resultados e vai precisar de mais tecnologia para chegar a maturidade. Acreditamos que o Brainflight
representa o incio de uma enorme mudana na aviao, que

TEMA DE CAPA
Criar um Cluster de Processamento Paralelo MPI com Raspberies

TEMA DA CAPA
Criar um Cluster de Processamento Paralelo MPI com Raspberries

pende recursivamente dos outputs uns dos outros, podendo


ser divido em blocos e estes, processados simultaneamente.
Este tipo de problema, conhecido como embaraosamente paralelo, consiste na diviso de trabalhos entre todas
as entidades de processamento disponveis, no processamento independente do trabalho enviado para cada
entidade e por fim na juno dos resultados para obteno
do output final.

Introduo:
O Raspberry foi um sucesso desde o seu lanamento
e continua a fascinar programadores, makers, hackers, estudantes e at cientistas, pela sua performance e baixo custo.
So sistemas SoC (System on a Chip), de baixo custo, baseados em arquitectura ARM, com muito potencial por
explorar e pelo seu baixo consumo energtico tornam-se
equipamentos de eleio para pequenos e grandes projectos.
Processamento paralelo:
Nos ltimos anos a evoluo dos processadores foi
confrontada com as limitaes ao aumento da frequncia do
ciclo do relgio. Com efeito, cada vez que se aumenta a frequncia do relgio, aumenta o consumo de energia e o calor
produzido de forma proporcional, o que sugere a aproximao de limites fsicos dos circuitos.
Assim, como resultante do melhoramento do processo de fabrico dos circuitos integrados, em consonncia com
a lei de Moore que estabelece que o nmero de transstores
duplica cada dois anos, a resposta no mercado dos processadores passou por introduzir mais processadores no mesmo chip (multi-ncleo), aumentando a capacidade de processamento do chip, sem sofrer os problemas de eficincia
energtica e controlo de temperatura associados ao aumento da frequncia do ciclo de relgio dos processadores
convencionais. Esta alternativa engenhosa, de aumentar o
desempenho do processamento, pela via do paralelismo por
hardware tem vindo a impor-se tanto no mercado domstico,
como no das mquinas de elevada exigncia.

Fig1. Diagrama ilustrativo das diferenas entre o processamento sequencial e paralelo.

O paralelismo oferece a grande vantagem de reduzir


o tempo de processamento de grandes volumes de dados e
clculos matemticos complexos, pela via do processamento
paralelo com recurso a mltiplos ns, com um ou mais processadores por n.

Quando um mesmo problema tem a oportunidade


de ser executado com o dobro dos recursos computacionais
expectvel que o tempo de execuo total seja reduzido
para a metade, no entanto, isto s verdade em casos muito
especficos explicados mais frente.

O tempo de processamento de um determinado input


normalmente proporcional quantidade de dados de entrada, podendo tornar-se um factor limitativo quando existem
clculos computacionalmente intensivos ou com grandes
volumes de dados. Assim, tendo em conta a consolidao
das tecnologias associadas ao paralelismo ao longo dos
ltimos anos e a existncia de sistemas de computao paralela acessveis comunidade, pode considerar-se inevitvel o recurso ao paralelismo para minimizar o tempo consumido no processamento de dados.

Segundo a lei de Amdahl, o tempo total de execuo T, utilizando n entidades de processamento, pode ser reduzido
para o limite terico
depende da fraco B do problema que no pode ser computada em paralelo, de acordo
com a seguinte equao:

Equao 1. Tempo total de execuo, segundo a lei de


Amdahl

O processamento paralelo particularmente til


quando o volume de dados a serem processados no de-

TEMA DA CAPA
CRIAR UM CLUSTER DE PROCESSAMENTO PARALELO MPI COM RASPBERRIES
se na curva de aprendizagem que tende a ser longa e no
facto de no permitir paralelizao incremental.

No obstante melhoria mxima terica prevista pela


Lei de Amdahl, o ganho oferecido pelo paralelismo pode ser
limitado por vrios outros factores. Um dos principais factores limitativos do ganho de desempenho atravs do paralelismo a largura de banda de acesso aos dados, uma vez que
a capacidade de clculo dos processadores atuais supera
habitualmente a largura de banda de carregamento de informao, quer estejam na memria, em discos ou na rede.

O desfasamento da velocidade do processador em


comparao com os dispositivos de armazenamento to
grande que em muitos tipos de problema no possvel
manter as unidades de processamento ocupadas durante
todo o tempo, porque mesmo com grandes optimizaes nos
padres de acesso memria, com intuito de maximizar a
utilizao dos vrios nveis de memria cache, e com esforos para maximizar a largura de banda dos sistemas de discos rgidos, os processados acabam por passar a maior parte do tempo ociosos a espera de receber dados para processar.
S para contextualizao histrica, o MPI comeou a
ser desenvolvido em finais da dcada de oitenta do sculo
passado, e s tomou alguma expresso maior em Novembro de 1992, aquando da reunio do grupo de trabalho criado para dar continuidade ao processo de padronizao de
Message-Passing em ambientes de memria distribuda.
Nessa reunio foi apresentado o primeiro esboo da interface de message-passing MPI1 e criado o MPI Frum. Cerca
de ano e meio mais tarde em 1994 foi disponibilizado para
domnio pblico uma verso do padro MPI.

A situao agravada quando os acesso os dados


esto em sistemas de armazenamento permanente em discos magnticos comuns, tais como o IDE, SCSI, SAS, SATA,
mesmo quando ligados em RAID. A investigao em entrada/sada de dados tem vindo a proporcionar avanos significativos nos sistemas de armazenamento de informao.
Aos factores acima referidos deve-se acrescentar a
sobrecarga em tempo de processamento resultante da execuo de cdigo associado gesto do paralelismo que pode ser tanto mais relevante quanto menor for a granularidade
do paralelismo. Por outras palavras, devem ser tidas em
conta as possveis perdas resultantes da implementao do
paralelismo, ou seja, na generalidade dos casos prefervel
aumentar o gro da seco paralela, por oposio ao paralelismo de gro-fino.

Tem vindo a ser desenvolvido o padro e desenvolvidas diversas implementaes de MPI, para uma grande variedade de plataformas e arquitecturas de computador, no
entanto essa discusso sai do mbito deste artigo.
O Cluster com Raspberry Pi:

Outros factores relevantes surgem quando a zona


paralela contm sincronizaes, seja por limitaes da implementao, ou por requisitos do problema que vm a traduzirse em engarrafamentos no desempenho, impedindo assim
a obteno de resultados mais prximos dos que seriam os
teoricamente expectveis, segundo a lei de Amdahl.

O Cluster com Raspberry Pi no novidade, quanto


mais no seja pelo baixo custo de cada computador
Raspberry Pi e pela sua eficincia energtica, o que o torna
apelativo para solues de processamento paralelo para fins
acadmicos e casuais. Mas esta foi a primeira vez que me
decidi a construir um, com apenas dois ns e que me surpreendeu pela positiva. Desta feita usei a distribuio GNU/
Linux Raspbian e o software MPICH, uma implementao de
MPI (Message Passing Interface), distribuda sob o modelo
open-source e com bom suporte para o Raspberry Pi.

MPI (Message Passing Interface):


O MPI um modelo de programao paralela para
multiprocessamento baseado em message-passing, passagem-de-mensagem. Resumidamente consiste num conjunto
de chamadas a bibliotecas que permitem aos multiprocessos comunicarem entre si. Existem diversas implementaes de MPI, no entanto na configurao que apresentada abaixo apenas referida a implementao MPICH.

Preparao:
So precisos dois cartes de memria SD, no caso
do Raspberry Pi Model B, como foi utilizado neste caso, os
respectivos Raspberrys, um switch, cabos de rede para os
ligar ao switch, um PC e alguma pacincia, para seguir todos
os passos da preparao. Ento vamos comear:

As principais vantagens do MPI residem na escalabilidade, compatibilidade, mesmo em sistemas de memria


partilhada, disponibilidade ampla e portabilidade. Como no
existe bela sem seno, as desvantagens do MPI centram-

TEMA DA CAPA
CRIAR UM CLUSTER DE PROCESSAMENTO PARALELO MPI COM RASPBERRIES
1.

Fazer download da imagem da distribuio GNU/


Linux Raspbian, do site http://www.raspberrypi.org/
downloads/

2.

No meu caso usei a imagem da verso 2012-10-28wheezy-raspbian.zip, pois j a tinha nos cartes de
memria com as devidas actualizaes realizadas.
Mas devem ser utilizadas verses mais recentes da
imagem do Raspbian.

3.

Com o dd (GNU/Linux), o win32 disk imager


(Windows) ou o Disk Utility (Mac), coloca-se a imagem do Raspbian descarregada anteriormente no
carto SD a ser utilizado no primeiro n.

4.

Uma vez colocado o carto no Raspberry, basta liglo corrente, a uma consola ou rede para lhe podermos aceder, e continuar para os passos seguintes
de instalao e configurao.

5.

Instalao do MPICH:

1.

$ sudo apt-get update


$ sudo apt-get upgrade
2.

$ sudo raspi-config

b.

Escolher no menu a opo expand_rootfs,


que vai expandir a filesystem para todo o carto de memria

Agora, antes de descarregar o MPICH, devemos ter


em mente o seguinte: se instalarmos o gfortran, vamos ter de o remover quando formos compilar o
MPICH. Se no o instalarmos, no o teremos de remover. Caso se pretenda instalar, o comando o
seguinte:
$ sudo apt-get install gfortran

3.

Neste quarto passo, expande-se a partio do sistema operativo, de forma a ocupar todo o espao disponvel no carto de memria, uma vez que se usou
uma imagem e ela no utiliza a totalidade do espao
disponvel. Para o fazer basta seguir os passos que
se indicam:
a.

Nesta fase comeamos por actualizar o sistema operativo com os comandos:

Como vamos descarregar o cdigo fonte e compilar


de seguida, neste passo cria-se a directoria para onde ser extrado o ficheiro com o cdigo fonte, utilizando os seguintes comandos:

$ mkdir /home/pi/mpich2
$ cd ~/mpich2
4.

Neste passo, vamos descarregar o cdigo fonte do


MPICH para o Raspberry, com o seguinte comando:

wget http://www.mcs.anl.gov/research/projects/
mpich2/downloads/tarballs/1.4.1p1/mpich21.4.1p1.tar.gz

Convm ter em ateno descarregar sempre a ultima verso,


bastando para isso ver no site do MPICH. http://
www.mpich.org/downloads/
5.

Agora descomprimimos o cdigo fonte com o seguinte comando:

$ tar xfz mpich2-1.4.1p1.tar.gz

6.

$ sudo mkdir /home/rpimpi/


$ sudo mkdir /home/rpimpi/mpich2-install

Fig2. Expande a partio de sistema operativo


6.

Pelas bvias razes devemos mudar a password do


utilizador root com que arrancamos o Raspberry pela
primeira vez, utilizando o comando:

Aproveitamos a criao de directorias para criar uma


para as builds, evitando com isto misturar ficheiros de
builds com o cdigo fonte:

$ passwd
7.

Antes de compilar, criamos directorias para armazenar os ficheiros do MPICH compilados, para ser mais
fcil localiz-los de futuro e nos prximos passos,
utilizando
os
seguintes
comandos:

$ mkdir /home/pi/mpich_build

Faz-se reboot e inicia-se a instalao do MPICH

7.

10

Neste passo e dada a simplicidade, optei por incluir


alguns procedimentos no mesmo passo. Vamos pre-

TEMA DA CAPA
CRIAR UM CLUSTER DE PROCESSAMENTO PARALELO MPI COM RASPBERRIES

parar a build que vamos usar. Como so procedimentos que no meu caso ainda demoraram um pouco,
recomendo a quem esteja a seguir estes passo, seguir o meu exemplo e ir buscar uma caneca de caf,
ou ch, conforme o gosto! Vai dar jeito para o resto
das tarefas!

10.

Verificamos se a instalao foi executada, com os


seguintes comandos:

$ which mpicc
$ which mpiexec
11.

$ cd /home/pi/mpich_build
$ sudo /home/pi/mpich2/mpich2-1.4.1p1/configure prefix=/home/rpimpi/mpich2-install

Voltamos para a directoria home e criamos uma directoria de testes:

$ cd ~
$ mkdir mpi_testing
$ cd mpi_testing
12.

E estamos quase no primeiro teste! Sim, demorou, foi


cansativo, mas vale bem a pena. Mas antes do teste
uma
ltima
configurao:

$ nano machinefile
Acrescentamos numa nica linha o IP do Raspberry,
no meu caso 192.168.5.2
13.

E o teste propriamente dito, com o seguinte comando:

$ mpiexec -f machinefile n 1 hostname


O output do comando deve ser o nome do Raspberry,
por default ser raspberrypi
14.

8.

Preparada a build que vamos usar no Raspberry,


hora de make: E como isto demora, aproveita-se a
bebida do passo 7, para aquecer! No meu caso foi a
bebida e o jornal das duas na TV. um procedimento demorado, mas est quase, precisa pacincia.

$ cd /home/pi/mpi_testing
$ mpiexec -f machinefile -n 2 ~/mpich_build/
examples/cpi

$ sudo make
$ sudo make install
9.

E pronto, o n master, est pronto a funcionar! At


aqui pode ter sido aborrecido e o exemplo j pronto
para testar no um ol mundo como seria expectvel. No MPICH vem por default um exemplo em C
para calcular o valor de pi. Podemos execut-lo da
seguinte
maneira:

O output ser algo como:


Process 0 of 2 is on raspberrypi
Process 1 of 2 is on raspberrypi

Neste momento com o MPICH compilado chegamos


quase ao momento de instalar, mas antes disso,
acrescentamos $PATH, a path de instalao:

pi is approximately 3.1415926544231318, Error is


0.0000000008333387

$ export PATH=$PATH:/home/rpimpi/mpich2-install/bin
Criando o segundo n:

Caso seja nossa ideia acrescentar esta path $PATH


de forma permanente, editamos o ficheiro .profile e
acrescentamos as linhas como se segue:

Feito tudo at aqui, chegou a hora de criar uma imagem do


carto de memria usado no Raspberry, para criarmos os
ns do MPICH. Esta fase difere conforme o sistema operativo que estamos a usar, seja Windows, GNU/Linux ou Mac.

$ export PATH=$PATH:/home/rpimpi/mpich2-install/bin
Caso o utilizador prefira, poder seguir as seguintes
instrues em alternativa instruo anterior:

1.

$nano ~/.profile

Primeiro passo fazer o shutdown ao Raspberry,


com
o
seguinte
comando:

$ sudo poweroff

# Add MPI to path


PATH="$PATH:/home/rpimpi/mpich2-install/bin"

11

TEMA DA CAPA
CRIAR UM CLUSTER DE PROCESSAMENTO PARALELO MPI COM RASPBERRIES
2.

3.

4.

Verificamos que o ficheiro authorized_keys j existe


no segundo Raspberry. Isto importante, porque de
agora em diante no temos de digitar a password a
cada autenticao entre ns do Cluster.

Agora retiramos o carto de memria e utilizamos um


software para criar a imagem do carto de memria
em ficheiro, para utilizar no segundo carto de memria. Conforme o sistema operativo que se esteja a
utilizar, o software vai variar. No meu caso foi o dd,
pois fiz todos os passos em GNU/Linux. Temos de
escolher um nome para a imagem, e como neste caso do n principal (master) ficaria algo como
raspbian_backup_mpi_master.img

4.

Feito o passo anterior, agora fazer o inverso (gravar


a imagem num novo carto de memria), que ser
usado no 2 n do Cluster e servir para criarmos os
restantes ns.

$ nano machinefile

Ligado o segundo Raspberry e contando que a rede


esteja a fornecer o servio de DHCP, basta executar
o comando ifconfig para ver o endereo ip do segundo Raspberry.

192.168.5.2
192.168.5.3

Neste ficheiro colocamos os IPs das duas mquinas


que
compe
o
Cluster.
No
meu
caso:

Gravamos o ficheiro e temos o Cluster com dois ns


pronto a testar!

Configurando o segundo Raspberry:

Antes de testar convm lembrar que no alteramos o nome


do segundo Raspberry, por isso pode eventualmente gerar
alguma confuso. No meu caso alterei manualmente, mas
creio que em cenrios com diversos hosts seria mais simples
criar um script para alterar os hostnames.

Nesta fase vamos configurar o segundo n do Cluster, no


segundo Raspberry que decidamos usar.
Todos os comandos que se seguem, deve ser executados
no n principal do nosso Cluster MPI, neste caso o nosso
primeiro Raspberry.
1.

Testando o Cluster com dois Raspberry:

Ligados por SSH ao nosso Raspberry principal (n


master), comeamos por criar um key-pair (par de
chaves) RSA para no termos de estar sempre a introduzir a password entre ns do Cluster. Esta configurao pode ter outras aplicaes, por exemplo se
temos um Raspberry ligado a uma rede pblica e
queremos alguma segurana adicional. Para configurar correctamente executamos os seguintes comandos:

1.

No n principal digitamos o comando abaixo, para


executar o mesmo exemplo que executmos inicialmente. A diferena agora que sero dois ns a executar o programa exemplo. Relembremo-nos que no
alteramos o nome de host de nenhum dos Raspberry:

$ cd /home/pi/mpi_testing
$ mpiexec -f machinefile -n 2 ~/mpich_build/
examples/cpi
Ao executar o cdigo reparamos que o output ligeiramente diferente:

$ cd ~
$ ssh-keygen -t rsa C raspberrypi@raspberrypi

Process 0 of 2 is on raspberrypi
Process 1 of 2 is on raspberrypi

Escrevemos uma palavra passe escolha, mas no


convm, apesar de ser possvel, deixar a palavra chave
vazia.
De seguida executamos o seguinte comando para
criar o ficheiro com as chaves que sero usadas e
copi-las para o segundo Raspberry:

pi is approximately 3.1415926544231318, Error is


0.0000000008333387
Note-se que apenas tivemos de reintroduzir a palavra
-chave que criamos na configurao das chaves RSA
uma vez, se repetirmos, no ser pedida a chave.

$cat ~/.ssh/id_rsa.pub | ssh pi@192.168.5.3


"mkdir .ssh;cat >> .ssh/authorized_keys"
2.

Uma vez ligados ao segundo Raspberry vamos editar


o ficheiro machinefile onde esto os endereos das
mquinas (ns) do nosso Cluster, com o seguinte
comando:

Criando mais ns:

Agora ligamos ao segundo Raspberry utilizando ssh


com o seguinte comando:

Para criar mais ns na rede os passos so semelhantes,


mas um pouco mais simplificados, como veremos de seguida:

$ssh 192.168.5.3
3.
Uma vez ligados ao segundo Raspberry, se executarmos
o
seguinte
comando:

1.

$ ls al ~/.ssh

Primeiro passo fazer o shutdown ao Raspberry,


com o seguinte comando:

$ sudo poweroff

12

TEMA DA CAPA
CRIAR UM CLUSTER DE PROCESSAMENTO PARALELO MPI COM RASPBERRIES
2.

Agora retiramos o carto de memria e utilizamos um


software para criar a imagem do carto de memria
em ficheiro, para utilizar no segundo carto de memria. Conforme o sistema operativo que se esteja a
utilizar, o software vai variar. No meu caso foi o dd,
pois fiz todos os passos em GNU/Linux. Temos de
escolher um nome para a imagem, e como neste caso do n trabalhador (worker) ficaria algo como
raspbian_backup_mpi_worker.img.

3.

Feito o passo anterior agora fazer o inverso (gravar


a imagem num novo carto de memria), que ser
usado no novo n do Cluster e servir para criarmos
os restantes ns.

4.

so e montagem de Clusters de computadores tornou-se bastante mais simplificado. Neste artigo apenas se pretende
apresentar de forma simples as instrues necessrias para
construir um Cluster MPI de baixo custo, recorrendo aos
pequenos computadores Raspberry Pi, pelo que no se explica em detalhe programao paralela, nem computao
paralela. Existe diversa documentao de qualidade disponvel, para alm do artigo Paralelizao de aplicaes com
OpenMP publicado na edio n 46 da Revista PROGRAMAR.
Boas experincias!
Bibliografia:
G. Amdahl, Validity of the single processor approach to
achieving large scale computing capabilities http://goo.gl/
H0OpSw

Inserimos o carto agora gravado no terceiro


Raspberry e ficamos com trs Raspberrys funcionais,
e assim por diante.

Debian Clusters for Education and Research: The Missing


Manual http://goo.gl/xtnu3f

Concluso:
Como se pode ver ao longo do artigo, existem diversas razes para se recorrer computao paralela e o aces-

AUTOR
Escrito Por Antnio Santos
Entusiasta da tecnologia desde tenra idade, cresceu com o ZX Spectrum, autodidacta com uma enorme paixo por tecnologia, tem vasta experincia em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvimento de software
nas mais diversas linguagens. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio. Diplomado do Curso de Especializao Tecnolgica em Tecnologias e Programao de Sistemas de Informao. @apocsantos

13

A PROGRAMAR
Como fazer merge de diferentes verses de cdigo gerado pelo Windows
AppStudio
Cortana: A assistente pessoal digital da Microsoft chega ao PC e Tablets.
Produzir ficheiros no formtado ODF Open Document Format em .NET
Ordenao Genrica em C

A PROGRAMAR

Como fazer merge de diferentes verses de cdigo

gerado pelo Windows AppStudio


Este artigo tem como objetivo mostrar uma soluo
para fazer merge de diferentes verses de cdigo gerado
pelo Windows App Studio, usando uma ferramenta gratuita
chamada Source Tree.

No fim da verso ser gerada possvel obter os


packages para instalar nos dispositivos e possvel obter o
cdigo fonte, como podemos ver na imagem seguinte:

Introduo
O Windows App Studio um servio que permite
qualquer pessoa, sem conhecimentos de programao, criar
aplicaes Windows Phone 8.1 e Windows Store apps em
apenas 4 passos: ter uma ideia, adicionar contedo,
escolher os estilos e por fim usar a aplicao. Este servio
fornece vrios templates para ajudar a criar vrios tipos de
aplicaes e com isto a criao das aplicaes ir ser mais
rpido.
Quando uma aplicao criada no Windows
App Studio possvel obter o cdigo fonte para se poder
correr a aplicao no simulador ou em qualquer dispositivo
Windows Phone 8.1 ou Windows 8.1, com o objetivo de testar a aplicao, e ainda pode-se adicionar novas funcionalidade ou alterar alguma existente. Desta forma,
um utilizador que pretenda alterar a aplicao no Visual Studio e no Windows App Studio vai ter que fazer a gesto de
verses, uma vez que o Windows App Studio no permite fazer upload da verso alterada no Visual Studio. E em
alguns casos necessrio fazer o merge de verses para
que a aplicao final contenha todas as alteraes ao longo
do tempo.

No fim de extrair o contedo obtido iremos ter algo do


gnero:

Neste artigo vamos ver uma soluo que ir facilitar o


processo de merge entre verses usando uma ferramenta
gratuita, o Source Tree que disponibiliza uma GUI para gerir
repositrios e ser usado repositrios GIT.
Descrio
Suponhamos que crimos uma aplicao no Windows
App Studio, usando o template "Empty App", e de seguida
geramos a aplicao (mesmo sem fazer qual alterao). Para ajudar na gesto de verses, digamos que iremos
gerar a verso 1.0.0.0.

15

Antes de efetuar alteraes no Visual Studio importante guardar esta verso no "controlo de verses", mas para
isso necessrio a ferramenta Source Tree.
Depois de se instalar o Source Tree, deveremos abrir
a aplicao para iniciarmos o processo de controlo de verses.

A PROGRAMAR
COMO FAZER MERGE DE DIFERENTES VERSES DE CDIGO GERADO PELO WINDOWS APPSTUDIO

Para comear, devemos clicar em Clone/New e em


seguinda devemos clicar em Create new repository, como
podemos ver na imagem seguinte:

Nota: A pasta .git uma pasta escondida que no pode ser


apagada, uma vez que nesta pasta que o GIT ir gerir as
verses e o Source Tree ir usar isto atravs do GIT.
Portanto, uma vez que j temos o cdigo na pasta do
repositrio, ao voltarmos para a aplicao Source Tree, iremos ter algo do gnero:

No fim de termos todos os campos preenchidos


devemos clicar em Create para desta forma criarmos o
repositrio GIT na pasta pretendida, visualmente iremos ter
uma representao grfica como descrita na imagem
seguinte:

O que significa que os ficheiros adicionados esto no


estado "Unstaged files" e uma vez que pretendemos guardar
a informao de todos os ficheiros, devemos pass-los
para Staged file, cujo resultado apresentado na imagem
seguinte:

Se clicarmos em Open in Explorer iremos abrir a pasta onde


se encontra o repositrio e de seguida devemos copiar o
cdigo obtido anteriormente para esta pasta, cujo o resultado
ser:

Desta forma, podemos fazer um "commit", que no


mais do que guardar uma verso do cdigo.

16

A PROGRAMAR

COMO FAZER MERGE DE DIFERENTES VERSES DE CDIGO GERADO PELO WINDOWS APPSTUDIO

Para cada "commit" deve ser definido um comentrio


para descrever as alteraes efetuadas, como podemos ver
na imagem seguinte:

De seguida, no Source Tree, podemos ver as alteraes efetuadas:

Depois do comentrio estar definido devemos clicar


em "Commit e o resultado ser algo do gnero:

Desta forma, iremos ter o ficheiro App.xaml


no "Unstaged files" e do lado direito podemos ver as
alteraes do ficheiro, sendo que a vermelho destacado a
informao que foi removida e a verde a informao
adicionada.
Efetuando um novo
anteriormente, iremos ter

"commit"

como

foi

descrito

Neste momento, temos a verso inicial do Windows


App Studio e a alterao feita no Visual Studio. Voltemos
agora ao Windows App Studio para efectuar as seguintes
alteraes:

Neste momento a primeira verso do cdigo est


guardada e podemos proceder s alteraes do cdigo no
Visual Studio. Por exemplo, podemos alterar o Application
Name e o Application Title definido no App.xaml, como
podemos ver na imagem seguinte:

Alterao do nome da aplicao para


Band News

Microsoft

Adicionar o feed da pgina do facebook https://


www.facebook.com/MicrosoftBand

17

A PROGRAMAR
COMO FAZER MERGE DE DIFERENTES VERSES DE CDIGO GERADO PELO WINDOWS APPSTUDIO

Depois destas alteraes, podemos generar uma nova


verso, digamos que ser a verso 2.0.0.0:

Para alm de passarmos os ficheiros para "Stage


files", possvel faze-lo passando apenas blocos ou linha de
cdigo, sendo tambm possvel discartar as alteraes.
Para o caso de querermos discartar um bloco de
cdigo, devemos clicar no "Discard hunk", como podemos
ver na seguinte imagem:

Assim que a nova verso tiver disponvel, devemos copiar o cdigo para a pasta que contm o repositrio e
no Source Tree iremos ver todas as diferenas entre as duas
verses:

Para o caso de discartar uma linha, devemo


selecciona-la e depois clicar em "Discard lines", no entanto
preciso discartar a "verde" e a "vermelha".

Desta forma, cada alterao pode ser seguida e


possvel visualmente ver todas as alteraes, e claro o utilizador pode aceitar e rejeitar consoante os requisitos da aplicao.
Concluso

Em "Unstaged files", os icons a amarelo significa que o


ficheiro foi alterado e o icons a azul significa que o ficheiro foi
adicionado. Selecionando cada ficheiro iremos ver do lado
direito as diferenas (a verde teremos as novas alteraes e a
vermelho o que foi removido).

Em concluso, usando uma ferramenta com o Source


Tree possvel fazer merge de cdigo de uma forma simple sem ser necessrio conhecimento sobre versionamento
de cdigo.

Por exemplo, se selecionarmos o ficheiro App.xaml,


iremos ter:

AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra e Microsoft Certified Profissional Developer. Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps. O seu Blog
www.saramgsilva.com e o twitter @saramgsilva.

18

A PROGRAMAR

Cortana: A assistente pessoal digital da Microsoft chega ao PC e Tablets

Introduo
A Microsoft no passado ms de Janeiro fez um dos
anncios talvez mais aguardados pelos utilizadores Windows:
A integrao nativa da assistente digital da Microsoft A Cortana no Windows 10.
A Cortana, uma das principais novidades em 2014 no
Windows Phone, estar presente no desktop de todos os PCs
e Tablets que tenham o Windows 10 instalado, ajudando os
utilizadores nas mais inmeras tarefas do dia-a-dia e sempre
baseado nas suas escolhas. A introduo da Cortana no Windows 10 vem demonstrar claramente a inteno da Microsoft
em unificar a experincia de utilizao entre os vrios devices.

A forma como interagimos com a Cortana, vai depender do ambiente onde nos encontramos e tambm do tipo de
equipamento que tivermos, mas sempre assente em dois
princpios: A voz e a escrita. Atravs do comando de
voz Hey Cortana conseguimos captar a sua ateno!
Hello, what can I do for you?
A Cortana pode executar das tarefas mais simples,
como adicionar um compromisso ao nosso Calendrio, mostrar o estado do tempo no local onde nos encontramos, sugerir feeds de notcias, etc., a tarefas com mais alguma complexidade. Estas no so as suas nicas capacidades e
medida que a Microsoft vai avanando com o desenvolvimento desta tecnologia, podemos ver a Cortana a fazer chamadas Skype, definir novos lembretes ou at ditar mensagens, possibilitando assim a multitarefa.

Notebook da Cortana
A partir destas informaes e do Bing, todos os resultados de pesquisa que a Cortana efetuar, so mostrados na janela da barra de Search localizada na Taskbar do Windows 10.

A estas podemos ainda juntar o reconhecimento de


voz, a capacidade de interpretar o smbolo # como
hashtags e a aprendizagem de novas lnguas, como a do
Yoda por exemplo.
Cortana e o Project Spartan
A Cortana enquanto assistente pessoal, no ser
parte integrante apenas do Windows Phone ou Windows 10.
A Microsoft est a desenvolver um Browser completamente
novo, atualmente com o nome de cdigo Project Spartan e
onde a Cortana tem um papel importante a desempenhar. A
Cortana ir escutar atentamente o que escrevemos no
Browser e de imediato poder apresentar os resultados dessas mesmas pesquisas, como por exemplo o tempo, informaes uteis sobre determinado voo, onde fica um determinado restaurante etc. e tendo sempre em considerao tambm o que sabe sobre ns e que est igualmente registado
no Notebook.

Barra de Search

19

A PROGRAMAR
CORTANA: A ASSISTENTE PESSOAL DIGITAL DA MICROSOFT CHEGA AO PC E TABLETS.

Com a janela das opes abertas, vamos clicar na


opo Time & Language e em seguida, clicar no separador Region & Language.

Cortana & Project Spartan


Experimentar a Cortana
Para experimentar algumas nas funcionalidades j disponveis, os utilizadores tero que se registar no Windows Insider Program e fazer o download da Build 9926 do Windows
10 Technical Preview, ou fazer a atualizao para esta Build
via Windows Update caso estejam j registados no programa.

Na coluna do lado direito, vamos clicar na combo


box e alterar a regio para United States.

Para saber como se pode registar no Windows Insider


Program, consulte o meu artigo Windows 10: A Nova Gerao
Windows publicado na edio nr.47 desta revista.
Nesta Build em especifico, apenas possvel fazer pesquisas em Ingls (US e UK) mas nos meses que se avizinham
e tal como tem vindo a acontecer com o Windows Phone, veremos a Cortana para desktop a fazer pesquisas em mais lnguas e a abranger um nmero maior de mercados.
Apesar de no estarmos num dos mercados j referidos, podemos experimentar a Cortana em Portugal desde que
tenhamos instalado uma das verses inglesas.
Para isso teremos que alterar uma definio no Windows 10. Vejamos qual e como proceder:
A partir
app Settings.

do

Start

Menu,

vamos

abrir

nova

Depois de concluirmos os passos anteriores,


ao clicar pela primeira vez no Search, seremos notificados
para configurar a Cortana e iniciar sesso com a nossa Microsoft Account caso estejamos a utilizar uma conta
local.
Aps estas configuraes, a Cortana est pronta a
interagir connosco.

20

A PROGRAMAR

CORTANA: A ASSISTENTE PESSOAL DIGITAL DA MICROSOFT CHEGA AO PC E TABLETS.

Agora que temos as configuraes terminadas e a Cortana pronta a utilizar, podemos ainda "humanizar" ainda mais
esta interao e ativar a funcionalidade "Hey Cortana" e que
activar a mesma a partir desde comando de voz.

Para isso, vamos clicar na caixa de Search localizada


na barra de tarefas, em seguida clicar no cone localizado
no canto superior esquerdo e que possui o formato de um
"hamburger" (App Command Menu) e selecionar a opo "Settings".

Vamos em seguida localizar a opo "Let Cortana


respond
when
you
say
"Hey
Cortana"." e clicar no boto para mudar o seu estado para "ON".

Concluso
Em concluso, apesar da Cortana no Windows 10
Technical Preview no mostrar todas as suas potencialidades e conter algumas falhas previsveis, podemos ainda assim dizer que os resultados so satisfatrios. clara a aposta da Microsoft nesta tecnologia e se existir uma evoluo no
caminho certo, com certeza que a expanso a outros produtos/servios ser uma realidade.

A forma como interagimos com a Cortana, vai depender do


ambiente onde nos encontramos e tambm
do tipo de equipamento
que
tivermos,
mas
sempre assente em
dois princpios: A voz e
a escrita. Atravs do
comando de voz Hey
Cortana conseguimos
captar a sua ateno!
Hello, what can I do for
you?

A partir deste momento, a Cortana ir responder sempre que utilizarmos o comando de voz "Hey Cortana".

AUTOR
Escrito por Nuno Silva
Microsoft MVP Windows Expert - Consumer |
Microsoft Technical Beta Tester

21

A PROGRAMAR
Produzir ficheiros no formato ODF Open Document Format em .NET

2.

Introduo
Um dos desafios com que os programadores se deparam
com alguma frequncia a criao de documentos de forma
automtica, de modo a optimizar e a reduzir o trabalho manual
em aplicaes de produtividade.
Quando o programador tem sua disposio aplicaes
Microsoft Office, o seu trabalho est mais facilitado, especialmente se conjugado com tecnologia .NET. Mas, se quiser produzir documentos num formato aberto, como o ODF Open
Document Format , a documentao existente muito escassa e as bibliotecas disponveis so quase nulas e muito fracas.
Foi a necessidade de produzir documentos de texto ODF
(ODT) em grande nmero, a partir de informao em bases de
dados, que me levou a conhecer melhor este formato de ficheiros. A partir do conhecimento do formato ODF, foi possvel
desenvolver um mecanismo simples para o preenchimento de
modelos de documentos de texto.
O intuito deste artigo demonstrar como podemos preencher documentos atravs de um modelo j existente. O desenvolvimento foi feito em ASP.NET, mas o conceito pode ser
extrapolado para qualquer linguagem de programao.
O Formato ODT (ODF para texto)
Para melhor entendermos este processo, necessitamos
compreender a estrutura de ficheiro do documento ODT. Este
documento no mais do que um arquivo ZIP com uma estrutura definida, vrias pastas e ficheiros, a maior parte em XML.
Mais precisamente, trata-se de um ficheiro JAR (Java Archive).
Podemos explorar o contedo de um ficheiro ODT de uma forma simples. Comece por criar o seu modelo de documento
numa aplicao compatvel, por exemplo, no LibreOffice. Experimente fazer o unZIP desse ODT, alterando previamente a
extenso ODT para ZIP, se necessrio. Repare que existem
muitos ficheiros dentro do ZIP. No entanto, para o preenchimento dos modelos, vamos necessitar de utilizar apenas um
desses ficheiros, que poder explorar num editor de texto do
tipo notepad, o ficheiro content.xml.
Este ficheiro contm muitas meta tags, definies de formatao e, bem visvel, o contedo do texto que escreveu no modelo. Facilmente percebemos que, ao alterar o contedo do
content.xml, estamos a alterar o texto do documento ODT. S
teremos que colocar o ficheiro dentro do ZIP, novamente.
H, no entanto, dois critrios a ter em conta, na construo do
ficheiro ZIP:
1.

O ficheiro mimetype dever ser o primeiro ficheiro


do ndice do ZIP.

Com estas duas condies, o ZIP com extenso ODT


um ficheiro vlido.
Requisitos
Em .NET, este processo requer uma biblioteca de compactao ZIP. Neste caso, utilizei a biblioteca DotNetZip
Ionic.Zip.dll para efetuar a compresso do ficheiro ODT. Os
restantes componentes so os nativos de uma framework .NET 3.5 ou superior.
No caso prtico que utilizei, recorri a um HTTP handler
para invocar todo o processo at efetuar o download do ficheiro ODT final e o mostrar no browser. No entanto, para
no estender demasiado o artigo, podemos omitir esta parte
do cdigo e mostrar apenas o processo de criao do ficheiro ZIP. O ficheiro pode ser criado sem um handler, ou at
mesmo em VB/C#, numa aplicao de consola, por exemplo.
Processos
Para este caso prtico de alterao do contedo do documento, no necessitamos de criar o arquivo ZIP de raiz.
Vamos criar um modelo no editor de texto e, programaticamente, apenas necessitamos de recolocar o ficheiro
content.xml dentro do arquivo ZIP.
Sabendo agora que um documento ODT um ZIP com
vrios ficheiros, podemos definir todo o processo do seguinte
modo:
1. Criar o
modelo
ODT no
LibreOffice

2. Descompactar o
ficheiro context.xml de
dentro do
ODT para

3. Ler o
content.xml
para uma
string

6. Colocar o

5. Guardar o
content.xml
numa pasta temporria

4. Substituir
as tags com
dados provenientes
do data
source

novo
content.xml
dentro do ZIP
e apresentlo como ODT

a.

Criar o documento modelo no LibreOffice

O modelo dever ser criado num editor totalmente compatvel com o formato ODF. um processo simples, sem

O ficheiro mimetype no dever estar compactado;

22

A PROGRAMAR

PRODUZIR FICHEIROS NO FORMATO ODF OPEN DOCUMENT FORMAT EM .NET


recurso a qualquer conhecimento tcnico, onde poderemos
formatar o documento a gosto. Deveremos colocar tags nas
partes que pretendemos que sejam substitudas por campos
da base de dados (exemplo: [lb_nome_proprio], onde queremos que aparea o nome prprio constante na base de dados).
Chamemos a este ficheiro, modelo.odt.
De seguida, necessrio descompactar o ficheiro
content.xml de dentro do modelo ODT previamente criado.
Este ficheiro vai ser lido pela nossa aplicao para a substituio das tags pelos valores corretos.
Tanto o modelo.odt como o ficheiro content.xml vo ser
acedidos pela aplicao para gerar o novo documento, pelo
que devero estar acessveis no .NET.

fileContents = fileContents.Replace("[tag_nome]", r
(4).ToString)
c)

Guardar o novo ficheiro content.xml numa rea temporria:

Dim content_xml_generated_folder As String =


System.Web.HttpContext.Current.Server.MapPath
("modelos\tmp\")
Dim content_xml_generated_file As String =
content_xml_generated_folder & "content.xml"
My.Computer.FileSystem.WriteAllText
(content_xml_generated_file, fileContents, False)
c.

Gerar o ficheiro ZIP/ODT

Depois de criado o ficheiro com o novo contedo do documento, necessrio coloc-lo novamente dentro do arquivo ZIP com extenso ODT. Vamos clonar o modelo.odt,
carregando-o em memria, substituir pelo novo content.xml
e gravar o modelo com outro nome.
Exemplifica-se com um procedimento bsico que dever
ser personalizado para criar ficheiros com sequncia numrica, por exemplo, para que no se substituam sempre que
invocado o procedimento:

b.

Ler e processar o content.xml

A partir desta etapa, vamos meter as mos na massa e


comear a programar. A partir do .NET, vamos criar um procedimento para ler o content.xml para uma string e alter-la ao
nosso gosto, de modo a preencher o documento final com os
dados necessrios.
a)

Criar uma funo para ler o ficheiro content.xml

Dim content_xml As String =


System.Web.HttpContext.Current.Server.MapPath
("modelos\content.xml")
Dim fileContents As String =
My.Computer.FileSystem.ReadAllText(content_xml)
b)

e efetuar uma string.Replace das tags pelos dados provenientes da base de dados:

23

Private Sub atualizar_odt(ByVal content_xml_file _


As String, ByVal modelo_odt_file As String)
Dim tmp_folder As String = _
System.Web.HttpContext.Current.Server.MapPath _
("modelos\tmp\")
Dim modelo_file_generated As String = _
tmp_folder & ""
Using zip As ZipFile = Ionic.Zip.ZipFile.Read _
(modelo_odt_file)
'Cria um novo objeto do tipo ZipFile, cpia
'do modelo.odt'
'Atualiza o novo ficheiro content.xml no
'zip modelo.odt'
.zip.UpdateItem(content_xml_file, "")
Dim filePerm As New FileIOPermission _
(PermissionState.Unrestricted, tmp_folder)
.filePerm.Assert()
'Stream do contedo do zip para memria'
Dim msZippedContent As New MemoryStream
.zip.UseZip64WhenSaving = Zip64Option.Never
.zip.TempFileFolder = tmp_folder
'Escreve o stram de memria em filesystem'
.zip.Save(msZippedContent)
'Mtodo para fazer download automtico,
'opcional'
.HttpContext.Current.Response.ClearContent()
.HttpContext.Current.Response.Clear()
.HttpContext.Current.Response.ContentType = _
"application/zip"
.System.Web.HttpContext.Current.Response.AddHeader_
("Content-Disposition", "attachment; _
filename=NOVO_DOC.odt")
.msZippedContent.WriteTo _
(HttpContext.Current.Response.OutputStream)
.HttpContext.Current.Response.End()
.HttpContext.Current.ApplicationInstance. _
CompleteRequest()
End Using
End Sub

A PROGRAMAR
PRODUZIR FICHEIROS NO FORMATO ODF OPEN DOCUMENT FORMAT EM .NET
Concluso
O processo de criao de um documento ODT no complexo. No entanto, cri-lo de raiz um trabalho moroso. J
existem algumas bibliotecas para o efeito mas, mesmo assim,

() o programador tem sua disposio aplicaes Microsoft Office, o seu


trabalho est mais facilitado,
especialmente
se conjugado com tecnologia .NET. () se
quiser produzir documentos num formato
aberto, como o ODF
Open Document Format , a documentao
existente muito escassa e as bibliotecas
disponveis so quase
nulas e muito fracas
()

gerar todo o documento programaticamente continua a ser


demorado e exige muito cdigo.
Para o preenchimento de documentos com base num
modelo, encontrei esta soluo prtica. A criao de um modelo no LibreOffice extremamente rpida. A alterao do
modelo simples. Se criarmos um procedimento comum na
nossa biblioteca de cdigo para invocar a criao do ODT
com base num modelo, podemos criar relatrios, formulrios,
cartas, etc., com extrema facilidade e muito rapidamente.
Bibliografia recomendada
Estrutura do documento
odbook/book.html

ODT:

http://books.evc-cit.info/

O ficheiro JAR: http://en.wikipedia.org/wiki/JAR_(file_format)


DotNetZip Library: http://dotnetzip.codeplex.com/

AUTOR
Escrito por Ricardo Trindade
actualmente o responsvel pela rea informtica dos Servios Sociais da Cmara Municipal de Lisboa onde efectua, desde
administrao de sistemas, at programao em .NET. Est tambm ligado ao projecto N-Ideias na rea da consultoria,
webdesign e software, trabalhando essencialmente com BD's Oracle, PostgreSQL e SQL Server.

24

A PROGRAMAR
ORDENAO GENRICA EM C

implementaes capazes de ordenar qualquer tipo de


elemento e no apenas de nmeros inteiros.

Introduo
Num artigo anterior [1], falei do problema da construo
de estruturas de dados genricas, isto , estruturas capazes de
manipular diferentes tipos de dados, informados no momento
da criao destas estruturas. No final desse artigo, levantei a
seguinte questo:
como podemos criar uma funo para comparar os
itens de uma estrutura de dados genrica, uma vez que ela
no conhece o seu tipo, priori. Mesmo sabendo qual o tipo
de dado, em alguns casos, no seria possvel compar-los; por
exemplo, quando o tipo de dado uma estrutura complexa,
criada pelo prprio programador, como uma struct para armazenar os dados de um aluno, entre outros.
Para resolver este problema, utilizando a linguagem C,
precisamos de utilizar um recurso conhecido como funes
callback. Este tipo de funo tira proveito do fato de que a linguagem C trabalha com apontadores para funes, isto , podemos passar a uma funo, um apontador que aponta para o
bloco da memria onde est localizada outra funo do sistema (ou at mesmo a prpria funo que recebe o parmetro).
Isto permite que uma determinada funo chame outras funes, mesmo sem ter conhecimentos de quais funes so.

Neste sentido, este artigo tem como objetivo


apresentar o desenvolvimento de um algoritmo de
ordenao simples, o Selection Sort (ordenao por seleo)
de forma genrica, isto , de forma a ser possvel ordenar
qualquer tipo de elemento especificado pelo utilizador, sem
exigir que o cdigo seja modificado.
O algoritmo de ordenao Selection Sort
Selection Sort (ou ordenao por seleo) um dos
algoritmos de ordenao mais simples. O pseudocdigo
desse algoritmo pode ser descrito da seguinte forma:
Selecione o menor elemento do vetor;
Troque-o com o elemento da posio do incio do
vetor (aps isto a posio de incio apontar para a
prxima posio do vetor);
Repita essas duas operaes com os n 1
elementos restantes, depois com os n 2 elementos,
at que reste apenas um elemento.
A Figura 1 ilustra o funcionamento do mtodo de ordenao
Selection Sort, segundo descrito anteriormente.

Neste artigo, pretendo trabalhar com a questo das


funes callback, envolvendo um assunto bastante explorado
nas disciplinas de algoritmos e estruturas de dados, a ordenao. Ordenar o processo de rearranjar um conjunto de objectos numa ordem ascendente ou descendente. A ordenao
visa a facilitar a recuperao posterior de itens do conjunto
ordenado. Imagine, por exemplo, utilizar uma lista telefnica,
na qual os nomes das pessoas no esto organizados por ordem alfabtica. Ou ento utilizar um dicionrio, no qual as palavras no esto listadas em ordem alfabtica.
A maioria dos mtodos de ordenao baseada em
comparao de chaves. Qualquer tipo de chave sobre o qual
exista uma regra de comparao bem definida pode ser
utilizado. De modo anlogo ao que foi comentado em [1],
quando estudamos a disciplina de Algoritmos e Estruturas de
Dados nos cursos de computao e reas afins, em geral,
aprendemos a implementar algoritmos de ordenao capazes
de trabalharem apenas com nmeros inteiros. Isto no
essencialmente um problema, uma vez que o intuito destas
disciplinas apresentar os principais tipos de algoritmos, suas
aplicaes e complexidades de tempo e espao.
Contudo, quando vamos para a prtica, ao utilizarmos
estes algoritmos, seja num trabalho prtico da disciplina ou
outro tipo de situao, o nosso desejo ser trabalhar com

26

Figura 1. Ilustrao do funcionamento do mtodo de


ordenao por seleo.

A PROGRAMAR

ORDENAO GENRICA EM C
Analogamente, a sua implementao na linguagem de
programao C bastante simples, conforme apresentado
na Listagem 1.
void ordenacaoPorSelecao(int vetor[], int n) {
for(int i = 0; i < n - 1; i++) {
int menor = i;
for(int j = i + 1; j < n; j++) {
if (vetor[j] < vetor[menor]) menor = j;
}
int aux = vetor[i];
vetor[i] = vetor[menor];
vetor[menor] = aux;
}
}
Listagem 1. Algoritmo de ordenao SelecionSort.
A segunda instruo for, linhas 4 6, responsvel
por encontrar o menor elemento do vetor, cujos ndices vo de
i + 1 n 1. As linhas 7 9 so responsveis por colocar o
menor elemento identificado na sua posio correta. A primeira
instruo for responsvel por percorrer todo o vetor,
permitindo que todos os elementos sejam colocados no lugar
certo. O valor da varivel i desta instruo representa a
posio atual onde o menor elemento dever ser colocado.
A anlise da complexidade deste algoritmo, em funo
do nmero de comparaes realizadas pelo mesmo, tambm
muito simples. Imagine um vetor de N elementos. Na primeira
execuo, a instruo if ser executada N 1 vezes. Na
segunda, N 2. Na terceira, N 3 e, assim sucessivamente,
at a N-sima 1 vez, na qual a instruo if ser executada
apenas 1 vez. Portanto, o nmero de comparaes, C(n),
realizada por este algoritmo dado por:
C(n) = 1 + 2 + 3 + ... + N -1
C(n) = [(N-1) * (N 1 + 1)]/2
C(n) = (N2 N)/2
Resumindo, em termos do nmero de comparaes,
este algoritmo da classe quadrtica, O(n2), de complexidade
de tempo. Quanto ao nmero de iteraes realizadas pelo
algoritmo, a anlise ainda mais simples. Ao executar o
algoritmo passo a passo possvel observar que ele ir
sempre realizar N 1 iteraes para um vetor de tamanho N.
Ou seja, em termos da quantidade de iteraes realizadas pelo
algoritmo, Selection Sort da classe de complexidade linear: O
(n). Este um resultado interessante para o nmero de
iteraes, quando comparado a outros algoritmos de
ordenao, como o Bubble Sort ou o Insertion Sort, nos seus
piores casos.
Outra caracterstica interessante deste algoritmo de
ordenao que apresenta a mesma complexidade, qualquer
que seja a configurao do vetor de entrada. Isto , dado um
vetor de tamanho N, no importa se o vetor est parcialmente
ou totalmente ordenado, ou se est ordenado inversamente. A
quantidade de comparaes e iteraes a serem realizadas
ser sempre a mesma, caracterstica no presente em outros
mtodos de ordenao, que so sensveis configurao da
entrada, como por exemplo o Insertion Sort, que apresenta um
nmero de comparaes bem menor quanto o vetor est

27

totalmente ou parcialmente ordenado.


Outro ponto que chama a ateno no cdigo da
Listagem 1 que a funo ordenacaoPorSelecao recebe
como parmetro um vetor de nmeros inteiros e um inteiro
que representa o tamanho deste vetor. O fato de receber um
vetor de inteiros, impede-a de trabalhar com conjuntos
referentes a outros tipos de dados, como strings ou at
mesmo tipos complexos, como registos de Alunos, Notas,
Processos, entre outros.
A questo chave : o algoritmo de ordenao tem
como responsabilidade colocar em ordem crescente ou
decrescente um conjunto de registos, cujas chaves possam
ser comparadas de alguma maneira. priori, no
responsabilidade do algoritmo de ordenao saber como
comparar dois registos de um conjunto de dados. Isto est
relacionado com o domnio do problema que est a ser
resolvido com o algoritmo de ordenao. Nesse sentido,
vamos aprender a criar um algoritmo de ordenao genrico,
isto , que seja capaz de ordenar qualquer conjunto de
dados, sem se preocupar com o tipo desses dados.
Selection Sort Genrico
Antes de implementarmos o Selection Sort genrico,
necessrio conhecer o recurso de linguagem C que
utilizaremos para atingir nosso objetivo. Este recurso se
chama funo callback, que pode ser implementado por
meio do uso de apontadores para funo.
Muitos devem conhecer o uso de apontadores em C
para alocao dinmica de memria, bem como para
passagem de parmetros por referncia para funes. Alm
dessas possibilidades oferecidas pelos apontadores,
possvel tambm definirmos apontadores para funes
dentro do nosso programa. Assim, teremos uma varivel que
aponta para uma regio de memria onde no esto
alocados dados, mas sim instrues de alguma funo prdefinida no programa.
Isto permite que direcionemos o fluxo de execuo do
nosso programa para outro ponto, sem a necessidade de
sabermos, partida, para onde estaremos indo. D para
perceber que este um recurso que deve ser usado com
sobriedade, para que no transformemos o cdigo do nosso
programa em um cdigo spaghetti, isto , em que seja
impossvel acompanhar o que acontece durante a
execuo do programa.
O uso de apontadores para funes interessante
quando pretendemos executar alguma rotina e que partes
dessa rotina sejam definidas por outras funes, cuja
definio seja passada por parmetro (funes callback).
A Listagem 2 apresenta um exemplo da utilizao de
apontadores para funes e de uma funo callback. O
cdigo fonte da funo ordenacaoPorSelecao foi omitido,
uma vez que idntico ao apresentado na Listagem 1.

A PROGRAMAR
ORDENAO GENRICA EM C
#include <stdio.h>

variveis e funes, o operador & utilizado antes do


identificador deste elemento.

#include <stdlib.h>
void ordenacaoPorSelecao(int vetor[], int n)
{ ... }
void imprimirVetor(int vet[], int n) {
printf("[");
for(int i = 0; i < n - 1; i++) {
printf("%d ", vet[i]);
}
printf("%d]\n", vet[n - 1]);
}
void ordenacao(int vet[], int n, void (*funcOrd)
(int[],int)) {
printf("Vetor original: "); imprimirVetor(vet,
n);
funcOrd(vet, n);
printf("Vetor ordenado: "); imprimirVetor(vet,
n);
}
int main() {
int vet[5] = {4, 5, 3, 2, 1};
ordenacao(vet, 5, &ordenacaoPorSelecao);
return EXIT_SUCCESS;
}

O maior benefcio est em podermos substituir


facilmente o mtodo de ordenao utilizado na funo
ordenacao. Para fazer isso, bastaria implementar uma nova
funo de ordenao e passar o endereo dela como
parmetro para a funo ordenacao.
Com este exemplo, creio ser fcil imaginar como ser
implementado o mtodo de ordenao Selection Sort
genrico. Como dissemos anteriormente, o mtodo no se
deve preocupar em como os registos so comparados, pois
isso depende do que o utilizador quer ordenar. Sendo assim,
nossa funo callback ser uma funo capaz de comparar
dois registos quaisquer e dizer se eles so iguais ou qual
registo maior do que o outro.
A Listagem 3 apresenta a implementao do
algoritmo de ordenao Selection Sort genrico, bem como a
utilizao do mesmo para ordenar um conjunto de nmeros
inteiros.

Listagem 2. Exemplo de uso funes callback.


Este programa declara um vetor de cinco elementos,
linha 18, e invoca a funo ordenacao, que responsvel por
imprimir o vetor na sua forma original, orden-lo e depois
imprimir novamente o vetor, s que agora ordenado. A sada
da execuo do programa acima a seguinte:
Vetor original: [4 5 3 2 1]
Vetor ordenado: [1 2 3 4 5]
O que interessante, e talvez novo para o leitor, est
nas linhas 12, 14 e 19. A linha 12 apresenta a declarao do
parmetro void (*funcOrd)(int[],int): este parmetro um
apontador para uma funo do programa. Esta funo tem as
seguintes caractersticas: o seu tipo de retorno void, seu
identificador (que ser utilizado para invoc-la dentro da funo
ordenacao) funcOrd e recebe dois parmetros, um vetor de
inteiros e um inteiro.
Neste ponto, estamos a declarar uma funo callback,
ou seja, uma funo que ser invocada a partir de um
apontador, cujo valor ser informado pelo utilizador no
momento da invocao da funo ordenacao.
Veja que a funo ordenacao invoca funcOrd na linha
14, passando os parmetros por ela exigidos, porm
ordenacao no tem conhecimento sobre qual funo est a ser
executada neste momento. Isto que dizer que para a funo
ordenacao no importa saber que algoritmo de ordenao est
a ser utilizado para organizar os elementos do vetor, mas sim,
que eles estaro ordenados aps o trmino da execuo desta
funo.
A ltima linha a ser analisada a 19; nesta linha est a
chamada para a funo ordenacao, passando como parmetro
o endereo de memria onde se encontra alocada a funo
ordenacaoPorSelecao. Para obter o endereo de memria de

28

#include <stdio.h>
#include <stdlib.h>
#define MENOR -1
#define IGUAL 0
#define MAIOR -1
int compararInteiros(void* n1, void* n2) {
int a = *((int*)n1); int b = *((int*)n2);
if (a < b) return MENOR;
else if (a > b) return MAIOR;
else return IGUAL;
}
void ordenacaoPorSelecao(void* vetor[], int n,
int (*comp)(void*,void*)) {
for(int i = 0; i < n - 1; i++) {
int menor = i;
for(int j = i + 1; j < n; j++) {
if (comp(vetor[j], vetor[menor]) ==
MENOR) menor = j;
}
void* aux = vetor[i];
vetor[i] = vetor[menor];
vetor[menor] = aux;
}
}
void imprimirVetor(void* vet[], int n) {...}
int main() {
int a = 4, b = 3, c = 1;
int* vet[3] = {&a, &b, &c};
printf("Vetor original: "); imprimirVetor
(vet, 3);
ordenacaoPorSelecao(vet, 3,
&compararInteiros);
printf("Vetor ordenado: "); imprimirVetor
(vet, 3);
return EXIT_SUCCESS;
}
Listagem 3. Selecion Sort genrico.
Os trechos de cdigo
observados na Listagem 3 so:

importantes

serem

Linhas 7 11: a funo compararInteiros ser


passada
como
parmetro
para
a
funo

A PROGRAMAR

ORDENAO GENRICA EM C

ordenacaoPorSelecao, isto , compararInteiros a


funo callback responsvel por comparar dois registos,
que neste caso, so nmeros inteiros. Esta funo
recebe dois apontadores do tipo void, converte os em
apontador para inteiros para assim poder compar-los.
Caso o utilizador quisesse comparar outros tipos de
dados, bastaria implementar uma funo capaz de
comparar dois registos do tipo desejado;
Linhas 13 23: a funo ordenacaoPorSelecao foi
alterada de modo a que, agora, ela no trabalhe mais
com base num tipo especfico de dados, mas sim com
registos do tipo void, isto , tipos genricos. Alm disso,
outra modificao significativa que esta funo passa
a receber um parmetro a mais, que o endereo de
memria de uma funo capaz de comparar dois
registos do conjunto de dados passado para a funo
ordenacaoPorSelecao. Esta funo declarada como
comp na assinatura da funo ordenacaoPorSelecao e
invocada na linha 17, no momento em que dois
elementos do conjunto de dados precisam ser
comparados;
Linhas 25 32: por fim, a funo main sofreu algumas
pequenas mudanas para comportar a nova
implementao da funo ordenacaoPorSelecao. Por
exemplo, ao invocar a funo ordenacaoPorSelecao, o
endereo da funo comparaInteiros precisou de ser
passado como parmetro.

duplicao de cdigo e facilitar a implementao de


programas que trabalhem com conjuntos de dados de
diversos tipos, garantindo maior flexibilidade ao programa
como um todo, alm de no haver necessidade de
reescrever as mesmas rotinas para se adaptarem as
implementaes que suportem novos tipos de dados, dando
maior flexibilidade ao programador.
vlido realar que esta tcnica se aplica a
linguagens de programao que suportem somente o
paradigma estruturado, como por exemplo a linguagem C,
que foi a linguagem utilizada neste artigo. Em linguagens de
programao mais recentes que suportem o paradigma
orientado a objetos (Java, C++, Python), devido sua
essncia, este paradigma fornece-nos maior suporte para
desenvolver mtodos mais eficientes para realizarmos a
ordenao genrica abordada neste artigo.
Com o conhecimento adquirido neste artigo, fica
como exerccio a implementao de outros algoritmos de
ordenao de forma genrica.
Referncias
Parreira Jnior, P. A. Estruturas de Dados Genricas.
Revista Programar. N 47. Dez/2014. ISSN 1647-0710.

Consideraes Finais
Numa reviso rpida do cdigo da Listagem 3, pode-se
pensar que os benefcios da mudana realizada no
compensaram o esforo necessrio para realiz-la. Contudo,
possvel perceber que a partir deste momento, o algoritmo de
ordenao por seleo est preparado para lidar com qualquer
tipo de dados, desde que seja oferecida uma funo adequada
para comparao de elementos do tipo desejado. Isto evitar

AUTOR
Escrito por Paulo Afonso Parreira Jnior
Actualmente professor do curso de Bacharelado em Cincia da Computao da Universidade Federal de Gois (Regional
Jata). aluno de doutoramento do Programa de Ps-Graduao em Cincias da Computao (PPG-CC) da Universidade
Federal de So Carlos (UFSCar), na rea de Engenharia de Software. mestre em Engenharia de Software pelo Departamento de Computao da UFSCar (2011). integrante do Advanced Research Group on Software Engineering (AdvanSE) do
Departamento de Computao da Universidade Federal de So Carlos e do Grupo de Pesquisa e Desenvolvimento de Jogos
Educacionais Digitais (GrupJED) do Curso de Cincia da Computao da Universidade Federal de Gois (Regional Jata).
Tem experincia na rea de Cincia da Computao, com nfase em Engenharia de Software, atuando principalmente nos
seguintes temas: Manuteno de Software, Desenvolvimento de Software Orientado a Objetos, Desenvolvimento de Software
Orientado a Aspectos e Informtica na Educao.
Escrito por Paulo Henrique Lima Oliveira
Discente do curso de Bacharelado em Cincia da Computao da Universidade Federal de Gois (Regional Jata). Tcnico
em Informtica pelo Instituto Federal de Educao, Cincia e Tecnologia de Gois Campus Jata. Integrante do grupo da
Maratona de Programao do curso de Cincia da Computao da Universidade Federal de Gois. Tem experincia em linguagens de programao (C, C++ e Java) e possui afinidade com desenvolvimento de software voltado para dispositivos
mveis.

29

COLUNAS
C# - Aplicao auxiliar de actualizao

C#
APLICAO AUXILIAR DE ACTUALIZAO

Algoritmo em Fluxograma

Introduo
O artigo tem por objectivo ajudar o leitor a compreender
o algoritmo base por detrs de uma aplicao auxiliar de actualizao. Apenas sero expostos alguns excertos de cdigo
relevantes para uma percepo lgica do objectivo final.
A linguagem de programao escolhida para desenvolvimento no relevante.
Notas
Sempre que haja uma referncia de texto a Aplicao
Pai esta identifica a aplicao principal da qual a aplicao
auxiliar est inerente.
Factores a ter em conta
1.

No guardado nem inserido qualquer tipo de informao confidencial.

2.

Os processos so feitos de forma assncrona permitindo


assim uma interaco mais fluda.

3.

A .NET Framework utilizada neste artigo a 3.5 pelo


que dever correr nas verses superiores sem problema.

Resultado final
O artigo d tambm a conhecer ao leitor como trabalhar
e aceder a diferentes threads sem comprometer a thread principal.

Onde disponibilizo as novas verses?


As novas verses so disponibilizadas numa pasta de
FTP com permisses de acesso externas, sendo que o URL
neste artigo descrito encontra-se sobre o meu servidor pessoal para usos didcticos.
Como informei anteriormente no necessrio guardar qualquer informao confidencial, o URL suficiente.
private static string url = "http://
stuffpinho.com/portugal-a-programar/revista/
artigos/updater/";

32

C#
APLICAO AUXILIAR DE ACTUALIZAO
Qual a formatao do ficheiro de actualizao?

Transferir os ficheiros da verso mais recente

A formatao fica ao critrio do leitor sendo necessrio,


posterior, a adaptao do cdigo para interpretao dessa
mesma formatao.

O mtodo downloadFiles() transfere os ficheiros


necessrios a bom funcionamento da nova verso.

1.0.3
Nomeficheiro.exe
Nomeficheiro.dll
Etc
Sendo a primeira linha a identificao da verso mais
recente e as restantes linhas identificam quais os ficheiros que
devem ser transferidos.
Comparao da verso actual com a mais recente
O primeiro objectivo da aplicao, que deve ser interpretado como decisivo, validar a verso actual da Aplicao
Pai que, por norma, se encontra no mesmo stio da aplicao
auxiliar de actualizao.
private static string path = Path.GetDirectoryName
(Application.ExecutablePath);
// Input: 1.0.3.0
string version = FileVersionInfo.GetVersionInfo
(path + "\\PAP.exe").ProductVersion;
// Input desejado: 1.0.3 (neste artigo)
currentVersion = version.Remove(version.Length 2);
FileVersionInfo encontra-se sobre o namespace System.Diagnostics e permite-nos ter acesso directo s informaes de um ficheiro, seja a verso do mesmo; direitos de autor;
empresa de desenvolvimento; etc.
Para identificarmos a verso mais recente necessrio
transferir o ficheiro denominado (no meu caso) update.txt, bem
como ler a estrutura do mesmo.
Para transferncia de ficheiros externos d-se uso ao
namespace System.Net que nos permite para alm de receber
ficheiros, enviar.
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += (object sender,
AsyncCompletedEventArgs e) => {

Mas antes de transferir necessrio ler (do ficheiro .txt transferido anteriormente) quais os ficheiros disponibilizados e
necessrios.
private string[] getAllFilesToDownload()
{
return File.ReadAllLines(path +
"\\update.txt");
}
private void downloadFiles()
{
// Retorna todas as linhas do ficheiro .txt ~
inclusive a verso.
string[] files = getAllFilesToDownload();
bool stop = true;
foreach (string file in files)
{
/*
* Visto que a primeira linha a verso da
* aplicao, no
* existe nenhum ficheiro para ser
* transferido, portanto
* ignora-se a linha.
* A soluo passa por criar a varivel
* booleana `stop` ou
* se o leitor preferir, eliminar a primeira
* linha.
*/
if (stop == true) { stop = false;
continue; }
WebClient webClient = new WebClient();
/*
* Exemplo de output final:
* (Download) url + file = ../updater/
nomeFicheiro.dll
* (DownloadTo) path + file =
C:\pasta\nomeFicheiro.dll
*/
webClient.DownloadFileAsync(new Uri(url +
file), path + "\\" + file);
/*
* O download feito atravs da funo
* DownloadFileAsync()
* o que implica que, se houverem mltiplos
* ficheiros a
* serem transferidos ao mesmo tempo, poder
* causar
* uma abrupta falha na aplicao. O ideal
* ser ento
* verificar, dentro do ciclo, se a
* transferncia
* encontra-se concluda e s a passar para
* a prxima
* linha.
*
* Se o leitor prefeir pode utilizar uma
* varivel
* auxiliar em vez de verificar o valor da
* progressbar
*/

latestVersion = getLatestVersion();
if (latestVersion == currentVersion) {
/*
* A aplicao encontra-se actualizada.
* 1. Eliminamos o ficheiro Update.txt;
* 2. Executamos novamente a Aplicao Pai;
* 3. Fechamos a aplicao auxiliar;
*/
return;
}
downloadFiles();
};
webClient.DownloadFileAsync(new Uri(url +
"update.txt"), path + "\\update.txt");

while (this.progress_bar.Value != 100)


{

33

C#
APLICAO AUXILIAR DE ACTUALIZAO

Concluso

Application.DoEvents();
}

}
/*
* A aplicao encontra-se actualizada.
* 1. Eliminamos o ficheiro Update.txt;
* 2. Executamos novamente a Aplicao Pai;
* 3. Fechamos a aplicao auxiliar;
* 4. A aplicao est oficialmente
* actualizada!
*/

Emsuma,aaplicaoauxiliarparteintegralda
AplicaoPaiquepossibilitaaoclientenalestarsemprea
pardasactualizaesdeformamaisrpidaeobjec va.
Linksdereferncia
Download do projecto - http://goo.gl/mYjjps

AUTOR
Escrito por Fbio Pinho
Programador entusiasta nas mais diversas linguagens, sendo PHP, .NET e Java (Android) as suas preferncias.

34

Media Partners da Revista PROGRAMAR

Anlises
Compiladores Da Teoria Prtica
Gesto de Projetos de Software (5. Edio Atualizada)

Review
Compiladores - Da Teoria Prtica

A introduo do livro riqussima, clara e concisa,


bem acompanhada por elementos grficos relevantes e bem
suportada por palavras que preparam o terreno, e tambm
aguam, de certa forma, a vontade de mergulhar nos seguintes captulos, que parecem ser, alis, dignos de servir de
suporte organizao de uma "cadeira" universitria a julgar
por a sua estrutura.

Ttulo: Compiladores
Subttulo: Da Teoria Prtica
Autores: Pedro Reis Santos
e Thibault Langlois
Editora: FCA - Editora de Informtica
Pginas: 444 (461
com referncias e glossrio, 480 no total)
ISBN: 978-972-722-768-6

Estes blocos so
essenciais e proporcionam
excelentes
"milestones" de conhecimento ao leitor que
ajudam a consolidar as
ideias contidas nos pargrafos anteriores ao
mesmo tempo que proporcionam uma aplicao dessas mesmas
ideias.

Compiladores Da Teoria Prtica , facilmente, uma


referncia para o que um livro tcnico de qualidade deveria
ser.
Em primeiro lugar, est presente uma forte segmentao dos temas, evidente por o extenso ndice disponvel, que
nos permite localizar com exactido um assunto particular de
um outro mais abrangente. Isto muito importante e serve
na perfeio os propsitos do pblico alvo desta obra.
De acordo com o resumo dos autores, o livro destinase a " () estudantes de nvel universitrio e profissional,
produtores de software, programadores e utilizadores em
geral () ", se bem que possa ser necessria alguma cautela com o termo "geral" pois o contedo, e at mesmo os textos introdutrios j pressupem algumas noes que vo
para alm do domnio da curiosidade, com boa capacidade
de afugentar os menos persistentes. Mas isto no algo
mau. Pelo contrrio.
A obra alonga-se por 15 captulos, divididos por duas
partes:

Anlise determinista de linguagens

Sntese de cdigo

Cada captulo est subdividido em pequenos blocos,


bem definidos.
O principal objetivo do livro dar a conhecer o funcionamento interno de um compilador no s na anlise da
linguagens mas tambm na gerao de cdigo. Por conseguinte, conseguir responder a algumas questes que levam
algumas linguagens a ter determinadas caractersticas, bem
como as suas limitaes. A referncia prtica cumpre-se
com o acompanhamento do desenvolvimento de um compilador simples, com gerao de bytecodes Java e MSIL.

Um pouco por toda a obra, mais por os primeiros 7


captulos, so introduzidos blocos de exemplos aps exposio de um novo conceito ou atingimento de um novo patamar.
Estes blocos so essenciais e proporcionam excelentes "milestones" de conhecimento ao leitor que ajudam a
consolidar as ideias contidas nos pargrafos anteriores ao
mesmo tempo que proporcionam uma aplicao dessas
mesmas ideias.

37

Review
Isto leva-me inevitavelmente a referir outra boa prtica existente neste livro: o final de cada captulo est acompanhado de exerccios, e no h nada melhor do que a prtica para consolidar teoria, seja qual for o assunto.

O material que os autores disponibilizam informaticamente, atravs do site da editora, de extrema importncia
para qualquer que seja o propsito do leitor.

Disponveis esto vrios exemplos de cdigo, identificados por captulo, bem como a maioria das resolues aos
exerccios propostos, em mais que um formato.

A estrutura do contedo, bem como o seu teor, seguem os traos gerais de obras semelhantes, dando mais ou
menos importncia a diferentes assuntos, mantendo sempre
um discurso claro e relativamente simples. Nada mais a referir.

Est tambm presente um elemento importante, que


visa reduzir a gap que existe no que toca a estar em sintonia dentro da Lngua Portuguesa. Com o crescente volume
de material a circular, tanto em Portugus Europeu como e
Portugus do Brasil, comum lerem-se expresses aparentemente dspares que se referem exactamente ao mesmo.
Este "fenmeno" muito comum em tecnologias de informao pois existe sempre mais ou menos tendncia de adaptar
os termos em Ingls.

Est tambm presente um elemento importante, que visa


reduzir a gap que
existe no que toca a
estar em sintonia dentro da Lngua Portuguesa. () Refiro-me
portanto existncia
de um glossrio de termos que relacionam o
Portugus Europeu do
Portugus do Brasil.

Refiro-me portanto existncia de um glossrio de


termos que relacionam o Portugus Europeu do Portugus
do Brasil.
Por fim, e passando para outro campo, cabe-me tambm referir a excelente qualidade de impresso e a escolha
perfeita na combinao de escalas e tipos de letra, que permitem distinguir e ler, com facilidade, o que cdigo, o que
so palavras chave e o que texto normal.
Torna-se assim um livro bastante fcil e agradvel de
ler e tambm bastante fcil de consultar.
Os elementos grficos que acompanham algumas
seces so perfeitamente adequados, suficientemente simples e no incluem elementos distractivos: a mensagem passa com clareza.

Em suma, Compiladores Da Teoria Prtica reflecte


na perfeio a experincia e especialidade dos seus autores,
com um claro foco na pedagogia.
Apresenta o seu contedo de forma estruturada, limpa e concisa, o que faz deste livro um excelente suporte no
ensino e uma ptima ferramenta na aprendizagem, que recomendo a qualquer entusiasta dos meandros da compilao
de programas descritos por linguagens de alto nvel.

AUTOR
Escrito por Srgio Ribeiro
Curioso e autodidata com uma enorme paixo por tecnologias de informao, e um carinho especial por desenvolvimento web e
mobile,
atualmente
a
terminar
o
curso
de
Engenharia
Informtica
na
FCUL.
Alguns frutos do seu trabalho podem ser encontrados em http://www.sergioribeiro.com

38

Review
Gesto de Projetos de Software (5a Edio Atualizada)

Ttulo: Gesto de Projetos de Software


(5. Edio Atualizada)

Est ainda disponvel uma lista de siglas, um glossrio e um glossrio de termos (Portugus Europeu/Portugus
do Brasil/Ingls) muito completo e actual. Poderia incluir tambm (no livro ou disponvel para download) alguns templates/
listas de verificao como referncia, pois so documentos
essenciais para a correcta gesto de qualquer projecto, como por exemplo o termo de abertura e encerramento, detalhe das actividades (WBS), anlise de risco, matriz de responsabilidade, etc.

Autor: Antnio Miguel


Editora: FCA - Editora de Informtica,
Lda.
Pginas: 448
ISBN: 978-972-722-804-1
O livro Gesto de Projectos de Software (5. Edio
Atualizada) tem como base as boas prticas recomendadas
no PMBOK Guide Fifth Edition (2012), no CMMI e nas
normas ISO 21500 e 100016. O livro descreve o processo de
gesto de projectos de software desde o momento inicial de
planeamento estratgico at entrega e operao do sistema.

Esta a 5 edio
actualizada deste livro
e, segundo o autor,
uma edio mais compacta do que as suas
antecessoras e ainda
mais moderna, equilibrada e prtica.

Est dividido em 6 captulos: comea por fazer um


enquadramento da gesto de projectos, normalizao e modelo, referindo as diferentes fases do desenvolvimento. De
seguida aborda a seleco e avaliao (financeira e tcnica)
e depois a organizao e planeamento. Aqui, na organizao
e planeamento, detalhada a definio dos requisitos e do
mbito do projecto, as estimativa de prazos, recursos e custos, a construo do cronograma, a gesto do risco, a gesto
de qualidade, a gesto das comunicaes e das partes interessadas e, finalmente, a gesto da configurao. O quarto
captulo aborda a monitorizao, controlo e encerramento do
projecto, no esquecendo a gesto de alteraes.
Os ltimos dois captulos abordam aspectos no processuais da gesto de projecto mas muito pertinentes para
qualquer gestor de projectos. O quinto capitulo refere aspectos fundamentais da gesto de equipas em ambiente de projecto, onde se refere a formao de uma nova equipa, a liderana de equipas, a delegao de tarefas, como motivar
equipas e gerir conflitos. Aqui, neste captulo, poderia referir
tambm a gesto de tempo pois esta crucial para que se
atinjam os milestones e se conclua o projecto de acordo com
o planeamento. Finalmente, no ltimo captulo, aborda a
engenharia de software (modelos de desenvolvimento) e
alguns dos principais modelos geis de desenvolvimento,
como o caso do Scrum, Extreme Programming (XP) e o
Dynamic Systems Development Method Atern (DSDM
Atern).

Esta a 5 edio actualizada deste livro e, segundo


o autor, uma edio mais compacta do que as suas antecessoras e ainda mais moderna, equilibrada e prtica. No
tendo lido as edies anteriores, apenas posso concordar
que um livro muito actualizado e prtico, com contedos
muito relevantes para quem se est a iniciar (estudantes,
aspirantes a gestores de projecto, etc.) ou mesmo para gestores de projecto j experiente como manual de referncia/
consulta.
por tudo isto uma obra muito recomendada e que
ajudar certamente muitos gestores de projectos de software
a terem o sucesso no exerccio da sua actividade.

AUTOR
Escrito por Jorge Paulino
Coordenador de projectos de informtica/programador numa multinacional sediada em Portugal. formador e ministra cursos
de formao em tecnologias.NET/VBA, Microsoft Office Specialist (MOS) e Microsoft Most Valuable Professional (MVP) desde
2009, em Visual Basic, pela sua participao nas comunidades tcnicas. administrador da Comunidade Portugal-a-Programar
e membro de vrias comunidades (NetPonto, MSDN, Experts-Exchange, etc.).

39

No Code
Raspberry Pi2 Evoluo ou Revoluo?
Estratgias de jogos Aplicadas a Segurana Computacional

No Code
RASPBERRY PI 2 EVOLUO OU REVOLUO?

H poucas semanas foi anunciado o novo Raspberry


Pi2. Foi colocado venda ao publico e em poucos dias
estava esgotado, alias na altura em que escrevo este artigo,
as lojas da especialidade continuam com o pequeno Pi2 fora
de stock.

Aquelas entradas amarela e azul, saram. Deixamos


de ter entradas de todos os lados do Pi, para no Pi2 termos
tudo mais arrumadinho, mais sbrio. Digamos que como se
o nosso Pi tivesse deixado a fervura da adolescncia para
entrarmos no mundo mais srio.

Eu prpria no fui a tempo da loucura que envolveu o


novo lanamento, as lojas da especialidade que procurei
online todas me diziam que estavam sem stock. Com um
pouco de sorte, e com o dedo de um amigo meu mistura, o
qual aproveito desde j para deixar um agradecimento
pessoal (Miguel Conceio, sem ti, este artigo no teria o
campo experimental que teve), eis que me chegou o
Raspberry Pi2 s mos.

Mais sbrio, mais arrumado, mais robusto. A prpria


caixa vem j com aberturas a pensar nos acessrios como a
camara por exemplo.

Ainda sem falarmos em especificaes e


caractersticas deste novo modelo, o que me chamou mais a
ateno foi o facto do novo Pi2 vir mais arrumadinho. Para
os leitores que no tm bem presente a imagem do
Raspberry Pi Modelo B, aqui deixo uma imagem dos dois
lado a lado.

Se podemos dizer que o Raspberry Pi B+ ficou um


pouco aqum das espectativas, a verdade que o Pi2 pode
ser uma agradvel surpresa. No que seja um supra sumo da
sua classe, porque no o . A HummingBoard que falamos
no ltimo artigo sobre o Pi continua a ter um desempenho
superior.
Mas tendo em conta que a nova verso deste
pequeno computador vem ao mesmo preo da verso
anterior, posso dizer-lhe caro leitor, que uma agradvel
surpresa.
Como seria de esperar, o Pi2 em tudo compatvel
com as verses anteriores, como pode ser visvel pela
fotografia em que ambas as verses esto lado a lado, a
sada de vdeo RCA deixou de existir da mesma forma na
nova verso, assim como a porta de audio, sendo que fica
apenas a entrada HDMI.
At ai tudo bem, pois quando o usamos como centro
multimdia em casa, queremos dar uso ao HDMI, eu pelo
menos. A verdade que o BluRay no era suportado em

41

No Code
RASPBERRY PI2 EVOLUO OU REVOLUO?
condies plenas nas verses anteriores, o Pi2 veio dar uma

Camera interface (CSI)

nova luz aos amantes do Pi como centro multimdia.

Display interface (DSI)

Outra das novidades que a nova verso mantem as


4 portas USB j presentes no B+. O que ptimo porque
depois de ligar o rato e o teclado via usb, eu ficava sempre a
precisar de mais portas na primeira verso.

Micro SD card slot


A memria passou a ser de 1GB (contra 512MB da
verso anterior), passamos a ter um CPU bastante mais
potente visto que a verso inicial era um CPU 700 MHz
single-core ARMv6.

Algo muito interessante neste novo modelo, que na


porta RJ45 j esto as luzes in e out, convencionais dos
computadores, o que torna tudo mais simples na altura de
verificarmos se h de facto actividade na porta.

Mais memria, pelo mesmo preo. E um CPU


bastante melhor tambm. Dois pontos muito positivos.

No cheguei a adquirir o Modelo B+, tinha apenas o


modelo B e agora passei a ter tambm o Pi2. Talvez por isso
ache as diferenas mais acentuadas entre os dois. E talvez
por isso me tenha agradado tanto o Pi2.

O CPU, da famlia ARMv7, cujos processadores


Cortex-A foram desenhados especificamente para executar
funes e aplicaes mais complexas, so encontramos em
vrios sistemas embutidos, assim como em smatphones e
tablets. A sua eficincia de desempenho na questo
qualidade preo, torna-os apetecveis.

Aos leitores que no se recordam, o Pi1 tinha as


luzes de actividade todas juntas, na prpria placa, o que se
tivssemos o mini computador dentro de uma caixa que no
fosse transparente, no nos permitia facilmente verificar as
luzes emitidas. Agora mesmo que tenhamos o Pi2 numa
caixa, facilmente vemos a actividade da RJ45, assim como a
luz vermelha da corrente, ou a luz verde da actividade do
CPU (estas duas ultimas encontram-se lado a lado na lateral
do Pi2).

Falando na arquitectura ARM, num pequeno resumo


das diferentes verses mquinas RISC OS como o caso do
Raspberry.
ARMv6 - Raspberry Pi (original baseada em ARM11)
ARMv7 - BeagleBoard, PandaBoard, Raspberry Pi 2,
IGEPv5, iMx6, e outro Cortex-A7, A8, A9, A15.

Outra diferena notria o facto de que esta nova


verso no aquece tanto de facto. Numa utilizao mais
demorada, isso um facto que salta vista, ou mo, pois
o mini computador j no est to quente quando lhe
pegamos. semelhana do B+, o Pi2 consome de facto
menos energia. O Pi1 utilizava um carto SD, sendo que
este utiliza um carto micro SD, (que fica bem arrumadinho
dentro da caixa sem sobressair para fora como na primeira
verso).

O Raspberry Pi 2 tem uma CPU ARMv7, enquanto os


modelos mais antigos (A, B, B +) usam CPU ARMv6. Os
modelos ARMv6 so capazes de tirar proveito de um modo
de compatibilidade (activado por padro para a distribuio Pi
RISC OS standard), que lhes permitam executar ARMv7 nosoftware compatvel (caso o software seja anterior a 2002,
pode no ser compatvel). Contudo para aqueles que usam e
abusam da Linguagem C na sua forma mais pura, uma
nova recompilao bastar para garantir que o programa
continuar a ser compatvel com a nova verso do Pi2.

S por estas alteraes, eu teria ficado satisfeita com


a nova aquisio. A pequena placa, est de facto mais
parecida com o computador convencional que conhecemos.
Mas h mais ainda.

A verdade que experimentei programar um pequeno


programa em C pelo famoso pico, na prompt do Raspbian e
no senti diferenas significativas entre o Raspberry Pi1 e o
Pi2. Funcionaram na perfeio os dois.

Permita-me, caro leitor, voltar um pouco atrs e falarlhe sobre as especificaes desta nova verso.
O Raspberry Pi2 a segunda gerao do Raspberry
Pi, portanto tem tudo o que a verso anterior tinha e mais:

Uma outra experincia efectuada foi usando o


OpenElec, uma distribuio Linux para o Raspberry funcionar
como centro multimdia.

A 900MHz quad-core ARM Cortex-A7 CPU

O novo membro da fundao Raspberry de facto


muito mais rpido que o anterior. AS imagens seguintes
mostram um teste performance do Blueray, sendo que
ambas as verses do Pi esto a correr o mesmo filme, e na
mesma televiso. notria, a diferena entre as duas
verses. O Pi2 est muito mais rpido. Mais palavras para
qu?

1GB RAM
4 USB ports
40 GPIO pins
Full HDMI port
Ethernet port

42

No Code
RASPBERRY PI2 EVOLUO OU REVOLUO?

A resposta simples. O Raspberry Pi2 ter suporte


para o novo Windows 10. Este pode sim, ser o grande trunfo
da nova verso, que vai permitir ao pblico que ainda no
conhecia o Raspberry, se interesse por ele. Porque ser de
facto o computador Windows mais econmico de todos os
tempos.

Ilustrao 1 - Desempenho Verso Modelo Pi1

A parceria entre a fundao Rasberry e a Windows foi


anunciada na altura do lanamento da nova verso da
fundao. A ideia principal que seja criada uma verso do
Windows 10 que seja suportado pelo Raspberry Pi, sendo
que ser gratuita para o consumidor final, atrs do programa
da Windows Windows Developer Program for IoT. Fontes
oficiais, explicam que o Windows est a caminhar para um
mundo mais mvel, natural e fundamentado na confiana e
na proximidade com o consumidor. Esta parceria, tentar
uma nova abertura entre opensource versus Windows verso
paga. A verdade que ser a primeira verso gratuita de um
sistema operativo Windows.

Ilustrao 2 - Desempenho Verso Modelo Pi2


O novo Raspberry est bastante melhor que as
verses anteriores, um facto. E ao longo dos ltimos anos,
este mini computador tem conquistado o seu lugar,
conquistando novos aficionados. Mas em que que est
verso pode ser diferente?

Dentro de 6 meses, esperado o lanamento do


Windows 10 suportado para o Raspberry Pi2. E este de
facto o ponto forte do pequeno mini computador pelo
interesse que conseguiu despertar em toda a comunidade em
geral.

Tem mais RAM, mais rpido mas onde pode estar a


diferena que fez com que em poucos dias tenha esgotado
nas lojas?

Os j aficionados, esperam novas potencialidades na


espectativa. Os que desconheciam o Pi, olham para ele
agora curiosidade.

Se olharmos friamente, as novas caractersticas no


bastam para que possa ser apetecvel ao ponto de esgotar.
O meu primeiro notebook, h dez anos atrs tinha a mesma
RAM que o Pi. E o Linux ainda um sistema operativo que a
maior parte do pblico no usa. Para termos um media
center em casa, a maior parte das pessoas acaba por
continuar a
utilizar a
Box do
fornecedor
de
telefone/TV/internet. Ento porqu tanto alarido volta deste
lanamento?

Os que me conhecem, sabem que apesar de gostar


de trabalhar em Linux, que sou assumidamente f Microsoft,
e esta noticia aumentou sem duvida o meu interesse pessoal
pelo Pi, mas seja qual for o grupo em que eu e o leitor se
insira, uma coisa certa. O Raspberry Pi veio para ficar,
conquistou o seu lugar e acredito que daqui a uns tempos
volte a surpreender-nos.
Ficamos a aguardar.

AUTOR
Escrito por Rita Peres
Natural de Castelo Branco, licenciou-se em Engenharia Informtica pela Universidade da Beira Interior. Membro do P@P
desde Janeiro de 2010.

43

#1010ENEI

O Encontro Nacional de Estudantes de Informtica


(ENEI) um evento anual organizado por e para estudantes,
que tem o objetivo de juntar no mesmo espao alunos de
todo o pas, bem como um vasto leque de oradores e personalidades influentes ligadas ao ramo da informtica.
Assumindo-se cada vez mais como um palco importante para a troca de experincias e conhecimentos, o ENEI
tem vindo a conquistar o seu espao enquanto referncia
para os alunos de informtica do ensino superior.

dades Hands On, atividades de aprendizagem interativas e


sesses paralelas, de forma a poderem escolher assistir s
palestras/workshops que mais lhes convenham.
A curiosidade e sede de conhecimento est no ADN
de qualquer informtico sendo natural que o ENEI, acima de
outros encontros estudantis, tenha um grande foco na vertente formativa oferecida, demonstrado nas suas componentes didticas, sejam elas tericas ou prticas.
Mas como encontro de estudantes que , o ENEI no
menospreza o convvio e a interao. Para isso, a organizao proporciona diversas atividades complementares que
contribuem para a descontrao dos participantes e a vontade de voltarem a futuras edies.
Exemplo disso so as inmeras atividades ldicas
realizadas nos tempos de pausa que vo surgindo, bem como o convvio noturno que tem sido constante em todas as
edies do Encontro.
Entre os pontos altos do evento estaro certamente o
debate sobre desenvolvimento de Jogos Indie e a sesso
Informtica 2020, uma discusso sobre Informtica na sua
ligao entre Universidades, o mundo empresarial e o caminho a seguir para alcanar sucesso no futuro enquanto estudante, jovem empreendedor ou profissional, realizada no
mbito das celebraes de 725 anos da Universidade de
Coimbra.

Estando a cargo do Ncleo de Estudantes de Informtica da Associao Acadmica de Coimbra, o evento este
ano ter lugar em Coimbra de 27 a 30 de Maro e oferecer
aos participantes a oportunidade de participarem em activi-

A presena de diversos parceiros como a Deloitte,


ItGrow, LunaCloud, Accenture e Blip ajudaro ainda na ligao ao mundo empresarial, obrigatria por tradio no evento.

No Code
ESTRATGIAS DE JOGOS APLICADAS SEGURANA COMPUTACIONAL

Introduo

Trabalhos relacionados
O uso de tcnicas e teorias de jogos aplicados
segurana tem vindo a tornar-se um ponto inicial para
diversos tipos de investigao relacionadas com a segurana
computacional, esse tem vindo a tornar-se um tema bastante
explorado por esses investigadores. Em [1], [3], [14], [15],
[17] e [23], os autores destacam a importncia do uso dessas
estratgias, pois as mesmas permitiram que pudssemos
entender o que o suposto invasor queria encontrar e como e
por onde o mesmo conseguiu passar.

A segurana computacional constitui uma parte


bastante importante e crescente nos dias actuais dentro da
tecnologia moderna. Ela responsvel pela proteco de
dados e equipamentos com o intuito final de preservar o seu
valor para um indivduo, empresa ou organizao.
Devido importncia da segurana para a sociedade
nos ltimos anos vem sendo desenvolvidos diversos estudos
a fim tornar a segurana de cdigos, dados e aparelhos
electrnicos cada vez mais seguros. Geralmente esses
estudos so iniciados e elaborados por empresas e
organizaes. Porm nos dias atuais tambm existem
diversos investigadores de faculdades e universidades que
se centram nesse tema procura de solucionar problemas
ou at mesmo evit-los.

Outras investigaes relacionadas com a segurana


computacional que vem sendo desenvolvidas so a respeito
das redes sociais. Esses estudos tem como objectivo passar
ao utilizador confiana para poder utilizar o sistema oferecido
com menores riscos possveis. Em [2] e [9], so
apresentados quais os riscos que existem nos dias atuais e
alguns meios de proteco contra possveis ataques.

Entretanto, devido ao grande avano tecnolgico pelo


qual passamos, diversos problemas vm sendo expostos,
problemas considerveis graves relacionados a falhas
cometidas por profissionais responsveis pela segurana ou
at mesmo por programadores que se preocuparam apenas
com o produto final e no com a segurana que o mesmo iria
oferecer. Muitas dessas falhas do-se devido a presso
psicolgica e a curtos prazos que so dados a esses
profissionais para a finalizao de um determinado projecto.

Um dos estudos encontrado que faz parte tambm


desse trabalho uma pesquisa sobre o uso da teoria de
segurana multi-instncia que tem por base a criptografia
baseada em senha. Em [4], o autor defende que essa teoria
aplicada poderia tornar a segurana de criptografia mais forte
do que a das oferecidas actualmente. O mesmo tambm
afirma que o uso dessas teorias ser de grande valor para
criptografia de chaves pblicas.
Existem tambm muitos outros estudos que fazem
parte desse conjunto que estuda a segurana computacional
atravs da melhoria e fortalecimento. Em [5] o autor procura
expor quais as funcionalidades que so oferecidas pela
criptografia actual e tambm quais os desafios que so
encontrados na sua aplicao.

Outro motivo de preocupao so algumas tcnicas e


prticas de segurana que esto a tornar-se ultrapassadas
devido ao avano tecnolgico, pois assim como h pessoas
bem intencionadas que investigam a respeito de segurana
tambm existem pessoas mal intencionadas com intuito de
roubar e destruir.

Outro estudo que vem sendo desenvolvido aborda o


uso de algoritmos e curvas elpticas que toma como base o
teorema de Weierstrass aplicado na segurana de 128 bits,
para tornar a segurana das criptografias mais rpidas e
eficientes, como pode ser visto em [6]. Tambm esto
realizados diversos trabalhos para solucionar problemas
referentes a falhas encontradas nos servios de Cloud. Essas
falhas bem como algumas solues propostas so relatadas
em [7], [10], [13], [18], [21], [24].

Motivado por esse grande desafio e tambm pelo


objectivo de expor aqui ideias inovadoras que possa vim
auxiliar a solucionar os problemas aqui expostos, utilizarei o
desenvolvimento de um Serious Game ensine o uso de
estratgias de jogos na aplicao de segurana a
determinadas situaes. Mais especificamente ser
desenvolvido um jogo como se fosse um ambiente virtual,
que faa a interaco entre o jogo, o jogador e o
computador.

Outro campo de investigao tambm muito


importante o do campo de aparelhos mveis, que mesmo
com todo o avano tecnolgico acaba deixando a desejar
quando falamos de segurana de dados. Em [11], [12] e [16],
so apresentadas algumas das solues possveis para

O trabalho aqui apresentado ir propor ao utilizador


usar a lgica para solucionar problemas, o que ser
realizado no prprio computador do jogador, no qual o jogo
ser o responsvel por fazer a interaco entre o utilizador, o
problema e o computador.

45

No Code
ESTRATGIAS DE JOGOS APLICADAS SEGURANA COMPUTACIONAL

esses problemas existentes. Uma das maiores preocupaes


tambm relatadas nos dias atuais a segurana de uma
base de dados (Database). Por esse motivo, em [21]
apresentado como a segurana dessa tecnologia pode ser
melhorada de forma a evitar riscos e perdas.

desse trabalho uma pesquisa sobre o uso da teoria de


segurana multi-instncia que tem por base a criptografia
baseada em senha. Em [4], o autor defende que essa teoria
aplicada poderia tornar a segurana de criptografia mais forte
do que a das oferecidas actualmente. O mesmo tambm
afirma que o uso dessas teorias ser de grande valor para
criptografia de chaves pblicas.

Um dos estudos dentre os vrios investigados fala do


uso de OpenFlow, um padro inovador que permite a
dinmica atravs das polticas de controle de fluxo, assim
como pode ser comprovado em [20]. Outro estudo inovador
aborda o uso de segurana de redes de sensores sem fios.
Em [8] o autor afirma que as redes de sensores so bastante
vulnerveis ao ataque de hackers e por isso o estudo
resolveu abordar as questes de como tornar essa rede
confivel, ntegra e autntica.

Existem tambm muitos outros estudos que fazem


parte desse conjunto que estuda a segurana computacional
atravs da melhoria e fortalecimento. Em [5] o autor procura
expor quais as funcionalidades que so oferecidas pela
criptografia actual e tambm quais os desafios que so
encontrados na sua aplicao.
Outro estudo que vem sendo desenvolvido aborda o
uso de algoritmos e curvas elpticas que toma como base o
teorema de Weierstrass aplicado na segurana de 128 bits,
para tornar a segurana das criptografias mais rpidas e
eficientes, como pode ser visto em [6]. Tambm esto
realizados diversos trabalhos para solucionar problemas
referentes a falhas encontradas nos servios de Cloud. Essas
falhas bem como algumas solues propostas so relatadas
em [7], [10], [13], [18], [21], [24].

Por ltimo e no menos importante, em [19] temos um


estudo responsvel por fazer a apresentao de um software
actualmente conhecido como Amnsia. Esse software tem
como objectivo proteger qualquer disco montado numa
mquina, pois nos ltimos anos foi descoberto um novo tipo
de ataque que se servia de um canal de ataque, ataques
esses que preocupavam muitos profissionais de segurana.

Outro campo de investigao tambm muito


importante o do campo de aparelhos mveis, que mesmo
com todo o avano tecnolgico acaba deixando a desejar
quando falamos de segurana de dados. Em [11], [12] e [16],
so apresentadas algumas das solues possveis para
esses problemas existentes. Uma das maiores preocupaes
tambm relatadas nos dias atuais a segurana de uma
base de dados (Database). Por esse motivo, em [21]
apresentado como a segurana dessa tecnologia pode ser
melhorada de forma a evitar riscos e perdas.
Um dos estudos dentre os vrios investigados fala do
uso da OpenFlow, um padro inovador que permite a
dinmica atravs das polticas de controle de fluxo, assim
como pode ser comprovado em [20]. Outro estudo inovador
aborda o uso de segurana de redes de sensores sem fios.
Em [8] o autor afirma que as redes de sensores so bastante
vulnerveis ao ataque de hackers e por isso o estudo
resolveu abordar as questes de como tornar essa rede
confivel, ntegra e autntica.

Trabalhos relacionados
O uso de tcnicas e teorias de jogos aplicados
segurana tem vindo a tornar-se um ponto inicial para
diversos tipos de investigao relacionadas com a segurana
computacional, esse tem vindo a tornar-se um tema bastante
explorado por esses investigadores. Em [1], [3], [14], [15],
[17] e [23], os autores destacam a importncia do uso dessas
estratgias, pois as mesmas permitiram que pudssemos
entender o que o suposto invasor queria encontrar e como e
por onde o mesmo conseguiu passar.

Por ltimo e no menos importante, em [19] temos um


estudo responsvel por fazer a apresentao de um software
actualmente conhecido como Amnsia. Esse software tem
como objectivo proteger qualquer disco montado numa
mquina, pois nos ltimos anos foi descoberto um novo tipo
de ataque que se servia de um canal de ataque, ataques
esses que preocupavam muitos profissionais de segurana.

Outras investigaes relacionadas com a segurana


computacional que vem sendo desenvolvidas so a respeito
das redes sociais. Esses estudos tem como objectivo passar
ao utilizador confiana para poder utilizar o sistema oferecido
com menores riscos possveis. Em [2] e [9], so
apresentados quais os riscos que existem nos dias atuais e
alguns meios de proteco contra possveis ataques.

Descrio da Soluo
Devido grande expanso e evoluo de novas
tecnologias como Sistemas ERP, Networks, Mbiles,

Um dos estudos encontrado que faz parte tambm

46

No Code
ESTRATGIAS DE JOGOS APLICADAS A SEGURANA COMPUTACIONAL

dinmica nas disciplinas que abordem o tema de segurana


computacional, sendo assim possvel visualizar qual seria o
comportamento do aluno face a uma situao prxima do
mundo real.

servios Cloud dentre muitas outras existentes nos dias


atuais, viu-se a necessidade de se realizarem estudos a fim
de auxiliar estudantes e profissionais actuantes da rea na
busca de tcnicas para solucionar problemas relacionados
com a segurana dessas tecnologias.

Referncias

Tendo em vista essa preocupao, decidiram ento


elaborar um projecto que tivesse como objectivo principal
expor as dificuldades relacionadas com a segurana
computacional e trat-las de forma interactiva e que de certa
forma tambm tivesse uma certa aprendizagem. A soluo
aqui encontrada foi a criao de um Serious Game.

[01] An, B. Pita, J. et al. Guards and protect: Next generation


applications
of
security
games.
ACM
SIGecom
Exchanges, 10(1), 31-34, 2011.
[02] Backes, M.;Maffei, M.;Pecina, K. A Security API for
Distributed Social Networks. In NDSS (Vol. 11, pp. 35-51),
2011.

O projecto que est a ser desenvolvido trata-se de


um Serious Game que foi chamado de World Hacker com
traduo Mundo Hacker, projecto esse que utiliza tcnicas e
estratgias de jogos na aplicao de segurana de um
determinado sistema. Esse jogo no ensinar ningum a
tornar um sistema seguro, mas sim incentivar a capacidade
de pensar e agir do jogador em determinados momentos.

[03] Basilico, N.;Gatti, N. Automated Abstractions for


Patrolling Security Games. In AAAI, 2011.
[04] Bellare, M.;Ristenpart, T.;Tessaro, S. Multi-instance
security and its application to password-based cryptography.
In Advances in CryptologyCRYPTO 2012 (pp. 312-329).
Springer Berlin Heidelberg, 2012.

O jogo World Hacker ser dividido em mdulos, ou


seja, em etapas. Cada etapa ser caracterizada por misses,
misses essas onde pretendo fazer com que o jogador seja
forado a utilizar o mximo da lgica para solucionar os
problema proposto e passar assim de etapa.

[05] Boneh, D. Sahai, A.; Waters, B. Functional encryption:


Definitions and challenges. In Theory of Cryptography (pp.
253-273). Springer Berlin Heidelberg, 2011.
[06] Bos, J. W.; Costello, C.; Longa, P.; Naehrig, M.
Selecting Elliptic Curves for Cryptography: An Efficiency and
Security Analysis. IACR Cryptology ePrint Archive, 2014.

O design final do jogo ser feito inspirado no MSDOS da Microsoft, modelo escolhido para dar mais
autenticidade ao projecto. Assim que o utilizador iniciar a
aplicao, ter j como etapa inicial o desafio de iniciar o
jogo. O utilizador ter que descobrir como fazer para dar
incio partida. Como j citado acima, tudo nesse jogo se
trata de lgica.

[07] Buckley, I. A.; Wu, F. Security Policies for Securing


Cloud Databases. International Journal of Advanced
Computer Science and Applications (IJACSA), 5(6), 2014.
[08] Burgner, D. E.;Wahsheh, L. A. Security of wireless
sensor networks. In Information Technology: New
Generations (ITNG), 2011 Eighth International Conference
on (pp. 315-320). IEEE, 2011.

Para o desenvolvimento desse jogo ser utilizada a


linguagem de programao C, com algumas utilidades da
biblioteca Allegro. Foi escolhida essa linguagem pelo fato de
ela j ter um histrico positivo relacionado criao
de jogos e tambm por ser malevel em relao a tipos de
dispositivos em que o jogo ir ser executado. O objectivo
final desse jogo fazer com que o jogador seja capaz de
receber e avaliar a situao no mundo real e propor uma
estratgia de contra-ataque com as informaes obtidas.

[09] Cetto, A. et al. Friend Inspector: A Serious Game to


Enhance Privacy Awareness in Social Networks. arXiv
preprint arXiv:1402.5878, 2014.
[10] Chen, D.; Zhao, H. Data security and privacy protection
issues in cloud computing. In Computer Science and
Electronics Engineering (ICCSEE), International Conference
on (Vol. 1, pp. 647-651). IEEE, 2012.

Concluso

[11] Di Cerbo, F. et al. Detection of malicious applications on


android os. In Computational Forensics(pp. 138-149).
Springer Berlin Heidelberg, 2011.

Durante a elaborao deste projecto, foi possvel


perceber que a segurana computacional uma rea
crescente e bastante importante paras as tecnologias
oferecidas nos dias atuais e que todo o processo
desenvolvido ir auxiliar profissionais a resolver alguns
problemas encontrados utilizando estratgias e teorias
de jogos.

[12] Felt, A. P. et al. A survey of mobile malware in the wild.


In Proceedings of the 1st ACM workshop on Security and
privacy in smartphones and mobile devices (pp. 3-14). ACM,
2011.
[13] Hamlen, K. et al. Security issues for cloud computing.
International Journal of Information Security and Privacy
(IJISP), 4(2), 36-48, 2010.

Para projectos futuros pretende-se concluir o


desenvolvimento do jogo e aplicar as suas funcionalidades
em formaes e quem sabe, em cursos de graduao,
podendo assim oferecer aos alunos uma aprendizagem mais

47

No Code
ESTRATGIAS DE JOGOS APLICADAS A SEGURANA COMPUTACIONAL
[14] Jain, M.;Leyton-Brown, K.;Tambe, M. The deployment-

[20] Son, S. et al. Model checking invariant security


properties in OpenFlow. In Communications (ICC), IEEE
International Conference on (pp. 1974-1979). IEEE, 2013.

to-saturation ratio in security games. Target, 1(5), 5, 2012.

[15] Manshaei, M. H. et al. Game theory meets network


security and privacy. ACM Computing Surveys (CSUR), 45
(3), 25, 2013.

[21] Shaikh, F. B.;Haider, S. Security threats in cloud


computing. In Internet technology and secured transactions
(ICITST), 2011 international conference for (pp. 214-219).
IEEE, 2011.

[16] Markelj, B.;Bernik, I. Mobile devices and corporate data


security.International Journal of Education and Information
Technologies, 6(1), 97-104, 2012.

[22] Shmueli, E. et al. Database encryption: an overview of


contemporary challenges and design considerations. ACM
SIGMOD Record, 38(3), 29-34, 2010.

[17] Pita, J. et al. GUARDS: game theoretic security


allocation on a national scale. In The 10th International
Conference on Autonomous Agents and Multiagent SystemsVolume 1 (pp. 37-44). International Foundation for
Autonomous Agents and Multiagent Systems, 2011.

[23] Tambe, M. et AL.Game theory for security: Key


algorithmic principles, deployed systems, lessons learned.
InCommunication, Control, and Computing (Allerton), 50th
Annual Allerton Conference on (pp. 1822-1829). IEEE, 2012.

[18] Ramgovind, S.; Eloff, M. M.; Smith, E. The management


of security in cloud computing. In Information Security for
South Africa (ISSA),(pp. 1-7). IEEE, 2010.

[24] Wang, C. et al. Privacy-preserving public auditing for


data storage security in cloud computing. In INFOCOM,
Proceedings IEEE (pp. 1-9). IEEE, 2010.

[19] Simmons, P. Security through amnesia: a softwarebased solution to the cold boot attack on disk encryption.
In Proceedings of the 27th Annual Computer Security
Applications Conference (pp. 73-82). ACM, 2011.

[25] Zhang, C. et al. Privacy and security for online social


networks: challenges and opportunities. Network, IEEE, 24
(4), 13-18, 2010.

AUTOR
Escrito por Diego Andrade
Atua como Tcnico de Nvel Mdio em Informtica e Comunicao formado pela E.E.E.P. Comendador Miguel Gurgel, tambm aluno de graduao em Sistema de Informaes pela FANOR | DeVry Brasil. Dentre suas reas de interesse esto:
Desenvolvimento WEB, Desenvolvimento Desktop, Segurana Computacional, Games, Banco de Dados e Aplicaes Moveis. http://diegoandrade.hol.es

48

No Code
PROJECTO EM DESTAQUE NA COMUNIDADE P@P: DUALITY MICRO PHP FRAMEWORK

<?php
// Include local configuration
$config = array(
'server' => array(
'url' => '/duality-demo',
'hostname' => 'localhost'
)
);

Duality Micro PHP Framework, apesar de pequena,


conta com 58 classes, implementando 15 servios
comummente utilizados no desenvolvimento web.
Como micro framework, consome menos memria e
capacidade de processamento, oferece uma variedade de
servios que se traduz numa menor dependncia de outras
bibliotecas, alm disso no obriga a utilizar uma estrutura de
directrios fixa, nem sequer fora o uso da arquitectura MVC.

// Load dependencies
require_once './vendor/autoload.php';
// Create a new application container
$app = new \Duality\App(dirname(__FILE__),

Quadro micro Duality foi desenvolvido segundo o


paradigma de programao orientada a objectos,
implementada em linguagem PHP, utiliza o Compositor como
gestor de dependncias, CodeSniffer e phpunit com vista a
manter a qualidade do cdigo e PhpDocumentor para validar
blocos doc.

$config);
// Get server and request
$server = $app->call('server');
$request = $server->getRequestFromGlobals($_SERVER,
$_REQUEST);
// Validate HTTP request
if (!$request) die('HTTP request not found!');
// Set request
$server->setRequest($request);
// Define default route
$app->call('server')->setHome(function(&$req,
&$res) {
// Tell response what is the output
$res->setContent('Hello World!');
});
// Finaly, tell server to start listening
$app->call('server')->listen();
?>

Pode ser encontrada e descarregada do github em:


https://github.com/taviroquai/duality, onde tambm
se
encontram disponveis algumas informaes sobre a
performance da framework, bem como um tutorial bastante
simples sobre a sua utilizao.
O pequeno teste por ns realizado, permitiu instalar
toda a framework em menos de cinco minutos, sem qualquer
dificuldade, estando de imediato pronta a funcionar e tendo
apresentado a mensagem de boas vindas no browser.

Fig.1 Pequena ilustrao do cdigo (fonte: pgina do


projecto)

As configuraes pautam-se pela simplicidade com


que se fazem, sendo a curva de aprendizagem bastante
reduzida.

49

Elege o melhor artigo desta edio


Revista PROGRAMAR
http://bit.do/ProgramarED48_V

Veja tambm as edies anteriores da


Revista PROGRAMAR
45 Edio - Maio 2014

43 Edio - Dezembro 2013

42 Edio - Setembro 2013

44 Edio - Fevereiro 2014

46 Edio - Setenmbro 2014

47 Edio - Dezembro 2014

e muito mais em
www.revista-programar.info

Anda mungkin juga menyukai