Sie sind auf Seite 1von 91

EDITORIAL

EQUIPA PROGRAMAR

Kernel Panic: Fatal Exception

Existem imensas piadas, umas mais elaboradas outras menos elaboradas,


Coordenador em volta de exceptions (excepes)! Uma excepo, indica mais do que ser uma
Antnio Pedro Cunha Santos excepo, indica algo que no correu como esperado, ou como previsto, ou como
suposto, em suma como! ;)
Editor No meio de tantas excepes (exceptions), e sem entrar em pnico, afinal
Antnio Pedro Cunha Santos no somos um kernel qualquer, aparece a exception regra, que somos todos
que l-mos a PROGRAMAR, escrevemos, participamos, dedicamos o nosso tempo
comunidade! Somos a exception, que alguns acham fatal exception, sem retornar
Capa e sem catch, numa espcie de loop interminvel!
Filipa Peres
Desde a ultima edio imensas coisas aconteceram, a tecnologia evoluiu,
tanta coisa mudou, o Vero fez-se Outono (disfarado), mas Outono, o cheiro a uma
Redaco bebida quente tornou-se regra e no exception, a falta desse cheiro quase se
Augusto Manzano torna fatal exception! Aproxima-se um tempo mais frio de clima e mais quente de
Antnio Pedro Cunha Santos espirito e claro sempre cheio de novidades de tecnologia, pois daquelas alturas do
Bruno Horta ano em que aparecem sempre coisas novas! Enquanto o tempo vai passando,
Bruno Santos deixamos os nossos leitores com mais uma edio da PROGRAMAR e a promessa
Joo Sousa
de que a prxima ser ainda melhor!
Jorge Cardoso
Nuno Cancelo
Patrcio Domingues
Pedro Tavares At prxima edio, boas leituras!
Rafael Amoedo Antnio Santos
Ricardo Cabral
Rita Peres
Tnia Valente
Victor Carreira

Staff
Antnio Pedro Cunha Santos
Rita Peres
Tiago Sousa

Contacto
revistaprogramar@portugal-a-
programar.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.

2
NDICE
TEMA DE CAPA
6 Raspberry Pi Hadoop - Antnio Santos

A PROGRAMAR

12 Correndo uma Aplicao Web Java em Azure, passo a passo - Nuno Cancelo
22 Junit - Raphael Amoedo
25 Criar uma aplicao mvel com jQuery Mobile - Jorge Cardoso
32 Lua Linguagem de Programao Parte 13 - Augusto Manzano
36 Tipos de dados int e variantes na linguagem C - Patricio Domingues, Victor Carreira
42 Feed RSS em C# .NET Core no Azure Web App em Linux - Ricardo Cabral

ELECTRNICA
51 ESP32 - MICROPYTHON - Bruno Horta
56 Pomar Musical - Bruno Santos

COLUNAS
61 C# - De List para DataTable em 30 + 2 linhas! - Antnio Santos

ANLISES
65 Node.js - Construo de Aplicaes Web - Bruno Horta
67 TypeScriptOJavascriptmodernoparacriaodeaplicaes- Joo Sousa

SEGURANA
69 A Revoluo da Blockchain - A Tecnologia do Futuro - Pedro Tavares
72 Segurana em Aplicaes Android - Pedro Tavares
77 Blockchain and Merkle Tree - Pedro Tavares

NO CODE
82 RGPD - Rita Peres
84 Sophia, a Humanoide - Rita Peres
86 Projecto em destaque na PROGRAMAR <Destaque>Hydriney</Destaque> - Tnia Valente

EVENTOS

Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-
programar.pt

3
NOTCIAS
Pela primeira vez, investigadores Movimento Maker Portugal pro-
portugueses publicam na MICRO move 1 encontro
uma das mais importantes confern- No passado ms de Setembro realizou-se o primeiro
cias mundiais sobre microarquitetur- encontro do Movimento Maker Portugal, subordinado ao tema
EU QUERO IOTIZAR A MINHA CASA, na cidade de Leiria.
as de computadores
Tratou-se de um evento centrado no conceito, hands-
on, cheio de workshops sobre a temtica que lhe deu mote,
Com uma investigao realizada na rea de processa-
bem como talks dos mais variados temas interessantes para
dores (microchips) optimizados para inteligncia artificial, os
a comunidade Maker!
investigadores Pedro Duarte, Gabriel Falco e Pedro Toms
conseguiram a primeira publicao portuguesa na prestigiada
conferncia internacional sobre microarquiteturas de computa-
dores MICRO que vai j na 50 edio (https://
www.microarch.org/micro50/index.html).
Os trs investigadores, desenvolveram uma nova ferra-
menta de software, que permite analisar de forma automtica,
um programa e gerar um processador optimizado, em termos
de rea de chip e consumo energtico, de modo a poder ser
usado em chips reconfigurveis do tipo FPGA.
Esta nova tecnologia que conduziu obteno desta
publicao permite desenvolver hardware utilizando uma
abordagem prxima do desenvolvimento tpico de software.
Da resultam grandes vantagens, nomeadamente ao nvel do
aumento da comunidade de utilizadores, que tipicamente con-
siste em programadores convencionais, que no possuem
conhecimentos ao nvel do desenho de microcircuitos para
conceberem os processadores de forma manual, sublinham
os investigadores.
O artigo foi apresentado em Boston, EUA, durante a
conferncia MICRO (que se realizou entre 14 e 18 de Outu-
bro), cuja taxa de aceitao de artigos muito competitiva,
rondando os 15%, e que apenas publica cerca de 50 artigos
por ano.
Alm de ser a primeira vez que um artigo portugus
publicado nesta prestigiada conferncia, que rene investiga-
dores e empresas de topo de todo o mundo, demonstra a
qualidade do made in Portugal!

Destacamos o facto de ter sido o primeiro encontro de


uma comunidade Maker to geograficamente abrangente,
com participantes de todas as zonas do pas, facto pelo qual
o Movimento Maker Portugal est de parabns!

4
TEMA DE CAPA
Raspberry Pi Hadoop
TEMA DA CAPA
Raspberry Pi Hadoop

Apache Hadoop
Continuando as aventuras com o Raspberry Pi e a
temtica do processamento paralelo e distribudo, sobre o
qual escrevi na edio 48 em Maro de 2015, decidi desta O Apache Hadoop constitudo por um nmero de compo-
vez trazer uma outra temtica interessante, para quem gosta nentes e frameworks de cdigo aberto que o tornam bastan-
destas aventuras. Desta vez em vez de ser MPICH ser te flexvel e modular. De forma resumida, encontra-se divido
Apache Hadoop! em duas partes:
Ao longo deste artigo, em que se prev que o leitor
Armazenamento de dados (HDFS) - Hadoop Distri-
no disponha de conhecimento prvio sobre hadoop, ir ser
buted File System,
montado um cluster Apache Hadoop, recorrendo a unidades
projetado para correr em hardware de baixo custo
Raspberry Pi, e executados alguns exemplos demonstrati-
sendo bastante tolerante a falhas. Os ficheiros so
vos.
divididos em blocos que so replicados para os ns
Para quem no conhece o Apache Hadoop, uma de dados (DataNodes). Por padro os blocos tm um
framework, de cdigo aberto (open-source) de armazena- tamanho de 64MB e so replicados para 3 ns no
mento e processamento distribudo de grandes volumes de cluster. Contudo estas definies podem ser ajusta-
dados, em clusters de computadores, usando modelos de das a necessidades especficas.
programao simples. O hadoop foi desenhado para ser
escalonado de forma a poder crescer desde um simples n
at centenas ou mesmo milhares de ns, onde cada um dis- Viso geral da arquitectura de HDFS File System:
ponibiliza o seu poder de processamento e armazenamento.
Contrariamente a outras solues, o foi tambm desenhado
de forma a detectar e tratar falhas, ao nvel da camada de
aplicao, em vez de depender do hardware para disponibili-
zar a alta-disponibilidade necessria.
A biblioteca de software Apache Hadoop um framework
que permite o processamento distribudo de grandes conjun-
tos de dados atravs de clusters de computadores que usam
modelos de programao simples. projetado para escalar
a partir de um nico servidor para milhares de mquinas,
cada uma oferecendo computao e de armazenamento
local. Em vez de confiar em hardware para proporcionar alta
disponibilidade, a biblioteca em si concebida para detectar
e tratar falhas na camada de aplicao, de modo a fornecer
um servio altamente disponvel em cima de um cluster de Processamento de dados (MapReduce), uma
computadores, cada um dos quais pode ser propenso a fa- framework escrita em Java que utilizada para criar
lhas. "- http://hadoop.apache.org/ aplicaes que possam processar grandes volumes.
Apesar de estar escrita na linguagem de programa-
Correr este tipo de software num cluster com
o Java existem outras linguagens disponveis para
raspberry pi, pode parecer absurdo, dado o parco poder
escrever aplicaes MapReduce. Tal como com
de computao e armazenamento do raspberry. No entanto,
HDFS foi projectada para ser tolerante a falhas e para
e, dependendo do volume de dados, at pode surpreender,
trabalhar em ambientes de cluster de grande escala.
uma vez que o consumo de energia deste dispositivo, bas-
A framework tem a capacidade de dividir dados de
tante baixo, assim como o custo reduzido e se pensarmos
input em tarefas mais pequenas (map tasks) que po-
em fazer isto com raspberry pi zero, ainda mais prtico se
dem ser executadas em processos paralelos. O Out-
torna! Pelo menos numa lgica de projecto de aprendiza-
put das map tasks ento reduzido (reduce task) e
gem, ou cluster para testes, por exemplo! No meu caso, inici-
guardado no sistema de ficheiros. Abaixo poderemos
almente usei para dados provenientes de sensores monta-
ver o fluxo MapReduce do programa exemplo
dos por mim, para me analisar e gerar informao, com base
WordCount que iremos utilizar mais tarde. O
na informao proveniente dos sensores (a fazerem leituras
WordCount pega num ficheiro de texto como input,
de 5 em 5 segundos, 24 horas por dia, 7 dias por semana.
divide-o em partes mais pequenas e depois conta
De qualquer das formas o objectivo deste artigo apenas
cada palavra e devolve ao output um ficheiro com
apresentar a tecnologia e como a colocar a funcionar!
uma contagem de todas as palavras dentro do fichei-
ro.

6
TEMA DA CAPA
RASPBERRY PI HADOOP
. Antes de mais instalaes comeamos por instalar o java, pois
Viso geral do fluxo MapReduce (WordCount): a distribuio Raspbian Jessie Lite, no traz java instalado.
Para tal comeamos por obter a chave GPG para o pacote
java, recorrendo ao comando seguinte:

sudo apt-key adv --recv-key --keyserver keyser-


ver.ubuntu.com EEA14886
De seguida editamos o ficheiro de fontes, /etc/apt/
source.list.file para acrescentar as fontes necessrias insta-
lao do java.

sudo nano /etc/apt/sources.list


E acrescentamos as seguintes linhas no final do ficheiro:

deb http://ppa.launchpad.net/webupd8team/java/
ubuntu trusty main
deb-src http://ppa.launchpad.net/webupd8team/java/
ubuntu trusty main
A Instalao Feito isto, procede-se com a instalao do java, recorrendo
aos seguintes comandos:
No irei abordar em detalhes todos os aspectos da
instalao do Raspbian Stretch Lite, uma vez que j escrevi sudo apt-get update
sobre ela na edio n 48 da PROGRAMAR, pelo que acon-
selho o leitor a consultar a seco Preparao do artigo da Posto isto, verificamos se tudo correu como esperado, utilizan-
edio referida, disponvel em https://www.revista- do o seguinte comando:
programar.info/artigos/criar-um-cluster-de-processamento- java -version
paralelo-mpi-com-raspberrys/.
Feita a configurao base, o leitor deve ajustar os Que dever ter um output idntico ao seguinte:
nomes dos hosts (hostname), de forma a que cada n do
novo cluster tenha um nome que o permita identificar facil-
mente. Neste caso comeamos com o nome node1, para o
primeiro n e assim sucessivamente.
Terminadas estas configuraes iniciais, reiniciamos o De seguida verificamos a verso do compilador java com o
raspberry pi, com o comando: comando seguinte:
sudo shutdown -r now javac -version

Uma vez reiniciado o raspberry e j com acesso a ele por


ssh, procede-se s configuraes de rede, recorrendo ao
editor de texto GNU nano. Para tal comeamos por editar o
ficheiro /etc/network/interfaces, recorrendo ao seguinte co-
mando: Posto isto, avanamos para a preparao do grupo de
utilizadores, e conta, recorrendo aos seguintes comandos:
sudo nano /etc/network/interfaces
sudo addgroup hadoop
sudo adduser --ingroup hadoop hduser
sudo adduser hduser sudo
Dentro do editor, colocamos o ficheiro de forma a ficar idnti-
co ao seguinte, e gravamos. Com esta etapa terminada, avanamos para a configu-
iface eth0 inet static rao das chaves SSH, com palavra passe em branco, para
address 192.168.0.110 permitir que os ns hadoop possam comunicar entre si, sem
netmask 255.255.255.0 estarem constantemente a solicitar a introduo da palavra
gateway: 192.168.0.1 passe. Para tal, executamos os comandos seguintes:
Terminada a edio e gravado o ficheiro, editamos o fichei- su hduser
ro /etc/resolv.conf, para configurar os nameservers correcta- mkdir ~/.ssh
ssh-keygen -t rsa -P ""
mente. cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys

Reiniciamos o raspberry pi novamente e assim que esteja Verifica se o hduser pode fazer login no SSH
reiniciado, podemos continuar com a instalao do restante
su hduser
software. ssh localhost

7
TEMA DA CAPA
RASPBERRY PI HADOOP
Instalao do Hadoop Findas as configuraes anteriores, est na hora de
configurar o prprio Apache Hadoop. Para tal, usamos o
Neste momento, temos tudo pronto para instalar o
editor nano, para editar o ficheiro /opt/hadoop/conf/core-
Apache Hadoop no primeiro n. A primeira tarefa para se
site.xml, e colocamos o seguinte no ficheiro:
instalar o hadoop, proceder ao download do mesmo.
<configuration>
cd ~/ <property>
wget http://mirrors.up.pt/pub/apache/hadoop/ <name>hadoop.tmp.dir</name>
common/hadoop-2.8.1/hadoop-2.8.1.tar.gz <value>/hdfs/tmp</value>
sudo mkdir /opt </property>
sudo tar -xvzf hadoop-2.8.1.tar.gz -C /opt/ <property>
cd /opt <name>fs.default.name</name>
sudo mv hadoop-2.8.1 hadoop <value>hdfs://localhost:54310</value>
sudo chown -R hduser:hadoop hadoop </property>
</configuration>
Aps a instalao do Hadoop e ainda antes de ser
utilizado, so necessrias efectuar algumas configuraes. O mesmo se aplica para o ficheiro mapred-site.xml
Existem diversas opes disponveis para a configurao que se encontra no mesmo directrio, e o contedo deve ser
que se segue, no entanto, por opo a configurao ser idntico ao seguinte:
feita no utilizador hduser. Para tal, adiciona-se o seguinte ao
<configuration>
ficheiro bashrc que se encontra no directrio home do utiliza- <property>
dor hduser. <name>mapred.job.tracker</name>
<value>localhost:54311</value>
export JAVA_HOME=$(readlink -f /usr/bin/java | </property>
sed "s:bin/java::") </configuration>
export HADOOP_INSTALL=/opt/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
De igual modo para o ficheiro hdfs-site.xml:

Executada a tarefa, fazemos logout do utilizador pi e <configuration>


login com o utilizador hdusr, para que possamos verificar se <property>
<name>dfs.replication</name>
o executvel do hadoop est acessvel fora do fomr /opt/ <value>1</value>
hadoop/bin, recorrendo aos seguintes comandos: </property>
<property>
su hduser <name>dfs.block.size</name>
hadoop version <value>5242880</value>
</property>
</configuration>
O output do comando deve ser algo parecido com:
Com todas estas configuraes feitas, est na hora
hduser@node1 /home/hduser $ hadoop version
Hadoop 2.8.1 de criar o sistema de ficheiros (file system) para o Apache
Hadoop (HDFS). Para tal executamos os comandos seguin-
Vamos agora para a configurao seguinte, que a tes, pela seguinte ordem:
configurao de variveis de ambiente do Apache Hadoop. sudo mkdir -p /hdfs/tmp
Para tal, recorremos ao nano, como super-user, para editar o sudo chown hduser:hadoop /hdfs/tmp
ficheiro /opt/hadoop/conf/hadoop-env-sh, e descomentamos sudo chmod 750 /hdfs/tmp
algumas linhas. Para editar executamos: hadoop namenode -format

E agora iniciamos os servios do Apache Hadoop!


sudo nano /opt/hadoop/conf/hadoop-env-sh
Para tal temos de trocar de utilizador para o hduser, caso
E descomentamos as linhas seguintes: no estejamos a usar esse mesmo utilizador.
# The java implementation to use. Required.
export JAVA_HOME=$(readlink -f /usr/bin/java /opt/hadoop/bin/start-dfs.sh
| sed "s:bin/java::") /opt/hadoop/bin/start-mapred.sh

# The maximum amount of heap to use, in MB. Uma vez iniciados os servios, est na hora de verifi-
Default is 1000. car se tudo est a correr como deveria. Para tal executa-se o
export HADOOP_HEAPSIZE=250
comando jps, que deve produzir um outpoot parecido com:
# Command specific options appended to HA- 16640 JobTracker
DOOP_OPTS when specified 16832 Jps
export HADOOP_DATANODE_OPTS="- 16307 NameNode
Dcom.sun.management.jmxremote $HA- 16550 SecondaryNameNode
DOOP_DATANODE_OPTSi -client" 16761 TaskTracker
16426 DataNode

8
TEMA DA CAPA
RASPBERRY PI HADOOP
Com isto tudo terminado, chegou a hora de executar </configuration>
o primeiro teste! Neste caso ser apenas com um n. Para
realizar o teste, copiamos um ficheiro qualquer, para o direc- Editamos tambm o ficheiro mapred-site.xml e colocamos o
seguinte no ficheiro:
trio /opt/hadoop/, no caso ser usado o ficheiro da licena
do hadoop (license.txt), mas pode ser usado outro qualquer. <configuration>
Os comandos para o teste so os seguintes: <property>
<name>mapred.job.tracker</name>
hadoop dfs -copyFromLocal /opt/hadoop/ <value>node1:54311</value>
LICENSE.txt /license.txt </property>
hadoop jar /opt/hadoop/hadoop-examples-1.2.1.jar </configuration>
wordcount /license.txt /license-out.txt
Por fim, mesmo antes de gerar a imagem, resta-nos
E para ver os resultados, copiamos o ficheiro de volta, limpar o Hadoop FileSystem (HDFS). Para tal executamos o
para o sistema de ficheiros local (lembro que copiamos o comando seguinte:
ficheiro para o sistema de ficheiros do apache hadoop.
rm -rf /hdfs/tmp/*
hadoop dfs -copyToLocal /license-out.txt ~/
Posto isto avanamos para o passo seguinte que ser
E agora podemos abrir o ficheiro de resultados para desligar o n actual e fazer a imagem que nos ir permitir
ver-mos os mesmos. O dispositivo deve apresentar cada criar todos os outros ns com menos esforo.
palavra do ficheiro da licena e o seu numero de ocorrncias
Comeamos por desligar o n actual, retiramos o
nesse mesmo ficheiro. Para tal vamos novamente recorrer
carto de memria e fazemos uma imagem do mesmo. Nes-
ao nano, para abrir o ficheiro part-r-00000.
te caso, ser usado o sistema operativo Windows e como tal
nano ~/license-out.txt/part-r-00000 ser usado o software Win32DiskImager, para fazer a ima-
gem do carto de memria.
Chegados a este ponto, est na hora de preparar os
O Win32DiskImager pode ser descarregado em:
restantes ns do cluster!
https://sourceforge.net/projects/win32diskimager/.
Antes de passar para a etapa seguinte que consiste
Uma vez descarregado e instalado, podemos proce-
em desligar deste n para criar uma imagem do carto,
der com a produo de uma imagem do carto de memria,
temos de executar mais algumas configuraes que nos iro
recorrendo ao Win32DiskImager. Escolhemos uma pasta
poupar tempo futuramente. Para tal executamos o comando
onde vai ficar o ficheiro da imagem (figura seguinte)
seguinte e colocamos os endereos IP dos ns que preten-
demos usar.
sudo nano /etc/hosts

192.168.0.101 node1
192.168.0.102 node2
192.168.0.103 node3
192.168.0.104 node4
192.168.0.105 node5

Seguidamente vamos definir o nome do nosso n


principal! Para tal editamos o ficheiro masters que se encon-
tra em /opt/hadoop/conf
Agora escolhemos a unidade correspondente ao car-
to de memria, na combobox referente a device.
sudo nano/opt/hadoop/conf/masters
De seguida basta carregar read, para a imagem ser feita.
E dentro do ficheiro colocamos o nome do n:
Para escrever esta mesma imagem num outro carto
node1
de memria o processo idntico, mas no sentido inverso,
De seguida editamos o ficheiro core-site.xml que se ou seja, escolhemos a imagem e a unidade do carto de
encontra em /opt/hadoop/conf e colocamos o seguinte no memria de destino, e clica-se no boto write.
ficheiro:
Com a imagem no carto temos uma base para fazer
<configuration> todos os restantes nodes, basta editar as configuraes,
<property> alterando o nome do host recorrendo tal como anteriormente
<name>hadoop.tmp.dir</name>
<value>/hdfs/tmp</value> explicado a um editor de texto e editando o ficheiro /etc/
</property> hostname. De seguida editamos o ficheiro /etc/network/
<property> interfaces e colocamos o endereo de ip correspondente ao
<name>fs.default.name</name>
<value>hdfs://node1:54310</value> n em causa e reiniciamos o raspberry.
</property>

9
TEMA DA CAPA
RASPBERRY PI HADOOP
Neste momento podemos prosseguir com as restan- jps
tes configuraes do n, comeando por editar o ficheiro
slaves que se encontra em /opt/hadoop/conf/ recorrendo a Neste momento se no foi indicado nenhum erro,
um editor de texto e colocando no ficheiro o seguinte: podemos confirmar o estado de cada n acedendo ao inter-
node1 face web de cada um, nos endereos http://node1:50030 e
node2 http://node1:50070 .
node3
Neste momento estamos prontos a usar o cluster
Repetimos os procedimentos anteriores para todos os Apache Hadoop!
ns que queiramos criar. Eu apenas fiz com 5, no entanto o
Antes de comear a usar o cluster vamos preparar o
leitor pode fazer com quantos pretender.
primeiro n (node1) para funcionar como n mestre (master
node). Para tal editamos o ficheiro slaves do primeiro n
(node1) e removemos a linha onde consta node1 e de se-
Testar o cluster guida reiniciamos o cluster com os comandos seguintes:
Agora sim, aps todas as etapas, chegamos fase
stop-mapred.sh
mais apetecvel de todo este artigo, vamos ento, testar o stop-dfs.sh
Cluster! Com todos os raspberrys ligados a um switch, e start-dfs.sh
ligados entre si, chegou o momento de comear o teste. start-mapred.sh

O primeiro passo ser testar se os ns comunicam E por fim, hora de testar! Para tal e apenas a ttulo de
entre si por ssh, sem necessidade de password. Contudo, exemplo executamos um teste usando o programa
antes de procedermos a estas ligaes, necessitamos de wordcount, e o ficheiro de exemplo mediumfile.txt que dis-
copiar o ficheiro id_sra.pub do primeiro n (node1), para a ponibilizado pelo Apache Hadoop.
directoria /home/hduser/.ssh/authorized_keys de cada um
hadoop jar /opt/hadoop/hadoop-examples-1.2.1.jar
dos ns do cluster. Existem diversas formas de descarregar
wordcount /mediumfile.txt /mediumfile-out.txt
o ficheiro para cada n, pelo que se deixa ao cargo do leitor
escolher a que entender por melhor. Feito isto, procedemos
Concluso
para o teste.
O Apache Hadoop uma ferramenta extremamente
Para tal executamos os comandos seguintes, no n
til, para trabalho com grandes volumes de dados e oferece
principal:
muitas mais possibilidades do que as abordadas ao longo
su hduser deste artigo. A instalao do Apache Hadoop no raspberry,
ssh node1 no traz particulares vantagens no desempenho, quando
exit comparado com equipamentos mais poderosos, como com-
ssh node2
exit putadores pessoais ou at mesmo servidores. No entanto
ssh node3 dado o baixo custo dos raspberry e o seu baixo consumo,
exit so uma boa alternativa para quem pretende explorar o Apa-
ssh node4
exit che Hadoop, ou por exemplo ter o seu prprio cluster ha-
ssh node5 doop, para anlises de dados (maiores, menores, cada um
exit ter um uso diferente). Existem diversas optimizaes que
Com isto feito temos de formatar o HDFS de cada n ficaram por fazer, mas que creio que saam claramente fora
e de seguida iniciar os servios. Para tal usamos os coman- do mbito do artigo, que apenas pretende apresentar a tec-
dos seguintes no primeiro n (node1): nologia e um exemplo simples de colocar em funcionamento.

hadoop namenode -format Espero que o leitor se divirta a montar o seu prprio
/opt/hadoop/bin/start-dfs.sh cluster hadoop!
/opt/hadoop/bin/start-mapred.sh

jps

Para os restantes ns o comando ser o seguinte:

AUTOR
Escrito por Antnio C. Santos

Programar criar um novo mundo escrevendo cdigo, cumprindo os mais elementares desgnios da
vida, aprender, ensinar, criar, partilhar, melhorar e seguir. Formou-se no Instituto Politcnico de Viana
do Castelo. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio desde 2012, actualmente exerce funes
de mentor voluntrio na plataforma MOOC Coursera . Twitter:@apocsantos

10
A PROGRAMAR
Correndo uma Aplicao Web Java em Azure, passo a passo
Junit
Criar uma aplicao mvel com jQuery Mobile
Lua Linguagem de Programao Parte 13
Tipos de dados int e variantes na linguagem C
Feed RSS em C# .NET Core no Azure Web App em Linux
A PROGRAMAR
Correndo uma Aplicao Web Java em Azure, passo a passo

Como alguns vs sabem, eu perteno organizao Aps o registo, e validao da conta, recomendo que
da Comunidade Netponto e h uns tempos organizamos o faam login e deem uma volta pelas opes do portal do
Visual Studio Launch Party nas instalaes da Microsoft Por- Azure. Apenas para ganharem sensibilidade para as opes
tugal. Nesse evento, tivemos o Miguel Caldas a realizar o e os produtos que esto disponveis. Alerto, desde j, que
Keynote onde ele, entre muitas mensagens, destacou: existem alguns servios que precisam de um upgrade na
conta, pelo que tm alguns custos. uma questo de anali-
Ns queremos correr o vosso software sarem.
Software Utilizado
uma mensagem simples, mas poderosa, que mos-
tra a mudana da postura perante outras tecnologias que Para concretizar o desenvolvimento da aplicao de
no sejam .NET, como seja o PHP ou o Java. demonstrao e publicar no Azure foi utilizado o seguinte
conjunto de aplicaes:
J h algum tempo que estou tentado em realizar
algumas experiencias envolvendo o desenvolvimento de Spring Tool Suite 3.9.0 Release
uma aplicao utilizando Java como linguagem de programa-
JDK 1.8.0_122
o.
Tomcat 8.0.24
Quem j trabalha em aplicaes com Java h algum
tempo sabe os desafios que trs consolidar todas as partes Docker
para que a aplicao flua sem problemas.
MySql (docker image: latest)
Neste artigo vou descrever os passos que dei ao lon-
FileZilla 3.27.1
go do processo, referindo os desafios que encontrei e como
os ultrapassei. Saliente o propsito deste artigo colocar Podero utilizar o IDE de vossa preferncia ou utilizar
uma aplicao web em Java a correr no Azure e no as boas a instancia de MySql que j tenham instalada. Pessoalmente
prticas do cdigo em si, apesar de algumas serem aplica- uso Docker sempre que possvel nas minhas demonstra-
das inconscientemente. es, pois no preciso de me preocupar muito com a sua
configurao ou poluir a minha mquina com o software que
Pr-Requisitos tenha que instalar.
Vamos l comear.... Ao investigar pela Internet, e em particular no site de
documentao do Azure2, podero encontrar referncias em
Antes de tudo precisamos de uma conta no Azure1 e
instalar o Azure Toolkit3 para integrao com a plataforma.
nada mais simples que aceder ao site e criar uma conta:
Pela minha experincia, os benefcios de instalar o plugin
no so muitos, trazendo um overhead no arranque do IDE e
requer um conhecimento de magia negra conseguir atingir
o objetivo, pelo que opto por manter o IDE mais simples e
limpo possvel para construir a demonstrao e mostrar o
propsito.
A Aplicao de Exemplo
O propsito da aplicao muito simples. uma aplicao
do template Dynamic Web Project, sem configuraes adi-
cionais em especial.Figure

E preencher os dados. Simples, certo!?


Figur1 Dynamic Web Project Template

12
A PROGRAMAR

CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO


O projeto composto por uma pgina JSP (index.jsp) primeiro caso). Parece evidente, no entanto no imaginam o
com um link para invocar uma servlet (HelloWorld.java) que quanto frequente esquecerem-se dos drivers e quando a
invoca uma chamada base de dados aplicao no funciona:
(SessionConnector.java), processo o resultado e devolve uma
No percebo, funciona na minha mquina.
lista com todos os resultados da tabela Sessions, expondo o
resultado noutra JSP (ListSessions.jsp). -vos familiar?!

Configuraes TomCat
Para configurar um datasource/resource no Tomcat,
basta realizar duas operaes:

Copiar o driver para a pasta $CATALINA_BASE/lib

Editar o ficheiro $CATALINA_BASE/conf/context.xml


Neste ficheiro configura-se o datasource:

<Context>
...
<Resource
name="[JNDI NAME]"
auth="Container"
type="javax.sql.DataSource"
maxActive="50"
maxIdle="30"
maxWait="10000"
driverClassName="com.mysql.jdbc.Driver"
username="[USERNAME]" password="[PASSWORD]"
url="jdbc:mysql://[SERVER]:[PORT]/
[DATABASE]"/>
...
</Context>

Como que funciona? O Tomcat ao arrancar importa


todas as bibliotecas de $CATALINA_BASE/lib para o seu
classpath e depois carrega as diversas configuraes (entre
as quais $CATALINA_BASE/conf/context.xml) que ficam
Figure 2: Estrutura do Projeto disponveis para todas as aplicaes que estiver a servir. A
aplicao s tem que invocar o JNDI respetivo para proceder
Nada de especial. ligao base de dados.
Algumas consideraes Agora vamos editar o nosso web.xml e adicionamos a
seguinte entrada:
Existem diversas formas de fornecer os dados da liga-
o base de dados, sendo as mais utilizadas ter a connection <resource-ref>
string no cdigo em si ou a ter em ficheiros de propriedades. <description>MySQL Datasource example</
Para efeitos de demonstrao ou para os nossos pequenos description>
<res-ref-name>jdbc/community_events</res-ref-
projetos poder no haver problema, mas quando as coisas name>
crescem ou mudam de mbito um aborrecimento ter as coi- <res-type>javax.sql.DataSource</res-type>
sas assim. <res-auth>Container</res-auth>
</resource-ref>
Em alternativa, podemos configurar no servidor aplicaci-
Base de Dados
onal um datasource/resource para a base de dados, e no pro-
jeto referenciamos o nome desse datasource/resource para Para a base de dados, usei o container Docker de
aceder base de dados e fazer o que queremos. MySql:
A grande vantagem desta abordagem o facto de preci-
docker run --name MySqlContainerForTests -p
sarmos de mexer nas connections strings quando exportamos 3308:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d
a aplicao da nossa maquina de desenvolvimento para o ser- mysql
vidor onde vai estar alojada.
Depois da base de dados estar disponvel, acedi
Outro ponto em ter em ateno, diz respeito ao driver
base de dados com o MySQL Workbench e criei a base de
JDBC, neste caso MySql, que deve ser disponibilizado no ser-
dados, a tabela para o exemplo e inseri dados.
vidor (no segundo caso) ou deve seguir com o pacote final (no

13
A PROGRAMAR
CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO
Dynamic Web Project protected void doGet(...) ...{
Para o projeto em si s preciso a biblioteca jstl-1.2.jar, SessionConnector sc = new SessionConnector();
Iterable<Session> sessions = sc.getSessionList();
para se poder utilizar taglibs nas JSPs. No relevante em si request.setAttribute("sessions", sessions);
para este projeto, mas como no estamos a usar Maven para request.getRequestDispatcher
gerir as dependncias, precisamos de preocupar com ("ListSessions.jsp").forward(request, response);
}
identificao das bibliotecas e a sua exportao especifica.
Moving on ...
Por fim temos as JSPs:
Como mencionei no inicio, o projeto tem trs classes
java sendo que a mais relevante a classe SessionConnector. index.jsp: com um link para invocar a servlet.

Nesta classe onde obtemos o datasource, realizada <body>


a operao na base de dados e processados os resultados. Hello Azure
<a href="HelloWorld">List of sessions</a>
A obteno do datasource realizado no construtor da </body>
classe:
private static final String JNDI_DATASOURCE = ListSessions.jsp: apresenta o resultado da bd.
"java:comp/env/jdbc/community_events";
<body>
private DataSource ds; <table>
<thead>
public SessionConnector() { <tr>
try { <td>RECORD_ID</td>
Context ctx = new InitialContext(); <td>FULLNAME</td>
ds = (DataSource)ctx.lookup(JNDI_DATASOURCE); <td>EMAIL</td>
} catch (NamingException e) { <td>SESSION_TITLE</td>
e.printStackTrace(); <td>SESSION_DESCRIPTION</td>
} <td>OBSERVATIONS</td>
} </tr>
</thead>
Btw, nunca se esqueam de tratar as exce- <tbody>
es. :-) <c:forEach var="session" items="${sessions}">
O seguinte mtodo faz o resto do trabalho, <tr>
<td>${session.recordId}</td>
mantendo as coisas simples: <td>${session.fullName}</td>
<td>${session.email}</td>
public Iterable<Session> getSessionList() <td>${session.sessionTitle}</td>
{ <td>${session.sessionDescription}</td>
List<Session> sessions = new LinkedList<Session> <td>${session.observations}</td>
(); </tr>
try { </c:forEach>
Connection con = ds.getConnection(); </tbody>
Statement stm = con.createStatement(); </table>
ResultSet rs = stm.executeQuery </body>
(GET_ALL_SESSIONS);
processResultSet(sessions, rs);
rs.close(); Para utilizar a taglib, tem que incorporar a seguinte
stm.close();
} catch (SQLException e) { instruo no inicio do ficheiro:
e.printStackTrace();
} <%@ taglib uri = "http://java.sun.com/jsp/jstl/
return sessions; core" prefix = "c" %>
}
E o resultado o seguinte:
Decerto reparam que no estou a fechar a Connection
e podero pensar que deveria o fazer. Estamos perante um
caso de separao de responsabilidades, se fosse eu explici-
tamente a abrir a ligao, ento deveria ser eu a fechar a mes-
ma. Porm, neste caso, estou a pedir a uma entidade
(Datasource) que me disponibilize uma Connection para eu
realizar o meu trabalho e como tal no a fecho e ela volta para
a pool de ligaes.
A outra classe java (HelloWorld.java) uma servlet que
no mtodo GET invoca a classe anterior e devolve os resulta-
dos para a JSP. Figure 3: index.jsp

14
A PROGRAMAR

CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO

Figure 4: ListSessions.jsp
E a seco mais simples est feita. Agora vamos publi-
car no Azure. Simple, certo?

Clicamos no boto Add e preenchemos os dados.


Benvindos ao Microsoft Azure Parte 1
Vou ser honesto, pela minha experincia, no simples
nem agradvel o caminho de publicar a primeira aplicao java
no Azure e que precise de ligao a base de dados MySql.
Foram precisos mais do que dois cliques para conseguir a apli-
cao a funcionar. O pessoal esta trabalhar arduamente para
integra mais tecnologias no portal, mas (na minha humilde opi-
nio) ainda tem um longo percurso a seguir.
Para publicar a aplicao necessrio ter uma conta no
Azure, como mencionado no inicio.
A primeira coisa que vamos fazer, depois do login,
criar um resource group, para que a nossa aplicao e todos
os seus recursos estejam arrumados no mesmo grupo.

Aps a concluso vamos para a home page do nosso


resource group.

15
A PROGRAMAR
CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO

Agora vamos criar um resource do tipo Web App + ANTES de clicar em CREATE, depois de
MySQL e para tal voltamos a clicar em Add e pesquisamos escolhermos o endereo do nosso site, selecionamos App
por Web App + MySQL. Service plan para podermos escolher a localizao do
nosso site e dar um nome mais legvel.
Neste ecr, carregamos em Create New e
preenchemos os dados s nossas necessidades.

Vamos escolher logo o primeiro resultado e clicamos


em Create.
Agora vamos preencher os seguintes dados do
formulrio.

E carregamos em OK.
Finalmente carregamos em Create. Ao fim de
alguns minutos ficamos com o ambiente criado e somos
notificados pelo smbolo do sino no topo da pgina.
Esta primeira parte est concluda. Criamos um
resource group para a nossa aplicao e criar uma instancia
de webapps com base de dados MySql para servir a nossa
aplicao.
Agora vamos configurar a instncia para servir a
aplicao que previamente criamos.

16
A PROGRAMAR

CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO

Benvindos ao Microsoft Azure Parte 2 Agora vamos tratar da base de dados. Voltamos
caixa de pesquisa e pesquisamos por MySQL In App e
Uma vez concludo, selecionamos novamente Resource
selecionamos o resultado.
Groups no menu e selecionamos o resource group que
acabamos de criar. E podemos verificar os recursos que esto
associados ao grupo.

Nesta altura vamos escolher o nosso App Service e Aqui podemos confirmar que temos uma base de
entramos no painel de controlo do nosso servidor dados MySQL in App, a localizao da base de dados e a
aplicacional. connection string dela.
Aqui comeam os primeiros desafios.
Desafio #1
O primeiro alerta esta no inicio da pgina:

E torna-se ainda mais desafiante se seguirmos o link


indicado:

Por omisso, as webapps so em .NET mas como a


nossa aplicao Java vamos ter que reconfigurar.
Depressa vo descobrir que a caixa de pesquisa o
vosso melhor amigo, por isso vamos comear a utilizar desde
j.
Pesquisem Application settings e cliquem no
resultado. No painel de opes alterem para as configuraes No expectvel que a utilizao desta base de
desejadas e carreguem em Save. dados seja de longa durao e utilizao. Para testar/brincar
serve mas para algo mais a srio h considerar outras
alternativas.
Desafio #2
Precisamos de construir a base de dados para a
nossa aplicao e como no podemos aceder remotamente
instncia da base de dados vamos ter que utilizar o
PHPMyadmin.
Para acedermos instncia de PHPMyadmin
clicamos no boto Manage no topo da pgina.

17
A PROGRAMAR
CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO

Ento vamos obter as credenciais de acesso base


de dados. Vamos localizao /data/mysql, abrirmos o
ficheiro MYSQLCONNSTR_localdb.ini e encontramos as
credenciais de acesso.

E vamos para pagina de login:

Voltamos pagina do PHPMyadmin e introduzimos


as credenciais.
Para grande espanto meu, deparei-me com esta
imagem:

Eis que surge a questo:


Quais so as credenciais?
Houston, we have a problem....
nesta altura que vamos comear a utilizar o Filezilla,
mas antes precisamos de saber quais so os dados de ligao
ao servidor para podermos configurar.
Vamos comear por definir credenciais para aceder.
Para configurar, vamos caixa de pesquisa, pesquisamos por
Deployment credentials e selecionamos o resultado.
Aqui podemos criar um utilizador e definir a password do
utilizador.
Voltamos nossa caixa de pesquisa e pesquisamos
Properties e clicamos no resultado. Na pgina seguinte
temos todos os dados que necessitamos para configurarmos o
cliente FTP/FTPS para aceder ao servidor.
Nesta altura abrimos o FileZilla e configuramos um novo
servidor com os dados obtidos na pgina anterior. Aps a
configurao clicamos em Connect e estamos dentro do
servidor.

E roguei muitas pragas... :-)


Long story short. No se preocupem com a
mensagem, apenas quer dizer que o servidor no est a
correr, pelo que no se consegue ligar para se autenticar.
Por omisso os servidores no esto ativos para
poupar recursos e evitar gastos acidentalmente. Mas

18
A PROGRAMAR

CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO

relativamente simples ativar os servidores ... Aps saber como temos a base de dados construda, agora s precisamos
se faz. publicar, certo?
Vamos verificar se o servidor est ou no activo. Bem, no. Ainda temos algum trabalho para fazer.
Voltamos caixa de pesquisa, pesquisamos Process Como estamos a utilizar uma instancia do Tomcat no
explorer e clicamos no resultado. Azure no temos acesso pasta de instalao para copiar o
driver para a pasta $CATALINA_BASE/lib e editar o ficheiro
$CATALINA_BASE/conf/context.xml.
Como no temos forma de fazer estas configuraes
temos que alterar o nosso projeto.
Antes de mais, vamos copiar o driver para o nosso
projeto (junto da biblioteca jslt-1.2.jar) na pasta
WebContent/WEB-INF/lib/. Depois criamos o ficheiro
context.xml na pasta WebContent/META-INF com o
seguinte contedo:
Como esperado o servidor de base de dados no est
ativo, mas vamos ativar. Existem duas formas: <Context>
<Resource
Fazemos ping a partir da nossa mquina ao nosso site. name="[JNDI NAME]"
auth="Container"
Acedemos ao nosso site. type="javax.sql.DataSource"
maxActive="50"
O endereo do site pode ser obtido na pgina de Overview. maxIdle="30"
maxWait="10000"
Aps acedermos ao site (ou fazermo ping ao mesmo) driverClassName="com.mysql.jdbc.Driver"
voltamos ao Process explorer e verificamos que a instancia username="[USERNAME]" password="[PASSWORD]"
url="jdbc:mysql://[SERVER]:[PORT]/
de MySql j se encontra ativa. [DATABASE]"/>
</Context>

Em que os dados a preencher so:

[USERNAME]: username de acesso ao PHPMyAdmin

[PASSWORD]: password de acesso ao PHPMyAdmin

[SERVER]: No topo da pgina do PHPMyAdmin

[PORT]: No topo da pgina do PHPMyAdmin

[DATABASE]: No topo da pgina do PHPMyAdmin


Se tentarmos novamente entrar na pgina do
PHPMyAdmin com as mesmas credenciais: Exemplo da informao no PHPMyAdmin:

Depois de configurarmos, gravamos o ficheiro e


garantimos que quando exportamos o ficheiro war, as
bibliotecas so exportadas tambm:

Agora uma questo de construirmos a nossa base de


dados e popular com os dados necessrios.
Desafio #3
J temos o servidor aplicacional Java configurado, j

19
A PROGRAMAR
CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO

E exportamos o war. Passados uns minutos a aplicao est instalada.


Publicar a aplicao Se clicarmos no link para o site da aplicao, poder
aparecer o seguinte cran:
Finalmente chegamos ao que interessa, publicar a
nossa aplicao. :-)
Abrimos novamente o FileZilla, acedemos ao servidor e
vamos at seguinte localizao:
/site/wwwroot/webapps

Se colocarmos o contexto-root da aplicao


acedemos mesma.

E fazemos upload da nossa aplicao.

Apesar da aplicao estar no servidor, ela s ser Mas no isto que se pretende. O objetivo aceder ao site
instalada aps o prximo restart do servidor. pelo URL e entrar logo na aplicao.
Para fazer restart do servidor, vamos pagina Para realizar esse objetivo, temos duas hipteses
Overview e carregamos Restart no topo da pgina. mais simples:

Na pasta /site/wwwroot/webapps/ROOT colocamos


um index.html que a nica coisa que faz um redirect
para a nossa aplicao.

Quando exportamos o nosso WAR, damos o nome


ROOT.war e depois de fazermos upload a aplicao
deployed automaticamente para a raiz do site.

Sugiro esta ltima abordagem como sendo a que


causa menos entropia.

20
A PROGRAMAR

CORRENDO UMA APLICAO WEB JAVA EM AZURE, PASSO A PASSO

Neste momento, a aplicao encontra-se viva na Internet.

Ns queremos
() Saliente o pro-
correr o vosso softwa-
psito deste artigo re () uma mensa-
colocar uma aplicao
gem simples, mas pode-
web em Java a correr
rosa, que mostra a mu-
no Azure e no as boas
dana da postura peran-
prticas do cdigo em te outras tecnologias
si, apesar de algumas
que no sejam .NET, co-
serem aplicadas in-
mo seja o PHP ou o Ja-
conscientemente. va. ()

Concluso
Foi um caminho longo para se publicar esta aplicao Recursos
no Azure, principalmente pela primeira vez, mas este guia
passo-a-passo demonstra cada um dos vrios passos e torna https://blogs.msdn.microsoft.com/
mais clere as configuraes. appserviceteam/2016/09/08/troubleshooting-faq-for-
mysql-in-apppreview/
Existem um vasto leque de opes, funcionalidades e
ferramentas disponveis no Azure que no foram abordados. https://www.mkyong.com/tomcat/how-to-configure-
Uns porque ainda no tive oportunidade de utilizar outros mysql-datasource-in-tomcat-6/
porque no se mostraram necessrios para o proposito. Uma
das funcionalidades Deployment option, que permite https://docs.microsoft.com/en-us/azure/
configurar um SCM para deploys automticos. uma
funcionalidade muito interessante, que funciona muito bem se
o projeto for em .NET. Obtm o cdigo, compila e publica sem
problemas. Mas para Java, pela experincia que tive, no
funciona, dai optar pelo FTP.
Este artigo um bom ponto de partida para publicar as
nossas aplicaes e tirar partido das inmeras funcionalidades
da plataforma. As primeiras vezes poder demorar mais a
configurar ou acertar com as configuraes, mas com o tempo
vem a experincia e torna-se mais clere.

AUTOR
Escrito por Nuno Cancelo

Curioso por natureza e engenheiro informtico por formao. Desde muito cedo me despertou o interes-
se pelos computadores e informtica com o famoso Spectrum. Tenho um gosto peculiar por aprender
novas coisas frequentemente mesmo que no venha a trabalhar com elas e optimizar os sistemas au-
mentando a sua performance.

21
A PROGRAMAR
Junit

JUnit um framework open-source para escrever e <version>5.0.0-M6</version>


executar testes em Java. Com ele tambm possvel execu- </dependency>
</dependencies>
tar os asserts que verificam se uma condio verdadeira. </plugin>
Recentemente (18/07/2017) foi lanada uma verso milesto-
ne (provavelmente no uma verso final e completa) Com isso configurado, j possvel executar o co-
do JUnit 5, que necessita do Java 8. mando mvn test para executar os testes do JUnit 5.

A primeira aparncia que existem vrias funcionali- Criei um projeto java-sample-project utilizando algu-
dades legais, tais como testes parametrizados (poder passar mas funcionalidades do JUnit 5 e vou resumir apenas
vrios parmetros para um mesmo teste executar vrias algumas das funcionalidades:
vezes), assert de Exception melhorado, agrupar testes por
Tags e etc.
Testes Parametrizados
Configurao
Permite rodar o mesmo teste com parmetros
Para poder utilizar a verso milestone 6 do JUnit,
diferentes com a anotao @ParameterizedTest,
basta adicionar as seguintes dependncias no
vindo de diferentes fontes: Valores puros (String,
pom.xml:
Integer, etc.), Enum, CSV, Mtodos
<dependency>
<groupId>org.junit.jupiter</groupId> No projeto, utilizei o @MethodSource para exemplo:
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.0-M6</version> @ParameterizedTest
<scope>test</scope> @MethodSource(value="createUsers")
</dependency> public void testParameterizedUser(User user,
<dependency> Integer id) {
<groupId>org.junit.jupiter</groupId> Assertions.assertEquals(user,
<artifactId>junit-jupiter-params</artifactId> userService.getById(id));
<version>5.0.0-M6</version>
<scope>test</scope> }
</dependency>
... Com isso, o teste ir procurar um mtodo
<repositories>
<repository> chamado createUsers que retorna
<id>snapshots-repo</id> um Stream<Arguments>:
<url>https://oss.sonatype.org/content/
repositories/snapshots</url> protected static Stream<Arguments> createUsers()
<releases> {
<enabled>false</enabled> return Stream.of(
</releases> Arguments.of(userOne(), 1),
<snapshots> Arguments.of(userTwo(), 2)
<updatePolicy>always</updatePolicy> );
<enabled>true</enabled>
</snapshots> }
</repository>
<repositories>
Os parmetros esperados no meu mtodo do teste
O suporte a IDEs ainda bem escasso, ento ne-
cessrio configurar um plugin do Maven: so: um User e um Integer. Nesse Stream eu estou
passando os dois. O teste ir executar primeiro com o
<plugin>
<artifactId>maven-surefire-plugin userOne() e 1, e depois com userTwo() e 2.
</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency> Assert Exceptions
<groupId>org.junit.platform
</groupId> Com o JUnit 4 era possvel testar excees, tanto
<artifactId>junit-platform-
surefire-provider</artifactId> com o @Test(expected=) quanto com o Exception
<version>1.0.0-M6</version>
</dependency> Rule (ExpectedException). Esse ltimo ainda era
<dependency>
<groupId>org.junit.jupiter</groupId> possvel validar a mensagem da exceo, mas
<artifactId>junit-jupiter-
engine</artifactId>

22
A PROGRAMAR

JUNIT


acredito que nada se compara com
Nome de Visualizao do Teste
esse assertThrows:
@Test
Esse bem legal para um melhor relatrio de testes.
public void testException() { Permite que o nome de visualizao do teste seja
Throwable exception = Assertions.assertThrows
(IndexOutOfBoundsException.class, @DisplayName("Testing exception")
() -> { userService.getAll().get @Test
(15); }); public void testException() {
Assertions.assertEquals("Index: 15, Size: 2", ...
exception.getMessage()); }
}
definido atravs da anotao @DisplayName:
OBS: Importante notar tambm o uso de Lambda
Expressions e Streams, como no caso dos testes Ok, eu sei que a descrio do meu teste foi bem
parametrizados. JUnit 5 faz bastante uso das estpida, mas vocs entenderam a ideia.
funcionalidades do Java 8.

Repetio de Testes
Asserts Agrupadas
Antes, asserts em conjunto funcionavam assim: se um Permite executar o mesmo teste mais de uma vez.
falhar, os outros nem so executados. Agora possvel Usa-se a anotao @RepeatedTest. Para melhor
agrupar os asserts de forma que todos so executados visualizao, a anotao possui algumas variveis
e todas as falhas sero reportadas juntas. Para isso, para serem utilizadas na descrio,
usado o assertAll: como displayName, currentRepetition e totalRepeti
tions.
@Test
public void groupedAssertions() {
final User user = userService.getById(1); @RepeatedTest(value=2,name="{displayName}
Assertions.assertAll("user", {currentRepetition}/{totalRepetitions}")
() -> Assertions.assertEquals("First User", @Test
user.getName()), //O teste repetir 2 vezes, ou seja, ser
() -> Assertions.assertEquals(new Integer executado 3 vezes no total
(1), user.getId()), public void testException() {
() -> Assertions.assertEquals(new Integer ...
(20), user.getAge()),
() -> Assertions.assertEquals("Rio de
Janeiro", user.getCity()) Conforme o parmetro name descrito no
);
@RepeatedTest, cada repetio ir mostrar, por
}
exemplo:
Se a primeira assero ou outra(s) falhar(em), ainda Testing exception 1/2
assim todas as asseres seriam executadas e no final
seria exibido quais falharam. Testing exception 2/2

Agrupar Testes em Tags


Assert Timeout
Esse bem legal tambm. Permite agrupar os testes
Permite testar se um mtodo vai executar dentro de um por tags e rodar apenas os testes de uma tag
tempo esperado. Para isso, usado o assertTimeout: especfica. Para isso, usa-se a anotao @Tag:
@Tag("example")
@Test
@Test public void timeoutExceeded() {
public void timeoutExceeded() { ...
Assertions.assertTimeout(ofMillis(100), () -> { }
// Simula uma task que demora menos de 100 ms.
Thread.sleep(99); // Se demorar mais de 100,
//o teste vai falhar Para rodar os testes de uma tag especfica (vamos
}); supor example), basta executar mvn test -
Dgroups=example
}
A anotao @Tag pode ser usada tanto para classes
quanto para mtodos e ambos podem ter vrias tags
definidas no mesmo lugar

23
A PROGRAMAR
JUNIT

Testes Aninhados
Com a anotao @Nested possvel criar uma classe
de testes dentro de outra classe de testes. Muito bom JUnit um fra-
para organizar melhor os testes.

public class UserServiceTest {


mework open-source
@Nested
@DisplayName("when new")
class WhenNew {
para escrever e execu-
@Test
@DisplayName("whatever")
tar testes em Java.
void isNotEmpty() {
//Seus inner tests
Assertions.assertTrue(Boolean.TRUE);
Com ele tambm
}

}
} possvel executar os
asserts que verificam
Desabilitar Testes

Para finalizar, a anotao @Disabled que desabilita um


se uma condio ver-
teste/uma classe de testes.
dadeira. Recentemente
@Test
@Disabled("For demonstration purposes")
public void skippedTest() {
(18/07/2017) foi lana-
// no executado
Assertions.assertTrue(false); da uma verso milesto-
}
ne (provavelmente no
Para saber mais sobre JUnit 5: http://junit.org/junit5/docs/
current/user-guide/
uma verso final e
completa) do JUnit 5,
que necessita do Java
8.

AUTOR
Escrito por Raphael Amoedo a.k.a. Ralph Avalon

Graduado em Cincia da Computao UVA-RJ, Ps-Graduado em Engenharia de Software com JEE


SENAC-RJ, trabalha com Java desde 2011, mas curte outras linguagens como Python e Javascript De-
senvolvedor Java na OLX, Dono dos blogs de TI (https://ralphavalonbr.wordpress.com e https://
ralphavalon.wordpress.com) e usurio ativo do Stackoverflow, Github e grupos de TI no Telegram

Linkedin: https://www.linkedin.com/in/raphael-amoedo-809427b7

24
A PROGRAMAR

Criar uma aplicao mvel com jQuery Mobile


Introduo
J muito foi escrito sobre a biblioteca jQuery para Ja-
vaScript [https://jquery.com/], incluindo alguns artigos na Revis-
ta Programar (por exemplo, "Mitos do jQuery" [https://
www.revista-programar.info/artigos/mitos-do-jquery/] e "jQuery:
Usar ou No Usar?" [https://www.revista-programar.info/
artigos/jquery-usar-ou-nao-usar/]).
No entanto, existem outros projectos "irmos" do projec-
to jQuery que so igualmente interessantes para programado-
res e designers Web, como as frameworks jQuery Mobile e
jQuery UI. Neste artigo, foco-me na jQuery Mobile explicando a
sua filosofia de programao, e mostrando alguns dos compo-
nentes principais para a criao de uma aplicao mvel.

O que , e porqu usar?


jQuery Mobile [http://jquerymobile.com/] , ao contrrio
da biblioteca jQuery, uma framework para aplicaes mveis.
Usar jQuery Mobile implica seguir uma estrutura pr-definida
para a nossa aplicao. Esta framework permite-nos criar rapi-
damente aplicaes Web com um look and feel semelhante a
aplicaes mveis nativas. A Figura 1 mostra um exemplo do
que se consegue facilmente obter com jQuery Mobile. A ima-
gem ilustra uma aplicao com uma gaveta de navegao late-
ral (Figure 1, direita) acessvel atravs de um boto no cabe-
alho (Figura 1, esquerda) da aplicao.
Uma das vantagens da jQuery Mobile que a estrutura
da aplicao definida inteiramente atravs de HTML. Por
exemplo, a gaveta de navegao da aplicao da Figura 1,
construda atravs do cdigo HTML seguinte:
Essencialmente, a framework jQuery Mobile d-nos um
<div data-role="panel" id="mypanel1" data-
display="overlay">
<img src="space-cube.svg" width="240" >
<ul data-role="listview">
<li><a href="#first-page">Page 1</a></li>
<li><a href="#second-page">Page 2</a></li>
<li><a href="#third-page">Page 3</a></li>
</ul>
</div>

conjunto de elementos de interface grfica com aspecto visual


e comportamento adequados a aplicaes mveis. Esta fra-
mework pode ser usada na construo de aplicaes mveis
finais, mas pode tambm ser til para criao de prottipos
funcionais. O facto de ser baseada em tecnologias Web, pode
torn-la especialmente til para designers multimdia interes-
sados em criar e testar um prottipo funcional de uma aplica-
o mvel: possvel definir todos os ecrs e transies entre
ecrs que no dependam de lgica especfica da aplicao Figura 1. Possvel aspecto de uma aplicao desenvolvida
sem necessidade sequer de usar JavaScript. com jQuery Mobile.

25
A PROGRAMAR
CRIAR UMA APLICAO MVEL COM JQUERY MOBILE

Filosofia de programao o entre ecrs da aplicao. O contedo visvel da pgina


deve ser colocado dentro de um <div> com role="main"
A filosofia de programao jQuery Mobile assenta es-
e class="ui-content">.
sencialmente na utilizao de atributos data-* nos elementos
HTML e classes CSS pr-definidas. Por exemplo, a definio <div data-role="page" id="pagina-1">
de um ecr da aplicao feita incluindo simplesmente um <div role="main" class="ui-content">
<div> com um id e com o atributo data-role="page" (em jQuery <p>Contedo pgina 1</p>
</div>
Mobile, um ecr designado por page): <!-- /content -->
</div>
<body> <!--/pagina-1 -->
<div data-role="page" id="pagina-1">
<!-- contedo do ecr --> <div data-role="page" id="pagina-2">
</div> <div role="main" class="ui-content">
</body> <p>Contedo pgina 2.</p>
</div>
Apesar de no ser absolutamente obrigatrio, a fra- <!-- /content -->
mework jQuery Mobile orientada principalmente para aplica- </div>
es de pgina nica (Single Page Applications - SPA), pelo <!-- /pagina-2 -->
que uma aplicao com dois ecrs definiria simplesmente dois
<div> como descendentes do <body> do documento HTML:

<body>
<div data-role="page" id="pagina-1">
<!-- contedo do primeiro ecr -->
</div>

<div data-role="page" id="pagina-2">


<!-- contedo do segundo ecr -->
</div>
</body>

Configurao
A configurao da framework no projecto Web passa
simplesmente pela incluso dos ficheiros CSS e JavaScript (as
verses podero variar):

<link rel="stylesheet"
href="http://code.jquery.com/mobile/1.4.5/
jquery.mobile-1.4.5.min.css" />
<script src="http://code.jquery.com/jquery-
1.11.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.5/
jquery.mobile-1.4.5.min.js"></script>
De notar que a jQuery Mobile depende da biblioteca
jQuery pelo que importante incluir primeiro o ficheiro JavaS-
cript jQuery e s depois o ficheiro jQuery Mobile.
Igualmente importante a incluso de um elemento
<meta> no cabealho documento HTML para garantir que a
aplicao mostrada correctamente num dispositivo mvel:
<meta name="viewport" content="width=device-width,
initial-scale=1">

Principais componentes
Pginas
Uma pgina o componente bsico em jQuery Mobile
que representa um ecr da aplicao. Todos os outros compo-
nentes que iremos ver so inseridos dentro de uma pgina. Em Exemplo 1 Pginas.
termos de estrutura HTML, uma pgina definida atravs de
um <div> com um atributo data-role="page". importante atri- Cdigo completo: https://goo.gl/Byg1jc | Ver no dispositivo
buir tambm um "id" ao <div>, uma vez que este ser a forma mvel: https://goo.gl/Y9Tfgk
de nos referirmos pgina para, por exemplo, permitir navega-

26
A PROGRAMAR

CRIAR UMA APLICAO MVEL COM JQUERY MOBILE

O Exemplo 1 demonstra uma aplicao com apenas <div data-role="page" id="pagina-1">


duas pginas. <div role="main" class="ui-content">
<p> Contedo pgina 1 </p>
De notar que ao "executar" a aplicao, apenas vemos <a data-role="button" href="#pagina-2">Boto
o contedo da primeira pgina. Para vermos a segunda pgina 1</a>
<a data-role="button" data-inline="true"
temos de adicionar alguma forma de navegao entre ecrs da href="#pagina-2">Boto 2</a>
nossa aplicao. Uma forma de permitir navegao entre ecrs <a data-role="button" data-inline="true" data
criando simplesmente links internos tal como faramos numa -icon="navigation" href="#pagina-2">Boto 3</a>
<a class="ui-btn ui-btn-icon-left ui-icon-
pgina web tradicional, usando os ids como URL internos: <a navigation ui-btn-inline ui-shadow" href="#pagina
href="#pagina-2">Link para pgina 1</a>. -2">Boto 4</a>
</div>
O Exemplo 2 ilustra esta ideia, permitindo-nos navegar <!-- /content -->
entre os dois ecrs, pressionando nos links respectivos. </div>
<!--/pagina-1 -->
Numa aplicao mvel, no entanto, no usual pressionarmos
em links para navegar - tipicamente, usamos botes.
Botes
A criao de botes ilustra bem a vantagem da utiliza-
o da framework jQuery Mobile: para criarmos um boto ape-
nas temos de adicionar um atributo ao elemento <a> que us-
mos para criar a navegao entre ecrs o atributo data-
role="button". Isto cria um boto que ocupa toda a largura do
ecr, como se pode ver no "Boto 1" do Exemplo 3. Se quiser-
mos que o boto ocupe apenas a largura necessria para mos-
trar o texto no interior, podemos acrescentar o atributo data-
inline="true" ("Boto 2").

<div data-role="page" id="pagina-1">


<div role="main" class="ui-content">
<p> Contedo pgina 1 </p>
<a href="#pagina-2">Ir para pgina 2</a>
</div>
<!-- /content -->
</div>
<!--/pagina-1 -->

<div data-role="page" id="pagina-2">


<div role="main" class="ui-content">
<p>Contedo pgina 2.</p>
<a href="#pagina-1">Ir para pgina 1</a>
</div>
<!-- /content -->
</div>
<!-- /pagina-2 -->

Exemplo 3 - Botes
Exemplo 2
Cdigo completo: https://goo.gl/NLvn7M | Ver no dispositivo
Cdigo completo: https://goo.gl/N9YBZL | Ver no dispositivo mvel: https://goo.gl/ZY4MPs
mvel: https://goo.gl/7WMS62

27
A PROGRAMAR
CRIAR UMA APLICAO MVEL COM JQUERY MOBILE

<div data-role="page" id="pagina-1"> Podemos tambm acrescentar um cone ao boto indicando


<div data-role="header" data-position="fixed"> o nome do cone no atributo data-icon ("Boto 3") a lista de
<h1>Primeira pgina</h1> cones pr-definidos pode ser consultada em https://
</div>
<!-- /header --> api.jquerymobile.com/icons/. O Exemplo 3 mostra alguns
dos tipos de botes que podemos criar desta forma. De notar
<div role="main" class="ui-content"> que estes atributos "data-*" so na verdade usados pela fra-
<p> Contedo pgina 1 </p>
<a data-role="button" href="#pagina-2">Ir para mework jQuery Mobile para determinar que classes CSS ir
Pgina 2</a> atribuir ao elemento. O ltimo boto no Exemplo 3 mostra
</div> como podemos obter o mesmo efeito indicando directamente
<!-- /content --> as classes CSS a usar ("Boto 4").
<div data-role="footer" data-position="fixed"> Cabealho e rodap
<h1>Primeira pgina</h1>
</div> comum as aplicaes mveis terem um cabealho
<!-- /footer -->
</div> e/ou um rodap com o logtipo da aplicao e com botes
<!--/pagina-1 --> de navegao. Estes elementos podem ser includos num
ecr da aplicao jQuery Mobile inserindo um elemento
<div> com data-role="header" (ou data-role="footer") dentro
da pgina correspondente ao ecr. Por exemplo, para adicio-
nar um cabealho e rodap nossa primeira pgina tera-
mos o cdigo do Exemplo 4. (Como normalmente queremos
que o cabealho e rodap fiquem sempre no topo e fundo da
janela da aplicao devemos usar tambm o atributo data-
position="fixed", caso contrrio ficaro no fluxo de contedo
da pgina e sujeitos ao scroll.)
De notar que o cdigo do cabealho e do rodap tem
de ser repetido em cada pgina em que pretendamos que
estejam presentes, caso contrrio alguns ecrs da nossa
aplicao apresentaro cabealho/rodap e outros no.

Botes e navegao no cabealho ou rodap


Os cabealhos ou rodaps das aplicaes mveis
servem, muitas vezes, como ponto de acesso a funcionalida-
des da aplicao ou como forma de navegao entre os v-
rios ecrs. Se quisermos incluir botes no cabealho ou ro-
dap podemos faz-lo atravs de um elemento <div> com
data-role="controlgroup" dentro do elemento que representa
o cabealho. Este elemento permite-nos incluir vrios botes
e controlar o seu posicionamento no cabealho ou rodap. O
Exemplo 5 mostra o cdigo a incluir no cabealho para criar
um ecr com dois botes no cabealho. No elemento que
define o controlgroup, de notar a utilizao dos atributos data
-type="horizontal" para garantir que os botes so dispostos
horizontalmente e da classe CSS "ui-btn-right" para alinhar
os botes direita (podiamos obviamente usar "ui-btn-left"
para alinhar esquerda). De notar tambm o uso do atributo
data-iconpos="notext" nos botes para esconder o texto,
ficando apenas o cone do boto.
Quando o objectivo criar uma rea de navegao
entre pginas no cabealho ou rodap, existe um componen-
te especializado a barra de navegao. A incluso de uma
barra de navegao pode ser feita no cabealho ou rodap
(ou at no corpo da pgina). No Exemplo 6, a incluso feita
Exemplo 4 Cabealho e rodap no rodap. Uma barra de navegao simplesmente um
elemento <div> com data-role="navbar". No interior do <div>
Cdigo completo: https://goo.gl/r7BVp7 | Ver no dispositivo
inserimos uma lista no ordenada com um link (elemento
mvel: https://goo.gl/AjavMT
ncora <a>) em cada item. Automaticamente, os links so

28
A PROGRAMAR

CRIAR UMA APLICAO MVEL COM JQUERY MOBILE

convertidos em botes (neste caso no necessrio adicionar <div data-role="footer" data-position="fixed">


o atributo data-role="button"). Para indicar que um boto est <div data-role="navbar">
activo (ou seja que o ecr visvel corresponde a um determina- <ul>
<li>
do boto na barra de navegao) podemos usar a classe CSS <a data-icon="home" class="ui-btn-active"
"ui-btn-active". Note-se que no Exemplo 6 o rodap apenas href="#">Home</a>
contm a navegao. No entanto, possvel combinar a barra </li>
<li>
de navegao com outros elementos. <a data-icon="gear" href="#">Settings</a>
</li>
<div data-role="header"> <li>
<div data-role="controlgroup" data- <a data-icon="info" href="#">Info</a>
type="horizontal" class="ui-btn-right"> </li>
<a data-icon="star" data-role="button" data- </ul>
inline="true" data-iconpos="notext" </div>
href="#">Favorito</a> <h1>Primeira pgina</h1>
<a data-icon="gear" data-role="button" data- </div>
inline="true" data-iconpos="notext"
href="#">Settings</a>
</div>
<h1>Primeira pgina</h1>
</div>

Exemplo 6 Barra de navegao


Cdigo completo: https://goo.gl/rLoJVw | Ver no dispositivo
mvel: https://goo.gl/c23dCK
Gaveta de navegao
A barra de navegao pode ser usada quando o n-
mero de elementos de navegao relativamente reduzido.
Para alm disso, os botes na barra de navegao conso-
Exemplo 5 Botes no cabealho mem espao que pode ser importante para mostrar contedo
mais til. Uma alternativa barra de navegao (ou um com-
Cdigo completo: https://goo.gl/8LFCd5 | Ver no dispositivo
plemento) a gaveta de navegao. A gaveta de navegao
mvel: https://goo.gl/hgoC8W

29
A PROGRAMAR
CRIAR UMA APLICAO MVEL COM JQUERY MOBILE

um painel que podemos abrir ou fechar pressionando num


boto (tipicamente o boto apresentado no cabealho). Para
criarmos uma gaveta de navegao para uma determinada
pgina adicionamos um elemento <div> com data-role="panel"
e com um id. Para listar as opes de navegao no interior da
gaveta usa-se tipicamente uma listview (uma lista no ordena-
da com data-role="listview") com links em cada item. Para pos-
sibilitar a abertura da gaveta de navegao devemos incluir um
controlgroup no cabealho com um boto que refira o id que
escolhemos para o painel que representa a gaveta de navega-
o. O Exemplo 7 mostra o cdigo completo de uma pgina
com uma gaveta de navegao. O atributo data-display no pai-
nel que representa a gaveta de navegao permite-nos confi-
gurar a forma como a gaveta surge ao utilizador ("overlay" a
forma mais comum, em que a gaveta puxada para cima do
contedo do ecr; "reveal" cria uma gaveta fixa e o contedo
do ecr que se move para mostrar a gaveta por baixo; "push"
cria uma gaveta ao lado do contedo do ecr e ambos de mo-
vem para mostrar ou esconder a gaveta.)

<div data-role="page" id="pagina-1">

<div data-role="header">
<h1>Primeira pgina</h1>
<div data-role="controlgroup" data-type="horizontal"
class="ui-btn-left">
<a data-icon="bars" data-iconpos="notext" data-
role="button" href="#gaveta1">Menu</a>
</div>

</div>
<!-- /header -->

<div data-role="panel" id="gaveta1" data-display="overlay">

<!-- Fake logo from: https://github.com/pigment/fake-logos


-->
<img src="https://s3-us-west-2.amazonaws.com/
s.cdpn.io/455884/space-cube.svg" width="240">

<ul data-role="listview">
<li>
<a href="#pagina-1">Pgina 1</a>
</li>
<li>
<a href="#pagina-2">Pgina 2</a>
</li>
<li>
<a href="#pagina-3">Pgina 3</a>
</li>
</ul>

</div>

<!-- /gaveta navegao -->

<div role="main" class="ui-content">

<p> Contedo pgina 1 </p>

</div>

<!-- /content -->


Exemplo 7 Gaveta de navegao
</div>
<!--/pagina-1 --> Cdigo completo: https://goo.gl/P9dEHZ | Ver no dispositivo

30
A PROGRAMAR

CRIAR UMA APLICAO MVEL COM JQUERY MOBILE

mvel: https://goo.gl/Vg99iY Concluso


De notar que a gaveta de navegao tem de ser inclu- H, obviamente, muito mais a dizer sobre jQuery Mo-
da em cada pgina (com um id diferente para cada pgina). bile, no apenas sobre componentes de interface grfica
possvel evitar este tipo de repetio, mas neste momento, isso disponveis, mas tambm sobre a API JavaScript que nos
obriga ao uso de algum cdigo JavaScript, por isso no abordo permite instanciar e controlar programaticamente os compo-
essa forma de incluso de gavetas de navegao. nentes de interface grfica, e tambm sobre a possibilidade
de customizao da aparncia dos componentes.
Com esta introduo, o leitor ter ficado com uma
ideia das possibilidades que a framework jQuery Mobile nos
No entanto, d, da sua estrutura, e dos principais componentes de inter-
face grfica disponveis.
existem outros projec-
tos "irmos" do projec-
to jQuery que so igual-
mente interessantes pa-
ra programadores e de-
signers Web, como as
frameworks jQuery Mo-
bile e jQuery UI. Neste
artigo, foco-me na jQue-
ry Mobile explicando a
sua filosofia de progra-
mao, e mostrando al-
guns dos componentes
principais para a cria-
o de uma aplicao
mvel.

AUTOR
Escrito por Jorge Cardoso

Jorge C. S. Cardoso professor auxiliar convidado no Departamento de Engenharia Informtica da Uni-


versidade de Coimbra onde lecciona disciplinas relacionadas com tecnologias web, programao, e inte-
raco humano-computador. autor do livro "Java para Telemveis" editado pela FEUP Edies. Licen-
ciado em Engenharia Informtica pela Universidade do Porto (FEUP), mestre em Sistemas Mveis e
doutor em Tecnologias e Sistemas de Informao pela Universidade do Minho (Escola de Engenharia).

31
A PROGRAMAR
Lua Linguagem de Programao Parte 13

Neste artigo so apresetadas algumas operaes Ao ser executado o programa P13_01.lua apresen-
complemetares ao conjuto de informaes indicadas em tada Soma = 20. Neste exemplo no possvel perceber a
outros artigos, tais como: passagem de parmetro por ma- ocorrncia da ao de referncia em relao aos valores da
triz, funes annimas (lambda), funes aninhadas matriz, mas percebe-se a ao da passagem dos valores da
(clousure), simulao do uso e tratamento de excees, ma- matriz.
trizes internas e compilao de programas.
Assim, considere um programa que define uma matriz
com um conjunto de valores os quais so elevados ao qua-
drado.
Passagem de parmetro por matriz
Em seguida escreva o cdigo de programa em um
A linguagem Lua diferencia-se em diversos detalhes
editor de texto, gravando-o com o nome P13_02.lua e execu-
de linguagens de programao estruturadas e orientadas a
te-o com a linha de comando lua 5.1 P13_02.lua.
objeto, principalmente o que tange a definio e uso de sub-
rotinas (mtodos). -- inicio do programa P13_02
sabido que a linguagem Lua opera com sub-rotinas function quadrado(VET, TAM)
em estilo funo no tendo de forma explcita em sua estru- local X
tura operacional a figura dos procedimentos o que, muitas for X = 1, TAM do
VET[X] = VET[X] * 2
vezes, leva um programador a fazer uso de funes como se end
fossem procedimentos. No entanto, possvel perceber a end
figura de um procedimento em Lua como ser apontado.
local A = {0, 2, 4, 6, 8}
Outro diferencial encontrado na linguagem de progra-
mao Lua o fato desta somente aceitar a passagem de for I = 1, 5 do
io.write("A = ["..I.."] = ")
parmetros por valor, no se utilizando da passagem de print(A[I])
parmetro por referncia. No entanto, uma funo Lua defini- end
da pelo programador consegue retornar mais de um valor a print()
sua chamada. Assim justificando a ausncia de passagem quadrado(A, 5)
de parmetro por referncia.
for I = 1, 5 do
Essas caractersticas operacionais trazem a tona uma io.write("A = ["..I.."] = ")
questo curiosa na linguagem em relao passagem de print(A[I])
parmetro com matrizes. Em Lua a passagem de parmetro end
print()
por matriz ocorre como referncia sem que nada necessite
ser definido para tal ao. -- fim do programa P13_02

Para demonstrar a passagem de parmetro por ma- Observe que o programa P13_02.lua faz uso da sub-
triz tome, como exemplo, um programa que apresente o re- rotina de funo quadrado() sem uso de return. Uma sub-
sultado do somatrio dos elementos de uma matriz. rotina que no retorna valor por sua natureza um procedi-
mento.
Em seguida escreva o cdigo de programa em um
editor de texto, gravando-o com o nome P13_01.lua e execu- Ao ser executado o programa so apresentados os
te-o com a linha de comando lua 5.1 P13_01.lua. valores da matriz A antes da execuo da ao da funo
quadrado(), sendo ento apresentados os valores:
-- inicio do programa P13_01
A = [1] = 0
function somatrio(VET, TAM) A = [2] = 2
local S = 0 A = [3] = 4
local X A = [4] = 6
for X = 1, TAM do A = [5] = 8
S = S + VET[X]
end Na sequncia o programa executa a ao da chama-
return S
end da da sub-rotina quadrado() como se a sub-rotia fosse um
comando da linguagem e apresenta a sada dos valores:
local A = {0, 2, 4, 6, 8}
A = [1] = 0
io.write("Soma = ") A = [2] = 4
print(somatorio(A, 5)) A = [3] = 8
A = [4] = 12
A = [5] = 16

32
A PROGRAMAR

LUA LINGUAGEM DE PROGRAMAO PARTE 13

Indicando a alterao dos valores definidos na matriz A. Ao ser executado o programa se informado 5 ser
apresentado o resultado 120.
A partir desta ao nota-se que no uso das passagens
de parmetro na linguagem Lua ocorre passagem de parme-
tro por valor nos casos de uso de variveis simples. No uso de
Funes aninhadas (clousure)
variveis compostas (matriz) a passagem de parmetro por
referncia. Uma funo do tipo clousure (enclausurada) a fun-
o definida dentro de outra funo, a qual possui acesso a
variveis que estejam definidas fora do escopo da funo.
Funes annimas (lambda)
O exemplo seguinte apresenta a sequncia de Fibo-
Uma funo annima uma sub-rotina sem nome, de- nacci a partir do uso de funo clousure.
clarada e associada diretamente a uma varivel. Para maiores
Em seguida escreva o cdigo de programa em um
detalhes sobre este tema sugere-se a leitura do artigo FUN-
editor de texto, gravando-o com o nome P13_05.lua e execu-
ES ANNIMAS de Joo Silva e Cristinao Ramos publi-
te-o com a linha de comando lua 5.1 P13_05.lua.
cado na edio 44 desta revista.
Como exemplo deste tipo de ao considere um progra- -- inicio do programa P13_05
ma que apresenta o somatrio dos valores inteiros de 1 at um
function fibonacci()
limite fornecido pelo utilizador do programa. local ATUAL = 1
local ANTERIOR = 0
Em seguida escreva o cdigo de programa em um edi- local PROX
tor de texto, gravando-o com o nome P13_03.lua e execute-o return function()
com a linha de comando lua 5.1 P13_03.lua. local PROX = ANTERIOR + ATUAL
ANTERIOR = ATUAL
-- inicio do programa P13_03 ATUAL = PROX
return PROX
somatorio = function(N)
local S = 0, I end
for I = 1, N do
S = S + I end
end
return S local X = fibonacci()
end
for I = 1, 10 do
io.write("Entre limite: ")
VLR = io.read("*number") print(X())
io.write("Soma = ")
print(somatorio(VLR)) end
-- fim do programa P13_05
-- fim do programa P13_03

Ao ser executado o programa, se fornecido o valor 100 Ao ser executado o programa so apresentados os
ser dado como resposta o valor 5050 resultado do somatrio valores 1, 2, 3, 5, 8, 13, 21, 34, 55 e 89.
de 1 a 100.
Observe a definio da funo annima function() que
Funes annimas aceitam recursividade. Tome por efetua o clculo da sequncia de Fibonacci dentro
exemplo o clculo da factorial de um valor qualquer. (enclausurada) da funo fibonacci() efetuando acesso as
Em seguida escreva o cdigo de programa em um edi- variveis locais ATUAL, ANTERIOR e PROX quando do
tor de texto, gravando-o com o nome P13_04.lua e execute-o uso da instruo return function().
com a linha de comando lua 5.1 P13_04.lua.

-- inicio do programa P13_04 Tratamento de excees

factorial = function(N) Lua no possui instruo para tratamento de exceo


if (N <= 1) then do tipo try throw catch, mas por meio do auxlio das
return 1 funes internas pcall() e error() so possveis estabelecer
else
return factorial(N - 1) * N uma forma alternativa de realizar tal tarefa.
end
end O programa seguinte tem por finalidade indicar men-
sagem de erro se um valor 0 for fornecido para o divisor de
io.write("Entre limite: ") uma operao de diviso.
VLR = io.read("*number")
io.write("Factorial = ") Em seguida escreva o cdigo de programa em um
print(factorial(VLR)) editor de texto, gravando-o com o nome P13_06.lua e execu-
-- fim do programa P13_04 te-o com a linha de comando lua 5.1 P13_06.lua.

33
A PROGRAMAR
LUA LINGUAGEM DE PROGRAMAO PARTE 13

-- inicio do programa P13_05 Matrizes internas

local DIVID, DIV, QUOC No segundo exemplo deste artigo foi utilizada no pro-
local STATUS, ERRO grama a definio de uma matriz interna, em estilo lista
(vetor): local A = {0, 2, 4, 6, 8}.
io.write("Entre o dividendo .. ")
DIVID = io.read("*number") Uma matriz, seja de uma ou duas dimenses, con-
io.write("Entre o divisor .... ")
DIV = io.read("*number") siderada interna quando seus elementos so configurados
no prprio cdigo de um programa.
STATUS, ERRO = pcall -- try
( Como no segundo exemplo j foi indicado o uso de
function() uma matriz de uma dimenso, cabe na sequncia demons-
io.write("Resultado = ") trar o uso de uma matriz de duas dimenses.
if (DIV == 0) then
error("Erro", 0) -- throw O programa seguinte demonstra a apresentao dos
End
valores subtrados e obtidos a partir de duas matrizes de
QUOC = DIVID / DIV duas dimenses.
print(QUOC)
end Em seguida escreva o cdigo de programa em um
) editor de texto, gravando-o com o nome P13_07.lua e execu-
if not (STATUS) then -- catch te-o com a linha de comando lua 5.1 P13_07.lua.
print(ERRO)
-- inicio do programa P13_06
end
local A = {
-- fim do programa P13_05 {11,22,33},
{44,55,66},
{77,88,99}
Ao ser executado o programa se informado os valores 5 }
e 2 respetivamente para o dividendo e divisor ser apresenta-
da a mensagem Resultado = 2.5, mas se forem fornecidos os local B = {
{ 1, 2, 3},
valores 5 e 0 ser apresentada a sada Resultado = Erro. { 4, 5, 6},
{ 7, 8, 9}
As variveis DIVID, DIV e QUOC so definidas para }
operarem respetivamente com os valores de dividendo, divisor
e quociente. local C = {}

As variveis STATUS e ERRO so definidas para ope- for I = 1, 3 do


C[I] = {}
rarem com os valores lgicos retornados pelas funes pcall() for J = 1, 3 do
e error(). C[I][J] = A[I][J] - B[I][J]
end
A funo pcall() captura o erro ocorrido retornando um end
valor indicando o status do erro. Esta funo usada para cha-
mar uma funo como parmetro, neste caso, definida como for I = 1, 3 do
for J = 1, 3 do
pcall (function() ). Se a chamada ocorrer sem erro pcall print(C[I][J])
retorna verdadeiro e todos os resultados da chamada. Se ocor- end
rer erro pcall retorna falso mais a mensagem de erro. end

A funo error() no retorna valor de erro, retorna uma -- fim do programa P13_06
mensagem de ocorrncia que pode ser associada informa-

o sobre a posio onde o erro ocorreu ou em que linha do
programa a funo est sendo utilizada. Esta funo pode utili- Ao ser executado o programa apresentada a sada
zar dois parmetros sendo o primeiro parmetro obrigatrio e o 10, 20, 30, 40, 50, 60, 70, 80 e 90.
segundo opcional. O segundo parmetro quando omitido assu- O programa faz uso das duas maneiras de definio
me valor 1 (mostra a linha de cdigo onde a funo est defini- de matrizes de duas dimenses em Lua. A primeira maneira
da), se informado o valor 0 nenhuma informao do local de definida de forma interna em relao s variveis indexadas
ocorrncia do erro indicado, mantendo-se apenas a mensa- A e B e a segunda forma em relao a varivel indexada
gem definida. C declarada inicialmente como local C = {} onde se mar-
No cdigo do programa, o equivalente a um bloco try ca a primeira dimenso e dentro do ciclo de tratamento da
processado pela funo pcall. Se ocorrer um erro de diviso varivel I como C[I] = {} para definir-se a segunda dimenso
por zero a funo error() acionada simulando uma ao da matriz.
throw. O processamento de um bloco catch simulado Matrizes internas de duas ou com at mais dimen-
pela instruo if not (STATUS). ses so declaradas com a forma:

34
A PROGRAMAR

LUA LINGUAGEM DE PROGRAMAO PARTE 13

MATRIZ = { https://www.lua.org/manual/4.0/luac.html.
{L1C1, L1C2, L1C3, L1Cn},
{L2C1, L2C2, L2C3, L2Cn}, No sentido de proceder a um teste simplificado de execuo
{L3C1, L3C2, L3C3, L3Cn}, do compilador informe na linha de comando de seu sistema
{LnC1, LnC2, LnC3, LnCn}
} a instruo:

luac P13_06.lua
Onde MATRIZ o nome de identificao da varivel
indexada, L1, L2, L3 e Ln indicam as linhas e C1, C2, C3 e
Cn indicam as colunas. Em seguida execute o programa compilado com a instruo:
Observe que cada grupo de linhas tem definido suas lua luac.out
colunas dentro de chaves {} separando-as por vrgulas dentro
de um duplo de chaves {}.
Para conferir que o arquivo gerado pelo compilador
binrio tente abrir com um editor de texto simples o arquivo
Compilao de programas luac.out.
Apesar da linguagem Lua ser do tipo script, e por esta Para gerar um arquivo compilado com nome definido
razo ser interpretada, ela possui um compilador que gera um pelo programador execute a instruo:
cdigo binrio no formato bytecode que pode ser executado
posteriormente pelo prprio interpretador. Para fazer uso deste luac o teste.cmp P13_06.lua
recurso necessrio utilizar o programa luac como segue:

luac <opes> <prog.lua> Em seguida execute o programa com a instruo:

O parmetro opes opcional, podendo ser omitido e lua teste.cmp


o parmetro obrigatrio prog.lua a indicao de um cdigo Observe a instruo para listar a estrutura de bytecodes usa-
de script Lua que ser compilado. dos pelo compilador:
Em opes pode-se fazer uso de algumas chaves de luac l P13_06.lua
execuo, destacando-se principalmente:
Aps a execuo da instruo anterior a listagem
-l gera listagem dos bytecodes do programa compi- imediatamente apresentada.
lado;
A vantagem no uso de scripts compilados a possibi-
-o "arquivo" usado para definir o nome do arquivo lidade de o cliente no ter acesso ao cdigo fonte do progra-
do programa compilado (arquivo de sada), Se omitido ma (script), a menos que seja essa a inteno do programa-
esta opo o programa compilado ser definido com o dor.
nome luac.out; Dependendo do pacote instalado, talvez seja neces-
srio indicar junto ao nome do compilador o nmero da ver-
-v apresenta a informao da verso do ambiente
so em uso do interpretador Lua.
Lua.
Um programa compilado em Lua no possui maior velo-
cidade de execuo se comparado com sua verso no formato Concluso
script, pois quando se indica a execuo do script Lua com o
Neste artigo apresentado o uso de alguns recursos
interpretador, este faz automaticamente uma pr-compilao
como complementos da srie de artigos publicados para a
do cdigo.
linguagem Lua.
Outro detalhe operacional o fato do compilador gerar
Os exemplos descritos foram gerados em situaes
um nico arquivo de sada, mesmo que se tenha um conjunto
decorrentes de um curso da linguagem ministrada pelo autor
de scripts a serem executados.
a partir de dvidas manifestadas pelos alunos.
Para mais detalhes sobre este recurso aconselh-se
Em outras ocasies podero ser apresentadas outras
pesquisar o stio LUAC main page em:
possibilidades de uso da linguagem Lua. At l.

AUTOR
Escrito por Augusto Manzano

Natural da Cidade de So Paulo, tem experincia em ensino e desenvolvimento de programao de software desde 1986.
professor da rede federal de ensino no Brasil, no Instituto Federal de Educao, Cincia e Tecnologia. tambm autor, possuin-
do na sua carreira vrias obras publicadas na rea da computao.

35
A PROGRAMAR
Tipos de dados int e variantes na linguagem C

Introduo fonte do programa sizeof, programa que lista os tamanhos,


em octetos, reportados pelo operador sizeof para os tipos de
Este artigo foca os tipos de dados int e variantes dis-
dados inteiro com sinal e ainda para o tipo ponteiro. Este
ponveis na linguagem de programao C. Na parte inicial, o
ltimo representa o tamanho dos endereos na plataforma
artigo apresenta os tipos de dados inteiros ditos tradicionais.
considerada. Note-se que os tipos de dados inteiro sem sinal
Seguidamente, o artigo introduz os tipos inteiros orientados
ocupam o mesmo espao que as variantes com sinal. Como
para a portabilidade, tais como o int8_t, uint_fast64_t e simi-
abordado mais adiante (Tabela 3 e Tabela 4), o par modifi-
lares. Os principais conceitos so ilustrados com exemplos,
cador/especificador de formato do printf (e variantes) para o
executados, sempre que conveniente, em duas plataformas
tipo de dado size_t o %zu, conforme se pode ver na Lista-
Linux: uma plataforma de 32 bits Lubuntu 16.04 com a ver-
gem 1.
so 5.3.1 do compilador gcc 5.3.1, e uma plataforma de 64
bits Lubuntu 17.04 com o gcc 6.3.0. A primeira designada A Listagem 2 mostra o resultado da execuo do pro-
por L32, a segunda por L64. Note-se que ambos as verses grama sizeof.c numa plataforma Linux de 32 bits (L32). Por
do compilador usam nativamente a norma C11 (2011) da sua vez, a Listagem 3 mostra a sada do programa produzida
linguagem C. na plataforma Linux de 64 bits (L64). Em termos de resulta-
dos, as diferenas entre as duas plataformas situam-se no
tamanho do long e do long long: 4 octetos na plataforma de
Tipos de dados int 32 bits, 8 octetos na plataforma de 64 bits. Observa-se ainda
que para cada plataforma, os tipos long e long long ocupam
Como em muitas outras linguagens de programao,
o mesmo nmero de octetos: quatro na plataforma L32 e oito
a linguagem C define um conjunto de tipos de dados inteiros.
na plataforma L64.
So exemplos os tipos de dados signed char, signed short,
signed int e signed long e as variantes sem sinal, unsigned int main(void){
char, unsigned short, unsigned int e unsigned long. Na revi- printf("Tamanho 'int' (octetos) \n");
so linguagem designada por norma C99 foi acrescentado printf("char: %zu\n",sizeof(char));
printf("short: %zu\n", sizeof(short));
o tipo inteiro long long, nas variantes com (signed) e sem printf("int: %zu\n", sizeof(int));
(unsigned) sinal. printf("long: %zu\n", sizeof(long));
printf("long long= %zu\n",
O modificador signed assumido por omisso para sizeof(long long));
os tipos int, com exceo do tipo char como explicado mais printf("sizeof(ponteiro)= %zu\n",
sizeof(void*));
adiante. Assim, a declarao int A designa a varivel A como return 0;
sendo um inteiro com sinal, sendo equivalente a signed int A. }
Caso se pretenda uma varivel int sem sinal, torna-se neces-
Listagem 1: cdigo fonte do programa sizeof.c
srio o uso do modificador unsigned, como por exemplo, na
declarao unsigned int B. Tamanho 'int' (octetos)
char= 1
Uma varivel, qualquer que seja o seu tipo, ocupa short= 2
sempre um determinado espao na memria, espao medido int= 4
em octetos. A designao octeto deriva do facto de repre- long= 4
sentar oito bits, sendo frequentemente empregue a designa- long long= 8
ponteiro= 4
o byte em sua substituio. Na linguagem C, o operador
sizeof devolve o tamanho em octetos, ocupado por um deter-
Listagem 2: resultado da execuo do programa sizeof.c na
minado tipo de dado. O tipo de dado pode ser indicado dire-
plataforma L32
tamente no sizeof atravs do nome do tipo de dados (e.g.,
sizeof(short)) ou indiretamente atravs de uma varivel (e.g., Tamanho 'int' (octetos)
int A; sizeof(A)). No caso de se fazer uso de uma varivel, os char= 1
parntesis podem ser omitidos no sizeof (e.g, sizeof A short= 2
equivalente a sizeof(A)). O operador sizeof devolve um valor int= 4
long= 8
do tipo size_t. Na prtica, o tipo size_t corresponde a um long long= 8
inteiro sem sinal. O uso do size_t em lugar de um inteiro sem ponteiro= 8
sinal tem a vantagem de indicar a quem interage com o cdi-
go fonte que o valor corresponde a um tamanho. Listagem 3: resultado da execuo do programa sizeof.c na
plataforma L64
A contabilizao do nmero de bits de um determina-
do tipo de dados obtm-se multiplicando o valor devolvido O tamanho exato para os tipos de dados int e varian-
pelo operador sizeof por oito. A Listagem 1 mostra o cdigo tes no est definido na linguagem C. De facto, com exceo
do tipo de dado char que ocupa sempre oito bits (um octeto),

36
A PROGRAMAR

TIPOS DE DADOS INT E VARIANTES NA LINGUAGEM C

a norma da linguagem C no rigorosa a respeito do tamanho Importa notar que quando so ultrapassados os valores ex-
ocupado por cada um desses tipos de dados. Nesse domnio, tremos de uma varivel int ou variante (char, short, int, long e
a linguagem C especifica que o tipo short ocupa pelo menos long long) ocorre uma situao de transbordo (overflow na
dois octetos, o tipo long requer pelo menos quatro octetos e o designao anglo-saxnica). No caso da norma da lingua-
tipo long long ocupa um mnimo de oito octetos (Tabela 1). gem C, o comportamento no transbordo de variveis do tipo
Essas regras aplicam-se de igual forma s variantes com e inteiro apenas se encontra definido para tipos inteiros sem
sem sinal. A linguagem C define ainda que em qualquer plata- sinal. Para o caso de um tipo de dado com sinal (e.g., signed
forma, o tipo short deve ocupar menos ou tantos bits que o tipo short), o transbordo de uma varivel inteira com sinal depen-
int. O mesmo relacionamento de tamanho deve ocorrer com o de do compilador. De qualquer forma, fundamental que um
tipo int relativamente ao tipo long (i.e., sizeof(int) <= sizeof programa esteja devidamente preparado para evitar situa-
(long)) , e com o tipo long em relao ao tipo long long. es de transbordo de variveis int e variantes. O transbordo
de variveis inteiras pode ter consequncias graves como o
trmino sbito da aplicao, ou pior ainda, a produo de
Tipo de dado Requisito
resultados errados.
(com/sem sinal)
sizeof(short) >= 2 octetos
#include <stdio.h>
#include <limits.h>
sizeof(long) >= 4 octetos int main(void){
unsigned short int a = USHRT_MAX;
sizeof(long long) >= 8 octetos short int b = SHRT_MAX;
printf("[antes transbordo]\n");
printf("a=%hu\n", a);
Tabela 1: tamanhos mnimos para armazenar short, long e long printf("b=%hd\n", b);
a++; // provoca transbordo
long b++; //provoca transbordo
printf("[depois transbordo]\n");
Apesar do tamanho dos tipos de dados inteiros no printf("a=%hu\n", a);
estar definidos, a linguagem C disponibiliza constantes do pr- printf("b=%hd\n", b);
processador referentes aos valores mnimos e mximos de return 0;
}
cada um tipo de dados inteiros. Por exemplo, o valor mnimo
suportado por um int representado pela constante INT_MIN,
Listagem 4: cdigo fonte do programa transbordo.c
e o valor mximo por INT_MAX. Para um unsigned int, existe
somente a constante UINT_MAX, pois o valor mnimo obvia-
[antes transbordo]
mente zero. a=65535
b=32767
Tipo de dado Mnimo Mximo [depois transbordo]
a=0
signed char SCHAR_MI SCHAR_MAX b=-32768

unsigned char 0 UCHAR_MAX Listagem 5: sada da execuo do programa transbordo

short SHORT_MI SHORT_MAX A Listagem 4 mostra o cdigo do programa transbor-


do.c, no qual forado um transbordo em duas variveis do
unsigned short 0 USHORT_MAX tipo short: uma com sinal (varivel a), outra sem sinal
(varivel b). O cdigo da Listagem 4 faz uso dos especifica-
int INT_MIN INT_MAX
dores %hu e %hd na chamada funo printf, respetivamen-
unsigned int 0 UINT_MAX te, para formatar a representao de um unsigned short e de
um signed short. A sada da execuo do programa transbor-
long LONG_MIN LONG_MAX
do.c na plataforma L32 mostrado na Listagem 5. No pro-
long long LLONG_MI LLONG_MAX grama transbordo.c verifica-se que o acrscimo de uma uni-
dade varivel a, do tipo unsigned short, previamente inicia-
unsigned long long 0 ULLONG_MAX lizada com USHRT_MAX, provoca um transbordo, levando a
que o valor da varivel a passe a ser zero.
size_t 0 SIZE_MAX
Para o tipo de dados char, para alm de
SCHAR_MIN/SCHAR_MAX, existem ainda as constantes
Tabela 2: constantes que representam os valores mnimos e
CHAR_MIN e CHAR_MAX. A existncia dessas duas cons-
mximos dos tipos de dados inteiros (com e sem sinal)
tantes decorre do facto da norma do C no associar desig-
A Tabela 2 lista as constantes do pr processador que nao char a existncia ou no de sinal. Assim, a designa-
definem os valores mnimos e mximos dos tipos de dados o char poder corresponder variante com sinal em deter-
inteiros. Estas constantes esto definidas no ficheiro <limits.h>, minados compiladores e variante sem sinal noutros compi-
com exceo de SIZE_MAX que se encontra definida no fichei- ladores. No estando definido na norma, nada deve ser as-
ro <stdint.h>. sumido pelo programador. Deste modo, os tipos de dados
char, signed char e unsigned char so formalmente diferen-

37
A PROGRAMAR
TIPOS DE DADOS INT E VARIANTES NA LINGUAGEM C

tes uns dos outros. Assim, sempre que seja necessrio guardar Os tipos intmax_t e uintmax_t
valores negativos numa varivel do tipo char, deve ser empre-
A norma C99 requer, com carcter obrigatrio, a exis-
gue o signed char. Ao invs, caso se pretenda guardar um
tncia dos tipos de dados intmax_t e uintmax_t. Ambos re-
valor superior a 127 (e inferior a 256), deve ser empregue o
presentam o tipo de dado inteiro que tem o maior nmero de
tipo unsigned char. possvel determinar atravs dos valores
bits na plataforma considerada. O tipo de dado intmax_t est
de CHAR_MAX e SCHAR_MAX, se a plataforma em uso defi-
associado variante com sinal, e uintmax_t variante sem
ne, por omisso, um char com ou sem sinal. Assim, se
sinal. O especificador de formatao do printf e variantes
CHAR_MAX for igual a UCHAR_MAX, a designao char defi-
o j (%jd ou %ji) para o tipo intmax_t e z para o tipo uintmax_t
nida na plataforma no tem sinal, caso contrrio, o char defini-
(%z{u,o,x,X}). Os valores mnimos e mximos do tipo
do na plataforma tem sinal, pois CHAR_MAX igual a
intmax_t so respetivamente, INTMAX_MIN e
SCHAR_MAX. A Listagem 6 apresenta o cdigo do programa
INTMAX_MAX. Para o tipo uintmax_t, zero o valor mnimo
sinal_char.c que indica se existe sinal ou no no tipo de dado
e UINTMAX_MAX o valor mximo. O programa intmax.c
char. Nas duas plataformas de testes, L32 e L64, o char um
(Listagem 7) exemplifica o uso de intmax_t e uintmax_t, tanto
tipo de dado com sinal.
ao nvel dos valores mximos como dos modificadores da
#include <stdio.h> funo printf. O programa mostra ainda o nmero de octetos
#include <limits.h> necessrios ao armazenamento de um intmax_t: 8 octetos
int main(void){
if( CHAR_MAX == UCHAR_MAX ){ em ambas as plataformas, L32 e L64 (Listagem 8).
printf("char: SEM sinal\n");
}else if( CHAR_MAX == SCHAR_MAX ){ #include <stdio.h>
printf("char: COM sinal\n"); #include <stdint.h>
}else{ int main(void){
printf("char: indefinido\n"); intmax_t intmax_A;
} intmax_A = INTMAX_MAX;
return 0; uintmax_t uintmax_B;
} uintmax_B = UINTMAX_MAX;
printf("INTMAX_MAX=%jX\n", intmax_A);
Listagem 6: cdigo fonte do programa sinal_char.c printf("UINTMAX_MAX=%jX\n",
uintmax_B);
printf("sizeof(intmax_t)=%zu"
" octetos\n", sizeof(intmax_t));
Os tipos intmax_t e uintmax_t return 0;
}
A norma C99 requer, com carcter obrigatrio, a exis-
tncia dos tipos de dados intmax_t e uintmax_t. Ambos repre- Listagem 7: cdigo fonte do programa intmax.c
sentam o tipo de dado inteiro que tem o maior nmero de bits
INTMAX_MAX=7FFFFFFFFFFFFFFF
na plataforma considerada. O tipo de dado intmax_t est asso- UINTMAX_MAX=FFFFFFFFFFFFFFFF
ciado variante com sinal, e uintmax_t variante sem sinal. O sizeof(intmax_t)=8 octetos
especificador de formatao do printf e variantes o j (%jd
ou %ji) para o tipo intmax_t e z para o tipo uintmax_t (%z Listagem 8: sada da execuo do programa intmax.c na
plataforma L32 e L64
{u,o,x,X}). Os valores mnimos e mximos do tipo intmax_t so
respetivamente, INTMAX_MIN e INTMAX_MAX. Para o tipo
uintmax_t, zero o valor mnimo e UINTMAX_MAX o valor Representao de constantes inteiras
mximo. O programa intmax.c (Listagem 7) exemplifica o uso
de intmax_t e uintmax_t, tanto ao nvel dos valores mximos A linguagem C admite o uso de trs bases numricas
como dos modificadores da funo printf. O programa mostra distintas octal, decimal e hexadecimal para a representa-
ainda o nmero de octetos necessrios ao armazenamento de o de constantes inteiras. Uma constante no formato octal
um intmax_t: 8 octetos em ambas as plataformas, L32 e L64 inicia-se por um zero esquerda (e.g., 0123), e apenas con-
(Listagem 8). tm dgitos de 0 a 7, pois a base tem apenas oito smbolos.
Uma constante no formato hexadecimal inicia-se pela se-
#include <stdio.h> quncia de caracteres 0x (e.g., 0x123), com o conjunto de
#include <stdint.h> smbolos vlidos a incluir os 10 dgitos e as letras de A a F.
int main(void){
intmax_t intmax_A; Por fim, uma constante em formato decimal tem como dgito
intmax_A = INTMAX_MAX; mais esquerda, qualquer dgito exceto o zero.
uintmax_t uintmax_B;
uintmax_B = UINTMAX_MAX; Por omisso, as constantes inteiras em formato deci-
printf("INTMAX_MAX=%jX\n", intmax_A); mal so interpretadas pelo compilador como sendo do tipo
printf("UINTMAX_MAX=%jX\n", int. Caso o valor seja maior do que o suportado pelo tipo int,
uintmax_B);
printf("sizeof(intmax_t)=%zu" o compilador interpreta a constante como sendo de um tipo
" octetos\n", sizeof(intmax_t)); de dados com maior abrangncia, seja do tipo long, se este
return 0; for suficiente, ou do tipo long long.
}
Caso pretenda forar uma dada interpretao a uma
Listagem 6: cdigo fonte do programa sinal_char.c constante inteira, o programador deve fazer uso de sufixos.

38
A PROGRAMAR

TIPOS DE DADOS INT E VARIANTES NA LINGUAGEM C

Assim, para que uma constante inteira seja interpretada pelo char char_A = SCHAR_MAX;
compilador como inteiro sem sinal faz-se uso do sufixo U (e.g. short int short_B = SHRT_MAX;
999999U). Podem ainda ser empregues os sufixos L e LL para int int_C = INT_MAX;
long int long_D = LONG_MAX;
solicitar, respetivamente, a interpretao de uma constante long long int long_E = LLONG_MAX;
como long (L) e long long (e.g., 9999999999LL). Os sufixos de
tipo (L e LL) e de sinal (U) podem ser combinados (e.g, printf("char_A=%hhd\n", char_A);
printf("short_B=%hd\n", short_B);
999999999LU ou 99999999UL). Finalmente, os sufixos podem printf("int_C=%d\n", int_C);
ser representados com letra minscula ou maiscula sem qual- printf("long_D=%ld\n", long_D);
quer perda de significado. printf("long_E=%lld\n", long_E);
printf("-------------------\n");
Especificadores de formatao para tipos de dados int printf("char_A=%hho\n", char_A);
printf("short_B=%ho\n", short_B);
Para representar tipos de dados no formato de string, a printf("int_C=%o\n", int_C);
linguagem C disponibiliza a funo printf e variantes. As varian- printf("long_D=%lo\n", long_D);
printf("long_E=%llo\n", long_E);
tes incluem, entre outras, a funo fprintf (escrita formatada printf("-------------------\n");
para ficheiro), e a funo snprintf (escrita formatada para uma printf("char_A=%hx\n", char_A);
zona de memria). A formatao para string requer que seja printf("short_B=%hx\n", short_B);
printf("int_C=%x\n", int_C);
indicada na chamada s funes printf e variantes a string de printf("long_D=%lx\n", long_D);
formatao correspondente ao tipo de dado que se pretende printf("long_E=%llx\n", long_E);
representar. Por exemplo, para uma varivel do tipo signed int, return 0;
deve ser indicado %d ou %i, e %u para uma varivel do tipo }
unsigned int, caso se pretenda a representao decimal. Ou-
tros especificadores podem ser empregue caso se pretenda Listagem 9: cdigo fonte do programa especificadores.c
outros formatos de sada (e.g., %x ou %X para ter sada em
formato hexadecimal). A Tabela 3 mostra os especificadores Para os tipos de dados inteiros exceto o int, i.e., para
de formatao para os tipos de dados bsicos da linguagem C. os tipos char, short, long e long long necessrio preceder o
Os especificadores indicados podem ainda ser empregues com especificador de formato com um apropriado modificador.
a funo scanf e variantes (fscanf, sscanf, etc.). Por exemplo, para mostrar atravs do printf o valor de uma
varivel do tipo short em formato decimal, deve indicar-se a
Especificador Sada Alvo string de formatao %hd ou %hi. A lista de modificadores
que podem ser combinados com os especificadores de for-
%d ou %i decimal com sinal mato na funo printf e variante encontra-se na Tabela 4. O
programa especificadores.c, mostrado na Listagem 9, faz
%u decimal sem sinal
uso dos especificadores e modificadores para mostrar em
%o octal sem sinal trs formatos decimal, octal e hexadecimal os valores
mximos para variveis com sinal do tipo char, short, int,
%x hexadecimal sem sinal long e long long. A sada do programa executado na platafor-
(minsculas) ma L32 mostrada na Listagem 10, e na Listagem 11 para a
%X hexadecimal sem sinal execuo na plataforma L64.
(maisculas)
char_A=127
short_B=32767
Tabela 3: Especificadores de formato para valores intei- int_C=2147483647
ros a serem empregues na funo printf e variantes long_D=2147483647
long_E=9223372036854775807
Modificador Tipo de dado -------------------
inteiro char_A=177
hh char short_B=77777
int_C=17777777777
h short long_D=17777777777
long_E=777777777777777777777
l long -------------------
char_A=7f
ll long long short_B=7fff
int_C=7fffffff
j intmax_t long_D=7fffffff
long_E=7fffffffffffffff
uintmax_t
z size_t Listagem 10: sada do programa especificadores.c executa-
do na plataforma L32
Tabela 4: modificadores a serem combinados com es- char_A=127
pecificador de formato para tipos de dados inteiros short_B=32767
#include <stdio.h> int_C=2147483647
#include <limits.h> long_D=9223372036854775807
int main(void){ long_E=9223372036854775807

39
A PROGRAMAR
TIPOS DE DADOS INT E VARIANTES NA LINGUAGEM C

------------------- com as letras em minsculas, %x) e X (hexadecimal com as


char_A=177 letras em maisculas, %X). Assim, para um inteiro de 32 bits,
short_B=77777
int_C=17777777777 ter-se-, consoante a sada pretendida: PRId32, PRIi32,
long_D=777777777777777777777 PRIo32, PRIu32, PRIx32 e PRIX32. Os especificadores es-
long_E=777777777777777777777 to definidos no ficheiro <inttypes.h>. O programa
------------------- printf_PRI.c (Listagem 12) exemplifica o uso dos especifica-
char_A=7f
short_B=7fff dores de formatao PRId8, PRIu8 e PRIx64. Por serem eles
int_C=7fffffff prprios strings, os especificadores de formatao do tipo
long_D=7fffffffffffffff PRIfn devem ser indicados de forma especial numa chama-
long_E=7fffffffffffffff
da funo printf (ou variante). Assim, o especificador PRIfn
deve ser precedido do tradicional smbolo de %, fecho de
Listagem 11: sada do programa especificadores.c executado string ("), sendo a string reaberta (novo ") aps a indicao
na plataforma L64 (as diferenas com a plataforma L32 esto do especificador. A Listagem 12 exemplifica o uso de especi-
sublinhadas) ficadores do tipo PRIfn na chamada funo printf.
Tipos de dados int com tamanho definido Para a funo scanf (e variantes), os especificadores
tm a designao SCN em lugar de PRI, mantendo-se o
Embora as constantes do pr-processador indicadas na
resto do formato.
Tabela 2 permitam determinar os valores mnimos e mximos
dos tipos de dados inteiros, a variabilidade do respetivo tama- #include <stdio.h>
nho torna mais difcil a programao em certas situaes. Por #include <limits.h>
exemplo, caso se pretenda fazer uso de uma varivel inteira #include <inttypes.h> // inclui <stdint.h>
para atribuir a cada bit um determinado significado (e.g., bit 4: int main(void){
estado da luz da cozinha; bit 5: estado da luz da sala; etc.) int8_t int8_var = INT8_MAX;
de todo conveniente fazer uso de um tipo de dados cujo tama- uint8_t uint8_var = UINT8_MAX;
nho conhecido, de modo a ter conhecimento de antemo do int64_t int64_var = INT64_MAX;
uint64_t uint64_var = UINT64_MAX;
nmero de bits disponveis. Existem ainda muitas outras situa-
es em que necessrio fazer uso de uma varivel com um printf("int8_var=%" PRId8 " \n",
tamanho exato de bits (e.g., 32 bits), enquanto noutras situa- int8_var);
printf("uint8_var=%" PRIu8 " \n",
es ser suficiente o uso de variveis do tipo inteiro que te- uint8_var);
nham pelo menos um determinado nmero de bits. Desde a printf("int64_var=%" PRIx64 " \n",
norma C99, que a linguagem C disponibiliza vrios tipos de int64_var);
printf("uint64_var=%" PRIx64 " \n",
dados inteiro em que garantido o tamanho, seja de forma fixa uint64_var);
ou atravs de um majorante. Esses tipos de dados encontram- return 0;
se acessveis a partir do ficheiro <stdint.h>, e so descritos nas }
prximas seces.
Listagem 12: programa printf_PRI.c

int8_var=127
Tipos de dados intN_t e uintN_t uint8_var=255
int64_var=7fffffffffffffff
Um dos tipos de dados inteiro definido pela norma C99 uint64_var=ffffffffffffffff
o inteiro de tamanho exato. O formato dos identificadores de
dados intN_t para tipos de dados com sinal e uintN_t para Listagem 13: resultado da execuo do programa
tipos de dados sem sinal, em que N indica o nmero de bits do printf_PRI.c na plataforma L32
tipo de dados. Concretamente, so definidos os tipos de dados
Finalmente, importa observar que a norma C99 indica
int8_t, int16_t, int32_t, int64_t e os correspondentes tipos sem
que os tipos de dados intN_t e uintN_t so opcionais, pelo
sinal, uint8_t, uint16_t, uint32_t e uint64_t. Para esses tipos de
que podero no estar disponveis nalguns compiladores.
dados encontram-se disponveis constantes do pr-
processador indicadoras dos valores mnimos e mximos. O
formato das constantes INTn_MIN, INTn_MAX e UINTn_MAX
Tipos de dados int_leastN_t e uint_leastN_t
em que n corresponde ao nmero de bits do tipo de dado. Por
exemplo, para o tipo int32_t, as constantes dos valores mni- Outros dos tipos de dados int definidos pela norma
mos e mximos so INT32_MIN e INT32_MAX. C99 so int_leastN_t e a variante sem sinal uint_leastN_t.
Como o nome indica, o tipo de dados int_leastN_t tem, pelo
A norma define ainda os especificadores de formatao
menos, N bits de tamanho. A norma define que os tipos
a serem empregues com as funes do tipo printf para os da-
int_leastN_t e uint_leastN_t so obrigatrios para os valores
dos do tipo intN_t e uintN_t. Os especificadores de tipo obede-
habituais de N, isto , 8, 16, 32 e 64. Facultativamente, tam-
cem ao formato PRI + f + n, em que f define o formato pretendi-
bm podero existir para outros valores de N, como, por
do e n corresponde ao nmero de bits do tipo de dados. O for-
exemplo, N=128, sob a forma int_least128_t e
mato pretendido pode ser d (decimal, equivalente a %d), i
uint_least128_t. Similarmente ao que sucede para outros
(inteiro, %i), o (octal, %o), u (sem sinal, %u), x (hexadecimal

40
A PROGRAMAR

TIPOS DE DADOS INT E VARIANTES NA LINGUAGEM C

tipos de dados inteiros, os valores mnimos e mximo encon- Tabela 5: especificadores para printf e variantes para
tram-se definido atravs de constantes do pr-processador formatos do tipo LEAST e FAST
com o seguinte padro: INT_LEASTn_MIN, INT_LEASTn_MAX
para a variante com sinal e UINT_LEASTn_MAX para a varian- #include <stdio.h>
te sem sinal. Por exemplo, para n=64, tem-se #include <limits.h>
INT_LEAST64_MIN, INT_LEAST64_MAX e #include <inttypes.h>
int main(void){
UINT_LEAST64_MAX. int_least32_t int_least32_var =
INT_LEAST32_MIN;
Os especificadores para a funo printf e variantes para uint_least32_t uint_least32_var =
os tipos int_leastN_t e uint_leastN_t so similares aos anterior- UINT_LEAST32_MAX;
mente vistos, obedecendo ao formato PRIfLEASTn, em que f int_fast32_t int_fast32_var =
INT_FAST32_MIN;
corresponde ao formato pretendido d ou i para tipo com sinal uint_fast32_t uint_fast32_var =
e o, u, x, X para tipos sem sinal , e n indica a largura mnima UINT_FAST32_MAX;
do tipo de dado. Por exemplo, para o tipo int_least64_t tem-se printf("int_least32_var=%" PRIdLEAST32
PRIdLEAST64, e PRIuLEAST64 para o tipo uint_least64_t. "\n", int_least32_var);
printf("uint_fast32_var=%" PRIuLEAST32
Para a funo scanf e variantes, os especificadores so os "\n", uint_least32_var);
mesmos, exceto que o prefixo PRI substitudo por SCN. printf("int_fast32_var=%" PRIxFAST32
"\n", int_fast32_var);
printf("uint_fast32_var=%" PRIXFAST32
"\n", uint_fast32_var);
Tipos de dados int_fastN_t e uint_fastN_t return 0;
}
Desde a norma C99 que a linguagem C define ainda o
tipo de dados int_fastN_t e a variante sem sinal uint_fastN_t. A
Listagem 14: programa printf_LEAST_FAST.c
palavra fast resume o propsito deste tipo de int: disponibilizar
a variante mais rpida de inteiro que tenha pelo menos N bits
de tamanho. Por exemplo, numa plataforma em que o acesso e
Nota final
manipulao de inteiros se faa nativamente com 64 bits, a
variante int_fast32_t pode, por razes de desempenho, ser Este artigo abordou os tipos de dados inteiro dispon-
internamente implementada por um inteiro de 64 bits. Ao con- veis na linguagem de programao C. Considerando a im-
trrio do tipo int_leastN_t e variantes, a implementao do tipo portncia do correto uso e dimensionamento dos tipos de
int_fastN_t (com e sem sinal) privilegia a velocidade em detri- dados inteiro de todo relevante que os utentes da lingua-
mento, se necessrio, do espao ocupado em memria. gem C sejam conhecedores das diversas funcionalidades e
limitaes de cada tipo, bem como das omisses existentes
semelhana do tipo int_leastN_t, um compilador con-
nas vrias normas da linguagem. Aos leitores interessados
forme norma C99 ou C11 deve obrigatoriamente implementar
sugere-se a leitura de (Gustedt, 2017) e (Peter & Tony,
os tipos int_fastN_t/uint_fastN_t e variantes para os valores de
2015).
N: 8,16, 32 e 64. Os valores mnimos e mximos para as vari-
antes com e sem sinal so expressos pelas constantes Bibliografia
INT_FASTn_MIN, INT_FASTn_MAX e UINT_FASTn_MAX. Os
Gustedt, J. (2017). Modern C. Online. Retrieved julho 2017,
especificadores para a funo printf e variantes so mostrados
from http://icube-icps.unistra.fr/img_auth.php/d/db/
na Tabela 5. O programa printf_LEAST_FAST.c (Listagem 14)
ModernC.pdf
exemplifica o uso dos especificadores de formato para os tipos
int_leastN_t / uint_leastN_t e int_fastN_t / uint_fastN_t. Peter, P., & Tony, C. (2015). C in a Nutshell (2nd ed.).
Tipo Especificadores printf O'Reilly Media, Inc.
int_leastN_t PRI{d,i}LEASTN

uint_leastN_t PRI{u,o,x,X}LEASTN

int_fastN_t PRI{d,i}FASTN

uint_fastN_t PRI{u,o,x,X}FASTN

AUTOR
Escrito por Sandro Patrcio Domingues

professor do Departamento de Eng Informtica na Escola Superior de Tecnologia e Gesto (ESTG) do Instituto Politcnico
de Leiria (IPLeiria). Tem lecionado, entre outras, as disciplinas de Programao Avanada e Sistemas Operativos da Licenci-
atura em Engenharia Informtica. ainda docente da ps-graduao em Informtica de Segurana e Computao Forense.
Escrito por Vtor Carreira

leciona as disciplinas de Programao Avanada, Sistemas Operativos, Aplicaes para a Internet e Desenvolvimento de
Aplicaes Distribudas ao curso de Licenciatura em Engenharia Informtica da Escola Superior de Tecnologia e Gesto do
Politcnico de Leiria.

41
A PROGRAMAR
Feed RSS em C# .NET Core no Azure Web App em Linux

Neste artigo vou demonstrar como criar uma aplica- gens de erro detalhadas e pedidos solicitados.
o Web Model-view-controller (MVC) que vai ler o Feed
RSS dos artigos da Revista PROGRAMAR em C# .NET Co- Backups Manuais e/ou agendados.
re 1.1 para Docker. A aplicao vai ser disponibilizada no
Azure Web App em Linux atravs Docker Hub. Gesto atravs de linhas de comandos com Azure Po-
werShell ou Azure CLI.

Azure Web App Deployment a partir do Visual Studio Team Services,


OneDrive, Git, GitHub, Bitbucker, Dropbox, e outros reposit-
O servio Azure Web App permite que uma aplicao rios externos.
web desenvolvida em .NET, .NET Core, Java, Node.js, PHP,
Python e Ruby esteja disponvel em qualquer utilizador atra- Monotorizao e diagnsticos.
vs da Internet. Para alguns o Web App uma forma de
disponibilizar uma pgina de Internet ou framework mas per- Mltiplas Framework disponveis .NET, PHP, Java,
mite muito mais do que isso mais a frente vou demonstrar Python e Node.js.
algumas funcionalidades.
O Web Apps est integrado no Testes de desempenho.
Azure App Service que um con-
junto de servios.
Debug remota e por consola.

Web Apps, permite alojar Controlo de acesso por funes, Role-Based Access
websites e aplicaes Control (RBAC).
Web.
Scaling Up, Out ou automtico.
Mobile Apps, alojar aplica-
es mobile a back-ends. Plataforma 32 ou 64 bit.

Logic Apps, automatizar Extenses, por exemplo "Let's Encrypt" que est dispo-
processos empresariais e nvel a partir do tier bsico requer Server Name Indication
integrar sistemas e dados (SNI).
no Azure sem escrever
cdigo. Site Slots. pode ser utilizado como cilo de vida da aplica-
o.
API apps, para alojar RES-
Tful APIs. Certificados SSL.

Functions, executa peque- WebJobs, executa tarefas manuais, agendadas, trigger


ou contnuo.
nos pedaos de cdigo ou
"funes" no Azure. Atravs da plataforma pode ativar ou desativar funcio-
Os recursos no so reservados a cada servio os nalidades pretendidas e o Azure automaticamente faz toda
mesmos podem utilizar as funcionalidades dos outros servi- essa configurao por ns. Isto possvel porque o Web
os. App uma plataforma como servio (Plaform-as-a-Service)
apenas gerimos a aplicao e os dados todos. A infraestrutu-
O Web App tem tudo o que necessita para construir ra desde da rede, armazenamento, mquina virtual, sistema
uma aplicao esta oferece ao administrador de sistema, operativos, software necessrio para executar a aplicao
desenvolvedor ou DevOps uma plataforma totalmente gerida desde do IIS, Apache, Tomcat, ou outro totalmente gerido
em que se tem acesso as vrias funcionalidades por exem- pelo Azure e no temos que nos preocupar com manuteno
plo: e atualizaes, mas a segurana da aplicao da nossa
responsabilidade.
Always On, mantem a Web App ativa est disponvel a
partir do Standard tier. O Azure j dispe da sua verso em Linux que funcio-
na com mquinas virtuais em Linux, antes estava apenas
Definies da aplicao e Connection Strings. disponvel em Windows. Agora podemos escolher se quere-
mos executar a aplicao num ambiente Windows ou Linux.
Registos de auditoria de servidor Web, ficheiros, mensa- A verso em Linux foi um dos pedidos mais solicita-
das pelos clientes/utilizadores porque h frameworks como o

42
A PROGRAMAR

FEED RSS EM C# .NET CORE NO AZURE WEB APP EM LINUX

Wordpress que funciona muito melhor e mais rapidamente em O que contem a mquina virtual em Linux?
Linux do que em Windows.
A verso Windows e Linux no so iguais, existem dife-
renas entre eles. A grande diferena que em Linux utiliza-
do o Docker o que permite que se possa utilizar o nosso pr-
prio Container que um recipiente que contem todo o que
necessrio para a aplicao ser executada. O Docker Hub
um repositrio permite que a Web App seja atualizada automa-
ticamente quando atualizamos a aplicao no Docker Hub,
mas tambm podemos fazer o deployment da aplicao por
FTP, Git, Bitbucket.
Outra diferena entre a opo Windows e Linux o su- Figura 2 Mquina Virtual Linux
porte de linguagens de programao em Linux apenas suporta
A mquina contem um proxy que recebe todo o trfe-
(quando este artigo foi escrito) Node.js 4.4, 4.5, 6.2, 6.6, 6.9-
go recebido pelo FrontEnd do cluster principal e o mesmo vai
6.11 e 8.0-8.1, o PHP 5.6 e 7.0, .NET Core 1.0-1.1 e o Ruby
encaminhar para a aplicao a informao solicitada e envia-
2.3. Enquanto a verso Windows tem mais suporte e inclui o
da pelo Site Routing mas este faz muito mais do que enviar a
Java 7 e 8 e Python 2.7 e 3.4 mas no suporta Ruby.
informao ao cliente. O Site Routing gera a aplicao, se
verificar que existe uma nova verso ele vai atualizar a mes-
ma.
Como funciona a arquitetura do servio
O Container no inclui a informao persistente da
aplicao. Cada Web App tem um servio 'SCM' associado,
esse servio o KUDU que permite ter acesso a painis de
controlo com linhas de comandos, debug, diagnsticos, pro-
cessos em execuo ou seja permite fazer o deployment
rpido. Kudu um projeto de cdigo aberto e que est dispo-
nvel no GitHub (https://github.com/projectkudu/kudu) este
servio executado num contentor a parte.

Figura 1 Arquitetura do Servio


O Azure tem dois clusters de computao na mesma rede vir-
tual (VNET) o cluster primrio composto principalmente por
tecnologia Microsoft que dispem de um frontend load balancer Figura 3 Azure Kudu
que recebe todo trfego Hypertext Transfer Protocol (HTTP) Os dois Containers esto separados atravs do isola-
recebido que por sua vez reencaminha para mquinas ou ser- mento de segurana do Docker mas integrados numa nica
vios em ambiente Windows ou Linux, tem o Windows Web bridge e todas as bridges esto associadas a um plano do
Workers que utilizado para aplicaes Windows, um servio servio (Azure Service Plan).
de armazenamento e muito mais. O segundo cluster apenas
tem mquinas virtuais com Linux e neste cluster que vo Os dois Containers acedem ao contedo da aplicao
estar as aplicaes Web App em Linux. atravs do Message Block (SMB) de forma persistente o que
significa que quando existe uma alterao refletida em
todos os lugares. Se estiver a executar uma segunda aplica-
o Web App criado uma segunda Bridge e por sua vez
criado um novo contentor Docker para aplicao e SCM.

43
A PROGRAMAR
FEED RSS EM C# .NET CORE NO AZURE WEB APP EM LINUX

Azure Web App para Containers


Alm do Azure Web App em Linux tambm existe o
Azure Web App para Containers mas qual diferena entre
eles? Basicamente o Web App para Containers permite utilizar
o nosso prprio Container e efetuar deployment automatica-
mente, por ns, numa Web App para Linux, ou seja, uma
soluo baseada em Web App em Linux mas com a vantagem
que todo o processo vai ser feito automaticamente pelo Azure
o que permite eliminar as tarefas de gesto. Continuamos a ter
acesso configurao do domnio, certificados SLL e muito
mais. um ambiente ideal para desenvolvedores e DevOps.
No projeto do Visual Studio criado vai ser adicionado
cdigo para ler o RSS do feed dos artigos da pgina de In-
Deployment de um Docker Container para Azure Web App ternet da revista PROGRAMAR. Primeiro necessrio criar
em Linux o modelo de dados que vai ser utilizado para listar a informa-
Antes de iniciar necessrio ter instalado o Docker o como se pretende. Por defeito um feed composto por
Community Edition que pode obter na pgina oficial do Docker um ttulo, o endereo de Internet, descrio e a data de pu-
Store em https://store.Docker.com/ compatvel com vrios blicao. Cria-se uma classe com o nome RSSFeedModel.cs
sistemas operativos, o .NET Core pode ser obtido em https:// ou outro se preferir no Models que vai contm o seguinte
www.microsoft.com/net/download/core apesar de ser compat- contedo.
vel com o Linux por experincia prpria no funciona muito using System;
bem com o Fedora 23 e 24 devido a bibliotecas que o prprio using System.Collections.Generic;
Fedora utiliza pode alterar mas algumas aplicaes instaladas using System.Linq;
podem deixar de funcionar. O ambiente de desenvolvimento using System.Threading.Tasks;
integrado (IDE), recomendo a utilizao do Microsoft Visual namespace revista_programar.Model
Studio 2017 se utilizar ambientes Linux recomendo o Microsoft {
Visual Studio Code. Sobre o Visual Studio a verso Community public class RSSFeedModel
{
2017 igual verso Professional mas apenas pode ser utili- public string ArticleTitle { get; set; }
zado por estudantes, projetos de cdigo aberto e desenvolve- public string ArticleLink { get; set; }
dores individuais, o Code pode ser utilizado por todos incluindo public string ArticleDescription { get;
set; }
qualquer projeto empresarial. Neste artigo utilizei o Microsoft public string ArticleDate { get; set; }
Visual Studio 2017. Se utilizar o visual Studio Code recomendo }
que instale as seguintes duas extenses Azure Extensions }
Pack e Docker.
Com o modelo criado necessrio criar o controler, o
projeto j tem uma View inicial com identificao Home-
Controller.cs pode utilizar-se e adicionar o cdigo que vai ler
o XML com os artigos e armazenar uma lista do modelo cria-
do.

public List<RSSFeedModel> GetFeed()


{
Criao do projeto C# .Net Core 1.1 return Feed().Result;
}
No Visual Studio criado um novo projeto ASP.Net Co-
re 1.1 Web Application MVC este projeto j inclui cdigo para [HttpPost]
public async Task<List<RSSFeedModel>> Feed()
efeitos de demonstrao pode manter-se esse cdigo ou fazer {
alteraes ao mesmo. O Visual Studio fornece a hiptese de var articles = new List<RSSFeedModel>();
adicionar suporte ao Docker para o sistema operativo em que string rssFeedURL = "https://www.revista-
vai ser executado. programar.info/feed/";
HttpClient httpClient = new HttpClient();
var httpContent = await httpCli-
ent.GetStringAsync(rssFeedURL);
XDocument xml = XDocument.Parse(httpContent);
var RSSFeedData = (from x in xml.Descendants
("item")
select new RSSFeedModel
{
ArticleTitle = ((string)x.Element
("title")),

44
A PROGRAMAR

FEED RSS EM C# .NET CORE NO AZURE WEB APP EM LINUX

public List<RSSFeedModel> GetFeed() <td>Sem informao</td>


{ </tr>
return Feed().Result; }
} </tbody>
</table>
[HttpPost] </div>
public async Task<List<RSSFeedModel>> Feed()
{
var articles = new List<RSSFeedModel>(); E o projeto est concludo. Mas antes de criar o
string rssFeedURL = "https://www.revista- Docker Container para ser enviado para o Docker HUB eu
programar.info/feed/"; recomendo testar primeiro na prpria mquina. Para testar
HttpClient httpClient = new HttpClient();
var httpContent = await httpCli- apenas necessrio executar a compilao do projeto e ter
ent.GetStringAsync(rssFeedURL); o Docker em execuo.
XDocument xml = XDocument.Parse(httpContent);
var RSSFeedData = (from x in xml.Descendants Erros de compilao e/ou execuo
("item")
select new RSSFeedModel Se ao executar e der o seguinte erro
{
ArticleTitle = ((string)x.Element("title")), Docker-compose -f "[Localizao do projeto]
ArticleLink = ((string)x.Element("link")), \Docker-compose.yml" -f "[Localizao do pro-
ArticleDescription = ((string)x.Element jeto]\Docker-compose.override.yml" -f
("description")), "[Localizao do projeto]\obj\Docker\Docker-
ArticleDate = ((string)x.Element("pubDate")) compose.vs.debug.g.yml" -p Dockercompo-
}); se3404700638243216757 config
articles = RSSFeedData.ToList();
return articles; .IOError: [Errno 2] No such file or directory:
} u'[Localizao do projeto]\obj\Docker\Docker-
compose.vs.debug.g.yml'
Em IActionResult Index() adiciona-se o seguinte.
Isto deve-se os seguintes motivos no tem o Docker
public IActionResult Index() instalado, no tem o Docker em execuo ou no permitiu ao
{ Docker aceder unidade de disco onde se encontra o pro-
ViewBag.RSSFeed = GetFeed();
return View(); jeto. Neste ltimo problema para permitir ao Docker o acesso
} ao disco tem de iniciar o Docker com privilgios administrati-
vos e nas definies em Shared Drives tem que selecionar o
Na View principal com a identificao Index.cshtml
disco e aplicar. O Docker vai solicitar as credenciais da conta
que a pgina inicial pode personalizar sua maneira para
de administrador.
ler o RSS chama-se o ViewBag.RSSFeed do que contm a
lista do Controller e transforma-se a lista numa tabela.

<div class="row">
<table class="table table-hover">
<thead>
<tr>
<th>Ttulo</th>
<th>Link</th>
<th>Descrio</th>
<th>Data</th>
</tr>
</thead>
<tbody>
@if (ViewBag.RSSFeed != null)
{
foreach (var item in
ViewBag.RSSFeed)
{
<tr>
<td>@item.ArticleTitle</td> Figura 4 Docker em execuo
<td><a href="@item
.ArticleLink">@item.ArticleLink</a></td> Com o Shared Drives definidos os utilizadores sem
<td>@item.ArticleDescription</td> privilgios administrativos que pretendam utilizar o Docker
<td>@item.ArticleDate</td> apenas tm que iniciar o Docker selecionar a unidade e apli-
</tr> car. No vai ser solicitada nenhuma credencial.
}
} Se der o seguinte erro:
else
{ UnicodeDecodeError 'ascii' codec can't decote byte [byte] in
<tr> position [posio] not in range
<td>Sem informao</td>
<td>Sem informao</td> Isto deve-se ao facto de em todo o caminho do pro-
<td>Sem informao</td> jeto estarmos a usar caracteres especiais como o ''.

45
A PROGRAMAR
FEED RSS EM C# .NET CORE NO AZURE WEB APP EM LINUX

volvedor (dev) se fizer em Release vai criar a imagem final


(latest).

Figura 5 Visual Studio erro de compilao Unicode Decode


Error
Se encontrar mais erros e no est a conseguir resolver
pode consultar a comunidade de desenvolvedores do Visual Para consultar as imagens Docker na mquina execu-
Studio em https://developercommunity.visualstudio.com. ta-se o comando Docker images se pretende remover uma
imagem executa-se o comando Docker rmi [identificao da
Com a execuo concluda com sucesso o navegador
imagem].
de Internet predefinido vai abrir o projeto MVC criado conforme
a seguinte imagem.

Figura 7 Apagar uma imagem Docker


Para criar um Container a partir de uma imagem exe-
cuta-se o comando Docker run mas necessrio definir
qual a imagem, o porto exterior e interior que se pretende
utilizar. Para definir a imagem utiliza-se o parmetro - -name
Figura 6 Projeto em execuo Docker [nome da imagem], o porto de entrada e sada o parmetro
-d -p [porto exterior]:[porto interior]. Existem mais parme-
Em Docker existem imagens Docker e Docker Contai-
tros como o utilizador, palava-passe, aceitao dos termos
ners. A imagem Docker como um executvel que inclui tudo
de licenciamento (EULA) e outros pode consultar os coman-
o que necessrio para ser executado e compatvel com os
dos a partir da ajuda com o comando Docker run - -help.
vrios sistemas operativos. A vantagem das imagens que
Para criar o Container com o nome revista-programar em
so executados isoladamente assim previne conflitos de soft-
que vai receber pedidos no porto externo 5632 que vo ser
ware e outros problemas. O Docker Container um recipiente
reencaminhados para o porto interno 80 e define-se a ima-
que se encontra na 7 camada do modelo OSI (Aplicao) que
gem pela sua identificao o comando Docker run - -name
a camada que est mais prxima do utilizador. Multiplos Con-
revista-programar -d -p 5632:80 [identificao da imagem].
tainers podem ser executados na mesma mquina e os mes-
mos partilham o Kernel do sistema operativo, mas cada um
deles so executados isoladamente. Um Docker Container no
a mesma coisa que uma Mquina Virtual enquanto nas m-
quinas virtuais no possvel partilhar recursos com outras
mquinas virtuais os mesmos tm de ser reservados, o Docker
Container permite partilhar os recursos. Por exemplo em cada
mquina virtual necessrio instalar o Sistema Operativo e
definir o armazenamento e memria Ram e outros recursos. O
Docker utiliza o prprio sistema operativo instalado na mquina
e os Container utilizam os recursos disponveis. Pode utilizar
um Docker Container em mquinas locais, virtuais ou em nu-
vem.
As operaes no Docker so executas atravs de linhas
de comandos. O Visual Studio cria automaticamente a imagem
Docker e Docker Container. Para criar apenas tem de executar
Figura 8 Criao de um Docker Container a partir de uma
a compilao se fizer em Debug vai criar a imagem de desen-
imagem Docker

46
A PROGRAMAR

FEED RSS EM C# .NET CORE NO AZURE WEB APP EM LINUX

Quando cria a compilao no Visual Studio o mesmo


cria automaticamente a imagem e a seguir o Container.
Para consultar os Docker Container em execuo exe-
cuta-se o comando Docker ps. Se pretender remover um Con-
tainer utiliza-se o comando Docker rm [identificao do Contai-
ner] mas se a mesma estiver em execuo no possvel
remover. Para parar utiliza-se o comando Docker stop
[identificao do Container]. Para forar a remoo de Docker
Container utiliza-se o parmetro -f.

Figura 9 No possvel apagar Docker Container em execuo


Com o repositrio criado pode enviar a imagem do
projeto para o Docker Hub com o comando docker push.
Docker Hub Primeiro tem que identificar-se no Docker Hub com o coman-
do Docker login, a seguir tem que definir o tag docker tag
O Docker Hub (https://hub.docker.com/) um reposit-
[identificao da imagem existente na mquina] [nome do
rio em nuvem onde pode ter as suas imagens Docker. O repo-
namespace]/[nome do repositrio], para enviar utilize o co-
sitrio pode ser pblico ou privado. Este servio permite ter um
mando docker push [nome do namespace]/[nome do reposi-
repositrio privado gratuitamente e repositrios pblicos gratui-
trio].
tos. Com este servio pode distribuir as suas imagens a partir
de um nico lugar assim quando atualiza o repositrio pode
atualizar automaticamente os clientes se os mesmos aceitarem
atualizaes automticas.
Para criar um repositrio Docker Hub tem de ter uma
conta no Docker Hub, selecionar Create Repositor, escolher
namespace, definir o nome do repositrio, adicionar uma des-
crio curta e longa definir se pretende que o repositrio seja
pblico ou privado e para finalizar criar em Create.

Figura 10Envio da imagem para Docker Hub


Para sair do Docker utilize o comando docker logout.
Se algum dia pretender definir um repositrio publico para
privado ou apagar o repositrio estas operaes so execu-
tadas nas definies do prprio repositrio.
Se pretender descarregar a imagem execute o comando
Docker pull [nome do namespace]/[nome do repositrio].
Pode pesquisar imagens com o comando Docker search
[nome da imagem]

Azure App em Linux


Para consegui utilizar os servios no Azure neces-
srio ter uma subscrio, no entanto se nunca utilizou o Azu-
re pode testar o servio durante 30 dias em https://
azure.microsoft.com/pt-pt/free ou experimentar durante 30
minutos sem custo e explicarei adiante com pode faze-lo.
Normalmente trabalho com sistemas com o idioma
em Ingls todas as seguintes imagens esto em Ingls. Para
criar uma nova Web App em Linux selecione Novo/New e
depois selecione Web + Mobile e escolher Web App. Tem de

47
A PROGRAMAR
FEED RSS EM C# .NET CORE NO AZURE WEB APP EM LINUX

definir o subdomnio que nico no universo do Azure em


azurewebsites.net, se tiver mais do que uma subscrio esco-
lha a subscrio que pretende utilizar, pode escolher um grupo
de recursos existente ou criar um novo. Um grupo de recursos
um recipiente de recursos e/ou servios de Azure quando
quiser apagar todos os recursos e/ou servios no recipiente em
vez de apagar um a um pode apagar o grupo de recursos e
todos eles sero eliminados. No sistema operativo escolha
Linux e tem de escolher ou criar um novo plano de servio que
o plano de alojamento do servio. Em Web App em Linux
no existe nenhum plano gratuito ao contrrio do Web App em
Windows que dispe do plano gratuito o Free Tier. O plano
mais baixo em Linux o Basic B1 mas no tem acesso a todas
as funcionalidades como por exemplo slots.

A Web App demora alguns minutos a ser criada e


quando finalizar est pronto a ser utilizada. Depois de criar
selecione Docker Container em definies para definir o re-
positrio da imagem Docker. Selecione Docker Hub e tem
que definir o tipo de acesso do seu repositrio e a imagem e
tag se utilizar [identificao do namespace]/[identificao do
repositrio]:[Tag]. Para uma atualizao continua pode usar
o Web Hock.

Aps a definio tem de aguardar que o Azure atuali-


ze o Web App, pode demorar uns minutos, no entanto pode
verificar o relatrio de atividade.

Depois de atualizado com sucesso se aceder ao URI


do Web App pode verificar que a mesma j esta em funcio-

48
A PROGRAMAR

FEED RSS EM C# .NET CORE NO AZURE WEB APP EM LINUX

namento com a imagem do repositrio definido. tar estados, mtricas, notificaes e alertas dos servios que
esto a ser utilizado na sua subscrio. Esta aplicao ainda
se encontra em desenvolvimento.

Quando devemos escolher o Web App em Windows ou


Linux?
Depende dos requisitos da aplicao, se a carga de trabalho
funciona muito bem em Linux ento deve escolher Linux. Se
Com a aplicao a correr pode experimentar aceder ao a aplicao foi desenvolvida em Java ento deve escolher
KUDU, ter apenas que adicionar o subdomnio scm depois do Windows por enquanto ainda no possvel usar Java em
subdomnio definido [subdomnio defini- Linux. Se pretende testar a aplicao em desenvolvimento
do].scm.azurewebsites.net. sem custos apenas o Windows tem o plano de alojamento
Free Tier.
preciso analisar muito bem a aplicao, necessidades e
funcionalidades. No entanto pode testar a aplicao durante
30 minutos gratuitos.
Como testar Azure Web App Linux gratuitamente
Para finalizar se pretende testar o Azure Web App Linux gra-
tuitamente durante 30 minutos sem nenhum custo a oferta
est disponvel em https://aka.ms/tryappservice, apenas tem
Figura 11 KUDU de escolher Web App e a linguagem de programao. Tam-
bm pode experimentar o Web App para Containers apenas
Com o KUDU em Linux consegue ver informao do tem que providenciar a imagem Docker por exemplo
sistema, variveis de ambiente e parmetros, executar coman- 'rramoscabral/revista-programar' e utilizar at a durao expi-
dos numa consola Bash. Apesar de permitir o acesso SSH rar. Ambos vo solicitar uma conta Microsoft existente. Reco-
normalmente este encontra-se bloqueado devido segurana mendo que no abuse desta opo porque sero contacta-
porque consegue fazer qualquer alterao na mquina at dos pela equipa de vendas do Azure.
apagar definies que o prprio Azure define o que pode dani-
ficar a mquina virtual.
Est concludo o deployment da aplicao em Docker
para Web App em Linux.
Azure Web App Roadmap
As funcionalidades dos servios no Azure esto sempre
em contante atualizao e o Azure Web App em Linux no
exceo. No GitGHUB pode consultar as ltimas notas de lan-
amento em https://aka.ms/linux-release-notes. Na pgina do
Azure consegue consultar outras novidades em https://
azure.microsoft.com/en-us/updates/?product=web-sites. Por
exemplo desde de maio de 2017 est disponvel ao pblico em
geral uma aplicao para Android e Iphone que permite consul-

AUTOR
Escrito por Ricardo Cabral

O Ricardo Cabral apaixonado e autodidata em tecnologia da informao com mais 13 anos de experi-
ncia em projetos, desenvolvimento e gesto de TI. Licenciou-se em Engenharia de Informtica pela
Universidade Autnoma de Lisboa. Participante ativo, voluntariado e/ou orador de reunies de comunida-
de portuguesas. Adora partilhar, conviver e aprender. O seu twitter @rramoscabral.

49
ELECTRNICA
ESP32 - MICROPYTHON
Electrnica
ESP32 - MICROPYTHON

O que vou aprender neste artigo


Para aqueles que andam no mundo da Internet das
Coisas o micro controlador ESP8266 j deve ser um conheci- A Instalar Ferramentas necessrios para carregar o
do, para quem nunca ouviu falar aconselho a experimentar, Sistema operativo para o ESP32
pois desenvolver dispositivos que tenham que ser ligados a
uma rede Wi-Fi nunca foi to simples. A Instalar drivers para o computador comunicar com
o ESP32 atravs do controlador USB-Serial
Ento se o ESP8266 assim to bom porque que eu
estou aqui a falar do ESP32 bem este super micro controla- CP21XX que acompanha a placa de desenvolvimento
dor sim super porque conta 2 cores de 240MHz dentro de que vamos utilizar.
um microprocessador Tensilica Xtensa de 32 bit Ultra Low
Power, 448KiB de ROM para funes internas e de arranque, Carregar o binrio com o Micropython para dentro
520KiB de SRAM para colocarmos o nosso cdigo e por fim a do ESP32
cereja no topo do bolo o facto ser constitudo por 2 mdulos
de conectividade um Bluetooth Low Energy e Wi-Fi 802.11/b/g/ Aceder consola Python que est a correr dentro do
n/e/i, comparando com o ESP8266 tem o mdulo BLE a mais, micro controlador
tem muito mais memria e muito mais processamento,e no Carregar bibliotecas para serem utilizadas dentro do
esquecendo que os 2 cores permitem agora executar cdigo
Sistema Operativo
em paralelo, coisa que raramente acontece nos micro controla-
dores comuns de baixo custo, sim este ESP32 custa por volta Escrever texto para ser mostrado no display OLED
de 6 euros e pode ser adquirido em http://aliexpress.com. SSD1306 que vem includo na placa.
Na imagem abaixo podemos visualizar a arquitectura do
ESP32.
O que preciso para este artigo

Placa de desenvolvimento Lolin Wemos ESP32 com


display OLED

Cabo USB

Computador

Existem dezenas de verses de placas de desenvolvi-


mento que incluem o ESP32, no nosso tutorial vamos utilizar
uma desenvolvida pela LOLIN/WEMOS que inclui um display
Agora que j conhecemos a Mquina, voltamo-nos
OLED SSD1306.
para o tema desta edio em que queremos correr o Sistema
Operativo MicroPython dentro do nosso ESP32. Existem diversas formas de instalar o MicroPython,
est uma das formas mais rpidas de carregar o Sistema
Para aqueles que ainda esto de boca aberta por ter
Operativo e interagir com display OLED.
conhecido o ESP32 ento no fiquem cticos, porque mes-
mo possvel correr on sistema operativo e ainda executar cdi- Eu vou estar a utilizar Python 2.7 e um Macbook Pro
go Python directamente numa prompt Python dentro do ES- com o High Sierra, sobre outros sistemas operativos vou
P32. deixar alguns pontos para terem como pesquisar.

51
Electrnica
ESP32 - MICROPYTHON

Passo 1: Ligar a placa ao computador e determinar o n- Depois de instalado podemos verificar a instalao,
mero da porta numa mquina Linux ou MacOS podemos executar o coman-
do ls /dev/{tty,cu}.* e no Windows podemos abrir o Gestor de
Neste passo vamos ligar a placa ao nosso computador
Dispositivos e procurar por dispositivos com o nome COMX,
utilizando um cabo micro USB.
ex. COM3.
Agora que j temos uma porta associada ao nosso
ESP32 podemos preparar o software necessrio para intera-
gir com ele e atualizar o firmware.
Passo 2: Preparao do ambiente de desenvolvimento
Python
Se ainda no tem o Python instalado no seu computa-
dor, necessrio instalar, eu pessoalmente utilizo o Python
2.7 mas se quiser instalar o 3.x penso que no deve existir
problema.
Para a instalao do Python basta ir ao site oficial
https://www.python.org e fazer o download correspondente
ao seu sistema operativo e seguir as instrues l indicadas.
Aqui um utilizador menos experiente pode ter algumas
dificuldades em perceber se tudo est instalado correctamente, Pip
mas no desespere porque vou deixar aqui algumas dicas para
O Pip utilizado para instalar novos mdulos no
verificar se est tudo instalado.
Python, nas instalaes mais recentes do Python o mesmo
Como qualquer dispositivo que ligamos ao nosso com- j vem includo. No entanto, caso no esteja instalado pode
putador, este precisa de software adicional para conseguir co- seguir este tutorial https://pip.pypa.io/en/stable/installing/ .
municar com o nosso sistema operativo, seja ele Windows,
Dica: o comando pip est relacionado com a verso do
Mac OS, Linux ou outro. Este tipo de software denomina-se de
Python por isso numa mquina com diferentes verses do
Driver, ao longo dos tempos os fabricantes tem consolidado
Python para utilizar a verso Python 2.7 o comando ser
com os desenvolveres de sistemas operativos uma forma de
pip2.7. Para utilizar apenas o comando pip deve garantir a
incluir os controladores directamente no sistema operativo ou
verso por defeito do Python, pode confirmar a verso exe-
pelo menos o sistema operativo saber onde ir descarregar o
cutando pip --version
driver internet, sem que utilizador se preocupe com isso, de-
nominamos esses dispositivos de Plug and Play. Bem no o Esptool
caso do nosso pequeno ESP32, aqui temos que ir descarregar
Esta ferramenta recomendada para instalar o novo
o driver directamente do site do fabricante, coisa que aconse-
firmware no ESP32 ou em qual outro chip da familia ESP.
lho sempre ao contrrio de drivers que podemos encontrar
noutros locais, o do fabricante ser decerto o menos propicio a Para fazer a instalao do mesmo vamos utilizar o pip
dar problemas. (Utilizadores Linux no devero necessitar de
drivers) # pip install esptool

Bom o nosso instinto passa por ir directamente ao goo- Se j tiver uma verso antiga pode atualizar o mesmo
gle pesquisar driver wemos lolin esp32, esta no de todo com o comando:
a melhor forma, devemos perceber que a placa de desenvolvi-
# pip install esptool --upgrade
mento constituda por outros controladores que no o nosso
ESP32, e se olharmos com ateno vamos ver outros compo-
nentes, e perto da porta USB temos um que diz Sililabs Ampy
CP2102, este o controlador responsvel pela comunicao O Ampy permite transferir ficheiros do nosso sistema local
USB-Serial com o nosso ESP32, isto porque os micro controla- de ficheiros para dentro do ESP32. Eu utilizo a verso da
dores na sua maioria s entendem comunicao serial. Adafruit e pode ser facilmente instalado utilizando o pip.
Dica: Aconselho o leitor pesquisar sempre um pou-
# pip install adafruit-ampy
co sobre alguns componentes que se destacam numa placa
com o fim de perceber a sua funcionalidade.
Para instalar o driver vamos ao site da Silicon Labs e Terminal de acesso
basta descarregar o driver indicado para o nosso sistema ope-
rativo. Para nos ligarmos consola do ESP32, que nos vai
dar acesso uma prompt Python vamos necessitar de um
Link: https://www.silabs.com/products/development- terminal. Para utilizadores MacOS ou Linux no necessrio
tools/software/usb-to-uart-bridge-vcp-drivers porque j possuem comandos para se ligar a um terminal

52
Electrnica
ESP32 - MICROPYTHON

serial, nomeadamente o comando screen, utilizadores Win- Carregar no binrio


dows podem fazer o download do PuTTY a partir do site official
Finalmente estamos no passo nal, para gravarmos o
www.putty.org .
binrio que contm o MicroPython utilizamos o comando
abaixo descrito, alterando o nome da porta para a que foi
atribuda ao ESP32, e a localizao do cheiro apontando
Passo 3: Carregar o binrio do MicroPython para o ESP32
para o local onde o utilizador guardou o download do chei-
O binrio com o MicroPython para o ESP32 pode ser ro .bin.
descarregado no link https://micropython.org/download#esp32
e guardado numa localizao conhecida. # esptool.py --chip esp32 --port nome_da_porta
write_flash -z 0x1000 localizao_do_ficheiro.bin
Vamos agora abrir a linha de comandos, caso seja Win-
dows o utilizador deve ir para a pasta onde est o Python insta- Este processo pode e vai demorar alguns segundos
lado, ex: C:\Python27\Scripts. No Linux ou MacOS o python, por isso no cancele o processo nem deve remover o ESP32
pip, esptool e ampy so agora um comandos de sistema e abruptamente.
podem ser chamados independentemente da directoria.
O resultado do comando deve ser algo idntico ao
abaixo demonstrado:
Teste de ligao
Podemos utilizar o comando esptool.py para verificar a
ligao com o ESP32, a forma mais simples de o fazer pedin-
do informaes relacionadas com a identificao da flash.
Portas em MacOS, por norma a porta tem o nome /dev/
cu.SLAB_USBtoUART, caso no acontea utilize o coman-
do ls /dev/{tty,cu}.* para listar todas as portas
Vericao e utilizao da instalao
# esptool.py --port /dev/cu.SLAB_USBtoUART flash_id Numa maquina Linux ou MacOS para nos ligarmos ao
terminal Serial do ESP32 podemos utilizar o comando:
Comando em Linux ou Windows

# esptool.py --port nome_da_porta flash_id # screen nome_da_porta 115200

Para sabermos o nome da porta em Windows vamos ao Gestor


Ao abrir a ligao carregamos no enter e a magia
de Dispositivos e procuramos por COM_X ex: COM3, numa
acontece ficamos na prompt interativa do Python com os
maquina linux podemos executar o comando ls /dev/{tty,cu}.*
famosos >>>.
que ns lista as portas associadas ao dispositivos conectados
atualmente ao computador. A partir daqui podemos escrever cdigo que ele
executado, por exemplo:
Um resultado bem sucedido deve devolver um resultado seme-
lhante ao abaixo demonstrado:

Parte BRUTALLL :)
Apagar a Flash Bem, o objectivo deste tutorial finaliza com o acesso ao
Antes de carregarmos o novo binrio devemos garantir prompt do Python, no entanto j que estamos com a inspira-
que no fica l nada que nos possa consumir espao desne- o no pico mximo e completamente delirantes com o ES-
cessrio, para isso utilizamos o comando P32, este que at trs um display OLED mesmo a pedir para
receber um belo Hello World, fica aqui a explicao de como
# esptool.py --port nome_da_porta erase_flash podemos carregar Bibliotecas extra para serem utilizadas no
nosso cdigo e como enviar texto para o display.
O resultado do comando deve ser algo idntico ao abaixo de-
monstrado:
Carregamento da biblioteca para o display OLED
SSD1306
Eu utilizo a biblioteca da Adafruit ssd1306.py, pode
ser facilmente descarregada em https://github.com/adafruit/

53
Electrnica
ESP32 - MICROPYTHON

micropython-adafruit-ssd1306, descompacte o zip e guarde o est ligado ao pino 4 SCL e ao pino 5 SDA
ficheiro ssd1306.py numa localizao conhecida.
Agora que j temos o I2C vamos criar uma varivel

>>> i2c = machine.I2C(scl=machine.Pin(4),


sda=machine.Pin(5))

que vai referenciar o nosso display, a biblioteca ssd1306 j


tem uma funo que nos devolve uma instncia/referncia
para o OLED.

>>> oled = ssd1306.SSD1306_I2C(128, 64, i2c)

Quase a terminar limpamos todo o texto que possa


Vamos ento carregar o biblioteca para dentro do nosso
ESP32 utilizando o comando. >>> oled.fill(0)

# ampy --port nome_da_porta --baud 115200 put loca-


lizao_do_ficheiro_ssd1306.py estar em preparao.

>>> oled.text('MicroPython para', 0, 0)


Importante: para enviar dados para o ESP32 devem fechar >>> oled.text(a revista', 0, 10)
todas as ligaes abertas para o mesmo.
Dica: se estiver a utilizar uma maquina Windows deve es- Comeamos a preparar o texto que queremos
tar no diretrio Scripts dentro da pasta da instalao do Finalmente mandamos mostrar esse texto fazendo
Python, em Linux ou MacOS o comando pode ser invocado em com que a magia acontea, a partir daqui a loucura .
qualquer directoria.
>>> oled.show()
O resultado do comando deve ser algo idntico ao abai-
xo demonstrado:

Terminado o envio voltamos a ligar-nos ao nosso ES- ()este super mi-


P32 utilizando o comando screen em maquinas Linux ou Ma-
cOS ou o PuTTY em maquinas windows. cro controlador sim
Acesso prompt Python vamos fazer algum cdigo que
nos vais listar os ficheiros gravados na memria do ESP32. super porque conta 2
O resultado do comando deve ser algo idntico ao abai-
xo demonstrado:
cores de 240MHz den-
tro de um microproces-
sador Tensilica Xtensa
de 32 bit Ultra Low Po-
Confirmada a existncia da biblioteca ssd1306 vamos
ao que interessa e fazer cdigo para enviar texto para o nosso wer, 448KiB de ROM
lcd OLED.
Primeiro importamos as bibliotecas machine que nos d para funes internas
acesso ao GPIOS e aos protocolos de Hardware do ESP32 e a
ssd1306 que nos oferece um conjunto de funes de alto nvel e de arranque()
para interagirmos com o display OLED

>>> import machine, ssd1306

O passo seguinte ativar o protocolo I2C para comuni-


car com o display, pela documentao percebemos que este

54
Electrnica
ESP32 - MICROPYTHON

O resultado deve ser algo idntico ao demonstrado na


imagem a abaixo:

Espero que este artigo vos tenha sido til e qualquer


duvida esto perfeitamente vontade para perguntar.
Um Grande Abrao e boa PROGRAMAO
Se gostas deste tipo de informao junta-te a nos no Movimen-
to Maker Portugal, no Facebook

AUTOR
Escrito por Bruno Horta

Licenciado em Engenharia Informtica pela ESTG. Senior Java Developer, sendo o seu principal foco o
desenvolvimento de aplicaes distribudas e de alto desempenho. Adora desenvolver prottipos para
serem utilizados no contexto da Internet das Coisas. membro fundador do Movimento Maker Portugal.
Linkedin: https://www.linkedin.com/in/brunohorta/

55
Electrnica
POMAR MUSICAL

O pomar musical foi um projeto feito, inicialmente,


para o evento Eletrnica e Informtica, organizado pela As-
sociao de Informtica de Castelo Branco.
Este evento visava mostrar projetos amadores e pro-
fissionais que se faziam, no s em Castelo Branco, mas em
todo o pas.
O pomar musical usa um Raspberry PI 2 modelo B e
o Adafruit Capacitive Touch Shield MPR121 para o Raspber-
ry PI e programado usando a linguagem Python.

Adafruit MPR121
Como funciona ?
O chapu capacitivo funciona detetando quando al-
gum toca num dos 12 eltrodos do sensor. Todos os dias
usamos esta tecnologia, nos telefones, tablets e at mesmo
eletrodomsticos.

Instalao
De seguida, necessitamos de instalar o suporte para o
Para poder usar o chapu, necessrio ativar o I2C chapu. Para tal, basta instalar as bibliotecas da Adafruit
do Raspberry PI. Para isso, basta executar o raspi-config e disponiveis no github e algumas bibliotecas necessrias para
ativar. a compilar.

sudo raspi-config Primeiro, devemos atualizar as definies de software


do Raspberry PI

sudo apt-get update


De seguida, instalar o software necessrio

sudo apt-get install build-essential python-dev


python-smbus python-pip git
Aps tudo instalado, vamos buscar as bibliotecas para o
MPR121. Como o cdigo est alojado no Github, va-
mos usar o git para clonar o repositrio.

56
Electrnica
POMAR MUSICAL
git clone https://github.com/adafruit/ sudo python simpletest.py
Adafruit_Python_MPR121.git

Clonar em 'Adafruit_Python_MPR121'... Adafruit MPR121 Capacitive Touch Sensor Test


remote: Counting objects: 73, done. Press Ctrl-C to quit
remote: Total 73 (delta 0), reused 0 (delta 0),
pack-reused 73 Cada vez que tocarem num sensor, podero ver a
Unpacking objects: 100% (73/73), done. mensagem na consola:
Checking connectivity... terminado.
9 touched!
9 released!
No final, podemos entrar na diretoria e visualizar o 4 touched!
seu contedo: 4 released!
3 touched!
cd Adafruit_Python_MPR121 3 released!
ls 2 touched!
2 released!
1 touched!
Adafruit_MPR121 examples ez_setup.py LICENSE 1 released!
README.md setup.py 5 touched!
5 released!
6 touched!
Instalar a biblioteca 6 released!

sudo python setup.py install Significa que o sensor X foi tocado e depois libertado
(quando tocam e retiram o dedo)
Se tudo correr bem, temos as bibliotecas instaladas.
Para experimentar, nada como ir diretoria dos
Pomar musical
exemplos e executar o teste mais simples:
O Pomar musical no mais que vrios clips de cro-
cd examples codilo ligados nos sensores numa das pontas e na outra pon-
sudo python simpletest.py ta ligados a peas de fruta. O importante que esteja ligado
a qualquer material que seja condutivo metal, gua doce ou
Caso tenham aqui o seguinte erro (ou algo parecido):
salgada (quanto mais salgada, mais condutiva) e tambm,
neste caso, fruta. Cada vez que se toca numa pea de fruta,
sudo python simpletest.py
o sensor correspondente d sinal que est a ser tocado e um
ficheiro mp3 com um som tocado.
Adafruit MPR121 Capacitive Touch Sensor Test
chmod: cannot access '/sys/module/i2c_bcm2708/
parameters/combined': No such file or directory Material necessrio
Traceback (most recent call last):
File "simpletest.py", line 34, in <module> Para o Pomar musical, necessrio:
if not cap.begin():
File "build/bdist.linux-armv7l/egg/
Adafruit_MPR121/MPR121.py", line 90, in begin Um Raspberry PI
File "build/bdist.linux-armv7l/egg/
Adafruit_GPIO/I2C.py", line 80, in requi- O chapu da Adafruit MPR121 para o Raspberry PI
re_repeated_start
12 clips de crocodilo
porque o mdulo no est carregado. Nada mais
simples que: 12 peas de fruta (ou menos no esqueer de co-
mer depois)
sudo modprobe i2c_bcm2708
Colunas para ligar ao Raspberry PI
Para o tornar permanente, editem o ficheiro /etc/
modules e acrescentem o mdulo sudo vi /etc/modules Ligaes
(podem user outro editor mais confortvel para vos) e Uma nota importante , como os fios e os eltrodos
acrescentem a linha: tm uma capacitncia inerente, significa que, ao ligar um clip
i2c_bcm2708 de crocodilo (ou trocar alguma fruta numa das pontas), o sen-
sor vai pensar que est a ser tocado. O que necessrio
Guardar o ficheiro e j est. Cada vez que for efetua- fazer nestes casos recalibrar os sensores, bastando para
do reboot, ele ser carregado. isso reiniciar o script de Python. A calibrao efetuada
quando o chip inicializado. O que poder ser feito , primei-
Voltem novamente a experimentar e j dever funcio- ro efetuar todas as ligaes necessrias e s depois executar
nar o script de Python.

57
Electrnica
POMAR MUSICAL
Sons if not cap.begin():
print 'Error initializing MPR121!'
Neste caso, foram usados sons livremente disponveis na sys.exit(1)
Internet, como o som de uma baleia, uma campainha, etc
O ciclo principal onde os sons so tocados. Cada
Os ficheiros de sons foram convertidos para wav para ser
input lido e verificado se houve transies no estado toca-
mais simples.
do ou no tocado.
A funo touched importantssima aqui. Ela devolve
Cdigo um valor de 12 bits onde cada bit representa um dos 12 in-
puts do chapu. Bit 0 (posio) o input 0, bit 1 (posio) o
O cdigo do Pomar Musical do mais simples que
input 1 e assim sucessivamente at ao 11 (recordem-se, tudo
pode existir. Para tocar os sons, usamos a biblioteca de
comea no 0). Se o bit tiver o valor 1, ento est a ser toca-
Python pygame. Esta biblioteca permite criar aplicaes mul-
do naquele momento, e se tiver o valor a 0, ento no est a
timdia, usando Python, e programada usando as bibliote-
ser tocado.
cas SDL.
O ciclo ir comparar o estado anterior para cada bit
As partes mais importantes do cdigo
com o estado atual. Se o valor foi alterado, ento um som
Inicializar o mixer com alguns valores para evitar LAG ser tocado.
desde que dado o comando at que o som seja efetiva-
Neste caso em particular, como s temos 8 ficheiros
mente tocado. Funcionam bem em Linux
de som, s nos importa verificar os 8 primeiros sensores
(onde foram ligados os clips de crocodilo). Isso visto pela
# Init mixer
pygame.mixer.pre_init(44100, -16, 2, 2048) instruo for i in range(8).
# Avoid sound lag
pygame.init() # Initialize Caso o estado tenha alterado para tocado (neste caso
1), ser tocado o respetivo ficheiro correspondente aquele
Posteriormente, criamos um dicionrio, com contedo ndice. Da termos igualado os ndices aos sensores torna
de chave:valor, onde a chave ser o ndice (que ir corres- tudo mais simples.
ponder ao nmero do sensor no MPR121) e o valor ser o
nome (caminho relativo desde onde executado o script) do print 'Ctrl+C para sair.'
last_touched = cap.touched()
ficheiro a tocar. Os ficheiros de som esto colocados numa while True:
directoria imediatamente a seguir localizao do script, current_touched = cap.touched()
chamada de Sons (ateno capitalizao, uma vez que # verificar cada pin e verificar se foi
Linux sensvel a maisculas e minsculas). tocado
for i in range(8):
pin_bit = 1 << i
# mapear sons # verificar se transitou de nao
MAPA_SONS = { tocado para tocado
0: 'Sons/1.mp3.wav', if current_touched & pin_bit and
1: 'Sons/2.mp3.wav', not last_touched & pin_bit:
2: 'Sons/3.mp3.wav', #print 'Tocar qq coisa'
3: 'Sons/4.mp3.wav', if (sons[i]):
4: 'Sons/5.mp3.wav', sons[i].play()
5: 'Sons/6.mp3.wav',
6: 'Sons/7.mp3.wav', # nao e preciso verificar se tran-
7: 'Sons/8.mp3.wav', sitou de tocado para nao tocado
} last_touched = current_touched
time.sleep(0.1)

Agora, criamos uma lista, inicializada a 0s, que ire- Codigo completo:
mos usar para criar os objetos de som.
__program__ = "PomarMusical"
__author__ = "Bruno Santos (feiticeir0)"
sons = [0,0,0,0,0,0,0,0] __copyright__ = "Public Domain"

import pygame
Agora, vamos percorrer a lista sons - inicializada a 0 import sys
import time
- onde vamos criar um objeto de som em cada um dos ndi-
ces, e definir o volume. import Adafruit_MPR121.MPR121 as MPR121
import Adafruit_MPR121.MPR121 as MPR121 cap = MPR121.MPR121()
cap = MPR121.MPR121() # Init mixer
pygame.mixer.pre_init(44100, -16, 2, 2048) #
Caso no esteja disponivel, dar um erro. Avoid sound lag

58
Electrnica
POMAR MUSICAL
pygame.init() # sys.exit(1)
Initialize
print 'Ctrl+C para sair.'
# mapear sons last_touched = cap.touched()
MAPA_SONS = { while True:
0: 'Sons/1.mp3.wav', current_touched = cap.touched()
1: 'Sons/2.mp3.wav', # verificar cada pin e verificar se foi
2: 'Sons/3.mp3.wav', tocado
3: 'Sons/4.mp3.wav', for i in range(8):
4: 'Sons/5.mp3.wav', pin_bit = 1 << i
5: 'Sons/6.mp3.wav', # verificar se transitou de nao
6: 'Sons/7.mp3.wav', tocado para tocado
7: 'Sons/8.mp3.wav', if current_touched & pin_bit and
} not last_touched & pin_bit:
#print 'Tocar qq coisa'
sons = [0,0,0,0,0,0,0,0] if (sons[i]):
sons[i].play()
for key,soundfile in MAPA_SONS.iteritems():
sons[key] = pygame.mixer.Sound(soundfile) # nao e preciso verificar se tran-
sons[key].set_volume(1); sitou de tocado para nao tocado
last_touched = current_touched
if not cap.begin():
print 'Error initializing MPR121!'

Um exemplo do MPR121 ligado a um kiwi (fora da imagem), uma batata doce, uma ma e um limo.

AUTOR
Escrito por Bruno Santos

O artigo Pomar Musical Interface pedaggico com base em Arduino foi gentilmente cedido atravs da
parceira com a Associao de Informtica de Castelo Branco

59
COLUNAS
C# - De List para DataTable em 30 + 2 linhas!
Kernel Panic -
C#
De List para DataTable em 30 + 2 linhas!

No ser de todo estranho, pelo menos para alguns, a for (int i = 0;


necessidade de converter uma lista de um dado tipo para Data- i < propertyDescriptorCollection.Count;
table, em C#. O mais comum, seria criar um novo objecto do i++)
{
tipo DataTable, criar as colunas e iterar a lista, adicionando as PropertyDescriptor propertyDescriptor =
linhas ao datatable, a cada iterao. Isto seria no mnimo traba- propertyDescriptorCollection[i];
lhoso, alm de pouco eficiente. O cdigo seria pouco elegante Type type =
e semelhante ao seguinte: propertyDescriptor.PropertyType;

List<recipes> list = new List<recipes>(); if (type.IsGenericType &&


type.GetGenericTypeDefinition() ==
DataTable dt = new DataTable(); typeof(Nullable<>))

PropertyDescriptorCollection props = T type = Nullable.GetUnderlyingType


ypeDescriptor.GetProperties(typeof((recipes)); (type);

foreach (var recip in recipes) dataTable.Columns.Add


{ (propertyDescriptor.Name, type);
dt.Columns.Add(recip.Name,recip.PropertyType); }
} object[] values =
new object
Seguido da iterao para colocar os dados no DataTa- [propertyDescriptorCollection.Count];
ble:
foreach (T iListItem in iList)
{
foreach (var item in list) for (int i = 0;
{ i < values.Length; i++)
dt.Rows.Add(item.Property1,item.Property2); {
} values[i] =
propertyDescriptorCollection
[i].GetValue(iListItem);
Apesar do cdigo acima funcionar e ser efectivamente }
simples, num projecto em que se tm diversas listas, de diver- dataTable.Rows.Add(values);
sos tipos, sempre que se quer passar o contedo de uma lista }
return dataTable;
de um dado tipo, para um DataTable, acabar-se-ia por repetir o }
mesmo cdigo, vez, aps vez, aps, vez, consumindo mais }
tempo, criando um cdigo nada elegante, demasiado frag-
mentado e repetitivo. Com esta classe acrescentada ao nosso projecto,
passamos a ter disponvel um mtodo chamado
Como alternativa a isto, podemos utilizar uma soluo
ToDataTable, nos objectos do tipo List<T>. Assim, a passa-
assente em Gerenics e Reflection! Parece impossvel ? Basta
gem do contedo de uma lista, para um DataTable, em qual-
recorrer a Extension Methods, que nos permitem adicionar
quer parte da soluo passa a poder ser feita com as seguin-
mtodos a tipos existentes, sem criar novos tipos derivados,
tes duas linhas:
recompilar, ou modificar o tipo original.
List<recipes> list = new List<recipes>();
Os mtodos de extenso (Extension methods), so definidos
como mtodos estticos , mas chamados usando a sintax de DataTable dt = recipes.ToDataTable();
mtodos de instncia.
Obviamente o tipo recipes, deve ser substitudo por o tipo
Vejamos como se pode fazer isto! Primeiro criamos uma clas- de dados que nos for mais conveniente, uma vez que neste
se, onde iremos colocar o nosso mtodo de extenso caso o tipo recipes foi apenas para exemplo e refere-se a
(extention method). mil e uma formas de tirar caf!

using System.Collections.Generic; Esta tcnica evita o trabalho de ter de repetir cdigo,


ao longo do projecto, bem como de escrever no cdigo cada
public static class ListExtensions vez que se pretende transferir dados de uma lista para um
{ DataTable.
public static DataTable ToDataTable<T>(this
List<T> Por incomum que possa parecer existem diversas
iList)
{ situaes em que a transferncia de dados de uma lista para
DataTable dataTable = new DataTable(); um DataTable, pode ser necessria, e ser sempre mais fcil
PropertyDescriptorCollection o recurso a algo simples como esta soluo do que a escrita
propertyDescriptorCollection =
TypeDescriptor.GetProperties(typeof(T));

61
C#
DE LIST PARA DATATABLE EM 30 + 2 LINHAS!

e reescrita de cdigo, criando um possvel problema de manu- Existem diversas formas de se obter estes mesmos
teno de cdigo posterior. resultados, tal como j foi referido e at pode parecer inco-
mum a necessidade de realizar este tipo de operaes. No
A titulo de curiosidade, poderia ser necessrio fazer
entanto, por exemplo quando se esto a manipular volumes
exactamente o inverso, mais concretamente converter um
de dados considerveis, pode por diversas razes diferentes
DataTable em lista, e novamente apareceriam uma mirade de
ocorrer a necessidade de transferir os dados para listas (List)
formas diferentes para o fazer.
e de volta para DataTable.
Neste caso e apenas para efeitos de exemplo ser feito
Referencias:
usando Generics. Apesar de no ser o objectivo deste artigo
abordar a transferncia de dados de DataTable para List, creio https://docs.microsoft.com/en-us/dotnet/csharp/programming-
ser de interesse para o leitor um exemplo de como o fazer. Ora guide/classes-and-structs/extension-methods
para tal criamos um mtodo que ir executar as operaes
http://www.asparticles.com/2016/10/different-ways-to-convert
necessrias, e depois invocamos o mtodo sempre que neces-
-datatable-to-list-in-csharp.html
srio. Vejamos o mtodo:

private static List<T> ConvertDataTable<T>


(DataTable dt)
{
List<T> data = new List<T>();
foreach (DataRow row in dt.Rows)
{
T item = GetItem<T>(row);
data.Add(item);
}
return data;
}

private static T GetItem<T>(DataRow dr)


{
Type temp = typeof(T);
T obj = Activator.CreateInstance<T>();

foreach (DataColumn column in dr.Table.Columns)


{
foreach (PropertyInfo pro in
temp.GetProperties())
{
if (pro.Name == column.ColumnName)
pro.SetValue(obj, dr
[column.ColumnName], null);
else
continue;
}
}
return obj;
}

Com o mtodo escrito, podemos ento chamar este


mtodo e converter os dados. Novamente duas linhas so sufi-
cientes para realizar esta operao.

List<recipe> recipeDetails = new List<recipe>();


recipeDetails = ConvertDataTable<Recipes>(dt);

E com isto temos a converso de List para DataTable e de


DataTable para List.

AUTOR
Escrito por Antnio C. Santos

Programar criar um novo mundo escrevendo cdigo, cumprindo os mais elementares desgnios da
vida, aprender, ensinar, criar, partilhar, melhorar e seguir. Formou-se no Instituto Politcnico de Viana
do Castelo. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio desde 2012, actualmente exerce funes
de mentor voluntrio na plataforma MOOC Coursera . Twitter:@apocsantos

62
Media Partners da Revista PROGRAMAR

Anlises
Node.js - Construo de Aplicaes Web
Desenvolvimento em Swift para iOS
Review
Node.js - Construo de Aplicaes Web

Ttulo: Node.js - Construo de Aplica- No captulo 2 as coisas comeam a ficar interessan-


es Web tes, aqui o mdulo Express explicado detalhadamente e
Autores: Lus Abreu com exemplos, este mdulo permite ao programador definir
rotas e componentes middleware. Este um ptimo capitulo
Editora: FCA - Editora de Informtica para ficar com boas bases para criar uma aplicao baseada
Pginas: 197 na arquitectura MVC (Model-View-Controller).

ISBN: 978-972-722-860-7 O capitulo 3 vem falar sobre motores de templates,


nomeadamente o Jade e Vash. O autor explica com mais
Formato: Capa Soft detalhe o Jade e um pouco mais sucintamente o Vash. Acon-
selha tambm ao leitor a utilizar o Jade. No entanto se j
efetuou alguma pesquisa sobre motores de templates ou se
est a comeou a usar, deve ter especial ateno que o mo-
tor Jade passou agora a chamar-se Pug, o autor no faz
Ol a todos, esta a primeira vez que fao uma re-
referncia a isso como normal, pois o livro comeou a ser
view para a revista Programar, queria desde j agradecer ao
escrito em 2015 e a alterao de nome de Jade para Pug
Antnio Santos e FCA pela oportunidade e pelo envio do
muito recente. De qualquer forma tudo o que descrito no
livro.
livro funciona perfeitamente e mesmo que o leitor tente insta-
Quem me conhece, sabe que dou preferncia a um lar o Jade o repositrio NPM sabe apontar para o mdulo
livro impresso aos digitais, apesar de ser um aficionado das correcto.
tecnologias, a leitura de um livro fisico traz-me um conforto e
Para aqueles que adoram criar interfaces espectacu-
uma concentrao que no consigo nos electrnicos.
lares, ento o captulo 4 o indicado.
O livro Node.js no poderia ter chegado em melhor
Aqui o autor explica muito detalhadamente como me-
altura, pois neste momento estou a dedicar mais ateno a
lhorar a nossa aplicao e aumentar a rapidez com que de-
esta bela plataforma, que quando aplicada correctamente
senvolvemos. Utilitrios como Bootstrap, Bower e Grunt so
pode ser uma melhor opo a outras de maior porte, por
muito importantes para quem vai desenvolver ou desenvolve
exemplo o Java EE ou .Net.
aplicaes Node.js no seu dia a dia.
Comeando pela capa do livro, o leitor mais atento vai
O Bootstrap permite ao programador criar uma inter-
verificar que o autor trata as bibliotecas de cdigo como livra-
face que responda bem em qualquer tamanho de ecr, seja
rias, bem para um programador livrarias um sitio onde
um iMac de 27 polegadas ou um smartphone. O Bower per-
compramos livros, j bibliotecas no contexto informtico, so
mite gerir bibliotecas otimizando as dependncias comuns
boas composies de cdigo que ns facilitam a vida no
entre elas, j o Grunt faz com que tarefas rotineiras sejam
desenvolvimento de novas aplicaes, no entanto um mero
realizadas automaticamente. Se o leitor ainda no um ex-
clich.
pert, no tem de ter receio porque tudo explicado passo a
Iniciando a leitura do livro comeamos com um belo passo com uma linguagem muito simples.
resumo dos excelentes 8 captulos que compem o livro,
Temas sobre Bases de Dados e Single Page Applica-
deixando qualquer leitor entusiasmado para ler na totalidade.
tions so tratados nos captulos 5 e 6. Para os aficionados
O termo livrarias parece ter desaparecido nas primeiras pagi-
do NoSQL o autor explica como utilizar o MongoDB em apli-
nas, sendo agora tratado pelo termo correcto bibliotecas,
caes Node.js, mas tambm no deixa de lado as bases de
mas aparentemente foi falso alarme j que o autor utiliza
dados relacionais, e explica tambm mais sucintamente co-
tanto um termo como outro ao longo do livro. Esquecendo o
mo as utilizar, sendo que com bases de dados NoSQL que
termo livrarias, viro o foco para plataforma Node.js, aqui o
o Node.js se sente como Peixe na gua afirma o autor.
autor consegue passar perfeitamente a mensagem utilizando
poucas palavras e descomplicando o assunto. Chegando quase ao fim do livro temos o captulo 7,
nos dias que correm este tema no deve ser deixado ao
No primeiro captulo a autor justifica o porqu do No-
acaso. Nele o autor fala sobre como proteger as aplicaes
de.js, explica a arquitectura assncrona de eventos, j que
com autenticao e limitar acesso a funcionalidades com
esta uma das grandes potencialidades no Node.js.
base numa autorizao. Para o efeito utilizado o mdulo
De seguida, ainda no captulo 1 mostra como configu- Passport que em conjunto com o mdulo Express j conheci-
rar o ambiente de desenvolvimento, aqui o autor utiliza uma do do captulo 2, tornam as coisas muito simples para o pro-
maquina Windows para exemplificar passo a passo a confi- gramador.
gurao. Ambientes em Mac OS ou Linux no so tratados
Por fim o capitulo 8 dedicado a tecnologias gerais,
neste livro, algo que me deixou um pouco desiludido.

65
Review

NODE.JS - CONSTRUO DE APLICAES WEB


nomeadamente criptografia, sockets, gesto de buffers e ra, mas tambm pela segurana e certeza com que aborda
acesso ao sistema de ficheiros. Como leitor e programador os temas deste livro, dando sempre o seu parecer com base
recomendo muito este ltimo captulo, j que nos d uma na sua vasta experincia.
ideia do que existe para criarmos aplicaes profissionais e
robustas.

()Aqui o autor
No captulo 2 as explica muito detalha-
coisas comeam a ficar damente como melho-
interessantes, aqui o rar a nossa aplicao e
mdulo Express ex- aumentar a rapidez com
plicado detalhadamen- que desenvolvemos.
te e com exemplos, es- Utilitrios como
te mdulo permite ao Bootstrap, Bower e
programador definir ro- Grunt so muito impor-
tas e componentes tantes para quem vai
middleware. Este um desenvolver ou desen-
ptimo capitulo para fi- volve aplicaes No-
car com boas bases de.js no seu dia a dia.
para criar uma aplica- ()
o baseada na arqui-
tectura MVC (Model- Re- comendo este livro tanto para quem
quer iniciar a programao na plataforma Node.js, e para
quem quer ter um bom livro de consulta ao lado do teclado.
View-Controller).
Obrigado FCA pela publicao e Antnio Santos pelo en-
vio :).
Aguardo pelo proximo :)
Com isto deixo os meus parabns ao Eng. Lus Abreu Abrao
autor deste excelente livro, no s pela escrita directa e cla-
Bruno Horta

AUTOR
Escrito por Bruno Horta

Licenciado em Engenharia Informtica pela ESTG. Senior Java Developer, sendo o seu principal foco o
desenvolvimento de aplicaes distribudas e de alto desempenho. Adora desenvolver prottipos para
serem utilizados no contexto da Internet das Coisas. membro fundador do Movimento Maker Portugal.
Linkedin: https://www.linkedin.com/in/brunohorta/

66
Review
TypeScript - O Javascript moderno para criao de aplicaes

Ttulo: TypeScript - O Javascript mo- seguintes temas: tipos bsicos; funes; interfaces; classes;
derno para criao de aplicaes outros tipos; mdulos.
Autores: Lus Abreu De uma forma muito concisa e com exemplos pr-
Editora: FCA ticos, toda esta parte do livro demonstra o grande poten-
cial do TS, principalmente a nvel de preveno de erros e
Pginas: 168 aplicaes tcnicas da linguagem. Analisa, ainda, muitas das
ISBN: 978-972-722-864-5 caractersticas prprias desta linguagem que, por exemplo, o
JS no suporta. Algumas dessas caractersticas so a capa-
O Javascript (JS) tem vindo a tornar-se cidade de utilizao de tipos genricos, interfaces e
uma linguagem de programao cada vez mais popular, StrongType.
sendo neste momento usada para desenvolver aplicaes
standalone, APIs, aplicaes Web, entre outras. Na minha opinio, enquanto programador Java com
conhecimentos pouco aprofundados em JS, penso que al-
Apesar da sua grande versatilidade, o JS diferente guns utilizadores menos experientes podero ter dificuldades
de outras linguagens muito utilizadas, como Java e C#. Esta em entender alguns conceitos adjacentes ao JS, pois no
linguagem no suporta o uso de tipos genricos, interfaces e so explicados no contexto, apenas apresentados sucinta-
no StrongTyped, caractersticas fundamentais para mui- mente.
tos programadores.
Outro aspecto que gostaria de ter visto abordado nes-
O livro que apresentamos nesta edio d-nos a co- te livro o Async Await, conceito familiar para pro-
nhecer o TypeScript (TS), uma linguagem/superset do JS, gramadores C# e JS, que j est disponvel no Typescript
com o objetivo de aproximar linguagens como Java e C# ao desde a verso 1.7.
Javascript, ao disponibilizar algumas caractersticas presen-
tes nestas linguagens. O livro intitulado TypeScript, O Ja- A terceira, e ltima, parte lana o desafio de criar um
vaScript Moderno para Criao de Aplicaes de Lus projecto, utilizando o conhecimento obtido na leitura deste
Abreu, editado pela FCA, permite ao leitor iniciar ou aprofun- livro.
dar o seu estudo em relao ao TS, dividindo-se trs partes Considero uma iniciativa positiva por parte do autor
principais: instalao e configurao; descrio tcnica; pro- em criar este desafio aos leitores, pois desta forma permite
jecto exemplo. consolidar os conhecimentos, aspecto que deveria estar
A primeira parte do livro aborda a configurao ne- mais presente em livros tcnicos.
cessria para compilarmos o TypeScript para JS utilizando Apesar do TypeScript, devido utilizao de Angular
packages disponveis para NodeJS, bem como a configura- em alguns projectos pessoais, no ser desconhecido para
o de ferramentas de debug no Visual Studio Code. Embo- mim, achei este livro muito completo e til para programado-
ra existam outros IDEs que suportam a linguagem TS, o livro res com ou sem experincia em TypeScript.
explora apenas o Visual Studio Code, sem referenciar ou-
tros, como por exemplo o WebStorm. Parabns ao autor Lus Abreu e Editora FCA por
este excelente livro e por terem abordado o TypeScript que,
Todas as configuraes necessrias so muito bem na minha opinio, vem conquistar programadores de Java,
explicadas, permitindo a leitores sem qualquer experincia C# e PHP e incentivar a utilizao do TypeScript em projec-
em JS ou TS reproduzi-las sem problemas. tos.
A segunda e principal parte deste livro, aborda a lin-
guagem TS de forma tcnica, explicando a sua semntica,
sintaxe, bem como as capacidades de validao e controlo
realizadas aquando da compilao. So apresentados os

AUTOR
Escrito por Joo Sousa

Natural de Leiria, Licenciado em Eng. Informtica no Instituto Politcnico de Leiria e Mestre em Computa-
o Mvel pelo Instituto Politcnico de Leiria.

Software Developer na Void Software.

67
Segurana
A Revoluo da Blockchain - A Tecnologia do Futuro
Segurana em Aplicaes Android
Blockchain and Merkle Tree
Segurana

A Revoluo da Blockchain - A Tecnologia do Futuro


Desde o nicio do ano de 2009 que uma moeda virtual de implantar uma rede blockchain privada para substi-
tem vindo a marcar a diferena no horizonte dos pagamentos tuir sistemas internos [8];
digitais. O principal ingrediente do bitcoin [1] uma tecnologia
inderrubvel que at ento nem tinha sido muito notada a A ICAP, uma empresa britnica de servios fi-
blockchain [1] [2] (white paper). nanceiros tambm j usa a blockchain [9];

A blockchain uma tecnologia sofisticada que A Nasdaq, onde se negociam aes de empre-
permite salvaguardar registos de uma forma distribuda sas de tecnologia em Nova York, usa a tecnologia
e no centralizada uma vez que no existe uma entida- blockchain para registar troca de aes [10];
de de gesto central. Este sistema tambm conhecido MUSE Blockchain, mundo da msica, represen-
como livro razo, tem o objetivo de guardar registos de ta um sistema que est reforando a transparncia
transaes e os registos de todas essas transaes so necessria para a indstria musical, abordando pro-
atualizados em cada n da rede e no apenas no n blemas com distribuio de royalties, licenciamento e
central de gesto (porque efetivamente esse n no equidade de artistas [11];
existe). Sempre que consumada uma transao na
rede todos os ns da rede so informados. Ele funciona Citizen Ticket visa trazer transparncia, segu-
com base numa cadeia de blocos, nada mais do que um rana e justia venda online de bilhetes de eventos
conjunto de informaes que so ligadas a cadeias ad- [12];
jacentes. Estes blocos so pblicos, no sentido em que EUA Storj, uma soluo de Cloud est atual-
todos os ns da rede podem aceder a essa informao. mente a testar uma rede blockchain para melhorar a
Porm, estes blocos quando so processados no po- segurana e diminuir a dependncia de um provedor
dem ser alterados nem apagados. Alm disso, novos central [13];
registos s podem ser feitos mediante um processo de
auditoria. Tambm os sistemas de votao esto a adotar
Em seguida apresentado um infogrfico [3] onde a tecnologia. A informao relativa ao voto continua
ilustrado de forma breve o modo de funcionamento DA registada mas totalmente annima [14];
BLOCKCHAIN.
A IBM desenvolve projetos que visam aperfeio-
ar o sistema blockchain [15].
Ucrnia usa blockchain para identificar proprie-
dades rurais e evitar fraudes [16];
IBM e Samsung desenvolvem um sistema para
construir uma rede de dispositivos distribudos - uma
Internet das coisas descentralizada [17];
e Etherify: a primeira empresa portuguesa foca-
Esta tecnologia tornou-se de facto to interessan-
da em criptomoeda e blockchain [18].
te que foi vista como uma possvel implementao de
segurana para os mais diversos setores, como por De entre muitas vantagens, o sistema blockchain ofe-
exemplo: rece:
O Dutch Central Bank est a desenvolver um pro-
ttipo (DNBCoin) para a sua prpria moeda digital [4];
O registo em ordem cronolgica de todas as
O Deutsche Bank (com sede na Alemanha), o transaes da rede;
HSBC e o Barclays (ambos com sede na Inglaterra) utili-
zam tecnologia com base na blockchain desenvolvida Todas as novas transaes so validadas por
pela IBM e com o contributo de outras empresas [5]; cada n da rede;

O Mizuh Bank no Japo tambm realizou testes Possui um sistema pblico, exclusivo, replicado
experimentais durante 3 meses [6]; com todos os ns da cadeia;
A KRX, operador da bolsa de valores na Coreia A atualizao da rede acontece de forma volun-
do Sul pretende inaugurar uma plataforma blockchain tria e descentralizada, isto , no existe uma
para estimular as transaes off-board [7]; entidade central que orquestre toda a rede;
Tambm a startup norte-americana R3 CEV formou um
consrcio de 25 bancos de investimento com o objetivo

69
Segurana

A REVOLUO DA BLOCKCHAIN - A TECNOLOGIA DO FUTURO


Recompensa os ns recebem uma recompensa adaptar este sistema criptogrfico aos seus sistemas,
relativa tarefa de minerao (embora possa ser interesses e finalidades [19].
alterada a lgica dessa recompensa nas redes Afinal de contas, a descentralizao acarreta
pblicas e privadas). diferentes benefcios para os mais diversos contextos.
Para a banca permite, por exemplo:

E ainda podem ser enumeradas a maior indepen- Acelerar a liquidao de transaes;


dncia, segurana, transparncia e agilidade na trans-
misso das informaes uma vez que no existe um Pagamentos cross-border entre bancos
terceiro n de confiana. A nvel da banca permite uma nacionais e investidores estrangeiros;
reduo dos custos de transao e um sistema de paga-
Armazenamento de documentos e contratos;
mento otimizado, com tempo de liquidao acelerado.
Dentro dos cuidados de sade, a blockchain tem tam- Tracking de transaes;
bm o potencial de proteger os pacientes e as instala-
es mdicas contra percalos de administrao e segu- Pagamentos entre pessoas que no tm conta
rana, debates de seguros e infraes de dados clni- bancria; e
cos.

Desde o nicio do A blockchain


ano de 2009 que uma uma tecnologia sofisti-
moeda virtual tem vindo cada que permite salva-
a marcar a diferena no guardar registos de
horizonte dos pagamen- uma forma distribuda e
tos digitais. O principal no centralizada uma
ingrediente do bitcoin vez que no existe uma
[1] uma tecnologia in- entidade de gesto cen-
derrubvel que at en- tral. Este sistema tam-
to nem tinha sido mui- bm conhecido como li-
to notada a vro razo, tem o objeti-
blockchain [1] [2] (white vo de guardar registos
paper). de transaes e os re-
gistos de todas essas
transaes so atuali-
Muitas empresas e at instituies, como os ban-
cos, o prprio Santander (sediado na Espanha), Citibank zados em cada n()
(sediado nos EUA), Goldman Sachs (sediado nos Esta-
dos Unidos), BBVA (sediado na Espanha), Westpac e
Commonwealth Bank (sediados na Austrlia) e muitos
outros, j realizaram experincias com a finalidade de

70
Segurana

A REVOLUO DA BLOCKCHAIN - A TECNOLOGIA DO FUTURO


Privacidade do cliente final (anonimato). blockchain-consortium-is-splintering

Hoje em dia a blockchain uma enorme cadeia [9] http://www.coindesk.com/icap-blockchain-rosetta-


de dados digitais, e ela considerada por muitos stone/
imutvel por uma simples razo: extremamente [10] http://business.nasdaq.com/Docs/Blockchain%
dispendioso contornar uma transao j validada na 20Report%20March%202016_tcm5044-2
rede. Atualmente a rede possui um poder de processa-
mento de cerca de 5.988.701.03 TH/s (dados de julho [11] https://bitcoinmagazine.com/articles/three-
de 2017) [20]. Este nmero grande tem um significado startups-trying-to-transform-the-music-indust ...
ainda maior Se algum indivduo, grupo de indivduos [12] https://www.citizenticket.co.uk/
ou mesmo entidade quiser alterar alguma transao j
validada, seria preciso no mnimo 50% + 1 do poder de [13] https://storj.io/
processamento da rede, isto , certa de 299.435 TH/s [14] http://www.nasdaq.com/article/6-blockchain-
um valor de processamento gigantesco. applications-that-go-beyond-bitcoin-cm716269
Todavia, um dos maiores problemas na adoo [15] https://www.ibm.com/blockchain/
deste modelo criptogrfico que ele extremamente
complexo de aplicar, principalmente porque cada projeto [16] http://experienceclub.com.br/ucrania-usa-
possui o seu prprio esqueleto e tambm os seus pr- blockchain-em-terras/
prios ideais. Existem atualmente esforos de cdigo
[17] http://www.coindesk.com/ibm-reveals-proof-
aberto (open-source), como o caso do HyperLedger
concept-blockchain-powered-internet-things/
[21] da IBM, o Ethereum [22] e o Corda [23] que so
algumas plataformas para o desenvolvimento de siste- [18] http://www.jornaleconomico.sapo.pt/noticias/
mas com base na blockchain. etherify-nasceu-a-primeira ...

Estima-se que nos prximos anos a blockchain [19] http://www.coindesk.com/8-banking-giants-bitcoin-


seja largamente usada o que contribuir para uma me- blockchain/
lhor segurana na transmisso da informao atravs da
[20] https://blockchain.info/
prpria Internet. Esta ser certamente uma revoluo
muito semelhante quela que ocorreu com a Internet. [21] https://www.hyperledger.org
[22] https://www.ethereum.org

Referncias [23] https://www.corda.net

[1] https://bitcoin.org/bitcoin.pdf
[2] http://scet.berkeley.edu/wp-content/uploads/
BlockchainPaper.pdf
[3] https://seguranca-informatica.pt/infografico-modo-
funcionamento-do-blockchain/
[4] http://www.coindesk.com/dutch-central-bank-
cryptocurrency-experiments/
[5] http://uk.businessinsider.com/deutsche-bank-hsbc-
kbc-natixis-rabobank-socit-gnrale-and
[6] http://www.coindesk.com/mizuho-blockchain-
recordkeeping-digital-currency-trials/
[7] http://www.coindesk.com/korea-exchange-launches-
blockchain-powered-private-market-...
[8] https://dailyfintech.com/2016/11/28/why-the-r3cev-

AUTOR
Escrito por Pedro Tavares

Pedro Tavares atualmente um profissional no ramo da segurana da informao. Desempenha funes


como IT Security Engineer, membro fundador e pentester no CSIRT.UBI e fundador do blog seguranca-
informatica.pt.

71
Segurana

Segurana em Aplicaes Android


O ficheiro de uma aplicao Android chamado ros. Quantos mais parmetros so mencionados maior
de Android Package (apk), e no mais que um ficheiro se torna o horizonte de ataque. Dito de uma forma
Zone Information Protocol (ZIP) comprimido. mais jocosa, o objetivo da segurana da informao
ento dificultar o processo de obteno de determina-
do valor no seu estado mais cru. Nesse caso,
Comeamos com algumas breves questes: qualquer fulano que tente explorar e obter informao
do sistema, em vez de demorar 30 minutos vai demor-
ar, dias, semanas, talvez anos, extingue-se o sol e o
possvel descomprimir um apk? bisneto do bisneto do terceiro filho tenta alcanar o
Sim. objetivo do tatarav. Confuso? o objetivo!
Ento, tambm possvel ler o cdigo-fonte de O principal segredo para a segurana nasce
um apk? durante o desenho da arquitetura do sistema.
Sim. necessrio clarificar a arquitetura, as assunes do
sistema, os intervenientes, e depois, comear o puz-
Os apks so reversveis atravs de engenharia zle. No caso das aplicaes Android existem alguns
reversa? tpicos que podem e devem ser levantados logo no
Sim. nicio do desenvolvimento, p.ex:
Isso quer dizer que, possvel encontrar dados A aplicao ir ser distribuda por centenas de
sensveis como, por exemplo, palavras-passe e utilizadores, logo o cdigo-fonte vai estar dis-
Application Programming Interface (API) keys, ao ponvel nos smartphones dos utilizadores.
longo do cdigo? Sim.
No caso de comunicao com servios third-
possvel construir um apk totalmente seguro party, importante pensar como e onde iro ser
prova de bala? guardadas as palavras-passe, secret keys e
tokens de acesso a esses servios.

Este artigo tem o objetivo de passar alguns pro- Consoante o tipo de aplicao, nativa ou no-
cedimentos de forma a que qualquer developer, ou fula- nativa, importante incrementar a segurana
no com conhecimentos bsicos sobre Android, consiga na forma como o cdigo da aplicao dis-
auditar sua prpria aplicao antes que esta seja publi- tribudo na store.
cada e maliciosamente explorada.
E respondendo ltima questo: -Nim.

Caa aos Dados Sensveis


No existe uma aplicao, sistema, infraestrutura
ou at ecossistema prova de bala e totalmente seguro.
Isso deve-se a muitos fatores, p.ex., um desenho defi-
Antes de avanar importante abordar uns
ciente da arquitetura, bugs cometidos em sede de
breves conceitos sobre a forma como uma aplicao
desenvolvimento, software desatualizado, vulnerabi-
lidades zero-day attack, fuga de informao, entre out-

72
Segurana

SEGURANA EM APLICAES ANDROID


Android opera e qual o ciclo de desenvolvimento at Existem ferramentas de compilao como o
gerao do apk final. Gradle e o Apache Ant que automatizam o processo
de gerao da aplicao final, o apk, no caso do An-
APK e o Android
droid. De notar que, foram gerados pelo caminho os
Depois do download do apk da store, a aplicao ficheiros .class, que so os ficheiros com o cdigo
instalada no smartphone. A forma como o sistema foi Java j compilado. Adicionalmente para que um apk
desenhado permite: rode numa DVM, necessrio tambm codificar esses
ficheiros em .dex files.
Cada apk correr numa Virtual Machine (VM) total-
mente isolada; O processo um pouco mais elaborado do que
aquele que foi apresentado acima (ver abaixo).
Isolamento de processo (UID), i.e., cada processo
tem um nico ID. Cada processo tem o seu
endereamento de memria, e apenas o processo
com o ID XPTO tem acesso memria XPTO
(shared preferences);

No h recursos partilhados porque cada shared


preference s pode ser acedida pelo processo
com o ID XPTO (o owner); e

Maior proteo do kernel.

Dalvik Virtual Machine Vs. Java Virtual Machine


A forma como um apk interpretado pelo sistema
Android muito semelhante forma como uma Java
Os ficheiros Resources, Assets e Manifest no
Virtual Machine (JVM) interpreta um ficheiro .jar. A VM
so sequer codificados pelo compilador Java (javac)
do Android chama-se Dalvik Virtual Machine (DVM).
nem pelo dx. Estes ficheiros so apenas compacta-
(Existe tambm uma outra runtime denominada dos. Est a lembrar-se do ZIP e do UnZIP?
ART e que bastante mais rpida que a DVM. Pode ser
Neste ponto importante reter o seguinte:
consultada mais informao aqui.)
Os Resources e Assets armazenam outros
ficheiros como imagens, fonts, HTML, CSS e
Javascript (este ltimo muito importante) .

Eles no so compilados (codificados em byte


code), apenas so comprimidos junto dos fichei-
ros .class e .dex.

A grosso modo, um apk mesmo um conjunto


de ficheiros do tipo: Resources, Assets, Mani-
fest + ficheiros compilados (.class e .dex).

Engenharia Reversa (ER)


Podemos desenhar dois caminhos distintos an-
tes iniciar o trabalho:

Para aplicaes hbridas no necessrio de-


compilar os ficheiros (.dex e .class), eles
apenas vo conter os plugins e libs dos CPTs.
necessrio fazer somente o unzip do apk
porque o cdigo est nos Assets.

Para aplicaes nativas necessrio percorrer


todo o fluxo de Engenharia Reversa (ER).

73
Segurana

SEGURANA EM APLICAES ANDROID


Segue abaixo o fluxo de ER para aplicaes Android. 2. Unzip do apk
Em seguida segue o unzip do apk e a respetiva
estrutura dos ficheiros.

unzip apk_name.apk

possvel observar dois ficheiros importantes:

assets, onde vai estar o cdigo de aplicaes


hbridas (cdigo Javascript); e

classes.dex, o ficheiro com o source-code em


Java.
3. Diretoria Assets
Em aplicaes hbridas, como o caso de apps
O processo de ER de aplicaes Android comea construdas com o Apache Cordova ou Phonegap,
sempre da mesma forma: dentro desta diretoria est a estrutura tipicamente de
um website.
Download do apk do telemvel ou da store;

unzip do apk

Normalmente, para aplicaes hbridas, basta o


unzip.

Para aplicaes nativas necessrio:

Decompilar o ficheiro classes.dex

Decompilar os ficheiros *.class para source


-code

Analisar o source-code.
1. Download de uma Aplicao Aleatria da Store
De forma a comprovar o que foi dito ao longo do
artigo, foi descarregada uma aplicao aleatria da Play
Store. Para isso, basta entrar na pgina da Play Store e
selecionar uma aplicao para descarregar.
Analisando o ficheiro m_index.html possvel
https://play.google.com/store/apps/details?id=ID visualizar uma chamada a um ficheiro Javascript.
Atravs do SDK do Android, possvel puxar o
<script src="js/app.js"></script>
apk diretamente do smartphone.
Analisando o ficheiro app.js, na diretoria js,
adb connect xxx.xxx.xxx.xxx:5555 possvel encontrar dados sensveis, secret keys para
adb shell pm list packages comunicar com third party applications, como o ex-
adb pull /data/app/exemplo.app.pt.apk
emplo da Amazon Web Services, Linkedin, ou outro
tipo de APIs pblicas.
Para os mais impacientes, podem ser usadas al-
linkedIn: {
gumas ferramentas online, p.ex.: callbackUri: "https://####",
clientId: "####rqbt###rr",
https://apkpure.com clientSecret: "####M85####X9"
}

74
Segurana

SEGURANA EM APLICAES ANDROID


Como uma API no pblica necessita de uma API Relembrar que, o desempenho de uma
key e uma secret key para que uma comunicao entre aplicao hbrida no pode ser comparado ao desem-
o cliente e o servidor seja estabelecida, esses dados penho de uma aplicao nativa, pois a aplicao no-
so guardados, preferencialmente, em ficheiros do tipo nativa no fala diretamente com o SO.
Javascript em aplicaes hbridas. Como observado,
Em suma, como vantagens podem ser enu-
isto um problema grave de segurana, uma vez que,
meradas as seguintes:
foi preciso apenas um simples unzip do apk para chegar
aos dados sensveis. Boa experincia de utilizao;
muito provvel que existam bots na Internet a
Portabilidade (multiplataforma);
efetuar este tipo de processos de uma forma autnoma.
Baixo custo de desenvolvimento; e

4. Analisar o Source-code Java da Aplicao - ER Rpido desenvolvimento.

Para uma anlise in-depth, necessrio seguir o


processo de ER mencionado no diagrama mais acima.
Como desvantagens:
Para tal, necessrio usar algumas ferramentas dis-
ponveis na Internet, p.ex., dex2jar e Java Decompiler, e Fraca segurana (sem ofuscao e criptografia,
efetuar os seguintes passos: etc);

d2j-dex2jar apk_name.apk (reverter .dex em .jar) Baixa performance ( necessrio uma ponte via
Javascript); e
Abrir o ficheiros com um Java Decompiler
Depois de aberto, possvel visualizar o source-
A aplicao mais pesada que uma aplicao
nativa porque agrega um conjunto de plugins do
code da aplicao.
CTP.
Melhorar a Segurana de Aplicaes Android
A segurana de qualquer que seja o sistema
deve ser pensada desde o seu incio. Neste caso em
especfico, seja uma aplicao Android nativa ou no-
nativa, o problema exatamente o mesmo: dados
sensveis esto codificados no cdigo e espalhados
por centenas de utilizadores.

Como se trata de uma aplicao no-nativa, A ofuscao uma tcnica que pode ajudar a
apenas feita a invocao do web wrapper, tal como foi incrementar o tempo de processamento para obter os
mencionado mais acima. O wrapper invoca simples- dados sensveis, no entanto, eles esto ali (apenas
mente os resources (HTML). baralhados). Nesse sentido, ofuscao dificulta o pro-
cesso mas no resolve o problema dos dados codifi-
Em aplicaes totalmente nativas, seria possvel cados no cdigo.
encontrar todas as atividades da app, e procurar recur-
sivamente por palavras-chave dentro do projeto. Dessa Algumas solues de ofuscao para
maneira, vivel identificar dados sensveis. aplicaes Android so as seguintes:

Vantagens de Desvantagens de Aplicaes Hbridas Google Code Enclosure (para apps hbridas);

As aplicaes hbridas so excelente do ponto de ProGuard (apps nativas).


vista da rapidez de desenvolvimento. Torna-se rpido o
seu desenvolvimento porque os CPTs j fornecem um
conjunto de plugins muito variados. Outra grande vanta- preciso pensar em outras alternativas para
gem que, normalmente, o desenvolvimento cruzado, alm da ofuscao, p.ex., o Android Key Store Sys-
i.e., multiplataforma, Android, iOS, web, etc. E sobre tem, em que os dados sensveis so guardados direta-
tudo, o custo de desenvolvimento muito mais barato mente no processador (hardware).
que aplicaes nativas.
uma soluo prova de bala? No, mas com-
Nem sempre os cuidados de segurana so os plica em muito a vida de um cracker, e obter dados
melhores. necessrio ofuscar todo o contedo, deste nvel de proteo muito mais complexo do que
nomeadamente ficheiros Javascript onde vo estar apenas de um simples unzip.
guardados dados sensveis, e sobretudo, repensar a
forma como a app deve ser desenhada. Existem tambm outras solues baseadas em

75
Segurana

SEGURANA EM APLICAES ANDROID


third parties services, como o exemplo da AWS implementados com os mnimos requisitos de se-
e do Meteor. Aqui a computao fica do lado de gurana.
quem mantm o servio e a aplicao no precisa
Estima-se que uma grande percentagem de
sequer de manter registos sensveis no client-
aplicaes distribudas na Play Store no detenham
side.
grandes mecanismos de proteo. Em Portugal, o par-
Fica em baixo um caso de uso da AWS para adigma no muito diferente. importante conscien-
solues mveis. cializar os arquitetos de solues da importncia do
uso de mecanismos de criptografia e de segurana.
importante perceber que nos ltimos anos os
prejuzos por fuga de informao tm sido catastrfi-
cos. Basta debruar um olhar atento sobre um dos
ltimos grandes leaks do vero de 2017, Equifax.
importante tambm que as empresas adotem
cada vez mais uma mentalidade defensiva, porque j
a partir de maio de 2018, existem procedimentos a
cumprir, normas europeias que visam penalizar aque-
las empresas que no o fizerem (RGPD).
Nestes casos, toda a computao fica do lado do
provedor de servio (a AWS, neste caso em especfico).
A gesto de utilizadores gerida atravs do servio
cognito, e as callbacks a third party applications so
geridas dentro do ecossistema do provedor. Esta uma
forma elegante e segura de conceber aplicaes
mveis.

Tem desvantagens? Sim, a aplicao mvel distribuda


por centenas de utilizadores considerada segura (uma
vez que no existem dados sensveis partilhados do
lado dos clientes) mas mantem-se agarrada a um
provedor de servios (o preo a pagar pela medida de
segurana implementada).

Concluso
No existem solues perfeitas para a segurana
de um sistema ou de uma aplicao. O segredo est na
forma como conseguido fazer andar o relgio a seu
favor. Como foi observado, com uma soluo de
ofuscao, um indivduo ao analisar a aplicao, no
iria demorar 5 minutos, mas talvez fosse demorar algu-
mas horas a encontrar matria sensvel. Existem muitas
outras maneiras que no foram discutidas neste artigo,
uma vez que o objetivo principal foi demonstrar e con-
sciencializar a importncia do desenho de infraestru-
turas, sistemas e aplicaes de forma a que estes sejam

AUTOR
Escrito por Pedro Tavares

Pedro Tavares atualmente um profissional no ramo da segurana da informao. Desempenha funes


como IT Security Engineer, membro fundador e pentester no CSIRT.UBI e fundador do blog seguranca-
informatica.pt.

76
Segurana

Blockchain and Merkle Tree


A bitcoin o nome de batismo de uma cripto- O campo hashPrevBlock guarda a hash do


moeda que teve um enorme impacto quando foi liber- bloco anterior na notao little-endian (invertido).
tada na Internet e tambm todo o conceito e tecnologia um registo de 32 bytes que armazena uma hash de
em seu redor foi alvo de pura anlise e investigao nos 256 bits. O campo hashMerlkeRoot tambm um reg-
ltimos anos. A aceitao desta criptomoeda foi de tal isto de 32 bytes, e armazena uma hash que represen-
maneira exponencial que se refletiu de imediato na sua ta a raiz da Merkle Tree (abordada a seguir). A Merkle
crescente valorizao no mercado [1]. Tree uma rvore que guarda todas as hashes das
transaes do bloco. O time representa o timestamp
Uma das tecnologias base da bitcoin a block-
de quando o bloco criado. O campo bits representa
chain, que representa uma soluo efetiva para resolver
a dificuldade do bloco, e por fim, o nonce um valor
o problema das transaes duplicadas (double-spent)
incremental que permite aos ns da rede validar um
numa rede de pares (peer-to-peer ou p2p). No jargo do
novo bloco candidato para que ele seja adicionado
bitcoin, a blockchain no mais que um ledger (um
cadeia. Em seguida apresentada uma figura que
livro-razo) que guarda o registo de todas as trans-
pretende ilustrar como os blocos esto ligados na
aes ocorridas na rede. Esta tecnologia apareceu de
blockchain.
facto na altura certa. Ela permite a implementao de
sistemas descentralizados em redes p2p sem a neces-
sidade de uma trusted third party como forma de validar
transaes ou aes num dado ecossistema. Ao invs
disso, cada par na rede possui uma cpia do livro-razo
onde consegue efetuar todas as validaes necessrias
sem a necessidade eminente desse terceiro n de co-
municao onde supostamente estaria localizado unica-
mente o livro-razo.
No Block 2, nomeadamente no campo hash-
Por exemplo, quando o Bob decide efetuar uma
PrevBlock est armazenada a hash do bloco anterior e
transao de 50 BTCs (bitcoins) para a Alice, a trans-
que permite tambm estabelecer ligao com os
ao fica registada na blockchain sem a necessidade de
blocos adjacentes. Uma hash identificadora de um
ter que passar por um banco-central validador. A
bloco a hash do cabealho do bloco, nomeadamente
transao automaticamente auditada na rede por to-
dos campos j citados: Hash(Version, hashPrevBlock,
dos os ns que a compem.
hashMerkleRoot, Time, Bits e Nonce). Essa hash foi a
Essas transaes so armazenadas na cadeia de primeira a ser gerada por um par na rede e que satis-
blocos. Esses blocos tm a seguinte estrutura [2]. fazia o desafio colocado.

FIELD PURPOSE SIZE


(BYT
ES) Merkle Tree
A discusso durante o resto do artigo centra-se
VER- BLOCK VERSION NUMBER 4 no campo hashMerkleRoot do cabealho do bloco, que
SION
representa a raiz de uma rvore onde so armazena-
HASH- 256-BIT HASH OF THE PREVI- 32 das as hashes de todas as transaes realizadas e
PREVBL OUS BLOCK HEADER (IN LITTLE associadas ao bloco (ver imagem a seguir), permitindo
OCK ENDIAN FORMAT) assim, assegurar tambm a integridade de todas as
transaes na cadeia.
HASH- 256-BIT HASH BASED ON ALL 32
MERKLE THE TRANSACTIONS IN THE
ROOT BLOCK

TIME CURRENT TIMESTAMP 4

BITS CURRENT TARGET IN COMPACT 4


FORMAT

NONCE 32-BIT NUMBER (STARTS AT 0) 4

77
Segurana

BLOCKCHAIN AND MERKLE TREE


As Merkle Trees foram inventadas em 1979 por
Ralph Merkle. O objetivo inicial da sua criao foi intro-
duzido junto das assinaturas de Lamport de tempo-
nico. Elas representam uma estrutura de dados que
contm uma rvore de informaes resumidas sobre um
pedao de dados ainda maior, por exemplo: um arquivo,
e servem para validar o contedo de um arquivo. Elas
so usadas para verificar a integridade dos registos,
manuseados e transferidos entre computadores ou
redes de computadores. Atualmente, o principal uso de
Merkle Trees para garantir que blocos de dados rece-
bidos de outros pares em uma rede p2p so recebidos
intactos e inalterados, e at mesmo para verificar se os
outros pares no mentem e enviam blocos falsos.
As folhas so os quatro ns de baixo (Tx A, Tx
Uma vez que a transparncia uma das proprie-
B, Tx C e Tx D). Cada n possui uma hash, a hash da
dades desta tecnologia, possvel consultar toda a in-
transao Hash (Tx A). O n superior concatena as
formao referente a blocos e transaes de toda a rede
hashes das folhas Hash(H(A) + H (B)). O mesmo
desde o seu incio (em 3 de janeiro de 2009 s 06:15:05
processo aplicado s restantes folhas. A ltima con-
PM - ver primeiro block -denominado como bloco gne-
catenao de todos os hashess definido como a raiz
sis: -o bloco de altura 0). Em seguida, vamos analisar o
da rvore. Este algoritmo tem a forma de uma
bloco com altura 100000 na blockchain, criado a 29 de
pirmide de registos e a maneira como verificada
dezembro de 2010 e identificado com a hash
a integridade dos blocos e das transaes da block-
000000000003ba27aa200b1cecaa-
chain.
d478d2b00432346c3f1f3986da1afd33e506.
Usando o exemplo do bloco com altura 100000
A URL o seguinte:
da rede bitcoin, as respetivas hashes da rvore so as
https://blockchain.info/ seguintes:
block/000000000003ba27aa200b1cecaad478d2b004323
46c3f1f3986da1afd33e506 Tx A - 8c14f0db3df150123e6f3dbbf30f8b955a824
9b62ac1d1ff16284aefa3d06d87
Tx B - fff2525b8931402dd09222c50775608f75787
bd2b87e56995a7bdd30f79702c4
Tx C - 6359f0868171b1d194cbee1af2f16ea598ae8f
ad666d9b012c8ed2b79a236ec4
Tx D - e9a66845e05d5abc0ad04ec80f774a7e585c6e8db9
75962d069a522137b80c1d
A disposio da rvore ento semelhante ao
esquema explicado acima. Foi tambm verificado que
a Merkle Root do bloco dado pela seguinte hash:
F3e94742aca4b5ef85488dc37c06c3282295ffec96099
4b2c0d5ac2a25a95766
O valor de hash referente raiz da Merkle Tree
A seguir, vamos construir um pequeno pro-
dado pelo seguinte valor de hash:
grama na linguagem Python de forma a validar a im-
f3e94742aca4b5ef85488dc37c06c3282295f- plementao de Merkle Trees para o bloco de altura
fec960994b2c0d5ac2a25a95766 100000 da rede, e verificar ainda se o resultado obti-
do, a Merkle Root, exatamente o mesmo valor
Este valor denominado por Merkle Root, e como
registado nesse bloco.
j foi dito acima, identifica a raiz da rvore. Todas as
transaes na rede so identificadas atravs de um
hash. A raiz da rvore formada pela hash da hash de
Implementao em Python
todas as transaes em forma de pirmide. Apenas a
Merkle Root includa no header do bloco, o que per- Para comear, necessrio adicionar a lista de
mite verificar a integridade de todas as transaes transaes. Ela contm as quatro transaes do bloco
aceites na blockchain. Qualquer alterao ou tentativa 100000 da rede bitcoin.
de alterar de uma transao anterior ir ser invalidada e
rejeitada pela rede. TRANSACTIONS = [
"8C14F0DB3DF150123E6F3DBBF30F8B955A8249B62AC1
A seguir fica uma Merkle Tree [4], que tem como D1FF16284AEFA3D06D87",
"FFF2525B8931402DD09222C50775608F75787BD2B87E
Merkle Root (H ABCD ) de uma lista de transaes: Tx A, 56995A7BDD30F79702C4",
Tx B, Tx C e Tx D.

78
Segurana

BLOCKCHAIN AND MERKLE TREE


"6359F0868171B1D194CBEE1AF2F16EA598AE8FAD666D9 number_of_rounds = number_of_rounds + 1
B012C8ED2B79A236EC4", if len(transactions) == 1:
"E9A66845E05D5ABC0AD04EC80F774A7E585C6E8DB9759 print("\nMerkle Root")
62D069A522137B80C1D", return transactions[0]
] newTransactionList = []
#Processing pairs with jump 2
Para implementar o algoritmo necessrio fazer o se- for i in range(0, len(transactions)-1,
2):
guinte: newTransactionList.append(sum_hash
1. Implementar uma funo recursiva para construir a Mer- (transactions[i], transactions[i+1]))
if len(transactions) % 2 == 1: # odd,
kle Tree (def MerkleTree(transactions)). hash last item twice
newTransactionList.append(sum_hash
2. A lista de transaes, isto , o vetor onde esto guarda- (transactions[-1], transactions[-1]))
das as transaes. E ser iterado com um salto de ndi- print "Round [", number_of_rounds, "] -
ce dois. Isto deve-se ao facto de cada ramo ter duas Branches [", len(transactions), "]"
return MerkleTree(newTransactionList)
folhas associadas.
def sum_hash(hash1, hash2):
3. Em seguida, concatenada a hash da primeira transa- #Reverse inputs before and after hashing
o com a da segunda e assim sucessivamente. De (big-endian / little-endian)
notar que, necessrio converter as hashes entre big- h1 = hash1.decode('hex')[::-1]
endian e little-endian. Esta uma das muitas particulari- h2 = hash2.decode('hex')[::-1]
h = hashlib.sha256(hashlib.sha256
dade da tecnologia. (h1+h2).digest()).digest()
return h[::-1].encode('hex')
4. No final a funo retorna o somatrio de duas hashes,
e essa nova hash adicionada rvore hash(hash transactions = [
(TxA) + hash(TxB)), e por a em diante.
"8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac
Funo recursiva - Merkle Tree 1d1ff16284aefa3d06d87",

"fff2525b8931402dd09222c50775608f75787bd2b87
def MerkleTree(transactions): e56995a7bdd30f79702c4",
global number_of_rounds
number_of_rounds = number_of_rounds + 1 "6359f0868171b1d194cbee1af2f16ea598ae8fad666
if len(transactions) == 1: d9b012c8ed2b79a236ec4",
print("\nMerkle Root")
return transactions[0] "e9a66845e05d5abc0ad04ec80f774a7e585c6e8db97
newTransactionList = [] 5962d069a522137b80c1d",
#Processing pairs with jump 2 ]
for i in range(0, len(transactions)-1, 2):
newTransactionList.append(sum_hash print(MerkleTree(transactions))
(transactions[i], transactions[i+1]))
if len(transactions) % 2 == 1: # odd, hash No final da execuo do script o output deve ser exa-
last item twice tamente o seguinte para a lista de transaes indicadas:
newTransactionList.append(sum_hash
(transactions[-1], transactions[-1]))
print "Round [", number_of_rounds, "] - Round [ 1 ] - Branches [ 4 ]
Branches [", len(transactions), "]" Round [ 2 ] - Branches [ 2 ]
return MerkleTree(newTransactionList)
Merkle Root
Funo para efetuar a soma da hash de duas folhas da f3e94742aca4b5ef85488dc37c06c3282295f-
Merkle Tree fec960994b2c0d5ac2a25a95766

def sum_hash(hash1, hash2): No primeiro round, existiam 4 transaes para adicio-


#Reverse inputs before and after hashing nar a Merkle Tree ainda vazia. No segundo round, j s exis-
big-endian / little-endian) tiam dois. Em seguida, a funo recursiva efetuou a ltima
h1 = hash1.decode('hex')[::-1]
h2 = hash2.decode('hex')[::-1] soma de hashess e retornou o valor da sua raiz, nomeada-
h = hashlib.sha256(hashlib.sha256 mente a Merkle Root. O esquema abaixo ajuda a perceber
(h1+h2).digest()).digest() esta breve explicao.
return h[::-1].encode('hex')

Trecho de cdigo completo


#!/bin/python
import hashlib

number_of_rounds = 0

def MerkleTree(transactions):
global number_of_rounds

79
Segurana

BLOCKCHAIN AND MERKLE TREE


Como foi possvel verificar, o resultado obtido
atravs da implementao de Merkle Trees aqui expli-
cada precisamente a mesma implementao (com al-
gumas alteraes) daquela existente na rede bitcoin e
() A discusso
que permite guardar o registo das hashess das trans-
aes em cada bloco da cadeia. A implementao deste durante o resto do ar-
tipo de estrutura em rvore torna-se bastante til quan-
do pretendido validar a integridade de um grande con- tigo centra-se no cam-
junto de dados de forma estruturada.
po hashMerkleRoot do
cabealho do bloco,
A bitcoin o nome
que representa a raiz
de batismo de uma crip-
de uma rvore onde
tomoeda que teve um
so armazenadas as
enorme impacto quando
hashes de todas as
foi libertada na Internet
transaes realizadas
e tambm todo o con-
e associadas ao bloco
ceito e tecnologia em
(ver imagem a seguir),
seu redor foi alvo de
permitindo assim, as-
pura anlise e investi-
segurar tambm a in-
gao nos ltimos
tegridade de todas as
anos. A aceitao desta
transaes na cadeia.
criptomoeda foi de tal
()
maneira exponencial
que se refletiu de imedi-
Referncias
ato na sua crescente [1] https://blockchain.info

valorizao no mercado [2] https://en.bitcoin.it/wiki/Block_hashing_algorithm


[3] https://pt.wikipedia.org/wiki/%C3%
[1]. 81rvores_de_Merkle
[4] http://chimera.labs.oreilly.com/
books/1234000001802/ch07.html#merkle_trees

AUTOR
Escrito por Pedro Tavares

Pedro Tavares atualmente um profissional no ramo da segurana da informao. Desempenha funes


como IT Security Engineer, membro fundador e pentester no CSIRT.UBI e fundador do blog seguranca-
informatica.pt.

80
No Code
RGPD
Projecto em destaque na PROGRAMAR <Destaque> Hydriney </Destaque>
No Code
RGPD

Nos ltimos tempos muito se tem falado sobre uma sem estudar melhor as necessidades dos seus prprios clien-
determinada sigla a GDPR ou RDPD aqui na PROGRA- tes para propor mais produtos. A nica coisa que poderia
MAR decidimos dar uma olhadela neste assunto. Para ficar- eventualmente no permitir isso seria uma cruz naquela parte
mos esclarecidos e ajudarmos o leitor a ficar mais esclareci- da ficha de inscrio que informa que no quero que os
do. E este o motivo pelo qual este artigo surgiu. meus dados sejam cedidos a terceiros claro que como
sempre estes pormenores esto nas letras pequeninas. E por
Assim sendo vamos a isto em portugus a sigla
norma a ficha de inscrio na maior parte das lojas um pe-
significa Regulamento Geral de Proteo de Dados (RGPD),
queno papel que o operador de loja passa para a base de
tambm conhecida por GDPR - General Data Protection Re-
dados.
gulation.
Passemos frente de toda esta conversa interessa
retermos o seguinte um negcio tem dados, mas pode me-
lhorar se se apoiar nesses prprios dados antecipando as
necessidades dos seus clientes. At aqui nada de estranho.
Para precaver os direitos dos cidados europeus para
que o tratamento dos dados pessoais seja um direito funda-
mental proteco das pessoas singulares, no passado dia
27 de Abril de 2016 foi aprovado no Parlamento Europeu com
95% dos votos, o Regulamento Geral de Proteo de Dados.
Neste momento ainda estamos em fase de transio mas a
Todos ns sabemos que cada vez mais informao partir do dia 28 de Maio de 2018 ser aplicado obrigatoria-
poder. Vivemos num mundo em que tecnologia e informao mente em todos os pases da Unio Europeia. Para os mais
andam cada vez mais de mos dadas. curiosos, no caso de Portugal, a lei substituda ser a Lei
67/98 (que transpe para a ordem jurdica portuguesa a ante-
Acredito que praticamente todos ns enquanto cida- rior directiva 95/46/CE).
dos que fazem as suas escolhas consoante o que mais nos
interessa e favorece, que estejamos inscritos em vrias ba- Um dos direitos consagrados na Constituio Euro-
ses de dados. Seja porque vamos ao supermercado A e te- peia (artigo 35) o direito privacidade. Um dos grandes
mos um carto que nos d descontos, seja porque vamos desafios desta nova regulamentao de facto garantir o
loja B e temos mais um registo qualquer acerca da nossa controlo sobre a privacidade dos dados pessoais assim como
compra enquanto clientes. Ou simplesmente porque estamos a integridade dos mesmos.
registados na nossa operadora mvel ou de internet e mais
importante referirmos que o conceito de dados pes-
uma vez nos registamos noutra base de dados. Ou seja, o
soais passa a incluir quaisquer dados que sejam susceptveis
caro leitor, creio que concordar comigo quando digo que
de identificar mesmo que de forma indirecta um determinado
cada vez mais a nossa pegada digital tende a aumentar. E
individuo. Assim, este regulamento europeu refora os direi-
claro, maioritariamente, somos ns os responsveis por isso.
tos de todos os indivduos e torna as empresas responsveis
Ento desta foram normal que esses dados sejam pelos dados pessoais que processam. Por indivduos, en-
vistos como um aumento benfico do negcio. Dados criam tende-se no s clientes, mas tambm fornecedores e funcio-
dados. A loja B sabe que compramos o produto X e Y. Com nrios.
base nisso podem tentar vender-nos o produto W. Cada vez
Sem querer entrar em detalhes aprofundados dos
mais a publicidade vista em prol da relao emocional que
artigos que fazem parte desta regulamentao, o objectivo
desenvolvemos com determinado produto ou marca. H uns
reforar os direitos dos titulares desses dados pessoais, o
anos atrs nasceu o conceito de Brand Value. Nos tempos
reconhecimento da importncia da dimenso da proteco de
que correm nasceu o termo Data Value. E porqu? Porque
dados na manuteno desse mesmo direito individual que
de facto informao poder.
cada um de ns tem sua privacidade.
Imaginemos a empresa A, sendo que esta entidade
Caso algum destes pontos seja comprometido, as
guarda os dados pessoais dos seus clientes, assim como a
empresas passam a ter a obrigatoriedade de reportar Auto-
lista de produtos adquiridos. Pode usar esses dados, guarda-
ridade de Controlo qualquer incidente relativo ao comprometi-
los, analisa-los, aplicar-lhe algoritmos em prol de quem sabe
mento desses mesmos dados. A nvel de sanes as coimas
isso lhe ser til mais frente na base do negcio. Mas prati-
aplicadas podem ir at um mximo de 20.000.000 Euros ou a
camente nada impedia a empresa A de se juntar com a em-
4% do volume de negcios global do exerccio financeiro
presa B, partilharem conjuntos de dados que lhes permitis-

82
No Code
RGPD
anterior. Alm das sanes financeiras, as empresas passam
a ter 72horas para avisar os seus clientes de que os seus
dados foram comprometidos.
De todos os artigos, os que me pareceram mais im-
portantes, e isto claro, entrando num aspecto mais pessoal,
foram os artigos 6, 29 e 32.
O artigo 6 espelha e enaltece a importncia da encrip-
tao de dados, estejam ou no esses dados em repouso.
Alm da encriptao refere que todos os dados devem ser
pseudo-anonimizados, isto , a capacidade de ligar os dados
ao seu utilizador /dono deve ser reduzida ao mximo. Tro-
cando por midos, os dados devem sofrer algoritmos de
data reduction e pseudo minimization, isto em ambientes
no produtivos. Em ambientes de teste e produo, havendo
No querendo alargar-me muito mais, devo chamar-
reduo de dados e anonimizao dos mesmos, o mesmo
vos a ateno para os 3 pilares que esta regulamentao
sai do scope do regulamento.
quer implementar em cada uma das empresas que detm
O artigo 29 refere que pessoas com acesso aos da- algum tipo de dados pessoais de clientes, fornecedores ou
dos no devem processar os mesmos, ou seja a encriptao funcionrios
dos mesmos deve ser transparente, existindo uma arquitec-
1. Avaliar Ter conhecimento dos dados, importncia
tura de segurana mxima (MSA Maximum Security Ar-
dos mesmos e implementao de processos
chitecture).
2. Prevenir Garantir a integridade e segurana dos
O artigo 32 traz-nos vrias alneas importantes. O
dados
tema principal deste artigo a garantia da no destruio da
base de dados, uma vez que a mesma contem transaces 3. Detectar Detectar possveis falhas e corrigir as mes-
que so dados pessoais dos clientes. Assim, este artigo mais mas
uma vez refere a necessidade de pseudoanonimizao
Neste contexto, assume-se a extrema importncia em definir
(alnea A), a necessidade da disponibilidade de sistema em
uma linha de proteco de dados, clarificar a respon-
caso de recuperao do mesmo (alnea B), o restauro dos
sabilidade pela proteco desses mesmos dados, elaborar os
dados (neste ponto h a referncia concreta a que o utiliza-
princpios de proteco dos mesmos e actualizar a tecnologia
dor tem o direito de ser conhecido e o direito a ser esquecido
necessria implementao e garantia dessas boas prticas.
(right to be know and right to be forgotten), isto , se um utili-
zador quiser ser apagado de um sistema deve ser total- Mais uma vez chamo a ateno a que o regulamento
mente eliminado, passando a no existir um referencial em se aplica no s a todas as organizaes da Unio Europeia,
relao aos dados do individuo nem na base de dados princi- mas a todas as organizaes que tenham dados pessoais de
pal desse mesmo sistema, nem nos dados de backup. cidados europeus.

Um outro ponto importante a referncia de que as Para quem estiver interessado em saber mais acerca
empresas que devem ter uma pessoa responsvel pela im- desta temtica, fica aqui a pgina oficial: http://
plementao de todas estas normas e boas prticas a nvel www.eugdpr.org/
de segurana, o DPO (Data Protection Officer) - esta pessoa
deve ter conhecimentos jurdicos, conhecimentos tecnolgi-
cos e ter conhecimento de gesto de negcios e do sector de
actividade.

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. Embaixadora das Geek Girls Portugal Ncleo de Lisboa.

83
No Code
SOPHIA, A HUMANOIDE

Nos prximos dias vai decorrer em Lisboa mais uma Esta humanoide tem duas cmaras nos olhos e graas aos
edio do WebSummit. Espera-se que mais uma vez este avanados algoritmos de inteligncia artificial do qual dota-
evento seja um sucesso. Contudo este artigo no sobre da capaz de processar dados visuais, reconhece pessoas,
sobre o WebSummit, mas sim sobre uma participante especi- assim como dados da conversa, conseguindo manter uma
al da cimeira que nos despertou a ateno. Dia 7 de Novem- conversa fluida, fazendo contato visual, criando laos e rela-
bro sobe ao palco, Sophia um robot humanoide. E o que es com as pessoas. tambm capaz de interpretar ex-
que este humanoide tem de especial pode perguntar o caro presses faciais e reproduzi-las. Quanto mais interage com
leitor? Sophia foi a primeira humanoide a obter o estatuto as pessoas, mais aprende, conseguindo aumentar a sua inte-
de cidad. Este facto ocorreu no final do ms de Outubro ligncia e conhecimento com o passar do tempo.
sendo que o Reino da Arbia Saudita concedeu a Sophia
A Hanson Robotics admite que um dos seus objetivos princi-
oficialmente o estatuto de cidad do pas. E sim, esta foi
pais que a Sophia seja consciente, criativa e capaz como
uma deciso polmica. A verdade que um pas com costu-
um ser humano. Em algumas entrevistas o CEO da empresa
mes muito prprios como a Arabia Saudita concedeu a cida-
admitiu que cr que em algumas dcadas os humanoides
dania Sophia, logo a mesma uma cidad desse pas.
andaro de facto entre ns, ajudando-nos e tornando-se nos-
Muitos dizem que a humanoide tem mais direito do que as
sos amigos.
mulheres desse mesmo pas. E isto sim, algo controverso.
Os leitores mais apaixonados pela inteligncia artificial, certa-
Voltando um pouco atras, Sophia foi criada pela Han-
mente se lembram da ELIZA. Um programa criado na dcada
son Robotics, pela mo do CEO da empresa, o Dr. David
de 60 por Joseph Weizenbaum no laboratrio de inteligncia
Hanson. Este senhor tem j reputao de criar robs que
artificial do MIT. Claro que a Eliza apesar de conseguir man-
parecem e atuam de forma humana. Sophia foi criada para
ter uma conversa com os mais distrados, ao fim de algum
ser um robot social, o seu design foi projetado para poder ser
tempo torna-se falvel. Contudo o conceito por trs deste pro-
uma mais-valia para ajudar nos cuidados de sade, terapia,
jeto creio ser o mesmo. Estou a lembrar-me tambm de um
educao e aplicaes de atendimento ao cliente. um facto
outro projeto amplamente conhecido como a Alexa. Com
de que os robots so projetados para serem parecidos com
recurso a um pequeno dispositivo que interage connosco
os humanos mas a verdade que a Sophia talvez o robot
(Amazon Echo Dot) capaz de aprender, responder e execu-
mais avanado do mundo neste aspeto das parecenas hu-
tar pequenas tarefas. A diferena principal da Sophia aos
manas.
olhos das pessoas o seu aspecto.
A verdade que a Sophia uma verso mais elaborada e
muito melhor, um facto. E continuamente aprimorada
sendo a coqueluche da Hanson Robotics. Acima de tudo a
sua forma humanoide faz com que seja facilmente interagivel
com a mesma. Do pouco que se sabe sobre o projeto, sabe-
mos que foi pensada para se parecer com a atriz Audrey
Hepburn, uma das mulheres consideradas das mais bonitas
do ultimo seculo.
Acerca do software e do hardware envolvido no desenvolvi-
mento deste robot pouco se sabe. Foi inicialmente concebido
na primeira dcada do seculo XXI, no seio do projeto "Loving
AI" que consiste no desenvolvimento de software que permite
aos robs humanoides interagir com as pessoas socialmente
e de forma capaz. Este projeto que centrou-se na Sophia e
fornece mesma uma personalidade e contedo cognitivo,
lingustico, preceptivo e comportamental. E este facto que
permite que existam as interaes humanas e que as mes-
mas sejam aprofundadas.
Do pouco que se sabe, sabe-se que esta humanoide alm de
usar tecnologia de processamento distribuido est dotada de
ferramentas PNL (Programao neurolingustica). A PNL
um subdomnio da inteligncia artificial que centrado na
palavra. Varia desde a entrada da voz sada da fala, isto ,

84
No Code
SOPHIA, A HUMANOIDE
a anlise da palavra varia desde a determinao da frequn- o, visualizao e relaxamento. Aparentemente este estudo
cia do uso de palavras e da sua colocao at correspon- foi um sucesso, e permitiu demonstrar qualitativamente a
dncia de padres, derivao de palavras e etiquetagem e viabilidade da abordagem e a capacidade de uma interao
anlise de parte de fala. Uma outra tecnologia presente no apropriada humano-rob para aumentar o bem-estar humano
projeto o chatscript que um tambm um sistema industrial e promover a conscincia humana.
com uma ampla gama de tarefas de PNL em ingls tendo
Sophia uma mquina inteligente em evoluo, um facto e
sido arquitetado em considerao expressividade, veloci-
a sua semelhana humana inegvel e invariavelmente vai
dade, tamanho, capacidade e capacidade de manuteno de
conseguir criar laos com humanos, e conseguir que tenha-
dados.
mos gosto e curiosidade em faz-lo. Mas numa realidade em
Em setembro de 2017, realizou-se um pequeno estudo pilo- que muitos se queixam de que os computadores esto por
to, envolvendo este humanoide, que liderou os assuntos hu- exemplos a tomar o lugar do emprego humanos, at que pon-
manos atravs de dilogos e exerccios centrados na medita- to estamos preparados para os humanoides viverem entre
ns?

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. Embaixadora das Geek Girls Portugal Ncleo de Lisboa.

85
No Code
Projecto em destaque na PROGRAMAR

<Destaque>Hydriney</Destaque>
Hydriney A app que o vai ajudar a controlar os cl-
culos renais
aos diferentes fusos-horrios e s principais lnguas dos hipo-
Os cculos renais, popularmente conhecidos por tticos utilizadores (portugus, ingls, francs e espanhol). O
pedras nos rins so um dos problemas mais comuns na utilizador define os seu objetivos de uso, transcreve a sua
rea clnica de Urologia. Os clculos renais formam-se por prescrio e a partir disso a aplicao vai ajuda-lo a automati-
meio de cristais que se separam da urina e que ao unirem-se zar os registos para a melhor tomada de deciso no trata-
formam pedras. mento. Para os mdulos de medicao e medio do pH da
urina a aplicao apresenta um ecr de registo personalizado
que permite visualizar, adicionar, alterar ou remover. Para
cada mdulo a aplicao existe um grfico intuitivo e com um
aspecto limpo para que o utilizador visualize de forma rpida
e simples a variao dos seus nveis de consumo de gua e
pH da urina. Os grficos apresentam 3 escalas: ltimas 24
horas, ltimos 30 dias dias do ms e ltimos 12 meses do
ano.

Os doentes com clculos de cido rico tomam o me-


dicamento Uralyt-U. O calendrio de controlo um folheto OBJECTIVOS
associado ao medicamento e que permite o apoio fulcral ao Esta aplicao apenas uma ferramenta de registo de
tratamento da doena. Este artefacto permite ao doente re- informaes e de auto-monitorizao e no se destina a diag-
gistar valores para que o mdico possa verificar se a situa- nosticar, prevenir ou recomendar tratamento para a doena.
o do paciente se encontra em ordem. As consultas presenciais continuaro a existir e a ser impor-
Estando a tecnologia constantemente na ponta dos tantes na relao humana profissional de mdico-paciente,
nossos dedos, possvel atravs da aplicao Hydriney ha- no entanto, com o uso desta tecnologia mvel, estas consul-
ver a monitorizao constante de cada paciente, de forma tas ganham um apoio extra e tornar-se-o at mais eficazes
individual e personalizada. Hydriney uma aplicao inova- e produtivas pois podem prolongar-se para l do espao fsi-
dora e simples que funciona como agenda pessoal da do- co do consultrio/centro de Sade/hospital. Nas consultas
ena. A aplicao pressupe uma interao diria com o peridicas os pacientes devero facultar os registos efetua-
utilizador, dadas as caractersticas desta doena, que reque- dos na aplicao para que o mdico os possa aconselhar de
rem que haja a gesto e registo dos valores em base diria. modo mais eficiente. A aplicao mostrar ao doente mensa-
A aplicao permite gerir o tratamento de clculos renais gens e grficos, que por exemplo, permitem identificar pa-
atravs de vrios indicadores: o registo do consumo de gua, dres altos ou baixos e relacion-los com os hbitos de vida
o registo da medicao e medio do pH da urina. errados que lhe deram origem e assim ajudar a melhorar o
controlo dos clculos renais no seu percurso. Desta forma o
mdico analisar a informao mais facilmente e poder
TECNOLOGIAS UTILIZADAS ajustar a medicao ou regular os intervalos entre medies.

A aplicao foi desenvolvida na plataforma Android


Studio na linguagem de programao Java. Os dados foram FUNCIONAMENTO
armazenados numa Base de Dados SQLite, pois houve a
necessidade de uma base de dados eficiente, com um bom O menu principal da aplicao surge lateralmente e
desempenho, flexvel e que pudesse ser facilmente copiada apresenta uma listagem das funcionalidades existentes. As
e restaurada. funcionalidades existentes so: Perfil; Medicao; Consumo
de H2O; pH da Urina. H uma indicao de trs listras hori-
zontais para demonstrar a existncia do menu lateral es-
ASPETOS TCNICOS querda, seguindo o padro de design da Google (Menu Navi-
gation Drawer).
Hydriney uma aplicao que consegue adaptar-se

86
No Code
PROJECTO EM DESTAQUE NA PROGRAMAR <DESTAQUE>HYDRINEY</DESTAQUE>

Mdulo de consumo de gua:


O mdulo do Consumo de H2O divide-se em dois
separadores: Actual e Histrico. O separador Actual per-
mite ao utilizador registar, ao longo do dia, os consumos de
gua. Este layout permite ao utilizador ir registando a inges-
to diria de gua. Para o efeito, deve pressionar a(s) garrafa
(s) correspondente(s) ao volume de gua que acabou de
beber, existindo 5 volumes de garrafa ajustveis s necessi-
dades padro do utilizador: 1.5 L, 1 L, 0.5L, 0.33L e 0.10 L.
medida que o utilizador vai registando o que bebe, o grfico
circular atualiza, em tempo real, a percentagem de gua be-
bida em relao ao objetivo (definido no layout Perfil). Os
valores registados vo surgindo direita do grfico, podendo
o utilizador anular um registo ou mesmo a totalidade (atravs
da garrafa VAZIO, com posio invertida).

Mdulo de perfil:
Quando a aplicao iniciada pela primeira vez, o
utilizador direcionado para o mdulo de Perfil. O Perfil
apresenta um formulrio que est dividido em 5 seces:
Nome, Data de Nascimento, Gnero, IMC e Objetivo dirio
(de consumo de gua). Na seco do IMC, o utilizador deve
introduzir o seu peso e altura para depois ser calculado o
IMC (ndice de Massa Corporal). O IMC resulta da diviso do
peso pelo quadrado da altura, sendo que o peso dado em
quilogramas (Kg) e a altura em metros (m). O utilizador deve
tambm estabelecer algumas metas, como definir o objetivo
dirio de ingesto de gua, em litros (L).

87
No Code
PROJECTO EM DESTAQUE NA PROGRAMAR <DESTAQUE>HYDRINEY</DESTAQUE>

Aps a introduo dos valores, a aplicao tem a ca- Mdulo de medicao:


pacidade de mostrar no separador Histrico o histrico de-
Nem sempre fcil guardar na memria a hora certa
talhado e grfico do consumo de gua de hoje, do ltimo
de tomar um medicamento ou administrar a quantidade de
ms e tambm do ltimo ano.
doses necessria at o fim do tratamento. A aplicao Hydri-
ney permite detalhar a programao dos medicamentos com
diversas opes de dosagem (comprimidos, caixas etc.) e
Mdulo de medio do pH da urina:
intervalos de medicao. semelhana do mdulo anterior,
A aplicao apresenta tambm um mdulo para regis- este mdulo apresenta tambm uma caixa com quatro divi-
to do pH da urina. Doentes que tomam o medicamento Uralyt ses divide os medicamentos por turno manh, tarde, noite
-U necessitam de medir e registar o pH da urina 3 vezes ao e madrugada. Cada caixa apresenta o nome do medicamento
dia: antes do pequeno-almoo, antes do almoo e antes do a tomar, a hora a tomar e a flag se j foi tomado ou no.
jantar. A interface deste mdulo limpa e uma caixa com
quatro divises divide as medies por turno manh, tarde,
noite e madrugada.

Esta funcionalidade facilita a realizao dos registos


de pH, substituindo o papel, para que seja mais fcil no s o
ato de registar em si mas tambm o agrupamento e organi-
zao por fases do dia. Esta anlise dos dados por fases do
dia ajuda a traar o perfil do doente e o registo em papel
dificulta esta tarefa. Ao inserir as medies de pH, a aplica-
o mostra no separador Histrico um grfico intuitivo para
que fique mais claro sobre a evoluo do pH da urina. Os
grficos melhoram a compreenso das oscilaes dos dados
registados e promovem um melhor autocontrolo de fatores
especficos da doena, tornando mais intuitiva a apreenso
da condio do doente por parte do mdico.

Planos para futuro


Tendo conscincia que haver muitos aspetos a se-
rem melhorados, continua a haver necessidade de trabalho
futuro e necessidades a suprir. Pretende-se dar continuidade
ao desenvolvimento da aplicao e torn-la mais confivel e
completa no mundo das aplicaes mveis. Pretende-se es-
tender as funcionalidades da aplicao de gesto do dia-a-

88
No Code
PROJECTO EM DESTAQUE NA PROGRAMAR <DESTAQUE>HYDRINEY</DESTAQUE>

dia do doente adicionando a capacidade de proporcionar


alarmes ou avisos atravs de regras que analisem os regis-
tos efetuados pelo paciente. Os dados que o utilizador insere
diariamente na aplicao podero ser utilizados para detetar
padres nos registos efetuados, tendo em conta o que o
conhecimento mdico inscrito na aplicao. Isto poder refle-
tir-se em avisos ao paciente sobre padres que indicam des-
vios do controlo da doena ou mesmo em novos conselhos
que so criados baseados nas regras mdicas. Quando as
funcionalidades anteriores forem implementadas, a aplicao
ser disponibilizada no Google Play por forma a avaliar a sua
popularidade e aceitao.

AUTOR
Escrito por Tnia Valente

Natural de Coimbra, licenciou-se em Engenharia Informtica pelo Instituto Superior de Engenharia de Coimbra e tem mestrado
em Human Computer Interaction. entusiasta nas reas de Business Intelligence, UI/UX Design e Desenvolvimento (Web e
Mobile).

89
Veja tambm as edies anteriores da

55 Edio - Maro 2017 52 Edio - Maro 2016


Revista PROGRAMAR

e muito mais em
56 Edio - Maio 2017 53 Edio - Agosto 2016
57 Edio - Julho 2017 54 Edio - Janeiro 2017