You are on page 1of 68

EDITORIAL

EQUIPA PROGRAMAR
TC BANKCALL #TEMPORARY I HOPE HOPE HOPE

Todos os percalos fazem parte da evoluo, de verso para verso! E


Coordenador desta feita o atraso nesta edio, foi fruto de um dos maiores percalos at agora
Antnio Pedro Cunha Santos
enfrentado! Mas como sempre sobrevivemos, superamos, evolumos! E passados 10
anos, c estamos!
Editor Para esta edio, estava com imensas dificuldades em escolher um titulo
Antnio Pedro Cunha Santos para o editorial, at que me lembrei daquilo que nos acontece, a todos ns que
desenvolvemos e criamos tecnologia! Aquelas situaes em que escrevemos algo,
ou ligamos algo, e acreditamos com todas as foras, que vai funcionar, ainda que
Design seja algo temporrio! E nessa perene memria lembrei-me de um comentrio que li,
Filipa Peres no recentemente tornado publico, cdigo fonte desenvolvido para o modulo lunar da
misso Apollo 11, que colocou o primeiro Homem na lua! Um singelo comentrio
quase que humorstico, onde se pode ler Temporary, I hope hope hope.
Redaco
Adrien Pearce De facto a ideia do autor da linha de cdigo em questo, bem poderia ser que
Andr Melancia aquele truque, fosse apenas temporrio, mas facto que levou um Humano lua e
Antnio Pedro Cunha Santos trouxe-o de volta!
Augusto Manzano
Esta edio comemora os 10 anos da revista, e relembra-nos que a cada
Fernando de Sousa Junior
iterao, continuamos a evoluir, a melhorar a aprender, apesar de algumas vezes
Mnica Rodrigues
tambm ns termos vontade de fazer como um outro developer de uma plataforma
Pedro Pico
que tanto usamos escreveu this is a hack for this release! Sim, algumas coisas so
Ricardo Peres
Rita Peres mesmo hacks for this release ou temporary we hope, hope, hope, mas a verdade
Sandro Marques que continuamos c! A trazer-vos novos contedos a cada edio! Foram 10 anos,
Vanessa Santos venham mais 10! Venham mais 210-1 e ns c estaremos!
Vnia Gonalves At l, despedimo-nos com votos de umas excelentes frias, recheadas de
muito cdigo e sem nenhum overflow!

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

13 Algoritmo de Dijkstra - Rita Peres


16 Funes de distribuio de probabilidade e o Python - Fernando Gomes de Souza Jnior,
22 Sistema de chat pblico em PHP - Miguel Marques
32 O meu primeiro Jogo em MonoGame - Antnio Santos

ELECTRNICA
41 Introduo ao Arduino Adrian Pearce, Andr Melncia

COLUNAS
46 O silncio e os interrupts - Antnio Santos

ANLISES

50 Android Desenvolvimento de Aplicaes com Android Studio - Mnica Rodrigues

52 SQL Server 2014: Curso Completo - Andr Melncia

NO CODE
55 O Poder de uma SPA - Mnica Rodrigues

58 A Vida na Cloud - Pedro Pico


60 A Industria Alimentar Aliada s T.I. - Vanessa Faquir dos Santos

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.

At ao momento mais de 3500 pessoas marcaram o reposit-


rio e mais de 300 fizeram forks do mesmo. Foram detectadas
mais de 200 questes e submetidos mais de 800 pedidos de
alterao e acrescento ao cdigo original. Foram feitas mais
de 2000 adies ao cdigo original s na ltima semana.

Tal como aconteceu aquando da disponibilizao do cdigo


fonte da framework .NET, foram encontrados alguns coment-
rios engraados ao longo do cdigo, a exemplo: AssemblyIn-
fo.cs Linha 16 "// These attributes aren't every used, it's just a
hack to get VS to not complain" , VariableAnalysis.cs linha
631: "(this is an ugly hack, but it works.)"

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.

Para mais detalhes aqui fica o link:

https://github.com/PowerShell/PowerShell

Fonte: Revista PROGRAMAR

A imagem ISO est disponvel para download no site


oficial, bem como os respectivos mirrors.

Fonte: Revista PROGRAMAR

4
TEMA DE CAPA
Entity Framework Core 1
TEMA DA CAPA
ENTITY FRAMEWORK CORE 1

Entity Framework Core 1

de algumas ausncias, totalmente aceitveis numa primeira


Introduo verso, e o mesmo se passou com a nova funcionalidade de
migraes, poderosa, que trouxe para o mundo das bases
A Entity Framework a tecnologia para acesso a da- de dados as funcionalidades de controlo de verses, to
dos recomendada pela Microsoft. A sua prxima verso bem conhecidas dos programadores. Passou a falar-se de
(disponvel a partir de Junho de 2016) ser a quinta e prome- Entity Framework Code First.
te ser revolucionria em vrios sentidos. Este artigo ir reve-
lar o que precisa de saber sobre ela. Brevemente a Microsoft disponibilizou uma actualiza-
o 5 - que introduziu tipos de dados enumerados e geo-
Histria espaciais ao modelo Code First, bem como a possibilidade
A Entity Framework foi lanada em conjunto com o de chamar funes SQL transparentemente em pesquisas
Service Pack 1 da framework .NET verso 3.5, em meados LINQ atravs de mtodos estticos em classes .NET.
de 2009. No incio, dividiu atenes com o LINQ to SQL, Finalmente, a verso 6 veio culminar o processo de
outra framework de acesso a dados lanada ao mesmo tem- maturao da Entity Framework como ferramenta ORM de
po; por esta, no entanto, ser mais simples e limitada unica- pleno direito, com suporte a intercepo e logging de chama-
mente a SQL Server, cedo foi deixada para trs, passando a das, uso de stored procedures para operaes Create-
Microsoft a recomendar a utilizao da Entity Framework Update-Delete (CUD), possibilidade de definio de conven-
para todos os cenrios de acesso a bases de dados relacio- es personalizadas, e, uma das funcionalidades mais apre-
nais. ciadas, a possibilidade de efectuar a maior parte das opera-
Com a primeira verso da Entity Framework, a Micro- es de forma assncrona. Muitas das funcionalidades previ-
soft iniciou uma aventura num mercado onde j existiam amente introduzidas foram tambm alvo de melhoramentos,
outros participantes, sendo o mais notrio o NHibernate. com destaque para as migraes. Parecamos estar no bom
Como framework ORM Object-Relational Mapper -, a caminho.
Entity Framework encontrava-se ento muito longe do que Eis seno quando a Microsoft veio baralhar completa-
estes outros participantes ofereciam, beneficiando, no entan- mente o jogo, com o anncio da sua nova verso, designada
to, de bom suporte a LINQ, tecnologia ento nos seus pri- inicialmente por 7, e, mais tardiamente, por Core 1, nome
mrdios, e que se viria a revelar essencial. que ficou.
A segunda encarnao foi introduzida com o .NET 4.0
e trouxe consigo o suporte opcional a Plain Old CLR Ob-
jects (POCOs) simples classes .NET sem necessidade de
herdar de uma classe especfica da framework, carregamen-
to implcito (lazy loading) e a possibilidade de personalizar os
modelos T4 usados para gerar as classes, quer quando o
modelo era importado da base de dados, quer quando este
era definido no editor integrado no Visual Studio.

Com a terceira verso lanada, 4.1, a Microsoft pas-


sou a propor um novo fluxo para o desenvolvimento: come-
ar com o cdigo (modelo POCO) e a partir da gerar a base
de dados. Esta abordagem adequa-se bem metodologia de
desenvolvimento conhecida por Domain-Driven Design
(DDD), a qual advoga em primeiro lugar a representao por
meio de classes de todos os conceitos do domnio de neg-
cio, sendo a persistncia um aspecto que, embora claramen-
te importante, deve ser o mais transparente possvel, no
devendo limitar as opes de desenho do modelo de dom-
nio. Passaram a existir convenes para definir grande parte
da traduo de e para o modelo relacional, sendo desneces-
srio configurar todos os detalhes explicitamente. O novo Figura 1 - Evoluo da Entity Framework
API DbContext, grandemente simplificador relativamente ao TBD
ObjectContext, revelou-se extremamente popular, apesar

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):

Tabela 1 - Pacotes Nuget optionsBuilder.UseInMemoryDatabase();

NoSQL Cdigo 3 Configurao do fornecedor In-Memory


O mundo em 2015 e 2016, no que respeita s Tecno- Para que possamos usar um fornecedor, ser necess-
logias de Informao, diferente do que era em 2009. Por rio instalar o seu pacote Nuget. Os pacotes includos na ver-
um lado, o movimento No SQL ou Not-Only SQL (NoSQL), so 1 da Entity Framework Core so:
ganhou grande preponderncia passou a ser normal, numa
empresa, a utilizao de vrios tipos de tecnologias para Nome Descrio
armazenamento de dados, mesmo concorrentemente, para Micro- Fornecedor de acesso para SQL
soft.EntityFrameworkCore.SqlServe Server
responder a diferentes necessidades. Se a Entity Framework r
no incio correspondia ao que as pessoas esperavam, pode Micro- Fornecedor de acesso para SQLite
soft.EntityFrameworkCore.SQLite
argumentar-se que j no assim. Revelando ateno s
Micro- Fornecedor de acesso in-memory
novas tendncias, a Microsoft tornou a nova verso da Entity soft.EntityFrameworkCore.InMemor (para testes)
y
Framework agnstica em relao s fontes de dados de uma
Npgsql.EntityFrameworkCore.Postg Fornecedor de acesso para Pos-
forma indita: passou a suportar no apenas bases de dados reSQL tgreSQL
relacionais mas potencialmente qualquer fonte de dados, EntityFrameworkCo- Fornecedores de acesso para SQL
re.SqlServerCompact35 Server Compact 3.5 e 4.0
incluindo NoSQL, atravs de um mecanismo de providers. EntityFrameworkCo-
Foram anunciadas duas provas de conceito, na forma de re.SqlServerCompact40
*.Design Fornecedores para gerao de entida-
providers para Azure Table Storage e para o muito popular des a partir de uma base de dados
servio de cache distribuda Redis, mas este anncio fica, relacional (p.ex., Micro-
soft.EntityFrameworkCore.SqlServer
para j, pela inteno, j que a verso inicial, Core 1.0, no .Design)
ir incluir esta funcionalidade. A ideia promissora usar a
mesma API para efectuar consultas a potencialmente qual-
Tabela 2 - Fornecedores de acesso
quer fonte de dados mas teremos de esperar para ver.
Para cada um destes existe um mtodo de extenso
Mltiplas Plataformas
especfico para a classe DbContextOptionsBuilder, o qual
Sendo construda de raiz com suporte ao .NET Core, aceita diferentes parmetros, tais como a connection string a

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();

public interface IShadowAuditable { } Cdigo 12 Queries sobre propriedades sombra


protected override void OnModelCreating Anexar Entidades em Cascata
(ModelBuilder modelBuilder)
{ Sempre foi possvel anexar entidades a um contexto
foreach (var e in modelBuilder.
Model.GetEntityTypes().Where(e => typeof Entity Framework diferente daquele que as carregou. Por
(IShadowAuditable).GetTypeInfo().IsAssignableFrom exemplo, entidades devolvidas por um web service (saber se
(e.ClrType.GetTypeInfo())) um web service deve ou no devolver entidades uma ques-
{
modelBuilder to que no ser discutida aqui) podem ser posteriormente
.Entity(e.ClrType) anexadas a um contexto a residir num servidor diferente e
.Property<string>("CreatedBy") serem tratadas como originarias desse contexto. A novidade
.IsRequired();
modelBuilder introduzida na nova verso consiste em poder definir, para
.Entity(e.ClrType) cada entidade relacionada com a entidade a anexar, qual o
.Property<DateTime>("CreatedOn")
.IsRequired(); seu estado, do ponto de vista do novo contexto. Vejamos o
modelBuilder que acontecia se anexssemos uma entidade com uma co-
.Entity(e.ClrType) leco de outras entidades associadas:
.Property<string>("UpdatedBy")
.IsRequired(); BlogContext ctx = /* */;
modelBuilder Blog blog = /* */;
.Entity(e.ClrType) ctx.Entry(blog).State = EntityState.Unchanged;
.Property<DateTime>("UpdatedOn")
.IsRequired(); Cdigo 13 Alterao do estado de uma entidade e todos os
}
seus descendentes
base.OnModelCreating(modelBuilder);
} Todos os elementos Post da coleco Posts da ins-
tncia da classe Blog seriam, assim, marcados como no
Cdigo 10 Configurao de propriedades sombra modificados. Imaginemos agora que possuamos um grafo
J a utilizao seria: muito complexo onde, para cada entidade nele presente
pretendamos especificar o seu estado. Para esse cenrio,
public override int SaveChanges(bool acceptAllChan- foi criado o API TrackGraph:
gesOnSuccess)
{ BlogContext ctx = /* */;
foreach (var e in this.ChangeTracker.Entries() Blog blog = /* */;
.Where(e => typeof(IShadowAuditable).GetTypeInfo() ctx.ChangeTracker.TrackGraph(blog, (node) =>
.IsAssignableFrom(e.Entity.GetType().GetTypeInfo {
()))) if (node.Entry.Entity is Post)
{

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);
}

Cdigo 14 Utilizao do TrackGraph Cdigo 16 Configurao do fornecedor de log


Ou seja, o TrackGraph sabe como percorrer todas as Funcionalidades Ainda No Suportadas
relaes a partir de uma entidade raiz e permite que adicio-
Nem tudo, no entanto, positivo. Para no atrasar
nemos a nossa lgica para definio dos estados encontra-
ainda mais a data de lanamento (j bastante atrasada), a
dos.
verso 1.0 no inclui um nmero de funcionalidades que se
Gerao de Entidades a Partir da Base de Dados encontravam nas verses anteriores:
A Entity Framework possibilita a gerao de entida- Estratgias de mapeamento de heranas: apenas
des a partir da base de dados (claro est, apenas para ba- Table Per Type Hierarchy / Single Table Inheritan-
ses de dados relacionais), sem necessidade do Visual Stu- ce suportada, no Table Per Type / Class Table
dio. Para tal, necessrio ter presente o fornecedor de aces- Inheritance nem Table Per Concrete Type / Con-
so pretendido (p.ex., Micro- crete Table Inheritance;
soft.EntityFrameworkCore.SqlServer) e tambm a sua
verso design, a qual contm a funcionalidade para gera- Carregamento implcito (lazy loading) e explcito
o de entidades (explicit loading) no so suportados; necessrio
(Microsoft.EntityFrameworkCore.SqlServer.Design). A indicar, aquando da execuo de uma query LINQ as
sua utilizao simples: entidades a trazer, por meio de chamadas a Include;
dotnet ef dbcontext scaffold "Data Relaes muitos-para-muitos: podem ser emulados
Source=.\SQLEXPRESS; Initial Catalog=Blog;
Integrated Security=SSPI" recorrendo a duas relaes um-para-muitos;
"Microsoft.EntityFrameworkCore.SqlServer"
Tipos complexos (complex types) tambm no exis-
tem na nova verso;
Cdigo 15 Gerao de entidades a partir da base de dados
Mapeamento de inseres, alteraes e apagamen-
Claro est, este exemplo assume um servidor de ba-
tos por procedimentos armazenados (stored procedu-
se de dados SQL Server Express local com o nome SQLEX-
res);
PRESS, uma base de dados chamada Blog e autenticao
integrada do Windows. O leitor dever alterar estes dados de Agrupamentos (GROUP BY) na base de dados, ao
acordo com o seu cenrio concreto. invs de em memria;
Outras Funcionalidades A capacidade de associar entidades a vistas;
Importa tambm referir que a nova Entity Framework Estratgias para tentar re-executar comandos aquan-
possibilita tambm, na senda das verses anteriores, uma
do de perda de ligao tambm no existiro;
elevada extensibilidade: grande parte dos seus componentes

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

Evangelista Tecnolgico na Simplifydigital. Microsoft MVP.

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.

A famosa linguagem C. Voltando ao exemplo do GPS, se os vrtices do grfi-


co representarem cidades e os custos de caminho represen-
E nesta edio comemorativa dos 10 anos da nossa tarem distncias entre as cidades ligadas por uma estrada
revista, achamos que faria todo o sentido recordar um algo- directa, o algoritmo de Dijkstra pode ser usado para encon-
ritmo, que em algum dia das nossas vidas, todos ns, pro- trar o caminho mais curto entre uma cidade e todas as outras
gramadores ouvimos falar o no menos famoso que a cidades.
prpria linguagem C, o algoritmo de Dijkstra e porque este
algoritmo? Porqu este refere, o caminho do custo mnimo. E
todos ns sabemos que a nossa revista j percorreu muitos
caminhos at chegamos edio 53.

Ora para os mais distrados, e para os menos recor-


dados, este algoritmo data do ano de 1956, tendo tido a sua
primeira publicao em 1959. Foi criado por um matemtico
computacional holands, Edsger Dijkstra. E trouxe uma solu-
o que vrios procuravam na altura, a soluo para o pro-
blema do caminho mais curto num grafo dirigido.

Este algoritmo muito til para minimizar custos em


vrias reas como por exemplo, na implementao de redes
(por exemplos redes OSPF), ou no conhecido sistema GPS.

Ilustrao 2 - Exemplo 2 Algoritmo Dijkstra

A nvel de algoritmo temos o seguinte:

Seja G(V,A) um grafo orientado e s um vrtice de G:

1. Atribuir valor zero estimativa do custo mnimo do vrti-


ce s (a raiz da busca) e infinito s restantes estimativas;

2. Atribuir um valor qualquer aos precedentes (o preceden-


te de um vrtice t o vrtice que precede t no caminho de
custo mnimo de s para t);

3. Enquanto houver vrtice aberto:

seja k um vrtice ainda aberto cuja estimativa


Ilustrao 1 Exemplo 1 Algoritmo Dijkstra
seja a menor dentre todos os vrtices abertos;
Em termos tericos, o algoritmo simples
feche o vrtice k
Ora vejamos

Num dado vrtice (n) no grafo, o algoritmo localiza o


Para todo vrtice j ainda aberto que seja suces-
caminho com a menor custo (isto , o caminho mais curto) sor de k faa:
entre esse vrtice e todos os outros vrtices, recorrendo ao
peso/custo da aresta. Este sistema, pode tambm ser usado
some a estimativa do vrtice k com o cus-
para encontrar custos de caminhos mais curtos a partir de to do arco que une k a j;
um nico vrtice para um vrtice de destino parando o algo-

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.

Assim que percebemos o algoritmo, a implementao


fica a cargo da imaginao de cada um.

Aqui na PROGRAMAR desejamos que todos os nos-


sos leitores encontrem o vosso melhor caminho sempre!

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

As funes de distribuio de probabilidade (PDF) so


Mtodo
usadas para descrever a disperso de dados experimentais
Desenvolvimento e descrio do programa:
em torno de uma mdia. As distribuies de probabilidade so
geralmente representadas em termos de integrais como uma O programa foi escrito usando a linguagem de
funo de densidade de probabilidade e podem ser interpreta- programao Python. O Python foi lanado em 1991 pelo
das como um histograma construdo com intervalos infinitesi- programador Guido Van Rossum e uma linguagem de alto
mais. A PDF mais comum a distribuio Gaussiana ou nor- nvel 7. Uma caracterstica em destaque desta linguagem a
mal, geralmente utilizada para o clculo dos limites de confian- priorizao da legibilidade do cdigo, tornando-a mais
a de dados experimentais1. concisa e clara. O corpo do programa foi construdo usando
A construo de PDFs deve satisfazer as seguintes um ambiente de desenvolvimento integrado denominado
condies: PYTHON-IDLE, o qual permitiu a rpida importao de
mdulos, alm do fcil uso de algumas funes bsicas. O
1 - PDFs so sempre positivas; programa foi dividido em vrios trechos, procurando facilitar
2 - A rea delimitada pela PDF f(x) sempre igual a 1.0 2; a sua compreenso.

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

print "Programa para calculo de PDF's"


print "e para silulacao de valores mais pro-
vaveis"
print "Fernando Gomes - UFRJ"
print "V0.4 - 19/05/16"

#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

FUNES DE DISTRIBUIO DE PROBABILIDADE E O PYTHON


string, necessrios para o funcionamento do programa, foram print "-'C' or 'Cosine' : Cosine kernel"
invocados conforme descrito abaixo: print
k = raw_input("Escolha o kernel (E, U, T, G, B, 3
#Importacao dos modulos ou C)")
import string print
#from rpy import * if k == "":
from statistics import pdf k = 'G'
from numpy import * print "Vc escolheu a opcao padrao (G)"
from statistics import mean
from statistics import variance #as desvpad print
from string import upper print
from pylab import * print
from scipy import integrate print "Voce deve escolher a legenda da abscissa"
from matplotlib.patches import Polygon print "Ex.: Diameter (nm)"
from numpy import log abscissa=raw_input("Qual eh a legenda da
from os import getcwd, listdir abscissa? ")
from random import random as rnd print
print
Escolha do kernel - Os histogramas so muito teis print
print "A legenda da abscissa eh:",abscissa
para o tratamento de dados discretos e remetem print
intuitivamente, a alguma forma de estimativa de densidade. A print
heurstica diz que possvel construir distribuies contnuas, correto=raw_input("A legenda esta correta? (S/N)
")
desde que estejam disponveis mais de 20 experincias 8. while correto=="n" or correto=="N":
Para isso, a escolha de um kernel capaz de descrever as abscissa=raw_input("Qual eh a legenda
nuances amostrais da amostra fundamental. Existem vrias correta?")
print
opes disponveis para o clculo de estimativas de densidade print abscissa
usando o Python. Cada uma delas depende de quais so os correto=raw_input("A legenda esta correta?
(S/N) ")
objetivos particulares da anlise 9. Vrios tipos de funes do print
kernel so disponveis. Os mais comuns, como o
Epanechnikov, Uniform, Triangle, Gaussian, Quartic/biweight ,
Alm disso, o utilizador pode optar por gerar diferen-
Triweight e Cosine esto disponveis no programa.
tes quantidades de valores simulados mais provveis. A op-
print o padro de 5 nmeros:
print
print "Escolha o kernel:" print
print print "Simulao dos valores mais provaveis"
print "-'E' or 'Epanechnikov' : Epanechnikov kernel print "Padrao = 5"
(padrao)" print
print "-'U' or 'Uniform' : Uniform kernel" qp = raw_input("Quantos pontos? ")
print "-'T' or 'Triangle' : Triangle kernel" print
print "-'G' or 'Gaussian' : Gaussian kernel" if qp=="":
print "-'B' or 'Biweight' : Quartic/biweight qp=5
kernel" else:
print "-'3' or 'Triweight' : Triweight kernel" qp=int(qp)
print "-'C' or 'Cosine' : Cosine kernel"
print gravar_log=open('log.dat','w') #Cria arquivo de
k = raw_input("Escolha o kernel (E, U, T, G, B, 3 log
ou C)") gravar_log.write("kernel= "+k+'\n')
print string_log = 'Arquivo ; LI(95%) ; MAXPROB; LS
if k == "": (95%) ; Media ; DesvPad ; Area'
k = 'G' gravar_log.write(string_log+'\n')
print "Vc escolheu a opcao padrao (G)" gravar_log.close()
Recolha de informaes gerais - Escolhido o kernel, o
utilizador deve inserir a legenda desejada na abscissa do Como observao, destacamos que o nmero de
grfico PDF, conforme descrito abaixo: pontos para a construo da PDF, por padro, igual a 500:

npdf = 500 #Numero de pontos para a contrucao da


print PDF
print
print "Escolha o kernel:" Criao do arquivo de log - Um arquivo de log
print criado para armazenar todas as informaes relevantes
print "-'E' or 'Epanechnikov' : Epanechnikov kernel
(padrao)" como, o nome da amostra (Arquivo), o limite de confiana
print "-'U' or 'Uniform' : Uniform kernel" inferior com 95% de probabilidade (LI95%), a probabilidade
print "-'T' or 'Triangle' : Triangle kernel" mxima (MAXPROB), o limite de confiana superior com
print "-'G' or 'Gaussian' : Gaussian kernel"
print "-'B' or 'Biweight' : Quartic/biweight 95% de probabilidade (LS95%), o valor mdio (Media), o
kernel" desvio padro (DesvPad) e a rea sob a curva PDF (Area).
print "-'3' or 'Triweight' : Triweight kernel"

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

FUNES DE DISTRIBUIO DE PROBABILIDADE E O PYTHON


if float(PAC[i])>prob: gravar_log.close
dadosimulado=float(xs[i-1])+(float print"Processo concludo!"
(xs[i])-float(xs[i-1]))*(prob-PAC[i #show()
-1])/(PAC[i]-PAC[i-1])
if dadosimulado>0: Resultados:
gravar_freq.write(str
(dadosimulado)+'\n') Foram selecionados 20 valores entre 11 e 19,
nps=nps+1 mostrados na Tabela 1, capazes de produzir uma
if nps>=qp:
distribuio bimodal.

Tabela 1 Vinte valores entre 11 e 19 selecionados para o


Ento, os principais resultados so salvos teste

string_LInf = "Limite inferior = " + str(x_t


[ponto025]) Contagem Valor
print string_LInf
gravar.write(string_LInf+'\n') 1 11
string_LSup = "Limite superior = " + str(x_t 2 12
[ponto975]) 3 13
gravar.write(string_LSup+'\n')
print string_LSup 4 14
string_Resist = "Propriedade (95%LC) = (-" + 5 13
str(float(centro_x)-float(x_t[ponto025])) + ";" 6 12
+ str(float(centro_x)) + "; +" + str(float(x_t 7 11
[ponto975])-float(centro_x)) +") "
gravar.write(string_Resist+'\n') 8 13
print string_Resist 9 18
string_Area = "rea integrada: "+str(integral) 10 19
gravar.write(string_Area+'\n')
print string_Area 11 17
string_log = nomearquivodados+';'+str(x_t 12 18
[ponto025])+';'+str(float(centro_x))+';'+str 13 17
(x_t[ponto975])+';'+ str(dados_med) +';'+ str
(dados_desvpad)+';'+str(integral) 14 16
gravar_log.write(string_log+'\n') 15 11
print somatorio_Prob 16 12
17 13
e, por ltimo, o grfico contendo o PDF gerado:
18 11
19 12
################Gera grfico
ax = subplot(111) 20 13
quem = str(nomearquivodados)
plot(x,y)
grid() Os valores mostrados na Tabela 1 fora usados para
dados_cientifico= "%.5g" %(dados_med) construir um histograma, com o auxlio do software QtiPlot,
titulo = "Sample: "+upper(quem) +"; Average mostrado na Figura 2.
value. = "+ dados_cientifico

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]

# Gera regio sombreada


ix = x_int[ponto025:ponto975]
iy = y_int[ponto025:ponto975]
verts = [(a,0)] + zip(ix,iy) + [(b,0)]
poly = Polygon(verts, facecolor='0.8',
edgecolor='k')
ax.add_patch(poly)
a=float('%.2f'%a)
centro_x=float('%.2f'%centro_x)
b=float('%.2f'%b)
ax.set_xticks((a,centro_x,b))
nome_graf2 = nomefig+"-P95"
savefig(nome_graf2)
close('all')
Figura 2 Histograma gerado a partir dos dados da Tabela
gravar.close 1.
gravar_pdf.close

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

(ii) Arquivo *.frq, onde esto listados os cinco valores mais


provveis tomados para os valores aleatrio da varivel prob
quando esta mais se aproxima de 1.

Arquivo teste.frq

9.40974719

9.74840852

9.27565556

12.9108177

19.9949159

e por ltimo, (iii) o arquivo *.rep, onde so listadas a


ordenada e a abscissa referente mxima probabilidade,
bem como os limites de confiana, com 95% de
probabilidade;

Arquivo teste.rep

MaxProb = 0.152862861298 @ 12.2418703658

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)

Comprovada a influncia da escolha do kernel


sobre os resultados, os clculos seguintes foram feitos Assim, as principais informaes estatsticas
referentes construo das PDFs so armazenadas numa
usando o kernel Gaussiano. Os arquivos gerados pelo
nica pasta, de maneira muito prtica e rpida.
programa PDF&Freq so mostrados na Figura 4.
Concluses

O maior impacto deste trabalho consiste na


construo de uma ferramenta computacional que permite a
rpida construo de distribuies de probabilidade a partir
de diferentes kernels. Isso s foi possvel com o uso da
linguagem de programao Python, a qual permitiu
desenvolver um rapidamente um programa capaz de lidar
com diversos arquivos de dados, produzindo informaes
estatsticas valiosas na forma de tabelas e grficos, os quais
so fundamentais para o nosso grupo de pesquisa e para os
demais grupos lidem com esse tipo de informao ou
problema.

Figura 4 Arquivos gerados pelo programa PDF&Freq.

Entre estes arquivos, os que contm as principais


respostas geradas pelo programa so trs:

(i) Arquivo log.dat, onde so listados o kernel escolhido e as


demais informaes previamente descritas.

log.dat

kernel= g

20
A PROGRAMAR

FUNES DE DISTRIBUIO DE PROBABILIDADE E O PYTHON


Agradecimentos Press, 1974).

4. Grance, E. G. O. et al. New petroleum absorbers


Os autores agradecem ao Conselho Nacional de
based on lignin CNSL formol magnetic nanocomposites. J.
Desenvolvimento Cientfico e Tecnolgico (CNPq),
Appl. Polym. Sci. (2012). doi:10.1002/app.36998
Coordenao de Aperfeioamento de Pessoal de Nvel
Superior (CAPES), Financiadora de Estudos e Projetos 5. Arajo, A., Botelho, G., Oliveira, M. & Machado, A. V.
Influence of clay organic modifier on the thermal-stability of
(FINEP PRESAL Ref.1889/10) e Fundao Carlos
PLA based nanocomposites. Appl. Clay Sci. 8889, 144150
Chagas Filho de Amparo Pesquisa do Estado do Rio
(2014).
de Janeiro (FAPERJ) por toda a ajuda financeira e pelas
bolsas concedidas. 6. de Souza Junior, F. G. et al. Conducting and magnetic
mango fibers. Ind. Crops Prod. 68, 97104 (2015).
Bibliografia
7. Souza Jr., F. G. & Varela, A. Construo de
ferramenta de aquisio e inspeo de dados
1. Souza Jr., F. G., Pinto, J. C. & Soares, B. G. SBS/Pani eletromecnicos usando Python. Programar - Rev. Port.
DBSA mixture plasticized with DOP and NCLS Effect of the Programao 34, 3238 (2012).
plasticizers on the probability density of volume resistivity
measurements. Eur. Polym. J. 43, 20072016 (2007). 8. SCHWAAB, M. Anlise de Dados Experimentais: I.
Fundamentos de Estatstica e Estimao de Parmetros.
2. Luce, B. & Anthony, O. A Primer on Bayesian Statistics (Editora E-papers).
in Health Economics and Outcomes Research. (MEDTAP Inter-
national, Incorporated, 2003). 9. Kernel Density Estimation in Python. Available at:
http://jakevdp.github.io/blog/2013/12/01/kernel-density-
3. Bard, Y. Nonlinear Parameter Estimation. (Academic estimation/. (Accessed: 19th May 2016)

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.

Apache: Servidor web; HTML

OBJETIVO O HTML (HyperText Markup Language) uma lingua-


gem de marcao utilizada na construo de pginas web.
\No fim deste artigo o leitor ter uma viso abrangente do que
Quando o PHP interpretado no servidor produz o HTML
essencial para criar aplicaes web e a ajuda necessria
que ser lido pelo Browser (Os browsers no conhecem o
para comear a desbravar este mundo com o PHP.
PHP).
FUNCIONALIDADES
O HTML ser, ento, utilizado para criar a estrutura
O nosso sistema de chat ter as seguintes funcionalida- das nossas pginas.
des:
CSS
Sala de chat nica e pblica; O CSS (Cascading Style Sheets) uma linguagem de
folhas de estilo utilizada para definir a apresentao de pgi-
Escolha de um nickname exclusivo; nas web.

Envio de mensagens; No nosso sistema de chat, todas as cores, tamanhos,


tipos de letra, etc. sero definidos no CSS.
Consulta de mensagens;
jQuery / JavaScript
CAIXA DE FERRAMENTAS
O jQuery uma framework de JavaScript, de cdigo
Para implementar este chat vamos utilizar vrias ferra- aberto, desenvolvida para facilitar a programao no lado do
mentas que se complementam umas s outras. Algumas des- cliente (Browser) e utilizado por cerca de 77% dos sites
tas ferramentas foram instaladas com o XAMPP, permitindo, mais visitados do mundo. O seu slogan revelador: "Write
assim, instalar facilmente um servidor web na nossa mquina Less, Do More" (por exemplo, 20 linhas de cdigo em JavaS-
local. cript podem ser substitudas por uma em jQuery).
PHP O jQuery ser usado no nosso chat para facilitar o
uso de outra "tecnologia" denominada de AJAX
PHP, acrnimo recursivo para "PHP: Hypertext Prepro-
(Asynchronous Javascript and XML) que, na verdade, um
cessor" (originalmente Personal Home Page) uma linguagem
conjunto de tecnologias que torna as pginas mais interati-
de programao server-side de utilizao livre e de cdigo
vas.
aberto. O PHP , por exemplo, utilizado pelo Facebook e
WordPress. Em 2014 foi a linguagem de eleio de 82% dos Apache
sites (onde a linguagem de programao conhecida).
O Apache o servidor web livre melhor sucedido.
No sistema de chat, que vamos construir, o PHP tem Estima-se que foi utilizado por metade do sites em 2015.
como funo a comunicao com a base de dados para arma-
atravs do Apache que o nosso computador conse-
zenamento e consulta das mensagens.

22
A PROGRAMAR

SISTEMA DE CHAT PBLICO EM PHP


guir interpretar o PHP. Criar banco de dados com o mesmo nome e conce-
Procedimento der todos os privilgios.

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.

Vamos utilizar a extenso PDO (PHP Data Objects)


2. Classe User
para comunicar com a base de dados. Para o efeito ser criada
a classe DbConnPDO, que uma extenso da classe PDO, A classe User representa os utilizadores do chat.
que j se encontra instalada no PHP. Uma vez que esta classe faz ligao base de dados, esten-
de a classe DbConnPDO. O mtodo checkNicknameExists
1. Classe DbConnPDO
() verifica se um determinado nickname existe. O mto-
A classe DbConnPDO representa a ligao base de do insert() insere o nickname na base de dados, nomeada-
dados. Vamos utilizar o PDO atravs da clas- mente, na tabela users.
se DbConnPDO (extenso da classe PDO, que j se encontra
Cria-se agora o ficheiro na pasta chat com o no-
instalada no PHP) para comunicar com a base de dados.
me User.class.php e escreve-se o seguinte cdigo:
A classe DbConnPDO tem como nica funo a ligao
base de dados. Esta ligao efetuada no seu construtor <?php
utilizando as constantes definidas, anteriormente, no /**
* Utilizador do chat
script constants.inc.php. *
* @package Chat\User
Vamos, ento, criar um ficheiro na pasta chat com o * @author Sandro Miguel Marques
nome DbConnPDO.class.php e escrever o seguinte cdigo: <sandromiguel@produlogia.com>
* @version v.1.0 (06/04/2016)
* @copyright Copyright (c) 2016, Sandro
<?php */
/**
* PDO Database connection class User extends DbConnPDO {
* Representa a ligao global base de dados /** @var string|null Query SQL */
* private $_sql;
* @package Chat\PDO
* @author Sandro Miguel Marques /**
<sandromiguel@produlogia.com> * Construtor
* @version v.1.0 (13/01/2016) */
*/ public function __construct() {
parent::__construct();
class DbConnPDO extends PDO { }
/** @var string|null Mensagem de erro */
private $_error = null; /**
* Verifica se um determinado nickname existe.
/** *
* Construtor * @param string $nickname Nickname do utilizador
* Abrir a ligao base de dados *
*/ * @return boolean Devolve 'true' se o nickname
public function __construct() { j existir.
$connection_string = sprintf('mysql:host=%s; */
dbname=%s;charset=UTF8', DB_HOSTNAME, DB_NAME); public function checkNicknameExists($nickname) {
try { try {
parent::__construct($connection_string, $this->_sql = '
DB_USERNAME, DB_PASSWORD); SELECT
$this->setAttribute(PDO::ATTR_ERRMODE, NIckname
PDO::ERRMODE_EXCEPTION); FROM
} catch (PDOException $e) { `'. USERS .'`
$this->error = $e->getMessage(); WHERE
throw $e; `Nickname`=:nickname
} LIMIT 1
} ';
/** $stmt = $this->prepare($this->_sql);
* Mostra o erro. $stmt->bindParam(':nickname', $nickname,
* PDO::PARAM_STR);
* @return string Devolve o erro. $stmt->execute();
*/ $num_rows = $stmt->rowCount();

24
A PROGRAMAR

SISTEMA DE CHAT PBLICO EM PHP



if ($num_rows == 0) { /**
return false; * Construtor
} */
return true; public function __construct() {
} catch (Exception $e) { parent::__construct();
throw $e; }
}
} /**
* Verifica se um determinado nickname existe.
/** *
* Insere um utilizador da base de dados. * @param string $nickname Nickname do utilizador
* *
* @param string $nickname Nickname * @return boolean Devolve 'true' se o nickname
* j existir.
* @return boolean Devolve 'true' em caso de */
sucesso ou 'false' em caso de erro. public function checkNicknameExists($nickname) {
*/ try {
public function insert($nickname) { $this->_sql = '
$this->_sql = 'INSERT INTO `'.USERS.'` SELECT
(Nickname) VALUES (:nickname) '; NIckname
try { FROM
$stmt = $this->prepare($this->_sql); `'. USERS .'`
$stmt->bindParam(':nickname', $nickname, WHERE
PDO::PARAM_STR); `Nickname`=:nickname
if ($stmt->execute()) { LIMIT 1
$stmt->closeCursor(); ';
return true; $stmt = $this->prepare($this->_sql);
} $stmt->bindParam(':nickname', $nickname,
$stmt->closeCursor(); PDO::PARAM_STR);
return false; $stmt->execute();
} catch (Exception $e) { $num_rows = $stmt->rowCount();
throw $e; if ($num_rows == 0) {
} return false;
} }
return true;
/** } catch (Exception $e) {
* @return string Devolve a query SQL. throw $e;
*/ }
public function __toString() { }
if (is_null($this->_sql)) {
return 'NULL'; /**
} * Insere um utilizador da base de dados.
return $this->_sql; *
} * @param string $nickname Nickname
} *
* @return boolean Devolve 'true' em caso de
3. Classe Chat sucesso ou 'false' em caso de erro.
*/
A classe Chat representa o chat propriamente dito. Tal public function insert($nickname) {
$this->_sql = 'INSERT INTO `'.USERS.'`
classe estende a classe DbConnPDO pois, tambm, faz liga- (Nickname) VALUES (:nickname) ';
o base de dados. Para inserir as mensagens na tabe- try {
la messages utiliza-se o mtodo insert() e para as ler utiliza-se $stmt = $this->prepare($this->_sql);
$stmt->bindParam(':nickname', $nickname,
o mtodo getMessages(). PDO::PARAM_STR);
if ($stmt->execute()) {
Para esta classe criamos um ficheiro na pasta chat com $stmt->closeCursor();
o nome Chat.class.php, com o seguinte cdigo: return true;
}
<?php $stmt->closeCursor();
/** return false;
* Utilizador do chat } catch (Exception $e) {
* throw $e;
* @package Chat\User }
* @author Sandro Miguel Marques }
<sandromiguel@produlogia.com>
* @version v.1.0 (06/04/2016) /**
* @copyright Copyright (c) 2016, Sandro * @return string Devolve a query SQL.
*/ */
public function __toString() {
class User extends DbConnPDO { if (is_null($this->_sql)) {
/** @var string|null Query SQL */ return 'NULL';
private $_sql; }
return $this->_sql;
}}

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

SISTEMA DE CHAT PBLICO EM PHP


$message = filter_input(INPUT_POST, 'message', Na pgina inicial o utilizador convidado a introduzir
FILTER_SANITIZE_STRING); o seu nickname. A submisso do formulrio feita pelo
# 1. Inserir a mensagen na base de dados jQuery atravs da funo ajax(), nativa do jQuery, que envia
try { o nickname introduzido para o script nickname.ajax.php. Ca-
$chat = new Chat(); so o nickname no esteja a ser utilizado o utilizador redire-
$chat->insert($nickname, $message);
} catch (Exception $e) { cionado para o script chat.php.
echo 'ocorreu um erro ao fazer o INSERT na
BD<br>'; Segue-se o cdigo do ficheiro index.php:
echo $e->getMessage().'<br>';
echo $chat->__toString();
} <?php
session_start();
3. Ler as mensagens
error_reporting(E_ALL);
Para ler as mensagens do chat executado o ini_set('display_errors','On');
?>
script get_messages.ajax.php que devolve as mensagens no <!doctype html>
formato JSON atravs da funo json_encode() do PHP. No <html lang="pt">
caso deste chat so devolvidas as ltimas 10 mensagens, mas <head>
<meta charset="utf-8">
este nmero pode ser definido, por exemplo, no script cons- <title>Chat pblico</title>
tants.inc.php bastando adicionar mais uma constante. <meta name="description" content="Chat pbli-
co" />
Aqui est o cdigo para este script: <meta name="author" content="Sandro Marques">
<meta name="viewport" content="width=device-
width, initial-scale=1">
<?php <link href="styles.css" rel="stylesheet" />
error_reporting(E_ALL); <script src="https://ajax.googleapis.com/ajax/
ini_set('display_errors','On'); libs/jquery/1.12.2/jquery.min.js"></script>
</head>
require 'constants.inc.php';
require 'DbConnPDO.class.php'; <body>
require 'Chat.class.php'; <div class="outer">
<div class="middle">
# 1. Ler as mensagens da base de dados <div class="inner">
try { <div id="logo"></div>
$chat = new Chat(); <div id="container_nickname">
$messages = $chat->getMessages(10); <div id="content_insert"></div>
echo json_encode($messages); <div id="content_replace">
} catch (Exception $e) { <form name="form_nickname" id="form_nickname"
$message = 'Ocorreu um erro.'; method="post" action="nickname.ajax.php">
echo json_encode( <p>Nickname</p>
array( <input name="nickname" type="text" autofocus re-
"action" => "insert", quired class="general_textbox" id="nickname"
"notification" => "error", maxlength="32">
"message" => $message <button>Entrar</button>
) </form>
); </div>
exit; </div>
} </div>
</div>
</div>
Passo 4 Interface </body>
A nossa interface ser provida de uma pgina inicial <script>
onde se introduz o nickname e a pgina do chat. 'use strict';
function resetContentInsert() {
if ($('#content_insert').children
().length > 0) {
// existe uma mensagem > remover con-
tedo com animao
$('#content_insert').animate({
height: 0
}, "fast", function () {
$(this).empty();
$('#content_insert').removeAttr
('style');
});
}
}
$(document).ready(function () {
// submeter formulrio pela funo
sendForm()

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">&nbsp;</span>
</script> </div>
<div id="composer">
</html> <form name="form_message" id="form_message"

28
A PROGRAMAR

SISTEMA DE CHAT PBLICO EM PHP


3. Estilos CSS
method="post" action="set_message.ajax.php">
<input name="nickname" type="hidden" id="nickname" Para estilizar as pginas no chat foi utilizado o ficheiro
value="<?php echo $_SESSION['nickname']; ?>">
<input name="message" type="text" autofocus CSS styles.css. Este ficheiro est disponvel para download
required class="textbox_message" id="message"> na ntegra e importa salientar as seguintes partes:
<button id="btn_send">Enviar</button>
</form> CSS Reset
</div>
</div> O CSS Reset uma tcnica que normaliza o CSS
</body>
<script> de forma a manter o visual do site em qualquer browser.
'use strict';
$(document).ready(function () { CSS responsivo
getMessages();
Foram utilizadas as Media Queries para adaptar o
function getMessages() { layout do chat s dimenses dos vrios dispositivos. O se-
$('.long-content').empty(); guinte exemplo ilustra a tcnica utilizada para alterar a largu-
var msg_error = 'Ocorreu um erro...';
var msg_timeout = 'O servidor no est ra do formulrio para a introduo do nickname, consoante
a responder'; a largura do viewport do browser:
var message = '';
$.ajax({
url: 'get_messages.ajax.php', /* Formulrio nickname centrado */
dataType: "json", .outer {
error: function (xhr, status, display: table;
error) { position: absolute;
if (status === "timeout") { height: 100%;
message = msg_timeout; width: 100%;
alert(message); }
} else { .middle {
message = msg_error; display: table-cell;
alert(message + ': ' + vertical-align: middle;
error); }
} .inner {
}, margin-left: auto;
success: function (response) { margin-right: auto;
$.each(response, function width: 90%;
(i, item) { }
$('.long-content').prepend @media (min-width: 768px) {
('<p><b>' + item.FromNickname + '</b>: ' + /* Small devices (tablets, 768px and up) */
item.Message + '</p>'); .inner {
}); width: 40%;
setTimeout(getMessages, 2000); }
}, }
timeout: 7000 @media (min-width: 992px) {
}); /* Medium devices (desktops, 992px and up) */
} .inner {
width: 35%;
}
// submeter formulrio pela funo sendForm() }
$('#form_message').on('submit', function (e) @media (min-width: 1200px) {
{ /* Large devices (large desktops, 1200px and up)
e.preventDefault(); */
sendForm();
}); .inner {

function sendForm() { width: 30%;


var msg_error = 'Ocorreu um erro..'; }
var msg_timeout = 'O servidor no est
a responder'; }
var message = '';
var form = $('#form_message');
$.ajax({ O que ficou por fazer?
data: form.serialize(),
url: form.attr('action'), Todos os sistemas tm sempre algo a melhorar e
type: form.attr('method') este no exceo. Ento, o que ficou por fazer?
})
$('#message').val(''); No que diz respeito segurana, a aplicao est
}
protegida contra SQL injection mas no foram tidos em conta
}); outros potenciais problemas tais como XSS, CSRF, etc.
</script> A nvel de performance este chat poder ser melhora-
do de forma a que o servidor notifique cada cliente (push)
</html>

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.

MacIntyre, P. B. (2010). PHP: The Good Parts. Sebastopol:


OReilly Media, Inc.

MacIntyre, P., Danchilla, B., & Gogala, M. (2011). Pro PHP


Programming. New York: Apress.

Powers, D. (2014). PHP Solutions: Dynamic Web Design


Made Easy (3rd ed.). New York: Apress.

Powers, S. (2015). JavaScript Cookbook (2nd ed.). Sebasto-


pol: OReilly Media, Inc.

Prettyman, S. (2016). Learn PHP 7: Object-Oriented Modular


Programming using HTML5, CSS3, JavaScript, XML, JSON,
and MySQL. Georgia: Apress.

Tatroe, K., MacIntyre, P., & Lerdorf, R. (2013). Programming


PHP (3 ed.). Sebastopol: OReilly Media, Inc.

Ullman, L. (2012). PHP and MySQL for Dynamic Web Si-


tes (4th ed.). Berkeley: Peachpit Press.

Concluso

Neste artigo apresentou-se o desenvolvimento de um


pequeno sistema de chat. Tratou-se de um sistema simples,
mas que abordou tcnicas avanadas, tais como POO, AJAX e
JSON.

Cdigo fonte da aplicao: https://github.com/SandroMiguel/


public-chat

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

Muitos programadores chegaram ao mundo da progra- Anatomia de um Jogo


mao atravs do fascnio do desenvolvimento de Jogos. Des-
Para criar um jogo necessrio que vrios compo-
de as cassetes de ZX Spectrum que demoravam eternidades a
nentes trabalhem em conjunto. A classe Game1 contm toda
carregar e a criao de jogos era uma tarefa muitas vezes her-
a lgica do jogo e constituda por cinco mtodos principais:
clea at aos dias de hoje, a criao de jogos percorreu um
longo caminho e hoje podemos encontrar vrias plataformas Constructor
dedicadas ao seu desenvolvimento.
Initialize
Para facilitar a criao de jogos para mltiplas platafor-
mas foi criada a framework MonoGame, baseada na framework LoadContent
XNA da Microsoft, que apresenta uma grande facilidade de
Update
aprendizagem. Seguindo o princpio Escreve uma vez, corre
em todo o lado, ao desenvolvermos um jogo com Monogame, Draw
ele ir correr em OS, Android, Mac OS X, tvOS, Windows,
Linux, Playstation4 e mais. Cada um deles tem o objectivo de garantir que o jogo
funciona devidamente, desde os efeitos sonoros resposta
Neste artigo vamos criar um jogo do princpio ao fim, ao input do utilizador e execuo da lgica do jogo.
passo a passo, desde a criao do interface de utilizador at
ao adicionar da lgica de jogo. Os mtodos Constructor e Initialize so utilizados
para desempenhar qualquer inicializao que o jogo necessi-
semelhana do Jogo da Toupeira (Whack-a-Mole), o te antes de comear a correr. O LoadContent tem a funo
objectivo do jogo tocar nos bonecos medida que vo apare- de carregar qualquer contedo do jogo tal como texturas,
cendo, evitando que fujam com as revistas. Se um boneco ficar sons, sombras, e outros componentes grficos ou sonoros.
sem ser tocado por mais de cinco segundos, ele leva as revis- O Update utilizado para actualizar qualquer lgica de jogo
tas e o jogo acaba. enquanto o jogo executado ( recolher o input do utilizador
Ficheiro -> Novo Jogo ou actualizar o mundo), enquanto que o Draw deve ser utili-
zado exclusivamente para desenhar quaisquer grficos que
Antes de dar incio ao desenvolvimento do jogo, deve- precisem ser exibidos.
mos verificar se temos o Xamarin instalado bem como a ltima
build de desenvolvimento do MonoGame. Os passos que va- Adicionar Items de Jogo
mos utilizar aplicam-se tanto a Xamarin Studio como a Mono- Para um jogo estar completo, necessita de texturas e
Game no Visual Studio. efeitos sonoros. Estes so conhecidos no desenvolvimento
Vamos primeiro cirar um projecto partilhado onde ire- de jogos como contente ou assets. A maior parte das fra-
mos guardar toda a lgica de jogo, podendo este ser tambm meworks de jogos possui uma pipeline de contedo, a qual
partilhado com todas as plataformas alvo em que queremos utilizada apenas para pegar em items que esto em bruto e
correr o jogo. Dentro do Xamarin Studio, escolhemos File-> transform-los num formato optimizado para o jogo. Na pasta
New Solution -> MonoGame -> Library-> MonoGame Shared Content, o ficheiro Content.mgcb a pipeline de contedo do
Library, e damos nome ao projecto PapTap. No nos podemos MonoGame. Tudo o que for adicionado a este ficheiro ser
esquecer de adicionar projectos para todas as plataformas que optimizado e includo no pacote final da aplicao.
queremos para o jogo. Mais uma vez, todos os items do jogo podem ser par-
Adicionamos um projecto MonoGame for Android Appli- tilhados entre as plataformas alvo. Assim, arrastamos o Con-
cation e damos-lhe o nome PapTap.Android. Uma vez que o tent Directory do projecto Android para o Projeto Partilhado.
nosso jogo no ir tirar partido das configuraes nativas do Devemos certificar-nos que a Build Action do ficheiro Con-
Android, como o NFC e outros componentes, podemos apagar tent.mcgb est definida para MonoGameContentReference.
a classe Game1 criada no projecto Android e adicionar uma Se a Build Action no aparecer nas opes clicamos com o
referncia ao projecto partilhado que criamos antes. botao direito do rato no ficheiro Content.mcgb, selecionamos
Propriedades e inserimos manualmente o texto toMonoGa-
Para correr a aplicao no emulador seleccionado ou no meContentReference. Em seguinda descarregamso os itmes
Xamarin Android Player, pressionamos F5 ou Cmd+Enter. De- PapTap e fazemos a extrao para a pasta Content do Pro-
ver surgir um lindo ecr azul. jeto Partilhado.
Agora que configurmos a nossa soluo devidamente, No MonoGame encontramos um Editor de Pipeline
vamos comear a escrever o nosso jogo. especial que facilita imenso o trabalho com os items do jogo.

32
A PROGRAMAR

O MEU PRIMEIRO JOGO EM MONOGAME


Fazemos duplo clique no ficheiro Content.mcgb para abrir o atualizamos o mtodo Draw para desenhar a textura do bo-
editor de Pipeline e adicionamos os ficherios de items que aca- neco no ecr, utilizando o campo SpriteBatch que acabmos
bmos de descarregar. de criar:

protected override void Draw(GameTime gameTime)


{
graphics.GraphicsDevice.Clear
(Color.CornflowerBlue);

spriteBatch.Begin();
spriteBatch.Draw(monkey, Vector2.Zero);
spriteBatch.End();

base.Draw(gameTime);
}

Para correr a aplicao carregamos Ctrl+Enter ou na


tecla F5. Deveremos ver o boneco com a revista e ouvir a
msica que definimos no LoadContent. Agora que j temos
os items de jogo a carregar, vamos construir o restante do
Agora que o contedo do jogo est optimizado para uso interface do utilizador para jogar PapTap.
na nossa aplicao, podemos usar os items no nosso jogo.
Construinndo o Interface do Utilizador do PapTap
Criando o Interface de Utilizador do PapTap
Habitualmente nos jogos tradicionais do estilo Whack-a-Mole
Para carregar os itmes de jogo recorremos a um Con- aparecem toupeiras aleatoriamente no ecr e devem ser
tentManager que exposto por default atravs da propriedade clicadas para que desapaream. Em vez de fazermos o ren-
Content da classe Game. Para comear vamos importar al- dering aleatrio de bonecos no ecr, podemos utilizar uma
guns namespaces necessrios e declarar campos para arma- grelha para ajudar e garantir que os bonecos no se sobre-
zenar os items de jogo: pem de forma a que a experincia do utilizador seja consis-
tente. A grelha constituda por vrias clulas. Cada clula
using System.Collections.Generic; contm um rectngulo, cor, temporizador decrescente, e
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Input.Touch; valor de transio que ser utilizado para fazer o fade in do
using Microsoft.Xna.Framework.Media; boneco. Vamos ento copiar e colar para o ficheiro Ga-
public class Game1 : Game me1.cs a seguinte classe GridCell:
{

GraphicsDeviceManager graphics; public class GridCell


SpriteBatch spriteBatch; {
Texture2D monkey; public Rectangle DisplayRectangle;
Texture2D background; public Color Color;
Texture2D logo; public TimeSpan CountDown;
SpriteFont font; public float Transition;
SoundEffect hit;
Song title; public GridCell()
} {
Reset();
De seguida necessrio carregar os items. Para isso }
adicionamos o seguinte cdigo ao mtodo LoadContent, pois public bool Update(GameTime gameTime)
onde todos os items devem ser carregados em MonoGame: {
if (Color == Color.White)
monkey = Content.Load ("monkey"); {
background = Content.Load ("background"); Transition += (float)
logo = Content.Load ("logo"); gameTime.ElapsedGameTime.TotalMilliseconds /
font = Content.Load ("font"); 100f;
hit = Content.Load ("hit"); CountDown -=
title = Content.Load ("title"); gameTime.ElapsedGameTime;
MediaPlayer.IsRepeating = true; if (CountDown.TotalMilliseconds <= 0)
MediaPlayer.Play (title); {
return true;
}
Agora que carregmos o nosso contedo, desde as }
texturas ao udio, hora de desenhar a interface do utilizador return false;
no ecr. Para desenhar imagens 2D e texto usamos a classe }
SpriteBatch. Para fazer o rendering de forma eficiente, o dese- public void Reset()
nho compactado junto e as sprites devem ser desenhadas {
entre os mtodos da SpriteBatch, Begin e End. De seguida Color = Color.TransparentBlack;
CountDown = TimeSpan.FromSeconds(5);

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):

List grid = new List();

Para calcular os rectngulos de exibio para cada c-


lula, adicionamos o seguinte cdigo ao mtodo LoadContent:

var viewport = graphics.GraphicsDevice.Viewport;


var padding = (viewport.Width / 100);
var gridWidth =
(viewport.Width - (padding * 5)) / 4;
var gridHeight = gridWidth;

for (int y = padding; y<gridHeight*5;


y+=gridHeight+padding) {
for (int x = padding;
x<viewport.Width-gridWidth;
x+=gridWidth+padding) {
grid.Add (new GridCell()
{
DisplayRectangle = new Rectangle(x, y,
gridWidth, gridHeight)
});
}
}
Se quisermos que o jogo parea bem em todos os fato-
res de forma, devemos ter em conta o tamanho do ecr em vez
dos valores posicionais definidos no cdigo. O GraphicsDevi-
ce.ViewPort proporciona-nos uma forma dinmica de trabalhar
com diferentes factores de forma. No cdigo acima, adicion-
mos 10% da largura do ecr como espaamento entre as clu-
las e calculmos uma largura e altura para a grelha utilizando a
mesma propriedade. Podemos fazer loop atravs das coorde-
nadas (X,Y) para cada linha e coluna e calcular o rectngulo de Posto isto, o interface de utilizador para o nosso jogo
exibio. construdo com MonoGame est completo.

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 MEU PRIMEIRO JOGO EM MONOGAME


jogo. Primeiro definimos um enumarationGameState no Projeto if (touch.State != TouchLocationSta-
Partilhado PapTap com os seguintes valores: te.Released)
continue;
for (int i = 0; i < grid.Count; i++)
enum GameState {
{ if (grid[i].DisplayRectangle.Contains
Start, (touch.Position) && grid[i].Color == Color.White)
Playing, {
GameOver hit.Play();
} grid[i].Reset();
score += 1;
}
Copiamos e colamos o seguintes campos de class-level }
na classe Game1: }
}
// Define o estado inicial do jogo
GameState currentState = GameState.Start; Verificar se o Jogo acabou
Random rnd = new Random();
No PapTap os bonecos aparecem por cinco segun-
// Texto a ser apresentado ao utilizador dos de cada vez e caso no sejam clicados durante esse
string gameOverText = "Game Over"; tempo o jogo acaba. Para verificar se o jogo realmente termi-
string tapToStartText = "Toque para iniciar";
string scoreText = "Pontuao : {0}"; na, podemos percorrer todos os items na grelha dos bonecos
e chamar o mtodo Update que devolve true no caso de um
TimeSpan gameTimer = TimeSpan.FromMilliseconds(0); boneco estar a ser mostrado por cinco segundos. Nesse
TimeSpan increaseLevelTimer = TimeS-
pan.FromMilliseconds(0); caso significa que o utlizador no clicou no boneco na janela
TimeSpan tapToRestartTimer = TimeSpan.FromSeconds de tempo permitida, por isso devemos alterar o GameStato
(2);
para GameOver e comear o tamToRestartTimer, o que im-
int cellsToChange = 0; pede o jogo de reiniciar imediatamente( e o jogador no ver
int maxCells = 1; a sua pontuao) com um click aleatrio aps o jogo ter ter-
int maxCellsToChange = 14;
int score = 0; minado. Adicionamos assim o mtodo CheckForGameOver
classe Game1:
Estes campos tm como utilidade seguir os vrios esta-
dos em que o jogo pode estar. Ao continuar a jogar o PapTap, void CheckForGameOver(GameTime gameTime)
mais e mais clulas sero alteradas durante um dado nvel, {
for (int i = 0; i < grid.Count; i++)
tornando o jogo mais difcil. Agora que o conjunto de configura- {
es necessrias para seguir o estado do jogo est fora do if (grid[i].Update(gameTime))
caminho, tempo de comear a implementar a nossa lgica de {
currentState = GameState.GameOver;
jogo! tapToRestartTimer = TimeS-
pan.FromSeconds(2);
Processar o Touch do Utilizador break;
}
A maior parte da mecnica de jogo est no tratamento }
do input do utilizador e por isso importante selecionar um }
motor de jogo que consiga tratar todos os tipos de input. No
Monogame podemos encontrar um grande conjunto de contro-
los de input, sendo um deles TouchPanel. Calcular os Bonecos a mostrar por nvel

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:

void IncreaseLevel(GameTime gameTime)


{ protected override void Update(GameTime gameTime)
{
increaseLevelTimer += #if !__IOS__ && !__TVOS__
gameTime.ElapsedGameTime; if (GamePad.GetState
if (increaseLevelTimer.TotalSeconds > 10) (PlayerIndex.One).Buttons.Back == ButtonSta-
{ te.Pressed ||
increaseLevelTimer = Keyboard.GetState().IsKeyDown
TimeSpan.FromMilliseconds(0); (Keys.Escape))
maxCells++; {
} Exit();
} }
#endif

var touchState = TouchPanel.GetState();


Mostrar Bonecos switch (currentState)
{
Finalmente, temos que tornar visveis os bonecos que case GameState.Start:
esto invisveis por defeito. Para evitar que o PapTap seja if (touchState.Count > 0)
{
previsvel, podemos usar a classe Random para seleccionar currentState = GameState.Playing;
um boneco aleatrio na grelha. Se o boneco no est j a apa- }
break;
recer, podemos exibi-lo e decrementar o nmero de clulas case GameState.Playing:
necessrio para mudar para esse nvel. PlayGame(gameTime, touchState);
break;
void MakeMonkeysVisible() case GameState.GameOver:
{ tapToRestartTimer -=
if (cellsToChange > 0) gameTime.ElapsedGameTime;
{ if (touchState.Count > 0 &&
var idx = rnd.Next(grid.Count); tapToRestartTimer.TotalMilliseconds < 0)
if (grid[idx].Color == {
Color.TransparentBlack) currentState = GameState.Start;
{ score = 0;
grid[idx].Show(); increaseLevelTimer =
cellsToChange--; TimeSpan.FromMilliseconds(0);
} gameTimer =
} TimeSpan.FromMilliseconds(0);
} cellsToChange = 1;
maxCells = 1;
Juntando as peas for (int i = 0; i < grid.Count;
i++)
{
Agora que temos todas as peas individuais completas, grid[i].Reset();
vamos junt-las num mtodo chamado PlayGame: }
}
void PlayGame(GameTime gameTime, break;
TouchCollection touchState) }
{

36
A PROGRAMAR

O MEU PRIMEIRO JOGO EM MONOGAME


base.Update(gameTime); {
} var v = new Vector2(font.MeasureString
(tapToStartText).X / 2, 0);
Primerio, chamamos o mtodo TouchPanel.GetState spriteBatch.DrawString(font,
para agarrar o actual estado do touch. Em seguida vamos pas- tapToStartText, center - v, Color.White);
s-lo para o mtodo PlayGame, que ir us-lo para tratar o }
input do utilizador. A declarao de troca controla o estado do spriteBatch.End();
jogo. Como j vimos, vamos por default para GameState.Start. base.Draw(gameTime);
}
O caso GameState.Playing simplesmente chama a lgica de
jogo que escrevemos anteriormente, enquanto o caso GameS- Algo importante a lembrar quando construmos aplica-
tate.GameOver verifica para ver se o utilizador clicou para rei- es e jogos que devemos ter em conta vrios tamanhos
niciar o jogo e, se sim, reiniciar todos os nosso campos ao va- de ecr e factores de forma dos equipamentos, desde telefo-
lor inicial, limpando a grelha, e transitar de volta para o estado nes mveis a ecrs de TV. Ao contrrio do desenvolvimento
GameState.Start. de aplicaes, no nos so fornecidos motores de layout
dinmicos como AutoLayout ou contentores de layout como
Desenhando o PapTap LinearLayout do Android para exibir dinamicamente items de
jogo. A propriedade ViewPort expe propriedades para nos
Se corrermos o PapTap agora, no vemos muito mais
ajudar a descobrir quo grande uma clula deve ser no ecr.
do que a grelha de macacos que vimos quando comemos.
Apesar de a lgica de jogo estar a correr nos bastidores, a in- O texto deve estar centrado no ecr para que possa-
terface do utilizador no est a ser actualizada aps o jogo mos calcular o centro usando o seguinte:
comear a correr. O lugar certo para toda esta lgica o mto-
do Draw, de deve ser usado exclusivamente para desenhar var center = graphics.GraphicsDevice.Viewport.
Bounds.Center.ToVector2();
quaisquer grficos que precisamos de exibir.

A propriedade ViewPort.Bounds um tipo de rectn-


protected override void Draw(GameTime gameTime)
{ gulo que contm uma propriedade Center que pode ser usa-
graphics.GraphicsDevice.Clear da para desenhar texto no centro do ecr:
(Color.SaddleBrown);
var center = graphics.GraphicsDevice.Viewport. var v = new Vector2(font.MeasureString
Bounds.Center.ToVector2(); (tapToStartText).X / 2, 0);
var half = graphics.GraphicsDevice. spriteBatch.DrawString (font, tapToStartText,
Viewport.Width / 2; center - v, Color.White);
var aspect = (float)logo.Height / logo.Width;

var rect = new Rectangle((int)center.X - Podemos utilizar SpriteFont.MeasureString para


(half / 2), 0, half, (int)(half * aspect)); calcular o tamanho do texto, o que devolve um vetor com a
largura (X) e altura (y). Podemos depois tirar esse valor do
spriteBatch.Begin();
centro, para que quando desenharmos a string ela termine
spriteBatch.Draw(background, no lugar errado. SpriteFont tambm expe uma propriedade
destinationRectangle: graphics.GraphicsDevice. til chamada LineSpacing, que podemos utilizar para garantir
Viewport.Bounds, color: Color.White);
que quando desenhamos o texto verticalmente, este est
spriteBatch.Draw(logo, destinationRectangle: devidamente espaado; Utilizamos isto para exibir a pontua-
rect, color: Color.White); o do utilizador abaixo do texto Game Over.
foreach (var square in grid)
{ Vamos agora correr o jogo e deveremos ter um jogo
spriteBatch.Draw(monkey,
destinationRectangle: square.DisplayRectangle, PapTap completamente funcional para Android. Se correr-
color: Color.Lerp(Color.TransparentBlack, mos o cdigo, deveremos ser capazes de jogar o jogo at ao
square.Color, square.Transition));
} fim:

if (currentState == GameState.GameOver)
{
var v = new Vector2(font.MeasureString
(gameOverText).X / 2, 0);
spriteBatch.DrawString(font, gameOverText,
center - v, Color.OrangeRed);

var t = string.Format(scoreText, score);


v = new Vector2(font.MeasureString(t).X / 2, 0);
spriteBatch.DrawString(font, t, center +
new Vector2(-v.X, font.LineSpacing),
Color.White);
}
if (currentState == GameState.Start)

37
A PROGRAMAR
O MEU PRIMEIRO JOGO EM MONOGAME
Terminando

Acabmos de construir o nosso primeiro jogo para


Muitos programado- Android utilizando MonoGame! Algumas partes podem ser
um pouco traioeiras, mas uma vez que compreendamos as
res chegaram ao mundo peas maiores em jogo, tudo comea a fazer sentido. Se
quisssemos poderamos adicionar uma verso iOS do Pap-
da programao atravs Tap simplesmente adicionando um projecto novo soluo
PapTap que referencia o Projeto Partilhado que crimos e
apagar a classe Game1 que est autocriada.
do fascnio do desenvol-
Boom num piscar de olhos, adicionmos suporte
vimento de Jogos. iOS ao nosso jogo numa questo de segundos!

Nestas breves sries, vimos como criar um interface


de utilizador para o nosso jogo, bem como adicionar lgica
para criar um jogo estilo Whack-a-Mole chamado PapTap.

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

1. USB para alimentao e comunicao;


Est na moda o conceito Internet of Things, que se refe-
re capacidade de interagir com dispositivos fsicos, obtendo 2. Alimentao alternativa (de 9V a 12V, pino central
informao/mtricas (e.g., temperatura, humidade, etc.) e envi- + );
ando comandos/aces (e.g., abrir porta, ligar ar condicionado,
3. Pinos de alimentao (sadas e entradas);
etc.).
4. Pinos de entrada analgica (podem ser usados como
O conceito, que no novo, implica colaborao entre
digitais);
profissionais de electrnica, programadores e at DBAs. Este
workshop adequado para programadores e DBAs que tm 5. Pinos de entrada/sada digital ( ~ significa sada digi-
poucos conhecimentos de electrnica, dando-lhes uma introdu- tal PWM)
o utilizao de Arduino (actualmente referido como Genui-
6. Processador;
no na Europa), uma das mais conhecidas plataformas de elec-
trnica utilizada nesta rea. 7. Boto de Reset;

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

Existem vrios modelos de Arduino/Genuino. Aqui va-


mos apenas trabalhar com os modelo Uno e Mega.

As maiores diferenas entre eles so a velocidade, a


quantidade de memria e o nmero e tipo de pinos. Alguns so
conectados via USB por ligao USB do tipo B, e outros por
uma ligao Micro-USB do tipo B. As posies do boto de
Reset e dos LEDs tambm variam conforme o modelo e ver-
so.

Para efeitos deste workshop, utilizaremos pinos e funci-


onalidades que so comuns a todos.

Arduino Uno: Hello World com o LED integrado

Aps instalar o IDE do Arduino ( https://Arduino.CC/


en/Main/Software ) e conect-lo atravs do cabo USB,
necessrio configur-lo. Comeamos por escolher a porta
srie onde est ligado (normalmente s haver uma):

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()

Nesta funo colocamos o programa que reali-


za a funo pretendida. Chegando ao fim des-
ta funo, novamente chamada (repete-se
indefinidamente).

Aps criar o programa, devemos valid-lo. Para isso,


utilizamos o primeiro boto da barra de ferramentas ( ).

Em alguns casos (como o Arduino Mega) tambm


necessrio escolher a verso:

Para enviar o programa para o Arduino, utilizamos o


segundo boto ( ). Durante o upload, veremos vrias men-
sagens na parte inferior do IDE, assim como os LEDs RX e
TX da placa a piscar. Uma vez concludo o upload, o progra-
ma inicia-se automaticamente.

Neste caso, piscar o LED L integrado na placa. Po-


der ajustar o delay() para alterar a durao de cada estado
(ligado ou desligado) do LED. O delay() utiliza milissegun-
dos.
O IDE do Arduino j vem com alguns exemplos. Vamos
comear por utilizar o exemplo Blink, para piscar o LED inte- Comeamos por implementar o seguinte esquema,
grado na board ( L ), que est ligado ao pino 13. com um boto e uma resistncia elevada (e.g. 10 k):

Este esquema, que enquanto o boto no carrega-


O exemplo mostra duas funes: do est a enviar 0V para a entrada, chama-se "pull-down".
Existe tambm o "pull-up", mas a por omisso a entrada
setup() recebe +5V (ou +3,3V, conforme o tipo de placa).

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().

Podemos tambm enviar texto personalizado de de-


bug. Por exemplo, acrescentamos a linha (respeitar sempre
maisculas/minsculas):
[...]
Serial.println(buttonState);

if (buttonState) Serial.println("LIGADO"); else


Serial.println("DESLIGADO");

delay(1); // delay in between reads for stability


[...]

Aproveitando o esquema dos laboratrios anteriores,


vamos acrescentar um rel (que age como um interruptor
que pode controlar equipamentos externos):

Aps o upload, o boto funcionar para activar o LED.

Utilizando o esquema do laboratrio anterior, vamos


enviar o estado do boto pela ligao USB/srie para o compu-
tador.

Vamos abrir o exemplo DigitalReadSerial:

Acrescentamos ao final da funo setup():

pinMode(13, OUTPUT);
pinMode(12, OUTPUT);

Acrescentamos ao final da funo loop():


digitalWrite(13, buttonState);
digitalWrite(12, !buttonState);
Porque que o valor do pino 12 (rel) est invertido?
Aps enviar o programa para o Arduino, vamos ver o Os rels que vamos utilizar ficam activos se no seu pino de
que enviado para a porta USB/srie, usando o Serial Moni- sinal receberem 0V, e ficam inactivos se receberem 5V (ou
tor: no forem ligados). Nem todos os rels so assim, convm
testar antes de utilizar.

Utilizando o esquema dos laboratrios anteriores,


vamos acrescentar um sensor de temperatura ou luminosida-
de analgico ao pino A0:

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.

Acrescentamos ao final da funo setup():

pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(2, INPUT);

Acrescentamos ao final da funo loop():

if (sensorValue > 500 || digitalRead(2))


{
// Rele ligado
digitalWrite(13, HIGH);
Abrimos novamente o Serial Monitor para ver os valo- digitalWrite(12, LOW);
}
res do sensor. A leitura de pinos analgicos (A0, A1, etc.) retor- else
na valores entre 0 e 1023 (ou seja, linearmente entre 0V e 5V). {
No entanto, provvel que o sensor escolhido s apresente // Rele desligado
digitalWrite(13, LOW);
valores em parte desta gama. Registe os valores mnimos e digitalWrite(12, HIGH);
mximos dos sensor para utilizar no laboratrio seguinte. }

O valor exacto (aqui 500) e o operador (">" ou "<")


podem variar conforme o sensor. Utilize os valores obtidos
no laboratrio anterior para calibrar.

AUTOR
Escrito por Adrian Pearce

Licenciado e Mestre em Engenharia Electrotcnica, responsvel por vrios projectos de investigao e


desenvolvimento financiados pela Unio Europeia, nas reas de electrnica analgica e digital, engenha-
ria de sistema e de produto, gesto e execuo financeira.

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.

Vai a http://Andy.PT e ficas a saber o mesmo que a NSA...

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

Android Desenvolvimento de Aplicaes com Android Studio


Ttulo: Android Desenvolvimento de Apli-


para a aplicao). Por fim, efectuada uma visita guiada ao
caes com Android Studio
ciclo de vida de uma aplicao Android.
Autores: Ricardo Queirs
No captulo 5 d-se maior enfase criao de interfaces
Editora: FCA - Editora de Informtica grficas e os seus principais componentes desde layouts
(LinearLayout, TableLayout entre outros), fragmentos (ciclo
Pginas: 304
de vida e comunicao entre fragmentos) e views. Detalha-
ISBN: 978-972-722-819-5 se o conceito de View e ViewGroup e os atributos consti-
tuintes ao alinhamento de views.
Introduo

Hoje em dia os dispositivos inteligentes esto cada vez mais


enraizados nas nossas vidas. A evoluo da tecnologia
cada vez mais crescente e os utilizadores tornaram-se mais
exigentes, contactando cada vez mais com estes dispositi-
vos. O Android um dos sistemas operativos mais utilizados
nos dispositivos mveis e foi desenvolvido pela empresa
Google.

Este livro que revemos nesta edio constitudo por 11


captulos e explica como desenvolver aplicaes Android
usando o Android Studio, sendo o pblico-alvo os programa-
dores de software.

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.

No captulo 4 so apresentados as principais componentes


de uma aplicao Android desde actividades (responsveis
pela interface com o utilizador), servios (responsveis pelas
operaes que executam em background), receptores de
broadcast (respondem a eventos da aplicao ou sistema) e
fornecedores de contedos (armazenam e fornecem dados

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

Um bom livro da srie de livros sobre desenvolvimento para


a plataforma Android, do autor Ricardo Queirs com foco na
plataforma Android Studio. Uma leitura muito agradvel mas
mais adequada para quem j tem conhecimentos slidos de
programao orientada a objectos.

Este livro torna-se tambm um bom complemento para quem


Por fim, no ltimo captulo o leitor adquire conhecimento no j leu o livro Android Introduo ao Desenvolvimento de
Android Wear, uma verso de sistema operativo Android Aplicaes, do mesmo autor, ou para quem deseja iniciar-se
projectado para smartwatches e outros wearables. aborda- no desenvolvimento Android usando como IDE o Android
do como desenvolver aplicaes para o Android Wear com Studio e j tem conhecimento base slidos sobre esta tecno-
base em dois exemplos de aplicaes: Uma aplicao que logia.
ensina a criar aplicaes bsicas para a plataforma Wear e
outra que explica o processo de emparelhamento de um
dispositivo wearable com um telefone, sendo abordado o

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

SQL Server 2014: Curso Completo


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.

Segue-se o planeamento, instalao e rede:

Consideraes sobre armazenamento (boa explica-


o, embora falte a referncia a discos SSD e as res-
pectivas alteraes conceptuais que trazem);

Instalao (que inclui instalao em linha de coman-


dos). Quem conhece SQL Server e a sua facilidade
de instalao, compreende imediatamente porque
este captulo dos mais pequenos;

Consideraes sobre rede (com um bom detalhe para


programadores) e uma seco de troubleshooting que
inclui o famoso problema de activar ligaes remotas
(que muitas vezes omitido nestes livros).

feita uma referncia detalhada ao Management


Studio (bastante acessvel para iniciantes), com uma lista

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.

Vai a http://Andy.PT e ficas a saber o mesmo que a NSA...

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

Introduo lado do cliente, exigiu aos programadores um maior domnio


da linguagem Javascript. Esta tambm tem vindo a evoluir
Nesta edio, trago at vs um artigo sobre o
exponencialmente ao longo dos anos.
conceito das SPAs. Para os leitores que no esto to
familiarizados com este conceito e quais as vantagens e Motivaes para o uso de SPAs
desvantagens no uso de uma SPA, assim como as
Existem vrias motivaes no uso de uma aplicao
diferenas entre ter aplicaes de mltiplas pginas e de
como esta, sendo algumas delas as que enumero de
pgina nica, permitam-me que vs conduza pelas prximas
seguida:
pginas.
1. Reach
A primeira pgina web surgiu em 1994, uma simples
As aplicaes SPA podem ser acessveis em
pgina HTML sem grandes estilos ou animaes associados.
diferentes plataformas e dispositivos desde que tenha
um browser.

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.

4. Melhor experincia de utilizao


A experincia de utilizao numa aplicao deste tipo
Com o passar dos anos, as pessoas foram-se
mais imersiva.
tornando cada vez mais exigentes, com um aumento
significativo na evoluo tecnolgica. 5. Separao de responsabilidades entre cliente e
A tecnologia evoluiu, os novos dispositivos servidor
Numa SPA a diviso de responsabilidades entre
(smartphones, tablets) comearam a aparecer, obrigando as
aquilo que cliente e o que servidor torna-se
aplicaes a serem suportveis, responsivas e visveis em
evidente. Facilmente se torna possvel ter pessoas
cada um desses dispositivos. Cada vez mais, os utilizadores
dedicadas a trabalhar do lado do cliente, focadas no
pretendem aplicaes mais rpidas, fludas, com tempos de
HTML5, CSS3 e Javascript e outras pessoas
resposta rpidos, que sejam suportadas em todos os
dedicadas ao lado do servidor, implementando uma
dispositivos, que corram numa nica pgina como se de uma
Web Api, por exemplo, expondo os recursos
aplicao desktop se tratasse. Ora tudo isto exige aos
necessrios em resposta ao cliente.
programadores que repensem a forma como constroem a
arquitetura da sua aplicao. aqui que entra o conceito das 6. Offline Applications
Single Page Applications tambm conhecido pelo acrnimo O HTML5 permite mecanismos de Application Cache,
de SPA, termo que usaremos durante o artigo. o que significa que a aplicao pode ficar em cache e
ser acessvel sem ter acesso internet. A vantagem
SPA o conceito usado para aplicaes web que
deste mecanismo o facto do utilizador conseguir
carregam uma pgina HTML simples e em seguida atualiza a
aceder aos dados sem estar conectado internet.
pgina dinamicamente em vez de carregar novas pginas.
Assim o carregamento dos dados torna-se mais rpido
Aps o carregamento da pgina inicial a aplicao SPA
e reduz o carregamento ao servidor uma vez que este
comunica com o servidor por meio de solicitaes AJAX
s recorrido para efectuar uma actualizao ou
(Asynchronous JavaScript and XML).
alterao. Uma outra forma pode passar por usar os
Uma vez que grande parte da aplicao se centra do

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.

2. Deep-linking Single Page Application


A navegao em aplicaes como estas tambm Como mencionado no incio do artigo, uma
pode tornar-se complicada, exigindo ao programador Single Page Application uma aplicao web que corre
que implemente a funcionalidade de back por numa nica pgina HTML, no necessitando de ser
exemplo, algo que nos diretamente fornecido pelo refrescada no browser para mudar para uma outra pgina.
browser.
Um outro aspecto destas aplicaes o facto de no
3. SEO necessitar de ser instalada do lado do cliente uma vez que
Uma vez que no existem ncoras tende-se a que corre no browser, cross-platform e no necessita de gerir
ferramentas de Searching como o Google no sesso do lado do servidor.
consigam encontrar facilmente este tipo de
Numa SPA so efectuados pedidos cujo retorno se
aplicaes.
trata de dados no formato JSON que sero posteriormente
Agora que enumeramos algumas das desvantagens processados e manipulados do lado do cliente. A figura 2
do uso de SPAs , passo a descrever as diferentes formas de mostra o ciclo de vida de uma SPA.
funcionamento das aplicaes de mltiplas pginas
(aplicao web tradicional) e as SPAs.

Posteriormente mostramos uma juno destes dois


tipos de aplicaes que pode ser efectuado.

Figure 2 - Ciclo de vida de uma SPA


Comparao entre os diferentes tipos de aplicaes
Tabela comparativa dos diferentes tipos de aplicaes
Aplicaes web tradicionais

Estas aplicaes so baseadas em navegao via Funcionali- Aplicao Aplicao SPA


dades Web tradici- Nativa
browser no necessitando de instalao no cliente.
onal
Uma aplicao web tradicional renderiza uma pgina Cross-

web quando recebe um pedido HTTP vindo do browser. plataform
Client-state
Aps renderizadas so enviados de volta como uma
manage-
resposta HTTP provocando uma actualizao da pgina no ment
browser, sendo esta substituda. A figura 1 mostra o cliclo de No instalati-

vida de uma aplicao web tradicional. on required

Juno entre Aplicaes web tradicionais e SPAs

Um outro tipo de aplicao que se pode ter a juno


entre uma aplicao de mltiplas pginas com aquilo a que
eu chamo de Mini-SPA.
Figure 1 Ciclo de vida de uma aplicao de mltiplas Exemplo: Se estivermos a desenvolver uma aplicao
pginas de gesto de produtos e categorias do mesmo, podemos ter

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.

Para comearem a desenvolver uma SPA, pensem


primeiramente na estrutura da vossa aplicao em termos de
contedos, HTML, CSS e aconselho-vos piamente a escolher
uma destas frameworks e a estudar o seu funcionamento de
forma a entenderem se responde s vossas necessidades.

Figure 3 - Juno aplicaes web tradicionais com SPA's

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.

Uma das principais vantagens da Cloud a Escalabi- Platform as a Service (PaaS)


lidade, ou seja, a capacidade de uma aplicao em se adap- As PaaS so uma extenso das IaaS e consistem em
tar a um novo contexto em que sejam necessrios mais ou recursos computacionais que proporcionam aos programado-
menos recursos. Imaginemos um portal web que a partir de res ambientes de desenvolvimento para que desenvolvam as
certa altura devido ao seu crescimento precisa de mais me- suas aplicaes na internet. Exemplos de recursos disponibi-
mria ou CPUs para dar resposta aos pedidos, ou ento a lizados pelas PaaS so o Sistema Operativo, Sistema de
situao inversa em que se chega concluso de que no Gesto de Base de Dados, Ferramentas de desenho e de-
so necessrios tantos recursos para a aplicao funcionar. senvolvimento, entre outros.
Com a Cloud possvel aumentar e diminuir esses recursos,
sendo que o utilizador apenas paga o que est a usar ao Software as a Service (SaaS)
invs de uma situao em que tem de manter a infra-
Os SaaS so aplicaes disponibilizadas pela rede,
estrutura fsica e virtual, independentemente se esta est ou
ou seja, aplicaes que o utilizador no precisa de instalar
no a ser utilizada.
para aceder s mesmas. Exemplos de SaaS so o Gmail,
Modelos de Cloud Facebook, Twitter ou Office Online. Ao contrrio do modelo
tradicional de software em que se compra uma licena, se
Pblico instala e se utiliza, o SaaS permite ao cliente pagar on de-
Uma Cloud pblica tem os seus servios e infra- mand, ou seja, pagar por ms em funo da sua utilizao.
estrutura alojados num fornecedor (cloud provider), parti- Enquanto a diminuio dos custos de acesso inter-
lhado pelos seus clientes e acessvel a estes atravs de re- net faz com que o acesso a servios Cloud aumente, a priva-
des pblicas como a internet. Este modelo de Cloud oferece cidade e controlo de dados fazem com que utilizadores hesi-
uma economia de escala e redundncia, pecando, no entan- tem em usar a cloud. Mas at que ponto? Por um lado, te-
to, pela vulnerabilidade no que diz respeito segurana, mos cada vez mais servios terminais em que TVs,
principalmente devido sua acessibilidade. smartphones, computadores, tablets, e outros dispositivos
Privado apenas tm capacidade de processamento local e armazena-
mento temporrio de dados que so obtidos atravs da
Uma Cloud privada, por seu lado utiliza servios e Cloud. Os utilizadores no hesitam em partilhar os seus con-
infra-estruturas alojadas em redes privadas acessveis ape- tedos quer em informaes no facebook ou contedos multi-
nas a um cliente. A segurana e o controlo so assim os mdia no youtube. Os jogos de vdeo tambm do prova de
maiores benefcios deste modelo, ao passo que o aumento que a comunidade online por ventura a que mais anima a
dos custos passa a ser a sua maior desvantagem. indstria. Quando h uns anos todos guardavam os seus
emails localmente no Outlook, hoje o Gmail guarda a maioria
Hibrido
dos e-mails da populao mundial. Os grandes fornecedores
Tal como o nome sugere, o modelo hibrido combina de contedos (msica, cinema, sries, etc) adoptam um para-
as caractersticas dos modelos pblico e privado, permitindo digma de pagamento por subscrio atravs de servios co-
a uma organizao maximizar a sua eficincia utilizando a mo o Netflix ou Spotify. Por outro lado, servios como o

58
No Code
A VIDA NA CLOUD

Cloud Drive da Amazon, o iCloud da Apple, Google Drive ou


aquele filme ou livro, pois a facilidade com que alugamos um
o Microsoft One Drive, alavancam ainda mais a utilizao de
filme diretamente na nossa TV, subscrevemos um servio de
servios Cloud por parte dos utilizadores particulares.
msica ou guardamos livros na Cloud fazem com que o mer-
E quanto aos utilizadores empresariais? Apesar do cado dos contedos online ou na Cloud seja o que mais cres-
crescente aumento da oferta no que diz respeito s solues ce. Numa era em que as aplicaes online so cada vez mais
empresariais de servios na Cloud, onde guardam os seus comuns, mesmo os clientes dos bancos optam por solues
dados e servios as grandes empresas, assim como os Ban- como o eBanking s tradicionais agncias. A segurana o
cos, Seguradoras ou Governos? Num mundo em que a confi- desafio, mas a utilizao j uma certeza. impensvel
dencialidade predomina, as grandes companhias optam por conceber um mundo fechado em silos em que a troca de
ter os seus prprios data centers de forma a controlarem os informao e a disponibilizao de dados e servios remotos
seus dados e servios. Mas no estaro estas organizaes no existem. A Cloud est aqui, veio para ficar e apenas
num modelo de Cloud privada, visto que os seus utilizadores uma questo de saber que forma vai assumir no futuro. Um
acedem a linhas seguras e intranets que circunscrevem futuro cada vez mais virtual e em que o online e o fsico se
Clouds privadas, ou mesmo hbridas? No caso dos bancos, misturam numa realidade em que os dados e servios pas-
por exemplo, existe o processamento interno e as aplicaes sam a ser ubquos. Os providers de servios e contedos so
externas de ebanking disponveis para aplicaes mveis e cada vez mais diversificados e a promessa de mais e mais
internet. Por outro lado as pequenas e mdias empresas gadgets terminais que possam ligar-se a esses servios no
comeam a optar por servios na Cloud, dada a vasta gama pra de aumentar.
de solues existentes. Sem dvida este um espao de
Quando a tecnologia j no o desafio, passa-se a discus-
futuro para as Telcos que apostam fortemente em aumentar
so para o nvel tico da privacidade que mais cedo ou mais
os seus data centers o que lhes permite diversificar a sua
tarde ter de ser feita ao nvel das sociedades. Estaremos
oferta quer para utilizadores particulares como empresariais.
dispostos a ter a nossa vida na Cloud? Incluindo dados de
Numa era em que j no possvel imaginar o mundo sade, bancrios, localizao, rendimentos e despesas? Ou
sem a internet, a Cloud no uma possibilidade ou incer- haver uma fronteira a qual a Sociedade vai ter de impor
teza, mas sim um facto incontornvel na tecnologia do tecnologia para garantir a liberdade individual? O futuro est
sculo XXI. Depois dos contedos fsicos em que Vinis, Cds, aqui e a Cloud apenas a metfora para o lugar onde os
DVDs e livros ocupavam prateleiras e estantes, passou-se nossos bens e servios habitam. Deixaram h muito as nos-
para o paradigma de discos rgidos e NAS (Network Attached sas casas e cidades, hoje em dia esto em todo o lado. At
Storage). Hoje em dia na Cloud que os utilizadores guar- onde vamos virtualizar os nossos dados a questo que nos
dam os seus contedos. J no nos preocupamos em ter prximos anos vamos ter de dar resposta.

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:

Flow Technology da FoodInTech que praticamente


um veterano na indstria alimentar capaz de forne-
cer uma gesto na produo, qualidade e segurana
alimentar;

Prodsmart que est a dar os primeiros passos na in-


dstria alimentar estando a evoluir de forma a respon-
der s necessidades dos seus clientes, fornece atual-
mente um programa de gesto de produo.

Pegando nestes dois exemplos, podemos afirmar que


o grande desafio destas duas empresas demonstrar as
inmeras vantagens que os seus servios podem possuir,
considerando cada cliente nico. Tm assim como principal
objetivo oferecer aos seus potenciais clientes um servio que
Quer pela via da legislao que foi mudando e impon- seja flexvel e ajustvel s necessidades de cada rea, sendo
do novos requisitos em termos de registos e de sistemas de imperativo que no se obriguem as empresas a sujeitarem-se
informao, para comunicao de dados s autoridades a uma reestruturao incompatvel com a sua realidade finan-
competentes, quer pela necessidade de sistemas de informa- ceira e com a sua dimenso. Confesso que o primeiro con-
o mais simples e genricos, que no careas de um depar- tacto com esta nova forma de gesto tive em conta a expres-

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,

A QUALIDADE FINAL DO SOFTWARE E O PAPEL DO PROFISSIONAL DE DESENVOLIMENTO


O termo Engenharia de Software como qualidade efetiva, alm de ter que se preocupar com os
conhecido foi cunhado e usado pela primeira vez pelo mtodos de desenvolvimento e suas ferramentas de
professor Friedrich Ludwig Bauer em 1968 na primeira aplicao. Frente a isso a definio sobre Engenharia de
conferncia dedicada ao assunto patrocinado pelo NATO Software apregoada por Bauer toma fora como mostra
Science Committee (NAUR & RANDELL, 1969), seu Pressman (1995, p. 31):
surgimento decorreu da anlise feita na poca sobre as
O estabelecimento e uso de slidos princpios de
condies da indstria de software que estava entrando em
engenharia para que se possa obter economicamente um
um perodo crtico de colapso que ficou conhecido pela
software que seja confivel e que funcione eficientemente em
alcunha de crise do software que teve seu incio em meados
mquina reais.
da dcada de 1960, quando os programas existentes
tornaram-se difceis de serem mantidos, estendendo-se at o Os paradigmas das metodologias de desenvolvimento
final da dcada de 1970 (PRESSMAN, 1995, p. 6). de software so segundo Pressman (2006, p. 37) propostos
para colocar ordem no caos do desenvolvimento do
A crise de software foi uma decorrncia da
software, so processos metodolgicos que podem
imaturidade do mercado e dos profissionais da computao
acomodar atividades genricas entre eles, mas guardam a
da poca, pois vinha de um perodo onde o desenvolvimento
particularidade que cada mtodo necessita para controlar o
do software no exigia requisitos e configuraes complexas,
projeto a que submetido (PRESSMAN, 2006, p. 38). O
sua utilizao era, em mdia, limitado ao ambiente em que
objetivo principal do uso de tais mtodos garantir uma
era desenvolvido. De fato, em meados de 1965 o termo crise
melhor qualidade no processo de desenvolvimento do
de software no havia sido usado, isto ocorreu durante a
software, devido a esta caracterstica operacional presumisse
dcada de 1970 quando s dificuldades relacionadas ao
serem esses mtodos ferramentas que auxiliam a obteno
desenvolvimento do software comearam a ser mais graves,
da qualidade final no processo de desenvolvimento, pois
principalmente no aumento das demandas e da
melhor uma ferramenta simples que garanta um mnimo de
complexidade que o software passava a ter que executar,
mensurao a qualidade do que no ter absolutamente nada
frente a inexistncia de tcnicas adequadas para resolver
com que medir e acompanhar.
tais desafios (ENGHOLM JR, 2010, p. 32-33). Foi a partir
desta lacuna que os princpios da Engenharia de Software Pressman (2006, p. 38-51) comenta sobre o uso de
tomaram forma e passou-se a considerar o que apregoava alguns mtodos de acompanhamento ao desenvolvimento de
Bauer, o software passou a partir de ento a ser visto como software podendo-se destacar resumidamente:
um produto e como tal necessita ser desenvolvido a partir de
critrios de produo acentuados na busca de sua qualidade,
custo adequado e entregue dentro dos prazos prometidos Modelo em cascata proposta de acompanhamento
(PRESSMAN, 1995). sequencial e linear no processo de desenvolvimento
sendo til quando os requisitos do sistema so
A Engenharia de Software foca sua preocupao em
estveis e bem definidos, usados em projetos de
manter o controle sobre todas as fases do processo de
pequeno porte com baixa margem de manuteno;
desenvolvimento do software por meio de mtricas voltadas
ao controle produtivo dessas aplicaes. Esse controle Modelo incremental proposta de produo de
calcado sob a tica de uso de diversos paradigmas (modelos software a partir de diversas verses e incrementos,
metodolgicos) de controle e acompanhamento. Cada sendo adequado para a produo de projetos maiores
paradigma, em particular, possui caractersticas relacionadas em espao de tempo limitado;
ao tipo de software desenvolvido ou ao tamanho que certa
aplicao dever possuir para atender as necessidades de Modelo evolucionrio proposta usada para
seus clientes. Essas preocupaes comearam a levar os acomodar modificaes que sejam constantes na fase
analistas de sistemas de simples gerentes de projetos que de desenvolvimento do projeto, sendo esta que
pensavam e olhavam apenas a aplicao das regras melhor usa a natureza iterativa da maioria dos
computacionais em seus projetos para que o software projetos de engenharia de software adequada para
atendesse o mnimo da necessidade dos clientes a um nvel projetos maiores;
superior de ordem onde se soma as preocupaes
Modelo baseado em componentes proposta
tradicionais outras como o custo da produo do software e a

62
No Code
A ENGENHARIA DE SOFTWARE,

baseada na reutilizao de componentes prontos de Mais recentemente vem surgindo cursos de


outros projetos, desde que possam ser conectados ao graduao na rea de Engenharia de Software reconhecidos
projeto em desenvolvimento, adequado para projetos pelo Ministrio da Educao brasileiro. Mas, parece este
maiores; esforo estar muito distante do aceite da profisso pelo
Conselho Regional de Engenharia e Agronomia (CREA)
Processo unificado proposta de projeto baseada na representante das carreiras de engenharia. No entanto, nem
orientao de casos de uso centrado na arquitetura mesmo outras atividades da produo de software
incremental e iterativa, adequado para projetos executadas por programadores e analistas de sistemas so
maiores. reconhecidas (TEBALDI, 2013, p. 28), apesar das discusses
j efetuadas no Congresso Nacional como mostra o Projeto
de Lei 1561 de 2003, proposto pelo Sr. Ronaldo Vasconsellos
Na Engenharia de Software h a considerao de que que teve seu despacho registrado em 21 de outubro de 2004
no possvel gerenciar aquilo que no pode ser medido (CMARA DOS DEPUTADOS, 2003) e se encontra
(PRESSMAN, 1995, p. 55-61). Isto somente possvel de arquivado desde ento, pelo menos at setembro de 2015.
ser executado com o uso de ferramentas adequadas ao
acompanhamento das etapas do trabalho planejado. Fazer Outro ponto de conflito em relao ao exerccio das
uso de tcnicas de planejamento consiste em determinar atividades como engenheiro de software o uso das
antecipadamente o que deve ser feito e como ser feito, ferramentas computacionais voltadas para o setor, enquanto
considerando sempre as metas a serem atingidas (SILVA, a engenharia civil possui ferramentas sofisticadas que podem
1997, p. 24). Alm das atividades de planejamento que ser usadas em computadores ao seu exerccio o setor de
visualiza o que ser realizado, como ser realizado e por produo de software no tem tanta sorte. Parece que foi
quem ser realizado, o engenheiro de software necessita mais fcil produzir ferramentas computacionais para outras
adotar critrios de gerenciamento do processo de reas da engenharia do que para o uso da prpria produo
desenvolvimento de software, uma vez que precisa medir de software, como diz o dito em casa de ferreiro o espeto
constantemente as atividades de desenvolvimento e de pau. Apesar de existirem ferramentas para uso da
evoluo, no importando o modelo de acompanhamento de Engenharia de Software parece que elas so um tanto
projeto escolhido para determinado projeto. No obstante, as distantes e no to bem elaboradas como as usadas pelas
atividades de planejamento e gerenciamento do processo de outras engenharias.
produo do software esto, na prtica, interligadas e no Pressman (1995) compara a evoluo das
podem ser vistas separadamente, pois por meio dessas engenharias civil, mecnica e eltrica que em 1995 utilizavam
atividades que se iniciou a partir da crise do software uma livros, tabelas, rguas de clculo e calculadoras mecnicas e
preocupao maior com a qualidade do desenvolvimento do comearam a partir de 1965 experimentar uma engenharia
software e dos profissionais dessa rea. baseada em computadores e que a partir de 1975
Cabe uma observao, mesmo que emprica e crtica, comearam a usar ferramentas que possuam tudo o que
sobre a Engenharia de Software, pois a partir do dito por precisavam embutidos em diversos programas de
Bauer acaba-se dando foco aos princpios de controle do computador. Atualmente v-se tudo isso na palma das mos
planejamento e do processo de desenvolvimento apenas sob por meio do uso de smatphones e tablets. Esse grupo de
a tica da engenharia, deixando-se de lado o fato que no engenheiros possui atualmente uma interface humano-
apenas a rea de engenharia a fazer uso dos princpios computador bastante vantajosa aos seus servios. Pressman
indicados por Bauer, pois muitos desses princpios so aponta que as ferramentas chamadas de CASE (Computer
encontrados na rea da administrao de empresas. Aided Software Engineering), ou seja, a Engenharia de
necessrio considerar que o perfil do profissional de Software Assistida por Computador estava por volta de 1995
engenharia de software deve ir alm das tcnicas onde estavam as demais engenharias no uso de ferramentas
computacionais e de gerenciamento e controle que ele computacionais em 1975 e parece que no houve grandes
aprende na escola, que sem sombra de dvida so avanos neste sentido se olhar as ferramentas existentes na
necessrios aos exerccios de suas funes, mas este poca e as atuais, que so basicamente as mesmas com
profissional necessita de uma viso coadjuvante da rea fim pequenas ou poucas melhorias.
que os produtos da computao que vai gerenciar sero Se as ferramentas computacionais para a Engenharia
direcionados. Se o engenheiro de software direcionar seus de Software esto um tanto estagnadas, j os mtodo e
esforos em atender empresas do ramo comercial precisar tcnicas de gerenciamento apresentaram um nvel de
ter treinamento para entender as particularidades do setor e evoluo mais acentuados como o surgimento das tcnicas
a real necessidade de seus profissionais, o mesmo deve ser de desenvolvimento gil como o Extreme Programming (XP)
considerado para outros setores produtivos da sociedade, que surgiu no final da dcada de 1990 nos Estados Unidos e
no deve apenas ter uma viso tcnica do processo de foca o processo de desenvolvimento do cdigo do software
desenvolvimento de software. (TELES[1], 2014) voltado a grupo de desenvolvedores

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):

Por que demora tanto tempo para que os programas BIBLIOGRAFIA


sejam concludos? BECK, K. Programao Extrema aplicada. Porto Alegre:
Bookman, 2008.
Por que os custos so to elevados?
CMARA DOS DEPUTADOS. Projetos de Leis e Outras
Por que no so descobertos todos os erros antes do Proposies: PL 1561/2003. Braslia: Palcio do Congresso
software ser entregue ao cliente? Nacional, 2003. Disponvel em: <http://www.camara.gov.br/
proposicoesWeb/fichade
Por que as dificuldades em medir o progresso do tramitacao?idProposicao=126039 >. Acesso em: 23 de fev
software enquanto est sendo desenvolvido? 2014.
As metodologias XP e Scrum podem ajudar a ENGHOLM JR, H. Engenharia de Software na Prtica. So
Engenharia de Software a desenvolver softwares de melhor Paulo: Novatec, 2010.
qualidade, produzidos em menos tempo e com custo menor
(TELES[1], 2014), pois permitem a participao do usurio. HEUSER, C. A. Projeto de banco de dados. 6. ed. Porto
Segundo Heuser (2009, p. 29) o envolvimento do usurio na Alegre: Bookman, 2009.
especificao do software aumenta a qualidade do software NAUR, p. & RANDELL, B. Software Engineering: A
produzido quando menciona a prtica da Engenharia de Reporto n a Conference Sponsored by de NATO Science
Software. Essas tcnicas se mostram voltadas a projetos de Committee. Garmisch, Germany: NATO, 1969. Disponvel
pequeno e mdio portes. Projetos maiores podem enfrentar em: <http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato
outros tipos de problemas, necessitando de outras tcnicas 1968.PDF>. Acesso em: 22 de fev. 2014.
de gerenciamento, neste sentido, pode-se fazer uso de
ferramentas como PERT (Programa Evaluation and Review PRADO, D. PERT/COM. 4. ed. Belo Horizonte: INDG, 2004.
Technique) usado na dcada de 1970 pelo governo norte- PRESSMAN, P. Engenharia de Software. 6. ed. So Paulo:
americano para a construo da srie de submarinos McGraw-Hill, 2006.
atmicos Polaris e o CPM (Critical Payh Method), da mesma
poca, desenvolvido pela empresa Du Pont para controlar _____________. Engenharia de Software. So Paulo:
projetos de engenharia (PRADO, 2004, p. 15). As Makron Books, 1995.
ferramentas PERT/CPM foram desenvolvidas para o SILVA, A. de T. Administrao e Controle. 10. ed. So
gerenciamento de grandes projetos e podem ser facilmente Paulo: Atlas, 1997.
usados na produo de software e possuem no mercado
ferramentas consagradas baseadas nesta dinmica, sendo o TEBALDI, J. Z. F. Direito e tica: Legislao Aplicada.
MS-Project da Microsoft (menos robusto com custo baixo de Batatais: Claretiano, 2013.
aquisio) e o Primavera Project Management da Oracle TELES[1], V. M. Extreme Programming.
(mais robusto com custo mais alto de aquisio, se DesenvolvimentoAgil.com
comparado ao Project da Microsoft). .br, 2014. Disponvel em: <http://desenvolvimentoagil.com.br/
Cabe considerar que a Engenharia de Software xp/>. Acesso em: 23 de fev. 2014.
prope levar em considerao o desenvolvimento de TELES[2], V. M. Scrum. DesenvolvimentoAgil.com.br, 2014.
software de maneira mais profissional e sria. Nos incentiva Disponvel em: <http://desenvolvimentoagil.com.br/scrum>.
a deixar de lado mtodos empricos e pessoais e adotar Acesso em: 23 de fev. 2014.

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

RP: Que preciso fazer para envolver-me com a comunidade


Revista PROGRAMAR - (RP): Fale-me um pouco de si e do
PGGD?
seu percurso na rea das tecnologias.
VG: Participar num dos nossos encontros
Vnia Gonalves - (VG): Sou licenciada em
o mais depressa possvel! :) H tambm a
Eng. Informtica e Computao pela FEUP e
possibilidade de nos seguir nas redes so-
antes da concluso do curso comecei a traba-
ciais Facebook, Linkedin e Twitter. Mas
lhar nas reas de desenvolvimento de softwa-
mesmo na mailing list e na equipa
re e segurana e gesto de redes. Mais tarde
do Slack que as mulheres do nosso grupo
conclu um Mestrado em Polticas Tecnolgi-
comunicam mais.
cas pela Universidade de Cambridge e desde
ento tenho-me focado mais na investigao
RP: Em que cidades esto presentes n-
da gesto de inovao tecnolgica, polticas e
cleos PGGD? E se uma cidade no ti-
modelos de negcio associados. Atualmente
ver ncleo, o que
sou docente convidada do Departamento de
precisam de fazer para passar a ter?
Engenharia Informtica da FEUP e Coordena-
dora de projetos de Investigao e Desenvol-
VG: Neste momento h encontros, com
vimento na NMusic.
mais ou menos regularidade, no Porto,
Lisboa, Coimbra, Leiria e vamos tentar
RP: Como surgiu a comunidade Portugal Girl
regressar a Braga depois do Vero. Para
Geek Dinners e qual a sua misso?
comear em novas cidades necessrio
reunir um grupo de 2 a 3 voluntrias e
VG: Conhecia os eventos Girl Geek Dinners
propor a existncia de um novo grupo
em Bruxelas, sempre esgotados e com mais
explicando a principal motivao. Por exemplo, em cidades
de 80-100 mulheres a participar. Na altura no havia nenhu-
com universidades que oferecem cursos na rea tecnolgica
ma comunidade ou eventos semelhantes em Portugal, que
ou cidades com plos empresariais com empresas tecnolgi-
unissem mulheres e o gosto por tecnologia. Comecei por
cas haver certamente mulheres na rea tecnolgica. es-
organizar os eventos c, enquanto ainda vivia em Bruxelas e
sas (jovens) mulheres que queremos que comecem a falar
s vezes era difcil motivar mulheres a participarem. A mis-
entre si e a trocar experincias.
so da comunidade Portugal Girl Geek Dinners encorajar e
inspirar jovens mulheres a seguirem uma carreira na rea da
RP: O que que distingue o vosso movimento de outros en-
tecnologia e potenciar a partilha de histrias, troca de experi-
contros similares?
ncias, e relaes em rede entre mulheres com carreiras na
rea tecnolgica.
VG: Penso que neste momento, e talvez por ter sido o primei-
ro, o movimento que rene mais mulheres apaixonadas por
RP: Quais as dificuldades mais difceis de contornar para
tecnologia em vrias cidades espalhadas pelo pas. A nossa
tornar os encontros possveis?
mailing list rene quase 300 mulheres e h uma comunicao
constante e um esprito de entre ajuda que no conheo nou-
VG: A disponibilidade de tempo para manter os encontros e
tras comunidades. As relaes que se tm criado nos encon-
motivar as voluntrias que organizam os encontros em vrias
tros tm facilitado muitas mulheres a encontrarem novas
cidades. normal as pessoas terem alteraes na sua vida
oportunidades de emprego e a sentirem-se mais confiantes
profissional e privada e deixam de estar disponveis. Por
no trabalho.
isso, necessrio garantir frequentemente que temos pesso-
as motivadas e a contribuir voluntariamente para esta comu-
RP: Em que medida o PGGD contribui para o presente e
nidade.
futuro dos profissionais e apaixonados das TI?
RP: O primeiro encontro surgiu em Dezembro de 2009 em
VG: O PGGD contribui essencialmente para criar uma vasta
Coimbra. O que mudou desde ento?
rede de mulheres interessadas em tecnologia e dar-lhes as
condies para estabelecerem contatos com outras mulheres
VG: Muito mudou! Desbravou-se muito caminho! Temos ca-
e empresas de forma a trazer-lhes mais-valias profissionais.
da vez mais mulheres a participar nos encontros e, acima de
Nos nossos encontros, tentamos sempre abordar temas tec-
tudo, mais conscientes para as vantagens de participar neste
nolgicos de vanguarda para enriquecer o conhecimento e
tipo de comunidades e evento e do contributo tanto para o
fomentar o posterior estudo individual do tema.
seu desenvolvimento pessoal como profissional. Entretanto,
tambm h agora uma grande escolha de comunidades na
rea tecnolgica e focadas no networking, e tambm exclusi-
vamente para mulheres. Tudo pode coexistir e o importante
que as pessoas se envolvam e tirem o maior partido disso.

65
No Code
PROJECTO EM DESTAQUE NA COMUNIDADE P@P: DIRT BIKE EXTREME

Num ambiente industrial, com um belo cenrio de


escolheres o nvel que se quer jogar, depois s convidar
fundo encontram-se muitos obstculos pela frente, cair vezes amigos para a sala e jogar com eles. Algo bastante simples e
sem conta quase natural, mas com tempo o jogador, acaba que torna o jogo ainda mais interessante.
tornando-se um profissional! Com perseverana tudo se
Um jogo inteiramente portugus, recheado de
consegue. Ao longo dos 20 nveis que compem o jogo, uns
diverso, com um grafismo bastante agradvel e muitas
vo parecer impossveis outros nem por isso, mas todos
manobras dignas de um Eveil Kenivel, dos tempos
contribuiem para que o jogador se torne um profissional de
modernos. de facto uma prova provada de que em terras
Dirt Bike Xtreme!
lusas, ainda se fazem jogos de qualidade, como nos tempos
Alm do modo carreira est tambm disponvel o ureos dos videojogos made in Portugal.
modo multiplayer. simples, basta criares uma sala e

66
Veja tambm as edies anteriores da

www.revista-programar.info
50
49 Edio - Setembro 2015
Revista PROGRAMAR

Junho 2015 46 Edio - Dezembro


47 Setenmbro 2014
2014

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

You might also like