Você está na página 1de 84

EDITORIAL

Conectando os pontos
EQUIPA PROGRAMAR

Coordenador
Antnio Pedro Cunha Santos 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
Editor dizer milhares de litros de caf, uma imensido de linhas de cdigo, de desafios, de
Antnio Pedro Cunha Santos esforos de problemas e solues.
At aqui, passaram cinquenta edies da revista, passaram nove anos, a
Design tecnologia reinventou-se sucessivamente! Nestes nove anos, cinquenta edies
Srgio Alves apareceram dispositivos que revolucionaram a maneira como lemos, agora nos to
Twitter: @scorpion_blood habituais tablets, que em 2009 viram a sua popularidade entrar num ritmo
desenfreado e de certa forma massificaram a leitura em formato digital, num
Ilustrao tamanho de ecr mais confortvel. Foram criadas novas linguagens de
Sara Freixo programao, novas ferramentas, novos ides, vrias verses de sistemas
operativos, acompanhamos os pequenos tornarem-se grandes como o j muitas
Redaco vezes falado Raspberry Pi, que tem vindo a tornar-se mais popular.
Andr Vala
Fugindo tentao das frases feitas, esta edio foi propositadamente
Antnio Pedro Cunha Santos
lanada no ducentsimo quinquagsimo sexto dia do ano, o dia do programador.
Antnio Pereira
Assim escolhido por como todos sabemos 255 ser 28 , o maior nmero inteiro
Joo Pedro Martins
representvel com 8 bits, oito pequenos zeros e uns, que so os blocos de
Nuno Caneco
Nuno Santos construo de todo um mundo, escrito pedao a pedao, bit a bit, por todos quantos
Nuno Silva programam. Os que constroem o mundo de bits e bytes, que nos rodeia a todos e
Patrcio Domingues que por todos construdo, bit a bit, linha a linha, a brincar s escondidas com o
Paulo Morgado ponto e virgula ( ; ), o mestre do jogo do esconde, desde 1972, de tantas vezes
Pedro Sarmento que consome horas procura da linha onde por algum acaso falhou ao digitar o
Ricardo Cabral ponto e vrgula cuja falta provoca um erro.
Ricardo Castro Nesta edio no poderia deixar de dar os parabns a todos aqueles que
Rita Peres lem a revista, a todos aqueles que nela participam, mas tambm e com entusiasmo,
Sara Silva a todos aqueles que programam! Esta a quinquagsima edio, mas hoje, estamos
Tnia Valente
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
Staff
outra todos somos programadores e aos leitores da revista! Programadores, futuros
Antnio Pedro Cunha Santos
programadores, mestres e aprendizes, entusiastas e menos entusiasmados! A todos
Rita Peres
os que lem a revista, e quando a lerem mesmo depois do 256 dia do ano, se vo rir
Rui Gonalves
Sara Freixo ao ler este editorial e perceber que desta vez, no foi um atraso na publicao, no
Tiago Sousa 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,
Contacto que programam, que se dedicam a esta magia, que PROGRAMAR.
revistaprogramar@portugal-a- At prxima, agradeo-vos a todos por lerem a revista, que esta pequena-
programar.org grande equipe vos traz.

Website
http://www.revista-programar.info 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.

2
NDICE
TEMA DE CAPA
6 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

3
NOTICIAS
O mundo da inteligncia

Ferramenta desenvolvida
artificial debate-se em Co- na UC diminui os custos
imbra do processo de estampa-
Entre os dias 8 e 11 de Setembro, no Departa-
mento de Matemtica da Universidade de Coimbra o Encontro
gem na indstria autom-
Portugus de Inteligncia Artificial (EPIA). Conta com a parti-
cipao do bilogo e fsico Ricard Sol, autor de Vidas Sint- vel
ticas, obra que aborda um vasto conjunto de questes desen-
cadeadasa pelo desenvolvimento no campo da I. A., nomea- Diogo Neto, do Centro de Engenharia Mecnica da
damente biologia sinttica e vida artificial. Tambm contar Universidade de Coimbra, venceu o Prmio Melhor Tese de
com as participaes de Helder Coelho, um dos pais da inte- Doutoramento em Mecnica Aplicada e Computacional de
ligncia artificial em Portugal, e Franois Pachet, diretor do 2014 atribudo pela Associao Portuguesa de Mecnica
Laboratrio de Informtica da SONY em Paris. Terica, Aplicada e Computacional, com um estudo que per-
mite diminuir os custos do processo de estampagem na
Este encontro rene mais de uma centena de investi-
indstria automvel.
gadores e acadmicos de todo o mundo.
Este trabalho teve como resultado uma ferramenta
Nestes quatro dias debater-se- a evoluo e a con-
computacional de apoio ao projecto de conformao de cha-
solidao do conhecimento na rea da inteligncia artifi-
pas metlicas, processo largamente utilizado na industria au-
cial, bem como as implicaes geradas por essa evoluo
tomvel.
e os limites que se devem impor aplicao da intelign-
cia artificial. Esta soluo optimiza esse processo, reduzindo o tem-
po e custos de produo.
Em destaque estaro as novas tendncias da investi-
gao neste campo do conhecimento e a discusso de reas Segundo Diogo Neto, Devido crescente competiti-
emergentes como Aprendizagem Profunda, uma das mais vidade internacional, o projeto e conceo virtual deste
revolucionrias e promissoras tcnicas para dar mais tipo de processos recorre cada vez mais a ferramentas
inteligncia aos computadores. computacionais, onde as tcnicas avanadas de modela-
o em computador substituem os dispendiosos testes
Segundo Francisco Baptista Pereira e Penousal Ma-
experimentais. Deste modo, os modelos numricos de-
chado, investigadores do Centro de Informtica e Sistemas da
senvolvidos e implementados num programa de elemen-
Universidade de Coimbra (CISUC) e responsveis pela orga-
tos finitos (DD3IMP) permitem fazer a simulao completa
nizao do encontro, apesar dos desafios que ainda tem
deste processo tecnolgico com grande preciso e rigor,
pela frente, a distncia entre a realidade e a fico poder
permitindo acelerar a fase de projeto e consequentemente
ser ultrapassada a mdio prazo.
diminuir os seus custos.
Os investigadores acreditam que no futuro, a inteli-
Com vrias parcerias com a industria automvel, in-
gncia artificial ter um papel muito importante na resolu-
dstria metalomecnica e empresas de software em mecnica
o de grandes problemas do mundo. A cincia tem per-
computacional, entre outras, o CEMUC participa em vrias
mitido avanos muito significativos na construo de
redes de investigao nacionais e internacionais.
mundos artificiais em reas muito distintas como, por
exemplo, medicina, robtica, ambiente e inteligncia de A transferncia do conhecimento para a socieda-
negcio. de pauta a atividade cientfica do CEMUC e, por isso, o
reconhecimento pblico do trabalho desenvolvido neste
O programa do Encontro Portugus de Inteligncia
centro de investigao a confirmao de que se encon-
Artificial est disponvel em: http://epia2015.dei.uc.pt/program/
tra no bom caminho e um incentivo para continuar numa
Fonte: Press Release da UC remetido redaco da Revista rota sustentada de criao e transferncia de conheci-
Programar. mento, contribuindo deste modo para o cumprimento da
misso da Universidade de Coimbra, sublinha Lus Mene-
zes, que em conjunto com Marta Oliveira, orientou a investiga-
o.

Fonte: Press Release da UC remetido redaco da Revista


Programar.

4
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
Introduo por exemplo as promessas no cumpridas de padres como
o BPEL ou o UDDI, e a complexidade de normas como WS-
Em Maro de 2015 a Microsoft anunciou o Azure App Trust ou WS-Federation), como com a prpria evoluo natu-
Service, uma evoluo da oferta aplicacional Azure que fun- ral da Web e a adopo de formatos mais simples e abertos
de dois servios existentes - Web Sites e Mobile Services - como REST ou JSON.
com dois novos servios: as Logic Apps, destinadas ao
desenvolvimento rpido e visual de processos de negcio, e Nos ltimos dois anos esta Histria tem mais um ca-
as API Apps que encapsulam funcionalidades autnomas ptulo, a noo de Microservios. Construindo sobre as
reutilizveis, consistindo ambos numa concretizao tecnol- ideias anteriores e popularizada mais recentemente por pes-
gica de uma arquitectura baseada em Microservios. soas como Martin Fowler, as principais diferenas face ao
SOA talvez sejam a granularidade de cada servio, que ago-
O objectivo deste artigo apresentar as Logic Apps, ra se entendem frequentemente como devendo ser mais
tanto em termos do seu contexto e arquitectura, como na atmicos e simples, como a utilizao de padres CRUD
utilizao concreta e simbiose com as API Apps. sobre HTTP/REST. Os servios continuam a ser indepen-
Contexto dentes entre si (podendo ser desenvolvidos sobre qualquer
tecnologia), e a dever estar organizados em torno de concei-
O caminho que nos traz s Logic Apps comeou tos ou operaes relevantes para o negcio.
muito antes de Maro de 2015.
Uma materializao desta abordagem de Microservi-
Com o surgimento da chamada Web 2.0, um termo os no espao de consumidor final o IFTTT (If this then
popularizado em 2004, surgiu igualmente o conceito de that, https://ifttt.com/). Este sistema, usado tipicamente via
mashup. Baseado na utilizao de padres e tecnologias apps para telemvel, permite a criao de pequenos
web (como HTTP, REST, XML, RSS/Atom e Ajax), um workflows (receitas), em que caso se verifique uma deter-
mashup uma aplicao web que combina contedo de minada condio monitorizada pelo IFTTT, despoletado um
vrias fontes e APIs para criar um novo servio, com essa evento/aco de resposta. Alguns exemplos seriam: sempre
combinao a ser feita tipicamente num web browser. Exem- que um determinado utilizador colocar uma foto nova para o
plos clssicos deste tipo de aplicaes envolvem enriqueci- Instagram, grav-la para o OneDrive; sempre que receber
mento de mapas geogrficos como novas camadas de infor- um email marcado como Urgente, enviar um SMS para um
mao: fotos tiradas em cada local, localizao de farmcias determinado nmero, etc. O nmero de aces disponveis
ou hotis, local onde foram feitas as ltimas compras em muito elevado, e cada uma delas pode ser vista como um
sites de comrcio electrnico. Um cenrio de Presentation microservio.
Integration, portanto.

Um termo relacionado surgido pouco depois foi o de


Service-Oriented Architecture (SOA). Aplicvel principal- No mundo Microsoft, e depois de uma Histria que
mente a cenrios empresariais, um padro de arquitectura inclui actores como o BizTalk Server, Azure Service Bus,
- ou filosofia de desenho de aplicaes, para alguns - segun- Windows Workflow Foundation, e todo um foco em evoluir as
do o qual uma aplicao montada pela composio de tecnologias para abordagens cloud, foram pr-apresentados
servios autnomos que encapsulam lgica e que podem ser no Integrate 2014 em Redmond os BizTalk Microservices,
acedidos usando mecanismos e formatos padro (o SOAP e componentes atmicos cloud-based utilizveis para integra-
o WSDL so normas intimamente ligadas materializao o de sistemas, a que estava associado um motor de
de arquitecturas SOA). Uma das ideias geralmente associa- Workflow e uma ferramenta de modelao de processos web
da a SOA a de que os servios tm granularidade elevada, -based.
ou seja, os servios devem encapsular muita funcionalidade Finalmente, com o anncio de Maro de 2015 tornou-
e no ser chamadas atmicas do tipo Create-Read-Update- se finalmente pblico o quadro todo: as API Apps
Delete, dado que so operaes pesadas (desde a serializa- (apresentadas no artigo Criar uma API no Azure App Sevi-
o de/para XML ao transporte pela rede). Este tipo de arqui- ce de Guilherme Ferreira na revista PROGRAMAR n 49 de
tecturas tem como dois dos grandes atractivos a criao de Junho 2015) so a implementao da Microsoft do conceito
aplicaes loosely-coupled e em que existe um ganho pela de Microservios, e as Logic Apps a forma de os orquestrar
reutilizao de servios existentes. 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-

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

Como referido, as Logic Apps so uma das compo- Apresentam-se de seguida dois exemplos de Logic
nentes do Azure App Service, e o seu objectivo permitir a Apps criadas com actions disponibilizadas nativamente. Para
automao de processos de negcio ou workflows, realizan- exemplos passo-a-passo recomenda-se a consulta da docu-
do uma modelao grfica dos mesmos. Ao contrrio de mentao em https://azure.microsoft.com/en-us/
abordagens como o IFTTT, os destinatrios principais so documentation/services/app-service/logic/ .
tanto o mercado empresarial/start-ups como utilizadores com
A figura abaixo apresenta provavelmente o que o
know-how tcnico ou programadores.
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 integra-
o 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 Esta Logic App composta apenas por duas aces,
um registo novo numa determinada tabela SQL) ou a pedido ambas utilizaes de uma API App que permite fazer pedi-
(ex: invocao de uma Logic App via pedido HTTP, como se dos HTTP.
fosse um Web Service).
A primeira uma aco de HTTP/Get, que a cada minuto faz
Actions de uma forma genrica, uma Action um um pedido HTTP a -um URL configurado (no caso, http://
passo do workflow, executada numa sequncia depois de www.example.com), e obtm tanto o contedo HTML da
uma Logic App ser iniciada via trigger. As actions so essen- pgina (body) da resposta como os cabealhos HTTP
cialmente API Apps, sendo que se podem tanto usar as dis-
(headers). A segunda aco um HTTP/Post, em que se
ponibilizadas pela Microsoft como simplesmente ser desen-
envia a informao obtida no HTTP/Get anterior como corpo
volvidas medida em Net/C#. De entre as primeiras (ver lista do pedido para um servio gratuito (http://requestb.in) que
completa em https://azure.microsoft.com/en-us/ por sua vez permite consultar o que est a receber via HTTP
documentation/articles/app-service-logic-connectors-list/), por Post.
vezes chamadas Connectors na documentao, existem
dois tipos: as Standard que oferecem funcionalidades co- De notar que a configurao de que o resultado da 1
mo integrao com Facebook, Office 365, SQL, FTP, Share- aco deve ser usado como input da 2 feito via uma drop-
Point/Yammer, Salesforce ou Twitter, e as Premium que se down que apresenta todos valores possveis de utilizar, no
destinam a cenrios de integrao de sistemas e so prove- sendo necessrio regra geral a introduo de texto. Quando
nientes da oferta de BizTalk Services. Estas ltimas incluem se faz esta escolha, a representao textual interna substitui
potencialidades de processamento de EDI/AS2, EDIFACT, a dropdown (no caso acima, @triggers().output.body).
mapeamentos JSON-XML, validao de formatos de mensa- A imagem acima um screenshot retirado do novo
gem, ou integrao com Informix, WebSphere MQ, Oracle ou Portal de Azure (http://portal.azure.com), onde so efectua-
SAP, entre outras. A utilizao de actions Premium tem re- das as operaes realizadas tanto com Logic Apps como
quisitos adicionais em termos de subscrio Azure e respec- com API Apps. Alm do designer visual na parte central, so
tivos custos. visveis as opes de topo do editor (onde se inclui uma op-
Internamente, as Logic Apps dependem de mdulos o Code View que permite consultar a especificao do
j existentes em Azure como sejam as WebApps e o Resour- processo em formato JSON passvel de armazenamento em
ce Manager, que ficam fora do mbito deste artigo. source control), como a paleta de API Apps do lado direito,

7
TEMA DA CAPA
AZURE LOGIC APPS: O FUTURO DOS BACKENDS?
onde se vm algumas das dezenas de opes j dispon- No caso anterior, possvel por exemplo indicar que
veis. esta aco apenas executada caso se verifique uma deter-
minada condio, ou que se pretende iterar a sua utilizao
A figura abaixo apresenta um exemplo um pouco
sobre uma lista de itens de informao.
mais complexo que o anterior.
A figura abaixo apresenta um excerto da Code View,
mostrando o JSON que representa a Logic App descrita aci-
ma. 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
},
No exemplo acima so usadas 4 aces: "type": "Recurrence"
}
Recurrence aco de trigger da Logic App, indica que },
a mesma vai ser executada a cada minuto. "actions": {
"twitterconnector": {
Twitter Connector procura no Twitter por algum texto "type": "ApiApp",
"inputs": {
(no caso, Philae). Quando se adiciona esta action "apiVersion": "2015-01-14",
necessrio realizar autenticao no Twitter, que "host": {
fica guardada internamente Logic App. "id": "/subscriptions/00000000-
0000-0000-0000-1234567890ab/resourceGroups/
Dropbox Connector action que pega no resultado da DevTechRefreshLisboa2015/providers/
Microsoft.AppService/apiApps/
aco de Twitter e cria um ficheiro numa conta TwitterConnector",
Dropbox com o contedo do tweet encontrado. Tal "gateway": "https://
Devtechrefreshlisboa
como no caso do HTTP/Post no exemplo anterior, 012345678909834b42198fd4b593463ced8b.
esta aco tem uma dependncia criada implicita- azurewebsites.net"
mente pelo facto de usar dados de outra aco, },
"operation": "SearchTweets",
sendo tambm necessrio como no caso da acti- "parameters": {
on de Twitter - fazer autenticao no Dropbox. "Query": "philae",
"MaxResults": 20
Office365 Connector action que pega no resultado da },
aco de Twitter e envia um email para o endereo "authentication": {
"type": "Raw",
configurado, com o contedo do tweet. Mais uma "scheme": "Zumo",
vez, necessrio fazer autenticao no servio "parameter": "@parameters('/
(agora o Office 365) quando se usa esta aco. subscriptions/00000000-0000-0000-0000-
1234567890ab/resourceGroups/
DevTechRefreshLisboa2015/providers/
Cada uma das aces anterior tem opes de refina- Microsoft.AppService/apiApps/TwitterConnector/
mento que permitem especificar comportamento mais com- token')"
plexo, que so acessveis atravs do boto de reticncias no }
},
seu canto superior direito. "conditions": []
},
"dropboxconnector": {
"type": "ApiApp",
"inputs": {
Um dos pontos mais curiosos das Logic Apps a
forma como lidam com controlo de fluxo. Por omisso, to-
das 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 cria-
do implicitamente com base em dependncias de dados.
Assim, se a aco B depende da aco A, B vai ser

8
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) ()Azure App Ser-
dependncia de dados; c) execuo condicionada a uma
condio; d) repetio sobre lista. Uma outra action disponi- vice, uma evoluo da
bilizada, o Wait, pode igualmente ser utilizada neste con-
texto, mas o mecanismo como um todo muito diferente oferta aplicacional Azu-
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 Foudati-
re ()
on v2).

Concluso Finalmente, deve salientar-se o facto de


Neste artigo procurou-se dar uma introduo s Logic as Logic Apps ainda estarem em Preview e com evolues
Apps, no seu contexto histrico e arquitectural, sem entrar frequentes (ver por exemplo as alteraes mais recentes em
em detalhe de implementao, e omitindo aspectos como http://azure.microsoft.com/en-us/updates/schedule-logic-
monitoria no Portal Azure, custos, tratamento de erros, esca- apps-to-run-in-the-future/), existindo limitaes como sejam a
labilidade, bem como a integrao profunda com as Web impossibilidade de criar workflows em Visual Studio, e de o
Apps e vrios outros temas. Existem no entanto trs aspec- processo de sincronizao com repositrios de cdigo como
tos que vale a pena referir como concluso: o TFS ser manual, entre outras. Ainda assim, as Logic Apps
so provavelmente a novidade mais interessante de en-
Primeiro, as Logic Apps so uma oferta Empresarial/
tre as ltimas que tm surgido no universo Microsoft
Premium, tendo origem no mesmo universo empresarial de
Azure, e vale a pena tanto perceber que cenrios suportam,
onde vm produtos business-critical como o BizTalk Server.
como acompanhar o rumo e evoluo dos prximos meses.
So portanto de esperar potencialidades como escalabilida-
de, tolerncia a falhas, tratamento de erros ou robustez, en-
tre outros. Apesar de estarem disponveis actualmente mui-
tas actions orientadas para o consumidor final (como Face-
book ou Twitter), sendo estas sempre usadas nas demons-
traes pblicas, o foco arquitectural empresarial.

Segundo, As Logic Apps so materializaes de ar-


quitecturas baseada em microservios, e dependem de API
Apps, em que se podem tanto usar as disponibilizadas nati-
vamente 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 ou-
tros.

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 Arqui-
tectura, Azure e Integrao. Orador frequente em conferncias e eventos em temas como Arquitectura de Projectos, dinmi-
cas 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.

9
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? todas as classes que utilizam a classe UserReader tero
que ser tambm alteradas. Tal pode levar a que os prprios
O Ninject uma biblioteca de software aberto que
construtores dessas classes seja tambm alterados, o que
providencia uma framework de injeco de dependncias
vai gerar uma onda de alteraes em vrias classes do pro-
(Dependency Injection ou DI) leve, fcil de integrar e de utili-
jecto.
zar.
A proliferao de chamadas a construtores poder
O padro Dependency Injection bastante utilizado
escalar de tal forma que se perde o controlo de quantas ins-
em software empresarial porque, entre outras razes, permi-
tncias da classes esto de facto a ser criadas e utilizadas
te manter o controlo do ciclo de vida dos objectos e facilita a
pela aplicao
implementao de testes automticos.
Ao utilizar uma framework de injeco de dependn-
O que devo saber antes de comear a utilizar o Ninject?
cias, a gesto das instncias das classes efectuada pelo
O Ninject pode ser utilizado em todos os tipos de apli- container que injecta a instncia de uma classe sempre que
caes desenvolvidas em .NET. No caso das Windows Ap- est necessria.
plications ou Console Applications basta incluir a biblioteca
Neste cenrio, teramos uma implementao parecida
no projeto e comear a utilizar.
com:
J se se pretender integrar o Ninject numa aplicao
class UserReader
Web MVC ou numa biblioteca de servios WCF, ser neces- {
srio utilizar alguns plugins que permitam tratar da // User reader methods
canalizao necessria para garantir que as factories das }
frameworks MVC e WCF utilizam o Ninject como class UserManager
fornecedor de instncias. {
private UserReader userReader;
Vejamos os princpios: Suponhamos que temos uma public UserManager(UserReader userReader)
{
classe UserManager que faz uso de uma classe UserRea- // A classe UserManager recebe uma
der. //instncia da classe UserReader
this.userReader = userReader;
}
UserManager UserReader }

Neste caso, o container saberia construir uma instn-


cia da classe UserReader e inject-la-ia no construtor da
Num cenrio clssico, o cdigo que representa este classe UserManager, tornando esta classe completamente
cenrio seria parecido com: agnstica forma como a classe UserReader foi criada.

class UserReader NOTA: Seria tambm possvel utilizar uma factory class
{
// User reader methods para este efeito, o que consistiria uma alternativa utilizao
} de uma framework de dependency injection (no entanto me-
nos poderosa).
class UserManager
{
private UserReader userReader;
public UserManager() Como comeo?
{
// A classe UserManager est a criar uma O ponto central do Ninject a interface IKernel cuja
//instncia da classe UserReader implementao por omisso a classe StandardKernel.
this.userReader = new UserReader();
} Esta classe implementa um container que armazena a confi-
} gurao dos mapeamentos de interfaces em classes bem
Esta implementao num projecto de larga escala como as instncias de alguns objectos disponibilizados pelo
levanta duas questes essenciais: container.

Se o construtor da classe UserReader for alterado, Toda a interaco com o container efectuada por
cdigo usando uma API fluente e bastante completa. Para

11
A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS

quem prefere usar XML, o plugin Ninject.Extensions.Xml permi- NOTA: Caso a classe possua mais que um construtor o Nin-
te efectuar a configurao do Ninject usando XML. ject tentar utilizar o construtor sem argumentos (construtor
Para comear a utilizar o Ninject, necessrio importar o default) para construir a classe. Caso esta no tenha ne-
namespace Ninject e declarar uma varivel do tipo Stan- nhum construtor default, ser necessrio indicar ao Ninject
dardKernel. qual o construtor que este deve utilizar para construir a clas-
se.
using Ninject;

class Program Mecanismos de injeco


{
static void Main(string[] args) O exemplo acima utiliza o mecanismo constructor
{ injection que faz com que o container inspeccione o constru-
IKernel kernel = new StandardKernel(); tor 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
O Ninject suporta ainda outro tipo de injeco: a pro-
ser declarado no ponto de entrada da aplicao, to cedo
perty injection. Neste caso, o Ninject encara uma proprieda-
quanto possvel.
de da classe como uma dependncia a ser injectada na clas-
Seguindo o exemplo anterior, podemos agora solicitar uma se e tenta resolv-la e inject-la como se um argumento de
instncia de uma varivel do tipo UserManager ao Ninject sem um construtor se tratasse.
necessitar de qualquer outra configurao adicional. Para tal,
Para declarar que uma propriedade deve ser injecta-
utiliza-se o extension method Get<> para obter a instncia:
da, ser necessrio decorar a propriedade com o atributo
using Ninject; [Inject].

class Program O mecanismo de constructor injection tipicamente


{ mais utilizado que o property injection por este garantir que
static void Main(string[] args) todas as dependncias esto no construtor e que o objecto
{
IKernel kernel = new StandardKernel(); inicializado correctamente no construtor. Outro motivo a fa-
UserManager manager = ker- vor da utilizao de constructor injection o facto de evitar
nel.Get<UserManager>();
} que as classes conheam o Ninject, j que desta forma
} raramente ser necessrio as classes injectadas utilizarem o
Ninject.
class UserReader
{ E quando a resoluo automtica no consegue re-
// User reader methods
} solver?

class UserManager H casos em que a resoluo automtica no conse-


{ gue resolver a dependncia de forma inequivoca. Nestes
private UserReader userReader; casos, o Ninject lanar uma excepo e caber ao progra-
public UserManager(UserReader userReader)
{ mador dar indicao sobre como resolver a dependncia.
this.userReader = userReader;
} Tipicamente, existem trs casos em que a resoluo auto-
} mtica no consegue resolver:
Aps a instruo Get<>, a varivel manager do mtodo
i. Quando a classe tem mais que um construtor em que
Main fica populada com uma instncia de UserManager que
nenhum deles o construtor default
foi construda usando o construtor que recebe um UserRea-
der. O Ninject percebeu que podia construir uma instncia da ii. Quando o construtor tem um argumento do tipo Inter-
classe UserReader para injectar no construtor da classe User- face
Manager. iii. Quando o construtor tem um argumento com um tipo
Neste caso, o Ninject aplicou o mecanismo de resolu- bsico
o automtica de dependncias que constroi instncias de
Nestas situaes, o container disponibiliza um conjun-
acordo com as seguintes regras: caso o construtor no tenha to de mtodos de configurao para instruir o Ninject sobre
argumentos este invocado para criar a instncia. Caso o
como proceder. O mtodo Bind<>() permite indicar ao Nin-
construtor tenha argumentos, o Ninject tenta criar uma instn- ject como resolver uma determinada classe ou interface.
cia de cada uma das classes de argumento do construtor
(aplicando as regras de resoluo automtica). Na primeira situao, possvel instruir o Ninject sobre
qual o construtor a usar usando o mtodo Bind<>
().ToConstructor(). A utilizao do mtodo WithParameter()

12

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
construtor. a solicitou. No exemplo anterior, seriam injectadas duas ins-
tncias diferentes de Logger, uma para cada classe e inicia-
class UserReader
{ lizadas com o nome da respectiva classe onde foi injectada.
public UserReader(string connectionString)
{ ... } mbito das dependncias
public UserReader(string connectionString,
int max) { ... } Por omisso, o Ninject cria uma nova instncia da
} classe sempre que h uma solicitao de injeco. Ou seja,
// Aps declarar o kernel
kernel.Bind<UserReader>() sempre que uma classe necessria o construtor sempre
.ToConstructor<UserReader>((ctx) => new UserReader invocado para satisfazer a dependncia.
(string.Empty))
.WithParameter(new Parameter("connectionString", Ao declarar o binding com Bind<>().To<>
"myConnectionString", true)); ().InSingletonScope() o Ninject garante que aquela classe
Neste caso, foi necessrio indicar qual o construtor a ser um singleton, ou seja construda uma nica vez e
usar, bem como o valor do parmetro a utilizar no tipo bsico essa instncia utilizada em todas as dependncias.
do construtor que foi escolhido. O mtodo ToConstructor()
O binding Bind<>().To<>().InThreadScope() garante
instrui o Ninject para utilizar aquele construtor. O mtodo
que criada um instncia por cada Thread da aplicao.
WithParameter() indica ao Ninject qual o valor a atribuir ao
parmetro connectionString. Utilizando o binding Bind<>().To<>().When() tam-
bm possvel instruir o Ninject para injectar diferentes tipos
No caso em que o construtor necessita de uma inter-
em funo de determinada condio ditada pelo mtodo
face, utiliza-se o mtodo Bind<>().To<>():
When().
class FacebookUserReader : IUserReader
{
// Get user information from Facebook
}

class UserManager
O Ninject uma
{
public UserManager(IUserReader userReader)
{ ... }
biblioteca de software
}

// Instruo que indica ao NInject que a classe que


aberto que providencia
//implemementa a interface IuserReader a classe
//FacebookUserReader
kernel.Bind<IUserReader>(). uma framework de in-
To<FacebookUserReader>();
jeco de dependn-
Top tip: Um caso de injeco utilizar o container para in-
jectar um logger que, tipicamente, inicializado em funo
da classe onde o logger utilizado. Neste caso, possvel
cias () O padro De-
utilizar o mtodo Bind<>().ToMethod() para garantir a inicia-
lizao por classe:
pendency Injection
bastante utilizado em
kernel.Bind<ILog>().ToMethod(ctx =>
LogManager.GetLogger(ctx.Request.Service));
software empresarial o
class UserManager
{
public UserManager(IUserReader userReader, controlo do ciclo de vi-
ILog logger) { ... }
}
class UserReader da dos objectos e faci-
{
public UserReader(string connectionString,
ILog logger) { ... } lita a implementao
}

Neste caso, a varivel ctx.Request.Service contm o de testes automticos


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 unitrios ou de integrao, uma framework de injeco de


dependncias uma ferramenta importante para garantir a
O Ninject disponibiliza tambm mecanismos de carrega-
fcil utilizao de mock objects. O Ninject possui um exce-
mento de mdulos e plugins que permitem conferir bastante
lente suporte para alterar os bindings em runtime, facilitando
dinamismo s aplicaes.
em muito a execuo dos testes.
Existem tambm extenses que oferecem funcionalida-
des de interceo de mtodos que so particulamente teis
para controlo de segurana, auditing ou troubleshooting.

A extenso Ninject.Mvc oferece a integrao plena do O Ninject um


Ninject com o ASP.NET MVC, permitindo que os Controllers
sejam inicializados pelo container do Ninject. motor de injeco de
dependncias bastante
Ao utilizar uma completo e verstil que
framework de injeco garante ao programa-
de dependncias, a dor um excelente con-
gesto das instncias trolo sobre a forma co-
das classes efectua- mo a aplicao cons-
da pelo container que truda bem como o ci-
injecta a instncia de clo de vida dos objec-
uma classe sempre que tos de suporte aplica-
esta necessria. o.

Concluso Pela forma como est construdo, apenas as classes


de ponto de entrada das aplicaes tero que conhecer o
O Ninject um motor de injeco de dependncias bas- Ninject, sendo o resto da aplicao completamente agnstica
tante completo e verstil que garante ao programador um exce- ao motor de injeco de dependncias.
lente controlo sobre a forma como a aplicao construida
bem como o ciclo de vida dos objectos de suporte aplicao. A utilizao de mdulos permite distribuir a inicializa-
o dos vrios componentes aplicacionais, garantido uma
A sua sintaxe fluda oferece um excelente mecanismo melhor organizao do cdigo e evitando ficheiros de confi-
de configurao, evitando os longos ficheiros em formato xml gurao demasiado longos.
tpicos de outras frameworks de injeco de dependncias.

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 persis-
tncia 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 ver-
so preview, e que pode sofrer alteraes at sair a verso
final.

sabido que a Entity Framework 7 ir suportar o Win-


dows 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.

Nota: Este artigo foi escrito usando a verso Windows 10 Figura 2: Verso do Technical Preview Tools
Technical Preview Build 10240 e a Technical Preview Tools
Descrio
version 10.0.10069.
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 funcio-
nalidades especficas de cada plataforma passamos a ter dis-
ponveis as extenses, que s iro estar disponvel na respeti-
va plataforma para o qual foram fornecida.

Modelo de dados

Uma vez que temos o projeto criado, agora devemos


Figura 5: Instalao do NuGet Json.Net
criar o modelo de dados que define os dados a persistir pela
aplicao na base de dados SQLite. Desta forma, para ajudar O consumo dos dados ser um pedido HTTP, muito
a construir o exemplo iremos usar um dos datasets fornecido simples, como podemos ver de seguida:
pelo http://www.cityofboston.gov/, mais especificamente o data-
public class WebServiceManager
set https://data.cityofboston.gov/resource/4swk-wcg8.json. {
public async Task GetBostonEmployeesEarnings()
Sendo assim, iremos ter uma classe chama- {
da BostonEmployee, que definida por: string url = "https://
data.cityofboston.gov/resource/4swk-wcg8.json";
public class BostonEmployee
{ var client = new HttpClient();
public string Name { get; set } var request = new HttpRequestMessage
(HttpMethod.Get, new Uri(url));
public string Title { get; set; }
// Send the registration request.
[JsonProperty(PropertyName = var response = await client.SendAsync
"department_name")] (request);
var message = await

16

A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS
response.Content.ReadAsStringAsync(); Portanto, neste momento temos o SQLite instalado e
var employees = JsonCon as referncias foram adicionadas ao projeto, falta agora ins-
vert.DeserializeObject(message);
return employees; talar o NuGet SQLite.Net-PCL (Figura 9), que uma bibliote-
} ca que ir facilitar a criao e conexo base de dados,
}
assim como na gesto de dados. Este NuGet ir adicionar as
seguintes referncias:
Usando SQLite
Net
Instalao
Net.Platform.WinRT
Para podermos usar base de dados SQLite necess-
rio instalar o vsix fornecido no site oficial da SQLite: http://
sqlite.org/download.html, atualmente em ver-
so preview (Figura 6) e adicionar as respetivas referncias
(Figura 7 e 8):

Figura 6: Obteno do SQLIte para UAP (sqlite-uap-


201504202353.vsix)

Figura 9: Instalao do NuGet SQLite.Net-PCL

Criao da base de dados

Antes de criarmos a base de dados necessrio defi-


nir 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();
Figura 7: Adicionar referncias _dataBasePath = Path.Combine
(Windows.Storage.ApplicationData.Current.
LocalFolder.Path, "db.sqlite");
}

De seguida devemos alterar a clas-


se BostonEmployee de forma a definir a PrimaryKey:

[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 pode- public IEnumerable Pagination(int numToSkip, int
mos inserir, apagar e alterar os dados da mesma, para isso numToTake)
devemos usar o SQLiteConnection que ter todos os mtodos {
using (SQLite.Net.SQLiteConnection conn = new
necessrios para efetuar as operaes CRUD: SQLite.Net.SQLiteConnection(
new SQLite.Net.Platform.WinRT.
Inserir SQLitePlatformWinRT(), _dataBasePath))
{
return conn.Table().Skip(numToSkip).Take
public void SaveData(BostonEmployee bostonEmployee) (numToTake);
{ }
using (SQLite.Net.SQLiteConnection conn = new }
SQLite.Net.SQLiteConnection(new SQLite.
Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath)) Para fazer queries SQL, podemos efectuar:
{
conn.Insert(bostonEmployee); private string sqlquery = "SELECT * FROM
conn.Commit(); BostonEmployee] WHERE [Value] = 0.0";
}
} public IEnumerable SQLQuery(string sqlquery)
{
public void SaveData(IEnumerable bostonEmployees) using (SQLite.Net.SQLiteConnection conn =
{ new SQLite.Net.SQLiteConnection(new SQLite.
using (SQLite.Net.SQLiteConnection conn = new Net.Platform.WinRT.SQLitePlatformWinRT(),
SQLite.Net.SQLiteConnection( _dataBasePath))
new SQLite.Net.Platform.WinRT. {
SQLitePlatformWinRT(), return conn.Query(sqlquery);
_dataBasePath)) }
{ }
conn.InsertAll(bostonEmployees);
conn.Commit();
}
} Nota: de notar que possvel usar os vrios mtodos for-
necidos pelo Linq, que permitir efetuar diferentes queries
Obter tabela em causa, assim como usar queries em SQL.
Para obter o BostonEmployee usando o Name, pode-
mos efectuar:
Apagar
public BostonEmployee GetByName(string name) public void DeleteData(BostonEmployee
{ bostonEmployee)
using (SQLite.Net.SQLiteConnection conn = new {
SQLite.Net.SQLiteConnection(new SQLite. using (SQLite.Net.SQLiteConnection conn = new
Net.Platform.WinRT.SQLitePlatformWinRT(), SQLite.Net.SQLiteConnection(new
_dataBasePath)) SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),
{ _dataBasePath))
return conn.Get(name); {
} conn.Delete(bostonEmployee);
conn.Commit();
} }
}

Para obter BostonEmployees baseadas numa pesquisa


Alterar
ao Title, podemos efectuar:
public void UpdateData(BostonEmployee
public BostonEmployee GetBostonEmployee(string bostonEmployee)
title) {
{ using (SQLite.Net.SQLiteConnection conn =
using (SQLite.Net.SQLiteConnection conn = new new SQLite.Net.SQLiteConnection(new
SQLite.Net.SQLiteConnection(new SQLite.Net. SQLite.Net.Platform.
Platform.WinRT.SQLitePlatformWinRT(), WinRT.SQLitePlatformWinRT(),
_dataBasePath)) _dataBasePath))
{ {
return conn.Get(i=>i.Title.Equals(title)); conn.Update(bostonEmployee);
} conn.Commit();
} }
}
Concluso
Para fazer paginao sobre os dados, podemos efectu-
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 dispon-
vel (em verso preview), cuja implementao no difere em
muito do uso em aplicaes WinRT. Sendo muito simples criar
Windows 10 Uni-
e efetuar as operaes CRUD usando a biblioteca SQLite.Net-
PCL. versal apps preciso
ter ateno que dei-
Hoje em dia qual- xamos de desenvolver
quer aplicao tem co- aplicaes para cada
mo requisito o uso de plataforma, e passa-
base de dados para ar- mos a ter uma nica
mazenar os dados aplicao que ir cor-
rer nas vrias platafor-
mas

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 O criador do PrimeFaces tambm disponibiliza o Mo-
(UI) Framework PrimeFaces (http://primefaces.org/) para o bile UI kit para aplicaes mobile, Layouts e temas para as
desenvolvimento de uma aplicao web de JavaServer Faces mesmas.
(JSF) utilizando NetBeans (https://www.netbeans.org) e alojar a
Para criar a aplicao deste projeto web em JSF vai
mesma aplicao na plataforma OpenShift por SFTP.
ser utilizado IDE Netbeans esta aplicao patrocinada pela
O OpenShift Online (https://www.openshift.com) um Oracle e permite o desenvolvimento de projetos Java,
servio em nuvem da Red Hat (http://www.redhat.com) para HTML5, PHP e C/C++ no tem nenhum custo para o utiliza-
desenvolvimento de aplicaes e alojamento ou seja um dor nem para empresas.
Platform as a service (PaaS) que permite otimizar a aplicao
O idioma utilizado neste Netbeans o Ingls. Selecio-
web e no necessitamos de preocupar com a infraestrutura
ne a opo New Project para iniciar um novo projeto de-
necessria para distribuir a aplicao web.
pois selecionada a categoria Java Web em que selecio-
Uma das vantagens de utilizarmos o OpenShift a utili- nado o projeto Web Application sem cdigo sem cdigo
zao de um plano gratuito sem necessitarmos de carto de includo, aps a seleo avana para fase seguinte.
crdito.

Principais diferenas nos planos disponveis:

Plano Gratuito Bronze Prateado

Preo base Gratuito Gratuito 15/Ms

Inatividade da 24 Horas Nunca Nunca


aplicao
Escalabilidade Sim (3 min / Sim (3 min / Sim (3 min /
3 max) 16 max) 16 max)
Alojamento 1 GB 1 GB 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 quan-
do 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 Micro- definido o nome do projeto e a localizao do mes-
soft Azure que permite tambm um plano gratuito para aloja- mo mas no definida a localizao da pasta das bibliotecas
mento de aplicaes Java mas este apenas permite 1 GB de e avana para fase seguinte.
trfego. No OpenShift nunca fui avisado por utilizao de trfe-
go e a aplicao web continua a funcionar.

O PrimeFaces uma UI Framework para Websites em


JSF. Esta Framework contm um grande conjunto de compo-
nentes 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 CASE Elite Comunida-
de
Gratuito
Cust
Subscrio anual por desenvolvedor (includo
o
comercial)
PrimeFaces
Su- PrimeTek Comunida-
(resposta no Prime-
port www.primetek.c de Prime-
mximo em um Faces
e om.tr Faces
dia til)

20

A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
O servidor a ser utilizado o Apache Tomcat e o mes-
mo 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 colo-
co todas as bibliotecas que utilizo e que no esto integra-
das no IDE ou que so mais recentes j que assim consigo
abrir o projeto noutros computadores sem problemas. Tam-
bm pode se utilizar o Maven.

O projeto vai trabalhar com JavaServer Faces o Net-


Beans 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 docu-


mentao disponvel na sua pgina de Internet http://
primefaces.org/documentation como aplicar os seus compo-
nentes 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 nave-
garmos 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 alte-
rado e adicionado um context-param para o PrimeFaces.

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


<web-app version="3.1" xmlns="http://
xmlns.jcp.org/
Com o projeto criado a primeira coisa fazer definir o xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance" xsi:schemaLocation=
Source/Binary Format do projeto para JDK 7, porque o "http://xmlns.jcp.org/xml/ns/javaee
OpenShift ainda no trabalha com o Java 8. Para definir clica- http://xmlns.jcp.org/xml/ns/javaee/
se com o boto direito do rato em cima no nome do projeto, web-app_3_1.xsd">
<context-param>
seleciona-se Properties, seleciona-se a opo Sources e <param-name>javax.faces.PROJECT_STAGE
define-se Source/Binary Format para JDK 7. </param-name>

21
A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
<param-value>Development</param-value> {welcomeView.welcome}"
</context-param> icon="ui-icon-check" />
<context-param> </p:panel>
<param-name>javax.faces.CONFIG_FILES </h:form>
</param-name>
<param-value>/WEB-INF/faces-config.xml Para validar dos dados introduzidos necessrio criar
</param-value>
</context-param> uma nova Java Class que contm o cdigo que o servidor
<servlet> vai utilizar para validao dos dados recebidos pelo formul-
<servlet-name>Faces Servlet</servlet-name> rio e entregar a mensagem construda.
<servlet-class>
javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup> import javax.faces.application.FacesMessage;
</servlet> import javax.faces.bean.ManagedBean;
<servlet-mapping> import javax.faces.context.FacesContext;
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.XHTML</url-pattern> @ManagedBean
</servlet-mapping> public class WelcomeView {
<session-config>
<session-timeout> private String name;
30
</session-timeout> public String getName() {
</session-config> return name;
<welcome-file-list> }
<welcome-file>index.XHTML</welcome-file>
</welcome-file-list> public void setName(String sname) {
</web-app> this.name = sname;
}
criado um novo ficheiro com nome faces-config.xml public void welcome() {
na mesma pasta com o seguinte contedo. FacesContext.getCurrentInstance()
.addMessage
<?xml version='1.0' encoding='UTF-8'?> (null, new FacesMessage("Ol " + name +
<faces-config version="2.2" " bem-vindo"));
xmlns="http://xmlns.jcp.org/xml/ns/javaee" }
xmlns:xsi="http://www.w3.org/2001/ }
XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/ Demo 2 idntico ao demo 1 mas com mensagem de
xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/
web-facesconfig_2_2.xsd"> informao ao utilizador sobrepostas.
</faces-config>
criado uma nova pgina XHTML que vai estar na raiz.
As alteraes anteriores no so obrigatrias mas fica a
necessrio introduzir a linha xmlns:p="http://primefaces.org/
conhecer os ficheiros onde se definem as configuraes a se-
ui"> no tag <html> e alterar os seguintes tags head para
rem utilizadas no PrimeFaces. Com por exemplo a configura-
h:head e body para h:body.
o das pginas em que o utilizador consegue aceder sem
sesso e as pginas que apenas acede com uma sesso inici- inserido o cdigo referente ao formulrio
ada.
<h:form>
Demo 1 Validao de entrada de dados executados no servi- <p:growl id="growl" showDetail="true"
dor (http://www.primefaces.org/showcase/ui/ajax/ sticky="true" />
<p:panel header="Demo 2 -
validation.XHTML) http://www.primefaces.org/showcase/ui/message/
growl.XHTML">
Na pgina de ndex (index.XHTML) apagada a linha <h:panelGrid columns="2" cellpadding="5">
referente ao Hello World e introduzido o seguinte cdigo que <p:outputLabel for="msg" value="Mensagem:" />
<p:inputText id="msg" value="#
contm o formulrio que solicita a introduo de dados. {growlView.message}" required="true" />
</h:panelGrid>
<h:form> <p:commandButton value="Guardar"
<p:panel id="panel" header="Demo: http:// actionListener="#{growlView.saveMessage}"
www.primefaces.org/showcase/ui/ajax/ update="growl" />
validation.XHTML"> </p:panel>
<p:messages id="msgs" /> </h:form>
<h:panelGrid columns="3" cellpadding="5">
<p:outputLabel for="name" value="Insira o seu
nome:" /> criada uma nova Java Class que contm o cdigo para
<p:inputText id="name" value="# validao.
{welcomeView.name}" required="true" label="name">
<f:validateLength minimum="2" /> import javax.faces.application.FacesMessage;
</p:inputText> import javax.faces.bean.ManagedBean;
<p:message for="name" display="icon" /> import javax.faces.context.FacesContext;
</h:panelGrid>
<p:commandButton value="Submeter" update="panel" @ManagedBean
actionListener="#

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 E assim ter o seguinte resultado quando inicia o
necessrio atualizar o menu essa alterao feita apenas projeto com o Tomcat.
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> Com o projeto terminado j se pode criar o ficheiro
<p:menuitem value="Demo 1" WAR que contm todos os ficheiros do projeto a serem envi-
url="index.XHTML" /> ados para o OpenShift atravs de SFTP. Para criar o ficheiro
<p:menuitem value="Demo 1"
url="index.XHTML" /> clique no projeto com o boto direito do rato selecione
<p:menuitem value="Demo 2" Clean and Build.
url="demo2.XHTML" />
</p:breadCrumb>
</h:form>
</h:body>
</html>

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>.
O ficheiro WAR basicamente um ficheiro compacta-
inserida a importao do menu antes dos formulrios. do no formato zip com todos os ficheiros do projeto se o abrir
<ui:include src="menu.XHTML"></ui:include> com o compactador de ficheiros com suporte zip pode ver o
seu contedo.
O projeto est terminado. Agora pode ser executado
para visualizar o resultado final. Ao iniciar o projeto e deparar-
se com o seguinte erro.

23
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 Pu-


TTYgen (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 credenci-
ais criadas.
Com a chave inserida podemos criar uma nova apli-
Para criar o certificado inicia-se o PuTTY Key Generator cao clicando em Applications e selecionando Tomcat 7
e clica-se no boto Generate a seguir move-se o rato aleatori- (JBoss EWS 2.0) a seguir define-se o endereo da aplica-
amente na rea em branco at o certificado ser criado e depois o.
define-se a key passphrase.

Nos planos gratuitos por norma no possvel definir-


se a regio necessrio definir-se No preference.

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 xpto-
pap.rhcloud.com.
necessrio guardar a chave pblica e a chave priva-
da.

Inicie a sua conta do OpenShift clique em definies e


insira a sua chave pblica conforme aparece no PuTTY Key
Para ligarmos atravs de SFTP vou demonstrar com
Generator.
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
Se pretender alterar ou apagar a chave pblica pode
sempre apagar no boto delete e criar uma nova.

24

A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
converter clique Sim vai ser solicitado a passphrase que foi o no fica na raiz mas sim numa subpasta da raiz com o
definida na criao da chave privada. nome PAP123.

Depois de enviarmos o ficheiro reiniciamos a aplica-


o no painel do OpenShift.

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


indicaes do Soure Code na aplicao do OpenShift que
Ateno: Apagar outras pastas ou ficheiros o SFTP pode
tem o seguinte aspeto 854a6dZ40c000d820@xpto- danificar a aplicao web.
pap.rhcloud.com o servidor vai ser xpto-pap.rhcloud.com o tipo
de sesso normal o utilizador 854a6dZ40c000d820.Para
E ficamos com o seguinte resultado.
iniciar a ligao clica-se no boto Ligar.

A vantagem de se criarem aplicaes web em Java


no prprio servidor no obrigar o utilizador a instalar o Ja-
va. 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 utilizar-
mos uma UI Framework de no necessitarmos criar os
componentes UI e assim poupar tempo nos projetos. Mes-
mo 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 identifi-
cadas no manual do PrimeFaces. O OpenShift uma tima
soluo de projetos para clientes em SASS /PASS mas tam-
Com a ligao efetuada j pode substituir o ficheiro
bm se pode utilizar para experimentar o seu comportamen-
WAR existente pelo WAR do projeto criado. Para isso selecio-
to e/ou para mostrar. Tambm podemos utilizar o plano gra-
ne a pasta webapps localizado em /var/lib/openshift/[Nome de
tuito para alojamento de uma pgina pessoal, blog ou outros.
Utilizador]/app-root/runtime/dependencies/jbossews/webapps
e substitua o ficheiro. Mas antes de fazer obrigatrio mudar o Os ficheiros do projeto esto disponveis no Github
nome do ficheiro WAR do projeto para ROOT.war. Se no mu- em https://github.com/rramoscabral/pap-2015-
dar o nome do ficheiro e o mesmo se chamar PAP123 a aplica- openshift_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, mador menos atento que poder pensar tratar-se de uma
armazenando e manipulando bits, isto , zeros e uns. Este constante em base 10 com um insignificante zero esquer-
artigo procura resumir as metodologias mais comuns para uso da.
e manipulao de bits atravs da linguagem C.
Conforme j referido, o maior interesse da base octal
Base binria, octal e hexadecimal a facilidade de converso para a respetiva representao
binria e vice-versa. De facto, por ser composta por 8 smbo-
A designao bit identifica um valor da base binria.
los, cada smbolo octal representado em binrio por trs
Como o nome sugere, a base binria composta por dois valo-
bits, pois trs bits permitem gerar 8 valores distintos (23 = 8).
res distintos, representados por zero e um, da tambm se de-
Por exemplo, o smbolo octal 3 representado em binrio
signar por base dois. Assim, um bit pode assumir um desses
por 011, o smbolo 6 por 110. A Tabela 1 mostra a converso
dois valores, sendo muitas vezes empregue para representar
entre octal e binrio para os oito smbolos da base octal.
um estado ativo (bit com o valor a 1) ou inativo (bit com valor a
Voltando ao exemplo anterior, o valor octal 123 (0123 na
0).
linguagem C) tem a representao binria 001.010.011, cor-
Vrios bits podem ser agrupados para formar valores respondendo substituio dos smbolos da base octal pe-
com maior amplitude. Concretamente, sempre que se acres- los respetivos valores binrios (os pontos empregues na
centa um bit, est-se a duplicar o nmero de valores passveis representao binria destinam-se somente a simplificar a
de serem representados pelo conjunto de bits. Por exemplo, leitura). Importa referir que algumas linguagens de progra-
com um bit consegue-se representar dois estados (0 e 1). Com mao j suportam representao binria, usando o prefixo
dois bits j possvel representar quatro estados (00, 01, 10 e 0b antes da quantidade numrica. o caso da linguagem
11) e com trs bits oito estados (000, 001, 010, 011, 100, 101, Java (somente a partir da verso 7), na qual o valor binrio
110 e 111). De uma forma geral, n bits permitem a representa- correspondendo ao valor octal 0123 poderia ser representa-
o de 2n estados diferentes. Por exemplo, 16 bits permitem a do como 0b001010011.
representao de 216 valores distintos, isto , 65536. essa a
razo porque um inteiro de 16 bits sem sinal (i.e., unsigned) Octal Binrio
pode representar valores entre 0 e 65535. Outro exemplo o 0 000
do octeto, que designa um conjunto de oito bits e que pode
1 001
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 2 010
byte frequentemente empregue para designar um octeto. 3 011
A representao binria usualmente pouco convenien- 4 100
te para o ser humano que facilmente se perde na contagem e
5 101
localizao dos bits, especialmente se existir um nmero eleva-
do de bits. Deste modo, os programadores usam frequente- 6 110
mente a base octal e a base hexadecimal como alternativa 7 111
representao binria. Estas duas bases so empregues por
serem mais compactas e pela facilidade com que se consegue
Tabela 1: Mapeamento entre base octal e base binria
converter de uma representao para a representao binria
e vice-versa. De modo similar base octal, uma representao em
base hexadecimal facilmente convertida numa representa-
A base octal tem um conjunto de oito smbolos para a
o binria e vice-versa. A base hexadecimal assenta num
representao de uma dada quantidade. Os smbolos so os
conjunto de 16 smbolos, usando os algarismos 0 a 9 para a
dgitos compreendidos entre 0 e 7. No caso da linguagem C (e
representao dos 10 primeiros smbolos e as letras de A a
de muitas outras), um valor em base octal representado com
F para os restantes seis smbolos. Nas linguagens de pro-
um zero esquerda. Assim, o valor 0123 numa listagem de
gramao, as constantes em base hexadecimal so identifi-
cdigo C identifica o valor octal 123 e no o valor decimal 123.
cadas pelo prefixo 0x. Assim, retomando o exemplo anterior,
Na realidade, o valor 0123 corresponde ao valor 83 em base
0x123 representa uma quantidade em base 16. A converso
decimal. A converso de octal para decimal pode ser feita so-
de uma valor hexadecimal para base 10 consiste em somar
mando-se as parcelas resultantes da multiplicao de 3 por 80,
as parcelas resultantes da multiplicao do smbolo mais
de 2 por 81 e de 1 por 82 obtendo-se o valor 3x1+2x8+8x8=83.
direita por 160 (smbolo designado como o menos significati-
Note-se que o uso do zero esquerda para indicar que uma
vo), da multiplicao do segundo smbolo mais direita por
constante inteira est em base octal pode confundir o progra-

26

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
161, da multiplicao do terceiro smbolo mais direita por 162 usa masculas para representar os smbolos hexadecimais
e assim sucessivamente. Para o caso do valor 0x123, obtm- entre A e F.
se 3x160 + 2x161+ 1x162, isto , 3+32+256, ou seja o valor
Especificao de campos de bits em estruturas
decimal 291. Usando uma notao frequentemente empregue,
pode dizer-se que (123)16 corresponde ao valor (291)10. A linguagem C possibilita a declarao de campos
binrios em estruturas do tipo struct. Assim, possivel decla-
A converso de um valor hexadecimal para a represen-
rar um ou mais elementos de uma struct como sendo um
tao binria equivalente processa-se de forma similar con-
conjunto de bits. A manipulao do conjunto de bits assim
verso de um valor octal para binrio, exceto que cada smbolo
definidos faz-se atravs do campo da struct. Considere-se o
hexadecimal deve ser mapeado para um valor de 4 bits de
exemplo da struct exemplo1 apresentado na Listagem 1, na
acordo com a Tabela 2. O uso de 4 bits por smbolo decorre qual esto declarados os campos campo01 e campo02, res-
do facto que so necessrio 4 bits para representar todos os petivamente com dois e quatro bits. O uso de um campo de
16 smbolos empregues na base hexadecimal (24=16). Aplican- bits efetuado da mesma forma que qualquer outro campo
do-se a metodologia de converso hexadecimal para binrio ao da estrutura, especificando-se o nome do campo. No caso
exemplo 0x123, obtm-se a seguinte representao em bin- da Listagem 1 so atribudos os valores 1 (em decimal, cor-
rio: 0001.0010.0011. respondendo a 01 em binrio) e 0xA (em hexadecimal, cor-
Hexadecimal Binrio respondendo a 1010 em binrio), respetivamente, aos cam-
0 0000 pos campo01 e campo02.
1 0001 /* Exemplo: "bit_fields.c" */
2 0010 #include <stdio.h>
typedef struct exemplo1{
3 0011 int campo_bit01:2;
4 0100 unsigned int campo_bit02:4;
float valor_float;
5 0101 }exemplo1_t;
6 0110
exemplo1_t exemplo;
7 0111 exemplo1.campo01 = 1;
8 1000 exemplo1.campo02 = 0xA;
printf("campo01=%d\n", exemplo1.campo01);
9 1001 printf("campo02=%d\n", exemplo1.campo02);
A 1010
B 1011 Listagem 1: exemplo bit_fields.c
C 1100
D 1101 Importa notar que um elemento especificado como
campo de bits deve ser obrigatoriamente declarado como
E 1110
sendo do tipo int (ou equivalentemente do tipo signed int) ou
F 1111
do tipo unsigned int. O nmero de bits definido para o campo
Tabela 2: Mapeamento entre hexadecimal e base binria condiciona os valores que l podem ser armazenado. Assim,
para o caso do campo01, os dois bits do campo permitem
A maior frequncia de uso na programao da repre-
armazenar um dos conjuntos binrios 00, 01, 10 ou 11. Adici-
sentao hexadecimal em relao representao octal deriva
onalmente, dado que campo01 declarado com int, isto ,
do facto de um valor hexadecimal apresentar um tamanho que
inteiro com sinal, os valores inteiros que o campo pode ar-
sempre mltiplo de 4 bits. Essa caracterstica possibilita que
mazenar so o -2, o -1, 0 e 1. Por sua vez, o elemento cam-
facilmente possa ser encontrado um valor hexadecimal com o
po02 tem espao para quatro bits, pelo que lhe pode ser
mesmo nmero de bits de um tipo de dados inteiro. Por exem-
atribudo um valor hexadecimal desde que tenha somente
plo, para o caso de se pretender um valor inteiro com 16 bits,
um dgito, como o caso do valor 0xA empregue na Lista-
apenas necessrio garantir que a representao hexadeci-
gem 1.
mal tenha 4 smbolos. Similarmente, para um valor de 32 bits,
sabe-se que apropriado um valor hexadecimal com 8 smbo- Bits e variveis inteiras
los e assim sucessivamente. Adicionalmente, o formato hexa-
Na linguagem C, o acesso ao nvel do bits no est
decimal empregue para a representao de endereos, dado
limitado a campos de bits definidos em structs. De facto,
os endereos terem geralmente um nmero de bits que uma
possvel efetuar operaes envolvendo operadores binrios
potncia de dois (8, 16, 32, 64, etc.). Deste modo, no surpre-
em variveis do tipo inteiro, sejam elas int, short, long ou
ende que a linguagem C disponibilize atravs da funo printf e
mesmo char, independentemente de ser considerado o sinal
do respetivo operador de formatao %x, a representao de
ou no (signed/unsigned). A principal diferena entre o uso
um determinado valor em formato hexadecimal. Note-se que
de um campo de bits e o uso de uma varivel inteira reside
em alternativa ao operador %x, pode ser empregue o operador
no facto que uma operao binria numa varivel inteira en-
%X (maiscula) que apresenta o mesmo resultado, exceto que
volve todos os bits da varivel, ao passo que num campo de

27
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
bits, apenas so afetados os bits do campo de bits. Assim, uint16_t transbordo_1;
quando se efetua uma operao binria envolvendo, por exem- int16_t transbordo_2;
printf("N de bits de 'unsigned short': %u\n",
plo, uma varivel inteira sem sinal com 32 bits, necessrio sizeof(transbordo_1)*8);
considerar os efeitos da operao sobre os 32 bits que com- transbordo_1 = 65535;/* Carrega valor mximo */
pem a varivel. pois importante, quando se faz uso de uma printf("valor de transbordo_1=%u\n",
transbordo_1);
varivel inteira, ter em conta o nmero de bits da varivel, algo transbordo_1++; /* transbordo! */
que pode ser determinado multiplicando o resultado devolvido printf("(aps +1) transbordo_1=%u\n",
pelo operador sizeof por 8, dado que esse operador devolve o transbordo_1);
transbordo_2 = 32767;
tamanho em octetos (bytes) da varivel ou do tipo de dados printf("valor de transbordo_2=%d\n",
que lhe passado como parmetro (Listagem 2). A norma C99 transbordo_2);
transbordo_2++; /* transbordo! */
introduziu tipos de dados com tamanho explicitado, como o printf("(aps +1) transbordo_2=%d\n",
caso do tipo int8_t que corresponde a um valor inteiro com transbordo_2);
sinal de 8 bits (i.e., um octeto) ou o uint16_t que tem 16 bits return 0;
}
para guardar valores inteiros sem sinal (Open-STD, 2003). A
norma C99 especifica ainda que os tipos inteiros explicitados
Listagem 3: exemplo transbordo.c
se encontram definidos no ficheiro <inttypes.h>.
int var_a; N de bits de 'unsigned short': 16
printf("n bits 'int'=%d\n",sizeof(var_a)*8); valor de transbordo_1=65535
printf("n bits 'short'=%d\n", sizeof(short)*8); (aps +1) transbordo_1=0
valor de transbordo_2=32767
Listagem 2: exemplo sizeof.c (aps +1) transbordo_2=-32768
Conceito de transbordo
Listagem 4: resultados da execuo de transbordo.c
Por terem um nmero finito de bits, as variveis do tipo
inteiro apenas podem representar um nmero finito de valores Operaes binrias acessveis na linguagem C
inteiros compreendidos entre um valor mnimo e um valor mxi-
Por operao binria entende-se a operao que tem
mo. Por exemplo, uma varivel do tipo uint16 apenas pode
por operando(s) um ou mais valores que so tratados de
representar os valores inteiros do intervalo [0, 216-1], isto , [0,
forma binria, isto , as operaes decorrem bit a bit.
65535]. Assim, caso se pretenda guardar um valor maior do
que aquele suportado pela varivel, ocorrer o que se designa As operaes binrias disponibilizadas na linguagem C cor-
por um transbordo, perdendo-se a parte mais significativa do respondem s operaes habituais de manipulao de bits
resultado. A Listagem 3 exemplifica o que sucede quando se que so: 1) negao; 2) e (conjuno); 3) ou (disjuno);
soma uma unidade varivel transbordo_1 do tipo uint16 4) ou exclusivo (disjuno exclusiva); 5) deslocamento para
(inteiro sem sinal de 16 bits) que foi previamente carregada a esquerda e 6) deslocamento para a direita. As operaes
com o mximo valor que suporta, isto , 65535: o valor da vari- binrias so usualmente executadas de forma muito eficiente
pelo computador, pois muitos processadores implementam
vel passa para 0. A Listagem 3 mostra ainda o transbordo da
nativamente as operaes binrias.
varivel transbordo_2 que do tipo int16, isto , uma vari-
vel inteira de 16 bits com sinal, que pode ser empregue para Detalham-se de seguida, as operaes binrias ante-
representar os valores do intervalo inteiro [-32768, +32767]. riormente enumeradas.
Assim, quando se carrega a varivel com o valor mximo Operador de negao
(32767) e posteriormente se soma uma unidade varivel, o
valor da varivel passa a ser o valor mais negativo, isto , - Como o nome sugere, a operao de negao con-
siste na troca bit a bit, sendo que um bit a 1 convertido
32768 (ver Listagem 4). A possibilidade de transbordo algo
para um bit a 0, e vice-versa. Na linguagem C, a operao
ao qual o programador deve estar muito atento, pois usualmen-
de negao (not na designao anglo-saxnica) represen-
te provoca comportamentos errticos da aplicao (Baraniuk,
tada pelo operador ~ (tilde). O operador de negao dito
2015).
unrio, porque apenas requer um operando. Na Listagem 5,
/* o operador de negao binria empregue para atribuir
* Exemplo: "transbordo.c" varivel out o resultado da negao do contedo da variavel
* Compilar:
* gcc -Wall -W -std=c99 transbordo.c -o transbor- in, isto , a negao de 0x012345678, resultando no valor
do.exe 0xfedcba98 conforme mostrado na Listagem 6.
*/
#include <stdio.h> /* Exemplo: "not_binario.c"*/
#include <inttypes.h> #include <stdio.h>
int main(void){ int main(void){

28

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
unsigned int in = 0x01234567; trata os operandos como entidades lgicas, isto , tendo um
unsigned int out;
out = ~in; valor verdadeiro ou falso, usualmente designado de boolea-
printf("in: %x\n", in); no, e no bit a bit como sucede com o operador and binrio.
printf("out: %x\n", out); Assim, por exemplo, na expresso if( (a==0) && (b==2)){...},
return 0;
} 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 am-
Listagem 5: exemplo not_binario.c bas as operaes (a==0) e (b==2) tiverem valor lgico verda-
deiro. Se qualquer uma das expresses for falsa, ou ambas,
in: 1234567 ento o resultado do and lgico falso. A Tabela 4 mostra a
out: fedcba98
tabela de verdade do operador and lgico.
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 opera- Falso Falso Falso


dor de conjuno. ainda conhecido pela sua designao an-
glo saxnica and, sendo identificado na linguagem C atravs Tabela 4: tabela de verdade do operador and lgico (&&)
do smbolo &. O operador requer dois operandos. A tabela de
A Listagem 8 efetua a operao de and lgico sobre
verdade do operador (Tabela 3) mostra que uma operao de
as condies (a==0) e (b==2) atribundo o valor resultante da
AND binrio em que pelo menos um dos operandos o bit 0
operao varivel inteira result. Da anlise do resultado da
resulta sempre no resultado bit 0. Pelo contrrio, se um dos
execuo do cdigo (Listagem 9), verifica-se que, na lingua-
operandos for bit a 1, ento o resultado corresponder ao bit
gem C, o valor lgico verdadeiro mapeado para o valor
do outro operando: ser 1 se o bit do outro operando for 1 e 0
inteiro 1 (um), e o valor lgico falso para o valor inteiro 0
se o outro operando for 0. Essas caractersticas do and binrio
(zero). Esse mapeamento mantm-se mesmo com o apareci-
podem ser empregues para conhecer o valor de um determina-
mento do tipo de dados bool_t com a norma C99.
do 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 /*Exemplo:"and_logico.c"*/
#include<stdio.h>
binrio entre os valores numricos 0x12 (0001.0010 em bin-
intmain(void){
rio) e 0x0F (0000.1111). A operao produz o resultado binrio inta=0;
0000.0010 (0x02 em hexadecimal), correspondendo ao and intb=2;
binrio entre cada bit homlogo dos dois operandos 0x12 e intresult;
0x0F. /*Condicaoverdadeira*/
result=((a==0)&&(b==2));
and binrio (&) 0 1 printf("verdadeiro=>%d\n",result);
0 0 0 /*Condicaofalsa*/
result=((a==0)&&(b==3));
1 0 1 printf("falso=>%d\n",result);
return0;
Tabela 3: tabela de verdade do operador and (&) }
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 */ Listagem 9: resultado da execuo de and_logico.c
int c;
c = a & b; /* and binario */ Operador OR binrio
/* 0001.0010 & 0000.1111 => 0000.0010 */
printf("c = %d & %d => %x\n", a, b, c); O operador ou binrio, corresponde operao de
return 0; disjuno. ainda designado por OR binrio, sendo repre-
}
sentado na linguagem C atravs do smbolo da barra vertical
Listagem 7: exemplo and_binario.c | . A tabela de verdade do operador OR binrio (Tabela 5)
mostra que sempre que um dos operandos o bit 1, o resul-
importante distinguir o operador and binrio do opera- tado final o bit 1, independentemente do valor do outro
dor and lgico no contexto da linguagem C. Em termos de re- operando. Por sua vez, o bit 0 o elemento neutro do opera-
presentao, o primeiro representado pelo smbolo &, ao dor OR binrio, dado que o resultado de um OR binrio com
passo que o operador and lgico requer dois smbolos & (&&). um dos operandos a bit 0 determinado pelo valor do outro
No que respeita funcionalidade, o operador and lgico (&&)

29
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 ope- verdade (Tabela 7), a operao de XOR resulta no bit 1 se
rando for bit a 1. 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
Um dos usos do operador OR binrio a ativao de
operandos representem o mesmo bit, ento o resultado da
um bit, isto , colocar a 1 um determinado bit. Por exemplo, o
operao de XOR o bit a 0.
resultado da operao OR binrio com o operando 0011, ter
sempre os dois bits menos significativos 1, independente- xor (^) 0 1
mente do valor do outro operando. De facto, conforme anterior- 0 0 1
mente observado, sempre que um determinado bit dos operan-
1 1 0
dos do operador OR binrio 1, o resultado do bit correspon-
dente tambm ele 1. O cdigo or_binario.c (Listagem 10) Tabela 7: tabela de verdade do operador xor (^)
exemplifica o uso de 0x003, ou seja 0000.0000.0011b, como
Uma das aplicaes do operador XOR binrio o
operando no operador OR binrio, originando um resultado
clculo de paridade de um determinado conjunto de bits. A
cujos dois bits menos significativos tm o valor 1 (Listagem 11).
paridade par de uma sequncia de bits diz-se par se o nme-
ro de bits a 1 na sequncia par, e impar se o nmero de
or binrio (|) 0 1 bits a 1 na sequncia impar. A Listagem 12 apresenta cdi-
0 0 1 go em linguagem C que calcula a sequncia de paridade de
uma sequncia de sete inteiros.
1 1 1
/* Exemplo: xor_paridade.c */
#include <stdio.h>
Tabela 5: tabela de verdade do operador or (|)
int main(void){
/* Exemplo: or_binario.c */ /* Vetor de 7 inteiros sobre os
#include <stdio.h> quais calculada a sequencia de paridade */
int i;
int main(void){ int paridade; /* Sequncia de paridade */
int a = 0x003;/* 0000.0000.0011b, 3 base10 */ int vetor_entrada[7];
int b = 0x120;/* 0001.0010.0000b, 288 base10 */ vetor_entrada[0] = 0x12; /* 0001.0010 */
int c; vetor_entrada[1] = 0x02; /* 0000.0010 */
c = a | b; /* or binario */ vetor_entrada[2] = 0x22; /* 0010.0010 */
/* 0000.0000.0011 | 0001.0010.0000 vetor_entrada[3] = 0x00; /* 0000.0000 */
=> 0001.0010.0011 */ vetor_entrada[4] = 0xA0; /* 1010.0000 */
printf("c = %d | %d => %d\n", a, b, c); vetor_entrada[5] = 0xFA; /* 1111.1010 */
return 0; vetor_entrada[6] = 0x4D; /* 0100.1101 */
} /* Sequencia de paridade esperada: 0010.0101 */
paridade = vetor_entrada[0];
for(i=1; i<7; i++){
Listagem 10: exemplo or_binario.c paridade = paridade ^ vetor_entrada[i];
}
printf("paridade=0x%x (hex)\n", paridade);
c = 3 | 288 => 291 return 0;
}
Listagem 11: resultado da execuo de or_binario.c
Listagem 12: exemplo xor_paridade.c
semelhana do anteriormente visto para o operador
No exemplo apresentado, cada inteiro representado
AND, existe tambm na linguagem C um operador OR lgico,
por dois smbolos hexadecimais, considerando-se assim
representado atravs de dupla barra vertical, isto , ||. Com
apenas 8 bits por inteiro (independentemente de cada inteiro
exceo da tabela de verdade (Tabela 6) que obviamente dife-
ter 32 bits os bits mais significativos para alm do oitavo bit
re da tabela do AND lgico, tudo o anteriormente mencionado
esto a zero). O clculo da sequncia de paridade resume-
para o operador AND lgico se mantm.
se a aplicar a operao de XOR de forma iterativa entre os
sete elementos da sequncia de entrada, usando-se para o
or lgico (||) Verd. Falso
efeito a varivel paridade para guardar a sequncia de pari-
Verd. Verd. Verd. dade. Note-se que a sequncia de paridade corresponde
Falso Verd. Falso sequncia de bits que necessrio acrescentar sequncia
de entrada para obter paridade par.
Tabela 6: tabela de verdade do operador or lgico (||)

Operador ou exclusivo (xor)

O operador ou exclusivo, ou xor na designao anglo-


saxnica (contrao de eXclusive OR) tambm conhecido
por disjuno exclusiva. Na linguagem C, o operador XOR
representado pelo smbolo ^. Conforme mostra a tabela de

30

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
Entrada[i] Representao binria Quando efetuada sobre a representao binria de
[0] 0001.0010 um nmero inteiro, a operao deslocamento para a esquer-
[1] 0000.0010 da em n bits produz um resultado final que corresponde
[2] 0010.0010
multiplicao por 2n do valor inteiro original. Por exemplo, na
[3] 0000.0000
Figura 1, o deslocamento em um bit para a esquerda do va-
[4] 1010.0000
lor original 0001.0010 que corresponde ao inteiro 18 em ba-
[5] 1111.1010
[6] 0100.1101 se decimal, transformado no valor 0010.0100 que corres-
Sequncia de paridade 0010.0101 ponde ao valor 36 em base decimal, isto , ao dobro do valor
original. Esta propriedade do operador deslocamento para a
Tabela 8: sequncia de paridade esquerda frequentemente empregue, especialmente em
linguagens assembler, para efetuar multiplicaes de valores
importante observar que no exemplo apresentado se
inteiros por 2n, pois bastante mais rpida do que o algorit-
est a considerar as sequncias de bits que ocorrem na verti-
mo de multiplicao entre dois nmeros inteiros.
cal, calculando-se o respetivo bit de paridade. Por exemplo,
uma das sequncias formada pelo bit mais significativo A Listagem 13 exemplifica o uso do operador deslo-
(relembre-se, o bit mais esquerda) de cada um dos sete valo- camento para a esquerda. No exemplo, aplicado a rotao
res inteiros, corresponde sequncia 0000.110, sendo o bit de esquerda ao valor inteiro 1, usando-se um operando de
paridade o bit 0 por forma que a sequncia de oito bits (sete deslocamento (varivel i) que incrementa em cada iterao
mais o bit de paridade) tenha paridade par, isto , um nmero do ciclo for. Deste modo, na 1 iterao do ciclo (i=0), o valor
par de bits a 1. A sequncia de paridade pois 0010.0101, ou inteiro 1 no deslocado, no sendo pois alterado. Na itera-
equivalentemente, 0x25 em hexadecimal. A Tabela 8 mostra os o seguinte (i=1), o valor 1 deslocado em 1 bit para a
sete conjuntos de bits e a respetiva sequncia de paridade. esquerda, passando de 0...001 para 0...010, correspondendo
ao valor inteiro 2. Na iterao seguinte (i=2), o valor inteiro 1
Embora a linguagem C no disponibilize o operador
deslocado para a esquerda em dois bits, resultando no
lgico XOR, a operao XOR entre valores lgicos pode ser
valor 0...100, correspondendo ao valor 4. A Listagem 14
obtida atravs do recurso aos operadores AND, OR e NOT,
apresenta a sada gerada pela execuo do programa. Facil-
conforme mostrado na Equao 1.
mente se depreende que o cdigo da Listagem 13 gera as
a XOR b = (!a && b) || (a && !b) (Eq. 1) sucessivas potncias do nmero inteiro 2 (1, 2, 4, 8, 16, 32,
64, 128,...). Acresce-se ainda que os nmeros inteiros potn-
Uma aplicao comum do operador XOR, especialmen-
cias de dois so frequentemente empregues como operan-
te em assembler, o de zerar o valor de uma varivel. Para o
dos dos operadores AND e OR pelo facto da respetiva repre-
efeito, efetua-se o XOR da varivel com ela prpria (a = a xor
sentao binria comportar apenas um bit a 1, sendo os res-
a) levando a que o resultado final seja zero, pois a xor a for-
tantes 0. frequente a designao de mscara para caracte-
osamente zero.
rizar um valor inteiro cuja representao binria tenha so-
Operador deslocamento para a esquerda mente um bit a 1 ou, pelo contrrio, somente um bit a 0.
Como o nome sugere, os operadores de deslocamento /* Exemplo: shift_left.c */
efetuam o deslocamento de bits. Na linguagem C, o operador #include <stdio.h>
deslocamento para a esquerda tem a seguinte sintaxe: valor int main(void){
unsigned int valor = 1;
<< n. O operador de deslocamento esquerda efetua uma unsigned int valor_shift;
translao em n posies dos bits para a esquerda do valor size_t size_bits=sizeof(valor)*8;
especificado. A Figura 1 ilustra uma operao de deslocamento unsigned int i;
for(i=0;i<size_bits;i++){
para a esquerda em um bit do valor 0001.0010, resultando no valor_shift = valor << i;
valor 0010.0100. Note-se que devido ao deslocamento es- printf("[shift (valor << %02u)]%u\n",
i, valor_shift);
querda em 1 bit, o anterior bit mais significativo (bit mais es- }
querda) perdido, sendo acrescentado um bit a 0 para a posi- return 0;
o do bit menos signficativo (bit mais direita, representado a }
azul na Figura 1). Caso o deslocamento fosse de n bits para a Listagem 13: exemplo shift_left.c
esquerda, perder-se-iam os n bits mais significativos, sendo
[shift (valor << 00)]1
ainda acrescentados n bits a 0 como bits menos significativos. [shift (valor << 01)]2
[shift (valor << 02)]4
[shift (valor << 03)]8
[shift (valor << 04)]16
()
[shift (valor << 29)]536870912
[shift (valor << 30)]1073741824
[shift (valor << 31)]2147483648
Figura 1: Exemplo de uma operao deslocamento para
a esquerda em 1 bit Listagem 14: sada da execuo do programa shift_left.c

31
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,
Listagem 16: Sada da execuo de right_shift.c
alterando-se somente o sentido do deslocamento. Assim, na
operao de deslocamento para a direita em n bits, h lugar A Listagem 15 exemplifica a operao de desloca-
deslocao em n posies dos bits para a direita. A Figura 2 mento para a direita em duas variveis de tipos diferentes. A
ilustra uma operao de deslocamento para a direita. Na lin- varivel sem_sinal do tipo unsigned int, isto , um inteiro
guagem C, o operador deslocamento para a direita represen- sem sinal, ao passo que a varivel positive corresponde a
tado por >>, e semelhana do operador deslocamento para a um inteiro com sinal (tipo int). Ambas as variveis so iniciali-
esquerda requer dois operandos. Do lado esquerdo do opera- zadas com o valor 998, sendo aplicada, sucessivamente, a
dor fica o operando cujo valor ir ser alvo da operao de des- ambas as variveis a operao de deslocamento para a di-
locamento para a direita. Por sua vez, o operando do lado di- reita com 0, 1, 2 e 3 bits de deslocamento. A sada resultante
reito indica de quantos bits deve o valor inicial ser deslocado. da execuo do cdigo mostrada na Listagem 16. Da an-
lise da sada observa-se que a operao de deslocamento
valor_deslocado = valor_inicial >> num_bits;
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 un-
signed, 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 desloca-
mento 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
Figura 2: Exemplo de uma operao deslocamento para a di- quando ocorre um deslocamento para a direita. De facto, no
reita em 1 bit caso de um valor inteiro representado em complementos de
dois, o bit mais esquerda (bit mais significativo) correspon-
/* Exemplo: shift_right.c */ de ao sinal do nmero: 0 indica nmero positivo, ao passo
int main(void){ que 1 corresponde a um nmero negativo. Assim, a opera-
int positive = 998;
unsigned int sem_sinal = 998; o deslocamento para a direita no pode simplemente
int positive_shift_R; acrescentar um bit zero em lugar do bit mais significativo,
unsigned int sem_sinal_shift_R; pois tal poder resultar num valor com sinal diferente do va-
int i;
for(i=0; i < 4; i++){ lor inicial. No caso da linguagem C, no est definido qual o
positive_shift_R = positive >> i; bit a ser inserido como bit mais significativo pelo operador
printf("===[i=%d]===\n", i);
printf("positive_shift_R=%d\n", deslocamento direita quando lida com inteiros com sinal.
positive_shift_R); Deste modo, o comportamento fica dependente do compila-
sem_sinal_shift_R = sem_sinal >> i; dor empregue. No caso do cdigo da Listagem 17, quando
printf("sem_sinal_shift_R=%d\n",
sem_sinal_shift_R); compilada com o GCC numa plataforma Linux verifica-se
} que o operador deslocamento direita mantm o sinal da
return 0; valor inicial conforme ilustram os resultados da Listagem 18.
}

Listagem 15: Exemplo shift_right.c /* shift_right_signed.c */


#include <stdio.h>
===[i=0]=== int main(void){
positive_shift_R=998 int positive = 998;
sem_sinal_shift_R=998 int negative = -998;
===[i=1]=== int positive_shift, negative_shift;
positive_shift_R=499 int I;
sem_sinal_shift_R=499 for(i=0; I < 4; i++){
===[i=2]=== printf(===[shift right %d]===\n,i);
positive_shift_R=249 positive_shift = positive >> I;
sem_sinal_shift_R=249 negative_shift = negative >> I;
===[i=3]=== printf(positive_shift=%
d\n,positive_shift);

32

A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
printf(negative_shift=%d\n,negative_shift); assert( num_bit < num_bits_int );
} int mascara_num_bit = (1 << num_bit);
return 0; return ( valor & mascara_num_bit );
} }
Listagem 17: Exemplo shift_right_signed.c int main(void){
int hex = 0xF0F1F2F3;
int bit_i, i;
int total_bits = sizeof(hex) * 8;
===[shift right 0]=== printf("Converso de 0x%X:\n",hex);
positive_shift=998 for(i=total_bits-1;i>=0;i--){
negative_shift=-998 bit_i = is_bit_um(hex, i) ? 1 : 0;
===[shift right 1]=== printf("%d",bit_i);
positive_shift=499 if( (i % 4 == 0) && (i>0)){
negative_shift=-499 printf(".");
===[shift right 2]=== }
positive_shift=249 }
negative_shift=-250 printf("\n");
===[shift right 3]=== return 0;
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 No programa mostra_em_bin.c (Listagem 19), a fun-


deslocamento para a direita acrescenta um bit a zero se o valor o is_bit_um devolve zero se o bit num_bit do parmetro
inicial for no negativo, e um bit a um se o valor inicial for nega- valor zero e no zero (valor lgico verdadeiro) se o bit
tivo. Importa observar, que para nmeros negativos, e conside- num_bit for um. Para o efeito, a funo atribui varivel
rando que o operador deslocamento direita aplica a persis- mascara_num_bit um bit a um na posio pretendida atravs
tncia do bit mais significativo, a operao de deslocamento de da operao de deslocamento esquerda, aplicando posteri-
n bits para a direita j no produz uma diviso por 2n com trun- ormente a mascra atravs da operao de AND binrio. No
cagem. Por exemplo, a operao -998 >> 2 resulta, conforme exemplo, a funo chamada sucessivamente para mostrar
mostrado na Listagem 18, no valor -250 e no no valor -249 cada um dos bits da varivel hex, disponibilizando assim a
como seria expectvel pelo facto da diviso de -998 por 4 re- representao binria do valor da varivel hex como ilustra a
sultar em -249,5. Esta particularidade do operador desloca- Listagem 20.
mento direita tem causado erros em vrios sistemas, nomea-
Converso de 0xF0F1F2F3:
damente compiladores conforme discutido por Steele Jr. j em 1111.0000.1111.0001.1111.0010.1111.0011
1977 (Steele, 1977). De modo a evitar da armadilha do opera-
dor de deslocamento para a direita, a linguagem Java disponi-
Listagem 20: Sada da execuo de mostra_em_bin.c
bliza o operador deslocamento para a direita sem sinal, repre-
sentado pelo smbolo >>>. Esse operador preenche sempre a Ativao/desativao seletiva de bits
posio do bit mais significativo com um bit a zero.
A ativao seletiva de bits consiste em ativar, num
Casos de usos determinado valor inteiro, um ou mais bits a um. Por sua vez,
a desativao seletiva de bits corresponde operao inver-
Apresentam-se de seguida alguns dos casos de usos
sa, isto , colocar um ou mais bits a zero.
mais frequentes de manipulao binria.
A ativao seletiva de bits efetua-se atravs da ope-
Deteo do estado de um bit
rao de OR binrio, usando como operandos o valor que se
A deteo do estado de um bit consiste em determinar o pretende modificar e uma mscara apropriada. A mscara
valor do isimo bit de um determinada sequncia de bits. Para o deve ser constituda por bits a zero, exceto para os bits que
efeito, faz-se uso do operador AND binrio, tendo como ope- se pretendem ativar, que devem estar a um. Por exemplo,
randos o valor que se pretende analisar e uma mscara bin- caso se pretenda ativar os 4 bits menos significativos de um
ria. A mscara binria inteiramente composta por bits a zero, valor inteiro, deve-se empregar como mscara o valor binrio
exceto para o bit a um na posio do bit cujo valor se pretende que tenha os quatro bits menos significativos a 1111, estan-
detetar. do os restantes a zero. Deste modo, e considerando um va-
lor de 16 bits, a mscara corresponder ao valor 0X000F,
/*
* Exemplo: mostra representao em ativando-se os 4 bits menos significativos atravs da opera-
* bits do valor inteiro da varivel valor o: novo_valor = valor | 0x000F.
*
*/ A desativao seletiva de bits conseguida atravs
#include <stdio.h> da operao de AND binria, usando como operadores, o
#include <assert.h>
valor que se pretende alterar e uma apropriada mscara
int is_bit_um(int valor, int num_bit){ binria. A mscara binria deve ser composta por bits a zero
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 res- Ativao de opes
tantes posies. Por exemplo, caso se pretendam desativar os
Algumas funes da linguagem C requerem o uso da
4 bits menos significativos de um valor de 16 bits, usar-se- a
operao de OR binrio por forma a que seja possvel espe-
mscara 0xFFF0, resultando na seguinte operao: novo_valor
cificar mltiplas opes atravs de um parmetro. Um exem-
= valor & 0xFFF0.
plo a funo open que empregue para a abertura de um
Deteo de valores potncias de dois ficheiro. Conforme mostra a Listagem 23, a funo apresenta
dois parmetros. O primeiro corresponde ao caminho do
Determinar se o valor de uma determinada varivel in-
ficheiro que se pretende manipular. Mais interessante para o
teira sem sinal corresponde a uma potncia de dois uma
mbito deste artigo, o segundo parmetro, designado de
operao trivial quando se recorre a operaes binrias. De
flags, pois permite a especificao de vrios elementos. De
facto, dado que uma potncia de dois tem um e s um bit a um
facto, a documentao da funo open (e.g., man 2 open
(e.g., 16 que 0001.0000 em binrio), subtraindo-se uma uni-
num sistema Linux) indica que podem ser especificada, entre
dade potncia de dois, obtm-se um valor que tem todos os
outros, constantes para a criao de um ficheiro. Por exem-
bits direita do bit ativo da potncia de dois a um, e a zero o
plo, a criao de um ficheiro somente para escrita especifi-
bit ativo bem como todos os bits esquerda do bit ativo da
cada atravs de O_CREAT | O_WRONLY | O_TRUNC, isto
potncia de dois. Por exemplo, subtraindo uma unidade a 16
, especificando-se as opes O_CREAT, O_WRONLY e
obtm-se 15, correspondendo a 0000.1111 em binrio. Assim,
O_TRUNC atravs do operador OR binrio. O valor que
para determinar se um determinado valor uma potncia de
efetivamente recebido pela funo open corresponde pois ao
dois, basta efetuar uma operao de AND binrio entre o valor
resultado da operao de OR binrio das trs constantes. Na
e o valor menos uma unidade. Se o resultado for zero, o valor
prtica, as trs constantes so potncias de dois, significan-
em apreo uma potncia de dois. importante notar que
do que cada uma apenas tm um bit ativo. Tal confirmado
este algoritmo s vlido para valores positivos. A funo
pelo programa open_flag.c (Listagem 24) que mostra o valor
is_potencia_dois (Listagem 21) faz uso dessas propriedades
numrico das constantes O_CREAT, O_WRONLY e
das potncias de dois para detetar se parmetro valor corres-
O_TRUNC (Listagem 25). Deste modo, torna-se possvel
ponde ou no a uma potncia de dois. A sada da execuo do
passar, atravs de um mesmo parmetro, vrias configura-
programa is_potencia_dois mostrada na Listagem 22.
es, sendo cada configurao especificada por um ou mais
/* bits. Contudo, necessrio ter em conta que esta metodolo-
* Exemplo: operaes binria para averiguar gia de empacotamento em bits de configuraes requer cdi-
* se nmero positivo potncia de dois.
*/ go do lado da funo chamada para que essa possa identifi-
#include <stdio.h> car as configuraes pretendidas pela funo chamante.
int is_potencia_dois(unsigned int valor){
if( valor == 0 || valor == 1 ){ int open(const char *pathname, int flags);
return 0;
} Listagem 23: prottipo da funo open
return ((valor & (valor-1)) == 0? 1:0);
} /*
int main(void){ * Mostra o valor numrico de algumas das
unsigned int i; * constantes
for(i=2;i <= (1<<10); i++){ * que podem ser empregues pela funo open
if( is_potencia_dois(i) ){ */
printf("%u\n", i); #include <sys/types.h>
} #include <sys/stat.h>
} #include <fcntl.h>
return 0; #include <stdio.h>
} int main(void){
printf("O_WRONLY = %X\n", O_WRONLY);
Listagem 21: Exemplo is_potencia_dois.c printf("O_CREAT = %X\n", O_CREAT);
printf("O_TRUNC = %X\n", O_TRUNC);
return 0;
2 }
4
8 Listagem 24: Exemplo open_flags.c
16
32 O_WRONLY = 1
64 O_CREAT = 40
128 O_TRUNC = 200
256
512 Listagem 25: Sada do programa open_flags.c
1024
Listagem 22: Execuo de is_potencia_dois.c Notas finais

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 Para quem tem necessidade de recorrer manipulao ao
comum na programao sistema de baixo nvel, o exemplo da nvel do bit, ainda importante ter em conta os problemas,
funo open ilustra que a manipulao ao nvel de bit, embora uns mais subtis do que outros, que podem ser encontrados.
de forma implcita, ocorre frequentemente na linguagem C. exemplo disso o uso da operao de deslocamento direi-
ta, cujo comportamento varia consoante o compilador e a
plataforma que se est a usar.

Bibliografia
() a base binria
Baraniuk, C. (05 de 05 de 2015). The number glitch that can
composta por dois lead to catastrophe. Obtido de BBC: http://
www.bbc.com/future/story/20150505-the-numbers-
that-lead-to-disaster
valores distintos, re-
Open-STD. (2003). Rationale for International Standard -
presentados por zero e Programming Languages - C . Obtido de http://
www.open-std.org/JTC1/SC22/WG14/www/

um, da tambm se de- C99RationaleV5.10.pdf

Steele, G. L. (1977). Arithmetic shifting considered harmful.


signar por base dois 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 Window.SpeechRecognition ||
Window.webkitSpeechRecognition || null;
Atualmente, o reconhecimento de voz tem vrias aplica-
es no mundo real. O conceito de reconhecimento de voz //Caso no suporte esta API de voz
if (window.SpeechRecognition === null) {
est subjacente a softwares como o Siri e S-Voice. Esta aplica- document.getElementById
o pode melhorar drasticamente a usabilidade dos websites, ('unsuported').classList.remove('hidden');
principalmente para deficientes visuais. Por conseguinte, os } else {
//......
utilizadores podem navegar pelas pginas ou preencher cam- }
pos de formulrio utilizando a sua voz.

3. Mtodos e propriedades

Introduo Depois de testar o suporte e compatibilidade da API


criada uma instncia do objeto SpeechRecognition.
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 var recognizer = new window.SpeechRecognition();
de voz e recursos de sada de texto para voz num web
browser. Esta API tem em conta a privacidade dos utilizadores, Este objeto tem os seguintes mtodos:
pois antes de ativar a voz atravs do microfone, o utilizador
onstart: Define um callback que disparado quando
deve explicitamente conceder a permisso. O pedido de autori-
o servio de reconhecimento comeou a ouvir o udio
zao o mesmo que a API getUserMedia, apesar de no
para reconhecimento.
necessitar da webcam. Se a pgina que executa esta API usa
o protocolo HTTPS, o browser solicita a permisso apenas onResult: Define um callback que disparado quan-
uma vez. do o reconhecedor de voz devolve um resultado.
De seguida apresentado um exemplo bsico de como onerror: Define um callback que acionado quando
implementar esta API: ocorre um erro de reconhecimento de voz.
Primeira pgina com reconhecimento de voz
onend: Define um callback que disparado sempre
1. Estrutura HTML que o servio desligado (o evento gerado quando
a sesso termina).
A estrutura HTML muito simples:
Por conseguinte foi criada uma varivel com a funo
<p id="ol">Ol mundo!</p> de exibir o texto que o utilizador falou. Para a API reconhecer
<div id="transcription"></div>
<button id="rect">Gravar</button> a fala continuamente necessrio colocar a propriedade
<span id="unsuported" class="hidden">API continuous como true. Esta propriedade faz com que o
not supported</span> reconhecedor de voz no pare de ouvir, mesmo que tenha
O atributo transcription contm o texto que informa o pausas do utilizador.
que utilizador falou.
var transcription = document.getElementById
O boto rect o boto utilizado para reconhecer a ("transcription");
voz do utilizador.
//Para o reconmhecedor de voz no parar de ouvir,
O atributo unsupported utilizado caso a API no mesmo que tenha pausas do utilizador
recognizer.continuous = true;
seja suportada pelo browser.

2. Teste 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 Spe- recognizer.onresult = function (event) {
transcription.textContent = "";
echRecognition basta verificar se este objeto existe: for (var i = event.resultIndex; i <
event.results.length; i++) {
//Testa se o browser suporta if (event.results[i].isFinal) {
windows.SpeechRecognition = transcription.textContent =

36

A PROGRAMAR
RECONHECIMENTO DE VOZ COM JAVASCRIPT
event.results[i][0].transcript + 4. Evento de click
' (taxa de acerto [0/1] : ' +
event.results[i][0].confidence + ')'; Por conseguinte, foi criado um evento de click associ-
} else {
transcription.textContent += ado ao boto:
event.results[i][0].transcript;
} document.querySelector("#rect").addEventListener
} ("click", function () {
} try {
recognizer.start();
} catch (ex) {
Vamos analisar este cdigo com mais detalhe: alert("error: " + ex.message);
}
A propriedade results um array de objetos em que });
cada item do array contm um possvel resultado do reconheci-
mento de voz. Para verificar se j um resultado final utiliza-se
Onde:
a propriedade isFinal que booleana.
recognizer.start() inicia a gravao
transcription.textContent faz com que o texto den-
tro da <div id=transcription> seja limpo. e

for (var i = event.resultIndex; i < catch(ex) {


event.results.length; i++) o ciclo que percorre o evento alert(error: +ex.message);
que contm o texto que o utilizador falou. } faz o tratamento de log, caso exista, algum erro de grava-
o.
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,
Concluso
junto com a taxa de acerto, que varia entre 0 at 1. Caso
seja falsa, adicionado mais texto div. Esta foi uma breve explicao com a implementao
da primeira pgina com reconhecimento de voz. Para o efei-
to foi utilizada a API Web Speech de JavaScript. Esta API
uma mais-valia porque facilita muito a integrao de siste-
mas 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 cria-
tividade 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 desenvol-
Agora temos tudo pronto para comear.
vimento made in Portugal que te permite desenvolver aplica-
es web e mobile. As aplicaes so programadas visualmen- Cria a aplicao
te, e publicadas na cloud. Estes dois factores fazem com que
Abre o Service Studio. Cria uma nova aplicao e
consigas entregar as tuas aplicaes aos utilizadores muito
chama-lhe Memes.
rapidamente.
Uma aplicao constituda por mdulos. Num m-
Embora seja uma plataforma desenvolvida em Portugal,
dulo podemos definir o modelo de dados, implementar a lgi-
a OutSystems Platform est em grande crescimento a nvel
ca e desenhar a UI das nossas aplicaes. Para simplificar,
mundial e j utilizada por algumas das maiores empresas
a nossa aplicao ter um nico mdulo. Cria o mdulo e d-
como a Siemens, a Vodafone ou a Mercedes-Benz.
lhe 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 aplica-


o, precisamos de:

Instalar o IDE da OutSystems Platform, chamado Service


Studio. Este IDE o que nos permite desenvolver e publi-
car a aplicao;

Um ambiente na cloud para onde publicar a aplicao.


A OutSystems oferece um ambiente na cloud, basta nos
registarmos no site.
Desenha o ecr
Se j tens o Service Studio instalado e um ambiente na
cloud, podes saltar para a seco "Cria a aplicao". Caso Agora que j temos a nossa aplicao criada, vamos
contrrio vamos tratar rapidamente disso. tratar de desenhar o ecr. O nosso ecr ter a imagem do
post do 9GAG e um boto para ir buscar um novo post.
Obter o IDE e um ambiente na cloud
Na tab Interface, seleciona o elemen-
Primeiro, vamos criar uma conta no site da OutSystems.
Para tal acedes a www.outsystems.com/get-started e inseres to HomePage e nas suas propriedades ativa a opo
os dados que so pedidos no formulrio. Depois disso carrega Anonymous para que no nos tenhamos que preocupar
em Get Started. Irs receber um email para ativares a tua com a autenticao quando acedes ao ecr. De seguida faz
conta. duplo clique no elemento HomePage para abrir o ecr. Va-
Ao carregares em Activate Your Account, ir abrir uma mos adicionar um Container pgina. Um Container um
pgina no teu browser para preencheres com mais alguma Div em HTML. Arrasta da barra lateral esquerda o elemen-
informao sobre ti. Apenas o url e a password para a tua con-
to Container para dentro da pgina.
ta so obrigatrios. Uma das informaes que te iro ser pedi-
das 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 dispo-
nvel 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

A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS
De modo a centrar o elemento Image que colocmos Precisamos tambm de inserir um exemplo da res-
dentro do Container, seleciona o Container e na propriedade posta JSON retornada pela API, para que o Service Studio
Align escolhe Center. 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 selecio-
nares 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 Clica OK. O Service Studio cria um novo mtodo
ecrs. Na janela que aparece logo depois de arrastares, procu- REST de nome Get, com os parmetros de input section
ra por Icon e carrega OK. e id que definimos no URL (dentro das chavetas), e com o
Nas propriedades do Icon, atribui propriedade Name parmetro de sada Response.
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.

Vamos agora centrar o Icon, para tal seleciona o seu


Container (carrega no Icon e de seguida no elemento Contai-
ner 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/). Implementa a lgica

No Service Studio, vai tab Logic, abre a pasta Agora precisamos de implementar a lgica para invo-
Integrations e na opo REST carrega com o boto direito do car o mtodo da API que importmos, e usar o valor retorna-
rato e escolhe Consume REST API.... Na janela que aparece do para os elementos ecr.
de seguida, vamos preencher o pedido HTTP que vai ser feito
API para ir buscar os posts. Preenche os campos sob Para tal iremos usar uma Action. Uma action
Method URL com: como um mtodo em Java ou .NET. Na tab Interface, vai a
Screen Flows>Main Flow e faz clique com o boto direito
GET, o verbo HTTP que vamos enviar no pedido;
no ecr "Homepage". Seleciona Add Preparation. A ao
http://infinigag.eu01.aws.af.cm/{section}/{id}, o URL do Preparation uma ao especfica de um ecr e que corre
mtodo da AP sempre que o ecr carregado.

39
A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS
De seguida, vai tab Logic e em Agora que temos uma ao que retorna um post alea-
Integrations>REST e arrasta para o fluxo da ao o mtodo trio, s nos falta associar o dados do post selecionado ao
da API (de nome Get). Nos parmetros de entrada do mtodo ecr, mais concretamente associar a imagem do post ao
coloca: elemento Image.

section - trending, para obtermos os posts mais fala- De volta ao nosso ecr HomePage, clica no elemen-
dos no 9GAG; to Image. Define a propriedade Type como External e a
propriedade URL com o valor SelectedPost.Images.Large.
id 0, para os posts mais recentes.
Neste momento, quando abrires a pgina j poders
Precisamos agora de uma varivel para guardar o post ver a imagem do post. Mas antes de irmos experimentar,
que vamos querer apresentar. Da mesma forma que fizmos vamos apenas fazer com que carregar um novo post seja
para adicionar a ao Preparation, sobre o ecr HomePage, possvel ao clicar no Icon que inserimos para o efeito.
faz right-click e seleciona Add Local Variable.
Para tal, acede ao Container que tem o Icon (clica no
Icon e na barra inferior do Service Studio seleciona o ele-

mento 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 Vamos agora fazer com esta ao ao ser executada
de SelectedPost e o Data Type com o tipo DatumItem. carregue um novo post. No nosso caso bastar-nos- que
este ao recarregue a pgina. Para tal, faz double-
No fluxo, arrasta um elemento Assign e coloca-o click sobre a ao OnClick (na vore de elementos por ci-
por baixo do mtodo da API. Na janela de propriedades do ma das propriedades) e no seu fluxo adiciona o elemento da
Assign coloca: barra lateral esquerda Destination sobre o ltimo ele-
mento do fluxo.
Variable - SelectedPost, a varivel local que crimos;
Na janela que aparecer de seguida, procura por
Value - Response.Data[ TextToInteger HomePage, o nosso ecr e faz OK. Desta forma iremos
(GeneratePassword(1, false)) ], para aleatoriamente dizer que a ltima ao do fluxo ser abrir um novo ecr, que
obtermos um dos posts da resposta do mtodo da API. no nosso caso o mesmo.

40

A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS
Feito isto, podemos publicar para ver o resultado no Referncias

nosso tutorial. Para publicar, carrega no boto na parte Site oficial da Outsystems: www.outsystems.com
superior do Service Studio. Quando a tua aplicao estiver Documentao oficial do IDE da platafor-
ma: www.outsystems.com/help/servicestudio/9.0
publicada, o icon muda para azul . Clica nesse icon para
acederes aplicao que foi publicada. API do 9Gag (no oficial): http://k3min.github.io/infinigag/

Podes ver na aplicao web que aberta no teu Site do 9gag: www.9gag.com
browser, a imagem do post e a opo para carregar um novo
post.

Concluso

Existem muitas outras funcionalidades que podes explo-


Uma aplicao
rar e aplicaes que podes desenvolver em OutSystems. Espe-
ro que com este tutorial tenhas percebido como fcil desen-
constituda por mdu-
volver com a OutSystems Platform.

Segue o tutorial e alguma dvida ou informao adicio-


los. Num mdulo pode-
nal no hesites em contactar-me. Podes obter o cdigo e expe-
rimentar o resultado final deste tutorial (com a funcionalidade
mos definir o modelo
de poder fazer like/dislike num meme) em http://
www.outsystems.com/forge/component/1025/Memes/. de dados, implementar
a lgica e desenhar a
UI das nossas aplica-
As aplicaes so
es ()
programadas visual-
mente, e publicadas na
cloud. Estes dois facto-
res fazem com que
consigas entregar as
tuas aplicaes aos
utilizadores muito rapi-
damente

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 ferra-
mentas 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 ns.
Graph" no Microsoft Developer Tech Refresh, em Lisboa.
Um sinal enviado para o Office Graph sempre que:
Tentando ter uma noo sobre o nvel de conhecimento da
audincia sobre os temas que a abordar, perguntei quem co- Eu abro um documento no SharePoint Online ou no
nhecia o Office Graph e o Office Delve. Fiquei surpreendido OneDrive for Business;
por verificar que um assunto relativamente desconhecido da
maioria das pessoas. Na realidade, grande parte dos espeta- Um colega partilha um documento comigo;
dores que ali estavam a ouvir-me no fazia a mais pequena
Um colega me envia um email;
ideia do que o Office Graph e, por essa razo, pensei que
seria uma boa ideia escrever um artigo introdutrio sobre o Um colega me apresenta um slide deck em Power-
tema. Vamos ento comear pelo incio... Point;
O que um grafo? Eu realizo um "gesto social", ou seja, algo como pres-
Comear pelo incio implica explicar o que um grafo sionar o boto "like" num contedo do Yammer da
(ou graph, em ingls). Um grafo um conceito matemtico que empresa.
tambm utilizado em computao como uma estrutura de Mas no apenas de sinais que se alimenta o Office
dados, composta por ns (nodes) e arestas (edges). Cada n Graph, este tambm consegue obter informao sobre a
representa algum tipo de entidade, e cada aresta uma relao minha organizao ligando-se ao Azure Active Directory
entre duas dessas entidades. Cada aresta pode ainda ter uma (AAD) da minha organizao e ao meu perfil de utilizador no
direo e armazenar informao. SharePoint Online. A partir desta informao, o Office Graph
As redes sociais, como o Facebook, o LinkedIn ou o constri um mapa organizacional da minha empresa e passa
Yammer, utilizam este tipo de estrutura de dados para repre- a saber quem o meu manager e quem que reporta a
sentar as relaes entre pessoas e os contedos armazenados mim.
nas mesmas. Adicionalmente, o Office Graph utiliza mecanismos de
aprendizagem (machine learning) para identificar automatica-
mente as pessoas com quem eu trabalho ativamente, basea-
do 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 frequente-
mente 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 descre-


vendo o que que este faz. Vamos focar-nos numa pessoa
que utiliza o Office 365 nas suas atividades do dia-a-dia en-
quanto trabalha na sua empresa. Cada ao que esta pessoa
realiza envia um sinal para o Office Graph que, depois de pro-
cessado, pode originar uma nova relao entre dois dos seus Office Graph - ns (entidades) e arestas (relaes)

42

A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
O Office Graph faz isto para mim e para todos os cole- sagem.
gas que trabalham na minha organizao, assumindo que eles
No que respeita segurana, o Office Graph respeita
tambm usam o mesmo tenant de Office 365. por isto que o
as permisses de acesso que foram definidas sobre cada
Office Graph tambm apelidado de "crebro do Office 365".
contedo, independentemente de este estar armazenado no
O que est guardado no Office Graph? SharePoint Online, no OneDrive for Business ou no Exchan-
ge Online. Cada utilizador conseguir ver apenas os conte-
Atualmente, os ns do Office Graph
dos aos quais tem acesso.
so Documentos e Pessoas mas brevemente haver novos
tipos de ns. O Profile passar a viver no Graph, O que o Office Delve?
os Groups tambm tero os seus prprios ns assim como
O Office Delve uma aplicao web, recentemente
algumas das aes realizadas pelos utilizadores (que neste
adicionada famlia de aplicaes que constitui o Office 365.
momento correspondem apenas a arestas).
Foi anunciada na SPC (SharePoint Conference) em 2014
Nos eventos Build e Ignite deste ano, a Microsoft parti- com o nome de cdigo Oslo (ou Oslo Experience). Come-
lhou algumas estatsticas impressionantes que nos permitem ou por ser uma demo interna que mostrava como apresen-
ter uma ideia da escala que o Office Graph atinge: tar a informao armazenada no Office Graph e foi constru-
da pela equipa da Microsoft de Oslo, na Noruega, que anteri-
O Office 365 armazena mais de 70 PetaBytes de informa- ormente era parte da FAST antes desta ser adquirida pela
o espalhada por todos os seus tenants. Isto correspon- Microsoft.
de a mais de 78.812.993.478.983.680 bytes!
O Office Delve descrito como uma experincia de
Foram enviados mais de 60 mil milhes de anexos de Search & Discovery (ou Pesquisa & Descoberta) porque,
email atravs do Exchange Online; por um lado, permite-nos fazer pesquisas sobre pessoas e
documentos atravs da introduo de termos numa caixa de
Todos os meses so marcadas 850 milhes de reuni- pesquisa (a componente de Pesquisa mais tradicional). Por
es atravs do Exchange Online; outro lado, apresenta-nos os contedos que nos interessam
sem que seja necessrio pesquisar por eles (a tal compo-
O Office Graph tem atualmente mais de 4 bilies de nente de Descoberta). Este , alis, o seu principal elemento
ns e 8 mil milhes de relaes entre ns (arestas); diferenciador e faz com que o Office Delve funcione especial-
mente bem como a homepage personalizada do Office 365.
25% de todas as relaes so entre pessoas.
A Home Page
Esta escala s possvel na nuvem, onde o poder com-
putacional e a capacidade de armazenamento so praticamen- Para quem tem uma subscrio de Office 365, o
te ilimitados. tambm por isso que o Office Graph no est acesso ao Office Delve feito atravs do menu de aplica-
disponvel on premises. No entanto, ser possvel utilizar uma es do Office 365 (pressionando o boto do waffle no canto
abordagem hbrida e ligar uma farm de SharePoint Server superior esquerdo) e clicando no cone do Delve.
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.

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 utiliza-
do para calcular quo importante esse documento
para mim, e quo forte a minha relao com o autor
desse documento. No entanto, essa contagem nunca
Menu do Office 365
partilhada com ningum.
imediatamente apresentada a Home Page que
O envio de emails tambm uma ao privada, apenas
mostra os contedos que o Office Graph "pensa" que me
disponvel ao remetente e ao destinatrio da mensagem
interessam. Podem ser contedos que eu prprio editei, que
de email, assim como qualquer anexo da referida men-

43
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 conversa-
colega com o qual tenho interaes frequentes. o no Yammer sobre o contedo

7. Boto para adicionar o contedo a um Board

A Me Page

A Me Page apresenta informao que est direta-


mente relacionada comigo. composta por duas subpgi-
nas: a Activity Page e a Profile Page.

A Activity Page apresenta os contedos que eu edi-


tei pessoalmente ou que foram explicitamente parti-
lhados comigo. Nesta pgina ainda possvel aceder
a informao adicional sobre mim atravs da hiperli-
gao para a Trending Around Me Page que, por
sua vez, mostra as pessoas e os contedos que o
Office Delve Homepage
Office Graph automaticamente inferiu que esto rela-
Do lado esquerdo, o Delve apresenta a lista de pessoas cionados comigo, com base na minha utilizao da
com as quais eu trabalho. So sempre utilizadores que perten- plataforma.
cem ao mesmo tenant de Office 365, o que normalmente quer
dizer que trabalham na mesma empresa que eu. Esta informa- A Profile Page apresenta uma vista agregada do
o automaticamente calculada com base nas trocas de meu perfil de utilizador, com informao obtida a par-
emails, documentos partilhados, visualizados e editados. tir da Active Directory da minha organizao e do
perfil de utilizador do Office 365. O diagrama organi-
zacional (organograma) automaticamente calculado
com base no valor da propriedade Manager de cada
perfil de utilizador.

Boards

No Delve, um Board um grupo de cartes de conte-


dos, agregados atravs de uma etiqueta (tag). um con-
ceito 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 diferen-
tes de cartes de contedos.

Office Delve Carto Interrogar o Office Graph

Cada contedo apresentado sob a forma de um car- Dado todo o contedo armazenado no Office Graph,
to contendo a seguinte informao: natural que os developers tenham interesse em interrog-
lo e queiram usar todo este conhecimento nas suas prprias
1. A razo que justifica que o contedo esteja a ser mos-
aplicaes de negcio. Atualmente h duas formas de inter-
trado
rogar o Office Graph:
2. O ttulo do contedo
Atravs de Graph Query Language (GQL)
3. Imagem extrada automaticamente do contedo
Atravs da Office 365 Unified API
4. Tipo de contedo (ou aplicao associada a este)
Graph Query Language
5. Localizao do contedo
A Graph Query Language (GQL) foi desenvolvida
6. cones para partilhar o contedo por email, para gerir para ser utilizada pelo Office Delve e funciona sobre a API

44

A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
REST da pesquisa. Utiliza uma sintaxe semelhante FQL vel, representa a data e hora em que decorreu determinada
(FAST Query Language, a linguagem utilizada pela plataforma ao representada pela aresta.
de pesquisa FAST e suportada tambm no SharePoint 2013)
Para filtrar o grafo por este atributo, utiliza-se
ou no tivessem ambas sido criadas pelas mesmas pessoas.
a query abaixo que retorna todos os itens modificados pelo
Antes de mergulhar no GQL, necessrio discutir al- utilizador autenticado no dia 15-08-2015.
guns conceitos importantes:
ACTOR(ME, AND(action:1003, time:datetime
No Office Graph, todos os ns (nodes) representam (2015-08-15)))
uma entidade, como um documento ou uma pessoa, e
cada n identificado por um nmero inteiro; Como se pode verificar pelos exemplos apresenta-
dos, o filtro pela ao o mais comum, mas requer que se
Cada aresta (edge) representa uma ao entre dois ns saiba o cdigo da ao pela qual se pretende filtrar o grafo.
e tem uma direo, ou seja, um n de origem A tabela abaixo resume as aes e respetivos cdigos.
(chamado actor) e um n de destino (chamado object);
Ao ID Descrio
Uma aresta pode ainda ter informao adicional, como

1021
um timestamp e um peso (weight).
Feed do utilizador
(actor) tal como mostrado
PersonalFeed
Em GQL existe apenas um operador - ACTOR - que na sua homepage no Del-
usado da seguinte forma: ve. Privada.

1003
ACTOR(<ActorId> [, filter]) Itens modificados pelo
Modified
utilizador nos ltimos 3
O primeiro parmetro sempre o identificador do n

1015
sobre o qual queremos fazer a query. Opcionalmente, pode ser Pessoas que reportem ao
OrgColleague
adicionada uma expresso para filtrar os resultados. mesmo manager que o
1014 1013 1019 Pessoas que reportam ao
Por exemplo, para obter todos os itens modificados por um OrgDirect
utilizador especfico, utilizaria a seguinte query GQL: utilizador.

ACTOR(1234, action:1003)
OrgManager A pessoa a quem o utiliza-
Pessoas com as quais o
Em que: utilizador comunica ou
WorkingWith
colabora com frequncia.
1234 o identificador do utilizador (ou seja, do seu n) Privada.
1020

1003 o cdigo da ao "modified by" Itens populares junto das


pessoas com as quais o
Para interrogar o Office Graph necessrio injetar
TrendingAround
utilizador comunica ou
a query GQL num pedido API REST da pesquisa, utilizando o colabora com frequncia.
1001

parmetro Properties tal como apresentado abaixo:


Itens visualizados pelo
Viewed
https://[URL tenant]/_api/search/query? utilizador nos ltimos 3
QueryText='*' &Properties='GraphQuery:actor(1234
1033

\,action\:1033)' &SelectProperties='DocId,Title' Verso pblica da aresta


WorkingWithPublic
WorkingWith.
Para obter os itens relacionados com o utilizador auten-
ticado, pode ser utilizada a query abaixo, em que a pala- Muitas outras queries podem ser realizadas com
vra ME automaticamente substituda pelo identificador deste. GQL. Para saber mais, visite este endereo: https://
msdn.microsoft.com/en-us/office/office365/howto/query-
ACTOR(ME) Office-graph-using-gql-with-search-rest-api.

possvel ainda combinar mais do que uma expresso Office 365 Unified API
de filtro atravs de operadores lgicos. O exemplo abaixo per- A nova Unified API expe todas as APIs do Office
mite obter todos os itens modificados ou visualizados pelo utili- 365 a partir de um nico endpoint, oferecendo
zador 1234. aos developers uma experincia mais robusta e consisten-
ACTOR(1234, OR(action:1001, action:1003)) te. A utilizao de um nico fluxo de autenticao tambm
muito mais simples do que realizar a autenticao separada-
Como indicado acima, as arestas do grafo so caracteri- mente para cada API do Office 365.
zadas por vrios atributos. Um deles o cdigo da ao A Unified API pode ser utilizada para operaes
(action) mas existem outros como o time que, quando aplic-

45
A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
CRUD (Create, Read, Update and Delete) sobre mltiplas enti- bm armazenadas no Graph, tal como entidades de
dades da plataforma Office 365, des- negcio;
de Users (utilizadores) e Groups (grupos)
at Files (documentos) e Mail (mensagens de email), e at
Conetores para permitir a outros sistemas como Dy-
ao Office Graph. namics CRM, Salesforce ou Trello, o envio de sinais
para o Office Graph;
Atualmente, a Unified API ainda est em Preview e al-
gumas das operaes ainda no esto disponveis. No entan- Custom Analytics;
to, j possvel utiliz-la com qualquer tenant de Office 365
Notificaes sempre que determinadas aes so
utilizando o endpoint com o endereo:
realizadas sobre o Graph;
https://graph.microsoft.com/beta/
Licenciamento para a utilizao do Office Graph.
Alm de aes relacionadas
No que respeita ao Office Delve, podem esperar:
com Users, Groups ou Files, a Unified API fornece o acesso a
duas aes muito importantes do Office Uma nova Profile Page mais rica;
Graph: TrendingAround e WorkingWith.
Uma nova rea para os Office 365 Groups com infor-
A ao TrendingAround retorna todos os ns relacio-
mao analtica;
nados com um utilizador especfico, tal como inferido pelo Offi-
ce Graph, e pode ser invocada da seguinte forma: Uma nova rea dedicada organizao com informa-
o analtica.
https://graph.microsoft.com/beta/me/trendingAround
Para saber mais...
A ao WorkingWith retorna a lista dos colegas que
colaboram ativamente com um determinado utilizador, tal como Para quem est interessando em aprender mais so-
inferido pelo Office Graph, e pode ser invocada da seguinte bre Office Graph, aqui ficam alguns links interessantes:
forma:
Aprender sobre Office Graph
https://graph.microsoft.com/beta/me/workingWith
http://dev.office.com/officegraph
Para mais informao sobre como utilizar a Unified API:
Criar apps com Office 365 API e com a Unified API
http://dev.office.com/unifiedAPIs
https://msdn.microsoft.com/en-us/office/office365/api/
https://msdn.microsoft.com/en-us/office/office365/howto/ api-catalog
office-365-unified-api-overview
Testar a Office Graph Preview API
O que que a vem?
http://msdn.microsoft.com/en-us/library/office/
O Office Graph e o Office Delve so ainda tecnologias dn783218(v=office.15).aspx
muito recentes, com muito para evoluir e, por estarem to inti-
mamente relacionadas, evoluiro juntas.

O roadmap do Office Graph inclui:

A nova Unified REST API, atualmente em preview;

Client SDKs para simplificar a integrao e a autentica-


o 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 partici-
pado 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
Existem centenas de microcontroladores dispon-
Um dos mais comuns e mais falados problemas de
veis no mercado, uns mais caros, outros mais baratos, para
segurana de um sistema de informao so as passwords
todos os gostos e propsitos. Neste caso, usei e, recomendo
sem qualidade muitas vezes motivadas pela dificuldade de
o uso dos microcontroladores baseados em ATMega U32,
memorizao das mesmas.
como o caso do Arduino Leonardo, Yun, etc . Esta escolha
De forma a enquadrar o leitor, cada password deve ter prende-se principalmente pelo suporte USB de que dispem,
um comprimento adequado e preferencialmente no ser previ- permitindo que sejam tratados pelo sistema operativo como
svel. Por exemplo, uma password como um teclado USB.
1979aMelhorGeracaoDeSempre!(27 caracteres), previsvel
Neste caso usei um Arduino Leonardo R3, baseado
se considerarmos que o utilizador nasceu em 1979 e possivel-
no Microcontrolador ATmega32u4, com 20 pinos digitais de
mente falar imenso desse facto gabando a sua gerao. Nes-
input/output, 7 canais PWM, 32KB de memria Flash (dos
te caso, apesar de ser fcil de memorizar, relativamente sim-
quais apenas 28 esto disponveis, pois 4 so usados pelo
ples de adivinhar, ou melhor deduzir, por parte de algum
bootloader), 2.5KB de SRAM, 1KB de EEPROM, e um peso
que pretenda obter acesso ao sistema no qual o utilizador em
relativamente baixo de 20g (o circuito completo pesar cerca
causa usa esta password.
de 70g).
Por outro lado, passwords com qualidade como:
Depois de alguma pesquisa e tendo em conta que
zb8@g-DMK&7@%pRyhE45DhbbPs$!
era desejvel um circuito de pequenas dimenses, baixo
angSRhHNUenBpu4AZ4+$KLA-gcJFYfdwV=yN$RXw6TmD-
custo e uma interface de utilizador simples de usar, optei por
YTpBf9?dWRkRAXu35XhwE=d*!vt53-m8dq34fmr?
adicionar ao Arduino, um LCD Keypad Shield, simples com
cCAv#k#u*gsSdgg (128 caracteres), apesar de serem pratica-
16 colunas por duas linhas, 6 teclas, com 8 caracteres pro-
mente impossveis de deduzir, so demasiado complexas para
gramveis pelo utilizador, de forma a ser possvel digitar
serem memorizadas, tornando o seu uso difcil e praticamente
uma password e interagir com o dispositivo.
invivel.
Programa
Quanto mais complexa for uma password, mais
complexa ser a sua memorizao e mais tendenciosa ser. Escolhidos os componentes de hardware, o circuito
Por exemplo contrariamente anteriormente apresentada que relativamente fcil de programar em C++, usando ou o ambi-
tem 128caracteres, uma password grande em tamanho, ente de desenvolvimento do Arduino, ou outro, como o Vi-
definida por um metodo que no seja pseudo-aleatrio, para sual Studio. Optei por fazer a reprogramao na linha de
memorizao tender a ser um conjunto de caracteres comandos usando um editor de texto (no meu caso o nano),
segundo por exemplo uma cifra Csar. e usando o platformio, para compilar e fazer upload do pro-
grama via interface de linha de comandos (CLI).
Deve sempre existir uma razoabilidade entre o tama-
nho das passwords e aquilo que elas protegem. Os exemplos Como as passwords sero armazenadas na memria
dados, so simplesmente para ilustrar a questo da dificuldade flash do arduino e considerando que estas devem ser muda-
de memorizar passwords. das com regularidade, o que implica compilar novamente o
sketch do arduino e fazer o respectivo upload, o platformio
Existem diversos projectos que tentam resolver este
uma opo bastante boa para estas tarefas, sendo de insta-
problema; entre eles, um dos que me parece mais interessante
lao e utilizao simples, cross-platform. Acima de tudo,
e que recentemente se tornou comercialmente disponvel, o
eficaz.
Mooltipass, baseado em arduino. Este projecto, tem diversas
funcionalidades sendo a sua segurana elevada, na minha Instalao do Platformio
opinio, perde um pouco pelo elevado custo.
Para instalar o platformio deve-se ter instalado o
Com base no conceito de cofre de passwords e com Python 2.7, (ateno que no compatvel com as verses
a ideia de que o factor custo pode em muitos casos ser um 3.x).
problema, pensei em fazer o meu prprio XXVBcofre de pas-
Em GNU/Linux e Mac OS X, a instalao segue os seguintes
swords, de baixo custo, que se comportasse como um teclado
passos:
e fosse capaz de digitar qualquer uma das minhas passwords,
sem que eu tivesse de as digitar manualmente nem das saber python -c "$(curl -fsSL https://
de cabea! Passemos ento, caro leitor, prtica raw.githubusercontent.com/platformio/
platformio/

49
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
master/scripts/get- temos mais do que uma password diferente e essa ser, de
platformio.py)" facto, a poltica mais segura. Uma vez que as passwords
cd /path/get-platformio.py/script sero armazenadas num cofre, ser necessria uma s
python get-platformio.py
pip install https://github.com/platformio/ senha para acedermos a todas as senhas guardadas nele.
platformio/archive/develop.zip No entanto precisamos de aceder a cada senha especifica-
pip install platformio && pip install --egg scons
pip install -U platformio mente, para no inserirmos senhas trocadas, bem como
pip install https://github.com/platformio/ para escolhermos que senha digitar. Para tal precisamos de
platformio/archive/ um interface que nos permita escolher a senha. Neste caso
develop.zip
ser o LCD a mostrar a senha e o keypad vai permitir-nos
Em Windows a instalao segue passos ligeiramente escolher a senha.
diferentes:
Explorando um pouco o cdigo:
python.exe get-platformio.py
pip search platformio No incio do programa, por brincadeira e at nostal-
pip install platformio && pip install --egg scons gia, criei alguns caracteres de 8x5 bits, dos quais apenas
pip install -U platformio uso dois no incio do programa, mas que no deixam de ter a
pip install https://github.com/platformio/
platformio/archive/develop.zip sua graa. Caso o leitor deseje explorar um pouco mais bas-
tar eliminar um dos existentes no programa e criar um novo,
sendo o processo simples. Os bits a zero, significam que
Uma vez instalado o platfromio, ser necessrio instalar
nada ser exibido no lcd e os bits a 1 exactamente o oposto,
a plataforma atmelavr. Neste caso os passos so os mesmos
como se ilustra no exemplo seguinte:
quer se esteja a usar Windows, GNU/Linux ou MacOS X.
platformio install atmelavr byte smiley[8] = {
cd directorioDoProjecto B00000,
platformio init B10001,
B00000,
Dentro desta directoria estar um ficheiro chamado plat- B00000,
B10001,
formio.ini, que devemos editar e colocar com as configuraes B01110,
correctas, de placa de desenvolvimento, plataforma, framework B00000,
e porta. };

# Como o LCD Keypad tem apenas 6 teclas (Select;


# Project Configuration File Left; Up; Down; Right; Rst), e dessas 6 apenas devem ser
# usadas 5, pois a tecla Rst est pr-definida para fazer o re-
# A detailed documentation with the EXAMPLES is
located here: set ao circuito, temos de programar a intercepo das res-
# http://docs.platformio.org/en/latest/ tantes teclas, para lhes atribuirmos funcionalidades. Para tal
projectconf.html
# comeamos por definir os valores delas quando premidas:
# A sign `#` at the beginning of the line
indicates a comment //mapa de teclas e respectivos valores
# Comment lines are ignored.
# Simple and base environment /*
[env:mybaseenv] +----------+---------+
platform = atmelavr | Texto | Pino |
framework = arduino +----------+---------+
board = leonardo | UP | 0 |
upload_port = COM10 | DOWN | 1 |
# | SELECT | 2 |
# Automatic targets - enable auto-uploading | RIGHT | 3 |
targets = upload | LEFT | 4 |
+----------+---------+
No meu caso a porta correcta foi a COM10. Convm */
#define UP 0
verificar qual a porta que est a ser utilizada pelo Arduino. #define DOWN 1
#define SELECT 2
Para compilar e fazer o upload do sketch para o Ardui- #define RIGHT 3
no, utilizando o platformio, via CLI, basta digitar o comando: #define LEFT 4

platformio run --target upload


De seguida criamos as funes destinadas leitura
das teclas se premidas. As teclas esto ligadas a pinos ana-
Voltemos ao desenvolvimento da nossa aplicao,
lgicos, logo temos de ler intervalos de valores, usando a
que ir armazenar as passwords e digit-las quando precisar-
funo analogread(), para fazer a leitura dos mesmos.
mos.
int ReadKey()
Tal como escrevi no incio do artigo, normalmente {

50
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
int x = 1023;
do B00100,
{ B00010,
x = analogRead (0); B00010,
if (x < 60) return RIGHT; B00100,
else if (x < 200) return UP; B01000,
else if (x < 400) return DOWN; B10000
else if (x < 600) return LEFT; };
else if (x < 800) return SELECT; byte et[8] = {
} B11111,
while (x > 800); B10101,
} B11111,
B00100,
B01110,
Com estas funcionalidades bsicas implementadas, B11111,
optei por criar um array de chars com todos os caracteres A- B11111,
B11111
Z; a-z; 0-9, para permitir que a password seja uma string do };
comprimento que o utilizador decidir. Tambm foi opo na byte sandclock[8] = {
programao das teclas usar a tecla left para acrescentar o B11111,
B01110,
caracter actual password, permitindo assim escrever a pas- B01110,
sword, normalmente, e a tecla Select, para introduzir a pas- B00100,
sword, uma vez toda digitada. B01110,
B01110,
Posto isto, basta apenas fazer um simples menu, co- B11111,
B00000
mo explicado no prprio cdigo, para se navegar entre as };
senhas armazenadas. byte cat[8] = {
B01010,
O cdigo do scratch ser o seguinte: B11111,
B10101,
B11111,
/* B00100,
*Thx to Mkman for the help and advice! B01110,
*In loving memory of B01110,
* Misha II B11111
* 12/12/2004 - 13/07/2015 };
* You are missed
*/ //define a senha para abrir o cofre
static String strkey = "abcddcba";
#include <LiquidCrystal.h> //Descries das passwords
#include <String.h> //So armazenado na memria flash (no voltil)
do arduino.
//cria alguns caracteres engraados static char *desc[] = { "P@P", "Gmail", "MyApp",
byte smiley[8] = { "Blog", "FacelessBook" };
B00000, //Passwords
B10001, static char *keys[] = { "Password1", "Password2",
B00000, "Password3", "Password4", "Password5" };
B00000, //array de caracteres ascii com as letras a-z;A-
B10001, Z;0-9
B01110, static char ascii[] = {'a', 'b', 'c', 'd', 'e',
B00000, 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
}; 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
byte skull[8] = { 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
B00000, 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
B01110, 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2',
B10101, '3', '4', '5', '6', '7', '8', '9', '0'};
B11111, //mapa de teclas e respectivos valores
B11011,
B01110, /*
B01010, +----------+---------+
}; | Texto | Pino |
byte tulip[8] = { +----------+---------+
B10101, | UP | 0 |
B11111, | DOWN | 1 |
B11111, | SELECT | 2 |
B01110, | RIGHT | 3 |
B00100, | LEFT | 4 |
B10101, +----------+---------+
B01110, */
B00100 #define UP 0
}; #define DOWN 1
byte prompt[8] = { #define SELECT 2
B10000, #define RIGHT 3
B01000, #define LEFT 4

51
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!

int index = 0; i++;
#define COUNT 5 //numero de passwords e descries //lcd.clear();
//armazenadas break;
case DOWN:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Inicializa if (i <= 0)
//O lcd {
i = 0;
/* } else if (i >= 62)
*funo que tem como misso interceptar a leitura {
analgica dos pinos das teclas up, down, left, i = 0;
right e select }
*/ else {}
int ReadKey() i--;
{ c = ascii[i];
int x = 1023; lcd.print(c);
do break;
{ case LEFT:
x = analogRead (0); lcd.clear();
if (x < 60) return RIGHT; break;
else if (x < 200) return UP; case RIGHT:
else if (x < 400) return DOWN; str += c;
else if (x < 600) return LEFT; lcd.clear();
else if (x < 800) return SELECT; break;
} case SELECT:
while (x > 800); Serial.println(str); //for debug porposes
} Serial.println(strkey); //for debug
/* //porposes
*funcao setup return str.compareTo(strkey);
*/ }
void setup() }
{ }
Keyboard.begin(); /**
lcd.createChar(0, smiley); funcao de bloqueio
lcd.createChar(1, skull); */
lcd.createChar(2, tulip); void blocked(void) {
lcd.createChar(3, prompt); int i = 0;
lcd.begin(16, 2); //16 colunas por 2 Linhas for (i = 30; i >= 0; i--) {
lcd.setCursor(0, 0); lcd.clear();
lcd.print("Lego Pwd Safe"); lcd.setCursor(0, 0);
lcd.setCursor(0, 1); lcd.print("Locked");
lcd.print("by apocs"); lcd.setCursor(0, 1);
lcd.write(byte(0)); lcd.print("");
lcd.write(byte(1)); lcd.print("seg");
lcd.write(byte(2)); delay(1000);
delay(5000); }
lcd.clear(); }
Unlock(); /** funcao de desbloqueio
} */
void Unlock() {
/** int count = 0;
funcao que tem por tarefa interceptar as teclas while (1) {
primidas e permitir que seja composta a string da if (inkeys() != 0)
password count++;
*/ else
int inkeys() return;
{
lcd.write(byte(3)); if (count == 2) {
int i = 0; blocked();
char c; count = 0;
String str; }
while (1) }
{ }
int key = ReadKey();
delay(200); void loop()
switch (key) {
{ // put your main code here, to run repeatedly:
case UP: lcd.clear();
if (i >= 62) lcd.setCursor(0, 0);
{ lcd.print("Pass: ");
i = 0; lcd.setCursor(0, 1);
} lcd.print(desc[index]);
c = ascii[i]; int key = ReadKey();
lcd.print(c); delay(200);
//inc switch (key)

52
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
{ EEPROM 24LC256, que so relativamente simples em ter-
case UP: mos de interface com o Arduino, ou at acrescentar funcio-
--index; nalidades de criptografia por hardware, por exemplo com um
if (index < 0) index = COUNT - 1;
break; Atmel ATSHA204, que pode ser facilmente encontrado on-
case DOWN: line por um preo bastante baixo, mesmo quando j montado
++index;
if (index > (COUNT - 1)) index = 0; numa breakout board, o que facilitar a ligao ao arduino.
break;
case SELECT: Ficou tambm por explorar a possibilidade de cons-
Keyboard.print(keys[index]); truir uma caixa, para o circuito, possivelmente at feita numa
lcd.print(" - OK"); impressora 3D em polmero ABS, ou outro. No entanto essa
delay(1000);
break; temtica sairia muito do mbito especifico deste artigo.
}
} Outra possibilidade que no foi explorada neste
artigo, foi a escrita de um driver no-standard para o disposi-
Uma vez carregado o scratch no Arduino, bastar lig- tivo, que permitisse algumas funcionalidades extra. Neste
lo numa porta USB, que far a dupla funcionalidade de o ali- caso foi uma opo para evitar usar drivers no padro, uma
mentar e de comunicar com o computador, permitindo assim vez que o dispositivo funciona nas principais plataformas
que se utilize o circuito para introduzir passwords onde precisa- Microsoft Windows, GNU/Linux e Apple Mac OS.
mos de as usar.
Ficou igualmente por explorar o desenvolvimento de
Cada vez que alteremos ou acrescentemos pas- uma app com uma interface de utilizador simplificada, para o
swords ao cofre, bastar alterar o valor da constante COUNT carregamento de novas passwords e descries para o cir-
e/ou acrescentar ou alterar nos vectores de descrio e cha- cuito! Inicialmente ainda pensei em incluir tambm esta te-
ves, as respectivas descries e chaves. mtica no artigo, mas cedo decidi no o fazer deixando ao
critrio do leitor desenvolver a sua prpria aplicao caso
Concluso
ache interessante. Pessoalmente eu f-lo-ia usando as ferra-
Como referido no incio do artigo, recordar na nossa mentas Xamarin, uma vez que se trata de um sistema cross-
prpria memria dezenas de passwords extremamente difcil, platfrom, mas preferi deixar ao critrio do leitor e/ou de um
pelo que o armazenamento externo das mesmas se torna inte- segundo artigo sobre este mesmo tema.
ressante 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.

Ao longo deste artigo, expliquei como construir um cir-


cuito, baseado em Arduino Leonardo e LCD Keypad de 6 te-
clas, 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 Softwa-
re 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 public class Person
lanada a verso 6 da linguagem de programao para a plata- {
[CompilerGenerated]
forma .NET C#. [DebuggerBrowsable
(DebuggerBrowsableState.Never)]
Como neste lanamento o enfoque principal foi na nova public string k__BackingField = "Jane";
plataforma de compiladores (Roslyn), os melhoramentos e [CompilerGenerated]
adies linguagem foram escassos mas, tal como os melho- [DebuggerBrowsable
(DebuggerBrowsableState.Never)]
ramentos e adies das verses anteriores, tornaro a vida de public string k__BackingField = "Doe";
quem desenvolve usando a linguagem de programa-
o C# muito melhor. public string First
{
[CompilerGenerated]
1. Melhoramentos em auto-propriedades get { return k__BackingField }
[CompilerGenerated]
As propriedades implementadas automaticamente (ou, set { k__BackingField = value; }
abreviando, auto-propriedades) so propriedades no abstra- }
tas e no externas com acessores com corpo apenas com pon- public string Last
{
to e virgula. [CompilerGenerated]
get { return k__BackingField }
Quando uma propriedade implementada automatica- [CompilerGenerated]
mente, criado um campo escondido para dar suporte pro- set { k__BackingField = value; }
priedade e os acessores de leitura e escrita so so implemen- }
}
tados para, respetivamente, ler e escrever desse campo.
Note-se que os cam-
pos k__BackingField e k__BackingField tm nomes que no
1.1. Inicializadores para auto-propriedades so vlidos em C#. Tal acontece para que no haja qualquer
hiptese de coliso entre os atribudos pelo programador e
Passa a ser possvel declarar a inicializao de auto-
os nome atribudos pelo compilador.
propriedades da mesma forma que se inicializam os campos:
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";
public class Person
}
{
public string First { get; } = "Jane";
Com esta sintaxe, o inicializador inicializa diretamente o public string Last { get; } = "Doe";
campo que d suporte propriedade sem recorre ao setter da }
propriedade.

Os inicializadores de propriedades so executados, tal Neste caso, o campo gerado declarado implicita-
como e juntamente com, os inicializadores de campos. mente como readonly (embora isto apenas tenha importn-
cia para efeitos de reflexo reflection).
Tal como acontece com os inicializadores de campos,
os inicializadores de propriedades no podem fazer referncia semelhana do caso anterior, o cdigo gerado ser:
a this porque, tal como acontece com os inicializadores dos
campos, correm antes dos objetos estarem devidamente inicia- public class Person
lizados. {
[CompilerGenerated]
A implementao desta nova funcionalidade feita [DebuggerBrowsable
(DebuggerBrowsableState.Never)]
usando funcionalidades tradicionais da linguagem tornado pos- private readonly string k__BackingField =
svel a utilizao do cdigo gerado em verses anteriores da "Jane";
[CompilerGenerated]
plataforma .NET. Na verdade o cdigo anterior traduzido pelo [DebuggerBrowsable
compilador para o seguinte cdigo C# 1: (DebuggerBrowsableState.Never)]
private readonly string k__BackingField =
"Doe";

55
C#
AS NOVIDADES DO C# 6
public string First public Point Move(int dx, int dy)
{ {
[CompilerGenerated] return new Point(x + dx, y + dy);
get { return k__BackingField; } }
}
public string Last
{ public static Complex operator +(Complex a,
[CompilerGenerated] Complex b)
get { return k__BackingField; } {
} return a.Add(b);
} }

Tal como acontece com os campos apenas de leitura,


no caso das auto-propriedades apenas de leitura possvel public static implicit operator string (Person p)
inicializar o seu valor no construtor: {
return p.First + " " + p.Last;
}
public class Person
{ Para mtodos cujo tipo de retorno se-
// ... ja void (ou Task para mtodos assncronos) a sintaxe da
public Person(string first, string last) seta ainda se aplica, mas a expresso que se segue tem de
{ ser uma instruo ( semelhana do que j acontece com as
First = first; lambdas):
Last = last;
} public void Print() => Console.WriteLine(First + "
}
" + Last);
E, mais uma vez, o compilador gera cdigo equivalente
a C# 1:
que ser traduzido para:
public class Person
{ 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
}
Os corpos do tipo expresso tambm podem ser usa-
2. Membros funo com corpo em formato expresso dos para definir o corpo de propriedades e indexadores ape-
Passam a poder ser usadas expresses semelhantes nas de leitura:
s funes lambda para definir corpos de funes com apenas
de uma instruo (statement) ou bloco trazendo s funes public string Name => First + " " + Last;
membros de tipos a mesma clareza e simplicidade.

2.1. Corpos em formato expresso em membros do tipo public Person this[long id] => store.LookupPerson
(id);
mtodo

Mtodos, assim como operadores definidos pelo utilza- Note-se a ausncia da palavra-chave get, que se
dor e converses, podem ter o seu corpo definito por uma ex- torna implcita pela sintaxe de expresso.
presso usando a seta das lambdas:
Os exemplos anteriores so traduzidos pelo compila-
public Point Move(int dx, int dy) => new Point(x + dor para:
dx, y + dy);
public string Name
{
get
public static Complex operator +(Complex a, {
Complex b) => a.Add(b);
return First + " " + Last;
}
}
public static implicit operator string (Person p)
=> p.First + " " + p.Last;
public Person this[long id]
O efeito exatamente o mesmo que se os mtodos {
get
tivessem apenas uma instruo de return. Os exemplos acima {
so convertidos pelo compilador para: return store.LookupPerson(id);
}
}

56
C#
AS NOVIDADES DO C# 6
3. Diretiva using static ser mtodo de extenso passe a ser uma modificao fratu-
rante, o que no era o caso anteriormente. Mas os mtodos
semelhana do que acontece com a direti-
de extenso so geralmente chamados como mtodos est-
va using para espaos de nomes (namespaces), a direti-
ticos nos casos raros em que existe uma ambiguidade e,
va using static adiciona os membros estticos da classe ou
nesses casos, parece legtimo que sejam qualificados com o
enumerado dado como argumento ao espao de nomes global,
nome da classe.
permitindo a sua utilizao sem a necessidade de qualificao
com o nome da classe: 4. Operadores condicionados por null
using static System.Console; frequente a necessidade de ter cdigo salpicado de
using static System.Math;
using static System.DayOfWeek; verificao para null. Os operadores condicionados
class Program por null permitem o acesso a membros e elementos apenas
{ quando o recetor no null, retornando um resulta-
static void Main()
{ do null caso contrrio:
WriteLine(Sqrt(3 * 3 + 4 * 4));
WriteLine(Friday - Monday); 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 int? nullable = (people != null) ? new int?
{ (people.Length) : null;
static void Main() Person person = (people != null) ? people[0] :
{ null;
System.Console.WriteLine(System.Math.Sqrt
(3 * 3 + 4 * 4));
System.Console.WriteLine Os operadores condicionados por null pode ser muito
(System.DayOfWeek.Friday - System. conveniente quando usado com o operador de coalesccnia
DayOfWeek.Monday); de null (??):
}
}
int length = people?.Length ?? 0; // 0 se people
Esta funcionalidade tima quando se tem um conjunto //null
de funes relacionadas com um determinado domnio que se
usa frequentemente, de que System.Math um bom exemplo. Os operadores condicionados pot null tm um com-
Permite tambm especificar individualmente os nomes de um portamento de curto-circuito. em que a cadeia de acesso a
enumerado, como os membros de System.DayOfWeek no membros, elementos ou invocaes imediatamente a seguir
exemplo acima. apenas so executados se o recetor original no for null:
3.1. Mtodos de extenso int? first = people?[0].Orders.Count();
Os mtodos de extenso so mtodos estticos, mas a
inteno de que sejam usados como mtodos de instncia O exemplo anterior , na essncia, equivalente a:
dos tipos que estendem. Em vez de trazer esses mtodos para
int? first = (people != null) ?
o mbito global, a funcionalidade using static faz com que people[0].Orders.Count() : (int?)null;
esses mtodos estejam disponveis como mtodos de exten-
so: Com a exceo de que people avaliado apenas
uma vez. Nenhum dos acessos a membros ou elementos e
using static System.Linq.Enumerable; // The type, invocaes que se seguem ao operador ? so executados
not the namespace
class Program se o valor de people for null.
{ E nada impede que os operadores condicionados
static void Main() por null sejam encadeados, no caso de ser necessria algu-
{
var range = Range(5, 17);// Ok: not ma verificao de null mais que uma vez na cadeia:
//extension
var odd = Where(range, i => i % 2 == 1); int? first = people?[0]?.Orders.Count();
// Error, not in scope
var even = range.Where(i => i % 2 == 0);
// Ok
} A invocao (uma lista de argumentos entre parnte-
} sis) no pode ser precedida imediatamente pelo opera-
dor ? isso levaria a demasiadas ambiguidades. Assim sen-
do, a esperada invocao de um delegate caso este no
Isto faz com que alterar um mtodo para que passe a
seja null no funciona. Contudo, o delegate pode sempre

57
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 o compilador gera o seguinte cdigo:
disparo de eventos:
IFormattable christmas =
PropertyChanged?.Invoke(this, args); FormattableStringFactory.Create("{0:f}",
new DateTime(2015, 12, 25));
Que traduzido para:
que pode ser usado da seguinte forma:
var handler = PropertyChanged; var christamasText = christmas.ToString(new
if (handler != null) CultureInfo("pt-PT"));
{
handler.Invoke(this, args);
} 5.1.1. FormattableString
Que uma forma segura para threads de verificar se o
O tipo concreto retornado
evento tem subscritores porque apenas avalia o lado esquerdo
por FormattableStringFactory.Create derivado de:
da invocao uma vez e mantem o seu valor numa varivel
temporria.
namespace System
5. Interpolao de strings {
public abstract class FormattableString :
O mtodo String.Format com as suas variadas verses IFormattable
{
muito verstil e til, mas a sua utilizao um bocado desa- protected FormattableString();
jeitada e sujeita a erros devido aos marcadores numricos ({0}) public abstract int ArgumentCount { get; }
que tm de corresponder posio dos argumentos fornecidos public abstract string Format { get; }
public static string Invariant
em separado: (FormattableString formattable);
public abstract object GetArgument(int
var s = string.Format("{0} tem {1} ano{{s}}.", index);
p.Name, p.Age); public abstract object[] GetArguments();
public override string ToString();
public abstract string ToString
A interpolao de strings permite substituir diretamente (IFormatProvider formatProvider);
no literal string os ndices por buracos com as expresses }
}
que correspondem aos valores:

var s = $"{p.Name} tem {p.Age} ano{{s}}."; Isto permite, no s acesso a formato mas tambm
aos argumentos da string formatvel.
Tal como acontece com o mtodo String.Format, pos-
svel a especificao de alinhamentos e formatos: 5.1.2. Retrocompatibilidade

var s = $"{p.Name,20} tem {p.Age:D3} ano{{s}}."; As funcionalidades introduzidas pelo C# 6 so com-


patveis com as plataformas .NET anterirores. No entanto,
O contedo dos buracos pode ser qualquer expresso,
esta funcionalidade em particular necessita dos ti-
incluindo strings:
pos System.Runtime.CompilerServices.FormattableStringFac
var s = $"{p.Name} tem {p.Age} ano{(p.Age == 1 ? tory e System.FormattableString que s foram introduzidos
"" : "s")}."; na verso 4.6 da plataforma. A boa notcia que o compila-
dor no est preso localizao destes tipos numa determi-
Note-se que a expresso condicional est entre parn- nada assembly e, caso se pretenda usar esta funcionalidade
tesis, para que : s no seja confundido com o especificador numa verso anterior da plataforma, basta adicionar a imple-
de formato. mentao destes tipos.

5.1. strings formatveis 6. Expresses nameof

Quando no especificado um provedor de formatao Ocasionalmente necessrio providenciar uma string com o
na invocao do mtodo String.Format, usada a cultura cor- nome de alguns elementos do programa:
rente do thread corrente e isso nem sempre o desejado. Por
isso. semelhana do que acontece com as expresses lam-
Quando se lana
uma System.ArgumentNullException
bda, o compilador traduz a string interpolada de forma diferente
consoante o tipo do recetor da expresso. Quando se dispara um evento PropertyChanged.
Se o recetor da expresso for do tipoI Formattable:
etc.

58
C#
AS NOVIDADES DO C# 6
Usar literais string para isto simples, mas sujeito a No uma grande funcionalidade, mas til e, em
erros. Pode haver erros de escrito, ou uma refatorizao do termos de implementao do compilador, tratou-se apenas
cdigo pode ter mudado o nome do artefacto. de remover a verificao da condio que o impedia.

As expresses nameof so uma espcie de literal do 8. Inicializadores de ndices


tipo string em que o compilador valida a existncia de algo com
A inicializao de objetos e colees so teis para
aquele nome. Uma vez que passa a ser uma referncia ao
inicializar declarativamente os campos e propriedades de
artefacto, o Visual Studio sabe a que se refere e navegao e
objetos ou, no caso das colees, um conjunto inicial de
refatorizao do cdigo funcionaro.
elementos.
No essencial, cdigo como o seguinte:
A inicializao de dicionrios, por outro lado, no era
if (x == null) throw new ArgumentNullException to elegante, obrigando existncia de um mtodo Add que
(nameof(x)); recebesse como argumento a chave e o valor corresponden-
var s = nameof(person.Address.ZipCode);
te a essa chave. Se uma implementao em particular de
dicionrio no tivesse um mtodo Add com as caratersticas
ser convertido em: mencionadas, no seria possvel usar um inicializador.

if (x == null) throw new ArgumentNullException A partir de agora, passa a ser possvel usar inicializa-
("x"); dores em que so usados indexadores:
var s = "ZipCode";

6.1. Cdigo fonte vs. metadados var numbers = new Dictionary<int, string>
{
Os nomes usados pelo compilador so os nomes do [7] = "sete",
[9] = "nove",
cdigo fonte e no os nomes dos metadados dos artefactos, [13] = "treze"
pelo que, o seguinte cdigo: };

using S = System.String; que sero traduzidos para:


class C
{ var dictionary = new Dictionary<int, string>();
void M<T>(S s) dictionary[7] = "sete";
{ dictionary[9] = "nove";
var s1 = nameof(T); dictionary[13] = "treze";
var s2 = nameof(S); var numbers = dictionary;
}
} 9. Filtros de excees

Os filtros de exceo so uma funcionalidade da CLR


convertido em:
j disponibilizada pelo Visual Basic e pelo F# e que passa
using S = System.String; agora a estar disponvel tambm no C#:
class C try
{ {
void M<T>(S s) ...
{ }
var s1 = "T"; catch (Exception ex) when (SomeFilter(ex))
var s2 = "S"; {
} ...
} }

6.2. Tipos primitivos


Se a avaliao da expresso entre parntesis a se-
No permitida a utilizao de tipos primitivos guir palavra-chave when resultar no valor true, a exceo
(int, long, char, bool, string, etc.) em expresses nameof. apanhada. Caso contrrio, o bloco catch ignorado.

7. Mtodos de extenso Add em inicializadores de cole- Isto permite que sejam definidos mais que um blo-
es co catch para o mesmo tipo de exceo:
Quando os inicializadores de colees foram introduzi-
try
dos na linguagem C#, os mtods Add chamados no podia ser {
mtodos de extenso. O Visual Basic acertou na sua imple- //...
}
mentao primeira ao permitir a sua utilizao, mas isso pa- catch (SqlException ex) when (ex.Number == 2)
rece ter ficado esquecido para o C#. {
// ...
Nesta verso a falha foi corrigida e possvel agora }
usar mtodos de extenso Add em inicializadores de colees. catch (SqlException ex)

59
C#
AS NOVIDADES DO C# 6
{ vez de uma lambda) para mtodos de sobrecarga que rece-
// ... bem 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 execu-
() os melhora-
tado o bloco seguinte.
mentos e adies das
considerado aceitvel e comum o abuso de filtros de
excees com efeitos colaterais, como logging. verses anteriores, tor-
ATENO: Os filtros de exceo so executados no contex-
to do lanamento da exceo (throw) e no do contexto do naro a vida de quem
seu tratamento (catch).
desenvolve usando a
10. await em blocos catch e finally

No C#5 no era permitida a utilizao da palavra- linguagem de progra-


chave await em blocos catch e finally porque, na altura da
implementao da funcionalidade async-await, a equipa pen- mao C# muito me-
sou que isto no seria possvel implementar. Mas agora desco-
briram que afinal no era impossvel. lhor
Passa a ser possvel escrever cdigo como este:

Resource res = null;


try
{
res = await Resource.OpenAsync(); Recursos
}
catch (ResourceException e) New Language Features in C# 6
{
await Resource.LogAsync(res, e); C# 7 Work List of Features
}
finally nterpolated Strings (C# and Visual Basic Reference)
{
if (res != null) await res.CloseAsync();
}

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 va-
lor 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 varia-
das 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, Code-
Project, CodePlex, etc.). Pelo seu contributo para com estas comunidades, a Microsoft premeia-o com o prmio MVP (C#) des-
de 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


Ttulo: Introduo ao Cloud Computing ta, pois este tema o presente e certamente, ser muito
mais o futuro.
Autores: Antnio Miguel Ferreira
Em forma de concluso a linguagem apresentada
Editora: FCA - Editora de Informtica
permite a todos usufruir da mais valia da informao que
Pginas: 200 este livro nos fornece. Considero que, a introduo que o
autor fornece no incio de cada captulo se torna essencial, e
ISBN: 978-972-722-802-7
uma ferramenta imprescindvel, para que todo o captulo
faa sentido. Nesta pequena leitura, o leitor tem uma perspe-
tiva do que ser abordado, sendo esclarecido, priori acer-
O livro Introduo ao Cloud Computing um livro
ca de conceitos fundamentais para todo o entendimento da
muito til, no s para programadores, mas essencialmente,
problemtica que ir ser tratada. Por fim, um livro muitssi-
para todos aqueles que procuram um maior conhecimento e
mo completo, que nos fornece de forma clara, concisa e aci-
domnio no que ao tema do Cloud Computing diz respeito.
ma de tudo, descomplicada, uma viso da temtica, permitin-
Acredito igualmente, que este extremamente elucidativo
do assim, uma maior compreenso da mesma, a fim de ga-
uma vez que, para alm de executar uma abordagem histri-
rantir uma gesto e utilizao mais rentvel. Desta forma,
ca da tecnologia, apresenta-se como uma ferramenta de
acredito ser uma boa leitura de cabeceira, uma vez que nos
extrema importncia para as pretenses tecnolgicas das
trar um aprofundamento da realidade com a qual lidamos, e
organizaes, uma vez que, este livro, no s proporciona
no fim subiremos Cloud para um sono revitalizante.
uma perspetiva realista e inovadora do que deve ser feito,
como ainda, redireciona para a soluo que melhor se en-
quadrar nas organizaes.

Desta forma, um dos captulos com mais interesse,


principalmente devido sua utilidade prtica, que se deve
Cloud Computing
muito ao facto de ser direcionado, essencialmente para lei-
gos na temtica, foi o captulo 9 Cloud para empresas. um livro muito til,
Considero igualmente til e cativante, o capitulo 8 Cloud
para particulares. A abordagem e exemplos prticos, referi- no s para programa-
dos ao longo da leitura, permite ao leitor percecionar o quan-
to o Cloud Computing faz parte do quotidiano de cada um.
Alis, quando olhei para o livro questionei se este seria dire-
dores, mas essencial-
cionado para profissionais da rea ou para leigos na temti-
ca. Aps a leitura, reflexiono que este direcionado e eluci-
mente, para todos
dativo para ambos. A leitura revela e demonstra, ao leitor,
que afinal o Cloud Computing est all over, tal como supri- aqueles que procuram
me os receios vulgarmente conhecidos dos leitores, que
acreditam que a informao que guardam na Cloud, fica nas um maior conhecimen-
nuvens, e que, como tal, no acarreta qualquer tipo de se-
gurana. As cerejas no topo do bolo, na minha perspetiva, to e domnio no que ao
so os captulos 12 e 13, Benchmarking e Aplicaes de
Sucesso respetivamente. Estes captulos so fulcrais para
rematar quaisquer dvidas sobre as vantagens na aplicabili-
tema ()
dade do Cloud Computing e alcanar uma perspetiva futuris-

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 profis-
sional. Com o mestrado em Ensino de TIC e doutorando em Educao Ferramentas Distncia e elearning, dedica maioritari-
amente o seu tempo ao Instituto de Emprego e Formao Profissional, no entanto, desenvolve funes de consultor de Tecnolo-
gias 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

Autores: Jos Braga de Vasconcelos Aps a leitura desta obra, o leitor ter competncias
para desenvolver as suas prprias aplicaes web, utilizando
Editora: FCA - Editora de Informtica os conhecimentos adquiridos ao longo do livro.
Pginas: 324 Partindo de princpios simples, como por exemplo, as
ISBN: 978-972-722-813-3 estruturas de dados, somos ainda levados no terceiro capitu-
lo, a aprender e/ou recordar alguns dos principais algoritmos
Para a review desta edio, chegou-me s mos o acadmicos, como por exemplo como podemos implementar
livro Python Algoritmia e Programao Web de Jos Braga uma rvore de pesquisa (BST Binary Search Tree), ou
Vasconcelos. algoritmos de grafos (O autor aborda alguns algoritmos de
Doutorado em Cincias da Computao pela Univer- grafos como o DFS Depth-First-Search ou o BFS Breath-
sidade de York (UK), Jos Vasconcelos, leva-nos, atravs First-Search).
deste livro, a novos conhecimentos. No quarto captulo somos levados pelo caminho das
Sendo o Python uma linguagem de programao que classes e herana, sendo que a parte do Python como lin-
cada vez mais se afirma quer no mundo acadmico, quer no guagem de programao orientada a objecto no foi esque-
mundo empresarial, este livro pode ser uma boa aposta a cida sendo claramente explicada neste livro.
todos os que querem iniciar-se nesta linguagem ou aprofun- A partir do quinto captulo, as coisas comeam a
dar conhecimentos. aquecer e iniciamos a descoberta da arquitectura de aplica-
Destinado a profissionais e a alunos das reas das es Web, o que permite aos leitores que ainda no estejam
tecnologias de informao, pode tambm ser lido por todo o familiarizados com este ramo da tecnologia, possam adquirir
pblico em geral que se interesse pelo assunto. todos os conhecimentos necessrios implementao das
vossas prprias aplicaes web.
A obra tem como principal objectivo apresentar as
principais tecnologias e tendncias da programao de apli- No stimo captulo so abordadas as principais fra-
caes Web utilizando a Linguagem Python. meworks web desta tecnologia.

A obra est dividida em 8 capitulos bem estruturados, principalmente abordada a framework Django. A
que nos levam a aprofundar conhecimentos. um livro de Django utiliza o princpio DRY (Don't Repeat Yourself), onde
leitura fcil e pode tanto ser lido por aqueles que nunca utili- faz com que o desenvolvedor aproveite ao mximo o cdigo
zaram Python ou pelos profissionais que j tenham os seus j feito, evitando a repetio. tambm referenciada a API
conhecimentos cimentados no assunto. DOM (Document Object Model), uma biblioteca de software
definida pela W3C, que nos permite analisar simultaneamen-
Os principais captulos desenvolvidos no livro: te diferentes elementos num documento XML.
Linguagem de programao Python Chamo ateno do leitor para o ultimo captulo do
livro, em que somos levados passo a passo a implementar
Algoritmos e estruturas de dados em Python
uma aplicao web. Apartir daqui, munidos do conhecimento
Programao orientada a objectos em Python adquirido o limite a imaginao do caro leitor.

Arquitectura de aplicaes web O autor disponibiliza ainda no site da FCA, todo o


cdigo relativo aos exemplos explicados no livro.
Tecnologias de programao web em Python
Em jeito de concluso quero dizer-vos que este livro
Web Frameworks um excelente material de estudo e uma boa leitura quer para
quem est a iniciar na rea das tecnologias de informao,
Projecto de software web 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


Ttulo: Introduo ao Desenvolvimento de e seus componentes principais.
Jogos em Android Alm da introduo ao desenvolvimento em Android
Autores: Ricardo Queirs / Alberto Simes o livro aborda temas como API da Google e Motores de jo-
gos, API 2D para Android, libGDX, Unity para Android e Goo-
Editora: FCA - Editora de Informtica gle Play, Servios e Publicao.
Pginas: 274 No captulo 2 feita uma exposio de vrios moto-
ISBN: 978972722807-2 res de jogos disponveis no mercado e que podem ser usa-
das para o desenvolvimento de jogos para as plataformas
mveis, neste caso a plataforma Android. Alm de abordada
Mveis so atualmente a plataforma mais emer- a API da Google, so destacados motores de jogos tais co-
gente no que toca ao desenvolvimento de aplicaes de mo, Unity, Cry Engine, Cocos 2D, Havok Vision Engine, li-
software, no entanto os dispositivos mveis so orientados a bGDX, Marmalade, Game Salad, GameMaker Studio, Coro-
duas vertentes. Uma delas orientada ao meio profissional, na SDK entre outros.
sendo os dispositivos mveis um excelente complemento ao Os captulos 3, 4 e 5 abordam a API 2D para An-
trabalho profissional, mas por outro lado a rea do entreteni- droid, libGDX e Unity respetivamente, onde aprofundam al-
mento ocupa uma grande fatia da utilizao dos dispositivos guns dos conceitos fundamentais para desenvolver jogos
mveis na atualidade e exatamente nesta rea que se in- usando estas frameworks, com exemplos tericos e prticos
serem os Jogos. que ajudam a compreender a mecnica do desenvolvimento
O livro Introduo ao Desenvolvimento de Jogos de jogos.
em Android vem no seguimento de dois outros ttulos lana- Por fim o sexto e ltimo captulo centrado no Goo-
dos por um dos autores, Ricardo Queirs, sendo eles gle Play, Servios e Publicao, onde explicado e exempli-
Android: Introduo ao Desenvolvimento de Aplicaes e ficada a configurao dos servios do Google Play, acesso
Desenvolvimento de Aplicaes profissionais em Android, API, Leaderboards, Achievements e por fim a publicao na
destinando-se aos profissionais da rea do desenvolvimento Play Store.
de videojogos para plataformas mveis, assim como profes-
sores e alunos de disciplinas de computao mvel e desen- O contedo de simples leitura e de fcil perceo,
volvimento de jogos que necessitem de algum suporte teri- sendo que usada uma linguagem muito user-frendly o
co e prtico. que facilita muito a leitura da obra, no se tornando extrema-
mente 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 Como estudante de Engenharia Informtica e sobre-
uma fcil e rpida perceo visual dos contedos abordados. tudo como curioso e se assim posso chamar de Indie Game
Developer considero o livro Introduo ao Desenvolvimento
A organizao dos contedos foi escolhida median- de Jogos em Android um livro de qualidade na apresenta-
te a sua importncia e dependncia entre contedos, incluin- o dos conceitos introdutrios para quem quer iniciar-se no
do exemplos dos vrios motores de jogos disponveis e res- desenvolvimento de jogos para a plataforma mvel Android.
petivas consideraes.

Dividido em 6 grandes captulos, as primeiras pgi-


nas do livro so orientadas introduo ao desenvolvimento
em Android onde so abordados alguns dos contedos bsi-
cos 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, Mobilidade.


smartphones, tablets e sensores esto a mudar o mundo em
Na tendncia incremento de produtividade e
que vivemos. Por um lado a massificao destas tecnologias
eficincia procuramos melhorar a inteligncia operacional
potencia a digitalizao dos consumidores e das mquinas,
dos sistemas com grandes volumes de dados, conseguir
por outro disponibiliza um maior volume de informao para
responder em tempo real e potenciar a transparncia atravs
anlise, levando a uma melhor compreenso de hbitos,
de uma melhor partilha de dados.
padres e anomalias. Esta a base do Big Data.
Relativamente ao aumento de conhecimento
Na digitalizao dos consumidores observamos que 2
potenciamos uma viso abrangente das organizaes
em cada 3 pessoas com idades inferiores a 45 anos esto
atravs da anlise de dados estruturados e no estruturados,
constantemente ligadas e a desenvolver interaes digitais,
construmos pontes entre silos e aumentamos as
atravs de mltiplos dispositivos e em mltiplos locais. O que
capacidades analticas atravs de novos modelos que no
implica uma alterao de hbitos de consumo de media, com
so assentes apenas em amostras de dados.
os canais digitais (2.3 horas/dia) a ultrapassarem os antigos
canais de media, nomeadamente televiso (2,2 horas/dia) e Na vertente de investimento, e para o otimizar,
jornais/revistas (0,1 horas/dia), e um incremento da pegada procuramos uma abordagem open source ao storage e
digital (rasto de informao voluntria e involuntria) nos processamento de forma a torn-los facilmente escalveis, e
diversos sistemas que suportam todos estes servios. 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, Por ltimo, apoiamos a criao de novos e inovadores
100 novas contas no LinkedIn, 20 milhes de fotos vistas no servios de negcio assentes na recente capacidade de
Flickr, 100 mil novos tweets, 2 milhes de pesquisas no explorao, anlise e visualizao de dados.
Google, 6 milhes de consultas no Facebook e 1,3 milhes
Para suportar a execuo destes objetivos, o ecossistema
de vdeos colocados no YouTube.
Big Data tem uma proliferao de tecnologias / frameworks
A permanncia dos consumidores no mundo digital que dividimos em grupos consoante os desafios que
obriga as organizaes a estarem sempre presentes. Neste endeream, nomeadamente processamento e storage
mundo digital onde os consumidores so bombardeados com distribuda, base de dados no relacionais com baixa
inmeras aes preciso criar sistemas analticos que latncia, streaming e processamento de eventos complexos,
analisem o contexto e personalizem as mensagens para os processamento de mltiplos tipos de dados, processamento e
utilizadores com o objetivo de construir uma relao mais base de dados em memria, base de dados analticas e
emocional. aplicativos.

O conceito de Big Data rene as tecnologias, No processamento e storage distribuda englobamos


frameworks e infraestruturas necessrias para guardar, por exemplo fornecedores como Hadoop, Map Reduce,
processar e analisar toda a informao existente no mundo Cloudera, Hortonworks, IBM BigInsight e Amazon Elastic
digital (pegada digital). na Google que surge este conceito MapReduce Cloud. Promovemos escalabilidade horizontal de
que mais tarde evoluiu para vrias definies (ver Wikipedia processamento e storage sobre uma variedade de diferentes
ou Gartner). Para a Accenture, o Big Data consiste na infraestruturas, processamento de larga escala muito
capacidade e no conjunto de competncias que utilizamos eficiente com uma arquitetura share nothing e TCO baixo
para mobilizar e gerir um ecossistema com volumes grandes devido ao hardware de baixo custo e software open source.
de dados, internos e externos, de forma a extrair informao
Recorremos a estas tecnologias para armazenar volumes
e criar valor diferenciado.
grandes de dados no seu estgio original, evitando os custos
Com o Big Data pretendemos gerar valor atravs do de aquisio de licenas comerciais, implementar sandboxes
incremento de produtividade e eficincia, aumento de de Business Intelligence de baixo custo, e construir sistemas
conhecimento baseado em dados, melhores retornos de de processamento de dados antes do Data Warehouse.
investimento (ROI), e criao de novos e inovadores servios
No segundo grupo que apelidamos de base de dados no
de negcio. Observamos seis tendncias para atingir estes
relacionais contemplamos produtos como Key-Value,
objetivos: Exploso de Dados, Agregao de Dados,
Column-Oriented, Document Databases, Cassandra, Riak,
Tecnologia, Monetizao de Dados, Redes Sociais e

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
processamento de grandes volumes a velocidades altas, trocas comerciais em tempo real, e processamento em tempo
ultrapassando os constrangimentos dos sistemas de gesto real de informao de mquinas e sensores.
de base de dados relacionais, a construo de arquiteturas
Por ltimo, no grupo das bases de dados analticas e
de alta resilincia e a modelao dinmica de perfis de
aplicativos contemplamos fornecedores como Greenplum
dados.
DB, Teradata Aster, Kognitio, Vertica, ParAccel, Sybase IQ,
Temos utilizado este tipo de tecnologias para construir Netezza, Teradata, Greemplum e Exadata Appliance. Estas
aplicaes dinmicas de baixa latncia que utilizam dados tecnologias destacam-se por serem solues in-a-box com
semiestruturados e aplicaes web com personalizao baixo esforo de manuteno e interfaces para a escrita de
atravs de anlise e atualizaes em tempo real. queries complexas de Structured Query Language (SQL).

No terceiro grupo de tecnologias que apelidamos de Este tipo de tecnologias so usadas para analisar de forma
streaming e processamento de eventos complexos eficiente enormes volumes de dados estruturados,
enquadramos os fornecedores GemFire, Espertech, construo de aplicaes complexas para anlise de dados
SenseiDB, Sensage, Zoie, IBM InfoStreams, uCIRRUS, estruturados e implementao de grandes Data Warehousing
Flume, Splunk e Sumologic. Estas tecnologias permitem a paralelos.
ingesto de dados em grande escala para storage e anlise,
Em concluso, as tecnologias Big Data permitem s
consumo contnuo de grandes volumes de dados com
organizaes receber, processar, guardar e analisar toda a
pesquisas em tempo real, e consolidao de eventos em
informao disponibilizada por sistemas e sensores. Esta
tempo real e a sua disseminao para um grande nmero de
informao detalha todas as interaes entre mquinas e
sistemas cliente.
pessoas e necessria para compreender quem, quando,
Este tipo de tecnologia permite-nos implementar sistemas de porqu e para qu, perceber o contexto e personalizar a
criao de anncios e promoes em tempo real para portais interao de forma a construir uma relao emocional com
online e mobile, e desenvolver sistemas de resposta em cada uma das pessoas. Adicionalmente, no contexto de
tempo real a eventos com capacidade de adaptao a interaes de mquinas permite-nos perceber situaes
alteraes de tipo e formato de dados. anmalas e prever essas mesmas situaes.

No grupo a que chamamos processamento de mltiplos Sabendo que a exploso de dados j comeou e que tem
tipos de dados identificamos como produtos a MarkLogic, tendncia para aumentar exponencialmente com a criao de
Neo4j e FlockDB. Este grupo composto por tecnologias mais servios no mundo digital (abertura dos sistemas das
que se caracterizam por base de dados Graph para organizaes atravs de API), com a penetrao de
processamento de grandes volumes de dados em Extensible dispositivos e com os novos dispositivos ligados (Internet of
Markup Language (XML). Tecnologias que servem para Things), fcil antever cada vez mais necessidades de
implementar sistemas de otimizao de caminhos e para a processamento, storage e anlise de dados.
pesquisa e anlise de relacionamentos complexos como
Este o futuro do IT e so necessrias pessoas com as
graph sociais.
competncias certas para compreenderem este cenrio,
No conjunto de tecnologias de processamento e de bases conhecerem as tecnologias e que queiram ajudar a resolver
de dados em memria contemplamos fornecedores como os desafios que o futuro apresentar
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


Introduo No Windows 10 o trabalho neste campo foi alvo de

A Microsoft iniciou a 29 de julho a disponibilizao


uma maior evoluo, recorrendo agora biometria.
O Windows Hello
escala mundial do Windows 10, e nesta altura, so j os
milhes de utilizadores que possuem os seus PCs atualiza- Em traos gerais, o Windows Hello em conjunto com
dos. Como se tem falado nos ltimos meses e tal como j o Microsoft Passport, permite o incio de sesso no Win-
tive oportunidade de escrever na edio nr. 47 desta revista, dows 10 sem recorrer s tradicionais passwords. Atravs de
o Windows 10 traz imensas inovaes das quais se desta- uma nova gerao de credenciais e biometria, aliadas tam-
cam o to aguardado Menu Iniciar, o Microsoft Edge e tam- bm a novo hardware, passa a ser possvel iniciar sesso em
bm a Cortana. qualquer dispositivo, redes empresariais, servios online,
aplicaes, etc.
Para alm de todas as novas funcionalidades que
oferecem uma experincia de utilizao mais familiar e pes-
soal aos utilizadores, a Microsoft continua a apostar forte-
mente 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 co-
mo 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 nos-
sos dados seguros, aceder ao e-mail, efetuar compras on-
Hardware com caractersticas especficas, permite que
line, aceder rede empresarial e a dados sensveis, etc.
os utilizadores usem a face, a ris ou uma impresso digi-
Apesar de utilizarmos passwords complexas, no significa
tal para desbloquear os seus dispositivos. Estes trs fatores
necessariamente que estamos seguros e cada vez mais,
de autenticao mais a criao de um PIN password, so
surgem novas formas de ilicitamente retirar esta informao
certamente mais seguros que a simples password.
aos utilizadores.
Para alm de reconhecer o utilizador, o Windows Hel-
Considerando ento que a tradicional password j
lo possui as seguintes funcionalidades:
no to segura como o desejado, inevitvel que come-
cem a surgir novos tipos de passwords. O Windows 8 Permite configurar o desbloqueio do PC automatica-
exemplo disso e para alm de ser possvel iniciar sesso da mente ou com uma 2 autenticao.
forma tradicional, a Microsoft implementou duas novas alter-
nativas mais seguras a Picture password e o Pin pas- Autenticao ao nvel empresarial e acesso a conte-
sword. dos 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 ses-
so no autorizado. Exemplo: Utilizao de uma foto
impressa ou carto de funcionrio para tentar iniciar
sesso num PC.

Atravs de infravermelhos, consegue obter uma ima-


gem 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.

69
No Code
WINDOWS HELLO: A AUTENTICAO BIOMTRICA NO WINDOWS 10

Requisitos de Hardware
Lenovo ThinkPad Yoga 15
Para que seja possvel configurar o Windows Hello,
HP Sprout
necessrio possuir algum hardware especial. O mais simples
o leitor de impresso digital e que muitos fabricantes de Lenovo ThinkPad E550
PCs j incluem nos seus equipamentos. Se possui um des-
Asus N551JQ
tes equipamentos e j fez o upgrade para o Windows 10,
poder desde j comear a utilizar o Windows Hello. 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 exis-


tem muitos detalhes mas com certeza que brevemente come-
aro a surgir equipamentos para comercializao no merca-
do.

Configurao
Leitor impresso digital
A configurao do Windows Hello bastante simples
Para o reconhecimento facial, uma simples Webcam
e intuitiva. Imaginando que temos um equipamento que pos-
no o suficiente para que o Windows Hello funcione, pois
sui um leitor de impresso digital, vamos aceder a
esta no consegue detetar os detalhes do rosto do utilizador
Settings e selecionamos Accounts.
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 atuali-
zado 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) va-
mos 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 ga-
rantir uma leitura correta da impresso digital.

Para alm deste DevKit, j esto a ser comercializa-


dos 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

Depois de tudo configurado corretamente, o Windows Estando as configuraes terminadas, os utilizadores


Hello vai solicitar a nossa impresso digital cada vez que identificam-se atravs deste gesto e o Windows 10 solicita
formos iniciar sesso e tambm nos dar indicaes caso a ao Passport que faa a autenticao dos utilizadores nos
impresso no esteja a ser lida com sucesso. servios ou recursos com acesso protegidos.

Segurana dos dados biomtricos A Microsoft no site TechNet, fornece informao detalhada
sobre o Passport e as suas aplicaes a nvel empresarial
Durante a configurao, o Windows atravs dos da-
e que podero ser consultadas no seguinte link: Password-
dos recolhidos pelos sensores, cria uma representao grfi-
less Authentication with Microsoft Passport.
ca da biometria que automaticamente encriptada e armaze-
nada localmente no PC. A informao originalmente obtida Concluso
como a fotografia da nossa face, impresso digital etc.,
Em concluso, a utilizao destes mtodos de autenti-
no guardadas pelo Windows nem enviada para qualquer
cao traduz-se numa srie de benefcios, no s porque
local fora do dispositivo.
simplifica a forma como interagimos com os nossos dispositi-
Esta representao grfica vai impedir por exemplo vos, mas tambm pelo aumento significativo da segurana
que imagens reais sejam usadas para tentativas de acesso das nossas credenciais.
ilcito.
A adoo do Windows Hello poder ser adiada por
A Microsoft no site do Windows 10, disponibiliza um alguns utilizadores que queiram usar o reconhecimento facial,
conjunto de perguntas e respostas que esclarece estas e considerando o nmero reduzido de equipamentos no merca-
outras questes. do que possuem hardware compatvel, ainda assim, poder
desde j ser configurado em PCs que por exemplo possuam
Microsoft Passport
um leitor de impresso digital.
Tal como referi no incio deste artigo, outra inovao
associada segurana do Windows 10 e que pode ser usa-
da em conjunto com o Windows Hello, o nome de cdi-
go 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 quan-
do iniciamos sesso em sites ou aplicaes.

O Passport permite a autenticao dos utilizadores


em contas Microsoft, contas do Active Direc-
tory e Microsoft Azure Active Directory, ou contas de ser-
vios de terceiros que suportem a autenticao Fast ID Onli-
ne (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 biomtri-
ca 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


Quando a Microsoft divulgou que seria disponibilizado Para iniciar a instalao do Windows 10 no Raspberry
o Windows 10 Iot Core para o Raspberry Pi 2 B ficamos a Pi necessrio o seguinte equipamento para o mesmo:
ganhar um minicomputador com o sistema operativo Win-
dows gratuitamente. Raspberry Pi 2 B;

Mas esta verso est destinada a Internet-of-Things Carregador de 5 Volts micro USB com uma ampera-
(IoT), e existem vrias verses. gem de 1.0 (Carregador de telemvel micro USB);

Carto micro SD class 10 8GB ou superior;


Visual Studio e UWP

Interfaces de utilizador

Microsoft Azure IoT

Conectividade de dispositivo integrado


Desktop Shell,
aplicaes Win32,
Dispositivos
da indstria
1 GB RAM, 16 GB Cabo HDMI;
de armazenamen-
to. Cabo de rede Ethernet;
Shell Moderno,
Dispositivos
Mobile Chassis No obrigatrio mas recomendo uma caixa para o
requirement, 512
mveis Raspberry Pi 2 B.
MB RAM, 4 GB de
armazenamento.
Dispositivos dedi-
Para descarregar o Windows 10 necessrio aceder
cados, ecr opcio- ao programa Microsoft Connect (https://
nal, Sem Shell/ connect.microsoft.com/windowsembeddediot/
armazenamento/
Pequenos
aplicaes, 256MB
SelfNomination.aspx?ProgramID=8558) com uma conta Mi-
dispositivos crosoft. Depois de aceder clique em Surveys e ter de acei-
RAM, 2GB de ar-
mazenamento, tar todos os surveys que esto disponveis se estiver de acor-
aplicaes univer-
sais.
do 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 eletrni-


cos de medida, controle e no s que esto ligados a Inter-
net. Por exemplo numa estufa no necessrio ir a um local
X em X horas para controlar a temperatura, com a comunica-
o machine-to-machine (M2M) os dados da estufa so envi-
ados para uma base de dados utilizando a Internet e os mes-
Aps aceitar todos os survey clique em Downloads
mos dados podem ser consultados por outras mquinas.
selecione Windows 10 IoT Core Insider Preview Image for
O Raspberry Pi 2 B exatamente igual a Raspberry Raspberry Pi 2. Antes de clicar no boto Download selecio-
Pi B+. Sobre a evoluo do Raspberry Pi convido-o a ler o ne a localizao mais prxima para que o mesmo seja mais
artigo Raspberry Pi2 Evoluo ou Revoluo? da Rita rpido. possvel fazer o Download de duas formas, direto
Peres publicado na edio n 48 de Maro de 2015. 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

Ilustrao 1 Raspberry Pi B+ e Raspberry Pi 2 B

72
No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B

Ao concluir o Download necessrio extrair o seu utilizar o Windows 7, como a verso est desatualizada e
contedo para uma pasta, recomendo a criao de uma pas- assim necessrio instalar o Microsoft Windows Assessment
ta temporria na raiz do disco, por exemplo temp a mesma and Deployment Kit (ADK) para Windows 10 (http://
contem o ficheiro Flash.ffu que a imagem do Windows 10 go.microsoft.com/fwlink/p/?LinkId=526740).
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 reco-


mendo 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 for-
matado inicia-se a Linha de comandos do Windows com op-
es administrativas, antes de clicar na aplicao Linha de
comandos no menu iniciar clique uma vez com o boto direi-
to do rato e selecione a opo Executar como administra-
dor.

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


Ligue o carto de memria SD no computador e exe-
comando.
cute o seguinte comando wmic diskdrive list brief que vai
identificar todos os sistemas de armazenamento que esto Para transferir a imagem execute o seguinte coman-
ligados no computador. A seguinte imagem mostra que o do:
carto SD est ligado a um leitor de cartes e que o mesmo
dism.exe /Apply-Image /ImageFile:[localizao da pasta]
est identificado como Device 1.
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 car-


to SD utilizada a aplicao Microsoft Deployment Image
Servicing and Management (DISM). Esta aplicao uma
ferramenta de implementao de imagens a mesma tam-
bm utilizada para implementar a instalao do Windows

em USB flash drive (Pen drive).
Ao finalizar a transferncia da imagem j pode colocar
O DISM j se encontra instalada no Windows mas se
o carto SD no Raspberry e ligar o mesmo.

73
No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B

A primeira informao que o Raspberry vai mostrar Administrator e a palavra passe p@ssw0rd.
que est a inciar Graphics Console Started

A primeira inicializao do Windows pode demorar


alguns minutos e at carregar completamente ir ver o logoti-
po 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 reini-
ciar o equipamento, instalar ou retirar aplicaes, ver a per-
formance. Por FTP podemos consultar, inserir, modificar e
apagar ficheiros. Por PowerShell podemos fazer a gesto.

Para fazer a gesto por PowerShell recomendo a utili-


zao da aplicao grfica PowerShell Integrated Scripting
Environment (ISE) que est includo no Windows Manage-
ment Framework 3.0 (https://www.microsoft.com/en-us/
download/details.aspx?id=34595) aps a instalao o Po-
werShell 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


Com o Raspberry completamente ligado pode verificar executar o seguinte script
que no existe nenhum sistema de janelas como nas ver-
ses de trabalho do Windows. Assim possvel reduzir o net start WinRM
consumo de recursos utilizados. Isto j acontece com o Win- Set-Item WSMan:\localhost\Client\TrustedHosts -
Value MINWINPC
dows Server 2012 em que um administrador de sistema pode remove-module psreadline -force
instalar um novo servidor sem Graphical user interface (GUI) Enter-PsSession -ComputerName MINWINPC -Credential
e fazer toda administrao por PowerShell conseguindo as- MINWINPC\Administrator
sim mais performance.
Ao executar o script ser solicitado a palavra passe do admi-
possvel aceder ao Windows no Raspberry de trs nistrador e por fim feita a ligao remota.
formas. Por navegador de internet, FTP ou PowerShell atra-
vs 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 per-
mita ao programador interagir com o Hardware conseguindo-
se 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 aplica-
es universais no s compactveis com pequenos disposi-
tivos mas tambm com equipamentos mveis ou industriais.

Com a ligao efetuada agora pode-se inserir qual-


quer comando diretamente na subjanela abaixo. A primeira
recomendao alterar a palavra passe. Para alterar insira o
seguinte comando net user Administrator [nova palavra pas-
se] .

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 necess-


rio executar o seguinte comando schtasks /Delete /TN Mi-
crosoft\Windows\IoT\Startup /F este comando apenas exe-
cutado 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.

Apartir agora o Windows 10 no Raspberry Pi 2 B est Ilustrao 3 Microsoft Azure IoT (Build 2015)
pronto a ser utlizado pode experimentar as demostraes
Os ficheiros de PowerShell no do GitHub em: https://
disponveis na documentao disponvel no Windows Dev
github.com/rramoscabral/PowerShell/tree/master/
Center (http://ms-iot.github.io/content/en-US/win10/
Windows_10/Iot
StartCoding.htm).

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 registada na base de dados do Centro Internacional de ISSN,
uma edio da nossa PROGRAMAR. Esta uma edio sendo o nmero de referncia o ISSN 1647-0710. Esta refe-
especial para todos ns e esperamos que tambm o seja rencia hoje, reconhecida em todo o mundo.
para todos vs que nos lem e seguem edio aps edio.
Como todos os que nos lem sabem, somos um pro-
Nunca ser demais dizer-vos, e agradecer-vos, a jecto sem fins lucrativos, todos ns somos voluntrios, e ce-
vossa presena. A cada download. A cada visualizao. demos de bom grado, algumas horas da nossa prpria vida
para dar continuidade a um projecto nico em muitas verten-
Chegados quinquagsima edio, aqui na PRO-
tes.
GRAMAR aproveitamos a ocasio para recordar um pouco o
passado. Um passado recente, construdo pgina por pgi- Nunca demasiado recordar que todos podem ser
na. autores da Programar. A revista de todos, feita por iguais.

A primeira edio, foi lanada em Maro de 2006, h A PROGRAMAR UM PROJETO DE TODOS E PARA TO-
nove anos e seis meses atrs. Na altura a equipa estava DOS
ainda longe de saber o sucesso que esta pequena grande
Ao longo destes anos, tivemos vrios artigos, sendo
publicao teria.
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 pu-


blicados e 183 autores colaboraram connosco, mais concre-
tamente 10 autoras e 173 autores.

Artigo aps artigo, nmero aps nmero, foram mui-


tos os que se juntaram a este projecto, participando nele Como este um projecto de todos para todos, e que-
quer como autores, quer como colaboradores da revista. At remos que os leitores interajam, h vrias edies que so
data cerca de 180 pessoas j colaboraram neste projecto. votados os 3 melhores artigos, sendo o prmio uma t-shirt do
Um projecto que sendo pequeno, se tornou enorme. Sendo P@P. Esta votao aberta e feita pelos leitores que assim o
a nica revista portuguesa de programao. E disponibiliza- queiram.
da de forma gratuita a todos os interessados.
Em Maio de 2014, foi relanado o nosso site, em for-
J ultrapassamos os 500 artigos publicados. Um n- mato blog-post. Neste momento a revista disponibilizada
mero que ser sempre maior a cada edio lanada. nesse formato, e claro, no tradicional formato pdf.
As estatsticas revelam que em mdia, cada edio Os leitores mais atentos recordam que apesar de nes-
tem cerca de 18.950 downloads. te momento sermos uma publicao trimestral, j fomos uma
18950 x 49 edies 92.8550 downloads publicao bimensal.

Claro que secretamente todos ns esperamos que a Contudo, se tivermos mais artigos, mais qualidade,
edio 50 seja a edio com mais downloads de todas. Mas poderemos voltar a ser uma publicao bimensal. Mais uma
afinal, no para isso que trabalhamos a cada nova edio? vez defendemos, que o poder de tornar este projecto maior,
est em cada um de vs. No pensem que no tm qualida-
Voltando s datas, em Setembro de 2008, a revista foi de para escrever, que no sabem de que tema escrever, ou
finalmente reconhecida e que no tm nada para apresentar. Desenvolvam uma ideia,
e criem asas ao vosso artigo.

76
No Code
Num futuro prximo, que passam pelas ideias da Porque ns, PROGRAMADORES, somos gente de
equipa: ideias, e no desistimos!
Desenvolver app cliente da revista cross-platform Por isso e por muito mais PROGRAMAR ontem,
hoje e amanh!
Formato .iba (iTMS)

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


O Reach for 24 um jogo matemtico que desafia a
coerente dos jogos de acordo com objectivos, explorando o
destreza e rapidez de raciocnio. O seu objectivo consiste
ldico, uma forma inteligente e criativa de promover a
em, atravs da utilizao de todos os nmeros mostrados,
superao de obstculos na aprendizagem da matemtica.
em apenas uma tentativa, atingir o nmero 24 utilizando as
operaes aritmticas de soma, subtraco, diviso e Por exemplo, o ensino da matemtica por meio de
multiplicao. jogos, pode transformar as actividades matemticas que, s
vezes, causam ansiedade e sofrimento a muitos alunos, em
Uma boa maneira de manter a calculadora cerebral
fonte de satisfao, motivao e interaco social.
em forma.
Da autoria de Tiago Rodrigues, desenvolvido em
Na actualidade, pesquisadores, estudiosos e
Delphi , utilizando o FireMonkey , vai j na verso 1.1.0,
profissionais da educao que buscam criar situaes
tendo sido actualizado pela ltima vez a 23 de Julho de 2015.
desafiadoras e significativas para a construo de
conhecimentos concebem os jogos como estratgias Para poder funcionar plenamente requer um sistema
pedaggicas favorveis, inclusive para a construo de operativo Android 2.3 ou superior, ocupando 7,2 MB. Poder
conceitos matemticos. ter experimentado algumas dificuldades de com
processadores INTEL devido tecnologia usada no
Segundo Kishimoto (2007), os jogos esto j
desenvolvimento, mas tal j no ser verifica a partir da verso
vinculados nos pensamentos humanos desde a infncia
Android 4.4.
mesmo que no nos apercebamos, porque a criana cria
suas prprias fantasias atravs de brinquedos ligados ao seu Ocupa uma classificao PEGI3 de acordo com a
quotidiano familiar. 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

www.revista-programar.info
Revista PROGRAMAR

46 Edio - Setenmbro 2014 43 Edio - Dezembro 2013

e muito mais em
47 Edio - Dezembro 2014 44 Edio - Fevereiro 2014
48 Edio - Maro 2015 45 Edio - Maio 2014

Você também pode gostar