Professional Documents
Culture Documents
EQUIPA PROGRAMAR
TC BANKCALL #TEMPORARY I HOPE HOPE HOPE
Staff
Antnio Pedro Cunha Santos
Rita Peres
Rui Gonalves Antnio Santos
Contacto
revistaprogramar@portugal-a-
programar.org
Website
http://www.revista-programar.info
ISSN
1 647-071 0
Nota: A partir desta edio ficar sem efeito o concurso habitual de entrega de t-shirts aos trs
artigos mais votados pelos leitores. Contudo, de forma a continuarmos a premiar a contribuio
dos nossos redactores, no final do ano, ser atribuda uma lembrana aos autores com mais
contribuies para a revista , na forma de artigos para a revista Programar. Agradecemos
desde j a vossa a ateno e compreenso. Em breve daremos novidades sobre este tema.
Fiquem atentos!
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 Entity Framework Core 1 - Ricardo Peres
A PROGRAMAR
ELECTRNICA
41 Introduo ao Arduino Adrian Pearce, Andr Melncia
COLUNAS
46 O silncio e os interrupts - Antnio Santos
ANLISES
NO CODE
55 O Poder de uma SPA - Mnica Rodrigues
62 A Engenharia de Software, a qualidade final do software e o papel do profissional de desenvolvimento- Augusto Man-
zano
65 Entrevista a Vnia Gonalves - Rita Peres
65 Projecto em Destaque P@P - Dirt Bike Extreme
EVENTOS
7 Encontro da comunidade IT Pro Portugal - 30 de Agosto de 2016 http://itproportugal07.eventbrite.pt/
Pixels Camp 6 - 8 Outubro de 2016 https://pixels.camp/
Lisbon Game Conference 14-15 de Outubro de 2016 http://lisbongameconf.iscte-iul.pt/
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-programar.pt
3
NOTICIAS
Microsoft PowerShell torna-se
BlackArch Linux: disponibilizados
open-source e ganha verses cerca de 1900 pacotes e mais de
1500 ferramentas de testes de se-
para GNU/Linux e Mac OS
gurana.
Na passada semana, a Microsoft tornou open-source Desde o lanamento da ISO BlackArch Linux h trs
a Shell PowerShell. Inicialmente apenas disponvel para siste- meses atrs, a equipa de desenvolvimento adicionou mais de
mas Windows, est agora disponvel para Linux e Mac . Es- 100 ferramentas novas para uso em testes de segurana.
to a ser lanadas verses alfa do PowerShell para Linux e Baseado no sistema operativo Arch Linux, leve e altamente
Mac OS X , podendo os utilizadores aceder ao GitHub para personalizvel, a nova ISO contm todas as actualizaes de
descarregar os packages pr-compilados do software e ter segurana e software lanadas desde o anncio em Maio da
acesso ao cdigo fonte da pea do mesmo. Esta ferramenta verso anterior.
ir permitir a utilizao da linguagem de script da Microsoft em
plataformas Linux e Mac. semelhana do que foi feito com
a .NET framework em 2014, a iniciativa da Microsoft abre
mais um produto, anteriormente exclusivo plataforma Win-
dows, ao universo MultiPlataforma.
Esto neste momento disponveis instrues de instalao A equipa BlackArch tem mais de 1500 ferramentas na
para as plataformas Windows 10, Windows 8.1, Windows Ser- imagem ISO mais recente, bem como actualizaes ao Blac-
ver 2016 e 2012 R2, distribuies de GNU/ Linux Ubuntu kArch Linux installer.
16.04 e 14.04, CentOS 7, Mac OS X 10.11 e o popular
Docker.
https://github.com/PowerShell/PowerShell
4
TEMA DE CAPA
Entity Framework Core 1
TEMA DA CAPA
ENTITY FRAMEWORK CORE 1
6
TEMA DA CAPA
ENTITY FRAMEWORK CORE 1
Funcionalidades Adicionadas ou Alteradas a verso de .NET multi-plataforma, a Entity Framework Core
ir, assim, correr nos sistemas operativos Linux, MacOS,
Novo Cdigo
FreeBSD e Windows, bem como em dispositivos mveis usan-
A EF Core foi totalmente escrita de raiz. Esta deciso do Windows 10 e aplicaes desenvolvidas para a Windows
teve a ver com o desejo da Microsoft de se ver livre de cdi- Store. Tal no exclui, no entanto, a utilizao em aplica-
go legado, muito do qual praticamente no era usado es .NET 4.6 ou superior, a qual continuar a ser, por agora
algum usa Entity-SQL ou o ObjectContext desde a sada e durante muito tempo, largamente dominante.
do Code First? mas tambm com a necessidade de uma
Configurao de Fornecedores de Dados
profunda alterao que permitisse a implementao de no-
vas funcionalidades radicalmente incompatveis com a ante- substancialmente mais fcil a configurao de forne-
rior arquitectura. Esta abordagem, com mritos, veio, no en- cedores de dados, passando a existir um mtodo virtual na
tanto, causar algumas limitaes verso inicial, 1.0, como classe DbContext exclusivamente para esse efeito: trata-se
veremos a seguir. do mtodo OnConfiguring:
Instalao
protected override void OnConfiguring
semelhana das anteriores verses, a EF Core ir (DbContextOptionsBuilder optionsBuilder)
{
ser disponibilizada exclusivamente atravs do Nuget. A dife- optionsBuilder.UseSqlServer(@"Data
rena que, ao invs de um nico pacote Nuget, teremos de Source=.\SQLEXPRESS; Integrated Security=SSPI;
instalar vrios, consoante as necessidades: Initial Catalog=Blogs;")
base.OnConfiguring(optionsBuilder);
}
Pacote Descrio Cdigo 2 Configurao do fornecedor SQL Server
Micro- Classes base da Entity Fra-
soft.EntityFrameworkCore mework Este exemplo ilustra a utilizao do fornecedor SQL
Micro- Outras funcionalidades Server. Outro exemplo, agora para o fornecedor em memria
soft.EntityFrameworkCore.T (migraes, p.ex.) (requer a instalao do pacote Micro-
ools soft.EntityFrameworkCore.InMemory):
7
TEMA DA CAPA
ENTITY FRAMEWORK CORE 1
usar (o in-memory no aceita nenhum). Um exemplo de SQL a inserir trs registos e a retor-
nar as chaves geradas (IDENTITY) pode ser:
Podemos ver a lista de fornecedores sempre actuali-
zada em https://docs.efproject.net/en/latest/providers/ INSERT INTO [Blog] ([Name], [Url], [Description])
index.html. OUTPUT INSERTED.[BlogId]
VALUES (@p0, @p1, @p2), (@p3, @p4, @p5), (@p6,
Gerao de Identificadores @p7, @p8);
Historicamente, a EF apenas suportava duas estrat- Cdigo 6 SQL para insero de dados em bloco
gias para gerao de chaves primrias:
Execuo de Funes no Lado do Cliente
IDENTITY, do SQL Server; O LINQ introduz validao de queries no momento da
Chaves fornecidas manualmente (p.ex., GUIDs gera- compilao; no entanto, esta validao no inclui chamadas
das por cdigo, ou quaisquer outras chaves de tipos de mtodos de extenso: estas aparentaro ser vlidas at
de dados bsicos que fossem unvocas). que o cdigo corra, altura em que a EF tentar execut-los
na base de dados, caso estes mtodos tenham sido marca-
A nova verso vem finalmente trazer novidades a
dos para tal. Se no, com as verses anteriores da EF, isto
este respeito, nomeadamente, pela introduo do algoritmo
resulta numa excepo, mas tal no o caso da EF Core:
High-Low. Este algoritmo, bem conhecido dos utilizadores
pura e simplesmente, as chamadas sero efectuadas no
de NHibernate, permite a gerao de chaves primrias pela
lado do cliente, aps os resultados terem sido materializa-
Entity Framework e no pela base de dados. Como no h
dos, de forma transparente:
bela sem seno, a Microsoft implementou este algoritmo com
recurso s sequncias do SQL Server 2012, pelo que no var formattedEntities = (from blog in ctx.Blogs
ser suportado em verses anteriores, e o mecanismo no select blog.Format())
qual assenta no verdadeiramente modular. Cai assim por .ToList();
terra o sonho de um mecanismo de gerao de chaves pri- Cdigo 7 Execuo de funes no lado do cliente
mrias independente da base de dados.
Neste exemplo, o mtodo Format ir ser executado aps os
A forma de configurar o uso de sequncias para gera- registos terem sido retornados da base de dados e os objec-
o de identificadores globalmente a seguinte (no mtodo tos materializados. Qualquer mtodo de extenso pode ser
OnModelCreating): usado, apenas no na clusula where, como facilmente
compreensvel.
modelBuilder.ForSqlServerUseSequenceHiLo(); Outro exemplo, usar uma funo client-side para
transformar uma coluna de forma a que possa ser ordenada:
Cdigo 4 Configurao global para uso de sequncias para
var sortedEntities = (from blog in ctx.Blogs
gerar identificadores select blog orderby blog.Name.Soundex())
.ToList();
Mas tambm possvel defini-lo entidade a entidade:
Cdigo 8 Execuo de funes no lado do cliente
modelBuilder
.Entity<Blog>() A ordenao, neste caso, apenas ser aplicada no
.Property(b => b.BlogId)
.ForSqlServerUseSequenceHiLo(); lado do cliente, j que a Entity Framework no sabe nada
sobre o mtodo de extenso Soundex (mero exemplo, este
mtodo no existe).
Cdigo 5 Configurao de sequncias para gerar identifi-
cadores para uma entidade Mistura de SQL com LINQ
Gerao de SQL Optimizada Passa a ser possvel combinar queries LINQ com
SQL. Um exemplo ilustrativo:
A Microsoft gaba-se de ter optimizado a gerao de
SQL, no caso da utilizao de bases de dados relacionais. var itemsContainingTerm = ctx.Blogs
Este era, de facto, um dos calcanhares de Aquiles das ver- .FromSql(SELECT * FROM dbo.SearchBlogs (@p0),
.net)
ses anteriores. Adicionalmente, passou a ser possvel envi- .OrderBy(b => b.Name)
ar ao mesmo tempo mltiplos comandos INSERT, UPDATE .ToList();
e DELETE, ao invs de um por cada, respectivamente, inser-
o, actualizao ou apagamento, o que, s por si, deve Cdigo 9 Mistura de LINQ com SQL
melhorar o desempenho sensivelmente. Alm disso, a rees-
Parece magia, mas a Entity Framework capaz de
crita do gerador de SQL introduz outras melhorias, no senti-
combinar o resultado produzido pelo stored procedure Sear-
do de produzir SQL mais optimizado.
8
TEMA DA CAPA
ENTITY FRAMEWORK CORE 1
chBlogs (poderia ser um SELECT, claro est) e aplicar or- if (e.State == EntityState.Added)
denao pelo campo indicado (Name), resultando no SQL {
e.Property("CreatedBy")
seguinte (simplificado): .CurrentValue = WindowsIdentity.GetCurrent()
.Name;
EXEC sp_executesql SELECT [b].BlogId, [b].Name, e.Property("CreatedOn")
[b].Url, [b].Description FROM (SELECT * FROM .CurrentValue = DateTime.UtcNow;
dbo.SearchBlogs (@p0)) AS [b] ORDER BY [b].Name }
Repare-se que o SQL passado ao mtodo FromSql e.Property("UpdatedBy")
suporta parmetros. O nico cuidado a ter com este SQL .CurrentValue =
que esteve dever retornar colunas compatveis com a enti- WindowsIdentity.GetCurrent().Name;
e.Property("UpdatedOn")
dade que se pretende devolver. .CurrentValue = DateTime.UtcNow;
}
Propriedades Sombra return base.SaveChanges
(acceptAllChangesOnSuccess);
Passou a ser possvel configurar propriedades de }
uma entidade que, tendo correspondncia em colunas na
base de dados (ou numa fonte de dados NoSQL), no pos-
Cdigo 11 Actualizao de propriedades sombra
suem equivalncia na classe .NET. Ou seja, so possivel-
mente includas em SELECTs, UPDATEs e INSERTs, ape- Finalmente, tambm possvel efectuar queries LINQ
sar de no serem visveis nas classes POCO. Um exemplo sobre propriedades sombra, recorrendo a uma sintaxe algo
bvio seria a adio de colunas de auditoria criado por, bizarra:
criado em, modificado por, modificado em. Por no se-
var blogsCreatedToday = (from blog in ctx.Blogs
rem visveis no cdigo, sero, em teoria, mais difceis de where EF.Property<DateTime>(blog,
interferir com. O cdigo para configurar tal seria algo como o CreatedOn) == DateTime.Today)
seguinte: .ToList();
9
TEMA DA CAPA
ENTITY FRAMEWORK CORE 1
{ pode ser trocada por outros. possvel, nomeadamente,
//marcar o post como inalterado injectar fornecedores de log, de gerao de SQL, e muitos
node.Entry.State = EntityState.Unchanged; outros. Este tpico vasto, pelo que fica apenas um exem-
//se a data do post for anterior a hoje
if (((Post) node plo de configurao de log para a consola:
.Entry.Entity).Timestamp.Date<DateTime.Today)
{ public class ConsoleLoggerFactory : ILoggerFactory
//colocar uma indicao que {
//ser partilhada por todos os filhos public void AddProvider(ILoggerProvider provider)
node.NodeState = true; { }
} public void Dispose() { }
} public ILogger CreateLogger(string categoryName)
else if (node.Entry.Entity is Tag) {
{ //fazer log de tudo para a consola
//usa a indicao colocada return new ConsoleLogger(categoryName,
//anteriormente (facility, level) => true, true);
if (node.NodeState == true) }
{ }
node.Entry.State =
EntityState.Deleted; protected override void OnConfiguring
} (DbContextOptionsBuilder optionsBuilder)
else {
{ optionsBuilder.UseLoggerFactory(new
node.Entry.State = ConsoleLoggerFactory());
EntityState.Unchanged; optionsBuilder.UseSqlServer(@"Data
} Source=.\SQLEXPRESS; Integrated Security=SSPI;
} Initial Catalog=Blogs;")
}); base.OnConfiguring(optionsBuilder);
}
10
TEMA DA CAPA
ENTITY FRAMEWORK CORE 1
A possibilidade de adicionar convenes personaliza- tem.ComponentModel.DataAnnotations deixou de
das; ser efectuada;
Intercepo de queries e comandos SQL; A abordagem model first deixa de ser suportada, ape-
nas database first ou code first.
Filtrar coleces de entidades a carregar;
Concluso
Converses de tipos de dados, por exemplo, de
A nova verso da Entity Framework no dever ficar
String para XML;
para a histria por si, mas pelo que possibilita. Na verdade,
Como foi dito no incio, todo o suporte a NoSQL no a prpria Microsoft a admiti-lo: esta nova verso no a re-
foi ainda includo nesta primeira verso. comendada para uso profissional, devendo essa escolha
recair sobre a Entity Framework 6.x. De facto, so tantas as
Funcionalidades Removidas lacunas que quase parece impossvel que o gigante do soft-
Foram removidas as seguintes funcionalidades, a ware tenha optado por a tornar disponvel, com tanta pompa
ttulo definitivo: e circunstncia. No entanto, se pensarmos no suporte a ml-
tiplas plataformas e na possibilidade (futura) de usar o
Todos os APIs dependentes de ObjectContext mesmo API quer para fontes de dados relacionais quer para
(introduzido na verso 1.0 da Entity Framework) fo- no relacionais (Azure Table Storage, Redis, outras), a coisa
ram removidos. Isto significa que no existe mais muda de figura. Para sermos honestos, h algumas funcio-
Entity SQL ou os eventos SavingChanges e Objec- nalidades que merecem a nossa ateno desde j, mas,
tMaterialized, mas tambm entidades com estado para uma utilizao a srio, resta-nos esperar pela prxima
auto-gerido (self-tracking entities); verso. A curiosidade j aperta!
O interface IDatabaseInitializer<T> e todas as suas Referncias
implementaes (CreateDatabaseIfNotExists, Drop-
https://github.com/aspnet/EntityFramework
CreateDatabaseAlways, DropCreateDatabaseIfMo-
delChanges); a alternativa passa por usar exclusiva- https://github.com/aspnet/EntityFramework/wiki/Roadmap
mente migraes; tambm deixa de ser possvel a
http://ef.readthedocs.io/en/latest
alimentao de registos iniciais (seed);
https://data.uservoice.com/forums/72025-entity-framework-
Deixam de existir migraes automticas;
feature-suggestions
A validao de dados de acordo com o API Sys- https://blogs.msdn.microsoft.com/dotnet/
AUTOR
Escrito por Ricardo Peres
11
A PROGRAMAR
Algoritmo de Dijkstra
Funes de distribuio de probabilidade e o Python
Sistema de chat pblico em PHP
O meu primeiro jogo em MonoGame
A PROGRAMAR
Algoritmo de Dijkstra
Nesta edio da Programar, no quisemos deixar de ritmo uma vez que o caminho mais curto para o vrtice desti-
lado uma das linguagens mais usadas de todos os tempos. no tiver sido determinado.
13
A PROGRAMAR
ALGORITMO DE DIJKSTRA
caso esta soma seja melhor que a estimati- //vizinhos de z */
va anterior para o vrtice j, substituir e ano- if (min != HUGE_VAL && v != destino - 1) {
tar k como precedente de j. z[v] = 1;
for (i = 0; i < vertices; i++)
if (!z[i]) {
if (custos
Passemos agora parte da implementao em C. [v*vertices+i] != -1 && dist[v] + custos
[v*vertices+i] < dist[i]) {
dist[i] = dist
#include <stdio.h> [v] + custos[v*vertices+i];
#include <stdlib.h> ant[i] =v;
#include <math.h> }
}
#define FLSH gets(l) }
} while (v != destino - 1 && min !=
/* definir variavies */ HUGE_VAL);
int destino, origem, vertices = 0; /* Mostra o Resultado da procura */
int custo, *custos = NULL; printf("\tDe %d para %d: \t", origem,
destino);
if (min == HUGE_VAL) {
void dijkstra(int vertices,int origem,int desti- printf("Nao Existe\n");
no,int *custos) printf("\tCusto: \t- \n");
{ }
int i,v, cont = 0; else {
int *ant, *tmp; i = destino;
int *z; /* vertices para os quais se i = ant[i-1];
//conhece o caminho minimo */ while (i != -1) {
double min; // printf("<-%d",i+1);
double dist[vertices]; /* vetor com os custos tmp[cont] = i+1;
//dos caminhos */ cont++;
i = ant[i];
}
/* aloca as linhas da matriz */
ant = calloc (vertices, sizeof(int *)); for (i = cont; i > 0 ; i--) {
tmp = calloc (vertices, sizeof(int *)); printf("%d -> ", tmp[i-1]);
if (ant == NULL) { }
printf ("** Erro: Memoria Insuficiente **"); printf("%d", destino);
exit(-1);
} printf("\n\tCusto: %d\n",(int) dist
[destino-1]);
z = calloc (vertices, sizeof(int *)); }
if (z == NULL) { }
printf ("** Erro: Memoria Insuficiente **");
exit(-1);
} void cabecalho(void)
{
for (i = 0; i < vertices; i++) {
if (custos[(origem - 1) * vertices + i] != printf("Implementacao do Algoritmo de
- 1) Dijasktra\n");
{ printf("Comandos:\n");
ant[i] = origem - 1; printf("\t d - Adicionar Grafo\n"
dist[i] = custos[(origem-1) "\t r - Procura Os Menores Caminhos
*vertices+i]; no Grafo\n"
} "\t CTRL+C para Sair do
else { programa\n");
ant[i]= -1; printf("-------- ");
dist[i] = HUGE_VAL; }
}
z[i]=0; void add(void)
} {
z[origem-1] = 1; int i, j;
dist[origem-1] = 0;
do {
/* Ciclo principal */ printf("\nQual o numero de vertices
do { (numero minimo = 2 ): ");
scanf("%d",&vertices);
/* Encontra o vertice que deve entrar em z */ } while (vertices < 2 );
min = HUGE_VAL;
for (i=0;i<vertices;i++) if (!custos)
if (!z[i]) free(custos);
if (dist[i]>=0 && dist[i]<min) { custos = (int *) malloc(sizeof(int)
min=dist[i];v=i; *vertices*vertices);
} for (i = 0; i <= vertices * vertices; i++)
custos[i] = -1;
/* Calcula distancias dos novos printf("Insira as arestas:\n");
14
A PROGRAMAR
ALGORITMO DE DIJKSTRA
do { printf("\n");
do { }
printf("Origem da aresta (entre 1
e %d ou '0' para sair): ", vertices); printf("ENTER para voltar ao menu
scanf("%d",&origem); inici-
} while (origem < 0 || origem > al>\n");
vertices); /* Volta cor normal */
printf("\033[m");
Quero recordarifao(origem)
leitor que{ esta apenas uma das vrias }
do {
maneiras e formas de implementar este algoritmo.
printf("Destino da aresta int main(int argc, char **argv) {
(entre 1 e %d, menos %d): ", vertices, origem); int i, j;
scanf("%d", &destino); char opcao[3], l[50];
} while (destino < 1 || destino >
vertices || destino == origem); do {
do { cabecalho();
printf("Custo (positivo) da scanf("%s", &opcao);
aresta do vertice %d para o vertice %d: ",
origem, destino); if ((strcmp(opcao, "d")) == 0) {
scanf("%d",&custo); add();
} while (custo < 0); }
FLSH;
custos[(origem-1) * vertices +
destino - 1] = custo; if ((strcmp(opcao, "r") == 0) &&
} (vertices > 0) )
{
} while (origem); procurar();
} FLSH;
}
void procurar(void)
{ } while (opcao != "x");
int i, j;
printf("\nOver & Out\n\n");
/* Azul */
return 0;
printf("Lista dos Menores Caminhos no Grafo }
Dado: \n");
for (i = 1; i <= vertices; i++) { Quero recordar ao leitor que esta apenas uma das
for (j = 1; j <= vertices; j++)
dijkstra(vertices, i,j, custos); vrias maneiras e formas de implementar este algoritmo.
At breve!
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.
15
A PROGRAMAR
Funes de distribuio de probabilidade e o Python
Resumo experimentais.
Este artigo aborda a construo de um programa es- Assim, procurando acelerar a anlise de dados,
crito em Python capaz de calcular funes de distribuio de nosso laboratrio decidiu construir uma ferramenta em
probabilidade (PDF) a partir de arquivos *.txt ou *.csv contendo Python, capaz de gerar PDFs de forma rpida e confivel. O
uma ou duas colunas de dados. Essas informaes estatsti- programa desenvolvido, denominado PDF&Freq, capaz de
cas so importantes para compreenso de diversos problemas gerar melhores informaes estatsticas, as quais foram
complexos que usualmente so representados, de forma equi- usadas em diversos trabalhos do grupo onde foi usado para
vocada, atravs de uma abordagem Gaussiana simples gerar PDFs de tamanho de poros 4, dimetro de partculas 5
e mesmo a resistividade volumtrica 6 dos nossos materiais.
Introduo
3 - A probabilidade de um valor aleatrio para estar dentro do Identificao do programa e listagem de atualizaes
intervalo (, ) igual rea delimitada pela curva dentro des- - A primeira etapa do programa visa a identificao do
te intervalo, como mostrado na Figura 1. mesmo para o utilizador, fornecendo dados sobre a verso
usada e a data de criao. Assim, foi utilizada a funo print,
que apresenta os seus objetos na tela do computador.
Vrios comentrios foram acrescidos ao longo das linhas do
programa usando o smbolo hash (#), o que permitiu manter
um registo das atualizaes:
#!/usr/bin/env python
# -*- coding: cp850 -*-
#lista de atualizacoes:
#19/05/16 - Programa versao 0.4
Figura 1 PDF bimodal hipottica #16/03/15 - Modifiquei a forma de verificar se
#ha uma ou duas linhas
A maioria das investigaes cientficas assume que as #18/03/12 - Inseri rotina para detectar se o
flutuaes de dados experimentais podem ser representadas #arquivo de entrada possui uma ou duas colunas
#16/06/10 - Programa versao 0.3
por uma funo de densidade normal. Bard 3 j provou que #21/05/10 - Programa versao 0.2
essa abordagem muito til, principalmente devido sua #18/03/10 - Programa versao 0.1
simplicidade. No entanto, as flutuaes experimentais podem
seguir diferentes funes de distribuio, que podem ser teis Importao dos mdulos necessrios - Os mdulos
para uma interpretao mais apurada dos dados numpy, matplotlib, os, pylab, random, scipy, statistics e
16
A PROGRAMAR
17
A PROGRAMAR
FUNES DE DISTRIBUIO DE PROBABILIDADE E O PYTHON
gravar_log=open('log.dat','w') #Cria arquivo de log y_t0, x_t0 = pdf(dados, kernel = k, n = npdf)
gravar_log.write("kernel= "+k+'\n') y_int0, x_int0 = pdf(dados, kernel = k, n =
string_log = 'Arquivo ; LI(95%) ; MAXPROB; LS
(95%) ; Media ; DesvPad ; Area' npdf)
gravar_log.write(string_log+'\n') y = array(y0)
gravar_log.close() x = array(x0)
y_t = array(y_t0)
Identificao dos arquivos para anlise - Em seguida,
x_t = array(x_t0)
so selecionados todos os arquivos *.txt ou *.csv presentes na y_int = array(y_int0)
pasta. Esses arquivos so listados e depois abertos, um a um, x_int = array(x_int0)
para a anlise PDF, conforme descrito abaixo: gravar.write(nomearquivodados+'\n')
testey = sort(y_t)
Conj_arquivos=listdir(getcwd()) probMax = float(testey[len(y_t)-1:len(y_t)])
arquivos=[] for i in range(0,len(x)):
for i in range(0,len(Conj_arquivos)): if y_t[i] == probMax:
if Conj_arquivos[i][-3]=='t' and Conj_arquivos
[i][-2]=='x' and Conj_arquivos[i][-3]=='t': ponto_x = i #Posio da lista onde a
arquivos.append(Conj_arquivos[i][0:-4]) probabilidade mxima
if Conj_arquivos[i][-3]=='c' and Conj_arquivos centro_x = x_t[i] #Valor da
[i][-2]=='s' and Conj_arquivos[i][-3]=='v': propriedade em analise onde a
arquivos.append(Conj_arquivos[i][0:-4]) probabilidade mxima
print type(arquivos) string_MaxProb = "MaxProb = "+ str
print arquivos (probMax) + " @ " + str(x_t[i])
for i in range(0, len(arquivos)): print string_MaxProb
print str(arquivos[i]) gravar.write(string_MaxProb+'\n')
nomearquivodados = string.rstrip(str(arquivos
[i]),'\n') integral = 0
nomearquivodados = string.rstrip(str(arquivos cont = 0
[i]),'.txt') somatorio_Prob=0.0
nomearquivodados = string.rstrip(str(arquivos lim_cont = 500 - ponto_x
[i]),'.csv') for i in range(0,len(x)):
nomefig = nomearquivodados
print nomearquivodados somatorio_Prob=somatorio_Prob+float(y[i])
try: #Calculo do somatorio para
arquivo=open(nomearquivodados+".csv", "r") #transformar a escala
#Abre arquivo para leitura #de probabilidade
except:
arquivo=open(nomearquivodados+".txt", "r") Posteriormente calculada a probabilidade
#Abre arquivo para leitura acumulada, necessria para a delimitao da regio
gravar=open(nomearquivodados+".rep", "w")
#Report correspondente a 95% de probabilidade a partir da mxima
gravar_pdf=open(nomearquivodados+".fdp", "w") probabilidade calculada:
#Distribuio de probabilidade
gravar_freq=open(nomearquivodados+".frq", "w") PAC=[] #probabilidade acumulada
#Arquivo com a frequencia das repeticoes xs=[] #Valor da propriedade para ser usado na
gravar_log=open('log.dat','a') #Arquivo de log simulacao
dados=[] for i in range(0,len(x_int)):
for line in arquivo: xs.append(x[i])
linha_extra=line.split(',') string_PDF = str(x[i]) + ',' +str(y[i])
if len(linha_extra)>1: #Verifica se ha uma gravar_pdf.write(string_PDF+'\n')
coluna ou duas integral=integrate.trapz(y_int[0:i],x_int
linha_extra[1].rstrip('\r\n') [0:i])
dados.append(float(linha_extra[1])) PAC.append(integral)
#usar dados da segunda coluna if integral/.025 < 1.0:# > 0.023 and
else: integral < 0.025:
dados.append(float(line)) #para o caso ponto025 = i
if integral/.975 <1.0:# > 0.975 and
integral < 0.976:
Clculos estatsticos - Em seguida calculada a mdia, ponto975 = i
o desvio padro e a PDF da amostra. Nesta etapa tambm
determinado onde ocorre o mximo de probabilidade na PDF. A penltima etapa dos clculos estatsticos consiste em
determinar, a partir da PDF, cinco valores mais provveis:
dados_med = 0
pdf1 = 0 dadosimulado=0.0
prob=0.0
pdf2 = 0 nps=0 #nmero pontos simulados
pdf3 = 0 PAC.sort(reverse=True)
dados_med = mean(dados) #Calcula a mdia xs.sort(reverse=True)
dados_desvpad = (variance(dados))**.5 #Calcula #qp=5 #quantos pontos
while nps<qp:
o desvio padrao for i in range(1,len(xs)/10):
y0, x0 = pdf(dados, kernel = k, n = npdf) prob=rnd()
18
A PROGRAMAR
title(titulo)
nome_graf1 = nomefig
ylabel('Probability density',size=18)
xlabel(abscissa, size = 18)
savefig(nome_graf1)
a = x_int[ponto025]
b = x_int[ponto975]
19
A PROGRAMAR
FUNES DE DISTRIBUIO DE PROBABILIDADE E O PYTHON
Em seguida, os dados foram salvos num arquivo Arquivo ; LI(95%) ; MAXPROB; LS(95%) ; Media ;
denominado teste.txt e fornecidos ao programa PDF&Freq. DesvPad ; Area
Como primeira prova, foram geradas PDFs usando diferentes
teste;8.980685;12.2418703;20.0478976;13.8;2.66754
kernels. Os resultados so mostrados na Figura 3.
371;0.999612524
Arquivo teste.frq
9.40974719
9.74840852
9.27565556
12.9108177
19.9949159
Arquivo teste.rep
Propriedade (95%LC) = (-
Figura 3 PDFs obtidos usando os kernels Epanechnikov (a), 3.26118472476;12.2418703658; +7.80602726672)
Triangle (b), Gaussian (c) e Cosine (d)
log.dat
kernel= g
20
A PROGRAMAR
AUTOR
Escrito por Fernando Gomes de Souza Jnior
Bolsista de Produtividade em Pesquisa do CNPq - Nvel 2 - CA EQ - Engenharia Qumica. Possui graduao em Qumica pela
Universidade Federal do Esprito Santo (1999), mestrado em Engenharia e Cincia dos Materiais pela Universidade Estadual do
Norte Fluminense Darcy Ribeiro (2002), doutorado em Cincia e Tecnologia de Polmeros pela Universidade Federal do Rio de
Janeiro (2006) e Ps-Doutorado no Programa de Engenharia Qumica da COPPE / UFRJ. Atualmente Professor Adjunto IV do
Instituto de Macromolculas da UFRJ, Professor Colaborador do Programa de Engenharia Civil da COPPE/UFRJ e Jovem Cien-
tista do Estado do Rio de Janeiro (FAPERJ-2015). Atua principalmente com nanocompsitos polimricos obtidos a partir de
recursos renovveis em trs principais linhas: (I) no campo de recuperao ambiental, coordenando projetos de pesquisa foca-
dos no uso de recursos renovveis para a remoo de petrleo em derramamentos; (II) no campo de sade humana, coorde-
nando projetos que buscam o controle cintico e espacial do processo de liberao de frmacos; e (III) no campo de sensores,
onde coordena projetos que buscam a obteno de fibras vegetais condutoras de eletricidade e o seu uso em sensores para
dispositivos inteligentes.
http://lattes.cnpq.br/3049721573449880
21
A PROGRAMAR
Sistema de chat pblico em PHP
INTRODUO MySQL
Embora a base deste sistema seja o PHP, tambm O MySQL um sistema de gesto de base de dados
sero utilizadas outras tecnologias. A nossa caixa de ferra- (SGBD) que utiliza a linguagem SQL (Structured Query Lan-
mentas tem, ento, o seguinte contedo e a respetiva utiliza- guage). A sua licena livre para desenvolvimento, mas,
o: caso seja utilizada em aplicaes comerciais, passa a ser
paga. Utilizada pela NASA, Friendster, HP, Google, entre
PHP: Linguagem de programao base; outras empresas, , atualmente, uma das bases de dados
mais populares, com mais de 10 milhes de instalaes em
HTML: Estrutura das pginas;
todo o mundo.
CSS: Design das pginas; A funo do MySQL, no nosso sistema de chat, ser
o armazenamento das mensagens dos utilizadores (tambm
jQuery/JavaScript: Utilizao do AJAX; se pode utilizar o MariaDB). Sero utilizadas duas tabelas,
uma para armazenar os nicknames e outra para armazenar
MySQL/MariaDB: Base de dados; as mensagens.
22
A PROGRAMAR
Passo 1 Instalao e configurao das ferramentas No fim da pgina, clique no boto Executar. Neste
necessrias momento, a base de dados e o respetivo utilizador esto
criados.
1. Instalar o XAMPP
2.2 Criao das tabelas
Fazer o download em https://www.apachefriends.org e
executar a instalao. No lado esquerdo selecione a tabela chat e no lado
direito selecione a aba SQL. Onde diz Rodar consulta(s)
1.1. Configurar o XAMPP SQL no banco de dados chat fazer copiar/colar das seguin-
Abrir o Control Panel e iniciar o Apache. Depois de inici- tes queries:
ado clique no boto Admin que dever abrir uma pgina no
Browser (pgina de apresentao do XAMPP). A configurao CREATE TABLE `messages` (
`IdMessage` int(8) NOT NULL COMMENT '(PK) ID da
est concluda. mensagem',
`FromNickname` varchar(32) NOT NULL COMMENT
1.2 Testar o PHP 'Nickname do remetente',
`Message` text COMMENT 'Mensagem',
Abrir o editor de texto, por exemplo, o Notepad++ e es- `MessageDate` timestamp NOT NULL DEFAULT CUR
crever o seguinte script: RENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
COMMENT 'Data da mensagem'
<?php ) ENGINE=MyISAM DEFAULT CHARSET=utf8
echo 'Ol PHP'; COMMENT='Mensagens do chat';
?>
CREATE TABLE `users` (
Guardar o script com o nome teste.php na pas- `Nickname` varchar(32) NOT NULL COMMENT '(PK)
Nickname do utilizador',
ta c:\xampp\htdocs\chat. `LoginDate` timestamp NOT NULL DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
NOTA: necessrio criar a pasta chat COMMENT 'Data do login'
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Depois de guardar o ficheiro no disco, digite o seguinte COMMENT='Utilizadores do chat';
URL no browser: http://localhost/chat/teste.php
ALTER TABLE `messages`
Apareceu o texto Ol PHP? Ento o PHP est a funci- ADD PRIMARY KEY (`IdMessage`);
onar. ALTER TABLE `users`
ADD PRIMARY KEY (`Nickname`);
2. Base de dados
ALTER TABLE `messages`
Vamos agora colocar a base de dados em funciona- MODIFY `IdMessage` int(8) NOT NULL AU-
mento. Obviamente, ser aqui que sero armazenadas todas TO_INCREMENT
as conversas. COMMENT '(PK) ID da mensagem';
2.1. Criao da base de dados Depois de carregar no boto Executar ser criada a
tabela users que armazenar os nicknames dos utilizadores
Com o Control Panel do XAMPP aberto, clique no boto
e a tabela messages que armazenar as mensagens.
Admin referente ao MySQL que abrir
o browser no phpMyAdmin, o que nos permitir criar uma base 3. Script das constantes
de dados e o respetivo utilizador. Para tal, dever clicar na aba
Crie um ficheiro com o nome constants.inc.php e co-
User accounts e clicar no link Add user account. Vamos
pie o seguinte contedo:
ento escrever os seguintes dados onde diz Informao de
login: <?php
# Base de dados
Nome de usurio: chat define('DB_HOSTNAME', 'localhost');
define('DB_USERNAME', 'chat');
define('DB_PASSWORD', 'programar');
Host name: localhost define('DB_NAME', 'chat');
# Tabelas
Senha: programar // Utilizadores do chat
define('USERS', 'users');
Re-digite: programar // Mensagens do chat
define('MESSAGES', 'messages');
Onde diz Database for user account selecionar
Este ficheiro deve ser guardado na pasta chat. Ele
a checkbox que diz:
contm os dados necessrios para a comunicao com a
23
A PROGRAMAR
SISTEMA DE CHAT PBLICO EM PHP
base de dados. public function getError() {
return $this->_error;
Mais tarde, vamos testar se a ligao base de dados }
est a funcionar, mas antes disso vamos precisar de mais al-
/**
guns scripts. * Fecha a ligao base de dados quando o
objeto destruido
Passo 2 Criao das classes */
public function __destruct() {
Optou-se pela programao orientada a objetos, mode- $this->conn = null;
lando, assim, o sistema de chat atravs das clas- }
}
ses Users e Chat.
24
A PROGRAMAR
25
A PROGRAMAR
SISTEMA DE CHAT PBLICO EM PHP
4. Script para testar a ligao base de dados 'message' => $message
)
J temos os scripts necessrios para fazer o teste de );
ligao base de dados. Crie um ficheiro com o no- exit;
}
me teste2.php e escreva o seguinte cdigo:
# 2. Verificar se o nickname j existe na base de
<?php dados
error_reporting(E_ALL); try {
ini_set('display_errors','On'); $user = new User();
$nickname_exists = $user->checkNicknameExists
require 'constants.inc.php'; ($nickname);
require 'DbConnPDO.class.php'; if ($nickname_exists) {
require 'Chat.class.php'; $message = 'Este nickname j existe.';
echo json_encode(
# 1. Ler as mensagens da base de dados array(
try { 'action' => 'insert',
$chat = new Chat(); 'notification' => 'error',
$messages = $chat->getMessages(10); 'message' => $message
echo json_encode($messages); )
} catch (Exception $e) { );
$message = 'Ocorreu um erro.'; exit;
echo json_encode( }
array( } catch (Exception $e) {
"action" => "insert", $message = 'Ocorreu um erro.';
"notification" => "error", echo json_encode(
"message" => $message array(
) "action" => "insert",
); "notification" => "error",
"message" => $message
exit; )
} );
exit;
Ao executar este script, caso no existam erros, devero apa- }
recer dois parntesis retos []. # 3. Inserir o utilizador na base de dados
try {
Passo 3 Comunicao via AJAX $user->insert($nickname);
$_SESSION['nickname'] = $nickname;
Para comunicar com a base de dados vamos utilizar o echo json_encode(
AJAX com JSON atravs do jQuery. array(
'action' => 'replace',
1. Definir o nickname 'notification' => 'success',
'message' => 'Ol '.$nickname.', aguarde por
O script nickname.ajax.php executado quando o utili- favor...'
zador introduz o seu nickname. Este script verifica, ento, se )
);
o nickname contm pelo menos trs caracteres, e se j existe. } catch (Exception $e) {
Caso o nickname no exista, o script insere-o na base de da- $message = 'Ocorreu um erro.';
echo json_encode(
dos. array(
"action" => "insert",
O script nickname.ajax.php contm o seguinte cdigo: "notification" => "error",
"message" => $message
<?php )
session_start(); );
exit;
require 'constants.inc.php'; }
require 'DbConnPDO.class.php';
require 'User.class.php';
2. Inserir mensagem
// Definir uma varivel com o nickname recebido
pelo mtodo POST Sempre que enviada uma mensagem executado o
$nickname = filter_input(INPUT_POST, 'nickname', script set_message.ajax.php que insere a mensagem e o
FILTER_SANITIZE_STRING);
respetivo nickname na base de dados.
# 1. Verificar se o nickname contm o nmero mnimo
de carateres O cdigo deste script o seguinte:
if (strlen($nickname) < 3) {
$message = 'O nickname deve ter no mnimo 3 <?php
carateres'; require 'constants.inc.php';
echo json_encode( require 'DbConnPDO.class.php';
array( require 'Chat.class.php';
'action' => 'insert',
'notification' => 'error', $nickname = filter_input(INPUT_POST, 'nickname',
FILTER_SANITIZE_STRING);
26
A PROGRAMAR
27
A PROGRAMAR
SISTEMA DE CHAT PBLICO EM PHP
$('#form_nickname').on('submit', function (e) 2. Pgina do chat
{
e.preventDefault();
sendForm();
});
function sendForm() {
var msg_error = 'Ocorreu um erro';
var msg_timeout = 'O servidor no est
a responder';
var message = '';
var form = $('#form_nickname');
resetContentInsert();
$.ajax({
data: form.serialize(),
url: form.attr('action'),
type: form.attr('method'),
dataType: "json",
error: function (xhr, status, error)
{
if (status === "timeout") {
message = msg_timeout;
message = '<div class= Na pgina do chat o utilizador pode, efetivamente, ver
"bg-error">' + message + '</div>';
$('#content_insert').empty() e enviar mensagens. A submisso do formulrio, ou seja, a
.html(message).hide().fadeIn('slow'); submisso do texto da mensagem, realizada para o
} else { script set_message.ajax.php, atravs da funo ajax() (nativa
message = msg_error;
message = '<div class= do jQuery), invocada pela funo sendForm(). Neste script o
"bg-error">' + message + '</div>'; jQuery , tambm, utilizado para ler as ltimas mensagens
$('#content_insert').empty()
.html(message).hide().fadeIn('slow'); do chat atravs da funo getMessages(). Esta funo
} recursiva, chamando-se a si prpria de dois em dois segun-
}, dos.
success: function (response) {
var action = response.action;
var notification = NOTA: para simular vrios utilizadores no chat, o leitor pode
response.notification; abrir a pgina em diferentes browsers.
var bg_notification = null;
switch (notification) { Apresenta-se de seguida o cdigo do script chat.php:
case 'success':
bg_notification =
'bg-success';
break; <?php
case 'error': session_start();
bg_notification =
'bg-error'; error_reporting(E_ALL);
break; ini_set('display_errors','On');
}
message = '<div class="' + require 'constants.inc.php';
bg_notification + '">' + response.message + require 'DbConnPDO.class.php';
'</div>'; ?>
if (action === 'insert') { <!doctype html>
$('#content_insert').finish(); <html lang="pt">
$('#content_insert') <head>
.removeAttr('style'); <meta charset="utf-8">
$('#content_insert').empty() <title>Chat pblico</title>
.html(message).hide().fadeIn('slow'); <meta name="description" content="Chat pbli-
} else { co" />
$('#content_replace').empty() <meta name="author" content="Sandro Marques">
.html(message).hide().fadeIn('slow'); <meta name="viewport" content="width=
setTimeout(function () device-width, initial-scale=1">
{ window.location = "chat.php" }, 1000); <link href="styles.css" rel="stylesheet" />
} <script src="https://ajax.googleapis.com/ajax/
}, libs/jquery/1.12.2/jquery.min.js"></script>
timeout: 7000 </head>
});
<body>
} <div id="sidebar"></div>
<div id="primary">
}); <div id="log">
<span class="long-content"> </span>
</script> </div>
<div id="composer">
</html> <form name="form_message" id="form_message"
28
A PROGRAMAR
29
A PROGRAMAR
SISTEMA DE CHAT PBLICO EM PHP
sempre que h mensagens novas. Isto pode ser feito atravs Bibliografia
de websockets, ou outras tcnicas.
Benedetti, R., & Cranley, R. (2011). Head First jQue-
Tambm podero ser implementadas novas funcionali- ry. Sebastopol: OReilly Media, Inc.
dades (mostrar os utilizadores ativos, criar outras salas de
Curioso, A., Bradford, R., & Galbraith, P. (2010). Expert PHP
chat, pblicas ou privadas, registar utilizadores, definir uma
and MySQL. Indianapolis: Wiley Publishing, Inc.
imagem ou avatar, verificar se o utilizador ainda est ativo,
implementar emoticons, enviar mensagens privadas, etc.). Hansen, T., & Lengstorf, J. (2014). PHP for Absolute Begin-
ners. New York: Apress.
Kennedy, A., & Len, I. d. (2011). Pro CSS for High Traffic
Websites. New York: Apress.
Concluso
AUTOR
Escrito por Sandro Miguel Marques
Apaixonado pela programao e web developer h mais de 10 anos, finalista da licenciatura em engenharia informtica no
Instituto Politcnico da Guarda. colaborador ativo dos sites Stack Overflow e GitHub.
30
A PROGRAMAR
O meu primeiro Jogo em MonoGame
32
A PROGRAMAR
spriteBatch.Begin();
spriteBatch.Draw(monkey, Vector2.Zero);
spriteBatch.End();
base.Draw(gameTime);
}
33
A PROGRAMAR
O MEU PRIMEIRO JOGO EM MONOGAME
Transition = 0f; destinationRectangle: square.DisplayRectangle,
} color: Color.White);
spriteBatch.End();
public void Show() base.Draw(gameTime);
{ }
Color = Color.White;
CountDown = TimeSpan.FromSeconds(5);
} Por fim, queremos que o nosso jogo corra apenas em
} Retrato, por isso adicionamos o seguinte cdigo ao constru-
tor:
Para reiniciar a clula ao seu estado default onde o bo-
graphics.SupportedOrientations =
neco est escondido utilizamos o mtodo Reset, o qual cha- DisplayOrientation.Portrait;
mado pelo utilizador ao clicar num boneco. Este mtodo utili-
zado para definir o temporizador para cinco segundos quando
Corremos a aplicao e deveremos ver uma grelha
o boneco aparece no ecr. O mtodo Update chamado em
cheia de bonecos!
cada frame para atualizar o temporizador decrescente, ajudan-
do a perceber se o utilizador no clicou no boneco dentro da
janela de tempo dos cinco segundos. Uma vez definidas as
clulas, vamos definir a grelha. Comeamos por criar um novo
campo List chamado grelha(grid):
Substitumos o mtodo Draw com o cdigo para dese- Adicionando Lgica de Jogo
nhar os nossos bonecos:
Assim que tenhamos uma interface de utilizador cons-
protected override void Draw(GameTime gameTime) truda para o nosso jogo, o prximo passo ser adicionar a
{ lgica necessria para que possa ser jogado.
graphics.GraphicsDevice.Clear
(Color.SaddleBrown); Precisamos de actualizar a grelha de bonecos para
spriteBatch.Begin();
foreach (var square in grid) permitir aos utilizadores interagirem com ela para jogar o
spriteBatch.Draw(monkey,
34
A PROGRAMAR
O mtodo GetState do TouchPanel desenvolve uma A maioria dos jogos, o PapTap aumenta em dificulda-
coleco de localizaes touch e o seu estado: Pressed, Mo- de conforme o jogo continua. Cada nvel ir mostrar mais e
ved e Released, Isto permite o acompanhamento dos toques mais bonecos, portanto precisamos de calcular exactamente
do utilizador no ecr. Se o utilizado tocar no ecr, iremos per- quantas clulas precisamos de exibir. O gameTimer que
correr todas as clulas da grelha e verificar se essa localizao crimos anteriormente utilizado para acompanhar quanto
se interseta com o retngulo de exibio da clula. No caso de tempo decorreu desde que este nvel comeou. Podemos
isso acontecer e o boneco estiver a ser exibido nessa altura, incrementar o temporizador acedendo a gameTi-
tocamos um som, reiniciamos a clula e incrementamos a pon- me.ElapseGameTime que tem a quantidade de tempo desde
tuao do utilizador, afinal ele impediu que o boneco fugisse que o ltimo Update foi chamado. Uma vez que este tempori-
com a revista. Adicionamos o mtodo PressTouches abaixo zador passa os dois segundos, redefinimo-lo para zero e
classe Game1: depois calculamos o nmero de clulas a alterar at um n-
mero mximo. Adicionamos o mtodo CalculateCellsTo-
void ProcessTouches(TouchCollection touchState) Change classe Game1:
{
foreach (var touch in touchState) void CalculateCellsToChange(GameTime gameTime)
{ {
35
A PROGRAMAR
O MEU PRIMEIRO JOGO EM MONOGAME
gameTimer += gameTime.ElapsedGameTime; ProcessTouches(touchState);
if (gameTimer.TotalSeconds > 2) CheckForGameOver(gameTime);
{ CalculateCellsToChange(gameTime);
gameTimer = TimeSpan.FromMilliseconds(0); MakeMonkeysVisible();
cellsToChange = Math.Min(maxCells, IncreaseLevel(gameTime);
maxCellsToChange); }
}
} Geralmente a ordem no tem importncia. Contudo,
normalmente queremos verificar o input do utilizador primeiro
Calcular o nvel de dificuldade para tornar o jogo mais responsivo e garantir que o boneco
esteve no ecr por cerca de cinco segundos completos.
Como j vimos em CalculateCellsToChange, maxCells
define o nmero mximo de macacos a mostrar num nvel par- Executando a Lgica de Jogo
ticular; por defeito, este valor est definido para 1. medida
que o jogo progride, queremos que o valor aumente com o Uma vez completa a maior parte da lgica de jogo
tempo. Para fazer isto, vamos usar um temporizador para se- para o PapTap, precisamos de uma forma de atualizar conti-
guir quanto tempo passou no nvel, e ps 10 segundos, avan- nuamente o jogo medida que ele executado. O Update
ar para outro nvel e incrementar o nmero mximo de bone- utilizado para atualizar qualquer lgica de jogo que tenha-
cos exibidos. Como resultado, o PapTap mostrar um boneco mos enquanto o jogo executa, portanto a que devemos
extra a cada 10 segundos. Adicionamos o mtodo IncreaseLe- colocar o mtodo PlayGame. Vamos substituir o cdigo atual
vel classe Game1: do mtodo Update pelo cdigo abaixo:
36
A PROGRAMAR
if (currentState == GameState.GameOver)
{
var v = new Vector2(font.MeasureString
(gameOverText).X / 2, 0);
spriteBatch.DrawString(font, gameOverText,
center - v, Color.OrangeRed);
37
A PROGRAMAR
O MEU PRIMEIRO JOGO EM MONOGAME
Terminando
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 desenvolvi-
mento 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
e Xamarin Student Partner nesta mesma escola Twitter:@apocsantos
38
ELECTRNICA
Introduo ao Arduino
Electrnica
INTRODUO AO ARDUINO
Aps termos apresentado este workshop no Genuino 8. LEDs: RX e TX indicam comunicao srie (porta
Day Lisbon 2016 (em 2016-04-02, na Microsoft Lisbon Experi- USB), L apresenta o valor do pino 13;
ence), e tambm no IoT Summit 2016 (em 2016-05-05, tam-
Breadboards:
bm na Microsoft Lisbon Experience), decidimos publicar o
guio utilizado. Queremos tambm deixar um agradecimento
especial ao Joo Antunes (do CERN) e ao Antnio Loureno,
pelo apoio pedaggico durante os workshops.
Conhecer o hardware
41
Electrnica
INTRODUO AO ARDUINO
De seguida, necessrio escolher o modelo do Arduino: Nesta funo inicializamos o hardware que
estamos a utilizar. Esta funo corre uma ni-
ca vez quando o Arduino alimentado.
loop()
42
Electrnica
INTRODUO AO ARDUINO
De seguida, carregamos o exemplo Button: Nota: Antes de ligar o Serial Monitor, em algunso
buffer da sada srie enche rapidamente, e a LED comea a
piscar aleatoriamente e o programa fica suspenso na linha
de Serial.println().
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
43
Electrnica
INTRODUO AO ARDUINO
De seguida, carregamos o exemplo AnalogReadSerial: Utilizando o esquema dos laboratrios anteriores,
vamos definir regras para activar o rel. Por exemplo, se
usarmos um sensor de luminosidade, quando deixarmos de
ter luminosidade, queremos activar o rel para ligar uma
lmpada.
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(2, INPUT);
AUTOR
Escrito por Adrian Pearce
Contacto: aenpearce@gmail.com
AUTOR
Escrito por Andr Melancia
Microsoft Certified Trainer (MCT), incidindo maioritamente em SQL Server, assim como Programador/
DBA h 17 anos, desenvolvendo sistemas de informao e multimdia. Participa activamente em comu-
nidades e eventos: IoT Portugal, NetPonto, SQLPort/SQLSaturdays, PTXug (Xamarin), PHPLx, ISOC.PT,
etc. fundador das comunidades IT Pro Portugal, IPv6 Portugal and DNSSEC Portugal.
44
COLUNAS
Kernel Panic - Cross-Platform - O silncio e os interrupts
Kernel Panic
O silncio e os interrupts
Ainda que possa parecer o ttulo de um filme de tercei- muitas vezes serem altamente instrudas, no parecem en-
ra categoria, qualquer semelhana apenas mera coincidn- tender ou ter conhecimento de nenhum dos diversos estudos
cia fruto de um qualquer infortnio das palavras! Passando as que comprovam que uma tarefa interrompida, leva o dobro
brincadeiras, e mudando para o verdadeiro assunto do artigo, do tempo a ser terminada.
todos ouvimos falar de interrupts (sinal emitido pelo hardware
Segundo alguma documentao e estudos realizados
ou software enviado ao processador, indicando que um evento
um programador leva em mdia 15 minutos a entrar no seu
necessita de ateno imediata), para os mais vintage da
estado de concentrao para trabalhar. Ou seja cada inter-
tecnologia que passaram pelos tormentos de configurar os
rupo custar pelo menos mais 15 minutos de tempo, na
interrupts nas bios cada vez que se acrescentava uma placa
execuo das tarefas! Considerando como mdia de inter-
num pc, o conceito ser certamente mais familiar, mas no se
rupes num dia um valor de 4, pode-se considerar que 1h
trata de interrupts de hardware ou software que escrevo! Trata-
do dia completamente desperdiada! Essa mesma hora
se antes das interrupes no trabalho de um programador e
pode ser motivo de tenso e stress, para o programador,
na relao das interrupes com a produtividade.
reduzindo ainda mais a produtividade.
Todos ns certamente j passamos por situaes em
Num estudo realizado por Chris Parnin, onde foram
que as tarefas que estamos a realizar necessitam de ateno
analisadas 10.000 sesses de programao de 86 progra-
focada e exclusiva, sem distraces ou interrupes, sem ru-
madores, e um questionrio a 414 programadores, conclu-
dos nem perturbaes da concentrao, para podermos man-
ram o seguinte:
ter o ritmo e a concentrao no que estamos a fazer. Ao con-
trrio do ficcionado tantas vezes em televiso ou cinema, pro- Um programador leva em mdia 10 a 15 minutos de
gramar no digitar cdigo freneticamente, desenvolver raci- tempo, a retomar uma tarefa, aps ter sido interrompi-
ocnios que permitam digitar cdigo eficiente, seguro, estvel, e do
no digitar a velocidades estonteantes, como quem escreve
um qualquer texto numa rede social, enquanto toma caf, es- Quando interrompido durante a edio de um mtodo,
cuta msica e fala ao telefone. apenas 10% das vezes o programador retomou o seu
trabalho em menos de 1 minuto.
Um programador, quando est a trabalhar, numa gran-
de parte das vezes est num estado de uma quasi-meditao, Um programador provvel que apenas tenha duas
numa espcie de bolha protectora, onde a velocidade do horas por dia de trabalho sem interrupes
tempo definida por ele, onde o prprio som da musica que
A maioria dos programadores navega para diversos
possa estar a ouvir na realidade acaba sendo uma espcie de
locais para reconstruir o contexto, antes de resumir a
silncio, na medida em que reflecte uma ausncia de sons
tarefa
que possam retirar a sua ateno do seu raciocnio e da tarefa
em curso. Muitas vezes foram erros de compilao para relem-
Vejo vezes por demais, programadores a quem pedi- brarem o raciocnio.
do que no usem head-fones, durante as horas de trabalho, a Ou seja, cada interrupo, causa no s stress, e
quem exigido que respondam a todo o tipo de solicitaes perda de tempo, como se traduz em ineficincia, perda do
enquanto realizam o seu trabalho, interrompendo-o de forma equilbrio, e perda da qualidade do trabalho. No obstante
quase constante, quer seja para responder a um simples e- de tudo isto, numa esmagadora maioria das vezes, constato
mail, quer seja para algo to questionavelmente desnecessrio que quem trabalha com programadores, nem sempre tem a
como responder verbalmente a uma qualquer questo qual j percepo do mal que fazem as interrupes e as distrac-
respondeu seja por e-mail, seja por qualquer outra via, mas es cada vez maiores.
que a pessoa inquiridora, no quer despender tempo, a ler a
resposta, optando por um atalho, sem se preocupar com as Se a toda esta situao acrescentarmos a aparente
consequncias que esse atalho possa ter para quem est fixao patolgica pelos ings, que parece assolar a cultura
efectivamente concentrado a realizar uma tarefa complexa. portuguesa, (pressing, forcing, etcing), denote-se bem a
Para quem essa interrupo poder significar horas de esforo stira, quase impossvel um programador no ter algumas
para retomar o trabalho no ponto em que estava quando foi vezes a necessidade soberana de frias, to pouco de co-
interrompido. meter erros de programao, ou de escrever cdigo que nem
sempre faz grande sentido! To pouco e ainda que no ape-
Honestamente no entendo esta dislexia de atitude, nas portugus, de deixar comentrios quase humorsticos no
numa espcie de contra-senso de pessoas que apesar de
46
Kernel Panic
O SILNCIO E OS INTERRUPTS
cdigo como um que se tornou conhecido a quando da divulga- no pode escrever nada, nem usar papel ou qualquer instru-
o do cdigo fonte da framework .net //this is a hack for this mento para escrever. Mas em qualquer dos casos nunca
release. Existem diversas piadas privadas noutros exemplos deixar que o nosso interlocutor execute a tarefa, sem se dis-
de software, mas no valer a pena citar mais, pois o objectivo trair ou ser interrompido! Passados cerca de 2 minutos, que
apenas ilustrar a situao. tal dizer que apenas restam 15 segundos para terminar a
operao, enquanto e poucos segundos depois comear a
complicado explicar a um colega ou um gestor de
contagem decrescente. Como obvio, o interlocutor no ir
projecto ou mesmo a qualquer pessoa que no seja programa-
conseguir resolver a operao, acabando por desistir ou
dor, o quo complexo estar no meio de um raciocnio comple-
manifestar-se incomodado. Assim que pare e perceba que
xo e ter de o suspender!
no existe forma de conseguir realizar a operao, ser mais
No havendo uma formula mgica, para explicar isso fcil explicar porque ser interrompido vezes sem conta, bem
a uma pessoa, existem algumas formas mais ou menos ldi- como sentir-se pressionado, apenas dificulta mais o trabalho
cas, de o ilustrar de forma perceptvel! Uma delas que at pa- e faz aumentar o lapso de tempo despendido a realizar o
rece trivial pedir a quem interrompe, depois de devidamente mesmo! Sim, apenas uma brincadeira, mas como o leitor
atendido, para fazer um favor. No caso somar uma lista de deve entender, uma forma ldica de ilustrar a dificuldade
nmeros, tipo 0+987+765+543+321+012+234+456+678+9, que um programador tem, quando constantemente inter-
sem recorrer a papel e caneta. Enquanto o interlocutor executa rompido ou pressionado.
a operao, interrompe-lo em lapsos de tempo irregulares! At
A titulo de concluso deste artigo de opinio, reco-
se pode oferecer caf, ou mesmo o almoo ao interlocutor, de
mendo vivamente a leitura do estudo de Chris Parnin, sobre
forma a tentar tornar o desafio mais interessante, no entanto
este mesmo tema, pois creio ser deveras interessante.
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 desenvolvi-
mento 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
e Xamarin Student Partner nesta mesma escola Twitter:@apocsantos
47
Media Partners da Revista PROGRAMAR
Anlises
Android Desenvolvimento de Aplicaes com Android Studio
SQL Server 2014: Curso Completo
Review
Contedos
No captulo 6 abordado como aplicar efeitos de profundida-
O livro comea por apresentar uma breve histria e evoluo de, tais como iluminao e sombras, animaes, transies
do sistema operativo Android at aos dias de hoje. Por fim, responsivas, navegao e respostas ao toque. Este tipo de
enumera as caractersticas da plataforma Android desde a padro tenta criar experincias de utilizao mais prximas
sua arquitectura, a Google Play e o conceito de multiplatafor- aos objetos reais ao qual se d o nome de Material Design.
ma tambm detalhado em captulos posteriores, como por
No captulo 7 o autor destaca a gesto de dados. O Android
exemplo os relgios inteligentes, Android Wear, TV e auto-
oferece vrias opes para a persistncia de dados nomea-
mveis.
damente gravao de ficheiros em memria interna/externa,
O captulo 2, o autor descreve o que necessrio para co- via preferncias partilhadas e bases de dados SQLite. Neste
mear a construir uma aplicao Android desde a configura- captulo abordado como funciona cada uma destas tcni-
o do ambiente de desenvolvimento ao detalhe dos fichei- cas.
ros constituintes de um projeto Android desde o ficheiro ma-
O captulo 8 descreve como aplicar boas prticas no desen-
nifesto, localizao dos recursos, referncia aos mesmos e
volvimento para reproduo e gravao de vdeos e udio,
os ficheiros Gradle.
captura de imagens e sua manipulao com base em novas
O captulo 3 apresenta o ambiente de desenvolvimento de classes multimdia disponibilizadas pelo SDK do Android.
aplicaes Android, neste caso o Android Studio. efectua- Destaco algumas dessas classes como: VideoView, Media-
da uma visita guiada s diferentes janelas e ferramentas que Controller, MediaPlayer, entre outras.
o constituem. Gostaria de chamar ateno do leitor a algu-
mas como as Janelas de Ferramentas de edio (Cdigo e
GUI) e as barras presentes. Por fim so apresentados os
emuladores no Android Studio nomeadamente o Android
Studio Emulator 2.0 e o Genymotion.
50
Review
ANDROID DESENVOLVIMENTO DE APLICAES COM ANDROID STUDIO
No captulo 9, o tema abordado o Networking. Como sistema de notificaes entre dispositivos.
habitual noutras aplicaes, hoje em dia a comunicao com
servios externos cada vez mais usual, e no Android no
excepo. O leitor ir aprender boas prticas na codificao
de aplicaes que operam na rede. dado a conhecer os
recursos disponveis para gerir dados na web, desde intents () os dispositi-
(para visualizao de pginas web) ou com base no uso do
widget WebView e manipulao de HTML atravs da biblio- vos inteligentes esto
teca Jsoup. Outros aspectos abordados so como gerir pe-
didos HTTP usando o HTTPUrlConnection e OkHttp e atra- cada vez mais enraiza-
vs de bibliotecas como o Volley e Picasso. Por fim, ser
mostrado como integrar com web services destacando o uso
da API do Facebook para Android.
dos nas nossas vidas.
O captulo 10 respeitante a mapas e localizao. Neste A evoluo da tecnolo-
captulo descrito o Google Play Services (internamente
denominado por Google Mobile Services - GMS) como a
biblioteca de servios do Android. Esta biblioteca integra com
gia cada vez mais
vrias APIs destacando-se a API Maps (para gesto de ma-
pas as aplicaes baseado em Google Maps) e Location
crescente e os utiliza-
(para obteno peridica da localizao).
dores tornaram-se mais
exigentes, contactando
cada vez mais com es-
tes dispositivos.
Concluso
AUTOR
Escrito por Mnica Rodrigues
Licenciada em Engenharia Informtica e de computadores pelo ISEL. Software engineer com vasta experincia em desenvol-
vimento web nas mais variadas tecnologias, desde HTML5, AngularJs, Asp.Net Web API, Asp.Net MVC, WCF, Entity Fra-
mework e tantas outras. Gosto igualmente de desenhar solues de arquitectura aplicando padres de desenho. Gosto de
participar, entre outros, nos eventos da Microsoft, das comunidades Netponto e outras de forma a estar atenda s tecnologias
emergentes. Linkedin: https://pt.linkedin.com/in/monicascrodrigues
51
Review
Ttulo: SQL Server 2014: Curso Completo Quem pretende obter certificao Microsoft em SQL
Server, este livro o ideal para o exame https://
Autores: Alberto Magalhes
www.microsoft.com/en-us/learning/exam-70-462.aspx 70-462
Editora: FCA - Editora de Informtica (Administrao) e um bom complemento para o respectivo
curso https://www.microsoft.com/en-us/learning/course.aspx?
Pginas: 606
cid=20462#overview MOC 20-462. Tem tambm informao
ISBN: 978-972-722-811-9 introdutria para os cursos/exames seguintes, mas no foca
a matria do curso anterior, https://www.microsoft.com/en-us/
learning/course.aspx?cid=20461#overview MOC 20-461
Tempo dinheiro, portanto fica j aqui a minha opini- (Queries). Ou seja, o foco maioritamente em tarefas de
o: Gostei do livro e recomendo. administrao, no de desenvolvimento ou consulta de da-
dos. Como tal, sinto a falta de informao sobre criao/
Queres saber porqu? Continua a ler!
alterao de tabelas, views, stored procedures, etc. Mas
Quando me pediram para fazer a review /anlise/ enfim, essa matria daria outras 600 pginas.
crtica deste livro, decidi considerar os dois cenrios tpicos:
Adicionalmente, este tipo de livros omite referncias a
1. Algum que nunca usou SQL Server (iniciante) e gostava cloud (algo imprescindvel hoje), mas aqui no faltam (e
de aprender; e bem) referncias ao http://AZURE.COM Azure (o servio
cloud da Microsoft), nomeadamente a https://
2. Algum que j profissionalmente experiente (mdio/
azure.microsoft.com/services/sql-database Azure SQL Data-
avanado) com SQL Server numa verso anterior e pretende
base. Nota: indico aqui o nome actual do servio, j que
aprender mais sobre a verso 2014.
data de lanamento deste livro tinha ainda a designao
Este livro responde s necessidades de ambos, fo- SQL Azure, alterada recentemente.
cando a administrao e manuteno.
A primeira parte do livro est bem estruturada e cor-
um livro de leitura fcil, onde no faltam scre- responde ao que habitual em cursos de formao em SQL
enshots e tabelas comparativas, explicado de forma simples. Server para iniciantes:
Para cada funcionalidade, h uma grande preocupao em
Componentes e funcionalidades do SQL Server (que
detalhar cada uma das opes de configurao. Talvez do
so detalhados ao longo do livro);
mais completo que vi, excedendo muito o detalhe dos livros
de cursos oficiais da Microsoft (MOC). Por esse motivo, Comparativo de edies do SQL Server (Standard,
tambm uma boa referncia para utilizadores mais experien- Enterprise, etc.) e licenciamento;
tes.
Diferenas entre verses, incluindo obviamente as
novidades do SQL Server 2014 (tambm detalhadas ao lon-
go do livro); etc.
52
Review
SQL SERVER 2014: CURSO COMPLETO
exaustiva de opes de gesto do servidor (incluindo o Re- cados a Alta Disponibilidade. Incluem Always On Failover
source Governor), manuteno (SQL Server Agent, mainte- Cluster, Availability Groups, Mirroring e Replication, incluindo
nance plans, comando DBCC, etc.), ferramentas de monitori- detalhadamente a implementao de cada caso.
zao (Profiler, Extended Events, etc.). Fica a faltar uma
Finalmente, h uma introduo muito til a Integration
referncia geral s Dynamic Management Views (s referi-
Services> (a forma recomendada de automatizar transfern-
das brevemente para replicao).
cias e transformaes de dados, ou ETL, entre servidores e/
A Segurana no esquecida, h um captulo inteiro ou bases de dados), assim como ao Reporting Services
dedicado ao tema, detalhando inclusivamente opes de (uma das formas de consumir dados relacionais ou de BI em
encriptao (entre elas Transparent Data Encryption, e mais formato de relatrios, pginas web, etc.). Sobre estes dois
tarde tambm encriptao de backups), assim como auditori- servios h obviamente muito mais para dizer, e quem quei-
as. ra seguir para a rea de Business Intelligence vai certamente
aprofundar estes assuntos.
O que falta no livro? Para alm das poucas coisas que men-
cionei em cima, faltam as melhorias da futura verso 2016, a
ser lanada daqui a uns dias (que obviamente no culpa
do autor). Fica a sugesto de expandir este livro para a ver-
so 2016: Descrio dos novos servios como o R Services,
novas opes de integrao com o Azure como a Stretch
Database, opes de segurana como Always Encrypted,
Seria grave no existir um captulo dedicado a bac-
Row Level Security, Dynamic Data Masking, etc.
kups (e nunca esquecer, a restores!), e nisto o livro no fa-
lha. Tem bom detalhe e inclui opo de backup para Azure. Finalmente, termino como comecei: Gostei do livro e
recomendo.
Entretanto, menos interessante para iniciantes mas
muito til para utilizadores avanados, so os captulos dedi-
AUTOR
Escrito por Andr Melancia
Microsoft Certified Trainer (MCT), incidindo maioritamente em SQL Server, assim como Programador/
DBA h 17 anos, desenvolvendo sistemas de informao e multimdia. Participa activamente em comu-
nidades e eventos: IoT Portugal, NetPonto, SQLPort/SQLSaturdays, PTXug (Xamarin), PHPLx, ISOC.PT,
etc. fundador das comunidades IT Pro Portugal, IPv6 Portugal and DNSSEC Portugal.
53
No Code
O Poder de uma SPA
A vida na Cloud
Indstria Alimentar Aliada s TI's
A Engenharia de software, a qualidade final do software e o papel do profissional de
Desenvolvimento
Entrevista a: Vnia Gonalves
Projecto em Destaque na Comunidade p@p: Matraquilhos
No Code
O Poder de uma SPA
2. Responsive
As aplicaes necessitam de ser responsivas para
serem facilmente visveis nas diferentes resolues de
ecrs.
3. Round Trip
Grande reduo do nmero de pedidos efetuados
entre cliente e servidor. Uma vez que a aplicao se
centra maioritariamente do lado do cliente, o
programador s necessita de fazer os pedidos
necessrios para obter, gravar e listar os dados
propriamente ditos, e no pginas HTML.
55
No Code
O PODER DE UMA SPA
Como podemos constatar o peso sobre o
mecanismos de local storage e session storage
desenvolvimento do lado do cliente pequeno e
fornecidos pelo HTML5.
o Javascript usado para realizar alteraes simples seja a
nvel da interface ou das animaes.
Consideraes Aplicaes Nativas
Apesar das inmeras vantagens existentes na As aplicaes nativas so aplicaes stand-alone que
construo e uso de SPAs existem algumas consideraes necessitam de ser instaladas em primeiro lugar. Sendo que
em ter em conta, sendo elas: estas s podem correr nos dispositivos para as quais foram
1. O primeiro carregamento da pgina pode ser lento criadas. Estas aplicaes so desenhadas para tirarem maior
A primeira vez que a aplicao carregada poder proveito do sistema operativo e hardware para as quais foram
levar algum tempo uma vez que grande parte dos concebidas, no entanto torna o seu desenvolvimento
dados tm que ser carregados de inicio para que toda mais complexo. No se esquea que ao desenvolver
a interao possa ser efetuada maioritariamente do nativamente para dispositivos tem que ter em conta as
lado do cliente. verses dos drivers e at mesmo do sistema operativo.
56
No Code
O PODER DE UMA SPA
diferentes pginas, uma correspondendo pgina HTML dos
Concluso
produtos e outra pgina HTML das categorias e dentro
destas, uma SPA que gere a listagem, insero, alterao e Para concluir deixo-vos algumas frameworks que
remoo (operaes CRUD, por exemplo) de produtos e/ou existem actualmente e que nos auxiliam na construo de
categorias, respetivamente. SPAs sendo elas o Angular, Ember e Aurelia. Existem
tambm algumas bibliotecas como o Knockout, Backbone
entre outras que nos auxiliam na construo das chamadas
Mini SPAs que referi acima.
AUTOR
Escrito por Mnica Rodrigues
Licenciada em Engenharia Informtica e de computadores pelo ISEL. Software engineer com vasta experincia em desenvol-
vimento web nas mais variadas tecnologias, desde HTML5, AngularJs, Asp.Net Web API, Asp.Net MVC, WCF, Entity Fra-
mework e tantas outras. Gosto igualmente de desenhar solues de arquitectura aplicando padres de desenho. Gosto de
participar, entre outros, nos eventos da Microsoft, das comunidades Netponto e outras de forma a estar atenda s tecnologias
emergentes. Linkedin: https://pt.linkedin.com/in/monicascrodrigues
57
No Code
A VIDA NA CLOUD
O que a Cloud? Onde est? Todos j ouvimos falar Cloud pblica para operaes menos sensveis, enquanto as
dela e muitos utilizam-na sem sequer saberem. Em termos operaes mais crticas so operadas em modo privado.
simplistas a Cloud consiste em armazenar e ter acesso a
Tipos de servio
dados e aplicaes na internet, em vez das mesmas estarem
no nosso prprio computador. A Cloud, ou a nuvem, foi uma Infrastructure as a service (IaaS)
metfora para a internet desde sempre, j que representa os
As IaaS referem-se disponibilizao de recursos
diferentes cenrios nos quais recursos computacionais so
computacionais (maioritariamente de hardware) atravs da
disponibilizados por uma rede. Mais do que disponibilizar
rede. A sua oferta abrange entre outros recursos o espao
recursos de hardware e/ou software, a Cloud permite dispo-
em disco, ligaes de rede e endereos IPs. Os recursos
nibilizar uma gama de recursos virtuais ou fsicos remota-
encontram-se em vrios data centers sendo que os clientes
mente, por oposio ao acesso a esses recursos locais em
podem aceder a estes elementos virtuais e construir assim as
discos rgidos, o que se denomina normalmente por armaze-
suas prprias plataformas.
namento local.
58
No Code
A VIDA NA CLOUD
AUTOR
Escrito por Pedro Pico
Engenheiro Informtico
https://www.linkedin.com/in/ppico
59
No Code
INDSTRIA ALIMENTAR ALIADA S TI'S
Para esta edio da Programar, aceitei o desafio de tamento de informtica interno a cada empresa, que desen-
escrever um artigo que pretende relacionar a indstria ali- volva e mantenha o seu prprio software, como acontecia na
mentar com o sector das Tecnologias de Informao. Todos dcada de oitenta do sculo passado, a evoluo guiou o
sabemos que por trs de um sistema informtico, est pelo uso da tecnologia na industria alimentar, para o que podemos
menos um programador. E um programador por si s, um denominar de gesto de smart manufacturing. Uma vez que
facilitador de processos. O exemplo prtico que irei apresen- estes sistemas ao funcionarem ligados internet e a intra-
tar ao leitor reflete a ascenso que os sistemas informticos nets, conseguem ligar-se a vrios departamentos do proces-
esto a ter na indstria alimentar. Este um dos temas em so produtivo reportando, em tempo real, as suas atividades.
que estou a trabalhar atualmente na minha dissertao de A revista Food Engineering realizou recentemente um inqu-
Mestrado em Engenharia Alimentar (Instituto Superior de rito em que pergunta aos seus leitores, a rea em que vm o
Agronomia). Ao estagiar numa pequena empresa que se smart manufacturing a criar mais impacto no processo, e a
encontra na fase de implementao fundamental perceber resposta mais votada foi a organizao no trabalho. O que
o impacto que um sistema informtico pode causar no dia-a- no de estranhar, uma vez que possvel relacionar num
dia da produo, pois este permite uma melhor gesto e um s programa as rotinas administrativas e produtivas:
acesso praticamente imediato informao.
Gesto da Produo (ex: agendamento de ordens de
S em Portugal, segundo dados apresentados no fabrico);
eInforma, existem atualmente 18.712 empresas da indstria
alimentar, o que representa 11,4 % das indstrias transfor- rea Administrativa e Financeira (ex: recursos huma-
madoras existentes no pas. Ao longo dos anos o sector ali- nos);
mentar tem vindo a ajustar-se s novas tecnologias, tirando
Gesto de Stock;
partido das mesmas, aliando o controlo da produo e quali-
dade vertente tecnolgica. Sendo um sector bastante co- Entre outras funcionalidades.
nhecido pelo excesso de registos dirios que se transformam
O uso dos sistemas informticos j comea a ser uma
em pilhas de papis, com a evoluo destes sistemas infor-
realidade cada vez mais recorrente de algumas indstrias
mticos deixa-se de necessitar de papel passando-se a re-
alimentares, principalmente nas grandes indstrias que so
correr a um tablet existente no cho de fbrica. De um modo
as que possuem capital suficiente para procederem ao inves-
eficaz e em tempo real possvel transformar muitos dos
timento tecnolgico. Em Portugal j existem inmeras empre-
dados em informao de apoio gesto.
sas capazes de fornecerem este tipo de servios, saliento
duas que considero mais relevantes:
60
No Code
INDSTRIA ALIMENTAR ALIADA S TI'S
so primeiro estranha-se e depois entranha-se de Fernan- de preos, que normalmente resultam numa espiral de des-
do Pessoa, mas depois ao pensar fora do quadrado conse- cidas at venda do produto com margens de lucro incom-
guimos perceber que os vrios departamentos existentes portavelmente baixas e por consequncia o desastre. Para
numa empresa ao funcionarem em tempo real, interligados as empresas continuarem a competir no mercado, necessi-
entre si conseguem trabalhar e produzir de forma muito mais tam de estar numa permanente atualizao e comprometidas
eficiente. com a inovao. O investimento tecnolgico sem dvida
para muitas empresas fulcral, porque conseguem manter-se
Apesar do sistema informtico envolver um elevado
ativas no mercado e vir a reduzir os seus custos de produo
investimento inicial, acredito que este investimento ir fazer
a curto prazo atravs de uma eficiente gesto de recursos.
com que a mdio prazo todas as pequenas, mdias e gran-
Com a massificao de tecnologias de comunicao
des empresas acabem por aderir. Para este facto, tambm
que permitem ter no limite tudo ligado internet, como o
concorre o aparecimento de software disponibilizado em mo-
caso do IoT e dos sistemas cloud, altamente provvel que a
delo de retalho, dedicado s industrias alimentares e com
industria cada vez mais aposte na tecnologia, como forma de
grandes mecanismos de implementao que do s empre-
se diferenciar e promover a concorrncia no mercado, de
sas a possibilidade de ajustarem o sistema a si, sem terem
formas inteligentes.
de se ajustar ao sistema, promovendo a concorrncia pela
diferenciao de produto e evitando as chamadas guerras
AUTOR
Escrito por Vanessa Faquir dos Santos
Licenciada em Engenharia Alimentar encontra-se actualmente a terminar o mestrado em Engenharia Alimentar com especiali-
zao em Processamento de Alimentos no Instituto Superior de Agronomia.
61
No Code
A ENGENHARIA DE SOFTWARE,
62
No Code
A ENGENHARIA DE SOFTWARE,
63
No Code
A ENGENHARIA DE SOFTWARE
pequenos e mdios (BECK, 2008, p. xi), alm da outras medidas de trabalho, buscando o desenvolvimento de
metodologia Scrum voltado para gesto e planejamento de aplicaes que venham a atender a necessidade dos clientes
projetos (TELES[2], 2014). Esses mtodos mais recentes e que estejam dentro de um custo e tempo de
parecem indicar algumas respostas as perguntas apontadas desenvolvimento aceitveis.
por Pressman (1995, p. 9):
AUTOR
Escrito por Augusto Manzano
Natural da Cidade de So Paulo, tem experincia em ensino e desenvolvimento de programao de software desde 1 986.
professor da rede federal de ensino no Brasil, no Instituto Federal de Educao, Cincia e Tecnologia. tambm autor, possuin-
do na sua carreira vrias obras publicadas na rea da computao.
64
No Code
ENTREVISTA A VNIA GONALVES
65
No Code
PROJECTO EM DESTAQUE NA COMUNIDADE P@P: DIRT BIKE EXTREME
66
Veja tambm as edies anteriores da
www.revista-programar.info
50
49 Edio - Setembro 2015
Revista PROGRAMAR
e muito mais em
50 Edio - Dezemb
51 Setembro
ro 2015
2015 47 Edio - Maro
48 Dezembro
20152014
52 Edio - Maro 2016 49 Edio - Maro
48 Junho 2015