Professional Documents
Culture Documents
EQUIPA PROGRAMAR
Coordenador
Antnio Pedro Cunha Santos
Editor
Antnio Pedro Cunha Santos
Design
Srgio Alves
Twitter: @scorpion_blood
Ilustrao
Sara Freixo
Redaco
Andr Vala
Antnio Pedro Cunha Santos
Antnio Pereira
Joo Pedro Martins
Nuno Caneco
Nuno Santos
Nuno Silva
Patrcio Domingues
Paulo Morgado
Pedro Sarmento
Ricardo Cabral
Ricardo Castro
Rita Peres
Sara Silva
Tnia Valente
Staff
Antnio Pedro Cunha Santos
Rita Peres
Rui Gonalves
Sara Freixo
Tiago Sousa
Contacto
revistaprogramar@portugal-aprogramar.org
Website
http://www.revista-programar.info
Conectando os pontos
Antnio Santos
ISSN
1 647-071 0
A revista PROGRAMAR um projecto voluntrio sem fins lucrativos. Todos os artigos so da responsabilidade dos autores, no
podendo a revista ou a comunidade ser responsvel por alguma impreciso ou erro.
Para qualquer dvida ou esclarecimento poder sempre contactar-nos.
NDICE
TEMA
6
DE CAPA
Azure Logic Apps: o futuro dos backends? - Joo Pedro Martins
A PROGRAMAR
11
15
Como usar base de dados SQLite em Windows 10 Universal Apps - Sara Silva
20
Como fazer o deploy de uma aplicao web com PrimeFaces no OpenShift - Ricardo Cabral
26
36
38
42
ELECTRNICA
49
COLUNAS
55
ANLISES
63
64
65
NO CODE
67
69
72
81
EVENTOS
TechDays Aveiro 17-18 Setembro 2015
7 Reunio Presencial da Comunidade NetPonto no Porto @ 26 Setembro 2015
Lisbon Makers Fair 16-18 de Setembro 2015
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-programar.pt
NOTICIAS
O mundo da inteligncia
artificial debate-se em Coimbra
Ferramenta desenvolvida
na UC diminui os custos
do processo de estampagem na indstria automvel
Este encontro rene mais de uma centena de investigadores e acadmicos de todo o mundo.
Nestes quatro dias debater-se- a evoluo e a consolidao do conhecimento na rea da inteligncia artificial, bem como as implicaes geradas por essa evoluo
e os limites que se devem impor aplicao da inteligncia artificial.
Em destaque estaro as novas tendncias da investigao neste campo do conhecimento e a discusso de reas
emergentes como Aprendizagem Profunda, uma das mais
revolucionrias e promissoras tcnicas para dar mais
inteligncia aos computadores.
Segundo Diogo Neto, Devido crescente competitividade internacional, o projeto e conceo virtual deste
tipo de processos recorre cada vez mais a ferramentas
computacionais, onde as tcnicas avanadas de modelao em computador substituem os dispendiosos testes
experimentais. Deste modo, os modelos numricos desenvolvidos e implementados num programa de elementos finitos (DD3IMP) permitem fazer a simulao completa
deste processo tecnolgico com grande preciso e rigor,
permitindo acelerar a fase de projeto e consequentemente
diminuir os seus custos.
Segundo Francisco Baptista Pereira e Penousal Machado, investigadores do Centro de Informtica e Sistemas da
Universidade de Coimbra (CISUC) e responsveis pela organizao do encontro, apesar dos desafios que ainda tem
pela frente, a distncia entre a realidade e a fico poder
ser ultrapassada a mdio prazo.
Os investigadores acreditam que no futuro, a inteligncia artificial ter um papel muito importante na resoluo de grandes problemas do mundo. A cincia tem permitido avanos muito significativos na construo de
mundos artificiais em reas muito distintas como, por
exemplo, medicina, robtica, ambiente e inteligncia de
negcio.
Com vrias parcerias com a industria automvel, indstria metalomecnica e empresas de software em mecnica
computacional, entre outras, o CEMUC participa em vrias
redes de investigao nacionais e internacionais.
A transferncia do conhecimento para a sociedade pauta a atividade cientfica do CEMUC e, por isso, o
reconhecimento pblico do trabalho desenvolvido neste
centro de investigao a confirmao de que se encontra no bom caminho e um incentivo para continuar numa
rota sustentada de criao e transferncia de conhecimento, contribuindo deste modo para o cumprimento da
misso da Universidade de Coimbra, sublinha Lus Menezes, que em conjunto com Marta Oliveira, orientou a investigao.
TEMA DE CAPA
Azure Logic Apps: o futuro dos backends?
TEMA DA CAPA
Introduo
Em Maro de 2015 a Microsoft anunciou o Azure App
Service, uma evoluo da oferta aplicacional Azure que funde dois servios existentes - Web Sites e Mobile Services com dois novos servios: as Logic Apps, destinadas ao
desenvolvimento rpido e visual de processos de negcio, e
as API Apps que encapsulam funcionalidades autnomas
reutilizveis, consistindo ambos numa concretizao tecnolgica de uma arquitectura baseada em Microservios.
Nos ltimos dois anos esta Histria tem mais um captulo, a noo de Microservios. Construindo sobre as
ideias anteriores e popularizada mais recentemente por pessoas como Martin Fowler, as principais diferenas face ao
SOA talvez sejam a granularidade de cada servio, que agora se entendem frequentemente como devendo ser mais
atmicos e simples, como a utilizao de padres CRUD
sobre HTTP/REST. Os servios continuam a ser independentes entre si (podendo ser desenvolvidos sobre qualquer
tecnologia), e a dever estar organizados em torno de conceitos ou operaes relevantes para o negcio.
Uma materializao desta abordagem de Microservios no espao de consumidor final o IFTTT (If this then
that, https://ifttt.com/). Este sistema, usado tipicamente via
apps para telemvel, permite a criao de pequenos
workflows (receitas), em que caso se verifique uma determinada condio monitorizada pelo IFTTT, despoletado um
evento/aco de resposta. Alguns exemplos seriam: sempre
que um determinado utilizador colocar uma foto nova para o
Instagram, grav-la para o OneDrive; sempre que receber
um email marcado como Urgente, enviar um SMS para um
determinado nmero, etc. O nmero de aces disponveis
muito elevado, e cada uma delas pode ser vista como um
microservio.
TEMA DA CAPA
AZURE LOGIC APPS: O FUTURO DOS BACKENDS?
Azure Logic Apps
Exemplo
Como referido, as Logic Apps so uma das componentes do Azure App Service, e o seu objectivo permitir a
automao de processos de negcio ou workflows, realizando uma modelao grfica dos mesmos. Ao contrrio de
abordagens como o IFTTT, os destinatrios principais so
tanto o mercado empresarial/start-ups como utilizadores com
know-how tcnico ou programadores.
TEMA DA CAPA
AZURE LOGIC APPS: O FUTURO DOS BACKENDS?
No caso anterior, possvel por exemplo indicar que
esta aco apenas executada caso se verifique uma determinada condio, ou que se pretende iterar a sua utilizao
sobre uma lista de itens de informao.
TEMA DA CAPA
AZURE LOGIC APPS: O FUTURO DOS BACKENDS?
executado depois de A. Se no depende, vai ser executado
em paralelo.
Na implementao actual, as formas de controlo de
fluxo que existem so as 4 j referidas: a) recorrncia; b)
dependncia de dados; c) execuo condicionada a uma
condio; d) repetio sobre lista. Uma outra action disponibilizada, o Wait, pode igualmente ser utilizada neste contexto, mas o mecanismo como um todo muito diferente
daquilo a que estamos habituados, lembrando a forma de
funcionamento altamente paralelizvel de motores de regras
(como o do BizTalk Server ou do Windows Workflow Foudation v2).
Concluso
Finalmente,
deve salientar-se o facto de
as Logic Apps ainda estarem em Preview e com evolues
frequentes (ver por exemplo as alteraes mais recentes em
http://azure.microsoft.com/en-us/updates/schedule-logicapps-to-run-in-the-future/), existindo limitaes como sejam a
impossibilidade de criar workflows em Visual Studio, e de o
processo de sincronizao com repositrios de cdigo como
o TFS ser manual, entre outras. Ainda assim, as Logic Apps
so provavelmente a novidade mais interessante de entre as ltimas que tm surgido no universo Microsoft
Azure, e vale a pena tanto perceber que cenrios suportam,
como acompanhar o rumo e evoluo dos prximos meses.
AUTOR
Escrito Por Joo Pedro Martins
CTO e Arquitecto de Solues na |create|it|. MVP de BizTalk Server entre 2006 e 2011. Focos tecnolgicos na rea de Arquitectura, Azure e Integrao. Orador frequente em conferncias e eventos em temas como Arquitectura de Projectos, dinmicas de equipa, estimativas de software, e vrios temas de Azure. Membro dos Azure Insiders.
Gosto em fazer bem, resolver problemas criativamente, e nunca parar de aprender.
A PROGRAMAR
Ninject O Ninja das dependncias
Como usar base de dados SQLite em Windows 10 Universal Apps
Como fazer o deploy de uma aplicao web com PrimeFaces no OpenShift
Manipulao ao nvel do bit na Linguagem C
Reconhecimento de voz com JavaScript
Cria o teu cliente de 9GAG em 15 minutos, com OutSystems
A PROGRAMAR
UserReader
class UserManager
{
private UserReader userReader;
public UserManager()
{
// A classe UserManager est a criar uma
//instncia da classe UserReader
this.userReader = new UserReader();
}
}
Como comeo?
11
A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS
quem prefere usar XML, o plugin Ninject.Extensions.Xml permite efectuar a configurao do Ninject usando XML.
Para comear a utilizar o Ninject, necessrio importar o
namespace Ninject e declarar uma varivel do tipo StandardKernel.
NOTA: Caso a classe possua mais que um construtor o Ninject tentar utilizar o construtor sem argumentos (construtor
default) para construir a classe. Caso esta no tenha nenhum construtor default, ser necessrio indicar ao Ninject
qual o construtor que este deve utilizar para construir a classe.
using Ninject;
Mecanismos de injeco
class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
}
}
O Ninject suporta ainda outro tipo de injeco: a property injection. Neste caso, o Ninject encara uma propriedade da classe como uma dependncia a ser injectada na classe e tenta resolv-la e inject-la como se um argumento de
um construtor se tratasse.
Para declarar que uma propriedade deve ser injectada, ser necessrio decorar a propriedade com o atributo
[Inject].
O mecanismo de constructor injection tipicamente
mais utilizado que o property injection por este garantir que
todas as dependncias esto no construtor e que o objecto
inicializado correctamente no construtor. Outro motivo a favor da utilizao de constructor injection o facto de evitar
que as classes conheam o Ninject, j que desta forma
raramente ser necessrio as classes injectadas utilizarem o
Ninject.
class Program
{
static void Main(string[] args)
{
IKernel kernel = new StandardKernel();
UserManager manager = kernel.Get<UserManager>();
}
}
class UserReader
{
// User reader methods
}
class UserManager
{
private UserReader userReader;
public UserManager(UserReader userReader)
{
this.userReader = userReader;
}
}
12
i.
ii.
iii.
Nestas situaes, o container disponibiliza um conjunto de mtodos de configurao para instruir o Ninject sobre
como proceder. O mtodo Bind<>() permite indicar ao Ninject como resolver uma determinada classe ou interface.
Na primeira situao, possvel instruir o Ninject sobre
qual o construtor a usar usando o mtodo Bind<>
().ToConstructor(). A utilizao do mtodo WithParameter()
A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS
permite especificar valores a atribuir a certos parmetros do
construtor.
class UserReader
{
public UserReader(string connectionString)
{ ... }
public UserReader(string connectionString,
int max) { ... }
}
// Aps declarar o kernel
kernel.Bind<UserReader>()
.ToConstructor<UserReader>((ctx) => new UserReader
(string.Empty))
.WithParameter(new Parameter("connectionString",
"myConnectionString", true));
O Ninject uma
biblioteca de software
aberto que providencia
uma framework de injeco de dependncias () O padro Dependency Injection
bastante utilizado em
software empresarial o
controlo do ciclo de vida dos objectos e facilita a implementao
de testes automticos
class UserManager
{
public UserManager(IUserReader userReader)
{ ... }
}
// Instruo que indica ao NInject que a classe que
//implemementa a interface IuserReader a classe
//FacebookUserReader
kernel.Bind<IUserReader>().
To<FacebookUserReader>();
Top tip: Um caso de injeco utilizar o container para injectar um logger que, tipicamente, inicializado em funo
da classe onde o logger utilizado. Neste caso, possvel
utilizar o mtodo Bind<>().ToMethod() para garantir a inicializao por classe:
kernel.Bind<ILog>().ToMethod(ctx =>
LogManager.GetLogger(ctx.Request.Service));
class UserManager
{
public UserManager(IUserReader userReader,
ILog logger) { ... }
}
class UserReader
{
public UserReader(string connectionString,
ILog logger) { ... }
}
Neste caso, a varivel ctx.Request.Service contm o
nome da classe para a qual foi solicitada a injeco. Quando
uma classe requisitar uma instncia de ILog, o Ninject ir
executar a Func<> indicada no argumento do mtodo ToMe-
13
A PROGRAMAR
NINJECT O NINJA DAS DEPENDNCIAS
Outras funcionalidades
O Ninject disponibiliza tambm mecanismos de carregamento de mdulos e plugins que permitem conferir bastante
dinamismo s aplicaes.
Existem tambm extenses que oferecem funcionalidades de interceo de mtodos que so particulamente teis
para controlo de segurana, auditing ou troubleshooting.
A extenso Ninject.Mvc oferece a integrao plena do
Ninject com o ASP.NET MVC, permitindo que os Controllers
sejam inicializados pelo container do Ninject.
Ao utilizar uma
framework de injeco
de dependncias, a
gesto das instncias
das classes efectuada pelo container que
injecta a instncia de
uma classe sempre que
esta necessria.
Concluso
O Ninject um motor de injeco de dependncias bastante completo e verstil que garante ao programador um excelente controlo sobre a forma como a aplicao construida
bem como o ciclo de vida dos objectos de suporte aplicao.
A sua sintaxe fluda oferece um excelente mecanismo
de configurao, evitando os longos ficheiros em formato xml
tpicos de outras frameworks de injeco de dependncias.
O Ninject um
motor de injeco de
dependncias bastante
completo e verstil que
garante ao programador um excelente controlo sobre a forma como a aplicao construda bem como o ciclo de vida dos objectos de suporte aplicao.
Pela forma como est construdo, apenas as classes
de ponto de entrada das aplicaes tero que conhecer o
Ninject, sendo o resto da aplicao completamente agnstica
ao motor de injeco de dependncias.
A utilizao de mdulos permite distribuir a inicializao dos vrios componentes aplicacionais, garantido uma
melhor organizao do cdigo e evitando ficheiros de configurao demasiado longos.
AUTOR
Escrito por Nuno Caneco
Software Development Lead @ Siemens
nuno.caneco@gmail.com https://pt.linkedin.com/in/nunocaneco
14
A PROGRAMAR
mbito
Este artigo tem como objetivo mostrar como usar uma
base de dados SQLite em Windows 10 Universal Apps, mais
especificamente ligao base de dados, obteno e persistncia de dados.
Introduo
Hoje em dia qualquer aplicao tem como requisito o
uso de base de dados para armazenar os dados, desta forma
existem vrias solues relacionais ou no, para o efeito. Uma
soluo muito usada nas aplicaes mveis o uso de base
de dados SQLite, uma vez que uma soluo simples e fcil
de usar. Em Windows 10 Universal Apps possvel usar base
de dados SQLite, que atualmente se encontra numa verso preview, e que pode sofrer alteraes at sair a verso
final.
sabido que a Entity Framework 7 ir suportar o Windows 10 Universal apps, no entanto este artigo no ir usar
esta soluo e ser usada a biblioteca SQLite.Net-PCL, uma
vez que atualmente uma das bibliotecas mais simples de
usar, e cujo cdigo fonte est disponvel no GitHub.
Figura 2: Verso do Technical Preview Tools
Descrio
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
classe
chama-
[JsonProperty(PropertyName =
"department_name")]
16
A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS
response.Content.ReadAsStringAsync();
var employees = JsonCon
vert.DeserializeObject(message);
return employees;
}
}
Usando SQLite
Instalao
Para podermos usar base de dados SQLite necessrio instalar o vsix fornecido no site oficial da SQLite: http://
sqlite.org/download.html,
atualmente
em
verso preview (Figura 6) e adicionar as respetivas referncias
(Figura 7 e 8):
Net
Net.Platform.WinRT
De
seguida
devemos
alterar
a
se BostonEmployee de forma a definir a PrimaryKey:
clas-
[PrimaryKey]
public string Name { get; set; }
E depois podemos ento aceder base de dados,
para podermos criar a tabela referente ao BostonEmployee:
public void CreateDatabase()
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new
SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
conn.CreateTable();
}
}
17
A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS
Gesto de dados
ar:
Uma vez que j criamos a base de dados, agora podemos inserir, apagar e alterar os dados da mesma, para isso
devemos usar o SQLiteConnection que ter todos os mtodos
necessrios para efetuar as operaes CRUD:
Inserir
public void SaveData(BostonEmployee bostonEmployee)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new SQLite.
Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
conn.Insert(bostonEmployee);
conn.Commit();
}
}
Nota: de notar que possvel usar os vrios mtodos fornecidos pelo Linq, que permitir efetuar diferentes queries
tabela em causa, assim como usar queries em SQL.
Obter
Para obter o BostonEmployee usando o Name, podemos efectuar:
public BostonEmployee GetByName(string name)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new SQLite.
Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
return conn.Get(name);
}
Apagar
public void DeleteData(BostonEmployee
bostonEmployee)
{
using (SQLite.Net.SQLiteConnection conn = new
SQLite.Net.SQLiteConnection(new
SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),
_dataBasePath))
{
conn.Delete(bostonEmployee);
conn.Commit();
}
}
Alterar
Concluso
Em concluso podemos verificar que o uso de base
18
A PROGRAMAR
COMO USAR BASE DE DADOS SQLITE EM WINDOWS 10 UNIVERSAL APPS
de dados em Windows 10 Universal Apps simples, e o uso de
base de dados SQLite atualmente uma das solues disponvel (em verso preview), cuja implementao no difere em
muito do uso em aplicaes WinRT. Sendo muito simples criar
e efetuar as operaes CRUD usando a biblioteca SQLite.NetPCL.
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
O criador do PrimeFaces tambm disponibiliza o Mobile UI kit para aplicaes mobile, Layouts e temas para as
mesmas.
Para criar a aplicao deste projeto web em JSF vai
ser utilizado IDE Netbeans esta aplicao patrocinada pela
Oracle e permite o desenvolvimento de projetos Java,
HTML5, PHP e C/C++ no tem nenhum custo para o utilizador nem para empresas.
O idioma utilizado neste Netbeans o Ingls. Selecione a opo New Project para iniciar um novo projeto depois selecionada a categoria Java Web em que selecionado o projeto Web Application sem cdigo sem cdigo
includo, aps a seleo avana para fase seguinte.
Gratuito
Bronze
Prateado
Preo base
Gratuito
Gratuito
15/Ms
Inatividade da
aplicao
Escalabilidade
24 Horas
Nunca
Nunca
Alojamento
Sim (3 min /
3 max)
1 GB
Sim (3 min /
16 max)
1 GB
Sim (3 min /
16 max)
6 GB
Suporte
Comunidade
Comunidade
Red Hat e
Comunidade
CASE
Elite
PrimeFaces
PrimeTek
www.primetek.c
om.tr
Comunidade
Gratuito
(includo
comercial)
Comunidade PrimeFaces
20
definido o nome do projeto e a localizao do mesmo mas no definida a localizao da pasta das bibliotecas
e avana para fase seguinte.
A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
O servidor a ser utilizado o Apache Tomcat e o mesmo que vai ser utilizado no OpenShift aps a seleo avana
para fase seguinte.
21
A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
{welcomeView.welcome}"
icon="ui-icon-check" />
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.CONFIG_FILES
</param-name>
<param-value>/WEB-INF/faces-config.xml
</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>
javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.XHTML</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.XHTML</welcome-file>
</welcome-file-list>
</web-app>
</p:panel>
</h:form>
Para validar dos dados introduzidos necessrio criar
uma nova Java Class que contm o cdigo que o servidor
vai utilizar para validao dos dados recebidos pelo formulrio e entregar a mensagem construda.
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
@ManagedBean
public class WelcomeView {
private String name;
public String getName() {
return name;
}
public void setName(String sname) {
this.name = sname;
}
22
A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
public class GrowlView {
23
O ficheiro WAR basicamente um ficheiro compactado no formato zip com todos os ficheiros do projeto se o abrir
com o compactador de ficheiros com suporte zip pode ver o
seu contedo.
A PROGRAMAR
COMO FAZER O DEPLOY DE UMA APLICAO WEB COM PRIMEFACES NO OPENSHIFT
Com a chave inserida podemos criar uma nova aplicao clicando em Applications e selecionando Tomcat 7
(JBoss EWS 2.0) a seguir define-se o endereo da aplicao.
Nos planos gratuitos por norma no possvel definirse a regio necessrio definir-se No preference.
da.
Inicie a sua conta do OpenShift clique em definies e
insira a sua chave pblica conforme aparece no PuTTY Key
Generator.
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
definida na criao da chave privada.
AUTOR
Escrito por Ricardo Cabral
Licenciado em Engenharia Informtica pela Universidade Autnoma de Lisboa. O seu twitter @rramoscabral
25
A PROGRAMAR
26
Binrio
000
001
010
011
100
101
110
111
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
161, da multiplicao do terceiro smbolo mais direita por 162
e assim sucessivamente. Para o caso do valor 0x123, obtmse 3x160 + 2x161+ 1x162, isto , 3+32+256, ou seja o valor
decimal 291. Usando uma notao frequentemente empregue,
pode dizer-se que (123)16 corresponde ao valor (291)10.
A converso de um valor hexadecimal para a representao binria equivalente processa-se de forma similar converso de um valor octal para binrio, exceto que cada smbolo
hexadecimal deve ser mapeado para um valor de 4 bits de
acordo com a
Binrio
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
27
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
bits, apenas so afetados os bits do campo de bits. Assim,
quando se efetua uma operao binria envolvendo, por exemplo, uma varivel inteira sem sinal com 32 bits, necessrio
considerar os efeitos da operao sobre os 32 bits que compem a varivel. pois importante, quando se faz uso de uma
varivel inteira, ter em conta o nmero de bits da varivel, algo
que pode ser determinado multiplicando o resultado devolvido
pelo operador sizeof por 8, dado que esse operador devolve o
tamanho em octetos (bytes) da varivel ou do tipo de dados
que lhe passado como parmetro (Listagem 2). A norma C99
introduziu tipos de dados com tamanho explicitado, como o
caso do tipo int8_t que corresponde a um valor inteiro com
sinal de 8 bits (i.e., um octeto) ou o uint16_t que tem 16 bits
para guardar valores inteiros sem sinal (Open-STD, 2003). A
norma C99 especifica ainda que os tipos inteiros explicitados
se encontram definidos no ficheiro <inttypes.h>.
int var_a;
printf("n bits 'int'=%d\n",sizeof(var_a)*8);
printf("n bits 'short'=%d\n", sizeof(short)*8);
Conceito de transbordo
Por terem um nmero finito de bits, as variveis do tipo
inteiro apenas podem representar um nmero finito de valores
inteiros compreendidos entre um valor mnimo e um valor mximo. Por exemplo, uma varivel do tipo uint16 apenas pode
representar os valores inteiros do intervalo [0, 216-1], isto , [0,
65535]. Assim, caso se pretenda guardar um valor maior do
que aquele suportado pela varivel, ocorrer o que se designa
por um transbordo, perdendo-se a parte mais significativa do
}
Listagem 3: exemplo transbordo.c
N de
valor
(aps
valor
(aps
resultado. A
uint16_t transbordo_1;
int16_t transbordo_2;
printf("N de bits de 'unsigned short': %u\n",
sizeof(transbordo_1)*8);
transbordo_1 = 65535;/* Carrega valor mximo */
printf("valor de transbordo_1=%u\n",
transbordo_1);
transbordo_1++; /* transbordo! */
printf("(aps +1) transbordo_1=%u\n",
transbordo_1);
transbordo_2 = 32767;
printf("valor de transbordo_2=%d\n",
transbordo_2);
transbordo_2++; /* transbordo! */
printf("(aps +1) transbordo_2=%d\n",
transbordo_2);
return 0;
ao qual o programador deve estar muito atento, pois usualmente provoca comportamentos errticos da aplicao (Baraniuk,
2015).
/*
* Exemplo: "transbordo.c"
* Compilar:
* gcc -Wall -W -std=c99 transbordo.c -o transbordo.exe
*/
#include <stdio.h>
#include <inttypes.h>
int main(void){
int main(void){
28
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
unsigned int in = 0x01234567;
unsigned int out;
out = ~in;
printf("in: %x\n", in);
printf("out: %x\n", out);
return 0;
}
Listagem 5: exemplo not_binario.c
in: 1234567
out: fedcba98
Listagem 6: resultado da execuo de not_binario.c
Verd.
Falso
Verd.
Verd.
Falso
O operador e binrio tambem designado por operador de conjuno. ainda conhecido pela sua designao anglo saxnica and, sendo identificado na linguagem C atravs
do smbolo &. O operador requer dois operandos. A tabela de
verdade do operador (Tabela 3) mostra que uma operao de
AND binrio em que pelo menos um dos operandos o bit 0
resulta sempre no resultado bit 0. Pelo contrrio, se um dos
operandos for bit a 1, ento o resultado corresponder ao bit
do outro operando: ser 1 se o bit do outro operando for 1 e 0
se o outro operando for 0. Essas caractersticas do and binrio
podem ser empregues para conhecer o valor de um determinado bit (and binrio com um dos operandos a 1) ou para zerar
um determinado bit (and binrio com um dos operandos a 0). A
Listagem 7 apresenta cdigo onde efetuada a operao and
binrio entre os valores numricos 0x12 (0001.0010 em binrio) e 0x0F (0000.1111). A operao produz o resultado binrio
0000.0010 (0x02 em hexadecimal), correspondendo ao and
binrio entre cada bit homlogo dos dois operandos 0x12 e
0x0F.
Falso
Falso
Falso
inta=0;
intb=2;
intresult;
/*Condicaoverdadeira*/
result=((a==0)&&(b==2));
printf("verdadeiro=>%d\n",result);
/*Condicaofalsa*/
result=((a==0)&&(b==3));
printf("falso=>%d\n",result);
return0;
}
Listagem 8: exemplo and_logico.c
/* Exemplo: "and_binario.c" */
#include <stdio.h>
verdadeiro => 1
falso => 0
int main(void){
int a = 0x12; /* 0001.0010b, 18 base 10 */
int b = 0x0F; /* 0000.1111b, 15 base 10 */
int c;
c = a & b; /* and binario */
/* 0001.0010 & 0000.1111 => 0000.0010 */
printf("c = %d & %d => %x\n", a, b, c);
return 0;
}
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 operando for bit a 1.
Um dos usos do operador OR binrio a ativao de
um bit, isto , colocar a 1 um determinado bit. Por exemplo, o
resultado da operao OR binrio com o operando 0011, ter
sempre os dois bits menos significativos 1, independentemente do valor do outro operando. De facto, conforme anteriormente observado, sempre que um determinado bit dos operandos do operador OR binrio 1, o resultado do bit correspondente tambm ele 1. O cdigo or_binario.c (Listagem 10)
exemplifica o uso de 0x003, ou seja 0000.0000.0011b, como
operando no operador OR binrio, originando um resultado
cujos dois bits menos significativos tm o valor 1 (Listagem 11).
or binrio (|)
int main(void){
int a = 0x003;/* 0000.0000.0011b, 3 base10 */
int b = 0x120;/* 0001.0010.0000b, 288 base10 */
int c;
c = a | b; /* or binario */
/* 0000.0000.0011 | 0001.0010.0000
=> 0001.0010.0011 */
printf("c = %d | %d => %d\n", a, b, c);
return 0;
}
Listagem 10: exemplo or_binario.c
c = 3 | 288 => 291
Listagem 11: resultado da execuo de or_binario.c
Falso
Verd.
Verd.
Falso
Verd.
Falso
1
1
0
0
int main(void){
/* Vetor de 7 inteiros sobre os
quais calculada a sequencia de paridade */
int i;
int paridade; /* Sequncia de paridade */
int vetor_entrada[7];
vetor_entrada[0] = 0x12;
/* 0001.0010 */
vetor_entrada[1] = 0x02;
/* 0000.0010 */
vetor_entrada[2] = 0x22;
/* 0010.0010 */
vetor_entrada[3] = 0x00;
/* 0000.0000 */
vetor_entrada[4] = 0xA0;
/* 1010.0000 */
vetor_entrada[5] = 0xFA;
/* 1111.1010 */
vetor_entrada[6] = 0x4D;
/* 0100.1101 */
/* Sequencia de paridade esperada: 0010.0101 */
paridade = vetor_entrada[0];
for(i=1; i<7; i++){
paridade = paridade ^ vetor_entrada[i];
}
printf("paridade=0x%x (hex)\n", paridade);
return 0;
}
/* Exemplo: or_binario.c */
#include <stdio.h>
Verd.
xor (^)
0
/* Exemplo: xor_paridade.c */
#include <stdio.h>
or lgico (||)
30
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
Entrada[i]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
Sequncia de paridade
Representao binria
0001.0010
0000.0010
0010.0010
0000.0000
1010.0000
1111.1010
0100.1101
0010.0101
31
(valor
(valor
(valor
(valor
(valor
<<
<<
<<
<<
<<
00)]1
01)]2
02)]4
03)]8
04)]16
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
Operador deslocamento para a direita
positive_shift_R=124
sem_sinal_shift_R=124
/* shift_right_signed.c */
#include <stdio.h>
int main(void){
int positive = 998;
int negative = -998;
int positive_shift, negative_shift;
int I;
for(i=0; I < 4; i++){
printf(===[shift right %d]===\n,i);
positive_shift = positive >> I;
negative_shift = negative >> I;
printf(positive_shift=%
d\n,positive_shift);
32
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
printf(negative_shift=%d\n,negative_shift);
}
return 0;
}
int main(void){
int hex = 0xF0F1F2F3;
int bit_i, i;
int total_bits = sizeof(hex) * 8;
printf("Converso de 0x%X:\n",hex);
for(i=total_bits-1;i>=0;i--){
bit_i = is_bit_um(hex, i) ? 1 : 0;
printf("%d",bit_i);
if( (i % 4 == 0) && (i>0)){
printf(".");
}
}
printf("\n");
return 0;
}
No programa mostra_em_bin.c (Listagem 19), a funo is_bit_um devolve zero se o bit num_bit do parmetro
valor zero e no zero (valor lgico verdadeiro) se o bit
num_bit for um. Para o efeito, a funo atribui varivel
mascara_num_bit um bit a um na posio pretendida atravs
da operao de deslocamento esquerda, aplicando posteriormente a mascra atravs da operao de AND binrio. No
exemplo, a funo chamada sucessivamente para mostrar
cada um dos bits da varivel hex, disponibilizando assim a
representao binria do valor da varivel hex como ilustra a
Listagem 20.
Casos de usos
Apresentam-se de seguida alguns dos casos de usos
mais frequentes de manipulao binria.
Deteo do estado de um bit
A deteo do estado de um bit consiste em determinar o
valor do isimo bit de um determinada sequncia de bits. Para o
efeito, faz-se uso do operador AND binrio, tendo como operandos o valor que se pretende analisar e uma mscara binria. A mscara binria inteiramente composta por bits a zero,
exceto para o bit a um na posio do bit cujo valor se pretende
detetar.
/*
* Exemplo: mostra representao em
* bits do valor inteiro da varivel valor
*
*/
#include <stdio.h>
#include <assert.h>
Converso de 0xF0F1F2F3:
1111.0000.1111.0001.1111.0010.1111.0011
Listagem 20: Sada da execuo de mostra_em_bin.c
Ativao/desativao seletiva de bits
A ativao seletiva de bits consiste em ativar, num
determinado valor inteiro, um ou mais bits a um. Por sua vez,
a desativao seletiva de bits corresponde operao inversa, isto , colocar um ou mais bits a zero.
A ativao seletiva de bits efetua-se atravs da operao de OR binrio, usando como operandos o valor que se
pretende modificar e uma mscara apropriada. A mscara
deve ser constituda por bits a zero, exceto para os bits que
se pretendem ativar, que devem estar a um. Por exemplo,
caso se pretenda ativar os 4 bits menos significativos de um
valor inteiro, deve-se empregar como mscara o valor binrio
que tenha os quatro bits menos significativos a 1111, estando os restantes a zero. Deste modo, e considerando um valor de 16 bits, a mscara corresponder ao valor 0X000F,
ativando-se os 4 bits menos significativos atravs da operao: novo_valor = valor | 0x000F.
A desativao seletiva de bits conseguida atravs
da operao de AND binria, usando como operadores, o
valor que se pretende alterar e uma apropriada mscara
binria. A mscara binria deve ser composta por bits a zero
33
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
nas posies que se pretendem desativar e bits a um nas restantes posies. Por exemplo, caso se pretendam desativar os
4 bits menos significativos de um valor de 16 bits, usar-se- a
mscara 0xFFF0, resultando na seguinte operao: novo_valor
= valor & 0xFFF0.
Deteo de valores potncias de dois
Determinar se o valor de uma determinada varivel inteira sem sinal corresponde a uma potncia de dois uma
operao trivial quando se recorre a operaes binrias. De
facto, dado que uma potncia de dois tem um e s um bit a um
(e.g., 16 que 0001.0000 em binrio), subtraindo-se uma unidade potncia de dois, obtm-se um valor que tem todos os
bits direita do bit ativo da potncia de dois a um, e a zero o
bit ativo bem como todos os bits esquerda do bit ativo da
potncia de dois. Por exemplo, subtraindo uma unidade a 16
obtm-se 15, correspondendo a 0000.1111 em binrio. Assim,
para determinar se um determinado valor uma potncia de
dois, basta efetuar uma operao de AND binrio entre o valor
e o valor menos uma unidade. Se o resultado for zero, o valor
em apreo uma potncia de dois. importante notar que
este algoritmo s vlido para valores positivos. A funo
is_potencia_dois (Listagem 21) faz uso dessas propriedades
das potncias de dois para detetar se parmetro valor corresponde ou no a uma potncia de dois. A sada da execuo do
programa is_potencia_dois mostrada na Listagem 22.
/*
* Exemplo: operaes binria para averiguar
* se nmero positivo potncia de dois.
*/
#include <stdio.h>
int is_potencia_dois(unsigned int valor){
if( valor == 0 || valor == 1 ){
return 0;
}
return ((valor & (valor-1)) == 0? 1:0);
}
int main(void){
unsigned int i;
for(i=2;i <= (1<<10); i++){
if( is_potencia_dois(i) ){
printf("%u\n", i);
}
}
return 0;
}
Ativao de opes
Algumas funes da linguagem C requerem o uso da
operao de OR binrio por forma a que seja possvel especificar mltiplas opes atravs de um parmetro. Um exemplo a funo open que empregue para a abertura de um
ficheiro. Conforme mostra a Listagem 23, a funo apresenta
dois parmetros. O primeiro corresponde ao caminho do
ficheiro que se pretende manipular. Mais interessante para o
mbito deste artigo, o segundo parmetro, designado de
flags, pois permite a especificao de vrios elementos. De
facto, a documentao da funo open (e.g., man 2 open
num sistema Linux) indica que podem ser especificada, entre
outros, constantes para a criao de um ficheiro. Por exemplo, a criao de um ficheiro somente para escrita especificada atravs de O_CREAT | O_WRONLY | O_TRUNC, isto
, especificando-se as opes O_CREAT, O_WRONLY e
O_TRUNC atravs do operador OR binrio. O valor que
efetivamente recebido pela funo open corresponde pois ao
resultado da operao de OR binrio das trs constantes. Na
prtica, as trs constantes so potncias de dois, significando que cada uma apenas tm um bit ativo. Tal confirmado
pelo programa open_flag.c (Listagem 24) que mostra o valor
numrico das constantes O_CREAT, O_WRONLY e
O_TRUNC (Listagem 25). Deste modo, torna-se possvel
passar, atravs de um mesmo parmetro, vrias configuraes, sendo cada configurao especificada por um ou mais
bits. Contudo, necessrio ter em conta que esta metodologia de empacotamento em bits de configuraes requer cdigo do lado da funo chamada para que essa possa identificar as configuraes pretendidas pela funo chamante.
int open(const char *pathname, int flags);
Listagem 23: prottipo da funo open
/*
* Mostra o valor numrico de algumas das
* constantes
* que podem ser empregues pela funo open
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void){
printf("O_WRONLY = %X\n", O_WRONLY);
printf("O_CREAT = %X\n", O_CREAT);
printf("O_TRUNC = %X\n", O_TRUNC);
return 0;
}
34
A PROGRAMAR
MANIPULAO AO NVEL DO BIT NA LINGUAGEM C
partido da linguagem. Embora o seu uso explcito seja mais
comum na programao sistema de baixo nvel, o exemplo da
funo open ilustra que a manipulao ao nvel de bit, embora
de forma implcita, ocorre frequentemente na linguagem C.
() a base binria
composta por dois
valores distintos, representados por zero e
um, da tambm se designar por base dois
()
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
mbito
Atualmente, o reconhecimento de voz tem vrias aplicaes no mundo real. O conceito de reconhecimento de voz
est subjacente a softwares como o Siri e S-Voice. Esta aplicao pode melhorar drasticamente a usabilidade dos websites,
principalmente para deficientes visuais. Por conseguinte, os
utilizadores podem navegar pelas pginas ou preencher campos de formulrio utilizando a sua voz.
Window.SpeechRecognition ||
Window.webkitSpeechRecognition || null;
//Caso no suporte esta API de voz
if (window.SpeechRecognition === null) {
document.getElementById
('unsuported').classList.remove('hidden');
} else {
//......
}
3.
Introduo
A API Web Speech uma API de reconhecimento de
voz que est implementada no Chrome 25 e superiores. A API
Web Speech foi lanada no final de 2012 e fornece a entrada
de voz e recursos de sada de texto para voz num web
browser. Esta API tem em conta a privacidade dos utilizadores,
pois antes de ativar a voz atravs do microfone, o utilizador
deve explicitamente conceder a permisso. O pedido de autorizao o mesmo que a API getUserMedia, apesar de no
necessitar da webcam. Se a pgina que executa esta API usa
o protocolo HTTPS, o browser solicita a permisso apenas
uma vez.
Mtodos e propriedades
onResult: Define um callback que disparado quando o reconhecedor de voz devolve um resultado.
1.
Estrutura HTML
Teste
36
A PROGRAMAR
RECONHECIMENTO DE VOZ COM JAVASCRIPT
event.results[i][0].transcript +
' (taxa de acerto [0/1] : ' +
event.results[i][0].confidence + ')';
} else {
transcription.textContent +=
event.results[i][0].transcript;
}
4.
Evento de click
}
}
Vamos analisar este cdigo com mais detalhe:
A propriedade results um array de objetos em que
cada item do array contm um possvel resultado do reconhecimento de voz. Para verificar se j um resultado final utiliza-se
a propriedade isFinal que booleana.
transcription.textContent faz com que o texto dentro da <div id=transcription> seja limpo.
for
(var
i
=
event.resultIndex;
i
<
event.results.length; i++) o ciclo que percorre o evento
que contm o texto que o utilizador falou.
Dentro deste ciclo h uma condio que verifica se o
evento se encontra na ltima posio (event.results
[i].isFinal). Caso seja verdadeira, imprimido todo o texto,
junto com a taxa de acerto, que varia entre 0 at 1. Caso
seja falsa, adicionado mais texto div.
document.querySelector("#rect").addEventListener
("click", function () {
try {
recognizer.start();
} catch (ex) {
alert("error: " + ex.message);
}
});
Onde:
recognizer.start() inicia a gravao
e
catch(ex) {
alert(error: +ex.message);
} faz o tratamento de log, caso exista, algum erro de gravao.
Concluso
Esta foi uma breve explicao com a implementao
da primeira pgina com reconhecimento de voz. Para o efeito foi utilizada a API Web Speech de JavaScript. Esta API
uma mais-valia porque facilita muito a integrao de sistemas de reconhecimento de voz em sites.
AUTOR
Escrito por Tnia Valente
Natural de Coimbra, licenciou-se em Engenharia Informtica pelo Instituto Superior de Engenharia de Coimbra e, actualmente,
frequenta o mestrado em Human Computer Interaction. entusiasta na rea de Desenvolvimento Web, no que concerne s
Tecnologias Web, Design de Interface (UI) e User Experience (UX). Curiosa e motivada por novos desafios, acredita que a criatividade pode transformar a maneira como as pessoas pensam, sentem e agem.
37
A PROGRAMAR
A OutSystems Platform uma plataforma de desenvolvimento made in Portugal que te permite desenvolver aplicaes web e mobile. As aplicaes so programadas visualmente, e publicadas na cloud. Estes dois factores fazem com que
consigas entregar as tuas aplicaes aos utilizadores muito
rapidamente.
Embora seja uma plataforma desenvolvida em Portugal,
a OutSystems Platform est em grande crescimento a nvel
mundial e j utilizada por algumas das maiores empresas
como a Siemens, a Vodafone ou a Mercedes-Benz.
38
Desenha o ecr
Agora que j temos a nossa aplicao criada, vamos
tratar de desenhar o ecr. O nosso ecr ter a imagem do
post do 9GAG e um boto para ir buscar um novo post.
Na
tab
Interface,
seleciona
elemen-
to
HomePage e nas suas propriedades ativa a opo
Anonymous para que no nos tenhamos que preocupar
com a autenticao quando acedes ao ecr. De seguida faz
duplo clique no elemento HomePage para abrir o ecr. Vamos adicionar um Container pgina. Um Container um
Div em HTML. Arrasta da barra lateral esquerda o elemento
A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS
Precisamos tambm de inserir um exemplo da resposta JSON retornada pela API, para que o Service Studio
crie as estruturas necessrias para recebermos a resposta.
Copia o JSON disponvel em http://pastebin.com/
F7CNpYMz e cola no campo "Response".
http://infinigag.eu01.aws.af.cm/{section}/{id}, o URL do
mtodo da AP
39
Implementa a lgica
Agora precisamos de implementar a lgica para invocar o mtodo da API que importmos, e usar o valor retornado para os elementos ecr.
Para tal iremos usar uma
Action. Uma action
como um mtodo em Java ou .NET. Na tab Interface, vai a
Screen Flows>Main Flow e faz clique com o boto direito
no ecr "Homepage". Seleciona Add Preparation. A ao
Preparation uma ao especfica de um ecr e que corre
sempre que o ecr carregado.
A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS
De
seguida,
vai
tab
Logic
e
em
Integrations>REST e arrasta para o fluxo da ao o mtodo
da API (de nome Get). Nos parmetros de entrada do mtodo
coloca:
Agora que temos uma ao que retorna um post aleatrio, s nos falta associar o dados do post selecionado ao
ecr, mais concretamente associar a imagem do post ao
elemento Image.
De volta ao nosso ecr HomePage, clica no elemento Image. Define a propriedade Type como External e a
propriedade URL com o valor SelectedPost.Images.Large.
Value
Response.Data[
TextToInteger
(GeneratePassword(1, false)) ], para aleatoriamente
obtermos um dos posts da resposta do mtodo da API.
40
A PROGRAMAR
CRIA O TEU CLIENTE DE 9GAG EM 15 MINUTOS, COM OUTSYSTEMS
As aplicaes so
programadas
visualmente, e publicadas na
cloud. Estes dois factores fazem com que
consigas entregar as
tuas aplicaes aos
utilizadores muito rapidamente
Referncias
Site oficial da Outsystems: www.outsystems.com
Documentao
oficial
do
IDE
da
ma: www.outsystems.com/help/servicestudio/9.0
platafor-
Uma aplicao
constituda por mdulos. Num mdulo podemos definir o modelo
de dados, implementar
a lgica e desenhar a
UI das nossas aplicaes ()
AUTOR
Escrito por Antnio Pereira
Mestre em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico (Lisboa, Portugal) e com certificao em
gesto de projectos IPMA Nvel-D e Associate Developer em OutSystems. Actualmente engenheiro de software na OutSystems.
Curioso por natureza, procura sempre saber mais e adora trabalhar em equipa. Dotado de um conhecimento profundo em ferramentas de produtividade e de uma obsesso por livros, gosta de se dedicar a 100% a todos os desafios que abraa. Email:
antonio.pereira@outsystems.com
41
A PROGRAMAR
ns.
Um sinal enviado para o Office Graph sempre que:
Eu realizo um "gesto social", ou seja, algo como pressionar o boto "like" num contedo do Yammer da
empresa.
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 colegas que trabalham na minha organizao, assumindo que eles
tambm usam o mesmo tenant de Office 365. por isto que o
Office Graph tambm apelidado de "crebro do Office 365".
O que est guardado no Office Graph?
Atualmente,
os
ns
do
Office
Graph
so Documentos e Pessoas mas brevemente haver novos
tipos de ns. O Profile passar a viver no Graph,
os Groups tambm tero os seus prprios ns assim como
algumas das aes realizadas pelos utilizadores (que neste
momento correspondem apenas a arestas).
Nos eventos Build e Ignite deste ano, a Microsoft partilhou algumas estatsticas impressionantes que nos permitem
ter uma ideia da escala que o Office Graph atinge:
O Office 365 armazena mais de 70 PetaBytes de informao espalhada por todos os seus tenants. Isto corresponde a mais de 78.812.993.478.983.680 bytes!
Esta escala s possvel na nuvem, onde o poder computacional e a capacidade de armazenamento so praticamente ilimitados. tambm por isso que o Office Graph no est
disponvel on premises. No entanto, ser possvel utilizar uma
abordagem hbrida e ligar uma farm de SharePoint Server
2016 on premises a um tenant de Office 365 para tirar partido
do Office Graph numa organizao. Mas isso ter que ser tema
para outro artigo.
sagem.
No que respeita segurana, o Office Graph respeita
as permisses de acesso que foram definidas sobre cada
contedo, independentemente de este estar armazenado no
SharePoint Online, no OneDrive for Business ou no Exchange Online. Cada utilizador conseguir ver apenas os contedos aos quais tem acesso.
O que o Office Delve?
O Office Delve uma aplicao web, recentemente
adicionada famlia de aplicaes que constitui o Office 365.
Foi anunciada na SPC (SharePoint Conference) em 2014
com o nome de cdigo Oslo (ou Oslo Experience). Comeou por ser uma demo interna que mostrava como apresentar a informao armazenada no Office Graph e foi construda pela equipa da Microsoft de Oslo, na Noruega, que anteriormente era parte da FAST antes desta ser adquirida pela
Microsoft.
O Office Delve descrito como uma experincia de
Search & Discovery (ou Pesquisa & Descoberta) porque,
por um lado, permite-nos fazer pesquisas sobre pessoas e
documentos atravs da introduo de termos numa caixa de
pesquisa (a componente de Pesquisa mais tradicional). Por
outro lado, apresenta-nos os contedos que nos interessam
sem que seja necessrio pesquisar por eles (a tal componente de Descoberta). Este , alis, o seu principal elemento
diferenciador e faz com que o Office Delve funcione especialmente bem como a homepage personalizada do Office 365.
A Home Page
Para quem tem uma subscrio de Office 365, o
acesso ao Office Delve feito atravs do menu de aplicaes do Office 365 (pressionando o boto do waffle no canto
superior esquerdo) e clicando no cone do Delve.
seguro?
Uma questo importante que surge frequentemente
quando se fala no Office Graph a da privacidade. Nem todas
as aes realizadas pelos utilizadores so pblicas, algumas
so privadas:
43
A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
algum colega partilhou comigo ou que foram editados por um
A Me Page
A Me Page apresenta informao que est diretamente relacionada comigo. composta por duas subpginas: a Activity Page e a Profile Page.
A Activity Page apresenta os contedos que eu editei pessoalmente ou que foram explicitamente partilhados comigo. Nesta pgina ainda possvel aceder
a informao adicional sobre mim atravs da hiperligao para a Trending Around Me Page que, por
sua vez, mostra as pessoas e os contedos que o
Office Graph automaticamente inferiu que esto relacionados comigo, com base na minha utilizao da
plataforma.
Boards
No Delve, um Board um grupo de cartes de contedos, agregados atravs de uma etiqueta (tag). um conceito com algumas semelhanas ao utilizado pelo Pinterest
mas com algumas pequenas diferenas.
Os Boards so sempre pblicos, o que quer dizer que
qualquer pessoa consegue encontrar um Board que eu criei
apenas pesquisando pela etiqueta que lhe est associada e
poder at adicionar-lhe os seus prprios contedos. No
entanto, porque tudo no Delve se baseia na pesquisa, cada
utilizador conseguir ver apenas os contedos aos quais tem
acesso. Isto significa que dois utilizadores que acedem a um
determinado Board vero, provavelmente, conjuntos diferentes de cartes de contedos.
Interrogar o Office Graph
2.
O ttulo do contedo
3.
4.
5.
Localizao do contedo
6.
44
A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
REST da pesquisa. Utiliza uma sintaxe semelhante FQL
(FAST Query Language, a linguagem utilizada pela plataforma
de pesquisa FAST e suportada tambm no SharePoint 2013)
ou no tivessem ambas sido criadas pelas mesmas pessoas.
Antes de mergulhar no GQL, necessrio discutir alguns conceitos importantes:
Ao
ID
PersonalFeed
1021
1003
OrgColleague
1015
OrgDirect
OrgManager
ACTOR(1234, action:1003)
Em que:
1234 o identificador do utilizador (ou seja, do seu n)
WorkingWith
TrendingAround
Viewed
WorkingWithPublic
Para obter os itens relacionados com o utilizador autenticado, pode ser utilizada a query abaixo, em que a palavra ME automaticamente substituda pelo identificador deste.
ACTOR(ME)
possvel ainda combinar mais do que uma expresso
de filtro atravs de operadores lgicos. O exemplo abaixo permite obter todos os itens modificados ou visualizados pelo utilizador 1234.
ACTOR(1234, OR(action:1001, action:1003))
Como indicado acima, as arestas do grafo so caracterizadas por vrios atributos. Um deles o cdigo da ao
(action) mas existem outros como o time que, quando aplic-
45
1033
https://[URL
tenant]/_api/search/query?
QueryText='*'
&Properties='GraphQuery:actor(1234
\,action\:1033)' &SelectProperties='DocId,Title'
1001
1020
Modified
ACTOR(<ActorId> [, filter])
Descrio
Feed do utilizador
(actor) tal como mostrado
na sua homepage no Delve. Privada.
Itens modificados pelo
utilizador nos ltimos 3
Pessoas que reportem ao
mesmo manager que o
Pessoas que reportam ao
utilizador.
A pessoa a quem o utilizaPessoas com as quais o
utilizador comunica ou
colabora com frequncia.
Privada.
Itens populares junto das
pessoas com as quais o
utilizador comunica ou
colabora com frequncia.
Itens visualizados pelo
utilizador nos ltimos 3
Verso pblica da aresta
WorkingWith.
A PROGRAMAR
OFFICE GRAPH: A INTELIGNCIA DO OFFICE 365
CRUD (Create, Read, Update and Delete) sobre mltiplas entidades
da
plataforma
Office
365,
desde
Users
(utilizadores)
e
Groups
(grupos)
at Files (documentos) e Mail (mensagens de email), e at
ao Office Graph.
Atualmente, a Unified API ainda est em Preview e algumas das operaes ainda no esto disponveis. No entanto, j possvel utiliz-la com qualquer tenant de Office 365
utilizando o endpoint com o endereo:
https://graph.microsoft.com/beta/
Alm
de
aes
relacionadas
com Users, Groups ou Files, a Unified API fornece o acesso a
duas
aes
muito
importantes
do
Office
Graph: TrendingAround e WorkingWith.
A ao TrendingAround retorna todos os ns relacionados com um utilizador especfico, tal como inferido pelo Office Graph, e pode ser invocada da seguinte forma:
Conetores para permitir a outros sistemas como Dynamics CRM, Salesforce ou Trello, o envio de sinais
para o Office Graph;
Custom Analytics;
Uma nova rea para os Office 365 Groups com informao analtica;
https://graph.microsoft.com/beta/me/trendingAround
A ao WorkingWith retorna a lista dos colegas que
colaboram ativamente com um determinado utilizador, tal como
inferido pelo Office Graph, e pode ser invocada da seguinte
forma:
https://graph.microsoft.com/beta/me/workingWith
http://dev.office.com/unifiedAPIs
https://msdn.microsoft.com/en-us/office/office365/howto/
office-365-unified-api-overview
Para quem est interessando em aprender mais sobre Office Graph, aqui ficam alguns links interessantes:
https://msdn.microsoft.com/en-us/office/office365/api/
api-catalog
http://msdn.microsoft.com/en-us/library/office/
dn783218(v=office.15).aspx
Extensibilidade
das
entidades
permitindo
aos developers definir entidades prprias que so tam-
AUTOR
Escrito por Andr Vala
Licenciado e Mestre em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico, actualmente Arquiteto de
Solues SharePoint na |create|it| e co-fundador da Comunidade Portuguesa de SharePoint. Autor do blog http://blogit.create.pt/
andrevala, trabalha com SharePoint desde 2006, altura em que surgiu a primeira verso beta do SharePoint 2007. Tem participado em vrios projectos nacionais e internacionais sobre SharePoint, e participa frequentemente como orador em eventos da
Microsoft relacionados com o mesmo tema.
46
ELECTRNICA
Um cofre para passwords simples e de baixo custo!
Electrnica
Introduo
Um dos mais comuns e mais falados problemas de
segurana de um sistema de informao so as passwords
sem qualidade muitas vezes motivadas pela dificuldade de
memorizao das mesmas.
De forma a enquadrar o leitor, cada password deve ter
um comprimento adequado e preferencialmente no ser previsvel.
Por
exemplo,
uma
password
como
1979aMelhorGeracaoDeSempre!(27 caracteres), previsvel
se considerarmos que o utilizador nasceu em 1979 e possivelmente falar imenso desse facto gabando a sua gerao. Neste caso, apesar de ser fcil de memorizar, relativamente simples de adivinhar, ou melhor deduzir, por parte de algum
que pretenda obter acesso ao sistema no qual o utilizador em
causa usa esta password.
Por outro lado, passwords com qualidade como:
zb8@g-DMK&7@%pRyhE45DhbbPs$!
angSRhHNUenBpu4AZ4+$KLA-gcJFYfdwV=yN$RXw6TmDYTpBf9?dWRkRAXu35XhwE=d*!vt53-m8dq34fmr?
cCAv#k#u*gsSdgg (128 caracteres), apesar de serem praticamente impossveis de deduzir, so demasiado complexas para
serem memorizadas, tornando o seu uso difcil e praticamente
invivel.
Existem centenas de microcontroladores disponveis no mercado, uns mais caros, outros mais baratos, para
todos os gostos e propsitos. Neste caso, usei e, recomendo
o uso dos microcontroladores baseados em ATMega U32,
como o caso do Arduino Leonardo, Yun, etc . Esta escolha
prende-se principalmente pelo suporte USB de que dispem,
permitindo que sejam tratados pelo sistema operativo como
um teclado USB.
Neste caso usei um Arduino Leonardo R3, baseado
no Microcontrolador ATmega32u4, com 20 pinos digitais de
input/output, 7 canais PWM, 32KB de memria Flash (dos
quais apenas 28 esto disponveis, pois 4 so usados pelo
bootloader), 2.5KB de SRAM, 1KB de EEPROM, e um peso
relativamente baixo de 20g (o circuito completo pesar cerca
de 70g).
Depois de alguma pesquisa e tendo em conta que
era desejvel um circuito de pequenas dimenses, baixo
custo e uma interface de utilizador simples de usar, optei por
adicionar ao Arduino, um LCD Keypad Shield, simples com
16 colunas por duas linhas, 6 teclas, com 8 caracteres programveis pelo utilizador, de forma a ser possvel digitar
uma password e interagir com o dispositivo.
Programa
49
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
master/scripts/getplatformio.py)"
cd /path/get-platformio.py/script
python get-platformio.py
pip install https://github.com/platformio/
platformio/archive/develop.zip
pip install platformio && pip install --egg scons
pip install -U platformio
pip install https://github.com/platformio/
platformio/archive/
develop.zip
Em Windows a instalao segue passos ligeiramente
diferentes:
python.exe get-platformio.py
pip search platformio
pip install platformio && pip install --egg scons
pip install -U platformio
pip install https://github.com/platformio/
platformio/archive/develop.zip
Uma vez instalado o platfromio, ser necessrio instalar
a plataforma atmelavr. Neste caso os passos so os mesmos
quer se esteja a usar Windows, GNU/Linux ou MacOS X.
platformio install atmelavr
cd directorioDoProjecto
platformio init
Dentro desta directoria estar um ficheiro chamado platformio.ini, que devemos editar e colocar com as configuraes
correctas, de placa de desenvolvimento, plataforma, framework
e porta.
#
# Project Configuration File
#
# A detailed documentation with the EXAMPLES is
located here:
# http://docs.platformio.org/en/latest/
projectconf.html
#
# A sign `#` at the beginning of the line
indicates a comment
# Comment lines are ignored.
# Simple and base environment
[env:mybaseenv]
platform = atmelavr
framework = arduino
board = leonardo
upload_port = COM10
#
# Automatic targets - enable auto-uploading
targets = upload
50
/*
+----------+---------+
| Texto
| Pino
|
+----------+---------+
|
UP
|
0
|
| DOWN
|
1
|
| SELECT |
2
|
| RIGHT
|
3
|
| LEFT
|
4
|
+----------+---------+
*/
#define UP 0
#define DOWN 1
#define SELECT 2
#define RIGHT 3
#define LEFT 4
De seguida criamos as funes destinadas leitura
das teclas se premidas. As teclas esto ligadas a pinos analgicos, logo temos de ler intervalos de valores, usando a
funo analogread(), para fazer a leitura dos mesmos.
int ReadKey()
{
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
int x = 1023;
B00100,
do
{
B00010,
B00010,
B00100,
B01000,
B10000
x = analogRead (0);
if (x < 60) return RIGHT;
else if (x < 200) return UP;
else if (x < 400) return DOWN;
else if (x < 600) return LEFT;
else if (x < 800) return SELECT;
}
while (x > 800);
}
Com estas funcionalidades bsicas implementadas,
optei por criar um array de chars com todos os caracteres AZ; a-z; 0-9, para permitir que a password seja uma string do
comprimento que o utilizador decidir. Tambm foi opo na
programao das teclas usar a tecla left para acrescentar o
caracter actual password, permitindo assim escrever a password, normalmente, e a tecla Select, para introduzir a password, uma vez toda digitada.
Posto isto, basta apenas fazer um simples menu, como explicado no prprio cdigo, para se navegar entre as
senhas armazenadas.
O cdigo do scratch ser o seguinte:
/*
*Thx to Mkman for the help and advice!
*In loving memory of
*
Misha II
* 12/12/2004 - 13/07/2015
*
You are missed
*/
};
byte et[8] = {
B11111,
B10101,
B11111,
B00100,
B01110,
B11111,
B11111,
B11111
};
byte sandclock[8] = {
B11111,
B01110,
B01110,
B00100,
B01110,
B01110,
B11111,
B00000
};
byte cat[8] = {
B01010,
B11111,
B10101,
B11111,
B00100,
B01110,
B01110,
B11111
};
//define a senha para abrir o cofre
static String strkey = "abcddcba";
//Descries das passwords
//So armazenado na memria flash (no voltil)
do arduino.
static char *desc[] = { "P@P", "Gmail", "MyApp",
"Blog", "FacelessBook" };
//Passwords
static char *keys[] = { "Password1", "Password2",
"Password3", "Password4", "Password5" };
//array de caracteres ascii com as letras a-z;AZ;0-9
static char ascii[] = {'a', 'b', 'c', 'd', 'e',
'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2',
'3', '4', '5', '6', '7', '8', '9', '0'};
//mapa de teclas e respectivos valores
#include <LiquidCrystal.h>
#include <String.h>
//cria alguns caracteres engraados
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
byte skull[8] = {
B00000,
B01110,
B10101,
B11111,
B11011,
B01110,
B01010,
};
byte tulip[8] = {
B10101,
B11111,
B11111,
B01110,
B00100,
B10101,
B01110,
B00100
};
byte prompt[8] = {
B10000,
B01000,
/*
+----------+---------+
| Texto
| Pino
|
+----------+---------+
|
UP
|
0
|
| DOWN
|
1
|
| SELECT |
2
|
| RIGHT
|
3
|
| LEFT
|
4
|
+----------+---------+
*/
#define UP 0
#define DOWN 1
#define SELECT 2
#define RIGHT 3
#define LEFT 4
51
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
i++;
//lcd.clear();
break;
case DOWN:
if (i <= 0)
{
i = 0;
} else if (i >= 62)
{
i = 0;
}
else {}
i--;
c = ascii[i];
lcd.print(c);
break;
case LEFT:
lcd.clear();
break;
case RIGHT:
str += c;
lcd.clear();
break;
case SELECT:
Serial.println(str); //for debug porposes
Serial.println(strkey); //for debug
//porposes
return str.compareTo(strkey);
int index = 0;
#define COUNT 5 //numero de passwords e descries
//armazenadas
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Inicializa
//O lcd
/*
*funo que tem como misso interceptar a leitura
analgica dos pinos das teclas up, down, left,
right e select
*/
int ReadKey()
{
int x = 1023;
do
{
x = analogRead (0);
if (x < 60) return RIGHT;
else if (x < 200) return UP;
else if (x < 400) return DOWN;
else if (x < 600) return LEFT;
else if (x < 800) return SELECT;
}
while (x > 800);
}
/*
*funcao setup
*/
void setup()
{
Keyboard.begin();
lcd.createChar(0, smiley);
lcd.createChar(1, skull);
lcd.createChar(2, tulip);
lcd.createChar(3, prompt);
lcd.begin(16, 2); //16 colunas por 2 Linhas
lcd.setCursor(0, 0);
lcd.print("Lego Pwd Safe");
lcd.setCursor(0, 1);
lcd.print("by apocs");
lcd.write(byte(0));
lcd.write(byte(1));
lcd.write(byte(2));
delay(5000);
lcd.clear();
Unlock();
}
}
}
}
/**
funcao de bloqueio
*/
void blocked(void) {
int i = 0;
for (i = 30; i >= 0; i--) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Locked");
lcd.setCursor(0, 1);
lcd.print("");
lcd.print("seg");
delay(1000);
}
}
/** funcao de desbloqueio
*/
void Unlock() {
int count = 0;
while (1) {
if (inkeys() != 0)
count++;
else
return;
/**
funcao que tem por tarefa interceptar as teclas
primidas e permitir que seja composta a string da
password
*/
int inkeys()
{
lcd.write(byte(3));
int i = 0;
char c;
String str;
while (1)
{
int key = ReadKey();
delay(200);
switch (key)
{
case UP:
if (i >= 62)
{
i = 0;
}
c = ascii[i];
lcd.print(c);
//inc
if (count == 2) {
blocked();
count = 0;
}
}
}
void loop()
{
// put your main code here, to run repeatedly:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pass: ");
lcd.setCursor(0, 1);
lcd.print(desc[index]);
int key = ReadKey();
delay(200);
switch (key)
52
Electrnica
UM COFRE PARA PASSWORDS SIMPLES E DE BAIXO CUSTO!
EEPROM 24LC256, que so relativamente simples em termos de interface com o Arduino, ou at acrescentar funcionalidades de criptografia por hardware, por exemplo com um
Atmel ATSHA204, que pode ser facilmente encontrado online por um preo bastante baixo, mesmo quando j montado
numa breakout board, o que facilitar a ligao ao arduino.
{
case UP:
--index;
if (index < 0) index = COUNT - 1;
break;
case DOWN:
++index;
if (index > (COUNT - 1)) index = 0;
break;
case SELECT:
Keyboard.print(keys[index]);
lcd.print(" - OK");
delay(1000);
break;
Ficou tambm por explorar a possibilidade de construir uma caixa, para o circuito, possivelmente at feita numa
impressora 3D em polmero ABS, ou outro. No entanto essa
temtica sairia muito do mbito especifico deste artigo.
}
}
Uma vez carregado o scratch no Arduino, bastar liglo numa porta USB, que far a dupla funcionalidade de o alimentar e de comunicar com o computador, permitindo assim
que se utilize o circuito para introduzir passwords onde precisamos de as usar.
Cada vez que alteremos ou acrescentemos passwords ao cofre, bastar alterar o valor da constante COUNT
e/ou acrescentar ou alterar nos vectores de descrio e chaves, as respectivas descries e chaves.
Concluso
Como referido no incio do artigo, recordar na nossa
prpria memria dezenas de passwords extremamente difcil,
pelo que o armazenamento externo das mesmas se torna interessante do ponto de vista prtico, mas criando um problema
de segurana. O armazenamento das mesmas num circuito
externo pode ser uma soluo, desde que tal se revele prtico.
Ao longo deste artigo, expliquei como construir um circuito, baseado em Arduino Leonardo e LCD Keypad de 6 teclas, bem como compilar o cdigo e fazer o upload via CLI.
Certamente este cdigo pode ser muito melhorado, como por
exemplo a colocao das passwords no 1KB de EEPROM do
Arduino ou o armazenamento encriptado das senhas, etc. Fica
ao critrio do leitor, modificar o cdigo e o projecto caso assim
o entenda. Neste caso esta soluo no 100% eficaz em
termos de segurana pelo que no se recomenda o seu uso
em ambientes mais sensveis.
Em termos de hardware tambm podem ser feitas
diversas melhorias, como por exemplo a ligao de mdulos de
memria externos, por exemplo um NXP PCF8570P ou uma
AUTOR
Escrito por Antnio C. Santos
Com uma enorme paixo por tecnologia, autodidacta desde tenra idade, cresceu com o ZX Spectrum. Tem vasta experincia
em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvimento de software por medida nas mais diversas
linguagens. Diplomado do Curso de Especializao Tecnolgica em Tecnologias e Programao de Sistemas de Informao
pela ESTG-IPVC. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Software Foundation, onde Programador Voluntrio. Neste momento aluno no Instituto Politcnico de Viana do Castelo, na Escola
Superior de Tecnologia e Gesto no curso de Licenciatura em Engenharia Informtica.
Twitter:@apocsantos
53
COLUNAS
C# - As novidades do C# 6
C#
AS NOVIDADES DO C# 6
1. Melhoramentos em auto-propriedades
As propriedades implementadas automaticamente (ou,
abreviando, auto-propriedades) so propriedades no abstratas e no externas com acessores com corpo apenas com ponto e virgula.
Quando uma propriedade implementada automaticamente, criado um campo escondido para dar suporte propriedade e os acessores de leitura e escrita so so implementados para, respetivamente, ler e escrever desse campo.
}
Note-se
que
os
campos k__BackingField e k__BackingField tm nomes que no
so vlidos em C#. Tal acontece para que no haja qualquer
hiptese de coliso entre os atribudos pelo programador e
os nome atribudos pelo compilador.
1.2. Auto-propriedades apenas de leitura
{
public string First { get; set; } = "Jane";
public string Last { get; set; } = "Doe";
}
Com esta sintaxe, o inicializador inicializa diretamente o
campo que d suporte propriedade sem recorre ao setter da
propriedade.
Os inicializadores de propriedades so executados, tal
como e juntamente com, os inicializadores de campos.
Tal como acontece com os inicializadores de campos,
os inicializadores de propriedades no podem fazer referncia
a this porque, tal como acontece com os inicializadores dos
campos, correm antes dos objetos estarem devidamente inicializados.
A implementao desta nova funcionalidade feita
usando funcionalidades tradicionais da linguagem tornado possvel a utilizao do cdigo gerado em verses anteriores da
plataforma .NET. Na verdade o cdigo anterior traduzido pelo
compilador para o seguinte cdigo C# 1:
55
C#
AS NOVIDADES DO C# 6
}
Tal como acontece com os campos apenas de leitura,
no caso das auto-propriedades apenas de leitura possvel
inicializar o seu valor no construtor:
public class Person
{
// ...
}
2. Membros funo com corpo em formato expresso
Passam a poder ser usadas expresses semelhantes
s funes lambda para definir corpos de funes com apenas
de uma instruo (statement) ou bloco trazendo s funes
membros de tipos a mesma clareza e simplicidade.
Os corpos do tipo expresso tambm podem ser usados para definir o corpo de propriedades e indexadores apenas de leitura:
public string Name => First + " " + Last;
Mtodos, assim como operadores definidos pelo utilzador e converses, podem ter o seu corpo definito por uma expresso usando a seta das lambdas:
56
C#
AS NOVIDADES DO C# 6
3. Diretiva using static
semelhana do que acontece com a diretiva using para espaos de nomes (namespaces), a diretiva using static adiciona os membros estticos da classe ou
enumerado dado como argumento ao espao de nomes global,
permitindo a sua utilizao sem a necessidade de qualificao
com o nome da classe:
using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class Program
{
static void Main()
{
WriteLine(Sqrt(3 * 3 + 4 * 4));
WriteLine(Friday - Monday);
}
}
ser mtodo de extenso passe a ser uma modificao fraturante, o que no era o caso anteriormente. Mas os mtodos
de extenso so geralmente chamados como mtodos estticos nos casos raros em que existe uma ambiguidade e,
nesses casos, parece legtimo que sejam qualificados com o
nome da classe.
4. Operadores condicionados por null
frequente a necessidade de ter cdigo salpicado de
verificao para null. Os operadores condicionados
por null permitem o acesso a membros e elementos apenas
quando o recetor no null, retornando um resultado null caso contrrio:
int? length = people?.Length; // null se people
//null
Person first = people?[0];
// null se people
//null
class Program
{
static void Main()
{
System.Console.WriteLine(System.Math.Sqrt
(3 * 3 + 4 * 4));
System.Console.WriteLine
(System.DayOfWeek.Friday - System.
DayOfWeek.Monday);
}
}
57
A invocao (uma lista de argumentos entre parntesis) no pode ser precedida imediatamente pelo operador ? isso levaria a demasiadas ambiguidades. Assim sendo, a esperada invocao de um delegate caso este no
seja null no funciona. Contudo, o delegate pode sempre
C#
AS NOVIDADES DO C# 6
ser invocado via o seu mtodo Invoke:
if (predicate?.Invoke(e) ?? false) { }
Uma utilizao muito comum desta funcionalidade o
disparo de eventos:
PropertyChanged?.Invoke(this, args);
Que traduzido para:
O
tipo
concreto
retornado
por FormattableStringFactory.Create derivado de:
namespace System
{
public abstract class FormattableString :
IFormattable
{
protected FormattableString();
public abstract int ArgumentCount { get; }
public abstract string Format { get; }
public static string Invariant
(FormattableString formattable);
public abstract object GetArgument(int
index);
public abstract object[] GetArguments();
public override string ToString();
public abstract string ToString
(IFormatProvider formatProvider);
}
}
Isto permite, no s acesso a formato mas tambm
aos argumentos da string formatvel.
5.1.2. Retrocompatibilidade
Note-se que a expresso condicional est entre parntesis, para que : s no seja confundido com o especificador
de formato.
6. Expresses nameof
58
Quando
se
uma System.ArgumentNullException
etc.
lana
C#
AS NOVIDADES DO C# 6
8. Inicializadores de ndices
A partir de agora, passa a ser possvel usar inicializadores em que so usados indexadores:
convertido em:
using S = System.String;
class C
{
void M<T>(S s)
{
var s1 = "T";
var s2 = "S";
}
}
try
{
...
}
catch (Exception ex) when (SomeFilter(ex))
{
...
}
Se a avaliao da expresso entre parntesis a seguir palavra-chave when resultar no valor true, a exceo
apanhada. Caso contrrio, o bloco catch ignorado.
Isto permite que sejam definidos mais que um bloco catch para o mesmo tipo de exceo:
Quando os inicializadores de colees foram introduzidos na linguagem C#, os mtods Add chamados no podia ser
mtodos de extenso. O Visual Basic acertou na sua implementao primeira ao permitir a sua utilizao, mas isso parece ter ficado esquecido para o C#.
Nesta verso a falha foi corrigida e possvel agora
usar mtodos de extenso Add em inicializadores de colees.
59
try
{
//...
}
catch (SqlException ex) when (ex.Number == 2)
{
// ...
}
catch (SqlException ex)
C#
AS NOVIDADES DO C# 6
vez de uma lambda) para mtodos de sobrecarga que recebem delegates.
{
// ...
}
No exemplo anterior o primeiro bloco catch apenas
executado se ocorrer um exceo do tipo SqlException em que
o valor da propriedade Number seja 2. Caso contrrio executado o bloco seguinte.
considerado aceitvel e comum o abuso de filtros de
excees com efeitos colaterais, como logging.
ATENO: Os filtros de exceo so executados no contexto do lanamento da exceo (throw) e no do contexto do
seu tratamento (catch).
10. await em blocos catch e finally
No C#5 no era permitida a utilizao da palavrachave await em blocos catch e finally porque, na altura da
implementao da funcionalidade async-await, a equipa pensou que isto no seria possvel implementar. Mas agora descobriram que afinal no era impossvel.
Recursos
AUTOR
Escrito por Paulo Morgado
Bacharel em Engenharia Electrnica e Telecomunicaes (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa e
Licenciado em Engenharia Informtica pela Faculdade de Cincias e Tecnologia da Universidade Nova de Lisboa exerce variadas funes relacionadas com o desenvolvimento, distribuio e manuteno de software h mais de 10 anos. Participa em
diversas comunidades nacionais e internacionais (pontoNETpt, NetPonto, SharePointPT, SQLPort, Portugal-a-Programar, CodeProject, CodePlex, etc.). Pelo seu contributo para com estas comunidades, a Microsoft premeia-o com o prmio MVP (C#) desde 2003. ainda co-autor do livro LINQ Com C# da FCA.
60
Anlises
Introduo ao Cloud Computing
Python Algoritmia e Programao Web
Introduo ao Desenvolvimento de Jogos em Android
Review
Cloud Computing
um livro muito til,
no s para programadores, mas essencialmente,
para
todos
aqueles que procuram
um maior conhecimento e domnio no que ao
tema ()
AUTOR
Escrito por Ricardo Castro
Licenciado em Sistemas de Informao para a Gesto, tem na ltima dcada dedicado o seu tempo ao ensino superior e profissional. Com o mestrado em Ensino de TIC e doutorando em Educao Ferramentas Distncia e elearning, dedica maioritariamente o seu tempo ao Instituto de Emprego e Formao Profissional, no entanto, desenvolve funes de consultor de Tecnologias de Informao em instituies pblicas e privadas, sendo administrador de 5 plataformas LMS.
63
Review
ISBN: 978-972-722-813-3
Para a review desta edio, chegou-me s mos o
livro Python Algoritmia e Programao Web de Jos Braga
Vasconcelos.
Doutorado em Cincias da Computao pela Universidade de York (UK), Jos Vasconcelos, leva-nos, atravs
deste livro, a novos conhecimentos.
Web Frameworks
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
No captulo 2 feita uma exposio de vrios motores de jogos disponveis no mercado e que podem ser usadas para o desenvolvimento de jogos para as plataformas
mveis, neste caso a plataforma Android. Alm de abordada
a API da Google, so destacados motores de jogos tais como, Unity, Cry Engine, Cocos 2D, Havok Vision Engine, libGDX, Marmalade, Game Salad, GameMaker Studio, Corona SDK entre outros.
ISBN: 978972722807-2
Os captulos 3, 4 e 5 abordam a API 2D para Android, libGDX e Unity respetivamente, onde aprofundam alguns dos conceitos fundamentais para desenvolver jogos
usando estas frameworks, com exemplos tericos e prticos
que ajudam a compreender a mecnica do desenvolvimento
de jogos.
Por fim o sexto e ltimo captulo centrado no Google Play, Servios e Publicao, onde explicado e exemplificada a configurao dos servios do Google Play, acesso
API, Leaderboards, Achievements e por fim a publicao na
Play Store.
O contedo de simples leitura e de fcil perceo,
sendo que usada uma linguagem muito user-frendly o
que facilita muito a leitura da obra, no se tornando extremamente tcnica do ponto de vista da linguagem utilizada.
Como estudante de Engenharia Informtica e sobretudo como curioso e se assim posso chamar de Indie Game
Developer considero o livro Introduo ao Desenvolvimento
de Jogos em Android um livro de qualidade na apresentao dos conceitos introdutrios para quem quer iniciar-se no
desenvolvimento de jogos para a plataforma mvel Android.
A organizao dos contedos foi escolhida mediante a sua importncia e dependncia entre contedos, incluindo exemplos dos vrios motores de jogos disponveis e respetivas consideraes.
Dividido em 6 grandes captulos, as primeiras pginas do livro so orientadas introduo ao desenvolvimento
em Android onde so abordados alguns dos contedos bsicos do desenvolvimento em Android, tal como a criao de
um projeto, estrutura de ficheiros, interface grfica, criao
de um AVD (Android Virtual Device), execuo da aplicao
AUTOR
Escrito por Nuno Santos
Curioso e autodidacta com uma grande paixo pela programao e robtica, frequnta o curso de Engenharia Informtica na
UTAD alimentando o sonho de ainda vir a ser um bom Engenheiro Informtico. Estudante, Blogger, e moderador no frum
Lusorobtica so algumas das suas actividades. Os seus projectos podem ser encontrados em: http://
omundodaprogramacao.com
65
No Code
Big Data: um conjunto de tecnologias imprescindveis no futuro
Windows Hello: A autenticao biomtrica no Windows 10
Windows 10 IOT Core no Raspberry Pi 2 B
No Code
Mobilidade.
Na tendncia incremento de produtividade e
eficincia procuramos melhorar a inteligncia operacional
dos sistemas com grandes volumes de dados, conseguir
responder em tempo real e potenciar a transparncia atravs
de uma melhor partilha de dados.
Relativamente ao aumento de conhecimento
potenciamos uma viso abrangente das organizaes
atravs da anlise de dados estruturados e no estruturados,
construmos pontes entre silos e aumentamos as
capacidades analticas atravs de novos modelos que no
so assentes apenas em amostras de dados.
67
No Code
BIG DATA: UM CONJUNTO DE TECNOLOGIAS IMPRESCINDVEIS NO FUTURO
MongoDB e Redis. Conseguimos com estas tecnologias o
AUTOR
Escrito por Pedro Sarmento
Manager Analytics, Accenture Digital
68
No Code
Introduo
A Microsoft iniciou a 29 de julho a disponibilizao
escala mundial do Windows 10, e nesta altura, so j os
milhes de utilizadores que possuem os seus PCs atualizados. Como se tem falado nos ltimos meses e tal como j
tive oportunidade de escrever na edio nr. 47 desta revista,
o Windows 10 traz imensas inovaes das quais se destacam o to aguardado Menu Iniciar, o Microsoft Edge e tambm a Cortana.
69
Autenticao ao nvel empresarial e acesso a contedos que suportem as Next Gen Credentials (NGC).
Exemplo: Acesso a redes empresariais e respetivos
recursos, sites de comparas online, entre outros.
Atravs de infravermelhos, consegue obter uma imagem pormenorizada do utilizador nas mais diversas
condies de luminosidade e considera pequenas
alteraes na aparncia como a barba, maquiagem e
culos ou lentes de contato.
No Code
WINDOWS HELLO: A AUTENTICAO BIOMTRICA NO WINDOWS 10
Requisitos de Hardware
HP Sprout
Asus N551JQ
Asus X751LD
Relativamente a sensores para a ris, ainda no existem muitos detalhes mas com certeza que brevemente comearo a surgir equipamentos para comercializao no mercado.
Configurao
70
No Code
WINDOWS HELLO: A AUTENTICAO BIOMTRICA NO WINDOWS 10
Concluso
Em concluso, a utilizao destes mtodos de autenticao traduz-se numa srie de benefcios, no s porque
simplifica a forma como interagimos com os nossos dispositivos, mas tambm pelo aumento significativo da segurana
das nossas credenciais.
AUTOR
Escrito por Nuno Silva
Microsoft MVP Windows Experience | Microsoft Technical Beta Tester
71
No Code
Carregador de 5 Volts micro USB com uma amperagem de 1.0 (Carregador de telemvel micro USB);
Cabo HDMI;
Dispositivos
da indstria
Dispositivos
mveis
Pequenos
dispositivos
Desktop
Shell,
aplicaes Win32,
1 GB RAM, 16 GB
de armazenamento.
Shell
Moderno,
Mobile
Chassis
requirement,
512
MB RAM, 4 GB de
armazenamento.
Dispositivos dedicados, ecr opcional, Sem Shell/
armazenamento/
aplicaes, 256MB
RAM, 2GB de armazenamento,
aplicaes universais.
Raspberry Pi 2 B;
Interfaces de utilizador
72
No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B
Antes de colocar o Windows 10 no carto SD recomendo a formatao do mesmo e prara tal utilize a aplicao
SDFormatter
(https://www.sdcard.org/downloads/
formatter_4/) esta aplicao gratuita e permite formatar
cartes de memria SA, SDHC e SDXC. Com o carto formatado inicia-se a Linha de comandos do Windows com opes administrativas, antes de clicar na aplicao Linha de
comandos no menu iniciar clique uma vez com o boto direito do rato e selecione a opo Executar como administrador.
No Windows 7 a 64 bits execute o seguinte comando
cd C:\Program Files (x86)\Windows Kits\10\Assessment and
Deployment Kit\Deployment Tools\amd64\DISM.
No Window7 a 32 bits execute o seguinte comando
cd C:\Program Files (x86)\Windows Kits\10\Assessment and
Deployment Kit\Deployment Tools\x86\DISM
No Windows 8 ou superior no necessrio qualquer
comando.
Ligue o carto de memria SD no computador e execute o seguinte comando wmic diskdrive list brief que vai
identificar todos os sistemas de armazenamento que esto
ligados no computador. A seguinte imagem mostra que o
carto SD est ligado a um leitor de cartes e que o mesmo
est identificado como Device 1.
Para transferir a imagem do Windows 10 para o carto SD utilizada a aplicao Microsoft Deployment Image
Servicing and Management (DISM). Esta aplicao uma
ferramenta de implementao de imagens a mesma tambm utilizada para implementar a instalao do Windows
em USB flash drive (Pen drive).
73
No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B
74
No Code
WINDOWS 10 IOT CORE NO RASPBERRY PI 2 B
Com a ligao efetuada agora pode-se inserir qualquer comando diretamente na subjanela abaixo. A primeira
recomendao alterar a palavra passe. Para alterar insira o
seguinte comando net user Administrator [nova palavra passe] .
AUTOR
Escrito por Ricardo Cabral
Licenciado em Engenharia Informtica pela Universidade Autnoma de Lisboa. O seu twitter @rramoscabral
75
No Code
Artigo aps artigo, nmero aps nmero, foram muitos os que se juntaram a este projecto, participando nele
quer como autores, quer como colaboradores da revista. At
data cerca de 180 pessoas j colaboraram neste projecto.
Um projecto que sendo pequeno, se tornou enorme. Sendo
a nica revista portuguesa de programao. E disponibilizada de forma gratuita a todos os interessados.
Como este um projecto de todos para todos, e queremos que os leitores interajam, h vrias edies que so
votados os 3 melhores artigos, sendo o prmio uma t-shirt do
P@P. Esta votao aberta e feita pelos leitores que assim o
queiram.
Em Maio de 2014, foi relanado o nosso site, em formato blog-post. Neste momento a revista disponibilizada
nesse formato, e claro, no tradicional formato pdf.
J ultrapassamos os 500 artigos publicados. Um nmero que ser sempre maior a cada edio lanada.
As estatsticas revelam que em mdia, cada edio
tem cerca de 18.950 downloads.
Os leitores mais atentos recordam que apesar de neste momento sermos uma publicao trimestral, j fomos uma
publicao bimensal.
76
No Code
Num futuro prximo, que passam pelas ideias da
equipa:
s prximas 50 edies!...
77
No Code
78
No Code
79
No Code
AUTOR
Escrito por Rita Peres
Natural de Castelo Branco, licenciou-se em Engenharia Informtica pela Universidade da Beira Interior. Membro do P@P
desde Janeiro de 2010.
80
No Code
81
e muito mais em
www.revista-programar.info