Escolar Documentos
Profissional Documentos
Cultura Documentos
Revista PROGRAMAR 50 PDF
Revista PROGRAMAR 50 PDF
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
ELECTRNICA
49 Um cofre para passwords simples e de baixo custo! - Antnio C. Santos
COLUNAS
ANLISES
NO CODE
67 Big Data: um conjunto de tecnologias imprescindveis no futuro - Pedro Sarmento
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.
4
TEMA DE CAPA
Azure Logic Apps: o futuro dos backends?
TEMA DA CAPA
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.
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.
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.
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
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;
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
}
13
A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS
AUTOR
Escrito por Nuno Caneco
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
Introduo
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:
15
A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS
Cujo resultado ser : public string DepartmentName { get;
set; }
[JsonProperty(PropertyName =
"total_earnings")]
public string TotalEarnings { get; set; }
Modelo de dados
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):
public MainPage()
{
InitializeComponent();
Figura 7: Adicionar referncias _dataBasePath = Path.Combine
(Windows.Storage.ApplicationData.Current.
LocalFolder.Path, "db.sqlite");
}
[PrimaryKey]
public string Name { get; set; }
E depois podemos ento aceder base de dados,
para podermos criar a tabela referente ao BostonEmployee:
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();
} }
}
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
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.
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.
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;
Demo 3 Menu
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.
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.
AUTOR
Escrito por Ricardo Cabral
Licenciado em Engenharia Informtica pela Universidade Autnoma de Lisboa. O seu twitter @rramoscabral
25
A PROGRAMAR
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
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 (||)
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).
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
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
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/
() 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
3. Mtodos e propriedades
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
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
Antes de comearmos
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".
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-
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
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
Diagrama de um Grafo
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?
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
A Me Page
Boards
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
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.
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
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. };
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.
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);
} }
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
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.
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: };
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.
}
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
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
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.
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
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
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).
AUTOR
Escrito por Pedro Sarmento
Manager Analytics, Accenture Digital
68
No Code
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
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.
70
No Code
WINDOWS HELLO: A AUTENTICAO BIOMTRICA NO WINDOWS 10
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.
AUTOR
Escrito por Nuno Silva
71
No Code
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);
Interfaces de utilizador
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.
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
74
No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B
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
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.
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)
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
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
e muito mais em
47 Edio - Dezembro 2014 44 Edio - Fevereiro 2014
48 Edio - Maro 2015 45 Edio - Maio 2014