You are on page 1of 84

EDITORIAL

EQUIPA PROGRAMAR

Coordenador
Antnio Pedro Cunha Santos
Editor
Antnio Pedro Cunha Santos
Design
Srgio Alves
Twitter: @scorpion_blood
Ilustrao
Sara Freixo
Redaco
Andr Vala
Antnio Pedro Cunha Santos
Antnio Pereira
Joo Pedro Martins
Nuno Caneco
Nuno Santos
Nuno Silva
Patrcio Domingues
Paulo Morgado
Pedro Sarmento
Ricardo Cabral
Ricardo Castro
Rita Peres
Sara Silva
Tnia Valente
Staff
Antnio Pedro Cunha Santos
Rita Peres
Rui Gonalves
Sara Freixo
Tiago Sousa
Contacto
revistaprogramar@portugal-aprogramar.org
Website
http://www.revista-programar.info

Conectando os pontos

Eis que chegamos quinquagsima edio da Revista PROGRAMAR.


Cinquenta edies, de muito trabalho, muito esforo, muita dedicao e uma histria
que j se escreve ao longo de nove anos, mais de uma centena de autores, arrisco
dizer milhares de litros de caf, uma imensido de linhas de cdigo, de desafios, de
esforos de problemas e solues.
At aqui, passaram cinquenta edies da revista, passaram nove anos, a
tecnologia reinventou-se sucessivamente! Nestes nove anos, cinquenta edies
apareceram dispositivos que revolucionaram a maneira como lemos, agora nos to
habituais tablets, que em 2009 viram a sua popularidade entrar num ritmo
desenfreado e de certa forma massificaram a leitura em formato digital, num
tamanho de ecr mais confortvel. Foram criadas novas linguagens de
programao, novas ferramentas, novos ides, vrias verses de sistemas
operativos, acompanhamos os pequenos tornarem-se grandes como o j muitas
vezes falado Raspberry Pi, que tem vindo a tornar-se mais popular.
Fugindo tentao das frases feitas, esta edio foi propositadamente
lanada no ducentsimo quinquagsimo sexto dia do ano, o dia do programador.
Assim escolhido por como todos sabemos 255 ser 28 , o maior nmero inteiro
representvel com 8 bits, oito pequenos zeros e uns, que so os blocos de
construo de todo um mundo, escrito pedao a pedao, bit a bit, por todos quantos
programam. Os que constroem o mundo de bits e bytes, que nos rodeia a todos e
que por todos construdo, bit a bit, linha a linha, a brincar s escondidas com o
ponto e virgula ( ; ), o mestre do jogo do esconde, desde 1972, de tantas vezes
que consome horas procura da linha onde por algum acaso falhou ao digitar o
ponto e vrgula cuja falta provoca um erro.
Nesta edio no poderia deixar de dar os parabns a todos aqueles que
lem a revista, a todos aqueles que nela participam, mas tambm e com entusiasmo,
a todos aqueles que programam! Esta a quinquagsima edio, mas hoje, estamos
todos de parabns pois dia do Programador! Daquele para quem todos ns que
tornarmos esta revista realidade, nos esforamos! A ns, pois de uma forma ou de
outra todos somos programadores e aos leitores da revista! Programadores, futuros
programadores, mestres e aprendizes, entusiastas e menos entusiasmados! A todos
os que lem a revista, e quando a lerem mesmo depois do 256 dia do ano, se vo rir
ao ler este editorial e perceber que desta vez, no foi um atraso na publicao, no
foi um packet-loss, foi antes uma brincadeira de programador e uma forma talvez
original de festejar o dia do programador, com todos aqueles que lem a revista,
que programam, que se dedicam a esta magia, que PROGRAMAR.
At prxima, agradeo-vos a todos por lerem a revista, que esta pequenagrande equipe vos traz.

Antnio Santos

ISSN
1 647-071 0

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

NDICE
TEMA
6

DE CAPA
Azure Logic Apps: o futuro dos backends? - Joo Pedro Martins

A PROGRAMAR
11

Ninject O Ninja das dependncias - Nuno Caneco

15

Como usar base de dados SQLite em Windows 10 Universal Apps - Sara Silva

20

Como fazer o deploy de uma aplicao web com PrimeFaces no OpenShift - Ricardo Cabral

26

Manipulao ao nvel do bit na Linguagem C - Patrcio Domingues

36

Reconhecimento de voz com JavaScript - Tnia Valente

38

Cria o teu cliente de 9GAG em 15 minutos, com OutSystems - Antnio Pereira

42

Office Graph: A inteligncia do Office 365 - Andr Vala

ELECTRNICA
49

Um cofre para passwords simples e de baixo custo! - Antnio C. Santos

COLUNAS
55

As Novidades do C# 6 - Paulo Morgado

ANLISES
63

Introduo ao Cloud Computing - Ricardo Castro

64

Python Algoritmia e Programao Web - Rita Peres

65

Introduo ao Desenvolvimento de Jogos em Android - Nuno Santos

NO CODE
67

Big Data: um conjunto de tecnologias imprescindveis no futuro - Pedro Sarmento

69

Windows Hello: A autenticao biomtrica no Windows 10 - Nuno Silva

72

Windows 10 IOT Core no Raspberry Pi 2 B - Ricardo Cabral

81

Projecto em Destaque P@p - Reach for 24

EVENTOS
TechDays Aveiro 17-18 Setembro 2015
7 Reunio Presencial da Comunidade NetPonto no Porto @ 26 Setembro 2015
Lisbon Makers Fair 16-18 de Setembro 2015
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-programar.pt

NOTICIAS
O mundo da inteligncia
artificial debate-se em Coimbra

Ferramenta desenvolvida
na UC diminui os custos
do processo de estampagem na indstria automvel

Entre os dias 8 e 11 de Setembro, no Departamento de Matemtica da Universidade de Coimbra o Encontro


Portugus de Inteligncia Artificial (EPIA). Conta com a participao do bilogo e fsico Ricard Sol, autor de Vidas Sintticas, obra que aborda um vasto conjunto de questes desencadeadasa pelo desenvolvimento no campo da I. A., nomeadamente biologia sinttica e vida artificial. Tambm contar
com as participaes de Helder Coelho, um dos pais da inteligncia artificial em Portugal, e Franois Pachet, diretor do
Laboratrio de Informtica da SONY em Paris.

Diogo Neto, do Centro de Engenharia Mecnica da


Universidade de Coimbra, venceu o Prmio Melhor Tese de
Doutoramento em Mecnica Aplicada e Computacional de
2014 atribudo pela Associao Portuguesa de Mecnica
Terica, Aplicada e Computacional, com um estudo que permite diminuir os custos do processo de estampagem na
indstria automvel.

Este encontro rene mais de uma centena de investigadores e acadmicos de todo o mundo.

Este trabalho teve como resultado uma ferramenta


computacional de apoio ao projecto de conformao de chapas metlicas, processo largamente utilizado na industria automvel.

Nestes quatro dias debater-se- a evoluo e a consolidao do conhecimento na rea da inteligncia artificial, bem como as implicaes geradas por essa evoluo
e os limites que se devem impor aplicao da inteligncia artificial.

Esta soluo optimiza esse processo, reduzindo o tempo e custos de produo.

Em destaque estaro as novas tendncias da investigao neste campo do conhecimento e a discusso de reas
emergentes como Aprendizagem Profunda, uma das mais
revolucionrias e promissoras tcnicas para dar mais
inteligncia aos computadores.

Segundo Diogo Neto, Devido crescente competitividade internacional, o projeto e conceo virtual deste
tipo de processos recorre cada vez mais a ferramentas
computacionais, onde as tcnicas avanadas de modelao em computador substituem os dispendiosos testes
experimentais. Deste modo, os modelos numricos desenvolvidos e implementados num programa de elementos finitos (DD3IMP) permitem fazer a simulao completa
deste processo tecnolgico com grande preciso e rigor,
permitindo acelerar a fase de projeto e consequentemente
diminuir os seus custos.

Segundo Francisco Baptista Pereira e Penousal Machado, investigadores do Centro de Informtica e Sistemas da
Universidade de Coimbra (CISUC) e responsveis pela organizao do encontro, apesar dos desafios que ainda tem
pela frente, a distncia entre a realidade e a fico poder
ser ultrapassada a mdio prazo.
Os investigadores acreditam que no futuro, a inteligncia artificial ter um papel muito importante na resoluo de grandes problemas do mundo. A cincia tem permitido avanos muito significativos na construo de
mundos artificiais em reas muito distintas como, por
exemplo, medicina, robtica, ambiente e inteligncia de
negcio.

Com vrias parcerias com a industria automvel, indstria metalomecnica e empresas de software em mecnica
computacional, entre outras, o CEMUC participa em vrias
redes de investigao nacionais e internacionais.
A transferncia do conhecimento para a sociedade pauta a atividade cientfica do CEMUC e, por isso, o
reconhecimento pblico do trabalho desenvolvido neste
centro de investigao a confirmao de que se encontra no bom caminho e um incentivo para continuar numa
rota sustentada de criao e transferncia de conhecimento, contribuindo deste modo para o cumprimento da
misso da Universidade de Coimbra, sublinha Lus Menezes, que em conjunto com Marta Oliveira, orientou a investigao.

O programa do Encontro Portugus de Inteligncia


Artificial est disponvel em: http://epia2015.dei.uc.pt/program/
Fonte: Press Release da UC remetido redaco da Revista
Programar.

Fonte: Press Release da UC remetido redaco da Revista


Programar.

TEMA DE CAPA
Azure Logic Apps: o futuro dos backends?

TEMA DA CAPA

Azure Logic Apps: o futuro dos backends?


so das implementaes nem sempre foi o melhor (vejam-se
por exemplo as promessas no cumpridas de padres como
o BPEL ou o UDDI, e a complexidade de normas como WSTrust ou WS-Federation), como com a prpria evoluo natural da Web e a adopo de formatos mais simples e abertos
como REST ou JSON.

Introduo
Em Maro de 2015 a Microsoft anunciou o Azure App
Service, uma evoluo da oferta aplicacional Azure que funde dois servios existentes - Web Sites e Mobile Services com dois novos servios: as Logic Apps, destinadas ao
desenvolvimento rpido e visual de processos de negcio, e
as API Apps que encapsulam funcionalidades autnomas
reutilizveis, consistindo ambos numa concretizao tecnolgica de uma arquitectura baseada em Microservios.

Nos ltimos dois anos esta Histria tem mais um captulo, a noo de Microservios. Construindo sobre as
ideias anteriores e popularizada mais recentemente por pessoas como Martin Fowler, as principais diferenas face ao
SOA talvez sejam a granularidade de cada servio, que agora se entendem frequentemente como devendo ser mais
atmicos e simples, como a utilizao de padres CRUD
sobre HTTP/REST. Os servios continuam a ser independentes entre si (podendo ser desenvolvidos sobre qualquer
tecnologia), e a dever estar organizados em torno de conceitos ou operaes relevantes para o negcio.

O objectivo deste artigo apresentar as Logic Apps,


tanto em termos do seu contexto e arquitectura, como na
utilizao concreta e simbiose com as API Apps.
Contexto
O caminho que nos traz s Logic Apps comeou
muito antes de Maro de 2015.

Uma materializao desta abordagem de Microservios no espao de consumidor final o IFTTT (If this then
that, https://ifttt.com/). Este sistema, usado tipicamente via
apps para telemvel, permite a criao de pequenos
workflows (receitas), em que caso se verifique uma determinada condio monitorizada pelo IFTTT, despoletado um
evento/aco de resposta. Alguns exemplos seriam: sempre
que um determinado utilizador colocar uma foto nova para o
Instagram, grav-la para o OneDrive; sempre que receber
um email marcado como Urgente, enviar um SMS para um
determinado nmero, etc. O nmero de aces disponveis
muito elevado, e cada uma delas pode ser vista como um
microservio.

Com o surgimento da chamada Web 2.0, um termo


popularizado em 2004, surgiu igualmente o conceito de
mashup. Baseado na utilizao de padres e tecnologias
web (como HTTP, REST, XML, RSS/Atom e Ajax), um
mashup uma aplicao web que combina contedo de
vrias fontes e APIs para criar um novo servio, com essa
combinao a ser feita tipicamente num web browser. Exemplos clssicos deste tipo de aplicaes envolvem enriquecimento de mapas geogrficos como novas camadas de informao: fotos tiradas em cada local, localizao de farmcias
ou hotis, local onde foram feitas as ltimas compras em
sites de comrcio electrnico. Um cenrio de Presentation
Integration, portanto.
Um termo relacionado surgido pouco depois foi o de
Service-Oriented Architecture (SOA). Aplicvel principalmente a cenrios empresariais, um padro de arquitectura
- ou filosofia de desenho de aplicaes, para alguns - segundo o qual uma aplicao montada pela composio de
servios autnomos que encapsulam lgica e que podem ser
acedidos usando mecanismos e formatos padro (o SOAP e
o WSDL so normas intimamente ligadas materializao
de arquitecturas SOA). Uma das ideias geralmente associada a SOA a de que os servios tm granularidade elevada,
ou seja, os servios devem encapsular muita funcionalidade
e no ser chamadas atmicas do tipo Create-Read-UpdateDelete, dado que so operaes pesadas (desde a serializao de/para XML ao transporte pela rede). Este tipo de arquitecturas tem como dois dos grandes atractivos a criao de
aplicaes loosely-coupled e em que existe um ganho pela
reutilizao de servios existentes.

No mundo Microsoft, e depois de uma Histria que


inclui actores como o BizTalk Server, Azure Service Bus,
Windows Workflow Foundation, e todo um foco em evoluir as
tecnologias para abordagens cloud, foram pr-apresentados
no Integrate 2014 em Redmond os BizTalk Microservices,
componentes atmicos cloud-based utilizveis para integrao de sistemas, a que estava associado um motor de
Workflow e uma ferramenta de modelao de processos web
-based.
Finalmente, com o anncio de Maro de 2015 tornouse finalmente pblico o quadro todo: as API Apps
(apresentadas no artigo Criar uma API no Azure App Sevice de Guilherme Ferreira na revista PROGRAMAR n 49 de
Junho 2015) so a implementao da Microsoft do conceito
de Microservios, e as Logic Apps a forma de os orquestrar
para a criao de aplicaes de negcio.

A noo de SOA tem evoludo tanto pelas lies da


sua utilizao em contextos empresariais - em que o suces-

TEMA DA CAPA
AZURE LOGIC APPS: O FUTURO DOS BACKENDS?
Azure Logic Apps

Exemplo

Como referido, as Logic Apps so uma das componentes do Azure App Service, e o seu objectivo permitir a
automao de processos de negcio ou workflows, realizando uma modelao grfica dos mesmos. Ao contrrio de
abordagens como o IFTTT, os destinatrios principais so
tanto o mercado empresarial/start-ups como utilizadores com
know-how tcnico ou programadores.

Apresentam-se de seguida dois exemplos de Logic


Apps criadas com actions disponibilizadas nativamente. Para
exemplos passo-a-passo recomenda-se a consulta da documentao
em
https://azure.microsoft.com/en-us/
documentation/services/app-service/logic/ .
A figura abaixo apresenta provavelmente o que o
exemplo mais simples possvel de uma Logic App.

Os processos de negcio so modelados usando


peas de uma paleta onde se encontram as API Apps j
mencionadas, e que incluem conectores para sistemas como
bases de dados ou ofertas SaaS variadas como o Salesforce
ou Office 365, suportando desta forma cenrios de integrao de sistemas Cloud-based.
As componentes das Logic Apps so os seguintes:
Workflow modelao grfica dos vrios passos de
um processo de negcio, e respectivo motor de execuo.
Esta modelao feita (por agora) exclusivamente
em ambiente web browser no portal Azure, e internamente
ao sistema os processos so representados como JSON.
Triggers um trigger um caso particular de uma
aco, e permite desencadear a execuo de uma Logic
App. Alguns exemplos de triggers so: execuo recorrente
(ex: a cada 5 minutos), resposta a um evento (ex: aparece
um registo novo numa determinada tabela SQL) ou a pedido
(ex: invocao de uma Logic App via pedido HTTP, como se
fosse um Web Service).

Esta Logic App composta apenas por duas aces,


ambas utilizaes de uma API App que permite fazer pedidos HTTP.
A primeira uma aco de HTTP/Get, que a cada minuto faz
um pedido HTTP a -um URL configurado (no caso, http://
www.example.com), e obtm tanto o contedo HTML da
pgina (body) da resposta como os cabealhos HTTP
(headers). A segunda aco um HTTP/Post, em que se
envia a informao obtida no HTTP/Get anterior como corpo
do pedido para um servio gratuito (http://requestb.in) que
por sua vez permite consultar o que est a receber via HTTP
Post.

Actions de uma forma genrica, uma Action um


passo do workflow, executada numa sequncia depois de
uma Logic App ser iniciada via trigger. As actions so essencialmente API Apps, sendo que se podem tanto usar as disponibilizadas pela Microsoft como simplesmente ser desenvolvidas medida em Net/C#. De entre as primeiras (ver lista
completa
em
https://azure.microsoft.com/en-us/
documentation/articles/app-service-logic-connectors-list/), por
vezes chamadas Connectors na documentao, existem
dois tipos: as Standard que oferecem funcionalidades como integrao com Facebook, Office 365, SQL, FTP, SharePoint/Yammer, Salesforce ou Twitter, e as Premium que se
destinam a cenrios de integrao de sistemas e so provenientes da oferta de BizTalk Services. Estas ltimas incluem
potencialidades de processamento de EDI/AS2, EDIFACT,
mapeamentos JSON-XML, validao de formatos de mensagem, ou integrao com Informix, WebSphere MQ, Oracle ou
SAP, entre outras. A utilizao de actions Premium tem requisitos adicionais em termos de subscrio Azure e respectivos custos.

De notar que a configurao de que o resultado da 1


aco deve ser usado como input da 2 feito via uma dropdown que apresenta todos valores possveis de utilizar, no
sendo necessrio regra geral a introduo de texto. Quando
se faz esta escolha, a representao textual interna substitui
a dropdown (no caso acima, @triggers().output.body).
A imagem acima um screenshot retirado do novo
Portal de Azure (http://portal.azure.com), onde so efectuadas as operaes realizadas tanto com Logic Apps como
com API Apps. Alm do designer visual na parte central, so
visveis as opes de topo do editor (onde se inclui uma opo Code View que permite consultar a especificao do
processo em formato JSON passvel de armazenamento em
source control), como a paleta de API Apps do lado direito,

Internamente, as Logic Apps dependem de mdulos


j existentes em Azure como sejam as WebApps e o Resource Manager, que ficam fora do mbito deste artigo.

TEMA DA CAPA
AZURE LOGIC APPS: O FUTURO DOS BACKENDS?
No caso anterior, possvel por exemplo indicar que
esta aco apenas executada caso se verifique uma determinada condio, ou que se pretende iterar a sua utilizao
sobre uma lista de itens de informao.

onde se vm algumas das dezenas de opes j disponveis.


A figura abaixo apresenta um exemplo um pouco
mais complexo que o anterior.

A figura abaixo apresenta um excerto da Code View,


mostrando o JSON que representa a Logic App descrita acima. Neste JSON podemos ver uma seco de triggers que
desencadeiam a execuo, e uma sequncia de actions,
cada uma com o seu tipo e configurao especfica. Como
se pode reparar tambm, cada action tem um atributo type
que no caso do twitterconnector uma ApiApp.
"triggers": {
"recurrence": {
"recurrence": {
"frequency": "Minute",
"interval": 1
},
"type": "Recurrence"
}
},
"actions": {
"twitterconnector": {
"type": "ApiApp",
"inputs": {
"apiVersion": "2015-01-14",
"host": {
"id": "/subscriptions/000000000000-0000-0000-1234567890ab/resourceGroups/
DevTechRefreshLisboa2015/providers/
Microsoft.AppService/apiApps/
TwitterConnector",
"gateway": "https://
Devtechrefreshlisboa
012345678909834b42198fd4b593463ced8b.
azurewebsites.net"
},
"operation": "SearchTweets",
"parameters": {
"Query": "philae",
"MaxResults": 20
},
"authentication": {
"type": "Raw",
"scheme": "Zumo",
"parameter": "@parameters('/
subscriptions/00000000-0000-0000-00001234567890ab/resourceGroups/
DevTechRefreshLisboa2015/providers/
Microsoft.AppService/apiApps/TwitterConnector/
token')"
}
},
"conditions": []
},
"dropboxconnector": {
"type": "ApiApp",
"inputs": {

No exemplo acima so usadas 4 aces:


Recurrence aco de trigger da Logic App, indica que
a mesma vai ser executada a cada minuto.
Twitter Connector procura no Twitter por algum texto
(no caso, Philae). Quando se adiciona esta action
necessrio realizar autenticao no Twitter, que
fica guardada internamente Logic App.
Dropbox Connector action que pega no resultado da
aco de Twitter e cria um ficheiro numa conta
Dropbox com o contedo do tweet encontrado. Tal
como no caso do HTTP/Post no exemplo anterior,
esta aco tem uma dependncia criada implicitamente pelo facto de usar dados de outra aco,
sendo tambm necessrio como no caso da action de Twitter - fazer autenticao no Dropbox.
Office365 Connector action que pega no resultado da
aco de Twitter e envia um email para o endereo
configurado, com o contedo do tweet. Mais uma
vez, necessrio fazer autenticao no servio
(agora o Office 365) quando se usa esta aco.
Cada uma das aces anterior tem opes de refinamento que permitem especificar comportamento mais complexo, que so acessveis atravs do boto de reticncias no
seu canto superior direito.

Um dos pontos mais curiosos das Logic Apps a


forma como lidam com controlo de fluxo. Por omisso, todas as aces executam em paralelo umas com as outras,
no existindo - como sucede nos fluxogramas ou workflows
tradicionais um controlo de fluxo explcito. Este fluxo criado implicitamente com base em dependncias de dados.
Assim, se a aco B depende da aco A, B vai ser

TEMA DA CAPA
AZURE LOGIC APPS: O FUTURO DOS BACKENDS?
executado depois de A. Se no depende, vai ser executado
em paralelo.
Na implementao actual, as formas de controlo de
fluxo que existem so as 4 j referidas: a) recorrncia; b)
dependncia de dados; c) execuo condicionada a uma
condio; d) repetio sobre lista. Uma outra action disponibilizada, o Wait, pode igualmente ser utilizada neste contexto, mas o mecanismo como um todo muito diferente
daquilo a que estamos habituados, lembrando a forma de
funcionamento altamente paralelizvel de motores de regras
(como o do BizTalk Server ou do Windows Workflow Foudation v2).

()Azure App Service, uma evoluo da


oferta aplicacional Azure ()

Concluso

Finalmente,
deve salientar-se o facto de
as Logic Apps ainda estarem em Preview e com evolues
frequentes (ver por exemplo as alteraes mais recentes em
http://azure.microsoft.com/en-us/updates/schedule-logicapps-to-run-in-the-future/), existindo limitaes como sejam a
impossibilidade de criar workflows em Visual Studio, e de o
processo de sincronizao com repositrios de cdigo como
o TFS ser manual, entre outras. Ainda assim, as Logic Apps
so provavelmente a novidade mais interessante de entre as ltimas que tm surgido no universo Microsoft
Azure, e vale a pena tanto perceber que cenrios suportam,
como acompanhar o rumo e evoluo dos prximos meses.

Neste artigo procurou-se dar uma introduo s Logic


Apps, no seu contexto histrico e arquitectural, sem entrar
em detalhe de implementao, e omitindo aspectos como
monitoria no Portal Azure, custos, tratamento de erros, escalabilidade, bem como a integrao profunda com as Web
Apps e vrios outros temas. Existem no entanto trs aspectos que vale a pena referir como concluso:
Primeiro, as Logic Apps so uma oferta Empresarial/
Premium, tendo origem no mesmo universo empresarial de
onde vm produtos business-critical como o BizTalk Server.
So portanto de esperar potencialidades como escalabilidade, tolerncia a falhas, tratamento de erros ou robustez, entre outros. Apesar de estarem disponveis actualmente muitas actions orientadas para o consumidor final (como Facebook ou Twitter), sendo estas sempre usadas nas demonstraes pblicas, o foco arquitectural empresarial.
Segundo, As Logic Apps so materializaes de arquitecturas baseada em microservios, e dependem de API
Apps, em que se podem tanto usar as disponibilizadas nativamente pela Microsoft, mas tambm desenvolver novas,
sendo este um processo que se reveste de uma enorme
simplicidade (uma API App essencialmente uma WebApi
alojada em Azure, com um contracto de utilizao descrito
em formato Swagger/JSON). Apesar de ainda no disponvel
completamente, est previsto um Marketplace de API Apps,
onde ISVs podero disponibilizar as suas prprias APIs e
monetizar a sua utilizao, quer sejam usadas directamente
quer via Logic Apps. Alguns exemplos podero ser servios
de deteco de rostos, acesso a informao como bolsa ou
meteorologia, motores de recomendaes, entre muitos outros.

AUTOR
Escrito Por Joo Pedro Martins
CTO e Arquitecto de Solues na |create|it|. MVP de BizTalk Server entre 2006 e 2011. Focos tecnolgicos na rea de Arquitectura, Azure e Integrao. Orador frequente em conferncias e eventos em temas como Arquitectura de Projectos, dinmicas de equipa, estimativas de software, e vrios temas de Azure. Membro dos Azure Insiders.
Gosto em fazer bem, resolver problemas criativamente, e nunca parar de aprender.

A PROGRAMAR
Ninject O Ninja das dependncias
Como usar base de dados SQLite em Windows 10 Universal Apps
Como fazer o deploy de uma aplicao web com PrimeFaces no OpenShift
Manipulao ao nvel do bit na Linguagem C
Reconhecimento de voz com JavaScript
Cria o teu cliente de 9GAG em 15 minutos, com OutSystems

A PROGRAMAR

Ninject O Ninja das dependncias


O que o Ninject?
O Ninject uma biblioteca de software aberto que
providencia uma framework de injeco de dependncias
(Dependency Injection ou DI) leve, fcil de integrar e de utilizar.
O padro Dependency Injection bastante utilizado
em software empresarial porque, entre outras razes, permite manter o controlo do ciclo de vida dos objectos e facilita a
implementao de testes automticos.
O que devo saber antes de comear a utilizar o Ninject?
O Ninject pode ser utilizado em todos os tipos de aplicaes desenvolvidas em .NET. No caso das Windows Applications ou Console Applications basta incluir a biblioteca
no projeto e comear a utilizar.
J se se pretender integrar o Ninject numa aplicao
Web MVC ou numa biblioteca de servios WCF, ser necessrio utilizar alguns plugins que permitam tratar da
canalizao necessria para garantir que as factories das
frameworks MVC e WCF utilizam o Ninject como
fornecedor de instncias.
Vejamos os princpios: Suponhamos que temos uma
classe UserManager que faz uso de uma classe UserReader.
UserManager

UserReader

Num cenrio clssico, o cdigo que representa este


cenrio seria parecido com:
class UserReader
{
// User reader methods
}

todas as classes que utilizam a classe UserReader tero


que ser tambm alteradas. Tal pode levar a que os prprios
construtores dessas classes seja tambm alterados, o que
vai gerar uma onda de alteraes em vrias classes do projecto.
A proliferao de chamadas a construtores poder
escalar de tal forma que se perde o controlo de quantas instncias da classes esto de facto a ser criadas e utilizadas
pela aplicao
Ao utilizar uma framework de injeco de dependncias, a gesto das instncias das classes efectuada pelo
container que injecta a instncia de uma classe sempre que
est necessria.
Neste cenrio, teramos uma implementao parecida
com:
class UserReader
{
// User reader methods
}
class UserManager
{
private UserReader userReader;
public UserManager(UserReader userReader)
{
// A classe UserManager recebe uma
//instncia da classe UserReader
this.userReader = userReader;
}
}
Neste caso, o container saberia construir uma instncia da classe UserReader e inject-la-ia no construtor da
classe UserManager, tornando esta classe completamente
agnstica forma como a classe UserReader foi criada.
NOTA: Seria tambm possvel utilizar uma factory class
para este efeito, o que consistiria uma alternativa utilizao
de uma framework de dependency injection (no entanto menos poderosa).

class UserManager
{
private UserReader userReader;
public UserManager()
{
// A classe UserManager est a criar uma
//instncia da classe UserReader
this.userReader = new UserReader();
}
}

Como comeo?

Esta implementao num projecto de larga escala


levanta duas questes essenciais:
Se o construtor da classe UserReader for alterado,

11

O ponto central do Ninject a interface IKernel cuja


implementao por omisso a classe StandardKernel.
Esta classe implementa um container que armazena a configurao dos mapeamentos de interfaces em classes bem
como as instncias de alguns objectos disponibilizados pelo
container.
Toda a interaco com o container efectuada por
cdigo usando uma API fluente e bastante completa. Para

A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS
quem prefere usar XML, o plugin Ninject.Extensions.Xml permite efectuar a configurao do Ninject usando XML.
Para comear a utilizar o Ninject, necessrio importar o
namespace Ninject e declarar uma varivel do tipo StandardKernel.

NOTA: Caso a classe possua mais que um construtor o Ninject tentar utilizar o construtor sem argumentos (construtor
default) para construir a classe. Caso esta no tenha nenhum construtor default, ser necessrio indicar ao Ninject
qual o construtor que este deve utilizar para construir a classe.

using Ninject;
Mecanismos de injeco

class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
}
}

O exemplo acima utiliza o mecanismo constructor


injection que faz com que o container inspeccione o construtor da classe, tente resolver as dependncias deste (i.e. os
argumentos do construtor) e chame o construtor passando
as dependncias identificadas.

O objecto kernel ser o container da aplicao e dever


ser declarado no ponto de entrada da aplicao, to cedo
quanto possvel.
Seguindo o exemplo anterior, podemos agora solicitar uma
instncia de uma varivel do tipo UserManager ao Ninject sem
necessitar de qualquer outra configurao adicional. Para tal,
utiliza-se o extension method Get<> para obter a instncia:
using Ninject;

O Ninject suporta ainda outro tipo de injeco: a property injection. Neste caso, o Ninject encara uma propriedade da classe como uma dependncia a ser injectada na classe e tenta resolv-la e inject-la como se um argumento de
um construtor se tratasse.
Para declarar que uma propriedade deve ser injectada, ser necessrio decorar a propriedade com o atributo
[Inject].
O mecanismo de constructor injection tipicamente
mais utilizado que o property injection por este garantir que
todas as dependncias esto no construtor e que o objecto
inicializado correctamente no construtor. Outro motivo a favor da utilizao de constructor injection o facto de evitar
que as classes conheam o Ninject, j que desta forma
raramente ser necessrio as classes injectadas utilizarem o
Ninject.

class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
UserManager manager = kernel.Get<UserManager>();
}
}
class UserReader
{
// User reader methods
}

E quando a resoluo automtica no consegue resolver?


H casos em que a resoluo automtica no consegue resolver a dependncia de forma inequivoca. Nestes
casos, o Ninject lanar uma excepo e caber ao programador dar indicao sobre como resolver a dependncia.

class UserManager
{
private UserReader userReader;
public UserManager(UserReader userReader)
{
this.userReader = userReader;
}
}

Tipicamente, existem trs casos em que a resoluo automtica no consegue resolver:

Aps a instruo Get<>, a varivel manager do mtodo


Main fica populada com uma instncia de UserManager que
foi construda usando o construtor que recebe um UserReader. O Ninject percebeu que podia construir uma instncia da
classe UserReader para injectar no construtor da classe UserManager.
Neste caso, o Ninject aplicou o mecanismo de resoluo automtica de dependncias que constroi instncias de
acordo com as seguintes regras: caso o construtor no tenha
argumentos este invocado para criar a instncia. Caso o
construtor tenha argumentos, o Ninject tenta criar uma instncia de cada uma das classes de argumento do construtor
(aplicando as regras de resoluo automtica).

12

i.

Quando a classe tem mais que um construtor em que


nenhum deles o construtor default

ii.

Quando o construtor tem um argumento do tipo Interface

iii.

Quando o construtor tem um argumento com um tipo


bsico

Nestas situaes, o container disponibiliza um conjunto de mtodos de configurao para instruir o Ninject sobre
como proceder. O mtodo Bind<>() permite indicar ao Ninject como resolver uma determinada classe ou interface.
Na primeira situao, possvel instruir o Ninject sobre
qual o construtor a usar usando o mtodo Bind<>
().ToConstructor(). A utilizao do mtodo WithParameter()

A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS
permite especificar valores a atribuir a certos parmetros do

thod() para obter uma instncia especifica para a classe que


a solicitou. No exemplo anterior, seriam injectadas duas instncias diferentes de Logger, uma para cada classe e inicializadas com o nome da respectiva classe onde foi injectada.

construtor.
class UserReader
{
public UserReader(string connectionString)
{ ... }
public UserReader(string connectionString,
int max) { ... }
}
// Aps declarar o kernel
kernel.Bind<UserReader>()
.ToConstructor<UserReader>((ctx) => new UserReader
(string.Empty))
.WithParameter(new Parameter("connectionString",
"myConnectionString", true));

mbito das dependncias


Por omisso, o Ninject cria uma nova instncia da
classe sempre que h uma solicitao de injeco. Ou seja,
sempre que uma classe necessria o construtor sempre
invocado para satisfazer a dependncia.
Ao declarar o binding com Bind<>().To<>
().InSingletonScope() o Ninject garante que aquela classe
ser um singleton, ou seja construda uma nica vez e
essa instncia utilizada em todas as dependncias.

Neste caso, foi necessrio indicar qual o construtor a


usar, bem como o valor do parmetro a utilizar no tipo bsico
do construtor que foi escolhido. O mtodo ToConstructor()
instrui o Ninject para utilizar aquele construtor. O mtodo
WithParameter() indica ao Ninject qual o valor a atribuir ao
parmetro connectionString.

O binding Bind<>().To<>().InThreadScope() garante


que criada um instncia por cada Thread da aplicao.
Utilizando o binding Bind<>().To<>().When() tambm possvel instruir o Ninject para injectar diferentes tipos
em funo de determinada condio ditada pelo mtodo
When().

No caso em que o construtor necessita de uma interface, utiliza-se o mtodo Bind<>().To<>():


class FacebookUserReader : IUserReader
{
// Get user information from Facebook
}

O Ninject uma
biblioteca de software
aberto que providencia
uma framework de injeco de dependncias () O padro Dependency Injection
bastante utilizado em
software empresarial o
controlo do ciclo de vida dos objectos e facilita a implementao
de testes automticos

class UserManager
{
public UserManager(IUserReader userReader)
{ ... }
}
// Instruo que indica ao NInject que a classe que
//implemementa a interface IuserReader a classe
//FacebookUserReader
kernel.Bind<IUserReader>().
To<FacebookUserReader>();
Top tip: Um caso de injeco utilizar o container para injectar um logger que, tipicamente, inicializado em funo
da classe onde o logger utilizado. Neste caso, possvel
utilizar o mtodo Bind<>().ToMethod() para garantir a inicializao por classe:

kernel.Bind<ILog>().ToMethod(ctx =>
LogManager.GetLogger(ctx.Request.Service));
class UserManager
{
public UserManager(IUserReader userReader,
ILog logger) { ... }
}
class UserReader
{
public UserReader(string connectionString,
ILog logger) { ... }
}
Neste caso, a varivel ctx.Request.Service contm o
nome da classe para a qual foi solicitada a injeco. Quando
uma classe requisitar uma instncia de ILog, o Ninject ir
executar a Func<> indicada no argumento do mtodo ToMe-

13

A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS
Outras funcionalidades
O Ninject disponibiliza tambm mecanismos de carregamento de mdulos e plugins que permitem conferir bastante
dinamismo s aplicaes.

unitrios ou de integrao, uma framework de injeco de


dependncias uma ferramenta importante para garantir a
fcil utilizao de mock objects. O Ninject possui um excelente suporte para alterar os bindings em runtime, facilitando
em muito a execuo dos testes.

Existem tambm extenses que oferecem funcionalidades de interceo de mtodos que so particulamente teis
para controlo de segurana, auditing ou troubleshooting.
A extenso Ninject.Mvc oferece a integrao plena do
Ninject com o ASP.NET MVC, permitindo que os Controllers
sejam inicializados pelo container do Ninject.

Ao utilizar uma
framework de injeco
de dependncias, a
gesto das instncias
das classes efectuada pelo container que
injecta a instncia de
uma classe sempre que
esta necessria.
Concluso
O Ninject um motor de injeco de dependncias bastante completo e verstil que garante ao programador um excelente controlo sobre a forma como a aplicao construida
bem como o ciclo de vida dos objectos de suporte aplicao.
A sua sintaxe fluda oferece um excelente mecanismo
de configurao, evitando os longos ficheiros em formato xml
tpicos de outras frameworks de injeco de dependncias.

O Ninject um
motor de injeco de
dependncias bastante
completo e verstil que
garante ao programador um excelente controlo sobre a forma como a aplicao construda bem como o ciclo de vida dos objectos de suporte aplicao.
Pela forma como est construdo, apenas as classes
de ponto de entrada das aplicaes tero que conhecer o
Ninject, sendo o resto da aplicao completamente agnstica
ao motor de injeco de dependncias.
A utilizao de mdulos permite distribuir a inicializao dos vrios componentes aplicacionais, garantido uma
melhor organizao do cdigo e evitando ficheiros de configurao demasiado longos.

Nos cenrios em que a aplicao est sujeita a testes

AUTOR
Escrito por Nuno Caneco
Software Development Lead @ Siemens
nuno.caneco@gmail.com https://pt.linkedin.com/in/nunocaneco

14

A PROGRAMAR

Como usar base de dados SQLite em Windows 10 Universal Apps

mbito
Este artigo tem como objetivo mostrar como usar uma
base de dados SQLite em Windows 10 Universal Apps, mais
especificamente ligao base de dados, obteno e persistncia de dados.
Introduo
Hoje em dia qualquer aplicao tem como requisito o
uso de base de dados para armazenar os dados, desta forma
existem vrias solues relacionais ou no, para o efeito. Uma
soluo muito usada nas aplicaes mveis o uso de base
de dados SQLite, uma vez que uma soluo simples e fcil
de usar. Em Windows 10 Universal Apps possvel usar base
de dados SQLite, que atualmente se encontra numa verso preview, e que pode sofrer alteraes at sair a verso
final.
sabido que a Entity Framework 7 ir suportar o Windows 10 Universal apps, no entanto este artigo no ir usar
esta soluo e ser usada a biblioteca SQLite.Net-PCL, uma
vez que atualmente uma das bibliotecas mais simples de
usar, e cujo cdigo fonte est disponvel no GitHub.
Figura 2: Verso do Technical Preview Tools

Nota: Este artigo foi escrito usando a verso Windows 10


Technical Preview Build 10240 e a Technical Preview Tools
version 10.0.10069.

Descrio
Comecemos por criar uma Windows 10 Universal
app, como podemos ver na figura 3:

Figura 1: Verso do Windows 10


Figura 3: Criao de Windows 10 Universal App

15

A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS

Cujo resultado ser :

public string DepartmentName { get;


set; }
public double Regular { get; set; }
[JsonProperty(PropertyName =
"total_earnings")]
public string TotalEarnings { get; set; }
public double Value { get; set; }
public string Zip { get; set; }
public string Detail { get; set; }
public string Injured { get; set; }
public string Other { get; set; }
public string Retro { get; set; }
public string Overtime { get; set; }
public string Quinn { get; set; }
}

Nota: requisito instalar o NuGet Json.net (Figura 5) uma


vez que alterado o nome das propriedades em relao ao
json recebido, de forma a se ter uma leitura mais legvel.

Figura 4: Soluo de uma aplicao Windows 10 Universal


Para os mais novatos em Windows 10 Universal apps
preciso ter ateno que deixamos de desenvolver aplicaes
para cada plataforma, e passamos a ter uma nica aplicao
que ir correr nas vrias plataformas, por esta razo passamos
a ter apenas um projeto na soluo. Para dar suporte a funcionalidades especficas de cada plataforma passamos a ter disponveis as extenses, que s iro estar disponvel na respetiva plataforma para o qual foram fornecida.
Modelo de dados
Uma vez que temos o projeto criado, agora devemos
criar o modelo de dados que define os dados a persistir pela
aplicao na base de dados SQLite. Desta forma, para ajudar
a construir o exemplo iremos usar um dos datasets fornecido
pelo http://www.cityofboston.gov/, mais especificamente o dataset https://data.cityofboston.gov/resource/4swk-wcg8.json.
Sendo
assim,
iremos
ter
uma
da BostonEmployee, que definida por:

classe

chama-

public class BostonEmployee


{
public string Name { get; set }

Figura 5: Instalao do NuGet Json.Net


O consumo dos dados ser um pedido HTTP, muito
simples, como podemos ver de seguida:
public class WebServiceManager
{
public async Task GetBostonEmployeesEarnings()
{
string url = "https://
data.cityofboston.gov/resource/4swk-wcg8.json";
var client = new HttpClient();
var request = new HttpRequestMessage
(HttpMethod.Get, new Uri(url));

public string Title { get; set; }

// Send the registration request.


var response = await client.SendAsync
(request);
var message = await

[JsonProperty(PropertyName =
"department_name")]

16

A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS

Portanto, neste momento temos o SQLite instalado e


as referncias foram adicionadas ao projeto, falta agora instalar o NuGet SQLite.Net-PCL (Figura 9), que uma biblioteca que ir facilitar a criao e conexo base de dados,
assim como na gesto de dados. Este NuGet ir adicionar as
seguintes referncias:

response.Content.ReadAsStringAsync();
var employees = JsonCon
vert.DeserializeObject(message);
return employees;
}

}
Usando SQLite
Instalao
Para podermos usar base de dados SQLite necessrio instalar o vsix fornecido no site oficial da SQLite: http://
sqlite.org/download.html,
atualmente
em
verso preview (Figura 6) e adicionar as respetivas referncias
(Figura 7 e 8):

Net

Net.Platform.WinRT

Figura 6: Obteno do SQLIte para UAP (sqlite-uap201504202353.vsix)


Figura 9: Instalao do NuGet SQLite.Net-PCL
Criao da base de dados
Antes de criarmos a base de dados necessrio definir o percurso da base de dados, isto , o local onde a base
de dados vai ser guardada. Este percurso ir ser utilizados
em futuros acessos base de dados, desta forma podemos
definir o databasePath no constructor:
private string _dataBasePath;
public MainPage()
{
InitializeComponent();
_dataBasePath = Path.Combine
(Windows.Storage.ApplicationData.Current.
LocalFolder.Path, "db.sqlite");
}

Figura 7: Adicionar referncias

De
seguida
devemos
alterar
a
se BostonEmployee de forma a definir a PrimaryKey:

clas-

[PrimaryKey]
public string Name { get; set; }
E depois podemos ento aceder base de dados,
para podermos criar a tabela referente ao BostonEmployee:
public void CreateDatabase()
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new
SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
conn.CreateTable();
}
}

Figura 8: Referncias da aplicao

17

A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS
Gesto de dados

ar:

Uma vez que j criamos a base de dados, agora podemos inserir, apagar e alterar os dados da mesma, para isso
devemos usar o SQLiteConnection que ter todos os mtodos
necessrios para efetuar as operaes CRUD:
Inserir
public void SaveData(BostonEmployee bostonEmployee)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new SQLite.
Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
conn.Insert(bostonEmployee);
conn.Commit();
}
}

public IEnumerable Pagination(int numToSkip, int


numToTake)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(
new SQLite.Net.Platform.WinRT.
SQLitePlatformWinRT(), _dataBasePath))
{
return conn.Table().Skip(numToSkip).Take
(numToTake);
}
}
Para fazer queries SQL, podemos efectuar:
private string sqlquery = "SELECT * FROM
BostonEmployee] WHERE [Value] = 0.0";
public IEnumerable SQLQuery(string sqlquery)
{
using (SQLite.Net.SQLiteConnection conn =
new SQLite.Net.SQLiteConnection(new SQLite.
Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
return conn.Query(sqlquery);
}
}

public void SaveData(IEnumerable bostonEmployees)


{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(
new SQLite.Net.Platform.WinRT.
SQLitePlatformWinRT(),
_dataBasePath))
{
conn.InsertAll(bostonEmployees);
conn.Commit();
}
}

Nota: de notar que possvel usar os vrios mtodos fornecidos pelo Linq, que permitir efetuar diferentes queries
tabela em causa, assim como usar queries em SQL.

Obter
Para obter o BostonEmployee usando o Name, podemos efectuar:
public BostonEmployee GetByName(string name)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new SQLite.
Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
return conn.Get(name);
}

Apagar
public void DeleteData(BostonEmployee
bostonEmployee)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new
SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
conn.Delete(bostonEmployee);
conn.Commit();
}
}

Para obter BostonEmployees baseadas numa pesquisa


ao Title, podemos efectuar:

Alterar

public BostonEmployee GetBostonEmployee(string


title)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new SQLite.Net.
Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
return conn.Get(i=>i.Title.Equals(title));
}
}

public void UpdateData(BostonEmployee


bostonEmployee)
{
using (SQLite.Net.SQLiteConnection conn =
new SQLite.Net.SQLiteConnection(new
SQLite.Net.Platform.
WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
conn.Update(bostonEmployee);
conn.Commit();
}
}

Para fazer paginao sobre os dados, podemos efectu-

Concluso
Em concluso podemos verificar que o uso de base

18

A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS
de dados em Windows 10 Universal Apps simples, e o uso de
base de dados SQLite atualmente uma das solues disponvel (em verso preview), cuja implementao no difere em
muito do uso em aplicaes WinRT. Sendo muito simples criar
e efetuar as operaes CRUD usando a biblioteca SQLite.NetPCL.

Hoje em dia qualquer aplicao tem como requisito o uso de


base de dados para armazenar os dados

Windows 10 Universal apps preciso


ter ateno que deixamos de desenvolver
aplicaes para cada
plataforma, e passamos a ter uma nica
aplicao que ir correr nas vrias plataformas

AUTOR
Escrito por Sara Silva
Licenciada em Matemtica pelo DMUC, e o seu foco de desenvolvimento est direccionado para a rea Mobile, sendo a sua
principal especialidade aplicaes para Windows. Atualmente desenvolve na rea do Windows, Xamarin, Azure, e Microsoft
MVP Mentor. autora de vrios artigos tcnicos e tutoriais. A Sara foi condecorada com vrios prmios com especial destaque:
Microsoft MVP, Xamarin MVP, Telerik Developer Especialista, C# Corner MVP, TechNet Wiki - Technical Guru. O trabalho que
vai sendo desenvolvido pela Sara pode ser seguido atravs do seu blog www.saramgsilva.com e do twitter @saramgsilva.

19

A PROGRAMAR

Como fazer o deploy de uma aplicao web com PrimeFaces no OpenShift

Neste artigo vou mostrar como importar a User interface


(UI) Framework PrimeFaces (http://primefaces.org/) para o
desenvolvimento de uma aplicao web de JavaServer Faces
(JSF) utilizando NetBeans (https://www.netbeans.org) e alojar a
mesma aplicao na plataforma OpenShift por SFTP.
O OpenShift Online (https://www.openshift.com) um
servio em nuvem da Red Hat (http://www.redhat.com) para
desenvolvimento de aplicaes e alojamento ou seja um
Platform as a service (PaaS) que permite otimizar a aplicao
web e no necessitamos de preocupar com a infraestrutura
necessria para distribuir a aplicao web.
Uma das vantagens de utilizarmos o OpenShift a utilizao de um plano gratuito sem necessitarmos de carto de
crdito.

O criador do PrimeFaces tambm disponibiliza o Mobile UI kit para aplicaes mobile, Layouts e temas para as
mesmas.
Para criar a aplicao deste projeto web em JSF vai
ser utilizado IDE Netbeans esta aplicao patrocinada pela
Oracle e permite o desenvolvimento de projetos Java,
HTML5, PHP e C/C++ no tem nenhum custo para o utilizador nem para empresas.
O idioma utilizado neste Netbeans o Ingls. Selecione a opo New Project para iniciar um novo projeto depois selecionada a categoria Java Web em que selecionado o projeto Web Application sem cdigo sem cdigo
includo, aps a seleo avana para fase seguinte.

Principais diferenas nos planos disponveis:


Plano

Gratuito

Bronze

Prateado

Preo base

Gratuito

Gratuito

15/Ms

Inatividade da
aplicao
Escalabilidade

24 Horas

Nunca

Nunca

Alojamento

Sim (3 min /
3 max)
1 GB

Sim (3 min /
16 max)
1 GB

Sim (3 min /
16 max)
6 GB

Suporte

Comunidade

Comunidade

Red Hat e
Comunidade

No plano gratuito se a aplicao no receber nenhum


pedido a mesma desligada e apenas volta a ser ligada quando receber um novo pedido. Para que a aplicao se mantenha
ligada normalmente utilizam-se tcnicas para fazer pedidos de
X em X tempos.
Um dos principais concorrentes do OpenShift a Microsoft Azure que permite tambm um plano gratuito para alojamento de aplicaes Java mas este apenas permite 1 GB de
trfego. No OpenShift nunca fui avisado por utilizao de trfego e a aplicao web continua a funcionar.
O PrimeFaces uma UI Framework para Websites em
JSF. Esta Framework contm um grande conjunto de componentes UI em JSF Ajax APIs, e pode consultar os componentes
no showcase que esto disponveis na pgina de internet do
PrimeFaces. O desenvolvedor tem sua disponibilidade quatro
verses PRO, CASE, Elite e Comunidade.
PRO
Cust
o
Suport
e

CASE

Elite

Subscrio anual por desenvolvedor


PrimeFaces
(resposta no
mximo em um
dia til)

PrimeFaces

PrimeTek
www.primetek.c
om.tr

Comunidade
Gratuito
(includo
comercial)
Comunidade PrimeFaces

20

definido o nome do projeto e a localizao do mesmo mas no definida a localizao da pasta das bibliotecas
e avana para fase seguinte.

A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT

O servidor a ser utilizado o Apache Tomcat e o mesmo que vai ser utilizado no OpenShift aps a seleo avana
para fase seguinte.

Agora pode importar-se o PrimeFaces. Por norma eu


crio uma pasta com nome libs na raiz do projeto onde coloco todas as bibliotecas que utilizo e que no esto integradas no IDE ou que so mais recentes j que assim consigo
abrir o projeto noutros computadores sem problemas. Tambm pode se utilizar o Maven.
O projeto vai trabalhar com JavaServer Faces o NetBeans j inclui as bibliotecas para o PrimeFaces mas no vai
ser utilizada esta funcionalidade vais ser descarregado a ltima
verso e importada para o projeto. Aps a seleo avana para
fase seguinte.
Aps a importao da biblioteca necessrio que a
mesma seja reconhecida nas pginas XHTML que utilizem
os componentes UI assim necessrio adicionar a seguinte
linha xmlns:p="http://primefaces.org/ui" no tag <html> .
O PrimeFaces tem uma tima compilao de documentao disponvel na sua pgina de Internet http://
primefaces.org/documentation como aplicar os seus componentes e tambm esto disponveis demostraes dos seus
componentes em http://www.primefaces.org/showcase/ .
Vo ser utilizadas trs demonstraes . A primeira um input
com validao, a segunda idntica primeira mas com
mensagens sobrepostas e a terceira um menu para navegarmos entre as duas demonstraes anteriores.
Antes de iniciar a criao das demonstraes O tag
url-pattern no ficheiro web.xml na pasta WEB-INF ser alterado e adicionado um context-param para o PrimeFaces.

Com o projeto criado a primeira coisa fazer definir o


Source/Binary Format do projeto para JDK 7, porque o
OpenShift ainda no trabalha com o Java 8. Para definir clicase com o boto direito do rato em cima no nome do projeto,
seleciona-se Properties, seleciona-se a opo Sources e
define-se Source/Binary Format para JDK 7.

21

<?xml version="1.0" encoding="UTF-8"?>


<web-app version="3.1" xmlns="http://
xmlns.jcp.org/
xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance" xsi:schemaLocation=
"http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/
web-app_3_1.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE
</param-name>

A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT

{welcomeView.welcome}"
icon="ui-icon-check" />

<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES
</param-name>
<param-value>/WEB-INF/faces-config.xml
</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>
javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.XHTML</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.XHTML</welcome-file>
</welcome-file-list>
</web-app>

</p:panel>
</h:form>
Para validar dos dados introduzidos necessrio criar
uma nova Java Class que contm o cdigo que o servidor
vai utilizar para validao dos dados recebidos pelo formulrio e entregar a mensagem construda.
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
@ManagedBean
public class WelcomeView {
private String name;
public String getName() {
return name;
}
public void setName(String sname) {
this.name = sname;
}

criado um novo ficheiro com nome faces-config.xml


na mesma pasta com o seguinte contedo.
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/
xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/
web-facesconfig_2_2.xsd">
</faces-config>

public void welcome() {


FacesContext.getCurrentInstance()
.addMessage
(null, new FacesMessage("Ol " + name +
" bem-vindo"));
}
}
Demo 2 idntico ao demo 1 mas com mensagem de
informao ao utilizador sobrepostas.

As alteraes anteriores no so obrigatrias mas fica a


conhecer os ficheiros onde se definem as configuraes a serem utilizadas no PrimeFaces. Com por exemplo a configurao das pginas em que o utilizador consegue aceder sem
sesso e as pginas que apenas acede com uma sesso iniciada.
Demo 1 Validao de entrada de dados executados no servidor
(http://www.primefaces.org/showcase/ui/ajax/
validation.XHTML)
Na pgina de ndex (index.XHTML) apagada a linha
referente ao Hello World e introduzido o seguinte cdigo que
contm o formulrio que solicita a introduo de dados.
<h:form>
<p:panel id="panel" header="Demo: http://
www.primefaces.org/showcase/ui/ajax/
validation.XHTML">
<p:messages id="msgs" />
<h:panelGrid columns="3" cellpadding="5">
<p:outputLabel for="name" value="Insira o seu
nome:" />
<p:inputText id="name" value="#
{welcomeView.name}" required="true" label="name">
<f:validateLength minimum="2" />
</p:inputText>
<p:message for="name" display="icon" />
</h:panelGrid>
<p:commandButton value="Submeter" update="panel"
actionListener="#

criado uma nova pgina XHTML que vai estar na raiz.


necessrio introduzir a linha xmlns:p="http://primefaces.org/
ui"> no tag <html> e alterar os seguintes tags head para
h:head e body para h:body.
inserido o cdigo referente ao formulrio
<h:form>
<p:growl id="growl" showDetail="true"
sticky="true" />
<p:panel header="Demo 2 http://www.primefaces.org/showcase/ui/message/
growl.XHTML">
<h:panelGrid columns="2" cellpadding="5">
<p:outputLabel for="msg" value="Mensagem:" />
<p:inputText id="msg" value="#
{growlView.message}" required="true" />
</h:panelGrid>
<p:commandButton value="Guardar"
actionListener="#{growlView.saveMessage}"
update="growl" />
</p:panel>
</h:form>
criada uma nova Java Class que contm o cdigo para
validao.
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
@ManagedBean

22

A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
public class GrowlView {

Para ser corrigido tem que definir a no utilizao do


proxy nas opes gerais do NetBeans.

private String message;


public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void saveMessage() {
FacesContext context =
FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage
("Com sucesso", "Sua mensagem: " + message) );
context.addMessage(null, new FacesMessage
("Segunda mensagem", "Detalhe adicional"));
}
}
Demo 3 Menu
A Framework disponibiliza vrios tipos de menu onde
utilizada a componente Breadcrumb que fornece informaes
contextuais sobre a hierarquia da pgina.
Para o menu criada uma nova pgina XHTML e a
mesma importada nas restantes pginas assim cada vez que
necessrio atualizar o menu essa alterao feita apenas
numa nica pgina XHTML.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/XHTML"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:body>
<h:form>
<p:breadCrumb>
<p:menuitem value="Demo 1"
url="index.XHTML" />
<p:menuitem value="Demo 1"
url="index.XHTML" />
<p:menuitem value="Demo 2"
url="demo2.XHTML" />
</p:breadCrumb>
</h:form>
</h:body>
</html>

E assim ter o seguinte resultado quando inicia o


projeto com o Tomcat.

Com o projeto terminado j se pode criar o ficheiro


WAR que contm todos os ficheiros do projeto a serem enviados para o OpenShift atravs de SFTP. Para criar o ficheiro
clique no projeto com o boto direito do rato selecione
Clean and Build.

Nas restantes pginas em que o menu vai ser utilizado


necessrio introduzir a linha xmlns:ui="http://xmlns.jcp.org/jsf/
facelets"> no tag <html>.
inserida a importao do menu antes dos formulrios.
<ui:include src="menu.XHTML"></ui:include>
O projeto est terminado. Agora pode ser executado
para visualizar o resultado final. Ao iniciar o projeto e depararse com o seguinte erro.

23

O ficheiro WAR basicamente um ficheiro compactado no formato zip com todos os ficheiros do projeto se o abrir
com o compactador de ficheiros com suporte zip pode ver o
seu contedo.

A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT

Antes de enviar o ficheiro o projeto para OpenShift


necessrio configurar o SFTP com o nosso certificado digital
para que o mesmo aceite a ligao SFTP.
Para criar o certificado utilizada a aplicao PuTTYgen (http://www.chiark.greenend.org.uk/~sgtatham/putty/
download.html). Ateno faa download apenas do site oficial
j que existem verses no oficiais que roubam as credenciais criadas.
Para criar o certificado inicia-se o PuTTY Key Generator
e clica-se no boto Generate a seguir move-se o rato aleatoriamente na rea em branco at o certificado ser criado e depois
define-se a key passphrase.

Com a chave inserida podemos criar uma nova aplicao clicando em Applications e selecionando Tomcat 7
(JBoss EWS 2.0) a seguir define-se o endereo da aplicao.

Nos planos gratuitos por norma no possvel definirse a regio necessrio definir-se No preference.

necessrio guardar a chave pblica e a chave priva-

Com a aplicao criada pode consultar-se o endereo


e o utilizador para a ligao SSH que est definido no Soure
Code
que
tem
o
seguinte
aspeto
854a6dZ40c000d820@xpto-pap.rhcloud.com ento o nome
de utilizador 854a6dZ40c000d820 e servidor xptopap.rhcloud.com.

da.
Inicie a sua conta do OpenShift clique em definies e
insira a sua chave pblica conforme aparece no PuTTY Key
Generator.

Se pretender alterar ou apagar a chave pblica pode


sempre apagar no boto delete e criar uma nova.

24

Para ligarmos atravs de SFTP vou demonstrar com


aplicao FileZilla. Primeiro necessrio adicionar a chave
privada no menu da aplicao selecione a opo Editar e
depois configuraes.

Na janela configuraes selecione a pgina SFTP e


clique em Adicionar chave de ficheiro.., adicione a mesma,
que foi criada anteriormente e aplicao questiona se quer

A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
converter clique Sim vai ser solicitado a passphrase que foi
definida na criao da chave privada.

o no fica na raiz mas sim numa subpasta da raiz com o


nome PAP123.

Depois de enviarmos o ficheiro reiniciamos a aplicao no painel do OpenShift.

Agora pode criar-se a a ligao ao OpenShift. Com as


indicaes do Soure Code na aplicao do OpenShift que
tem
o
seguinte
aspeto
854a6dZ40c000d820@xptopap.rhcloud.com o servidor vai ser xpto-pap.rhcloud.com o tipo
de sesso normal o utilizador 854a6dZ40c000d820.Para
iniciar a ligao clica-se no boto Ligar.

Com a ligao efetuada j pode substituir o ficheiro


WAR existente pelo WAR do projeto criado. Para isso selecione a pasta webapps localizado em /var/lib/openshift/[Nome de
Utilizador]/app-root/runtime/dependencies/jbossews/webapps
e substitua o ficheiro. Mas antes de fazer obrigatrio mudar o
nome do ficheiro WAR do projeto para ROOT.war. Se no mudar o nome do ficheiro e o mesmo se chamar PAP123 a aplica-

Ateno: Apagar outras pastas ou ficheiros o SFTP pode


danificar a aplicao web.
E ficamos com o seguinte resultado.

A vantagem de se criarem aplicaes web em Java


no prprio servidor no obrigar o utilizador a instalar o Java. Mas se o projeto trabalhar com os certificados digitais do
utilizador ento j obrigado a instalar o Java para que o
mesmo seja validado e identificado. A vantagem de utilizarmos uma UI Framework de no necessitarmos criar os
componentes UI e assim poupar tempo nos projetos. Mesmo utilizando a verso de comunidade existe um grande
suporte no frum do PrimeFace e em grupos do Google ou
Facebook. necessrio ter ateno as novas verses em
que algumas propriedades so alteradas mas esto identificadas no manual do PrimeFaces. O OpenShift uma tima
soluo de projetos para clientes em SASS /PASS mas tambm se pode utilizar para experimentar o seu comportamento e/ou para mostrar. Tambm podemos utilizar o plano gratuito para alojamento de uma pgina pessoal, blog ou outros.
Os ficheiros do projeto esto disponveis no Github
em
https://github.com/rramoscabral/pap-2015openshift_and_primefaces.

AUTOR
Escrito por Ricardo Cabral
Licenciado em Engenharia Informtica pela Universidade Autnoma de Lisboa. O seu twitter @rramoscabral

25

A PROGRAMAR

Manipulao ao nvel do bit na Linguagem C

sabido que um computador trabalha em modo binrio,


armazenando e manipulando bits, isto , zeros e uns. Este
artigo procura resumir as metodologias mais comuns para uso
e manipulao de bits atravs da linguagem C.
Base binria, octal e hexadecimal
A designao bit identifica um valor da base binria.
Como o nome sugere, a base binria composta por dois valores distintos, representados por zero e um, da tambm se designar por base dois. Assim, um bit pode assumir um desses
dois valores, sendo muitas vezes empregue para representar
um estado ativo (bit com o valor a 1) ou inativo (bit com valor a
0).
Vrios bits podem ser agrupados para formar valores
com maior amplitude. Concretamente, sempre que se acrescenta um bit, est-se a duplicar o nmero de valores passveis
de serem representados pelo conjunto de bits. Por exemplo,
com um bit consegue-se representar dois estados (0 e 1). Com
dois bits j possvel representar quatro estados (00, 01, 10 e
11) e com trs bits oito estados (000, 001, 010, 011, 100, 101,
110 e 111). De uma forma geral, n bits permitem a representao de 2n estados diferentes. Por exemplo, 16 bits permitem a
representao de 216 valores distintos, isto , 65536. essa a
razo porque um inteiro de 16 bits sem sinal (i.e., unsigned)
pode representar valores entre 0 e 65535. Outro exemplo o
do octeto, que designa um conjunto de oito bits e que pode
representar 28, i.e., 256 valores inteiros, seja entre -128 e 127
(octeto com sinal) ou entre 0 e 255 (octeto sem sinal). O termo
byte frequentemente empregue para designar um octeto.
A representao binria usualmente pouco conveniente para o ser humano que facilmente se perde na contagem e
localizao dos bits, especialmente se existir um nmero elevado de bits. Deste modo, os programadores usam frequentemente a base octal e a base hexadecimal como alternativa
representao binria. Estas duas bases so empregues por
serem mais compactas e pela facilidade com que se consegue
converter de uma representao para a representao binria
e vice-versa.
A base octal tem um conjunto de oito smbolos para a
representao de uma dada quantidade. Os smbolos so os
dgitos compreendidos entre 0 e 7. No caso da linguagem C (e
de muitas outras), um valor em base octal representado com
um zero esquerda. Assim, o valor 0123 numa listagem de
cdigo C identifica o valor octal 123 e no o valor decimal 123.
Na realidade, o valor 0123 corresponde ao valor 83 em base
decimal. A converso de octal para decimal pode ser feita somando-se as parcelas resultantes da multiplicao de 3 por 80,
de 2 por 81 e de 1 por 82 obtendo-se o valor 3x1+2x8+8x8=83.
Note-se que o uso do zero esquerda para indicar que uma
constante inteira est em base octal pode confundir o progra-

26

mador menos atento que poder pensar tratar-se de uma


constante em base 10 com um insignificante zero esquerda.
Conforme j referido, o maior interesse da base octal
a facilidade de converso para a respetiva representao
binria e vice-versa. De facto, por ser composta por 8 smbolos, cada smbolo octal representado em binrio por trs
bits, pois trs bits permitem gerar 8 valores distintos (23 = 8).
Por exemplo, o smbolo octal 3 representado em binrio
por 011, o smbolo 6 por 110. A Tabela 1 mostra a converso
entre octal e binrio para os oito smbolos da base octal.
Voltando ao exemplo anterior, o valor octal 123 (0123 na
linguagem C) tem a representao binria 001.010.011, correspondendo substituio dos smbolos da base octal pelos respetivos valores binrios (os pontos empregues na
representao binria destinam-se somente a simplificar a
leitura). Importa referir que algumas linguagens de programao j suportam representao binria, usando o prefixo
0b antes da quantidade numrica. o caso da linguagem
Java (somente a partir da verso 7), na qual o valor binrio
correspondendo ao valor octal 0123 poderia ser representado como 0b001010011.
Octal

Binrio

000

001

010

011

100

101

110

111

Tabela 1: Mapeamento entre base octal e base binria


De modo similar base octal, uma representao em
base hexadecimal facilmente convertida numa representao binria e vice-versa. A base hexadecimal assenta num
conjunto de 16 smbolos, usando os algarismos 0 a 9 para a
representao dos 10 primeiros smbolos e as letras de A a
F para os restantes seis smbolos. Nas linguagens de programao, as constantes em base hexadecimal so identificadas pelo prefixo 0x. Assim, retomando o exemplo anterior,
0x123 representa uma quantidade em base 16. A converso
de uma valor hexadecimal para base 10 consiste em somar
as parcelas resultantes da multiplicao do smbolo mais
direita por 160 (smbolo designado como o menos significativo), da multiplicao do segundo smbolo mais direita por

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
161, da multiplicao do terceiro smbolo mais direita por 162
e assim sucessivamente. Para o caso do valor 0x123, obtmse 3x160 + 2x161+ 1x162, isto , 3+32+256, ou seja o valor
decimal 291. Usando uma notao frequentemente empregue,
pode dizer-se que (123)16 corresponde ao valor (291)10.
A converso de um valor hexadecimal para a representao binria equivalente processa-se de forma similar converso de um valor octal para binrio, exceto que cada smbolo
hexadecimal deve ser mapeado para um valor de 4 bits de
acordo com a

Tabela 2. O uso de 4 bits por smbolo decorre

do facto que so necessrio 4 bits para representar todos os


16 smbolos empregues na base hexadecimal (24=16). Aplicando-se a metodologia de converso hexadecimal para binrio ao
exemplo 0x123, obtm-se a seguinte representao em binrio: 0001.0010.0011.
Hexadecimal
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

Binrio
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

usa masculas para representar os smbolos hexadecimais


entre A e F.
Especificao de campos de bits em estruturas
A linguagem C possibilita a declarao de campos
binrios em estruturas do tipo struct. Assim, possivel declarar um ou mais elementos de uma struct como sendo um
conjunto de bits. A manipulao do conjunto de bits assim
definidos faz-se atravs do campo da struct. Considere-se o
exemplo da struct exemplo1 apresentado na Listagem 1, na
qual esto declarados os campos campo01 e campo02, respetivamente com dois e quatro bits. O uso de um campo de
bits efetuado da mesma forma que qualquer outro campo
da estrutura, especificando-se o nome do campo. No caso
da Listagem 1 so atribudos os valores 1 (em decimal, correspondendo a 01 em binrio) e 0xA (em hexadecimal, correspondendo a 1010 em binrio), respetivamente, aos campos campo01 e campo02.
/* Exemplo: "bit_fields.c" */
#include <stdio.h>
typedef struct exemplo1{
int campo_bit01:2;
unsigned int campo_bit02:4;
float valor_float;
}exemplo1_t;
exemplo1_t exemplo;
exemplo1.campo01 = 1;
exemplo1.campo02 = 0xA;
printf("campo01=%d\n", exemplo1.campo01);
printf("campo02=%d\n", exemplo1.campo02);
Listagem 1: exemplo bit_fields.c

Tabela 2: Mapeamento entre hexadecimal e base binria


A maior frequncia de uso na programao da representao hexadecimal em relao representao octal deriva
do facto de um valor hexadecimal apresentar um tamanho que
sempre mltiplo de 4 bits. Essa caracterstica possibilita que
facilmente possa ser encontrado um valor hexadecimal com o
mesmo nmero de bits de um tipo de dados inteiro. Por exemplo, para o caso de se pretender um valor inteiro com 16 bits,
apenas necessrio garantir que a representao hexadecimal tenha 4 smbolos. Similarmente, para um valor de 32 bits,
sabe-se que apropriado um valor hexadecimal com 8 smbolos e assim sucessivamente. Adicionalmente, o formato hexadecimal empregue para a representao de endereos, dado
os endereos terem geralmente um nmero de bits que uma
potncia de dois (8, 16, 32, 64, etc.). Deste modo, no surpreende que a linguagem C disponibilize atravs da funo printf e
do respetivo operador de formatao %x, a representao de
um determinado valor em formato hexadecimal. Note-se que
em alternativa ao operador %x, pode ser empregue o operador
%X (maiscula) que apresenta o mesmo resultado, exceto que

27

Importa notar que um elemento especificado como


campo de bits deve ser obrigatoriamente declarado como
sendo do tipo int (ou equivalentemente do tipo signed int) ou
do tipo unsigned int. O nmero de bits definido para o campo
condiciona os valores que l podem ser armazenado. Assim,
para o caso do campo01, os dois bits do campo permitem
armazenar um dos conjuntos binrios 00, 01, 10 ou 11. Adicionalmente, dado que campo01 declarado com int, isto ,
inteiro com sinal, os valores inteiros que o campo pode armazenar so o -2, o -1, 0 e 1. Por sua vez, o elemento campo02 tem espao para quatro bits, pelo que lhe pode ser
atribudo um valor hexadecimal desde que tenha somente
um dgito, como o caso do valor 0xA empregue na Listagem 1.
Bits e variveis inteiras
Na linguagem C, o acesso ao nvel do bits no est
limitado a campos de bits definidos em structs. De facto,
possvel efetuar operaes envolvendo operadores binrios
em variveis do tipo inteiro, sejam elas int, short, long ou
mesmo char, independentemente de ser considerado o sinal
ou no (signed/unsigned). A principal diferena entre o uso
de um campo de bits e o uso de uma varivel inteira reside
no facto que uma operao binria numa varivel inteira envolve todos os bits da varivel, ao passo que num campo de

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
bits, apenas so afetados os bits do campo de bits. Assim,
quando se efetua uma operao binria envolvendo, por exemplo, uma varivel inteira sem sinal com 32 bits, necessrio
considerar os efeitos da operao sobre os 32 bits que compem a varivel. pois importante, quando se faz uso de uma
varivel inteira, ter em conta o nmero de bits da varivel, algo
que pode ser determinado multiplicando o resultado devolvido
pelo operador sizeof por 8, dado que esse operador devolve o
tamanho em octetos (bytes) da varivel ou do tipo de dados
que lhe passado como parmetro (Listagem 2). A norma C99
introduziu tipos de dados com tamanho explicitado, como o
caso do tipo int8_t que corresponde a um valor inteiro com
sinal de 8 bits (i.e., um octeto) ou o uint16_t que tem 16 bits
para guardar valores inteiros sem sinal (Open-STD, 2003). A
norma C99 especifica ainda que os tipos inteiros explicitados
se encontram definidos no ficheiro <inttypes.h>.
int var_a;
printf("n bits 'int'=%d\n",sizeof(var_a)*8);
printf("n bits 'short'=%d\n", sizeof(short)*8);

Conceito de transbordo
Por terem um nmero finito de bits, as variveis do tipo
inteiro apenas podem representar um nmero finito de valores
inteiros compreendidos entre um valor mnimo e um valor mximo. Por exemplo, uma varivel do tipo uint16 apenas pode
representar os valores inteiros do intervalo [0, 216-1], isto , [0,
65535]. Assim, caso se pretenda guardar um valor maior do
que aquele suportado pela varivel, ocorrer o que se designa
por um transbordo, perdendo-se a parte mais significativa do

Listagem 3 exemplifica o que sucede quando se

soma uma unidade varivel transbordo_1 do tipo uint16


(inteiro sem sinal de 16 bits) que foi previamente carregada
com o mximo valor que suporta, isto , 65535: o valor da varivel passa para 0. A Listagem 3 mostra ainda o transbordo da
varivel transbordo_2 que do tipo int16, isto , uma varivel inteira de 16 bits com sinal, que pode ser empregue para
representar os valores do intervalo inteiro [-32768, +32767].
Assim, quando se carrega a varivel com o valor mximo
(32767) e posteriormente se soma uma unidade varivel, o
valor da varivel passa a ser o valor mais negativo, isto , 32768 (ver

}
Listagem 3: exemplo transbordo.c
N de
valor
(aps
valor
(aps

Listagem 2: exemplo sizeof.c

resultado. A

uint16_t transbordo_1;
int16_t transbordo_2;
printf("N de bits de 'unsigned short': %u\n",
sizeof(transbordo_1)*8);
transbordo_1 = 65535;/* Carrega valor mximo */
printf("valor de transbordo_1=%u\n",
transbordo_1);
transbordo_1++; /* transbordo! */
printf("(aps +1) transbordo_1=%u\n",
transbordo_1);
transbordo_2 = 32767;
printf("valor de transbordo_2=%d\n",
transbordo_2);
transbordo_2++; /* transbordo! */
printf("(aps +1) transbordo_2=%d\n",
transbordo_2);
return 0;

Listagem 4). A possibilidade de transbordo algo

ao qual o programador deve estar muito atento, pois usualmente provoca comportamentos errticos da aplicao (Baraniuk,
2015).
/*
* Exemplo: "transbordo.c"
* Compilar:
* gcc -Wall -W -std=c99 transbordo.c -o transbordo.exe
*/
#include <stdio.h>
#include <inttypes.h>

bits de 'unsigned short': 16


de transbordo_1=65535
+1) transbordo_1=0
de transbordo_2=32767
+1) transbordo_2=-32768

Listagem 4: resultados da execuo de transbordo.c


Operaes binrias acessveis na linguagem C
Por operao binria entende-se a operao que tem
por operando(s) um ou mais valores que so tratados de
forma binria, isto , as operaes decorrem bit a bit.
As operaes binrias disponibilizadas na linguagem C correspondem s operaes habituais de manipulao de bits
que so: 1) negao; 2) e (conjuno); 3) ou (disjuno);
4) ou exclusivo (disjuno exclusiva); 5) deslocamento para
a esquerda e 6) deslocamento para a direita. As operaes
binrias so usualmente executadas de forma muito eficiente
pelo computador, pois muitos processadores implementam
nativamente as operaes binrias.
Detalham-se de seguida, as operaes binrias anteriormente enumeradas.
Operador de negao
Como o nome sugere, a operao de negao consiste na troca bit a bit, sendo que um bit a 1 convertido
para um bit a 0, e vice-versa. Na linguagem C, a operao
de negao (not na designao anglo-saxnica) representada pelo operador ~ (tilde). O operador de negao dito
unrio, porque apenas requer um operando. Na Listagem 5,
o operador de negao binria empregue para atribuir
varivel out o resultado da negao do contedo da variavel
in, isto , a negao de 0x012345678, resultando no valor
0xfedcba98 conforme mostrado na Listagem 6.
/* Exemplo: "not_binario.c"*/
#include <stdio.h>

int main(void){

int main(void){

28

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
unsigned int in = 0x01234567;
unsigned int out;
out = ~in;
printf("in: %x\n", in);
printf("out: %x\n", out);
return 0;

trata os operandos como entidades lgicas, isto , tendo um


valor verdadeiro ou falso, usualmente designado de booleano, e no bit a bit como sucede com o operador and binrio.
Assim, por exemplo, na expresso if( (a==0) && (b==2)){...},
a mesma ser considerada verdadeira apenas se o valor da
variavel a for 0 e se o valor da varivel b for 2, isto , se ambas as operaes (a==0) e (b==2) tiverem valor lgico verdadeiro. Se qualquer uma das expresses for falsa, ou ambas,
ento o resultado do and lgico falso. A Tabela 4 mostra a
tabela de verdade do operador and lgico.

}
Listagem 5: exemplo not_binario.c
in: 1234567
out: fedcba98
Listagem 6: resultado da execuo de not_binario.c

and lgico (&&)

Verd.

Falso

Operador AND binrio

Verd.

Verd.

Falso

O operador e binrio tambem designado por operador de conjuno. ainda conhecido pela sua designao anglo saxnica and, sendo identificado na linguagem C atravs
do smbolo &. O operador requer dois operandos. A tabela de
verdade do operador (Tabela 3) mostra que uma operao de
AND binrio em que pelo menos um dos operandos o bit 0
resulta sempre no resultado bit 0. Pelo contrrio, se um dos
operandos for bit a 1, ento o resultado corresponder ao bit
do outro operando: ser 1 se o bit do outro operando for 1 e 0
se o outro operando for 0. Essas caractersticas do and binrio
podem ser empregues para conhecer o valor de um determinado bit (and binrio com um dos operandos a 1) ou para zerar
um determinado bit (and binrio com um dos operandos a 0). A
Listagem 7 apresenta cdigo onde efetuada a operao and
binrio entre os valores numricos 0x12 (0001.0010 em binrio) e 0x0F (0000.1111). A operao produz o resultado binrio
0000.0010 (0x02 em hexadecimal), correspondendo ao and
binrio entre cada bit homlogo dos dois operandos 0x12 e
0x0F.

Falso

Falso

Falso

and binrio (&)

Tabela 3: tabela de verdade do operador and (&)

Tabela 4: tabela de verdade do operador and lgico (&&)


A Listagem 8 efetua a operao de and lgico sobre
as condies (a==0) e (b==2) atribundo o valor resultante da
operao varivel inteira result. Da anlise do resultado da
execuo do cdigo (Listagem 9), verifica-se que, na linguagem C, o valor lgico verdadeiro mapeado para o valor
inteiro 1 (um), e o valor lgico falso para o valor inteiro 0
(zero). Esse mapeamento mantm-se mesmo com o aparecimento do tipo de dados bool_t com a norma C99.
/*Exemplo:"and_logico.c"*/
#include<stdio.h>
intmain(void){

inta=0;

intb=2;

intresult;

/*Condicaoverdadeira*/

result=((a==0)&&(b==2));

printf("verdadeiro=>%d\n",result);

/*Condicaofalsa*/

result=((a==0)&&(b==3));

printf("falso=>%d\n",result);

return0;
}
Listagem 8: exemplo and_logico.c

/* Exemplo: "and_binario.c" */
#include <stdio.h>

verdadeiro => 1
falso => 0

int main(void){
int a = 0x12; /* 0001.0010b, 18 base 10 */
int b = 0x0F; /* 0000.1111b, 15 base 10 */
int c;
c = a & b; /* and binario */
/* 0001.0010 & 0000.1111 => 0000.0010 */
printf("c = %d & %d => %x\n", a, b, c);
return 0;
}

Listagem 9: resultado da execuo de and_logico.c


Operador OR binrio

Listagem 7: exemplo and_binario.c


importante distinguir o operador and binrio do operador and lgico no contexto da linguagem C. Em termos de representao, o primeiro representado pelo smbolo &, ao
passo que o operador and lgico requer dois smbolos & (&&).
No que respeita funcionalidade, o operador and lgico (&&)

29

O operador ou binrio, corresponde operao de


disjuno. ainda designado por OR binrio, sendo representado na linguagem C atravs do smbolo da barra vertical
| . A tabela de verdade do operador OR binrio (Tabela 5)
mostra que sempre que um dos operandos o bit 1, o resultado final o bit 1, independentemente do valor do outro
operando. Por sua vez, o bit 0 o elemento neutro do operador OR binrio, dado que o resultado de um OR binrio com
um dos operandos a bit 0 determinado pelo valor do outro

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
operando: 0 se o outro operando for bit a 0, e 1 se o outro operando for bit a 1.
Um dos usos do operador OR binrio a ativao de
um bit, isto , colocar a 1 um determinado bit. Por exemplo, o
resultado da operao OR binrio com o operando 0011, ter
sempre os dois bits menos significativos 1, independentemente do valor do outro operando. De facto, conforme anteriormente observado, sempre que um determinado bit dos operandos do operador OR binrio 1, o resultado do bit correspondente tambm ele 1. O cdigo or_binario.c (Listagem 10)
exemplifica o uso de 0x003, ou seja 0000.0000.0011b, como
operando no operador OR binrio, originando um resultado
cujos dois bits menos significativos tm o valor 1 (Listagem 11).
or binrio (|)

int main(void){
int a = 0x003;/* 0000.0000.0011b, 3 base10 */
int b = 0x120;/* 0001.0010.0000b, 288 base10 */
int c;
c = a | b; /* or binario */
/* 0000.0000.0011 | 0001.0010.0000
=> 0001.0010.0011 */
printf("c = %d | %d => %d\n", a, b, c);
return 0;
}
Listagem 10: exemplo or_binario.c
c = 3 | 288 => 291
Listagem 11: resultado da execuo de or_binario.c

Falso

Verd.

Verd.

Falso

Verd.

Falso

1
1

Tabela 7: tabela de verdade do operador xor (^)


Uma das aplicaes do operador XOR binrio o
clculo de paridade de um determinado conjunto de bits. A
paridade par de uma sequncia de bits diz-se par se o nmero de bits a 1 na sequncia par, e impar se o nmero de
bits a 1 na sequncia impar. A Listagem 12 apresenta cdigo em linguagem C que calcula a sequncia de paridade de
uma sequncia de sete inteiros.

Listagem 12: exemplo xor_paridade.c

semelhana do anteriormente visto para o operador


AND, existe tambm na linguagem C um operador OR lgico,
representado atravs de dupla barra vertical, isto , ||. Com
exceo da tabela de verdade (Tabela 6) que obviamente difere da tabela do AND lgico, tudo o anteriormente mencionado
para o operador AND lgico se mantm.
Verd.

0
0

int main(void){
/* Vetor de 7 inteiros sobre os
quais calculada a sequencia de paridade */
int i;
int paridade; /* Sequncia de paridade */
int vetor_entrada[7];
vetor_entrada[0] = 0x12;
/* 0001.0010 */
vetor_entrada[1] = 0x02;
/* 0000.0010 */
vetor_entrada[2] = 0x22;
/* 0010.0010 */
vetor_entrada[3] = 0x00;
/* 0000.0000 */
vetor_entrada[4] = 0xA0;
/* 1010.0000 */
vetor_entrada[5] = 0xFA;
/* 1111.1010 */
vetor_entrada[6] = 0x4D;
/* 0100.1101 */
/* Sequencia de paridade esperada: 0010.0101 */
paridade = vetor_entrada[0];
for(i=1; i<7; i++){
paridade = paridade ^ vetor_entrada[i];
}
printf("paridade=0x%x (hex)\n", paridade);
return 0;
}

/* Exemplo: or_binario.c */
#include <stdio.h>

Verd.

xor (^)
0

/* Exemplo: xor_paridade.c */
#include <stdio.h>

Tabela 5: tabela de verdade do operador or (|)

or lgico (||)

verdade (Tabela 7), a operao de XOR resulta no bit 1 se


os dois operandos corresponderem a bits diferentes (i.e., um
dos operandos o bit a 1 e o outro o bit a 0). Caso ambos os
operandos representem o mesmo bit, ento o resultado da
operao de XOR o bit a 0.

Tabela 6: tabela de verdade do operador or lgico (||)


Operador ou exclusivo (xor)
O operador ou exclusivo, ou xor na designao anglosaxnica (contrao de eXclusive OR) tambm conhecido
por disjuno exclusiva. Na linguagem C, o operador XOR
representado pelo smbolo ^. Conforme mostra a tabela de

30

No exemplo apresentado, cada inteiro representado


por dois smbolos hexadecimais, considerando-se assim
apenas 8 bits por inteiro (independentemente de cada inteiro
ter 32 bits os bits mais significativos para alm do oitavo bit
esto a zero). O clculo da sequncia de paridade resumese a aplicar a operao de XOR de forma iterativa entre os
sete elementos da sequncia de entrada, usando-se para o
efeito a varivel paridade para guardar a sequncia de paridade. Note-se que a sequncia de paridade corresponde
sequncia de bits que necessrio acrescentar sequncia
de entrada para obter paridade par.

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C

Entrada[i]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
Sequncia de paridade

Representao binria
0001.0010
0000.0010
0010.0010
0000.0000
1010.0000
1111.1010
0100.1101
0010.0101

Tabela 8: sequncia de paridade


importante observar que no exemplo apresentado se
est a considerar as sequncias de bits que ocorrem na vertical, calculando-se o respetivo bit de paridade. Por exemplo,
uma das sequncias formada pelo bit mais significativo
(relembre-se, o bit mais esquerda) de cada um dos sete valores inteiros, corresponde sequncia 0000.110, sendo o bit de
paridade o bit 0 por forma que a sequncia de oito bits (sete
mais o bit de paridade) tenha paridade par, isto , um nmero
par de bits a 1. A sequncia de paridade pois 0010.0101, ou
equivalentemente, 0x25 em hexadecimal. A Tabela 8 mostra os
sete conjuntos de bits e a respetiva sequncia de paridade.
Embora a linguagem C no disponibilize o operador
lgico XOR, a operao XOR entre valores lgicos pode ser
obtida atravs do recurso aos operadores AND, OR e NOT,
conforme mostrado na Equao 1.
a XOR b = (!a && b) || (a && !b) (Eq. 1)
Uma aplicao comum do operador XOR, especialmente em assembler, o de zerar o valor de uma varivel. Para o
efeito, efetua-se o XOR da varivel com ela prpria (a = a xor
a) levando a que o resultado final seja zero, pois a xor a forosamente zero.
Operador deslocamento para a esquerda
Como o nome sugere, os operadores de deslocamento
efetuam o deslocamento de bits. Na linguagem C, o operador
deslocamento para a esquerda tem a seguinte sintaxe: valor
<< n. O operador de deslocamento esquerda efetua uma
translao em n posies dos bits para a esquerda do valor
especificado. A Figura 1 ilustra uma operao de deslocamento
para a esquerda em um bit do valor 0001.0010, resultando no
valor 0010.0100. Note-se que devido ao deslocamento esquerda em 1 bit, o anterior bit mais significativo (bit mais esquerda) perdido, sendo acrescentado um bit a 0 para a posio do bit menos signficativo (bit mais direita, representado a
azul na Figura 1). Caso o deslocamento fosse de n bits para a
esquerda, perder-se-iam os n bits mais significativos, sendo
ainda acrescentados n bits a 0 como bits menos significativos.

Figura 1: Exemplo de uma operao deslocamento para


a esquerda em 1 bit

31

Quando efetuada sobre a representao binria de


um nmero inteiro, a operao deslocamento para a esquerda em n bits produz um resultado final que corresponde
multiplicao por 2n do valor inteiro original. Por exemplo, na
Figura 1, o deslocamento em um bit para a esquerda do valor original 0001.0010 que corresponde ao inteiro 18 em base decimal, transformado no valor 0010.0100 que corresponde ao valor 36 em base decimal, isto , ao dobro do valor
original. Esta propriedade do operador deslocamento para a
esquerda frequentemente empregue, especialmente em
linguagens assembler, para efetuar multiplicaes de valores
inteiros por 2n, pois bastante mais rpida do que o algoritmo de multiplicao entre dois nmeros inteiros.
A Listagem 13 exemplifica o uso do operador deslocamento para a esquerda. No exemplo, aplicado a rotao
esquerda ao valor inteiro 1, usando-se um operando de
deslocamento (varivel i) que incrementa em cada iterao
do ciclo for. Deste modo, na 1 iterao do ciclo (i=0), o valor
inteiro 1 no deslocado, no sendo pois alterado. Na iterao seguinte (i=1), o valor 1 deslocado em 1 bit para a
esquerda, passando de 0...001 para 0...010, correspondendo
ao valor inteiro 2. Na iterao seguinte (i=2), o valor inteiro 1
deslocado para a esquerda em dois bits, resultando no
valor 0...100, correspondendo ao valor 4. A Listagem 14
apresenta a sada gerada pela execuo do programa. Facilmente se depreende que o cdigo da Listagem 13 gera as
sucessivas potncias do nmero inteiro 2 (1, 2, 4, 8, 16, 32,
64, 128,...). Acresce-se ainda que os nmeros inteiros potncias de dois so frequentemente empregues como operandos dos operadores AND e OR pelo facto da respetiva representao binria comportar apenas um bit a 1, sendo os restantes 0. frequente a designao de mscara para caracterizar um valor inteiro cuja representao binria tenha somente um bit a 1 ou, pelo contrrio, somente um bit a 0.
/* Exemplo: shift_left.c */
#include <stdio.h>
int main(void){
unsigned int valor = 1;
unsigned int valor_shift;
size_t size_bits=sizeof(valor)*8;
unsigned int i;
for(i=0;i<size_bits;i++){
valor_shift = valor << i;
printf("[shift (valor << %02u)]%u\n",
i, valor_shift);
}
return 0;
}
Listagem 13: exemplo shift_left.c
[shift
[shift
[shift
[shift
[shift
()
[shift
[shift
[shift

(valor
(valor
(valor
(valor
(valor

<<
<<
<<
<<
<<

00)]1
01)]2
02)]4
03)]8
04)]16

(valor << 29)]536870912


(valor << 30)]1073741824
(valor << 31)]2147483648

Listagem 14: sada da execuo do programa shift_left.c

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
Operador deslocamento para a direita

positive_shift_R=124
sem_sinal_shift_R=124

O operador deslocamento para a direita funciona de


forma anloga ao operador de deslocamento para a esquerda,
alterando-se somente o sentido do deslocamento. Assim, na
operao de deslocamento para a direita em n bits, h lugar
deslocao em n posies dos bits para a direita. A Figura 2
ilustra uma operao de deslocamento para a direita. Na linguagem C, o operador deslocamento para a direita representado por >>, e semelhana do operador deslocamento para a
esquerda requer dois operandos. Do lado esquerdo do operador fica o operando cujo valor ir ser alvo da operao de deslocamento para a direita. Por sua vez, o operando do lado direito indica de quantos bits deve o valor inicial ser deslocado.
valor_deslocado = valor_inicial >> num_bits;

Listagem 16: Sada da execuo de right_shift.c


A Listagem 15 exemplifica a operao de deslocamento para a direita em duas variveis de tipos diferentes. A
varivel sem_sinal do tipo unsigned int, isto , um inteiro
sem sinal, ao passo que a varivel positive corresponde a
um inteiro com sinal (tipo int). Ambas as variveis so inicializadas com o valor 998, sendo aplicada, sucessivamente, a
ambas as variveis a operao de deslocamento para a direita com 0, 1, 2 e 3 bits de deslocamento. A sada resultante
da execuo do cdigo mostrada na Listagem 16. Da anlise da sada observa-se que a operao de deslocamento
de n bits para a direita corresponde diviso inteira por 2n
do valor inicial. Por exemplo, a operao de deslocamento
para a direita em dois bits equivale diviso inteira por 4 (22)
do valor inicial. contudo necessrio ter em ateno que se
trata de uma diviso inteira, perdendo-se a parte no inteira
do resultado e que este comportamente, conforme veremos
mais adiante, apenas vlido para operandos do tipo unsigned, isto , sem sinal. Por exemplo, a diviso de 998 por 8
(23) 124,75, mas quando se procede ao deslocamento em
3 bits para a direita (998 >> 3), obtm-se o valor inteiro 124.
Recomenda-se pois cautela no uso do operador deslocamento direita para efeitos de diviso por 2n (Steele, 1977).
Uma outra limitao do operador >> envolve o bit
mais esquerda que deve ser acrescentado pelo operador
quando ocorre um deslocamento para a direita. De facto, no
caso de um valor inteiro representado em complementos de
dois, o bit mais esquerda (bit mais significativo) corresponde ao sinal do nmero: 0 indica nmero positivo, ao passo
que 1 corresponde a um nmero negativo. Assim, a operao deslocamento para a direita no pode simplemente
acrescentar um bit zero em lugar do bit mais significativo,
pois tal poder resultar num valor com sinal diferente do valor inicial. No caso da linguagem C, no est definido qual o
bit a ser inserido como bit mais significativo pelo operador
deslocamento direita quando lida com inteiros com sinal.
Deste modo, o comportamento fica dependente do compilador empregue. No caso do cdigo da Listagem 17, quando
compilada com o GCC numa plataforma Linux verifica-se
que o operador deslocamento direita mantm o sinal da
valor inicial conforme ilustram os resultados da Listagem 18.

Figura 2: Exemplo de uma operao deslocamento para a direita em 1 bit


/* Exemplo: shift_right.c */
int main(void){
int positive = 998;
unsigned int sem_sinal = 998;
int positive_shift_R;
unsigned int sem_sinal_shift_R;
int i;
for(i=0; i < 4; i++){
positive_shift_R = positive >> i;
printf("===[i=%d]===\n", i);
printf("positive_shift_R=%d\n",
positive_shift_R);
sem_sinal_shift_R = sem_sinal >> i;
printf("sem_sinal_shift_R=%d\n",
sem_sinal_shift_R);
}
return 0;
}

/* shift_right_signed.c */
#include <stdio.h>
int main(void){
int positive = 998;
int negative = -998;
int positive_shift, negative_shift;
int I;
for(i=0; I < 4; i++){
printf(===[shift right %d]===\n,i);
positive_shift = positive >> I;
negative_shift = negative >> I;
printf(positive_shift=%
d\n,positive_shift);

Listagem 15: Exemplo shift_right.c


===[i=0]===
positive_shift_R=998
sem_sinal_shift_R=998
===[i=1]===
positive_shift_R=499
sem_sinal_shift_R=499
===[i=2]===
positive_shift_R=249
sem_sinal_shift_R=249
===[i=3]===

32

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C

printf(negative_shift=%d\n,negative_shift);
}
return 0;

assert( num_bit < num_bits_int );


int mascara_num_bit = (1 << num_bit);
return ( valor & mascara_num_bit );

}
int main(void){
int hex = 0xF0F1F2F3;
int bit_i, i;
int total_bits = sizeof(hex) * 8;
printf("Converso de 0x%X:\n",hex);
for(i=total_bits-1;i>=0;i--){
bit_i = is_bit_um(hex, i) ? 1 : 0;
printf("%d",bit_i);
if( (i % 4 == 0) && (i>0)){
printf(".");
}
}
printf("\n");
return 0;
}

Listagem 17: Exemplo shift_right_signed.c


===[shift right 0]===
positive_shift=998
negative_shift=-998
===[shift right 1]===
positive_shift=499
negative_shift=-499
===[shift right 2]===
positive_shift=249
negative_shift=-250
===[shift right 3]===
positive_shift=124
negative_shift=-125
Listagem 18: Sada da execuo de right_shift_signed.c

Listagem 19: Exemplo mostra_em_bin.c

Concretamente, na plataforma considerada, o operador


deslocamento para a direita acrescenta um bit a zero se o valor
inicial for no negativo, e um bit a um se o valor inicial for negativo. Importa observar, que para nmeros negativos, e considerando que o operador deslocamento direita aplica a persistncia do bit mais significativo, a operao de deslocamento de
n bits para a direita j no produz uma diviso por 2n com truncagem. Por exemplo, a operao -998 >> 2 resulta, conforme
mostrado na Listagem 18, no valor -250 e no no valor -249
como seria expectvel pelo facto da diviso de -998 por 4 resultar em -249,5. Esta particularidade do operador deslocamento direita tem causado erros em vrios sistemas, nomeadamente compiladores conforme discutido por Steele Jr. j em
1977 (Steele, 1977). De modo a evitar da armadilha do operador de deslocamento para a direita, a linguagem Java disponibliza o operador deslocamento para a direita sem sinal, representado pelo smbolo >>>. Esse operador preenche sempre a
posio do bit mais significativo com um bit a zero.

No programa mostra_em_bin.c (Listagem 19), a funo is_bit_um devolve zero se o bit num_bit do parmetro
valor zero e no zero (valor lgico verdadeiro) se o bit
num_bit for um. Para o efeito, a funo atribui varivel
mascara_num_bit um bit a um na posio pretendida atravs
da operao de deslocamento esquerda, aplicando posteriormente a mascra atravs da operao de AND binrio. No
exemplo, a funo chamada sucessivamente para mostrar
cada um dos bits da varivel hex, disponibilizando assim a
representao binria do valor da varivel hex como ilustra a
Listagem 20.

Casos de usos
Apresentam-se de seguida alguns dos casos de usos
mais frequentes de manipulao binria.
Deteo do estado de um bit
A deteo do estado de um bit consiste em determinar o
valor do isimo bit de um determinada sequncia de bits. Para o
efeito, faz-se uso do operador AND binrio, tendo como operandos o valor que se pretende analisar e uma mscara binria. A mscara binria inteiramente composta por bits a zero,
exceto para o bit a um na posio do bit cujo valor se pretende
detetar.
/*
* Exemplo: mostra representao em
* bits do valor inteiro da varivel valor
*
*/
#include <stdio.h>
#include <assert.h>

Converso de 0xF0F1F2F3:
1111.0000.1111.0001.1111.0010.1111.0011
Listagem 20: Sada da execuo de mostra_em_bin.c
Ativao/desativao seletiva de bits
A ativao seletiva de bits consiste em ativar, num
determinado valor inteiro, um ou mais bits a um. Por sua vez,
a desativao seletiva de bits corresponde operao inversa, isto , colocar um ou mais bits a zero.
A ativao seletiva de bits efetua-se atravs da operao de OR binrio, usando como operandos o valor que se
pretende modificar e uma mscara apropriada. A mscara
deve ser constituda por bits a zero, exceto para os bits que
se pretendem ativar, que devem estar a um. Por exemplo,
caso se pretenda ativar os 4 bits menos significativos de um
valor inteiro, deve-se empregar como mscara o valor binrio
que tenha os quatro bits menos significativos a 1111, estando os restantes a zero. Deste modo, e considerando um valor de 16 bits, a mscara corresponder ao valor 0X000F,
ativando-se os 4 bits menos significativos atravs da operao: novo_valor = valor | 0x000F.
A desativao seletiva de bits conseguida atravs
da operao de AND binria, usando como operadores, o
valor que se pretende alterar e uma apropriada mscara
binria. A mscara binria deve ser composta por bits a zero

int is_bit_um(int valor, int num_bit){


int num_bits_int = sizeof(valor) * 8;

33

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
nas posies que se pretendem desativar e bits a um nas restantes posies. Por exemplo, caso se pretendam desativar os
4 bits menos significativos de um valor de 16 bits, usar-se- a
mscara 0xFFF0, resultando na seguinte operao: novo_valor
= valor & 0xFFF0.
Deteo de valores potncias de dois
Determinar se o valor de uma determinada varivel inteira sem sinal corresponde a uma potncia de dois uma
operao trivial quando se recorre a operaes binrias. De
facto, dado que uma potncia de dois tem um e s um bit a um
(e.g., 16 que 0001.0000 em binrio), subtraindo-se uma unidade potncia de dois, obtm-se um valor que tem todos os
bits direita do bit ativo da potncia de dois a um, e a zero o
bit ativo bem como todos os bits esquerda do bit ativo da
potncia de dois. Por exemplo, subtraindo uma unidade a 16
obtm-se 15, correspondendo a 0000.1111 em binrio. Assim,
para determinar se um determinado valor uma potncia de
dois, basta efetuar uma operao de AND binrio entre o valor
e o valor menos uma unidade. Se o resultado for zero, o valor
em apreo uma potncia de dois. importante notar que
este algoritmo s vlido para valores positivos. A funo
is_potencia_dois (Listagem 21) faz uso dessas propriedades
das potncias de dois para detetar se parmetro valor corresponde ou no a uma potncia de dois. A sada da execuo do
programa is_potencia_dois mostrada na Listagem 22.
/*
* Exemplo: operaes binria para averiguar
* se nmero positivo potncia de dois.
*/
#include <stdio.h>
int is_potencia_dois(unsigned int valor){
if( valor == 0 || valor == 1 ){
return 0;
}
return ((valor & (valor-1)) == 0? 1:0);
}
int main(void){
unsigned int i;
for(i=2;i <= (1<<10); i++){
if( is_potencia_dois(i) ){
printf("%u\n", i);
}
}
return 0;
}

Ativao de opes
Algumas funes da linguagem C requerem o uso da
operao de OR binrio por forma a que seja possvel especificar mltiplas opes atravs de um parmetro. Um exemplo a funo open que empregue para a abertura de um
ficheiro. Conforme mostra a Listagem 23, a funo apresenta
dois parmetros. O primeiro corresponde ao caminho do
ficheiro que se pretende manipular. Mais interessante para o
mbito deste artigo, o segundo parmetro, designado de
flags, pois permite a especificao de vrios elementos. De
facto, a documentao da funo open (e.g., man 2 open
num sistema Linux) indica que podem ser especificada, entre
outros, constantes para a criao de um ficheiro. Por exemplo, a criao de um ficheiro somente para escrita especificada atravs de O_CREAT | O_WRONLY | O_TRUNC, isto
, especificando-se as opes O_CREAT, O_WRONLY e
O_TRUNC atravs do operador OR binrio. O valor que
efetivamente recebido pela funo open corresponde pois ao
resultado da operao de OR binrio das trs constantes. Na
prtica, as trs constantes so potncias de dois, significando que cada uma apenas tm um bit ativo. Tal confirmado
pelo programa open_flag.c (Listagem 24) que mostra o valor
numrico das constantes O_CREAT, O_WRONLY e
O_TRUNC (Listagem 25). Deste modo, torna-se possvel
passar, atravs de um mesmo parmetro, vrias configuraes, sendo cada configurao especificada por um ou mais
bits. Contudo, necessrio ter em conta que esta metodologia de empacotamento em bits de configuraes requer cdigo do lado da funo chamada para que essa possa identificar as configuraes pretendidas pela funo chamante.
int open(const char *pathname, int flags);
Listagem 23: prottipo da funo open
/*
* Mostra o valor numrico de algumas das
* constantes
* que podem ser empregues pela funo open
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void){
printf("O_WRONLY = %X\n", O_WRONLY);
printf("O_CREAT = %X\n", O_CREAT);
printf("O_TRUNC = %X\n", O_TRUNC);
return 0;
}

Listagem 21: Exemplo is_potencia_dois.c


2
4
8
16
32
64
128
256
512
1024

Listagem 24: Exemplo open_flags.c


O_WRONLY = 1
O_CREAT = 40
O_TRUNC = 200
Listagem 25: Sada do programa open_flags.c
Notas finais

Listagem 22: Execuo de is_potencia_dois.c

A manipulao ao nvel do bit algo que os programadores


da linguagem C devem conhecer por forma a tirar o melhor

34

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
partido da linguagem. Embora o seu uso explcito seja mais
comum na programao sistema de baixo nvel, o exemplo da
funo open ilustra que a manipulao ao nvel de bit, embora
de forma implcita, ocorre frequentemente na linguagem C.

Para quem tem necessidade de recorrer manipulao ao


nvel do bit, ainda importante ter em conta os problemas,
uns mais subtis do que outros, que podem ser encontrados.
exemplo disso o uso da operao de deslocamento direita, cujo comportamento varia consoante o compilador e a
plataforma que se est a usar.
Bibliografia

() a base binria
composta por dois
valores distintos, representados por zero e
um, da tambm se designar por base dois
()

Baraniuk, C. (05 de 05 de 2015). The number glitch that can


lead to catastrophe. Obtido de BBC: http://
www.bbc.com/future/story/20150505-the-numbersthat-lead-to-disaster
Open-STD. (2003). Rationale for International Standard Programming Languages - C . Obtido de http://
www.open-std.org/JTC1/SC22/WG14/www/
C99RationaleV5.10.pdf
Steele, G. L. (1977). Arithmetic shifting considered harmful.
ACM SIGPLAN Notices, 11(12), 61-69. Obtido de
http://dspace.mit.edu/bitstream/handle/1721.1/6090/
AIM-378.pdf

AUTOR
Escrito por Patrcio Domingues
doutorado em Engenharia Informtica e professor do Departamento de Eng Informtica na Escola Superior de Tecnologia e
Gesto (ESTG) do Instituto Politcnico de Leiria (IPLeiria). Tem lecionado, entre outras, a disciplina de Programao Avanada
da Licenciatura em Engenharia Informtica. ainda responsvel pelo GPU Education Center (antigo NVIDIA CUDA Teaching )
da ESTG/IPLeiria.

35

A PROGRAMAR

Reconhecimento de voz com JavaScript

mbito
Atualmente, o reconhecimento de voz tem vrias aplicaes no mundo real. O conceito de reconhecimento de voz
est subjacente a softwares como o Siri e S-Voice. Esta aplicao pode melhorar drasticamente a usabilidade dos websites,
principalmente para deficientes visuais. Por conseguinte, os
utilizadores podem navegar pelas pginas ou preencher campos de formulrio utilizando a sua voz.

Window.SpeechRecognition ||
Window.webkitSpeechRecognition || null;
//Caso no suporte esta API de voz
if (window.SpeechRecognition === null) {
document.getElementById
('unsuported').classList.remove('hidden');
} else {
//......
}
3.

Introduo
A API Web Speech uma API de reconhecimento de
voz que est implementada no Chrome 25 e superiores. A API
Web Speech foi lanada no final de 2012 e fornece a entrada
de voz e recursos de sada de texto para voz num web
browser. Esta API tem em conta a privacidade dos utilizadores,
pois antes de ativar a voz atravs do microfone, o utilizador
deve explicitamente conceder a permisso. O pedido de autorizao o mesmo que a API getUserMedia, apesar de no
necessitar da webcam. Se a pgina que executa esta API usa
o protocolo HTTPS, o browser solicita a permisso apenas
uma vez.

Mtodos e propriedades

Depois de testar o suporte e compatibilidade da API


criada uma instncia do objeto SpeechRecognition.
var recognizer = new window.SpeechRecognition();
Este objeto tem os seguintes mtodos:

onstart: Define um callback que disparado quando


o servio de reconhecimento comeou a ouvir o udio
para reconhecimento.

onResult: Define um callback que disparado quando o reconhecedor de voz devolve um resultado.

De seguida apresentado um exemplo bsico de como


implementar esta API:

onerror: Define um callback que acionado quando


ocorre um erro de reconhecimento de voz.

Primeira pgina com reconhecimento de voz

onend: Define um callback que disparado sempre


que o servio desligado (o evento gerado quando
a sesso termina).

1.

Estrutura HTML

A estrutura HTML muito simples:


<p id="ol">Ol mundo!</p>
<div id="transcription"></div>
<button id="rect">Gravar</button>
<span id="unsuported" class="hidden">API
not supported</span>
O atributo transcription contm o texto que informa o
que utilizador falou.
O boto rect o boto utilizado para reconhecer a
voz do utilizador.
O atributo unsupported utilizado caso a API no
seja suportada pelo browser.
2.

Teste

Por conseguinte foi criada uma varivel com a funo


de exibir o texto que o utilizador falou. Para a API reconhecer
a fala continuamente necessrio colocar a propriedade
continuous como true. Esta propriedade faz com que o
reconhecedor de voz no pare de ouvir, mesmo que tenha
pausas do utilizador.
var transcription = document.getElementById
("transcription");
//Para o reconmhecedor de voz no parar de ouvir,
mesmo que tenha pausas do utilizador
recognizer.continuous = true;
Posteriormente existe a funo onresult que define
um callback que disparado quando o reconhecedor de voz
devolve um resultado.

A API Web Speech contempla um objeto chamado


SpeechRecognition. Para saber se o browser suporta SpeechRecognition basta verificar se este objeto existe:
//Testa se o browser suporta
windows.SpeechRecognition =

36

recognizer.onresult = function (event) {


transcription.textContent = "";
for (var i = event.resultIndex; i <
event.results.length; i++) {
if (event.results[i].isFinal) {
transcription.textContent =

A PROGRAMAR
RECONHECIMENTO DE VOZ COM JAVASCRIPT

event.results[i][0].transcript +
' (taxa de acerto [0/1] : ' +
event.results[i][0].confidence + ')';
} else {
transcription.textContent +=
event.results[i][0].transcript;
}

4.

Evento de click

Por conseguinte, foi criado um evento de click associado ao boto:

}
}
Vamos analisar este cdigo com mais detalhe:
A propriedade results um array de objetos em que
cada item do array contm um possvel resultado do reconhecimento de voz. Para verificar se j um resultado final utiliza-se
a propriedade isFinal que booleana.
transcription.textContent faz com que o texto dentro da <div id=transcription> seja limpo.
for
(var
i
=
event.resultIndex;
i
<
event.results.length; i++) o ciclo que percorre o evento
que contm o texto que o utilizador falou.
Dentro deste ciclo h uma condio que verifica se o
evento se encontra na ltima posio (event.results
[i].isFinal). Caso seja verdadeira, imprimido todo o texto,
junto com a taxa de acerto, que varia entre 0 at 1. Caso
seja falsa, adicionado mais texto div.

document.querySelector("#rect").addEventListener
("click", function () {
try {
recognizer.start();
} catch (ex) {
alert("error: " + ex.message);
}
});
Onde:
recognizer.start() inicia a gravao
e
catch(ex) {
alert(error: +ex.message);
} faz o tratamento de log, caso exista, algum erro de gravao.

Concluso
Esta foi uma breve explicao com a implementao
da primeira pgina com reconhecimento de voz. Para o efeito foi utilizada a API Web Speech de JavaScript. Esta API
uma mais-valia porque facilita muito a integrao de sistemas de reconhecimento de voz em sites.

AUTOR
Escrito por Tnia Valente
Natural de Coimbra, licenciou-se em Engenharia Informtica pelo Instituto Superior de Engenharia de Coimbra e, actualmente,
frequenta o mestrado em Human Computer Interaction. entusiasta na rea de Desenvolvimento Web, no que concerne s
Tecnologias Web, Design de Interface (UI) e User Experience (UX). Curiosa e motivada por novos desafios, acredita que a criatividade pode transformar a maneira como as pessoas pensam, sentem e agem.

37

A PROGRAMAR

Cria o teu cliente de 9GAG em 15 minutos, com OutSystems

A OutSystems Platform uma plataforma de desenvolvimento made in Portugal que te permite desenvolver aplicaes web e mobile. As aplicaes so programadas visualmente, e publicadas na cloud. Estes dois factores fazem com que
consigas entregar as tuas aplicaes aos utilizadores muito
rapidamente.
Embora seja uma plataforma desenvolvida em Portugal,
a OutSystems Platform est em grande crescimento a nvel
mundial e j utilizada por algumas das maiores empresas
como a Siemens, a Vodafone ou a Mercedes-Benz.

Agora temos tudo pronto para comear.


Cria a aplicao
Abre o Service Studio. Cria uma nova aplicao e
chama-lhe Memes.
Uma aplicao constituda por mdulos. Num mdulo podemos definir o modelo de dados, implementar a lgica e desenhar a UI das nossas aplicaes. Para simplificar,
a nossa aplicao ter um nico mdulo. Cria o mdulo e dlhe o mesmo nome da aplicao.

Neste tutorial vamos desenvolver uma aplicao web


para memes que apresentar um meme de cada vez. Para
obtermos os memes iremos utilizar o 9GAG atravs de uma
API no oficial.
Antes de comearmos
Para podermos comear a desenvolver a nossa aplicao, precisamos de:

Instalar o IDE da OutSystems Platform, chamado Service


Studio. Este IDE o que nos permite desenvolver e publicar a aplicao;

Um ambiente na cloud para onde publicar a aplicao.


A OutSystems oferece um ambiente na cloud, basta nos
registarmos no site.

Se j tens o Service Studio instalado e um ambiente na


cloud, podes saltar para a seco "Cria a aplicao". Caso
contrrio vamos tratar rapidamente disso.
Obter o IDE e um ambiente na cloud
Primeiro, vamos criar uma conta no site da OutSystems.
Para tal acedes a www.outsystems.com/get-started e inseres
os dados que so pedidos no formulrio. Depois disso carrega
em Get Started. Irs receber um email para ativares a tua
conta.
Ao carregares em Activate Your Account, ir abrir uma
pgina no teu browser para preencheres com mais alguma
informao sobre ti. Apenas o url e a password para a tua conta so obrigatrios. Uma das informaes que te iro ser pedidas ser o url que vais querer usar para as tuas aplicaes.
Para este tutorial vamos usar portugal-a-programar.
Agora que j temos um ambiente na cloud, s nos falta
instalar o Service Studio, o IDE que nos permite desenvolver
as aplicaes. Neste momento o Service Studio s est disponvel para Windows.
Para obter o instalador, na barra lateral, carrega em
Start e depois em Download the Development Environment.
Depois de fazeres download, instala o Service Studio.

38

Desenha o ecr
Agora que j temos a nossa aplicao criada, vamos
tratar de desenhar o ecr. O nosso ecr ter a imagem do
post do 9GAG e um boto para ir buscar um novo post.
Na

tab

Interface,

seleciona

elemen-

to
HomePage e nas suas propriedades ativa a opo
Anonymous para que no nos tenhamos que preocupar
com a autenticao quando acedes ao ecr. De seguida faz
duplo clique no elemento HomePage para abrir o ecr. Vamos adicionar um Container pgina. Um Container um
Div em HTML. Arrasta da barra lateral esquerda o elemento

Container para dentro da pgina.

A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS

De modo a centrar o elemento Image que colocmos


dentro do Container, seleciona o Container e na propriedade
Align escolhe Center.

Precisamos tambm de inserir um exemplo da resposta JSON retornada pela API, para que o Service Studio
crie as estruturas necessrias para recebermos a resposta.
Copia o JSON disponvel em http://pastebin.com/
F7CNpYMz e cola no campo "Response".

Agora vamos inserir a imagem no ecr. Arrasta da barra


lateral esquerda o elemento Image para dentro do container
que crimos. Podes fechar a janela que te pede para selecionares a imagem a utilizar, visto que vamos carregar a imagem
a partir de um URL.
Nas propriedades da imagem atribui propriedade
Width e Height o valor 500. Desta forma a imagem do post
ter sempre o mesmo tamanho.
Falta-nos agora a opo para carregar um novo post.
Arrasta da barra lateral esquerda o elemento
Web
Block e coloca-o por baixo do elemento da imagem. Os Web
Blocks so elementos que podem ser reutilizados em vrios
ecrs. Na janela que aparece logo depois de arrastares, procura por Icon e carrega OK.
Nas propriedades do Icon, atribui propriedade Name
o valor arrow_right (disponvel nas sugestes que te so
apresentadas) e para a propriedade Size o valor Size_4x,
que permitir aumentarmos o tamanho do Icon.

Clica OK. O Service Studio cria um novo mtodo


REST de nome Get, com os parmetros de input section
e id que definimos no URL (dentro das chavetas), e com o
parmetro de sada Response.

Vamos agora centrar o Icon, para tal seleciona o seu


Container (carrega no Icon e de seguida no elemento Container que aparece na barra inferior
do Service Studio
) e propriedade Align atribui o valor Center.
Integra com o 9GAG
Para podermos obter os posts do 9GAG vamos usar
uma API REST no oficial que podes encontrar na Internet
(Infinigag - http://k3min.github.io/infinigag/).
No Service Studio, vai tab Logic, abre a pasta
Integrations e na opo REST carrega com o boto direito do
rato e escolhe Consume REST API.... Na janela que aparece
de seguida, vamos preencher o pedido HTTP que vai ser feito
API para ir buscar os posts. Preenche os campos sob
Method URL com:

GET, o verbo HTTP que vamos enviar no pedido;

http://infinigag.eu01.aws.af.cm/{section}/{id}, o URL do
mtodo da AP

39

Implementa a lgica
Agora precisamos de implementar a lgica para invocar o mtodo da API que importmos, e usar o valor retornado para os elementos ecr.
Para tal iremos usar uma
Action. Uma action
como um mtodo em Java ou .NET. Na tab Interface, vai a
Screen Flows>Main Flow e faz clique com o boto direito
no ecr "Homepage". Seleciona Add Preparation. A ao
Preparation uma ao especfica de um ecr e que corre
sempre que o ecr carregado.

A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS

De
seguida,
vai

tab
Logic
e
em
Integrations>REST e arrasta para o fluxo da ao o mtodo
da API (de nome Get). Nos parmetros de entrada do mtodo
coloca:

Agora que temos uma ao que retorna um post aleatrio, s nos falta associar o dados do post selecionado ao
ecr, mais concretamente associar a imagem do post ao
elemento Image.

section - trending, para obtermos os posts mais falados no 9GAG;

id 0, para os posts mais recentes.

De volta ao nosso ecr HomePage, clica no elemento Image. Define a propriedade Type como External e a
propriedade URL com o valor SelectedPost.Images.Large.

Precisamos agora de uma varivel para guardar o post


que vamos querer apresentar. Da mesma forma que fizmos
para adicionar a ao Preparation, sobre o ecr HomePage,
faz right-click e seleciona Add Local Variable.

Neste momento, quando abrires a pgina j poders


ver a imagem do post. Mas antes de irmos experimentar,
vamos apenas fazer com que carregar um novo post seja
possvel ao clicar no Icon que inserimos para o efeito.
Para tal, acede ao Container que tem o Icon (clica no
Icon e na barra inferior do Service Studio seleciona o elemento Container
) e na propriedade Destination,
escolhe a opo (New Screen Action). Esta opo ir criar
uma nova ao chamada OnClick, tal como a outra que
crimos anteriormente, mas com o objetivo de ser executada
ao carregarmos no Container onde est o Icon.

Nas propriedades desta varivel criada, d-lhe o nome


de SelectedPost e o Data Type com o tipo DatumItem.
No fluxo, arrasta um elemento
Assign e coloca-o
por baixo do mtodo da API. Na janela de propriedades do
Assign coloca:

Vamos agora fazer com esta ao ao ser executada


carregue um novo post. No nosso caso bastar-nos- que
este ao recarregue a pgina. Para tal, faz doubleclick sobre a ao OnClick (na vore de elementos por cima das propriedades) e no seu fluxo adiciona o elemento da
barra lateral esquerda
mento do fluxo.

Variable - SelectedPost, a varivel local que crimos;

Value
Response.Data[
TextToInteger
(GeneratePassword(1, false)) ], para aleatoriamente
obtermos um dos posts da resposta do mtodo da API.

40

Destination sobre o ltimo ele-

Na janela que aparecer de seguida, procura por


HomePage, o nosso ecr e faz OK. Desta forma iremos
dizer que a ltima ao do fluxo ser abrir um novo ecr, que
no nosso caso o mesmo.

A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS

Feito isto, podemos publicar para ver o resultado no

nosso tutorial. Para publicar, carrega no boto


na parte
superior do Service Studio. Quando a tua aplicao estiver
publicada, o icon muda para azul
. Clica nesse icon para
acederes aplicao que foi publicada.
Podes ver na aplicao web que aberta no teu
browser, a imagem do post e a opo para carregar um novo
post.
Concluso
Existem muitas outras funcionalidades que podes explorar e aplicaes que podes desenvolver em OutSystems. Espero que com este tutorial tenhas percebido como fcil desenvolver com a OutSystems Platform.
Segue o tutorial e alguma dvida ou informao adicional no hesites em contactar-me. Podes obter o cdigo e experimentar o resultado final deste tutorial (com a funcionalidade
de poder fazer like/dislike num meme) em http://
www.outsystems.com/forge/component/1025/Memes/.

As aplicaes so
programadas
visualmente, e publicadas na
cloud. Estes dois factores fazem com que
consigas entregar as
tuas aplicaes aos
utilizadores muito rapidamente

Referncias
Site oficial da Outsystems: www.outsystems.com
Documentao
oficial
do
IDE
da
ma: www.outsystems.com/help/servicestudio/9.0

platafor-

API do 9Gag (no oficial): http://k3min.github.io/infinigag/


Site do 9gag: www.9gag.com

Uma aplicao
constituda por mdulos. Num mdulo podemos definir o modelo
de dados, implementar
a lgica e desenhar a
UI das nossas aplicaes ()

AUTOR
Escrito por Antnio Pereira
Mestre em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico (Lisboa, Portugal) e com certificao em
gesto de projectos IPMA Nvel-D e Associate Developer em OutSystems. Actualmente engenheiro de software na OutSystems.
Curioso por natureza, procura sempre saber mais e adora trabalhar em equipa. Dotado de um conhecimento profundo em ferramentas de produtividade e de uma obsesso por livros, gosta de se dedicar a 100% a todos os desafios que abraa. Email:
antonio.pereira@outsystems.com

41

A PROGRAMAR

Office Graph: A inteligncia do Office 365

Recentemente apresentei uma sesso sobre "Office


Graph" no Microsoft Developer Tech Refresh, em Lisboa.
Tentando ter uma noo sobre o nvel de conhecimento da
audincia sobre os temas que a abordar, perguntei quem conhecia o Office Graph e o Office Delve. Fiquei surpreendido
por verificar que um assunto relativamente desconhecido da
maioria das pessoas. Na realidade, grande parte dos espetadores que ali estavam a ouvir-me no fazia a mais pequena
ideia do que o Office Graph e, por essa razo, pensei que
seria uma boa ideia escrever um artigo introdutrio sobre o
tema. Vamos ento comear pelo incio...
O que um grafo?
Comear pelo incio implica explicar o que um grafo
(ou graph, em ingls). Um grafo um conceito matemtico que
tambm utilizado em computao como uma estrutura de
dados, composta por ns (nodes) e arestas (edges). Cada n
representa algum tipo de entidade, e cada aresta uma relao
entre duas dessas entidades. Cada aresta pode ainda ter uma
direo e armazenar informao.
As redes sociais, como o Facebook, o LinkedIn ou o
Yammer, utilizam este tipo de estrutura de dados para representar as relaes entre pessoas e os contedos armazenados
nas mesmas.

ns.
Um sinal enviado para o Office Graph sempre que:

Eu abro um documento no SharePoint Online ou no


OneDrive for Business;

Um colega partilha um documento comigo;

Um colega me envia um email;

Um colega me apresenta um slide deck em PowerPoint;

Eu realizo um "gesto social", ou seja, algo como pressionar o boto "like" num contedo do Yammer da
empresa.

Mas no apenas de sinais que se alimenta o Office


Graph, este tambm consegue obter informao sobre a
minha organizao ligando-se ao Azure Active Directory
(AAD) da minha organizao e ao meu perfil de utilizador no
SharePoint Online. A partir desta informao, o Office Graph
constri um mapa organizacional da minha empresa e passa
a saber quem o meu manager e quem que reporta a
mim.
Adicionalmente, o Office Graph utiliza mecanismos de
aprendizagem (machine learning) para identificar automaticamente as pessoas com quem eu trabalho ativamente, baseado em quem partilha informao comigo e nas mensagens
de correio eletrnico que eu troco com outros utilizadores da
minha organizao. Por exemplo, se eu recebo frequentemente emails do Joo e respondo imediatamente, o Office
Graph vai inferir que eu trabalho proximamente com ele. Por
outro lado, se eu recebo emails da Joana e no respondo ou
demoro mais tempo a responder, o Office Graph vai inferir
que a relao de trabalho no to prxima.

Diagrama de um Grafo

O que o Office Graph?


mais fcil de explicar o que o Office Graph descrevendo o que que este faz. Vamos focar-nos numa pessoa
que utiliza o Office 365 nas suas atividades do dia-a-dia enquanto trabalha na sua empresa. Cada ao que esta pessoa
realiza envia um sinal para o Office Graph que, depois de processado, pode originar uma nova relao entre dois dos seus

42

Office Graph - ns (entidades) e arestas (relaes)

A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365

O Office Graph faz isto para mim e para todos os colegas que trabalham na minha organizao, assumindo que eles
tambm usam o mesmo tenant de Office 365. por isto que o
Office Graph tambm apelidado de "crebro do Office 365".
O que est guardado no Office Graph?

Atualmente,
os
ns
do
Office
Graph
so Documentos e Pessoas mas brevemente haver novos
tipos de ns. O Profile passar a viver no Graph,
os Groups tambm tero os seus prprios ns assim como
algumas das aes realizadas pelos utilizadores (que neste
momento correspondem apenas a arestas).
Nos eventos Build e Ignite deste ano, a Microsoft partilhou algumas estatsticas impressionantes que nos permitem
ter uma ideia da escala que o Office Graph atinge:

O Office 365 armazena mais de 70 PetaBytes de informao espalhada por todos os seus tenants. Isto corresponde a mais de 78.812.993.478.983.680 bytes!

Foram enviados mais de 60 mil milhes de anexos de


email atravs do Exchange Online;

Todos os meses so marcadas 850 milhes de reunies atravs do Exchange Online;

O Office Graph tem atualmente mais de 4 bilies de


ns e 8 mil milhes de relaes entre ns (arestas);

25% de todas as relaes so entre pessoas.

Esta escala s possvel na nuvem, onde o poder computacional e a capacidade de armazenamento so praticamente ilimitados. tambm por isso que o Office Graph no est
disponvel on premises. No entanto, ser possvel utilizar uma
abordagem hbrida e ligar uma farm de SharePoint Server
2016 on premises a um tenant de Office 365 para tirar partido
do Office Graph numa organizao. Mas isso ter que ser tema
para outro artigo.

sagem.
No que respeita segurana, o Office Graph respeita
as permisses de acesso que foram definidas sobre cada
contedo, independentemente de este estar armazenado no
SharePoint Online, no OneDrive for Business ou no Exchange Online. Cada utilizador conseguir ver apenas os contedos aos quais tem acesso.
O que o Office Delve?
O Office Delve uma aplicao web, recentemente
adicionada famlia de aplicaes que constitui o Office 365.
Foi anunciada na SPC (SharePoint Conference) em 2014
com o nome de cdigo Oslo (ou Oslo Experience). Comeou por ser uma demo interna que mostrava como apresentar a informao armazenada no Office Graph e foi construda pela equipa da Microsoft de Oslo, na Noruega, que anteriormente era parte da FAST antes desta ser adquirida pela
Microsoft.
O Office Delve descrito como uma experincia de
Search & Discovery (ou Pesquisa & Descoberta) porque,
por um lado, permite-nos fazer pesquisas sobre pessoas e
documentos atravs da introduo de termos numa caixa de
pesquisa (a componente de Pesquisa mais tradicional). Por
outro lado, apresenta-nos os contedos que nos interessam
sem que seja necessrio pesquisar por eles (a tal componente de Descoberta). Este , alis, o seu principal elemento
diferenciador e faz com que o Office Delve funcione especialmente bem como a homepage personalizada do Office 365.
A Home Page
Para quem tem uma subscrio de Office 365, o
acesso ao Office Delve feito atravs do menu de aplicaes do Office 365 (pressionando o boto do waffle no canto
superior esquerdo) e clicando no cone do Delve.

seguro?
Uma questo importante que surge frequentemente
quando se fala no Office Graph a da privacidade. Nem todas
as aes realizadas pelos utilizadores so pblicas, algumas
so privadas:

Visualizar um documento uma ao privada e no


ser partilhada com outros utilizadores. O nmero de
vezes que eu abro um determinado documento utilizado para calcular quo importante esse documento
para mim, e quo forte a minha relao com o autor
desse documento. No entanto, essa contagem nunca
partilhada com ningum.
O envio de emails tambm uma ao privada, apenas
disponvel ao remetente e ao destinatrio da mensagem
de email, assim como qualquer anexo da referida men-

43

Menu do Office 365


imediatamente apresentada a Home Page que
mostra os contedos que o Office Graph "pensa" que me
interessam. Podem ser contedos que eu prprio editei, que

A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
algum colega partilhou comigo ou que foram editados por um

permisses de acesso e para iniciar uma conversao no Yammer sobre o contedo

colega com o qual tenho interaes frequentes.


7.

Boto para adicionar o contedo a um Board

A Me Page
A Me Page apresenta informao que est diretamente relacionada comigo. composta por duas subpginas: a Activity Page e a Profile Page.

A Activity Page apresenta os contedos que eu editei pessoalmente ou que foram explicitamente partilhados comigo. Nesta pgina ainda possvel aceder
a informao adicional sobre mim atravs da hiperligao para a Trending Around Me Page que, por
sua vez, mostra as pessoas e os contedos que o
Office Graph automaticamente inferiu que esto relacionados comigo, com base na minha utilizao da
plataforma.

A Profile Page apresenta uma vista agregada do


meu perfil de utilizador, com informao obtida a partir da Active Directory da minha organizao e do
perfil de utilizador do Office 365. O diagrama organizacional (organograma) automaticamente calculado
com base no valor da propriedade Manager de cada
perfil de utilizador.

Office Delve Homepage


Do lado esquerdo, o Delve apresenta a lista de pessoas
com as quais eu trabalho. So sempre utilizadores que pertencem ao mesmo tenant de Office 365, o que normalmente quer
dizer que trabalham na mesma empresa que eu. Esta informao automaticamente calculada com base nas trocas de
emails, documentos partilhados, visualizados e editados.

Boards
No Delve, um Board um grupo de cartes de contedos, agregados atravs de uma etiqueta (tag). um conceito com algumas semelhanas ao utilizado pelo Pinterest
mas com algumas pequenas diferenas.
Os Boards so sempre pblicos, o que quer dizer que
qualquer pessoa consegue encontrar um Board que eu criei
apenas pesquisando pela etiqueta que lhe est associada e
poder at adicionar-lhe os seus prprios contedos. No
entanto, porque tudo no Delve se baseia na pesquisa, cada
utilizador conseguir ver apenas os contedos aos quais tem
acesso. Isto significa que dois utilizadores que acedem a um
determinado Board vero, provavelmente, conjuntos diferentes de cartes de contedos.
Interrogar o Office Graph

Office Delve Carto


Cada contedo apresentado sob a forma de um carto contendo a seguinte informao:
1.

A razo que justifica que o contedo esteja a ser mostrado

2.

O ttulo do contedo

3.

Imagem extrada automaticamente do contedo

4.

Tipo de contedo (ou aplicao associada a este)

5.

Localizao do contedo

6.

cones para partilhar o contedo por email, para gerir

Dado todo o contedo armazenado no Office Graph,


natural que os developers tenham interesse em interroglo e queiram usar todo este conhecimento nas suas prprias
aplicaes de negcio. Atualmente h duas formas de interrogar o Office Graph:

Atravs de Graph Query Language (GQL)

Atravs da Office 365 Unified API

Graph Query Language

44

A Graph Query Language (GQL) foi desenvolvida


para ser utilizada pelo Office Delve e funciona sobre a API

A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
REST da pesquisa. Utiliza uma sintaxe semelhante FQL
(FAST Query Language, a linguagem utilizada pela plataforma
de pesquisa FAST e suportada tambm no SharePoint 2013)
ou no tivessem ambas sido criadas pelas mesmas pessoas.
Antes de mergulhar no GQL, necessrio discutir alguns conceitos importantes:

No Office Graph, todos os ns (nodes) representam


uma entidade, como um documento ou uma pessoa, e
cada n identificado por um nmero inteiro;
Cada aresta (edge) representa uma ao entre dois ns
e tem uma direo, ou seja, um n de origem
(chamado actor) e um n de destino (chamado object);

Uma aresta pode ainda ter informao adicional, como


um timestamp e um peso (weight).

Em GQL existe apenas um operador - ACTOR - que


usado da seguinte forma:

Para filtrar o grafo por este atributo, utiliza-se


a query abaixo que retorna todos os itens modificados pelo
utilizador autenticado no dia 15-08-2015.

ACTOR(ME, AND(action:1003, time:datetime


(2015-08-15)))
Como se pode verificar pelos exemplos apresentados, o filtro pela ao o mais comum, mas requer que se
saiba o cdigo da ao pela qual se pretende filtrar o grafo.
A tabela abaixo resume as aes e respetivos cdigos.

Ao

ID

PersonalFeed

1021

vel, representa a data e hora em que decorreu determinada


ao representada pela aresta.

1003

O primeiro parmetro sempre o identificador do n


sobre o qual queremos fazer a query. Opcionalmente, pode ser
adicionada uma expresso para filtrar os resultados.

OrgColleague

1015

Por exemplo, para obter todos os itens modificados por um


utilizador especfico, utilizaria a seguinte query GQL:

OrgDirect
OrgManager

ACTOR(1234, action:1003)
Em que:
1234 o identificador do utilizador (ou seja, do seu n)

1003 o cdigo da ao "modified by"

WorkingWith

TrendingAround

Viewed
WorkingWithPublic

Para obter os itens relacionados com o utilizador autenticado, pode ser utilizada a query abaixo, em que a palavra ME automaticamente substituda pelo identificador deste.
ACTOR(ME)
possvel ainda combinar mais do que uma expresso
de filtro atravs de operadores lgicos. O exemplo abaixo permite obter todos os itens modificados ou visualizados pelo utilizador 1234.
ACTOR(1234, OR(action:1001, action:1003))
Como indicado acima, as arestas do grafo so caracterizadas por vrios atributos. Um deles o cdigo da ao
(action) mas existem outros como o time que, quando aplic-

45

1033

https://[URL
tenant]/_api/search/query?
QueryText='*'
&Properties='GraphQuery:actor(1234
\,action\:1033)' &SelectProperties='DocId,Title'

1001

Para interrogar o Office Graph necessrio injetar


a query GQL num pedido API REST da pesquisa, utilizando o
parmetro Properties tal como apresentado abaixo:

1020

1014 1013 1019

Modified

ACTOR(<ActorId> [, filter])

Descrio
Feed do utilizador
(actor) tal como mostrado
na sua homepage no Delve. Privada.
Itens modificados pelo
utilizador nos ltimos 3
Pessoas que reportem ao
mesmo manager que o
Pessoas que reportam ao
utilizador.
A pessoa a quem o utilizaPessoas com as quais o
utilizador comunica ou
colabora com frequncia.
Privada.
Itens populares junto das
pessoas com as quais o
utilizador comunica ou
colabora com frequncia.
Itens visualizados pelo
utilizador nos ltimos 3
Verso pblica da aresta
WorkingWith.

Muitas outras queries podem ser realizadas com


GQL. Para saber mais, visite este endereo: https://
msdn.microsoft.com/en-us/office/office365/howto/queryOffice-graph-using-gql-with-search-rest-api.
Office 365 Unified API
A nova Unified API expe todas as APIs do Office
365 a partir de um nico endpoint, oferecendo
aos developers uma experincia mais robusta e consistente. A utilizao de um nico fluxo de autenticao tambm
muito mais simples do que realizar a autenticao separadamente para cada API do Office 365.
A Unified API pode ser utilizada para operaes

A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
CRUD (Create, Read, Update and Delete) sobre mltiplas entidades
da
plataforma
Office
365,
desde
Users
(utilizadores)
e
Groups
(grupos)
at Files (documentos) e Mail (mensagens de email), e at
ao Office Graph.
Atualmente, a Unified API ainda est em Preview e algumas das operaes ainda no esto disponveis. No entanto, j possvel utiliz-la com qualquer tenant de Office 365
utilizando o endpoint com o endereo:
https://graph.microsoft.com/beta/
Alm
de
aes
relacionadas
com Users, Groups ou Files, a Unified API fornece o acesso a
duas
aes
muito
importantes
do
Office
Graph: TrendingAround e WorkingWith.
A ao TrendingAround retorna todos os ns relacionados com um utilizador especfico, tal como inferido pelo Office Graph, e pode ser invocada da seguinte forma:

bm armazenadas no Graph, tal como entidades de


negcio;

Conetores para permitir a outros sistemas como Dynamics CRM, Salesforce ou Trello, o envio de sinais
para o Office Graph;

Custom Analytics;

Notificaes sempre que determinadas aes so


realizadas sobre o Graph;

Licenciamento para a utilizao do Office Graph.


No que respeita ao Office Delve, podem esperar:

Uma nova Profile Page mais rica;

Uma nova rea para os Office 365 Groups com informao analtica;

Uma nova rea dedicada organizao com informao analtica.

https://graph.microsoft.com/beta/me/trendingAround
A ao WorkingWith retorna a lista dos colegas que
colaboram ativamente com um determinado utilizador, tal como
inferido pelo Office Graph, e pode ser invocada da seguinte
forma:
https://graph.microsoft.com/beta/me/workingWith

http://dev.office.com/unifiedAPIs

https://msdn.microsoft.com/en-us/office/office365/howto/
office-365-unified-api-overview

Para quem est interessando em aprender mais sobre Office Graph, aqui ficam alguns links interessantes:

Aprender sobre Office Graph


http://dev.office.com/officegraph

Para mais informao sobre como utilizar a Unified API:

Para saber mais...

Criar apps com Office 365 API e com a Unified API

https://msdn.microsoft.com/en-us/office/office365/api/
api-catalog

O que que a vem?


O Office Graph e o Office Delve so ainda tecnologias
muito recentes, com muito para evoluir e, por estarem to intimamente relacionadas, evoluiro juntas.

Testar a Office Graph Preview API

http://msdn.microsoft.com/en-us/library/office/
dn783218(v=office.15).aspx

O roadmap do Office Graph inclui:

A nova Unified REST API, atualmente em preview;

Client SDKs para simplificar a integrao e a autenticao com a nova API;

Extensibilidade
das
entidades
permitindo
aos developers definir entidades prprias que so tam-

AUTOR
Escrito por Andr Vala
Licenciado e Mestre em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico, actualmente Arquiteto de
Solues SharePoint na |create|it| e co-fundador da Comunidade Portuguesa de SharePoint. Autor do blog http://blogit.create.pt/
andrevala, trabalha com SharePoint desde 2006, altura em que surgiu a primeira verso beta do SharePoint 2007. Tem participado em vrios projectos nacionais e internacionais sobre SharePoint, e participa frequentemente como orador em eventos da
Microsoft relacionados com o mesmo tema.

46

ELECTRNICA
Um cofre para passwords simples e de baixo custo!

Electrnica

UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!


Hardware

Introduo
Um dos mais comuns e mais falados problemas de
segurana de um sistema de informao so as passwords
sem qualidade muitas vezes motivadas pela dificuldade de
memorizao das mesmas.
De forma a enquadrar o leitor, cada password deve ter
um comprimento adequado e preferencialmente no ser previsvel.
Por
exemplo,
uma
password
como
1979aMelhorGeracaoDeSempre!(27 caracteres), previsvel
se considerarmos que o utilizador nasceu em 1979 e possivelmente falar imenso desse facto gabando a sua gerao. Neste caso, apesar de ser fcil de memorizar, relativamente simples de adivinhar, ou melhor deduzir, por parte de algum
que pretenda obter acesso ao sistema no qual o utilizador em
causa usa esta password.
Por outro lado, passwords com qualidade como:
zb8@g-DMK&7@%pRyhE45DhbbPs$!
angSRhHNUenBpu4AZ4+$KLA-gcJFYfdwV=yN$RXw6TmDYTpBf9?dWRkRAXu35XhwE=d*!vt53-m8dq34fmr?
cCAv#k#u*gsSdgg (128 caracteres), apesar de serem praticamente impossveis de deduzir, so demasiado complexas para
serem memorizadas, tornando o seu uso difcil e praticamente
invivel.

Existem centenas de microcontroladores disponveis no mercado, uns mais caros, outros mais baratos, para
todos os gostos e propsitos. Neste caso, usei e, recomendo
o uso dos microcontroladores baseados em ATMega U32,
como o caso do Arduino Leonardo, Yun, etc . Esta escolha
prende-se principalmente pelo suporte USB de que dispem,
permitindo que sejam tratados pelo sistema operativo como
um teclado USB.
Neste caso usei um Arduino Leonardo R3, baseado
no Microcontrolador ATmega32u4, com 20 pinos digitais de
input/output, 7 canais PWM, 32KB de memria Flash (dos
quais apenas 28 esto disponveis, pois 4 so usados pelo
bootloader), 2.5KB de SRAM, 1KB de EEPROM, e um peso
relativamente baixo de 20g (o circuito completo pesar cerca
de 70g).
Depois de alguma pesquisa e tendo em conta que
era desejvel um circuito de pequenas dimenses, baixo
custo e uma interface de utilizador simples de usar, optei por
adicionar ao Arduino, um LCD Keypad Shield, simples com
16 colunas por duas linhas, 6 teclas, com 8 caracteres programveis pelo utilizador, de forma a ser possvel digitar
uma password e interagir com o dispositivo.
Programa

Quanto mais complexa for uma password, mais


complexa ser a sua memorizao e mais tendenciosa ser.
Por exemplo contrariamente anteriormente apresentada que
tem 128caracteres, uma password grande em tamanho,
definida por um metodo que no seja pseudo-aleatrio, para
memorizao tender a ser um conjunto de caracteres
segundo por exemplo uma cifra Csar.
Deve sempre existir uma razoabilidade entre o tamanho das passwords e aquilo que elas protegem. Os exemplos
dados, so simplesmente para ilustrar a questo da dificuldade
de memorizar passwords.
Existem diversos projectos que tentam resolver este
problema; entre eles, um dos que me parece mais interessante
e que recentemente se tornou comercialmente disponvel, o
Mooltipass, baseado em arduino. Este projecto, tem diversas
funcionalidades sendo a sua segurana elevada, na minha
opinio, perde um pouco pelo elevado custo.
Com base no conceito de cofre de passwords e com
a ideia de que o factor custo pode em muitos casos ser um
problema, pensei em fazer o meu prprio XXVBcofre de passwords, de baixo custo, que se comportasse como um teclado
e fosse capaz de digitar qualquer uma das minhas passwords,
sem que eu tivesse de as digitar manualmente nem das saber
de cabea! Passemos ento, caro leitor, prtica

49

Escolhidos os componentes de hardware, o circuito


relativamente fcil de programar em C++, usando ou o ambiente de desenvolvimento do Arduino, ou outro, como o Visual Studio. Optei por fazer a reprogramao na linha de
comandos usando um editor de texto (no meu caso o nano),
e usando o platformio, para compilar e fazer upload do programa via interface de linha de comandos (CLI).
Como as passwords sero armazenadas na memria
flash do arduino e considerando que estas devem ser mudadas com regularidade, o que implica compilar novamente o
sketch do arduino e fazer o respectivo upload, o platformio
uma opo bastante boa para estas tarefas, sendo de instalao e utilizao simples, cross-platform. Acima de tudo,
eficaz.
Instalao do Platformio
Para instalar o platformio deve-se ter instalado o
Python 2.7, (ateno que no compatvel com as verses
3.x).
Em GNU/Linux e Mac OS X, a instalao segue os seguintes
passos:
python -c "$(curl -fsSL https://
raw.githubusercontent.com/platformio/
platformio/

Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!

master/scripts/getplatformio.py)"
cd /path/get-platformio.py/script
python get-platformio.py
pip install https://github.com/platformio/
platformio/archive/develop.zip
pip install platformio && pip install --egg scons
pip install -U platformio
pip install https://github.com/platformio/
platformio/archive/
develop.zip
Em Windows a instalao segue passos ligeiramente
diferentes:
python.exe get-platformio.py
pip search platformio
pip install platformio && pip install --egg scons
pip install -U platformio
pip install https://github.com/platformio/
platformio/archive/develop.zip
Uma vez instalado o platfromio, ser necessrio instalar
a plataforma atmelavr. Neste caso os passos so os mesmos
quer se esteja a usar Windows, GNU/Linux ou MacOS X.
platformio install atmelavr
cd directorioDoProjecto
platformio init
Dentro desta directoria estar um ficheiro chamado platformio.ini, que devemos editar e colocar com as configuraes
correctas, de placa de desenvolvimento, plataforma, framework
e porta.

temos mais do que uma password diferente e essa ser, de


facto, a poltica mais segura. Uma vez que as passwords
sero armazenadas num cofre, ser necessria uma s
senha para acedermos a todas as senhas guardadas nele.
No entanto precisamos de aceder a cada senha especificamente, para no inserirmos senhas trocadas, bem como
para escolhermos que senha digitar. Para tal precisamos de
um interface que nos permita escolher a senha. Neste caso
ser o LCD a mostrar a senha e o keypad vai permitir-nos
escolher a senha.
Explorando um pouco o cdigo:
No incio do programa, por brincadeira e at nostalgia, criei alguns caracteres de 8x5 bits, dos quais apenas
uso dois no incio do programa, mas que no deixam de ter a
sua graa. Caso o leitor deseje explorar um pouco mais bastar eliminar um dos existentes no programa e criar um novo,
sendo o processo simples. Os bits a zero, significam que
nada ser exibido no lcd e os bits a 1 exactamente o oposto,
como se ilustra no exemplo seguinte:
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
Como o LCD Keypad tem apenas 6 teclas (Select;
Left; Up; Down; Right; Rst), e dessas 6 apenas devem ser
usadas 5, pois a tecla Rst est pr-definida para fazer o reset ao circuito, temos de programar a intercepo das restantes teclas, para lhes atribuirmos funcionalidades. Para tal
comeamos por definir os valores delas quando premidas:

#
# Project Configuration File
#
# A detailed documentation with the EXAMPLES is
located here:
# http://docs.platformio.org/en/latest/
projectconf.html
#
# A sign `#` at the beginning of the line
indicates a comment
# Comment lines are ignored.
# Simple and base environment
[env:mybaseenv]
platform = atmelavr
framework = arduino
board = leonardo
upload_port = COM10
#
# Automatic targets - enable auto-uploading
targets = upload

//mapa de teclas e respectivos valores

No meu caso a porta correcta foi a COM10. Convm


verificar qual a porta que est a ser utilizada pelo Arduino.
Para compilar e fazer o upload do sketch para o Arduino, utilizando o platformio, via CLI, basta digitar o comando:
platformio run --target upload
Voltemos ao desenvolvimento da nossa aplicao,
que ir armazenar as passwords e digit-las quando precisarmos.
Tal como escrevi no incio do artigo, normalmente

50

/*
+----------+---------+
| Texto
| Pino
|
+----------+---------+
|
UP
|
0
|
| DOWN
|
1
|
| SELECT |
2
|
| RIGHT
|
3
|
| LEFT
|
4
|
+----------+---------+
*/
#define UP 0
#define DOWN 1
#define SELECT 2
#define RIGHT 3
#define LEFT 4
De seguida criamos as funes destinadas leitura
das teclas se premidas. As teclas esto ligadas a pinos analgicos, logo temos de ler intervalos de valores, usando a
funo analogread(), para fazer a leitura dos mesmos.
int ReadKey()
{

Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
int x = 1023;

B00100,

do
{

B00010,
B00010,
B00100,
B01000,
B10000

x = analogRead (0);
if (x < 60) return RIGHT;
else if (x < 200) return UP;
else if (x < 400) return DOWN;
else if (x < 600) return LEFT;
else if (x < 800) return SELECT;
}
while (x > 800);
}
Com estas funcionalidades bsicas implementadas,
optei por criar um array de chars com todos os caracteres AZ; a-z; 0-9, para permitir que a password seja uma string do
comprimento que o utilizador decidir. Tambm foi opo na
programao das teclas usar a tecla left para acrescentar o
caracter actual password, permitindo assim escrever a password, normalmente, e a tecla Select, para introduzir a password, uma vez toda digitada.
Posto isto, basta apenas fazer um simples menu, como explicado no prprio cdigo, para se navegar entre as
senhas armazenadas.
O cdigo do scratch ser o seguinte:
/*
*Thx to Mkman for the help and advice!
*In loving memory of
*
Misha II
* 12/12/2004 - 13/07/2015
*
You are missed
*/

};
byte et[8] = {
B11111,
B10101,
B11111,
B00100,
B01110,
B11111,
B11111,
B11111
};
byte sandclock[8] = {
B11111,
B01110,
B01110,
B00100,
B01110,
B01110,
B11111,
B00000
};
byte cat[8] = {
B01010,
B11111,
B10101,
B11111,
B00100,
B01110,
B01110,
B11111
};
//define a senha para abrir o cofre
static String strkey = "abcddcba";
//Descries das passwords
//So armazenado na memria flash (no voltil)
do arduino.
static char *desc[] = { "P@P", "Gmail", "MyApp",
"Blog", "FacelessBook" };
//Passwords
static char *keys[] = { "Password1", "Password2",
"Password3", "Password4", "Password5" };
//array de caracteres ascii com as letras a-z;AZ;0-9
static char ascii[] = {'a', 'b', 'c', 'd', 'e',
'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', '0'};
//mapa de teclas e respectivos valores

#include <LiquidCrystal.h>
#include <String.h>
//cria alguns caracteres engraados
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
byte skull[8] = {
B00000,
B01110,
B10101,
B11111,
B11011,
B01110,
B01010,
};
byte tulip[8] = {
B10101,
B11111,
B11111,
B01110,
B00100,
B10101,
B01110,
B00100
};
byte prompt[8] = {
B10000,
B01000,

/*
+----------+---------+
| Texto
| Pino
|
+----------+---------+
|
UP
|
0
|
| DOWN
|
1
|
| SELECT |
2
|
| RIGHT
|
3
|
| LEFT
|
4
|
+----------+---------+
*/
#define UP 0
#define DOWN 1
#define SELECT 2
#define RIGHT 3
#define LEFT 4

51

Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!

i++;
//lcd.clear();
break;
case DOWN:
if (i <= 0)
{
i = 0;
} else if (i >= 62)
{
i = 0;
}
else {}
i--;
c = ascii[i];
lcd.print(c);
break;
case LEFT:
lcd.clear();
break;
case RIGHT:
str += c;
lcd.clear();
break;
case SELECT:
Serial.println(str); //for debug porposes
Serial.println(strkey); //for debug
//porposes
return str.compareTo(strkey);

int index = 0;
#define COUNT 5 //numero de passwords e descries
//armazenadas
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Inicializa
//O lcd
/*
*funo que tem como misso interceptar a leitura
analgica dos pinos das teclas up, down, left,
right e select
*/
int ReadKey()
{
int x = 1023;
do
{
x = analogRead (0);
if (x < 60) return RIGHT;
else if (x < 200) return UP;
else if (x < 400) return DOWN;
else if (x < 600) return LEFT;
else if (x < 800) return SELECT;
}
while (x > 800);
}
/*
*funcao setup
*/
void setup()
{
Keyboard.begin();
lcd.createChar(0, smiley);
lcd.createChar(1, skull);
lcd.createChar(2, tulip);
lcd.createChar(3, prompt);
lcd.begin(16, 2); //16 colunas por 2 Linhas
lcd.setCursor(0, 0);
lcd.print("Lego Pwd Safe");
lcd.setCursor(0, 1);
lcd.print("by apocs");
lcd.write(byte(0));
lcd.write(byte(1));
lcd.write(byte(2));
delay(5000);
lcd.clear();
Unlock();
}

}
}
}
/**
funcao de bloqueio
*/
void blocked(void) {
int i = 0;
for (i = 30; i >= 0; i--) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Locked");
lcd.setCursor(0, 1);
lcd.print("");
lcd.print("seg");
delay(1000);
}
}
/** funcao de desbloqueio
*/
void Unlock() {
int count = 0;
while (1) {
if (inkeys() != 0)
count++;
else
return;

/**
funcao que tem por tarefa interceptar as teclas
primidas e permitir que seja composta a string da
password
*/
int inkeys()
{
lcd.write(byte(3));
int i = 0;
char c;
String str;
while (1)
{
int key = ReadKey();
delay(200);
switch (key)
{
case UP:
if (i >= 62)
{
i = 0;
}
c = ascii[i];
lcd.print(c);
//inc

if (count == 2) {
blocked();
count = 0;
}
}
}
void loop()
{
// put your main code here, to run repeatedly:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pass: ");
lcd.setCursor(0, 1);
lcd.print(desc[index]);
int key = ReadKey();
delay(200);
switch (key)

52

Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
EEPROM 24LC256, que so relativamente simples em termos de interface com o Arduino, ou at acrescentar funcionalidades de criptografia por hardware, por exemplo com um
Atmel ATSHA204, que pode ser facilmente encontrado online por um preo bastante baixo, mesmo quando j montado
numa breakout board, o que facilitar a ligao ao arduino.

{
case UP:
--index;
if (index < 0) index = COUNT - 1;
break;
case DOWN:
++index;
if (index > (COUNT - 1)) index = 0;
break;
case SELECT:
Keyboard.print(keys[index]);
lcd.print(" - OK");
delay(1000);
break;

Ficou tambm por explorar a possibilidade de construir uma caixa, para o circuito, possivelmente at feita numa
impressora 3D em polmero ABS, ou outro. No entanto essa
temtica sairia muito do mbito especifico deste artigo.

}
}
Uma vez carregado o scratch no Arduino, bastar liglo numa porta USB, que far a dupla funcionalidade de o alimentar e de comunicar com o computador, permitindo assim
que se utilize o circuito para introduzir passwords onde precisamos de as usar.
Cada vez que alteremos ou acrescentemos passwords ao cofre, bastar alterar o valor da constante COUNT
e/ou acrescentar ou alterar nos vectores de descrio e chaves, as respectivas descries e chaves.
Concluso
Como referido no incio do artigo, recordar na nossa
prpria memria dezenas de passwords extremamente difcil,
pelo que o armazenamento externo das mesmas se torna interessante do ponto de vista prtico, mas criando um problema
de segurana. O armazenamento das mesmas num circuito
externo pode ser uma soluo, desde que tal se revele prtico.

Outra possibilidade que no foi explorada neste


artigo, foi a escrita de um driver no-standard para o dispositivo, que permitisse algumas funcionalidades extra. Neste
caso foi uma opo para evitar usar drivers no padro, uma
vez que o dispositivo funciona nas principais plataformas
Microsoft Windows, GNU/Linux e Apple Mac OS.
Ficou igualmente por explorar o desenvolvimento de
uma app com uma interface de utilizador simplificada, para o
carregamento de novas passwords e descries para o circuito! Inicialmente ainda pensei em incluir tambm esta temtica no artigo, mas cedo decidi no o fazer deixando ao
critrio do leitor desenvolver a sua prpria aplicao caso
ache interessante. Pessoalmente eu f-lo-ia usando as ferramentas Xamarin, uma vez que se trata de um sistema crossplatfrom, mas preferi deixar ao critrio do leitor e/ou de um
segundo artigo sobre este mesmo tema.

Ao longo deste artigo, expliquei como construir um circuito, baseado em Arduino Leonardo e LCD Keypad de 6 teclas, bem como compilar o cdigo e fazer o upload via CLI.
Certamente este cdigo pode ser muito melhorado, como por
exemplo a colocao das passwords no 1KB de EEPROM do
Arduino ou o armazenamento encriptado das senhas, etc. Fica
ao critrio do leitor, modificar o cdigo e o projecto caso assim
o entenda. Neste caso esta soluo no 100% eficaz em
termos de segurana pelo que no se recomenda o seu uso
em ambientes mais sensveis.
Em termos de hardware tambm podem ser feitas
diversas melhorias, como por exemplo a ligao de mdulos de
memria externos, por exemplo um NXP PCF8570P ou uma

AUTOR
Escrito por Antnio C. Santos
Com uma enorme paixo por tecnologia, autodidacta desde tenra idade, cresceu com o ZX Spectrum. Tem vasta experincia
em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvimento de software por medida nas mais diversas
linguagens. Diplomado do Curso de Especializao Tecnolgica em Tecnologias e Programao de Sistemas de Informao
pela ESTG-IPVC. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Software Foundation, onde Programador Voluntrio. Neste momento aluno no Instituto Politcnico de Viana do Castelo, na Escola
Superior de Tecnologia e Gesto no curso de Licenciatura em Engenharia Informtica.
Twitter:@apocsantos

53

COLUNAS
C# - As novidades do C# 6

C#

AS NOVIDADES DO C# 6

Com o recente lanamento do Visual Studio 2015, foi


lanada a verso 6 da linguagem de programao para a plataforma .NET C#.
Como neste lanamento o enfoque principal foi na nova
plataforma de compiladores (Roslyn), os melhoramentos e
adies linguagem foram escassos mas, tal como os melhoramentos e adies das verses anteriores, tornaro a vida de
quem desenvolve usando a linguagem de programao C# muito melhor.

public class Person


{
[CompilerGenerated]
[DebuggerBrowsable
(DebuggerBrowsableState.Never)]
public string k__BackingField = "Jane";
[CompilerGenerated]
[DebuggerBrowsable
(DebuggerBrowsableState.Never)]
public string k__BackingField = "Doe";
public string First
{
[CompilerGenerated]
get { return k__BackingField }
[CompilerGenerated]
set { k__BackingField = value; }
}
public string Last
{
[CompilerGenerated]
get { return k__BackingField }
[CompilerGenerated]
set { k__BackingField = value; }
}

1. Melhoramentos em auto-propriedades
As propriedades implementadas automaticamente (ou,
abreviando, auto-propriedades) so propriedades no abstratas e no externas com acessores com corpo apenas com ponto e virgula.
Quando uma propriedade implementada automaticamente, criado um campo escondido para dar suporte propriedade e os acessores de leitura e escrita so so implementados para, respetivamente, ler e escrever desse campo.

1.1. Inicializadores para auto-propriedades


Passa a ser possvel declarar a inicializao de autopropriedades da mesma forma que se inicializam os campos:

}
Note-se
que
os
campos k__BackingField e k__BackingField tm nomes que no
so vlidos em C#. Tal acontece para que no haja qualquer
hiptese de coliso entre os atribudos pelo programador e
os nome atribudos pelo compilador.
1.2. Auto-propriedades apenas de leitura

public class Person

As auto-propriedades passam a dispensar o acessor


de escrita passando, por isso, a poder ser apenas de leitura:

{
public string First { get; set; } = "Jane";
public string Last { get; set; } = "Doe";
}
Com esta sintaxe, o inicializador inicializa diretamente o
campo que d suporte propriedade sem recorre ao setter da
propriedade.
Os inicializadores de propriedades so executados, tal
como e juntamente com, os inicializadores de campos.
Tal como acontece com os inicializadores de campos,
os inicializadores de propriedades no podem fazer referncia
a this porque, tal como acontece com os inicializadores dos
campos, correm antes dos objetos estarem devidamente inicializados.
A implementao desta nova funcionalidade feita
usando funcionalidades tradicionais da linguagem tornado possvel a utilizao do cdigo gerado em verses anteriores da
plataforma .NET. Na verdade o cdigo anterior traduzido pelo
compilador para o seguinte cdigo C# 1:

55

public class Person


{
public string First { get; } = "Jane";
public string Last { get; } = "Doe";
}
Neste caso, o campo gerado declarado implicitamente como readonly (embora isto apenas tenha importncia para efeitos de reflexo reflection).
semelhana do caso anterior, o cdigo gerado ser:
public class Person
{
[CompilerGenerated]
[DebuggerBrowsable
(DebuggerBrowsableState.Never)]
private readonly string k__BackingField =
"Jane";
[CompilerGenerated]
[DebuggerBrowsable
(DebuggerBrowsableState.Never)]
private readonly string k__BackingField =
"Doe";

C#
AS NOVIDADES DO C# 6

public Point Move(int dx, int dy)


{
return new Point(x + dx, y + dy);
}

public string First


{
[CompilerGenerated]
get { return k__BackingField; }
}
public string Last
{
[CompilerGenerated]
get { return k__BackingField; }
}

public static Complex operator +(Complex a,


Complex b)
{
return a.Add(b);
}

}
Tal como acontece com os campos apenas de leitura,
no caso das auto-propriedades apenas de leitura possvel
inicializar o seu valor no construtor:
public class Person
{
// ...

public static implicit operator string (Person p)


{
return p.First + " " + p.Last;
}
Para
mtodos
cujo
tipo
de
retorno
seja void (ou Task para mtodos assncronos) a sintaxe da
seta ainda se aplica, mas a expresso que se segue tem de
ser uma instruo ( semelhana do que j acontece com as
lambdas):

public Person(string first, string last)


{
First = first;
Last = last;
}
}
E, mais uma vez, o compilador gera cdigo equivalente
a C# 1:
public class Person
{
// ...

public void Print() => Console.WriteLine(First + "


" + Last);
que ser traduzido para:
public void Print()
{
Console.WriteLine(First + " " + Last);
}

public Person(string first, string last)


{
k__BackingField = first;
k__BackingField = last;
}

2.2. Corpos em formato expresso em membros do tipo


propriedade

}
2. Membros funo com corpo em formato expresso
Passam a poder ser usadas expresses semelhantes
s funes lambda para definir corpos de funes com apenas
de uma instruo (statement) ou bloco trazendo s funes
membros de tipos a mesma clareza e simplicidade.

Os corpos do tipo expresso tambm podem ser usados para definir o corpo de propriedades e indexadores apenas de leitura:
public string Name => First + " " + Last;

2.1. Corpos em formato expresso em membros do tipo


mtodo

public Person this[long id] => store.LookupPerson


(id);

Mtodos, assim como operadores definidos pelo utilzador e converses, podem ter o seu corpo definito por uma expresso usando a seta das lambdas:

Note-se a ausncia da palavra-chave get, que se


torna implcita pela sintaxe de expresso.

public Point Move(int dx, int dy) => new Point(x +


dx, y + dy);

Os exemplos anteriores so traduzidos pelo compilador para:


public string Name
{
get
{
return First + " " + Last;
}
}

public static Complex operator +(Complex a,


Complex b) => a.Add(b);
public static implicit operator string (Person p)
=> p.First + " " + p.Last;
O efeito exatamente o mesmo que se os mtodos
tivessem apenas uma instruo de return. Os exemplos acima
so convertidos pelo compilador para:

56

public Person this[long id]


{
get
{
return store.LookupPerson(id);
}
}

C#
AS NOVIDADES DO C# 6
3. Diretiva using static
semelhana do que acontece com a diretiva using para espaos de nomes (namespaces), a diretiva using static adiciona os membros estticos da classe ou
enumerado dado como argumento ao espao de nomes global,
permitindo a sua utilizao sem a necessidade de qualificao
com o nome da classe:
using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class Program
{
static void Main()
{
WriteLine(Sqrt(3 * 3 + 4 * 4));
WriteLine(Friday - Monday);
}
}

ser mtodo de extenso passe a ser uma modificao fraturante, o que no era o caso anteriormente. Mas os mtodos
de extenso so geralmente chamados como mtodos estticos nos casos raros em que existe uma ambiguidade e,
nesses casos, parece legtimo que sejam qualificados com o
nome da classe.
4. Operadores condicionados por null
frequente a necessidade de ter cdigo salpicado de
verificao para null. Os operadores condicionados
por null permitem o acesso a membros e elementos apenas
quando o recetor no null, retornando um resultado null caso contrrio:
int? length = people?.Length; // null se people
//null
Person first = people?[0];
// null se people
//null

O cdigo anterior ser traduzido pelo compilador para:

O cdigo anterior ser traduzido para:

class Program
{
static void Main()
{
System.Console.WriteLine(System.Math.Sqrt
(3 * 3 + 4 * 4));
System.Console.WriteLine
(System.DayOfWeek.Friday - System.
DayOfWeek.Monday);
}
}

int? nullable = (people != null) ? new int?


(people.Length) : null;
Person person = (people != null) ? people[0] :
null;
Os operadores condicionados por null pode ser muito
conveniente quando usado com o operador de coalesccnia
de null (??):

Esta funcionalidade tima quando se tem um conjunto


de funes relacionadas com um determinado domnio que se
usa frequentemente, de que System.Math um bom exemplo.
Permite tambm especificar individualmente os nomes de um
enumerado, como os membros de System.DayOfWeek no
exemplo acima.
3.1. Mtodos de extenso

int length = people?.Length ?? 0; // 0 se people


//null
Os operadores condicionados pot null tm um comportamento de curto-circuito. em que a cadeia de acesso a
membros, elementos ou invocaes imediatamente a seguir
apenas so executados se o recetor original no for null:
int? first = people?[0].Orders.Count();

Os mtodos de extenso so mtodos estticos, mas a


inteno de que sejam usados como mtodos de instncia
dos tipos que estendem. Em vez de trazer esses mtodos para
o mbito global, a funcionalidade using static faz com que
esses mtodos estejam disponveis como mtodos de extenso:
using static System.Linq.Enumerable; // The type,
not the namespace
class Program
{
static void Main()
{
var range = Range(5, 17);// Ok: not
//extension
var odd = Where(range, i => i % 2 == 1);
// Error, not in scope
var even = range.Where(i => i % 2 == 0);
// Ok
}
}

O exemplo anterior , na essncia, equivalente a:


int? first = (people != null) ?
people[0].Orders.Count() : (int?)null;
Com a exceo de que people avaliado apenas
uma vez. Nenhum dos acessos a membros ou elementos e
invocaes que se seguem ao operador ? so executados
se o valor de people for null.
E nada impede que os operadores condicionados
por null sejam encadeados, no caso de ser necessria alguma verificao de null mais que uma vez na cadeia:
int? first = people?[0]?.Orders.Count();

Isto faz com que alterar um mtodo para que passe a

57

A invocao (uma lista de argumentos entre parntesis) no pode ser precedida imediatamente pelo operador ? isso levaria a demasiadas ambiguidades. Assim sendo, a esperada invocao de um delegate caso este no
seja null no funciona. Contudo, o delegate pode sempre

C#
AS NOVIDADES DO C# 6
ser invocado via o seu mtodo Invoke:

IFormattable christmas = $"{new DateTime(2015, 12,


25):f}";

if (predicate?.Invoke(e) ?? false) { }
Uma utilizao muito comum desta funcionalidade o
disparo de eventos:
PropertyChanged?.Invoke(this, args);
Que traduzido para:

o compilador gera o seguinte cdigo:


IFormattable christmas =
FormattableStringFactory.Create("{0:f}",
new DateTime(2015, 12, 25));
que pode ser usado da seguinte forma:

var handler = PropertyChanged;


if (handler != null)
{
handler.Invoke(this, args);
}

var christamasText = christmas.ToString(new


CultureInfo("pt-PT"));
5.1.1. FormattableString

Que uma forma segura para threads de verificar se o


evento tem subscritores porque apenas avalia o lado esquerdo
da invocao uma vez e mantem o seu valor numa varivel
temporria.
5. Interpolao de strings
O mtodo String.Format com as suas variadas verses
muito verstil e til, mas a sua utilizao um bocado desajeitada e sujeita a erros devido aos marcadores numricos ({0})
que tm de corresponder posio dos argumentos fornecidos
em separado:
var s = string.Format("{0} tem {1} ano{{s}}.",
p.Name, p.Age);
A interpolao de strings permite substituir diretamente
no literal string os ndices por buracos com as expresses
que correspondem aos valores:
var s = $"{p.Name} tem {p.Age} ano{{s}}.";
Tal como acontece com o mtodo String.Format, possvel a especificao de alinhamentos e formatos:

O
tipo
concreto
retornado
por FormattableStringFactory.Create derivado de:
namespace System
{
public abstract class FormattableString :
IFormattable
{
protected FormattableString();
public abstract int ArgumentCount { get; }
public abstract string Format { get; }
public static string Invariant
(FormattableString formattable);
public abstract object GetArgument(int
index);
public abstract object[] GetArguments();
public override string ToString();
public abstract string ToString
(IFormatProvider formatProvider);
}
}
Isto permite, no s acesso a formato mas tambm
aos argumentos da string formatvel.
5.1.2. Retrocompatibilidade

Note-se que a expresso condicional est entre parntesis, para que : s no seja confundido com o especificador
de formato.

As funcionalidades introduzidas pelo C# 6 so compatveis com as plataformas .NET anterirores. No entanto,


esta funcionalidade em particular necessita dos tipos System.Runtime.CompilerServices.FormattableStringFac
tory e System.FormattableString que s foram introduzidos
na verso 4.6 da plataforma. A boa notcia que o compilador no est preso localizao destes tipos numa determinada assembly e, caso se pretenda usar esta funcionalidade
numa verso anterior da plataforma, basta adicionar a implementao destes tipos.

5.1. strings formatveis

6. Expresses nameof

Quando no especificado um provedor de formatao


na invocao do mtodo String.Format, usada a cultura corrente do thread corrente e isso nem sempre o desejado. Por
isso. semelhana do que acontece com as expresses lambda, o compilador traduz a string interpolada de forma diferente
consoante o tipo do recetor da expresso.

Ocasionalmente necessrio providenciar uma string com o


nome de alguns elementos do programa:

var s = $"{p.Name,20} tem {p.Age:D3} ano{{s}}.";


O contedo dos buracos pode ser qualquer expresso,
incluindo strings:
var s = $"{p.Name} tem {p.Age} ano{(p.Age == 1 ?
"" : "s")}.";

Se o recetor da expresso for do tipoI Formattable:

58

Quando
se
uma System.ArgumentNullException

Quando se dispara um evento PropertyChanged.

etc.

lana

C#
AS NOVIDADES DO C# 6

Usar literais string para isto simples, mas sujeito a


erros. Pode haver erros de escrito, ou uma refatorizao do
cdigo pode ter mudado o nome do artefacto.

No uma grande funcionalidade, mas til e, em


termos de implementao do compilador, tratou-se apenas
de remover a verificao da condio que o impedia.

As expresses nameof so uma espcie de literal do


tipo string em que o compilador valida a existncia de algo com
aquele nome. Uma vez que passa a ser uma referncia ao
artefacto, o Visual Studio sabe a que se refere e navegao e
refatorizao do cdigo funcionaro.

8. Inicializadores de ndices

No essencial, cdigo como o seguinte:

A inicializao de objetos e colees so teis para


inicializar declarativamente os campos e propriedades de
objetos ou, no caso das colees, um conjunto inicial de
elementos.
A inicializao de dicionrios, por outro lado, no era
to elegante, obrigando existncia de um mtodo Add que
recebesse como argumento a chave e o valor correspondente a essa chave. Se uma implementao em particular de
dicionrio no tivesse um mtodo Add com as caratersticas
mencionadas, no seria possvel usar um inicializador.

if (x == null) throw new ArgumentNullException


(nameof(x));
var s = nameof(person.Address.ZipCode);
ser convertido em:
if (x == null) throw new ArgumentNullException
("x");
var s = "ZipCode";

A partir de agora, passa a ser possvel usar inicializadores em que so usados indexadores:

6.1. Cdigo fonte vs. metadados

var numbers = new Dictionary<int, string>


{
[7] = "sete",
[9] = "nove",
[13] = "treze"
};

Os nomes usados pelo compilador so os nomes do


cdigo fonte e no os nomes dos metadados dos artefactos,
pelo que, o seguinte cdigo:
using S = System.String;
class C
{
void M<T>(S s)
{
var s1 = nameof(T);
var s2 = nameof(S);
}
}

que sero traduzidos para:


var dictionary = new Dictionary<int, string>();
dictionary[7] = "sete";
dictionary[9] = "nove";
dictionary[13] = "treze";
var numbers = dictionary;
9. Filtros de excees
Os filtros de exceo so uma funcionalidade da CLR
j disponibilizada pelo Visual Basic e pelo F# e que passa
agora a estar disponvel tambm no C#:

convertido em:
using S = System.String;
class C
{
void M<T>(S s)
{
var s1 = "T";
var s2 = "S";
}
}

try
{
...
}
catch (Exception ex) when (SomeFilter(ex))
{
...
}

6.2. Tipos primitivos


No permitida a utilizao de tipos primitivos
(int, long, char, bool, string, etc.) em expresses nameof.

Se a avaliao da expresso entre parntesis a seguir palavra-chave when resultar no valor true, a exceo
apanhada. Caso contrrio, o bloco catch ignorado.

7. Mtodos de extenso Add em inicializadores de colees

Isto permite que sejam definidos mais que um bloco catch para o mesmo tipo de exceo:

Quando os inicializadores de colees foram introduzidos na linguagem C#, os mtods Add chamados no podia ser
mtodos de extenso. O Visual Basic acertou na sua implementao primeira ao permitir a sua utilizao, mas isso parece ter ficado esquecido para o C#.
Nesta verso a falha foi corrigida e possvel agora
usar mtodos de extenso Add em inicializadores de colees.

59

try
{
//...
}
catch (SqlException ex) when (ex.Number == 2)
{
// ...
}
catch (SqlException ex)

C#
AS NOVIDADES DO C# 6
vez de uma lambda) para mtodos de sobrecarga que recebem delegates.

{
// ...
}
No exemplo anterior o primeiro bloco catch apenas
executado se ocorrer um exceo do tipo SqlException em que
o valor da propriedade Number seja 2. Caso contrrio executado o bloco seguinte.
considerado aceitvel e comum o abuso de filtros de
excees com efeitos colaterais, como logging.
ATENO: Os filtros de exceo so executados no contexto do lanamento da exceo (throw) e no do contexto do
seu tratamento (catch).
10. await em blocos catch e finally
No C#5 no era permitida a utilizao da palavrachave await em blocos catch e finally porque, na altura da
implementao da funcionalidade async-await, a equipa pensou que isto no seria possvel implementar. Mas agora descobriram que afinal no era impossvel.

() os melhoramentos e adies das


verses anteriores, tornaro a vida de quem
desenvolve usando a
linguagem de programao C# muito melhor

Passa a ser possvel escrever cdigo como este:


Resource res = null;
try
{
res = await Resource.OpenAsync();
}
catch (ResourceException e)
{
await Resource.LogAsync(res, e);
}
finally
{
if (res != null) await res.CloseAsync();
}

Recursos

New Language Features in C# 6

C# 7 Work List of Features

nterpolated Strings (C# and Visual Basic Reference)

11. Melhorias na resoluo de sobrecarga de mtodos


Foram introduzidas algumas melhorias na resoluo de
sobrecarga de mtodos por forma a tornar mais expetvel a
forma como o compilador decide qual o mtodo de sobrecarga
a usar.
Onde isto se far notar mais (ou deixar de notar) na
escolha de mtodos de sobrecarga que recebam tipos valor nullable. Ou quando se passa um grupo de mtodos (em

AUTOR
Escrito por Paulo Morgado
Bacharel em Engenharia Electrnica e Telecomunicaes (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa e
Licenciado em Engenharia Informtica pela Faculdade de Cincias e Tecnologia da Universidade Nova de Lisboa exerce variadas funes relacionadas com o desenvolvimento, distribuio e manuteno de software h mais de 10 anos. Participa em
diversas comunidades nacionais e internacionais (pontoNETpt, NetPonto, SharePointPT, SQLPort, Portugal-a-Programar, CodeProject, CodePlex, etc.). Pelo seu contributo para com estas comunidades, a Microsoft premeia-o com o prmio MVP (C#) desde 2003. ainda co-autor do livro LINQ Com C# da FCA.

60

Media Partners da Revista PROGRAMAR

Anlises
Introduo ao Cloud Computing
Python Algoritmia e Programao Web
Introduo ao Desenvolvimento de Jogos em Android

Review

Introduo ao Cloud Computing


ta, pois este tema o presente e certamente, ser muito
mais o futuro.

Ttulo: Introduo ao Cloud Computing


Autores: Antnio Miguel Ferreira

Em forma de concluso a linguagem apresentada


permite a todos usufruir da mais valia da informao que
este livro nos fornece. Considero que, a introduo que o
autor fornece no incio de cada captulo se torna essencial, e
uma ferramenta imprescindvel, para que todo o captulo
faa sentido. Nesta pequena leitura, o leitor tem uma perspetiva do que ser abordado, sendo esclarecido, priori acerca de conceitos fundamentais para todo o entendimento da
problemtica que ir ser tratada. Por fim, um livro muitssimo completo, que nos fornece de forma clara, concisa e acima de tudo, descomplicada, uma viso da temtica, permitindo assim, uma maior compreenso da mesma, a fim de garantir uma gesto e utilizao mais rentvel. Desta forma,
acredito ser uma boa leitura de cabeceira, uma vez que nos
trar um aprofundamento da realidade com a qual lidamos, e
no fim subiremos Cloud para um sono revitalizante.

Editora: FCA - Editora de Informtica


Pginas: 200
ISBN: 978-972-722-802-7

O livro Introduo ao Cloud Computing um livro


muito til, no s para programadores, mas essencialmente,
para todos aqueles que procuram um maior conhecimento e
domnio no que ao tema do Cloud Computing diz respeito.
Acredito igualmente, que este extremamente elucidativo
uma vez que, para alm de executar uma abordagem histrica da tecnologia, apresenta-se como uma ferramenta de
extrema importncia para as pretenses tecnolgicas das
organizaes, uma vez que, este livro, no s proporciona
uma perspetiva realista e inovadora do que deve ser feito,
como ainda, redireciona para a soluo que melhor se enquadrar nas organizaes.
Desta forma, um dos captulos com mais interesse,
principalmente devido sua utilidade prtica, que se deve
muito ao facto de ser direcionado, essencialmente para leigos na temtica, foi o captulo 9 Cloud para empresas.
Considero igualmente til e cativante, o capitulo 8 Cloud
para particulares. A abordagem e exemplos prticos, referidos ao longo da leitura, permite ao leitor percecionar o quanto o Cloud Computing faz parte do quotidiano de cada um.
Alis, quando olhei para o livro questionei se este seria direcionado para profissionais da rea ou para leigos na temtica. Aps a leitura, reflexiono que este direcionado e elucidativo para ambos. A leitura revela e demonstra, ao leitor,
que afinal o Cloud Computing est all over, tal como suprime os receios vulgarmente conhecidos dos leitores, que
acreditam que a informao que guardam na Cloud, fica nas
nuvens, e que, como tal, no acarreta qualquer tipo de segurana. As cerejas no topo do bolo, na minha perspetiva,
so os captulos 12 e 13, Benchmarking e Aplicaes de
Sucesso respetivamente. Estes captulos so fulcrais para
rematar quaisquer dvidas sobre as vantagens na aplicabilidade do Cloud Computing e alcanar uma perspetiva futuris-

Cloud Computing
um livro muito til,
no s para programadores, mas essencialmente,
para
todos
aqueles que procuram
um maior conhecimento e domnio no que ao
tema ()

AUTOR
Escrito por Ricardo Castro
Licenciado em Sistemas de Informao para a Gesto, tem na ltima dcada dedicado o seu tempo ao ensino superior e profissional. Com o mestrado em Ensino de TIC e doutorando em Educao Ferramentas Distncia e elearning, dedica maioritariamente o seu tempo ao Instituto de Emprego e Formao Profissional, no entanto, desenvolve funes de consultor de Tecnologias de Informao em instituies pblicas e privadas, sendo administrador de 5 plataformas LMS.

63

Review

Python Algoritmia e Programao Web

Ttulo: Python - Algoritmia e Programao Web


Aps a leitura desta obra, o leitor ter competncias
para desenvolver as suas prprias aplicaes web, utilizando
os conhecimentos adquiridos ao longo do livro.

Autores: Jos Braga de Vasconcelos


Editora: FCA - Editora de Informtica
Pginas: 324

Partindo de princpios simples, como por exemplo, as


estruturas de dados, somos ainda levados no terceiro capitulo, a aprender e/ou recordar alguns dos principais algoritmos
acadmicos, como por exemplo como podemos implementar
uma rvore de pesquisa (BST Binary Search Tree), ou
algoritmos de grafos (O autor aborda alguns algoritmos de
grafos como o DFS Depth-First-Search ou o BFS BreathFirst-Search).

ISBN: 978-972-722-813-3
Para a review desta edio, chegou-me s mos o
livro Python Algoritmia e Programao Web de Jos Braga
Vasconcelos.
Doutorado em Cincias da Computao pela Universidade de York (UK), Jos Vasconcelos, leva-nos, atravs
deste livro, a novos conhecimentos.

No quarto captulo somos levados pelo caminho das


classes e herana, sendo que a parte do Python como linguagem de programao orientada a objecto no foi esquecida sendo claramente explicada neste livro.

Sendo o Python uma linguagem de programao que


cada vez mais se afirma quer no mundo acadmico, quer no
mundo empresarial, este livro pode ser uma boa aposta a
todos os que querem iniciar-se nesta linguagem ou aprofundar conhecimentos.

A partir do quinto captulo, as coisas comeam a


aquecer e iniciamos a descoberta da arquitectura de aplicaes Web, o que permite aos leitores que ainda no estejam
familiarizados com este ramo da tecnologia, possam adquirir
todos os conhecimentos necessrios implementao das
vossas prprias aplicaes web.

Destinado a profissionais e a alunos das reas das


tecnologias de informao, pode tambm ser lido por todo o
pblico em geral que se interesse pelo assunto.
A obra tem como principal objectivo apresentar as
principais tecnologias e tendncias da programao de aplicaes Web utilizando a Linguagem Python.

No stimo captulo so abordadas as principais frameworks web desta tecnologia.


principalmente abordada a framework Django. A
Django utiliza o princpio DRY (Don't Repeat Yourself), onde
faz com que o desenvolvedor aproveite ao mximo o cdigo
j feito, evitando a repetio. tambm referenciada a API
DOM (Document Object Model), uma biblioteca de software
definida pela W3C, que nos permite analisar simultaneamente diferentes elementos num documento XML.

A obra est dividida em 8 capitulos bem estruturados,


que nos levam a aprofundar conhecimentos. um livro de
leitura fcil e pode tanto ser lido por aqueles que nunca utilizaram Python ou pelos profissionais que j tenham os seus
conhecimentos cimentados no assunto.
Os principais captulos desenvolvidos no livro:

Linguagem de programao Python

Algoritmos e estruturas de dados em Python

Programao orientada a objectos em Python

Arquitectura de aplicaes web

Tecnologias de programao web em Python

Web Frameworks

Projecto de software web

Chamo ateno do leitor para o ultimo captulo do


livro, em que somos levados passo a passo a implementar
uma aplicao web. Apartir daqui, munidos do conhecimento
adquirido o limite a imaginao do caro leitor.
O autor disponibiliza ainda no site da FCA, todo o
cdigo relativo aos exemplos explicados no livro.
Em jeito de concluso quero dizer-vos que este livro
um excelente material de estudo e uma boa leitura quer para
quem est a iniciar na rea das tecnologias de informao,
quer para todos os profissionais com experincia.

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.

64

Review

Introduo ao Desenvolvimento de Jogos em Android


e seus componentes principais.

Ttulo: Introduo ao Desenvolvimento de


Jogos em Android

Alm da introduo ao desenvolvimento em Android


o livro aborda temas como API da Google e Motores de jogos, API 2D para Android, libGDX, Unity para Android e Google Play, Servios e Publicao.

Autores: Ricardo Queirs / Alberto Simes


Editora: FCA - Editora de Informtica
Pginas: 274

No captulo 2 feita uma exposio de vrios motores de jogos disponveis no mercado e que podem ser usadas para o desenvolvimento de jogos para as plataformas
mveis, neste caso a plataforma Android. Alm de abordada
a API da Google, so destacados motores de jogos tais como, Unity, Cry Engine, Cocos 2D, Havok Vision Engine, libGDX, Marmalade, Game Salad, GameMaker Studio, Corona SDK entre outros.

ISBN: 978972722807-2

Mveis so atualmente a plataforma mais emergente no que toca ao desenvolvimento de aplicaes de


software, no entanto os dispositivos mveis so orientados a
duas vertentes. Uma delas orientada ao meio profissional,
sendo os dispositivos mveis um excelente complemento ao
trabalho profissional, mas por outro lado a rea do entretenimento ocupa uma grande fatia da utilizao dos dispositivos
mveis na atualidade e exatamente nesta rea que se inserem os Jogos.

Os captulos 3, 4 e 5 abordam a API 2D para Android, libGDX e Unity respetivamente, onde aprofundam alguns dos conceitos fundamentais para desenvolver jogos
usando estas frameworks, com exemplos tericos e prticos
que ajudam a compreender a mecnica do desenvolvimento
de jogos.

O livro Introduo ao Desenvolvimento de Jogos


em Android vem no seguimento de dois outros ttulos lanados por um dos autores, Ricardo Queirs, sendo eles
Android: Introduo ao Desenvolvimento de Aplicaes e
Desenvolvimento de Aplicaes profissionais em Android,
destinando-se aos profissionais da rea do desenvolvimento
de videojogos para plataformas mveis, assim como professores e alunos de disciplinas de computao mvel e desenvolvimento de jogos que necessitem de algum suporte terico e prtico.

Por fim o sexto e ltimo captulo centrado no Google Play, Servios e Publicao, onde explicado e exemplificada a configurao dos servios do Google Play, acesso
API, Leaderboards, Achievements e por fim a publicao na
Play Store.
O contedo de simples leitura e de fcil perceo,
sendo que usada uma linguagem muito user-frendly o
que facilita muito a leitura da obra, no se tornando extremamente tcnica do ponto de vista da linguagem utilizada.

Ao nvel fsico da edio no tenho nada de errado


a apontar, sendo que a tipografia de qualidade permitindo
uma fcil e rpida perceo visual dos contedos abordados.

Como estudante de Engenharia Informtica e sobretudo como curioso e se assim posso chamar de Indie Game
Developer considero o livro Introduo ao Desenvolvimento
de Jogos em Android um livro de qualidade na apresentao dos conceitos introdutrios para quem quer iniciar-se no
desenvolvimento de jogos para a plataforma mvel Android.

A organizao dos contedos foi escolhida mediante a sua importncia e dependncia entre contedos, incluindo exemplos dos vrios motores de jogos disponveis e respetivas consideraes.
Dividido em 6 grandes captulos, as primeiras pginas do livro so orientadas introduo ao desenvolvimento
em Android onde so abordados alguns dos contedos bsicos do desenvolvimento em Android, tal como a criao de
um projeto, estrutura de ficheiros, interface grfica, criao
de um AVD (Android Virtual Device), execuo da aplicao

AUTOR
Escrito por Nuno Santos
Curioso e autodidacta com uma grande paixo pela programao e robtica, frequnta o curso de Engenharia Informtica na
UTAD alimentando o sonho de ainda vir a ser um bom Engenheiro Informtico. Estudante, Blogger, e moderador no frum
Lusorobtica so algumas das suas actividades. Os seus projectos podem ser encontrados em: http://
omundodaprogramacao.com

65

No Code
Big Data: um conjunto de tecnologias imprescindveis no futuro
Windows Hello: A autenticao biomtrica no Windows 10
Windows 10 IOT Core no Raspberry Pi 2 B

No Code

BIG DATA: UM CONJUNTO DE TECNOLOGIAS IMPRESCINDVEIS NO FUTURO

Tecnologias como a Internet, computadores,


smartphones, tablets e sensores esto a mudar o mundo em
que vivemos. Por um lado a massificao destas tecnologias
potencia a digitalizao dos consumidores e das mquinas,
por outro disponibiliza um maior volume de informao para
anlise, levando a uma melhor compreenso de hbitos,
padres e anomalias. Esta a base do Big Data.

Mobilidade.
Na tendncia incremento de produtividade e
eficincia procuramos melhorar a inteligncia operacional
dos sistemas com grandes volumes de dados, conseguir
responder em tempo real e potenciar a transparncia atravs
de uma melhor partilha de dados.
Relativamente ao aumento de conhecimento
potenciamos uma viso abrangente das organizaes
atravs da anlise de dados estruturados e no estruturados,
construmos pontes entre silos e aumentamos as
capacidades analticas atravs de novos modelos que no
so assentes apenas em amostras de dados.

Na digitalizao dos consumidores observamos que 2


em cada 3 pessoas com idades inferiores a 45 anos esto
constantemente ligadas e a desenvolver interaes digitais,
atravs de mltiplos dispositivos e em mltiplos locais. O que
implica uma alterao de hbitos de consumo de media, com
os canais digitais (2.3 horas/dia) a ultrapassarem os antigos
canais de media, nomeadamente televiso (2,2 horas/dia) e
jornais/revistas (0,1 horas/dia), e um incremento da pegada
digital (rasto de informao voluntria e involuntria) nos
diversos sistemas que suportam todos estes servios.

Na vertente de investimento, e para o otimizar,


procuramos uma abordagem open source ao storage e
processamento de forma a torn-los facilmente escalveis, e
pretendemos eliminar infraestrutura redundante e trabalho
duplicado.

Em 2014 registaram-se valores, ao minuto, de 6


novos artigos no Wikipedia, 1.300 novos utilizadores mveis,
100 novas contas no LinkedIn, 20 milhes de fotos vistas no
Flickr, 100 mil novos tweets, 2 milhes de pesquisas no
Google, 6 milhes de consultas no Facebook e 1,3 milhes
de vdeos colocados no YouTube.

Por ltimo, apoiamos a criao de novos e inovadores


servios de negcio assentes na recente capacidade de
explorao, anlise e visualizao de dados.
Para suportar a execuo destes objetivos, o ecossistema
Big Data tem uma proliferao de tecnologias / frameworks
que dividimos em grupos consoante os desafios que
endeream, nomeadamente processamento e storage
distribuda, base de dados no relacionais com baixa
latncia, streaming e processamento de eventos complexos,
processamento de mltiplos tipos de dados, processamento e
base de dados em memria, base de dados analticas e
aplicativos.

A permanncia dos consumidores no mundo digital


obriga as organizaes a estarem sempre presentes. Neste
mundo digital onde os consumidores so bombardeados com
inmeras aes preciso criar sistemas analticos que
analisem o contexto e personalizem as mensagens para os
utilizadores com o objetivo de construir uma relao mais
emocional.

No processamento e storage distribuda englobamos


por exemplo fornecedores como Hadoop, Map Reduce,
Cloudera, Hortonworks, IBM BigInsight e Amazon Elastic
MapReduce Cloud. Promovemos escalabilidade horizontal de
processamento e storage sobre uma variedade de diferentes
infraestruturas, processamento de larga escala muito
eficiente com uma arquitetura share nothing e TCO baixo
devido ao hardware de baixo custo e software open source.

O conceito de Big Data rene as tecnologias,


frameworks e infraestruturas necessrias para guardar,
processar e analisar toda a informao existente no mundo
digital (pegada digital). na Google que surge este conceito
que mais tarde evoluiu para vrias definies (ver Wikipedia
ou Gartner). Para a Accenture, o Big Data consiste na
capacidade e no conjunto de competncias que utilizamos
para mobilizar e gerir um ecossistema com volumes grandes
de dados, internos e externos, de forma a extrair informao
e criar valor diferenciado.

Recorremos a estas tecnologias para armazenar volumes


grandes de dados no seu estgio original, evitando os custos
de aquisio de licenas comerciais, implementar sandboxes
de Business Intelligence de baixo custo, e construir sistemas
de processamento de dados antes do Data Warehouse.

Com o Big Data pretendemos gerar valor atravs do


incremento de produtividade e eficincia, aumento de
conhecimento baseado em dados, melhores retornos de
investimento (ROI), e criao de novos e inovadores servios
de negcio. Observamos seis tendncias para atingir estes
objetivos: Exploso de Dados, Agregao de Dados,
Tecnologia, Monetizao de Dados, Redes Sociais e

No segundo grupo que apelidamos de base de dados no


relacionais contemplamos produtos como Key-Value,
Column-Oriented, Document Databases, Cassandra, Riak,

67

No Code
BIG DATA: UM CONJUNTO DE TECNOLOGIAS IMPRESCINDVEIS NO FUTURO
MongoDB e Redis. Conseguimos com estas tecnologias o

de ingesto e analtica de feeds em tempo real, sistema de


trocas comerciais em tempo real, e processamento em tempo
real de informao de mquinas e sensores.

processamento de grandes volumes a velocidades altas,


ultrapassando os constrangimentos dos sistemas de gesto
de base de dados relacionais, a construo de arquiteturas
de alta resilincia e a modelao dinmica de perfis de
dados.

Por ltimo, no grupo das bases de dados analticas e


aplicativos contemplamos fornecedores como Greenplum
DB, Teradata Aster, Kognitio, Vertica, ParAccel, Sybase IQ,
Netezza, Teradata, Greemplum e Exadata Appliance. Estas
tecnologias destacam-se por serem solues in-a-box com
baixo esforo de manuteno e interfaces para a escrita de
queries complexas de Structured Query Language (SQL).

Temos utilizado este tipo de tecnologias para construir


aplicaes dinmicas de baixa latncia que utilizam dados
semiestruturados e aplicaes web com personalizao
atravs de anlise e atualizaes em tempo real.
No terceiro grupo de tecnologias que apelidamos de
streaming e processamento de eventos complexos
enquadramos os fornecedores GemFire, Espertech,
SenseiDB, Sensage, Zoie, IBM InfoStreams, uCIRRUS,
Flume, Splunk e Sumologic. Estas tecnologias permitem a
ingesto de dados em grande escala para storage e anlise,
consumo contnuo de grandes volumes de dados com
pesquisas em tempo real, e consolidao de eventos em
tempo real e a sua disseminao para um grande nmero de
sistemas cliente.

Este tipo de tecnologias so usadas para analisar de forma


eficiente enormes volumes de dados estruturados,
construo de aplicaes complexas para anlise de dados
estruturados e implementao de grandes Data Warehousing
paralelos.
Em concluso, as tecnologias Big Data permitem s
organizaes receber, processar, guardar e analisar toda a
informao disponibilizada por sistemas e sensores. Esta
informao detalha todas as interaes entre mquinas e
pessoas e necessria para compreender quem, quando,
porqu e para qu, perceber o contexto e personalizar a
interao de forma a construir uma relao emocional com
cada uma das pessoas. Adicionalmente, no contexto de
interaes de mquinas permite-nos perceber situaes
anmalas e prever essas mesmas situaes.

Este tipo de tecnologia permite-nos implementar sistemas de


criao de anncios e promoes em tempo real para portais
online e mobile, e desenvolver sistemas de resposta em
tempo real a eventos com capacidade de adaptao a
alteraes de tipo e formato de dados.
No grupo a que chamamos processamento de mltiplos
tipos de dados identificamos como produtos a MarkLogic,
Neo4j e FlockDB. Este grupo composto por tecnologias
que se caracterizam por base de dados Graph para
processamento de grandes volumes de dados em Extensible
Markup Language (XML). Tecnologias que servem para
implementar sistemas de otimizao de caminhos e para a
pesquisa e anlise de relacionamentos complexos como
graph sociais.

Sabendo que a exploso de dados j comeou e que tem


tendncia para aumentar exponencialmente com a criao de
mais servios no mundo digital (abertura dos sistemas das
organizaes atravs de API), com a penetrao de
dispositivos e com os novos dispositivos ligados (Internet of
Things), fcil antever cada vez mais necessidades de
processamento, storage e anlise de dados.
Este o futuro do IT e so necessrias pessoas com as
competncias certas para compreenderem este cenrio,
conhecerem as tecnologias e que queiram ajudar a resolver
os desafios que o futuro apresentar

No conjunto de tecnologias de processamento e de bases


de dados em memria contemplamos fornecedores como
VoltDB, Applications and Products in Data Processing - High
Performance Analytic Appliance Systems, Applications and
Products (SAP HANA), QlikView, SolidDB, Membase, DRUID
(Metamarkets), Statistical Analysis System (SAS HPA), and
GemFire.
Estas
tecnologias
diferenciam-se
por
processamento de grandes volumes com velocidade, Online
Analytical Processing (OLAP) distribudo e em memria, e
processamento analtico distribudo em memria para
Message Passing Interface (MPI).
Utilizamos este tipo de tecnologia para implementar sistemas

AUTOR
Escrito por Pedro Sarmento
Manager Analytics, Accenture Digital

68

No Code

WINDOWS HELLO: A AUTENTICAO BIOMTRICA NO WINDOWS 10


No Windows 10 o trabalho neste campo foi alvo de
uma maior evoluo, recorrendo agora biometria.
O Windows Hello

Introduo
A Microsoft iniciou a 29 de julho a disponibilizao
escala mundial do Windows 10, e nesta altura, so j os
milhes de utilizadores que possuem os seus PCs atualizados. Como se tem falado nos ltimos meses e tal como j
tive oportunidade de escrever na edio nr. 47 desta revista,
o Windows 10 traz imensas inovaes das quais se destacam o to aguardado Menu Iniciar, o Microsoft Edge e tambm a Cortana.

Em traos gerais, o Windows Hello em conjunto com


o Microsoft Passport, permite o incio de sesso no Windows 10 sem recorrer s tradicionais passwords. Atravs de
uma nova gerao de credenciais e biometria, aliadas tambm a novo hardware, passa a ser possvel iniciar sesso em
qualquer dispositivo, redes empresariais, servios online,
aplicaes, etc.

Para alm de todas as novas funcionalidades que


oferecem uma experincia de utilizao mais familiar e pessoal aos utilizadores, a Microsoft continua a apostar fortemente na segurana do novo Windows atravs de inovaes
como o Windows Hello e o Microsoft Passport.
Nos prximos pargrafos deste artigo, vamos ficar a
conhecer um pouco mais sobre estas funcionalidades e como so mais seguras que as tradicionais passwords.
A evoluo das passwords no Windows
A palavra password algo muito familiar nas nossas
vidas, e diariamente, usamos diversas para manter os nossos dados seguros, aceder ao e-mail, efetuar compras online, aceder rede empresarial e a dados sensveis, etc.
Apesar de utilizarmos passwords complexas, no significa
necessariamente que estamos seguros e cada vez mais,
surgem novas formas de ilicitamente retirar esta informao
aos utilizadores.

Hardware com caractersticas especficas, permite que


os utilizadores usem a face, a ris ou uma impresso digital para desbloquear os seus dispositivos. Estes trs fatores
de autenticao mais a criao de um PIN password, so
certamente mais seguros que a simples password.
Para alm de reconhecer o utilizador, o Windows Hello possui as seguintes funcionalidades:

Considerando ento que a tradicional password j


no to segura como o desejado, inevitvel que comecem a surgir novos tipos de passwords. O Windows 8
exemplo disso e para alm de ser possvel iniciar sesso da
forma tradicional, a Microsoft implementou duas novas alternativas mais seguras a Picture password e o Pin password.

69

Permite configurar o desbloqueio do PC automaticamente ou com uma 2 autenticao.

Autenticao ao nvel empresarial e acesso a contedos que suportem as Next Gen Credentials (NGC).
Exemplo: Acesso a redes empresariais e respetivos
recursos, sites de comparas online, entre outros.

Integra medidas anti-spoofing para mitigar ataques


fsicos, como o acesso a dispositivos e incio de sesso no autorizado. Exemplo: Utilizao de uma foto
impressa ou carto de funcionrio para tentar iniciar
sesso num PC.

Atravs de infravermelhos, consegue obter uma imagem pormenorizada do utilizador nas mais diversas
condies de luminosidade e considera pequenas
alteraes na aparncia como a barba, maquiagem e
culos ou lentes de contato.

No Code
WINDOWS HELLO: A AUTENTICAO BIOMTRICA NO WINDOWS 10

Requisitos de Hardware

Para que seja possvel configurar o Windows Hello,


necessrio possuir algum hardware especial. O mais simples
o leitor de impresso digital e que muitos fabricantes de
PCs j incluem nos seus equipamentos. Se possui um destes equipamentos e j fez o upgrade para o Windows 10,
poder desde j comear a utilizar o Windows Hello.

Lenovo ThinkPad Yoga 15

HP Sprout

Lenovo ThinkPad E550

Asus N551JQ

Asus ROG G771JM

Asus X751LD

Dell Inspiron 23 7000

HP Envy 15t Touch RealSense Laptop


Lenovo B5030

Relativamente a sensores para a ris, ainda no existem muitos detalhes mas com certeza que brevemente comearo a surgir equipamentos para comercializao no mercado.
Configurao

Leitor impresso digital

A configurao do Windows Hello bastante simples


e intuitiva. Imaginando que temos um equipamento que possui um leitor de impresso digital, vamos aceder a
Settings e selecionamos Accounts.

Para o reconhecimento facial, uma simples Webcam


no o suficiente para que o Windows Hello funcione, pois
esta no consegue detetar os detalhes do rosto do utilizador
com a preciso necessria. Para isso necessitamos de uma
cmara que possua tecnologia de infravermelhos que para
alm de recolher com detalhe a fisionomia da nossa face,
permite a utilizao do Windows Hello nas mais variadas
condies de luminosidade.
Uma dessas cmaras, a Creative Intel RealSense
3D DevKit que pode ser adquirida no site da Intel por cerca
de 120 aproximadamente. Recentemente foi tambm atualizado o SDK desta cmara que a torna 100% compatvel com
o Windows Hello e com o desenvolvimento de aplicaes
que usem esta funcionalidade.

Aps este passo, vamos clicar no painel esquerdo


em Sign-in options. No painel do lado direito para alm
das opes habituais (Password, Pin, Picture Password) vamos encontrar o Windows Hello ativo.
Para adicionar uma impresso digital, vamos clicar
em Add e seguir os passos apresentados pelo Wizard.
Ser necessrio repetir o processo algumas vezes para garantir uma leitura correta da impresso digital.
Para alm deste DevKit, j esto a ser comercializados alguns equipamentos com esta tecnologia da Intel dos
quais se destacam:

Dell Inspiron 15 5548

Acer Aspire V 17 Nitro

70

No Code
WINDOWS HELLO: A AUTENTICAO BIOMTRICA NO WINDOWS 10

Estando as configuraes terminadas, os utilizadores


identificam-se atravs deste gesto e o Windows 10 solicita
ao Passport que faa a autenticao dos utilizadores nos
servios ou recursos com acesso protegidos.

Depois de tudo configurado corretamente, o Windows


Hello vai solicitar a nossa impresso digital cada vez que
formos iniciar sesso e tambm nos dar indicaes caso a
impresso no esteja a ser lida com sucesso.

A Microsoft no site TechNet, fornece informao detalhada


sobre o Passport e as suas aplicaes a nvel empresarial
e que podero ser consultadas no seguinte link: Passwordless Authentication with Microsoft Passport.

Segurana dos dados biomtricos


Durante a configurao, o Windows atravs dos dados recolhidos pelos sensores, cria uma representao grfica da biometria que automaticamente encriptada e armazenada localmente no PC. A informao originalmente obtida
como a fotografia da nossa face, impresso digital etc.,
no guardadas pelo Windows nem enviada para qualquer
local fora do dispositivo.

Concluso
Em concluso, a utilizao destes mtodos de autenticao traduz-se numa srie de benefcios, no s porque
simplifica a forma como interagimos com os nossos dispositivos, mas tambm pelo aumento significativo da segurana
das nossas credenciais.

Esta representao grfica vai impedir por exemplo


que imagens reais sejam usadas para tentativas de acesso
ilcito.

A adoo do Windows Hello poder ser adiada por


alguns utilizadores que queiram usar o reconhecimento facial,
considerando o nmero reduzido de equipamentos no mercado que possuem hardware compatvel, ainda assim, poder
desde j ser configurado em PCs que por exemplo possuam
um leitor de impresso digital.

A Microsoft no site do Windows 10, disponibiliza um


conjunto de perguntas e respostas que esclarece estas e
outras questes.
Microsoft Passport
Tal como referi no incio deste artigo, outra inovao
associada segurana do Windows 10 e que pode ser usada em conjunto com o Windows Hello, o nome de cdigo Passport. A Microsoft descreve o Passport como um
sistema de programao que gestores TI, programadores
web e tambm de software, podem usar para tornar a nossa
autenticao mais segura e sem recurso a passwords quando iniciamos sesso em sites ou aplicaes.
O Passport permite a autenticao dos utilizadores
em contas Microsoft, contas do Active Directory e Microsoft Azure Active Directory, ou contas de servios de terceiros que suportem a autenticao Fast ID Online (FIDO). Depois de uma verificao de dois fatores feita
durante o processo inicial de inscrio no Passport, o mesmo
fica configurado no dispositivo e o utilizador ter que definir
um gesto que pode ser uma autenticao biomtrica configurada no Windows Hello ou ento um PIN.

AUTOR
Escrito por Nuno Silva
Microsoft MVP Windows Experience | Microsoft Technical Beta Tester

71

No Code

WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B

Mas esta verso est destinada a Internet-of-Things


(IoT), e existem vrias verses.

Carregador de 5 Volts micro USB com uma amperagem de 1.0 (Carregador de telemvel micro USB);

Carto micro SD class 10 8GB ou superior;

Cabo HDMI;

Cabo de rede Ethernet;

No obrigatrio mas recomendo uma caixa para o


Raspberry Pi 2 B.

Dispositivos
da indstria

Dispositivos
mveis

Pequenos
dispositivos

Desktop
Shell,
aplicaes Win32,
1 GB RAM, 16 GB
de armazenamento.
Shell
Moderno,
Mobile
Chassis
requirement,
512
MB RAM, 4 GB de
armazenamento.
Dispositivos dedicados, ecr opcional, Sem Shell/
armazenamento/
aplicaes, 256MB
RAM, 2GB de armazenamento,
aplicaes universais.

Conectividade de dispositivo integrado

Raspberry Pi 2 B;

Microsoft Azure IoT

Interfaces de utilizador

Para iniciar a instalao do Windows 10 no Raspberry


Pi necessrio o seguinte equipamento para o mesmo:

Visual Studio e UWP

Quando a Microsoft divulgou que seria disponibilizado


o Windows 10 Iot Core para o Raspberry Pi 2 B ficamos a
ganhar um minicomputador com o sistema operativo Windows gratuitamente.

Para descarregar o Windows 10 necessrio aceder


ao
programa
Microsoft
Connect
(https://
connect.microsoft.com/windowsembeddediot/
SelfNomination.aspx?ProgramID=8558) com uma conta Microsoft. Depois de aceder clique em Surveys e ter de aceitar todos os surveys que esto disponveis se estiver de acordo com os termos dos mesmos.

Este no o primeiro sistema operativo da Microsoft


para IoT j existiam outros, como por exemplo o Windows
8.1 para o Intel Galileo que uma placa concorrente ao
Raspberry.
A IoT e a utilizao de componentes fsicos e eletrnicos de medida, controle e no s que esto ligados a Internet. Por exemplo numa estufa no necessrio ir a um local
X em X horas para controlar a temperatura, com a comunicao machine-to-machine (M2M) os dados da estufa so enviados para uma base de dados utilizando a Internet e os mesmos dados podem ser consultados por outras mquinas.

Aps aceitar todos os survey clique em Downloads


selecione Windows 10 IoT Core Insider Preview Image for
Raspberry Pi 2. Antes de clicar no boto Download selecione a localizao mais prxima para que o mesmo seja mais
rpido. possvel fazer o Download de duas formas, direto
clicando em Download na coluna Download single file a
outa atravs de um gestor de transferncia de ficheiros
selecionado os ficheiros que se pretende na caixa de seleo
e a seguir clicando no boto azul Download

O Raspberry Pi 2 B exatamente igual a Raspberry


Pi B+. Sobre a evoluo do Raspberry Pi convido-o a ler o
artigo Raspberry Pi2 Evoluo ou Revoluo? da Rita
Peres publicado na edio n 48 de Maro de 2015.

Ilustrao 1 Raspberry Pi B+ e Raspberry Pi 2 B

72

No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B

utilizar o Windows 7, como a verso est desatualizada e


assim necessrio instalar o Microsoft Windows Assessment
and Deployment Kit (ADK) para Windows 10 (http://
go.microsoft.com/fwlink/p/?LinkId=526740).

Ao concluir o Download necessrio extrair o seu


contedo para uma pasta, recomendo a criao de uma pasta temporria na raiz do disco, por exemplo temp a mesma
contem o ficheiro Flash.ffu que a imagem do Windows 10
a ser transferida para o carto SD.

Na instalao do ADK no so necessrios todos os


componentes selecione apenas os seguintes: Deployment
Tools e Flashing Tools.

Antes de colocar o Windows 10 no carto SD recomendo a formatao do mesmo e prara tal utilize a aplicao
SDFormatter
(https://www.sdcard.org/downloads/
formatter_4/) esta aplicao gratuita e permite formatar
cartes de memria SA, SDHC e SDXC. Com o carto formatado inicia-se a Linha de comandos do Windows com opes administrativas, antes de clicar na aplicao Linha de
comandos no menu iniciar clique uma vez com o boto direito do rato e selecione a opo Executar como administrador.
No Windows 7 a 64 bits execute o seguinte comando
cd C:\Program Files (x86)\Windows Kits\10\Assessment and
Deployment Kit\Deployment Tools\amd64\DISM.
No Window7 a 32 bits execute o seguinte comando
cd C:\Program Files (x86)\Windows Kits\10\Assessment and
Deployment Kit\Deployment Tools\x86\DISM
No Windows 8 ou superior no necessrio qualquer
comando.

Ligue o carto de memria SD no computador e execute o seguinte comando wmic diskdrive list brief que vai
identificar todos os sistemas de armazenamento que esto
ligados no computador. A seguinte imagem mostra que o
carto SD est ligado a um leitor de cartes e que o mesmo
est identificado como Device 1.

Para transferir a imagem execute o seguinte comando:


dism.exe /Apply-Image /ImageFile:[localizao da pasta]
Flash.ffu /ApplyDrive:\\.\PhysicalDrive[numero da unidade] /
SkipPlatformCheck
Na seguinte imagem est a ser utilizado o Windows 7
a 64 bits com o ADK a localizao do ficheiro est na raiz da
unidade C na pasta temp e o carto SD est identificado
como unidade 1.

Para transferir a imagem do Windows 10 para o carto SD utilizada a aplicao Microsoft Deployment Image
Servicing and Management (DISM). Esta aplicao uma
ferramenta de implementao de imagens a mesma tambm utilizada para implementar a instalao do Windows
em USB flash drive (Pen drive).

Ao finalizar a transferncia da imagem j pode colocar


o carto SD no Raspberry e ligar o mesmo.

O DISM j se encontra instalada no Windows mas se

73

No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B

Administrator e a palavra passe p@ssw0rd.

A primeira informao que o Raspberry vai mostrar


que est a inciar Graphics Console Started

A primeira inicializao do Windows pode demorar


alguns minutos e at carregar completamente ir ver o logotipo do Windows 10, s depois um segundo logotipo.

Por fim quando carregar completamente o Windows


ir mostrar informao com o nome da mquina e endereo
IP em que est configurado.
Por navegador de Internet podemos desligar ou reiniciar o equipamento, instalar ou retirar aplicaes, ver a performance. Por FTP podemos consultar, inserir, modificar e
apagar ficheiros. Por PowerShell podemos fazer a gesto.
Para fazer a gesto por PowerShell recomendo a utilizao da aplicao grfica PowerShell Integrated Scripting
Environment (ISE) que est includo no Windows Management Framework 3.0 (https://www.microsoft.com/en-us/
download/details.aspx?id=34595) aps a instalao o PowerShell ISE est disponvel no menu iniciar, inicie o mesmo
com privilgios administrativos a mesma opo utilizado
quando foi executado a Linha de comandos.

Para executar comandos remotamente necessrio


executar o seguinte script

Com o Raspberry completamente ligado pode verificar


que no existe nenhum sistema de janelas como nas verses de trabalho do Windows. Assim possvel reduzir o
consumo de recursos utilizados. Isto j acontece com o Windows Server 2012 em que um administrador de sistema pode
instalar um novo servidor sem Graphical user interface (GUI)
e fazer toda administrao por PowerShell conseguindo assim mais performance.

net start WinRM


Set-Item WSMan:\localhost\Client\TrustedHosts Value MINWINPC
remove-module psreadline -force
Enter-PsSession -ComputerName MINWINPC -Credential
MINWINPC\Administrator
Ao executar o script ser solicitado a palavra passe do administrador e por fim feita a ligao remota.

possvel aceder ao Windows no Raspberry de trs


formas. Por navegador de internet, FTP ou PowerShell atravs do endereo de IP. O nome de utilizador por defeito

74

No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B

Uma lista de comandos para PowerShell est disponvel no


Windows Dev Center ( https://ms-iot.github.io/content/en-US/
win10/tools/CommandLineUtils.htm).
Acho excelente que a Microsoft continue a apostar no
IoT fornecendo uma verso completamente gratuita que permita ao programador interagir com o Hardware conseguindose assim um modelo de prototipagem em que pode trabalhar
diretamente com sensores e outros componentes eletrnicos.
Com convergncia de todos os sistemas operativos da
Microsoft para uma s plataforma conseguimos criar aplicaes universais no s compactveis com pequenos dispositivos mas tambm com equipamentos mveis ou industriais.

Com a ligao efetuada agora pode-se inserir qualquer comando diretamente na subjanela abaixo. A primeira
recomendao alterar a palavra passe. Para alterar insira o
seguinte comando net user Administrator [nova palavra passe] .

Ilustrao 2 IOT201 - Building Devices with Windows 10 IoT


Temos tambm mais vantagens com o Raspberry Pi 2
B + Windows 10 conseguimos ter uma forma de aprender a
fazer script em PowerShell e a Microsoft continua a inovar e
melhorar os seus servios em nuvem com o Microsoft Azure
(http://azure.microsoft.com/pt-pt/) a mesma j disponibiliza
um grande conjunto de servios para IOT para poder receber
e processar a informao recolhida dos dispositivos.
Apos a confirmao do comando anterior necessrio executar o seguinte comando schtasks /Delete /TN Microsoft\Windows\IoT\Startup /F este comando apenas executado uma vez.
Se quiser a identificao do equipamento o comando
set computername [novo nome] para assumir a alterao
necessrio reiniciar o comando shutdown /r /t 0.
Ilustrao 3 Microsoft Azure IoT (Build 2015)

Apartir agora o Windows 10 no Raspberry Pi 2 B est


pronto a ser utlizado pode experimentar as demostraes
disponveis na documentao disponvel no Windows Dev
Center
(http://ms-iot.github.io/content/en-US/win10/
StartCoding.htm).

Os ficheiros de PowerShell no do GitHub em: https://


github.com/rramoscabral/PowerShell/tree/master/
Windows_10/Iot

AUTOR
Escrito por Ricardo Cabral
Licenciado em Engenharia Informtica pela Universidade Autnoma de Lisboa. O seu twitter @rramoscabral

75

No Code

E QUE VENHAM MAIS 50 EDIES!

E eis caros leitores, que chegamos ao fim de mais


uma edio da nossa PROGRAMAR. Esta uma edio
especial para todos ns e esperamos que tambm o seja
para todos vs que nos lem e seguem edio aps edio.

registada na base de dados do Centro Internacional de ISSN,


sendo o nmero de referncia o ISSN 1647-0710. Esta referencia hoje, reconhecida em todo o mundo.
Como todos os que nos lem sabem, somos um projecto sem fins lucrativos, todos ns somos voluntrios, e cedemos de bom grado, algumas horas da nossa prpria vida
para dar continuidade a um projecto nico em muitas vertentes.

Nunca ser demais dizer-vos, e agradecer-vos, a


vossa presena. A cada download. A cada visualizao.
Chegados quinquagsima edio, aqui na PROGRAMAR aproveitamos a ocasio para recordar um pouco o
passado. Um passado recente, construdo pgina por pgina.

Nunca demasiado recordar que todos podem ser


autores da Programar. A revista de todos, feita por iguais.

A primeira edio, foi lanada em Maro de 2006, h


nove anos e seis meses atrs. Na altura a equipa estava
ainda longe de saber o sucesso que esta pequena grande
publicao teria.

A PROGRAMAR UM PROJETO DE TODOS E PARA TODOS


Ao longo destes anos, tivemos vrios artigos, sendo
eles das mais variadas temticas. Tivemos e temos colunas
residentes, que consideramos serem uma mais valia a esta
publicao.
Ao longo da histria da revista, 548 artigos foram publicados e 183 autores colaboraram connosco, mais concretamente 10 autoras e 173 autores.

Artigo aps artigo, nmero aps nmero, foram muitos os que se juntaram a este projecto, participando nele
quer como autores, quer como colaboradores da revista. At
data cerca de 180 pessoas j colaboraram neste projecto.
Um projecto que sendo pequeno, se tornou enorme. Sendo
a nica revista portuguesa de programao. E disponibilizada de forma gratuita a todos os interessados.

Como este um projecto de todos para todos, e queremos que os leitores interajam, h vrias edies que so
votados os 3 melhores artigos, sendo o prmio uma t-shirt do
P@P. Esta votao aberta e feita pelos leitores que assim o
queiram.
Em Maio de 2014, foi relanado o nosso site, em formato blog-post. Neste momento a revista disponibilizada
nesse formato, e claro, no tradicional formato pdf.

J ultrapassamos os 500 artigos publicados. Um nmero que ser sempre maior a cada edio lanada.
As estatsticas revelam que em mdia, cada edio
tem cerca de 18.950 downloads.

Os leitores mais atentos recordam que apesar de neste momento sermos uma publicao trimestral, j fomos uma
publicao bimensal.

18950 x 49 edies 92.8550 downloads

Contudo, se tivermos mais artigos, mais qualidade,


poderemos voltar a ser uma publicao bimensal. Mais uma
vez defendemos, que o poder de tornar este projecto maior,
est em cada um de vs. No pensem que no tm qualidade para escrever, que no sabem de que tema escrever, ou
que no tm nada para apresentar. Desenvolvam uma ideia,
e criem asas ao vosso artigo.

Claro que secretamente todos ns esperamos que a


edio 50 seja a edio com mais downloads de todas. Mas
afinal, no para isso que trabalhamos a cada nova edio?
Voltando s datas, em Setembro de 2008, a revista foi
finalmente reconhecida e

76

No Code
Num futuro prximo, que passam pelas ideias da

Porque ns, PROGRAMADORES, somos gente de


ideias, e no desistimos!

equipa:

Desenvolver app cliente da revista cross-platform

Formato .iba (iTMS)

Por isso e por muito mais PROGRAMAR ontem,


hoje e amanh!

Contudo, estamos sempre abertos a novas ideias.


Juntos seremos mais e melhores.

s prximas 50 edies!...

77

No Code

78

No Code

79

No Code

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.

80

No Code

PROJECTO EM DESTAQUE NA COMUNIDADE P@P: REACH FOR 24


indivduo em cada fase em que se encontra. A utilizao
coerente dos jogos de acordo com objectivos, explorando o
ldico, uma forma inteligente e criativa de promover a
superao de obstculos na aprendizagem da matemtica.

O Reach for 24 um jogo matemtico que desafia a


destreza e rapidez de raciocnio. O seu objectivo consiste
em, atravs da utilizao de todos os nmeros mostrados,
em apenas uma tentativa, atingir o nmero 24 utilizando as
operaes aritmticas de soma, subtraco, diviso e
multiplicao.

Por exemplo, o ensino da matemtica por meio de


jogos, pode transformar as actividades matemticas que, s
vezes, causam ansiedade e sofrimento a muitos alunos, em
fonte de satisfao, motivao e interaco social.

Uma boa maneira de manter a calculadora cerebral


em forma.

Da autoria de Tiago Rodrigues, desenvolvido em


Delphi , utilizando o FireMonkey , vai j na verso 1.1.0,
tendo sido actualizado pela ltima vez a 23 de Julho de 2015.

Na actualidade, pesquisadores, estudiosos e


profissionais da educao que buscam criar situaes
desafiadoras e significativas para a construo de
conhecimentos concebem os jogos como estratgias
pedaggicas favorveis, inclusive para a construo de
conceitos matemticos.

Para poder funcionar plenamente requer um sistema


operativo Android 2.3 ou superior, ocupando 7,2 MB. Poder
ter
experimentado
algumas
dificuldades
de
com
processadores INTEL devido tecnologia usada no
desenvolvimento, mas tal j no ser verifica a partir da verso
Android 4.4.

Segundo Kishimoto (2007), os jogos esto j


vinculados nos pensamentos humanos desde a infncia
mesmo que no nos apercebamos, porque a criana cria
suas prprias fantasias atravs de brinquedos ligados ao seu
quotidiano familiar.

Ocupa uma classificao PEGI3 de acordo com a


Classificao de PEGI (Pan European Game Information,
informao pan-europeia sobre jogos).

Segundo Montessori (1965), trabalhar com os jogos


nos primeiros anos, uma tcnica que facilita o
desenvolvimento do indivduo. Atravs da utilizao de jogos
no ensino da matemtica, criada a possibilidades de
oferecer vrias opes para desenvolver as capacidades do

81

Elege o melhor artigo desta edio


Revista PROGRAMAR
http://bit.do/ProgramarED50_V

Veja tambm as edies anteriores da


Revista PROGRAMAR
46 Edio - Setenmbro 2014

44 Edio - Fevereiro 2014

43 Edio - Dezembro 2013

45 Edio - Maio 2014

47 Edio - Dezembro 2014

48 Edio - Maro 2015

e muito mais em
www.revista-programar.info

You might also like