55

Revista Programar 41

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Revista Programar 41

EDITORIAL

2

EQUIPA PROGRAMAR JMP EAX

Mais uma ediccedilatildeo desta feita a 41ordf ediccedilatildeo da Revista que trazemos ateacute voacutes

Muito aconteceu desde as ediccedilotildees anteriores e muito iraacute acontecer pois a

tecnologia estaacute em constante evoluccedilatildeo e a programaccedilatildeo em constante

desenvolvimento

No passado dia 25 de Maio realizou-se no Auditoacuterio da Microsoft em Lisboa o

primeiro Evento Presencial da Comunidade Portugal-a-Programar sobre o qual

poderatildeo encontrar um artigo mais agrave frente na revista Em parte por causa de todo o

esforccedilo necessaacuterio para que se realiza-se o evento aconteceram alguns atrasos no

lanccedilamento desta ediccedilatildeo pelo que peccedilo desculpas a todos os leitores autores

colaboradores e parceiros que nos tecircm acompanhado ao longo destes anos que a

Revista PROGRAMAR jaacute ldquocarrega nos ombrosrdquo

Ainda na sequecircncia do evento no qual a revista tambeacutem esteve representada

decorre um concurso de aplicaccedilotildees para Windows 8 pelo que se tem uma ideia e

consegue fazer a aplicaccedilatildeo recomendamos que leia a paacutegina sobre o concurso que

poderaacute encontrar nesta ediccedilatildeo

Num outro registo congratulo-me pelo crescimento da revista e agradeccedilo a todos

quantos nela trabalham e colaboram com o seu crescimento Sem vocecircs seria

impossiacutevel mas natildeo me posso esquecer de todos os leitores pois eacute para voacutes que a

revista eacute feita Eacute para os leitores que bimestralmente uma equipe dedicada de

autores revisores designers e demais staff traz uma nova ediccedilatildeo com novos

artigos novos temas tentando ir sempre de encontro ao que esperam encontrar

nesta publicaccedilatildeo

Nesta ediccedilatildeo damos continuidade a algumas seacuteries de artigos de autores que

satildeo verdadeiros ldquoresidentesrdquo e introduzimos novos temas e tecnologias bem como

uma nova seacuterie de artigos no sentido de vos agradar mais e melhor

Para aqueles que de certa forma foram privilegiados ao ter vivido na geraccedilatildeo das

525rsquorsquo e ateacute antes com as cassetes e os 8 bits que faziam maravilhas esperamos

continuar a trazer-vos um pouco daquilo que eram as publicaccedilotildees de programaccedilatildeo

que fizeram de voacutes e alguns de noacutes os programadores que agora somos mas com

os conteuacutedos actualizados e de acordo com as vossas espectativas Aos demais

leitores que natildeo viveram essa ldquomaacutegica experiecircnciardquo de fazer muito com pouco e

copiar coacutedigo do papel para o computador digitando cada instruccedilatildeo como se fosse

uma ldquopalavra maacutegicardquo para no fim se mandar compilar ou interpretar e ver ldquomagiardquo

acontecer espero que a revista continue a ir de encontro aquilo que vos agrade

sempre com a isenccedilatildeo que a caracteriza e a pluralidade pela qual se pauta

Ateacute agrave proacutexima ediccedilatildeo jmp EAX

Antoacutenio Santos

A revista PROGRAMAR eacute um projecto voluntaacuterio sem fins lucrativos Todos os artigos satildeo da responsabilidade dos autores

natildeo podendo a revista ou a comunidade ser responsaacutevel por alguma imprecisatildeo ou erro

Para qualquer duacutevida ou esclarecimento poderaacute sempre contactar-nos

Coordenador Antoacutenio Santos

Editor Antoacutenio Santos

Design Seacutergio Alves

Twitter scorpion_blood

Redacccedilatildeo Antoacutenio Pedro Cunha

Joseacute Marques Mauricio Magnani Jr

Paulo Morgado Ricardo Perre

Rita Peres Sara Silva

Seacutergio Ribeiro

Staff Ana Barbosa

Antoacutenio Pedro Cunha Antoacutenio Santos

Antoacutenio Silva Faacutebio Domingos

Jorge Paulino Sara Santos

Contacto

revistaprogramarportugal-a-programarorg

Website

httpwwwrevista-programarinfo

ISSN 1 647-071 0

IacuteNDICE

3

TEMA DE CAPA

Introduccedilatildeo ao Java EE e Java Web (Joseacute Marques)

A PROGRAMAR

COLUNAS

EVENTOS

20 de Junho XXXVI Encontro da Comunidade SQLPort

22 de Junho 39ordf Reuniatildeo Presencial da Comunidade NetPonto em Lisboa

21 e 22 Junho Agile amp Scrum Portugal 2013

11 a 22 Junho CISTI 2013 - 8ordf Conferecircncia Ibeacuterica de Sistemas e Tecnologias de Informaccedilatildeo

Para mais informaccedilotildeeseventos httpbitlyPAP_Eventos Divulga os teus eventos para o email eventosportugal-a-programarpt

Programaccedilatildeo em C const (Antoacutenio Pedro Cunha)

Jogo da Vida (Rita Peres)

JBoss Aplication Server 7 (Mauricio Magnani Jr )

PHP Uma framework ldquofrom scratchrdquo (Parte 1) (Ricardo Perre)

C - Observable vs Task (Paulo Morgado)

Visual(not)Basic - Operator Overloading (Seacutergio Ribeiro)

7

22

COMUNIDADES

NetPonto - Telerik RadControls - Raacutepida implementaccedilatildeo da paacutegina Sobre para Windows Phone Apps (Sara Silva)

48

52

39

24

34

ANAacuteLISES

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees (Joseacute Marques)

C 50 com Visual Studio 2012 (Ricardo Perre) 49

NO CODE

Game Salad (Rita Peres)

Projecto em Destaque na Comunidade PP Little Bits

65

74

42

EVENTOS

I Evento Presencial Programar 46

34

NOTICIAS

4

ARM desenvolve chip anti-piratria

A ARM anunciou o lanccedilamento de um chip anti-pirataria que

vai permitir controlar a utilizaccedilatildeo indevida de conteuacutedos prote-

gidos por direitos de autor

A novidade eacute o resultado de uma parceria com Hollywood

que pretende prevenir a pirataria nos conteuacutedos de viacutedeo em

alta definiccedilatildeo numa proacutexima geraccedilatildeo de smartphones e ta-

blets Vai agir de forma complementar agraves tecnologias de Digi-

tal Rights Management ao niacutevel do hardware

O Mali V500 vai tirar partido da tecnologia TrustZone que a

fabricante britacircnica usa jaacute haacute vaacuterios anos como mecanismo de

seguranccedila para transaccedilotildees e software mas que aqui seraacute

utilizada pela primeira vez com o objetivo de prevenir a utiliza-

ccedilatildeo de conteuacutedos protegidos por direitos de autor

A disponibilizaccedilatildeo de conteuacutedos multimeacutedia de alta definiccedilatildeo

em sistemas moacuteveis tem sido endereccedilada com algumas reti-

cecircncias pelos detentores de direitos sobre esses conteuacutedos

que natildeo encontram grandes mecanismos de seguranccedila nes-

sas plataformas sobretudo no que se refere aos sistemas

operativos moacuteveis de coacutedigo aberto como eacute o caso do An-

droid

Citada pelo Financial Times a ARM defende que a sua tecno-

logia seraacute especialmente uacutetil em paiacuteses como a China onde a

induacutestria consegue fazer um niacutevel miacutenimo de receitas com os

filmes depois destes saiacuterem das salas de cinema

Na Computex a ARM lanccedilou ainda o Cortex A12 um proces-

sador dirigido ao mercado de gama meacutedia desenvolvido a 28

nanoacutemetros A fabricante garante que o chip assegura melho-

rias de 40 ao niacutevel da performance face ao antecessor Cor-

tex A9

Tambeacutem a Intel aproveitou a feira asiaacutetica para apresentar

uma nova geraccedilatildeo de processadores Core i3 i5 e i7 A efici-

ecircncia energeacutetica garante a fabricante eacute o incremento mais

relevante nesta nova geraccedilatildeo de chips

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

A tecnoloacutegica portuguesa quer democratizar o ensino e coloca

a figura do professor como agente principal do objetivo O Kit

Inspired Teacher eacute uma escola ambulante

A JP Inspiring Knowledge empresa responsaacutevel pelos com-

putadores Magalhatildees estaacute a lanccedilar em vaacuterios mercados inter-

nacionais um kit portaacutetil de ensino que se destina aos profes-

sores O conjunto eacute composto por um computador por um

rato com capacidade de digitalizaccedilatildeo por um projetor de pe-

quenas dimensotildees e por um quadro digital que torna qualquer

superfiacutecie plana num ambiente de trabalho

Todos os dispositivos podem ser guardados numa mala trolley

resistente a choques e a aacutegua sistema que reforccedila o caraacuteter

de mobilidade do kit de ensino

O Kit Inspired Teacher tenta conjugar o fator praacutetico ao lado

econoacutemico Mesmo sem revelar o preccedilo do conjunto o pacote

de ensino digital deve ficar mais barato do que montar uma

estrutura semelhante a uma sala de aula com todos os com-

ponentes como um PC projetor e quadro

A ideia da tecnoloacutegica portuguesa eacute diminuir ao maacuteximo o

nuacutemero de casos de crianccedilas que natildeo tecircm acesso ao ensino

pela falta de material escolar qualificado e atualizado O pro-

fessor eacute ao mesmo tempo a sala de aula ideia que tem sido

bem recebida internacionalmente

O conceito jaacute foi apresentado em vaacuterios paiacuteses com uma

resposta muito positiva sobretudo do puacuteblico-alvo principal

os professores Agora com o lanccedilamento desta soluccedilatildeo no

mercado estamos em condiccedilotildees de levar a educaccedilatildeo digital a

qualquer parte do mundo escreve em comunicado o presi-

dente da JP Inspiring Knowledge Jorge Saacute Couto

A empresa responsaacutevel pela gama de equipamentos Maga-

lhatildees natildeo vai disponibilizar o kit em Portugal e a pedido do

TeK tambeacutem natildeo adiantou uma estimativa para o volume de

vendas ateacute ao final do ano

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

JP Inspiring Knowledge cria kit por-

taacutetil de ensino para professores

NOTICIAS

5

Ferramentas de construccedilatildeo extensiacuteveis

Sabemos que eacute preciso construir um sistema que se adapte

aos seus requisitos de projeto mas que se estenda ainda ao

seu ambiente maior de desenvolvimento O Android Studio

usa um novo sistema de construccedilatildeo baseado em Gradle que

proporciona flexibilidade sabores de construccedilatildeo personaliza-

dos resoluccedilatildeo de dependecircncias e muito mais

Este novo sistema de montagem permite-lhe construir os seus

projetos no IDE bem como em seus servidores de integraccedilatildeo

contiacutenua A combinaccedilatildeo permite-lhe gerir facilmente as confi-

guraccedilotildees complexas de construccedilatildeo nativamente atraveacutes do

seu fluxo de trabalho em todas as suas ferramentas Confira

a documentaccedilatildeo de preacute-visualizaccedilatildeo para ter uma ideacuteia me-

lhor do que o novo sistema de construccedilatildeo pode fazer

Ediccedilatildeo de coacutedigo poderoso

O Android Studio inclui um editor de coacutedigo poderoso Ele eacute

baseado no editor IntelliJ IDEA que suporta recursos como

ediccedilatildeo inteligente refatoraccedilatildeo de coacutedigo avanccedilado e anaacutelise

aprofundada de coacutedigo estaacutetico

Os recursos de ediccedilatildeo inteligentes tais como pesquisas de

recursos em linha facilitam a leitura do coacutedigo dando-lhe

acesso instantacircneo a editar o coacutedigo dos recursos de apoio A

refatoraccedilatildeo avanccedilada de coacutedigo daacute-lhe o poder de transfor-

mar seu coacutedigo atraveacutes de todo o projeto com rapidez e se-

guranccedila

Adicionaacutemos anaacutelise de coacutedigo estaacutetico para o desenvolvi-

mento Android ajudando a identificaccedilatildeo de erros mais rapida-

mente Aleacutem das centenas de inspeccedilotildees de coacutedigo que o In-

telliJ IDEA oferece adicionaacutemos inspeccedilotildees personalizados

Por exemplo noacutes adicionamos metadados para as APIs do

Android que assinalam quais os meacutetodos que podem retornar

nulos ou natildeo que constantes satildeo permitidas para que meacuteto-

dos e assim por diante Android Studio usa esses dados para

analisar seu coacutedigo e encontrar possiacuteveis erros

Fonte Android Developers Blog

Portugal acolhe rede internacional

de centros de inclusatildeo social

O Centro de Inclusatildeo Digital um projeto de intervenccedilatildeo social

apoiado pela Microsoft estaacute a chegar a Portugal No primeiro

ano de atividade a organizaccedilatildeo quer chegar a 1200 jovens

A accedilatildeo do CDI centra-se no desenvolvimento de competecircn-

cias tecnoloacutegicas junto de populaccedilotildees provenientes de con-

textos socioeconoacutemicos desfavorecidos com o objetivo de

criar condiccedilotildees de empregabilidade

A organizaccedilatildeo fundada no Brasil em 1995 tambeacutem atua

apoiando iniciativas empresariais empreendedoras Em Portu-

gal pretende criar uma rede nacional de centros de inclusatildeo

digital O primeiro seraacute instalado no bairro da Belavista em

Setuacutebal Uma segunda estrutura estaacute tambeacutem jaacute prevista e vai

localizar-se em Vale de Cambra no Porto

O CDI conta com 780 espaccedilos de inclusatildeo social em 12 paiacute-

ses De acordo com os nuacutemeros avanccedilados pela organizaccedilatildeo

as suas iniciativas jaacute tiveram impacto na vida de um milhatildeo de

pessoas

A iniciativa conta com o apoio da Microsoft que hoje a apre-

sentou no acircmbito do 7ordm Encontro de Parceiros Sociais e que

doou 100 mil doacutelares agrave instituiccedilatildeo para o arranque do projeto

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

Hoje na Google I O anunciaacutemos uma nova IDE que eacute cons-

truiacuteda com as necessidades dos programadores de Android

em mente Eacute chamado Android Estuacutedio eacute gratuito e estaacute ago-

ra disponiacutevel para vocecirc experimentar como uma preacute-

visualizaccedilatildeo de acesso antecipado

Para desenvolver o Estuacutedio Android colaboraacutemos com Jet-

Brains os criadores de uma das mais avanccediladas IDEs Java

disponiacuteveis hoje Basea-

do no poderoso e exten-

siacutevel IntelliJ IDEA

Community Edition adi-

cionaacutemos recursos que

satildeo projetados especifi-

camente para o desen-

volvimento Android que

simplificam e otimizam o

seu fluxo de trabalho

diaacuterio

Android Studio An IDE built for An-

droid

TEMA DE CAPA Introduccedilatildeo ao Java EE e Java Web

TEMA DA CAPA

7

Java Enterprise Edition

A plataforma Java Enterprise Edition ou Java EE eacute uma pla-

taforma da Oracle que fornece uma API adicional ao Java

SE para o desenvolvimento e execuccedilatildeo de aplicaccedilotildees java

do tipo empresarial focadas nos serviccedilos de rede e Web

Vindo do Java Professional Edition o nome que foi anuncia-

do em Maio de 98 foi a partir dos finais de 1999 que ficou

com o nome de Java EE incluindo tecnologias como Java

Database Connectivity (JDBC) Java Servlet JavaServer

Pages (JSP) Enterprise JavaBeans JavaMail etc

CONCEITOS

Aplicaccedilatildeo Web Java

Uma aplicaccedilatildeo Java Web gera paacuteginas Web interactivas

contendo vaacuterios tipos de markup languages (HTML XML

etc) e conteuacutedo dinacircmico Eacute tipicamente composto por ele-

mentos Web tais como JavaServer Pages (JSP) Servlets e

JavaBeans para modificar e temporariamente armazenar

dados interagir com bases de dados e serviccedilos Web geran-

do conteuacutedo em resposta aos pedidos do cliente

JSP (JavaServer Pages)

JavaServer Pages eacute uma tecnologia usada no desenvolvi-

mento de aplicaccedilotildees Web Java semelhante ao PHP Possui

compatibilidades com outras soluccedilotildees Java como a Servlet

corre em servidores como o Apache Tomcat e o GlassFish

Ao contraacuterio dos tiacutepicos jarrsquos os arquivos deste tipo de imple-

mentaccedilotildees satildeo ear ou war (Web Archive)

As paacuteginas Web dinacircmicas java aceitam HTML CSS Ja-

vascript tudo que possam incluir no um ficheiro normal

HTML natildeo necessitam de compilaccedilatildeo preacutevia isso fica ao

cargo do servidor Web de traduzir as linhas de coacutedigo em

Java para o browser compreender

Qualquer coacutedigo Java inserido nos ficheiros JSP deve ficar

entre as tags

lt Code gt (para inserccedilatildeo de coacutedigo)

lt=var gt (para a expressatildeo de uma variaacutevel)

Introduccedilatildeo ao Java EE e Java Web ltpage gt (para importar include para incluir

uma paacutegina JSP ou HTML externa)

Servlet

Eacute uma tecnologia Java que permite gerar dados em HTML e

XML Incluiacuteda na biblioteca javaxservlet permite processar

pedidos e respostas vindas de JSP e serve como uma exten-

satildeo do servidor Web Neste caso vamos usar a HttpServlet

onde a sua funccedilatildeo seraacute processar pedidos das JSP resolver

os pedidos e enviar uma resposta

XML

XML (Extensible Markup Language) subtipo da SGML foi

criada pela W3C com o objectivo de ser usado como formato

de configuraccedilatildeo entre vaacuterias linguagens atraveacutes da internet

Ex

Neste caso em particular o ficheiro XML que vamos criar

editar na configuraccedilatildeo de uma aplicaccedilatildeo Java Web eacute o

webxml que tem como tags mais usa das as seguintes

lt gt agrave define comentaacuterios

ltweb-app id version xmlns gt agrave define o tipo do XML

a versatildeohellip

ltdisplay-namegt agrave define o nome

ltservletgt agrave define uma servlet

ltxml version=10 encoding=iso-8859-1 encoding=iso-8859-1gt ltreceita nome=patildeo tempo_de_preparacao=5 min tempo_de_cozedura=1horagt ltingredientesgt ltingrediente quantidade=4 unidade=chavenasgtFarinhaltingredientegt ltingrediente quantidade=7 unidade=gramasgtFermentoltingredientegt ltingrediente quantidade=15 unidade=chavenasgtAgualtingredientegt ltingrediente quantidade=1 unidade=colheresgtSalltingredientegt ltingredientesgt ltinstrucoesgt ltpassogtMisturar tdos os ingredientesltpassogt ltpassogtCobrir com um pano e deixar repousar uma hora agrave temperatura ambienteltpassogt ltpassogtMisturar novamente e colocar ao forno ateacute ao fim da cozeduraltpassogt ltinstrucoesgt ltreceitagt

TEMA DA CAPA

8

ltservlet-namegt agrave define o nome da servlet

ltservlet-classgt agrave aponta o caminho da servlet na apli-

caccedilatildeo

ltload-on-startupgt agrave quando o valor for 1 a servlet

seraacute inicializada no inicio da aplicaccedilatildeo

ltservlet-mappinggt agrave caso a servlet efectue operaccedilotildees

requeridas por elementos externos

ltservlet-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltservletgt

lturl-patterngt agrave define um url para a servlet

ltfiltergt agrave semelhante agrave tag ltservletgt com a diferenccedila

de que esta permite enquadrar uma classe de filtro na

aplicaccedilatildeo que permita a existecircncia de sessotildees na

aplicaccedilatildeo Web ou qualquer segmento de coacutedigo que

necessite de ser constantemente executado

ltfilter-namegt agrave define o nome da classe filtro

ltfilter-classgt agrave aponta o caminho da class na aplica-

ccedilatildeo

ltfilter-mappinggt agrave sempre necessaacuterio definir para

uma classe filtro

ltfilter-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltfiltergt

lturl-patterngt agrave para possuir o efeito de filtro o url seraacute

todos os existentes ou seja

lterror-pagegt agrave tag existente para definir paacuteginas de

erro que sejam geradas pelo web server e que pos-

sam ocorrer na aplicaccedilatildeo

lterror-codegt agrave define o tipo de coacutedigo de erro gerado

pelo web server (404-page not found 500-internal

server errorhellip)

ltlocationgt agrave localiza a paacutegina de erro personalizada

dentro da aplicaccedilatildeo

Estrutura de uma aplicaccedilatildeo Web Java

O exemplo que vai ser aqui apresentado seraacute montado num

Web Archive (ficheiro war) que poderaacute depois ser colocado

num servidor Web sendo os mais conhecidos o Apache

Tomcat e o Oracle Glassfish Ambos disponiacuteveis gratuita-

mente e no pacote de Java EE do IDE NetBeans que os ins-

tala em modo desenvolvimento na maacutequina local

Nota As aplicaccedilotildees necessaacuterias para a criaccedilatildeo deste exem-

plo satildeo o Java Runtime Environment (JRE) o Java Deve-

lopment Kit (JDK) e o IDE NetBeans

A estrutura normal de uma aplicaccedilatildeo java desta natureza

tem por norma a seguinte estrutura

O ficheiro WAR criado se o abrirmos tem uma estrutura de

pastasficheiros orientada ao modelo de desenvolvimento

MVC (Model-view-controller) onde a View estaacute incluiacuteda dire-

tamente na raiz do projeto onde se pode encontrar as paacutegi-

nas JSP e HTML acompanhadas pelos devidos ficheiros

JavaScript e CSS necessaacuterios Caso haja ausecircncia de um

Deployment Descriptor (ficheiro de configuraccedilatildeo referente a

uma determinada aplicaccedilatildeo que neste caso seraacute o webxml)

o servidor Web procura sempre por um indexjsp como paacutegi-

na inicial

Dentro da pasta WEB-INF estatildeo todas as classes bibliote-

cas ficheiros de configuraccedilatildeo e servlets necessaacuterias para

processar a informaccedilatildeo mostrada pelas JSPs

Em suma ter-se-aacute entatildeo algo deste geacutenero

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

9

Nota Nesta estrutura optou-se por colocar as paacuteginas dinacirc-

micas debaixo do WEB-INF pois uma vez que podemos usar

as servlets para controlar o que se deve ou natildeo ser mostrado

perante os pedidos vindos do cliente Isto torna a aplicaccedilatildeo

mais segura na questatildeo de mapeamento de URLs

Desenvolvimento

Neste exemplo vai-se usar o IDE NetBeans pois eacute aquele

que a Oracle recomenda encontra-se disponiacutevel para Win-

dows Linux Solaris e Mac OS X sendo mais simples de

configurar O NetBeans encontra-se disponiacutevel para downlo-

ad no proacuteprio site e no site da Oracle como complemento do

Java Development Kit 7 (Ver bibliografia)

Primeiros passos

Para dar iniacutecio agrave construccedilatildeo da nossa aplicaccedilatildeo Java Web

no NetBeans basta ir a File ndash New Project e aparece-nos a

seguinte janela

E vamos selecionar Java Web ndash Web Application Em se-

guida definimos a localizaccedilatildeo e o nome da nossa aplicaccedilatildeo

Dando o nome de Teste a esta aplicaccedilatildeo no passo seguinte

o nome que foi atribuiacutedo eacute automaticamente dado como

Context Path ou seja a aplicaccedilatildeo iraacute ser identificada no De-

ployment descriptor como Teste e uma vez colocada no servi-

dor teraacute o seguinte URL httphostnameportTeste

Neste exemplo vamos usar para o servidor GlassFish da Ora-

cle a versatildeo 6 do Java EE e o IDE Netbeans

O servidor escolhido pode ser posteriormente alterado caso

queira-se testar a aplicaccedilatildeo noutros ambientes contudo eacute de-

sencorajado a alteraccedilatildeo da versatildeo sem primeiro verificar a

existecircncia de possiacuteveis incompatibilidades com coacutedigo e biblio-

tecas que estejam a ser usadas O uacuteltimo seraacute ignorado uma

vez que este exemplo que vamos criar natildeo vai possuir nenhum

framework

Uma vez concluiacutedo todos os passos verificamos que automati-

camente o IDE criou-nos uma estrutura com uma paacutegina in-

dexjsp na raiz uma pasta WEB-INF vazia e atalhos para a

pasta de sources bibliotecas e de ficheiros de configuraccedilatildeo

com o tradicional MANIFESTMF criado

A estrutura visiacutevel natildeo corresponde agrave estrutura real de diretori-

as para se visualizar isso basta ir ao separador Files situado eacute

esquerda como mostra a imagem seguinte

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

10

Caso natildeo esteja criado o atalho pode-se sempre aceder indo

agrave opccedilatildeo Window ndash File abrindo o separador e recolocando o

atalho

Numa breve comparaccedilatildeo pode-se verificar que o NetBeans

cria determinados ficheiros e diretorias referentes ao projeto

(bluidxml e nbproject) e onde na estrutura do projeto a pasta

Web Pages tem referecircncia agrave pasta web e a Source Packa-

ges tem referecircncia agrave pasta src Todos os ficheiros de confi-

guraccedilatildeo ficam dentro da pasta WEB-INF e no caso da pasta

Libraries o seu conteuacutedo eacute um conjunto de atalhos cuja sua

localizaccedilatildeo pode ser referenciada a quaisquer pastas exter-

nas ao projeto No entanto recomenda-se criar uma pasta lib

debaixo de WEB-INF com as bibliotecas a ser usadas pela

aplicaccedilatildeo para evitar erros originados por utilizaccedilatildeo do mes-

mo ficheiro de biblioteca por mais do que um projeto e para

facilitar a passagem do projeto para outro ambiente ou ma-

quina pois assim basta soacute passar a pasta com o projeto sem

haver preocupaccedilotildees com importaccedilatildeo de bibliotecas

Criaccedilatildeo de uma JSP

Se abrirmos a paacutegina JSP criada pelo IDE ela vai ter um

aspecto semelhante a este

Uma vez que esta paacutegina tem o nome de index caso seja

feito o deploy da aplicaccedilatildeo a mesma vai apresentar uma

paacutegina de fundo branco com o tiacutetulo JSP Page e a frase Hel-

lo World

Para realizar o deploy da aplicaccedilatildeo basta carregar sobre o

botatildeo de play situado no painel de topo do IDE Netbeans ou

entatildeo ir a Run ndash Run Project

Caso o nome da paacutegina seja alterado e natildeo exista nenhuma

paacutegina com o nome index o servidor natildeo consegue encon-

trar nenhuma paacutegina inicial Entatildeo em seguida vamos alterar

o nome da nossa paacutegina inicial para homejsp e vamos con-

figurar o nosso webxml de maneira a criarmos um filtro de

sessatildeo que vai definir que o servidor no arranque da mesma

redirecionar-se para uma determinada servlet

Para tal se formos agrave opccedilatildeo de File ndash New Filehellip na secccedilatildeo

Web selecionar o tipo de ficheiro Standard Development

Descriptor (webxml)

Uma vez criado o ficheiro teraacute o seguinte conteuacutedo por defei-

to

Temos agora o ficheiro webxml onde poderemos colocar as

nossas referecircncias agraves servlets que vamos criar atribuindo-

lhes um url pattern a fim de poderem ser acedidas

Para natildeo termos trabalho o IDE por si soacute resolve todas as

tags que necessitamos de colocar no webxml na altura em

que criamos uma servlet caso natildeo seja resolvido pelo IDE

Para mapearmos a servlet WelcomeServlet no package

mainservlet com o url pattern Welcome o que deveria de ser

colocado seria algo deste geacutenero (ver as tags fornecidas)

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtJSP Pagelttitlegt ltheadgt ltbodygt lth1gtHello Worldlth1gt ltbodygt lthtmlgt

ltxml version=10 encoding=UTF-8gt ltweb-app xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=httpjavasuncomxml nsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsd version=30gt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

ltxml version=10 encoding=UTF-8gt ltweb-app version=30 xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=

TEMA DA CAPA

11

Mas natildeo eacute necessaacuterio escrever estas tags ateacute porque o Net-

Beans natildeo permite a criaccedilatildeo de servlets que jaacute possuam refe-

recircncias no webxml como tal o que podemos fazer eacute ir a opccedilatildeo

File ndash New Filehellip e dentro do Web selecionar Servlet

Em seguida o IDE vai recomendar a natildeo criar classes na raiz

dos packages e como tal vamos preencher o campo Package

com mainservlet e como nome WelcomeServlet

Dado o passo seguinte o IDE automaticamente cria a estru-

tura dos packages introduzidos e apresenta o formulaacuterio de

configuraccedilatildeo da servlet

Carregando sobre a check box e alterando o URL Pattern

para Welcome teremos automaticamente criado as tags

pretendidas no webxml

Uma vez criada a servlet vem com os meacutetodos herdados de

HttpServlet doGet() e doPost() implementados e com um

meacutetodo chamado processRequest() que envia coacutedigo

HTML O que vamos fazer eacute apagar este meacutetodo e colocar a

vazio o meacutetodo doPost() e introduzir a seguinte linha no

meacutetodo doGet()

Com esta linha criada e uma vez chamada a servlet que por

defeito responde por GET o pedido vai ser reencaminhado

para a nossa paacutegina criada homejsp

Fazendo deploy coloca-se o URL httplocalhost8080Teste

Welcome e verifica-se que a nossa servlet estaacute a fazer o

reencaminhamento para a nossa paacutegina inicial

Como proacuteximo passo vamos enviar variaacuteveis para uma ser-

vlet onde a mesma iraacute processar e enviar uma resposta En-

tatildeo o que se pretende eacute tomando os mesmos passos de cria-

ccedilatildeo da WelcomeServlet vamos criar a SomaServlet com o

seguinte coacutedigo

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

httpjavasuncomxmlnsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsdgt ltservletgt ltservlet-namegtWelcomeServletltservlet-namegt ltservlet-classgtmainservletWelcomeServlet ltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtWelcomeServletltservlet-namegt lturl-patterngtWelcomelturl-patterngt ltservlet-mappinggt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

getServletContext()getRequestDispatcher( homejsp)forward(request response)

package mainservlet import javaioIOException import javaxservletServletException import javaxservlethttpHttpServlet import javaxservlethttpHttpServletRequest import javaxservlethttpHttpServletResponse public class SomaServlet extends HttpServlet public static final String TEXTO = texto public static final String VALOR_1 = valor1 public static final String VALOR_2 = valor2 public static final String RESULTADO = resultado

TEMA DA CAPA

12

E para interagirmos com a servlet vamos criar as paacuteginas so-

majsp e resultadojsp onde mais uma vez vamos ao menu

File ndash New Filehellip selecionamos JSP e preenchemos o nome

sem a extensatildeo no campo File Name

somajsp

Com o objectivo de evitar erros a servlet possui constantes

que permitem que haja uma coerecircncia entre as variaacuteveis envia-

das e recebidas com o objectivo de evitar errosPode-se ob-

servar que a servlet uma vez iniciada envia uma variaacutevel atra-

veacutes de requestsetAttribute() Uma vez chamado o setAttri-

bute() requer 2 paracircmetros

requestsetAttribute(NomeDoAtributo UmObjectoQQ)

O primeiro paracircmetro como descrito atribui um nome sen-

do esse o nome que deve ser usado nas paacuteginas JSP para

puderem capturar a variaacutevel enviada que se vai encontrar

descrita no segundo paracircmetro que por sua vez eacute sempre

convertida da servlet para object Como tal teve que ser

efectuado o cast do objecto agrave chegada para o tipo de variaacute-

vel que tinha antes de ser enviada

String atributo = (String) requestgetAttribute

(NomeDoAtributo)

(Recepccedilatildeo do atributo)

Caso o que se pretenda seja o contraacuterio enviar variaacuteveis no

sentido JSP agrave Servlet a paacutegina JSP deve de conter um for-

mulaacuterio HTML com o meacutetodo que se pretende POST ou

GET e na action o URL pattern da servlet em questatildeo E os

nomes dos inputs satildeo as referecircncias que a servlet usa para

receber as variaacuteveis das paacuteginas JSP variaacuteveis essas quem

vecircm como String e como tal devem de ser convertidas para o

tipo desejado (Como demonstrado no coacutedigo acima referi-

do) Vamos entatildeo testar acedendo ao URL http

localhost8080TesteSoma

Porem a aplicaccedilatildeo funciona mas apenas mostra paacuteginas

caso as mesmas sejam escritas no URL pois uma vez que

renomeamos o indexjsp para homejsp natildeo existe de mo-

mento nenhuma paacutegina inicial ou seja caso escrevesse-

mos httplocalhost8080Teste a aplicaccedilatildeo natildeo vai mostrar

nenhuma paacutegina

Para solucionarmos esse problema vamos entatildeo criar um

filtro que remeta para uma determinada servlet filtro esse

que vai aguardar que uma determinada variaacutevel se altere de

estado para desbloquear as restantes paacuteginas Com este

tipo de classes podemos definir niacuteveis de acesso dentro da

nossa aplicaccedilatildeo restringindo a mesma quando certas variaacute-

veis natildeo forem validadas ou natildeo se encontram com o valor

pretendido (por exemplo um determinado nome de utilizador

e palavra chave)

Vamos entatildeo novamente a File ndash New Filehellip e seleciona-

mos Filter

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

Override protected void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException requestsetAttribute(TEXTO Insira 2 numeros e submeta para obter o resultado) getServletContext()getRequestDispatcher (somajsp)forward(request response) Override protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException int resultado try int val1 = IntegerparseInt (requestgetParameter(VALOR_1)) int val2 = IntegerparseInt (requestgetParameter(VALOR_2)) resultado = val1 + val2 requestsetAttribute(RESULTADO +resultado) catch (NumberFormatException e) requestsetAttribute(RESULTADO Valores natildeo validos) getServletContext()getRequestDispatcher (resultadojsp)forward(request response)

ltpage import=mainservletSomaServletgt ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lt String texto = (String) requestgetAttribute (SomaServletTEXTO)gt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtSomalttitlegt ltheadgt ltbodygt lth2gtlt=textogtlth2gt ltform action=Soma method=POSTgt Valor 1ltinput type=text name= lt=SomaServletVALOR_1gtgt Valor 2ltinput type=text name= lt=SomaServletVALOR_2gtgt ltbrgt ltinput type=submit name=submitgt ltformgt ltbodygt lthtmlgt

TEMA DA CAPA

13

caccedilatildeo e restriccedilatildeo de acessos os filtros permitem a execuccedilatildeo

de certas linhas de coacutedigo que mantecircm estados numa aplica-

ccedilatildeo e eacute o siacutetio ideal para colocar a parte do coacutedigo da aplica-

ccedilatildeo que manipula variaacuteveis de sessatildeo

Apoacutes criar-se a classe do tipo Filter ignorando o coacutedigo ge-

rado o filtro deveraacute possuir o seguinte coacutedigo

Uma vez criado o filtro este vai redirecionar todos os pedidos

agrave aplicaccedilatildeo para a WelcomeServlet enquanto a variaacutevel

validSession estiver a NULL como tal na servlet Welcome-

Servlet coloca-se a seguinte linha

requestgetSession()setAttribute(UrlFilterSESSION

gotSession)

Assim que o filtro passar pela WelcomeServlet a variaacutevel

validSession vai deixar de estar a NULL colocando o filtro a

fazer um encadeamento com os restantes pedidos que apa-

recerem

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

No seguinte passo vamos atribuir o nome de UrlFilter e coloca

-lo num novo package mainfilter

Semelhante ao passo de criaccedilatildeo do mapeamento das servlets

no webxml o IDE igualmente cria automaticamente um mape-

amento do filtro no ficheiro XML contudo o coacutedigo gerado eacute

ligeiramente diferente (Ver referecircncia de tags do webxml)

Apoacutes dar seguinte neste passo e natildeo preencher nada no proacutexi-

mo o IDE gera uma classe filtro por defeito e gera o seu mape-

amento no webxml semelhante a

Muito semelhante ao que se vai encontrar num mapeamento

de uma servlet apenas com a diferenccedila do nome das tags de

servlet para filter e o seu mapeamento seraacute muacuteltiplo para todos

os URLs que se deseja correr um determinado filtro antes de

haver o redireccionamento Uacuteteis para criar poliacuteticas de autenti-

ltfiltergt ltfilter-namegtUrlFilterltfilter-namegt ltfilter-classgtmainfilterUrlFilter ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtUrlFilterltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt

package mainfilter import javaioIOException import javaxservlet import javaxservlethttp public class UrlFilter implements Filter FilterConfig filterConfig public static final String SESSION = session Override public void doFilter(ServletRequest req ServletResponse resp FilterChain chain) throws IOException ServletException if (req instanceof HttpServletRequest) String path = ((HttpServletRequest) req)getServletPath() HttpSession session = ((HttpServletRequest) req)getSession(false) boolean sessionValidator = false if (session = null) String validSession = (String) sessiongetAttribute(SESSION) if (validSession = null) sessionValidator = true if (pathequals(Welcome) ampamp sessionValidator) ((HttpServletResponse) resp)sendRedirect(filterConfiggetServletContext ()getContextPath() + Welcome) else chaindoFilter(req resp) Override public void init(FilterConfig filterConfig) thisfilterConfig = filterConfig Override public void destroy()

TEMA DA CAPA

14

Apoacutes implementado quando se aceder agrave aplicaccedilatildeo pelo URL

apontado para a raiz (httplocalhost8080Teste) o servidor

com conhecimento da existecircncia de um filtro vai chama-lo para

cada vez que o cliente acede a qualquer servlet ou JSP

Para finalizar este exemplo vamos soacute criar um link na paacutegina

homejsp que nos vai apontar para a paacutegina somajsp atraveacutes

da SomaServlet

lta href=SomagtSomarltagt

Dentro da aplicaccedilatildeo os URL pattern que foram definidos no

webxml servem igualmente para os links HTML chamando

sempre o meacutetodo doGet() da servlet

Conclusatildeo

Este artigo mostra numa forma introdutoacuteria como se pode criar

uma aplicaccedilatildeo Java com uma interface Web tendo em conta

que as capacidades do Java EE e das suas bibliotecas nome-

adamente Servlets Filters e as configuraccedilotildees necessaacuterias para

criar uma aplicaccedilatildeo Web baacutesica com conceitos adicionais de

XML( no seu geral) JSP e MVC

BibliografiaReferecircncias

httpwwworaclecomtechnetworkjavajavasedownloads

jre7-downloads-1880261html

httpwwworaclecomtechnetworkjavajavaeedownloads

indexhtml

httpsnetbeansorgfeaturesindexhtml

httpenwikipediaorgwikiJava_EE_version_history

httpwwwjsptutcom

httpsdevelopersgooglecomappenginedocsjavaconfig

webxml

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

A PROGRAMAR Programaccedilatildeo em C const

Jogo da Vida

JBoss Aplication Server 7

PHP Uma framework ldquofrom scratchrdquo (Parte 1)

A PROGRAMAR

16

Uma das ldquorecentesrdquo adiccedilotildees agrave linguagem C foi o qualificador

const Ao contraacuterio do que se possa pensar utilizar const

natildeo cria uma constante mas sim uma variaacutevel soacute-de-leitura

O que queremos dizer com isto Vejamos o seguinte exem-

plo

Qual o valor de i apoacutes execuccedilatildeo da linha 4 Embora possa

parecer estranho i vai ter o valor 73 apesar de termos de-

clarado i como constante Por este motivo variaacuteveis qualifi-

cadas com const natildeo satildeo constantes verdadeiras em C (satildeo-

no em C++) e natildeo podem por este motivo ser utilizadas em

certos lugares como a definiccedilatildeo do tamanho de arrays ou

em cases de um switch (excepto com extensotildees dos compi-

ladores)

De que nos serve entatildeo um qualificador const se natildeo asse-

gura que a variaacutevel permanece inalterada Bem a utilizaccedilatildeo

de const para qualificar variaacuteveis impede de facto a sua

alteraccedilatildeo na maioria dos casos Natildeo podemos alterar i direc-

tamente por exemplo (ie i = 73 emite um erro) No exemplo

apresentado acima enganaacutemos o compilador (linha 2) com o

cast de ampi para o tipo int sem cast um compilador bem

configurado emitiraacute pelo menos um aviso de que o qualifica-

dor const eacute descartado na atribuiccedilatildeo de ampi a ptr um pequeno

sinal de alarme para o programador (eacute soacute estar atento)

Podemos como referido acima qualificar uma variaacutevel com

const e impedir que seja alterada directamente Se tentar-

mos apontar um apontador a essa variaacutevel o compilador

avisa-nos que a qualificaccedilatildeo de const seraacute perdida e pode-

mos alterar a variaacutevel atraveacutes do apontador Haveraacute maneira

de impedir que isto aconteccedila Na realidade a questatildeo eacute

outra como utilizar o qualificador const com apontadores

Existem 4 formas de qualificar um apontador com const

obtendo-se diferentes niacuteveis de acesso de leitura eou escri-

ta da variaacutevel apontada atraveacutes do mesmo Para que natildeo

existam duacutevidas eacute importante reter que o qualificador const

qualifica uma variaacutevel e natildeo um local na memoacuteria Por outras

palavras (e recorrendo ao exemplo inicial) qualificar i como

const soacute impedir a alteraccedilatildeo do valor atraveacutes da variaacutevel i

Quando apontamos um apontador ao endereccedilo de i pode-

mos fazer o que quisermos com o valor laacute armazenado inde-

pendentemente de como i foi declarado

A primeira forma de usar const num apontador eacute surpreen-

dentemente natildeo usar const num apontador Na realidade

(obviamente) esta natildeo eacute uma utilizaccedilatildeo do qualificador const

Programaccedilatildeo em C const mas este artigo natildeo estaria completo sem se falar dela Um

apontador simples de forma tipo p permite-nos fazer vaacuterias

coisas podemos apontaacute-lo a qualquer local da memoacuteria que

queiramos e desde que apontado a um endereccedilo vaacutelido

podemos alterar o valor aiacute armazenado com o operador de

indirecccedilatildeo (eg p = 3) Este tipo de apontador natildeo apresenta

restriccedilotildees nenhumas (por esse motivo eacute que o compilador

emite um aviso quando tentamos apontaacute-lo a uma variaacutevel

const excepto na presenccedila de casts)

Segue-se entatildeo a criaccedilatildeo de um apontador para uma variaacute-

vel constante Este tipo de apontador apresenta uma particu-

laridade embora seja possiacutevel apontaacute-lo a qualquer endere-

ccedilo de memoacuteria natildeo eacute possiacutevel utilizar este apontador para

alterar o conteuacutedo do endereccedilo apontado Logicamente este

era o tipo de apontador que precisaacutevamos no exemplo inici-

al se temos uma variaacutevel constante queremos apontar para

ela com um apontador para uma variaacutevel constante

Se lermos a declaraccedilatildeo de ptr da direita para a esquerda

tudo faz sentido ptr eacute um apontador () para um const int E

de facto i eacute um const int tudo parece bem Quando tentamos

modificar o valor apontado por ptr o compilador emite um

erro queixa-se que estamos a tentar atribuir um valor a uma

variaacutevelendereccedilo soacute de leitura Este era o comportamento

que procuraacutevamos inicialmente

Passemos agora para a terceira forma de usar const com

apontadores Uma espeacutecie de ldquoinversordquo de um apontador

para uma variaacutevel constante eacute um apontador constante para

uma variaacutevel (natildeo constante) A diferenccedila do anterior para

este eacute que agora passamos a conseguir alterar o valor apon-

tado (por outras palavras ptr = 73 passa a ser possiacutevel)

mas natildeo nos eacute possiacutevel apontar ptr para outra variaacutevel

Uma vez mais da direita para a esquerda ptr eacute um aponta-

dor constante ( const) para um int Podemos utilizar ptr agrave

vontade para modificar o valor de 42 para 73 mas eacute-nos

impossiacutevel alterar o endereccedilo para o qual ptr aponta Este

tipo de apontadores eacute uacutetil quando nos queremos assegurar

de que natildeo haacute alteraccedilotildees acidentais do local para onde um

apontador aponta Um pormenor importante sendo ptr um

apontador cujo endereccedilo natildeo pode ser alterado devemos

1 const int i = 42 2 int ptr = (int)ampi 3 4 ptr = 73

1 const int i = 42 2 const int ptr = ampi 3 4 ptr = 73 erro

1 const int i = 42 2 int const ptr = ampi 3 4 ptr = 73 ok 5 ptr = NULL erro

A PROGRAMAR

17

apontaacute-lo para onde queremos no momento da sua declara-

ccedilatildeo sob pena de ficar apontado para um local aleatoacuterio sem

possibilidade de alteraccedilatildeo

A quarta (e uacuteltima) forma de utilizar const num apontador eacute

como devem ter imaginado a combinaccedilatildeo das duas uacuteltimas

um apontador constante para uma variaacutevel constante Este eacute

o tipo de apontador mais limitado de todos uma vez que a

uacutenica coisa que podemos fazer com ele apoacutes a sua declara-

ccedilatildeo eacute consultar o valor para o qual aponta Natildeo podemos

alterar i se ptr for deste tipo nem podemos apontar ptr para

NULL ou outro endereccedilo qualquer

Desta vez utilizamos const em dois locais agrave esquerda do

asterisco para qualificar a variaacutevel apontada e agrave direita do

asterisco para qualificar o apontador Neste caso nenhuma

das operaccedilotildees funcionaraacute o compilador assegura-se que

natildeo utilizaremos ptr para alterar o valor para o qual aponta

nem tentaremos apontar ptr para outro endereccedilo

Neste artigo cobrimos algumas utilizaccedilotildees do qualificador

const na linguagem C (volto a lembrar estamos a falar de C

e natildeo de ldquoCC++rdquo) e foi tambeacutem referido como utilizar este

qualificador para melhorar o coacutedigo que escrevemos de for-

ma a prevenir asneiras relativamente comuns quando se lida

com apontadores

Falta no entanto mencionar outra utilidade do const docu-

mentaccedilatildeo Quando o programador utiliza const de uma for-

ma pensada estaacute a documentar o seu coacutedigo Se virmos uma

funccedilatildeo que aceita como argumento const void podemos

imediatamente imaginar que o endereccedilo passado nunca seraacute

alterado pela funccedilatildeo em causa enquanto que um simples

void natildeo nos informa sobre as intenccedilotildees da API Natural-

mente se o programador da API declarar um argumento

com const e depois utilizar casts para se livrar da qualifica-

ccedilatildeo entatildeo aiacute all bets are off e nada eacute garantido Mas assu-

mamos que isso eacute a excepccedilatildeo e natildeo a regra

Existem ainda muacuteltiplos aspectos que natildeo foram cobertos

neste artigo nomeadamente a conversatildeo impliacutecita de T para

const T e T para const T Esta conversatildeo eacute bastante uacutetil

quando queremos passar um valor do tipo T a uma funccedilatildeo

que requer const T como argumento Se pensarmos bem

faz sentido em qualquer lugar onde eacute necessaacuterio um const

T podemos utilizar um T perfeitamente (que nunca seraacute al-

terado) Por outro lado a conversatildeo inversa (de const T ou

const T para T e T respectivamente) natildeo eacute permitida e

tambeacutem isso faz sentido se uma funccedilatildeo pede um valor do

tipo T natildeo faz sentido aceitar um const T porque isso im-

plicaria potenciais alteraccedilotildees ao valor apontado (que satildeo

proibidas pelo qualificador const)

As conversotildees impliacutecitas relativas ao const terminam por

aqui Em C natildeo haacute conversatildeo de T para const T o que

significa que numa funccedilatildeo que aceite um argumento const

T seraacute emitido um aviso se tentarmos passar um T Neste

caso temos que recorrer a um cast para silenciar o compila-

dor Nada disto eacute um erro no entanto os casts surgiram

porque satildeo necessaacuterios na linguagem C e recusar a sua

utilizaccedilatildeo eacute negar a linguagem Haacute que saber quando e co-

mo fazer as coisas da forma correcta

Para terminar recomendo uma olha- dela agraves

manpages da biblioteca standard de C jaacute utilizam const

abundantemente nota-se bem o seu valor como documenta-

ccedilatildeo dentro do coacutedigo Aleacutem deste aspecto da documentaccedilatildeo

a utilizaccedilatildeo de const leva agrave criaccedilatildeo de coacutedigo mais previsiacutevel

e seguro e serve tambeacutem como dica para possiacuteveis optimi-

zaccedilotildees feitas pelo compiladorUsem const Informem e enco-

rajem a utilizaccedilatildeo de const especialmente aos iniciados

porque vale a pena

PROGRAMACcedilAtildeO EM C CONST

1 const int i = 42 2 const int const ptr = ampi 3 4 ptr = 73 erro 5 ptr = NULL erro

AUTOR

Escrito por Antoacutenio Pedro Cunha (pwseo)

Meacutedico natural de Guimaratildees formado na Universidade do Minho

Programador autodidacta em parte dos tempos livres inscrito no foacuterum desde 2006

Website httppwseoalojnet

Ao contraacuterio do

que se possa pen-

sar utilizar const natildeo

cria uma constante

mas sim uma variaacutevel

soacute de leitura

A PROGRAMAR

18

Nesta ediccedilatildeo vamos propor ao leitor um olhar sobre um fa-

moso algoritmo da deacutecada de 70

O seu inventor John Horton Conway nasceu em Liverpool

em Dezembro de 1937 e eacute um dos matemaacuteticos mais conhe-

cidos da nossa era em todo o mundo Estudou na Universi-

dade de Cambridge e ainda hoje eacute uma mente ativa nas

mais variadas teorias como por exemplo a teoria dos coacutedigos

e a teoria com- binatoacuteria dos

jogos

Ilustraccedilatildeo 1 - John Conway

O algoritmo escolhido para esta ediccedilatildeo foi criado em 1970

por Conway ndash o Jogo da Vida ndash sendo este um jogo para

zero jogadores Este jogo tornou-se mundialmente famoso

atraveacutes de uma coluna na revista Scientific American Em

1971 foi tema de capa e tinha entatildeo relanccedilado uma aacuterea da

Matemaacutetica a dos autoacutematos celulares que satildeo estruturas

matemaacuteticas uacuteteis em simulaccedilotildees de processos fiacutesicos e

bioloacutegicos e que a um niacutevel teoacuterico podem comportar-se

como computadores

Um autoacutemato celular eacute um modelo discreto e cada autoacutemato

deste tipo eacute representado por uma grelha de ceacutelulas poden-

do essas ceacutelulas assumir um nuacutemero finito de estados que

variam de acordo com cada modelo Outra caracteriacutestica a

considerar eacute que o tempo de evoluccedilatildeo eacute tambeacutem discreto

por exemplo o estado de uma ceacutelula no tempo t eacute sempre

obtido tendo em consideraccedilatildeo o estado dessa mesma ceacutelula

(e respetiva vizinhanccedila) no tempo t-1 Cada vez que todas as

regras determiniacutesticas satildeo aplicadas a toda a grelha uma

nova geraccedilatildeo eacute produzida

Isto foi um dos motes de partida para que Conway criasse o

Jogo da Vida Este jogo eacute considerado um autoacutemato celular

bidimensional em que satildeo simulados processos de evoluccedilatildeo

de ceacutelulas bioloacutegicas Estudos jaacute efetuados provam que este

eacute um autoacutemato computacional universal isto eacute eacute capaz de

simular qualquer sistema evolucionaacuterio possiacutevel

(reprogramando as respetivas regras determiniacutesticas se isso

for necessaacuterio)

Jogo da Vida Devido agraves analogias com o aumento reduccedilatildeo e alteraccedilatildeo de

um sistema de supostos organismos vivos (as ceacutelulas) este

jogo pertence agrave classe dos ldquojogos de simulaccedilatildeordquo pois recriam

processos do mundo-real

Voltando de novo ao tema principal do nosso artigo eacute impor-

tante recordar ao leitor que este jogo eacute para zero jogadores

o utilizador eacute apenas responsaacutevel pelos valores de inicializa-

ccedilatildeo do sistema Depois desses valores serem introduzidos

as geraccedilotildees seguintes seratildeo sempre calculadas com base

nas regras determiniacutesticas do algoritmo

Neste jogo num dado instante cada ceacutelula tem dois estados

possiacuteveis ldquovivardquo ou ldquomortardquo

As regras do jogo da vida satildeo simples ora vejamos

Uma ceacutelula viva com menos de dois vizinhos vivos

morre por solidatildeo

Uma ceacutelula viva com mais de trecircs vizinhos vivos mor-

re por sobrepopulaccedilatildeo (por escassez de recursos)

Uma ceacutelula viva com exatamente dois ou trecircs vizinhos

vivos permanece viva

Uma ceacutelula morta com exatamente trecircs vizinhos vivos

torna-se viva

Ao contraacuterio do artigo anterior desta seacuterie a soluccedilatildeo propos-

ta para este problema (na linguagem C) propotildee-se a ser

algo extremamente simples escrita de forma quase elemen-

tar

Implementaccedilatildeo do Algoritmo

Para simular o sistema de jogo foi usada uma matriz e para

que o caacutelculo das regras fosse simples foi considerado que

todas as ceacutelulas dessa matriz teriam 8 vizinhos A forma

mais direta encontrada para isso foi inserir a matriz do utiliza-

dor (que neste artigo seraacute a matriz secundaacuteria) numa matriz

com dimensatildeo [linhas+2][colunas+2] (matriz principal) para

garantir que ateacute as ceacutelulas dos ldquocantosrdquo teriam os tais 8 vizi-

nhos

De forma a simplificar a leitura da nossa implementaccedilatildeo defi-

nimos que cada ceacutelula viva teraacute o valor 1 (representada pela

macro CELVIVA) e que cada ceacutelula morta teraacute o valor 0

(representada pela macro CELMORTA)

No inicio da funccedilatildeo jogo() satildeo pedidos ao utilizador os valo-

res para o nuacutemero de linhas e colunas do sistema de jogo e

o nuacutemero de geraccedilotildees a simular

Apoacutes termos esses valores eacute entatildeo criada a matriz principal

com todos os campos inicializados a -1 para que seja efetua-

A PROGRAMAR

19

da uma ldquolimpezardquo da memoacuteria utilizada Seguidamente e atra-

veacutes desses valores eacute inicializada dentro na matriz principal a

submatriz (matriz secundaacuteria) que eacute usada para calcular os

valores das ceacutelulas em cada geraccedilatildeo Neste caso eacute inicializa-

da a matriz com a dimensatildeo que o utilizador pediu com o valor

de CELMORTA em todos os campos

Apoacutes gerar a matriz secundaacuteria eacute perguntado ao utilizador

quantas ceacutelulas vivas pretende ter no jogo Seguidamente satildeo

pedidas as coordenadas dessas mesmas ceacutelulas Quando o

programa recebe esses valores (da linha e da coluna pretendi-

da) entatildeo a essas posiccedilotildees da matriz eacute atribuiacutedo o valor CEL-

VIVA

Recapitulando para representar uma ceacutelula viva eacute usado o

valor 1 e para representar uma ceacutelula morta eacute usado o valor 0

Todas as outras posiccedilotildees da matriz principal permanecem inal-

teradas com o valor -1

Assim o que o algoritmo faz eacute contabilizar quantas ceacutelulas

vivas estatildeo nos 8 vizinhos Ou seja por outras palavras para

cada posiccedilatildeo (ij) da matriz o programa vai verificar as posi-

ccedilotildees (i-1 j-1) (i-1 j) (i-1 j+1) (i j-1) (i j+1) (i+1 j-1) (i+1 j)

e (i+1 j+1) Caso o valor de cada uma dessas ceacutelulas seja

igual a 1 (CELVIVA ie ceacutelula viva) a variaacutevel de contagem

(cvivas) eacute incrementada uma unidade

Apoacutes a verificaccedilatildeo de todas as posiccedilotildees eacute verificado se a ceacutelu-

la da posiccedilatildeo (i j) eacute uma ceacutelula viva ou morta e satildeo verificadas

as regras do jogo para que se possa decidir se a ceacutelula (ij)

permanece viva ou se morre (tomando respetivamente o valor

CELVIVA e CELMORTA na submatriz)

Usando a variaacutevel i como auxiliar para as linhas e a variaacutevel j

como auxiliar para as colunas os caacutelculos iniciam-se na posi-

ccedilatildeo (11) da matriz principal pois eacute nestas coordenadas que se

inicia a matriz secundaacuteria (ie o sistema de jogo do utilizador)

Os caacutelculos satildeo feitos em todas as posiccedilotildees (ij) apenas da

matriz secundaacuteria daiacute que a condiccedilatildeo de execuccedilatildeo dos ciclos

for seja enquanto o i e o j forem menores que o valor das li-

nhas e das colunas introduzidas pelo utilizador Ou seja a ma-

triz principal natildeo eacute toda processada nos caacutelculos dos vizinhos

vivos para que natildeo sejam gastos recursos de computaccedilatildeo

desnecessariamente

Ilustraccedilatildeo 2 - Exemplo de verificaccedilatildeo de Ceacutelulas

Ceacutelula a ceacutelula a matriz atual eacute processada sendo que apoacutes

esse processamento o resultado do caacutelculo (se a ceacutelula vive

ou morre) eacute colocado na posiccedilatildeo correspondente na matriz

nova (que eacute uma matriz com as mesmas caracteriacutesticas da

matriz atual isto eacute tem tambeacutem uma matriz principal e uma

matriz secundaacuteria)

Apoacutes esse caacutelculo eacute mostrada no ecratilde a matriz secundaacuteria

da matriz nova e a informaccedilatildeo das ceacutelulas da matriz nova eacute

copiada para a matriz atual de forma a que na proacutexima itera-

ccedilatildeo do for principal (que executa o mesmo numero de vezes

quantas geraccedilotildees o utilizador peccedila ao programa) a informa-

ccedilatildeo volte a ser processada de forma anaacuteloga

Para que fosse mais simples ao utilizador o uso do nosso

programa foi tomada em consideraccedilatildeo para que natildeo se

tornasse aborrecido estar sempre a iniciar a execuccedilatildeo do

programa caso o utilizador quisesse continuar a jogar que o

programa apenas teraacute fim quando o utilizador escolher sair

do programa neste caso introduzindo o valor 0 no menu prin-

cipal do mesmo

Se o utilizador preferir jogar novamente entatildeo basta carregar

em 1 e o programa volta a gerar uma nova jogada gerando

um novo sistema de geraccedilotildees consoante os valores introdu-

zidos pelo utilizador Na nossa implementaccedilatildeo quando o

programa mostra o sistema de jogo as ceacutelulas vivas satildeo

representadas pelo siacutembolo

Coacutedigo do Programa

Este eacute apenas um excerto da funccedilatildeo que calcula a proacutexima

geraccedilatildeo tendo como base uma matriz que represente a gera-

ccedilatildeo anterior O coacutedigo completo poderaacute ser consultado no

foacuterum do PP

JOGO DA VIDA

void jogo(void) for (int g = 0 g lt geracoes g++) printf(nnGERACAO d g + 1) for (int i = 1 i lt= linhas i++) for (int j = 1 j lt= colunas j++) int cvivas = 0 if (matrizActual[i-1][j-1] == CELVIVA) cvivas++ if (matrizActual[i-1][j] == CELVIVA) cvivas++ if (matrizActual[i-1][j+1] == CELVIVA) cvivas++ if (matrizActual[i][j-1] == CELVIVA) cvivas++ if (matrizActual[i][j+1] == CELVIVA) cvivas++ if (matrizActual[i+1][j-1] == CELVIVA) cvivas++ if (matrizActual[i+1][j] == CELVIVA)

A PROGRAMAR

20

Como o leitor pode verificar nas linhas acima este eacute um algorit-

mo bastante simples e de raacutepida implementaccedilatildeo Eacute de referir

ainda que o coacutedigo do artigo desta ediccedilatildeo foi implementado

segundo o standard C99 (suportado pelos compiladores GCC

Clang e Pelles C) que nos permite programar de uma forma

portaacutevel e ainda assim confortaacutevel (comentaacuterios comeccedilados

com variable-length arrays tipo de dados bool entre outros)

Caso o leitor queira compilar o coacutedigo deste artigo em Linux

deve utilizar a linha de comando gcc -Wall -Wextra -std=c99 -

pedantic jogo-da-vida jogo-da-vidac

O objetivo principal deste algoritmo eacute entatildeo que o utilizador

possa decidir qual a sua populaccedilatildeo inicial e que apoacutes isso pos-

sa observar o comportamento do seu sistema Ao longo dos

anos muitas configuraccedilotildees foram testadas e experimentadas

com este jogo O jogo da vida convida a experimentar diversas

configuraccedilotildees sendo que agrave maior parte das configuraccedilotildees

iniciais escolhidas bastam apenas trecircs ou quatro geraccedilotildees

para a populaccedilatildeo desaparecer completamente Contudo haacute

algumas configuraccedilotildees jaacute conhecidas como configuraccedilotildees de

ldquoVida Eternardquo por haver sempre ceacutelulas vivas ao longo de mui-

tas geraccedilotildees (e ateacute mesmo de geraccedilotildees infinitas) como mostra

por exemplo imagem seguinte (obtida com a execuccedilatildeo do

nosso programa)

Ilustraccedilatildeo 3 - Exemplo configuraccedilatildeo Vida Eterna (Bloco)

Existem ainda diferentes configuraccedilotildees que podem ocorrer

no Jogo da Vida (configuraccedilotildees essas que o utilizador pode

facilmente encontrar na internet relativas a vaacuterios estudos jaacute

feitos sobre este algoritmo) Os exemplos mais simples satildeo

mostrados abaixo com as ceacutelulas vivas em preto e as ceacutelu-

las mortas em branco

Haacute configuraccedilotildees que satildeo alvo de vaacuterios estudos cientiacuteficos

por exemplo se dois gliders satildeo colocados em direccedilatildeo a um

bloco o bloco vai aproximar-se da fonte dos gliders mas por

outro lado se trecircs gliders satildeo colocados no mesmo lugar o

bloco vai afastar-se desses gliders Este facto eacute conhecido

como a ldquomemoacuteria de bloco deslizante e pode ser usada para

simular um contador

Eacute possiacutevel construir portas loacutegicas AND OR e NOT usando

gliders tal como eacute possiacutevel construir uma imagem que aja

como uma maacutequina de estado finito conectada a dois conta-

dores

O que significa que esta disposiccedilatildeo possui o mesmo poder

computacional de uma maacutequina de Turing universal ou seja

Jogo da Vida pode ser tatildeo poderoso quanto qualquer com-

putador com memoacuteria ilimitada dando origem ao Turing com-

pleto como jaacute vaacuterios estudos comprovam esse mesmo feito

Mais uma vez recordo ao leitor que pode experimentar sem

qualquer restriccedilatildeo as configuraccedilotildees iniciais que mais lhe

agradarem Este artigo eacute o terceiro de uma seacuterie de artigos

de programaccedilatildeo tendo como base principal a linguagem C

que esperamos que siga atentamente

JOGO DA VIDA

cvivas++ if (matrizActual[i+1][j+1] == CELVIVA) cvivas++ if (isAlive ampamp cvivas lt 2) DIE else if (isAlive ampamp cvivas gt 3) DIE else if (isAlive ampamp (cvivas == 2 || cvivas == 3)) LIVE else if (isDead ampamp cvivas == 3) LIVE else DIE

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

a matriz principal

natildeo eacute toda proces-

sada (hellip) para que natildeo

sejam gastos recur-

sos de computaccedilatildeo

A PROGRAMAR

21

Introduccedilatildeo

Atualmente a plataforma Java eacute uma das mais utilizadas no

mundo e muito disso se deve agrave capacidade da plataforma

suportar outras linguagens como por exemplo JRuby Groovy

e Scala Milhares de aplicativos para Web e Mobile satildeo de-

senvolvidos a cada mecircs utilizando esta plataforma como

base A plataforma Java mudou muito desde seu iniacutecio e

provavelmente vai continuar evoluindo nos proacuteximos anos

Em paralelo com essas mudanccedilas visualizamos os servido-

res de aplicaccedilatildeo que cada vez mais oferecem recursos de

alta complexidade como componentes de balanceamento

de carga inteligente implementaccedilatildeo de autenticaccedilatildeo (JAAS)

troca de mensagens assiacutencronas (JMS) controle de transa-

ccedilatildeo (JTA) persistecircncia de objetos (JPA) componentes para

criaccedilatildeo de aplicaccedilotildees distribuiacutedas e clusterizadas (EJB) API

Java para processamento de arquivos XML e Webservices

(JAX-WS e JAX-B) e muitas outras tecnologias facilitando o

desenvolvimento e padronizaccedilatildeo de aplicaccedilotildees Eles tam-

beacutem disponibilizam uma infraestrutura estaacutevel e escalonaacutevel

para aplicaccedilotildees de missatildeo criacutetica Um dos grandes desafios

dos servidores de aplicaccedilatildeo eacute acoplar serviccedilos de grande

complexidade deixando-os estaacuteveis e flexiacuteveis

Nas versotildees iniciais a plataforma ainda conhecida como

Java2EE natildeo estava madura e seus recursos nos servidores

de aplicaccedilatildeo eram carregados de forma hieraacuterquica consu-

mindo muitos recursos e tornando o startup altamente custo-

so

A arquitetura dos principais servidores de aplicaccedilatildeo foi rede-

senhada para que seus recursos possam ser iniciados de

modo concorrente ou sob demanda As melhorias tambeacutem

podem ser notadas no consumo de memoacuteria onde em uma

simples maacutequina desktop pode-se facilmente configurar

serviccedilos de alta disponibilidade e escalaacuteveis para realizaccedilatildeo

de testes em tempo de desenvolvimento

Se vocecirc deseja um ambiente com alta disponibilidade esca-

lonaacutevel e que seja independente de fabricante (de forma a

evitar o vendor lock-in) o Java EE e seus servidores de apli-

caccedilatildeo foram feitos para si

JBoss Application Server 7

JBoss Application Server 7 ou apenas JBoss AS 7 eacute um ser-

vidor de aplicaccedilatildeo de coacutedigo aberto que eacute 100 compatiacutevel

com a especificaccedilatildeo Java EE 6 Em versotildees anteriores do

Java EE mesmo utilizando somente algumas tecnologias

para o desenvolvimento da aplicaccedilatildeo eacuteramos obrigados a

lidar com todos os recursos implementados no servidor Para

resolver esse problema no Java EE 6 foi inserido o conceito

JBoss Aplication Server 7 de profile que tem como objetivo criar configuraccedilotildees com fins

especiacuteficos como por exemplo o Web Profile que possui tec-

nologias para o desenvolvimento web

Ateacute ao momento a versatildeo atual do JBoss AS foi baixada

mais de 150 mil vezes Para mais informaccedilotildees visite o site

do projeto httpwwwjbossorgjbossas

Recentemente o projeto recebeu um novo nome e futura-

mente se chamaraacute WildFly Mais informaccedilotildees podem ser

encontradas em httpwwwwildflyorgfaq

Requisitos

Como todo servidor de aplicaccedilatildeo o JBoss AS 7 requer um

ambiente com JDK 16JDK 17 devidamente configurado e

instalado O Java Development Kit (JDK) eacute um conjunto de

utilitaacuterios para criaccedilatildeo de softwares para plataforma Java

Existem vaacuterias implementaccedilotildees cada qual com a sua finali-

dade

Para baixar o JDK 7 navegue ateacute a paacutegina de download da

Oracle em httpwwworaclecomtechnetworkjavajavase

downloadsindexhtml e escolha a opccedilatildeo Java Platform

(JDK) Em seguida vocecirc seraacute direcionado para outra paacutegina

onde deveraacute aceitar a License Agreement Baixe a versatildeo

jdk-7u21-linux-x64rpm

Para instalar o JDK execute o seguinte comando

$ sudo rpm -Uvh jdk-7u21-linux-x64rpm

Execute o comando java --version para verificar se o JDK

estaacute instalado

$ java --version

java version 170_21

Java(TM) SE Runtime Environment (build 170_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 2321-b01 mixed

mode)

Duvidas na instalaccedilatildeo Consulte o link

httpdocsoraclecomjavase7docswebnotesinstall

indexhtml

Instalando o JBoss AS 7

O JBoss AS 7 pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgjbossasdownloads Para

instalar basta descompactar o arquivo jboss-as-

711Finalzip utilizando um utilitaacuterio de descompressatildeo

A PROGRAMAR

22

Boas Praacuteticas

Nunca inicie o JBoss utilizando o usuaacuterio root pois a platafor-

ma Java oferece APIs para execuccedilatildeo de coacutedigos nativos do

sistema operacional e mecanismos de gerenciamento remoto

No Linux crie um usuaacuterio com privileacutegios de root para iniciar o

serviccedilo do JBoss Jaacute no Windows crie um usuaacuterio com poderes

administrativos mas com privileacutegios reduzidos

Uma vez instalado eacute fortemente aconselhaacutevel iniciar o JBoss

AS para verificar se existe alguma incompatibilidade com a

arquitetura do JDK utilizado ou ateacute mesmo se a memoacuteria dispo-

nibilizada eacute suficiente

Execute uma simples instacircncia standalone e acesse a url http

localhost8080 para verificar se o JBoss foi iniciado correta-

mente

$ jboss-as-711Finalbinstandalonesh

Domain Mode x Standalone Mode

O JBoss AS 7 possui dois modelos de trabalho conhecidos

como Standalone Mode e Domain Mode No Standalone Mode

podemos trabalhar com uma uacutenica instacircncia muito semelhante

a versotildees anteriores do JBoss AS 5 e JBoss AS 6 Para utilizar

o Standalone mode basta iniciar o script JBOSS_HOME

standalonesh no Linux

Agora vocecirc deve estar se perguntando se eacute possiacutevel criar um

ambiente de alta disponibilidade utilizando o Standalone

Mode A resposta eacute Sim Eacute possiacutevel criar um ambiente com

recursos clusterizados replicaccedilatildeo de sessatildeo e tudo mais Se

vocecirc jaacute utilizou outras versotildees do JBoss deve estar pensan-

do em utilizar o famoso Farm Deployment onde a aplicaccedilatildeo

era replicada para todos os noacutes do cluster Esse recurso natildeo

existe no Standalone Mode pelo que vocecirc teraacute que realizar

o deploy em todos os noacutes um por um Isso natildeo eacute um proble-

ma se forem 3 ou 4 instacircncias mas imagine se forem umas

20 instacircncias

Uma soluccedilatildeo para esse problema seria a utilizaccedilatildeo de ferra-

mentas como o RHQ (httpwwwjbossorgrhq) para realiza-

ccedilatildeo do deploy em muacuteltiplas instacircncias o que acarretaria con-

sumo de mais recursos e tempo Para solucionar esse pro-

blema temos uma soluccedilatildeo bem simples jaacute embutida no servi-

dor de aplicaccedilatildeo o Domain Mode e eacute sobre isso que vamos

falar no proacuteximo toacutepico

Introduccedilatildeo ao Domain Mode

O Domain Mode permite iniciar vaacuterias instacircncias e tambeacutem

oferece uma maneira centralizada de gerenciamento dos

recursos facilitando a administraccedilatildeo das instacircncias JBoss O

Domain Mode pode ser visto como uma unidade de instacircn-

cias que compartilham recursos e configuraccedilotildees e satildeo admi-

nistradas por um processo chamado Domain Controller

Para iniciar o JBoss AS 7 de modo domain execute o script

JBOSS_HOMEdomainsh no Linux ou JBOSS_HOME

domainbat no Windows

Quando iniciamos o JBoss em Domain Mode na configura-

ccedilatildeo default temos no miacutenimo quatro processos um Host

Controller um Process Controller e dois Servers

Domain Controller Ele eacute quem controla o gerenciamento

do domain Nele estatildeo as configuraccedilotildees que satildeo comparti-

lhadas entre as instacircncias que estatildeo nesse domain

Process Controller Ele eacute de grande importacircncia pois ele eacute

responsaacutevel pela criaccedilatildeo das instacircncias e tambeacutem do Host

Controller que vamos falar a seguir O Process Controller

natildeo deve ser confundido com uma instacircncia ele eacute

simplesmente um processo na JVM

Host Controller Como Domain Controller o Host Controller

tambeacutem coordena as instacircncias do domain Ele eacute o

responsaacutevel por fazer algo semelhando ao Farm Deployment

(natildeo existe nessa versatildeo) ou seja ele distribui o arquivo

deployado para todas as instacircncias do domain

Servers Satildeo as instacircncias em si onde estatildeo as aplicaccedilotildees

deployadas Um ponto importante eacute que cada server eacute um

processo Java

Entre os benefiacutecios da utilizaccedilatildeo do Modo Domain que noacutes

podemos citar estatildeo

Gestatildeo Centralizada

JBOSS APLICATION SERVER 7

A PROGRAMAR

23

Configuraccedilatildeo Centralizada

Deploy Centralizado

Manutenccedilatildeo Centralizada

Preparando a Infra Estrutura

Nesse artigo estamos utilizando Trecircs servidores Dois deles

seratildeo utilizados pelas as instacircncias JBoss e Um seraacute utilizado

Pelo Domain Controller e Apache Web Server para realizar o

Balanceamento de carga

Crie um grupo e adicione um usuaacuterio para ser utilizado

pelo JBoss AS 7 em todos os servidores

$ sudo groupadd jboss

$ sudo useradd -s binbash -d homejboss -m -g jboss

jboss

Faccedila tambeacutem o download do JBoss AS 7 no diretoacuterio

tmp

$ cd tmp

$ wget httpdownloadjbossorgjbossas71jboss-as-

711Finaljboss-as-711Finalzip

Crie a estrutura de diretoacuterios para armazenar o JBoss

$ sudo mkdir usrlocaljboss

$ chown jbossjboss usrlocaljboss

$ su jboss

$ mkdir usrlocaljboss

$ cd usrlocaljboss

$ unzip tmpjboss-as-711Finalzip

Finalmente o JBoss AS 7 estaacute instalado em usr

localjbossjboss-as-711 Final em todos os servidores

Configurando Alta Disponibilidade

Para aplicaccedilotildees com muitas solicitaccedilotildees a busca pela

melhora do desempenho eacute quase constante Um dos

meios mais utilizados eacute o Balanceamento de Carga

que consiste em distribuir a carga das solicitaccedilotildees em

vaacuterios servidores ou instacircncias proporcionando a

melhora no tempo de reposta

O JBoss AS 7 possui um componente nativo

conhecido como mod_cluster que foi criado para

atender a mecanismos de balanceamento de carga

alinhados ao conceito de Cloud O Mod Cluster vem

com algoritmos de balanceamento de carga mais

avanccedilados que se baseiam na carga da aplicaccedilatildeo ou

seja quantidades de sessotildees conexotildees abertas

entre outros Ele pode ser customizado conforme a

necessidade da aplicaccedilatildeo visando um ambiente

elaacutestico Um das vantagens eacute tambeacutem o

descobrimento automaacutetico de novas instacircncias JBoss

(utilizando Multicast) natildeo havendo a necessidade de

configuraccedilotildees extras

As configuraccedilotildees do mod_cluster devem ser

realizadas no JBoss AS 7 e no Apache Web Server

que seraacute utilizado como Proxy reverso

Instalando Apache Web Server

No Servidor Balancer instale o Apache Web Server

Basta executar o seguinte comando

$ sudo yum install httpd -y

Inicie o serviccedilo e verifique se paacutegina de testes eacute

carregada

$ sudo service httpd start

Instalando Mod Cluster

Ainda no Servidor Balancer instale o Mod Cluster Ele

pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgmod_cluster

downloads1-2-0-Final Para instalar basta

JBOSS APLICATION SERVER 7

A PROGRAMAR

24

descompactar o arquivo mod_cluster-120Final-linux2-

x64-ssltargz utilizando um utilitaacuterio de descompressatildeo

e copiar os moacutedulos para o diretoacuterio de moacutedulos do

Apache Web Server

Para baixar e extrair o arquivo execute

$ cd tmp

$ wget httpdownloadsjbossorg

mod_cluster120Finalmod_cluster-120Final-

linux2-x64-ssltargz

$ tar -zxvf mod_cluster-120Final-linux2-x64-

ssltargz

Copie os moacutedulos para o Apache

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_advertiseso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_managerso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_proxy_clusterso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_slotmemso etchttpdmodules

Edite o arquivo etchttpdconfhttpdconf e comente a

linha LoadModule proxy_balancer_module modules

mod_proxy_balancerso para natildeo ocorrer um conflito

com LoadModule proxy_cluster_module modules

mod_proxy_clusterso

LoadModule proxy_balancer_module modules

mod_proxy_balancerso

Crie o arquivo mod_clusterconf e adicione a seguinte

configuraccedilatildeo

$ sudo vim etchttpdconfdmod_clusterconf

Reinicie o Apache

$ sudo service httpd restart

Acesse o mod_cluster-manager e verifique se as

informaccedilotildees sobre a versatildeo do mod_cluster estatildeo

aparecendo

Arquitetura dos Servidores em Modo Domain

Para realizar os testes do balanceamento de carga

com o mod_cluster vamos subir o Domain Controller

e depois vamos conectar dois Hosts Controller com

uma Instacircncia JBoss em cada

Criando os Perfis dos Servidores JBoss

No Servidor Balancer crie o perfil chamado master

que seraacute o Domain Controller

$ cp -Rap usrlocaljbossjboss-as-711Final

domain usrlocaljbossjboss-as-711Finalmaster

JBOSS APLICATION SERVER 7

Content Mod Cluster LoadModule slotmem_module modules mod_slotmemso LoadModule manager_module modules mod_managerso LoadModule proxy_cluster_module modules mod_proxy_clusterso LoadModule advertise_module modules mod_advertiseso ltVirtualHost 80gt ltDirectory gt Order denyallow Allow from all ltDirectorygt KeepAliveTimeout 60 ManagerBalancerName mycluster MaxKeepAliveRequests 0 ServerAdvertise On EnableMCPMReceive On ltVirtualHostgt ltLocation mod_cluster-managergt SetHandler mod_cluster-manager Order denyallow Allow from all ltLocationgt

A PROGRAMAR

25

No Servidor Host-01 crie o perfil chamado host01 que

seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost01

No Servidor Host-02 crie o perfil chamado host02 que

tambeacutem seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost02

Configurando Toda a Arquitetura

Como vimos anteriormente todas as configuraccedilotildees e

gerenciamento satildeo realizadas de forma centralizada no

Domain Controller Quando for necessaacuterio adicionar um

novo grupo de servidores configurar logs criar

datasources alterar portas entre outras coisas tudo

isso deveraacute ser feito no domainxml do Domain

Controller que nesse caso eacute chamado de master Sendo

assim todas as nossas instacircncias JBoss usufruiratildeo das

configuraccedilotildees realizadas para o Domain ou para o

Server Group em questatildeo

A primeira coisa a ser feita eacute definir qual o conjunto de

tecnologias (subsystems) seratildeo utilizadas na aplicaccedilatildeo

Isso pode variar conforme os requisitos de cada

sistema Um conjunto de tecnologias (subsystems) no

JBoss 7 eacute chamado de profile

ltprofile name=full-hagt

O JBoss AS 7 possui 4 profiles por padratildeo ldquodefaultrdquo

ldquofullrdquo ldquohardquo ldquofull-hardquo mas nada impede de noacutes

copiarmos qualquer um deles e renomeaacute-los conforme

nossos requisitos No Java EE 6 foi introduzido o

conceito de Profiles onde se pode criar um subconjunto

de tecnologias presentes na spec Java EE ou ateacute

mesmo adicionar novas definidas pela JCP (Java

Community Process)

Mais informaccedilotildees

httpscommunityjbossorgwiki

JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Noacutes vamos utilizar o profile ha pois nele os recursos

para clusterizaccedilatildeo estatildeo disponiacuteveis

Depois de definir o profile o proacuteximo criar um Grupo de

Servidores Server Group Um server group nada mais eacute

que um agrupamento de instacircncias JBoss Nessa

arquitetura vamos utilizar apenas um server group Isso

pode ser definido na tag ltserver-groupsgt no domainxml

do master (Domain Controller)

Crie um Server Group chamado apps que utilize o

profile ha

$ vim usrlocaljbossjboss-as-711Finalmaster

configurationdomainxml

Os outros Server Groups podem ser removidos

No profile ha especificamente no subsystem web

adicione o atributo instance-id

O instance-id seraacute passado como paracircmetro na

inicializaccedilatildeo do Host Controller

O proacuteximo passo eacute configurar o atributo proxy list no

subsystem modcluster

Nesse atributo estaacute configurado o IP e porta do

Apache Web Server

No Servidor Host-01 edite o arquivo usrlocaljboss

jboss-as-711Finalhost01configurationhost-

slavexml para criar a instacircncia JBoss

Na tag ltserversgt eacute onde estatildeo de fato as nossas

instacircncias JBoss Quando criamos um novo ltservergt

estamos criando uma nova instacircncia JBoss

Conforme foi definido na arquitetura o Host Controller

01 conteraacute apenas uma instacircncia JBoss chamada

instance-one

Deixe o ltserversgt como abaixo

Definimos que a instacircncia JBoss instance-one faraacute

parte do Server Group apps

Para finalizar na tag lthostgt adicione o nome host01

lthost name=host01 xmlns=urnjbossdomain12gt

JBOSS APLICATION SERVER 7

ltserver-group name=apps profile=hagt ltjvm name=defaultgt ltheap size=1303m max-size=1303mgt ltpermgen max-size=256mgt ltjvmgt ltsocket-binding-group ref=ha-socketsgt ltserver-groupgt

ltsubsystem xmlns=urnjbossdomainweb12 de-fault-virtual-server=default-host instance- id=$jbossservername native=falsegt

ltsubsystem xmlns=urnjbossdomainmodcluster10gt ltmod-cluster-config advertise-socket=modcluster proxy-list=19216823818680gt ltdynamic-load-providergt ltload-metric type=busynessgt ltdynamic-load-providergt ltmod-cluster-configgt ltsubsystemgt

ltserversgt ltserver name=instance-one group=appsgt ltservergt ltserversgt

A PROGRAMAR

26

Repita os procedimentos realizados no servidor Host -01

em Host-02 alterando apenas o nome do servidor que

seraacute instance-two e do lthostgt que seraacute host02No

ambiente em que realizei os testes o sevidores possuem

os seguintes IPs

Domain Controller+Apache WebServer 192168238186

Host Controller 01 192168238187

Host Controller 02 192168238188

Inicie o Domain Controler (master) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalmaster

-Djbosshostdefaultconfig=host-masterxml -

Djbossbindaddress=192168238186 -

Djbossbindaddressmanagement=192168238186

Verifique o log

JBoss AS 711Final Brontes (Host Controller) started

in 15505ms - Started 11 of 11 services (0 services are

passive or on-demand)

O Domain Controller foi iniciado com sucesso Conecte

primeiro Host Controller 01 (Host-01) ao Master Inicie o

Perfil host01 utilizando os seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost01

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238187

-Djbossbindaddress=192168238187

-Djbossservername=host-01

Agora observe os logs no Domain Controller e perceba

que o Host Controller 01 se conectou ao Domain

JBAS010918 Registered remote slave host host01

JBoss AS 711Final Brontes

Observe tambeacutem o Mod Cluster Manager em

http192168238186mod_cluster-manager e veja que

a nossa primeira instacircncia jaacute apareceu

Inicie o Host Controller 02 (slave02) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost02

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238188

-Djbossbindaddress=192168238188

-Djbossservername=host-02

Observando novamente o log Domain Controller e

verifique que o Host Controller 02 se tambeacutem

conectou

JBAS010918 Registered remote slave host host02

JBoss AS 711Final Brontes

No Mod Cluster Manager em http192168238186

mod_cluster-manager jaacute estatildeo as duas instacircncias

Para testar o Balanceamento vamos fazer o deploy da

aplicaccedilatildeo SystemProps que pode ser baixada http

googlyjynK Para fazer o deploy conecte do domain

controller utilizando o CLI

[jbosslocalhost jboss]$ sudo jboss-as-711Final

binjboss-clish -c controller=1921682381869999

[domain1921682381869999 ] deploy tmp

systempropswar --server-groups=apps

A aplicaccedilatildeo foi deployada para as instacircncias do server

group apps Acesse a url do balanceador e verifique

se a aplicaccedilatildeo estaacute disponiacutevel

http192168238186systemprops

JBOSS APLICATION SERVER 7

A PROGRAMAR

27

Perceba que estamos na instance-one Entatildeo para

testarmos o funcionamento do balanceamento de carga

vamos parar a Instacircncia instance-one e quando

tentarmos um novo acesso seraacute redirecionado para o

instance-two

No CLI execute o seguinte comando para parar o

instance-one

[domain1921682381869999 ] host=host01server -

config=instance-onestop

outcome =gt success

result =gt STOPPING

Acesse novamente a aplicaccedilatildeo http192168238186

systemprops

Perceba que agora estamos no instance-two Concluiacutemos assim que o balanceamento de carga estaacute funcionando

Conclusatildeo

O JBoss AS 7 trouxe a evoluccedilatildeo arquitetural que era esperada como pode ser vista nesse artigo Carregamento de moacutedulos dinacircmico gerenciamento centralizado e tempo de startup reduzido satildeo apenas

algumas das inuacutemeras melhorias trazidas nessa versatildeo

Espera-se que a plataforma JBoss continue evoluindo

trazendo sempre mais benefiacutecios a todos que utilizam

os produtos desse ecossistema Cada membro da

comunidade tambeacutem pode fazer a sua parte seja

colaborando com artigos ou participando de

discussotildees para encontrar melhorias para a

plataforma Cabe a noacutes aceitar o convite de melhorar

cada vez mais essa tecnologia

JBOSS APLICATION SERVER 7

AUTOR Escrito por Mauricio Magnani Jr

Consultor JBoss com 6 anos de experiecircncia no mercado Trabalhou na RedHat como Engenheiro de Suporte JBoss atenden-

do clientes da Ameacuterica Latina e EUA Criador e mantenedor do blog httpsjbossdiverswordpresscom e membro ativo do

Grupo de Usuaacuterios JBoss do Brasil Hoje eacute Senior Java Software Engineer no Groupon Brasil Possui as certificaccedilotildees Red Hat

Certified JBoss Administrator on JBoss EAP 5 e JBoss EAP 6

Milhares de apli-

cativos para Web

e Mobile satildeo desenvol-

vidos a cada mecircs utili-

zando esta plataforma

como base A platafor-

ma Java mudou muito

desde seu iniacutecio e pro-

vavelmente vai conti-

nuar evoluindo nos

proacuteximos anos

A PROGRAMAR

28

Para o desenvolvimento de aplicaccedilotildees Web existem um sem

nuacutemero de frameworks gratuitas e mais ou menos bem con-

ceituadas Contudo temos vaacuterios problemas associados que

com o crescer de uma aplicaccedilatildeo podem trazer vaacuterios recuos

no seu desenvolvimento Um dos maiores eacute o oacutebvio satildeo

gratuitas e por isso mesmo o coacutedigo eacute lido por milhares de

pessoas em todo o mundo tornando as falhas de seguranccedila

bastante visiacuteveis e faacuteceis de explorar Outro grande proble-

ma eacute o facto de trazerem funcionalidades especiacuteficas em que

muitas vezes natildeo as usamos tornando-se em alguns casos

um ldquocanhatildeo para matar um mosquitordquo Pegando na aborda-

gem das correntes frameworks podemos noacutes proacuteprios cons-

truir algo soacutelido o suficiente para uma grande aplicaccedilatildeo

Vamos nesta seacuterie de trecircs artigos construir uma framework

passo-a-passo comeccedilando pelo baacutesico mas o mais importan-

te o routing

htaccess

Tirando partido do serviccedilo Apache delegamos o enclausura-

mento do nosso sistema de ficheiros agrave regras htaccess Natildeo

permitimos a listagem de ficheiros nem a execuccedilatildeo de outros

scripts PHP agrave excepccedilatildeo do indexphp sendo este o respon-

saacutevel pelo routing da framework Para garantirmos que estas

regras satildeo cumpridas e que o indexphp seja sempre chama-

do redireccionamos todos os pedidos de execuccedilatildeo de

scripts para o mesmo indexphp dando-lhe todos os argu-

mentos do URL originalmente fornecidos Desta forma o

utilizador natildeo sabe a que ficheiros ou pastas estaacute a aceder

A esta regra temos de adicionar uma excepccedilatildeo a pasta con-

tent onde temos todos os conteuacutedos como imagens ficheiros

CSS viacutedeos etc No fundo todos aqueles ficheiros que o

browser do utilizador vai descarregar Para mantermos o

enclausuramento da nossa aplicaccedilatildeo natildeo eacute aconselhado

natildeo colocarmos nessa pasta nenhum tipo de script visto que

pode ser executado arbitrariamente do exterior o contraacuterio

do que queremos

configphp

PHP Uma framework ldquofrom scratchrdquo (Parte 1) Usaremos este ficheiro como auxilio para definiccedilotildees de cami-

nhos para pastas e configuraccedilotildees por defeito

define(DS DIRECTORY_SEPARATOR)

Esta definiccedilatildeo eacute uma redundacircncia eacute definida simplesmente

por conveniecircncia na escrita do coacutedigo

define(BASE_PATHhttplocalhost)

Aqui definimos o caminho URL para a nossa aplicaccedilatildeo

define(DEFAULT_PAGEhello)

Esta eacute a nossa paacutegina por defeito caso nenhuma tenha sido

requirida

define(ROOT$_SERVER[DOCUMENT_ROOT])

Aqui eacute definido o caminho para a pasta da aplicaccedilatildeo

Uma vez definidas as configuraccedilotildees passamos agrave parte mais

importante o routing

Visto que temos todos os requests redireccionados para o

indexphp agora temos de fazer sentido dos argumentos

que satildeo passados pelo URL

Aqui separamos os argumentos em duas partes a paacutegina

que queremos aceder e os argumentos para esta paacutegina O

seguinte pedido

httplocalhosthellofoobar

resulta em

RewriteEngine on RewriteCond $1 ^(allowphp|indexphp|content) RewriteRule ^()$ indexphp$1 [L] ltFiles htaccessgt order allowdeny deny from all ltFilesgt

define(DS DIRECTORY_SEPARATOR) define(BASE_PATHhttplocalhost) define(DEFAULT_PAGEhello) define(ROOT$_SERVER[DOCUMENT_ROOT])

function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url

array (size=2) page =gt string hello (length=5) args =gt array (size=2) 0 =gt string foo (length=3) 1 =gt string bar (length=3)

A PROGRAMAR

29

(hellip)micro-

framework temos um

sistema de routing que

nos iraacute permitir nos

dois proacuteximos artigos

alargar os horizontes

passando a uma pro-

gramaccedilatildeo OOP e imple-

mentando MVC

De seguida encaminhamos para a paacutegina requerida

Aqui verificamos se a paacutegina que eacute pedida existe no case de

existir importamos o ficheiro caso contrario enviamos o header

de erro e terminamos a aplicaccedilatildeo

Indexphp

ROOT

Indexphp

Configphp

htaccess

Pages

Hellophp

Com esta micro-framework temos um sistema de routing que

nos iraacute permitir nos dois proacuteximos artigos alargar os horizon-

tes passando a uma programaccedilatildeo OOP e implementando

MVC Finalmente iremos implementar um pequeno driver

para MySQL e um debugger

Dependecircncias

Apache com mod_rewrite e PHP

P VS NP COMPREENDER O MAIOR PROBLEMA POR RESOLVER EM COMPUTACcedilAtildeO

function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

ltphp require_once (configphp) function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

callHook() gt

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

COLUNAS C - Observable vs Task

Visual (Not) Basic - Operator Overloading

C

32

Nas ediccedilotildees anteriores vimos como transformar uma API

baseada assiacutencrona em eventos numa API baseada em ob-

servaacuteveis (observables) ou numa API baseada em tarefas

A questatildeo que se levanta eacute quando usar qual

Quando Usar Observaacuteveis

A programaccedilatildeo baseada em observaacuteveis eacute tambeacutem conheci-

da como programaccedilatildeo reativa e comeccedilou a ser usada como

alternativa a assiacutencrona baseada em eventos porque a pro-

gramaccedilatildeo assiacutencrona baseada em tarefas ainda natildeo estava

disponiacutevel (ou natildeo estava disponiacutevel em todas as platafor-

mas)

Na verdade o campo de batalha da programaccedilatildeo reativa

satildeo as correntes de eventos (event streams) Eacute aqui que a

utilizaccedilatildeo de eventos se torna tambeacutem mais natural

Uma API baseada em eventos em que o evento apenas eacute

disparado uma vez eacute na verdade uma API baseada em

chamadas de resposta (callback) O facto de ser implemen-

tada com o mecanismo de eventos da plataforma NET natildeo

faz dela uma API baseada em eventos

A existecircncia da necessidade de combinar vaacuterias correntes de

eventos e relacionaacute-los entre si eacute tambeacutem uma boa indicaccedilatildeo

para a utilizaccedilatildeo de observaacuteveis

Quando Usar Tarefas

Como o nome indica uma tarefa eacute algo que tem um iniacutecio e

um fim Assim sendo todas as API assiacutencronoas baseadas

num mecanismo de chamada de resposta (callback) satildeo

candidatadas a ser transformadas numa API assiacutencrona

baseada em tarefas Mesmo que o mecanismo de chamada

de resposta sejam eventos NET

Matriz De Aplicabilidade

Baseando-nos nas consideraccedilotildees anteriores e porque nem

sempre tudo eacute assiacutencrono chegamos agrave seguinte matriz de

aplicabilidade

Conclusatildeo

No final natildeo existe uma resposta maacutegica O que numa situa-

ccedilatildeo pode ser um observaacutevel noutra pode ser uma tarefa

Recursos

O GeoCoordinateWatcher Como Um Serviccedilo Reativo - Re-

vista PROGRAMAR - 39ordf Ediccedilatildeo - Fevereiro 2013

Trazendo Async E Await ao Serviccedilo de Contactos do Win-

dows Phone - Revista PROGRAMAR - 40ordf Ediccedilatildeo - Abril

2013

Extensotildees Reativas (Rx)

Programaccedilatildeo assiacutencrona com async e await (C e Visual

Basic)

C - OBSERVABLE VS TASK

Siacutencrono Assiacutencrono

Um uacutenico valor - Tarefa

Muacuteltiplos valo-

res

Enumeraacutevel Observaacutevel

AUTOR

Escrito por Paulo Morgado

Bacharel em Engenharia Electroacutenica e Telecomunicaccedilotildees (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa

e Licenciado em Engenharia Informaacutetica pela Faculdade de Ciecircncias e Tecnologia da Universidade Nova de Lisboa exerce

variadas funccedilotildees relacionadas com o desenvolvimento distribuiccedilatildeo e manutenccedilatildeo de software haacute mais de 10 anos Participa

em diversas comunidades nacionais e internacionais (pontoNETpt NetPonto SharePointPT SQLPort Portugal-a-Programar

CodeProject CodePlex etc) Pelo seu contributo para com estas comunidades a Microsoft premeia-o com o preacutemio MVP

(C) desde 2003 Eacute ainda co-autor do livro ldquoLINQ Com Crdquo da FCA httpPauloMorgadoNET - PauloMorgado

o campo de bata-

lha da programaccedilatildeo re-

ativa satildeo as correntes

de eventos (event stre-

ams)

VISUAL (NOT) BASIC

33

ldquoNatildeo podes somar batatas com elefantesrdquo

Frases como a anterior ou semelhantes jaacute vos passaram

por a consideraccedilatildeo em alguma altura da vossa vida Quer

tenha sido nos vossos primeiros passos a matemaacutetica ou

ainda na semana passada em qualquer implementaccedilatildeo de

software mais rebuscada algueacutem algures transmitiu dessa

forma que natildeo eacute possiacutevel operar aquelas duas variaacuteveis

De facto batatas e elefantes natildeo satildeo tipicamente operaacuteveis

a menos que a resposta de que estamos agrave procura seja dife-

rente

Saber como operar

A soluccedilatildeo da soma de batatas com elefantes reside precisa-

mente na resposta que procuramos obter

Eu posso dizer que Elefante + Batata eacute igual a 4 se for es-

pecificado que a soma de seres-vivos opera aritmeticamente

o nuacutemero de pernas do ser Natildeo posso Claro que posso

Soacute precisamos de definir que os seres-vivos satildeo operaacuteveis

assim e de que forma Eacute aqui que entra o ldquooverloadrdquo de ope-

radores

Operadores

Operadores sim Quando se falam de operadores referem-

se todos aqueles que estatildeo provavelmente a passar-vos na

cabeccedila agora tanto unaacuterios como binaacuterios mas nem todos

Unaacuterios + - Not IsTrue IsFalse CType

Binaacuterios + - amp Like Mod And Or Xor ^ ltlt

gtgt = ltgt gt lt gt= lt=

Estes operadores fazem sentido nos usos comuns onde jaacute

sabemos para que servem e que resultados vatildeo surtir

Agrave luz da especificaccedilatildeo anterior podemos afirmar com segu-

ranccedila que Elefante gt Batata porque uma batata natildeo tem

pernas e porque conhecemos o operador gt (maior que)

A implementaccedilatildeo do operador pode basear-se em qualquer

aspecto dos seus operandos mas natildeo eacute boa ideia contradi-

zer a loacutegica do operador que se estaacute a definir Por razotildees

oacutebvias natildeo eacute boa ideia por exemplo implementar overloads

de tal forma que Batata - Elefante = -4 ao mesmo tempo que

Batata gt Elefante = TRUE Natildeo faz sentido porque natildeo esta-

mos a usar o mesmo criteacuterio Se Batata ndash Elefante eacute menor

que zero a Batata deveria ser menor que o Elefante e natildeo o

contraacuterio

Natildeo eacute que seja impossiacutevel mas vai tornar o coacutedigo muito

mais difiacutecil de ler o que vai contra a facilidade do overload

de operadores

Overload

A ideia natildeo eacute inventar novos operadores O que queremos

realmente indicar eacute qual o procedimento a seguir para conse-

guir aplicar o anaacutelogo do operador para determinado tipo ou

determinados tipos Assim o operador + por exemplo teraacute

de continuar a fazer sentido na aritmeacutetica ao mesmo tempo

que faz sentido na soma de seres-vivos se tentarmos somar

nuacutemeros entra o operador aritmeacutetico se tentarmos somar

batatas com elefantes entra a nossa implementaccedilatildeo do ope-

rador

Portanto e em tom de resumo da mesma forma que defini-

mos overloads de meacutetodos tambeacutem se definem overloads

de operadores com base na sua assinatura

Jaacute chega de elefantes e batatas natildeo

Efectivamente jaacute Natildeo conveacutem esticar a analogia ateacute porque

nem todos os operadores fazem sentido com uma classe de

seres vivos As coisas comeccedilam a ficar mais claras com

exemplos de implementaccedilatildeo

Vamos considerar a seguinte classe para exemplificar

Como seraacute de esperar se tentarmos por exemplo comparar

instacircncias desta classe o Visual Basic natildeo saberaacute o que

fazer para comparar Eacute um tipo composto que compreende

OPERATOR OVERLOADING

Public Class Veiculo Public Enum TipoVeiculo AUTOMOVEL MOTO PESADO End Enum Public Enum TipoCombustivel GASOLINA GASOLEO HIBRIDO ELECTRICO GPL End Enum Public Property Tipo As TipoVeiculo Public Property Marca As String Public Property Modelo As String Public Property Cilindrada As Integer Public Property Combustivel As TipoCombustivel Public Property NumeroPortas As Short Sub New(Tipo As TipoVeiculo Marca As String Modelo As String Cilindrada As Integer Combustivel As TipoCombustivel NumeroPortas As Short) _Tipo = Tipo _Marca = Marca _Modelo = Modelo _Cilindrada = Cilindrada _Combustivel = Combustivel _NumeroPortas = NumeroPortas End Sub End Class

VISUAL (NOT) BASIC

34

membros que noacutes mesmos criamos e seria impossiacutevel perce-

ber automaticamente quais as caracteriacutesticas a comparar

Este coacutedigo natildeo compila com dois erros em Carro1 = Carro2

e Carro2 = Carro3

Operator = is not defined for types OperatorOverloadVeicu-

lo and OperatorOverloadVeiculo

E tem toda a razatildeo O operador igual (=) natildeo estaacute nem im-

plementado na classe nem tem nenhum overload que im-

plique uma operaccedilatildeo binaacuteria com dois tipos Veiculo

Vamos entatildeo implementar um operador para o igual (=) que

consiga determinar se estamos na presenccedila do mesmo

veiacuteculo ou natildeo Vamos considerar que a cilindrada natildeo eacute um

factor para distinguir dois carros

Basta acrescentar os seguintes meacutetodos na classe Veiculo

Algumas implementaccedilotildees de operadores implicam que se

implementem tambeacutem a sua negaccedilatildeo No caso do operador

igual (=) eacute necessaacuterio natildeo soacute especificar o que eacute consider-

ado igual mas tambeacutem o que eacute considerado diferente

Assim o coacutedigo anterior jaacute eacute correctamente compilado e

produz o seguinte output

Carro1 = Carro2 False

Carro2 = Carro3 True

O que eacute verdade Como operaccedilotildees aritmeacuteticas natildeo faziam

muito sentido com uma classe a representar um veiacuteculo

vamos considerar esta nova classe

Esta classe representa um vector tridimensional Manteacutem um

valor para X para Y e para Z Natildeo adianta realizar

operaccedilotildees aritmeacuteticas com o Vector uma vez que novamen-

te o Visual Basic natildeo saberia o que fazer com ele

Vamos entatildeo acrescentar alguns operadores

Assim jaacute eacute possiacutevel efectuar algumas operaccedilotildees com esta

classe

OPERADOR LIKE

Public Shared Operator =(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return False If V1Combustivel ltgt V2Combustivel Then Return False If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return False If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return False If V1NumeroPortas ltgt V2NumeroPortas Then Return False Return True End Operator Public Shared Operator ltgt(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return True If V1Combustivel ltgt V2Combustivel Then Return True If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return True If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return True If V1NumeroPortas ltgt V2NumeroPortas Then Return True Return False End Operator

Public Class Vector3 Public Property X As Decimal Public Property Y As Decimal Public Property Z As Decimal Sub New(X As Decimal Y As Decimal Z As Decimal) _X = X _Y = Y _Z = Z End Sub Public Overrides Function ToString() As String Return StringFormat((012) _X _Y _Z) End Function End Class

Public Shared Operator +(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X + V1X V2Y + V1Y V2Z + V1Z) End Operator Public Shared Operator -(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X - V1X V2Y - V1Y V2Z - V1Z) End Operator Public Shared Operator (V1 As Vector3 V2 As Vector3) Return (V2X V1X) + (V2Y V1Y) + (V2Z V1Z) End Operator Public Shared Operator (V1 As Vector3 E1 As Decimal) Return New Vector3(E1 V1X E1 V1Y E1 V1Z) End Operator Public Shared Operator amp(S1 As String V1 As Vector3) Return S1 amp V1ToString End Operator

Dim V1 As New Vector3(3 2 1) Dim V2 As New Vector3(1 2 3) DebugWriteLine(Adiccedilatildeo amp (V1 + V2)) DebugWriteLine(Subtraccedilatildeo amp (V1 - V2)) DebugWriteLine(Produto escalar amp (V1 V2)) DebugWriteLine(Multiplicaccedilatildeo com escalar amp (V2 3))

Dim Carro1 As New Veiculo(AUTOMOVEL Ford Ka 1249 GASOLINA 3) Dim Carro2 As New Veiculo(AUTOMOVEL Ford Ka 1250 GASOLEO 3) Dim Carro3 As New Veiculo(AUTOMOVEL Ford Ka 1251 GASOLEO 3) DebugWriteLine(Carro1 = Carro2 amp (Carro1 = Carro2)) DebugWriteLine(Carro2 = Carro3 amp (Carro2 = Carro3))

VISUAL (NOT) BASIC

35

O que produz

Adiccedilatildeo (444)

Subtraccedilatildeo (-202)

Produto escalar 10

Multiplicaccedilatildeo com escalar (369)

Foi necessaacuterio especificar o operador de concatenaccedilatildeo para

que o Visual Basic saiba como tratar a concatenaccedilatildeo de uma

String com o resultado de uma outra operaccedilatildeo com a mesma

classe

Neste caso estamos apenas a concatenar a String com a

representaccedilatildeo String da classe que definimos anteriormen-

te Ao analisar os operadores podemos verificar que existem

dois overloads para a multiplicaccedilatildeo

Um implica dois vectores e o outro um vector e um decimal

A nossa implementaccedilatildeo dita que se forem fornecidos dois

vectores o resultado seraacute o produto escalar dos dois vec-

tores

Se for fornecido apenas um vector e um valor escalar o re-

sultado seraacute outro vector que representa o produto desse

vector com um escalar

Existe com certeza aplicaccedilotildees matemaacuteticas (e natildeo soacute) mais

interessantes mas as apresentadas demonstram a facilidade

com que implementamos os nossos proacuteprios comportamen-

tos de operadores

Conclusatildeo

Operator overloading permite uma notaccedilatildeo mais proacutexima do

domiacutenio alvo o que promove a legibilidade e dissipa duacutevidas

de interpretaccedilatildeo Esta eacute a sua maior vantagem

No entanto se as implementaccedilotildees natildeo forem de encontro ao

sentido natural dos operadores o efeito poderaacute ser o perfeito

contraacuterio

Eacute um caso tiacutepico de melhor amigo ou pior inimigo Natildeo haacute

meio-termo

OPERADOR LIKE

AUTOR

Escrito por Seacutergio Ribeiro

Curioso e autodidata com uma enorme paixatildeo por tecnologias de informaccedilatildeo e uma saudaacutevel relaccedilatildeo com a NET Fra-

mework Moderador global na comunidade PortugalProgramar desde Setembro de 2009 Alguns frutos do seu trabalho

podem ser encontrados em httpwwwsergioribeirocom

Operator overlo-

ading permite uma no-

taccedilatildeo mais proacutexima do

domiacutenio alvo

Media Partners da Revista PROGRAMAR

EVENTOS

37

No passado dia 25 de Maio de 2013 realizou-se na Microsoft

Portugal no Parque das Naccedilotildees o 1ordm evento presencial da

comunidade Portugal a Programar Ainda antes das 9h come-

ccedilaram a chegar os participantes crescia o entusiasmo envolto

em todo o evento e pouco a pouco todos noacutes fomos dando

cara aos nicks a que nos habituaacutemos ao longo dos anos

Pontualmente a organizaccedilatildeo deu iniacutecio ao evento PROGRA-

MAR 2013 com Jorge Paulino David Pintassilgo e Rui Gon-

ccedilalves a abrir o evento Brevemente foi-nos dada a conhecer

a comunidade PP assim como os quatro pontos-chave que

a caracterizam

Foacuterum PP

Wiki

Portal de Downloads

Revista Programar

Parafraseando o anfitriatildeo Jorge Paulino ldquoeste foi um projeto

que se iniciou a 28 de Maio de 2005 para dar resposta agrave ne-

cessidade de partilhar informaccedilatildeo e experiecircncias nesta aacutereardquo

Apoacutes a apresentaccedilatildeo do evento e da comunidade seguiu-se

um discurso inspirador de um dos oradores Rui Delgado

acerca da necessidade de se empreender em Portugal

Com o limite de inscriccedilotildees a ser atingido em apenas trecircs dias

o 1ordm evento do PP contou com a presenccedila de 19 oradores

voluntaacuterios que deram origem a 18 apresentaccedilotildees teacutecnicas e

a 2 workshops praacuteticos Cerca de 250 participantes estiveram

presentes no edifiacutecio da Microsoft Lisbon Experience

EVENTO PROGRAMAR 2013

EVENTOS

38

Pelas diversas salas do evento partilharam-se experiecircncias e

conhecimento As apresentaccedilotildees decorreram 3 em simultacirc-

neo e foram as seguintes

Apresentaccedilatildeo das novidades de Java EE 7 (Ernest

Duarte)

As novidades do C 50 (Paulo Morgado)

ASPNET SignalR ndash Comunicaccedilatildeo em real-time sim-

ples e para todo mundo (Glauco Godoi)

Conquistar o mundo com aplicaccedilotildees feitas agrave velocida-

de da luz (Ricardo Marques)

CRM Como escolher De raiz ou sistema jaacute desen-

volvido (Pedro Azevedo)

Desenvolvimento de Aplicaccedilotildees em Windows Phone 8

(Nuno Silva)

Desenvolvimento em SharePoint por onde comeccedilar

(Rodrigo Pinto)

Desenvolvimento raacutepido de siacutetios web com personali-

zaccedilatildeo de Joomla ( Rui Guimaratildees )

DMVs ndash Conhece o teu SQL Server (Vitor Pombeiro)

Empreendedorismo em TI (Fernando Martins)

HTML5 e CSS3 ndash raacutepido e eficaz para o presente

(Seacutergio Laranjeira)

Introduccedilatildeo ao Cloud Computing e ao Windows Azure

(Vitor Tomaz)

Microsoft Kinect SDK (Rui Simatildeo)

Plataforma de desenvolvimento para Windows Store

Apps (Nuno Silva)

Powershell agrave minha maneira (Bruno Lopes)

O desenvolvimento de aplicaccedilotildees moacuteveis antes da 1ordf

linha de coacutedigo (Alberto Silva)

SEO ndash A importacircncia do Search Engine Optimization

(Miguel Lobato)

SQL Server ndash Performance e Tunning (Pedro Martins)

E ainda os workshops praacuteticos

Workshop ndash Integraccedilatildeo de CRM Dynamics com Java

e NET (Pedro Azevedo)

Workshop ndash Web em Realtime (Seacutergio Costa)

EVENTOS

39

Durante o decorrer das sessotildees houve ainda oferta de brindes

(gentilmente oferecidos pelos patrocinadores) aos participan-

tes

Outro ponto que marcou este PROGRAMAR 2013 foi o con-

curso de aplicaccedilotildees Windows Phone e Windows 8 vencido

por Jorge Costa com o jogo ldquoLittle Bitsrdquo sendo o segundo

lugar atribuiacutedo a Mauro Castro pela aplicaccedilatildeo ldquoPortugalrsquos Eve-

ningsrdquo

Houve ainda demostraccedilotildees do Microsoft Kinect (Rui Simatildeo) e

do Leap Motion (Diniz Vieira) a todos os participantes interes-

sados e todo o dia foi passado num espiacuterito descontraiacutedo e

animado aumentando assim os laccedilos entre toda a comunida-

de

A toda a organizaccedilatildeo e a todos os oradores envolvidos dei-

xamos um agradecimento especial agradecendo tambeacutem a

todos os patrocinadores nomeadamente a Microsoft Portugal

ESET Portugal FCA Editora Rumos e Truewind-Chiron Nun-

ca deixando de referir tambeacutem os Media Parters que ajuda-

ram a toda a divulgaccedilatildeo deste evento

A todos os elementos da comunidade que fazem com que a

Portugal-a-Programar seja cada vez mais conhecida no nosso

paiacutes e aleacutem-fronteiras a todos deixamos um ldquoMuito Obriga-

dordquo relembrando mais uma vez que este eacute um projeto de to-

dos e para todos e que a mais pequena accedilatildeo pode fazer a

diferenccedila

Eacute com satisfaccedilatildeo e orgulho que podemos afirmar que o 1ordm

Evento Presencial do PP foi um sucesso pois mesmo apoacutes

as sessotildees terem terminado houve ainda quem se mantives-

se no local partilhando experiecircncias de um dia cheio de emo-

ccedilotildees

E citando um dos oradores do evento Rui Delgado ldquoOh Yes

Muito Bomrdquohellip Venha o PROGRAMAR 2014

Paacutegina do evento httpeventoportugal-a-programarpt

(hellip) a mais peque-

na accedilatildeo pode fazer a

diferenccedila

Anaacutelises Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

C 50 com Visual Studio 2012

Review

41

Tiacutetulo Android ndash Introduccedilatildeo ao Desenvol-

vimento de Aplicaccedilotildees

Autor Ricardo Queiroacutes

Editora FCA

Paacuteginas 224

ISBN 978-972-722-763-1

O Android tornou-se na plataforma de dispositivos moacuteveis

mais usada no mundo e como tal existe um interesse cres-

cente dos programadores em criarem soluccedilotildees para esse

mercado Para quem queira dar aquele 1ordm passo no desen-

volvimento de aplicaccedilatildeo em Android o livro ldquoAndroid - Intro-

duccedilatildeo ao desenvolvimento de aplicaccedilotildeesrdquo de Ricardo Quei-

roacutes eacute uma boa escolha

Conteacutem passo a passo desde a configuraccedilatildeo do ambiente

de desenvolvimento ateacute agrave concepccedilatildeo de uma aplicaccedilatildeo para

Android na sua iacutentegra Destaca exemplos muito uacuteteis que

podem ser reaproveitados noutra aplicaccedilatildeo pois contempla

o desenho de uma interface graacutefica a gestatildeo de dados da

aplicaccedilatildeo atraveacutes de gestatildeo de ficheiros ou bases de dados

utilizaccedilatildeo de APIs de localizaccedilatildeo mapas e sensores e a

criaccedilatildeo do jogo do galo

Durante a sua leitura pode-se constatar que eacute um livro rico

em imagens explicativas e exemplificativas que nos ajudam

a perceber o que devemos fazer e o que devemos alcanccedilar

com a construccedilatildeo de todo o coacutedigo escrito

Infelizmente jaacute eacute habitual que nos sejam apresentados os

tiacutepicos tons acinzentados das ilustraccedilotildees e a ausecircncia de

qualquer tipo de realce de sintaxe no coacutedigo-exemplo o que

por vezes pode-se tornar cansativo ao olhar

Um factor alheio ao autor do livro mas que a editora em

causa deveria ter em consideraccedilatildeo por forma a facilitar a

leitura

ldquoAndroid ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildeesrdquo

de Ricardo Queiroacutes eacute um bom livro para quem jaacute tenha algu-

ma experiecircncia em programaccedilatildeo Java e que queira explorar

as potencialidades do Android

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

(hellip) destaca exem-

plos muito uacuteteis que

podem ser reaproveita-

dos noutra aplicaccedilatildeo

(hellip)

Review

42

Tiacutetulo C 50 com Visual Studio 2012

Autor Henrique Loureiro

Editora FCA

Paacuteginas 608

ISBN 978-972-722-752-5

Elementos de programaccedilatildeo

Abordam-se os temas de programaccedilatildeo mais elementar com

referecircncias agrave programaccedilatildeo iterativa passando pela orientada

a objecto O texto estaacute nitidamente orientado para um puacutebli-

co que tem noccedilotildees baacutesicas de programaccedilatildeo explicando a

loacutegica de uma funccedilatildeo ateacute agrave heranccedila de classes Tenta de

uma forma sucinta demonstrar na praacutetica ou seja com code-

snipets como construir de uma forma coerente uma aplica-

ccedilatildeo em C recorrendo ao Visual Studio

Usabilidade - Eacute tambeacutem abordada a importacircncia da usabili-

dade do user-interface numa qualquer aplicaccedilatildeo Satildeo de-

monstrados os conceitos baacutesicos de Interaccedilatildeo Homem-

Maacutequina e como aplica-los aos Windows Forms Este tema

serve de ponte para um tema bem mais extensivo Windows

Forms e programaccedilatildeo orientada agrave GUI detalhando alguns

dos componentes que a NET traz buit-in Explica a funciona-

lidade e a interecccedilatildeo com os componentes mais genericas e

mais usuais para uma aplicaccedilatildeo que se use de um sistema

de janelas como GUI A explicaccedilatildeo embora limitada a pou-

cos elementos eacute bastante completa dando ecircnfase aos

events associados a este tipo de modulos explicando assim

a programaccedilatildeo assiacutencrona em Windows Forms

Modelaccedilatildeo de dados e LINQ - Temos uma explicaccedilatildeo

bottom-to-top da noccedilatildeo de modelaccedilatildeo de dados Sendo nes-

te tema um pouco mais extenso explicando toda a noccedilatildeo da

Modelaccedilatildeo e das Formas Normais Recorre-se ao SQL Ser-

ver para fazer toda a explicaccedilatildeo na praacutetica dos conceitos

sendo bastante ilustrativo com diagramas e screenshots de

um processo de criaccedilatildeo e normalizaccedilatildeo de uma base de

dados Tendo a base de dados criada no SQL Sever passa

agrave explicaccedilatildeo do que eacute o LINQ e sua sintaxe em C Aqui eacute

feita mais uma vez a ponte com Windows Froms utilizando

componentes anteriormente demonstrados mapeando tabe-

las e manipulaccedilotildees baacutesicas Outra vez grande ecircnfase aos

events

C 50 com Visual Studio 2012

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

Sistema Operativo e Input Output Comeccedilando pela base

expotildee passo-a-passo como manipular as Tarefas e Proces-

sos do Windows explicando tambeacutem como colmatar as dife-

renccedilas entre versotildees do sistema operativo Daacute exemplos de

como manipular ficheiros de texto dando uma introduccedilatildeo agrave

encriptaccedilatildeo que vem built-in na NET Mostra como se usa o

Graphics da NET explicando os seus conceitos base dese-

nho e animaccedilatildeo chegando a agrave impressatildeo destes mesmos

graacuteficos desenhados Com este tema aprofunda a explicaccedilatildeo

dos Windows Forms fazendo a ponte para WPF

WPF XML e XAML - Tendo explicado Windows Forms pas-

sa agrave explicaccedilatildeo das diferenccedilas e semelhanccedilas do mesmo

com WPF dando tambeacutem a sua opiniatildeo sobre o futuro das

mesmas dando a entender que WPF iraacute substituir Windows

Forms eventualmente Para o efeito comeccedila por explicar o

que eacute XML dando exemplos de aplicaccedilotildees em C NET para

manipulaccedilatildeo deste tipo de dados passando para um niacutevel

acima o XAML Exemplo atraacutes de exemplo demonstra como

usar as potencialidade do WPF mostrando como usar

Graphics com a sintaxe XAML incluindo animaccedilatildeo

WebViews views modelares e navegaccedilatildeo entre diferentes

ecratildes numa soacute janela

Integraccedilatildeo com Microsoft Office e Windows Store - Eacute

tambeacutem mostrada a facilidade com que se integra uma apli-

caccedilatildeo feita em C comas a principais ferramentas do MS

Office Word Excel PowerPoint Access e Outlook Demons-

tra agrave semelhanccedila de outras ferramentas Microsoft que haacute

sempre uma Class buit-in na NET para criar e manipular

este tipo de documentos da famiacutelia Microsoft No caso da

Windows Store daacute exemplos vocacionados para Windows 8

e como tirar partido do conceito visual Metro e seus layouts

geneacutericos fazendo aplicaccedilotildees como uma calculadora e uma

WebView

Opiniatildeo pessoal - Na minha opiniatildeo este livro eacute ideal no

mundo acadeacutemico servindo perfeitamente como suporte a

um professor para leccionar uma cadeira de programaccedilatildeo

OOP ou ateacute para programaccedilatildeo 2D Tambeacutem natildeo acharia

descabido servir como suporte a um aluno para evoluir da

programaccedilatildeo iterativa para OOP visto que o livro estaacute repleto

de exemplos e exerciacutecios tendo ateacute no final 3 projectos from

scratch de aplicaccedilotildees completas explicando todo o processo

loacutegico na elaboraccedilatildeo de todos os aspectos da mesma de

base de dados normalizada interacccedilatildeo Homem-Maacutequina a

comercializaccedilatildeo na Windows Store

COMUNIDADES Comunidade NetPonto mdash Telerik RadControls - Raacutepida implementaccedilatildeo da

paacutegina Sobre para Windows Phone Apps

COMUNIDADE NETPONTO

44

httpnetpontoorg

Introduccedilatildeo

A Telerik RadControls disponibiliza um projeto template que

permite escolher um conjunto de funcionalidade que seratildeo

incluida no projeto aquando da sua criaccedilatildeo A paacutegina

Sobre eacute uma delas

Truque A Telerik oferece uma versatildeo de teste que permite

explorar os controlos O programa Nokia Premium Developer

permite aos seus membros terem uma licenccedila vaacutelida destes

Ecratildes

Para compreender melhor o que iremos fazer primeiro

iremos criar a paacutegina Sobre que eacute fornecida pelo projeto

template da Telerik cujo resultado eacute

Paacutegina Sobre gerada por omissatildeo pelo projeto template da Telerik

Depois iremos customizar a paacutegina para que esta tenha a

sua proacutepria informaccedilatildeo o resultado seraacute

Customizaccedilatildeo da paacutegina Sobre

Criaccedilatildeo do projeto

Para comeccedilar o projeto eacute recomendado que se instale os

Telerik RadControls (versatildeo de teste)

1 Seleccedilatildeo do projeto que se iraacute criar

Criando o projeto

2 A Telerik tem uma interface para a seleccedilatildeo inicial

Selecione a plataforma e referecircncias da Telerik que

queremos

Selecionando a plataforma e as referecircncias

3 Seleccedilatildeo da funcionalidade paacutegina Sobre

Quando o projeto eacute criado iremos obter a paacutegina por omissatildeo

podemos ver nos ecratildes

TELERIK RADCONTROLS - RAacutePIDA IMPLEMENTACcedilAtildeO DA PAacuteGINA SOBRE PARA WINDOWS PHONE APPS

COMUNIDADE NETPONTO

45

httpnetpontoorg

O resultado da estrutura do projeto seraacute

Customizaccedilatildeo

Comecemos por analisar a paacutegina Home Page

Cujo XAML eacute

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleMainPage xmlns=http schemasmicrosoftcomwinfx2006xaml presentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg

markup-compatibility2006 xmlnsphone= clr-namespaceMicrosoftPhone Controlsassembly=MicrosoftPhone xmlnsshell= clr-namespaceMicrosoft PhoneShellassembly=MicrosoftPhone FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation=Portrait SupportedOrientations=Portrait shellSystemTrayIsVisible=True mcIgnorable=dgt lt-- LayoutRoot is the root grid where all page content is placed --gt ltGrid xName=LayoutRoot Background=Transparentgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt lt-- LOCALIZATION NOTE To localize the displayed strings copy their val-ues to appropriately named keys in the apps neutral language resource file (AppResourcesresx) then replace the hard-coded text value between the attributes quotation marks with the binding clause whose path points to that string name For example Text=Binding Path=LocalizedResourcesApplicationTitle Source=StaticResource LocalizedStrings This binding points to the templates string resource named ApplicationTitle Adding supported languages in the Project Properties tab will create a new resx file per language that can

COMUNIDADE NETPONTO

46

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

carry the translated values of your UI strings The binding in these examples will cause the value of the attributes to be drawn from the resx file that matches the CurrentUICulture of the app at run time --gt lt-- TitlePanel contains the name of the application and page title --gt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=MY APPLICATION gt ltTextBlock xName=PageTitle Margin=9-700 Style=StaticResource PhoneTextTitle1Style Text=page name gt ltStackPanelgt lt-- ContentPanel - place additional content here --gt ltGrid xName=ContentPanel GridRow=1 Margin=120120gt ltListBox Margin=140-120 FontFamily=StaticResource PhoneFontFamilySemiLight FontSize=StaticResource PhoneFontSizeExtraLargegt ltListBoxItem Content=About Tap=GoToAbout gt ltListBoxgt ltGridgt lt-- Uncomment to see an alignment grid to help ensure your controls are aligned on common bound-aries The image has a top margin of -32px to account for the System Tray Set this to 0 (or remove the margin altogether) if the System Tray is hidden Before shipping remove this XAML and the image itself--gt lt-- ltImage Source=AssetsAlignmentGridpng VerticalAlignment=Top Height=800 Width=480 Margin=0 GridRow=0 GridRowSpan=2 IsHit-TestVisible=False gt --gt ltGridgt lt-- Sample code showing usage of ApplicationBar -

-gt ltphonePhoneApplicationPageApplicationBargt ltshellApplicationBar IsMenuEnabled=True IsVisible=Truegt ltshellApplicationBarIconButton IconUri=Imagesappbar_button1png Text=Button 1 gt ltshellApplicationBarIconButton IconUri=Imagesappbar_button2png Text=Button 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBarMenuItem Text=MenuItem 1 gt ltshellApplicationBarMenuItem Text=MenuItem 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBargt ltphonePhoneApplicationPageApplicationBargt ltphonePhoneApplicationPagegt Para navegar para a paacutegina Sobre eacute necessaacuterio clicar na palavra About (tap gesture) o coacutedigo referente eacute ltListBoxItem Content=About Tap=GoToAbout gt E em code behind iremos ter ltsummarygt Navigates to about page ltsummarygt private void GoToAbout(object sender GestureEventArgs e) thisNavigationServiceNavigate(new Uri(Aboutxaml UriKindRelativeOrAbsolute)) Por fim a paacutegina AboutPage seraacute O coacutedigo XAML seraacute ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleAbout xmlns=httpschemasmicrosoftcomwinfx2006xamlpresentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg markup-compatibility2006 xmlnsphone=clr-namespace MicrosoftPhoneControlsassembly=MicrosoftPhone xmlnsshell=clr-namespace

COMUNIDADE NETPONTO

47

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

E o code behind

MicrosoftPhoneShellassembly=MicrosoftPhone xmlnsviewModels=clr-namespace NokiaDevRadControlsSampleViewModels Name=Root FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation= Portrait SupportedOrientations=Portrait dDesignHeight=768 dDesignWidth=480 shellSystemTrayIsVisible=True mcIgnorable=dgt ltGrid xName=LayoutRoot Background=Transparentgt ltGridDataContextgt ltviewModelsCommandSampleViewModel gt ltGridDataContextgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=APP TITLE gt ltTextBlock xName=PageTitle Margin=9-700 Style= StaticResource PhoneTextTitle1Style Text=about gt ltStackPanelgt ltGrid xName=ContentPanel GridRowSpan=2 Margin=12160121gt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition gt ltGridRowDefinitionsgt ltStackPanelgt ltTextBlock Margin=120120 FontFamily= StaticResource PhoneFontFamilySemiBold FontSize= StaticResource PhoneFontSizeLarge Text=Binding ApplicationName ElementName=Root gt ltStackPanel Orientation=Horizontalgt ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Version number gt

ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Binding Version ElementName =Root gt ltStackPanelgt ltStackPanelgt ltTextBlock GridRow=1 Margin=12241224 FontSize=StaticResource PhoneFontSizeNormal Foreground=StaticResource PhoneSubtleBrush TextWrapping=Wrapgt This application show an About page sample for Windows Phone applications ltLineBreak gt See more about it please see the following referenceampquot ltTextBlockgt ltHyperlinkButton GridRow=2 Margin=01200 HorizontalAlignment=Left Command=Binding SendAnEmailCommand Content=technical supportfeedback email FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltHyperlinkButton GridRow=3 Margin=01200 HorizontalAlignment=Left Command=Binding RateThisAppCommand Content=rate this app FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltStackPanel GridRow=4 Margin=1201250 VerticalAlignment= Bottomgt ltImage HorizontalAlignment=Left Source=Images CompanyLogopng Stretch=None gt ltTextBlock Margin=01200 FontSize= StaticResource PhoneFontSizeNormal Text=Copyright (c) 2013 Nokia Developer Wiki gt ltTextBlock FontSize= StaticResource PhoneFontSizeNormal Text=Nokia gt ltStackPanelgt ltGridgt ltGridgt ltphonePhoneApplicationPagegt

public partial class About INotifyPropertyChanged

COMUNIDADE NETPONTO

48

httpnetpontoorg

Nota O exemplo natildeo implementa o padratildeo MVVM mas

poderia

Usa a classe ApplicationManifest do (Cimbalino toolkit - cujo

coacutedigo fornte eacute este)

Usa a classe SendAnEmailCommand que eacute a implementaccedilatildeo

do ICommand e tem como finalidade enviar emails Sendo

utilizado na opccedilatildeo de suporte feedback

Usa a classe RateThisAppCommand que eacute a implementaccedilatildeo

do ICommand e serve para avaliar a aplicaccedilatildeo

Truque Se pretende um exemplo mais avanccedilado consulte o

artigo Paacutegina avanccedilada Sobre para aplicaccedilotildees de Windows

Phone

Referecircncias

Online Help ou download CHM (ZIP 14MB) ()

Telerik Examples - Windows Phone Application ()

Telerik RadControls for Windows Phone ()

Join Nokia Premium Developer Program and get RadControls

for free ()

() Artigos disponiacuteveis apenas em Inglecircs

Em conclusatildeo podemos concluir que existe vaacuterias formas de

implementar numa aplicaccedilatildeo da Windows Phone uma

paacutegina ldquoSobrerdquo ou ldquoAcercardquo sendo um processo que se pode

minimizar e enriquece a aplicaccedilatildeo

Este artigo foi originalmente escrito para a comunidade

Nokia Developer mais especificamente para a Wiki Paacutegina

Acerca de para aplicaccedilotildees de Windows Phone

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltsummarygt The application manifest ltsummarygt private readonly ApplicationManifest _applicationManifest ltsummarygt Initializes a new instance of the ltsee cref=Aboutgt class ltsummarygt public About() InitializeComponent() class that helps to get the application name and version (that is defined in manifest) var applicationManifestService = new ApplicationManifestService() _applicationManifest = applicationManifestService GetApplicationManifest() ltsummarygt The property changed ltsummarygt public event PropertyChangedEventHandler PropertyChanged ltsummarygt Gets the application name ltsummarygt public string ApplicationName get if (_applicationManifest = null) return _applicationManifestAppTitle return ND ltsummarygt Gets the version ltsummarygt public string Version get if (_applicationManifest = null) return _applicationManifestAppVersion return ND ltsummarygt

The on property changed ltsummarygt ltparam name=propertyNamegt The property name ltparamgt protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null) var handler = PropertyChanged if (handler = null) handler(this new PropertyChangedEventArgs(propertyName))

AUTOR

Escrito Por Sara Silva

eacute licenciada em Matemaacutetica ndash Especialidade em Computaccedilatildeo pela Universidade de Coimbra e eacute Microsoft Certified Pro-

fissional Developer Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps O

seu Blog eacute wwwsaramgsilvacom e o twitter eacute saramgsilva

No Code Game Salad

No Code

50

ldquoNuma altura em que as aplicaccedilotildees estatildeo a dominar em

forccedila torna-se imperativo saber programarhelliprdquo E o leitor

tambeacutem tem esta opiniatildeo

Ora neste artigo esta eacute uma ideia que vamos deixar por

terra Se o leitor eacute algueacutem que gosta e se interessa pelo

mundo dos pequenos jogos e por novas tecnologias mas que

natildeo se sente agrave vontade no mundo da programaccedilatildeo pode (e

deve) experimentar o GameSalad Mas por outro lado

mesmo sendo um programador experiente o uso desta

ferramenta pode tambeacutem ajudar bastante

A GameSalad Inc eacute uma empresa norte-americana que

desenvolve ferramentas web para a criaccedilatildeo de pequenos

jogos Fundada em 2007 com o nome de Gendai Games em

2009 lanccedilou o GameSalad Creator e em 2010 mudou

oficialmente o seu nome passando chamar-se GameSalad

O importante para os criadores desta tecnologia eacute a

conceccedilatildeo de uma ideia O Game Salad Creator eacute

principalmente direcionado aos utilizadores que natildeo tecircm

bases em programaccedilatildeo permitindo que qualquer pessoa

possa fazer o seu proacuteprio jogo 2D para plataformas moacuteveis

IOS Android ou jogos HTLM5 para browsers Com uma

interface limpa e relativamente simples este software utiliza

o sistema ldquodrag-and-droprdquo para desenvolver os seus jogos

ou seja desde que tenhamos uma ideia em mente podemos

facilmente pocirc-la em praacutetica arrastando os componentes da

mesma para o ldquopalco de jogordquo

Assim facilmente o leitor pode definir as imagens de fundo

das vaacuterias cenas que compotildeem o jogo e todos os

intervenientes dessas cenas satildeo chamados ldquoAtoresrdquo em que

o comportamento destes ldquoAtoresrdquo eacute definido por regras de

jogo (eventos) que o proacuteprio utilizador define Eacute tudo uma

questatildeo de loacutegica e eacute o utilizador que define essa loacutegica Por

exemplo podemos definir eventos especiacuteficos como colisotildees

e definir o que o ldquoatorrdquo deve fazer quando ocorre uma

colisatildeo isto eacute se deve mudar de rumo e perder pontos ou se

deve ser destruiacutedo perdendo uma vida por exemplo Tudo

se baseia na nossa escolha

Podemos tambeacutem adicionar a banda sonora a nosso gosto e

para verificar o comportamento real da nossa aplicaccedilatildeo

basta-nos apenas recorrer ao simulador que o GameSalad

Creator nos disponibiliza Natildeo precisamos de ter o

equipamento real para o qual estamos a projetar o nosso

jogo

O site principal deste projeto wwwgamesaladcom em pouco

tempo atingiu milhares de utilizadores um pouco por todo o

mundo Inicialmente projetado para desenvolver aplicaccedilotildees

apenas para dispositivos Apple hoje em dia eacute tambeacutem

possiacutevel fazer o download da versatildeo Windows A versatildeo

base eacute gratuita e permite a qualquer interessado publicar os

seus jogos para a versatildeo web e para a versatildeo MAC Caso

prefira a versatildeo paga o GameSalad Creator Pro permite tudo

isto e tambeacutem publicar os seus projetos para a plataforma

Android e para o Windows 8 aleacutem de outros extras Caso

opte por ter uma conta premium pode ainda publicar no

mercado de aplicaccedilotildees escolhendo se quer disponibilizar

gratuitamente o seu jogo ou natildeo Caso opte disponibilizar

uma versatildeo paga do jogo que desenvolveu o utilizador tem

direito a 70 do ganho obtido pelo seu jogo

Este projeto tem tambeacutem atraveacutes do proacuteprio site uma grande

comunidade de utilizadores que partilham ideias e

experiecircncias ajudando-se mutuamente em vaacuterios projetos

Tem uma ideia para um jogo Entatildeo estaacute na altura de a por

em praacutetica Saber programar deixou de ser um requisito com

a ajuda do GameSalad Creator aproveite e decirc largas agrave

imaginaccedilatildeo

Game Salad

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

Elege o melhor artigo desta ediccedilatildeo

Revista PROGRAMAR httptinyccProgramarED41_V

No Code

52

Esta foi a aplicaccedilatildeo vencedora do concurso de aplicaccedilotildees

que se realizou no 1ordm Evento Presencial da Comunidade

Portugal-a-Programar Trata-se de um jogo para Windows

Phone 7x e 8 bastante interessante e ateacute ldquovicianterdquo para

quem gosta de jogos do tipo puzzle

Os pequenos Bits estatildeo em perigo e soacute vocecirc pode ajudaacute-los

Bits satildeo uma espeacutecie muito especial de aves encontradas

em uma ilha remota E eles precisam chegar ao seu ninho

a fim de criar seus filhos Mas os bits das Trevas estatildeo com

ciuacutemes e vatildeo tentar tudo ao seu alcance para impedir os Bits

de chegar ao ninho

Bits eacute um jogo de quebra-cabeccedilas fantaacutestico onde vocecirc tem

de combinar habilidade com sorte para ajudar os Bits a

sobreviver Combine trecircs Bits da mesma cor para ganhar

pontos enquanto os Bits prestos ldquoevilrdquo tentam detecirc-los Os

ldquoAnjos Bitsrdquo (brancos) podem salvar os Bits de cor destruindo

os Bits Pretos proacuteximos

PROJECTO EM DESTAQUE NA COMUNIDADE PP LITTLE BITS

PASSATEMPO

DESENVOLVIMENTO

WINDOWS 8

A comunidade Portugal a Programar com o apoio da Microsoft estaacute a criar um passatempo de desen-

volvimento de aplicaccedilotildees para Windows 8 exclusivamente para membros registados na comunidade

Desenvolve uma ou mais aplicaccedilotildees para o Windows 8 e ganha fantaacutesticos preacutemios

1 MOCHILA APP ME UP PARA TODOS os que publiquem uma App na Windows 8 Store

2 TELEFONES NOKIA LUMIA 820 (Dev Edition) para os primeiros 2 a publicarem 3 Apps na

Windows 8 Store

1 TABLET ASUS ME400C para a melhor App publicada e 1 NOKIA LUMIA 820 para a segun-

da melhor aplicaccedilatildeo

Satildeo vaacutelidas apenas aplicaccedilotildees publicadas entre 1 e 30 de Junho de 2013

Todos os estudantes tecircm acesso gratuito agrave Windows Store atraveacutes do programa DreamSpark e por is-

so natildeo haacute motivos para natildeo concorrer Mais informaccedilotildees e candidaturas atraveacutes do email passatem-

posportugal-a-programarpt

Alguns recursos interessantes para iniciar

Windows 8 Store Apps - Do sonho agrave realidade (revista PROGRAMAR)

Microsoft DreamSpark Windows 8 Apps development

Windows App (MSDN)

O staff da comunidade seraacute o juacuteri que iraacute escolher a melhor aplicaccedilatildeo a concurso e o vencedor seraacute divul-

gado na primeira quinzena de Julho Para atribuiccedilatildeo do Tablet Asus ME400C eacute necessaacuterio existirem no

miacutenimo 3 aplicaccedilotildees a concurso Qualquer caso omisso seraacute resolvido pelo staff da comunidade natildeo sen-

do passiacutevel de recurso e o juri iraacute rever e validar todas as aplicaccedilotildees de modo a que tenham um minimo de

qualidade e originalidade

Veja tambeacutem as ediccedilotildees anteriores da Revista PROGRAMAR

e muito mais em hellip wwwrevista-programarinfo

34

ordf Ed

iccedilatilde

o - A

bril 2

01

2

35

ordf Ed

iccedilatilde

o - J

un

ho

201

2

36

ordf Ed

iccedilatilde

o - A

go

sto

20

12

37

ordf Ed

iccedilatilde

o - O

utu

bro

20

12

38

ordf Ed

iccedilatilde

o - D

ezem

bro

20

12

39

ordf Ed

iccedilatilde

o - F

eve

reiro

20

13

Page 2: Revista Programar 41

IacuteNDICE

3

TEMA DE CAPA

Introduccedilatildeo ao Java EE e Java Web (Joseacute Marques)

A PROGRAMAR

COLUNAS

EVENTOS

20 de Junho XXXVI Encontro da Comunidade SQLPort

22 de Junho 39ordf Reuniatildeo Presencial da Comunidade NetPonto em Lisboa

21 e 22 Junho Agile amp Scrum Portugal 2013

11 a 22 Junho CISTI 2013 - 8ordf Conferecircncia Ibeacuterica de Sistemas e Tecnologias de Informaccedilatildeo

Para mais informaccedilotildeeseventos httpbitlyPAP_Eventos Divulga os teus eventos para o email eventosportugal-a-programarpt

Programaccedilatildeo em C const (Antoacutenio Pedro Cunha)

Jogo da Vida (Rita Peres)

JBoss Aplication Server 7 (Mauricio Magnani Jr )

PHP Uma framework ldquofrom scratchrdquo (Parte 1) (Ricardo Perre)

C - Observable vs Task (Paulo Morgado)

Visual(not)Basic - Operator Overloading (Seacutergio Ribeiro)

7

22

COMUNIDADES

NetPonto - Telerik RadControls - Raacutepida implementaccedilatildeo da paacutegina Sobre para Windows Phone Apps (Sara Silva)

48

52

39

24

34

ANAacuteLISES

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees (Joseacute Marques)

C 50 com Visual Studio 2012 (Ricardo Perre) 49

NO CODE

Game Salad (Rita Peres)

Projecto em Destaque na Comunidade PP Little Bits

65

74

42

EVENTOS

I Evento Presencial Programar 46

34

NOTICIAS

4

ARM desenvolve chip anti-piratria

A ARM anunciou o lanccedilamento de um chip anti-pirataria que

vai permitir controlar a utilizaccedilatildeo indevida de conteuacutedos prote-

gidos por direitos de autor

A novidade eacute o resultado de uma parceria com Hollywood

que pretende prevenir a pirataria nos conteuacutedos de viacutedeo em

alta definiccedilatildeo numa proacutexima geraccedilatildeo de smartphones e ta-

blets Vai agir de forma complementar agraves tecnologias de Digi-

tal Rights Management ao niacutevel do hardware

O Mali V500 vai tirar partido da tecnologia TrustZone que a

fabricante britacircnica usa jaacute haacute vaacuterios anos como mecanismo de

seguranccedila para transaccedilotildees e software mas que aqui seraacute

utilizada pela primeira vez com o objetivo de prevenir a utiliza-

ccedilatildeo de conteuacutedos protegidos por direitos de autor

A disponibilizaccedilatildeo de conteuacutedos multimeacutedia de alta definiccedilatildeo

em sistemas moacuteveis tem sido endereccedilada com algumas reti-

cecircncias pelos detentores de direitos sobre esses conteuacutedos

que natildeo encontram grandes mecanismos de seguranccedila nes-

sas plataformas sobretudo no que se refere aos sistemas

operativos moacuteveis de coacutedigo aberto como eacute o caso do An-

droid

Citada pelo Financial Times a ARM defende que a sua tecno-

logia seraacute especialmente uacutetil em paiacuteses como a China onde a

induacutestria consegue fazer um niacutevel miacutenimo de receitas com os

filmes depois destes saiacuterem das salas de cinema

Na Computex a ARM lanccedilou ainda o Cortex A12 um proces-

sador dirigido ao mercado de gama meacutedia desenvolvido a 28

nanoacutemetros A fabricante garante que o chip assegura melho-

rias de 40 ao niacutevel da performance face ao antecessor Cor-

tex A9

Tambeacutem a Intel aproveitou a feira asiaacutetica para apresentar

uma nova geraccedilatildeo de processadores Core i3 i5 e i7 A efici-

ecircncia energeacutetica garante a fabricante eacute o incremento mais

relevante nesta nova geraccedilatildeo de chips

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

A tecnoloacutegica portuguesa quer democratizar o ensino e coloca

a figura do professor como agente principal do objetivo O Kit

Inspired Teacher eacute uma escola ambulante

A JP Inspiring Knowledge empresa responsaacutevel pelos com-

putadores Magalhatildees estaacute a lanccedilar em vaacuterios mercados inter-

nacionais um kit portaacutetil de ensino que se destina aos profes-

sores O conjunto eacute composto por um computador por um

rato com capacidade de digitalizaccedilatildeo por um projetor de pe-

quenas dimensotildees e por um quadro digital que torna qualquer

superfiacutecie plana num ambiente de trabalho

Todos os dispositivos podem ser guardados numa mala trolley

resistente a choques e a aacutegua sistema que reforccedila o caraacuteter

de mobilidade do kit de ensino

O Kit Inspired Teacher tenta conjugar o fator praacutetico ao lado

econoacutemico Mesmo sem revelar o preccedilo do conjunto o pacote

de ensino digital deve ficar mais barato do que montar uma

estrutura semelhante a uma sala de aula com todos os com-

ponentes como um PC projetor e quadro

A ideia da tecnoloacutegica portuguesa eacute diminuir ao maacuteximo o

nuacutemero de casos de crianccedilas que natildeo tecircm acesso ao ensino

pela falta de material escolar qualificado e atualizado O pro-

fessor eacute ao mesmo tempo a sala de aula ideia que tem sido

bem recebida internacionalmente

O conceito jaacute foi apresentado em vaacuterios paiacuteses com uma

resposta muito positiva sobretudo do puacuteblico-alvo principal

os professores Agora com o lanccedilamento desta soluccedilatildeo no

mercado estamos em condiccedilotildees de levar a educaccedilatildeo digital a

qualquer parte do mundo escreve em comunicado o presi-

dente da JP Inspiring Knowledge Jorge Saacute Couto

A empresa responsaacutevel pela gama de equipamentos Maga-

lhatildees natildeo vai disponibilizar o kit em Portugal e a pedido do

TeK tambeacutem natildeo adiantou uma estimativa para o volume de

vendas ateacute ao final do ano

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

JP Inspiring Knowledge cria kit por-

taacutetil de ensino para professores

NOTICIAS

5

Ferramentas de construccedilatildeo extensiacuteveis

Sabemos que eacute preciso construir um sistema que se adapte

aos seus requisitos de projeto mas que se estenda ainda ao

seu ambiente maior de desenvolvimento O Android Studio

usa um novo sistema de construccedilatildeo baseado em Gradle que

proporciona flexibilidade sabores de construccedilatildeo personaliza-

dos resoluccedilatildeo de dependecircncias e muito mais

Este novo sistema de montagem permite-lhe construir os seus

projetos no IDE bem como em seus servidores de integraccedilatildeo

contiacutenua A combinaccedilatildeo permite-lhe gerir facilmente as confi-

guraccedilotildees complexas de construccedilatildeo nativamente atraveacutes do

seu fluxo de trabalho em todas as suas ferramentas Confira

a documentaccedilatildeo de preacute-visualizaccedilatildeo para ter uma ideacuteia me-

lhor do que o novo sistema de construccedilatildeo pode fazer

Ediccedilatildeo de coacutedigo poderoso

O Android Studio inclui um editor de coacutedigo poderoso Ele eacute

baseado no editor IntelliJ IDEA que suporta recursos como

ediccedilatildeo inteligente refatoraccedilatildeo de coacutedigo avanccedilado e anaacutelise

aprofundada de coacutedigo estaacutetico

Os recursos de ediccedilatildeo inteligentes tais como pesquisas de

recursos em linha facilitam a leitura do coacutedigo dando-lhe

acesso instantacircneo a editar o coacutedigo dos recursos de apoio A

refatoraccedilatildeo avanccedilada de coacutedigo daacute-lhe o poder de transfor-

mar seu coacutedigo atraveacutes de todo o projeto com rapidez e se-

guranccedila

Adicionaacutemos anaacutelise de coacutedigo estaacutetico para o desenvolvi-

mento Android ajudando a identificaccedilatildeo de erros mais rapida-

mente Aleacutem das centenas de inspeccedilotildees de coacutedigo que o In-

telliJ IDEA oferece adicionaacutemos inspeccedilotildees personalizados

Por exemplo noacutes adicionamos metadados para as APIs do

Android que assinalam quais os meacutetodos que podem retornar

nulos ou natildeo que constantes satildeo permitidas para que meacuteto-

dos e assim por diante Android Studio usa esses dados para

analisar seu coacutedigo e encontrar possiacuteveis erros

Fonte Android Developers Blog

Portugal acolhe rede internacional

de centros de inclusatildeo social

O Centro de Inclusatildeo Digital um projeto de intervenccedilatildeo social

apoiado pela Microsoft estaacute a chegar a Portugal No primeiro

ano de atividade a organizaccedilatildeo quer chegar a 1200 jovens

A accedilatildeo do CDI centra-se no desenvolvimento de competecircn-

cias tecnoloacutegicas junto de populaccedilotildees provenientes de con-

textos socioeconoacutemicos desfavorecidos com o objetivo de

criar condiccedilotildees de empregabilidade

A organizaccedilatildeo fundada no Brasil em 1995 tambeacutem atua

apoiando iniciativas empresariais empreendedoras Em Portu-

gal pretende criar uma rede nacional de centros de inclusatildeo

digital O primeiro seraacute instalado no bairro da Belavista em

Setuacutebal Uma segunda estrutura estaacute tambeacutem jaacute prevista e vai

localizar-se em Vale de Cambra no Porto

O CDI conta com 780 espaccedilos de inclusatildeo social em 12 paiacute-

ses De acordo com os nuacutemeros avanccedilados pela organizaccedilatildeo

as suas iniciativas jaacute tiveram impacto na vida de um milhatildeo de

pessoas

A iniciativa conta com o apoio da Microsoft que hoje a apre-

sentou no acircmbito do 7ordm Encontro de Parceiros Sociais e que

doou 100 mil doacutelares agrave instituiccedilatildeo para o arranque do projeto

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

Hoje na Google I O anunciaacutemos uma nova IDE que eacute cons-

truiacuteda com as necessidades dos programadores de Android

em mente Eacute chamado Android Estuacutedio eacute gratuito e estaacute ago-

ra disponiacutevel para vocecirc experimentar como uma preacute-

visualizaccedilatildeo de acesso antecipado

Para desenvolver o Estuacutedio Android colaboraacutemos com Jet-

Brains os criadores de uma das mais avanccediladas IDEs Java

disponiacuteveis hoje Basea-

do no poderoso e exten-

siacutevel IntelliJ IDEA

Community Edition adi-

cionaacutemos recursos que

satildeo projetados especifi-

camente para o desen-

volvimento Android que

simplificam e otimizam o

seu fluxo de trabalho

diaacuterio

Android Studio An IDE built for An-

droid

TEMA DE CAPA Introduccedilatildeo ao Java EE e Java Web

TEMA DA CAPA

7

Java Enterprise Edition

A plataforma Java Enterprise Edition ou Java EE eacute uma pla-

taforma da Oracle que fornece uma API adicional ao Java

SE para o desenvolvimento e execuccedilatildeo de aplicaccedilotildees java

do tipo empresarial focadas nos serviccedilos de rede e Web

Vindo do Java Professional Edition o nome que foi anuncia-

do em Maio de 98 foi a partir dos finais de 1999 que ficou

com o nome de Java EE incluindo tecnologias como Java

Database Connectivity (JDBC) Java Servlet JavaServer

Pages (JSP) Enterprise JavaBeans JavaMail etc

CONCEITOS

Aplicaccedilatildeo Web Java

Uma aplicaccedilatildeo Java Web gera paacuteginas Web interactivas

contendo vaacuterios tipos de markup languages (HTML XML

etc) e conteuacutedo dinacircmico Eacute tipicamente composto por ele-

mentos Web tais como JavaServer Pages (JSP) Servlets e

JavaBeans para modificar e temporariamente armazenar

dados interagir com bases de dados e serviccedilos Web geran-

do conteuacutedo em resposta aos pedidos do cliente

JSP (JavaServer Pages)

JavaServer Pages eacute uma tecnologia usada no desenvolvi-

mento de aplicaccedilotildees Web Java semelhante ao PHP Possui

compatibilidades com outras soluccedilotildees Java como a Servlet

corre em servidores como o Apache Tomcat e o GlassFish

Ao contraacuterio dos tiacutepicos jarrsquos os arquivos deste tipo de imple-

mentaccedilotildees satildeo ear ou war (Web Archive)

As paacuteginas Web dinacircmicas java aceitam HTML CSS Ja-

vascript tudo que possam incluir no um ficheiro normal

HTML natildeo necessitam de compilaccedilatildeo preacutevia isso fica ao

cargo do servidor Web de traduzir as linhas de coacutedigo em

Java para o browser compreender

Qualquer coacutedigo Java inserido nos ficheiros JSP deve ficar

entre as tags

lt Code gt (para inserccedilatildeo de coacutedigo)

lt=var gt (para a expressatildeo de uma variaacutevel)

Introduccedilatildeo ao Java EE e Java Web ltpage gt (para importar include para incluir

uma paacutegina JSP ou HTML externa)

Servlet

Eacute uma tecnologia Java que permite gerar dados em HTML e

XML Incluiacuteda na biblioteca javaxservlet permite processar

pedidos e respostas vindas de JSP e serve como uma exten-

satildeo do servidor Web Neste caso vamos usar a HttpServlet

onde a sua funccedilatildeo seraacute processar pedidos das JSP resolver

os pedidos e enviar uma resposta

XML

XML (Extensible Markup Language) subtipo da SGML foi

criada pela W3C com o objectivo de ser usado como formato

de configuraccedilatildeo entre vaacuterias linguagens atraveacutes da internet

Ex

Neste caso em particular o ficheiro XML que vamos criar

editar na configuraccedilatildeo de uma aplicaccedilatildeo Java Web eacute o

webxml que tem como tags mais usa das as seguintes

lt gt agrave define comentaacuterios

ltweb-app id version xmlns gt agrave define o tipo do XML

a versatildeohellip

ltdisplay-namegt agrave define o nome

ltservletgt agrave define uma servlet

ltxml version=10 encoding=iso-8859-1 encoding=iso-8859-1gt ltreceita nome=patildeo tempo_de_preparacao=5 min tempo_de_cozedura=1horagt ltingredientesgt ltingrediente quantidade=4 unidade=chavenasgtFarinhaltingredientegt ltingrediente quantidade=7 unidade=gramasgtFermentoltingredientegt ltingrediente quantidade=15 unidade=chavenasgtAgualtingredientegt ltingrediente quantidade=1 unidade=colheresgtSalltingredientegt ltingredientesgt ltinstrucoesgt ltpassogtMisturar tdos os ingredientesltpassogt ltpassogtCobrir com um pano e deixar repousar uma hora agrave temperatura ambienteltpassogt ltpassogtMisturar novamente e colocar ao forno ateacute ao fim da cozeduraltpassogt ltinstrucoesgt ltreceitagt

TEMA DA CAPA

8

ltservlet-namegt agrave define o nome da servlet

ltservlet-classgt agrave aponta o caminho da servlet na apli-

caccedilatildeo

ltload-on-startupgt agrave quando o valor for 1 a servlet

seraacute inicializada no inicio da aplicaccedilatildeo

ltservlet-mappinggt agrave caso a servlet efectue operaccedilotildees

requeridas por elementos externos

ltservlet-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltservletgt

lturl-patterngt agrave define um url para a servlet

ltfiltergt agrave semelhante agrave tag ltservletgt com a diferenccedila

de que esta permite enquadrar uma classe de filtro na

aplicaccedilatildeo que permita a existecircncia de sessotildees na

aplicaccedilatildeo Web ou qualquer segmento de coacutedigo que

necessite de ser constantemente executado

ltfilter-namegt agrave define o nome da classe filtro

ltfilter-classgt agrave aponta o caminho da class na aplica-

ccedilatildeo

ltfilter-mappinggt agrave sempre necessaacuterio definir para

uma classe filtro

ltfilter-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltfiltergt

lturl-patterngt agrave para possuir o efeito de filtro o url seraacute

todos os existentes ou seja

lterror-pagegt agrave tag existente para definir paacuteginas de

erro que sejam geradas pelo web server e que pos-

sam ocorrer na aplicaccedilatildeo

lterror-codegt agrave define o tipo de coacutedigo de erro gerado

pelo web server (404-page not found 500-internal

server errorhellip)

ltlocationgt agrave localiza a paacutegina de erro personalizada

dentro da aplicaccedilatildeo

Estrutura de uma aplicaccedilatildeo Web Java

O exemplo que vai ser aqui apresentado seraacute montado num

Web Archive (ficheiro war) que poderaacute depois ser colocado

num servidor Web sendo os mais conhecidos o Apache

Tomcat e o Oracle Glassfish Ambos disponiacuteveis gratuita-

mente e no pacote de Java EE do IDE NetBeans que os ins-

tala em modo desenvolvimento na maacutequina local

Nota As aplicaccedilotildees necessaacuterias para a criaccedilatildeo deste exem-

plo satildeo o Java Runtime Environment (JRE) o Java Deve-

lopment Kit (JDK) e o IDE NetBeans

A estrutura normal de uma aplicaccedilatildeo java desta natureza

tem por norma a seguinte estrutura

O ficheiro WAR criado se o abrirmos tem uma estrutura de

pastasficheiros orientada ao modelo de desenvolvimento

MVC (Model-view-controller) onde a View estaacute incluiacuteda dire-

tamente na raiz do projeto onde se pode encontrar as paacutegi-

nas JSP e HTML acompanhadas pelos devidos ficheiros

JavaScript e CSS necessaacuterios Caso haja ausecircncia de um

Deployment Descriptor (ficheiro de configuraccedilatildeo referente a

uma determinada aplicaccedilatildeo que neste caso seraacute o webxml)

o servidor Web procura sempre por um indexjsp como paacutegi-

na inicial

Dentro da pasta WEB-INF estatildeo todas as classes bibliote-

cas ficheiros de configuraccedilatildeo e servlets necessaacuterias para

processar a informaccedilatildeo mostrada pelas JSPs

Em suma ter-se-aacute entatildeo algo deste geacutenero

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

9

Nota Nesta estrutura optou-se por colocar as paacuteginas dinacirc-

micas debaixo do WEB-INF pois uma vez que podemos usar

as servlets para controlar o que se deve ou natildeo ser mostrado

perante os pedidos vindos do cliente Isto torna a aplicaccedilatildeo

mais segura na questatildeo de mapeamento de URLs

Desenvolvimento

Neste exemplo vai-se usar o IDE NetBeans pois eacute aquele

que a Oracle recomenda encontra-se disponiacutevel para Win-

dows Linux Solaris e Mac OS X sendo mais simples de

configurar O NetBeans encontra-se disponiacutevel para downlo-

ad no proacuteprio site e no site da Oracle como complemento do

Java Development Kit 7 (Ver bibliografia)

Primeiros passos

Para dar iniacutecio agrave construccedilatildeo da nossa aplicaccedilatildeo Java Web

no NetBeans basta ir a File ndash New Project e aparece-nos a

seguinte janela

E vamos selecionar Java Web ndash Web Application Em se-

guida definimos a localizaccedilatildeo e o nome da nossa aplicaccedilatildeo

Dando o nome de Teste a esta aplicaccedilatildeo no passo seguinte

o nome que foi atribuiacutedo eacute automaticamente dado como

Context Path ou seja a aplicaccedilatildeo iraacute ser identificada no De-

ployment descriptor como Teste e uma vez colocada no servi-

dor teraacute o seguinte URL httphostnameportTeste

Neste exemplo vamos usar para o servidor GlassFish da Ora-

cle a versatildeo 6 do Java EE e o IDE Netbeans

O servidor escolhido pode ser posteriormente alterado caso

queira-se testar a aplicaccedilatildeo noutros ambientes contudo eacute de-

sencorajado a alteraccedilatildeo da versatildeo sem primeiro verificar a

existecircncia de possiacuteveis incompatibilidades com coacutedigo e biblio-

tecas que estejam a ser usadas O uacuteltimo seraacute ignorado uma

vez que este exemplo que vamos criar natildeo vai possuir nenhum

framework

Uma vez concluiacutedo todos os passos verificamos que automati-

camente o IDE criou-nos uma estrutura com uma paacutegina in-

dexjsp na raiz uma pasta WEB-INF vazia e atalhos para a

pasta de sources bibliotecas e de ficheiros de configuraccedilatildeo

com o tradicional MANIFESTMF criado

A estrutura visiacutevel natildeo corresponde agrave estrutura real de diretori-

as para se visualizar isso basta ir ao separador Files situado eacute

esquerda como mostra a imagem seguinte

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

10

Caso natildeo esteja criado o atalho pode-se sempre aceder indo

agrave opccedilatildeo Window ndash File abrindo o separador e recolocando o

atalho

Numa breve comparaccedilatildeo pode-se verificar que o NetBeans

cria determinados ficheiros e diretorias referentes ao projeto

(bluidxml e nbproject) e onde na estrutura do projeto a pasta

Web Pages tem referecircncia agrave pasta web e a Source Packa-

ges tem referecircncia agrave pasta src Todos os ficheiros de confi-

guraccedilatildeo ficam dentro da pasta WEB-INF e no caso da pasta

Libraries o seu conteuacutedo eacute um conjunto de atalhos cuja sua

localizaccedilatildeo pode ser referenciada a quaisquer pastas exter-

nas ao projeto No entanto recomenda-se criar uma pasta lib

debaixo de WEB-INF com as bibliotecas a ser usadas pela

aplicaccedilatildeo para evitar erros originados por utilizaccedilatildeo do mes-

mo ficheiro de biblioteca por mais do que um projeto e para

facilitar a passagem do projeto para outro ambiente ou ma-

quina pois assim basta soacute passar a pasta com o projeto sem

haver preocupaccedilotildees com importaccedilatildeo de bibliotecas

Criaccedilatildeo de uma JSP

Se abrirmos a paacutegina JSP criada pelo IDE ela vai ter um

aspecto semelhante a este

Uma vez que esta paacutegina tem o nome de index caso seja

feito o deploy da aplicaccedilatildeo a mesma vai apresentar uma

paacutegina de fundo branco com o tiacutetulo JSP Page e a frase Hel-

lo World

Para realizar o deploy da aplicaccedilatildeo basta carregar sobre o

botatildeo de play situado no painel de topo do IDE Netbeans ou

entatildeo ir a Run ndash Run Project

Caso o nome da paacutegina seja alterado e natildeo exista nenhuma

paacutegina com o nome index o servidor natildeo consegue encon-

trar nenhuma paacutegina inicial Entatildeo em seguida vamos alterar

o nome da nossa paacutegina inicial para homejsp e vamos con-

figurar o nosso webxml de maneira a criarmos um filtro de

sessatildeo que vai definir que o servidor no arranque da mesma

redirecionar-se para uma determinada servlet

Para tal se formos agrave opccedilatildeo de File ndash New Filehellip na secccedilatildeo

Web selecionar o tipo de ficheiro Standard Development

Descriptor (webxml)

Uma vez criado o ficheiro teraacute o seguinte conteuacutedo por defei-

to

Temos agora o ficheiro webxml onde poderemos colocar as

nossas referecircncias agraves servlets que vamos criar atribuindo-

lhes um url pattern a fim de poderem ser acedidas

Para natildeo termos trabalho o IDE por si soacute resolve todas as

tags que necessitamos de colocar no webxml na altura em

que criamos uma servlet caso natildeo seja resolvido pelo IDE

Para mapearmos a servlet WelcomeServlet no package

mainservlet com o url pattern Welcome o que deveria de ser

colocado seria algo deste geacutenero (ver as tags fornecidas)

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtJSP Pagelttitlegt ltheadgt ltbodygt lth1gtHello Worldlth1gt ltbodygt lthtmlgt

ltxml version=10 encoding=UTF-8gt ltweb-app xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=httpjavasuncomxml nsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsd version=30gt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

ltxml version=10 encoding=UTF-8gt ltweb-app version=30 xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=

TEMA DA CAPA

11

Mas natildeo eacute necessaacuterio escrever estas tags ateacute porque o Net-

Beans natildeo permite a criaccedilatildeo de servlets que jaacute possuam refe-

recircncias no webxml como tal o que podemos fazer eacute ir a opccedilatildeo

File ndash New Filehellip e dentro do Web selecionar Servlet

Em seguida o IDE vai recomendar a natildeo criar classes na raiz

dos packages e como tal vamos preencher o campo Package

com mainservlet e como nome WelcomeServlet

Dado o passo seguinte o IDE automaticamente cria a estru-

tura dos packages introduzidos e apresenta o formulaacuterio de

configuraccedilatildeo da servlet

Carregando sobre a check box e alterando o URL Pattern

para Welcome teremos automaticamente criado as tags

pretendidas no webxml

Uma vez criada a servlet vem com os meacutetodos herdados de

HttpServlet doGet() e doPost() implementados e com um

meacutetodo chamado processRequest() que envia coacutedigo

HTML O que vamos fazer eacute apagar este meacutetodo e colocar a

vazio o meacutetodo doPost() e introduzir a seguinte linha no

meacutetodo doGet()

Com esta linha criada e uma vez chamada a servlet que por

defeito responde por GET o pedido vai ser reencaminhado

para a nossa paacutegina criada homejsp

Fazendo deploy coloca-se o URL httplocalhost8080Teste

Welcome e verifica-se que a nossa servlet estaacute a fazer o

reencaminhamento para a nossa paacutegina inicial

Como proacuteximo passo vamos enviar variaacuteveis para uma ser-

vlet onde a mesma iraacute processar e enviar uma resposta En-

tatildeo o que se pretende eacute tomando os mesmos passos de cria-

ccedilatildeo da WelcomeServlet vamos criar a SomaServlet com o

seguinte coacutedigo

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

httpjavasuncomxmlnsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsdgt ltservletgt ltservlet-namegtWelcomeServletltservlet-namegt ltservlet-classgtmainservletWelcomeServlet ltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtWelcomeServletltservlet-namegt lturl-patterngtWelcomelturl-patterngt ltservlet-mappinggt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

getServletContext()getRequestDispatcher( homejsp)forward(request response)

package mainservlet import javaioIOException import javaxservletServletException import javaxservlethttpHttpServlet import javaxservlethttpHttpServletRequest import javaxservlethttpHttpServletResponse public class SomaServlet extends HttpServlet public static final String TEXTO = texto public static final String VALOR_1 = valor1 public static final String VALOR_2 = valor2 public static final String RESULTADO = resultado

TEMA DA CAPA

12

E para interagirmos com a servlet vamos criar as paacuteginas so-

majsp e resultadojsp onde mais uma vez vamos ao menu

File ndash New Filehellip selecionamos JSP e preenchemos o nome

sem a extensatildeo no campo File Name

somajsp

Com o objectivo de evitar erros a servlet possui constantes

que permitem que haja uma coerecircncia entre as variaacuteveis envia-

das e recebidas com o objectivo de evitar errosPode-se ob-

servar que a servlet uma vez iniciada envia uma variaacutevel atra-

veacutes de requestsetAttribute() Uma vez chamado o setAttri-

bute() requer 2 paracircmetros

requestsetAttribute(NomeDoAtributo UmObjectoQQ)

O primeiro paracircmetro como descrito atribui um nome sen-

do esse o nome que deve ser usado nas paacuteginas JSP para

puderem capturar a variaacutevel enviada que se vai encontrar

descrita no segundo paracircmetro que por sua vez eacute sempre

convertida da servlet para object Como tal teve que ser

efectuado o cast do objecto agrave chegada para o tipo de variaacute-

vel que tinha antes de ser enviada

String atributo = (String) requestgetAttribute

(NomeDoAtributo)

(Recepccedilatildeo do atributo)

Caso o que se pretenda seja o contraacuterio enviar variaacuteveis no

sentido JSP agrave Servlet a paacutegina JSP deve de conter um for-

mulaacuterio HTML com o meacutetodo que se pretende POST ou

GET e na action o URL pattern da servlet em questatildeo E os

nomes dos inputs satildeo as referecircncias que a servlet usa para

receber as variaacuteveis das paacuteginas JSP variaacuteveis essas quem

vecircm como String e como tal devem de ser convertidas para o

tipo desejado (Como demonstrado no coacutedigo acima referi-

do) Vamos entatildeo testar acedendo ao URL http

localhost8080TesteSoma

Porem a aplicaccedilatildeo funciona mas apenas mostra paacuteginas

caso as mesmas sejam escritas no URL pois uma vez que

renomeamos o indexjsp para homejsp natildeo existe de mo-

mento nenhuma paacutegina inicial ou seja caso escrevesse-

mos httplocalhost8080Teste a aplicaccedilatildeo natildeo vai mostrar

nenhuma paacutegina

Para solucionarmos esse problema vamos entatildeo criar um

filtro que remeta para uma determinada servlet filtro esse

que vai aguardar que uma determinada variaacutevel se altere de

estado para desbloquear as restantes paacuteginas Com este

tipo de classes podemos definir niacuteveis de acesso dentro da

nossa aplicaccedilatildeo restringindo a mesma quando certas variaacute-

veis natildeo forem validadas ou natildeo se encontram com o valor

pretendido (por exemplo um determinado nome de utilizador

e palavra chave)

Vamos entatildeo novamente a File ndash New Filehellip e seleciona-

mos Filter

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

Override protected void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException requestsetAttribute(TEXTO Insira 2 numeros e submeta para obter o resultado) getServletContext()getRequestDispatcher (somajsp)forward(request response) Override protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException int resultado try int val1 = IntegerparseInt (requestgetParameter(VALOR_1)) int val2 = IntegerparseInt (requestgetParameter(VALOR_2)) resultado = val1 + val2 requestsetAttribute(RESULTADO +resultado) catch (NumberFormatException e) requestsetAttribute(RESULTADO Valores natildeo validos) getServletContext()getRequestDispatcher (resultadojsp)forward(request response)

ltpage import=mainservletSomaServletgt ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lt String texto = (String) requestgetAttribute (SomaServletTEXTO)gt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtSomalttitlegt ltheadgt ltbodygt lth2gtlt=textogtlth2gt ltform action=Soma method=POSTgt Valor 1ltinput type=text name= lt=SomaServletVALOR_1gtgt Valor 2ltinput type=text name= lt=SomaServletVALOR_2gtgt ltbrgt ltinput type=submit name=submitgt ltformgt ltbodygt lthtmlgt

TEMA DA CAPA

13

caccedilatildeo e restriccedilatildeo de acessos os filtros permitem a execuccedilatildeo

de certas linhas de coacutedigo que mantecircm estados numa aplica-

ccedilatildeo e eacute o siacutetio ideal para colocar a parte do coacutedigo da aplica-

ccedilatildeo que manipula variaacuteveis de sessatildeo

Apoacutes criar-se a classe do tipo Filter ignorando o coacutedigo ge-

rado o filtro deveraacute possuir o seguinte coacutedigo

Uma vez criado o filtro este vai redirecionar todos os pedidos

agrave aplicaccedilatildeo para a WelcomeServlet enquanto a variaacutevel

validSession estiver a NULL como tal na servlet Welcome-

Servlet coloca-se a seguinte linha

requestgetSession()setAttribute(UrlFilterSESSION

gotSession)

Assim que o filtro passar pela WelcomeServlet a variaacutevel

validSession vai deixar de estar a NULL colocando o filtro a

fazer um encadeamento com os restantes pedidos que apa-

recerem

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

No seguinte passo vamos atribuir o nome de UrlFilter e coloca

-lo num novo package mainfilter

Semelhante ao passo de criaccedilatildeo do mapeamento das servlets

no webxml o IDE igualmente cria automaticamente um mape-

amento do filtro no ficheiro XML contudo o coacutedigo gerado eacute

ligeiramente diferente (Ver referecircncia de tags do webxml)

Apoacutes dar seguinte neste passo e natildeo preencher nada no proacutexi-

mo o IDE gera uma classe filtro por defeito e gera o seu mape-

amento no webxml semelhante a

Muito semelhante ao que se vai encontrar num mapeamento

de uma servlet apenas com a diferenccedila do nome das tags de

servlet para filter e o seu mapeamento seraacute muacuteltiplo para todos

os URLs que se deseja correr um determinado filtro antes de

haver o redireccionamento Uacuteteis para criar poliacuteticas de autenti-

ltfiltergt ltfilter-namegtUrlFilterltfilter-namegt ltfilter-classgtmainfilterUrlFilter ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtUrlFilterltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt

package mainfilter import javaioIOException import javaxservlet import javaxservlethttp public class UrlFilter implements Filter FilterConfig filterConfig public static final String SESSION = session Override public void doFilter(ServletRequest req ServletResponse resp FilterChain chain) throws IOException ServletException if (req instanceof HttpServletRequest) String path = ((HttpServletRequest) req)getServletPath() HttpSession session = ((HttpServletRequest) req)getSession(false) boolean sessionValidator = false if (session = null) String validSession = (String) sessiongetAttribute(SESSION) if (validSession = null) sessionValidator = true if (pathequals(Welcome) ampamp sessionValidator) ((HttpServletResponse) resp)sendRedirect(filterConfiggetServletContext ()getContextPath() + Welcome) else chaindoFilter(req resp) Override public void init(FilterConfig filterConfig) thisfilterConfig = filterConfig Override public void destroy()

TEMA DA CAPA

14

Apoacutes implementado quando se aceder agrave aplicaccedilatildeo pelo URL

apontado para a raiz (httplocalhost8080Teste) o servidor

com conhecimento da existecircncia de um filtro vai chama-lo para

cada vez que o cliente acede a qualquer servlet ou JSP

Para finalizar este exemplo vamos soacute criar um link na paacutegina

homejsp que nos vai apontar para a paacutegina somajsp atraveacutes

da SomaServlet

lta href=SomagtSomarltagt

Dentro da aplicaccedilatildeo os URL pattern que foram definidos no

webxml servem igualmente para os links HTML chamando

sempre o meacutetodo doGet() da servlet

Conclusatildeo

Este artigo mostra numa forma introdutoacuteria como se pode criar

uma aplicaccedilatildeo Java com uma interface Web tendo em conta

que as capacidades do Java EE e das suas bibliotecas nome-

adamente Servlets Filters e as configuraccedilotildees necessaacuterias para

criar uma aplicaccedilatildeo Web baacutesica com conceitos adicionais de

XML( no seu geral) JSP e MVC

BibliografiaReferecircncias

httpwwworaclecomtechnetworkjavajavasedownloads

jre7-downloads-1880261html

httpwwworaclecomtechnetworkjavajavaeedownloads

indexhtml

httpsnetbeansorgfeaturesindexhtml

httpenwikipediaorgwikiJava_EE_version_history

httpwwwjsptutcom

httpsdevelopersgooglecomappenginedocsjavaconfig

webxml

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

A PROGRAMAR Programaccedilatildeo em C const

Jogo da Vida

JBoss Aplication Server 7

PHP Uma framework ldquofrom scratchrdquo (Parte 1)

A PROGRAMAR

16

Uma das ldquorecentesrdquo adiccedilotildees agrave linguagem C foi o qualificador

const Ao contraacuterio do que se possa pensar utilizar const

natildeo cria uma constante mas sim uma variaacutevel soacute-de-leitura

O que queremos dizer com isto Vejamos o seguinte exem-

plo

Qual o valor de i apoacutes execuccedilatildeo da linha 4 Embora possa

parecer estranho i vai ter o valor 73 apesar de termos de-

clarado i como constante Por este motivo variaacuteveis qualifi-

cadas com const natildeo satildeo constantes verdadeiras em C (satildeo-

no em C++) e natildeo podem por este motivo ser utilizadas em

certos lugares como a definiccedilatildeo do tamanho de arrays ou

em cases de um switch (excepto com extensotildees dos compi-

ladores)

De que nos serve entatildeo um qualificador const se natildeo asse-

gura que a variaacutevel permanece inalterada Bem a utilizaccedilatildeo

de const para qualificar variaacuteveis impede de facto a sua

alteraccedilatildeo na maioria dos casos Natildeo podemos alterar i direc-

tamente por exemplo (ie i = 73 emite um erro) No exemplo

apresentado acima enganaacutemos o compilador (linha 2) com o

cast de ampi para o tipo int sem cast um compilador bem

configurado emitiraacute pelo menos um aviso de que o qualifica-

dor const eacute descartado na atribuiccedilatildeo de ampi a ptr um pequeno

sinal de alarme para o programador (eacute soacute estar atento)

Podemos como referido acima qualificar uma variaacutevel com

const e impedir que seja alterada directamente Se tentar-

mos apontar um apontador a essa variaacutevel o compilador

avisa-nos que a qualificaccedilatildeo de const seraacute perdida e pode-

mos alterar a variaacutevel atraveacutes do apontador Haveraacute maneira

de impedir que isto aconteccedila Na realidade a questatildeo eacute

outra como utilizar o qualificador const com apontadores

Existem 4 formas de qualificar um apontador com const

obtendo-se diferentes niacuteveis de acesso de leitura eou escri-

ta da variaacutevel apontada atraveacutes do mesmo Para que natildeo

existam duacutevidas eacute importante reter que o qualificador const

qualifica uma variaacutevel e natildeo um local na memoacuteria Por outras

palavras (e recorrendo ao exemplo inicial) qualificar i como

const soacute impedir a alteraccedilatildeo do valor atraveacutes da variaacutevel i

Quando apontamos um apontador ao endereccedilo de i pode-

mos fazer o que quisermos com o valor laacute armazenado inde-

pendentemente de como i foi declarado

A primeira forma de usar const num apontador eacute surpreen-

dentemente natildeo usar const num apontador Na realidade

(obviamente) esta natildeo eacute uma utilizaccedilatildeo do qualificador const

Programaccedilatildeo em C const mas este artigo natildeo estaria completo sem se falar dela Um

apontador simples de forma tipo p permite-nos fazer vaacuterias

coisas podemos apontaacute-lo a qualquer local da memoacuteria que

queiramos e desde que apontado a um endereccedilo vaacutelido

podemos alterar o valor aiacute armazenado com o operador de

indirecccedilatildeo (eg p = 3) Este tipo de apontador natildeo apresenta

restriccedilotildees nenhumas (por esse motivo eacute que o compilador

emite um aviso quando tentamos apontaacute-lo a uma variaacutevel

const excepto na presenccedila de casts)

Segue-se entatildeo a criaccedilatildeo de um apontador para uma variaacute-

vel constante Este tipo de apontador apresenta uma particu-

laridade embora seja possiacutevel apontaacute-lo a qualquer endere-

ccedilo de memoacuteria natildeo eacute possiacutevel utilizar este apontador para

alterar o conteuacutedo do endereccedilo apontado Logicamente este

era o tipo de apontador que precisaacutevamos no exemplo inici-

al se temos uma variaacutevel constante queremos apontar para

ela com um apontador para uma variaacutevel constante

Se lermos a declaraccedilatildeo de ptr da direita para a esquerda

tudo faz sentido ptr eacute um apontador () para um const int E

de facto i eacute um const int tudo parece bem Quando tentamos

modificar o valor apontado por ptr o compilador emite um

erro queixa-se que estamos a tentar atribuir um valor a uma

variaacutevelendereccedilo soacute de leitura Este era o comportamento

que procuraacutevamos inicialmente

Passemos agora para a terceira forma de usar const com

apontadores Uma espeacutecie de ldquoinversordquo de um apontador

para uma variaacutevel constante eacute um apontador constante para

uma variaacutevel (natildeo constante) A diferenccedila do anterior para

este eacute que agora passamos a conseguir alterar o valor apon-

tado (por outras palavras ptr = 73 passa a ser possiacutevel)

mas natildeo nos eacute possiacutevel apontar ptr para outra variaacutevel

Uma vez mais da direita para a esquerda ptr eacute um aponta-

dor constante ( const) para um int Podemos utilizar ptr agrave

vontade para modificar o valor de 42 para 73 mas eacute-nos

impossiacutevel alterar o endereccedilo para o qual ptr aponta Este

tipo de apontadores eacute uacutetil quando nos queremos assegurar

de que natildeo haacute alteraccedilotildees acidentais do local para onde um

apontador aponta Um pormenor importante sendo ptr um

apontador cujo endereccedilo natildeo pode ser alterado devemos

1 const int i = 42 2 int ptr = (int)ampi 3 4 ptr = 73

1 const int i = 42 2 const int ptr = ampi 3 4 ptr = 73 erro

1 const int i = 42 2 int const ptr = ampi 3 4 ptr = 73 ok 5 ptr = NULL erro

A PROGRAMAR

17

apontaacute-lo para onde queremos no momento da sua declara-

ccedilatildeo sob pena de ficar apontado para um local aleatoacuterio sem

possibilidade de alteraccedilatildeo

A quarta (e uacuteltima) forma de utilizar const num apontador eacute

como devem ter imaginado a combinaccedilatildeo das duas uacuteltimas

um apontador constante para uma variaacutevel constante Este eacute

o tipo de apontador mais limitado de todos uma vez que a

uacutenica coisa que podemos fazer com ele apoacutes a sua declara-

ccedilatildeo eacute consultar o valor para o qual aponta Natildeo podemos

alterar i se ptr for deste tipo nem podemos apontar ptr para

NULL ou outro endereccedilo qualquer

Desta vez utilizamos const em dois locais agrave esquerda do

asterisco para qualificar a variaacutevel apontada e agrave direita do

asterisco para qualificar o apontador Neste caso nenhuma

das operaccedilotildees funcionaraacute o compilador assegura-se que

natildeo utilizaremos ptr para alterar o valor para o qual aponta

nem tentaremos apontar ptr para outro endereccedilo

Neste artigo cobrimos algumas utilizaccedilotildees do qualificador

const na linguagem C (volto a lembrar estamos a falar de C

e natildeo de ldquoCC++rdquo) e foi tambeacutem referido como utilizar este

qualificador para melhorar o coacutedigo que escrevemos de for-

ma a prevenir asneiras relativamente comuns quando se lida

com apontadores

Falta no entanto mencionar outra utilidade do const docu-

mentaccedilatildeo Quando o programador utiliza const de uma for-

ma pensada estaacute a documentar o seu coacutedigo Se virmos uma

funccedilatildeo que aceita como argumento const void podemos

imediatamente imaginar que o endereccedilo passado nunca seraacute

alterado pela funccedilatildeo em causa enquanto que um simples

void natildeo nos informa sobre as intenccedilotildees da API Natural-

mente se o programador da API declarar um argumento

com const e depois utilizar casts para se livrar da qualifica-

ccedilatildeo entatildeo aiacute all bets are off e nada eacute garantido Mas assu-

mamos que isso eacute a excepccedilatildeo e natildeo a regra

Existem ainda muacuteltiplos aspectos que natildeo foram cobertos

neste artigo nomeadamente a conversatildeo impliacutecita de T para

const T e T para const T Esta conversatildeo eacute bastante uacutetil

quando queremos passar um valor do tipo T a uma funccedilatildeo

que requer const T como argumento Se pensarmos bem

faz sentido em qualquer lugar onde eacute necessaacuterio um const

T podemos utilizar um T perfeitamente (que nunca seraacute al-

terado) Por outro lado a conversatildeo inversa (de const T ou

const T para T e T respectivamente) natildeo eacute permitida e

tambeacutem isso faz sentido se uma funccedilatildeo pede um valor do

tipo T natildeo faz sentido aceitar um const T porque isso im-

plicaria potenciais alteraccedilotildees ao valor apontado (que satildeo

proibidas pelo qualificador const)

As conversotildees impliacutecitas relativas ao const terminam por

aqui Em C natildeo haacute conversatildeo de T para const T o que

significa que numa funccedilatildeo que aceite um argumento const

T seraacute emitido um aviso se tentarmos passar um T Neste

caso temos que recorrer a um cast para silenciar o compila-

dor Nada disto eacute um erro no entanto os casts surgiram

porque satildeo necessaacuterios na linguagem C e recusar a sua

utilizaccedilatildeo eacute negar a linguagem Haacute que saber quando e co-

mo fazer as coisas da forma correcta

Para terminar recomendo uma olha- dela agraves

manpages da biblioteca standard de C jaacute utilizam const

abundantemente nota-se bem o seu valor como documenta-

ccedilatildeo dentro do coacutedigo Aleacutem deste aspecto da documentaccedilatildeo

a utilizaccedilatildeo de const leva agrave criaccedilatildeo de coacutedigo mais previsiacutevel

e seguro e serve tambeacutem como dica para possiacuteveis optimi-

zaccedilotildees feitas pelo compiladorUsem const Informem e enco-

rajem a utilizaccedilatildeo de const especialmente aos iniciados

porque vale a pena

PROGRAMACcedilAtildeO EM C CONST

1 const int i = 42 2 const int const ptr = ampi 3 4 ptr = 73 erro 5 ptr = NULL erro

AUTOR

Escrito por Antoacutenio Pedro Cunha (pwseo)

Meacutedico natural de Guimaratildees formado na Universidade do Minho

Programador autodidacta em parte dos tempos livres inscrito no foacuterum desde 2006

Website httppwseoalojnet

Ao contraacuterio do

que se possa pen-

sar utilizar const natildeo

cria uma constante

mas sim uma variaacutevel

soacute de leitura

A PROGRAMAR

18

Nesta ediccedilatildeo vamos propor ao leitor um olhar sobre um fa-

moso algoritmo da deacutecada de 70

O seu inventor John Horton Conway nasceu em Liverpool

em Dezembro de 1937 e eacute um dos matemaacuteticos mais conhe-

cidos da nossa era em todo o mundo Estudou na Universi-

dade de Cambridge e ainda hoje eacute uma mente ativa nas

mais variadas teorias como por exemplo a teoria dos coacutedigos

e a teoria com- binatoacuteria dos

jogos

Ilustraccedilatildeo 1 - John Conway

O algoritmo escolhido para esta ediccedilatildeo foi criado em 1970

por Conway ndash o Jogo da Vida ndash sendo este um jogo para

zero jogadores Este jogo tornou-se mundialmente famoso

atraveacutes de uma coluna na revista Scientific American Em

1971 foi tema de capa e tinha entatildeo relanccedilado uma aacuterea da

Matemaacutetica a dos autoacutematos celulares que satildeo estruturas

matemaacuteticas uacuteteis em simulaccedilotildees de processos fiacutesicos e

bioloacutegicos e que a um niacutevel teoacuterico podem comportar-se

como computadores

Um autoacutemato celular eacute um modelo discreto e cada autoacutemato

deste tipo eacute representado por uma grelha de ceacutelulas poden-

do essas ceacutelulas assumir um nuacutemero finito de estados que

variam de acordo com cada modelo Outra caracteriacutestica a

considerar eacute que o tempo de evoluccedilatildeo eacute tambeacutem discreto

por exemplo o estado de uma ceacutelula no tempo t eacute sempre

obtido tendo em consideraccedilatildeo o estado dessa mesma ceacutelula

(e respetiva vizinhanccedila) no tempo t-1 Cada vez que todas as

regras determiniacutesticas satildeo aplicadas a toda a grelha uma

nova geraccedilatildeo eacute produzida

Isto foi um dos motes de partida para que Conway criasse o

Jogo da Vida Este jogo eacute considerado um autoacutemato celular

bidimensional em que satildeo simulados processos de evoluccedilatildeo

de ceacutelulas bioloacutegicas Estudos jaacute efetuados provam que este

eacute um autoacutemato computacional universal isto eacute eacute capaz de

simular qualquer sistema evolucionaacuterio possiacutevel

(reprogramando as respetivas regras determiniacutesticas se isso

for necessaacuterio)

Jogo da Vida Devido agraves analogias com o aumento reduccedilatildeo e alteraccedilatildeo de

um sistema de supostos organismos vivos (as ceacutelulas) este

jogo pertence agrave classe dos ldquojogos de simulaccedilatildeordquo pois recriam

processos do mundo-real

Voltando de novo ao tema principal do nosso artigo eacute impor-

tante recordar ao leitor que este jogo eacute para zero jogadores

o utilizador eacute apenas responsaacutevel pelos valores de inicializa-

ccedilatildeo do sistema Depois desses valores serem introduzidos

as geraccedilotildees seguintes seratildeo sempre calculadas com base

nas regras determiniacutesticas do algoritmo

Neste jogo num dado instante cada ceacutelula tem dois estados

possiacuteveis ldquovivardquo ou ldquomortardquo

As regras do jogo da vida satildeo simples ora vejamos

Uma ceacutelula viva com menos de dois vizinhos vivos

morre por solidatildeo

Uma ceacutelula viva com mais de trecircs vizinhos vivos mor-

re por sobrepopulaccedilatildeo (por escassez de recursos)

Uma ceacutelula viva com exatamente dois ou trecircs vizinhos

vivos permanece viva

Uma ceacutelula morta com exatamente trecircs vizinhos vivos

torna-se viva

Ao contraacuterio do artigo anterior desta seacuterie a soluccedilatildeo propos-

ta para este problema (na linguagem C) propotildee-se a ser

algo extremamente simples escrita de forma quase elemen-

tar

Implementaccedilatildeo do Algoritmo

Para simular o sistema de jogo foi usada uma matriz e para

que o caacutelculo das regras fosse simples foi considerado que

todas as ceacutelulas dessa matriz teriam 8 vizinhos A forma

mais direta encontrada para isso foi inserir a matriz do utiliza-

dor (que neste artigo seraacute a matriz secundaacuteria) numa matriz

com dimensatildeo [linhas+2][colunas+2] (matriz principal) para

garantir que ateacute as ceacutelulas dos ldquocantosrdquo teriam os tais 8 vizi-

nhos

De forma a simplificar a leitura da nossa implementaccedilatildeo defi-

nimos que cada ceacutelula viva teraacute o valor 1 (representada pela

macro CELVIVA) e que cada ceacutelula morta teraacute o valor 0

(representada pela macro CELMORTA)

No inicio da funccedilatildeo jogo() satildeo pedidos ao utilizador os valo-

res para o nuacutemero de linhas e colunas do sistema de jogo e

o nuacutemero de geraccedilotildees a simular

Apoacutes termos esses valores eacute entatildeo criada a matriz principal

com todos os campos inicializados a -1 para que seja efetua-

A PROGRAMAR

19

da uma ldquolimpezardquo da memoacuteria utilizada Seguidamente e atra-

veacutes desses valores eacute inicializada dentro na matriz principal a

submatriz (matriz secundaacuteria) que eacute usada para calcular os

valores das ceacutelulas em cada geraccedilatildeo Neste caso eacute inicializa-

da a matriz com a dimensatildeo que o utilizador pediu com o valor

de CELMORTA em todos os campos

Apoacutes gerar a matriz secundaacuteria eacute perguntado ao utilizador

quantas ceacutelulas vivas pretende ter no jogo Seguidamente satildeo

pedidas as coordenadas dessas mesmas ceacutelulas Quando o

programa recebe esses valores (da linha e da coluna pretendi-

da) entatildeo a essas posiccedilotildees da matriz eacute atribuiacutedo o valor CEL-

VIVA

Recapitulando para representar uma ceacutelula viva eacute usado o

valor 1 e para representar uma ceacutelula morta eacute usado o valor 0

Todas as outras posiccedilotildees da matriz principal permanecem inal-

teradas com o valor -1

Assim o que o algoritmo faz eacute contabilizar quantas ceacutelulas

vivas estatildeo nos 8 vizinhos Ou seja por outras palavras para

cada posiccedilatildeo (ij) da matriz o programa vai verificar as posi-

ccedilotildees (i-1 j-1) (i-1 j) (i-1 j+1) (i j-1) (i j+1) (i+1 j-1) (i+1 j)

e (i+1 j+1) Caso o valor de cada uma dessas ceacutelulas seja

igual a 1 (CELVIVA ie ceacutelula viva) a variaacutevel de contagem

(cvivas) eacute incrementada uma unidade

Apoacutes a verificaccedilatildeo de todas as posiccedilotildees eacute verificado se a ceacutelu-

la da posiccedilatildeo (i j) eacute uma ceacutelula viva ou morta e satildeo verificadas

as regras do jogo para que se possa decidir se a ceacutelula (ij)

permanece viva ou se morre (tomando respetivamente o valor

CELVIVA e CELMORTA na submatriz)

Usando a variaacutevel i como auxiliar para as linhas e a variaacutevel j

como auxiliar para as colunas os caacutelculos iniciam-se na posi-

ccedilatildeo (11) da matriz principal pois eacute nestas coordenadas que se

inicia a matriz secundaacuteria (ie o sistema de jogo do utilizador)

Os caacutelculos satildeo feitos em todas as posiccedilotildees (ij) apenas da

matriz secundaacuteria daiacute que a condiccedilatildeo de execuccedilatildeo dos ciclos

for seja enquanto o i e o j forem menores que o valor das li-

nhas e das colunas introduzidas pelo utilizador Ou seja a ma-

triz principal natildeo eacute toda processada nos caacutelculos dos vizinhos

vivos para que natildeo sejam gastos recursos de computaccedilatildeo

desnecessariamente

Ilustraccedilatildeo 2 - Exemplo de verificaccedilatildeo de Ceacutelulas

Ceacutelula a ceacutelula a matriz atual eacute processada sendo que apoacutes

esse processamento o resultado do caacutelculo (se a ceacutelula vive

ou morre) eacute colocado na posiccedilatildeo correspondente na matriz

nova (que eacute uma matriz com as mesmas caracteriacutesticas da

matriz atual isto eacute tem tambeacutem uma matriz principal e uma

matriz secundaacuteria)

Apoacutes esse caacutelculo eacute mostrada no ecratilde a matriz secundaacuteria

da matriz nova e a informaccedilatildeo das ceacutelulas da matriz nova eacute

copiada para a matriz atual de forma a que na proacutexima itera-

ccedilatildeo do for principal (que executa o mesmo numero de vezes

quantas geraccedilotildees o utilizador peccedila ao programa) a informa-

ccedilatildeo volte a ser processada de forma anaacuteloga

Para que fosse mais simples ao utilizador o uso do nosso

programa foi tomada em consideraccedilatildeo para que natildeo se

tornasse aborrecido estar sempre a iniciar a execuccedilatildeo do

programa caso o utilizador quisesse continuar a jogar que o

programa apenas teraacute fim quando o utilizador escolher sair

do programa neste caso introduzindo o valor 0 no menu prin-

cipal do mesmo

Se o utilizador preferir jogar novamente entatildeo basta carregar

em 1 e o programa volta a gerar uma nova jogada gerando

um novo sistema de geraccedilotildees consoante os valores introdu-

zidos pelo utilizador Na nossa implementaccedilatildeo quando o

programa mostra o sistema de jogo as ceacutelulas vivas satildeo

representadas pelo siacutembolo

Coacutedigo do Programa

Este eacute apenas um excerto da funccedilatildeo que calcula a proacutexima

geraccedilatildeo tendo como base uma matriz que represente a gera-

ccedilatildeo anterior O coacutedigo completo poderaacute ser consultado no

foacuterum do PP

JOGO DA VIDA

void jogo(void) for (int g = 0 g lt geracoes g++) printf(nnGERACAO d g + 1) for (int i = 1 i lt= linhas i++) for (int j = 1 j lt= colunas j++) int cvivas = 0 if (matrizActual[i-1][j-1] == CELVIVA) cvivas++ if (matrizActual[i-1][j] == CELVIVA) cvivas++ if (matrizActual[i-1][j+1] == CELVIVA) cvivas++ if (matrizActual[i][j-1] == CELVIVA) cvivas++ if (matrizActual[i][j+1] == CELVIVA) cvivas++ if (matrizActual[i+1][j-1] == CELVIVA) cvivas++ if (matrizActual[i+1][j] == CELVIVA)

A PROGRAMAR

20

Como o leitor pode verificar nas linhas acima este eacute um algorit-

mo bastante simples e de raacutepida implementaccedilatildeo Eacute de referir

ainda que o coacutedigo do artigo desta ediccedilatildeo foi implementado

segundo o standard C99 (suportado pelos compiladores GCC

Clang e Pelles C) que nos permite programar de uma forma

portaacutevel e ainda assim confortaacutevel (comentaacuterios comeccedilados

com variable-length arrays tipo de dados bool entre outros)

Caso o leitor queira compilar o coacutedigo deste artigo em Linux

deve utilizar a linha de comando gcc -Wall -Wextra -std=c99 -

pedantic jogo-da-vida jogo-da-vidac

O objetivo principal deste algoritmo eacute entatildeo que o utilizador

possa decidir qual a sua populaccedilatildeo inicial e que apoacutes isso pos-

sa observar o comportamento do seu sistema Ao longo dos

anos muitas configuraccedilotildees foram testadas e experimentadas

com este jogo O jogo da vida convida a experimentar diversas

configuraccedilotildees sendo que agrave maior parte das configuraccedilotildees

iniciais escolhidas bastam apenas trecircs ou quatro geraccedilotildees

para a populaccedilatildeo desaparecer completamente Contudo haacute

algumas configuraccedilotildees jaacute conhecidas como configuraccedilotildees de

ldquoVida Eternardquo por haver sempre ceacutelulas vivas ao longo de mui-

tas geraccedilotildees (e ateacute mesmo de geraccedilotildees infinitas) como mostra

por exemplo imagem seguinte (obtida com a execuccedilatildeo do

nosso programa)

Ilustraccedilatildeo 3 - Exemplo configuraccedilatildeo Vida Eterna (Bloco)

Existem ainda diferentes configuraccedilotildees que podem ocorrer

no Jogo da Vida (configuraccedilotildees essas que o utilizador pode

facilmente encontrar na internet relativas a vaacuterios estudos jaacute

feitos sobre este algoritmo) Os exemplos mais simples satildeo

mostrados abaixo com as ceacutelulas vivas em preto e as ceacutelu-

las mortas em branco

Haacute configuraccedilotildees que satildeo alvo de vaacuterios estudos cientiacuteficos

por exemplo se dois gliders satildeo colocados em direccedilatildeo a um

bloco o bloco vai aproximar-se da fonte dos gliders mas por

outro lado se trecircs gliders satildeo colocados no mesmo lugar o

bloco vai afastar-se desses gliders Este facto eacute conhecido

como a ldquomemoacuteria de bloco deslizante e pode ser usada para

simular um contador

Eacute possiacutevel construir portas loacutegicas AND OR e NOT usando

gliders tal como eacute possiacutevel construir uma imagem que aja

como uma maacutequina de estado finito conectada a dois conta-

dores

O que significa que esta disposiccedilatildeo possui o mesmo poder

computacional de uma maacutequina de Turing universal ou seja

Jogo da Vida pode ser tatildeo poderoso quanto qualquer com-

putador com memoacuteria ilimitada dando origem ao Turing com-

pleto como jaacute vaacuterios estudos comprovam esse mesmo feito

Mais uma vez recordo ao leitor que pode experimentar sem

qualquer restriccedilatildeo as configuraccedilotildees iniciais que mais lhe

agradarem Este artigo eacute o terceiro de uma seacuterie de artigos

de programaccedilatildeo tendo como base principal a linguagem C

que esperamos que siga atentamente

JOGO DA VIDA

cvivas++ if (matrizActual[i+1][j+1] == CELVIVA) cvivas++ if (isAlive ampamp cvivas lt 2) DIE else if (isAlive ampamp cvivas gt 3) DIE else if (isAlive ampamp (cvivas == 2 || cvivas == 3)) LIVE else if (isDead ampamp cvivas == 3) LIVE else DIE

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

a matriz principal

natildeo eacute toda proces-

sada (hellip) para que natildeo

sejam gastos recur-

sos de computaccedilatildeo

A PROGRAMAR

21

Introduccedilatildeo

Atualmente a plataforma Java eacute uma das mais utilizadas no

mundo e muito disso se deve agrave capacidade da plataforma

suportar outras linguagens como por exemplo JRuby Groovy

e Scala Milhares de aplicativos para Web e Mobile satildeo de-

senvolvidos a cada mecircs utilizando esta plataforma como

base A plataforma Java mudou muito desde seu iniacutecio e

provavelmente vai continuar evoluindo nos proacuteximos anos

Em paralelo com essas mudanccedilas visualizamos os servido-

res de aplicaccedilatildeo que cada vez mais oferecem recursos de

alta complexidade como componentes de balanceamento

de carga inteligente implementaccedilatildeo de autenticaccedilatildeo (JAAS)

troca de mensagens assiacutencronas (JMS) controle de transa-

ccedilatildeo (JTA) persistecircncia de objetos (JPA) componentes para

criaccedilatildeo de aplicaccedilotildees distribuiacutedas e clusterizadas (EJB) API

Java para processamento de arquivos XML e Webservices

(JAX-WS e JAX-B) e muitas outras tecnologias facilitando o

desenvolvimento e padronizaccedilatildeo de aplicaccedilotildees Eles tam-

beacutem disponibilizam uma infraestrutura estaacutevel e escalonaacutevel

para aplicaccedilotildees de missatildeo criacutetica Um dos grandes desafios

dos servidores de aplicaccedilatildeo eacute acoplar serviccedilos de grande

complexidade deixando-os estaacuteveis e flexiacuteveis

Nas versotildees iniciais a plataforma ainda conhecida como

Java2EE natildeo estava madura e seus recursos nos servidores

de aplicaccedilatildeo eram carregados de forma hieraacuterquica consu-

mindo muitos recursos e tornando o startup altamente custo-

so

A arquitetura dos principais servidores de aplicaccedilatildeo foi rede-

senhada para que seus recursos possam ser iniciados de

modo concorrente ou sob demanda As melhorias tambeacutem

podem ser notadas no consumo de memoacuteria onde em uma

simples maacutequina desktop pode-se facilmente configurar

serviccedilos de alta disponibilidade e escalaacuteveis para realizaccedilatildeo

de testes em tempo de desenvolvimento

Se vocecirc deseja um ambiente com alta disponibilidade esca-

lonaacutevel e que seja independente de fabricante (de forma a

evitar o vendor lock-in) o Java EE e seus servidores de apli-

caccedilatildeo foram feitos para si

JBoss Application Server 7

JBoss Application Server 7 ou apenas JBoss AS 7 eacute um ser-

vidor de aplicaccedilatildeo de coacutedigo aberto que eacute 100 compatiacutevel

com a especificaccedilatildeo Java EE 6 Em versotildees anteriores do

Java EE mesmo utilizando somente algumas tecnologias

para o desenvolvimento da aplicaccedilatildeo eacuteramos obrigados a

lidar com todos os recursos implementados no servidor Para

resolver esse problema no Java EE 6 foi inserido o conceito

JBoss Aplication Server 7 de profile que tem como objetivo criar configuraccedilotildees com fins

especiacuteficos como por exemplo o Web Profile que possui tec-

nologias para o desenvolvimento web

Ateacute ao momento a versatildeo atual do JBoss AS foi baixada

mais de 150 mil vezes Para mais informaccedilotildees visite o site

do projeto httpwwwjbossorgjbossas

Recentemente o projeto recebeu um novo nome e futura-

mente se chamaraacute WildFly Mais informaccedilotildees podem ser

encontradas em httpwwwwildflyorgfaq

Requisitos

Como todo servidor de aplicaccedilatildeo o JBoss AS 7 requer um

ambiente com JDK 16JDK 17 devidamente configurado e

instalado O Java Development Kit (JDK) eacute um conjunto de

utilitaacuterios para criaccedilatildeo de softwares para plataforma Java

Existem vaacuterias implementaccedilotildees cada qual com a sua finali-

dade

Para baixar o JDK 7 navegue ateacute a paacutegina de download da

Oracle em httpwwworaclecomtechnetworkjavajavase

downloadsindexhtml e escolha a opccedilatildeo Java Platform

(JDK) Em seguida vocecirc seraacute direcionado para outra paacutegina

onde deveraacute aceitar a License Agreement Baixe a versatildeo

jdk-7u21-linux-x64rpm

Para instalar o JDK execute o seguinte comando

$ sudo rpm -Uvh jdk-7u21-linux-x64rpm

Execute o comando java --version para verificar se o JDK

estaacute instalado

$ java --version

java version 170_21

Java(TM) SE Runtime Environment (build 170_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 2321-b01 mixed

mode)

Duvidas na instalaccedilatildeo Consulte o link

httpdocsoraclecomjavase7docswebnotesinstall

indexhtml

Instalando o JBoss AS 7

O JBoss AS 7 pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgjbossasdownloads Para

instalar basta descompactar o arquivo jboss-as-

711Finalzip utilizando um utilitaacuterio de descompressatildeo

A PROGRAMAR

22

Boas Praacuteticas

Nunca inicie o JBoss utilizando o usuaacuterio root pois a platafor-

ma Java oferece APIs para execuccedilatildeo de coacutedigos nativos do

sistema operacional e mecanismos de gerenciamento remoto

No Linux crie um usuaacuterio com privileacutegios de root para iniciar o

serviccedilo do JBoss Jaacute no Windows crie um usuaacuterio com poderes

administrativos mas com privileacutegios reduzidos

Uma vez instalado eacute fortemente aconselhaacutevel iniciar o JBoss

AS para verificar se existe alguma incompatibilidade com a

arquitetura do JDK utilizado ou ateacute mesmo se a memoacuteria dispo-

nibilizada eacute suficiente

Execute uma simples instacircncia standalone e acesse a url http

localhost8080 para verificar se o JBoss foi iniciado correta-

mente

$ jboss-as-711Finalbinstandalonesh

Domain Mode x Standalone Mode

O JBoss AS 7 possui dois modelos de trabalho conhecidos

como Standalone Mode e Domain Mode No Standalone Mode

podemos trabalhar com uma uacutenica instacircncia muito semelhante

a versotildees anteriores do JBoss AS 5 e JBoss AS 6 Para utilizar

o Standalone mode basta iniciar o script JBOSS_HOME

standalonesh no Linux

Agora vocecirc deve estar se perguntando se eacute possiacutevel criar um

ambiente de alta disponibilidade utilizando o Standalone

Mode A resposta eacute Sim Eacute possiacutevel criar um ambiente com

recursos clusterizados replicaccedilatildeo de sessatildeo e tudo mais Se

vocecirc jaacute utilizou outras versotildees do JBoss deve estar pensan-

do em utilizar o famoso Farm Deployment onde a aplicaccedilatildeo

era replicada para todos os noacutes do cluster Esse recurso natildeo

existe no Standalone Mode pelo que vocecirc teraacute que realizar

o deploy em todos os noacutes um por um Isso natildeo eacute um proble-

ma se forem 3 ou 4 instacircncias mas imagine se forem umas

20 instacircncias

Uma soluccedilatildeo para esse problema seria a utilizaccedilatildeo de ferra-

mentas como o RHQ (httpwwwjbossorgrhq) para realiza-

ccedilatildeo do deploy em muacuteltiplas instacircncias o que acarretaria con-

sumo de mais recursos e tempo Para solucionar esse pro-

blema temos uma soluccedilatildeo bem simples jaacute embutida no servi-

dor de aplicaccedilatildeo o Domain Mode e eacute sobre isso que vamos

falar no proacuteximo toacutepico

Introduccedilatildeo ao Domain Mode

O Domain Mode permite iniciar vaacuterias instacircncias e tambeacutem

oferece uma maneira centralizada de gerenciamento dos

recursos facilitando a administraccedilatildeo das instacircncias JBoss O

Domain Mode pode ser visto como uma unidade de instacircn-

cias que compartilham recursos e configuraccedilotildees e satildeo admi-

nistradas por um processo chamado Domain Controller

Para iniciar o JBoss AS 7 de modo domain execute o script

JBOSS_HOMEdomainsh no Linux ou JBOSS_HOME

domainbat no Windows

Quando iniciamos o JBoss em Domain Mode na configura-

ccedilatildeo default temos no miacutenimo quatro processos um Host

Controller um Process Controller e dois Servers

Domain Controller Ele eacute quem controla o gerenciamento

do domain Nele estatildeo as configuraccedilotildees que satildeo comparti-

lhadas entre as instacircncias que estatildeo nesse domain

Process Controller Ele eacute de grande importacircncia pois ele eacute

responsaacutevel pela criaccedilatildeo das instacircncias e tambeacutem do Host

Controller que vamos falar a seguir O Process Controller

natildeo deve ser confundido com uma instacircncia ele eacute

simplesmente um processo na JVM

Host Controller Como Domain Controller o Host Controller

tambeacutem coordena as instacircncias do domain Ele eacute o

responsaacutevel por fazer algo semelhando ao Farm Deployment

(natildeo existe nessa versatildeo) ou seja ele distribui o arquivo

deployado para todas as instacircncias do domain

Servers Satildeo as instacircncias em si onde estatildeo as aplicaccedilotildees

deployadas Um ponto importante eacute que cada server eacute um

processo Java

Entre os benefiacutecios da utilizaccedilatildeo do Modo Domain que noacutes

podemos citar estatildeo

Gestatildeo Centralizada

JBOSS APLICATION SERVER 7

A PROGRAMAR

23

Configuraccedilatildeo Centralizada

Deploy Centralizado

Manutenccedilatildeo Centralizada

Preparando a Infra Estrutura

Nesse artigo estamos utilizando Trecircs servidores Dois deles

seratildeo utilizados pelas as instacircncias JBoss e Um seraacute utilizado

Pelo Domain Controller e Apache Web Server para realizar o

Balanceamento de carga

Crie um grupo e adicione um usuaacuterio para ser utilizado

pelo JBoss AS 7 em todos os servidores

$ sudo groupadd jboss

$ sudo useradd -s binbash -d homejboss -m -g jboss

jboss

Faccedila tambeacutem o download do JBoss AS 7 no diretoacuterio

tmp

$ cd tmp

$ wget httpdownloadjbossorgjbossas71jboss-as-

711Finaljboss-as-711Finalzip

Crie a estrutura de diretoacuterios para armazenar o JBoss

$ sudo mkdir usrlocaljboss

$ chown jbossjboss usrlocaljboss

$ su jboss

$ mkdir usrlocaljboss

$ cd usrlocaljboss

$ unzip tmpjboss-as-711Finalzip

Finalmente o JBoss AS 7 estaacute instalado em usr

localjbossjboss-as-711 Final em todos os servidores

Configurando Alta Disponibilidade

Para aplicaccedilotildees com muitas solicitaccedilotildees a busca pela

melhora do desempenho eacute quase constante Um dos

meios mais utilizados eacute o Balanceamento de Carga

que consiste em distribuir a carga das solicitaccedilotildees em

vaacuterios servidores ou instacircncias proporcionando a

melhora no tempo de reposta

O JBoss AS 7 possui um componente nativo

conhecido como mod_cluster que foi criado para

atender a mecanismos de balanceamento de carga

alinhados ao conceito de Cloud O Mod Cluster vem

com algoritmos de balanceamento de carga mais

avanccedilados que se baseiam na carga da aplicaccedilatildeo ou

seja quantidades de sessotildees conexotildees abertas

entre outros Ele pode ser customizado conforme a

necessidade da aplicaccedilatildeo visando um ambiente

elaacutestico Um das vantagens eacute tambeacutem o

descobrimento automaacutetico de novas instacircncias JBoss

(utilizando Multicast) natildeo havendo a necessidade de

configuraccedilotildees extras

As configuraccedilotildees do mod_cluster devem ser

realizadas no JBoss AS 7 e no Apache Web Server

que seraacute utilizado como Proxy reverso

Instalando Apache Web Server

No Servidor Balancer instale o Apache Web Server

Basta executar o seguinte comando

$ sudo yum install httpd -y

Inicie o serviccedilo e verifique se paacutegina de testes eacute

carregada

$ sudo service httpd start

Instalando Mod Cluster

Ainda no Servidor Balancer instale o Mod Cluster Ele

pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgmod_cluster

downloads1-2-0-Final Para instalar basta

JBOSS APLICATION SERVER 7

A PROGRAMAR

24

descompactar o arquivo mod_cluster-120Final-linux2-

x64-ssltargz utilizando um utilitaacuterio de descompressatildeo

e copiar os moacutedulos para o diretoacuterio de moacutedulos do

Apache Web Server

Para baixar e extrair o arquivo execute

$ cd tmp

$ wget httpdownloadsjbossorg

mod_cluster120Finalmod_cluster-120Final-

linux2-x64-ssltargz

$ tar -zxvf mod_cluster-120Final-linux2-x64-

ssltargz

Copie os moacutedulos para o Apache

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_advertiseso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_managerso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_proxy_clusterso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_slotmemso etchttpdmodules

Edite o arquivo etchttpdconfhttpdconf e comente a

linha LoadModule proxy_balancer_module modules

mod_proxy_balancerso para natildeo ocorrer um conflito

com LoadModule proxy_cluster_module modules

mod_proxy_clusterso

LoadModule proxy_balancer_module modules

mod_proxy_balancerso

Crie o arquivo mod_clusterconf e adicione a seguinte

configuraccedilatildeo

$ sudo vim etchttpdconfdmod_clusterconf

Reinicie o Apache

$ sudo service httpd restart

Acesse o mod_cluster-manager e verifique se as

informaccedilotildees sobre a versatildeo do mod_cluster estatildeo

aparecendo

Arquitetura dos Servidores em Modo Domain

Para realizar os testes do balanceamento de carga

com o mod_cluster vamos subir o Domain Controller

e depois vamos conectar dois Hosts Controller com

uma Instacircncia JBoss em cada

Criando os Perfis dos Servidores JBoss

No Servidor Balancer crie o perfil chamado master

que seraacute o Domain Controller

$ cp -Rap usrlocaljbossjboss-as-711Final

domain usrlocaljbossjboss-as-711Finalmaster

JBOSS APLICATION SERVER 7

Content Mod Cluster LoadModule slotmem_module modules mod_slotmemso LoadModule manager_module modules mod_managerso LoadModule proxy_cluster_module modules mod_proxy_clusterso LoadModule advertise_module modules mod_advertiseso ltVirtualHost 80gt ltDirectory gt Order denyallow Allow from all ltDirectorygt KeepAliveTimeout 60 ManagerBalancerName mycluster MaxKeepAliveRequests 0 ServerAdvertise On EnableMCPMReceive On ltVirtualHostgt ltLocation mod_cluster-managergt SetHandler mod_cluster-manager Order denyallow Allow from all ltLocationgt

A PROGRAMAR

25

No Servidor Host-01 crie o perfil chamado host01 que

seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost01

No Servidor Host-02 crie o perfil chamado host02 que

tambeacutem seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost02

Configurando Toda a Arquitetura

Como vimos anteriormente todas as configuraccedilotildees e

gerenciamento satildeo realizadas de forma centralizada no

Domain Controller Quando for necessaacuterio adicionar um

novo grupo de servidores configurar logs criar

datasources alterar portas entre outras coisas tudo

isso deveraacute ser feito no domainxml do Domain

Controller que nesse caso eacute chamado de master Sendo

assim todas as nossas instacircncias JBoss usufruiratildeo das

configuraccedilotildees realizadas para o Domain ou para o

Server Group em questatildeo

A primeira coisa a ser feita eacute definir qual o conjunto de

tecnologias (subsystems) seratildeo utilizadas na aplicaccedilatildeo

Isso pode variar conforme os requisitos de cada

sistema Um conjunto de tecnologias (subsystems) no

JBoss 7 eacute chamado de profile

ltprofile name=full-hagt

O JBoss AS 7 possui 4 profiles por padratildeo ldquodefaultrdquo

ldquofullrdquo ldquohardquo ldquofull-hardquo mas nada impede de noacutes

copiarmos qualquer um deles e renomeaacute-los conforme

nossos requisitos No Java EE 6 foi introduzido o

conceito de Profiles onde se pode criar um subconjunto

de tecnologias presentes na spec Java EE ou ateacute

mesmo adicionar novas definidas pela JCP (Java

Community Process)

Mais informaccedilotildees

httpscommunityjbossorgwiki

JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Noacutes vamos utilizar o profile ha pois nele os recursos

para clusterizaccedilatildeo estatildeo disponiacuteveis

Depois de definir o profile o proacuteximo criar um Grupo de

Servidores Server Group Um server group nada mais eacute

que um agrupamento de instacircncias JBoss Nessa

arquitetura vamos utilizar apenas um server group Isso

pode ser definido na tag ltserver-groupsgt no domainxml

do master (Domain Controller)

Crie um Server Group chamado apps que utilize o

profile ha

$ vim usrlocaljbossjboss-as-711Finalmaster

configurationdomainxml

Os outros Server Groups podem ser removidos

No profile ha especificamente no subsystem web

adicione o atributo instance-id

O instance-id seraacute passado como paracircmetro na

inicializaccedilatildeo do Host Controller

O proacuteximo passo eacute configurar o atributo proxy list no

subsystem modcluster

Nesse atributo estaacute configurado o IP e porta do

Apache Web Server

No Servidor Host-01 edite o arquivo usrlocaljboss

jboss-as-711Finalhost01configurationhost-

slavexml para criar a instacircncia JBoss

Na tag ltserversgt eacute onde estatildeo de fato as nossas

instacircncias JBoss Quando criamos um novo ltservergt

estamos criando uma nova instacircncia JBoss

Conforme foi definido na arquitetura o Host Controller

01 conteraacute apenas uma instacircncia JBoss chamada

instance-one

Deixe o ltserversgt como abaixo

Definimos que a instacircncia JBoss instance-one faraacute

parte do Server Group apps

Para finalizar na tag lthostgt adicione o nome host01

lthost name=host01 xmlns=urnjbossdomain12gt

JBOSS APLICATION SERVER 7

ltserver-group name=apps profile=hagt ltjvm name=defaultgt ltheap size=1303m max-size=1303mgt ltpermgen max-size=256mgt ltjvmgt ltsocket-binding-group ref=ha-socketsgt ltserver-groupgt

ltsubsystem xmlns=urnjbossdomainweb12 de-fault-virtual-server=default-host instance- id=$jbossservername native=falsegt

ltsubsystem xmlns=urnjbossdomainmodcluster10gt ltmod-cluster-config advertise-socket=modcluster proxy-list=19216823818680gt ltdynamic-load-providergt ltload-metric type=busynessgt ltdynamic-load-providergt ltmod-cluster-configgt ltsubsystemgt

ltserversgt ltserver name=instance-one group=appsgt ltservergt ltserversgt

A PROGRAMAR

26

Repita os procedimentos realizados no servidor Host -01

em Host-02 alterando apenas o nome do servidor que

seraacute instance-two e do lthostgt que seraacute host02No

ambiente em que realizei os testes o sevidores possuem

os seguintes IPs

Domain Controller+Apache WebServer 192168238186

Host Controller 01 192168238187

Host Controller 02 192168238188

Inicie o Domain Controler (master) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalmaster

-Djbosshostdefaultconfig=host-masterxml -

Djbossbindaddress=192168238186 -

Djbossbindaddressmanagement=192168238186

Verifique o log

JBoss AS 711Final Brontes (Host Controller) started

in 15505ms - Started 11 of 11 services (0 services are

passive or on-demand)

O Domain Controller foi iniciado com sucesso Conecte

primeiro Host Controller 01 (Host-01) ao Master Inicie o

Perfil host01 utilizando os seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost01

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238187

-Djbossbindaddress=192168238187

-Djbossservername=host-01

Agora observe os logs no Domain Controller e perceba

que o Host Controller 01 se conectou ao Domain

JBAS010918 Registered remote slave host host01

JBoss AS 711Final Brontes

Observe tambeacutem o Mod Cluster Manager em

http192168238186mod_cluster-manager e veja que

a nossa primeira instacircncia jaacute apareceu

Inicie o Host Controller 02 (slave02) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost02

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238188

-Djbossbindaddress=192168238188

-Djbossservername=host-02

Observando novamente o log Domain Controller e

verifique que o Host Controller 02 se tambeacutem

conectou

JBAS010918 Registered remote slave host host02

JBoss AS 711Final Brontes

No Mod Cluster Manager em http192168238186

mod_cluster-manager jaacute estatildeo as duas instacircncias

Para testar o Balanceamento vamos fazer o deploy da

aplicaccedilatildeo SystemProps que pode ser baixada http

googlyjynK Para fazer o deploy conecte do domain

controller utilizando o CLI

[jbosslocalhost jboss]$ sudo jboss-as-711Final

binjboss-clish -c controller=1921682381869999

[domain1921682381869999 ] deploy tmp

systempropswar --server-groups=apps

A aplicaccedilatildeo foi deployada para as instacircncias do server

group apps Acesse a url do balanceador e verifique

se a aplicaccedilatildeo estaacute disponiacutevel

http192168238186systemprops

JBOSS APLICATION SERVER 7

A PROGRAMAR

27

Perceba que estamos na instance-one Entatildeo para

testarmos o funcionamento do balanceamento de carga

vamos parar a Instacircncia instance-one e quando

tentarmos um novo acesso seraacute redirecionado para o

instance-two

No CLI execute o seguinte comando para parar o

instance-one

[domain1921682381869999 ] host=host01server -

config=instance-onestop

outcome =gt success

result =gt STOPPING

Acesse novamente a aplicaccedilatildeo http192168238186

systemprops

Perceba que agora estamos no instance-two Concluiacutemos assim que o balanceamento de carga estaacute funcionando

Conclusatildeo

O JBoss AS 7 trouxe a evoluccedilatildeo arquitetural que era esperada como pode ser vista nesse artigo Carregamento de moacutedulos dinacircmico gerenciamento centralizado e tempo de startup reduzido satildeo apenas

algumas das inuacutemeras melhorias trazidas nessa versatildeo

Espera-se que a plataforma JBoss continue evoluindo

trazendo sempre mais benefiacutecios a todos que utilizam

os produtos desse ecossistema Cada membro da

comunidade tambeacutem pode fazer a sua parte seja

colaborando com artigos ou participando de

discussotildees para encontrar melhorias para a

plataforma Cabe a noacutes aceitar o convite de melhorar

cada vez mais essa tecnologia

JBOSS APLICATION SERVER 7

AUTOR Escrito por Mauricio Magnani Jr

Consultor JBoss com 6 anos de experiecircncia no mercado Trabalhou na RedHat como Engenheiro de Suporte JBoss atenden-

do clientes da Ameacuterica Latina e EUA Criador e mantenedor do blog httpsjbossdiverswordpresscom e membro ativo do

Grupo de Usuaacuterios JBoss do Brasil Hoje eacute Senior Java Software Engineer no Groupon Brasil Possui as certificaccedilotildees Red Hat

Certified JBoss Administrator on JBoss EAP 5 e JBoss EAP 6

Milhares de apli-

cativos para Web

e Mobile satildeo desenvol-

vidos a cada mecircs utili-

zando esta plataforma

como base A platafor-

ma Java mudou muito

desde seu iniacutecio e pro-

vavelmente vai conti-

nuar evoluindo nos

proacuteximos anos

A PROGRAMAR

28

Para o desenvolvimento de aplicaccedilotildees Web existem um sem

nuacutemero de frameworks gratuitas e mais ou menos bem con-

ceituadas Contudo temos vaacuterios problemas associados que

com o crescer de uma aplicaccedilatildeo podem trazer vaacuterios recuos

no seu desenvolvimento Um dos maiores eacute o oacutebvio satildeo

gratuitas e por isso mesmo o coacutedigo eacute lido por milhares de

pessoas em todo o mundo tornando as falhas de seguranccedila

bastante visiacuteveis e faacuteceis de explorar Outro grande proble-

ma eacute o facto de trazerem funcionalidades especiacuteficas em que

muitas vezes natildeo as usamos tornando-se em alguns casos

um ldquocanhatildeo para matar um mosquitordquo Pegando na aborda-

gem das correntes frameworks podemos noacutes proacuteprios cons-

truir algo soacutelido o suficiente para uma grande aplicaccedilatildeo

Vamos nesta seacuterie de trecircs artigos construir uma framework

passo-a-passo comeccedilando pelo baacutesico mas o mais importan-

te o routing

htaccess

Tirando partido do serviccedilo Apache delegamos o enclausura-

mento do nosso sistema de ficheiros agrave regras htaccess Natildeo

permitimos a listagem de ficheiros nem a execuccedilatildeo de outros

scripts PHP agrave excepccedilatildeo do indexphp sendo este o respon-

saacutevel pelo routing da framework Para garantirmos que estas

regras satildeo cumpridas e que o indexphp seja sempre chama-

do redireccionamos todos os pedidos de execuccedilatildeo de

scripts para o mesmo indexphp dando-lhe todos os argu-

mentos do URL originalmente fornecidos Desta forma o

utilizador natildeo sabe a que ficheiros ou pastas estaacute a aceder

A esta regra temos de adicionar uma excepccedilatildeo a pasta con-

tent onde temos todos os conteuacutedos como imagens ficheiros

CSS viacutedeos etc No fundo todos aqueles ficheiros que o

browser do utilizador vai descarregar Para mantermos o

enclausuramento da nossa aplicaccedilatildeo natildeo eacute aconselhado

natildeo colocarmos nessa pasta nenhum tipo de script visto que

pode ser executado arbitrariamente do exterior o contraacuterio

do que queremos

configphp

PHP Uma framework ldquofrom scratchrdquo (Parte 1) Usaremos este ficheiro como auxilio para definiccedilotildees de cami-

nhos para pastas e configuraccedilotildees por defeito

define(DS DIRECTORY_SEPARATOR)

Esta definiccedilatildeo eacute uma redundacircncia eacute definida simplesmente

por conveniecircncia na escrita do coacutedigo

define(BASE_PATHhttplocalhost)

Aqui definimos o caminho URL para a nossa aplicaccedilatildeo

define(DEFAULT_PAGEhello)

Esta eacute a nossa paacutegina por defeito caso nenhuma tenha sido

requirida

define(ROOT$_SERVER[DOCUMENT_ROOT])

Aqui eacute definido o caminho para a pasta da aplicaccedilatildeo

Uma vez definidas as configuraccedilotildees passamos agrave parte mais

importante o routing

Visto que temos todos os requests redireccionados para o

indexphp agora temos de fazer sentido dos argumentos

que satildeo passados pelo URL

Aqui separamos os argumentos em duas partes a paacutegina

que queremos aceder e os argumentos para esta paacutegina O

seguinte pedido

httplocalhosthellofoobar

resulta em

RewriteEngine on RewriteCond $1 ^(allowphp|indexphp|content) RewriteRule ^()$ indexphp$1 [L] ltFiles htaccessgt order allowdeny deny from all ltFilesgt

define(DS DIRECTORY_SEPARATOR) define(BASE_PATHhttplocalhost) define(DEFAULT_PAGEhello) define(ROOT$_SERVER[DOCUMENT_ROOT])

function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url

array (size=2) page =gt string hello (length=5) args =gt array (size=2) 0 =gt string foo (length=3) 1 =gt string bar (length=3)

A PROGRAMAR

29

(hellip)micro-

framework temos um

sistema de routing que

nos iraacute permitir nos

dois proacuteximos artigos

alargar os horizontes

passando a uma pro-

gramaccedilatildeo OOP e imple-

mentando MVC

De seguida encaminhamos para a paacutegina requerida

Aqui verificamos se a paacutegina que eacute pedida existe no case de

existir importamos o ficheiro caso contrario enviamos o header

de erro e terminamos a aplicaccedilatildeo

Indexphp

ROOT

Indexphp

Configphp

htaccess

Pages

Hellophp

Com esta micro-framework temos um sistema de routing que

nos iraacute permitir nos dois proacuteximos artigos alargar os horizon-

tes passando a uma programaccedilatildeo OOP e implementando

MVC Finalmente iremos implementar um pequeno driver

para MySQL e um debugger

Dependecircncias

Apache com mod_rewrite e PHP

P VS NP COMPREENDER O MAIOR PROBLEMA POR RESOLVER EM COMPUTACcedilAtildeO

function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

ltphp require_once (configphp) function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

callHook() gt

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

COLUNAS C - Observable vs Task

Visual (Not) Basic - Operator Overloading

C

32

Nas ediccedilotildees anteriores vimos como transformar uma API

baseada assiacutencrona em eventos numa API baseada em ob-

servaacuteveis (observables) ou numa API baseada em tarefas

A questatildeo que se levanta eacute quando usar qual

Quando Usar Observaacuteveis

A programaccedilatildeo baseada em observaacuteveis eacute tambeacutem conheci-

da como programaccedilatildeo reativa e comeccedilou a ser usada como

alternativa a assiacutencrona baseada em eventos porque a pro-

gramaccedilatildeo assiacutencrona baseada em tarefas ainda natildeo estava

disponiacutevel (ou natildeo estava disponiacutevel em todas as platafor-

mas)

Na verdade o campo de batalha da programaccedilatildeo reativa

satildeo as correntes de eventos (event streams) Eacute aqui que a

utilizaccedilatildeo de eventos se torna tambeacutem mais natural

Uma API baseada em eventos em que o evento apenas eacute

disparado uma vez eacute na verdade uma API baseada em

chamadas de resposta (callback) O facto de ser implemen-

tada com o mecanismo de eventos da plataforma NET natildeo

faz dela uma API baseada em eventos

A existecircncia da necessidade de combinar vaacuterias correntes de

eventos e relacionaacute-los entre si eacute tambeacutem uma boa indicaccedilatildeo

para a utilizaccedilatildeo de observaacuteveis

Quando Usar Tarefas

Como o nome indica uma tarefa eacute algo que tem um iniacutecio e

um fim Assim sendo todas as API assiacutencronoas baseadas

num mecanismo de chamada de resposta (callback) satildeo

candidatadas a ser transformadas numa API assiacutencrona

baseada em tarefas Mesmo que o mecanismo de chamada

de resposta sejam eventos NET

Matriz De Aplicabilidade

Baseando-nos nas consideraccedilotildees anteriores e porque nem

sempre tudo eacute assiacutencrono chegamos agrave seguinte matriz de

aplicabilidade

Conclusatildeo

No final natildeo existe uma resposta maacutegica O que numa situa-

ccedilatildeo pode ser um observaacutevel noutra pode ser uma tarefa

Recursos

O GeoCoordinateWatcher Como Um Serviccedilo Reativo - Re-

vista PROGRAMAR - 39ordf Ediccedilatildeo - Fevereiro 2013

Trazendo Async E Await ao Serviccedilo de Contactos do Win-

dows Phone - Revista PROGRAMAR - 40ordf Ediccedilatildeo - Abril

2013

Extensotildees Reativas (Rx)

Programaccedilatildeo assiacutencrona com async e await (C e Visual

Basic)

C - OBSERVABLE VS TASK

Siacutencrono Assiacutencrono

Um uacutenico valor - Tarefa

Muacuteltiplos valo-

res

Enumeraacutevel Observaacutevel

AUTOR

Escrito por Paulo Morgado

Bacharel em Engenharia Electroacutenica e Telecomunicaccedilotildees (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa

e Licenciado em Engenharia Informaacutetica pela Faculdade de Ciecircncias e Tecnologia da Universidade Nova de Lisboa exerce

variadas funccedilotildees relacionadas com o desenvolvimento distribuiccedilatildeo e manutenccedilatildeo de software haacute mais de 10 anos Participa

em diversas comunidades nacionais e internacionais (pontoNETpt NetPonto SharePointPT SQLPort Portugal-a-Programar

CodeProject CodePlex etc) Pelo seu contributo para com estas comunidades a Microsoft premeia-o com o preacutemio MVP

(C) desde 2003 Eacute ainda co-autor do livro ldquoLINQ Com Crdquo da FCA httpPauloMorgadoNET - PauloMorgado

o campo de bata-

lha da programaccedilatildeo re-

ativa satildeo as correntes

de eventos (event stre-

ams)

VISUAL (NOT) BASIC

33

ldquoNatildeo podes somar batatas com elefantesrdquo

Frases como a anterior ou semelhantes jaacute vos passaram

por a consideraccedilatildeo em alguma altura da vossa vida Quer

tenha sido nos vossos primeiros passos a matemaacutetica ou

ainda na semana passada em qualquer implementaccedilatildeo de

software mais rebuscada algueacutem algures transmitiu dessa

forma que natildeo eacute possiacutevel operar aquelas duas variaacuteveis

De facto batatas e elefantes natildeo satildeo tipicamente operaacuteveis

a menos que a resposta de que estamos agrave procura seja dife-

rente

Saber como operar

A soluccedilatildeo da soma de batatas com elefantes reside precisa-

mente na resposta que procuramos obter

Eu posso dizer que Elefante + Batata eacute igual a 4 se for es-

pecificado que a soma de seres-vivos opera aritmeticamente

o nuacutemero de pernas do ser Natildeo posso Claro que posso

Soacute precisamos de definir que os seres-vivos satildeo operaacuteveis

assim e de que forma Eacute aqui que entra o ldquooverloadrdquo de ope-

radores

Operadores

Operadores sim Quando se falam de operadores referem-

se todos aqueles que estatildeo provavelmente a passar-vos na

cabeccedila agora tanto unaacuterios como binaacuterios mas nem todos

Unaacuterios + - Not IsTrue IsFalse CType

Binaacuterios + - amp Like Mod And Or Xor ^ ltlt

gtgt = ltgt gt lt gt= lt=

Estes operadores fazem sentido nos usos comuns onde jaacute

sabemos para que servem e que resultados vatildeo surtir

Agrave luz da especificaccedilatildeo anterior podemos afirmar com segu-

ranccedila que Elefante gt Batata porque uma batata natildeo tem

pernas e porque conhecemos o operador gt (maior que)

A implementaccedilatildeo do operador pode basear-se em qualquer

aspecto dos seus operandos mas natildeo eacute boa ideia contradi-

zer a loacutegica do operador que se estaacute a definir Por razotildees

oacutebvias natildeo eacute boa ideia por exemplo implementar overloads

de tal forma que Batata - Elefante = -4 ao mesmo tempo que

Batata gt Elefante = TRUE Natildeo faz sentido porque natildeo esta-

mos a usar o mesmo criteacuterio Se Batata ndash Elefante eacute menor

que zero a Batata deveria ser menor que o Elefante e natildeo o

contraacuterio

Natildeo eacute que seja impossiacutevel mas vai tornar o coacutedigo muito

mais difiacutecil de ler o que vai contra a facilidade do overload

de operadores

Overload

A ideia natildeo eacute inventar novos operadores O que queremos

realmente indicar eacute qual o procedimento a seguir para conse-

guir aplicar o anaacutelogo do operador para determinado tipo ou

determinados tipos Assim o operador + por exemplo teraacute

de continuar a fazer sentido na aritmeacutetica ao mesmo tempo

que faz sentido na soma de seres-vivos se tentarmos somar

nuacutemeros entra o operador aritmeacutetico se tentarmos somar

batatas com elefantes entra a nossa implementaccedilatildeo do ope-

rador

Portanto e em tom de resumo da mesma forma que defini-

mos overloads de meacutetodos tambeacutem se definem overloads

de operadores com base na sua assinatura

Jaacute chega de elefantes e batatas natildeo

Efectivamente jaacute Natildeo conveacutem esticar a analogia ateacute porque

nem todos os operadores fazem sentido com uma classe de

seres vivos As coisas comeccedilam a ficar mais claras com

exemplos de implementaccedilatildeo

Vamos considerar a seguinte classe para exemplificar

Como seraacute de esperar se tentarmos por exemplo comparar

instacircncias desta classe o Visual Basic natildeo saberaacute o que

fazer para comparar Eacute um tipo composto que compreende

OPERATOR OVERLOADING

Public Class Veiculo Public Enum TipoVeiculo AUTOMOVEL MOTO PESADO End Enum Public Enum TipoCombustivel GASOLINA GASOLEO HIBRIDO ELECTRICO GPL End Enum Public Property Tipo As TipoVeiculo Public Property Marca As String Public Property Modelo As String Public Property Cilindrada As Integer Public Property Combustivel As TipoCombustivel Public Property NumeroPortas As Short Sub New(Tipo As TipoVeiculo Marca As String Modelo As String Cilindrada As Integer Combustivel As TipoCombustivel NumeroPortas As Short) _Tipo = Tipo _Marca = Marca _Modelo = Modelo _Cilindrada = Cilindrada _Combustivel = Combustivel _NumeroPortas = NumeroPortas End Sub End Class

VISUAL (NOT) BASIC

34

membros que noacutes mesmos criamos e seria impossiacutevel perce-

ber automaticamente quais as caracteriacutesticas a comparar

Este coacutedigo natildeo compila com dois erros em Carro1 = Carro2

e Carro2 = Carro3

Operator = is not defined for types OperatorOverloadVeicu-

lo and OperatorOverloadVeiculo

E tem toda a razatildeo O operador igual (=) natildeo estaacute nem im-

plementado na classe nem tem nenhum overload que im-

plique uma operaccedilatildeo binaacuteria com dois tipos Veiculo

Vamos entatildeo implementar um operador para o igual (=) que

consiga determinar se estamos na presenccedila do mesmo

veiacuteculo ou natildeo Vamos considerar que a cilindrada natildeo eacute um

factor para distinguir dois carros

Basta acrescentar os seguintes meacutetodos na classe Veiculo

Algumas implementaccedilotildees de operadores implicam que se

implementem tambeacutem a sua negaccedilatildeo No caso do operador

igual (=) eacute necessaacuterio natildeo soacute especificar o que eacute consider-

ado igual mas tambeacutem o que eacute considerado diferente

Assim o coacutedigo anterior jaacute eacute correctamente compilado e

produz o seguinte output

Carro1 = Carro2 False

Carro2 = Carro3 True

O que eacute verdade Como operaccedilotildees aritmeacuteticas natildeo faziam

muito sentido com uma classe a representar um veiacuteculo

vamos considerar esta nova classe

Esta classe representa um vector tridimensional Manteacutem um

valor para X para Y e para Z Natildeo adianta realizar

operaccedilotildees aritmeacuteticas com o Vector uma vez que novamen-

te o Visual Basic natildeo saberia o que fazer com ele

Vamos entatildeo acrescentar alguns operadores

Assim jaacute eacute possiacutevel efectuar algumas operaccedilotildees com esta

classe

OPERADOR LIKE

Public Shared Operator =(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return False If V1Combustivel ltgt V2Combustivel Then Return False If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return False If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return False If V1NumeroPortas ltgt V2NumeroPortas Then Return False Return True End Operator Public Shared Operator ltgt(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return True If V1Combustivel ltgt V2Combustivel Then Return True If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return True If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return True If V1NumeroPortas ltgt V2NumeroPortas Then Return True Return False End Operator

Public Class Vector3 Public Property X As Decimal Public Property Y As Decimal Public Property Z As Decimal Sub New(X As Decimal Y As Decimal Z As Decimal) _X = X _Y = Y _Z = Z End Sub Public Overrides Function ToString() As String Return StringFormat((012) _X _Y _Z) End Function End Class

Public Shared Operator +(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X + V1X V2Y + V1Y V2Z + V1Z) End Operator Public Shared Operator -(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X - V1X V2Y - V1Y V2Z - V1Z) End Operator Public Shared Operator (V1 As Vector3 V2 As Vector3) Return (V2X V1X) + (V2Y V1Y) + (V2Z V1Z) End Operator Public Shared Operator (V1 As Vector3 E1 As Decimal) Return New Vector3(E1 V1X E1 V1Y E1 V1Z) End Operator Public Shared Operator amp(S1 As String V1 As Vector3) Return S1 amp V1ToString End Operator

Dim V1 As New Vector3(3 2 1) Dim V2 As New Vector3(1 2 3) DebugWriteLine(Adiccedilatildeo amp (V1 + V2)) DebugWriteLine(Subtraccedilatildeo amp (V1 - V2)) DebugWriteLine(Produto escalar amp (V1 V2)) DebugWriteLine(Multiplicaccedilatildeo com escalar amp (V2 3))

Dim Carro1 As New Veiculo(AUTOMOVEL Ford Ka 1249 GASOLINA 3) Dim Carro2 As New Veiculo(AUTOMOVEL Ford Ka 1250 GASOLEO 3) Dim Carro3 As New Veiculo(AUTOMOVEL Ford Ka 1251 GASOLEO 3) DebugWriteLine(Carro1 = Carro2 amp (Carro1 = Carro2)) DebugWriteLine(Carro2 = Carro3 amp (Carro2 = Carro3))

VISUAL (NOT) BASIC

35

O que produz

Adiccedilatildeo (444)

Subtraccedilatildeo (-202)

Produto escalar 10

Multiplicaccedilatildeo com escalar (369)

Foi necessaacuterio especificar o operador de concatenaccedilatildeo para

que o Visual Basic saiba como tratar a concatenaccedilatildeo de uma

String com o resultado de uma outra operaccedilatildeo com a mesma

classe

Neste caso estamos apenas a concatenar a String com a

representaccedilatildeo String da classe que definimos anteriormen-

te Ao analisar os operadores podemos verificar que existem

dois overloads para a multiplicaccedilatildeo

Um implica dois vectores e o outro um vector e um decimal

A nossa implementaccedilatildeo dita que se forem fornecidos dois

vectores o resultado seraacute o produto escalar dos dois vec-

tores

Se for fornecido apenas um vector e um valor escalar o re-

sultado seraacute outro vector que representa o produto desse

vector com um escalar

Existe com certeza aplicaccedilotildees matemaacuteticas (e natildeo soacute) mais

interessantes mas as apresentadas demonstram a facilidade

com que implementamos os nossos proacuteprios comportamen-

tos de operadores

Conclusatildeo

Operator overloading permite uma notaccedilatildeo mais proacutexima do

domiacutenio alvo o que promove a legibilidade e dissipa duacutevidas

de interpretaccedilatildeo Esta eacute a sua maior vantagem

No entanto se as implementaccedilotildees natildeo forem de encontro ao

sentido natural dos operadores o efeito poderaacute ser o perfeito

contraacuterio

Eacute um caso tiacutepico de melhor amigo ou pior inimigo Natildeo haacute

meio-termo

OPERADOR LIKE

AUTOR

Escrito por Seacutergio Ribeiro

Curioso e autodidata com uma enorme paixatildeo por tecnologias de informaccedilatildeo e uma saudaacutevel relaccedilatildeo com a NET Fra-

mework Moderador global na comunidade PortugalProgramar desde Setembro de 2009 Alguns frutos do seu trabalho

podem ser encontrados em httpwwwsergioribeirocom

Operator overlo-

ading permite uma no-

taccedilatildeo mais proacutexima do

domiacutenio alvo

Media Partners da Revista PROGRAMAR

EVENTOS

37

No passado dia 25 de Maio de 2013 realizou-se na Microsoft

Portugal no Parque das Naccedilotildees o 1ordm evento presencial da

comunidade Portugal a Programar Ainda antes das 9h come-

ccedilaram a chegar os participantes crescia o entusiasmo envolto

em todo o evento e pouco a pouco todos noacutes fomos dando

cara aos nicks a que nos habituaacutemos ao longo dos anos

Pontualmente a organizaccedilatildeo deu iniacutecio ao evento PROGRA-

MAR 2013 com Jorge Paulino David Pintassilgo e Rui Gon-

ccedilalves a abrir o evento Brevemente foi-nos dada a conhecer

a comunidade PP assim como os quatro pontos-chave que

a caracterizam

Foacuterum PP

Wiki

Portal de Downloads

Revista Programar

Parafraseando o anfitriatildeo Jorge Paulino ldquoeste foi um projeto

que se iniciou a 28 de Maio de 2005 para dar resposta agrave ne-

cessidade de partilhar informaccedilatildeo e experiecircncias nesta aacutereardquo

Apoacutes a apresentaccedilatildeo do evento e da comunidade seguiu-se

um discurso inspirador de um dos oradores Rui Delgado

acerca da necessidade de se empreender em Portugal

Com o limite de inscriccedilotildees a ser atingido em apenas trecircs dias

o 1ordm evento do PP contou com a presenccedila de 19 oradores

voluntaacuterios que deram origem a 18 apresentaccedilotildees teacutecnicas e

a 2 workshops praacuteticos Cerca de 250 participantes estiveram

presentes no edifiacutecio da Microsoft Lisbon Experience

EVENTO PROGRAMAR 2013

EVENTOS

38

Pelas diversas salas do evento partilharam-se experiecircncias e

conhecimento As apresentaccedilotildees decorreram 3 em simultacirc-

neo e foram as seguintes

Apresentaccedilatildeo das novidades de Java EE 7 (Ernest

Duarte)

As novidades do C 50 (Paulo Morgado)

ASPNET SignalR ndash Comunicaccedilatildeo em real-time sim-

ples e para todo mundo (Glauco Godoi)

Conquistar o mundo com aplicaccedilotildees feitas agrave velocida-

de da luz (Ricardo Marques)

CRM Como escolher De raiz ou sistema jaacute desen-

volvido (Pedro Azevedo)

Desenvolvimento de Aplicaccedilotildees em Windows Phone 8

(Nuno Silva)

Desenvolvimento em SharePoint por onde comeccedilar

(Rodrigo Pinto)

Desenvolvimento raacutepido de siacutetios web com personali-

zaccedilatildeo de Joomla ( Rui Guimaratildees )

DMVs ndash Conhece o teu SQL Server (Vitor Pombeiro)

Empreendedorismo em TI (Fernando Martins)

HTML5 e CSS3 ndash raacutepido e eficaz para o presente

(Seacutergio Laranjeira)

Introduccedilatildeo ao Cloud Computing e ao Windows Azure

(Vitor Tomaz)

Microsoft Kinect SDK (Rui Simatildeo)

Plataforma de desenvolvimento para Windows Store

Apps (Nuno Silva)

Powershell agrave minha maneira (Bruno Lopes)

O desenvolvimento de aplicaccedilotildees moacuteveis antes da 1ordf

linha de coacutedigo (Alberto Silva)

SEO ndash A importacircncia do Search Engine Optimization

(Miguel Lobato)

SQL Server ndash Performance e Tunning (Pedro Martins)

E ainda os workshops praacuteticos

Workshop ndash Integraccedilatildeo de CRM Dynamics com Java

e NET (Pedro Azevedo)

Workshop ndash Web em Realtime (Seacutergio Costa)

EVENTOS

39

Durante o decorrer das sessotildees houve ainda oferta de brindes

(gentilmente oferecidos pelos patrocinadores) aos participan-

tes

Outro ponto que marcou este PROGRAMAR 2013 foi o con-

curso de aplicaccedilotildees Windows Phone e Windows 8 vencido

por Jorge Costa com o jogo ldquoLittle Bitsrdquo sendo o segundo

lugar atribuiacutedo a Mauro Castro pela aplicaccedilatildeo ldquoPortugalrsquos Eve-

ningsrdquo

Houve ainda demostraccedilotildees do Microsoft Kinect (Rui Simatildeo) e

do Leap Motion (Diniz Vieira) a todos os participantes interes-

sados e todo o dia foi passado num espiacuterito descontraiacutedo e

animado aumentando assim os laccedilos entre toda a comunida-

de

A toda a organizaccedilatildeo e a todos os oradores envolvidos dei-

xamos um agradecimento especial agradecendo tambeacutem a

todos os patrocinadores nomeadamente a Microsoft Portugal

ESET Portugal FCA Editora Rumos e Truewind-Chiron Nun-

ca deixando de referir tambeacutem os Media Parters que ajuda-

ram a toda a divulgaccedilatildeo deste evento

A todos os elementos da comunidade que fazem com que a

Portugal-a-Programar seja cada vez mais conhecida no nosso

paiacutes e aleacutem-fronteiras a todos deixamos um ldquoMuito Obriga-

dordquo relembrando mais uma vez que este eacute um projeto de to-

dos e para todos e que a mais pequena accedilatildeo pode fazer a

diferenccedila

Eacute com satisfaccedilatildeo e orgulho que podemos afirmar que o 1ordm

Evento Presencial do PP foi um sucesso pois mesmo apoacutes

as sessotildees terem terminado houve ainda quem se mantives-

se no local partilhando experiecircncias de um dia cheio de emo-

ccedilotildees

E citando um dos oradores do evento Rui Delgado ldquoOh Yes

Muito Bomrdquohellip Venha o PROGRAMAR 2014

Paacutegina do evento httpeventoportugal-a-programarpt

(hellip) a mais peque-

na accedilatildeo pode fazer a

diferenccedila

Anaacutelises Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

C 50 com Visual Studio 2012

Review

41

Tiacutetulo Android ndash Introduccedilatildeo ao Desenvol-

vimento de Aplicaccedilotildees

Autor Ricardo Queiroacutes

Editora FCA

Paacuteginas 224

ISBN 978-972-722-763-1

O Android tornou-se na plataforma de dispositivos moacuteveis

mais usada no mundo e como tal existe um interesse cres-

cente dos programadores em criarem soluccedilotildees para esse

mercado Para quem queira dar aquele 1ordm passo no desen-

volvimento de aplicaccedilatildeo em Android o livro ldquoAndroid - Intro-

duccedilatildeo ao desenvolvimento de aplicaccedilotildeesrdquo de Ricardo Quei-

roacutes eacute uma boa escolha

Conteacutem passo a passo desde a configuraccedilatildeo do ambiente

de desenvolvimento ateacute agrave concepccedilatildeo de uma aplicaccedilatildeo para

Android na sua iacutentegra Destaca exemplos muito uacuteteis que

podem ser reaproveitados noutra aplicaccedilatildeo pois contempla

o desenho de uma interface graacutefica a gestatildeo de dados da

aplicaccedilatildeo atraveacutes de gestatildeo de ficheiros ou bases de dados

utilizaccedilatildeo de APIs de localizaccedilatildeo mapas e sensores e a

criaccedilatildeo do jogo do galo

Durante a sua leitura pode-se constatar que eacute um livro rico

em imagens explicativas e exemplificativas que nos ajudam

a perceber o que devemos fazer e o que devemos alcanccedilar

com a construccedilatildeo de todo o coacutedigo escrito

Infelizmente jaacute eacute habitual que nos sejam apresentados os

tiacutepicos tons acinzentados das ilustraccedilotildees e a ausecircncia de

qualquer tipo de realce de sintaxe no coacutedigo-exemplo o que

por vezes pode-se tornar cansativo ao olhar

Um factor alheio ao autor do livro mas que a editora em

causa deveria ter em consideraccedilatildeo por forma a facilitar a

leitura

ldquoAndroid ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildeesrdquo

de Ricardo Queiroacutes eacute um bom livro para quem jaacute tenha algu-

ma experiecircncia em programaccedilatildeo Java e que queira explorar

as potencialidades do Android

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

(hellip) destaca exem-

plos muito uacuteteis que

podem ser reaproveita-

dos noutra aplicaccedilatildeo

(hellip)

Review

42

Tiacutetulo C 50 com Visual Studio 2012

Autor Henrique Loureiro

Editora FCA

Paacuteginas 608

ISBN 978-972-722-752-5

Elementos de programaccedilatildeo

Abordam-se os temas de programaccedilatildeo mais elementar com

referecircncias agrave programaccedilatildeo iterativa passando pela orientada

a objecto O texto estaacute nitidamente orientado para um puacutebli-

co que tem noccedilotildees baacutesicas de programaccedilatildeo explicando a

loacutegica de uma funccedilatildeo ateacute agrave heranccedila de classes Tenta de

uma forma sucinta demonstrar na praacutetica ou seja com code-

snipets como construir de uma forma coerente uma aplica-

ccedilatildeo em C recorrendo ao Visual Studio

Usabilidade - Eacute tambeacutem abordada a importacircncia da usabili-

dade do user-interface numa qualquer aplicaccedilatildeo Satildeo de-

monstrados os conceitos baacutesicos de Interaccedilatildeo Homem-

Maacutequina e como aplica-los aos Windows Forms Este tema

serve de ponte para um tema bem mais extensivo Windows

Forms e programaccedilatildeo orientada agrave GUI detalhando alguns

dos componentes que a NET traz buit-in Explica a funciona-

lidade e a interecccedilatildeo com os componentes mais genericas e

mais usuais para uma aplicaccedilatildeo que se use de um sistema

de janelas como GUI A explicaccedilatildeo embora limitada a pou-

cos elementos eacute bastante completa dando ecircnfase aos

events associados a este tipo de modulos explicando assim

a programaccedilatildeo assiacutencrona em Windows Forms

Modelaccedilatildeo de dados e LINQ - Temos uma explicaccedilatildeo

bottom-to-top da noccedilatildeo de modelaccedilatildeo de dados Sendo nes-

te tema um pouco mais extenso explicando toda a noccedilatildeo da

Modelaccedilatildeo e das Formas Normais Recorre-se ao SQL Ser-

ver para fazer toda a explicaccedilatildeo na praacutetica dos conceitos

sendo bastante ilustrativo com diagramas e screenshots de

um processo de criaccedilatildeo e normalizaccedilatildeo de uma base de

dados Tendo a base de dados criada no SQL Sever passa

agrave explicaccedilatildeo do que eacute o LINQ e sua sintaxe em C Aqui eacute

feita mais uma vez a ponte com Windows Froms utilizando

componentes anteriormente demonstrados mapeando tabe-

las e manipulaccedilotildees baacutesicas Outra vez grande ecircnfase aos

events

C 50 com Visual Studio 2012

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

Sistema Operativo e Input Output Comeccedilando pela base

expotildee passo-a-passo como manipular as Tarefas e Proces-

sos do Windows explicando tambeacutem como colmatar as dife-

renccedilas entre versotildees do sistema operativo Daacute exemplos de

como manipular ficheiros de texto dando uma introduccedilatildeo agrave

encriptaccedilatildeo que vem built-in na NET Mostra como se usa o

Graphics da NET explicando os seus conceitos base dese-

nho e animaccedilatildeo chegando a agrave impressatildeo destes mesmos

graacuteficos desenhados Com este tema aprofunda a explicaccedilatildeo

dos Windows Forms fazendo a ponte para WPF

WPF XML e XAML - Tendo explicado Windows Forms pas-

sa agrave explicaccedilatildeo das diferenccedilas e semelhanccedilas do mesmo

com WPF dando tambeacutem a sua opiniatildeo sobre o futuro das

mesmas dando a entender que WPF iraacute substituir Windows

Forms eventualmente Para o efeito comeccedila por explicar o

que eacute XML dando exemplos de aplicaccedilotildees em C NET para

manipulaccedilatildeo deste tipo de dados passando para um niacutevel

acima o XAML Exemplo atraacutes de exemplo demonstra como

usar as potencialidade do WPF mostrando como usar

Graphics com a sintaxe XAML incluindo animaccedilatildeo

WebViews views modelares e navegaccedilatildeo entre diferentes

ecratildes numa soacute janela

Integraccedilatildeo com Microsoft Office e Windows Store - Eacute

tambeacutem mostrada a facilidade com que se integra uma apli-

caccedilatildeo feita em C comas a principais ferramentas do MS

Office Word Excel PowerPoint Access e Outlook Demons-

tra agrave semelhanccedila de outras ferramentas Microsoft que haacute

sempre uma Class buit-in na NET para criar e manipular

este tipo de documentos da famiacutelia Microsoft No caso da

Windows Store daacute exemplos vocacionados para Windows 8

e como tirar partido do conceito visual Metro e seus layouts

geneacutericos fazendo aplicaccedilotildees como uma calculadora e uma

WebView

Opiniatildeo pessoal - Na minha opiniatildeo este livro eacute ideal no

mundo acadeacutemico servindo perfeitamente como suporte a

um professor para leccionar uma cadeira de programaccedilatildeo

OOP ou ateacute para programaccedilatildeo 2D Tambeacutem natildeo acharia

descabido servir como suporte a um aluno para evoluir da

programaccedilatildeo iterativa para OOP visto que o livro estaacute repleto

de exemplos e exerciacutecios tendo ateacute no final 3 projectos from

scratch de aplicaccedilotildees completas explicando todo o processo

loacutegico na elaboraccedilatildeo de todos os aspectos da mesma de

base de dados normalizada interacccedilatildeo Homem-Maacutequina a

comercializaccedilatildeo na Windows Store

COMUNIDADES Comunidade NetPonto mdash Telerik RadControls - Raacutepida implementaccedilatildeo da

paacutegina Sobre para Windows Phone Apps

COMUNIDADE NETPONTO

44

httpnetpontoorg

Introduccedilatildeo

A Telerik RadControls disponibiliza um projeto template que

permite escolher um conjunto de funcionalidade que seratildeo

incluida no projeto aquando da sua criaccedilatildeo A paacutegina

Sobre eacute uma delas

Truque A Telerik oferece uma versatildeo de teste que permite

explorar os controlos O programa Nokia Premium Developer

permite aos seus membros terem uma licenccedila vaacutelida destes

Ecratildes

Para compreender melhor o que iremos fazer primeiro

iremos criar a paacutegina Sobre que eacute fornecida pelo projeto

template da Telerik cujo resultado eacute

Paacutegina Sobre gerada por omissatildeo pelo projeto template da Telerik

Depois iremos customizar a paacutegina para que esta tenha a

sua proacutepria informaccedilatildeo o resultado seraacute

Customizaccedilatildeo da paacutegina Sobre

Criaccedilatildeo do projeto

Para comeccedilar o projeto eacute recomendado que se instale os

Telerik RadControls (versatildeo de teste)

1 Seleccedilatildeo do projeto que se iraacute criar

Criando o projeto

2 A Telerik tem uma interface para a seleccedilatildeo inicial

Selecione a plataforma e referecircncias da Telerik que

queremos

Selecionando a plataforma e as referecircncias

3 Seleccedilatildeo da funcionalidade paacutegina Sobre

Quando o projeto eacute criado iremos obter a paacutegina por omissatildeo

podemos ver nos ecratildes

TELERIK RADCONTROLS - RAacutePIDA IMPLEMENTACcedilAtildeO DA PAacuteGINA SOBRE PARA WINDOWS PHONE APPS

COMUNIDADE NETPONTO

45

httpnetpontoorg

O resultado da estrutura do projeto seraacute

Customizaccedilatildeo

Comecemos por analisar a paacutegina Home Page

Cujo XAML eacute

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleMainPage xmlns=http schemasmicrosoftcomwinfx2006xaml presentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg

markup-compatibility2006 xmlnsphone= clr-namespaceMicrosoftPhone Controlsassembly=MicrosoftPhone xmlnsshell= clr-namespaceMicrosoft PhoneShellassembly=MicrosoftPhone FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation=Portrait SupportedOrientations=Portrait shellSystemTrayIsVisible=True mcIgnorable=dgt lt-- LayoutRoot is the root grid where all page content is placed --gt ltGrid xName=LayoutRoot Background=Transparentgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt lt-- LOCALIZATION NOTE To localize the displayed strings copy their val-ues to appropriately named keys in the apps neutral language resource file (AppResourcesresx) then replace the hard-coded text value between the attributes quotation marks with the binding clause whose path points to that string name For example Text=Binding Path=LocalizedResourcesApplicationTitle Source=StaticResource LocalizedStrings This binding points to the templates string resource named ApplicationTitle Adding supported languages in the Project Properties tab will create a new resx file per language that can

COMUNIDADE NETPONTO

46

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

carry the translated values of your UI strings The binding in these examples will cause the value of the attributes to be drawn from the resx file that matches the CurrentUICulture of the app at run time --gt lt-- TitlePanel contains the name of the application and page title --gt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=MY APPLICATION gt ltTextBlock xName=PageTitle Margin=9-700 Style=StaticResource PhoneTextTitle1Style Text=page name gt ltStackPanelgt lt-- ContentPanel - place additional content here --gt ltGrid xName=ContentPanel GridRow=1 Margin=120120gt ltListBox Margin=140-120 FontFamily=StaticResource PhoneFontFamilySemiLight FontSize=StaticResource PhoneFontSizeExtraLargegt ltListBoxItem Content=About Tap=GoToAbout gt ltListBoxgt ltGridgt lt-- Uncomment to see an alignment grid to help ensure your controls are aligned on common bound-aries The image has a top margin of -32px to account for the System Tray Set this to 0 (or remove the margin altogether) if the System Tray is hidden Before shipping remove this XAML and the image itself--gt lt-- ltImage Source=AssetsAlignmentGridpng VerticalAlignment=Top Height=800 Width=480 Margin=0 GridRow=0 GridRowSpan=2 IsHit-TestVisible=False gt --gt ltGridgt lt-- Sample code showing usage of ApplicationBar -

-gt ltphonePhoneApplicationPageApplicationBargt ltshellApplicationBar IsMenuEnabled=True IsVisible=Truegt ltshellApplicationBarIconButton IconUri=Imagesappbar_button1png Text=Button 1 gt ltshellApplicationBarIconButton IconUri=Imagesappbar_button2png Text=Button 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBarMenuItem Text=MenuItem 1 gt ltshellApplicationBarMenuItem Text=MenuItem 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBargt ltphonePhoneApplicationPageApplicationBargt ltphonePhoneApplicationPagegt Para navegar para a paacutegina Sobre eacute necessaacuterio clicar na palavra About (tap gesture) o coacutedigo referente eacute ltListBoxItem Content=About Tap=GoToAbout gt E em code behind iremos ter ltsummarygt Navigates to about page ltsummarygt private void GoToAbout(object sender GestureEventArgs e) thisNavigationServiceNavigate(new Uri(Aboutxaml UriKindRelativeOrAbsolute)) Por fim a paacutegina AboutPage seraacute O coacutedigo XAML seraacute ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleAbout xmlns=httpschemasmicrosoftcomwinfx2006xamlpresentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg markup-compatibility2006 xmlnsphone=clr-namespace MicrosoftPhoneControlsassembly=MicrosoftPhone xmlnsshell=clr-namespace

COMUNIDADE NETPONTO

47

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

E o code behind

MicrosoftPhoneShellassembly=MicrosoftPhone xmlnsviewModels=clr-namespace NokiaDevRadControlsSampleViewModels Name=Root FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation= Portrait SupportedOrientations=Portrait dDesignHeight=768 dDesignWidth=480 shellSystemTrayIsVisible=True mcIgnorable=dgt ltGrid xName=LayoutRoot Background=Transparentgt ltGridDataContextgt ltviewModelsCommandSampleViewModel gt ltGridDataContextgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=APP TITLE gt ltTextBlock xName=PageTitle Margin=9-700 Style= StaticResource PhoneTextTitle1Style Text=about gt ltStackPanelgt ltGrid xName=ContentPanel GridRowSpan=2 Margin=12160121gt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition gt ltGridRowDefinitionsgt ltStackPanelgt ltTextBlock Margin=120120 FontFamily= StaticResource PhoneFontFamilySemiBold FontSize= StaticResource PhoneFontSizeLarge Text=Binding ApplicationName ElementName=Root gt ltStackPanel Orientation=Horizontalgt ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Version number gt

ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Binding Version ElementName =Root gt ltStackPanelgt ltStackPanelgt ltTextBlock GridRow=1 Margin=12241224 FontSize=StaticResource PhoneFontSizeNormal Foreground=StaticResource PhoneSubtleBrush TextWrapping=Wrapgt This application show an About page sample for Windows Phone applications ltLineBreak gt See more about it please see the following referenceampquot ltTextBlockgt ltHyperlinkButton GridRow=2 Margin=01200 HorizontalAlignment=Left Command=Binding SendAnEmailCommand Content=technical supportfeedback email FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltHyperlinkButton GridRow=3 Margin=01200 HorizontalAlignment=Left Command=Binding RateThisAppCommand Content=rate this app FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltStackPanel GridRow=4 Margin=1201250 VerticalAlignment= Bottomgt ltImage HorizontalAlignment=Left Source=Images CompanyLogopng Stretch=None gt ltTextBlock Margin=01200 FontSize= StaticResource PhoneFontSizeNormal Text=Copyright (c) 2013 Nokia Developer Wiki gt ltTextBlock FontSize= StaticResource PhoneFontSizeNormal Text=Nokia gt ltStackPanelgt ltGridgt ltGridgt ltphonePhoneApplicationPagegt

public partial class About INotifyPropertyChanged

COMUNIDADE NETPONTO

48

httpnetpontoorg

Nota O exemplo natildeo implementa o padratildeo MVVM mas

poderia

Usa a classe ApplicationManifest do (Cimbalino toolkit - cujo

coacutedigo fornte eacute este)

Usa a classe SendAnEmailCommand que eacute a implementaccedilatildeo

do ICommand e tem como finalidade enviar emails Sendo

utilizado na opccedilatildeo de suporte feedback

Usa a classe RateThisAppCommand que eacute a implementaccedilatildeo

do ICommand e serve para avaliar a aplicaccedilatildeo

Truque Se pretende um exemplo mais avanccedilado consulte o

artigo Paacutegina avanccedilada Sobre para aplicaccedilotildees de Windows

Phone

Referecircncias

Online Help ou download CHM (ZIP 14MB) ()

Telerik Examples - Windows Phone Application ()

Telerik RadControls for Windows Phone ()

Join Nokia Premium Developer Program and get RadControls

for free ()

() Artigos disponiacuteveis apenas em Inglecircs

Em conclusatildeo podemos concluir que existe vaacuterias formas de

implementar numa aplicaccedilatildeo da Windows Phone uma

paacutegina ldquoSobrerdquo ou ldquoAcercardquo sendo um processo que se pode

minimizar e enriquece a aplicaccedilatildeo

Este artigo foi originalmente escrito para a comunidade

Nokia Developer mais especificamente para a Wiki Paacutegina

Acerca de para aplicaccedilotildees de Windows Phone

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltsummarygt The application manifest ltsummarygt private readonly ApplicationManifest _applicationManifest ltsummarygt Initializes a new instance of the ltsee cref=Aboutgt class ltsummarygt public About() InitializeComponent() class that helps to get the application name and version (that is defined in manifest) var applicationManifestService = new ApplicationManifestService() _applicationManifest = applicationManifestService GetApplicationManifest() ltsummarygt The property changed ltsummarygt public event PropertyChangedEventHandler PropertyChanged ltsummarygt Gets the application name ltsummarygt public string ApplicationName get if (_applicationManifest = null) return _applicationManifestAppTitle return ND ltsummarygt Gets the version ltsummarygt public string Version get if (_applicationManifest = null) return _applicationManifestAppVersion return ND ltsummarygt

The on property changed ltsummarygt ltparam name=propertyNamegt The property name ltparamgt protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null) var handler = PropertyChanged if (handler = null) handler(this new PropertyChangedEventArgs(propertyName))

AUTOR

Escrito Por Sara Silva

eacute licenciada em Matemaacutetica ndash Especialidade em Computaccedilatildeo pela Universidade de Coimbra e eacute Microsoft Certified Pro-

fissional Developer Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps O

seu Blog eacute wwwsaramgsilvacom e o twitter eacute saramgsilva

No Code Game Salad

No Code

50

ldquoNuma altura em que as aplicaccedilotildees estatildeo a dominar em

forccedila torna-se imperativo saber programarhelliprdquo E o leitor

tambeacutem tem esta opiniatildeo

Ora neste artigo esta eacute uma ideia que vamos deixar por

terra Se o leitor eacute algueacutem que gosta e se interessa pelo

mundo dos pequenos jogos e por novas tecnologias mas que

natildeo se sente agrave vontade no mundo da programaccedilatildeo pode (e

deve) experimentar o GameSalad Mas por outro lado

mesmo sendo um programador experiente o uso desta

ferramenta pode tambeacutem ajudar bastante

A GameSalad Inc eacute uma empresa norte-americana que

desenvolve ferramentas web para a criaccedilatildeo de pequenos

jogos Fundada em 2007 com o nome de Gendai Games em

2009 lanccedilou o GameSalad Creator e em 2010 mudou

oficialmente o seu nome passando chamar-se GameSalad

O importante para os criadores desta tecnologia eacute a

conceccedilatildeo de uma ideia O Game Salad Creator eacute

principalmente direcionado aos utilizadores que natildeo tecircm

bases em programaccedilatildeo permitindo que qualquer pessoa

possa fazer o seu proacuteprio jogo 2D para plataformas moacuteveis

IOS Android ou jogos HTLM5 para browsers Com uma

interface limpa e relativamente simples este software utiliza

o sistema ldquodrag-and-droprdquo para desenvolver os seus jogos

ou seja desde que tenhamos uma ideia em mente podemos

facilmente pocirc-la em praacutetica arrastando os componentes da

mesma para o ldquopalco de jogordquo

Assim facilmente o leitor pode definir as imagens de fundo

das vaacuterias cenas que compotildeem o jogo e todos os

intervenientes dessas cenas satildeo chamados ldquoAtoresrdquo em que

o comportamento destes ldquoAtoresrdquo eacute definido por regras de

jogo (eventos) que o proacuteprio utilizador define Eacute tudo uma

questatildeo de loacutegica e eacute o utilizador que define essa loacutegica Por

exemplo podemos definir eventos especiacuteficos como colisotildees

e definir o que o ldquoatorrdquo deve fazer quando ocorre uma

colisatildeo isto eacute se deve mudar de rumo e perder pontos ou se

deve ser destruiacutedo perdendo uma vida por exemplo Tudo

se baseia na nossa escolha

Podemos tambeacutem adicionar a banda sonora a nosso gosto e

para verificar o comportamento real da nossa aplicaccedilatildeo

basta-nos apenas recorrer ao simulador que o GameSalad

Creator nos disponibiliza Natildeo precisamos de ter o

equipamento real para o qual estamos a projetar o nosso

jogo

O site principal deste projeto wwwgamesaladcom em pouco

tempo atingiu milhares de utilizadores um pouco por todo o

mundo Inicialmente projetado para desenvolver aplicaccedilotildees

apenas para dispositivos Apple hoje em dia eacute tambeacutem

possiacutevel fazer o download da versatildeo Windows A versatildeo

base eacute gratuita e permite a qualquer interessado publicar os

seus jogos para a versatildeo web e para a versatildeo MAC Caso

prefira a versatildeo paga o GameSalad Creator Pro permite tudo

isto e tambeacutem publicar os seus projetos para a plataforma

Android e para o Windows 8 aleacutem de outros extras Caso

opte por ter uma conta premium pode ainda publicar no

mercado de aplicaccedilotildees escolhendo se quer disponibilizar

gratuitamente o seu jogo ou natildeo Caso opte disponibilizar

uma versatildeo paga do jogo que desenvolveu o utilizador tem

direito a 70 do ganho obtido pelo seu jogo

Este projeto tem tambeacutem atraveacutes do proacuteprio site uma grande

comunidade de utilizadores que partilham ideias e

experiecircncias ajudando-se mutuamente em vaacuterios projetos

Tem uma ideia para um jogo Entatildeo estaacute na altura de a por

em praacutetica Saber programar deixou de ser um requisito com

a ajuda do GameSalad Creator aproveite e decirc largas agrave

imaginaccedilatildeo

Game Salad

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

Elege o melhor artigo desta ediccedilatildeo

Revista PROGRAMAR httptinyccProgramarED41_V

No Code

52

Esta foi a aplicaccedilatildeo vencedora do concurso de aplicaccedilotildees

que se realizou no 1ordm Evento Presencial da Comunidade

Portugal-a-Programar Trata-se de um jogo para Windows

Phone 7x e 8 bastante interessante e ateacute ldquovicianterdquo para

quem gosta de jogos do tipo puzzle

Os pequenos Bits estatildeo em perigo e soacute vocecirc pode ajudaacute-los

Bits satildeo uma espeacutecie muito especial de aves encontradas

em uma ilha remota E eles precisam chegar ao seu ninho

a fim de criar seus filhos Mas os bits das Trevas estatildeo com

ciuacutemes e vatildeo tentar tudo ao seu alcance para impedir os Bits

de chegar ao ninho

Bits eacute um jogo de quebra-cabeccedilas fantaacutestico onde vocecirc tem

de combinar habilidade com sorte para ajudar os Bits a

sobreviver Combine trecircs Bits da mesma cor para ganhar

pontos enquanto os Bits prestos ldquoevilrdquo tentam detecirc-los Os

ldquoAnjos Bitsrdquo (brancos) podem salvar os Bits de cor destruindo

os Bits Pretos proacuteximos

PROJECTO EM DESTAQUE NA COMUNIDADE PP LITTLE BITS

PASSATEMPO

DESENVOLVIMENTO

WINDOWS 8

A comunidade Portugal a Programar com o apoio da Microsoft estaacute a criar um passatempo de desen-

volvimento de aplicaccedilotildees para Windows 8 exclusivamente para membros registados na comunidade

Desenvolve uma ou mais aplicaccedilotildees para o Windows 8 e ganha fantaacutesticos preacutemios

1 MOCHILA APP ME UP PARA TODOS os que publiquem uma App na Windows 8 Store

2 TELEFONES NOKIA LUMIA 820 (Dev Edition) para os primeiros 2 a publicarem 3 Apps na

Windows 8 Store

1 TABLET ASUS ME400C para a melhor App publicada e 1 NOKIA LUMIA 820 para a segun-

da melhor aplicaccedilatildeo

Satildeo vaacutelidas apenas aplicaccedilotildees publicadas entre 1 e 30 de Junho de 2013

Todos os estudantes tecircm acesso gratuito agrave Windows Store atraveacutes do programa DreamSpark e por is-

so natildeo haacute motivos para natildeo concorrer Mais informaccedilotildees e candidaturas atraveacutes do email passatem-

posportugal-a-programarpt

Alguns recursos interessantes para iniciar

Windows 8 Store Apps - Do sonho agrave realidade (revista PROGRAMAR)

Microsoft DreamSpark Windows 8 Apps development

Windows App (MSDN)

O staff da comunidade seraacute o juacuteri que iraacute escolher a melhor aplicaccedilatildeo a concurso e o vencedor seraacute divul-

gado na primeira quinzena de Julho Para atribuiccedilatildeo do Tablet Asus ME400C eacute necessaacuterio existirem no

miacutenimo 3 aplicaccedilotildees a concurso Qualquer caso omisso seraacute resolvido pelo staff da comunidade natildeo sen-

do passiacutevel de recurso e o juri iraacute rever e validar todas as aplicaccedilotildees de modo a que tenham um minimo de

qualidade e originalidade

Veja tambeacutem as ediccedilotildees anteriores da Revista PROGRAMAR

e muito mais em hellip wwwrevista-programarinfo

34

ordf Ed

iccedilatilde

o - A

bril 2

01

2

35

ordf Ed

iccedilatilde

o - J

un

ho

201

2

36

ordf Ed

iccedilatilde

o - A

go

sto

20

12

37

ordf Ed

iccedilatilde

o - O

utu

bro

20

12

38

ordf Ed

iccedilatilde

o - D

ezem

bro

20

12

39

ordf Ed

iccedilatilde

o - F

eve

reiro

20

13

Page 3: Revista Programar 41

NOTICIAS

4

ARM desenvolve chip anti-piratria

A ARM anunciou o lanccedilamento de um chip anti-pirataria que

vai permitir controlar a utilizaccedilatildeo indevida de conteuacutedos prote-

gidos por direitos de autor

A novidade eacute o resultado de uma parceria com Hollywood

que pretende prevenir a pirataria nos conteuacutedos de viacutedeo em

alta definiccedilatildeo numa proacutexima geraccedilatildeo de smartphones e ta-

blets Vai agir de forma complementar agraves tecnologias de Digi-

tal Rights Management ao niacutevel do hardware

O Mali V500 vai tirar partido da tecnologia TrustZone que a

fabricante britacircnica usa jaacute haacute vaacuterios anos como mecanismo de

seguranccedila para transaccedilotildees e software mas que aqui seraacute

utilizada pela primeira vez com o objetivo de prevenir a utiliza-

ccedilatildeo de conteuacutedos protegidos por direitos de autor

A disponibilizaccedilatildeo de conteuacutedos multimeacutedia de alta definiccedilatildeo

em sistemas moacuteveis tem sido endereccedilada com algumas reti-

cecircncias pelos detentores de direitos sobre esses conteuacutedos

que natildeo encontram grandes mecanismos de seguranccedila nes-

sas plataformas sobretudo no que se refere aos sistemas

operativos moacuteveis de coacutedigo aberto como eacute o caso do An-

droid

Citada pelo Financial Times a ARM defende que a sua tecno-

logia seraacute especialmente uacutetil em paiacuteses como a China onde a

induacutestria consegue fazer um niacutevel miacutenimo de receitas com os

filmes depois destes saiacuterem das salas de cinema

Na Computex a ARM lanccedilou ainda o Cortex A12 um proces-

sador dirigido ao mercado de gama meacutedia desenvolvido a 28

nanoacutemetros A fabricante garante que o chip assegura melho-

rias de 40 ao niacutevel da performance face ao antecessor Cor-

tex A9

Tambeacutem a Intel aproveitou a feira asiaacutetica para apresentar

uma nova geraccedilatildeo de processadores Core i3 i5 e i7 A efici-

ecircncia energeacutetica garante a fabricante eacute o incremento mais

relevante nesta nova geraccedilatildeo de chips

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

A tecnoloacutegica portuguesa quer democratizar o ensino e coloca

a figura do professor como agente principal do objetivo O Kit

Inspired Teacher eacute uma escola ambulante

A JP Inspiring Knowledge empresa responsaacutevel pelos com-

putadores Magalhatildees estaacute a lanccedilar em vaacuterios mercados inter-

nacionais um kit portaacutetil de ensino que se destina aos profes-

sores O conjunto eacute composto por um computador por um

rato com capacidade de digitalizaccedilatildeo por um projetor de pe-

quenas dimensotildees e por um quadro digital que torna qualquer

superfiacutecie plana num ambiente de trabalho

Todos os dispositivos podem ser guardados numa mala trolley

resistente a choques e a aacutegua sistema que reforccedila o caraacuteter

de mobilidade do kit de ensino

O Kit Inspired Teacher tenta conjugar o fator praacutetico ao lado

econoacutemico Mesmo sem revelar o preccedilo do conjunto o pacote

de ensino digital deve ficar mais barato do que montar uma

estrutura semelhante a uma sala de aula com todos os com-

ponentes como um PC projetor e quadro

A ideia da tecnoloacutegica portuguesa eacute diminuir ao maacuteximo o

nuacutemero de casos de crianccedilas que natildeo tecircm acesso ao ensino

pela falta de material escolar qualificado e atualizado O pro-

fessor eacute ao mesmo tempo a sala de aula ideia que tem sido

bem recebida internacionalmente

O conceito jaacute foi apresentado em vaacuterios paiacuteses com uma

resposta muito positiva sobretudo do puacuteblico-alvo principal

os professores Agora com o lanccedilamento desta soluccedilatildeo no

mercado estamos em condiccedilotildees de levar a educaccedilatildeo digital a

qualquer parte do mundo escreve em comunicado o presi-

dente da JP Inspiring Knowledge Jorge Saacute Couto

A empresa responsaacutevel pela gama de equipamentos Maga-

lhatildees natildeo vai disponibilizar o kit em Portugal e a pedido do

TeK tambeacutem natildeo adiantou uma estimativa para o volume de

vendas ateacute ao final do ano

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

JP Inspiring Knowledge cria kit por-

taacutetil de ensino para professores

NOTICIAS

5

Ferramentas de construccedilatildeo extensiacuteveis

Sabemos que eacute preciso construir um sistema que se adapte

aos seus requisitos de projeto mas que se estenda ainda ao

seu ambiente maior de desenvolvimento O Android Studio

usa um novo sistema de construccedilatildeo baseado em Gradle que

proporciona flexibilidade sabores de construccedilatildeo personaliza-

dos resoluccedilatildeo de dependecircncias e muito mais

Este novo sistema de montagem permite-lhe construir os seus

projetos no IDE bem como em seus servidores de integraccedilatildeo

contiacutenua A combinaccedilatildeo permite-lhe gerir facilmente as confi-

guraccedilotildees complexas de construccedilatildeo nativamente atraveacutes do

seu fluxo de trabalho em todas as suas ferramentas Confira

a documentaccedilatildeo de preacute-visualizaccedilatildeo para ter uma ideacuteia me-

lhor do que o novo sistema de construccedilatildeo pode fazer

Ediccedilatildeo de coacutedigo poderoso

O Android Studio inclui um editor de coacutedigo poderoso Ele eacute

baseado no editor IntelliJ IDEA que suporta recursos como

ediccedilatildeo inteligente refatoraccedilatildeo de coacutedigo avanccedilado e anaacutelise

aprofundada de coacutedigo estaacutetico

Os recursos de ediccedilatildeo inteligentes tais como pesquisas de

recursos em linha facilitam a leitura do coacutedigo dando-lhe

acesso instantacircneo a editar o coacutedigo dos recursos de apoio A

refatoraccedilatildeo avanccedilada de coacutedigo daacute-lhe o poder de transfor-

mar seu coacutedigo atraveacutes de todo o projeto com rapidez e se-

guranccedila

Adicionaacutemos anaacutelise de coacutedigo estaacutetico para o desenvolvi-

mento Android ajudando a identificaccedilatildeo de erros mais rapida-

mente Aleacutem das centenas de inspeccedilotildees de coacutedigo que o In-

telliJ IDEA oferece adicionaacutemos inspeccedilotildees personalizados

Por exemplo noacutes adicionamos metadados para as APIs do

Android que assinalam quais os meacutetodos que podem retornar

nulos ou natildeo que constantes satildeo permitidas para que meacuteto-

dos e assim por diante Android Studio usa esses dados para

analisar seu coacutedigo e encontrar possiacuteveis erros

Fonte Android Developers Blog

Portugal acolhe rede internacional

de centros de inclusatildeo social

O Centro de Inclusatildeo Digital um projeto de intervenccedilatildeo social

apoiado pela Microsoft estaacute a chegar a Portugal No primeiro

ano de atividade a organizaccedilatildeo quer chegar a 1200 jovens

A accedilatildeo do CDI centra-se no desenvolvimento de competecircn-

cias tecnoloacutegicas junto de populaccedilotildees provenientes de con-

textos socioeconoacutemicos desfavorecidos com o objetivo de

criar condiccedilotildees de empregabilidade

A organizaccedilatildeo fundada no Brasil em 1995 tambeacutem atua

apoiando iniciativas empresariais empreendedoras Em Portu-

gal pretende criar uma rede nacional de centros de inclusatildeo

digital O primeiro seraacute instalado no bairro da Belavista em

Setuacutebal Uma segunda estrutura estaacute tambeacutem jaacute prevista e vai

localizar-se em Vale de Cambra no Porto

O CDI conta com 780 espaccedilos de inclusatildeo social em 12 paiacute-

ses De acordo com os nuacutemeros avanccedilados pela organizaccedilatildeo

as suas iniciativas jaacute tiveram impacto na vida de um milhatildeo de

pessoas

A iniciativa conta com o apoio da Microsoft que hoje a apre-

sentou no acircmbito do 7ordm Encontro de Parceiros Sociais e que

doou 100 mil doacutelares agrave instituiccedilatildeo para o arranque do projeto

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

Hoje na Google I O anunciaacutemos uma nova IDE que eacute cons-

truiacuteda com as necessidades dos programadores de Android

em mente Eacute chamado Android Estuacutedio eacute gratuito e estaacute ago-

ra disponiacutevel para vocecirc experimentar como uma preacute-

visualizaccedilatildeo de acesso antecipado

Para desenvolver o Estuacutedio Android colaboraacutemos com Jet-

Brains os criadores de uma das mais avanccediladas IDEs Java

disponiacuteveis hoje Basea-

do no poderoso e exten-

siacutevel IntelliJ IDEA

Community Edition adi-

cionaacutemos recursos que

satildeo projetados especifi-

camente para o desen-

volvimento Android que

simplificam e otimizam o

seu fluxo de trabalho

diaacuterio

Android Studio An IDE built for An-

droid

TEMA DE CAPA Introduccedilatildeo ao Java EE e Java Web

TEMA DA CAPA

7

Java Enterprise Edition

A plataforma Java Enterprise Edition ou Java EE eacute uma pla-

taforma da Oracle que fornece uma API adicional ao Java

SE para o desenvolvimento e execuccedilatildeo de aplicaccedilotildees java

do tipo empresarial focadas nos serviccedilos de rede e Web

Vindo do Java Professional Edition o nome que foi anuncia-

do em Maio de 98 foi a partir dos finais de 1999 que ficou

com o nome de Java EE incluindo tecnologias como Java

Database Connectivity (JDBC) Java Servlet JavaServer

Pages (JSP) Enterprise JavaBeans JavaMail etc

CONCEITOS

Aplicaccedilatildeo Web Java

Uma aplicaccedilatildeo Java Web gera paacuteginas Web interactivas

contendo vaacuterios tipos de markup languages (HTML XML

etc) e conteuacutedo dinacircmico Eacute tipicamente composto por ele-

mentos Web tais como JavaServer Pages (JSP) Servlets e

JavaBeans para modificar e temporariamente armazenar

dados interagir com bases de dados e serviccedilos Web geran-

do conteuacutedo em resposta aos pedidos do cliente

JSP (JavaServer Pages)

JavaServer Pages eacute uma tecnologia usada no desenvolvi-

mento de aplicaccedilotildees Web Java semelhante ao PHP Possui

compatibilidades com outras soluccedilotildees Java como a Servlet

corre em servidores como o Apache Tomcat e o GlassFish

Ao contraacuterio dos tiacutepicos jarrsquos os arquivos deste tipo de imple-

mentaccedilotildees satildeo ear ou war (Web Archive)

As paacuteginas Web dinacircmicas java aceitam HTML CSS Ja-

vascript tudo que possam incluir no um ficheiro normal

HTML natildeo necessitam de compilaccedilatildeo preacutevia isso fica ao

cargo do servidor Web de traduzir as linhas de coacutedigo em

Java para o browser compreender

Qualquer coacutedigo Java inserido nos ficheiros JSP deve ficar

entre as tags

lt Code gt (para inserccedilatildeo de coacutedigo)

lt=var gt (para a expressatildeo de uma variaacutevel)

Introduccedilatildeo ao Java EE e Java Web ltpage gt (para importar include para incluir

uma paacutegina JSP ou HTML externa)

Servlet

Eacute uma tecnologia Java que permite gerar dados em HTML e

XML Incluiacuteda na biblioteca javaxservlet permite processar

pedidos e respostas vindas de JSP e serve como uma exten-

satildeo do servidor Web Neste caso vamos usar a HttpServlet

onde a sua funccedilatildeo seraacute processar pedidos das JSP resolver

os pedidos e enviar uma resposta

XML

XML (Extensible Markup Language) subtipo da SGML foi

criada pela W3C com o objectivo de ser usado como formato

de configuraccedilatildeo entre vaacuterias linguagens atraveacutes da internet

Ex

Neste caso em particular o ficheiro XML que vamos criar

editar na configuraccedilatildeo de uma aplicaccedilatildeo Java Web eacute o

webxml que tem como tags mais usa das as seguintes

lt gt agrave define comentaacuterios

ltweb-app id version xmlns gt agrave define o tipo do XML

a versatildeohellip

ltdisplay-namegt agrave define o nome

ltservletgt agrave define uma servlet

ltxml version=10 encoding=iso-8859-1 encoding=iso-8859-1gt ltreceita nome=patildeo tempo_de_preparacao=5 min tempo_de_cozedura=1horagt ltingredientesgt ltingrediente quantidade=4 unidade=chavenasgtFarinhaltingredientegt ltingrediente quantidade=7 unidade=gramasgtFermentoltingredientegt ltingrediente quantidade=15 unidade=chavenasgtAgualtingredientegt ltingrediente quantidade=1 unidade=colheresgtSalltingredientegt ltingredientesgt ltinstrucoesgt ltpassogtMisturar tdos os ingredientesltpassogt ltpassogtCobrir com um pano e deixar repousar uma hora agrave temperatura ambienteltpassogt ltpassogtMisturar novamente e colocar ao forno ateacute ao fim da cozeduraltpassogt ltinstrucoesgt ltreceitagt

TEMA DA CAPA

8

ltservlet-namegt agrave define o nome da servlet

ltservlet-classgt agrave aponta o caminho da servlet na apli-

caccedilatildeo

ltload-on-startupgt agrave quando o valor for 1 a servlet

seraacute inicializada no inicio da aplicaccedilatildeo

ltservlet-mappinggt agrave caso a servlet efectue operaccedilotildees

requeridas por elementos externos

ltservlet-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltservletgt

lturl-patterngt agrave define um url para a servlet

ltfiltergt agrave semelhante agrave tag ltservletgt com a diferenccedila

de que esta permite enquadrar uma classe de filtro na

aplicaccedilatildeo que permita a existecircncia de sessotildees na

aplicaccedilatildeo Web ou qualquer segmento de coacutedigo que

necessite de ser constantemente executado

ltfilter-namegt agrave define o nome da classe filtro

ltfilter-classgt agrave aponta o caminho da class na aplica-

ccedilatildeo

ltfilter-mappinggt agrave sempre necessaacuterio definir para

uma classe filtro

ltfilter-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltfiltergt

lturl-patterngt agrave para possuir o efeito de filtro o url seraacute

todos os existentes ou seja

lterror-pagegt agrave tag existente para definir paacuteginas de

erro que sejam geradas pelo web server e que pos-

sam ocorrer na aplicaccedilatildeo

lterror-codegt agrave define o tipo de coacutedigo de erro gerado

pelo web server (404-page not found 500-internal

server errorhellip)

ltlocationgt agrave localiza a paacutegina de erro personalizada

dentro da aplicaccedilatildeo

Estrutura de uma aplicaccedilatildeo Web Java

O exemplo que vai ser aqui apresentado seraacute montado num

Web Archive (ficheiro war) que poderaacute depois ser colocado

num servidor Web sendo os mais conhecidos o Apache

Tomcat e o Oracle Glassfish Ambos disponiacuteveis gratuita-

mente e no pacote de Java EE do IDE NetBeans que os ins-

tala em modo desenvolvimento na maacutequina local

Nota As aplicaccedilotildees necessaacuterias para a criaccedilatildeo deste exem-

plo satildeo o Java Runtime Environment (JRE) o Java Deve-

lopment Kit (JDK) e o IDE NetBeans

A estrutura normal de uma aplicaccedilatildeo java desta natureza

tem por norma a seguinte estrutura

O ficheiro WAR criado se o abrirmos tem uma estrutura de

pastasficheiros orientada ao modelo de desenvolvimento

MVC (Model-view-controller) onde a View estaacute incluiacuteda dire-

tamente na raiz do projeto onde se pode encontrar as paacutegi-

nas JSP e HTML acompanhadas pelos devidos ficheiros

JavaScript e CSS necessaacuterios Caso haja ausecircncia de um

Deployment Descriptor (ficheiro de configuraccedilatildeo referente a

uma determinada aplicaccedilatildeo que neste caso seraacute o webxml)

o servidor Web procura sempre por um indexjsp como paacutegi-

na inicial

Dentro da pasta WEB-INF estatildeo todas as classes bibliote-

cas ficheiros de configuraccedilatildeo e servlets necessaacuterias para

processar a informaccedilatildeo mostrada pelas JSPs

Em suma ter-se-aacute entatildeo algo deste geacutenero

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

9

Nota Nesta estrutura optou-se por colocar as paacuteginas dinacirc-

micas debaixo do WEB-INF pois uma vez que podemos usar

as servlets para controlar o que se deve ou natildeo ser mostrado

perante os pedidos vindos do cliente Isto torna a aplicaccedilatildeo

mais segura na questatildeo de mapeamento de URLs

Desenvolvimento

Neste exemplo vai-se usar o IDE NetBeans pois eacute aquele

que a Oracle recomenda encontra-se disponiacutevel para Win-

dows Linux Solaris e Mac OS X sendo mais simples de

configurar O NetBeans encontra-se disponiacutevel para downlo-

ad no proacuteprio site e no site da Oracle como complemento do

Java Development Kit 7 (Ver bibliografia)

Primeiros passos

Para dar iniacutecio agrave construccedilatildeo da nossa aplicaccedilatildeo Java Web

no NetBeans basta ir a File ndash New Project e aparece-nos a

seguinte janela

E vamos selecionar Java Web ndash Web Application Em se-

guida definimos a localizaccedilatildeo e o nome da nossa aplicaccedilatildeo

Dando o nome de Teste a esta aplicaccedilatildeo no passo seguinte

o nome que foi atribuiacutedo eacute automaticamente dado como

Context Path ou seja a aplicaccedilatildeo iraacute ser identificada no De-

ployment descriptor como Teste e uma vez colocada no servi-

dor teraacute o seguinte URL httphostnameportTeste

Neste exemplo vamos usar para o servidor GlassFish da Ora-

cle a versatildeo 6 do Java EE e o IDE Netbeans

O servidor escolhido pode ser posteriormente alterado caso

queira-se testar a aplicaccedilatildeo noutros ambientes contudo eacute de-

sencorajado a alteraccedilatildeo da versatildeo sem primeiro verificar a

existecircncia de possiacuteveis incompatibilidades com coacutedigo e biblio-

tecas que estejam a ser usadas O uacuteltimo seraacute ignorado uma

vez que este exemplo que vamos criar natildeo vai possuir nenhum

framework

Uma vez concluiacutedo todos os passos verificamos que automati-

camente o IDE criou-nos uma estrutura com uma paacutegina in-

dexjsp na raiz uma pasta WEB-INF vazia e atalhos para a

pasta de sources bibliotecas e de ficheiros de configuraccedilatildeo

com o tradicional MANIFESTMF criado

A estrutura visiacutevel natildeo corresponde agrave estrutura real de diretori-

as para se visualizar isso basta ir ao separador Files situado eacute

esquerda como mostra a imagem seguinte

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

10

Caso natildeo esteja criado o atalho pode-se sempre aceder indo

agrave opccedilatildeo Window ndash File abrindo o separador e recolocando o

atalho

Numa breve comparaccedilatildeo pode-se verificar que o NetBeans

cria determinados ficheiros e diretorias referentes ao projeto

(bluidxml e nbproject) e onde na estrutura do projeto a pasta

Web Pages tem referecircncia agrave pasta web e a Source Packa-

ges tem referecircncia agrave pasta src Todos os ficheiros de confi-

guraccedilatildeo ficam dentro da pasta WEB-INF e no caso da pasta

Libraries o seu conteuacutedo eacute um conjunto de atalhos cuja sua

localizaccedilatildeo pode ser referenciada a quaisquer pastas exter-

nas ao projeto No entanto recomenda-se criar uma pasta lib

debaixo de WEB-INF com as bibliotecas a ser usadas pela

aplicaccedilatildeo para evitar erros originados por utilizaccedilatildeo do mes-

mo ficheiro de biblioteca por mais do que um projeto e para

facilitar a passagem do projeto para outro ambiente ou ma-

quina pois assim basta soacute passar a pasta com o projeto sem

haver preocupaccedilotildees com importaccedilatildeo de bibliotecas

Criaccedilatildeo de uma JSP

Se abrirmos a paacutegina JSP criada pelo IDE ela vai ter um

aspecto semelhante a este

Uma vez que esta paacutegina tem o nome de index caso seja

feito o deploy da aplicaccedilatildeo a mesma vai apresentar uma

paacutegina de fundo branco com o tiacutetulo JSP Page e a frase Hel-

lo World

Para realizar o deploy da aplicaccedilatildeo basta carregar sobre o

botatildeo de play situado no painel de topo do IDE Netbeans ou

entatildeo ir a Run ndash Run Project

Caso o nome da paacutegina seja alterado e natildeo exista nenhuma

paacutegina com o nome index o servidor natildeo consegue encon-

trar nenhuma paacutegina inicial Entatildeo em seguida vamos alterar

o nome da nossa paacutegina inicial para homejsp e vamos con-

figurar o nosso webxml de maneira a criarmos um filtro de

sessatildeo que vai definir que o servidor no arranque da mesma

redirecionar-se para uma determinada servlet

Para tal se formos agrave opccedilatildeo de File ndash New Filehellip na secccedilatildeo

Web selecionar o tipo de ficheiro Standard Development

Descriptor (webxml)

Uma vez criado o ficheiro teraacute o seguinte conteuacutedo por defei-

to

Temos agora o ficheiro webxml onde poderemos colocar as

nossas referecircncias agraves servlets que vamos criar atribuindo-

lhes um url pattern a fim de poderem ser acedidas

Para natildeo termos trabalho o IDE por si soacute resolve todas as

tags que necessitamos de colocar no webxml na altura em

que criamos uma servlet caso natildeo seja resolvido pelo IDE

Para mapearmos a servlet WelcomeServlet no package

mainservlet com o url pattern Welcome o que deveria de ser

colocado seria algo deste geacutenero (ver as tags fornecidas)

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtJSP Pagelttitlegt ltheadgt ltbodygt lth1gtHello Worldlth1gt ltbodygt lthtmlgt

ltxml version=10 encoding=UTF-8gt ltweb-app xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=httpjavasuncomxml nsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsd version=30gt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

ltxml version=10 encoding=UTF-8gt ltweb-app version=30 xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=

TEMA DA CAPA

11

Mas natildeo eacute necessaacuterio escrever estas tags ateacute porque o Net-

Beans natildeo permite a criaccedilatildeo de servlets que jaacute possuam refe-

recircncias no webxml como tal o que podemos fazer eacute ir a opccedilatildeo

File ndash New Filehellip e dentro do Web selecionar Servlet

Em seguida o IDE vai recomendar a natildeo criar classes na raiz

dos packages e como tal vamos preencher o campo Package

com mainservlet e como nome WelcomeServlet

Dado o passo seguinte o IDE automaticamente cria a estru-

tura dos packages introduzidos e apresenta o formulaacuterio de

configuraccedilatildeo da servlet

Carregando sobre a check box e alterando o URL Pattern

para Welcome teremos automaticamente criado as tags

pretendidas no webxml

Uma vez criada a servlet vem com os meacutetodos herdados de

HttpServlet doGet() e doPost() implementados e com um

meacutetodo chamado processRequest() que envia coacutedigo

HTML O que vamos fazer eacute apagar este meacutetodo e colocar a

vazio o meacutetodo doPost() e introduzir a seguinte linha no

meacutetodo doGet()

Com esta linha criada e uma vez chamada a servlet que por

defeito responde por GET o pedido vai ser reencaminhado

para a nossa paacutegina criada homejsp

Fazendo deploy coloca-se o URL httplocalhost8080Teste

Welcome e verifica-se que a nossa servlet estaacute a fazer o

reencaminhamento para a nossa paacutegina inicial

Como proacuteximo passo vamos enviar variaacuteveis para uma ser-

vlet onde a mesma iraacute processar e enviar uma resposta En-

tatildeo o que se pretende eacute tomando os mesmos passos de cria-

ccedilatildeo da WelcomeServlet vamos criar a SomaServlet com o

seguinte coacutedigo

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

httpjavasuncomxmlnsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsdgt ltservletgt ltservlet-namegtWelcomeServletltservlet-namegt ltservlet-classgtmainservletWelcomeServlet ltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtWelcomeServletltservlet-namegt lturl-patterngtWelcomelturl-patterngt ltservlet-mappinggt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

getServletContext()getRequestDispatcher( homejsp)forward(request response)

package mainservlet import javaioIOException import javaxservletServletException import javaxservlethttpHttpServlet import javaxservlethttpHttpServletRequest import javaxservlethttpHttpServletResponse public class SomaServlet extends HttpServlet public static final String TEXTO = texto public static final String VALOR_1 = valor1 public static final String VALOR_2 = valor2 public static final String RESULTADO = resultado

TEMA DA CAPA

12

E para interagirmos com a servlet vamos criar as paacuteginas so-

majsp e resultadojsp onde mais uma vez vamos ao menu

File ndash New Filehellip selecionamos JSP e preenchemos o nome

sem a extensatildeo no campo File Name

somajsp

Com o objectivo de evitar erros a servlet possui constantes

que permitem que haja uma coerecircncia entre as variaacuteveis envia-

das e recebidas com o objectivo de evitar errosPode-se ob-

servar que a servlet uma vez iniciada envia uma variaacutevel atra-

veacutes de requestsetAttribute() Uma vez chamado o setAttri-

bute() requer 2 paracircmetros

requestsetAttribute(NomeDoAtributo UmObjectoQQ)

O primeiro paracircmetro como descrito atribui um nome sen-

do esse o nome que deve ser usado nas paacuteginas JSP para

puderem capturar a variaacutevel enviada que se vai encontrar

descrita no segundo paracircmetro que por sua vez eacute sempre

convertida da servlet para object Como tal teve que ser

efectuado o cast do objecto agrave chegada para o tipo de variaacute-

vel que tinha antes de ser enviada

String atributo = (String) requestgetAttribute

(NomeDoAtributo)

(Recepccedilatildeo do atributo)

Caso o que se pretenda seja o contraacuterio enviar variaacuteveis no

sentido JSP agrave Servlet a paacutegina JSP deve de conter um for-

mulaacuterio HTML com o meacutetodo que se pretende POST ou

GET e na action o URL pattern da servlet em questatildeo E os

nomes dos inputs satildeo as referecircncias que a servlet usa para

receber as variaacuteveis das paacuteginas JSP variaacuteveis essas quem

vecircm como String e como tal devem de ser convertidas para o

tipo desejado (Como demonstrado no coacutedigo acima referi-

do) Vamos entatildeo testar acedendo ao URL http

localhost8080TesteSoma

Porem a aplicaccedilatildeo funciona mas apenas mostra paacuteginas

caso as mesmas sejam escritas no URL pois uma vez que

renomeamos o indexjsp para homejsp natildeo existe de mo-

mento nenhuma paacutegina inicial ou seja caso escrevesse-

mos httplocalhost8080Teste a aplicaccedilatildeo natildeo vai mostrar

nenhuma paacutegina

Para solucionarmos esse problema vamos entatildeo criar um

filtro que remeta para uma determinada servlet filtro esse

que vai aguardar que uma determinada variaacutevel se altere de

estado para desbloquear as restantes paacuteginas Com este

tipo de classes podemos definir niacuteveis de acesso dentro da

nossa aplicaccedilatildeo restringindo a mesma quando certas variaacute-

veis natildeo forem validadas ou natildeo se encontram com o valor

pretendido (por exemplo um determinado nome de utilizador

e palavra chave)

Vamos entatildeo novamente a File ndash New Filehellip e seleciona-

mos Filter

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

Override protected void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException requestsetAttribute(TEXTO Insira 2 numeros e submeta para obter o resultado) getServletContext()getRequestDispatcher (somajsp)forward(request response) Override protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException int resultado try int val1 = IntegerparseInt (requestgetParameter(VALOR_1)) int val2 = IntegerparseInt (requestgetParameter(VALOR_2)) resultado = val1 + val2 requestsetAttribute(RESULTADO +resultado) catch (NumberFormatException e) requestsetAttribute(RESULTADO Valores natildeo validos) getServletContext()getRequestDispatcher (resultadojsp)forward(request response)

ltpage import=mainservletSomaServletgt ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lt String texto = (String) requestgetAttribute (SomaServletTEXTO)gt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtSomalttitlegt ltheadgt ltbodygt lth2gtlt=textogtlth2gt ltform action=Soma method=POSTgt Valor 1ltinput type=text name= lt=SomaServletVALOR_1gtgt Valor 2ltinput type=text name= lt=SomaServletVALOR_2gtgt ltbrgt ltinput type=submit name=submitgt ltformgt ltbodygt lthtmlgt

TEMA DA CAPA

13

caccedilatildeo e restriccedilatildeo de acessos os filtros permitem a execuccedilatildeo

de certas linhas de coacutedigo que mantecircm estados numa aplica-

ccedilatildeo e eacute o siacutetio ideal para colocar a parte do coacutedigo da aplica-

ccedilatildeo que manipula variaacuteveis de sessatildeo

Apoacutes criar-se a classe do tipo Filter ignorando o coacutedigo ge-

rado o filtro deveraacute possuir o seguinte coacutedigo

Uma vez criado o filtro este vai redirecionar todos os pedidos

agrave aplicaccedilatildeo para a WelcomeServlet enquanto a variaacutevel

validSession estiver a NULL como tal na servlet Welcome-

Servlet coloca-se a seguinte linha

requestgetSession()setAttribute(UrlFilterSESSION

gotSession)

Assim que o filtro passar pela WelcomeServlet a variaacutevel

validSession vai deixar de estar a NULL colocando o filtro a

fazer um encadeamento com os restantes pedidos que apa-

recerem

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

No seguinte passo vamos atribuir o nome de UrlFilter e coloca

-lo num novo package mainfilter

Semelhante ao passo de criaccedilatildeo do mapeamento das servlets

no webxml o IDE igualmente cria automaticamente um mape-

amento do filtro no ficheiro XML contudo o coacutedigo gerado eacute

ligeiramente diferente (Ver referecircncia de tags do webxml)

Apoacutes dar seguinte neste passo e natildeo preencher nada no proacutexi-

mo o IDE gera uma classe filtro por defeito e gera o seu mape-

amento no webxml semelhante a

Muito semelhante ao que se vai encontrar num mapeamento

de uma servlet apenas com a diferenccedila do nome das tags de

servlet para filter e o seu mapeamento seraacute muacuteltiplo para todos

os URLs que se deseja correr um determinado filtro antes de

haver o redireccionamento Uacuteteis para criar poliacuteticas de autenti-

ltfiltergt ltfilter-namegtUrlFilterltfilter-namegt ltfilter-classgtmainfilterUrlFilter ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtUrlFilterltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt

package mainfilter import javaioIOException import javaxservlet import javaxservlethttp public class UrlFilter implements Filter FilterConfig filterConfig public static final String SESSION = session Override public void doFilter(ServletRequest req ServletResponse resp FilterChain chain) throws IOException ServletException if (req instanceof HttpServletRequest) String path = ((HttpServletRequest) req)getServletPath() HttpSession session = ((HttpServletRequest) req)getSession(false) boolean sessionValidator = false if (session = null) String validSession = (String) sessiongetAttribute(SESSION) if (validSession = null) sessionValidator = true if (pathequals(Welcome) ampamp sessionValidator) ((HttpServletResponse) resp)sendRedirect(filterConfiggetServletContext ()getContextPath() + Welcome) else chaindoFilter(req resp) Override public void init(FilterConfig filterConfig) thisfilterConfig = filterConfig Override public void destroy()

TEMA DA CAPA

14

Apoacutes implementado quando se aceder agrave aplicaccedilatildeo pelo URL

apontado para a raiz (httplocalhost8080Teste) o servidor

com conhecimento da existecircncia de um filtro vai chama-lo para

cada vez que o cliente acede a qualquer servlet ou JSP

Para finalizar este exemplo vamos soacute criar um link na paacutegina

homejsp que nos vai apontar para a paacutegina somajsp atraveacutes

da SomaServlet

lta href=SomagtSomarltagt

Dentro da aplicaccedilatildeo os URL pattern que foram definidos no

webxml servem igualmente para os links HTML chamando

sempre o meacutetodo doGet() da servlet

Conclusatildeo

Este artigo mostra numa forma introdutoacuteria como se pode criar

uma aplicaccedilatildeo Java com uma interface Web tendo em conta

que as capacidades do Java EE e das suas bibliotecas nome-

adamente Servlets Filters e as configuraccedilotildees necessaacuterias para

criar uma aplicaccedilatildeo Web baacutesica com conceitos adicionais de

XML( no seu geral) JSP e MVC

BibliografiaReferecircncias

httpwwworaclecomtechnetworkjavajavasedownloads

jre7-downloads-1880261html

httpwwworaclecomtechnetworkjavajavaeedownloads

indexhtml

httpsnetbeansorgfeaturesindexhtml

httpenwikipediaorgwikiJava_EE_version_history

httpwwwjsptutcom

httpsdevelopersgooglecomappenginedocsjavaconfig

webxml

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

A PROGRAMAR Programaccedilatildeo em C const

Jogo da Vida

JBoss Aplication Server 7

PHP Uma framework ldquofrom scratchrdquo (Parte 1)

A PROGRAMAR

16

Uma das ldquorecentesrdquo adiccedilotildees agrave linguagem C foi o qualificador

const Ao contraacuterio do que se possa pensar utilizar const

natildeo cria uma constante mas sim uma variaacutevel soacute-de-leitura

O que queremos dizer com isto Vejamos o seguinte exem-

plo

Qual o valor de i apoacutes execuccedilatildeo da linha 4 Embora possa

parecer estranho i vai ter o valor 73 apesar de termos de-

clarado i como constante Por este motivo variaacuteveis qualifi-

cadas com const natildeo satildeo constantes verdadeiras em C (satildeo-

no em C++) e natildeo podem por este motivo ser utilizadas em

certos lugares como a definiccedilatildeo do tamanho de arrays ou

em cases de um switch (excepto com extensotildees dos compi-

ladores)

De que nos serve entatildeo um qualificador const se natildeo asse-

gura que a variaacutevel permanece inalterada Bem a utilizaccedilatildeo

de const para qualificar variaacuteveis impede de facto a sua

alteraccedilatildeo na maioria dos casos Natildeo podemos alterar i direc-

tamente por exemplo (ie i = 73 emite um erro) No exemplo

apresentado acima enganaacutemos o compilador (linha 2) com o

cast de ampi para o tipo int sem cast um compilador bem

configurado emitiraacute pelo menos um aviso de que o qualifica-

dor const eacute descartado na atribuiccedilatildeo de ampi a ptr um pequeno

sinal de alarme para o programador (eacute soacute estar atento)

Podemos como referido acima qualificar uma variaacutevel com

const e impedir que seja alterada directamente Se tentar-

mos apontar um apontador a essa variaacutevel o compilador

avisa-nos que a qualificaccedilatildeo de const seraacute perdida e pode-

mos alterar a variaacutevel atraveacutes do apontador Haveraacute maneira

de impedir que isto aconteccedila Na realidade a questatildeo eacute

outra como utilizar o qualificador const com apontadores

Existem 4 formas de qualificar um apontador com const

obtendo-se diferentes niacuteveis de acesso de leitura eou escri-

ta da variaacutevel apontada atraveacutes do mesmo Para que natildeo

existam duacutevidas eacute importante reter que o qualificador const

qualifica uma variaacutevel e natildeo um local na memoacuteria Por outras

palavras (e recorrendo ao exemplo inicial) qualificar i como

const soacute impedir a alteraccedilatildeo do valor atraveacutes da variaacutevel i

Quando apontamos um apontador ao endereccedilo de i pode-

mos fazer o que quisermos com o valor laacute armazenado inde-

pendentemente de como i foi declarado

A primeira forma de usar const num apontador eacute surpreen-

dentemente natildeo usar const num apontador Na realidade

(obviamente) esta natildeo eacute uma utilizaccedilatildeo do qualificador const

Programaccedilatildeo em C const mas este artigo natildeo estaria completo sem se falar dela Um

apontador simples de forma tipo p permite-nos fazer vaacuterias

coisas podemos apontaacute-lo a qualquer local da memoacuteria que

queiramos e desde que apontado a um endereccedilo vaacutelido

podemos alterar o valor aiacute armazenado com o operador de

indirecccedilatildeo (eg p = 3) Este tipo de apontador natildeo apresenta

restriccedilotildees nenhumas (por esse motivo eacute que o compilador

emite um aviso quando tentamos apontaacute-lo a uma variaacutevel

const excepto na presenccedila de casts)

Segue-se entatildeo a criaccedilatildeo de um apontador para uma variaacute-

vel constante Este tipo de apontador apresenta uma particu-

laridade embora seja possiacutevel apontaacute-lo a qualquer endere-

ccedilo de memoacuteria natildeo eacute possiacutevel utilizar este apontador para

alterar o conteuacutedo do endereccedilo apontado Logicamente este

era o tipo de apontador que precisaacutevamos no exemplo inici-

al se temos uma variaacutevel constante queremos apontar para

ela com um apontador para uma variaacutevel constante

Se lermos a declaraccedilatildeo de ptr da direita para a esquerda

tudo faz sentido ptr eacute um apontador () para um const int E

de facto i eacute um const int tudo parece bem Quando tentamos

modificar o valor apontado por ptr o compilador emite um

erro queixa-se que estamos a tentar atribuir um valor a uma

variaacutevelendereccedilo soacute de leitura Este era o comportamento

que procuraacutevamos inicialmente

Passemos agora para a terceira forma de usar const com

apontadores Uma espeacutecie de ldquoinversordquo de um apontador

para uma variaacutevel constante eacute um apontador constante para

uma variaacutevel (natildeo constante) A diferenccedila do anterior para

este eacute que agora passamos a conseguir alterar o valor apon-

tado (por outras palavras ptr = 73 passa a ser possiacutevel)

mas natildeo nos eacute possiacutevel apontar ptr para outra variaacutevel

Uma vez mais da direita para a esquerda ptr eacute um aponta-

dor constante ( const) para um int Podemos utilizar ptr agrave

vontade para modificar o valor de 42 para 73 mas eacute-nos

impossiacutevel alterar o endereccedilo para o qual ptr aponta Este

tipo de apontadores eacute uacutetil quando nos queremos assegurar

de que natildeo haacute alteraccedilotildees acidentais do local para onde um

apontador aponta Um pormenor importante sendo ptr um

apontador cujo endereccedilo natildeo pode ser alterado devemos

1 const int i = 42 2 int ptr = (int)ampi 3 4 ptr = 73

1 const int i = 42 2 const int ptr = ampi 3 4 ptr = 73 erro

1 const int i = 42 2 int const ptr = ampi 3 4 ptr = 73 ok 5 ptr = NULL erro

A PROGRAMAR

17

apontaacute-lo para onde queremos no momento da sua declara-

ccedilatildeo sob pena de ficar apontado para um local aleatoacuterio sem

possibilidade de alteraccedilatildeo

A quarta (e uacuteltima) forma de utilizar const num apontador eacute

como devem ter imaginado a combinaccedilatildeo das duas uacuteltimas

um apontador constante para uma variaacutevel constante Este eacute

o tipo de apontador mais limitado de todos uma vez que a

uacutenica coisa que podemos fazer com ele apoacutes a sua declara-

ccedilatildeo eacute consultar o valor para o qual aponta Natildeo podemos

alterar i se ptr for deste tipo nem podemos apontar ptr para

NULL ou outro endereccedilo qualquer

Desta vez utilizamos const em dois locais agrave esquerda do

asterisco para qualificar a variaacutevel apontada e agrave direita do

asterisco para qualificar o apontador Neste caso nenhuma

das operaccedilotildees funcionaraacute o compilador assegura-se que

natildeo utilizaremos ptr para alterar o valor para o qual aponta

nem tentaremos apontar ptr para outro endereccedilo

Neste artigo cobrimos algumas utilizaccedilotildees do qualificador

const na linguagem C (volto a lembrar estamos a falar de C

e natildeo de ldquoCC++rdquo) e foi tambeacutem referido como utilizar este

qualificador para melhorar o coacutedigo que escrevemos de for-

ma a prevenir asneiras relativamente comuns quando se lida

com apontadores

Falta no entanto mencionar outra utilidade do const docu-

mentaccedilatildeo Quando o programador utiliza const de uma for-

ma pensada estaacute a documentar o seu coacutedigo Se virmos uma

funccedilatildeo que aceita como argumento const void podemos

imediatamente imaginar que o endereccedilo passado nunca seraacute

alterado pela funccedilatildeo em causa enquanto que um simples

void natildeo nos informa sobre as intenccedilotildees da API Natural-

mente se o programador da API declarar um argumento

com const e depois utilizar casts para se livrar da qualifica-

ccedilatildeo entatildeo aiacute all bets are off e nada eacute garantido Mas assu-

mamos que isso eacute a excepccedilatildeo e natildeo a regra

Existem ainda muacuteltiplos aspectos que natildeo foram cobertos

neste artigo nomeadamente a conversatildeo impliacutecita de T para

const T e T para const T Esta conversatildeo eacute bastante uacutetil

quando queremos passar um valor do tipo T a uma funccedilatildeo

que requer const T como argumento Se pensarmos bem

faz sentido em qualquer lugar onde eacute necessaacuterio um const

T podemos utilizar um T perfeitamente (que nunca seraacute al-

terado) Por outro lado a conversatildeo inversa (de const T ou

const T para T e T respectivamente) natildeo eacute permitida e

tambeacutem isso faz sentido se uma funccedilatildeo pede um valor do

tipo T natildeo faz sentido aceitar um const T porque isso im-

plicaria potenciais alteraccedilotildees ao valor apontado (que satildeo

proibidas pelo qualificador const)

As conversotildees impliacutecitas relativas ao const terminam por

aqui Em C natildeo haacute conversatildeo de T para const T o que

significa que numa funccedilatildeo que aceite um argumento const

T seraacute emitido um aviso se tentarmos passar um T Neste

caso temos que recorrer a um cast para silenciar o compila-

dor Nada disto eacute um erro no entanto os casts surgiram

porque satildeo necessaacuterios na linguagem C e recusar a sua

utilizaccedilatildeo eacute negar a linguagem Haacute que saber quando e co-

mo fazer as coisas da forma correcta

Para terminar recomendo uma olha- dela agraves

manpages da biblioteca standard de C jaacute utilizam const

abundantemente nota-se bem o seu valor como documenta-

ccedilatildeo dentro do coacutedigo Aleacutem deste aspecto da documentaccedilatildeo

a utilizaccedilatildeo de const leva agrave criaccedilatildeo de coacutedigo mais previsiacutevel

e seguro e serve tambeacutem como dica para possiacuteveis optimi-

zaccedilotildees feitas pelo compiladorUsem const Informem e enco-

rajem a utilizaccedilatildeo de const especialmente aos iniciados

porque vale a pena

PROGRAMACcedilAtildeO EM C CONST

1 const int i = 42 2 const int const ptr = ampi 3 4 ptr = 73 erro 5 ptr = NULL erro

AUTOR

Escrito por Antoacutenio Pedro Cunha (pwseo)

Meacutedico natural de Guimaratildees formado na Universidade do Minho

Programador autodidacta em parte dos tempos livres inscrito no foacuterum desde 2006

Website httppwseoalojnet

Ao contraacuterio do

que se possa pen-

sar utilizar const natildeo

cria uma constante

mas sim uma variaacutevel

soacute de leitura

A PROGRAMAR

18

Nesta ediccedilatildeo vamos propor ao leitor um olhar sobre um fa-

moso algoritmo da deacutecada de 70

O seu inventor John Horton Conway nasceu em Liverpool

em Dezembro de 1937 e eacute um dos matemaacuteticos mais conhe-

cidos da nossa era em todo o mundo Estudou na Universi-

dade de Cambridge e ainda hoje eacute uma mente ativa nas

mais variadas teorias como por exemplo a teoria dos coacutedigos

e a teoria com- binatoacuteria dos

jogos

Ilustraccedilatildeo 1 - John Conway

O algoritmo escolhido para esta ediccedilatildeo foi criado em 1970

por Conway ndash o Jogo da Vida ndash sendo este um jogo para

zero jogadores Este jogo tornou-se mundialmente famoso

atraveacutes de uma coluna na revista Scientific American Em

1971 foi tema de capa e tinha entatildeo relanccedilado uma aacuterea da

Matemaacutetica a dos autoacutematos celulares que satildeo estruturas

matemaacuteticas uacuteteis em simulaccedilotildees de processos fiacutesicos e

bioloacutegicos e que a um niacutevel teoacuterico podem comportar-se

como computadores

Um autoacutemato celular eacute um modelo discreto e cada autoacutemato

deste tipo eacute representado por uma grelha de ceacutelulas poden-

do essas ceacutelulas assumir um nuacutemero finito de estados que

variam de acordo com cada modelo Outra caracteriacutestica a

considerar eacute que o tempo de evoluccedilatildeo eacute tambeacutem discreto

por exemplo o estado de uma ceacutelula no tempo t eacute sempre

obtido tendo em consideraccedilatildeo o estado dessa mesma ceacutelula

(e respetiva vizinhanccedila) no tempo t-1 Cada vez que todas as

regras determiniacutesticas satildeo aplicadas a toda a grelha uma

nova geraccedilatildeo eacute produzida

Isto foi um dos motes de partida para que Conway criasse o

Jogo da Vida Este jogo eacute considerado um autoacutemato celular

bidimensional em que satildeo simulados processos de evoluccedilatildeo

de ceacutelulas bioloacutegicas Estudos jaacute efetuados provam que este

eacute um autoacutemato computacional universal isto eacute eacute capaz de

simular qualquer sistema evolucionaacuterio possiacutevel

(reprogramando as respetivas regras determiniacutesticas se isso

for necessaacuterio)

Jogo da Vida Devido agraves analogias com o aumento reduccedilatildeo e alteraccedilatildeo de

um sistema de supostos organismos vivos (as ceacutelulas) este

jogo pertence agrave classe dos ldquojogos de simulaccedilatildeordquo pois recriam

processos do mundo-real

Voltando de novo ao tema principal do nosso artigo eacute impor-

tante recordar ao leitor que este jogo eacute para zero jogadores

o utilizador eacute apenas responsaacutevel pelos valores de inicializa-

ccedilatildeo do sistema Depois desses valores serem introduzidos

as geraccedilotildees seguintes seratildeo sempre calculadas com base

nas regras determiniacutesticas do algoritmo

Neste jogo num dado instante cada ceacutelula tem dois estados

possiacuteveis ldquovivardquo ou ldquomortardquo

As regras do jogo da vida satildeo simples ora vejamos

Uma ceacutelula viva com menos de dois vizinhos vivos

morre por solidatildeo

Uma ceacutelula viva com mais de trecircs vizinhos vivos mor-

re por sobrepopulaccedilatildeo (por escassez de recursos)

Uma ceacutelula viva com exatamente dois ou trecircs vizinhos

vivos permanece viva

Uma ceacutelula morta com exatamente trecircs vizinhos vivos

torna-se viva

Ao contraacuterio do artigo anterior desta seacuterie a soluccedilatildeo propos-

ta para este problema (na linguagem C) propotildee-se a ser

algo extremamente simples escrita de forma quase elemen-

tar

Implementaccedilatildeo do Algoritmo

Para simular o sistema de jogo foi usada uma matriz e para

que o caacutelculo das regras fosse simples foi considerado que

todas as ceacutelulas dessa matriz teriam 8 vizinhos A forma

mais direta encontrada para isso foi inserir a matriz do utiliza-

dor (que neste artigo seraacute a matriz secundaacuteria) numa matriz

com dimensatildeo [linhas+2][colunas+2] (matriz principal) para

garantir que ateacute as ceacutelulas dos ldquocantosrdquo teriam os tais 8 vizi-

nhos

De forma a simplificar a leitura da nossa implementaccedilatildeo defi-

nimos que cada ceacutelula viva teraacute o valor 1 (representada pela

macro CELVIVA) e que cada ceacutelula morta teraacute o valor 0

(representada pela macro CELMORTA)

No inicio da funccedilatildeo jogo() satildeo pedidos ao utilizador os valo-

res para o nuacutemero de linhas e colunas do sistema de jogo e

o nuacutemero de geraccedilotildees a simular

Apoacutes termos esses valores eacute entatildeo criada a matriz principal

com todos os campos inicializados a -1 para que seja efetua-

A PROGRAMAR

19

da uma ldquolimpezardquo da memoacuteria utilizada Seguidamente e atra-

veacutes desses valores eacute inicializada dentro na matriz principal a

submatriz (matriz secundaacuteria) que eacute usada para calcular os

valores das ceacutelulas em cada geraccedilatildeo Neste caso eacute inicializa-

da a matriz com a dimensatildeo que o utilizador pediu com o valor

de CELMORTA em todos os campos

Apoacutes gerar a matriz secundaacuteria eacute perguntado ao utilizador

quantas ceacutelulas vivas pretende ter no jogo Seguidamente satildeo

pedidas as coordenadas dessas mesmas ceacutelulas Quando o

programa recebe esses valores (da linha e da coluna pretendi-

da) entatildeo a essas posiccedilotildees da matriz eacute atribuiacutedo o valor CEL-

VIVA

Recapitulando para representar uma ceacutelula viva eacute usado o

valor 1 e para representar uma ceacutelula morta eacute usado o valor 0

Todas as outras posiccedilotildees da matriz principal permanecem inal-

teradas com o valor -1

Assim o que o algoritmo faz eacute contabilizar quantas ceacutelulas

vivas estatildeo nos 8 vizinhos Ou seja por outras palavras para

cada posiccedilatildeo (ij) da matriz o programa vai verificar as posi-

ccedilotildees (i-1 j-1) (i-1 j) (i-1 j+1) (i j-1) (i j+1) (i+1 j-1) (i+1 j)

e (i+1 j+1) Caso o valor de cada uma dessas ceacutelulas seja

igual a 1 (CELVIVA ie ceacutelula viva) a variaacutevel de contagem

(cvivas) eacute incrementada uma unidade

Apoacutes a verificaccedilatildeo de todas as posiccedilotildees eacute verificado se a ceacutelu-

la da posiccedilatildeo (i j) eacute uma ceacutelula viva ou morta e satildeo verificadas

as regras do jogo para que se possa decidir se a ceacutelula (ij)

permanece viva ou se morre (tomando respetivamente o valor

CELVIVA e CELMORTA na submatriz)

Usando a variaacutevel i como auxiliar para as linhas e a variaacutevel j

como auxiliar para as colunas os caacutelculos iniciam-se na posi-

ccedilatildeo (11) da matriz principal pois eacute nestas coordenadas que se

inicia a matriz secundaacuteria (ie o sistema de jogo do utilizador)

Os caacutelculos satildeo feitos em todas as posiccedilotildees (ij) apenas da

matriz secundaacuteria daiacute que a condiccedilatildeo de execuccedilatildeo dos ciclos

for seja enquanto o i e o j forem menores que o valor das li-

nhas e das colunas introduzidas pelo utilizador Ou seja a ma-

triz principal natildeo eacute toda processada nos caacutelculos dos vizinhos

vivos para que natildeo sejam gastos recursos de computaccedilatildeo

desnecessariamente

Ilustraccedilatildeo 2 - Exemplo de verificaccedilatildeo de Ceacutelulas

Ceacutelula a ceacutelula a matriz atual eacute processada sendo que apoacutes

esse processamento o resultado do caacutelculo (se a ceacutelula vive

ou morre) eacute colocado na posiccedilatildeo correspondente na matriz

nova (que eacute uma matriz com as mesmas caracteriacutesticas da

matriz atual isto eacute tem tambeacutem uma matriz principal e uma

matriz secundaacuteria)

Apoacutes esse caacutelculo eacute mostrada no ecratilde a matriz secundaacuteria

da matriz nova e a informaccedilatildeo das ceacutelulas da matriz nova eacute

copiada para a matriz atual de forma a que na proacutexima itera-

ccedilatildeo do for principal (que executa o mesmo numero de vezes

quantas geraccedilotildees o utilizador peccedila ao programa) a informa-

ccedilatildeo volte a ser processada de forma anaacuteloga

Para que fosse mais simples ao utilizador o uso do nosso

programa foi tomada em consideraccedilatildeo para que natildeo se

tornasse aborrecido estar sempre a iniciar a execuccedilatildeo do

programa caso o utilizador quisesse continuar a jogar que o

programa apenas teraacute fim quando o utilizador escolher sair

do programa neste caso introduzindo o valor 0 no menu prin-

cipal do mesmo

Se o utilizador preferir jogar novamente entatildeo basta carregar

em 1 e o programa volta a gerar uma nova jogada gerando

um novo sistema de geraccedilotildees consoante os valores introdu-

zidos pelo utilizador Na nossa implementaccedilatildeo quando o

programa mostra o sistema de jogo as ceacutelulas vivas satildeo

representadas pelo siacutembolo

Coacutedigo do Programa

Este eacute apenas um excerto da funccedilatildeo que calcula a proacutexima

geraccedilatildeo tendo como base uma matriz que represente a gera-

ccedilatildeo anterior O coacutedigo completo poderaacute ser consultado no

foacuterum do PP

JOGO DA VIDA

void jogo(void) for (int g = 0 g lt geracoes g++) printf(nnGERACAO d g + 1) for (int i = 1 i lt= linhas i++) for (int j = 1 j lt= colunas j++) int cvivas = 0 if (matrizActual[i-1][j-1] == CELVIVA) cvivas++ if (matrizActual[i-1][j] == CELVIVA) cvivas++ if (matrizActual[i-1][j+1] == CELVIVA) cvivas++ if (matrizActual[i][j-1] == CELVIVA) cvivas++ if (matrizActual[i][j+1] == CELVIVA) cvivas++ if (matrizActual[i+1][j-1] == CELVIVA) cvivas++ if (matrizActual[i+1][j] == CELVIVA)

A PROGRAMAR

20

Como o leitor pode verificar nas linhas acima este eacute um algorit-

mo bastante simples e de raacutepida implementaccedilatildeo Eacute de referir

ainda que o coacutedigo do artigo desta ediccedilatildeo foi implementado

segundo o standard C99 (suportado pelos compiladores GCC

Clang e Pelles C) que nos permite programar de uma forma

portaacutevel e ainda assim confortaacutevel (comentaacuterios comeccedilados

com variable-length arrays tipo de dados bool entre outros)

Caso o leitor queira compilar o coacutedigo deste artigo em Linux

deve utilizar a linha de comando gcc -Wall -Wextra -std=c99 -

pedantic jogo-da-vida jogo-da-vidac

O objetivo principal deste algoritmo eacute entatildeo que o utilizador

possa decidir qual a sua populaccedilatildeo inicial e que apoacutes isso pos-

sa observar o comportamento do seu sistema Ao longo dos

anos muitas configuraccedilotildees foram testadas e experimentadas

com este jogo O jogo da vida convida a experimentar diversas

configuraccedilotildees sendo que agrave maior parte das configuraccedilotildees

iniciais escolhidas bastam apenas trecircs ou quatro geraccedilotildees

para a populaccedilatildeo desaparecer completamente Contudo haacute

algumas configuraccedilotildees jaacute conhecidas como configuraccedilotildees de

ldquoVida Eternardquo por haver sempre ceacutelulas vivas ao longo de mui-

tas geraccedilotildees (e ateacute mesmo de geraccedilotildees infinitas) como mostra

por exemplo imagem seguinte (obtida com a execuccedilatildeo do

nosso programa)

Ilustraccedilatildeo 3 - Exemplo configuraccedilatildeo Vida Eterna (Bloco)

Existem ainda diferentes configuraccedilotildees que podem ocorrer

no Jogo da Vida (configuraccedilotildees essas que o utilizador pode

facilmente encontrar na internet relativas a vaacuterios estudos jaacute

feitos sobre este algoritmo) Os exemplos mais simples satildeo

mostrados abaixo com as ceacutelulas vivas em preto e as ceacutelu-

las mortas em branco

Haacute configuraccedilotildees que satildeo alvo de vaacuterios estudos cientiacuteficos

por exemplo se dois gliders satildeo colocados em direccedilatildeo a um

bloco o bloco vai aproximar-se da fonte dos gliders mas por

outro lado se trecircs gliders satildeo colocados no mesmo lugar o

bloco vai afastar-se desses gliders Este facto eacute conhecido

como a ldquomemoacuteria de bloco deslizante e pode ser usada para

simular um contador

Eacute possiacutevel construir portas loacutegicas AND OR e NOT usando

gliders tal como eacute possiacutevel construir uma imagem que aja

como uma maacutequina de estado finito conectada a dois conta-

dores

O que significa que esta disposiccedilatildeo possui o mesmo poder

computacional de uma maacutequina de Turing universal ou seja

Jogo da Vida pode ser tatildeo poderoso quanto qualquer com-

putador com memoacuteria ilimitada dando origem ao Turing com-

pleto como jaacute vaacuterios estudos comprovam esse mesmo feito

Mais uma vez recordo ao leitor que pode experimentar sem

qualquer restriccedilatildeo as configuraccedilotildees iniciais que mais lhe

agradarem Este artigo eacute o terceiro de uma seacuterie de artigos

de programaccedilatildeo tendo como base principal a linguagem C

que esperamos que siga atentamente

JOGO DA VIDA

cvivas++ if (matrizActual[i+1][j+1] == CELVIVA) cvivas++ if (isAlive ampamp cvivas lt 2) DIE else if (isAlive ampamp cvivas gt 3) DIE else if (isAlive ampamp (cvivas == 2 || cvivas == 3)) LIVE else if (isDead ampamp cvivas == 3) LIVE else DIE

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

a matriz principal

natildeo eacute toda proces-

sada (hellip) para que natildeo

sejam gastos recur-

sos de computaccedilatildeo

A PROGRAMAR

21

Introduccedilatildeo

Atualmente a plataforma Java eacute uma das mais utilizadas no

mundo e muito disso se deve agrave capacidade da plataforma

suportar outras linguagens como por exemplo JRuby Groovy

e Scala Milhares de aplicativos para Web e Mobile satildeo de-

senvolvidos a cada mecircs utilizando esta plataforma como

base A plataforma Java mudou muito desde seu iniacutecio e

provavelmente vai continuar evoluindo nos proacuteximos anos

Em paralelo com essas mudanccedilas visualizamos os servido-

res de aplicaccedilatildeo que cada vez mais oferecem recursos de

alta complexidade como componentes de balanceamento

de carga inteligente implementaccedilatildeo de autenticaccedilatildeo (JAAS)

troca de mensagens assiacutencronas (JMS) controle de transa-

ccedilatildeo (JTA) persistecircncia de objetos (JPA) componentes para

criaccedilatildeo de aplicaccedilotildees distribuiacutedas e clusterizadas (EJB) API

Java para processamento de arquivos XML e Webservices

(JAX-WS e JAX-B) e muitas outras tecnologias facilitando o

desenvolvimento e padronizaccedilatildeo de aplicaccedilotildees Eles tam-

beacutem disponibilizam uma infraestrutura estaacutevel e escalonaacutevel

para aplicaccedilotildees de missatildeo criacutetica Um dos grandes desafios

dos servidores de aplicaccedilatildeo eacute acoplar serviccedilos de grande

complexidade deixando-os estaacuteveis e flexiacuteveis

Nas versotildees iniciais a plataforma ainda conhecida como

Java2EE natildeo estava madura e seus recursos nos servidores

de aplicaccedilatildeo eram carregados de forma hieraacuterquica consu-

mindo muitos recursos e tornando o startup altamente custo-

so

A arquitetura dos principais servidores de aplicaccedilatildeo foi rede-

senhada para que seus recursos possam ser iniciados de

modo concorrente ou sob demanda As melhorias tambeacutem

podem ser notadas no consumo de memoacuteria onde em uma

simples maacutequina desktop pode-se facilmente configurar

serviccedilos de alta disponibilidade e escalaacuteveis para realizaccedilatildeo

de testes em tempo de desenvolvimento

Se vocecirc deseja um ambiente com alta disponibilidade esca-

lonaacutevel e que seja independente de fabricante (de forma a

evitar o vendor lock-in) o Java EE e seus servidores de apli-

caccedilatildeo foram feitos para si

JBoss Application Server 7

JBoss Application Server 7 ou apenas JBoss AS 7 eacute um ser-

vidor de aplicaccedilatildeo de coacutedigo aberto que eacute 100 compatiacutevel

com a especificaccedilatildeo Java EE 6 Em versotildees anteriores do

Java EE mesmo utilizando somente algumas tecnologias

para o desenvolvimento da aplicaccedilatildeo eacuteramos obrigados a

lidar com todos os recursos implementados no servidor Para

resolver esse problema no Java EE 6 foi inserido o conceito

JBoss Aplication Server 7 de profile que tem como objetivo criar configuraccedilotildees com fins

especiacuteficos como por exemplo o Web Profile que possui tec-

nologias para o desenvolvimento web

Ateacute ao momento a versatildeo atual do JBoss AS foi baixada

mais de 150 mil vezes Para mais informaccedilotildees visite o site

do projeto httpwwwjbossorgjbossas

Recentemente o projeto recebeu um novo nome e futura-

mente se chamaraacute WildFly Mais informaccedilotildees podem ser

encontradas em httpwwwwildflyorgfaq

Requisitos

Como todo servidor de aplicaccedilatildeo o JBoss AS 7 requer um

ambiente com JDK 16JDK 17 devidamente configurado e

instalado O Java Development Kit (JDK) eacute um conjunto de

utilitaacuterios para criaccedilatildeo de softwares para plataforma Java

Existem vaacuterias implementaccedilotildees cada qual com a sua finali-

dade

Para baixar o JDK 7 navegue ateacute a paacutegina de download da

Oracle em httpwwworaclecomtechnetworkjavajavase

downloadsindexhtml e escolha a opccedilatildeo Java Platform

(JDK) Em seguida vocecirc seraacute direcionado para outra paacutegina

onde deveraacute aceitar a License Agreement Baixe a versatildeo

jdk-7u21-linux-x64rpm

Para instalar o JDK execute o seguinte comando

$ sudo rpm -Uvh jdk-7u21-linux-x64rpm

Execute o comando java --version para verificar se o JDK

estaacute instalado

$ java --version

java version 170_21

Java(TM) SE Runtime Environment (build 170_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 2321-b01 mixed

mode)

Duvidas na instalaccedilatildeo Consulte o link

httpdocsoraclecomjavase7docswebnotesinstall

indexhtml

Instalando o JBoss AS 7

O JBoss AS 7 pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgjbossasdownloads Para

instalar basta descompactar o arquivo jboss-as-

711Finalzip utilizando um utilitaacuterio de descompressatildeo

A PROGRAMAR

22

Boas Praacuteticas

Nunca inicie o JBoss utilizando o usuaacuterio root pois a platafor-

ma Java oferece APIs para execuccedilatildeo de coacutedigos nativos do

sistema operacional e mecanismos de gerenciamento remoto

No Linux crie um usuaacuterio com privileacutegios de root para iniciar o

serviccedilo do JBoss Jaacute no Windows crie um usuaacuterio com poderes

administrativos mas com privileacutegios reduzidos

Uma vez instalado eacute fortemente aconselhaacutevel iniciar o JBoss

AS para verificar se existe alguma incompatibilidade com a

arquitetura do JDK utilizado ou ateacute mesmo se a memoacuteria dispo-

nibilizada eacute suficiente

Execute uma simples instacircncia standalone e acesse a url http

localhost8080 para verificar se o JBoss foi iniciado correta-

mente

$ jboss-as-711Finalbinstandalonesh

Domain Mode x Standalone Mode

O JBoss AS 7 possui dois modelos de trabalho conhecidos

como Standalone Mode e Domain Mode No Standalone Mode

podemos trabalhar com uma uacutenica instacircncia muito semelhante

a versotildees anteriores do JBoss AS 5 e JBoss AS 6 Para utilizar

o Standalone mode basta iniciar o script JBOSS_HOME

standalonesh no Linux

Agora vocecirc deve estar se perguntando se eacute possiacutevel criar um

ambiente de alta disponibilidade utilizando o Standalone

Mode A resposta eacute Sim Eacute possiacutevel criar um ambiente com

recursos clusterizados replicaccedilatildeo de sessatildeo e tudo mais Se

vocecirc jaacute utilizou outras versotildees do JBoss deve estar pensan-

do em utilizar o famoso Farm Deployment onde a aplicaccedilatildeo

era replicada para todos os noacutes do cluster Esse recurso natildeo

existe no Standalone Mode pelo que vocecirc teraacute que realizar

o deploy em todos os noacutes um por um Isso natildeo eacute um proble-

ma se forem 3 ou 4 instacircncias mas imagine se forem umas

20 instacircncias

Uma soluccedilatildeo para esse problema seria a utilizaccedilatildeo de ferra-

mentas como o RHQ (httpwwwjbossorgrhq) para realiza-

ccedilatildeo do deploy em muacuteltiplas instacircncias o que acarretaria con-

sumo de mais recursos e tempo Para solucionar esse pro-

blema temos uma soluccedilatildeo bem simples jaacute embutida no servi-

dor de aplicaccedilatildeo o Domain Mode e eacute sobre isso que vamos

falar no proacuteximo toacutepico

Introduccedilatildeo ao Domain Mode

O Domain Mode permite iniciar vaacuterias instacircncias e tambeacutem

oferece uma maneira centralizada de gerenciamento dos

recursos facilitando a administraccedilatildeo das instacircncias JBoss O

Domain Mode pode ser visto como uma unidade de instacircn-

cias que compartilham recursos e configuraccedilotildees e satildeo admi-

nistradas por um processo chamado Domain Controller

Para iniciar o JBoss AS 7 de modo domain execute o script

JBOSS_HOMEdomainsh no Linux ou JBOSS_HOME

domainbat no Windows

Quando iniciamos o JBoss em Domain Mode na configura-

ccedilatildeo default temos no miacutenimo quatro processos um Host

Controller um Process Controller e dois Servers

Domain Controller Ele eacute quem controla o gerenciamento

do domain Nele estatildeo as configuraccedilotildees que satildeo comparti-

lhadas entre as instacircncias que estatildeo nesse domain

Process Controller Ele eacute de grande importacircncia pois ele eacute

responsaacutevel pela criaccedilatildeo das instacircncias e tambeacutem do Host

Controller que vamos falar a seguir O Process Controller

natildeo deve ser confundido com uma instacircncia ele eacute

simplesmente um processo na JVM

Host Controller Como Domain Controller o Host Controller

tambeacutem coordena as instacircncias do domain Ele eacute o

responsaacutevel por fazer algo semelhando ao Farm Deployment

(natildeo existe nessa versatildeo) ou seja ele distribui o arquivo

deployado para todas as instacircncias do domain

Servers Satildeo as instacircncias em si onde estatildeo as aplicaccedilotildees

deployadas Um ponto importante eacute que cada server eacute um

processo Java

Entre os benefiacutecios da utilizaccedilatildeo do Modo Domain que noacutes

podemos citar estatildeo

Gestatildeo Centralizada

JBOSS APLICATION SERVER 7

A PROGRAMAR

23

Configuraccedilatildeo Centralizada

Deploy Centralizado

Manutenccedilatildeo Centralizada

Preparando a Infra Estrutura

Nesse artigo estamos utilizando Trecircs servidores Dois deles

seratildeo utilizados pelas as instacircncias JBoss e Um seraacute utilizado

Pelo Domain Controller e Apache Web Server para realizar o

Balanceamento de carga

Crie um grupo e adicione um usuaacuterio para ser utilizado

pelo JBoss AS 7 em todos os servidores

$ sudo groupadd jboss

$ sudo useradd -s binbash -d homejboss -m -g jboss

jboss

Faccedila tambeacutem o download do JBoss AS 7 no diretoacuterio

tmp

$ cd tmp

$ wget httpdownloadjbossorgjbossas71jboss-as-

711Finaljboss-as-711Finalzip

Crie a estrutura de diretoacuterios para armazenar o JBoss

$ sudo mkdir usrlocaljboss

$ chown jbossjboss usrlocaljboss

$ su jboss

$ mkdir usrlocaljboss

$ cd usrlocaljboss

$ unzip tmpjboss-as-711Finalzip

Finalmente o JBoss AS 7 estaacute instalado em usr

localjbossjboss-as-711 Final em todos os servidores

Configurando Alta Disponibilidade

Para aplicaccedilotildees com muitas solicitaccedilotildees a busca pela

melhora do desempenho eacute quase constante Um dos

meios mais utilizados eacute o Balanceamento de Carga

que consiste em distribuir a carga das solicitaccedilotildees em

vaacuterios servidores ou instacircncias proporcionando a

melhora no tempo de reposta

O JBoss AS 7 possui um componente nativo

conhecido como mod_cluster que foi criado para

atender a mecanismos de balanceamento de carga

alinhados ao conceito de Cloud O Mod Cluster vem

com algoritmos de balanceamento de carga mais

avanccedilados que se baseiam na carga da aplicaccedilatildeo ou

seja quantidades de sessotildees conexotildees abertas

entre outros Ele pode ser customizado conforme a

necessidade da aplicaccedilatildeo visando um ambiente

elaacutestico Um das vantagens eacute tambeacutem o

descobrimento automaacutetico de novas instacircncias JBoss

(utilizando Multicast) natildeo havendo a necessidade de

configuraccedilotildees extras

As configuraccedilotildees do mod_cluster devem ser

realizadas no JBoss AS 7 e no Apache Web Server

que seraacute utilizado como Proxy reverso

Instalando Apache Web Server

No Servidor Balancer instale o Apache Web Server

Basta executar o seguinte comando

$ sudo yum install httpd -y

Inicie o serviccedilo e verifique se paacutegina de testes eacute

carregada

$ sudo service httpd start

Instalando Mod Cluster

Ainda no Servidor Balancer instale o Mod Cluster Ele

pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgmod_cluster

downloads1-2-0-Final Para instalar basta

JBOSS APLICATION SERVER 7

A PROGRAMAR

24

descompactar o arquivo mod_cluster-120Final-linux2-

x64-ssltargz utilizando um utilitaacuterio de descompressatildeo

e copiar os moacutedulos para o diretoacuterio de moacutedulos do

Apache Web Server

Para baixar e extrair o arquivo execute

$ cd tmp

$ wget httpdownloadsjbossorg

mod_cluster120Finalmod_cluster-120Final-

linux2-x64-ssltargz

$ tar -zxvf mod_cluster-120Final-linux2-x64-

ssltargz

Copie os moacutedulos para o Apache

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_advertiseso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_managerso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_proxy_clusterso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_slotmemso etchttpdmodules

Edite o arquivo etchttpdconfhttpdconf e comente a

linha LoadModule proxy_balancer_module modules

mod_proxy_balancerso para natildeo ocorrer um conflito

com LoadModule proxy_cluster_module modules

mod_proxy_clusterso

LoadModule proxy_balancer_module modules

mod_proxy_balancerso

Crie o arquivo mod_clusterconf e adicione a seguinte

configuraccedilatildeo

$ sudo vim etchttpdconfdmod_clusterconf

Reinicie o Apache

$ sudo service httpd restart

Acesse o mod_cluster-manager e verifique se as

informaccedilotildees sobre a versatildeo do mod_cluster estatildeo

aparecendo

Arquitetura dos Servidores em Modo Domain

Para realizar os testes do balanceamento de carga

com o mod_cluster vamos subir o Domain Controller

e depois vamos conectar dois Hosts Controller com

uma Instacircncia JBoss em cada

Criando os Perfis dos Servidores JBoss

No Servidor Balancer crie o perfil chamado master

que seraacute o Domain Controller

$ cp -Rap usrlocaljbossjboss-as-711Final

domain usrlocaljbossjboss-as-711Finalmaster

JBOSS APLICATION SERVER 7

Content Mod Cluster LoadModule slotmem_module modules mod_slotmemso LoadModule manager_module modules mod_managerso LoadModule proxy_cluster_module modules mod_proxy_clusterso LoadModule advertise_module modules mod_advertiseso ltVirtualHost 80gt ltDirectory gt Order denyallow Allow from all ltDirectorygt KeepAliveTimeout 60 ManagerBalancerName mycluster MaxKeepAliveRequests 0 ServerAdvertise On EnableMCPMReceive On ltVirtualHostgt ltLocation mod_cluster-managergt SetHandler mod_cluster-manager Order denyallow Allow from all ltLocationgt

A PROGRAMAR

25

No Servidor Host-01 crie o perfil chamado host01 que

seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost01

No Servidor Host-02 crie o perfil chamado host02 que

tambeacutem seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost02

Configurando Toda a Arquitetura

Como vimos anteriormente todas as configuraccedilotildees e

gerenciamento satildeo realizadas de forma centralizada no

Domain Controller Quando for necessaacuterio adicionar um

novo grupo de servidores configurar logs criar

datasources alterar portas entre outras coisas tudo

isso deveraacute ser feito no domainxml do Domain

Controller que nesse caso eacute chamado de master Sendo

assim todas as nossas instacircncias JBoss usufruiratildeo das

configuraccedilotildees realizadas para o Domain ou para o

Server Group em questatildeo

A primeira coisa a ser feita eacute definir qual o conjunto de

tecnologias (subsystems) seratildeo utilizadas na aplicaccedilatildeo

Isso pode variar conforme os requisitos de cada

sistema Um conjunto de tecnologias (subsystems) no

JBoss 7 eacute chamado de profile

ltprofile name=full-hagt

O JBoss AS 7 possui 4 profiles por padratildeo ldquodefaultrdquo

ldquofullrdquo ldquohardquo ldquofull-hardquo mas nada impede de noacutes

copiarmos qualquer um deles e renomeaacute-los conforme

nossos requisitos No Java EE 6 foi introduzido o

conceito de Profiles onde se pode criar um subconjunto

de tecnologias presentes na spec Java EE ou ateacute

mesmo adicionar novas definidas pela JCP (Java

Community Process)

Mais informaccedilotildees

httpscommunityjbossorgwiki

JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Noacutes vamos utilizar o profile ha pois nele os recursos

para clusterizaccedilatildeo estatildeo disponiacuteveis

Depois de definir o profile o proacuteximo criar um Grupo de

Servidores Server Group Um server group nada mais eacute

que um agrupamento de instacircncias JBoss Nessa

arquitetura vamos utilizar apenas um server group Isso

pode ser definido na tag ltserver-groupsgt no domainxml

do master (Domain Controller)

Crie um Server Group chamado apps que utilize o

profile ha

$ vim usrlocaljbossjboss-as-711Finalmaster

configurationdomainxml

Os outros Server Groups podem ser removidos

No profile ha especificamente no subsystem web

adicione o atributo instance-id

O instance-id seraacute passado como paracircmetro na

inicializaccedilatildeo do Host Controller

O proacuteximo passo eacute configurar o atributo proxy list no

subsystem modcluster

Nesse atributo estaacute configurado o IP e porta do

Apache Web Server

No Servidor Host-01 edite o arquivo usrlocaljboss

jboss-as-711Finalhost01configurationhost-

slavexml para criar a instacircncia JBoss

Na tag ltserversgt eacute onde estatildeo de fato as nossas

instacircncias JBoss Quando criamos um novo ltservergt

estamos criando uma nova instacircncia JBoss

Conforme foi definido na arquitetura o Host Controller

01 conteraacute apenas uma instacircncia JBoss chamada

instance-one

Deixe o ltserversgt como abaixo

Definimos que a instacircncia JBoss instance-one faraacute

parte do Server Group apps

Para finalizar na tag lthostgt adicione o nome host01

lthost name=host01 xmlns=urnjbossdomain12gt

JBOSS APLICATION SERVER 7

ltserver-group name=apps profile=hagt ltjvm name=defaultgt ltheap size=1303m max-size=1303mgt ltpermgen max-size=256mgt ltjvmgt ltsocket-binding-group ref=ha-socketsgt ltserver-groupgt

ltsubsystem xmlns=urnjbossdomainweb12 de-fault-virtual-server=default-host instance- id=$jbossservername native=falsegt

ltsubsystem xmlns=urnjbossdomainmodcluster10gt ltmod-cluster-config advertise-socket=modcluster proxy-list=19216823818680gt ltdynamic-load-providergt ltload-metric type=busynessgt ltdynamic-load-providergt ltmod-cluster-configgt ltsubsystemgt

ltserversgt ltserver name=instance-one group=appsgt ltservergt ltserversgt

A PROGRAMAR

26

Repita os procedimentos realizados no servidor Host -01

em Host-02 alterando apenas o nome do servidor que

seraacute instance-two e do lthostgt que seraacute host02No

ambiente em que realizei os testes o sevidores possuem

os seguintes IPs

Domain Controller+Apache WebServer 192168238186

Host Controller 01 192168238187

Host Controller 02 192168238188

Inicie o Domain Controler (master) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalmaster

-Djbosshostdefaultconfig=host-masterxml -

Djbossbindaddress=192168238186 -

Djbossbindaddressmanagement=192168238186

Verifique o log

JBoss AS 711Final Brontes (Host Controller) started

in 15505ms - Started 11 of 11 services (0 services are

passive or on-demand)

O Domain Controller foi iniciado com sucesso Conecte

primeiro Host Controller 01 (Host-01) ao Master Inicie o

Perfil host01 utilizando os seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost01

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238187

-Djbossbindaddress=192168238187

-Djbossservername=host-01

Agora observe os logs no Domain Controller e perceba

que o Host Controller 01 se conectou ao Domain

JBAS010918 Registered remote slave host host01

JBoss AS 711Final Brontes

Observe tambeacutem o Mod Cluster Manager em

http192168238186mod_cluster-manager e veja que

a nossa primeira instacircncia jaacute apareceu

Inicie o Host Controller 02 (slave02) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost02

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238188

-Djbossbindaddress=192168238188

-Djbossservername=host-02

Observando novamente o log Domain Controller e

verifique que o Host Controller 02 se tambeacutem

conectou

JBAS010918 Registered remote slave host host02

JBoss AS 711Final Brontes

No Mod Cluster Manager em http192168238186

mod_cluster-manager jaacute estatildeo as duas instacircncias

Para testar o Balanceamento vamos fazer o deploy da

aplicaccedilatildeo SystemProps que pode ser baixada http

googlyjynK Para fazer o deploy conecte do domain

controller utilizando o CLI

[jbosslocalhost jboss]$ sudo jboss-as-711Final

binjboss-clish -c controller=1921682381869999

[domain1921682381869999 ] deploy tmp

systempropswar --server-groups=apps

A aplicaccedilatildeo foi deployada para as instacircncias do server

group apps Acesse a url do balanceador e verifique

se a aplicaccedilatildeo estaacute disponiacutevel

http192168238186systemprops

JBOSS APLICATION SERVER 7

A PROGRAMAR

27

Perceba que estamos na instance-one Entatildeo para

testarmos o funcionamento do balanceamento de carga

vamos parar a Instacircncia instance-one e quando

tentarmos um novo acesso seraacute redirecionado para o

instance-two

No CLI execute o seguinte comando para parar o

instance-one

[domain1921682381869999 ] host=host01server -

config=instance-onestop

outcome =gt success

result =gt STOPPING

Acesse novamente a aplicaccedilatildeo http192168238186

systemprops

Perceba que agora estamos no instance-two Concluiacutemos assim que o balanceamento de carga estaacute funcionando

Conclusatildeo

O JBoss AS 7 trouxe a evoluccedilatildeo arquitetural que era esperada como pode ser vista nesse artigo Carregamento de moacutedulos dinacircmico gerenciamento centralizado e tempo de startup reduzido satildeo apenas

algumas das inuacutemeras melhorias trazidas nessa versatildeo

Espera-se que a plataforma JBoss continue evoluindo

trazendo sempre mais benefiacutecios a todos que utilizam

os produtos desse ecossistema Cada membro da

comunidade tambeacutem pode fazer a sua parte seja

colaborando com artigos ou participando de

discussotildees para encontrar melhorias para a

plataforma Cabe a noacutes aceitar o convite de melhorar

cada vez mais essa tecnologia

JBOSS APLICATION SERVER 7

AUTOR Escrito por Mauricio Magnani Jr

Consultor JBoss com 6 anos de experiecircncia no mercado Trabalhou na RedHat como Engenheiro de Suporte JBoss atenden-

do clientes da Ameacuterica Latina e EUA Criador e mantenedor do blog httpsjbossdiverswordpresscom e membro ativo do

Grupo de Usuaacuterios JBoss do Brasil Hoje eacute Senior Java Software Engineer no Groupon Brasil Possui as certificaccedilotildees Red Hat

Certified JBoss Administrator on JBoss EAP 5 e JBoss EAP 6

Milhares de apli-

cativos para Web

e Mobile satildeo desenvol-

vidos a cada mecircs utili-

zando esta plataforma

como base A platafor-

ma Java mudou muito

desde seu iniacutecio e pro-

vavelmente vai conti-

nuar evoluindo nos

proacuteximos anos

A PROGRAMAR

28

Para o desenvolvimento de aplicaccedilotildees Web existem um sem

nuacutemero de frameworks gratuitas e mais ou menos bem con-

ceituadas Contudo temos vaacuterios problemas associados que

com o crescer de uma aplicaccedilatildeo podem trazer vaacuterios recuos

no seu desenvolvimento Um dos maiores eacute o oacutebvio satildeo

gratuitas e por isso mesmo o coacutedigo eacute lido por milhares de

pessoas em todo o mundo tornando as falhas de seguranccedila

bastante visiacuteveis e faacuteceis de explorar Outro grande proble-

ma eacute o facto de trazerem funcionalidades especiacuteficas em que

muitas vezes natildeo as usamos tornando-se em alguns casos

um ldquocanhatildeo para matar um mosquitordquo Pegando na aborda-

gem das correntes frameworks podemos noacutes proacuteprios cons-

truir algo soacutelido o suficiente para uma grande aplicaccedilatildeo

Vamos nesta seacuterie de trecircs artigos construir uma framework

passo-a-passo comeccedilando pelo baacutesico mas o mais importan-

te o routing

htaccess

Tirando partido do serviccedilo Apache delegamos o enclausura-

mento do nosso sistema de ficheiros agrave regras htaccess Natildeo

permitimos a listagem de ficheiros nem a execuccedilatildeo de outros

scripts PHP agrave excepccedilatildeo do indexphp sendo este o respon-

saacutevel pelo routing da framework Para garantirmos que estas

regras satildeo cumpridas e que o indexphp seja sempre chama-

do redireccionamos todos os pedidos de execuccedilatildeo de

scripts para o mesmo indexphp dando-lhe todos os argu-

mentos do URL originalmente fornecidos Desta forma o

utilizador natildeo sabe a que ficheiros ou pastas estaacute a aceder

A esta regra temos de adicionar uma excepccedilatildeo a pasta con-

tent onde temos todos os conteuacutedos como imagens ficheiros

CSS viacutedeos etc No fundo todos aqueles ficheiros que o

browser do utilizador vai descarregar Para mantermos o

enclausuramento da nossa aplicaccedilatildeo natildeo eacute aconselhado

natildeo colocarmos nessa pasta nenhum tipo de script visto que

pode ser executado arbitrariamente do exterior o contraacuterio

do que queremos

configphp

PHP Uma framework ldquofrom scratchrdquo (Parte 1) Usaremos este ficheiro como auxilio para definiccedilotildees de cami-

nhos para pastas e configuraccedilotildees por defeito

define(DS DIRECTORY_SEPARATOR)

Esta definiccedilatildeo eacute uma redundacircncia eacute definida simplesmente

por conveniecircncia na escrita do coacutedigo

define(BASE_PATHhttplocalhost)

Aqui definimos o caminho URL para a nossa aplicaccedilatildeo

define(DEFAULT_PAGEhello)

Esta eacute a nossa paacutegina por defeito caso nenhuma tenha sido

requirida

define(ROOT$_SERVER[DOCUMENT_ROOT])

Aqui eacute definido o caminho para a pasta da aplicaccedilatildeo

Uma vez definidas as configuraccedilotildees passamos agrave parte mais

importante o routing

Visto que temos todos os requests redireccionados para o

indexphp agora temos de fazer sentido dos argumentos

que satildeo passados pelo URL

Aqui separamos os argumentos em duas partes a paacutegina

que queremos aceder e os argumentos para esta paacutegina O

seguinte pedido

httplocalhosthellofoobar

resulta em

RewriteEngine on RewriteCond $1 ^(allowphp|indexphp|content) RewriteRule ^()$ indexphp$1 [L] ltFiles htaccessgt order allowdeny deny from all ltFilesgt

define(DS DIRECTORY_SEPARATOR) define(BASE_PATHhttplocalhost) define(DEFAULT_PAGEhello) define(ROOT$_SERVER[DOCUMENT_ROOT])

function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url

array (size=2) page =gt string hello (length=5) args =gt array (size=2) 0 =gt string foo (length=3) 1 =gt string bar (length=3)

A PROGRAMAR

29

(hellip)micro-

framework temos um

sistema de routing que

nos iraacute permitir nos

dois proacuteximos artigos

alargar os horizontes

passando a uma pro-

gramaccedilatildeo OOP e imple-

mentando MVC

De seguida encaminhamos para a paacutegina requerida

Aqui verificamos se a paacutegina que eacute pedida existe no case de

existir importamos o ficheiro caso contrario enviamos o header

de erro e terminamos a aplicaccedilatildeo

Indexphp

ROOT

Indexphp

Configphp

htaccess

Pages

Hellophp

Com esta micro-framework temos um sistema de routing que

nos iraacute permitir nos dois proacuteximos artigos alargar os horizon-

tes passando a uma programaccedilatildeo OOP e implementando

MVC Finalmente iremos implementar um pequeno driver

para MySQL e um debugger

Dependecircncias

Apache com mod_rewrite e PHP

P VS NP COMPREENDER O MAIOR PROBLEMA POR RESOLVER EM COMPUTACcedilAtildeO

function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

ltphp require_once (configphp) function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

callHook() gt

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

COLUNAS C - Observable vs Task

Visual (Not) Basic - Operator Overloading

C

32

Nas ediccedilotildees anteriores vimos como transformar uma API

baseada assiacutencrona em eventos numa API baseada em ob-

servaacuteveis (observables) ou numa API baseada em tarefas

A questatildeo que se levanta eacute quando usar qual

Quando Usar Observaacuteveis

A programaccedilatildeo baseada em observaacuteveis eacute tambeacutem conheci-

da como programaccedilatildeo reativa e comeccedilou a ser usada como

alternativa a assiacutencrona baseada em eventos porque a pro-

gramaccedilatildeo assiacutencrona baseada em tarefas ainda natildeo estava

disponiacutevel (ou natildeo estava disponiacutevel em todas as platafor-

mas)

Na verdade o campo de batalha da programaccedilatildeo reativa

satildeo as correntes de eventos (event streams) Eacute aqui que a

utilizaccedilatildeo de eventos se torna tambeacutem mais natural

Uma API baseada em eventos em que o evento apenas eacute

disparado uma vez eacute na verdade uma API baseada em

chamadas de resposta (callback) O facto de ser implemen-

tada com o mecanismo de eventos da plataforma NET natildeo

faz dela uma API baseada em eventos

A existecircncia da necessidade de combinar vaacuterias correntes de

eventos e relacionaacute-los entre si eacute tambeacutem uma boa indicaccedilatildeo

para a utilizaccedilatildeo de observaacuteveis

Quando Usar Tarefas

Como o nome indica uma tarefa eacute algo que tem um iniacutecio e

um fim Assim sendo todas as API assiacutencronoas baseadas

num mecanismo de chamada de resposta (callback) satildeo

candidatadas a ser transformadas numa API assiacutencrona

baseada em tarefas Mesmo que o mecanismo de chamada

de resposta sejam eventos NET

Matriz De Aplicabilidade

Baseando-nos nas consideraccedilotildees anteriores e porque nem

sempre tudo eacute assiacutencrono chegamos agrave seguinte matriz de

aplicabilidade

Conclusatildeo

No final natildeo existe uma resposta maacutegica O que numa situa-

ccedilatildeo pode ser um observaacutevel noutra pode ser uma tarefa

Recursos

O GeoCoordinateWatcher Como Um Serviccedilo Reativo - Re-

vista PROGRAMAR - 39ordf Ediccedilatildeo - Fevereiro 2013

Trazendo Async E Await ao Serviccedilo de Contactos do Win-

dows Phone - Revista PROGRAMAR - 40ordf Ediccedilatildeo - Abril

2013

Extensotildees Reativas (Rx)

Programaccedilatildeo assiacutencrona com async e await (C e Visual

Basic)

C - OBSERVABLE VS TASK

Siacutencrono Assiacutencrono

Um uacutenico valor - Tarefa

Muacuteltiplos valo-

res

Enumeraacutevel Observaacutevel

AUTOR

Escrito por Paulo Morgado

Bacharel em Engenharia Electroacutenica e Telecomunicaccedilotildees (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa

e Licenciado em Engenharia Informaacutetica pela Faculdade de Ciecircncias e Tecnologia da Universidade Nova de Lisboa exerce

variadas funccedilotildees relacionadas com o desenvolvimento distribuiccedilatildeo e manutenccedilatildeo de software haacute mais de 10 anos Participa

em diversas comunidades nacionais e internacionais (pontoNETpt NetPonto SharePointPT SQLPort Portugal-a-Programar

CodeProject CodePlex etc) Pelo seu contributo para com estas comunidades a Microsoft premeia-o com o preacutemio MVP

(C) desde 2003 Eacute ainda co-autor do livro ldquoLINQ Com Crdquo da FCA httpPauloMorgadoNET - PauloMorgado

o campo de bata-

lha da programaccedilatildeo re-

ativa satildeo as correntes

de eventos (event stre-

ams)

VISUAL (NOT) BASIC

33

ldquoNatildeo podes somar batatas com elefantesrdquo

Frases como a anterior ou semelhantes jaacute vos passaram

por a consideraccedilatildeo em alguma altura da vossa vida Quer

tenha sido nos vossos primeiros passos a matemaacutetica ou

ainda na semana passada em qualquer implementaccedilatildeo de

software mais rebuscada algueacutem algures transmitiu dessa

forma que natildeo eacute possiacutevel operar aquelas duas variaacuteveis

De facto batatas e elefantes natildeo satildeo tipicamente operaacuteveis

a menos que a resposta de que estamos agrave procura seja dife-

rente

Saber como operar

A soluccedilatildeo da soma de batatas com elefantes reside precisa-

mente na resposta que procuramos obter

Eu posso dizer que Elefante + Batata eacute igual a 4 se for es-

pecificado que a soma de seres-vivos opera aritmeticamente

o nuacutemero de pernas do ser Natildeo posso Claro que posso

Soacute precisamos de definir que os seres-vivos satildeo operaacuteveis

assim e de que forma Eacute aqui que entra o ldquooverloadrdquo de ope-

radores

Operadores

Operadores sim Quando se falam de operadores referem-

se todos aqueles que estatildeo provavelmente a passar-vos na

cabeccedila agora tanto unaacuterios como binaacuterios mas nem todos

Unaacuterios + - Not IsTrue IsFalse CType

Binaacuterios + - amp Like Mod And Or Xor ^ ltlt

gtgt = ltgt gt lt gt= lt=

Estes operadores fazem sentido nos usos comuns onde jaacute

sabemos para que servem e que resultados vatildeo surtir

Agrave luz da especificaccedilatildeo anterior podemos afirmar com segu-

ranccedila que Elefante gt Batata porque uma batata natildeo tem

pernas e porque conhecemos o operador gt (maior que)

A implementaccedilatildeo do operador pode basear-se em qualquer

aspecto dos seus operandos mas natildeo eacute boa ideia contradi-

zer a loacutegica do operador que se estaacute a definir Por razotildees

oacutebvias natildeo eacute boa ideia por exemplo implementar overloads

de tal forma que Batata - Elefante = -4 ao mesmo tempo que

Batata gt Elefante = TRUE Natildeo faz sentido porque natildeo esta-

mos a usar o mesmo criteacuterio Se Batata ndash Elefante eacute menor

que zero a Batata deveria ser menor que o Elefante e natildeo o

contraacuterio

Natildeo eacute que seja impossiacutevel mas vai tornar o coacutedigo muito

mais difiacutecil de ler o que vai contra a facilidade do overload

de operadores

Overload

A ideia natildeo eacute inventar novos operadores O que queremos

realmente indicar eacute qual o procedimento a seguir para conse-

guir aplicar o anaacutelogo do operador para determinado tipo ou

determinados tipos Assim o operador + por exemplo teraacute

de continuar a fazer sentido na aritmeacutetica ao mesmo tempo

que faz sentido na soma de seres-vivos se tentarmos somar

nuacutemeros entra o operador aritmeacutetico se tentarmos somar

batatas com elefantes entra a nossa implementaccedilatildeo do ope-

rador

Portanto e em tom de resumo da mesma forma que defini-

mos overloads de meacutetodos tambeacutem se definem overloads

de operadores com base na sua assinatura

Jaacute chega de elefantes e batatas natildeo

Efectivamente jaacute Natildeo conveacutem esticar a analogia ateacute porque

nem todos os operadores fazem sentido com uma classe de

seres vivos As coisas comeccedilam a ficar mais claras com

exemplos de implementaccedilatildeo

Vamos considerar a seguinte classe para exemplificar

Como seraacute de esperar se tentarmos por exemplo comparar

instacircncias desta classe o Visual Basic natildeo saberaacute o que

fazer para comparar Eacute um tipo composto que compreende

OPERATOR OVERLOADING

Public Class Veiculo Public Enum TipoVeiculo AUTOMOVEL MOTO PESADO End Enum Public Enum TipoCombustivel GASOLINA GASOLEO HIBRIDO ELECTRICO GPL End Enum Public Property Tipo As TipoVeiculo Public Property Marca As String Public Property Modelo As String Public Property Cilindrada As Integer Public Property Combustivel As TipoCombustivel Public Property NumeroPortas As Short Sub New(Tipo As TipoVeiculo Marca As String Modelo As String Cilindrada As Integer Combustivel As TipoCombustivel NumeroPortas As Short) _Tipo = Tipo _Marca = Marca _Modelo = Modelo _Cilindrada = Cilindrada _Combustivel = Combustivel _NumeroPortas = NumeroPortas End Sub End Class

VISUAL (NOT) BASIC

34

membros que noacutes mesmos criamos e seria impossiacutevel perce-

ber automaticamente quais as caracteriacutesticas a comparar

Este coacutedigo natildeo compila com dois erros em Carro1 = Carro2

e Carro2 = Carro3

Operator = is not defined for types OperatorOverloadVeicu-

lo and OperatorOverloadVeiculo

E tem toda a razatildeo O operador igual (=) natildeo estaacute nem im-

plementado na classe nem tem nenhum overload que im-

plique uma operaccedilatildeo binaacuteria com dois tipos Veiculo

Vamos entatildeo implementar um operador para o igual (=) que

consiga determinar se estamos na presenccedila do mesmo

veiacuteculo ou natildeo Vamos considerar que a cilindrada natildeo eacute um

factor para distinguir dois carros

Basta acrescentar os seguintes meacutetodos na classe Veiculo

Algumas implementaccedilotildees de operadores implicam que se

implementem tambeacutem a sua negaccedilatildeo No caso do operador

igual (=) eacute necessaacuterio natildeo soacute especificar o que eacute consider-

ado igual mas tambeacutem o que eacute considerado diferente

Assim o coacutedigo anterior jaacute eacute correctamente compilado e

produz o seguinte output

Carro1 = Carro2 False

Carro2 = Carro3 True

O que eacute verdade Como operaccedilotildees aritmeacuteticas natildeo faziam

muito sentido com uma classe a representar um veiacuteculo

vamos considerar esta nova classe

Esta classe representa um vector tridimensional Manteacutem um

valor para X para Y e para Z Natildeo adianta realizar

operaccedilotildees aritmeacuteticas com o Vector uma vez que novamen-

te o Visual Basic natildeo saberia o que fazer com ele

Vamos entatildeo acrescentar alguns operadores

Assim jaacute eacute possiacutevel efectuar algumas operaccedilotildees com esta

classe

OPERADOR LIKE

Public Shared Operator =(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return False If V1Combustivel ltgt V2Combustivel Then Return False If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return False If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return False If V1NumeroPortas ltgt V2NumeroPortas Then Return False Return True End Operator Public Shared Operator ltgt(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return True If V1Combustivel ltgt V2Combustivel Then Return True If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return True If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return True If V1NumeroPortas ltgt V2NumeroPortas Then Return True Return False End Operator

Public Class Vector3 Public Property X As Decimal Public Property Y As Decimal Public Property Z As Decimal Sub New(X As Decimal Y As Decimal Z As Decimal) _X = X _Y = Y _Z = Z End Sub Public Overrides Function ToString() As String Return StringFormat((012) _X _Y _Z) End Function End Class

Public Shared Operator +(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X + V1X V2Y + V1Y V2Z + V1Z) End Operator Public Shared Operator -(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X - V1X V2Y - V1Y V2Z - V1Z) End Operator Public Shared Operator (V1 As Vector3 V2 As Vector3) Return (V2X V1X) + (V2Y V1Y) + (V2Z V1Z) End Operator Public Shared Operator (V1 As Vector3 E1 As Decimal) Return New Vector3(E1 V1X E1 V1Y E1 V1Z) End Operator Public Shared Operator amp(S1 As String V1 As Vector3) Return S1 amp V1ToString End Operator

Dim V1 As New Vector3(3 2 1) Dim V2 As New Vector3(1 2 3) DebugWriteLine(Adiccedilatildeo amp (V1 + V2)) DebugWriteLine(Subtraccedilatildeo amp (V1 - V2)) DebugWriteLine(Produto escalar amp (V1 V2)) DebugWriteLine(Multiplicaccedilatildeo com escalar amp (V2 3))

Dim Carro1 As New Veiculo(AUTOMOVEL Ford Ka 1249 GASOLINA 3) Dim Carro2 As New Veiculo(AUTOMOVEL Ford Ka 1250 GASOLEO 3) Dim Carro3 As New Veiculo(AUTOMOVEL Ford Ka 1251 GASOLEO 3) DebugWriteLine(Carro1 = Carro2 amp (Carro1 = Carro2)) DebugWriteLine(Carro2 = Carro3 amp (Carro2 = Carro3))

VISUAL (NOT) BASIC

35

O que produz

Adiccedilatildeo (444)

Subtraccedilatildeo (-202)

Produto escalar 10

Multiplicaccedilatildeo com escalar (369)

Foi necessaacuterio especificar o operador de concatenaccedilatildeo para

que o Visual Basic saiba como tratar a concatenaccedilatildeo de uma

String com o resultado de uma outra operaccedilatildeo com a mesma

classe

Neste caso estamos apenas a concatenar a String com a

representaccedilatildeo String da classe que definimos anteriormen-

te Ao analisar os operadores podemos verificar que existem

dois overloads para a multiplicaccedilatildeo

Um implica dois vectores e o outro um vector e um decimal

A nossa implementaccedilatildeo dita que se forem fornecidos dois

vectores o resultado seraacute o produto escalar dos dois vec-

tores

Se for fornecido apenas um vector e um valor escalar o re-

sultado seraacute outro vector que representa o produto desse

vector com um escalar

Existe com certeza aplicaccedilotildees matemaacuteticas (e natildeo soacute) mais

interessantes mas as apresentadas demonstram a facilidade

com que implementamos os nossos proacuteprios comportamen-

tos de operadores

Conclusatildeo

Operator overloading permite uma notaccedilatildeo mais proacutexima do

domiacutenio alvo o que promove a legibilidade e dissipa duacutevidas

de interpretaccedilatildeo Esta eacute a sua maior vantagem

No entanto se as implementaccedilotildees natildeo forem de encontro ao

sentido natural dos operadores o efeito poderaacute ser o perfeito

contraacuterio

Eacute um caso tiacutepico de melhor amigo ou pior inimigo Natildeo haacute

meio-termo

OPERADOR LIKE

AUTOR

Escrito por Seacutergio Ribeiro

Curioso e autodidata com uma enorme paixatildeo por tecnologias de informaccedilatildeo e uma saudaacutevel relaccedilatildeo com a NET Fra-

mework Moderador global na comunidade PortugalProgramar desde Setembro de 2009 Alguns frutos do seu trabalho

podem ser encontrados em httpwwwsergioribeirocom

Operator overlo-

ading permite uma no-

taccedilatildeo mais proacutexima do

domiacutenio alvo

Media Partners da Revista PROGRAMAR

EVENTOS

37

No passado dia 25 de Maio de 2013 realizou-se na Microsoft

Portugal no Parque das Naccedilotildees o 1ordm evento presencial da

comunidade Portugal a Programar Ainda antes das 9h come-

ccedilaram a chegar os participantes crescia o entusiasmo envolto

em todo o evento e pouco a pouco todos noacutes fomos dando

cara aos nicks a que nos habituaacutemos ao longo dos anos

Pontualmente a organizaccedilatildeo deu iniacutecio ao evento PROGRA-

MAR 2013 com Jorge Paulino David Pintassilgo e Rui Gon-

ccedilalves a abrir o evento Brevemente foi-nos dada a conhecer

a comunidade PP assim como os quatro pontos-chave que

a caracterizam

Foacuterum PP

Wiki

Portal de Downloads

Revista Programar

Parafraseando o anfitriatildeo Jorge Paulino ldquoeste foi um projeto

que se iniciou a 28 de Maio de 2005 para dar resposta agrave ne-

cessidade de partilhar informaccedilatildeo e experiecircncias nesta aacutereardquo

Apoacutes a apresentaccedilatildeo do evento e da comunidade seguiu-se

um discurso inspirador de um dos oradores Rui Delgado

acerca da necessidade de se empreender em Portugal

Com o limite de inscriccedilotildees a ser atingido em apenas trecircs dias

o 1ordm evento do PP contou com a presenccedila de 19 oradores

voluntaacuterios que deram origem a 18 apresentaccedilotildees teacutecnicas e

a 2 workshops praacuteticos Cerca de 250 participantes estiveram

presentes no edifiacutecio da Microsoft Lisbon Experience

EVENTO PROGRAMAR 2013

EVENTOS

38

Pelas diversas salas do evento partilharam-se experiecircncias e

conhecimento As apresentaccedilotildees decorreram 3 em simultacirc-

neo e foram as seguintes

Apresentaccedilatildeo das novidades de Java EE 7 (Ernest

Duarte)

As novidades do C 50 (Paulo Morgado)

ASPNET SignalR ndash Comunicaccedilatildeo em real-time sim-

ples e para todo mundo (Glauco Godoi)

Conquistar o mundo com aplicaccedilotildees feitas agrave velocida-

de da luz (Ricardo Marques)

CRM Como escolher De raiz ou sistema jaacute desen-

volvido (Pedro Azevedo)

Desenvolvimento de Aplicaccedilotildees em Windows Phone 8

(Nuno Silva)

Desenvolvimento em SharePoint por onde comeccedilar

(Rodrigo Pinto)

Desenvolvimento raacutepido de siacutetios web com personali-

zaccedilatildeo de Joomla ( Rui Guimaratildees )

DMVs ndash Conhece o teu SQL Server (Vitor Pombeiro)

Empreendedorismo em TI (Fernando Martins)

HTML5 e CSS3 ndash raacutepido e eficaz para o presente

(Seacutergio Laranjeira)

Introduccedilatildeo ao Cloud Computing e ao Windows Azure

(Vitor Tomaz)

Microsoft Kinect SDK (Rui Simatildeo)

Plataforma de desenvolvimento para Windows Store

Apps (Nuno Silva)

Powershell agrave minha maneira (Bruno Lopes)

O desenvolvimento de aplicaccedilotildees moacuteveis antes da 1ordf

linha de coacutedigo (Alberto Silva)

SEO ndash A importacircncia do Search Engine Optimization

(Miguel Lobato)

SQL Server ndash Performance e Tunning (Pedro Martins)

E ainda os workshops praacuteticos

Workshop ndash Integraccedilatildeo de CRM Dynamics com Java

e NET (Pedro Azevedo)

Workshop ndash Web em Realtime (Seacutergio Costa)

EVENTOS

39

Durante o decorrer das sessotildees houve ainda oferta de brindes

(gentilmente oferecidos pelos patrocinadores) aos participan-

tes

Outro ponto que marcou este PROGRAMAR 2013 foi o con-

curso de aplicaccedilotildees Windows Phone e Windows 8 vencido

por Jorge Costa com o jogo ldquoLittle Bitsrdquo sendo o segundo

lugar atribuiacutedo a Mauro Castro pela aplicaccedilatildeo ldquoPortugalrsquos Eve-

ningsrdquo

Houve ainda demostraccedilotildees do Microsoft Kinect (Rui Simatildeo) e

do Leap Motion (Diniz Vieira) a todos os participantes interes-

sados e todo o dia foi passado num espiacuterito descontraiacutedo e

animado aumentando assim os laccedilos entre toda a comunida-

de

A toda a organizaccedilatildeo e a todos os oradores envolvidos dei-

xamos um agradecimento especial agradecendo tambeacutem a

todos os patrocinadores nomeadamente a Microsoft Portugal

ESET Portugal FCA Editora Rumos e Truewind-Chiron Nun-

ca deixando de referir tambeacutem os Media Parters que ajuda-

ram a toda a divulgaccedilatildeo deste evento

A todos os elementos da comunidade que fazem com que a

Portugal-a-Programar seja cada vez mais conhecida no nosso

paiacutes e aleacutem-fronteiras a todos deixamos um ldquoMuito Obriga-

dordquo relembrando mais uma vez que este eacute um projeto de to-

dos e para todos e que a mais pequena accedilatildeo pode fazer a

diferenccedila

Eacute com satisfaccedilatildeo e orgulho que podemos afirmar que o 1ordm

Evento Presencial do PP foi um sucesso pois mesmo apoacutes

as sessotildees terem terminado houve ainda quem se mantives-

se no local partilhando experiecircncias de um dia cheio de emo-

ccedilotildees

E citando um dos oradores do evento Rui Delgado ldquoOh Yes

Muito Bomrdquohellip Venha o PROGRAMAR 2014

Paacutegina do evento httpeventoportugal-a-programarpt

(hellip) a mais peque-

na accedilatildeo pode fazer a

diferenccedila

Anaacutelises Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

C 50 com Visual Studio 2012

Review

41

Tiacutetulo Android ndash Introduccedilatildeo ao Desenvol-

vimento de Aplicaccedilotildees

Autor Ricardo Queiroacutes

Editora FCA

Paacuteginas 224

ISBN 978-972-722-763-1

O Android tornou-se na plataforma de dispositivos moacuteveis

mais usada no mundo e como tal existe um interesse cres-

cente dos programadores em criarem soluccedilotildees para esse

mercado Para quem queira dar aquele 1ordm passo no desen-

volvimento de aplicaccedilatildeo em Android o livro ldquoAndroid - Intro-

duccedilatildeo ao desenvolvimento de aplicaccedilotildeesrdquo de Ricardo Quei-

roacutes eacute uma boa escolha

Conteacutem passo a passo desde a configuraccedilatildeo do ambiente

de desenvolvimento ateacute agrave concepccedilatildeo de uma aplicaccedilatildeo para

Android na sua iacutentegra Destaca exemplos muito uacuteteis que

podem ser reaproveitados noutra aplicaccedilatildeo pois contempla

o desenho de uma interface graacutefica a gestatildeo de dados da

aplicaccedilatildeo atraveacutes de gestatildeo de ficheiros ou bases de dados

utilizaccedilatildeo de APIs de localizaccedilatildeo mapas e sensores e a

criaccedilatildeo do jogo do galo

Durante a sua leitura pode-se constatar que eacute um livro rico

em imagens explicativas e exemplificativas que nos ajudam

a perceber o que devemos fazer e o que devemos alcanccedilar

com a construccedilatildeo de todo o coacutedigo escrito

Infelizmente jaacute eacute habitual que nos sejam apresentados os

tiacutepicos tons acinzentados das ilustraccedilotildees e a ausecircncia de

qualquer tipo de realce de sintaxe no coacutedigo-exemplo o que

por vezes pode-se tornar cansativo ao olhar

Um factor alheio ao autor do livro mas que a editora em

causa deveria ter em consideraccedilatildeo por forma a facilitar a

leitura

ldquoAndroid ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildeesrdquo

de Ricardo Queiroacutes eacute um bom livro para quem jaacute tenha algu-

ma experiecircncia em programaccedilatildeo Java e que queira explorar

as potencialidades do Android

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

(hellip) destaca exem-

plos muito uacuteteis que

podem ser reaproveita-

dos noutra aplicaccedilatildeo

(hellip)

Review

42

Tiacutetulo C 50 com Visual Studio 2012

Autor Henrique Loureiro

Editora FCA

Paacuteginas 608

ISBN 978-972-722-752-5

Elementos de programaccedilatildeo

Abordam-se os temas de programaccedilatildeo mais elementar com

referecircncias agrave programaccedilatildeo iterativa passando pela orientada

a objecto O texto estaacute nitidamente orientado para um puacutebli-

co que tem noccedilotildees baacutesicas de programaccedilatildeo explicando a

loacutegica de uma funccedilatildeo ateacute agrave heranccedila de classes Tenta de

uma forma sucinta demonstrar na praacutetica ou seja com code-

snipets como construir de uma forma coerente uma aplica-

ccedilatildeo em C recorrendo ao Visual Studio

Usabilidade - Eacute tambeacutem abordada a importacircncia da usabili-

dade do user-interface numa qualquer aplicaccedilatildeo Satildeo de-

monstrados os conceitos baacutesicos de Interaccedilatildeo Homem-

Maacutequina e como aplica-los aos Windows Forms Este tema

serve de ponte para um tema bem mais extensivo Windows

Forms e programaccedilatildeo orientada agrave GUI detalhando alguns

dos componentes que a NET traz buit-in Explica a funciona-

lidade e a interecccedilatildeo com os componentes mais genericas e

mais usuais para uma aplicaccedilatildeo que se use de um sistema

de janelas como GUI A explicaccedilatildeo embora limitada a pou-

cos elementos eacute bastante completa dando ecircnfase aos

events associados a este tipo de modulos explicando assim

a programaccedilatildeo assiacutencrona em Windows Forms

Modelaccedilatildeo de dados e LINQ - Temos uma explicaccedilatildeo

bottom-to-top da noccedilatildeo de modelaccedilatildeo de dados Sendo nes-

te tema um pouco mais extenso explicando toda a noccedilatildeo da

Modelaccedilatildeo e das Formas Normais Recorre-se ao SQL Ser-

ver para fazer toda a explicaccedilatildeo na praacutetica dos conceitos

sendo bastante ilustrativo com diagramas e screenshots de

um processo de criaccedilatildeo e normalizaccedilatildeo de uma base de

dados Tendo a base de dados criada no SQL Sever passa

agrave explicaccedilatildeo do que eacute o LINQ e sua sintaxe em C Aqui eacute

feita mais uma vez a ponte com Windows Froms utilizando

componentes anteriormente demonstrados mapeando tabe-

las e manipulaccedilotildees baacutesicas Outra vez grande ecircnfase aos

events

C 50 com Visual Studio 2012

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

Sistema Operativo e Input Output Comeccedilando pela base

expotildee passo-a-passo como manipular as Tarefas e Proces-

sos do Windows explicando tambeacutem como colmatar as dife-

renccedilas entre versotildees do sistema operativo Daacute exemplos de

como manipular ficheiros de texto dando uma introduccedilatildeo agrave

encriptaccedilatildeo que vem built-in na NET Mostra como se usa o

Graphics da NET explicando os seus conceitos base dese-

nho e animaccedilatildeo chegando a agrave impressatildeo destes mesmos

graacuteficos desenhados Com este tema aprofunda a explicaccedilatildeo

dos Windows Forms fazendo a ponte para WPF

WPF XML e XAML - Tendo explicado Windows Forms pas-

sa agrave explicaccedilatildeo das diferenccedilas e semelhanccedilas do mesmo

com WPF dando tambeacutem a sua opiniatildeo sobre o futuro das

mesmas dando a entender que WPF iraacute substituir Windows

Forms eventualmente Para o efeito comeccedila por explicar o

que eacute XML dando exemplos de aplicaccedilotildees em C NET para

manipulaccedilatildeo deste tipo de dados passando para um niacutevel

acima o XAML Exemplo atraacutes de exemplo demonstra como

usar as potencialidade do WPF mostrando como usar

Graphics com a sintaxe XAML incluindo animaccedilatildeo

WebViews views modelares e navegaccedilatildeo entre diferentes

ecratildes numa soacute janela

Integraccedilatildeo com Microsoft Office e Windows Store - Eacute

tambeacutem mostrada a facilidade com que se integra uma apli-

caccedilatildeo feita em C comas a principais ferramentas do MS

Office Word Excel PowerPoint Access e Outlook Demons-

tra agrave semelhanccedila de outras ferramentas Microsoft que haacute

sempre uma Class buit-in na NET para criar e manipular

este tipo de documentos da famiacutelia Microsoft No caso da

Windows Store daacute exemplos vocacionados para Windows 8

e como tirar partido do conceito visual Metro e seus layouts

geneacutericos fazendo aplicaccedilotildees como uma calculadora e uma

WebView

Opiniatildeo pessoal - Na minha opiniatildeo este livro eacute ideal no

mundo acadeacutemico servindo perfeitamente como suporte a

um professor para leccionar uma cadeira de programaccedilatildeo

OOP ou ateacute para programaccedilatildeo 2D Tambeacutem natildeo acharia

descabido servir como suporte a um aluno para evoluir da

programaccedilatildeo iterativa para OOP visto que o livro estaacute repleto

de exemplos e exerciacutecios tendo ateacute no final 3 projectos from

scratch de aplicaccedilotildees completas explicando todo o processo

loacutegico na elaboraccedilatildeo de todos os aspectos da mesma de

base de dados normalizada interacccedilatildeo Homem-Maacutequina a

comercializaccedilatildeo na Windows Store

COMUNIDADES Comunidade NetPonto mdash Telerik RadControls - Raacutepida implementaccedilatildeo da

paacutegina Sobre para Windows Phone Apps

COMUNIDADE NETPONTO

44

httpnetpontoorg

Introduccedilatildeo

A Telerik RadControls disponibiliza um projeto template que

permite escolher um conjunto de funcionalidade que seratildeo

incluida no projeto aquando da sua criaccedilatildeo A paacutegina

Sobre eacute uma delas

Truque A Telerik oferece uma versatildeo de teste que permite

explorar os controlos O programa Nokia Premium Developer

permite aos seus membros terem uma licenccedila vaacutelida destes

Ecratildes

Para compreender melhor o que iremos fazer primeiro

iremos criar a paacutegina Sobre que eacute fornecida pelo projeto

template da Telerik cujo resultado eacute

Paacutegina Sobre gerada por omissatildeo pelo projeto template da Telerik

Depois iremos customizar a paacutegina para que esta tenha a

sua proacutepria informaccedilatildeo o resultado seraacute

Customizaccedilatildeo da paacutegina Sobre

Criaccedilatildeo do projeto

Para comeccedilar o projeto eacute recomendado que se instale os

Telerik RadControls (versatildeo de teste)

1 Seleccedilatildeo do projeto que se iraacute criar

Criando o projeto

2 A Telerik tem uma interface para a seleccedilatildeo inicial

Selecione a plataforma e referecircncias da Telerik que

queremos

Selecionando a plataforma e as referecircncias

3 Seleccedilatildeo da funcionalidade paacutegina Sobre

Quando o projeto eacute criado iremos obter a paacutegina por omissatildeo

podemos ver nos ecratildes

TELERIK RADCONTROLS - RAacutePIDA IMPLEMENTACcedilAtildeO DA PAacuteGINA SOBRE PARA WINDOWS PHONE APPS

COMUNIDADE NETPONTO

45

httpnetpontoorg

O resultado da estrutura do projeto seraacute

Customizaccedilatildeo

Comecemos por analisar a paacutegina Home Page

Cujo XAML eacute

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleMainPage xmlns=http schemasmicrosoftcomwinfx2006xaml presentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg

markup-compatibility2006 xmlnsphone= clr-namespaceMicrosoftPhone Controlsassembly=MicrosoftPhone xmlnsshell= clr-namespaceMicrosoft PhoneShellassembly=MicrosoftPhone FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation=Portrait SupportedOrientations=Portrait shellSystemTrayIsVisible=True mcIgnorable=dgt lt-- LayoutRoot is the root grid where all page content is placed --gt ltGrid xName=LayoutRoot Background=Transparentgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt lt-- LOCALIZATION NOTE To localize the displayed strings copy their val-ues to appropriately named keys in the apps neutral language resource file (AppResourcesresx) then replace the hard-coded text value between the attributes quotation marks with the binding clause whose path points to that string name For example Text=Binding Path=LocalizedResourcesApplicationTitle Source=StaticResource LocalizedStrings This binding points to the templates string resource named ApplicationTitle Adding supported languages in the Project Properties tab will create a new resx file per language that can

COMUNIDADE NETPONTO

46

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

carry the translated values of your UI strings The binding in these examples will cause the value of the attributes to be drawn from the resx file that matches the CurrentUICulture of the app at run time --gt lt-- TitlePanel contains the name of the application and page title --gt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=MY APPLICATION gt ltTextBlock xName=PageTitle Margin=9-700 Style=StaticResource PhoneTextTitle1Style Text=page name gt ltStackPanelgt lt-- ContentPanel - place additional content here --gt ltGrid xName=ContentPanel GridRow=1 Margin=120120gt ltListBox Margin=140-120 FontFamily=StaticResource PhoneFontFamilySemiLight FontSize=StaticResource PhoneFontSizeExtraLargegt ltListBoxItem Content=About Tap=GoToAbout gt ltListBoxgt ltGridgt lt-- Uncomment to see an alignment grid to help ensure your controls are aligned on common bound-aries The image has a top margin of -32px to account for the System Tray Set this to 0 (or remove the margin altogether) if the System Tray is hidden Before shipping remove this XAML and the image itself--gt lt-- ltImage Source=AssetsAlignmentGridpng VerticalAlignment=Top Height=800 Width=480 Margin=0 GridRow=0 GridRowSpan=2 IsHit-TestVisible=False gt --gt ltGridgt lt-- Sample code showing usage of ApplicationBar -

-gt ltphonePhoneApplicationPageApplicationBargt ltshellApplicationBar IsMenuEnabled=True IsVisible=Truegt ltshellApplicationBarIconButton IconUri=Imagesappbar_button1png Text=Button 1 gt ltshellApplicationBarIconButton IconUri=Imagesappbar_button2png Text=Button 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBarMenuItem Text=MenuItem 1 gt ltshellApplicationBarMenuItem Text=MenuItem 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBargt ltphonePhoneApplicationPageApplicationBargt ltphonePhoneApplicationPagegt Para navegar para a paacutegina Sobre eacute necessaacuterio clicar na palavra About (tap gesture) o coacutedigo referente eacute ltListBoxItem Content=About Tap=GoToAbout gt E em code behind iremos ter ltsummarygt Navigates to about page ltsummarygt private void GoToAbout(object sender GestureEventArgs e) thisNavigationServiceNavigate(new Uri(Aboutxaml UriKindRelativeOrAbsolute)) Por fim a paacutegina AboutPage seraacute O coacutedigo XAML seraacute ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleAbout xmlns=httpschemasmicrosoftcomwinfx2006xamlpresentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg markup-compatibility2006 xmlnsphone=clr-namespace MicrosoftPhoneControlsassembly=MicrosoftPhone xmlnsshell=clr-namespace

COMUNIDADE NETPONTO

47

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

E o code behind

MicrosoftPhoneShellassembly=MicrosoftPhone xmlnsviewModels=clr-namespace NokiaDevRadControlsSampleViewModels Name=Root FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation= Portrait SupportedOrientations=Portrait dDesignHeight=768 dDesignWidth=480 shellSystemTrayIsVisible=True mcIgnorable=dgt ltGrid xName=LayoutRoot Background=Transparentgt ltGridDataContextgt ltviewModelsCommandSampleViewModel gt ltGridDataContextgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=APP TITLE gt ltTextBlock xName=PageTitle Margin=9-700 Style= StaticResource PhoneTextTitle1Style Text=about gt ltStackPanelgt ltGrid xName=ContentPanel GridRowSpan=2 Margin=12160121gt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition gt ltGridRowDefinitionsgt ltStackPanelgt ltTextBlock Margin=120120 FontFamily= StaticResource PhoneFontFamilySemiBold FontSize= StaticResource PhoneFontSizeLarge Text=Binding ApplicationName ElementName=Root gt ltStackPanel Orientation=Horizontalgt ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Version number gt

ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Binding Version ElementName =Root gt ltStackPanelgt ltStackPanelgt ltTextBlock GridRow=1 Margin=12241224 FontSize=StaticResource PhoneFontSizeNormal Foreground=StaticResource PhoneSubtleBrush TextWrapping=Wrapgt This application show an About page sample for Windows Phone applications ltLineBreak gt See more about it please see the following referenceampquot ltTextBlockgt ltHyperlinkButton GridRow=2 Margin=01200 HorizontalAlignment=Left Command=Binding SendAnEmailCommand Content=technical supportfeedback email FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltHyperlinkButton GridRow=3 Margin=01200 HorizontalAlignment=Left Command=Binding RateThisAppCommand Content=rate this app FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltStackPanel GridRow=4 Margin=1201250 VerticalAlignment= Bottomgt ltImage HorizontalAlignment=Left Source=Images CompanyLogopng Stretch=None gt ltTextBlock Margin=01200 FontSize= StaticResource PhoneFontSizeNormal Text=Copyright (c) 2013 Nokia Developer Wiki gt ltTextBlock FontSize= StaticResource PhoneFontSizeNormal Text=Nokia gt ltStackPanelgt ltGridgt ltGridgt ltphonePhoneApplicationPagegt

public partial class About INotifyPropertyChanged

COMUNIDADE NETPONTO

48

httpnetpontoorg

Nota O exemplo natildeo implementa o padratildeo MVVM mas

poderia

Usa a classe ApplicationManifest do (Cimbalino toolkit - cujo

coacutedigo fornte eacute este)

Usa a classe SendAnEmailCommand que eacute a implementaccedilatildeo

do ICommand e tem como finalidade enviar emails Sendo

utilizado na opccedilatildeo de suporte feedback

Usa a classe RateThisAppCommand que eacute a implementaccedilatildeo

do ICommand e serve para avaliar a aplicaccedilatildeo

Truque Se pretende um exemplo mais avanccedilado consulte o

artigo Paacutegina avanccedilada Sobre para aplicaccedilotildees de Windows

Phone

Referecircncias

Online Help ou download CHM (ZIP 14MB) ()

Telerik Examples - Windows Phone Application ()

Telerik RadControls for Windows Phone ()

Join Nokia Premium Developer Program and get RadControls

for free ()

() Artigos disponiacuteveis apenas em Inglecircs

Em conclusatildeo podemos concluir que existe vaacuterias formas de

implementar numa aplicaccedilatildeo da Windows Phone uma

paacutegina ldquoSobrerdquo ou ldquoAcercardquo sendo um processo que se pode

minimizar e enriquece a aplicaccedilatildeo

Este artigo foi originalmente escrito para a comunidade

Nokia Developer mais especificamente para a Wiki Paacutegina

Acerca de para aplicaccedilotildees de Windows Phone

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltsummarygt The application manifest ltsummarygt private readonly ApplicationManifest _applicationManifest ltsummarygt Initializes a new instance of the ltsee cref=Aboutgt class ltsummarygt public About() InitializeComponent() class that helps to get the application name and version (that is defined in manifest) var applicationManifestService = new ApplicationManifestService() _applicationManifest = applicationManifestService GetApplicationManifest() ltsummarygt The property changed ltsummarygt public event PropertyChangedEventHandler PropertyChanged ltsummarygt Gets the application name ltsummarygt public string ApplicationName get if (_applicationManifest = null) return _applicationManifestAppTitle return ND ltsummarygt Gets the version ltsummarygt public string Version get if (_applicationManifest = null) return _applicationManifestAppVersion return ND ltsummarygt

The on property changed ltsummarygt ltparam name=propertyNamegt The property name ltparamgt protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null) var handler = PropertyChanged if (handler = null) handler(this new PropertyChangedEventArgs(propertyName))

AUTOR

Escrito Por Sara Silva

eacute licenciada em Matemaacutetica ndash Especialidade em Computaccedilatildeo pela Universidade de Coimbra e eacute Microsoft Certified Pro-

fissional Developer Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps O

seu Blog eacute wwwsaramgsilvacom e o twitter eacute saramgsilva

No Code Game Salad

No Code

50

ldquoNuma altura em que as aplicaccedilotildees estatildeo a dominar em

forccedila torna-se imperativo saber programarhelliprdquo E o leitor

tambeacutem tem esta opiniatildeo

Ora neste artigo esta eacute uma ideia que vamos deixar por

terra Se o leitor eacute algueacutem que gosta e se interessa pelo

mundo dos pequenos jogos e por novas tecnologias mas que

natildeo se sente agrave vontade no mundo da programaccedilatildeo pode (e

deve) experimentar o GameSalad Mas por outro lado

mesmo sendo um programador experiente o uso desta

ferramenta pode tambeacutem ajudar bastante

A GameSalad Inc eacute uma empresa norte-americana que

desenvolve ferramentas web para a criaccedilatildeo de pequenos

jogos Fundada em 2007 com o nome de Gendai Games em

2009 lanccedilou o GameSalad Creator e em 2010 mudou

oficialmente o seu nome passando chamar-se GameSalad

O importante para os criadores desta tecnologia eacute a

conceccedilatildeo de uma ideia O Game Salad Creator eacute

principalmente direcionado aos utilizadores que natildeo tecircm

bases em programaccedilatildeo permitindo que qualquer pessoa

possa fazer o seu proacuteprio jogo 2D para plataformas moacuteveis

IOS Android ou jogos HTLM5 para browsers Com uma

interface limpa e relativamente simples este software utiliza

o sistema ldquodrag-and-droprdquo para desenvolver os seus jogos

ou seja desde que tenhamos uma ideia em mente podemos

facilmente pocirc-la em praacutetica arrastando os componentes da

mesma para o ldquopalco de jogordquo

Assim facilmente o leitor pode definir as imagens de fundo

das vaacuterias cenas que compotildeem o jogo e todos os

intervenientes dessas cenas satildeo chamados ldquoAtoresrdquo em que

o comportamento destes ldquoAtoresrdquo eacute definido por regras de

jogo (eventos) que o proacuteprio utilizador define Eacute tudo uma

questatildeo de loacutegica e eacute o utilizador que define essa loacutegica Por

exemplo podemos definir eventos especiacuteficos como colisotildees

e definir o que o ldquoatorrdquo deve fazer quando ocorre uma

colisatildeo isto eacute se deve mudar de rumo e perder pontos ou se

deve ser destruiacutedo perdendo uma vida por exemplo Tudo

se baseia na nossa escolha

Podemos tambeacutem adicionar a banda sonora a nosso gosto e

para verificar o comportamento real da nossa aplicaccedilatildeo

basta-nos apenas recorrer ao simulador que o GameSalad

Creator nos disponibiliza Natildeo precisamos de ter o

equipamento real para o qual estamos a projetar o nosso

jogo

O site principal deste projeto wwwgamesaladcom em pouco

tempo atingiu milhares de utilizadores um pouco por todo o

mundo Inicialmente projetado para desenvolver aplicaccedilotildees

apenas para dispositivos Apple hoje em dia eacute tambeacutem

possiacutevel fazer o download da versatildeo Windows A versatildeo

base eacute gratuita e permite a qualquer interessado publicar os

seus jogos para a versatildeo web e para a versatildeo MAC Caso

prefira a versatildeo paga o GameSalad Creator Pro permite tudo

isto e tambeacutem publicar os seus projetos para a plataforma

Android e para o Windows 8 aleacutem de outros extras Caso

opte por ter uma conta premium pode ainda publicar no

mercado de aplicaccedilotildees escolhendo se quer disponibilizar

gratuitamente o seu jogo ou natildeo Caso opte disponibilizar

uma versatildeo paga do jogo que desenvolveu o utilizador tem

direito a 70 do ganho obtido pelo seu jogo

Este projeto tem tambeacutem atraveacutes do proacuteprio site uma grande

comunidade de utilizadores que partilham ideias e

experiecircncias ajudando-se mutuamente em vaacuterios projetos

Tem uma ideia para um jogo Entatildeo estaacute na altura de a por

em praacutetica Saber programar deixou de ser um requisito com

a ajuda do GameSalad Creator aproveite e decirc largas agrave

imaginaccedilatildeo

Game Salad

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

Elege o melhor artigo desta ediccedilatildeo

Revista PROGRAMAR httptinyccProgramarED41_V

No Code

52

Esta foi a aplicaccedilatildeo vencedora do concurso de aplicaccedilotildees

que se realizou no 1ordm Evento Presencial da Comunidade

Portugal-a-Programar Trata-se de um jogo para Windows

Phone 7x e 8 bastante interessante e ateacute ldquovicianterdquo para

quem gosta de jogos do tipo puzzle

Os pequenos Bits estatildeo em perigo e soacute vocecirc pode ajudaacute-los

Bits satildeo uma espeacutecie muito especial de aves encontradas

em uma ilha remota E eles precisam chegar ao seu ninho

a fim de criar seus filhos Mas os bits das Trevas estatildeo com

ciuacutemes e vatildeo tentar tudo ao seu alcance para impedir os Bits

de chegar ao ninho

Bits eacute um jogo de quebra-cabeccedilas fantaacutestico onde vocecirc tem

de combinar habilidade com sorte para ajudar os Bits a

sobreviver Combine trecircs Bits da mesma cor para ganhar

pontos enquanto os Bits prestos ldquoevilrdquo tentam detecirc-los Os

ldquoAnjos Bitsrdquo (brancos) podem salvar os Bits de cor destruindo

os Bits Pretos proacuteximos

PROJECTO EM DESTAQUE NA COMUNIDADE PP LITTLE BITS

PASSATEMPO

DESENVOLVIMENTO

WINDOWS 8

A comunidade Portugal a Programar com o apoio da Microsoft estaacute a criar um passatempo de desen-

volvimento de aplicaccedilotildees para Windows 8 exclusivamente para membros registados na comunidade

Desenvolve uma ou mais aplicaccedilotildees para o Windows 8 e ganha fantaacutesticos preacutemios

1 MOCHILA APP ME UP PARA TODOS os que publiquem uma App na Windows 8 Store

2 TELEFONES NOKIA LUMIA 820 (Dev Edition) para os primeiros 2 a publicarem 3 Apps na

Windows 8 Store

1 TABLET ASUS ME400C para a melhor App publicada e 1 NOKIA LUMIA 820 para a segun-

da melhor aplicaccedilatildeo

Satildeo vaacutelidas apenas aplicaccedilotildees publicadas entre 1 e 30 de Junho de 2013

Todos os estudantes tecircm acesso gratuito agrave Windows Store atraveacutes do programa DreamSpark e por is-

so natildeo haacute motivos para natildeo concorrer Mais informaccedilotildees e candidaturas atraveacutes do email passatem-

posportugal-a-programarpt

Alguns recursos interessantes para iniciar

Windows 8 Store Apps - Do sonho agrave realidade (revista PROGRAMAR)

Microsoft DreamSpark Windows 8 Apps development

Windows App (MSDN)

O staff da comunidade seraacute o juacuteri que iraacute escolher a melhor aplicaccedilatildeo a concurso e o vencedor seraacute divul-

gado na primeira quinzena de Julho Para atribuiccedilatildeo do Tablet Asus ME400C eacute necessaacuterio existirem no

miacutenimo 3 aplicaccedilotildees a concurso Qualquer caso omisso seraacute resolvido pelo staff da comunidade natildeo sen-

do passiacutevel de recurso e o juri iraacute rever e validar todas as aplicaccedilotildees de modo a que tenham um minimo de

qualidade e originalidade

Veja tambeacutem as ediccedilotildees anteriores da Revista PROGRAMAR

e muito mais em hellip wwwrevista-programarinfo

34

ordf Ed

iccedilatilde

o - A

bril 2

01

2

35

ordf Ed

iccedilatilde

o - J

un

ho

201

2

36

ordf Ed

iccedilatilde

o - A

go

sto

20

12

37

ordf Ed

iccedilatilde

o - O

utu

bro

20

12

38

ordf Ed

iccedilatilde

o - D

ezem

bro

20

12

39

ordf Ed

iccedilatilde

o - F

eve

reiro

20

13

Page 4: Revista Programar 41

NOTICIAS

5

Ferramentas de construccedilatildeo extensiacuteveis

Sabemos que eacute preciso construir um sistema que se adapte

aos seus requisitos de projeto mas que se estenda ainda ao

seu ambiente maior de desenvolvimento O Android Studio

usa um novo sistema de construccedilatildeo baseado em Gradle que

proporciona flexibilidade sabores de construccedilatildeo personaliza-

dos resoluccedilatildeo de dependecircncias e muito mais

Este novo sistema de montagem permite-lhe construir os seus

projetos no IDE bem como em seus servidores de integraccedilatildeo

contiacutenua A combinaccedilatildeo permite-lhe gerir facilmente as confi-

guraccedilotildees complexas de construccedilatildeo nativamente atraveacutes do

seu fluxo de trabalho em todas as suas ferramentas Confira

a documentaccedilatildeo de preacute-visualizaccedilatildeo para ter uma ideacuteia me-

lhor do que o novo sistema de construccedilatildeo pode fazer

Ediccedilatildeo de coacutedigo poderoso

O Android Studio inclui um editor de coacutedigo poderoso Ele eacute

baseado no editor IntelliJ IDEA que suporta recursos como

ediccedilatildeo inteligente refatoraccedilatildeo de coacutedigo avanccedilado e anaacutelise

aprofundada de coacutedigo estaacutetico

Os recursos de ediccedilatildeo inteligentes tais como pesquisas de

recursos em linha facilitam a leitura do coacutedigo dando-lhe

acesso instantacircneo a editar o coacutedigo dos recursos de apoio A

refatoraccedilatildeo avanccedilada de coacutedigo daacute-lhe o poder de transfor-

mar seu coacutedigo atraveacutes de todo o projeto com rapidez e se-

guranccedila

Adicionaacutemos anaacutelise de coacutedigo estaacutetico para o desenvolvi-

mento Android ajudando a identificaccedilatildeo de erros mais rapida-

mente Aleacutem das centenas de inspeccedilotildees de coacutedigo que o In-

telliJ IDEA oferece adicionaacutemos inspeccedilotildees personalizados

Por exemplo noacutes adicionamos metadados para as APIs do

Android que assinalam quais os meacutetodos que podem retornar

nulos ou natildeo que constantes satildeo permitidas para que meacuteto-

dos e assim por diante Android Studio usa esses dados para

analisar seu coacutedigo e encontrar possiacuteveis erros

Fonte Android Developers Blog

Portugal acolhe rede internacional

de centros de inclusatildeo social

O Centro de Inclusatildeo Digital um projeto de intervenccedilatildeo social

apoiado pela Microsoft estaacute a chegar a Portugal No primeiro

ano de atividade a organizaccedilatildeo quer chegar a 1200 jovens

A accedilatildeo do CDI centra-se no desenvolvimento de competecircn-

cias tecnoloacutegicas junto de populaccedilotildees provenientes de con-

textos socioeconoacutemicos desfavorecidos com o objetivo de

criar condiccedilotildees de empregabilidade

A organizaccedilatildeo fundada no Brasil em 1995 tambeacutem atua

apoiando iniciativas empresariais empreendedoras Em Portu-

gal pretende criar uma rede nacional de centros de inclusatildeo

digital O primeiro seraacute instalado no bairro da Belavista em

Setuacutebal Uma segunda estrutura estaacute tambeacutem jaacute prevista e vai

localizar-se em Vale de Cambra no Porto

O CDI conta com 780 espaccedilos de inclusatildeo social em 12 paiacute-

ses De acordo com os nuacutemeros avanccedilados pela organizaccedilatildeo

as suas iniciativas jaacute tiveram impacto na vida de um milhatildeo de

pessoas

A iniciativa conta com o apoio da Microsoft que hoje a apre-

sentou no acircmbito do 7ordm Encontro de Parceiros Sociais e que

doou 100 mil doacutelares agrave instituiccedilatildeo para o arranque do projeto

Escrito ao abrigo do novo Acordo Ortograacutefico

Fonte Tek Sapo

Hoje na Google I O anunciaacutemos uma nova IDE que eacute cons-

truiacuteda com as necessidades dos programadores de Android

em mente Eacute chamado Android Estuacutedio eacute gratuito e estaacute ago-

ra disponiacutevel para vocecirc experimentar como uma preacute-

visualizaccedilatildeo de acesso antecipado

Para desenvolver o Estuacutedio Android colaboraacutemos com Jet-

Brains os criadores de uma das mais avanccediladas IDEs Java

disponiacuteveis hoje Basea-

do no poderoso e exten-

siacutevel IntelliJ IDEA

Community Edition adi-

cionaacutemos recursos que

satildeo projetados especifi-

camente para o desen-

volvimento Android que

simplificam e otimizam o

seu fluxo de trabalho

diaacuterio

Android Studio An IDE built for An-

droid

TEMA DE CAPA Introduccedilatildeo ao Java EE e Java Web

TEMA DA CAPA

7

Java Enterprise Edition

A plataforma Java Enterprise Edition ou Java EE eacute uma pla-

taforma da Oracle que fornece uma API adicional ao Java

SE para o desenvolvimento e execuccedilatildeo de aplicaccedilotildees java

do tipo empresarial focadas nos serviccedilos de rede e Web

Vindo do Java Professional Edition o nome que foi anuncia-

do em Maio de 98 foi a partir dos finais de 1999 que ficou

com o nome de Java EE incluindo tecnologias como Java

Database Connectivity (JDBC) Java Servlet JavaServer

Pages (JSP) Enterprise JavaBeans JavaMail etc

CONCEITOS

Aplicaccedilatildeo Web Java

Uma aplicaccedilatildeo Java Web gera paacuteginas Web interactivas

contendo vaacuterios tipos de markup languages (HTML XML

etc) e conteuacutedo dinacircmico Eacute tipicamente composto por ele-

mentos Web tais como JavaServer Pages (JSP) Servlets e

JavaBeans para modificar e temporariamente armazenar

dados interagir com bases de dados e serviccedilos Web geran-

do conteuacutedo em resposta aos pedidos do cliente

JSP (JavaServer Pages)

JavaServer Pages eacute uma tecnologia usada no desenvolvi-

mento de aplicaccedilotildees Web Java semelhante ao PHP Possui

compatibilidades com outras soluccedilotildees Java como a Servlet

corre em servidores como o Apache Tomcat e o GlassFish

Ao contraacuterio dos tiacutepicos jarrsquos os arquivos deste tipo de imple-

mentaccedilotildees satildeo ear ou war (Web Archive)

As paacuteginas Web dinacircmicas java aceitam HTML CSS Ja-

vascript tudo que possam incluir no um ficheiro normal

HTML natildeo necessitam de compilaccedilatildeo preacutevia isso fica ao

cargo do servidor Web de traduzir as linhas de coacutedigo em

Java para o browser compreender

Qualquer coacutedigo Java inserido nos ficheiros JSP deve ficar

entre as tags

lt Code gt (para inserccedilatildeo de coacutedigo)

lt=var gt (para a expressatildeo de uma variaacutevel)

Introduccedilatildeo ao Java EE e Java Web ltpage gt (para importar include para incluir

uma paacutegina JSP ou HTML externa)

Servlet

Eacute uma tecnologia Java que permite gerar dados em HTML e

XML Incluiacuteda na biblioteca javaxservlet permite processar

pedidos e respostas vindas de JSP e serve como uma exten-

satildeo do servidor Web Neste caso vamos usar a HttpServlet

onde a sua funccedilatildeo seraacute processar pedidos das JSP resolver

os pedidos e enviar uma resposta

XML

XML (Extensible Markup Language) subtipo da SGML foi

criada pela W3C com o objectivo de ser usado como formato

de configuraccedilatildeo entre vaacuterias linguagens atraveacutes da internet

Ex

Neste caso em particular o ficheiro XML que vamos criar

editar na configuraccedilatildeo de uma aplicaccedilatildeo Java Web eacute o

webxml que tem como tags mais usa das as seguintes

lt gt agrave define comentaacuterios

ltweb-app id version xmlns gt agrave define o tipo do XML

a versatildeohellip

ltdisplay-namegt agrave define o nome

ltservletgt agrave define uma servlet

ltxml version=10 encoding=iso-8859-1 encoding=iso-8859-1gt ltreceita nome=patildeo tempo_de_preparacao=5 min tempo_de_cozedura=1horagt ltingredientesgt ltingrediente quantidade=4 unidade=chavenasgtFarinhaltingredientegt ltingrediente quantidade=7 unidade=gramasgtFermentoltingredientegt ltingrediente quantidade=15 unidade=chavenasgtAgualtingredientegt ltingrediente quantidade=1 unidade=colheresgtSalltingredientegt ltingredientesgt ltinstrucoesgt ltpassogtMisturar tdos os ingredientesltpassogt ltpassogtCobrir com um pano e deixar repousar uma hora agrave temperatura ambienteltpassogt ltpassogtMisturar novamente e colocar ao forno ateacute ao fim da cozeduraltpassogt ltinstrucoesgt ltreceitagt

TEMA DA CAPA

8

ltservlet-namegt agrave define o nome da servlet

ltservlet-classgt agrave aponta o caminho da servlet na apli-

caccedilatildeo

ltload-on-startupgt agrave quando o valor for 1 a servlet

seraacute inicializada no inicio da aplicaccedilatildeo

ltservlet-mappinggt agrave caso a servlet efectue operaccedilotildees

requeridas por elementos externos

ltservlet-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltservletgt

lturl-patterngt agrave define um url para a servlet

ltfiltergt agrave semelhante agrave tag ltservletgt com a diferenccedila

de que esta permite enquadrar uma classe de filtro na

aplicaccedilatildeo que permita a existecircncia de sessotildees na

aplicaccedilatildeo Web ou qualquer segmento de coacutedigo que

necessite de ser constantemente executado

ltfilter-namegt agrave define o nome da classe filtro

ltfilter-classgt agrave aponta o caminho da class na aplica-

ccedilatildeo

ltfilter-mappinggt agrave sempre necessaacuterio definir para

uma classe filtro

ltfilter-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltfiltergt

lturl-patterngt agrave para possuir o efeito de filtro o url seraacute

todos os existentes ou seja

lterror-pagegt agrave tag existente para definir paacuteginas de

erro que sejam geradas pelo web server e que pos-

sam ocorrer na aplicaccedilatildeo

lterror-codegt agrave define o tipo de coacutedigo de erro gerado

pelo web server (404-page not found 500-internal

server errorhellip)

ltlocationgt agrave localiza a paacutegina de erro personalizada

dentro da aplicaccedilatildeo

Estrutura de uma aplicaccedilatildeo Web Java

O exemplo que vai ser aqui apresentado seraacute montado num

Web Archive (ficheiro war) que poderaacute depois ser colocado

num servidor Web sendo os mais conhecidos o Apache

Tomcat e o Oracle Glassfish Ambos disponiacuteveis gratuita-

mente e no pacote de Java EE do IDE NetBeans que os ins-

tala em modo desenvolvimento na maacutequina local

Nota As aplicaccedilotildees necessaacuterias para a criaccedilatildeo deste exem-

plo satildeo o Java Runtime Environment (JRE) o Java Deve-

lopment Kit (JDK) e o IDE NetBeans

A estrutura normal de uma aplicaccedilatildeo java desta natureza

tem por norma a seguinte estrutura

O ficheiro WAR criado se o abrirmos tem uma estrutura de

pastasficheiros orientada ao modelo de desenvolvimento

MVC (Model-view-controller) onde a View estaacute incluiacuteda dire-

tamente na raiz do projeto onde se pode encontrar as paacutegi-

nas JSP e HTML acompanhadas pelos devidos ficheiros

JavaScript e CSS necessaacuterios Caso haja ausecircncia de um

Deployment Descriptor (ficheiro de configuraccedilatildeo referente a

uma determinada aplicaccedilatildeo que neste caso seraacute o webxml)

o servidor Web procura sempre por um indexjsp como paacutegi-

na inicial

Dentro da pasta WEB-INF estatildeo todas as classes bibliote-

cas ficheiros de configuraccedilatildeo e servlets necessaacuterias para

processar a informaccedilatildeo mostrada pelas JSPs

Em suma ter-se-aacute entatildeo algo deste geacutenero

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

9

Nota Nesta estrutura optou-se por colocar as paacuteginas dinacirc-

micas debaixo do WEB-INF pois uma vez que podemos usar

as servlets para controlar o que se deve ou natildeo ser mostrado

perante os pedidos vindos do cliente Isto torna a aplicaccedilatildeo

mais segura na questatildeo de mapeamento de URLs

Desenvolvimento

Neste exemplo vai-se usar o IDE NetBeans pois eacute aquele

que a Oracle recomenda encontra-se disponiacutevel para Win-

dows Linux Solaris e Mac OS X sendo mais simples de

configurar O NetBeans encontra-se disponiacutevel para downlo-

ad no proacuteprio site e no site da Oracle como complemento do

Java Development Kit 7 (Ver bibliografia)

Primeiros passos

Para dar iniacutecio agrave construccedilatildeo da nossa aplicaccedilatildeo Java Web

no NetBeans basta ir a File ndash New Project e aparece-nos a

seguinte janela

E vamos selecionar Java Web ndash Web Application Em se-

guida definimos a localizaccedilatildeo e o nome da nossa aplicaccedilatildeo

Dando o nome de Teste a esta aplicaccedilatildeo no passo seguinte

o nome que foi atribuiacutedo eacute automaticamente dado como

Context Path ou seja a aplicaccedilatildeo iraacute ser identificada no De-

ployment descriptor como Teste e uma vez colocada no servi-

dor teraacute o seguinte URL httphostnameportTeste

Neste exemplo vamos usar para o servidor GlassFish da Ora-

cle a versatildeo 6 do Java EE e o IDE Netbeans

O servidor escolhido pode ser posteriormente alterado caso

queira-se testar a aplicaccedilatildeo noutros ambientes contudo eacute de-

sencorajado a alteraccedilatildeo da versatildeo sem primeiro verificar a

existecircncia de possiacuteveis incompatibilidades com coacutedigo e biblio-

tecas que estejam a ser usadas O uacuteltimo seraacute ignorado uma

vez que este exemplo que vamos criar natildeo vai possuir nenhum

framework

Uma vez concluiacutedo todos os passos verificamos que automati-

camente o IDE criou-nos uma estrutura com uma paacutegina in-

dexjsp na raiz uma pasta WEB-INF vazia e atalhos para a

pasta de sources bibliotecas e de ficheiros de configuraccedilatildeo

com o tradicional MANIFESTMF criado

A estrutura visiacutevel natildeo corresponde agrave estrutura real de diretori-

as para se visualizar isso basta ir ao separador Files situado eacute

esquerda como mostra a imagem seguinte

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

10

Caso natildeo esteja criado o atalho pode-se sempre aceder indo

agrave opccedilatildeo Window ndash File abrindo o separador e recolocando o

atalho

Numa breve comparaccedilatildeo pode-se verificar que o NetBeans

cria determinados ficheiros e diretorias referentes ao projeto

(bluidxml e nbproject) e onde na estrutura do projeto a pasta

Web Pages tem referecircncia agrave pasta web e a Source Packa-

ges tem referecircncia agrave pasta src Todos os ficheiros de confi-

guraccedilatildeo ficam dentro da pasta WEB-INF e no caso da pasta

Libraries o seu conteuacutedo eacute um conjunto de atalhos cuja sua

localizaccedilatildeo pode ser referenciada a quaisquer pastas exter-

nas ao projeto No entanto recomenda-se criar uma pasta lib

debaixo de WEB-INF com as bibliotecas a ser usadas pela

aplicaccedilatildeo para evitar erros originados por utilizaccedilatildeo do mes-

mo ficheiro de biblioteca por mais do que um projeto e para

facilitar a passagem do projeto para outro ambiente ou ma-

quina pois assim basta soacute passar a pasta com o projeto sem

haver preocupaccedilotildees com importaccedilatildeo de bibliotecas

Criaccedilatildeo de uma JSP

Se abrirmos a paacutegina JSP criada pelo IDE ela vai ter um

aspecto semelhante a este

Uma vez que esta paacutegina tem o nome de index caso seja

feito o deploy da aplicaccedilatildeo a mesma vai apresentar uma

paacutegina de fundo branco com o tiacutetulo JSP Page e a frase Hel-

lo World

Para realizar o deploy da aplicaccedilatildeo basta carregar sobre o

botatildeo de play situado no painel de topo do IDE Netbeans ou

entatildeo ir a Run ndash Run Project

Caso o nome da paacutegina seja alterado e natildeo exista nenhuma

paacutegina com o nome index o servidor natildeo consegue encon-

trar nenhuma paacutegina inicial Entatildeo em seguida vamos alterar

o nome da nossa paacutegina inicial para homejsp e vamos con-

figurar o nosso webxml de maneira a criarmos um filtro de

sessatildeo que vai definir que o servidor no arranque da mesma

redirecionar-se para uma determinada servlet

Para tal se formos agrave opccedilatildeo de File ndash New Filehellip na secccedilatildeo

Web selecionar o tipo de ficheiro Standard Development

Descriptor (webxml)

Uma vez criado o ficheiro teraacute o seguinte conteuacutedo por defei-

to

Temos agora o ficheiro webxml onde poderemos colocar as

nossas referecircncias agraves servlets que vamos criar atribuindo-

lhes um url pattern a fim de poderem ser acedidas

Para natildeo termos trabalho o IDE por si soacute resolve todas as

tags que necessitamos de colocar no webxml na altura em

que criamos uma servlet caso natildeo seja resolvido pelo IDE

Para mapearmos a servlet WelcomeServlet no package

mainservlet com o url pattern Welcome o que deveria de ser

colocado seria algo deste geacutenero (ver as tags fornecidas)

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtJSP Pagelttitlegt ltheadgt ltbodygt lth1gtHello Worldlth1gt ltbodygt lthtmlgt

ltxml version=10 encoding=UTF-8gt ltweb-app xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=httpjavasuncomxml nsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsd version=30gt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

ltxml version=10 encoding=UTF-8gt ltweb-app version=30 xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=

TEMA DA CAPA

11

Mas natildeo eacute necessaacuterio escrever estas tags ateacute porque o Net-

Beans natildeo permite a criaccedilatildeo de servlets que jaacute possuam refe-

recircncias no webxml como tal o que podemos fazer eacute ir a opccedilatildeo

File ndash New Filehellip e dentro do Web selecionar Servlet

Em seguida o IDE vai recomendar a natildeo criar classes na raiz

dos packages e como tal vamos preencher o campo Package

com mainservlet e como nome WelcomeServlet

Dado o passo seguinte o IDE automaticamente cria a estru-

tura dos packages introduzidos e apresenta o formulaacuterio de

configuraccedilatildeo da servlet

Carregando sobre a check box e alterando o URL Pattern

para Welcome teremos automaticamente criado as tags

pretendidas no webxml

Uma vez criada a servlet vem com os meacutetodos herdados de

HttpServlet doGet() e doPost() implementados e com um

meacutetodo chamado processRequest() que envia coacutedigo

HTML O que vamos fazer eacute apagar este meacutetodo e colocar a

vazio o meacutetodo doPost() e introduzir a seguinte linha no

meacutetodo doGet()

Com esta linha criada e uma vez chamada a servlet que por

defeito responde por GET o pedido vai ser reencaminhado

para a nossa paacutegina criada homejsp

Fazendo deploy coloca-se o URL httplocalhost8080Teste

Welcome e verifica-se que a nossa servlet estaacute a fazer o

reencaminhamento para a nossa paacutegina inicial

Como proacuteximo passo vamos enviar variaacuteveis para uma ser-

vlet onde a mesma iraacute processar e enviar uma resposta En-

tatildeo o que se pretende eacute tomando os mesmos passos de cria-

ccedilatildeo da WelcomeServlet vamos criar a SomaServlet com o

seguinte coacutedigo

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

httpjavasuncomxmlnsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsdgt ltservletgt ltservlet-namegtWelcomeServletltservlet-namegt ltservlet-classgtmainservletWelcomeServlet ltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtWelcomeServletltservlet-namegt lturl-patterngtWelcomelturl-patterngt ltservlet-mappinggt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

getServletContext()getRequestDispatcher( homejsp)forward(request response)

package mainservlet import javaioIOException import javaxservletServletException import javaxservlethttpHttpServlet import javaxservlethttpHttpServletRequest import javaxservlethttpHttpServletResponse public class SomaServlet extends HttpServlet public static final String TEXTO = texto public static final String VALOR_1 = valor1 public static final String VALOR_2 = valor2 public static final String RESULTADO = resultado

TEMA DA CAPA

12

E para interagirmos com a servlet vamos criar as paacuteginas so-

majsp e resultadojsp onde mais uma vez vamos ao menu

File ndash New Filehellip selecionamos JSP e preenchemos o nome

sem a extensatildeo no campo File Name

somajsp

Com o objectivo de evitar erros a servlet possui constantes

que permitem que haja uma coerecircncia entre as variaacuteveis envia-

das e recebidas com o objectivo de evitar errosPode-se ob-

servar que a servlet uma vez iniciada envia uma variaacutevel atra-

veacutes de requestsetAttribute() Uma vez chamado o setAttri-

bute() requer 2 paracircmetros

requestsetAttribute(NomeDoAtributo UmObjectoQQ)

O primeiro paracircmetro como descrito atribui um nome sen-

do esse o nome que deve ser usado nas paacuteginas JSP para

puderem capturar a variaacutevel enviada que se vai encontrar

descrita no segundo paracircmetro que por sua vez eacute sempre

convertida da servlet para object Como tal teve que ser

efectuado o cast do objecto agrave chegada para o tipo de variaacute-

vel que tinha antes de ser enviada

String atributo = (String) requestgetAttribute

(NomeDoAtributo)

(Recepccedilatildeo do atributo)

Caso o que se pretenda seja o contraacuterio enviar variaacuteveis no

sentido JSP agrave Servlet a paacutegina JSP deve de conter um for-

mulaacuterio HTML com o meacutetodo que se pretende POST ou

GET e na action o URL pattern da servlet em questatildeo E os

nomes dos inputs satildeo as referecircncias que a servlet usa para

receber as variaacuteveis das paacuteginas JSP variaacuteveis essas quem

vecircm como String e como tal devem de ser convertidas para o

tipo desejado (Como demonstrado no coacutedigo acima referi-

do) Vamos entatildeo testar acedendo ao URL http

localhost8080TesteSoma

Porem a aplicaccedilatildeo funciona mas apenas mostra paacuteginas

caso as mesmas sejam escritas no URL pois uma vez que

renomeamos o indexjsp para homejsp natildeo existe de mo-

mento nenhuma paacutegina inicial ou seja caso escrevesse-

mos httplocalhost8080Teste a aplicaccedilatildeo natildeo vai mostrar

nenhuma paacutegina

Para solucionarmos esse problema vamos entatildeo criar um

filtro que remeta para uma determinada servlet filtro esse

que vai aguardar que uma determinada variaacutevel se altere de

estado para desbloquear as restantes paacuteginas Com este

tipo de classes podemos definir niacuteveis de acesso dentro da

nossa aplicaccedilatildeo restringindo a mesma quando certas variaacute-

veis natildeo forem validadas ou natildeo se encontram com o valor

pretendido (por exemplo um determinado nome de utilizador

e palavra chave)

Vamos entatildeo novamente a File ndash New Filehellip e seleciona-

mos Filter

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

Override protected void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException requestsetAttribute(TEXTO Insira 2 numeros e submeta para obter o resultado) getServletContext()getRequestDispatcher (somajsp)forward(request response) Override protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException int resultado try int val1 = IntegerparseInt (requestgetParameter(VALOR_1)) int val2 = IntegerparseInt (requestgetParameter(VALOR_2)) resultado = val1 + val2 requestsetAttribute(RESULTADO +resultado) catch (NumberFormatException e) requestsetAttribute(RESULTADO Valores natildeo validos) getServletContext()getRequestDispatcher (resultadojsp)forward(request response)

ltpage import=mainservletSomaServletgt ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lt String texto = (String) requestgetAttribute (SomaServletTEXTO)gt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtSomalttitlegt ltheadgt ltbodygt lth2gtlt=textogtlth2gt ltform action=Soma method=POSTgt Valor 1ltinput type=text name= lt=SomaServletVALOR_1gtgt Valor 2ltinput type=text name= lt=SomaServletVALOR_2gtgt ltbrgt ltinput type=submit name=submitgt ltformgt ltbodygt lthtmlgt

TEMA DA CAPA

13

caccedilatildeo e restriccedilatildeo de acessos os filtros permitem a execuccedilatildeo

de certas linhas de coacutedigo que mantecircm estados numa aplica-

ccedilatildeo e eacute o siacutetio ideal para colocar a parte do coacutedigo da aplica-

ccedilatildeo que manipula variaacuteveis de sessatildeo

Apoacutes criar-se a classe do tipo Filter ignorando o coacutedigo ge-

rado o filtro deveraacute possuir o seguinte coacutedigo

Uma vez criado o filtro este vai redirecionar todos os pedidos

agrave aplicaccedilatildeo para a WelcomeServlet enquanto a variaacutevel

validSession estiver a NULL como tal na servlet Welcome-

Servlet coloca-se a seguinte linha

requestgetSession()setAttribute(UrlFilterSESSION

gotSession)

Assim que o filtro passar pela WelcomeServlet a variaacutevel

validSession vai deixar de estar a NULL colocando o filtro a

fazer um encadeamento com os restantes pedidos que apa-

recerem

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

No seguinte passo vamos atribuir o nome de UrlFilter e coloca

-lo num novo package mainfilter

Semelhante ao passo de criaccedilatildeo do mapeamento das servlets

no webxml o IDE igualmente cria automaticamente um mape-

amento do filtro no ficheiro XML contudo o coacutedigo gerado eacute

ligeiramente diferente (Ver referecircncia de tags do webxml)

Apoacutes dar seguinte neste passo e natildeo preencher nada no proacutexi-

mo o IDE gera uma classe filtro por defeito e gera o seu mape-

amento no webxml semelhante a

Muito semelhante ao que se vai encontrar num mapeamento

de uma servlet apenas com a diferenccedila do nome das tags de

servlet para filter e o seu mapeamento seraacute muacuteltiplo para todos

os URLs que se deseja correr um determinado filtro antes de

haver o redireccionamento Uacuteteis para criar poliacuteticas de autenti-

ltfiltergt ltfilter-namegtUrlFilterltfilter-namegt ltfilter-classgtmainfilterUrlFilter ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtUrlFilterltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt

package mainfilter import javaioIOException import javaxservlet import javaxservlethttp public class UrlFilter implements Filter FilterConfig filterConfig public static final String SESSION = session Override public void doFilter(ServletRequest req ServletResponse resp FilterChain chain) throws IOException ServletException if (req instanceof HttpServletRequest) String path = ((HttpServletRequest) req)getServletPath() HttpSession session = ((HttpServletRequest) req)getSession(false) boolean sessionValidator = false if (session = null) String validSession = (String) sessiongetAttribute(SESSION) if (validSession = null) sessionValidator = true if (pathequals(Welcome) ampamp sessionValidator) ((HttpServletResponse) resp)sendRedirect(filterConfiggetServletContext ()getContextPath() + Welcome) else chaindoFilter(req resp) Override public void init(FilterConfig filterConfig) thisfilterConfig = filterConfig Override public void destroy()

TEMA DA CAPA

14

Apoacutes implementado quando se aceder agrave aplicaccedilatildeo pelo URL

apontado para a raiz (httplocalhost8080Teste) o servidor

com conhecimento da existecircncia de um filtro vai chama-lo para

cada vez que o cliente acede a qualquer servlet ou JSP

Para finalizar este exemplo vamos soacute criar um link na paacutegina

homejsp que nos vai apontar para a paacutegina somajsp atraveacutes

da SomaServlet

lta href=SomagtSomarltagt

Dentro da aplicaccedilatildeo os URL pattern que foram definidos no

webxml servem igualmente para os links HTML chamando

sempre o meacutetodo doGet() da servlet

Conclusatildeo

Este artigo mostra numa forma introdutoacuteria como se pode criar

uma aplicaccedilatildeo Java com uma interface Web tendo em conta

que as capacidades do Java EE e das suas bibliotecas nome-

adamente Servlets Filters e as configuraccedilotildees necessaacuterias para

criar uma aplicaccedilatildeo Web baacutesica com conceitos adicionais de

XML( no seu geral) JSP e MVC

BibliografiaReferecircncias

httpwwworaclecomtechnetworkjavajavasedownloads

jre7-downloads-1880261html

httpwwworaclecomtechnetworkjavajavaeedownloads

indexhtml

httpsnetbeansorgfeaturesindexhtml

httpenwikipediaorgwikiJava_EE_version_history

httpwwwjsptutcom

httpsdevelopersgooglecomappenginedocsjavaconfig

webxml

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

A PROGRAMAR Programaccedilatildeo em C const

Jogo da Vida

JBoss Aplication Server 7

PHP Uma framework ldquofrom scratchrdquo (Parte 1)

A PROGRAMAR

16

Uma das ldquorecentesrdquo adiccedilotildees agrave linguagem C foi o qualificador

const Ao contraacuterio do que se possa pensar utilizar const

natildeo cria uma constante mas sim uma variaacutevel soacute-de-leitura

O que queremos dizer com isto Vejamos o seguinte exem-

plo

Qual o valor de i apoacutes execuccedilatildeo da linha 4 Embora possa

parecer estranho i vai ter o valor 73 apesar de termos de-

clarado i como constante Por este motivo variaacuteveis qualifi-

cadas com const natildeo satildeo constantes verdadeiras em C (satildeo-

no em C++) e natildeo podem por este motivo ser utilizadas em

certos lugares como a definiccedilatildeo do tamanho de arrays ou

em cases de um switch (excepto com extensotildees dos compi-

ladores)

De que nos serve entatildeo um qualificador const se natildeo asse-

gura que a variaacutevel permanece inalterada Bem a utilizaccedilatildeo

de const para qualificar variaacuteveis impede de facto a sua

alteraccedilatildeo na maioria dos casos Natildeo podemos alterar i direc-

tamente por exemplo (ie i = 73 emite um erro) No exemplo

apresentado acima enganaacutemos o compilador (linha 2) com o

cast de ampi para o tipo int sem cast um compilador bem

configurado emitiraacute pelo menos um aviso de que o qualifica-

dor const eacute descartado na atribuiccedilatildeo de ampi a ptr um pequeno

sinal de alarme para o programador (eacute soacute estar atento)

Podemos como referido acima qualificar uma variaacutevel com

const e impedir que seja alterada directamente Se tentar-

mos apontar um apontador a essa variaacutevel o compilador

avisa-nos que a qualificaccedilatildeo de const seraacute perdida e pode-

mos alterar a variaacutevel atraveacutes do apontador Haveraacute maneira

de impedir que isto aconteccedila Na realidade a questatildeo eacute

outra como utilizar o qualificador const com apontadores

Existem 4 formas de qualificar um apontador com const

obtendo-se diferentes niacuteveis de acesso de leitura eou escri-

ta da variaacutevel apontada atraveacutes do mesmo Para que natildeo

existam duacutevidas eacute importante reter que o qualificador const

qualifica uma variaacutevel e natildeo um local na memoacuteria Por outras

palavras (e recorrendo ao exemplo inicial) qualificar i como

const soacute impedir a alteraccedilatildeo do valor atraveacutes da variaacutevel i

Quando apontamos um apontador ao endereccedilo de i pode-

mos fazer o que quisermos com o valor laacute armazenado inde-

pendentemente de como i foi declarado

A primeira forma de usar const num apontador eacute surpreen-

dentemente natildeo usar const num apontador Na realidade

(obviamente) esta natildeo eacute uma utilizaccedilatildeo do qualificador const

Programaccedilatildeo em C const mas este artigo natildeo estaria completo sem se falar dela Um

apontador simples de forma tipo p permite-nos fazer vaacuterias

coisas podemos apontaacute-lo a qualquer local da memoacuteria que

queiramos e desde que apontado a um endereccedilo vaacutelido

podemos alterar o valor aiacute armazenado com o operador de

indirecccedilatildeo (eg p = 3) Este tipo de apontador natildeo apresenta

restriccedilotildees nenhumas (por esse motivo eacute que o compilador

emite um aviso quando tentamos apontaacute-lo a uma variaacutevel

const excepto na presenccedila de casts)

Segue-se entatildeo a criaccedilatildeo de um apontador para uma variaacute-

vel constante Este tipo de apontador apresenta uma particu-

laridade embora seja possiacutevel apontaacute-lo a qualquer endere-

ccedilo de memoacuteria natildeo eacute possiacutevel utilizar este apontador para

alterar o conteuacutedo do endereccedilo apontado Logicamente este

era o tipo de apontador que precisaacutevamos no exemplo inici-

al se temos uma variaacutevel constante queremos apontar para

ela com um apontador para uma variaacutevel constante

Se lermos a declaraccedilatildeo de ptr da direita para a esquerda

tudo faz sentido ptr eacute um apontador () para um const int E

de facto i eacute um const int tudo parece bem Quando tentamos

modificar o valor apontado por ptr o compilador emite um

erro queixa-se que estamos a tentar atribuir um valor a uma

variaacutevelendereccedilo soacute de leitura Este era o comportamento

que procuraacutevamos inicialmente

Passemos agora para a terceira forma de usar const com

apontadores Uma espeacutecie de ldquoinversordquo de um apontador

para uma variaacutevel constante eacute um apontador constante para

uma variaacutevel (natildeo constante) A diferenccedila do anterior para

este eacute que agora passamos a conseguir alterar o valor apon-

tado (por outras palavras ptr = 73 passa a ser possiacutevel)

mas natildeo nos eacute possiacutevel apontar ptr para outra variaacutevel

Uma vez mais da direita para a esquerda ptr eacute um aponta-

dor constante ( const) para um int Podemos utilizar ptr agrave

vontade para modificar o valor de 42 para 73 mas eacute-nos

impossiacutevel alterar o endereccedilo para o qual ptr aponta Este

tipo de apontadores eacute uacutetil quando nos queremos assegurar

de que natildeo haacute alteraccedilotildees acidentais do local para onde um

apontador aponta Um pormenor importante sendo ptr um

apontador cujo endereccedilo natildeo pode ser alterado devemos

1 const int i = 42 2 int ptr = (int)ampi 3 4 ptr = 73

1 const int i = 42 2 const int ptr = ampi 3 4 ptr = 73 erro

1 const int i = 42 2 int const ptr = ampi 3 4 ptr = 73 ok 5 ptr = NULL erro

A PROGRAMAR

17

apontaacute-lo para onde queremos no momento da sua declara-

ccedilatildeo sob pena de ficar apontado para um local aleatoacuterio sem

possibilidade de alteraccedilatildeo

A quarta (e uacuteltima) forma de utilizar const num apontador eacute

como devem ter imaginado a combinaccedilatildeo das duas uacuteltimas

um apontador constante para uma variaacutevel constante Este eacute

o tipo de apontador mais limitado de todos uma vez que a

uacutenica coisa que podemos fazer com ele apoacutes a sua declara-

ccedilatildeo eacute consultar o valor para o qual aponta Natildeo podemos

alterar i se ptr for deste tipo nem podemos apontar ptr para

NULL ou outro endereccedilo qualquer

Desta vez utilizamos const em dois locais agrave esquerda do

asterisco para qualificar a variaacutevel apontada e agrave direita do

asterisco para qualificar o apontador Neste caso nenhuma

das operaccedilotildees funcionaraacute o compilador assegura-se que

natildeo utilizaremos ptr para alterar o valor para o qual aponta

nem tentaremos apontar ptr para outro endereccedilo

Neste artigo cobrimos algumas utilizaccedilotildees do qualificador

const na linguagem C (volto a lembrar estamos a falar de C

e natildeo de ldquoCC++rdquo) e foi tambeacutem referido como utilizar este

qualificador para melhorar o coacutedigo que escrevemos de for-

ma a prevenir asneiras relativamente comuns quando se lida

com apontadores

Falta no entanto mencionar outra utilidade do const docu-

mentaccedilatildeo Quando o programador utiliza const de uma for-

ma pensada estaacute a documentar o seu coacutedigo Se virmos uma

funccedilatildeo que aceita como argumento const void podemos

imediatamente imaginar que o endereccedilo passado nunca seraacute

alterado pela funccedilatildeo em causa enquanto que um simples

void natildeo nos informa sobre as intenccedilotildees da API Natural-

mente se o programador da API declarar um argumento

com const e depois utilizar casts para se livrar da qualifica-

ccedilatildeo entatildeo aiacute all bets are off e nada eacute garantido Mas assu-

mamos que isso eacute a excepccedilatildeo e natildeo a regra

Existem ainda muacuteltiplos aspectos que natildeo foram cobertos

neste artigo nomeadamente a conversatildeo impliacutecita de T para

const T e T para const T Esta conversatildeo eacute bastante uacutetil

quando queremos passar um valor do tipo T a uma funccedilatildeo

que requer const T como argumento Se pensarmos bem

faz sentido em qualquer lugar onde eacute necessaacuterio um const

T podemos utilizar um T perfeitamente (que nunca seraacute al-

terado) Por outro lado a conversatildeo inversa (de const T ou

const T para T e T respectivamente) natildeo eacute permitida e

tambeacutem isso faz sentido se uma funccedilatildeo pede um valor do

tipo T natildeo faz sentido aceitar um const T porque isso im-

plicaria potenciais alteraccedilotildees ao valor apontado (que satildeo

proibidas pelo qualificador const)

As conversotildees impliacutecitas relativas ao const terminam por

aqui Em C natildeo haacute conversatildeo de T para const T o que

significa que numa funccedilatildeo que aceite um argumento const

T seraacute emitido um aviso se tentarmos passar um T Neste

caso temos que recorrer a um cast para silenciar o compila-

dor Nada disto eacute um erro no entanto os casts surgiram

porque satildeo necessaacuterios na linguagem C e recusar a sua

utilizaccedilatildeo eacute negar a linguagem Haacute que saber quando e co-

mo fazer as coisas da forma correcta

Para terminar recomendo uma olha- dela agraves

manpages da biblioteca standard de C jaacute utilizam const

abundantemente nota-se bem o seu valor como documenta-

ccedilatildeo dentro do coacutedigo Aleacutem deste aspecto da documentaccedilatildeo

a utilizaccedilatildeo de const leva agrave criaccedilatildeo de coacutedigo mais previsiacutevel

e seguro e serve tambeacutem como dica para possiacuteveis optimi-

zaccedilotildees feitas pelo compiladorUsem const Informem e enco-

rajem a utilizaccedilatildeo de const especialmente aos iniciados

porque vale a pena

PROGRAMACcedilAtildeO EM C CONST

1 const int i = 42 2 const int const ptr = ampi 3 4 ptr = 73 erro 5 ptr = NULL erro

AUTOR

Escrito por Antoacutenio Pedro Cunha (pwseo)

Meacutedico natural de Guimaratildees formado na Universidade do Minho

Programador autodidacta em parte dos tempos livres inscrito no foacuterum desde 2006

Website httppwseoalojnet

Ao contraacuterio do

que se possa pen-

sar utilizar const natildeo

cria uma constante

mas sim uma variaacutevel

soacute de leitura

A PROGRAMAR

18

Nesta ediccedilatildeo vamos propor ao leitor um olhar sobre um fa-

moso algoritmo da deacutecada de 70

O seu inventor John Horton Conway nasceu em Liverpool

em Dezembro de 1937 e eacute um dos matemaacuteticos mais conhe-

cidos da nossa era em todo o mundo Estudou na Universi-

dade de Cambridge e ainda hoje eacute uma mente ativa nas

mais variadas teorias como por exemplo a teoria dos coacutedigos

e a teoria com- binatoacuteria dos

jogos

Ilustraccedilatildeo 1 - John Conway

O algoritmo escolhido para esta ediccedilatildeo foi criado em 1970

por Conway ndash o Jogo da Vida ndash sendo este um jogo para

zero jogadores Este jogo tornou-se mundialmente famoso

atraveacutes de uma coluna na revista Scientific American Em

1971 foi tema de capa e tinha entatildeo relanccedilado uma aacuterea da

Matemaacutetica a dos autoacutematos celulares que satildeo estruturas

matemaacuteticas uacuteteis em simulaccedilotildees de processos fiacutesicos e

bioloacutegicos e que a um niacutevel teoacuterico podem comportar-se

como computadores

Um autoacutemato celular eacute um modelo discreto e cada autoacutemato

deste tipo eacute representado por uma grelha de ceacutelulas poden-

do essas ceacutelulas assumir um nuacutemero finito de estados que

variam de acordo com cada modelo Outra caracteriacutestica a

considerar eacute que o tempo de evoluccedilatildeo eacute tambeacutem discreto

por exemplo o estado de uma ceacutelula no tempo t eacute sempre

obtido tendo em consideraccedilatildeo o estado dessa mesma ceacutelula

(e respetiva vizinhanccedila) no tempo t-1 Cada vez que todas as

regras determiniacutesticas satildeo aplicadas a toda a grelha uma

nova geraccedilatildeo eacute produzida

Isto foi um dos motes de partida para que Conway criasse o

Jogo da Vida Este jogo eacute considerado um autoacutemato celular

bidimensional em que satildeo simulados processos de evoluccedilatildeo

de ceacutelulas bioloacutegicas Estudos jaacute efetuados provam que este

eacute um autoacutemato computacional universal isto eacute eacute capaz de

simular qualquer sistema evolucionaacuterio possiacutevel

(reprogramando as respetivas regras determiniacutesticas se isso

for necessaacuterio)

Jogo da Vida Devido agraves analogias com o aumento reduccedilatildeo e alteraccedilatildeo de

um sistema de supostos organismos vivos (as ceacutelulas) este

jogo pertence agrave classe dos ldquojogos de simulaccedilatildeordquo pois recriam

processos do mundo-real

Voltando de novo ao tema principal do nosso artigo eacute impor-

tante recordar ao leitor que este jogo eacute para zero jogadores

o utilizador eacute apenas responsaacutevel pelos valores de inicializa-

ccedilatildeo do sistema Depois desses valores serem introduzidos

as geraccedilotildees seguintes seratildeo sempre calculadas com base

nas regras determiniacutesticas do algoritmo

Neste jogo num dado instante cada ceacutelula tem dois estados

possiacuteveis ldquovivardquo ou ldquomortardquo

As regras do jogo da vida satildeo simples ora vejamos

Uma ceacutelula viva com menos de dois vizinhos vivos

morre por solidatildeo

Uma ceacutelula viva com mais de trecircs vizinhos vivos mor-

re por sobrepopulaccedilatildeo (por escassez de recursos)

Uma ceacutelula viva com exatamente dois ou trecircs vizinhos

vivos permanece viva

Uma ceacutelula morta com exatamente trecircs vizinhos vivos

torna-se viva

Ao contraacuterio do artigo anterior desta seacuterie a soluccedilatildeo propos-

ta para este problema (na linguagem C) propotildee-se a ser

algo extremamente simples escrita de forma quase elemen-

tar

Implementaccedilatildeo do Algoritmo

Para simular o sistema de jogo foi usada uma matriz e para

que o caacutelculo das regras fosse simples foi considerado que

todas as ceacutelulas dessa matriz teriam 8 vizinhos A forma

mais direta encontrada para isso foi inserir a matriz do utiliza-

dor (que neste artigo seraacute a matriz secundaacuteria) numa matriz

com dimensatildeo [linhas+2][colunas+2] (matriz principal) para

garantir que ateacute as ceacutelulas dos ldquocantosrdquo teriam os tais 8 vizi-

nhos

De forma a simplificar a leitura da nossa implementaccedilatildeo defi-

nimos que cada ceacutelula viva teraacute o valor 1 (representada pela

macro CELVIVA) e que cada ceacutelula morta teraacute o valor 0

(representada pela macro CELMORTA)

No inicio da funccedilatildeo jogo() satildeo pedidos ao utilizador os valo-

res para o nuacutemero de linhas e colunas do sistema de jogo e

o nuacutemero de geraccedilotildees a simular

Apoacutes termos esses valores eacute entatildeo criada a matriz principal

com todos os campos inicializados a -1 para que seja efetua-

A PROGRAMAR

19

da uma ldquolimpezardquo da memoacuteria utilizada Seguidamente e atra-

veacutes desses valores eacute inicializada dentro na matriz principal a

submatriz (matriz secundaacuteria) que eacute usada para calcular os

valores das ceacutelulas em cada geraccedilatildeo Neste caso eacute inicializa-

da a matriz com a dimensatildeo que o utilizador pediu com o valor

de CELMORTA em todos os campos

Apoacutes gerar a matriz secundaacuteria eacute perguntado ao utilizador

quantas ceacutelulas vivas pretende ter no jogo Seguidamente satildeo

pedidas as coordenadas dessas mesmas ceacutelulas Quando o

programa recebe esses valores (da linha e da coluna pretendi-

da) entatildeo a essas posiccedilotildees da matriz eacute atribuiacutedo o valor CEL-

VIVA

Recapitulando para representar uma ceacutelula viva eacute usado o

valor 1 e para representar uma ceacutelula morta eacute usado o valor 0

Todas as outras posiccedilotildees da matriz principal permanecem inal-

teradas com o valor -1

Assim o que o algoritmo faz eacute contabilizar quantas ceacutelulas

vivas estatildeo nos 8 vizinhos Ou seja por outras palavras para

cada posiccedilatildeo (ij) da matriz o programa vai verificar as posi-

ccedilotildees (i-1 j-1) (i-1 j) (i-1 j+1) (i j-1) (i j+1) (i+1 j-1) (i+1 j)

e (i+1 j+1) Caso o valor de cada uma dessas ceacutelulas seja

igual a 1 (CELVIVA ie ceacutelula viva) a variaacutevel de contagem

(cvivas) eacute incrementada uma unidade

Apoacutes a verificaccedilatildeo de todas as posiccedilotildees eacute verificado se a ceacutelu-

la da posiccedilatildeo (i j) eacute uma ceacutelula viva ou morta e satildeo verificadas

as regras do jogo para que se possa decidir se a ceacutelula (ij)

permanece viva ou se morre (tomando respetivamente o valor

CELVIVA e CELMORTA na submatriz)

Usando a variaacutevel i como auxiliar para as linhas e a variaacutevel j

como auxiliar para as colunas os caacutelculos iniciam-se na posi-

ccedilatildeo (11) da matriz principal pois eacute nestas coordenadas que se

inicia a matriz secundaacuteria (ie o sistema de jogo do utilizador)

Os caacutelculos satildeo feitos em todas as posiccedilotildees (ij) apenas da

matriz secundaacuteria daiacute que a condiccedilatildeo de execuccedilatildeo dos ciclos

for seja enquanto o i e o j forem menores que o valor das li-

nhas e das colunas introduzidas pelo utilizador Ou seja a ma-

triz principal natildeo eacute toda processada nos caacutelculos dos vizinhos

vivos para que natildeo sejam gastos recursos de computaccedilatildeo

desnecessariamente

Ilustraccedilatildeo 2 - Exemplo de verificaccedilatildeo de Ceacutelulas

Ceacutelula a ceacutelula a matriz atual eacute processada sendo que apoacutes

esse processamento o resultado do caacutelculo (se a ceacutelula vive

ou morre) eacute colocado na posiccedilatildeo correspondente na matriz

nova (que eacute uma matriz com as mesmas caracteriacutesticas da

matriz atual isto eacute tem tambeacutem uma matriz principal e uma

matriz secundaacuteria)

Apoacutes esse caacutelculo eacute mostrada no ecratilde a matriz secundaacuteria

da matriz nova e a informaccedilatildeo das ceacutelulas da matriz nova eacute

copiada para a matriz atual de forma a que na proacutexima itera-

ccedilatildeo do for principal (que executa o mesmo numero de vezes

quantas geraccedilotildees o utilizador peccedila ao programa) a informa-

ccedilatildeo volte a ser processada de forma anaacuteloga

Para que fosse mais simples ao utilizador o uso do nosso

programa foi tomada em consideraccedilatildeo para que natildeo se

tornasse aborrecido estar sempre a iniciar a execuccedilatildeo do

programa caso o utilizador quisesse continuar a jogar que o

programa apenas teraacute fim quando o utilizador escolher sair

do programa neste caso introduzindo o valor 0 no menu prin-

cipal do mesmo

Se o utilizador preferir jogar novamente entatildeo basta carregar

em 1 e o programa volta a gerar uma nova jogada gerando

um novo sistema de geraccedilotildees consoante os valores introdu-

zidos pelo utilizador Na nossa implementaccedilatildeo quando o

programa mostra o sistema de jogo as ceacutelulas vivas satildeo

representadas pelo siacutembolo

Coacutedigo do Programa

Este eacute apenas um excerto da funccedilatildeo que calcula a proacutexima

geraccedilatildeo tendo como base uma matriz que represente a gera-

ccedilatildeo anterior O coacutedigo completo poderaacute ser consultado no

foacuterum do PP

JOGO DA VIDA

void jogo(void) for (int g = 0 g lt geracoes g++) printf(nnGERACAO d g + 1) for (int i = 1 i lt= linhas i++) for (int j = 1 j lt= colunas j++) int cvivas = 0 if (matrizActual[i-1][j-1] == CELVIVA) cvivas++ if (matrizActual[i-1][j] == CELVIVA) cvivas++ if (matrizActual[i-1][j+1] == CELVIVA) cvivas++ if (matrizActual[i][j-1] == CELVIVA) cvivas++ if (matrizActual[i][j+1] == CELVIVA) cvivas++ if (matrizActual[i+1][j-1] == CELVIVA) cvivas++ if (matrizActual[i+1][j] == CELVIVA)

A PROGRAMAR

20

Como o leitor pode verificar nas linhas acima este eacute um algorit-

mo bastante simples e de raacutepida implementaccedilatildeo Eacute de referir

ainda que o coacutedigo do artigo desta ediccedilatildeo foi implementado

segundo o standard C99 (suportado pelos compiladores GCC

Clang e Pelles C) que nos permite programar de uma forma

portaacutevel e ainda assim confortaacutevel (comentaacuterios comeccedilados

com variable-length arrays tipo de dados bool entre outros)

Caso o leitor queira compilar o coacutedigo deste artigo em Linux

deve utilizar a linha de comando gcc -Wall -Wextra -std=c99 -

pedantic jogo-da-vida jogo-da-vidac

O objetivo principal deste algoritmo eacute entatildeo que o utilizador

possa decidir qual a sua populaccedilatildeo inicial e que apoacutes isso pos-

sa observar o comportamento do seu sistema Ao longo dos

anos muitas configuraccedilotildees foram testadas e experimentadas

com este jogo O jogo da vida convida a experimentar diversas

configuraccedilotildees sendo que agrave maior parte das configuraccedilotildees

iniciais escolhidas bastam apenas trecircs ou quatro geraccedilotildees

para a populaccedilatildeo desaparecer completamente Contudo haacute

algumas configuraccedilotildees jaacute conhecidas como configuraccedilotildees de

ldquoVida Eternardquo por haver sempre ceacutelulas vivas ao longo de mui-

tas geraccedilotildees (e ateacute mesmo de geraccedilotildees infinitas) como mostra

por exemplo imagem seguinte (obtida com a execuccedilatildeo do

nosso programa)

Ilustraccedilatildeo 3 - Exemplo configuraccedilatildeo Vida Eterna (Bloco)

Existem ainda diferentes configuraccedilotildees que podem ocorrer

no Jogo da Vida (configuraccedilotildees essas que o utilizador pode

facilmente encontrar na internet relativas a vaacuterios estudos jaacute

feitos sobre este algoritmo) Os exemplos mais simples satildeo

mostrados abaixo com as ceacutelulas vivas em preto e as ceacutelu-

las mortas em branco

Haacute configuraccedilotildees que satildeo alvo de vaacuterios estudos cientiacuteficos

por exemplo se dois gliders satildeo colocados em direccedilatildeo a um

bloco o bloco vai aproximar-se da fonte dos gliders mas por

outro lado se trecircs gliders satildeo colocados no mesmo lugar o

bloco vai afastar-se desses gliders Este facto eacute conhecido

como a ldquomemoacuteria de bloco deslizante e pode ser usada para

simular um contador

Eacute possiacutevel construir portas loacutegicas AND OR e NOT usando

gliders tal como eacute possiacutevel construir uma imagem que aja

como uma maacutequina de estado finito conectada a dois conta-

dores

O que significa que esta disposiccedilatildeo possui o mesmo poder

computacional de uma maacutequina de Turing universal ou seja

Jogo da Vida pode ser tatildeo poderoso quanto qualquer com-

putador com memoacuteria ilimitada dando origem ao Turing com-

pleto como jaacute vaacuterios estudos comprovam esse mesmo feito

Mais uma vez recordo ao leitor que pode experimentar sem

qualquer restriccedilatildeo as configuraccedilotildees iniciais que mais lhe

agradarem Este artigo eacute o terceiro de uma seacuterie de artigos

de programaccedilatildeo tendo como base principal a linguagem C

que esperamos que siga atentamente

JOGO DA VIDA

cvivas++ if (matrizActual[i+1][j+1] == CELVIVA) cvivas++ if (isAlive ampamp cvivas lt 2) DIE else if (isAlive ampamp cvivas gt 3) DIE else if (isAlive ampamp (cvivas == 2 || cvivas == 3)) LIVE else if (isDead ampamp cvivas == 3) LIVE else DIE

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

a matriz principal

natildeo eacute toda proces-

sada (hellip) para que natildeo

sejam gastos recur-

sos de computaccedilatildeo

A PROGRAMAR

21

Introduccedilatildeo

Atualmente a plataforma Java eacute uma das mais utilizadas no

mundo e muito disso se deve agrave capacidade da plataforma

suportar outras linguagens como por exemplo JRuby Groovy

e Scala Milhares de aplicativos para Web e Mobile satildeo de-

senvolvidos a cada mecircs utilizando esta plataforma como

base A plataforma Java mudou muito desde seu iniacutecio e

provavelmente vai continuar evoluindo nos proacuteximos anos

Em paralelo com essas mudanccedilas visualizamos os servido-

res de aplicaccedilatildeo que cada vez mais oferecem recursos de

alta complexidade como componentes de balanceamento

de carga inteligente implementaccedilatildeo de autenticaccedilatildeo (JAAS)

troca de mensagens assiacutencronas (JMS) controle de transa-

ccedilatildeo (JTA) persistecircncia de objetos (JPA) componentes para

criaccedilatildeo de aplicaccedilotildees distribuiacutedas e clusterizadas (EJB) API

Java para processamento de arquivos XML e Webservices

(JAX-WS e JAX-B) e muitas outras tecnologias facilitando o

desenvolvimento e padronizaccedilatildeo de aplicaccedilotildees Eles tam-

beacutem disponibilizam uma infraestrutura estaacutevel e escalonaacutevel

para aplicaccedilotildees de missatildeo criacutetica Um dos grandes desafios

dos servidores de aplicaccedilatildeo eacute acoplar serviccedilos de grande

complexidade deixando-os estaacuteveis e flexiacuteveis

Nas versotildees iniciais a plataforma ainda conhecida como

Java2EE natildeo estava madura e seus recursos nos servidores

de aplicaccedilatildeo eram carregados de forma hieraacuterquica consu-

mindo muitos recursos e tornando o startup altamente custo-

so

A arquitetura dos principais servidores de aplicaccedilatildeo foi rede-

senhada para que seus recursos possam ser iniciados de

modo concorrente ou sob demanda As melhorias tambeacutem

podem ser notadas no consumo de memoacuteria onde em uma

simples maacutequina desktop pode-se facilmente configurar

serviccedilos de alta disponibilidade e escalaacuteveis para realizaccedilatildeo

de testes em tempo de desenvolvimento

Se vocecirc deseja um ambiente com alta disponibilidade esca-

lonaacutevel e que seja independente de fabricante (de forma a

evitar o vendor lock-in) o Java EE e seus servidores de apli-

caccedilatildeo foram feitos para si

JBoss Application Server 7

JBoss Application Server 7 ou apenas JBoss AS 7 eacute um ser-

vidor de aplicaccedilatildeo de coacutedigo aberto que eacute 100 compatiacutevel

com a especificaccedilatildeo Java EE 6 Em versotildees anteriores do

Java EE mesmo utilizando somente algumas tecnologias

para o desenvolvimento da aplicaccedilatildeo eacuteramos obrigados a

lidar com todos os recursos implementados no servidor Para

resolver esse problema no Java EE 6 foi inserido o conceito

JBoss Aplication Server 7 de profile que tem como objetivo criar configuraccedilotildees com fins

especiacuteficos como por exemplo o Web Profile que possui tec-

nologias para o desenvolvimento web

Ateacute ao momento a versatildeo atual do JBoss AS foi baixada

mais de 150 mil vezes Para mais informaccedilotildees visite o site

do projeto httpwwwjbossorgjbossas

Recentemente o projeto recebeu um novo nome e futura-

mente se chamaraacute WildFly Mais informaccedilotildees podem ser

encontradas em httpwwwwildflyorgfaq

Requisitos

Como todo servidor de aplicaccedilatildeo o JBoss AS 7 requer um

ambiente com JDK 16JDK 17 devidamente configurado e

instalado O Java Development Kit (JDK) eacute um conjunto de

utilitaacuterios para criaccedilatildeo de softwares para plataforma Java

Existem vaacuterias implementaccedilotildees cada qual com a sua finali-

dade

Para baixar o JDK 7 navegue ateacute a paacutegina de download da

Oracle em httpwwworaclecomtechnetworkjavajavase

downloadsindexhtml e escolha a opccedilatildeo Java Platform

(JDK) Em seguida vocecirc seraacute direcionado para outra paacutegina

onde deveraacute aceitar a License Agreement Baixe a versatildeo

jdk-7u21-linux-x64rpm

Para instalar o JDK execute o seguinte comando

$ sudo rpm -Uvh jdk-7u21-linux-x64rpm

Execute o comando java --version para verificar se o JDK

estaacute instalado

$ java --version

java version 170_21

Java(TM) SE Runtime Environment (build 170_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 2321-b01 mixed

mode)

Duvidas na instalaccedilatildeo Consulte o link

httpdocsoraclecomjavase7docswebnotesinstall

indexhtml

Instalando o JBoss AS 7

O JBoss AS 7 pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgjbossasdownloads Para

instalar basta descompactar o arquivo jboss-as-

711Finalzip utilizando um utilitaacuterio de descompressatildeo

A PROGRAMAR

22

Boas Praacuteticas

Nunca inicie o JBoss utilizando o usuaacuterio root pois a platafor-

ma Java oferece APIs para execuccedilatildeo de coacutedigos nativos do

sistema operacional e mecanismos de gerenciamento remoto

No Linux crie um usuaacuterio com privileacutegios de root para iniciar o

serviccedilo do JBoss Jaacute no Windows crie um usuaacuterio com poderes

administrativos mas com privileacutegios reduzidos

Uma vez instalado eacute fortemente aconselhaacutevel iniciar o JBoss

AS para verificar se existe alguma incompatibilidade com a

arquitetura do JDK utilizado ou ateacute mesmo se a memoacuteria dispo-

nibilizada eacute suficiente

Execute uma simples instacircncia standalone e acesse a url http

localhost8080 para verificar se o JBoss foi iniciado correta-

mente

$ jboss-as-711Finalbinstandalonesh

Domain Mode x Standalone Mode

O JBoss AS 7 possui dois modelos de trabalho conhecidos

como Standalone Mode e Domain Mode No Standalone Mode

podemos trabalhar com uma uacutenica instacircncia muito semelhante

a versotildees anteriores do JBoss AS 5 e JBoss AS 6 Para utilizar

o Standalone mode basta iniciar o script JBOSS_HOME

standalonesh no Linux

Agora vocecirc deve estar se perguntando se eacute possiacutevel criar um

ambiente de alta disponibilidade utilizando o Standalone

Mode A resposta eacute Sim Eacute possiacutevel criar um ambiente com

recursos clusterizados replicaccedilatildeo de sessatildeo e tudo mais Se

vocecirc jaacute utilizou outras versotildees do JBoss deve estar pensan-

do em utilizar o famoso Farm Deployment onde a aplicaccedilatildeo

era replicada para todos os noacutes do cluster Esse recurso natildeo

existe no Standalone Mode pelo que vocecirc teraacute que realizar

o deploy em todos os noacutes um por um Isso natildeo eacute um proble-

ma se forem 3 ou 4 instacircncias mas imagine se forem umas

20 instacircncias

Uma soluccedilatildeo para esse problema seria a utilizaccedilatildeo de ferra-

mentas como o RHQ (httpwwwjbossorgrhq) para realiza-

ccedilatildeo do deploy em muacuteltiplas instacircncias o que acarretaria con-

sumo de mais recursos e tempo Para solucionar esse pro-

blema temos uma soluccedilatildeo bem simples jaacute embutida no servi-

dor de aplicaccedilatildeo o Domain Mode e eacute sobre isso que vamos

falar no proacuteximo toacutepico

Introduccedilatildeo ao Domain Mode

O Domain Mode permite iniciar vaacuterias instacircncias e tambeacutem

oferece uma maneira centralizada de gerenciamento dos

recursos facilitando a administraccedilatildeo das instacircncias JBoss O

Domain Mode pode ser visto como uma unidade de instacircn-

cias que compartilham recursos e configuraccedilotildees e satildeo admi-

nistradas por um processo chamado Domain Controller

Para iniciar o JBoss AS 7 de modo domain execute o script

JBOSS_HOMEdomainsh no Linux ou JBOSS_HOME

domainbat no Windows

Quando iniciamos o JBoss em Domain Mode na configura-

ccedilatildeo default temos no miacutenimo quatro processos um Host

Controller um Process Controller e dois Servers

Domain Controller Ele eacute quem controla o gerenciamento

do domain Nele estatildeo as configuraccedilotildees que satildeo comparti-

lhadas entre as instacircncias que estatildeo nesse domain

Process Controller Ele eacute de grande importacircncia pois ele eacute

responsaacutevel pela criaccedilatildeo das instacircncias e tambeacutem do Host

Controller que vamos falar a seguir O Process Controller

natildeo deve ser confundido com uma instacircncia ele eacute

simplesmente um processo na JVM

Host Controller Como Domain Controller o Host Controller

tambeacutem coordena as instacircncias do domain Ele eacute o

responsaacutevel por fazer algo semelhando ao Farm Deployment

(natildeo existe nessa versatildeo) ou seja ele distribui o arquivo

deployado para todas as instacircncias do domain

Servers Satildeo as instacircncias em si onde estatildeo as aplicaccedilotildees

deployadas Um ponto importante eacute que cada server eacute um

processo Java

Entre os benefiacutecios da utilizaccedilatildeo do Modo Domain que noacutes

podemos citar estatildeo

Gestatildeo Centralizada

JBOSS APLICATION SERVER 7

A PROGRAMAR

23

Configuraccedilatildeo Centralizada

Deploy Centralizado

Manutenccedilatildeo Centralizada

Preparando a Infra Estrutura

Nesse artigo estamos utilizando Trecircs servidores Dois deles

seratildeo utilizados pelas as instacircncias JBoss e Um seraacute utilizado

Pelo Domain Controller e Apache Web Server para realizar o

Balanceamento de carga

Crie um grupo e adicione um usuaacuterio para ser utilizado

pelo JBoss AS 7 em todos os servidores

$ sudo groupadd jboss

$ sudo useradd -s binbash -d homejboss -m -g jboss

jboss

Faccedila tambeacutem o download do JBoss AS 7 no diretoacuterio

tmp

$ cd tmp

$ wget httpdownloadjbossorgjbossas71jboss-as-

711Finaljboss-as-711Finalzip

Crie a estrutura de diretoacuterios para armazenar o JBoss

$ sudo mkdir usrlocaljboss

$ chown jbossjboss usrlocaljboss

$ su jboss

$ mkdir usrlocaljboss

$ cd usrlocaljboss

$ unzip tmpjboss-as-711Finalzip

Finalmente o JBoss AS 7 estaacute instalado em usr

localjbossjboss-as-711 Final em todos os servidores

Configurando Alta Disponibilidade

Para aplicaccedilotildees com muitas solicitaccedilotildees a busca pela

melhora do desempenho eacute quase constante Um dos

meios mais utilizados eacute o Balanceamento de Carga

que consiste em distribuir a carga das solicitaccedilotildees em

vaacuterios servidores ou instacircncias proporcionando a

melhora no tempo de reposta

O JBoss AS 7 possui um componente nativo

conhecido como mod_cluster que foi criado para

atender a mecanismos de balanceamento de carga

alinhados ao conceito de Cloud O Mod Cluster vem

com algoritmos de balanceamento de carga mais

avanccedilados que se baseiam na carga da aplicaccedilatildeo ou

seja quantidades de sessotildees conexotildees abertas

entre outros Ele pode ser customizado conforme a

necessidade da aplicaccedilatildeo visando um ambiente

elaacutestico Um das vantagens eacute tambeacutem o

descobrimento automaacutetico de novas instacircncias JBoss

(utilizando Multicast) natildeo havendo a necessidade de

configuraccedilotildees extras

As configuraccedilotildees do mod_cluster devem ser

realizadas no JBoss AS 7 e no Apache Web Server

que seraacute utilizado como Proxy reverso

Instalando Apache Web Server

No Servidor Balancer instale o Apache Web Server

Basta executar o seguinte comando

$ sudo yum install httpd -y

Inicie o serviccedilo e verifique se paacutegina de testes eacute

carregada

$ sudo service httpd start

Instalando Mod Cluster

Ainda no Servidor Balancer instale o Mod Cluster Ele

pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgmod_cluster

downloads1-2-0-Final Para instalar basta

JBOSS APLICATION SERVER 7

A PROGRAMAR

24

descompactar o arquivo mod_cluster-120Final-linux2-

x64-ssltargz utilizando um utilitaacuterio de descompressatildeo

e copiar os moacutedulos para o diretoacuterio de moacutedulos do

Apache Web Server

Para baixar e extrair o arquivo execute

$ cd tmp

$ wget httpdownloadsjbossorg

mod_cluster120Finalmod_cluster-120Final-

linux2-x64-ssltargz

$ tar -zxvf mod_cluster-120Final-linux2-x64-

ssltargz

Copie os moacutedulos para o Apache

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_advertiseso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_managerso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_proxy_clusterso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_slotmemso etchttpdmodules

Edite o arquivo etchttpdconfhttpdconf e comente a

linha LoadModule proxy_balancer_module modules

mod_proxy_balancerso para natildeo ocorrer um conflito

com LoadModule proxy_cluster_module modules

mod_proxy_clusterso

LoadModule proxy_balancer_module modules

mod_proxy_balancerso

Crie o arquivo mod_clusterconf e adicione a seguinte

configuraccedilatildeo

$ sudo vim etchttpdconfdmod_clusterconf

Reinicie o Apache

$ sudo service httpd restart

Acesse o mod_cluster-manager e verifique se as

informaccedilotildees sobre a versatildeo do mod_cluster estatildeo

aparecendo

Arquitetura dos Servidores em Modo Domain

Para realizar os testes do balanceamento de carga

com o mod_cluster vamos subir o Domain Controller

e depois vamos conectar dois Hosts Controller com

uma Instacircncia JBoss em cada

Criando os Perfis dos Servidores JBoss

No Servidor Balancer crie o perfil chamado master

que seraacute o Domain Controller

$ cp -Rap usrlocaljbossjboss-as-711Final

domain usrlocaljbossjboss-as-711Finalmaster

JBOSS APLICATION SERVER 7

Content Mod Cluster LoadModule slotmem_module modules mod_slotmemso LoadModule manager_module modules mod_managerso LoadModule proxy_cluster_module modules mod_proxy_clusterso LoadModule advertise_module modules mod_advertiseso ltVirtualHost 80gt ltDirectory gt Order denyallow Allow from all ltDirectorygt KeepAliveTimeout 60 ManagerBalancerName mycluster MaxKeepAliveRequests 0 ServerAdvertise On EnableMCPMReceive On ltVirtualHostgt ltLocation mod_cluster-managergt SetHandler mod_cluster-manager Order denyallow Allow from all ltLocationgt

A PROGRAMAR

25

No Servidor Host-01 crie o perfil chamado host01 que

seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost01

No Servidor Host-02 crie o perfil chamado host02 que

tambeacutem seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost02

Configurando Toda a Arquitetura

Como vimos anteriormente todas as configuraccedilotildees e

gerenciamento satildeo realizadas de forma centralizada no

Domain Controller Quando for necessaacuterio adicionar um

novo grupo de servidores configurar logs criar

datasources alterar portas entre outras coisas tudo

isso deveraacute ser feito no domainxml do Domain

Controller que nesse caso eacute chamado de master Sendo

assim todas as nossas instacircncias JBoss usufruiratildeo das

configuraccedilotildees realizadas para o Domain ou para o

Server Group em questatildeo

A primeira coisa a ser feita eacute definir qual o conjunto de

tecnologias (subsystems) seratildeo utilizadas na aplicaccedilatildeo

Isso pode variar conforme os requisitos de cada

sistema Um conjunto de tecnologias (subsystems) no

JBoss 7 eacute chamado de profile

ltprofile name=full-hagt

O JBoss AS 7 possui 4 profiles por padratildeo ldquodefaultrdquo

ldquofullrdquo ldquohardquo ldquofull-hardquo mas nada impede de noacutes

copiarmos qualquer um deles e renomeaacute-los conforme

nossos requisitos No Java EE 6 foi introduzido o

conceito de Profiles onde se pode criar um subconjunto

de tecnologias presentes na spec Java EE ou ateacute

mesmo adicionar novas definidas pela JCP (Java

Community Process)

Mais informaccedilotildees

httpscommunityjbossorgwiki

JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Noacutes vamos utilizar o profile ha pois nele os recursos

para clusterizaccedilatildeo estatildeo disponiacuteveis

Depois de definir o profile o proacuteximo criar um Grupo de

Servidores Server Group Um server group nada mais eacute

que um agrupamento de instacircncias JBoss Nessa

arquitetura vamos utilizar apenas um server group Isso

pode ser definido na tag ltserver-groupsgt no domainxml

do master (Domain Controller)

Crie um Server Group chamado apps que utilize o

profile ha

$ vim usrlocaljbossjboss-as-711Finalmaster

configurationdomainxml

Os outros Server Groups podem ser removidos

No profile ha especificamente no subsystem web

adicione o atributo instance-id

O instance-id seraacute passado como paracircmetro na

inicializaccedilatildeo do Host Controller

O proacuteximo passo eacute configurar o atributo proxy list no

subsystem modcluster

Nesse atributo estaacute configurado o IP e porta do

Apache Web Server

No Servidor Host-01 edite o arquivo usrlocaljboss

jboss-as-711Finalhost01configurationhost-

slavexml para criar a instacircncia JBoss

Na tag ltserversgt eacute onde estatildeo de fato as nossas

instacircncias JBoss Quando criamos um novo ltservergt

estamos criando uma nova instacircncia JBoss

Conforme foi definido na arquitetura o Host Controller

01 conteraacute apenas uma instacircncia JBoss chamada

instance-one

Deixe o ltserversgt como abaixo

Definimos que a instacircncia JBoss instance-one faraacute

parte do Server Group apps

Para finalizar na tag lthostgt adicione o nome host01

lthost name=host01 xmlns=urnjbossdomain12gt

JBOSS APLICATION SERVER 7

ltserver-group name=apps profile=hagt ltjvm name=defaultgt ltheap size=1303m max-size=1303mgt ltpermgen max-size=256mgt ltjvmgt ltsocket-binding-group ref=ha-socketsgt ltserver-groupgt

ltsubsystem xmlns=urnjbossdomainweb12 de-fault-virtual-server=default-host instance- id=$jbossservername native=falsegt

ltsubsystem xmlns=urnjbossdomainmodcluster10gt ltmod-cluster-config advertise-socket=modcluster proxy-list=19216823818680gt ltdynamic-load-providergt ltload-metric type=busynessgt ltdynamic-load-providergt ltmod-cluster-configgt ltsubsystemgt

ltserversgt ltserver name=instance-one group=appsgt ltservergt ltserversgt

A PROGRAMAR

26

Repita os procedimentos realizados no servidor Host -01

em Host-02 alterando apenas o nome do servidor que

seraacute instance-two e do lthostgt que seraacute host02No

ambiente em que realizei os testes o sevidores possuem

os seguintes IPs

Domain Controller+Apache WebServer 192168238186

Host Controller 01 192168238187

Host Controller 02 192168238188

Inicie o Domain Controler (master) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalmaster

-Djbosshostdefaultconfig=host-masterxml -

Djbossbindaddress=192168238186 -

Djbossbindaddressmanagement=192168238186

Verifique o log

JBoss AS 711Final Brontes (Host Controller) started

in 15505ms - Started 11 of 11 services (0 services are

passive or on-demand)

O Domain Controller foi iniciado com sucesso Conecte

primeiro Host Controller 01 (Host-01) ao Master Inicie o

Perfil host01 utilizando os seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost01

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238187

-Djbossbindaddress=192168238187

-Djbossservername=host-01

Agora observe os logs no Domain Controller e perceba

que o Host Controller 01 se conectou ao Domain

JBAS010918 Registered remote slave host host01

JBoss AS 711Final Brontes

Observe tambeacutem o Mod Cluster Manager em

http192168238186mod_cluster-manager e veja que

a nossa primeira instacircncia jaacute apareceu

Inicie o Host Controller 02 (slave02) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost02

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238188

-Djbossbindaddress=192168238188

-Djbossservername=host-02

Observando novamente o log Domain Controller e

verifique que o Host Controller 02 se tambeacutem

conectou

JBAS010918 Registered remote slave host host02

JBoss AS 711Final Brontes

No Mod Cluster Manager em http192168238186

mod_cluster-manager jaacute estatildeo as duas instacircncias

Para testar o Balanceamento vamos fazer o deploy da

aplicaccedilatildeo SystemProps que pode ser baixada http

googlyjynK Para fazer o deploy conecte do domain

controller utilizando o CLI

[jbosslocalhost jboss]$ sudo jboss-as-711Final

binjboss-clish -c controller=1921682381869999

[domain1921682381869999 ] deploy tmp

systempropswar --server-groups=apps

A aplicaccedilatildeo foi deployada para as instacircncias do server

group apps Acesse a url do balanceador e verifique

se a aplicaccedilatildeo estaacute disponiacutevel

http192168238186systemprops

JBOSS APLICATION SERVER 7

A PROGRAMAR

27

Perceba que estamos na instance-one Entatildeo para

testarmos o funcionamento do balanceamento de carga

vamos parar a Instacircncia instance-one e quando

tentarmos um novo acesso seraacute redirecionado para o

instance-two

No CLI execute o seguinte comando para parar o

instance-one

[domain1921682381869999 ] host=host01server -

config=instance-onestop

outcome =gt success

result =gt STOPPING

Acesse novamente a aplicaccedilatildeo http192168238186

systemprops

Perceba que agora estamos no instance-two Concluiacutemos assim que o balanceamento de carga estaacute funcionando

Conclusatildeo

O JBoss AS 7 trouxe a evoluccedilatildeo arquitetural que era esperada como pode ser vista nesse artigo Carregamento de moacutedulos dinacircmico gerenciamento centralizado e tempo de startup reduzido satildeo apenas

algumas das inuacutemeras melhorias trazidas nessa versatildeo

Espera-se que a plataforma JBoss continue evoluindo

trazendo sempre mais benefiacutecios a todos que utilizam

os produtos desse ecossistema Cada membro da

comunidade tambeacutem pode fazer a sua parte seja

colaborando com artigos ou participando de

discussotildees para encontrar melhorias para a

plataforma Cabe a noacutes aceitar o convite de melhorar

cada vez mais essa tecnologia

JBOSS APLICATION SERVER 7

AUTOR Escrito por Mauricio Magnani Jr

Consultor JBoss com 6 anos de experiecircncia no mercado Trabalhou na RedHat como Engenheiro de Suporte JBoss atenden-

do clientes da Ameacuterica Latina e EUA Criador e mantenedor do blog httpsjbossdiverswordpresscom e membro ativo do

Grupo de Usuaacuterios JBoss do Brasil Hoje eacute Senior Java Software Engineer no Groupon Brasil Possui as certificaccedilotildees Red Hat

Certified JBoss Administrator on JBoss EAP 5 e JBoss EAP 6

Milhares de apli-

cativos para Web

e Mobile satildeo desenvol-

vidos a cada mecircs utili-

zando esta plataforma

como base A platafor-

ma Java mudou muito

desde seu iniacutecio e pro-

vavelmente vai conti-

nuar evoluindo nos

proacuteximos anos

A PROGRAMAR

28

Para o desenvolvimento de aplicaccedilotildees Web existem um sem

nuacutemero de frameworks gratuitas e mais ou menos bem con-

ceituadas Contudo temos vaacuterios problemas associados que

com o crescer de uma aplicaccedilatildeo podem trazer vaacuterios recuos

no seu desenvolvimento Um dos maiores eacute o oacutebvio satildeo

gratuitas e por isso mesmo o coacutedigo eacute lido por milhares de

pessoas em todo o mundo tornando as falhas de seguranccedila

bastante visiacuteveis e faacuteceis de explorar Outro grande proble-

ma eacute o facto de trazerem funcionalidades especiacuteficas em que

muitas vezes natildeo as usamos tornando-se em alguns casos

um ldquocanhatildeo para matar um mosquitordquo Pegando na aborda-

gem das correntes frameworks podemos noacutes proacuteprios cons-

truir algo soacutelido o suficiente para uma grande aplicaccedilatildeo

Vamos nesta seacuterie de trecircs artigos construir uma framework

passo-a-passo comeccedilando pelo baacutesico mas o mais importan-

te o routing

htaccess

Tirando partido do serviccedilo Apache delegamos o enclausura-

mento do nosso sistema de ficheiros agrave regras htaccess Natildeo

permitimos a listagem de ficheiros nem a execuccedilatildeo de outros

scripts PHP agrave excepccedilatildeo do indexphp sendo este o respon-

saacutevel pelo routing da framework Para garantirmos que estas

regras satildeo cumpridas e que o indexphp seja sempre chama-

do redireccionamos todos os pedidos de execuccedilatildeo de

scripts para o mesmo indexphp dando-lhe todos os argu-

mentos do URL originalmente fornecidos Desta forma o

utilizador natildeo sabe a que ficheiros ou pastas estaacute a aceder

A esta regra temos de adicionar uma excepccedilatildeo a pasta con-

tent onde temos todos os conteuacutedos como imagens ficheiros

CSS viacutedeos etc No fundo todos aqueles ficheiros que o

browser do utilizador vai descarregar Para mantermos o

enclausuramento da nossa aplicaccedilatildeo natildeo eacute aconselhado

natildeo colocarmos nessa pasta nenhum tipo de script visto que

pode ser executado arbitrariamente do exterior o contraacuterio

do que queremos

configphp

PHP Uma framework ldquofrom scratchrdquo (Parte 1) Usaremos este ficheiro como auxilio para definiccedilotildees de cami-

nhos para pastas e configuraccedilotildees por defeito

define(DS DIRECTORY_SEPARATOR)

Esta definiccedilatildeo eacute uma redundacircncia eacute definida simplesmente

por conveniecircncia na escrita do coacutedigo

define(BASE_PATHhttplocalhost)

Aqui definimos o caminho URL para a nossa aplicaccedilatildeo

define(DEFAULT_PAGEhello)

Esta eacute a nossa paacutegina por defeito caso nenhuma tenha sido

requirida

define(ROOT$_SERVER[DOCUMENT_ROOT])

Aqui eacute definido o caminho para a pasta da aplicaccedilatildeo

Uma vez definidas as configuraccedilotildees passamos agrave parte mais

importante o routing

Visto que temos todos os requests redireccionados para o

indexphp agora temos de fazer sentido dos argumentos

que satildeo passados pelo URL

Aqui separamos os argumentos em duas partes a paacutegina

que queremos aceder e os argumentos para esta paacutegina O

seguinte pedido

httplocalhosthellofoobar

resulta em

RewriteEngine on RewriteCond $1 ^(allowphp|indexphp|content) RewriteRule ^()$ indexphp$1 [L] ltFiles htaccessgt order allowdeny deny from all ltFilesgt

define(DS DIRECTORY_SEPARATOR) define(BASE_PATHhttplocalhost) define(DEFAULT_PAGEhello) define(ROOT$_SERVER[DOCUMENT_ROOT])

function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url

array (size=2) page =gt string hello (length=5) args =gt array (size=2) 0 =gt string foo (length=3) 1 =gt string bar (length=3)

A PROGRAMAR

29

(hellip)micro-

framework temos um

sistema de routing que

nos iraacute permitir nos

dois proacuteximos artigos

alargar os horizontes

passando a uma pro-

gramaccedilatildeo OOP e imple-

mentando MVC

De seguida encaminhamos para a paacutegina requerida

Aqui verificamos se a paacutegina que eacute pedida existe no case de

existir importamos o ficheiro caso contrario enviamos o header

de erro e terminamos a aplicaccedilatildeo

Indexphp

ROOT

Indexphp

Configphp

htaccess

Pages

Hellophp

Com esta micro-framework temos um sistema de routing que

nos iraacute permitir nos dois proacuteximos artigos alargar os horizon-

tes passando a uma programaccedilatildeo OOP e implementando

MVC Finalmente iremos implementar um pequeno driver

para MySQL e um debugger

Dependecircncias

Apache com mod_rewrite e PHP

P VS NP COMPREENDER O MAIOR PROBLEMA POR RESOLVER EM COMPUTACcedilAtildeO

function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

ltphp require_once (configphp) function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

callHook() gt

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

COLUNAS C - Observable vs Task

Visual (Not) Basic - Operator Overloading

C

32

Nas ediccedilotildees anteriores vimos como transformar uma API

baseada assiacutencrona em eventos numa API baseada em ob-

servaacuteveis (observables) ou numa API baseada em tarefas

A questatildeo que se levanta eacute quando usar qual

Quando Usar Observaacuteveis

A programaccedilatildeo baseada em observaacuteveis eacute tambeacutem conheci-

da como programaccedilatildeo reativa e comeccedilou a ser usada como

alternativa a assiacutencrona baseada em eventos porque a pro-

gramaccedilatildeo assiacutencrona baseada em tarefas ainda natildeo estava

disponiacutevel (ou natildeo estava disponiacutevel em todas as platafor-

mas)

Na verdade o campo de batalha da programaccedilatildeo reativa

satildeo as correntes de eventos (event streams) Eacute aqui que a

utilizaccedilatildeo de eventos se torna tambeacutem mais natural

Uma API baseada em eventos em que o evento apenas eacute

disparado uma vez eacute na verdade uma API baseada em

chamadas de resposta (callback) O facto de ser implemen-

tada com o mecanismo de eventos da plataforma NET natildeo

faz dela uma API baseada em eventos

A existecircncia da necessidade de combinar vaacuterias correntes de

eventos e relacionaacute-los entre si eacute tambeacutem uma boa indicaccedilatildeo

para a utilizaccedilatildeo de observaacuteveis

Quando Usar Tarefas

Como o nome indica uma tarefa eacute algo que tem um iniacutecio e

um fim Assim sendo todas as API assiacutencronoas baseadas

num mecanismo de chamada de resposta (callback) satildeo

candidatadas a ser transformadas numa API assiacutencrona

baseada em tarefas Mesmo que o mecanismo de chamada

de resposta sejam eventos NET

Matriz De Aplicabilidade

Baseando-nos nas consideraccedilotildees anteriores e porque nem

sempre tudo eacute assiacutencrono chegamos agrave seguinte matriz de

aplicabilidade

Conclusatildeo

No final natildeo existe uma resposta maacutegica O que numa situa-

ccedilatildeo pode ser um observaacutevel noutra pode ser uma tarefa

Recursos

O GeoCoordinateWatcher Como Um Serviccedilo Reativo - Re-

vista PROGRAMAR - 39ordf Ediccedilatildeo - Fevereiro 2013

Trazendo Async E Await ao Serviccedilo de Contactos do Win-

dows Phone - Revista PROGRAMAR - 40ordf Ediccedilatildeo - Abril

2013

Extensotildees Reativas (Rx)

Programaccedilatildeo assiacutencrona com async e await (C e Visual

Basic)

C - OBSERVABLE VS TASK

Siacutencrono Assiacutencrono

Um uacutenico valor - Tarefa

Muacuteltiplos valo-

res

Enumeraacutevel Observaacutevel

AUTOR

Escrito por Paulo Morgado

Bacharel em Engenharia Electroacutenica e Telecomunicaccedilotildees (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa

e Licenciado em Engenharia Informaacutetica pela Faculdade de Ciecircncias e Tecnologia da Universidade Nova de Lisboa exerce

variadas funccedilotildees relacionadas com o desenvolvimento distribuiccedilatildeo e manutenccedilatildeo de software haacute mais de 10 anos Participa

em diversas comunidades nacionais e internacionais (pontoNETpt NetPonto SharePointPT SQLPort Portugal-a-Programar

CodeProject CodePlex etc) Pelo seu contributo para com estas comunidades a Microsoft premeia-o com o preacutemio MVP

(C) desde 2003 Eacute ainda co-autor do livro ldquoLINQ Com Crdquo da FCA httpPauloMorgadoNET - PauloMorgado

o campo de bata-

lha da programaccedilatildeo re-

ativa satildeo as correntes

de eventos (event stre-

ams)

VISUAL (NOT) BASIC

33

ldquoNatildeo podes somar batatas com elefantesrdquo

Frases como a anterior ou semelhantes jaacute vos passaram

por a consideraccedilatildeo em alguma altura da vossa vida Quer

tenha sido nos vossos primeiros passos a matemaacutetica ou

ainda na semana passada em qualquer implementaccedilatildeo de

software mais rebuscada algueacutem algures transmitiu dessa

forma que natildeo eacute possiacutevel operar aquelas duas variaacuteveis

De facto batatas e elefantes natildeo satildeo tipicamente operaacuteveis

a menos que a resposta de que estamos agrave procura seja dife-

rente

Saber como operar

A soluccedilatildeo da soma de batatas com elefantes reside precisa-

mente na resposta que procuramos obter

Eu posso dizer que Elefante + Batata eacute igual a 4 se for es-

pecificado que a soma de seres-vivos opera aritmeticamente

o nuacutemero de pernas do ser Natildeo posso Claro que posso

Soacute precisamos de definir que os seres-vivos satildeo operaacuteveis

assim e de que forma Eacute aqui que entra o ldquooverloadrdquo de ope-

radores

Operadores

Operadores sim Quando se falam de operadores referem-

se todos aqueles que estatildeo provavelmente a passar-vos na

cabeccedila agora tanto unaacuterios como binaacuterios mas nem todos

Unaacuterios + - Not IsTrue IsFalse CType

Binaacuterios + - amp Like Mod And Or Xor ^ ltlt

gtgt = ltgt gt lt gt= lt=

Estes operadores fazem sentido nos usos comuns onde jaacute

sabemos para que servem e que resultados vatildeo surtir

Agrave luz da especificaccedilatildeo anterior podemos afirmar com segu-

ranccedila que Elefante gt Batata porque uma batata natildeo tem

pernas e porque conhecemos o operador gt (maior que)

A implementaccedilatildeo do operador pode basear-se em qualquer

aspecto dos seus operandos mas natildeo eacute boa ideia contradi-

zer a loacutegica do operador que se estaacute a definir Por razotildees

oacutebvias natildeo eacute boa ideia por exemplo implementar overloads

de tal forma que Batata - Elefante = -4 ao mesmo tempo que

Batata gt Elefante = TRUE Natildeo faz sentido porque natildeo esta-

mos a usar o mesmo criteacuterio Se Batata ndash Elefante eacute menor

que zero a Batata deveria ser menor que o Elefante e natildeo o

contraacuterio

Natildeo eacute que seja impossiacutevel mas vai tornar o coacutedigo muito

mais difiacutecil de ler o que vai contra a facilidade do overload

de operadores

Overload

A ideia natildeo eacute inventar novos operadores O que queremos

realmente indicar eacute qual o procedimento a seguir para conse-

guir aplicar o anaacutelogo do operador para determinado tipo ou

determinados tipos Assim o operador + por exemplo teraacute

de continuar a fazer sentido na aritmeacutetica ao mesmo tempo

que faz sentido na soma de seres-vivos se tentarmos somar

nuacutemeros entra o operador aritmeacutetico se tentarmos somar

batatas com elefantes entra a nossa implementaccedilatildeo do ope-

rador

Portanto e em tom de resumo da mesma forma que defini-

mos overloads de meacutetodos tambeacutem se definem overloads

de operadores com base na sua assinatura

Jaacute chega de elefantes e batatas natildeo

Efectivamente jaacute Natildeo conveacutem esticar a analogia ateacute porque

nem todos os operadores fazem sentido com uma classe de

seres vivos As coisas comeccedilam a ficar mais claras com

exemplos de implementaccedilatildeo

Vamos considerar a seguinte classe para exemplificar

Como seraacute de esperar se tentarmos por exemplo comparar

instacircncias desta classe o Visual Basic natildeo saberaacute o que

fazer para comparar Eacute um tipo composto que compreende

OPERATOR OVERLOADING

Public Class Veiculo Public Enum TipoVeiculo AUTOMOVEL MOTO PESADO End Enum Public Enum TipoCombustivel GASOLINA GASOLEO HIBRIDO ELECTRICO GPL End Enum Public Property Tipo As TipoVeiculo Public Property Marca As String Public Property Modelo As String Public Property Cilindrada As Integer Public Property Combustivel As TipoCombustivel Public Property NumeroPortas As Short Sub New(Tipo As TipoVeiculo Marca As String Modelo As String Cilindrada As Integer Combustivel As TipoCombustivel NumeroPortas As Short) _Tipo = Tipo _Marca = Marca _Modelo = Modelo _Cilindrada = Cilindrada _Combustivel = Combustivel _NumeroPortas = NumeroPortas End Sub End Class

VISUAL (NOT) BASIC

34

membros que noacutes mesmos criamos e seria impossiacutevel perce-

ber automaticamente quais as caracteriacutesticas a comparar

Este coacutedigo natildeo compila com dois erros em Carro1 = Carro2

e Carro2 = Carro3

Operator = is not defined for types OperatorOverloadVeicu-

lo and OperatorOverloadVeiculo

E tem toda a razatildeo O operador igual (=) natildeo estaacute nem im-

plementado na classe nem tem nenhum overload que im-

plique uma operaccedilatildeo binaacuteria com dois tipos Veiculo

Vamos entatildeo implementar um operador para o igual (=) que

consiga determinar se estamos na presenccedila do mesmo

veiacuteculo ou natildeo Vamos considerar que a cilindrada natildeo eacute um

factor para distinguir dois carros

Basta acrescentar os seguintes meacutetodos na classe Veiculo

Algumas implementaccedilotildees de operadores implicam que se

implementem tambeacutem a sua negaccedilatildeo No caso do operador

igual (=) eacute necessaacuterio natildeo soacute especificar o que eacute consider-

ado igual mas tambeacutem o que eacute considerado diferente

Assim o coacutedigo anterior jaacute eacute correctamente compilado e

produz o seguinte output

Carro1 = Carro2 False

Carro2 = Carro3 True

O que eacute verdade Como operaccedilotildees aritmeacuteticas natildeo faziam

muito sentido com uma classe a representar um veiacuteculo

vamos considerar esta nova classe

Esta classe representa um vector tridimensional Manteacutem um

valor para X para Y e para Z Natildeo adianta realizar

operaccedilotildees aritmeacuteticas com o Vector uma vez que novamen-

te o Visual Basic natildeo saberia o que fazer com ele

Vamos entatildeo acrescentar alguns operadores

Assim jaacute eacute possiacutevel efectuar algumas operaccedilotildees com esta

classe

OPERADOR LIKE

Public Shared Operator =(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return False If V1Combustivel ltgt V2Combustivel Then Return False If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return False If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return False If V1NumeroPortas ltgt V2NumeroPortas Then Return False Return True End Operator Public Shared Operator ltgt(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return True If V1Combustivel ltgt V2Combustivel Then Return True If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return True If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return True If V1NumeroPortas ltgt V2NumeroPortas Then Return True Return False End Operator

Public Class Vector3 Public Property X As Decimal Public Property Y As Decimal Public Property Z As Decimal Sub New(X As Decimal Y As Decimal Z As Decimal) _X = X _Y = Y _Z = Z End Sub Public Overrides Function ToString() As String Return StringFormat((012) _X _Y _Z) End Function End Class

Public Shared Operator +(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X + V1X V2Y + V1Y V2Z + V1Z) End Operator Public Shared Operator -(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X - V1X V2Y - V1Y V2Z - V1Z) End Operator Public Shared Operator (V1 As Vector3 V2 As Vector3) Return (V2X V1X) + (V2Y V1Y) + (V2Z V1Z) End Operator Public Shared Operator (V1 As Vector3 E1 As Decimal) Return New Vector3(E1 V1X E1 V1Y E1 V1Z) End Operator Public Shared Operator amp(S1 As String V1 As Vector3) Return S1 amp V1ToString End Operator

Dim V1 As New Vector3(3 2 1) Dim V2 As New Vector3(1 2 3) DebugWriteLine(Adiccedilatildeo amp (V1 + V2)) DebugWriteLine(Subtraccedilatildeo amp (V1 - V2)) DebugWriteLine(Produto escalar amp (V1 V2)) DebugWriteLine(Multiplicaccedilatildeo com escalar amp (V2 3))

Dim Carro1 As New Veiculo(AUTOMOVEL Ford Ka 1249 GASOLINA 3) Dim Carro2 As New Veiculo(AUTOMOVEL Ford Ka 1250 GASOLEO 3) Dim Carro3 As New Veiculo(AUTOMOVEL Ford Ka 1251 GASOLEO 3) DebugWriteLine(Carro1 = Carro2 amp (Carro1 = Carro2)) DebugWriteLine(Carro2 = Carro3 amp (Carro2 = Carro3))

VISUAL (NOT) BASIC

35

O que produz

Adiccedilatildeo (444)

Subtraccedilatildeo (-202)

Produto escalar 10

Multiplicaccedilatildeo com escalar (369)

Foi necessaacuterio especificar o operador de concatenaccedilatildeo para

que o Visual Basic saiba como tratar a concatenaccedilatildeo de uma

String com o resultado de uma outra operaccedilatildeo com a mesma

classe

Neste caso estamos apenas a concatenar a String com a

representaccedilatildeo String da classe que definimos anteriormen-

te Ao analisar os operadores podemos verificar que existem

dois overloads para a multiplicaccedilatildeo

Um implica dois vectores e o outro um vector e um decimal

A nossa implementaccedilatildeo dita que se forem fornecidos dois

vectores o resultado seraacute o produto escalar dos dois vec-

tores

Se for fornecido apenas um vector e um valor escalar o re-

sultado seraacute outro vector que representa o produto desse

vector com um escalar

Existe com certeza aplicaccedilotildees matemaacuteticas (e natildeo soacute) mais

interessantes mas as apresentadas demonstram a facilidade

com que implementamos os nossos proacuteprios comportamen-

tos de operadores

Conclusatildeo

Operator overloading permite uma notaccedilatildeo mais proacutexima do

domiacutenio alvo o que promove a legibilidade e dissipa duacutevidas

de interpretaccedilatildeo Esta eacute a sua maior vantagem

No entanto se as implementaccedilotildees natildeo forem de encontro ao

sentido natural dos operadores o efeito poderaacute ser o perfeito

contraacuterio

Eacute um caso tiacutepico de melhor amigo ou pior inimigo Natildeo haacute

meio-termo

OPERADOR LIKE

AUTOR

Escrito por Seacutergio Ribeiro

Curioso e autodidata com uma enorme paixatildeo por tecnologias de informaccedilatildeo e uma saudaacutevel relaccedilatildeo com a NET Fra-

mework Moderador global na comunidade PortugalProgramar desde Setembro de 2009 Alguns frutos do seu trabalho

podem ser encontrados em httpwwwsergioribeirocom

Operator overlo-

ading permite uma no-

taccedilatildeo mais proacutexima do

domiacutenio alvo

Media Partners da Revista PROGRAMAR

EVENTOS

37

No passado dia 25 de Maio de 2013 realizou-se na Microsoft

Portugal no Parque das Naccedilotildees o 1ordm evento presencial da

comunidade Portugal a Programar Ainda antes das 9h come-

ccedilaram a chegar os participantes crescia o entusiasmo envolto

em todo o evento e pouco a pouco todos noacutes fomos dando

cara aos nicks a que nos habituaacutemos ao longo dos anos

Pontualmente a organizaccedilatildeo deu iniacutecio ao evento PROGRA-

MAR 2013 com Jorge Paulino David Pintassilgo e Rui Gon-

ccedilalves a abrir o evento Brevemente foi-nos dada a conhecer

a comunidade PP assim como os quatro pontos-chave que

a caracterizam

Foacuterum PP

Wiki

Portal de Downloads

Revista Programar

Parafraseando o anfitriatildeo Jorge Paulino ldquoeste foi um projeto

que se iniciou a 28 de Maio de 2005 para dar resposta agrave ne-

cessidade de partilhar informaccedilatildeo e experiecircncias nesta aacutereardquo

Apoacutes a apresentaccedilatildeo do evento e da comunidade seguiu-se

um discurso inspirador de um dos oradores Rui Delgado

acerca da necessidade de se empreender em Portugal

Com o limite de inscriccedilotildees a ser atingido em apenas trecircs dias

o 1ordm evento do PP contou com a presenccedila de 19 oradores

voluntaacuterios que deram origem a 18 apresentaccedilotildees teacutecnicas e

a 2 workshops praacuteticos Cerca de 250 participantes estiveram

presentes no edifiacutecio da Microsoft Lisbon Experience

EVENTO PROGRAMAR 2013

EVENTOS

38

Pelas diversas salas do evento partilharam-se experiecircncias e

conhecimento As apresentaccedilotildees decorreram 3 em simultacirc-

neo e foram as seguintes

Apresentaccedilatildeo das novidades de Java EE 7 (Ernest

Duarte)

As novidades do C 50 (Paulo Morgado)

ASPNET SignalR ndash Comunicaccedilatildeo em real-time sim-

ples e para todo mundo (Glauco Godoi)

Conquistar o mundo com aplicaccedilotildees feitas agrave velocida-

de da luz (Ricardo Marques)

CRM Como escolher De raiz ou sistema jaacute desen-

volvido (Pedro Azevedo)

Desenvolvimento de Aplicaccedilotildees em Windows Phone 8

(Nuno Silva)

Desenvolvimento em SharePoint por onde comeccedilar

(Rodrigo Pinto)

Desenvolvimento raacutepido de siacutetios web com personali-

zaccedilatildeo de Joomla ( Rui Guimaratildees )

DMVs ndash Conhece o teu SQL Server (Vitor Pombeiro)

Empreendedorismo em TI (Fernando Martins)

HTML5 e CSS3 ndash raacutepido e eficaz para o presente

(Seacutergio Laranjeira)

Introduccedilatildeo ao Cloud Computing e ao Windows Azure

(Vitor Tomaz)

Microsoft Kinect SDK (Rui Simatildeo)

Plataforma de desenvolvimento para Windows Store

Apps (Nuno Silva)

Powershell agrave minha maneira (Bruno Lopes)

O desenvolvimento de aplicaccedilotildees moacuteveis antes da 1ordf

linha de coacutedigo (Alberto Silva)

SEO ndash A importacircncia do Search Engine Optimization

(Miguel Lobato)

SQL Server ndash Performance e Tunning (Pedro Martins)

E ainda os workshops praacuteticos

Workshop ndash Integraccedilatildeo de CRM Dynamics com Java

e NET (Pedro Azevedo)

Workshop ndash Web em Realtime (Seacutergio Costa)

EVENTOS

39

Durante o decorrer das sessotildees houve ainda oferta de brindes

(gentilmente oferecidos pelos patrocinadores) aos participan-

tes

Outro ponto que marcou este PROGRAMAR 2013 foi o con-

curso de aplicaccedilotildees Windows Phone e Windows 8 vencido

por Jorge Costa com o jogo ldquoLittle Bitsrdquo sendo o segundo

lugar atribuiacutedo a Mauro Castro pela aplicaccedilatildeo ldquoPortugalrsquos Eve-

ningsrdquo

Houve ainda demostraccedilotildees do Microsoft Kinect (Rui Simatildeo) e

do Leap Motion (Diniz Vieira) a todos os participantes interes-

sados e todo o dia foi passado num espiacuterito descontraiacutedo e

animado aumentando assim os laccedilos entre toda a comunida-

de

A toda a organizaccedilatildeo e a todos os oradores envolvidos dei-

xamos um agradecimento especial agradecendo tambeacutem a

todos os patrocinadores nomeadamente a Microsoft Portugal

ESET Portugal FCA Editora Rumos e Truewind-Chiron Nun-

ca deixando de referir tambeacutem os Media Parters que ajuda-

ram a toda a divulgaccedilatildeo deste evento

A todos os elementos da comunidade que fazem com que a

Portugal-a-Programar seja cada vez mais conhecida no nosso

paiacutes e aleacutem-fronteiras a todos deixamos um ldquoMuito Obriga-

dordquo relembrando mais uma vez que este eacute um projeto de to-

dos e para todos e que a mais pequena accedilatildeo pode fazer a

diferenccedila

Eacute com satisfaccedilatildeo e orgulho que podemos afirmar que o 1ordm

Evento Presencial do PP foi um sucesso pois mesmo apoacutes

as sessotildees terem terminado houve ainda quem se mantives-

se no local partilhando experiecircncias de um dia cheio de emo-

ccedilotildees

E citando um dos oradores do evento Rui Delgado ldquoOh Yes

Muito Bomrdquohellip Venha o PROGRAMAR 2014

Paacutegina do evento httpeventoportugal-a-programarpt

(hellip) a mais peque-

na accedilatildeo pode fazer a

diferenccedila

Anaacutelises Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

C 50 com Visual Studio 2012

Review

41

Tiacutetulo Android ndash Introduccedilatildeo ao Desenvol-

vimento de Aplicaccedilotildees

Autor Ricardo Queiroacutes

Editora FCA

Paacuteginas 224

ISBN 978-972-722-763-1

O Android tornou-se na plataforma de dispositivos moacuteveis

mais usada no mundo e como tal existe um interesse cres-

cente dos programadores em criarem soluccedilotildees para esse

mercado Para quem queira dar aquele 1ordm passo no desen-

volvimento de aplicaccedilatildeo em Android o livro ldquoAndroid - Intro-

duccedilatildeo ao desenvolvimento de aplicaccedilotildeesrdquo de Ricardo Quei-

roacutes eacute uma boa escolha

Conteacutem passo a passo desde a configuraccedilatildeo do ambiente

de desenvolvimento ateacute agrave concepccedilatildeo de uma aplicaccedilatildeo para

Android na sua iacutentegra Destaca exemplos muito uacuteteis que

podem ser reaproveitados noutra aplicaccedilatildeo pois contempla

o desenho de uma interface graacutefica a gestatildeo de dados da

aplicaccedilatildeo atraveacutes de gestatildeo de ficheiros ou bases de dados

utilizaccedilatildeo de APIs de localizaccedilatildeo mapas e sensores e a

criaccedilatildeo do jogo do galo

Durante a sua leitura pode-se constatar que eacute um livro rico

em imagens explicativas e exemplificativas que nos ajudam

a perceber o que devemos fazer e o que devemos alcanccedilar

com a construccedilatildeo de todo o coacutedigo escrito

Infelizmente jaacute eacute habitual que nos sejam apresentados os

tiacutepicos tons acinzentados das ilustraccedilotildees e a ausecircncia de

qualquer tipo de realce de sintaxe no coacutedigo-exemplo o que

por vezes pode-se tornar cansativo ao olhar

Um factor alheio ao autor do livro mas que a editora em

causa deveria ter em consideraccedilatildeo por forma a facilitar a

leitura

ldquoAndroid ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildeesrdquo

de Ricardo Queiroacutes eacute um bom livro para quem jaacute tenha algu-

ma experiecircncia em programaccedilatildeo Java e que queira explorar

as potencialidades do Android

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

(hellip) destaca exem-

plos muito uacuteteis que

podem ser reaproveita-

dos noutra aplicaccedilatildeo

(hellip)

Review

42

Tiacutetulo C 50 com Visual Studio 2012

Autor Henrique Loureiro

Editora FCA

Paacuteginas 608

ISBN 978-972-722-752-5

Elementos de programaccedilatildeo

Abordam-se os temas de programaccedilatildeo mais elementar com

referecircncias agrave programaccedilatildeo iterativa passando pela orientada

a objecto O texto estaacute nitidamente orientado para um puacutebli-

co que tem noccedilotildees baacutesicas de programaccedilatildeo explicando a

loacutegica de uma funccedilatildeo ateacute agrave heranccedila de classes Tenta de

uma forma sucinta demonstrar na praacutetica ou seja com code-

snipets como construir de uma forma coerente uma aplica-

ccedilatildeo em C recorrendo ao Visual Studio

Usabilidade - Eacute tambeacutem abordada a importacircncia da usabili-

dade do user-interface numa qualquer aplicaccedilatildeo Satildeo de-

monstrados os conceitos baacutesicos de Interaccedilatildeo Homem-

Maacutequina e como aplica-los aos Windows Forms Este tema

serve de ponte para um tema bem mais extensivo Windows

Forms e programaccedilatildeo orientada agrave GUI detalhando alguns

dos componentes que a NET traz buit-in Explica a funciona-

lidade e a interecccedilatildeo com os componentes mais genericas e

mais usuais para uma aplicaccedilatildeo que se use de um sistema

de janelas como GUI A explicaccedilatildeo embora limitada a pou-

cos elementos eacute bastante completa dando ecircnfase aos

events associados a este tipo de modulos explicando assim

a programaccedilatildeo assiacutencrona em Windows Forms

Modelaccedilatildeo de dados e LINQ - Temos uma explicaccedilatildeo

bottom-to-top da noccedilatildeo de modelaccedilatildeo de dados Sendo nes-

te tema um pouco mais extenso explicando toda a noccedilatildeo da

Modelaccedilatildeo e das Formas Normais Recorre-se ao SQL Ser-

ver para fazer toda a explicaccedilatildeo na praacutetica dos conceitos

sendo bastante ilustrativo com diagramas e screenshots de

um processo de criaccedilatildeo e normalizaccedilatildeo de uma base de

dados Tendo a base de dados criada no SQL Sever passa

agrave explicaccedilatildeo do que eacute o LINQ e sua sintaxe em C Aqui eacute

feita mais uma vez a ponte com Windows Froms utilizando

componentes anteriormente demonstrados mapeando tabe-

las e manipulaccedilotildees baacutesicas Outra vez grande ecircnfase aos

events

C 50 com Visual Studio 2012

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

Sistema Operativo e Input Output Comeccedilando pela base

expotildee passo-a-passo como manipular as Tarefas e Proces-

sos do Windows explicando tambeacutem como colmatar as dife-

renccedilas entre versotildees do sistema operativo Daacute exemplos de

como manipular ficheiros de texto dando uma introduccedilatildeo agrave

encriptaccedilatildeo que vem built-in na NET Mostra como se usa o

Graphics da NET explicando os seus conceitos base dese-

nho e animaccedilatildeo chegando a agrave impressatildeo destes mesmos

graacuteficos desenhados Com este tema aprofunda a explicaccedilatildeo

dos Windows Forms fazendo a ponte para WPF

WPF XML e XAML - Tendo explicado Windows Forms pas-

sa agrave explicaccedilatildeo das diferenccedilas e semelhanccedilas do mesmo

com WPF dando tambeacutem a sua opiniatildeo sobre o futuro das

mesmas dando a entender que WPF iraacute substituir Windows

Forms eventualmente Para o efeito comeccedila por explicar o

que eacute XML dando exemplos de aplicaccedilotildees em C NET para

manipulaccedilatildeo deste tipo de dados passando para um niacutevel

acima o XAML Exemplo atraacutes de exemplo demonstra como

usar as potencialidade do WPF mostrando como usar

Graphics com a sintaxe XAML incluindo animaccedilatildeo

WebViews views modelares e navegaccedilatildeo entre diferentes

ecratildes numa soacute janela

Integraccedilatildeo com Microsoft Office e Windows Store - Eacute

tambeacutem mostrada a facilidade com que se integra uma apli-

caccedilatildeo feita em C comas a principais ferramentas do MS

Office Word Excel PowerPoint Access e Outlook Demons-

tra agrave semelhanccedila de outras ferramentas Microsoft que haacute

sempre uma Class buit-in na NET para criar e manipular

este tipo de documentos da famiacutelia Microsoft No caso da

Windows Store daacute exemplos vocacionados para Windows 8

e como tirar partido do conceito visual Metro e seus layouts

geneacutericos fazendo aplicaccedilotildees como uma calculadora e uma

WebView

Opiniatildeo pessoal - Na minha opiniatildeo este livro eacute ideal no

mundo acadeacutemico servindo perfeitamente como suporte a

um professor para leccionar uma cadeira de programaccedilatildeo

OOP ou ateacute para programaccedilatildeo 2D Tambeacutem natildeo acharia

descabido servir como suporte a um aluno para evoluir da

programaccedilatildeo iterativa para OOP visto que o livro estaacute repleto

de exemplos e exerciacutecios tendo ateacute no final 3 projectos from

scratch de aplicaccedilotildees completas explicando todo o processo

loacutegico na elaboraccedilatildeo de todos os aspectos da mesma de

base de dados normalizada interacccedilatildeo Homem-Maacutequina a

comercializaccedilatildeo na Windows Store

COMUNIDADES Comunidade NetPonto mdash Telerik RadControls - Raacutepida implementaccedilatildeo da

paacutegina Sobre para Windows Phone Apps

COMUNIDADE NETPONTO

44

httpnetpontoorg

Introduccedilatildeo

A Telerik RadControls disponibiliza um projeto template que

permite escolher um conjunto de funcionalidade que seratildeo

incluida no projeto aquando da sua criaccedilatildeo A paacutegina

Sobre eacute uma delas

Truque A Telerik oferece uma versatildeo de teste que permite

explorar os controlos O programa Nokia Premium Developer

permite aos seus membros terem uma licenccedila vaacutelida destes

Ecratildes

Para compreender melhor o que iremos fazer primeiro

iremos criar a paacutegina Sobre que eacute fornecida pelo projeto

template da Telerik cujo resultado eacute

Paacutegina Sobre gerada por omissatildeo pelo projeto template da Telerik

Depois iremos customizar a paacutegina para que esta tenha a

sua proacutepria informaccedilatildeo o resultado seraacute

Customizaccedilatildeo da paacutegina Sobre

Criaccedilatildeo do projeto

Para comeccedilar o projeto eacute recomendado que se instale os

Telerik RadControls (versatildeo de teste)

1 Seleccedilatildeo do projeto que se iraacute criar

Criando o projeto

2 A Telerik tem uma interface para a seleccedilatildeo inicial

Selecione a plataforma e referecircncias da Telerik que

queremos

Selecionando a plataforma e as referecircncias

3 Seleccedilatildeo da funcionalidade paacutegina Sobre

Quando o projeto eacute criado iremos obter a paacutegina por omissatildeo

podemos ver nos ecratildes

TELERIK RADCONTROLS - RAacutePIDA IMPLEMENTACcedilAtildeO DA PAacuteGINA SOBRE PARA WINDOWS PHONE APPS

COMUNIDADE NETPONTO

45

httpnetpontoorg

O resultado da estrutura do projeto seraacute

Customizaccedilatildeo

Comecemos por analisar a paacutegina Home Page

Cujo XAML eacute

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleMainPage xmlns=http schemasmicrosoftcomwinfx2006xaml presentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg

markup-compatibility2006 xmlnsphone= clr-namespaceMicrosoftPhone Controlsassembly=MicrosoftPhone xmlnsshell= clr-namespaceMicrosoft PhoneShellassembly=MicrosoftPhone FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation=Portrait SupportedOrientations=Portrait shellSystemTrayIsVisible=True mcIgnorable=dgt lt-- LayoutRoot is the root grid where all page content is placed --gt ltGrid xName=LayoutRoot Background=Transparentgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt lt-- LOCALIZATION NOTE To localize the displayed strings copy their val-ues to appropriately named keys in the apps neutral language resource file (AppResourcesresx) then replace the hard-coded text value between the attributes quotation marks with the binding clause whose path points to that string name For example Text=Binding Path=LocalizedResourcesApplicationTitle Source=StaticResource LocalizedStrings This binding points to the templates string resource named ApplicationTitle Adding supported languages in the Project Properties tab will create a new resx file per language that can

COMUNIDADE NETPONTO

46

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

carry the translated values of your UI strings The binding in these examples will cause the value of the attributes to be drawn from the resx file that matches the CurrentUICulture of the app at run time --gt lt-- TitlePanel contains the name of the application and page title --gt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=MY APPLICATION gt ltTextBlock xName=PageTitle Margin=9-700 Style=StaticResource PhoneTextTitle1Style Text=page name gt ltStackPanelgt lt-- ContentPanel - place additional content here --gt ltGrid xName=ContentPanel GridRow=1 Margin=120120gt ltListBox Margin=140-120 FontFamily=StaticResource PhoneFontFamilySemiLight FontSize=StaticResource PhoneFontSizeExtraLargegt ltListBoxItem Content=About Tap=GoToAbout gt ltListBoxgt ltGridgt lt-- Uncomment to see an alignment grid to help ensure your controls are aligned on common bound-aries The image has a top margin of -32px to account for the System Tray Set this to 0 (or remove the margin altogether) if the System Tray is hidden Before shipping remove this XAML and the image itself--gt lt-- ltImage Source=AssetsAlignmentGridpng VerticalAlignment=Top Height=800 Width=480 Margin=0 GridRow=0 GridRowSpan=2 IsHit-TestVisible=False gt --gt ltGridgt lt-- Sample code showing usage of ApplicationBar -

-gt ltphonePhoneApplicationPageApplicationBargt ltshellApplicationBar IsMenuEnabled=True IsVisible=Truegt ltshellApplicationBarIconButton IconUri=Imagesappbar_button1png Text=Button 1 gt ltshellApplicationBarIconButton IconUri=Imagesappbar_button2png Text=Button 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBarMenuItem Text=MenuItem 1 gt ltshellApplicationBarMenuItem Text=MenuItem 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBargt ltphonePhoneApplicationPageApplicationBargt ltphonePhoneApplicationPagegt Para navegar para a paacutegina Sobre eacute necessaacuterio clicar na palavra About (tap gesture) o coacutedigo referente eacute ltListBoxItem Content=About Tap=GoToAbout gt E em code behind iremos ter ltsummarygt Navigates to about page ltsummarygt private void GoToAbout(object sender GestureEventArgs e) thisNavigationServiceNavigate(new Uri(Aboutxaml UriKindRelativeOrAbsolute)) Por fim a paacutegina AboutPage seraacute O coacutedigo XAML seraacute ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleAbout xmlns=httpschemasmicrosoftcomwinfx2006xamlpresentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg markup-compatibility2006 xmlnsphone=clr-namespace MicrosoftPhoneControlsassembly=MicrosoftPhone xmlnsshell=clr-namespace

COMUNIDADE NETPONTO

47

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

E o code behind

MicrosoftPhoneShellassembly=MicrosoftPhone xmlnsviewModels=clr-namespace NokiaDevRadControlsSampleViewModels Name=Root FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation= Portrait SupportedOrientations=Portrait dDesignHeight=768 dDesignWidth=480 shellSystemTrayIsVisible=True mcIgnorable=dgt ltGrid xName=LayoutRoot Background=Transparentgt ltGridDataContextgt ltviewModelsCommandSampleViewModel gt ltGridDataContextgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=APP TITLE gt ltTextBlock xName=PageTitle Margin=9-700 Style= StaticResource PhoneTextTitle1Style Text=about gt ltStackPanelgt ltGrid xName=ContentPanel GridRowSpan=2 Margin=12160121gt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition gt ltGridRowDefinitionsgt ltStackPanelgt ltTextBlock Margin=120120 FontFamily= StaticResource PhoneFontFamilySemiBold FontSize= StaticResource PhoneFontSizeLarge Text=Binding ApplicationName ElementName=Root gt ltStackPanel Orientation=Horizontalgt ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Version number gt

ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Binding Version ElementName =Root gt ltStackPanelgt ltStackPanelgt ltTextBlock GridRow=1 Margin=12241224 FontSize=StaticResource PhoneFontSizeNormal Foreground=StaticResource PhoneSubtleBrush TextWrapping=Wrapgt This application show an About page sample for Windows Phone applications ltLineBreak gt See more about it please see the following referenceampquot ltTextBlockgt ltHyperlinkButton GridRow=2 Margin=01200 HorizontalAlignment=Left Command=Binding SendAnEmailCommand Content=technical supportfeedback email FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltHyperlinkButton GridRow=3 Margin=01200 HorizontalAlignment=Left Command=Binding RateThisAppCommand Content=rate this app FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltStackPanel GridRow=4 Margin=1201250 VerticalAlignment= Bottomgt ltImage HorizontalAlignment=Left Source=Images CompanyLogopng Stretch=None gt ltTextBlock Margin=01200 FontSize= StaticResource PhoneFontSizeNormal Text=Copyright (c) 2013 Nokia Developer Wiki gt ltTextBlock FontSize= StaticResource PhoneFontSizeNormal Text=Nokia gt ltStackPanelgt ltGridgt ltGridgt ltphonePhoneApplicationPagegt

public partial class About INotifyPropertyChanged

COMUNIDADE NETPONTO

48

httpnetpontoorg

Nota O exemplo natildeo implementa o padratildeo MVVM mas

poderia

Usa a classe ApplicationManifest do (Cimbalino toolkit - cujo

coacutedigo fornte eacute este)

Usa a classe SendAnEmailCommand que eacute a implementaccedilatildeo

do ICommand e tem como finalidade enviar emails Sendo

utilizado na opccedilatildeo de suporte feedback

Usa a classe RateThisAppCommand que eacute a implementaccedilatildeo

do ICommand e serve para avaliar a aplicaccedilatildeo

Truque Se pretende um exemplo mais avanccedilado consulte o

artigo Paacutegina avanccedilada Sobre para aplicaccedilotildees de Windows

Phone

Referecircncias

Online Help ou download CHM (ZIP 14MB) ()

Telerik Examples - Windows Phone Application ()

Telerik RadControls for Windows Phone ()

Join Nokia Premium Developer Program and get RadControls

for free ()

() Artigos disponiacuteveis apenas em Inglecircs

Em conclusatildeo podemos concluir que existe vaacuterias formas de

implementar numa aplicaccedilatildeo da Windows Phone uma

paacutegina ldquoSobrerdquo ou ldquoAcercardquo sendo um processo que se pode

minimizar e enriquece a aplicaccedilatildeo

Este artigo foi originalmente escrito para a comunidade

Nokia Developer mais especificamente para a Wiki Paacutegina

Acerca de para aplicaccedilotildees de Windows Phone

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltsummarygt The application manifest ltsummarygt private readonly ApplicationManifest _applicationManifest ltsummarygt Initializes a new instance of the ltsee cref=Aboutgt class ltsummarygt public About() InitializeComponent() class that helps to get the application name and version (that is defined in manifest) var applicationManifestService = new ApplicationManifestService() _applicationManifest = applicationManifestService GetApplicationManifest() ltsummarygt The property changed ltsummarygt public event PropertyChangedEventHandler PropertyChanged ltsummarygt Gets the application name ltsummarygt public string ApplicationName get if (_applicationManifest = null) return _applicationManifestAppTitle return ND ltsummarygt Gets the version ltsummarygt public string Version get if (_applicationManifest = null) return _applicationManifestAppVersion return ND ltsummarygt

The on property changed ltsummarygt ltparam name=propertyNamegt The property name ltparamgt protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null) var handler = PropertyChanged if (handler = null) handler(this new PropertyChangedEventArgs(propertyName))

AUTOR

Escrito Por Sara Silva

eacute licenciada em Matemaacutetica ndash Especialidade em Computaccedilatildeo pela Universidade de Coimbra e eacute Microsoft Certified Pro-

fissional Developer Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps O

seu Blog eacute wwwsaramgsilvacom e o twitter eacute saramgsilva

No Code Game Salad

No Code

50

ldquoNuma altura em que as aplicaccedilotildees estatildeo a dominar em

forccedila torna-se imperativo saber programarhelliprdquo E o leitor

tambeacutem tem esta opiniatildeo

Ora neste artigo esta eacute uma ideia que vamos deixar por

terra Se o leitor eacute algueacutem que gosta e se interessa pelo

mundo dos pequenos jogos e por novas tecnologias mas que

natildeo se sente agrave vontade no mundo da programaccedilatildeo pode (e

deve) experimentar o GameSalad Mas por outro lado

mesmo sendo um programador experiente o uso desta

ferramenta pode tambeacutem ajudar bastante

A GameSalad Inc eacute uma empresa norte-americana que

desenvolve ferramentas web para a criaccedilatildeo de pequenos

jogos Fundada em 2007 com o nome de Gendai Games em

2009 lanccedilou o GameSalad Creator e em 2010 mudou

oficialmente o seu nome passando chamar-se GameSalad

O importante para os criadores desta tecnologia eacute a

conceccedilatildeo de uma ideia O Game Salad Creator eacute

principalmente direcionado aos utilizadores que natildeo tecircm

bases em programaccedilatildeo permitindo que qualquer pessoa

possa fazer o seu proacuteprio jogo 2D para plataformas moacuteveis

IOS Android ou jogos HTLM5 para browsers Com uma

interface limpa e relativamente simples este software utiliza

o sistema ldquodrag-and-droprdquo para desenvolver os seus jogos

ou seja desde que tenhamos uma ideia em mente podemos

facilmente pocirc-la em praacutetica arrastando os componentes da

mesma para o ldquopalco de jogordquo

Assim facilmente o leitor pode definir as imagens de fundo

das vaacuterias cenas que compotildeem o jogo e todos os

intervenientes dessas cenas satildeo chamados ldquoAtoresrdquo em que

o comportamento destes ldquoAtoresrdquo eacute definido por regras de

jogo (eventos) que o proacuteprio utilizador define Eacute tudo uma

questatildeo de loacutegica e eacute o utilizador que define essa loacutegica Por

exemplo podemos definir eventos especiacuteficos como colisotildees

e definir o que o ldquoatorrdquo deve fazer quando ocorre uma

colisatildeo isto eacute se deve mudar de rumo e perder pontos ou se

deve ser destruiacutedo perdendo uma vida por exemplo Tudo

se baseia na nossa escolha

Podemos tambeacutem adicionar a banda sonora a nosso gosto e

para verificar o comportamento real da nossa aplicaccedilatildeo

basta-nos apenas recorrer ao simulador que o GameSalad

Creator nos disponibiliza Natildeo precisamos de ter o

equipamento real para o qual estamos a projetar o nosso

jogo

O site principal deste projeto wwwgamesaladcom em pouco

tempo atingiu milhares de utilizadores um pouco por todo o

mundo Inicialmente projetado para desenvolver aplicaccedilotildees

apenas para dispositivos Apple hoje em dia eacute tambeacutem

possiacutevel fazer o download da versatildeo Windows A versatildeo

base eacute gratuita e permite a qualquer interessado publicar os

seus jogos para a versatildeo web e para a versatildeo MAC Caso

prefira a versatildeo paga o GameSalad Creator Pro permite tudo

isto e tambeacutem publicar os seus projetos para a plataforma

Android e para o Windows 8 aleacutem de outros extras Caso

opte por ter uma conta premium pode ainda publicar no

mercado de aplicaccedilotildees escolhendo se quer disponibilizar

gratuitamente o seu jogo ou natildeo Caso opte disponibilizar

uma versatildeo paga do jogo que desenvolveu o utilizador tem

direito a 70 do ganho obtido pelo seu jogo

Este projeto tem tambeacutem atraveacutes do proacuteprio site uma grande

comunidade de utilizadores que partilham ideias e

experiecircncias ajudando-se mutuamente em vaacuterios projetos

Tem uma ideia para um jogo Entatildeo estaacute na altura de a por

em praacutetica Saber programar deixou de ser um requisito com

a ajuda do GameSalad Creator aproveite e decirc largas agrave

imaginaccedilatildeo

Game Salad

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

Elege o melhor artigo desta ediccedilatildeo

Revista PROGRAMAR httptinyccProgramarED41_V

No Code

52

Esta foi a aplicaccedilatildeo vencedora do concurso de aplicaccedilotildees

que se realizou no 1ordm Evento Presencial da Comunidade

Portugal-a-Programar Trata-se de um jogo para Windows

Phone 7x e 8 bastante interessante e ateacute ldquovicianterdquo para

quem gosta de jogos do tipo puzzle

Os pequenos Bits estatildeo em perigo e soacute vocecirc pode ajudaacute-los

Bits satildeo uma espeacutecie muito especial de aves encontradas

em uma ilha remota E eles precisam chegar ao seu ninho

a fim de criar seus filhos Mas os bits das Trevas estatildeo com

ciuacutemes e vatildeo tentar tudo ao seu alcance para impedir os Bits

de chegar ao ninho

Bits eacute um jogo de quebra-cabeccedilas fantaacutestico onde vocecirc tem

de combinar habilidade com sorte para ajudar os Bits a

sobreviver Combine trecircs Bits da mesma cor para ganhar

pontos enquanto os Bits prestos ldquoevilrdquo tentam detecirc-los Os

ldquoAnjos Bitsrdquo (brancos) podem salvar os Bits de cor destruindo

os Bits Pretos proacuteximos

PROJECTO EM DESTAQUE NA COMUNIDADE PP LITTLE BITS

PASSATEMPO

DESENVOLVIMENTO

WINDOWS 8

A comunidade Portugal a Programar com o apoio da Microsoft estaacute a criar um passatempo de desen-

volvimento de aplicaccedilotildees para Windows 8 exclusivamente para membros registados na comunidade

Desenvolve uma ou mais aplicaccedilotildees para o Windows 8 e ganha fantaacutesticos preacutemios

1 MOCHILA APP ME UP PARA TODOS os que publiquem uma App na Windows 8 Store

2 TELEFONES NOKIA LUMIA 820 (Dev Edition) para os primeiros 2 a publicarem 3 Apps na

Windows 8 Store

1 TABLET ASUS ME400C para a melhor App publicada e 1 NOKIA LUMIA 820 para a segun-

da melhor aplicaccedilatildeo

Satildeo vaacutelidas apenas aplicaccedilotildees publicadas entre 1 e 30 de Junho de 2013

Todos os estudantes tecircm acesso gratuito agrave Windows Store atraveacutes do programa DreamSpark e por is-

so natildeo haacute motivos para natildeo concorrer Mais informaccedilotildees e candidaturas atraveacutes do email passatem-

posportugal-a-programarpt

Alguns recursos interessantes para iniciar

Windows 8 Store Apps - Do sonho agrave realidade (revista PROGRAMAR)

Microsoft DreamSpark Windows 8 Apps development

Windows App (MSDN)

O staff da comunidade seraacute o juacuteri que iraacute escolher a melhor aplicaccedilatildeo a concurso e o vencedor seraacute divul-

gado na primeira quinzena de Julho Para atribuiccedilatildeo do Tablet Asus ME400C eacute necessaacuterio existirem no

miacutenimo 3 aplicaccedilotildees a concurso Qualquer caso omisso seraacute resolvido pelo staff da comunidade natildeo sen-

do passiacutevel de recurso e o juri iraacute rever e validar todas as aplicaccedilotildees de modo a que tenham um minimo de

qualidade e originalidade

Veja tambeacutem as ediccedilotildees anteriores da Revista PROGRAMAR

e muito mais em hellip wwwrevista-programarinfo

34

ordf Ed

iccedilatilde

o - A

bril 2

01

2

35

ordf Ed

iccedilatilde

o - J

un

ho

201

2

36

ordf Ed

iccedilatilde

o - A

go

sto

20

12

37

ordf Ed

iccedilatilde

o - O

utu

bro

20

12

38

ordf Ed

iccedilatilde

o - D

ezem

bro

20

12

39

ordf Ed

iccedilatilde

o - F

eve

reiro

20

13

Page 5: Revista Programar 41

TEMA DE CAPA Introduccedilatildeo ao Java EE e Java Web

TEMA DA CAPA

7

Java Enterprise Edition

A plataforma Java Enterprise Edition ou Java EE eacute uma pla-

taforma da Oracle que fornece uma API adicional ao Java

SE para o desenvolvimento e execuccedilatildeo de aplicaccedilotildees java

do tipo empresarial focadas nos serviccedilos de rede e Web

Vindo do Java Professional Edition o nome que foi anuncia-

do em Maio de 98 foi a partir dos finais de 1999 que ficou

com o nome de Java EE incluindo tecnologias como Java

Database Connectivity (JDBC) Java Servlet JavaServer

Pages (JSP) Enterprise JavaBeans JavaMail etc

CONCEITOS

Aplicaccedilatildeo Web Java

Uma aplicaccedilatildeo Java Web gera paacuteginas Web interactivas

contendo vaacuterios tipos de markup languages (HTML XML

etc) e conteuacutedo dinacircmico Eacute tipicamente composto por ele-

mentos Web tais como JavaServer Pages (JSP) Servlets e

JavaBeans para modificar e temporariamente armazenar

dados interagir com bases de dados e serviccedilos Web geran-

do conteuacutedo em resposta aos pedidos do cliente

JSP (JavaServer Pages)

JavaServer Pages eacute uma tecnologia usada no desenvolvi-

mento de aplicaccedilotildees Web Java semelhante ao PHP Possui

compatibilidades com outras soluccedilotildees Java como a Servlet

corre em servidores como o Apache Tomcat e o GlassFish

Ao contraacuterio dos tiacutepicos jarrsquos os arquivos deste tipo de imple-

mentaccedilotildees satildeo ear ou war (Web Archive)

As paacuteginas Web dinacircmicas java aceitam HTML CSS Ja-

vascript tudo que possam incluir no um ficheiro normal

HTML natildeo necessitam de compilaccedilatildeo preacutevia isso fica ao

cargo do servidor Web de traduzir as linhas de coacutedigo em

Java para o browser compreender

Qualquer coacutedigo Java inserido nos ficheiros JSP deve ficar

entre as tags

lt Code gt (para inserccedilatildeo de coacutedigo)

lt=var gt (para a expressatildeo de uma variaacutevel)

Introduccedilatildeo ao Java EE e Java Web ltpage gt (para importar include para incluir

uma paacutegina JSP ou HTML externa)

Servlet

Eacute uma tecnologia Java que permite gerar dados em HTML e

XML Incluiacuteda na biblioteca javaxservlet permite processar

pedidos e respostas vindas de JSP e serve como uma exten-

satildeo do servidor Web Neste caso vamos usar a HttpServlet

onde a sua funccedilatildeo seraacute processar pedidos das JSP resolver

os pedidos e enviar uma resposta

XML

XML (Extensible Markup Language) subtipo da SGML foi

criada pela W3C com o objectivo de ser usado como formato

de configuraccedilatildeo entre vaacuterias linguagens atraveacutes da internet

Ex

Neste caso em particular o ficheiro XML que vamos criar

editar na configuraccedilatildeo de uma aplicaccedilatildeo Java Web eacute o

webxml que tem como tags mais usa das as seguintes

lt gt agrave define comentaacuterios

ltweb-app id version xmlns gt agrave define o tipo do XML

a versatildeohellip

ltdisplay-namegt agrave define o nome

ltservletgt agrave define uma servlet

ltxml version=10 encoding=iso-8859-1 encoding=iso-8859-1gt ltreceita nome=patildeo tempo_de_preparacao=5 min tempo_de_cozedura=1horagt ltingredientesgt ltingrediente quantidade=4 unidade=chavenasgtFarinhaltingredientegt ltingrediente quantidade=7 unidade=gramasgtFermentoltingredientegt ltingrediente quantidade=15 unidade=chavenasgtAgualtingredientegt ltingrediente quantidade=1 unidade=colheresgtSalltingredientegt ltingredientesgt ltinstrucoesgt ltpassogtMisturar tdos os ingredientesltpassogt ltpassogtCobrir com um pano e deixar repousar uma hora agrave temperatura ambienteltpassogt ltpassogtMisturar novamente e colocar ao forno ateacute ao fim da cozeduraltpassogt ltinstrucoesgt ltreceitagt

TEMA DA CAPA

8

ltservlet-namegt agrave define o nome da servlet

ltservlet-classgt agrave aponta o caminho da servlet na apli-

caccedilatildeo

ltload-on-startupgt agrave quando o valor for 1 a servlet

seraacute inicializada no inicio da aplicaccedilatildeo

ltservlet-mappinggt agrave caso a servlet efectue operaccedilotildees

requeridas por elementos externos

ltservlet-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltservletgt

lturl-patterngt agrave define um url para a servlet

ltfiltergt agrave semelhante agrave tag ltservletgt com a diferenccedila

de que esta permite enquadrar uma classe de filtro na

aplicaccedilatildeo que permita a existecircncia de sessotildees na

aplicaccedilatildeo Web ou qualquer segmento de coacutedigo que

necessite de ser constantemente executado

ltfilter-namegt agrave define o nome da classe filtro

ltfilter-classgt agrave aponta o caminho da class na aplica-

ccedilatildeo

ltfilter-mappinggt agrave sempre necessaacuterio definir para

uma classe filtro

ltfilter-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltfiltergt

lturl-patterngt agrave para possuir o efeito de filtro o url seraacute

todos os existentes ou seja

lterror-pagegt agrave tag existente para definir paacuteginas de

erro que sejam geradas pelo web server e que pos-

sam ocorrer na aplicaccedilatildeo

lterror-codegt agrave define o tipo de coacutedigo de erro gerado

pelo web server (404-page not found 500-internal

server errorhellip)

ltlocationgt agrave localiza a paacutegina de erro personalizada

dentro da aplicaccedilatildeo

Estrutura de uma aplicaccedilatildeo Web Java

O exemplo que vai ser aqui apresentado seraacute montado num

Web Archive (ficheiro war) que poderaacute depois ser colocado

num servidor Web sendo os mais conhecidos o Apache

Tomcat e o Oracle Glassfish Ambos disponiacuteveis gratuita-

mente e no pacote de Java EE do IDE NetBeans que os ins-

tala em modo desenvolvimento na maacutequina local

Nota As aplicaccedilotildees necessaacuterias para a criaccedilatildeo deste exem-

plo satildeo o Java Runtime Environment (JRE) o Java Deve-

lopment Kit (JDK) e o IDE NetBeans

A estrutura normal de uma aplicaccedilatildeo java desta natureza

tem por norma a seguinte estrutura

O ficheiro WAR criado se o abrirmos tem uma estrutura de

pastasficheiros orientada ao modelo de desenvolvimento

MVC (Model-view-controller) onde a View estaacute incluiacuteda dire-

tamente na raiz do projeto onde se pode encontrar as paacutegi-

nas JSP e HTML acompanhadas pelos devidos ficheiros

JavaScript e CSS necessaacuterios Caso haja ausecircncia de um

Deployment Descriptor (ficheiro de configuraccedilatildeo referente a

uma determinada aplicaccedilatildeo que neste caso seraacute o webxml)

o servidor Web procura sempre por um indexjsp como paacutegi-

na inicial

Dentro da pasta WEB-INF estatildeo todas as classes bibliote-

cas ficheiros de configuraccedilatildeo e servlets necessaacuterias para

processar a informaccedilatildeo mostrada pelas JSPs

Em suma ter-se-aacute entatildeo algo deste geacutenero

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

9

Nota Nesta estrutura optou-se por colocar as paacuteginas dinacirc-

micas debaixo do WEB-INF pois uma vez que podemos usar

as servlets para controlar o que se deve ou natildeo ser mostrado

perante os pedidos vindos do cliente Isto torna a aplicaccedilatildeo

mais segura na questatildeo de mapeamento de URLs

Desenvolvimento

Neste exemplo vai-se usar o IDE NetBeans pois eacute aquele

que a Oracle recomenda encontra-se disponiacutevel para Win-

dows Linux Solaris e Mac OS X sendo mais simples de

configurar O NetBeans encontra-se disponiacutevel para downlo-

ad no proacuteprio site e no site da Oracle como complemento do

Java Development Kit 7 (Ver bibliografia)

Primeiros passos

Para dar iniacutecio agrave construccedilatildeo da nossa aplicaccedilatildeo Java Web

no NetBeans basta ir a File ndash New Project e aparece-nos a

seguinte janela

E vamos selecionar Java Web ndash Web Application Em se-

guida definimos a localizaccedilatildeo e o nome da nossa aplicaccedilatildeo

Dando o nome de Teste a esta aplicaccedilatildeo no passo seguinte

o nome que foi atribuiacutedo eacute automaticamente dado como

Context Path ou seja a aplicaccedilatildeo iraacute ser identificada no De-

ployment descriptor como Teste e uma vez colocada no servi-

dor teraacute o seguinte URL httphostnameportTeste

Neste exemplo vamos usar para o servidor GlassFish da Ora-

cle a versatildeo 6 do Java EE e o IDE Netbeans

O servidor escolhido pode ser posteriormente alterado caso

queira-se testar a aplicaccedilatildeo noutros ambientes contudo eacute de-

sencorajado a alteraccedilatildeo da versatildeo sem primeiro verificar a

existecircncia de possiacuteveis incompatibilidades com coacutedigo e biblio-

tecas que estejam a ser usadas O uacuteltimo seraacute ignorado uma

vez que este exemplo que vamos criar natildeo vai possuir nenhum

framework

Uma vez concluiacutedo todos os passos verificamos que automati-

camente o IDE criou-nos uma estrutura com uma paacutegina in-

dexjsp na raiz uma pasta WEB-INF vazia e atalhos para a

pasta de sources bibliotecas e de ficheiros de configuraccedilatildeo

com o tradicional MANIFESTMF criado

A estrutura visiacutevel natildeo corresponde agrave estrutura real de diretori-

as para se visualizar isso basta ir ao separador Files situado eacute

esquerda como mostra a imagem seguinte

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

10

Caso natildeo esteja criado o atalho pode-se sempre aceder indo

agrave opccedilatildeo Window ndash File abrindo o separador e recolocando o

atalho

Numa breve comparaccedilatildeo pode-se verificar que o NetBeans

cria determinados ficheiros e diretorias referentes ao projeto

(bluidxml e nbproject) e onde na estrutura do projeto a pasta

Web Pages tem referecircncia agrave pasta web e a Source Packa-

ges tem referecircncia agrave pasta src Todos os ficheiros de confi-

guraccedilatildeo ficam dentro da pasta WEB-INF e no caso da pasta

Libraries o seu conteuacutedo eacute um conjunto de atalhos cuja sua

localizaccedilatildeo pode ser referenciada a quaisquer pastas exter-

nas ao projeto No entanto recomenda-se criar uma pasta lib

debaixo de WEB-INF com as bibliotecas a ser usadas pela

aplicaccedilatildeo para evitar erros originados por utilizaccedilatildeo do mes-

mo ficheiro de biblioteca por mais do que um projeto e para

facilitar a passagem do projeto para outro ambiente ou ma-

quina pois assim basta soacute passar a pasta com o projeto sem

haver preocupaccedilotildees com importaccedilatildeo de bibliotecas

Criaccedilatildeo de uma JSP

Se abrirmos a paacutegina JSP criada pelo IDE ela vai ter um

aspecto semelhante a este

Uma vez que esta paacutegina tem o nome de index caso seja

feito o deploy da aplicaccedilatildeo a mesma vai apresentar uma

paacutegina de fundo branco com o tiacutetulo JSP Page e a frase Hel-

lo World

Para realizar o deploy da aplicaccedilatildeo basta carregar sobre o

botatildeo de play situado no painel de topo do IDE Netbeans ou

entatildeo ir a Run ndash Run Project

Caso o nome da paacutegina seja alterado e natildeo exista nenhuma

paacutegina com o nome index o servidor natildeo consegue encon-

trar nenhuma paacutegina inicial Entatildeo em seguida vamos alterar

o nome da nossa paacutegina inicial para homejsp e vamos con-

figurar o nosso webxml de maneira a criarmos um filtro de

sessatildeo que vai definir que o servidor no arranque da mesma

redirecionar-se para uma determinada servlet

Para tal se formos agrave opccedilatildeo de File ndash New Filehellip na secccedilatildeo

Web selecionar o tipo de ficheiro Standard Development

Descriptor (webxml)

Uma vez criado o ficheiro teraacute o seguinte conteuacutedo por defei-

to

Temos agora o ficheiro webxml onde poderemos colocar as

nossas referecircncias agraves servlets que vamos criar atribuindo-

lhes um url pattern a fim de poderem ser acedidas

Para natildeo termos trabalho o IDE por si soacute resolve todas as

tags que necessitamos de colocar no webxml na altura em

que criamos uma servlet caso natildeo seja resolvido pelo IDE

Para mapearmos a servlet WelcomeServlet no package

mainservlet com o url pattern Welcome o que deveria de ser

colocado seria algo deste geacutenero (ver as tags fornecidas)

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtJSP Pagelttitlegt ltheadgt ltbodygt lth1gtHello Worldlth1gt ltbodygt lthtmlgt

ltxml version=10 encoding=UTF-8gt ltweb-app xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=httpjavasuncomxml nsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsd version=30gt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

ltxml version=10 encoding=UTF-8gt ltweb-app version=30 xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=

TEMA DA CAPA

11

Mas natildeo eacute necessaacuterio escrever estas tags ateacute porque o Net-

Beans natildeo permite a criaccedilatildeo de servlets que jaacute possuam refe-

recircncias no webxml como tal o que podemos fazer eacute ir a opccedilatildeo

File ndash New Filehellip e dentro do Web selecionar Servlet

Em seguida o IDE vai recomendar a natildeo criar classes na raiz

dos packages e como tal vamos preencher o campo Package

com mainservlet e como nome WelcomeServlet

Dado o passo seguinte o IDE automaticamente cria a estru-

tura dos packages introduzidos e apresenta o formulaacuterio de

configuraccedilatildeo da servlet

Carregando sobre a check box e alterando o URL Pattern

para Welcome teremos automaticamente criado as tags

pretendidas no webxml

Uma vez criada a servlet vem com os meacutetodos herdados de

HttpServlet doGet() e doPost() implementados e com um

meacutetodo chamado processRequest() que envia coacutedigo

HTML O que vamos fazer eacute apagar este meacutetodo e colocar a

vazio o meacutetodo doPost() e introduzir a seguinte linha no

meacutetodo doGet()

Com esta linha criada e uma vez chamada a servlet que por

defeito responde por GET o pedido vai ser reencaminhado

para a nossa paacutegina criada homejsp

Fazendo deploy coloca-se o URL httplocalhost8080Teste

Welcome e verifica-se que a nossa servlet estaacute a fazer o

reencaminhamento para a nossa paacutegina inicial

Como proacuteximo passo vamos enviar variaacuteveis para uma ser-

vlet onde a mesma iraacute processar e enviar uma resposta En-

tatildeo o que se pretende eacute tomando os mesmos passos de cria-

ccedilatildeo da WelcomeServlet vamos criar a SomaServlet com o

seguinte coacutedigo

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

httpjavasuncomxmlnsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsdgt ltservletgt ltservlet-namegtWelcomeServletltservlet-namegt ltservlet-classgtmainservletWelcomeServlet ltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtWelcomeServletltservlet-namegt lturl-patterngtWelcomelturl-patterngt ltservlet-mappinggt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

getServletContext()getRequestDispatcher( homejsp)forward(request response)

package mainservlet import javaioIOException import javaxservletServletException import javaxservlethttpHttpServlet import javaxservlethttpHttpServletRequest import javaxservlethttpHttpServletResponse public class SomaServlet extends HttpServlet public static final String TEXTO = texto public static final String VALOR_1 = valor1 public static final String VALOR_2 = valor2 public static final String RESULTADO = resultado

TEMA DA CAPA

12

E para interagirmos com a servlet vamos criar as paacuteginas so-

majsp e resultadojsp onde mais uma vez vamos ao menu

File ndash New Filehellip selecionamos JSP e preenchemos o nome

sem a extensatildeo no campo File Name

somajsp

Com o objectivo de evitar erros a servlet possui constantes

que permitem que haja uma coerecircncia entre as variaacuteveis envia-

das e recebidas com o objectivo de evitar errosPode-se ob-

servar que a servlet uma vez iniciada envia uma variaacutevel atra-

veacutes de requestsetAttribute() Uma vez chamado o setAttri-

bute() requer 2 paracircmetros

requestsetAttribute(NomeDoAtributo UmObjectoQQ)

O primeiro paracircmetro como descrito atribui um nome sen-

do esse o nome que deve ser usado nas paacuteginas JSP para

puderem capturar a variaacutevel enviada que se vai encontrar

descrita no segundo paracircmetro que por sua vez eacute sempre

convertida da servlet para object Como tal teve que ser

efectuado o cast do objecto agrave chegada para o tipo de variaacute-

vel que tinha antes de ser enviada

String atributo = (String) requestgetAttribute

(NomeDoAtributo)

(Recepccedilatildeo do atributo)

Caso o que se pretenda seja o contraacuterio enviar variaacuteveis no

sentido JSP agrave Servlet a paacutegina JSP deve de conter um for-

mulaacuterio HTML com o meacutetodo que se pretende POST ou

GET e na action o URL pattern da servlet em questatildeo E os

nomes dos inputs satildeo as referecircncias que a servlet usa para

receber as variaacuteveis das paacuteginas JSP variaacuteveis essas quem

vecircm como String e como tal devem de ser convertidas para o

tipo desejado (Como demonstrado no coacutedigo acima referi-

do) Vamos entatildeo testar acedendo ao URL http

localhost8080TesteSoma

Porem a aplicaccedilatildeo funciona mas apenas mostra paacuteginas

caso as mesmas sejam escritas no URL pois uma vez que

renomeamos o indexjsp para homejsp natildeo existe de mo-

mento nenhuma paacutegina inicial ou seja caso escrevesse-

mos httplocalhost8080Teste a aplicaccedilatildeo natildeo vai mostrar

nenhuma paacutegina

Para solucionarmos esse problema vamos entatildeo criar um

filtro que remeta para uma determinada servlet filtro esse

que vai aguardar que uma determinada variaacutevel se altere de

estado para desbloquear as restantes paacuteginas Com este

tipo de classes podemos definir niacuteveis de acesso dentro da

nossa aplicaccedilatildeo restringindo a mesma quando certas variaacute-

veis natildeo forem validadas ou natildeo se encontram com o valor

pretendido (por exemplo um determinado nome de utilizador

e palavra chave)

Vamos entatildeo novamente a File ndash New Filehellip e seleciona-

mos Filter

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

Override protected void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException requestsetAttribute(TEXTO Insira 2 numeros e submeta para obter o resultado) getServletContext()getRequestDispatcher (somajsp)forward(request response) Override protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException int resultado try int val1 = IntegerparseInt (requestgetParameter(VALOR_1)) int val2 = IntegerparseInt (requestgetParameter(VALOR_2)) resultado = val1 + val2 requestsetAttribute(RESULTADO +resultado) catch (NumberFormatException e) requestsetAttribute(RESULTADO Valores natildeo validos) getServletContext()getRequestDispatcher (resultadojsp)forward(request response)

ltpage import=mainservletSomaServletgt ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lt String texto = (String) requestgetAttribute (SomaServletTEXTO)gt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtSomalttitlegt ltheadgt ltbodygt lth2gtlt=textogtlth2gt ltform action=Soma method=POSTgt Valor 1ltinput type=text name= lt=SomaServletVALOR_1gtgt Valor 2ltinput type=text name= lt=SomaServletVALOR_2gtgt ltbrgt ltinput type=submit name=submitgt ltformgt ltbodygt lthtmlgt

TEMA DA CAPA

13

caccedilatildeo e restriccedilatildeo de acessos os filtros permitem a execuccedilatildeo

de certas linhas de coacutedigo que mantecircm estados numa aplica-

ccedilatildeo e eacute o siacutetio ideal para colocar a parte do coacutedigo da aplica-

ccedilatildeo que manipula variaacuteveis de sessatildeo

Apoacutes criar-se a classe do tipo Filter ignorando o coacutedigo ge-

rado o filtro deveraacute possuir o seguinte coacutedigo

Uma vez criado o filtro este vai redirecionar todos os pedidos

agrave aplicaccedilatildeo para a WelcomeServlet enquanto a variaacutevel

validSession estiver a NULL como tal na servlet Welcome-

Servlet coloca-se a seguinte linha

requestgetSession()setAttribute(UrlFilterSESSION

gotSession)

Assim que o filtro passar pela WelcomeServlet a variaacutevel

validSession vai deixar de estar a NULL colocando o filtro a

fazer um encadeamento com os restantes pedidos que apa-

recerem

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

No seguinte passo vamos atribuir o nome de UrlFilter e coloca

-lo num novo package mainfilter

Semelhante ao passo de criaccedilatildeo do mapeamento das servlets

no webxml o IDE igualmente cria automaticamente um mape-

amento do filtro no ficheiro XML contudo o coacutedigo gerado eacute

ligeiramente diferente (Ver referecircncia de tags do webxml)

Apoacutes dar seguinte neste passo e natildeo preencher nada no proacutexi-

mo o IDE gera uma classe filtro por defeito e gera o seu mape-

amento no webxml semelhante a

Muito semelhante ao que se vai encontrar num mapeamento

de uma servlet apenas com a diferenccedila do nome das tags de

servlet para filter e o seu mapeamento seraacute muacuteltiplo para todos

os URLs que se deseja correr um determinado filtro antes de

haver o redireccionamento Uacuteteis para criar poliacuteticas de autenti-

ltfiltergt ltfilter-namegtUrlFilterltfilter-namegt ltfilter-classgtmainfilterUrlFilter ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtUrlFilterltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt

package mainfilter import javaioIOException import javaxservlet import javaxservlethttp public class UrlFilter implements Filter FilterConfig filterConfig public static final String SESSION = session Override public void doFilter(ServletRequest req ServletResponse resp FilterChain chain) throws IOException ServletException if (req instanceof HttpServletRequest) String path = ((HttpServletRequest) req)getServletPath() HttpSession session = ((HttpServletRequest) req)getSession(false) boolean sessionValidator = false if (session = null) String validSession = (String) sessiongetAttribute(SESSION) if (validSession = null) sessionValidator = true if (pathequals(Welcome) ampamp sessionValidator) ((HttpServletResponse) resp)sendRedirect(filterConfiggetServletContext ()getContextPath() + Welcome) else chaindoFilter(req resp) Override public void init(FilterConfig filterConfig) thisfilterConfig = filterConfig Override public void destroy()

TEMA DA CAPA

14

Apoacutes implementado quando se aceder agrave aplicaccedilatildeo pelo URL

apontado para a raiz (httplocalhost8080Teste) o servidor

com conhecimento da existecircncia de um filtro vai chama-lo para

cada vez que o cliente acede a qualquer servlet ou JSP

Para finalizar este exemplo vamos soacute criar um link na paacutegina

homejsp que nos vai apontar para a paacutegina somajsp atraveacutes

da SomaServlet

lta href=SomagtSomarltagt

Dentro da aplicaccedilatildeo os URL pattern que foram definidos no

webxml servem igualmente para os links HTML chamando

sempre o meacutetodo doGet() da servlet

Conclusatildeo

Este artigo mostra numa forma introdutoacuteria como se pode criar

uma aplicaccedilatildeo Java com uma interface Web tendo em conta

que as capacidades do Java EE e das suas bibliotecas nome-

adamente Servlets Filters e as configuraccedilotildees necessaacuterias para

criar uma aplicaccedilatildeo Web baacutesica com conceitos adicionais de

XML( no seu geral) JSP e MVC

BibliografiaReferecircncias

httpwwworaclecomtechnetworkjavajavasedownloads

jre7-downloads-1880261html

httpwwworaclecomtechnetworkjavajavaeedownloads

indexhtml

httpsnetbeansorgfeaturesindexhtml

httpenwikipediaorgwikiJava_EE_version_history

httpwwwjsptutcom

httpsdevelopersgooglecomappenginedocsjavaconfig

webxml

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

A PROGRAMAR Programaccedilatildeo em C const

Jogo da Vida

JBoss Aplication Server 7

PHP Uma framework ldquofrom scratchrdquo (Parte 1)

A PROGRAMAR

16

Uma das ldquorecentesrdquo adiccedilotildees agrave linguagem C foi o qualificador

const Ao contraacuterio do que se possa pensar utilizar const

natildeo cria uma constante mas sim uma variaacutevel soacute-de-leitura

O que queremos dizer com isto Vejamos o seguinte exem-

plo

Qual o valor de i apoacutes execuccedilatildeo da linha 4 Embora possa

parecer estranho i vai ter o valor 73 apesar de termos de-

clarado i como constante Por este motivo variaacuteveis qualifi-

cadas com const natildeo satildeo constantes verdadeiras em C (satildeo-

no em C++) e natildeo podem por este motivo ser utilizadas em

certos lugares como a definiccedilatildeo do tamanho de arrays ou

em cases de um switch (excepto com extensotildees dos compi-

ladores)

De que nos serve entatildeo um qualificador const se natildeo asse-

gura que a variaacutevel permanece inalterada Bem a utilizaccedilatildeo

de const para qualificar variaacuteveis impede de facto a sua

alteraccedilatildeo na maioria dos casos Natildeo podemos alterar i direc-

tamente por exemplo (ie i = 73 emite um erro) No exemplo

apresentado acima enganaacutemos o compilador (linha 2) com o

cast de ampi para o tipo int sem cast um compilador bem

configurado emitiraacute pelo menos um aviso de que o qualifica-

dor const eacute descartado na atribuiccedilatildeo de ampi a ptr um pequeno

sinal de alarme para o programador (eacute soacute estar atento)

Podemos como referido acima qualificar uma variaacutevel com

const e impedir que seja alterada directamente Se tentar-

mos apontar um apontador a essa variaacutevel o compilador

avisa-nos que a qualificaccedilatildeo de const seraacute perdida e pode-

mos alterar a variaacutevel atraveacutes do apontador Haveraacute maneira

de impedir que isto aconteccedila Na realidade a questatildeo eacute

outra como utilizar o qualificador const com apontadores

Existem 4 formas de qualificar um apontador com const

obtendo-se diferentes niacuteveis de acesso de leitura eou escri-

ta da variaacutevel apontada atraveacutes do mesmo Para que natildeo

existam duacutevidas eacute importante reter que o qualificador const

qualifica uma variaacutevel e natildeo um local na memoacuteria Por outras

palavras (e recorrendo ao exemplo inicial) qualificar i como

const soacute impedir a alteraccedilatildeo do valor atraveacutes da variaacutevel i

Quando apontamos um apontador ao endereccedilo de i pode-

mos fazer o que quisermos com o valor laacute armazenado inde-

pendentemente de como i foi declarado

A primeira forma de usar const num apontador eacute surpreen-

dentemente natildeo usar const num apontador Na realidade

(obviamente) esta natildeo eacute uma utilizaccedilatildeo do qualificador const

Programaccedilatildeo em C const mas este artigo natildeo estaria completo sem se falar dela Um

apontador simples de forma tipo p permite-nos fazer vaacuterias

coisas podemos apontaacute-lo a qualquer local da memoacuteria que

queiramos e desde que apontado a um endereccedilo vaacutelido

podemos alterar o valor aiacute armazenado com o operador de

indirecccedilatildeo (eg p = 3) Este tipo de apontador natildeo apresenta

restriccedilotildees nenhumas (por esse motivo eacute que o compilador

emite um aviso quando tentamos apontaacute-lo a uma variaacutevel

const excepto na presenccedila de casts)

Segue-se entatildeo a criaccedilatildeo de um apontador para uma variaacute-

vel constante Este tipo de apontador apresenta uma particu-

laridade embora seja possiacutevel apontaacute-lo a qualquer endere-

ccedilo de memoacuteria natildeo eacute possiacutevel utilizar este apontador para

alterar o conteuacutedo do endereccedilo apontado Logicamente este

era o tipo de apontador que precisaacutevamos no exemplo inici-

al se temos uma variaacutevel constante queremos apontar para

ela com um apontador para uma variaacutevel constante

Se lermos a declaraccedilatildeo de ptr da direita para a esquerda

tudo faz sentido ptr eacute um apontador () para um const int E

de facto i eacute um const int tudo parece bem Quando tentamos

modificar o valor apontado por ptr o compilador emite um

erro queixa-se que estamos a tentar atribuir um valor a uma

variaacutevelendereccedilo soacute de leitura Este era o comportamento

que procuraacutevamos inicialmente

Passemos agora para a terceira forma de usar const com

apontadores Uma espeacutecie de ldquoinversordquo de um apontador

para uma variaacutevel constante eacute um apontador constante para

uma variaacutevel (natildeo constante) A diferenccedila do anterior para

este eacute que agora passamos a conseguir alterar o valor apon-

tado (por outras palavras ptr = 73 passa a ser possiacutevel)

mas natildeo nos eacute possiacutevel apontar ptr para outra variaacutevel

Uma vez mais da direita para a esquerda ptr eacute um aponta-

dor constante ( const) para um int Podemos utilizar ptr agrave

vontade para modificar o valor de 42 para 73 mas eacute-nos

impossiacutevel alterar o endereccedilo para o qual ptr aponta Este

tipo de apontadores eacute uacutetil quando nos queremos assegurar

de que natildeo haacute alteraccedilotildees acidentais do local para onde um

apontador aponta Um pormenor importante sendo ptr um

apontador cujo endereccedilo natildeo pode ser alterado devemos

1 const int i = 42 2 int ptr = (int)ampi 3 4 ptr = 73

1 const int i = 42 2 const int ptr = ampi 3 4 ptr = 73 erro

1 const int i = 42 2 int const ptr = ampi 3 4 ptr = 73 ok 5 ptr = NULL erro

A PROGRAMAR

17

apontaacute-lo para onde queremos no momento da sua declara-

ccedilatildeo sob pena de ficar apontado para um local aleatoacuterio sem

possibilidade de alteraccedilatildeo

A quarta (e uacuteltima) forma de utilizar const num apontador eacute

como devem ter imaginado a combinaccedilatildeo das duas uacuteltimas

um apontador constante para uma variaacutevel constante Este eacute

o tipo de apontador mais limitado de todos uma vez que a

uacutenica coisa que podemos fazer com ele apoacutes a sua declara-

ccedilatildeo eacute consultar o valor para o qual aponta Natildeo podemos

alterar i se ptr for deste tipo nem podemos apontar ptr para

NULL ou outro endereccedilo qualquer

Desta vez utilizamos const em dois locais agrave esquerda do

asterisco para qualificar a variaacutevel apontada e agrave direita do

asterisco para qualificar o apontador Neste caso nenhuma

das operaccedilotildees funcionaraacute o compilador assegura-se que

natildeo utilizaremos ptr para alterar o valor para o qual aponta

nem tentaremos apontar ptr para outro endereccedilo

Neste artigo cobrimos algumas utilizaccedilotildees do qualificador

const na linguagem C (volto a lembrar estamos a falar de C

e natildeo de ldquoCC++rdquo) e foi tambeacutem referido como utilizar este

qualificador para melhorar o coacutedigo que escrevemos de for-

ma a prevenir asneiras relativamente comuns quando se lida

com apontadores

Falta no entanto mencionar outra utilidade do const docu-

mentaccedilatildeo Quando o programador utiliza const de uma for-

ma pensada estaacute a documentar o seu coacutedigo Se virmos uma

funccedilatildeo que aceita como argumento const void podemos

imediatamente imaginar que o endereccedilo passado nunca seraacute

alterado pela funccedilatildeo em causa enquanto que um simples

void natildeo nos informa sobre as intenccedilotildees da API Natural-

mente se o programador da API declarar um argumento

com const e depois utilizar casts para se livrar da qualifica-

ccedilatildeo entatildeo aiacute all bets are off e nada eacute garantido Mas assu-

mamos que isso eacute a excepccedilatildeo e natildeo a regra

Existem ainda muacuteltiplos aspectos que natildeo foram cobertos

neste artigo nomeadamente a conversatildeo impliacutecita de T para

const T e T para const T Esta conversatildeo eacute bastante uacutetil

quando queremos passar um valor do tipo T a uma funccedilatildeo

que requer const T como argumento Se pensarmos bem

faz sentido em qualquer lugar onde eacute necessaacuterio um const

T podemos utilizar um T perfeitamente (que nunca seraacute al-

terado) Por outro lado a conversatildeo inversa (de const T ou

const T para T e T respectivamente) natildeo eacute permitida e

tambeacutem isso faz sentido se uma funccedilatildeo pede um valor do

tipo T natildeo faz sentido aceitar um const T porque isso im-

plicaria potenciais alteraccedilotildees ao valor apontado (que satildeo

proibidas pelo qualificador const)

As conversotildees impliacutecitas relativas ao const terminam por

aqui Em C natildeo haacute conversatildeo de T para const T o que

significa que numa funccedilatildeo que aceite um argumento const

T seraacute emitido um aviso se tentarmos passar um T Neste

caso temos que recorrer a um cast para silenciar o compila-

dor Nada disto eacute um erro no entanto os casts surgiram

porque satildeo necessaacuterios na linguagem C e recusar a sua

utilizaccedilatildeo eacute negar a linguagem Haacute que saber quando e co-

mo fazer as coisas da forma correcta

Para terminar recomendo uma olha- dela agraves

manpages da biblioteca standard de C jaacute utilizam const

abundantemente nota-se bem o seu valor como documenta-

ccedilatildeo dentro do coacutedigo Aleacutem deste aspecto da documentaccedilatildeo

a utilizaccedilatildeo de const leva agrave criaccedilatildeo de coacutedigo mais previsiacutevel

e seguro e serve tambeacutem como dica para possiacuteveis optimi-

zaccedilotildees feitas pelo compiladorUsem const Informem e enco-

rajem a utilizaccedilatildeo de const especialmente aos iniciados

porque vale a pena

PROGRAMACcedilAtildeO EM C CONST

1 const int i = 42 2 const int const ptr = ampi 3 4 ptr = 73 erro 5 ptr = NULL erro

AUTOR

Escrito por Antoacutenio Pedro Cunha (pwseo)

Meacutedico natural de Guimaratildees formado na Universidade do Minho

Programador autodidacta em parte dos tempos livres inscrito no foacuterum desde 2006

Website httppwseoalojnet

Ao contraacuterio do

que se possa pen-

sar utilizar const natildeo

cria uma constante

mas sim uma variaacutevel

soacute de leitura

A PROGRAMAR

18

Nesta ediccedilatildeo vamos propor ao leitor um olhar sobre um fa-

moso algoritmo da deacutecada de 70

O seu inventor John Horton Conway nasceu em Liverpool

em Dezembro de 1937 e eacute um dos matemaacuteticos mais conhe-

cidos da nossa era em todo o mundo Estudou na Universi-

dade de Cambridge e ainda hoje eacute uma mente ativa nas

mais variadas teorias como por exemplo a teoria dos coacutedigos

e a teoria com- binatoacuteria dos

jogos

Ilustraccedilatildeo 1 - John Conway

O algoritmo escolhido para esta ediccedilatildeo foi criado em 1970

por Conway ndash o Jogo da Vida ndash sendo este um jogo para

zero jogadores Este jogo tornou-se mundialmente famoso

atraveacutes de uma coluna na revista Scientific American Em

1971 foi tema de capa e tinha entatildeo relanccedilado uma aacuterea da

Matemaacutetica a dos autoacutematos celulares que satildeo estruturas

matemaacuteticas uacuteteis em simulaccedilotildees de processos fiacutesicos e

bioloacutegicos e que a um niacutevel teoacuterico podem comportar-se

como computadores

Um autoacutemato celular eacute um modelo discreto e cada autoacutemato

deste tipo eacute representado por uma grelha de ceacutelulas poden-

do essas ceacutelulas assumir um nuacutemero finito de estados que

variam de acordo com cada modelo Outra caracteriacutestica a

considerar eacute que o tempo de evoluccedilatildeo eacute tambeacutem discreto

por exemplo o estado de uma ceacutelula no tempo t eacute sempre

obtido tendo em consideraccedilatildeo o estado dessa mesma ceacutelula

(e respetiva vizinhanccedila) no tempo t-1 Cada vez que todas as

regras determiniacutesticas satildeo aplicadas a toda a grelha uma

nova geraccedilatildeo eacute produzida

Isto foi um dos motes de partida para que Conway criasse o

Jogo da Vida Este jogo eacute considerado um autoacutemato celular

bidimensional em que satildeo simulados processos de evoluccedilatildeo

de ceacutelulas bioloacutegicas Estudos jaacute efetuados provam que este

eacute um autoacutemato computacional universal isto eacute eacute capaz de

simular qualquer sistema evolucionaacuterio possiacutevel

(reprogramando as respetivas regras determiniacutesticas se isso

for necessaacuterio)

Jogo da Vida Devido agraves analogias com o aumento reduccedilatildeo e alteraccedilatildeo de

um sistema de supostos organismos vivos (as ceacutelulas) este

jogo pertence agrave classe dos ldquojogos de simulaccedilatildeordquo pois recriam

processos do mundo-real

Voltando de novo ao tema principal do nosso artigo eacute impor-

tante recordar ao leitor que este jogo eacute para zero jogadores

o utilizador eacute apenas responsaacutevel pelos valores de inicializa-

ccedilatildeo do sistema Depois desses valores serem introduzidos

as geraccedilotildees seguintes seratildeo sempre calculadas com base

nas regras determiniacutesticas do algoritmo

Neste jogo num dado instante cada ceacutelula tem dois estados

possiacuteveis ldquovivardquo ou ldquomortardquo

As regras do jogo da vida satildeo simples ora vejamos

Uma ceacutelula viva com menos de dois vizinhos vivos

morre por solidatildeo

Uma ceacutelula viva com mais de trecircs vizinhos vivos mor-

re por sobrepopulaccedilatildeo (por escassez de recursos)

Uma ceacutelula viva com exatamente dois ou trecircs vizinhos

vivos permanece viva

Uma ceacutelula morta com exatamente trecircs vizinhos vivos

torna-se viva

Ao contraacuterio do artigo anterior desta seacuterie a soluccedilatildeo propos-

ta para este problema (na linguagem C) propotildee-se a ser

algo extremamente simples escrita de forma quase elemen-

tar

Implementaccedilatildeo do Algoritmo

Para simular o sistema de jogo foi usada uma matriz e para

que o caacutelculo das regras fosse simples foi considerado que

todas as ceacutelulas dessa matriz teriam 8 vizinhos A forma

mais direta encontrada para isso foi inserir a matriz do utiliza-

dor (que neste artigo seraacute a matriz secundaacuteria) numa matriz

com dimensatildeo [linhas+2][colunas+2] (matriz principal) para

garantir que ateacute as ceacutelulas dos ldquocantosrdquo teriam os tais 8 vizi-

nhos

De forma a simplificar a leitura da nossa implementaccedilatildeo defi-

nimos que cada ceacutelula viva teraacute o valor 1 (representada pela

macro CELVIVA) e que cada ceacutelula morta teraacute o valor 0

(representada pela macro CELMORTA)

No inicio da funccedilatildeo jogo() satildeo pedidos ao utilizador os valo-

res para o nuacutemero de linhas e colunas do sistema de jogo e

o nuacutemero de geraccedilotildees a simular

Apoacutes termos esses valores eacute entatildeo criada a matriz principal

com todos os campos inicializados a -1 para que seja efetua-

A PROGRAMAR

19

da uma ldquolimpezardquo da memoacuteria utilizada Seguidamente e atra-

veacutes desses valores eacute inicializada dentro na matriz principal a

submatriz (matriz secundaacuteria) que eacute usada para calcular os

valores das ceacutelulas em cada geraccedilatildeo Neste caso eacute inicializa-

da a matriz com a dimensatildeo que o utilizador pediu com o valor

de CELMORTA em todos os campos

Apoacutes gerar a matriz secundaacuteria eacute perguntado ao utilizador

quantas ceacutelulas vivas pretende ter no jogo Seguidamente satildeo

pedidas as coordenadas dessas mesmas ceacutelulas Quando o

programa recebe esses valores (da linha e da coluna pretendi-

da) entatildeo a essas posiccedilotildees da matriz eacute atribuiacutedo o valor CEL-

VIVA

Recapitulando para representar uma ceacutelula viva eacute usado o

valor 1 e para representar uma ceacutelula morta eacute usado o valor 0

Todas as outras posiccedilotildees da matriz principal permanecem inal-

teradas com o valor -1

Assim o que o algoritmo faz eacute contabilizar quantas ceacutelulas

vivas estatildeo nos 8 vizinhos Ou seja por outras palavras para

cada posiccedilatildeo (ij) da matriz o programa vai verificar as posi-

ccedilotildees (i-1 j-1) (i-1 j) (i-1 j+1) (i j-1) (i j+1) (i+1 j-1) (i+1 j)

e (i+1 j+1) Caso o valor de cada uma dessas ceacutelulas seja

igual a 1 (CELVIVA ie ceacutelula viva) a variaacutevel de contagem

(cvivas) eacute incrementada uma unidade

Apoacutes a verificaccedilatildeo de todas as posiccedilotildees eacute verificado se a ceacutelu-

la da posiccedilatildeo (i j) eacute uma ceacutelula viva ou morta e satildeo verificadas

as regras do jogo para que se possa decidir se a ceacutelula (ij)

permanece viva ou se morre (tomando respetivamente o valor

CELVIVA e CELMORTA na submatriz)

Usando a variaacutevel i como auxiliar para as linhas e a variaacutevel j

como auxiliar para as colunas os caacutelculos iniciam-se na posi-

ccedilatildeo (11) da matriz principal pois eacute nestas coordenadas que se

inicia a matriz secundaacuteria (ie o sistema de jogo do utilizador)

Os caacutelculos satildeo feitos em todas as posiccedilotildees (ij) apenas da

matriz secundaacuteria daiacute que a condiccedilatildeo de execuccedilatildeo dos ciclos

for seja enquanto o i e o j forem menores que o valor das li-

nhas e das colunas introduzidas pelo utilizador Ou seja a ma-

triz principal natildeo eacute toda processada nos caacutelculos dos vizinhos

vivos para que natildeo sejam gastos recursos de computaccedilatildeo

desnecessariamente

Ilustraccedilatildeo 2 - Exemplo de verificaccedilatildeo de Ceacutelulas

Ceacutelula a ceacutelula a matriz atual eacute processada sendo que apoacutes

esse processamento o resultado do caacutelculo (se a ceacutelula vive

ou morre) eacute colocado na posiccedilatildeo correspondente na matriz

nova (que eacute uma matriz com as mesmas caracteriacutesticas da

matriz atual isto eacute tem tambeacutem uma matriz principal e uma

matriz secundaacuteria)

Apoacutes esse caacutelculo eacute mostrada no ecratilde a matriz secundaacuteria

da matriz nova e a informaccedilatildeo das ceacutelulas da matriz nova eacute

copiada para a matriz atual de forma a que na proacutexima itera-

ccedilatildeo do for principal (que executa o mesmo numero de vezes

quantas geraccedilotildees o utilizador peccedila ao programa) a informa-

ccedilatildeo volte a ser processada de forma anaacuteloga

Para que fosse mais simples ao utilizador o uso do nosso

programa foi tomada em consideraccedilatildeo para que natildeo se

tornasse aborrecido estar sempre a iniciar a execuccedilatildeo do

programa caso o utilizador quisesse continuar a jogar que o

programa apenas teraacute fim quando o utilizador escolher sair

do programa neste caso introduzindo o valor 0 no menu prin-

cipal do mesmo

Se o utilizador preferir jogar novamente entatildeo basta carregar

em 1 e o programa volta a gerar uma nova jogada gerando

um novo sistema de geraccedilotildees consoante os valores introdu-

zidos pelo utilizador Na nossa implementaccedilatildeo quando o

programa mostra o sistema de jogo as ceacutelulas vivas satildeo

representadas pelo siacutembolo

Coacutedigo do Programa

Este eacute apenas um excerto da funccedilatildeo que calcula a proacutexima

geraccedilatildeo tendo como base uma matriz que represente a gera-

ccedilatildeo anterior O coacutedigo completo poderaacute ser consultado no

foacuterum do PP

JOGO DA VIDA

void jogo(void) for (int g = 0 g lt geracoes g++) printf(nnGERACAO d g + 1) for (int i = 1 i lt= linhas i++) for (int j = 1 j lt= colunas j++) int cvivas = 0 if (matrizActual[i-1][j-1] == CELVIVA) cvivas++ if (matrizActual[i-1][j] == CELVIVA) cvivas++ if (matrizActual[i-1][j+1] == CELVIVA) cvivas++ if (matrizActual[i][j-1] == CELVIVA) cvivas++ if (matrizActual[i][j+1] == CELVIVA) cvivas++ if (matrizActual[i+1][j-1] == CELVIVA) cvivas++ if (matrizActual[i+1][j] == CELVIVA)

A PROGRAMAR

20

Como o leitor pode verificar nas linhas acima este eacute um algorit-

mo bastante simples e de raacutepida implementaccedilatildeo Eacute de referir

ainda que o coacutedigo do artigo desta ediccedilatildeo foi implementado

segundo o standard C99 (suportado pelos compiladores GCC

Clang e Pelles C) que nos permite programar de uma forma

portaacutevel e ainda assim confortaacutevel (comentaacuterios comeccedilados

com variable-length arrays tipo de dados bool entre outros)

Caso o leitor queira compilar o coacutedigo deste artigo em Linux

deve utilizar a linha de comando gcc -Wall -Wextra -std=c99 -

pedantic jogo-da-vida jogo-da-vidac

O objetivo principal deste algoritmo eacute entatildeo que o utilizador

possa decidir qual a sua populaccedilatildeo inicial e que apoacutes isso pos-

sa observar o comportamento do seu sistema Ao longo dos

anos muitas configuraccedilotildees foram testadas e experimentadas

com este jogo O jogo da vida convida a experimentar diversas

configuraccedilotildees sendo que agrave maior parte das configuraccedilotildees

iniciais escolhidas bastam apenas trecircs ou quatro geraccedilotildees

para a populaccedilatildeo desaparecer completamente Contudo haacute

algumas configuraccedilotildees jaacute conhecidas como configuraccedilotildees de

ldquoVida Eternardquo por haver sempre ceacutelulas vivas ao longo de mui-

tas geraccedilotildees (e ateacute mesmo de geraccedilotildees infinitas) como mostra

por exemplo imagem seguinte (obtida com a execuccedilatildeo do

nosso programa)

Ilustraccedilatildeo 3 - Exemplo configuraccedilatildeo Vida Eterna (Bloco)

Existem ainda diferentes configuraccedilotildees que podem ocorrer

no Jogo da Vida (configuraccedilotildees essas que o utilizador pode

facilmente encontrar na internet relativas a vaacuterios estudos jaacute

feitos sobre este algoritmo) Os exemplos mais simples satildeo

mostrados abaixo com as ceacutelulas vivas em preto e as ceacutelu-

las mortas em branco

Haacute configuraccedilotildees que satildeo alvo de vaacuterios estudos cientiacuteficos

por exemplo se dois gliders satildeo colocados em direccedilatildeo a um

bloco o bloco vai aproximar-se da fonte dos gliders mas por

outro lado se trecircs gliders satildeo colocados no mesmo lugar o

bloco vai afastar-se desses gliders Este facto eacute conhecido

como a ldquomemoacuteria de bloco deslizante e pode ser usada para

simular um contador

Eacute possiacutevel construir portas loacutegicas AND OR e NOT usando

gliders tal como eacute possiacutevel construir uma imagem que aja

como uma maacutequina de estado finito conectada a dois conta-

dores

O que significa que esta disposiccedilatildeo possui o mesmo poder

computacional de uma maacutequina de Turing universal ou seja

Jogo da Vida pode ser tatildeo poderoso quanto qualquer com-

putador com memoacuteria ilimitada dando origem ao Turing com-

pleto como jaacute vaacuterios estudos comprovam esse mesmo feito

Mais uma vez recordo ao leitor que pode experimentar sem

qualquer restriccedilatildeo as configuraccedilotildees iniciais que mais lhe

agradarem Este artigo eacute o terceiro de uma seacuterie de artigos

de programaccedilatildeo tendo como base principal a linguagem C

que esperamos que siga atentamente

JOGO DA VIDA

cvivas++ if (matrizActual[i+1][j+1] == CELVIVA) cvivas++ if (isAlive ampamp cvivas lt 2) DIE else if (isAlive ampamp cvivas gt 3) DIE else if (isAlive ampamp (cvivas == 2 || cvivas == 3)) LIVE else if (isDead ampamp cvivas == 3) LIVE else DIE

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

a matriz principal

natildeo eacute toda proces-

sada (hellip) para que natildeo

sejam gastos recur-

sos de computaccedilatildeo

A PROGRAMAR

21

Introduccedilatildeo

Atualmente a plataforma Java eacute uma das mais utilizadas no

mundo e muito disso se deve agrave capacidade da plataforma

suportar outras linguagens como por exemplo JRuby Groovy

e Scala Milhares de aplicativos para Web e Mobile satildeo de-

senvolvidos a cada mecircs utilizando esta plataforma como

base A plataforma Java mudou muito desde seu iniacutecio e

provavelmente vai continuar evoluindo nos proacuteximos anos

Em paralelo com essas mudanccedilas visualizamos os servido-

res de aplicaccedilatildeo que cada vez mais oferecem recursos de

alta complexidade como componentes de balanceamento

de carga inteligente implementaccedilatildeo de autenticaccedilatildeo (JAAS)

troca de mensagens assiacutencronas (JMS) controle de transa-

ccedilatildeo (JTA) persistecircncia de objetos (JPA) componentes para

criaccedilatildeo de aplicaccedilotildees distribuiacutedas e clusterizadas (EJB) API

Java para processamento de arquivos XML e Webservices

(JAX-WS e JAX-B) e muitas outras tecnologias facilitando o

desenvolvimento e padronizaccedilatildeo de aplicaccedilotildees Eles tam-

beacutem disponibilizam uma infraestrutura estaacutevel e escalonaacutevel

para aplicaccedilotildees de missatildeo criacutetica Um dos grandes desafios

dos servidores de aplicaccedilatildeo eacute acoplar serviccedilos de grande

complexidade deixando-os estaacuteveis e flexiacuteveis

Nas versotildees iniciais a plataforma ainda conhecida como

Java2EE natildeo estava madura e seus recursos nos servidores

de aplicaccedilatildeo eram carregados de forma hieraacuterquica consu-

mindo muitos recursos e tornando o startup altamente custo-

so

A arquitetura dos principais servidores de aplicaccedilatildeo foi rede-

senhada para que seus recursos possam ser iniciados de

modo concorrente ou sob demanda As melhorias tambeacutem

podem ser notadas no consumo de memoacuteria onde em uma

simples maacutequina desktop pode-se facilmente configurar

serviccedilos de alta disponibilidade e escalaacuteveis para realizaccedilatildeo

de testes em tempo de desenvolvimento

Se vocecirc deseja um ambiente com alta disponibilidade esca-

lonaacutevel e que seja independente de fabricante (de forma a

evitar o vendor lock-in) o Java EE e seus servidores de apli-

caccedilatildeo foram feitos para si

JBoss Application Server 7

JBoss Application Server 7 ou apenas JBoss AS 7 eacute um ser-

vidor de aplicaccedilatildeo de coacutedigo aberto que eacute 100 compatiacutevel

com a especificaccedilatildeo Java EE 6 Em versotildees anteriores do

Java EE mesmo utilizando somente algumas tecnologias

para o desenvolvimento da aplicaccedilatildeo eacuteramos obrigados a

lidar com todos os recursos implementados no servidor Para

resolver esse problema no Java EE 6 foi inserido o conceito

JBoss Aplication Server 7 de profile que tem como objetivo criar configuraccedilotildees com fins

especiacuteficos como por exemplo o Web Profile que possui tec-

nologias para o desenvolvimento web

Ateacute ao momento a versatildeo atual do JBoss AS foi baixada

mais de 150 mil vezes Para mais informaccedilotildees visite o site

do projeto httpwwwjbossorgjbossas

Recentemente o projeto recebeu um novo nome e futura-

mente se chamaraacute WildFly Mais informaccedilotildees podem ser

encontradas em httpwwwwildflyorgfaq

Requisitos

Como todo servidor de aplicaccedilatildeo o JBoss AS 7 requer um

ambiente com JDK 16JDK 17 devidamente configurado e

instalado O Java Development Kit (JDK) eacute um conjunto de

utilitaacuterios para criaccedilatildeo de softwares para plataforma Java

Existem vaacuterias implementaccedilotildees cada qual com a sua finali-

dade

Para baixar o JDK 7 navegue ateacute a paacutegina de download da

Oracle em httpwwworaclecomtechnetworkjavajavase

downloadsindexhtml e escolha a opccedilatildeo Java Platform

(JDK) Em seguida vocecirc seraacute direcionado para outra paacutegina

onde deveraacute aceitar a License Agreement Baixe a versatildeo

jdk-7u21-linux-x64rpm

Para instalar o JDK execute o seguinte comando

$ sudo rpm -Uvh jdk-7u21-linux-x64rpm

Execute o comando java --version para verificar se o JDK

estaacute instalado

$ java --version

java version 170_21

Java(TM) SE Runtime Environment (build 170_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 2321-b01 mixed

mode)

Duvidas na instalaccedilatildeo Consulte o link

httpdocsoraclecomjavase7docswebnotesinstall

indexhtml

Instalando o JBoss AS 7

O JBoss AS 7 pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgjbossasdownloads Para

instalar basta descompactar o arquivo jboss-as-

711Finalzip utilizando um utilitaacuterio de descompressatildeo

A PROGRAMAR

22

Boas Praacuteticas

Nunca inicie o JBoss utilizando o usuaacuterio root pois a platafor-

ma Java oferece APIs para execuccedilatildeo de coacutedigos nativos do

sistema operacional e mecanismos de gerenciamento remoto

No Linux crie um usuaacuterio com privileacutegios de root para iniciar o

serviccedilo do JBoss Jaacute no Windows crie um usuaacuterio com poderes

administrativos mas com privileacutegios reduzidos

Uma vez instalado eacute fortemente aconselhaacutevel iniciar o JBoss

AS para verificar se existe alguma incompatibilidade com a

arquitetura do JDK utilizado ou ateacute mesmo se a memoacuteria dispo-

nibilizada eacute suficiente

Execute uma simples instacircncia standalone e acesse a url http

localhost8080 para verificar se o JBoss foi iniciado correta-

mente

$ jboss-as-711Finalbinstandalonesh

Domain Mode x Standalone Mode

O JBoss AS 7 possui dois modelos de trabalho conhecidos

como Standalone Mode e Domain Mode No Standalone Mode

podemos trabalhar com uma uacutenica instacircncia muito semelhante

a versotildees anteriores do JBoss AS 5 e JBoss AS 6 Para utilizar

o Standalone mode basta iniciar o script JBOSS_HOME

standalonesh no Linux

Agora vocecirc deve estar se perguntando se eacute possiacutevel criar um

ambiente de alta disponibilidade utilizando o Standalone

Mode A resposta eacute Sim Eacute possiacutevel criar um ambiente com

recursos clusterizados replicaccedilatildeo de sessatildeo e tudo mais Se

vocecirc jaacute utilizou outras versotildees do JBoss deve estar pensan-

do em utilizar o famoso Farm Deployment onde a aplicaccedilatildeo

era replicada para todos os noacutes do cluster Esse recurso natildeo

existe no Standalone Mode pelo que vocecirc teraacute que realizar

o deploy em todos os noacutes um por um Isso natildeo eacute um proble-

ma se forem 3 ou 4 instacircncias mas imagine se forem umas

20 instacircncias

Uma soluccedilatildeo para esse problema seria a utilizaccedilatildeo de ferra-

mentas como o RHQ (httpwwwjbossorgrhq) para realiza-

ccedilatildeo do deploy em muacuteltiplas instacircncias o que acarretaria con-

sumo de mais recursos e tempo Para solucionar esse pro-

blema temos uma soluccedilatildeo bem simples jaacute embutida no servi-

dor de aplicaccedilatildeo o Domain Mode e eacute sobre isso que vamos

falar no proacuteximo toacutepico

Introduccedilatildeo ao Domain Mode

O Domain Mode permite iniciar vaacuterias instacircncias e tambeacutem

oferece uma maneira centralizada de gerenciamento dos

recursos facilitando a administraccedilatildeo das instacircncias JBoss O

Domain Mode pode ser visto como uma unidade de instacircn-

cias que compartilham recursos e configuraccedilotildees e satildeo admi-

nistradas por um processo chamado Domain Controller

Para iniciar o JBoss AS 7 de modo domain execute o script

JBOSS_HOMEdomainsh no Linux ou JBOSS_HOME

domainbat no Windows

Quando iniciamos o JBoss em Domain Mode na configura-

ccedilatildeo default temos no miacutenimo quatro processos um Host

Controller um Process Controller e dois Servers

Domain Controller Ele eacute quem controla o gerenciamento

do domain Nele estatildeo as configuraccedilotildees que satildeo comparti-

lhadas entre as instacircncias que estatildeo nesse domain

Process Controller Ele eacute de grande importacircncia pois ele eacute

responsaacutevel pela criaccedilatildeo das instacircncias e tambeacutem do Host

Controller que vamos falar a seguir O Process Controller

natildeo deve ser confundido com uma instacircncia ele eacute

simplesmente um processo na JVM

Host Controller Como Domain Controller o Host Controller

tambeacutem coordena as instacircncias do domain Ele eacute o

responsaacutevel por fazer algo semelhando ao Farm Deployment

(natildeo existe nessa versatildeo) ou seja ele distribui o arquivo

deployado para todas as instacircncias do domain

Servers Satildeo as instacircncias em si onde estatildeo as aplicaccedilotildees

deployadas Um ponto importante eacute que cada server eacute um

processo Java

Entre os benefiacutecios da utilizaccedilatildeo do Modo Domain que noacutes

podemos citar estatildeo

Gestatildeo Centralizada

JBOSS APLICATION SERVER 7

A PROGRAMAR

23

Configuraccedilatildeo Centralizada

Deploy Centralizado

Manutenccedilatildeo Centralizada

Preparando a Infra Estrutura

Nesse artigo estamos utilizando Trecircs servidores Dois deles

seratildeo utilizados pelas as instacircncias JBoss e Um seraacute utilizado

Pelo Domain Controller e Apache Web Server para realizar o

Balanceamento de carga

Crie um grupo e adicione um usuaacuterio para ser utilizado

pelo JBoss AS 7 em todos os servidores

$ sudo groupadd jboss

$ sudo useradd -s binbash -d homejboss -m -g jboss

jboss

Faccedila tambeacutem o download do JBoss AS 7 no diretoacuterio

tmp

$ cd tmp

$ wget httpdownloadjbossorgjbossas71jboss-as-

711Finaljboss-as-711Finalzip

Crie a estrutura de diretoacuterios para armazenar o JBoss

$ sudo mkdir usrlocaljboss

$ chown jbossjboss usrlocaljboss

$ su jboss

$ mkdir usrlocaljboss

$ cd usrlocaljboss

$ unzip tmpjboss-as-711Finalzip

Finalmente o JBoss AS 7 estaacute instalado em usr

localjbossjboss-as-711 Final em todos os servidores

Configurando Alta Disponibilidade

Para aplicaccedilotildees com muitas solicitaccedilotildees a busca pela

melhora do desempenho eacute quase constante Um dos

meios mais utilizados eacute o Balanceamento de Carga

que consiste em distribuir a carga das solicitaccedilotildees em

vaacuterios servidores ou instacircncias proporcionando a

melhora no tempo de reposta

O JBoss AS 7 possui um componente nativo

conhecido como mod_cluster que foi criado para

atender a mecanismos de balanceamento de carga

alinhados ao conceito de Cloud O Mod Cluster vem

com algoritmos de balanceamento de carga mais

avanccedilados que se baseiam na carga da aplicaccedilatildeo ou

seja quantidades de sessotildees conexotildees abertas

entre outros Ele pode ser customizado conforme a

necessidade da aplicaccedilatildeo visando um ambiente

elaacutestico Um das vantagens eacute tambeacutem o

descobrimento automaacutetico de novas instacircncias JBoss

(utilizando Multicast) natildeo havendo a necessidade de

configuraccedilotildees extras

As configuraccedilotildees do mod_cluster devem ser

realizadas no JBoss AS 7 e no Apache Web Server

que seraacute utilizado como Proxy reverso

Instalando Apache Web Server

No Servidor Balancer instale o Apache Web Server

Basta executar o seguinte comando

$ sudo yum install httpd -y

Inicie o serviccedilo e verifique se paacutegina de testes eacute

carregada

$ sudo service httpd start

Instalando Mod Cluster

Ainda no Servidor Balancer instale o Mod Cluster Ele

pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgmod_cluster

downloads1-2-0-Final Para instalar basta

JBOSS APLICATION SERVER 7

A PROGRAMAR

24

descompactar o arquivo mod_cluster-120Final-linux2-

x64-ssltargz utilizando um utilitaacuterio de descompressatildeo

e copiar os moacutedulos para o diretoacuterio de moacutedulos do

Apache Web Server

Para baixar e extrair o arquivo execute

$ cd tmp

$ wget httpdownloadsjbossorg

mod_cluster120Finalmod_cluster-120Final-

linux2-x64-ssltargz

$ tar -zxvf mod_cluster-120Final-linux2-x64-

ssltargz

Copie os moacutedulos para o Apache

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_advertiseso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_managerso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_proxy_clusterso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_slotmemso etchttpdmodules

Edite o arquivo etchttpdconfhttpdconf e comente a

linha LoadModule proxy_balancer_module modules

mod_proxy_balancerso para natildeo ocorrer um conflito

com LoadModule proxy_cluster_module modules

mod_proxy_clusterso

LoadModule proxy_balancer_module modules

mod_proxy_balancerso

Crie o arquivo mod_clusterconf e adicione a seguinte

configuraccedilatildeo

$ sudo vim etchttpdconfdmod_clusterconf

Reinicie o Apache

$ sudo service httpd restart

Acesse o mod_cluster-manager e verifique se as

informaccedilotildees sobre a versatildeo do mod_cluster estatildeo

aparecendo

Arquitetura dos Servidores em Modo Domain

Para realizar os testes do balanceamento de carga

com o mod_cluster vamos subir o Domain Controller

e depois vamos conectar dois Hosts Controller com

uma Instacircncia JBoss em cada

Criando os Perfis dos Servidores JBoss

No Servidor Balancer crie o perfil chamado master

que seraacute o Domain Controller

$ cp -Rap usrlocaljbossjboss-as-711Final

domain usrlocaljbossjboss-as-711Finalmaster

JBOSS APLICATION SERVER 7

Content Mod Cluster LoadModule slotmem_module modules mod_slotmemso LoadModule manager_module modules mod_managerso LoadModule proxy_cluster_module modules mod_proxy_clusterso LoadModule advertise_module modules mod_advertiseso ltVirtualHost 80gt ltDirectory gt Order denyallow Allow from all ltDirectorygt KeepAliveTimeout 60 ManagerBalancerName mycluster MaxKeepAliveRequests 0 ServerAdvertise On EnableMCPMReceive On ltVirtualHostgt ltLocation mod_cluster-managergt SetHandler mod_cluster-manager Order denyallow Allow from all ltLocationgt

A PROGRAMAR

25

No Servidor Host-01 crie o perfil chamado host01 que

seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost01

No Servidor Host-02 crie o perfil chamado host02 que

tambeacutem seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost02

Configurando Toda a Arquitetura

Como vimos anteriormente todas as configuraccedilotildees e

gerenciamento satildeo realizadas de forma centralizada no

Domain Controller Quando for necessaacuterio adicionar um

novo grupo de servidores configurar logs criar

datasources alterar portas entre outras coisas tudo

isso deveraacute ser feito no domainxml do Domain

Controller que nesse caso eacute chamado de master Sendo

assim todas as nossas instacircncias JBoss usufruiratildeo das

configuraccedilotildees realizadas para o Domain ou para o

Server Group em questatildeo

A primeira coisa a ser feita eacute definir qual o conjunto de

tecnologias (subsystems) seratildeo utilizadas na aplicaccedilatildeo

Isso pode variar conforme os requisitos de cada

sistema Um conjunto de tecnologias (subsystems) no

JBoss 7 eacute chamado de profile

ltprofile name=full-hagt

O JBoss AS 7 possui 4 profiles por padratildeo ldquodefaultrdquo

ldquofullrdquo ldquohardquo ldquofull-hardquo mas nada impede de noacutes

copiarmos qualquer um deles e renomeaacute-los conforme

nossos requisitos No Java EE 6 foi introduzido o

conceito de Profiles onde se pode criar um subconjunto

de tecnologias presentes na spec Java EE ou ateacute

mesmo adicionar novas definidas pela JCP (Java

Community Process)

Mais informaccedilotildees

httpscommunityjbossorgwiki

JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Noacutes vamos utilizar o profile ha pois nele os recursos

para clusterizaccedilatildeo estatildeo disponiacuteveis

Depois de definir o profile o proacuteximo criar um Grupo de

Servidores Server Group Um server group nada mais eacute

que um agrupamento de instacircncias JBoss Nessa

arquitetura vamos utilizar apenas um server group Isso

pode ser definido na tag ltserver-groupsgt no domainxml

do master (Domain Controller)

Crie um Server Group chamado apps que utilize o

profile ha

$ vim usrlocaljbossjboss-as-711Finalmaster

configurationdomainxml

Os outros Server Groups podem ser removidos

No profile ha especificamente no subsystem web

adicione o atributo instance-id

O instance-id seraacute passado como paracircmetro na

inicializaccedilatildeo do Host Controller

O proacuteximo passo eacute configurar o atributo proxy list no

subsystem modcluster

Nesse atributo estaacute configurado o IP e porta do

Apache Web Server

No Servidor Host-01 edite o arquivo usrlocaljboss

jboss-as-711Finalhost01configurationhost-

slavexml para criar a instacircncia JBoss

Na tag ltserversgt eacute onde estatildeo de fato as nossas

instacircncias JBoss Quando criamos um novo ltservergt

estamos criando uma nova instacircncia JBoss

Conforme foi definido na arquitetura o Host Controller

01 conteraacute apenas uma instacircncia JBoss chamada

instance-one

Deixe o ltserversgt como abaixo

Definimos que a instacircncia JBoss instance-one faraacute

parte do Server Group apps

Para finalizar na tag lthostgt adicione o nome host01

lthost name=host01 xmlns=urnjbossdomain12gt

JBOSS APLICATION SERVER 7

ltserver-group name=apps profile=hagt ltjvm name=defaultgt ltheap size=1303m max-size=1303mgt ltpermgen max-size=256mgt ltjvmgt ltsocket-binding-group ref=ha-socketsgt ltserver-groupgt

ltsubsystem xmlns=urnjbossdomainweb12 de-fault-virtual-server=default-host instance- id=$jbossservername native=falsegt

ltsubsystem xmlns=urnjbossdomainmodcluster10gt ltmod-cluster-config advertise-socket=modcluster proxy-list=19216823818680gt ltdynamic-load-providergt ltload-metric type=busynessgt ltdynamic-load-providergt ltmod-cluster-configgt ltsubsystemgt

ltserversgt ltserver name=instance-one group=appsgt ltservergt ltserversgt

A PROGRAMAR

26

Repita os procedimentos realizados no servidor Host -01

em Host-02 alterando apenas o nome do servidor que

seraacute instance-two e do lthostgt que seraacute host02No

ambiente em que realizei os testes o sevidores possuem

os seguintes IPs

Domain Controller+Apache WebServer 192168238186

Host Controller 01 192168238187

Host Controller 02 192168238188

Inicie o Domain Controler (master) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalmaster

-Djbosshostdefaultconfig=host-masterxml -

Djbossbindaddress=192168238186 -

Djbossbindaddressmanagement=192168238186

Verifique o log

JBoss AS 711Final Brontes (Host Controller) started

in 15505ms - Started 11 of 11 services (0 services are

passive or on-demand)

O Domain Controller foi iniciado com sucesso Conecte

primeiro Host Controller 01 (Host-01) ao Master Inicie o

Perfil host01 utilizando os seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost01

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238187

-Djbossbindaddress=192168238187

-Djbossservername=host-01

Agora observe os logs no Domain Controller e perceba

que o Host Controller 01 se conectou ao Domain

JBAS010918 Registered remote slave host host01

JBoss AS 711Final Brontes

Observe tambeacutem o Mod Cluster Manager em

http192168238186mod_cluster-manager e veja que

a nossa primeira instacircncia jaacute apareceu

Inicie o Host Controller 02 (slave02) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost02

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238188

-Djbossbindaddress=192168238188

-Djbossservername=host-02

Observando novamente o log Domain Controller e

verifique que o Host Controller 02 se tambeacutem

conectou

JBAS010918 Registered remote slave host host02

JBoss AS 711Final Brontes

No Mod Cluster Manager em http192168238186

mod_cluster-manager jaacute estatildeo as duas instacircncias

Para testar o Balanceamento vamos fazer o deploy da

aplicaccedilatildeo SystemProps que pode ser baixada http

googlyjynK Para fazer o deploy conecte do domain

controller utilizando o CLI

[jbosslocalhost jboss]$ sudo jboss-as-711Final

binjboss-clish -c controller=1921682381869999

[domain1921682381869999 ] deploy tmp

systempropswar --server-groups=apps

A aplicaccedilatildeo foi deployada para as instacircncias do server

group apps Acesse a url do balanceador e verifique

se a aplicaccedilatildeo estaacute disponiacutevel

http192168238186systemprops

JBOSS APLICATION SERVER 7

A PROGRAMAR

27

Perceba que estamos na instance-one Entatildeo para

testarmos o funcionamento do balanceamento de carga

vamos parar a Instacircncia instance-one e quando

tentarmos um novo acesso seraacute redirecionado para o

instance-two

No CLI execute o seguinte comando para parar o

instance-one

[domain1921682381869999 ] host=host01server -

config=instance-onestop

outcome =gt success

result =gt STOPPING

Acesse novamente a aplicaccedilatildeo http192168238186

systemprops

Perceba que agora estamos no instance-two Concluiacutemos assim que o balanceamento de carga estaacute funcionando

Conclusatildeo

O JBoss AS 7 trouxe a evoluccedilatildeo arquitetural que era esperada como pode ser vista nesse artigo Carregamento de moacutedulos dinacircmico gerenciamento centralizado e tempo de startup reduzido satildeo apenas

algumas das inuacutemeras melhorias trazidas nessa versatildeo

Espera-se que a plataforma JBoss continue evoluindo

trazendo sempre mais benefiacutecios a todos que utilizam

os produtos desse ecossistema Cada membro da

comunidade tambeacutem pode fazer a sua parte seja

colaborando com artigos ou participando de

discussotildees para encontrar melhorias para a

plataforma Cabe a noacutes aceitar o convite de melhorar

cada vez mais essa tecnologia

JBOSS APLICATION SERVER 7

AUTOR Escrito por Mauricio Magnani Jr

Consultor JBoss com 6 anos de experiecircncia no mercado Trabalhou na RedHat como Engenheiro de Suporte JBoss atenden-

do clientes da Ameacuterica Latina e EUA Criador e mantenedor do blog httpsjbossdiverswordpresscom e membro ativo do

Grupo de Usuaacuterios JBoss do Brasil Hoje eacute Senior Java Software Engineer no Groupon Brasil Possui as certificaccedilotildees Red Hat

Certified JBoss Administrator on JBoss EAP 5 e JBoss EAP 6

Milhares de apli-

cativos para Web

e Mobile satildeo desenvol-

vidos a cada mecircs utili-

zando esta plataforma

como base A platafor-

ma Java mudou muito

desde seu iniacutecio e pro-

vavelmente vai conti-

nuar evoluindo nos

proacuteximos anos

A PROGRAMAR

28

Para o desenvolvimento de aplicaccedilotildees Web existem um sem

nuacutemero de frameworks gratuitas e mais ou menos bem con-

ceituadas Contudo temos vaacuterios problemas associados que

com o crescer de uma aplicaccedilatildeo podem trazer vaacuterios recuos

no seu desenvolvimento Um dos maiores eacute o oacutebvio satildeo

gratuitas e por isso mesmo o coacutedigo eacute lido por milhares de

pessoas em todo o mundo tornando as falhas de seguranccedila

bastante visiacuteveis e faacuteceis de explorar Outro grande proble-

ma eacute o facto de trazerem funcionalidades especiacuteficas em que

muitas vezes natildeo as usamos tornando-se em alguns casos

um ldquocanhatildeo para matar um mosquitordquo Pegando na aborda-

gem das correntes frameworks podemos noacutes proacuteprios cons-

truir algo soacutelido o suficiente para uma grande aplicaccedilatildeo

Vamos nesta seacuterie de trecircs artigos construir uma framework

passo-a-passo comeccedilando pelo baacutesico mas o mais importan-

te o routing

htaccess

Tirando partido do serviccedilo Apache delegamos o enclausura-

mento do nosso sistema de ficheiros agrave regras htaccess Natildeo

permitimos a listagem de ficheiros nem a execuccedilatildeo de outros

scripts PHP agrave excepccedilatildeo do indexphp sendo este o respon-

saacutevel pelo routing da framework Para garantirmos que estas

regras satildeo cumpridas e que o indexphp seja sempre chama-

do redireccionamos todos os pedidos de execuccedilatildeo de

scripts para o mesmo indexphp dando-lhe todos os argu-

mentos do URL originalmente fornecidos Desta forma o

utilizador natildeo sabe a que ficheiros ou pastas estaacute a aceder

A esta regra temos de adicionar uma excepccedilatildeo a pasta con-

tent onde temos todos os conteuacutedos como imagens ficheiros

CSS viacutedeos etc No fundo todos aqueles ficheiros que o

browser do utilizador vai descarregar Para mantermos o

enclausuramento da nossa aplicaccedilatildeo natildeo eacute aconselhado

natildeo colocarmos nessa pasta nenhum tipo de script visto que

pode ser executado arbitrariamente do exterior o contraacuterio

do que queremos

configphp

PHP Uma framework ldquofrom scratchrdquo (Parte 1) Usaremos este ficheiro como auxilio para definiccedilotildees de cami-

nhos para pastas e configuraccedilotildees por defeito

define(DS DIRECTORY_SEPARATOR)

Esta definiccedilatildeo eacute uma redundacircncia eacute definida simplesmente

por conveniecircncia na escrita do coacutedigo

define(BASE_PATHhttplocalhost)

Aqui definimos o caminho URL para a nossa aplicaccedilatildeo

define(DEFAULT_PAGEhello)

Esta eacute a nossa paacutegina por defeito caso nenhuma tenha sido

requirida

define(ROOT$_SERVER[DOCUMENT_ROOT])

Aqui eacute definido o caminho para a pasta da aplicaccedilatildeo

Uma vez definidas as configuraccedilotildees passamos agrave parte mais

importante o routing

Visto que temos todos os requests redireccionados para o

indexphp agora temos de fazer sentido dos argumentos

que satildeo passados pelo URL

Aqui separamos os argumentos em duas partes a paacutegina

que queremos aceder e os argumentos para esta paacutegina O

seguinte pedido

httplocalhosthellofoobar

resulta em

RewriteEngine on RewriteCond $1 ^(allowphp|indexphp|content) RewriteRule ^()$ indexphp$1 [L] ltFiles htaccessgt order allowdeny deny from all ltFilesgt

define(DS DIRECTORY_SEPARATOR) define(BASE_PATHhttplocalhost) define(DEFAULT_PAGEhello) define(ROOT$_SERVER[DOCUMENT_ROOT])

function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url

array (size=2) page =gt string hello (length=5) args =gt array (size=2) 0 =gt string foo (length=3) 1 =gt string bar (length=3)

A PROGRAMAR

29

(hellip)micro-

framework temos um

sistema de routing que

nos iraacute permitir nos

dois proacuteximos artigos

alargar os horizontes

passando a uma pro-

gramaccedilatildeo OOP e imple-

mentando MVC

De seguida encaminhamos para a paacutegina requerida

Aqui verificamos se a paacutegina que eacute pedida existe no case de

existir importamos o ficheiro caso contrario enviamos o header

de erro e terminamos a aplicaccedilatildeo

Indexphp

ROOT

Indexphp

Configphp

htaccess

Pages

Hellophp

Com esta micro-framework temos um sistema de routing que

nos iraacute permitir nos dois proacuteximos artigos alargar os horizon-

tes passando a uma programaccedilatildeo OOP e implementando

MVC Finalmente iremos implementar um pequeno driver

para MySQL e um debugger

Dependecircncias

Apache com mod_rewrite e PHP

P VS NP COMPREENDER O MAIOR PROBLEMA POR RESOLVER EM COMPUTACcedilAtildeO

function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

ltphp require_once (configphp) function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

callHook() gt

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

COLUNAS C - Observable vs Task

Visual (Not) Basic - Operator Overloading

C

32

Nas ediccedilotildees anteriores vimos como transformar uma API

baseada assiacutencrona em eventos numa API baseada em ob-

servaacuteveis (observables) ou numa API baseada em tarefas

A questatildeo que se levanta eacute quando usar qual

Quando Usar Observaacuteveis

A programaccedilatildeo baseada em observaacuteveis eacute tambeacutem conheci-

da como programaccedilatildeo reativa e comeccedilou a ser usada como

alternativa a assiacutencrona baseada em eventos porque a pro-

gramaccedilatildeo assiacutencrona baseada em tarefas ainda natildeo estava

disponiacutevel (ou natildeo estava disponiacutevel em todas as platafor-

mas)

Na verdade o campo de batalha da programaccedilatildeo reativa

satildeo as correntes de eventos (event streams) Eacute aqui que a

utilizaccedilatildeo de eventos se torna tambeacutem mais natural

Uma API baseada em eventos em que o evento apenas eacute

disparado uma vez eacute na verdade uma API baseada em

chamadas de resposta (callback) O facto de ser implemen-

tada com o mecanismo de eventos da plataforma NET natildeo

faz dela uma API baseada em eventos

A existecircncia da necessidade de combinar vaacuterias correntes de

eventos e relacionaacute-los entre si eacute tambeacutem uma boa indicaccedilatildeo

para a utilizaccedilatildeo de observaacuteveis

Quando Usar Tarefas

Como o nome indica uma tarefa eacute algo que tem um iniacutecio e

um fim Assim sendo todas as API assiacutencronoas baseadas

num mecanismo de chamada de resposta (callback) satildeo

candidatadas a ser transformadas numa API assiacutencrona

baseada em tarefas Mesmo que o mecanismo de chamada

de resposta sejam eventos NET

Matriz De Aplicabilidade

Baseando-nos nas consideraccedilotildees anteriores e porque nem

sempre tudo eacute assiacutencrono chegamos agrave seguinte matriz de

aplicabilidade

Conclusatildeo

No final natildeo existe uma resposta maacutegica O que numa situa-

ccedilatildeo pode ser um observaacutevel noutra pode ser uma tarefa

Recursos

O GeoCoordinateWatcher Como Um Serviccedilo Reativo - Re-

vista PROGRAMAR - 39ordf Ediccedilatildeo - Fevereiro 2013

Trazendo Async E Await ao Serviccedilo de Contactos do Win-

dows Phone - Revista PROGRAMAR - 40ordf Ediccedilatildeo - Abril

2013

Extensotildees Reativas (Rx)

Programaccedilatildeo assiacutencrona com async e await (C e Visual

Basic)

C - OBSERVABLE VS TASK

Siacutencrono Assiacutencrono

Um uacutenico valor - Tarefa

Muacuteltiplos valo-

res

Enumeraacutevel Observaacutevel

AUTOR

Escrito por Paulo Morgado

Bacharel em Engenharia Electroacutenica e Telecomunicaccedilotildees (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa

e Licenciado em Engenharia Informaacutetica pela Faculdade de Ciecircncias e Tecnologia da Universidade Nova de Lisboa exerce

variadas funccedilotildees relacionadas com o desenvolvimento distribuiccedilatildeo e manutenccedilatildeo de software haacute mais de 10 anos Participa

em diversas comunidades nacionais e internacionais (pontoNETpt NetPonto SharePointPT SQLPort Portugal-a-Programar

CodeProject CodePlex etc) Pelo seu contributo para com estas comunidades a Microsoft premeia-o com o preacutemio MVP

(C) desde 2003 Eacute ainda co-autor do livro ldquoLINQ Com Crdquo da FCA httpPauloMorgadoNET - PauloMorgado

o campo de bata-

lha da programaccedilatildeo re-

ativa satildeo as correntes

de eventos (event stre-

ams)

VISUAL (NOT) BASIC

33

ldquoNatildeo podes somar batatas com elefantesrdquo

Frases como a anterior ou semelhantes jaacute vos passaram

por a consideraccedilatildeo em alguma altura da vossa vida Quer

tenha sido nos vossos primeiros passos a matemaacutetica ou

ainda na semana passada em qualquer implementaccedilatildeo de

software mais rebuscada algueacutem algures transmitiu dessa

forma que natildeo eacute possiacutevel operar aquelas duas variaacuteveis

De facto batatas e elefantes natildeo satildeo tipicamente operaacuteveis

a menos que a resposta de que estamos agrave procura seja dife-

rente

Saber como operar

A soluccedilatildeo da soma de batatas com elefantes reside precisa-

mente na resposta que procuramos obter

Eu posso dizer que Elefante + Batata eacute igual a 4 se for es-

pecificado que a soma de seres-vivos opera aritmeticamente

o nuacutemero de pernas do ser Natildeo posso Claro que posso

Soacute precisamos de definir que os seres-vivos satildeo operaacuteveis

assim e de que forma Eacute aqui que entra o ldquooverloadrdquo de ope-

radores

Operadores

Operadores sim Quando se falam de operadores referem-

se todos aqueles que estatildeo provavelmente a passar-vos na

cabeccedila agora tanto unaacuterios como binaacuterios mas nem todos

Unaacuterios + - Not IsTrue IsFalse CType

Binaacuterios + - amp Like Mod And Or Xor ^ ltlt

gtgt = ltgt gt lt gt= lt=

Estes operadores fazem sentido nos usos comuns onde jaacute

sabemos para que servem e que resultados vatildeo surtir

Agrave luz da especificaccedilatildeo anterior podemos afirmar com segu-

ranccedila que Elefante gt Batata porque uma batata natildeo tem

pernas e porque conhecemos o operador gt (maior que)

A implementaccedilatildeo do operador pode basear-se em qualquer

aspecto dos seus operandos mas natildeo eacute boa ideia contradi-

zer a loacutegica do operador que se estaacute a definir Por razotildees

oacutebvias natildeo eacute boa ideia por exemplo implementar overloads

de tal forma que Batata - Elefante = -4 ao mesmo tempo que

Batata gt Elefante = TRUE Natildeo faz sentido porque natildeo esta-

mos a usar o mesmo criteacuterio Se Batata ndash Elefante eacute menor

que zero a Batata deveria ser menor que o Elefante e natildeo o

contraacuterio

Natildeo eacute que seja impossiacutevel mas vai tornar o coacutedigo muito

mais difiacutecil de ler o que vai contra a facilidade do overload

de operadores

Overload

A ideia natildeo eacute inventar novos operadores O que queremos

realmente indicar eacute qual o procedimento a seguir para conse-

guir aplicar o anaacutelogo do operador para determinado tipo ou

determinados tipos Assim o operador + por exemplo teraacute

de continuar a fazer sentido na aritmeacutetica ao mesmo tempo

que faz sentido na soma de seres-vivos se tentarmos somar

nuacutemeros entra o operador aritmeacutetico se tentarmos somar

batatas com elefantes entra a nossa implementaccedilatildeo do ope-

rador

Portanto e em tom de resumo da mesma forma que defini-

mos overloads de meacutetodos tambeacutem se definem overloads

de operadores com base na sua assinatura

Jaacute chega de elefantes e batatas natildeo

Efectivamente jaacute Natildeo conveacutem esticar a analogia ateacute porque

nem todos os operadores fazem sentido com uma classe de

seres vivos As coisas comeccedilam a ficar mais claras com

exemplos de implementaccedilatildeo

Vamos considerar a seguinte classe para exemplificar

Como seraacute de esperar se tentarmos por exemplo comparar

instacircncias desta classe o Visual Basic natildeo saberaacute o que

fazer para comparar Eacute um tipo composto que compreende

OPERATOR OVERLOADING

Public Class Veiculo Public Enum TipoVeiculo AUTOMOVEL MOTO PESADO End Enum Public Enum TipoCombustivel GASOLINA GASOLEO HIBRIDO ELECTRICO GPL End Enum Public Property Tipo As TipoVeiculo Public Property Marca As String Public Property Modelo As String Public Property Cilindrada As Integer Public Property Combustivel As TipoCombustivel Public Property NumeroPortas As Short Sub New(Tipo As TipoVeiculo Marca As String Modelo As String Cilindrada As Integer Combustivel As TipoCombustivel NumeroPortas As Short) _Tipo = Tipo _Marca = Marca _Modelo = Modelo _Cilindrada = Cilindrada _Combustivel = Combustivel _NumeroPortas = NumeroPortas End Sub End Class

VISUAL (NOT) BASIC

34

membros que noacutes mesmos criamos e seria impossiacutevel perce-

ber automaticamente quais as caracteriacutesticas a comparar

Este coacutedigo natildeo compila com dois erros em Carro1 = Carro2

e Carro2 = Carro3

Operator = is not defined for types OperatorOverloadVeicu-

lo and OperatorOverloadVeiculo

E tem toda a razatildeo O operador igual (=) natildeo estaacute nem im-

plementado na classe nem tem nenhum overload que im-

plique uma operaccedilatildeo binaacuteria com dois tipos Veiculo

Vamos entatildeo implementar um operador para o igual (=) que

consiga determinar se estamos na presenccedila do mesmo

veiacuteculo ou natildeo Vamos considerar que a cilindrada natildeo eacute um

factor para distinguir dois carros

Basta acrescentar os seguintes meacutetodos na classe Veiculo

Algumas implementaccedilotildees de operadores implicam que se

implementem tambeacutem a sua negaccedilatildeo No caso do operador

igual (=) eacute necessaacuterio natildeo soacute especificar o que eacute consider-

ado igual mas tambeacutem o que eacute considerado diferente

Assim o coacutedigo anterior jaacute eacute correctamente compilado e

produz o seguinte output

Carro1 = Carro2 False

Carro2 = Carro3 True

O que eacute verdade Como operaccedilotildees aritmeacuteticas natildeo faziam

muito sentido com uma classe a representar um veiacuteculo

vamos considerar esta nova classe

Esta classe representa um vector tridimensional Manteacutem um

valor para X para Y e para Z Natildeo adianta realizar

operaccedilotildees aritmeacuteticas com o Vector uma vez que novamen-

te o Visual Basic natildeo saberia o que fazer com ele

Vamos entatildeo acrescentar alguns operadores

Assim jaacute eacute possiacutevel efectuar algumas operaccedilotildees com esta

classe

OPERADOR LIKE

Public Shared Operator =(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return False If V1Combustivel ltgt V2Combustivel Then Return False If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return False If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return False If V1NumeroPortas ltgt V2NumeroPortas Then Return False Return True End Operator Public Shared Operator ltgt(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return True If V1Combustivel ltgt V2Combustivel Then Return True If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return True If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return True If V1NumeroPortas ltgt V2NumeroPortas Then Return True Return False End Operator

Public Class Vector3 Public Property X As Decimal Public Property Y As Decimal Public Property Z As Decimal Sub New(X As Decimal Y As Decimal Z As Decimal) _X = X _Y = Y _Z = Z End Sub Public Overrides Function ToString() As String Return StringFormat((012) _X _Y _Z) End Function End Class

Public Shared Operator +(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X + V1X V2Y + V1Y V2Z + V1Z) End Operator Public Shared Operator -(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X - V1X V2Y - V1Y V2Z - V1Z) End Operator Public Shared Operator (V1 As Vector3 V2 As Vector3) Return (V2X V1X) + (V2Y V1Y) + (V2Z V1Z) End Operator Public Shared Operator (V1 As Vector3 E1 As Decimal) Return New Vector3(E1 V1X E1 V1Y E1 V1Z) End Operator Public Shared Operator amp(S1 As String V1 As Vector3) Return S1 amp V1ToString End Operator

Dim V1 As New Vector3(3 2 1) Dim V2 As New Vector3(1 2 3) DebugWriteLine(Adiccedilatildeo amp (V1 + V2)) DebugWriteLine(Subtraccedilatildeo amp (V1 - V2)) DebugWriteLine(Produto escalar amp (V1 V2)) DebugWriteLine(Multiplicaccedilatildeo com escalar amp (V2 3))

Dim Carro1 As New Veiculo(AUTOMOVEL Ford Ka 1249 GASOLINA 3) Dim Carro2 As New Veiculo(AUTOMOVEL Ford Ka 1250 GASOLEO 3) Dim Carro3 As New Veiculo(AUTOMOVEL Ford Ka 1251 GASOLEO 3) DebugWriteLine(Carro1 = Carro2 amp (Carro1 = Carro2)) DebugWriteLine(Carro2 = Carro3 amp (Carro2 = Carro3))

VISUAL (NOT) BASIC

35

O que produz

Adiccedilatildeo (444)

Subtraccedilatildeo (-202)

Produto escalar 10

Multiplicaccedilatildeo com escalar (369)

Foi necessaacuterio especificar o operador de concatenaccedilatildeo para

que o Visual Basic saiba como tratar a concatenaccedilatildeo de uma

String com o resultado de uma outra operaccedilatildeo com a mesma

classe

Neste caso estamos apenas a concatenar a String com a

representaccedilatildeo String da classe que definimos anteriormen-

te Ao analisar os operadores podemos verificar que existem

dois overloads para a multiplicaccedilatildeo

Um implica dois vectores e o outro um vector e um decimal

A nossa implementaccedilatildeo dita que se forem fornecidos dois

vectores o resultado seraacute o produto escalar dos dois vec-

tores

Se for fornecido apenas um vector e um valor escalar o re-

sultado seraacute outro vector que representa o produto desse

vector com um escalar

Existe com certeza aplicaccedilotildees matemaacuteticas (e natildeo soacute) mais

interessantes mas as apresentadas demonstram a facilidade

com que implementamos os nossos proacuteprios comportamen-

tos de operadores

Conclusatildeo

Operator overloading permite uma notaccedilatildeo mais proacutexima do

domiacutenio alvo o que promove a legibilidade e dissipa duacutevidas

de interpretaccedilatildeo Esta eacute a sua maior vantagem

No entanto se as implementaccedilotildees natildeo forem de encontro ao

sentido natural dos operadores o efeito poderaacute ser o perfeito

contraacuterio

Eacute um caso tiacutepico de melhor amigo ou pior inimigo Natildeo haacute

meio-termo

OPERADOR LIKE

AUTOR

Escrito por Seacutergio Ribeiro

Curioso e autodidata com uma enorme paixatildeo por tecnologias de informaccedilatildeo e uma saudaacutevel relaccedilatildeo com a NET Fra-

mework Moderador global na comunidade PortugalProgramar desde Setembro de 2009 Alguns frutos do seu trabalho

podem ser encontrados em httpwwwsergioribeirocom

Operator overlo-

ading permite uma no-

taccedilatildeo mais proacutexima do

domiacutenio alvo

Media Partners da Revista PROGRAMAR

EVENTOS

37

No passado dia 25 de Maio de 2013 realizou-se na Microsoft

Portugal no Parque das Naccedilotildees o 1ordm evento presencial da

comunidade Portugal a Programar Ainda antes das 9h come-

ccedilaram a chegar os participantes crescia o entusiasmo envolto

em todo o evento e pouco a pouco todos noacutes fomos dando

cara aos nicks a que nos habituaacutemos ao longo dos anos

Pontualmente a organizaccedilatildeo deu iniacutecio ao evento PROGRA-

MAR 2013 com Jorge Paulino David Pintassilgo e Rui Gon-

ccedilalves a abrir o evento Brevemente foi-nos dada a conhecer

a comunidade PP assim como os quatro pontos-chave que

a caracterizam

Foacuterum PP

Wiki

Portal de Downloads

Revista Programar

Parafraseando o anfitriatildeo Jorge Paulino ldquoeste foi um projeto

que se iniciou a 28 de Maio de 2005 para dar resposta agrave ne-

cessidade de partilhar informaccedilatildeo e experiecircncias nesta aacutereardquo

Apoacutes a apresentaccedilatildeo do evento e da comunidade seguiu-se

um discurso inspirador de um dos oradores Rui Delgado

acerca da necessidade de se empreender em Portugal

Com o limite de inscriccedilotildees a ser atingido em apenas trecircs dias

o 1ordm evento do PP contou com a presenccedila de 19 oradores

voluntaacuterios que deram origem a 18 apresentaccedilotildees teacutecnicas e

a 2 workshops praacuteticos Cerca de 250 participantes estiveram

presentes no edifiacutecio da Microsoft Lisbon Experience

EVENTO PROGRAMAR 2013

EVENTOS

38

Pelas diversas salas do evento partilharam-se experiecircncias e

conhecimento As apresentaccedilotildees decorreram 3 em simultacirc-

neo e foram as seguintes

Apresentaccedilatildeo das novidades de Java EE 7 (Ernest

Duarte)

As novidades do C 50 (Paulo Morgado)

ASPNET SignalR ndash Comunicaccedilatildeo em real-time sim-

ples e para todo mundo (Glauco Godoi)

Conquistar o mundo com aplicaccedilotildees feitas agrave velocida-

de da luz (Ricardo Marques)

CRM Como escolher De raiz ou sistema jaacute desen-

volvido (Pedro Azevedo)

Desenvolvimento de Aplicaccedilotildees em Windows Phone 8

(Nuno Silva)

Desenvolvimento em SharePoint por onde comeccedilar

(Rodrigo Pinto)

Desenvolvimento raacutepido de siacutetios web com personali-

zaccedilatildeo de Joomla ( Rui Guimaratildees )

DMVs ndash Conhece o teu SQL Server (Vitor Pombeiro)

Empreendedorismo em TI (Fernando Martins)

HTML5 e CSS3 ndash raacutepido e eficaz para o presente

(Seacutergio Laranjeira)

Introduccedilatildeo ao Cloud Computing e ao Windows Azure

(Vitor Tomaz)

Microsoft Kinect SDK (Rui Simatildeo)

Plataforma de desenvolvimento para Windows Store

Apps (Nuno Silva)

Powershell agrave minha maneira (Bruno Lopes)

O desenvolvimento de aplicaccedilotildees moacuteveis antes da 1ordf

linha de coacutedigo (Alberto Silva)

SEO ndash A importacircncia do Search Engine Optimization

(Miguel Lobato)

SQL Server ndash Performance e Tunning (Pedro Martins)

E ainda os workshops praacuteticos

Workshop ndash Integraccedilatildeo de CRM Dynamics com Java

e NET (Pedro Azevedo)

Workshop ndash Web em Realtime (Seacutergio Costa)

EVENTOS

39

Durante o decorrer das sessotildees houve ainda oferta de brindes

(gentilmente oferecidos pelos patrocinadores) aos participan-

tes

Outro ponto que marcou este PROGRAMAR 2013 foi o con-

curso de aplicaccedilotildees Windows Phone e Windows 8 vencido

por Jorge Costa com o jogo ldquoLittle Bitsrdquo sendo o segundo

lugar atribuiacutedo a Mauro Castro pela aplicaccedilatildeo ldquoPortugalrsquos Eve-

ningsrdquo

Houve ainda demostraccedilotildees do Microsoft Kinect (Rui Simatildeo) e

do Leap Motion (Diniz Vieira) a todos os participantes interes-

sados e todo o dia foi passado num espiacuterito descontraiacutedo e

animado aumentando assim os laccedilos entre toda a comunida-

de

A toda a organizaccedilatildeo e a todos os oradores envolvidos dei-

xamos um agradecimento especial agradecendo tambeacutem a

todos os patrocinadores nomeadamente a Microsoft Portugal

ESET Portugal FCA Editora Rumos e Truewind-Chiron Nun-

ca deixando de referir tambeacutem os Media Parters que ajuda-

ram a toda a divulgaccedilatildeo deste evento

A todos os elementos da comunidade que fazem com que a

Portugal-a-Programar seja cada vez mais conhecida no nosso

paiacutes e aleacutem-fronteiras a todos deixamos um ldquoMuito Obriga-

dordquo relembrando mais uma vez que este eacute um projeto de to-

dos e para todos e que a mais pequena accedilatildeo pode fazer a

diferenccedila

Eacute com satisfaccedilatildeo e orgulho que podemos afirmar que o 1ordm

Evento Presencial do PP foi um sucesso pois mesmo apoacutes

as sessotildees terem terminado houve ainda quem se mantives-

se no local partilhando experiecircncias de um dia cheio de emo-

ccedilotildees

E citando um dos oradores do evento Rui Delgado ldquoOh Yes

Muito Bomrdquohellip Venha o PROGRAMAR 2014

Paacutegina do evento httpeventoportugal-a-programarpt

(hellip) a mais peque-

na accedilatildeo pode fazer a

diferenccedila

Anaacutelises Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

C 50 com Visual Studio 2012

Review

41

Tiacutetulo Android ndash Introduccedilatildeo ao Desenvol-

vimento de Aplicaccedilotildees

Autor Ricardo Queiroacutes

Editora FCA

Paacuteginas 224

ISBN 978-972-722-763-1

O Android tornou-se na plataforma de dispositivos moacuteveis

mais usada no mundo e como tal existe um interesse cres-

cente dos programadores em criarem soluccedilotildees para esse

mercado Para quem queira dar aquele 1ordm passo no desen-

volvimento de aplicaccedilatildeo em Android o livro ldquoAndroid - Intro-

duccedilatildeo ao desenvolvimento de aplicaccedilotildeesrdquo de Ricardo Quei-

roacutes eacute uma boa escolha

Conteacutem passo a passo desde a configuraccedilatildeo do ambiente

de desenvolvimento ateacute agrave concepccedilatildeo de uma aplicaccedilatildeo para

Android na sua iacutentegra Destaca exemplos muito uacuteteis que

podem ser reaproveitados noutra aplicaccedilatildeo pois contempla

o desenho de uma interface graacutefica a gestatildeo de dados da

aplicaccedilatildeo atraveacutes de gestatildeo de ficheiros ou bases de dados

utilizaccedilatildeo de APIs de localizaccedilatildeo mapas e sensores e a

criaccedilatildeo do jogo do galo

Durante a sua leitura pode-se constatar que eacute um livro rico

em imagens explicativas e exemplificativas que nos ajudam

a perceber o que devemos fazer e o que devemos alcanccedilar

com a construccedilatildeo de todo o coacutedigo escrito

Infelizmente jaacute eacute habitual que nos sejam apresentados os

tiacutepicos tons acinzentados das ilustraccedilotildees e a ausecircncia de

qualquer tipo de realce de sintaxe no coacutedigo-exemplo o que

por vezes pode-se tornar cansativo ao olhar

Um factor alheio ao autor do livro mas que a editora em

causa deveria ter em consideraccedilatildeo por forma a facilitar a

leitura

ldquoAndroid ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildeesrdquo

de Ricardo Queiroacutes eacute um bom livro para quem jaacute tenha algu-

ma experiecircncia em programaccedilatildeo Java e que queira explorar

as potencialidades do Android

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

(hellip) destaca exem-

plos muito uacuteteis que

podem ser reaproveita-

dos noutra aplicaccedilatildeo

(hellip)

Review

42

Tiacutetulo C 50 com Visual Studio 2012

Autor Henrique Loureiro

Editora FCA

Paacuteginas 608

ISBN 978-972-722-752-5

Elementos de programaccedilatildeo

Abordam-se os temas de programaccedilatildeo mais elementar com

referecircncias agrave programaccedilatildeo iterativa passando pela orientada

a objecto O texto estaacute nitidamente orientado para um puacutebli-

co que tem noccedilotildees baacutesicas de programaccedilatildeo explicando a

loacutegica de uma funccedilatildeo ateacute agrave heranccedila de classes Tenta de

uma forma sucinta demonstrar na praacutetica ou seja com code-

snipets como construir de uma forma coerente uma aplica-

ccedilatildeo em C recorrendo ao Visual Studio

Usabilidade - Eacute tambeacutem abordada a importacircncia da usabili-

dade do user-interface numa qualquer aplicaccedilatildeo Satildeo de-

monstrados os conceitos baacutesicos de Interaccedilatildeo Homem-

Maacutequina e como aplica-los aos Windows Forms Este tema

serve de ponte para um tema bem mais extensivo Windows

Forms e programaccedilatildeo orientada agrave GUI detalhando alguns

dos componentes que a NET traz buit-in Explica a funciona-

lidade e a interecccedilatildeo com os componentes mais genericas e

mais usuais para uma aplicaccedilatildeo que se use de um sistema

de janelas como GUI A explicaccedilatildeo embora limitada a pou-

cos elementos eacute bastante completa dando ecircnfase aos

events associados a este tipo de modulos explicando assim

a programaccedilatildeo assiacutencrona em Windows Forms

Modelaccedilatildeo de dados e LINQ - Temos uma explicaccedilatildeo

bottom-to-top da noccedilatildeo de modelaccedilatildeo de dados Sendo nes-

te tema um pouco mais extenso explicando toda a noccedilatildeo da

Modelaccedilatildeo e das Formas Normais Recorre-se ao SQL Ser-

ver para fazer toda a explicaccedilatildeo na praacutetica dos conceitos

sendo bastante ilustrativo com diagramas e screenshots de

um processo de criaccedilatildeo e normalizaccedilatildeo de uma base de

dados Tendo a base de dados criada no SQL Sever passa

agrave explicaccedilatildeo do que eacute o LINQ e sua sintaxe em C Aqui eacute

feita mais uma vez a ponte com Windows Froms utilizando

componentes anteriormente demonstrados mapeando tabe-

las e manipulaccedilotildees baacutesicas Outra vez grande ecircnfase aos

events

C 50 com Visual Studio 2012

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

Sistema Operativo e Input Output Comeccedilando pela base

expotildee passo-a-passo como manipular as Tarefas e Proces-

sos do Windows explicando tambeacutem como colmatar as dife-

renccedilas entre versotildees do sistema operativo Daacute exemplos de

como manipular ficheiros de texto dando uma introduccedilatildeo agrave

encriptaccedilatildeo que vem built-in na NET Mostra como se usa o

Graphics da NET explicando os seus conceitos base dese-

nho e animaccedilatildeo chegando a agrave impressatildeo destes mesmos

graacuteficos desenhados Com este tema aprofunda a explicaccedilatildeo

dos Windows Forms fazendo a ponte para WPF

WPF XML e XAML - Tendo explicado Windows Forms pas-

sa agrave explicaccedilatildeo das diferenccedilas e semelhanccedilas do mesmo

com WPF dando tambeacutem a sua opiniatildeo sobre o futuro das

mesmas dando a entender que WPF iraacute substituir Windows

Forms eventualmente Para o efeito comeccedila por explicar o

que eacute XML dando exemplos de aplicaccedilotildees em C NET para

manipulaccedilatildeo deste tipo de dados passando para um niacutevel

acima o XAML Exemplo atraacutes de exemplo demonstra como

usar as potencialidade do WPF mostrando como usar

Graphics com a sintaxe XAML incluindo animaccedilatildeo

WebViews views modelares e navegaccedilatildeo entre diferentes

ecratildes numa soacute janela

Integraccedilatildeo com Microsoft Office e Windows Store - Eacute

tambeacutem mostrada a facilidade com que se integra uma apli-

caccedilatildeo feita em C comas a principais ferramentas do MS

Office Word Excel PowerPoint Access e Outlook Demons-

tra agrave semelhanccedila de outras ferramentas Microsoft que haacute

sempre uma Class buit-in na NET para criar e manipular

este tipo de documentos da famiacutelia Microsoft No caso da

Windows Store daacute exemplos vocacionados para Windows 8

e como tirar partido do conceito visual Metro e seus layouts

geneacutericos fazendo aplicaccedilotildees como uma calculadora e uma

WebView

Opiniatildeo pessoal - Na minha opiniatildeo este livro eacute ideal no

mundo acadeacutemico servindo perfeitamente como suporte a

um professor para leccionar uma cadeira de programaccedilatildeo

OOP ou ateacute para programaccedilatildeo 2D Tambeacutem natildeo acharia

descabido servir como suporte a um aluno para evoluir da

programaccedilatildeo iterativa para OOP visto que o livro estaacute repleto

de exemplos e exerciacutecios tendo ateacute no final 3 projectos from

scratch de aplicaccedilotildees completas explicando todo o processo

loacutegico na elaboraccedilatildeo de todos os aspectos da mesma de

base de dados normalizada interacccedilatildeo Homem-Maacutequina a

comercializaccedilatildeo na Windows Store

COMUNIDADES Comunidade NetPonto mdash Telerik RadControls - Raacutepida implementaccedilatildeo da

paacutegina Sobre para Windows Phone Apps

COMUNIDADE NETPONTO

44

httpnetpontoorg

Introduccedilatildeo

A Telerik RadControls disponibiliza um projeto template que

permite escolher um conjunto de funcionalidade que seratildeo

incluida no projeto aquando da sua criaccedilatildeo A paacutegina

Sobre eacute uma delas

Truque A Telerik oferece uma versatildeo de teste que permite

explorar os controlos O programa Nokia Premium Developer

permite aos seus membros terem uma licenccedila vaacutelida destes

Ecratildes

Para compreender melhor o que iremos fazer primeiro

iremos criar a paacutegina Sobre que eacute fornecida pelo projeto

template da Telerik cujo resultado eacute

Paacutegina Sobre gerada por omissatildeo pelo projeto template da Telerik

Depois iremos customizar a paacutegina para que esta tenha a

sua proacutepria informaccedilatildeo o resultado seraacute

Customizaccedilatildeo da paacutegina Sobre

Criaccedilatildeo do projeto

Para comeccedilar o projeto eacute recomendado que se instale os

Telerik RadControls (versatildeo de teste)

1 Seleccedilatildeo do projeto que se iraacute criar

Criando o projeto

2 A Telerik tem uma interface para a seleccedilatildeo inicial

Selecione a plataforma e referecircncias da Telerik que

queremos

Selecionando a plataforma e as referecircncias

3 Seleccedilatildeo da funcionalidade paacutegina Sobre

Quando o projeto eacute criado iremos obter a paacutegina por omissatildeo

podemos ver nos ecratildes

TELERIK RADCONTROLS - RAacutePIDA IMPLEMENTACcedilAtildeO DA PAacuteGINA SOBRE PARA WINDOWS PHONE APPS

COMUNIDADE NETPONTO

45

httpnetpontoorg

O resultado da estrutura do projeto seraacute

Customizaccedilatildeo

Comecemos por analisar a paacutegina Home Page

Cujo XAML eacute

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleMainPage xmlns=http schemasmicrosoftcomwinfx2006xaml presentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg

markup-compatibility2006 xmlnsphone= clr-namespaceMicrosoftPhone Controlsassembly=MicrosoftPhone xmlnsshell= clr-namespaceMicrosoft PhoneShellassembly=MicrosoftPhone FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation=Portrait SupportedOrientations=Portrait shellSystemTrayIsVisible=True mcIgnorable=dgt lt-- LayoutRoot is the root grid where all page content is placed --gt ltGrid xName=LayoutRoot Background=Transparentgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt lt-- LOCALIZATION NOTE To localize the displayed strings copy their val-ues to appropriately named keys in the apps neutral language resource file (AppResourcesresx) then replace the hard-coded text value between the attributes quotation marks with the binding clause whose path points to that string name For example Text=Binding Path=LocalizedResourcesApplicationTitle Source=StaticResource LocalizedStrings This binding points to the templates string resource named ApplicationTitle Adding supported languages in the Project Properties tab will create a new resx file per language that can

COMUNIDADE NETPONTO

46

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

carry the translated values of your UI strings The binding in these examples will cause the value of the attributes to be drawn from the resx file that matches the CurrentUICulture of the app at run time --gt lt-- TitlePanel contains the name of the application and page title --gt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=MY APPLICATION gt ltTextBlock xName=PageTitle Margin=9-700 Style=StaticResource PhoneTextTitle1Style Text=page name gt ltStackPanelgt lt-- ContentPanel - place additional content here --gt ltGrid xName=ContentPanel GridRow=1 Margin=120120gt ltListBox Margin=140-120 FontFamily=StaticResource PhoneFontFamilySemiLight FontSize=StaticResource PhoneFontSizeExtraLargegt ltListBoxItem Content=About Tap=GoToAbout gt ltListBoxgt ltGridgt lt-- Uncomment to see an alignment grid to help ensure your controls are aligned on common bound-aries The image has a top margin of -32px to account for the System Tray Set this to 0 (or remove the margin altogether) if the System Tray is hidden Before shipping remove this XAML and the image itself--gt lt-- ltImage Source=AssetsAlignmentGridpng VerticalAlignment=Top Height=800 Width=480 Margin=0 GridRow=0 GridRowSpan=2 IsHit-TestVisible=False gt --gt ltGridgt lt-- Sample code showing usage of ApplicationBar -

-gt ltphonePhoneApplicationPageApplicationBargt ltshellApplicationBar IsMenuEnabled=True IsVisible=Truegt ltshellApplicationBarIconButton IconUri=Imagesappbar_button1png Text=Button 1 gt ltshellApplicationBarIconButton IconUri=Imagesappbar_button2png Text=Button 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBarMenuItem Text=MenuItem 1 gt ltshellApplicationBarMenuItem Text=MenuItem 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBargt ltphonePhoneApplicationPageApplicationBargt ltphonePhoneApplicationPagegt Para navegar para a paacutegina Sobre eacute necessaacuterio clicar na palavra About (tap gesture) o coacutedigo referente eacute ltListBoxItem Content=About Tap=GoToAbout gt E em code behind iremos ter ltsummarygt Navigates to about page ltsummarygt private void GoToAbout(object sender GestureEventArgs e) thisNavigationServiceNavigate(new Uri(Aboutxaml UriKindRelativeOrAbsolute)) Por fim a paacutegina AboutPage seraacute O coacutedigo XAML seraacute ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleAbout xmlns=httpschemasmicrosoftcomwinfx2006xamlpresentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg markup-compatibility2006 xmlnsphone=clr-namespace MicrosoftPhoneControlsassembly=MicrosoftPhone xmlnsshell=clr-namespace

COMUNIDADE NETPONTO

47

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

E o code behind

MicrosoftPhoneShellassembly=MicrosoftPhone xmlnsviewModels=clr-namespace NokiaDevRadControlsSampleViewModels Name=Root FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation= Portrait SupportedOrientations=Portrait dDesignHeight=768 dDesignWidth=480 shellSystemTrayIsVisible=True mcIgnorable=dgt ltGrid xName=LayoutRoot Background=Transparentgt ltGridDataContextgt ltviewModelsCommandSampleViewModel gt ltGridDataContextgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=APP TITLE gt ltTextBlock xName=PageTitle Margin=9-700 Style= StaticResource PhoneTextTitle1Style Text=about gt ltStackPanelgt ltGrid xName=ContentPanel GridRowSpan=2 Margin=12160121gt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition gt ltGridRowDefinitionsgt ltStackPanelgt ltTextBlock Margin=120120 FontFamily= StaticResource PhoneFontFamilySemiBold FontSize= StaticResource PhoneFontSizeLarge Text=Binding ApplicationName ElementName=Root gt ltStackPanel Orientation=Horizontalgt ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Version number gt

ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Binding Version ElementName =Root gt ltStackPanelgt ltStackPanelgt ltTextBlock GridRow=1 Margin=12241224 FontSize=StaticResource PhoneFontSizeNormal Foreground=StaticResource PhoneSubtleBrush TextWrapping=Wrapgt This application show an About page sample for Windows Phone applications ltLineBreak gt See more about it please see the following referenceampquot ltTextBlockgt ltHyperlinkButton GridRow=2 Margin=01200 HorizontalAlignment=Left Command=Binding SendAnEmailCommand Content=technical supportfeedback email FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltHyperlinkButton GridRow=3 Margin=01200 HorizontalAlignment=Left Command=Binding RateThisAppCommand Content=rate this app FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltStackPanel GridRow=4 Margin=1201250 VerticalAlignment= Bottomgt ltImage HorizontalAlignment=Left Source=Images CompanyLogopng Stretch=None gt ltTextBlock Margin=01200 FontSize= StaticResource PhoneFontSizeNormal Text=Copyright (c) 2013 Nokia Developer Wiki gt ltTextBlock FontSize= StaticResource PhoneFontSizeNormal Text=Nokia gt ltStackPanelgt ltGridgt ltGridgt ltphonePhoneApplicationPagegt

public partial class About INotifyPropertyChanged

COMUNIDADE NETPONTO

48

httpnetpontoorg

Nota O exemplo natildeo implementa o padratildeo MVVM mas

poderia

Usa a classe ApplicationManifest do (Cimbalino toolkit - cujo

coacutedigo fornte eacute este)

Usa a classe SendAnEmailCommand que eacute a implementaccedilatildeo

do ICommand e tem como finalidade enviar emails Sendo

utilizado na opccedilatildeo de suporte feedback

Usa a classe RateThisAppCommand que eacute a implementaccedilatildeo

do ICommand e serve para avaliar a aplicaccedilatildeo

Truque Se pretende um exemplo mais avanccedilado consulte o

artigo Paacutegina avanccedilada Sobre para aplicaccedilotildees de Windows

Phone

Referecircncias

Online Help ou download CHM (ZIP 14MB) ()

Telerik Examples - Windows Phone Application ()

Telerik RadControls for Windows Phone ()

Join Nokia Premium Developer Program and get RadControls

for free ()

() Artigos disponiacuteveis apenas em Inglecircs

Em conclusatildeo podemos concluir que existe vaacuterias formas de

implementar numa aplicaccedilatildeo da Windows Phone uma

paacutegina ldquoSobrerdquo ou ldquoAcercardquo sendo um processo que se pode

minimizar e enriquece a aplicaccedilatildeo

Este artigo foi originalmente escrito para a comunidade

Nokia Developer mais especificamente para a Wiki Paacutegina

Acerca de para aplicaccedilotildees de Windows Phone

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltsummarygt The application manifest ltsummarygt private readonly ApplicationManifest _applicationManifest ltsummarygt Initializes a new instance of the ltsee cref=Aboutgt class ltsummarygt public About() InitializeComponent() class that helps to get the application name and version (that is defined in manifest) var applicationManifestService = new ApplicationManifestService() _applicationManifest = applicationManifestService GetApplicationManifest() ltsummarygt The property changed ltsummarygt public event PropertyChangedEventHandler PropertyChanged ltsummarygt Gets the application name ltsummarygt public string ApplicationName get if (_applicationManifest = null) return _applicationManifestAppTitle return ND ltsummarygt Gets the version ltsummarygt public string Version get if (_applicationManifest = null) return _applicationManifestAppVersion return ND ltsummarygt

The on property changed ltsummarygt ltparam name=propertyNamegt The property name ltparamgt protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null) var handler = PropertyChanged if (handler = null) handler(this new PropertyChangedEventArgs(propertyName))

AUTOR

Escrito Por Sara Silva

eacute licenciada em Matemaacutetica ndash Especialidade em Computaccedilatildeo pela Universidade de Coimbra e eacute Microsoft Certified Pro-

fissional Developer Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps O

seu Blog eacute wwwsaramgsilvacom e o twitter eacute saramgsilva

No Code Game Salad

No Code

50

ldquoNuma altura em que as aplicaccedilotildees estatildeo a dominar em

forccedila torna-se imperativo saber programarhelliprdquo E o leitor

tambeacutem tem esta opiniatildeo

Ora neste artigo esta eacute uma ideia que vamos deixar por

terra Se o leitor eacute algueacutem que gosta e se interessa pelo

mundo dos pequenos jogos e por novas tecnologias mas que

natildeo se sente agrave vontade no mundo da programaccedilatildeo pode (e

deve) experimentar o GameSalad Mas por outro lado

mesmo sendo um programador experiente o uso desta

ferramenta pode tambeacutem ajudar bastante

A GameSalad Inc eacute uma empresa norte-americana que

desenvolve ferramentas web para a criaccedilatildeo de pequenos

jogos Fundada em 2007 com o nome de Gendai Games em

2009 lanccedilou o GameSalad Creator e em 2010 mudou

oficialmente o seu nome passando chamar-se GameSalad

O importante para os criadores desta tecnologia eacute a

conceccedilatildeo de uma ideia O Game Salad Creator eacute

principalmente direcionado aos utilizadores que natildeo tecircm

bases em programaccedilatildeo permitindo que qualquer pessoa

possa fazer o seu proacuteprio jogo 2D para plataformas moacuteveis

IOS Android ou jogos HTLM5 para browsers Com uma

interface limpa e relativamente simples este software utiliza

o sistema ldquodrag-and-droprdquo para desenvolver os seus jogos

ou seja desde que tenhamos uma ideia em mente podemos

facilmente pocirc-la em praacutetica arrastando os componentes da

mesma para o ldquopalco de jogordquo

Assim facilmente o leitor pode definir as imagens de fundo

das vaacuterias cenas que compotildeem o jogo e todos os

intervenientes dessas cenas satildeo chamados ldquoAtoresrdquo em que

o comportamento destes ldquoAtoresrdquo eacute definido por regras de

jogo (eventos) que o proacuteprio utilizador define Eacute tudo uma

questatildeo de loacutegica e eacute o utilizador que define essa loacutegica Por

exemplo podemos definir eventos especiacuteficos como colisotildees

e definir o que o ldquoatorrdquo deve fazer quando ocorre uma

colisatildeo isto eacute se deve mudar de rumo e perder pontos ou se

deve ser destruiacutedo perdendo uma vida por exemplo Tudo

se baseia na nossa escolha

Podemos tambeacutem adicionar a banda sonora a nosso gosto e

para verificar o comportamento real da nossa aplicaccedilatildeo

basta-nos apenas recorrer ao simulador que o GameSalad

Creator nos disponibiliza Natildeo precisamos de ter o

equipamento real para o qual estamos a projetar o nosso

jogo

O site principal deste projeto wwwgamesaladcom em pouco

tempo atingiu milhares de utilizadores um pouco por todo o

mundo Inicialmente projetado para desenvolver aplicaccedilotildees

apenas para dispositivos Apple hoje em dia eacute tambeacutem

possiacutevel fazer o download da versatildeo Windows A versatildeo

base eacute gratuita e permite a qualquer interessado publicar os

seus jogos para a versatildeo web e para a versatildeo MAC Caso

prefira a versatildeo paga o GameSalad Creator Pro permite tudo

isto e tambeacutem publicar os seus projetos para a plataforma

Android e para o Windows 8 aleacutem de outros extras Caso

opte por ter uma conta premium pode ainda publicar no

mercado de aplicaccedilotildees escolhendo se quer disponibilizar

gratuitamente o seu jogo ou natildeo Caso opte disponibilizar

uma versatildeo paga do jogo que desenvolveu o utilizador tem

direito a 70 do ganho obtido pelo seu jogo

Este projeto tem tambeacutem atraveacutes do proacuteprio site uma grande

comunidade de utilizadores que partilham ideias e

experiecircncias ajudando-se mutuamente em vaacuterios projetos

Tem uma ideia para um jogo Entatildeo estaacute na altura de a por

em praacutetica Saber programar deixou de ser um requisito com

a ajuda do GameSalad Creator aproveite e decirc largas agrave

imaginaccedilatildeo

Game Salad

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

Elege o melhor artigo desta ediccedilatildeo

Revista PROGRAMAR httptinyccProgramarED41_V

No Code

52

Esta foi a aplicaccedilatildeo vencedora do concurso de aplicaccedilotildees

que se realizou no 1ordm Evento Presencial da Comunidade

Portugal-a-Programar Trata-se de um jogo para Windows

Phone 7x e 8 bastante interessante e ateacute ldquovicianterdquo para

quem gosta de jogos do tipo puzzle

Os pequenos Bits estatildeo em perigo e soacute vocecirc pode ajudaacute-los

Bits satildeo uma espeacutecie muito especial de aves encontradas

em uma ilha remota E eles precisam chegar ao seu ninho

a fim de criar seus filhos Mas os bits das Trevas estatildeo com

ciuacutemes e vatildeo tentar tudo ao seu alcance para impedir os Bits

de chegar ao ninho

Bits eacute um jogo de quebra-cabeccedilas fantaacutestico onde vocecirc tem

de combinar habilidade com sorte para ajudar os Bits a

sobreviver Combine trecircs Bits da mesma cor para ganhar

pontos enquanto os Bits prestos ldquoevilrdquo tentam detecirc-los Os

ldquoAnjos Bitsrdquo (brancos) podem salvar os Bits de cor destruindo

os Bits Pretos proacuteximos

PROJECTO EM DESTAQUE NA COMUNIDADE PP LITTLE BITS

PASSATEMPO

DESENVOLVIMENTO

WINDOWS 8

A comunidade Portugal a Programar com o apoio da Microsoft estaacute a criar um passatempo de desen-

volvimento de aplicaccedilotildees para Windows 8 exclusivamente para membros registados na comunidade

Desenvolve uma ou mais aplicaccedilotildees para o Windows 8 e ganha fantaacutesticos preacutemios

1 MOCHILA APP ME UP PARA TODOS os que publiquem uma App na Windows 8 Store

2 TELEFONES NOKIA LUMIA 820 (Dev Edition) para os primeiros 2 a publicarem 3 Apps na

Windows 8 Store

1 TABLET ASUS ME400C para a melhor App publicada e 1 NOKIA LUMIA 820 para a segun-

da melhor aplicaccedilatildeo

Satildeo vaacutelidas apenas aplicaccedilotildees publicadas entre 1 e 30 de Junho de 2013

Todos os estudantes tecircm acesso gratuito agrave Windows Store atraveacutes do programa DreamSpark e por is-

so natildeo haacute motivos para natildeo concorrer Mais informaccedilotildees e candidaturas atraveacutes do email passatem-

posportugal-a-programarpt

Alguns recursos interessantes para iniciar

Windows 8 Store Apps - Do sonho agrave realidade (revista PROGRAMAR)

Microsoft DreamSpark Windows 8 Apps development

Windows App (MSDN)

O staff da comunidade seraacute o juacuteri que iraacute escolher a melhor aplicaccedilatildeo a concurso e o vencedor seraacute divul-

gado na primeira quinzena de Julho Para atribuiccedilatildeo do Tablet Asus ME400C eacute necessaacuterio existirem no

miacutenimo 3 aplicaccedilotildees a concurso Qualquer caso omisso seraacute resolvido pelo staff da comunidade natildeo sen-

do passiacutevel de recurso e o juri iraacute rever e validar todas as aplicaccedilotildees de modo a que tenham um minimo de

qualidade e originalidade

Veja tambeacutem as ediccedilotildees anteriores da Revista PROGRAMAR

e muito mais em hellip wwwrevista-programarinfo

34

ordf Ed

iccedilatilde

o - A

bril 2

01

2

35

ordf Ed

iccedilatilde

o - J

un

ho

201

2

36

ordf Ed

iccedilatilde

o - A

go

sto

20

12

37

ordf Ed

iccedilatilde

o - O

utu

bro

20

12

38

ordf Ed

iccedilatilde

o - D

ezem

bro

20

12

39

ordf Ed

iccedilatilde

o - F

eve

reiro

20

13

Page 6: Revista Programar 41

TEMA DA CAPA

7

Java Enterprise Edition

A plataforma Java Enterprise Edition ou Java EE eacute uma pla-

taforma da Oracle que fornece uma API adicional ao Java

SE para o desenvolvimento e execuccedilatildeo de aplicaccedilotildees java

do tipo empresarial focadas nos serviccedilos de rede e Web

Vindo do Java Professional Edition o nome que foi anuncia-

do em Maio de 98 foi a partir dos finais de 1999 que ficou

com o nome de Java EE incluindo tecnologias como Java

Database Connectivity (JDBC) Java Servlet JavaServer

Pages (JSP) Enterprise JavaBeans JavaMail etc

CONCEITOS

Aplicaccedilatildeo Web Java

Uma aplicaccedilatildeo Java Web gera paacuteginas Web interactivas

contendo vaacuterios tipos de markup languages (HTML XML

etc) e conteuacutedo dinacircmico Eacute tipicamente composto por ele-

mentos Web tais como JavaServer Pages (JSP) Servlets e

JavaBeans para modificar e temporariamente armazenar

dados interagir com bases de dados e serviccedilos Web geran-

do conteuacutedo em resposta aos pedidos do cliente

JSP (JavaServer Pages)

JavaServer Pages eacute uma tecnologia usada no desenvolvi-

mento de aplicaccedilotildees Web Java semelhante ao PHP Possui

compatibilidades com outras soluccedilotildees Java como a Servlet

corre em servidores como o Apache Tomcat e o GlassFish

Ao contraacuterio dos tiacutepicos jarrsquos os arquivos deste tipo de imple-

mentaccedilotildees satildeo ear ou war (Web Archive)

As paacuteginas Web dinacircmicas java aceitam HTML CSS Ja-

vascript tudo que possam incluir no um ficheiro normal

HTML natildeo necessitam de compilaccedilatildeo preacutevia isso fica ao

cargo do servidor Web de traduzir as linhas de coacutedigo em

Java para o browser compreender

Qualquer coacutedigo Java inserido nos ficheiros JSP deve ficar

entre as tags

lt Code gt (para inserccedilatildeo de coacutedigo)

lt=var gt (para a expressatildeo de uma variaacutevel)

Introduccedilatildeo ao Java EE e Java Web ltpage gt (para importar include para incluir

uma paacutegina JSP ou HTML externa)

Servlet

Eacute uma tecnologia Java que permite gerar dados em HTML e

XML Incluiacuteda na biblioteca javaxservlet permite processar

pedidos e respostas vindas de JSP e serve como uma exten-

satildeo do servidor Web Neste caso vamos usar a HttpServlet

onde a sua funccedilatildeo seraacute processar pedidos das JSP resolver

os pedidos e enviar uma resposta

XML

XML (Extensible Markup Language) subtipo da SGML foi

criada pela W3C com o objectivo de ser usado como formato

de configuraccedilatildeo entre vaacuterias linguagens atraveacutes da internet

Ex

Neste caso em particular o ficheiro XML que vamos criar

editar na configuraccedilatildeo de uma aplicaccedilatildeo Java Web eacute o

webxml que tem como tags mais usa das as seguintes

lt gt agrave define comentaacuterios

ltweb-app id version xmlns gt agrave define o tipo do XML

a versatildeohellip

ltdisplay-namegt agrave define o nome

ltservletgt agrave define uma servlet

ltxml version=10 encoding=iso-8859-1 encoding=iso-8859-1gt ltreceita nome=patildeo tempo_de_preparacao=5 min tempo_de_cozedura=1horagt ltingredientesgt ltingrediente quantidade=4 unidade=chavenasgtFarinhaltingredientegt ltingrediente quantidade=7 unidade=gramasgtFermentoltingredientegt ltingrediente quantidade=15 unidade=chavenasgtAgualtingredientegt ltingrediente quantidade=1 unidade=colheresgtSalltingredientegt ltingredientesgt ltinstrucoesgt ltpassogtMisturar tdos os ingredientesltpassogt ltpassogtCobrir com um pano e deixar repousar uma hora agrave temperatura ambienteltpassogt ltpassogtMisturar novamente e colocar ao forno ateacute ao fim da cozeduraltpassogt ltinstrucoesgt ltreceitagt

TEMA DA CAPA

8

ltservlet-namegt agrave define o nome da servlet

ltservlet-classgt agrave aponta o caminho da servlet na apli-

caccedilatildeo

ltload-on-startupgt agrave quando o valor for 1 a servlet

seraacute inicializada no inicio da aplicaccedilatildeo

ltservlet-mappinggt agrave caso a servlet efectue operaccedilotildees

requeridas por elementos externos

ltservlet-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltservletgt

lturl-patterngt agrave define um url para a servlet

ltfiltergt agrave semelhante agrave tag ltservletgt com a diferenccedila

de que esta permite enquadrar uma classe de filtro na

aplicaccedilatildeo que permita a existecircncia de sessotildees na

aplicaccedilatildeo Web ou qualquer segmento de coacutedigo que

necessite de ser constantemente executado

ltfilter-namegt agrave define o nome da classe filtro

ltfilter-classgt agrave aponta o caminho da class na aplica-

ccedilatildeo

ltfilter-mappinggt agrave sempre necessaacuterio definir para

uma classe filtro

ltfilter-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltfiltergt

lturl-patterngt agrave para possuir o efeito de filtro o url seraacute

todos os existentes ou seja

lterror-pagegt agrave tag existente para definir paacuteginas de

erro que sejam geradas pelo web server e que pos-

sam ocorrer na aplicaccedilatildeo

lterror-codegt agrave define o tipo de coacutedigo de erro gerado

pelo web server (404-page not found 500-internal

server errorhellip)

ltlocationgt agrave localiza a paacutegina de erro personalizada

dentro da aplicaccedilatildeo

Estrutura de uma aplicaccedilatildeo Web Java

O exemplo que vai ser aqui apresentado seraacute montado num

Web Archive (ficheiro war) que poderaacute depois ser colocado

num servidor Web sendo os mais conhecidos o Apache

Tomcat e o Oracle Glassfish Ambos disponiacuteveis gratuita-

mente e no pacote de Java EE do IDE NetBeans que os ins-

tala em modo desenvolvimento na maacutequina local

Nota As aplicaccedilotildees necessaacuterias para a criaccedilatildeo deste exem-

plo satildeo o Java Runtime Environment (JRE) o Java Deve-

lopment Kit (JDK) e o IDE NetBeans

A estrutura normal de uma aplicaccedilatildeo java desta natureza

tem por norma a seguinte estrutura

O ficheiro WAR criado se o abrirmos tem uma estrutura de

pastasficheiros orientada ao modelo de desenvolvimento

MVC (Model-view-controller) onde a View estaacute incluiacuteda dire-

tamente na raiz do projeto onde se pode encontrar as paacutegi-

nas JSP e HTML acompanhadas pelos devidos ficheiros

JavaScript e CSS necessaacuterios Caso haja ausecircncia de um

Deployment Descriptor (ficheiro de configuraccedilatildeo referente a

uma determinada aplicaccedilatildeo que neste caso seraacute o webxml)

o servidor Web procura sempre por um indexjsp como paacutegi-

na inicial

Dentro da pasta WEB-INF estatildeo todas as classes bibliote-

cas ficheiros de configuraccedilatildeo e servlets necessaacuterias para

processar a informaccedilatildeo mostrada pelas JSPs

Em suma ter-se-aacute entatildeo algo deste geacutenero

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

9

Nota Nesta estrutura optou-se por colocar as paacuteginas dinacirc-

micas debaixo do WEB-INF pois uma vez que podemos usar

as servlets para controlar o que se deve ou natildeo ser mostrado

perante os pedidos vindos do cliente Isto torna a aplicaccedilatildeo

mais segura na questatildeo de mapeamento de URLs

Desenvolvimento

Neste exemplo vai-se usar o IDE NetBeans pois eacute aquele

que a Oracle recomenda encontra-se disponiacutevel para Win-

dows Linux Solaris e Mac OS X sendo mais simples de

configurar O NetBeans encontra-se disponiacutevel para downlo-

ad no proacuteprio site e no site da Oracle como complemento do

Java Development Kit 7 (Ver bibliografia)

Primeiros passos

Para dar iniacutecio agrave construccedilatildeo da nossa aplicaccedilatildeo Java Web

no NetBeans basta ir a File ndash New Project e aparece-nos a

seguinte janela

E vamos selecionar Java Web ndash Web Application Em se-

guida definimos a localizaccedilatildeo e o nome da nossa aplicaccedilatildeo

Dando o nome de Teste a esta aplicaccedilatildeo no passo seguinte

o nome que foi atribuiacutedo eacute automaticamente dado como

Context Path ou seja a aplicaccedilatildeo iraacute ser identificada no De-

ployment descriptor como Teste e uma vez colocada no servi-

dor teraacute o seguinte URL httphostnameportTeste

Neste exemplo vamos usar para o servidor GlassFish da Ora-

cle a versatildeo 6 do Java EE e o IDE Netbeans

O servidor escolhido pode ser posteriormente alterado caso

queira-se testar a aplicaccedilatildeo noutros ambientes contudo eacute de-

sencorajado a alteraccedilatildeo da versatildeo sem primeiro verificar a

existecircncia de possiacuteveis incompatibilidades com coacutedigo e biblio-

tecas que estejam a ser usadas O uacuteltimo seraacute ignorado uma

vez que este exemplo que vamos criar natildeo vai possuir nenhum

framework

Uma vez concluiacutedo todos os passos verificamos que automati-

camente o IDE criou-nos uma estrutura com uma paacutegina in-

dexjsp na raiz uma pasta WEB-INF vazia e atalhos para a

pasta de sources bibliotecas e de ficheiros de configuraccedilatildeo

com o tradicional MANIFESTMF criado

A estrutura visiacutevel natildeo corresponde agrave estrutura real de diretori-

as para se visualizar isso basta ir ao separador Files situado eacute

esquerda como mostra a imagem seguinte

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

10

Caso natildeo esteja criado o atalho pode-se sempre aceder indo

agrave opccedilatildeo Window ndash File abrindo o separador e recolocando o

atalho

Numa breve comparaccedilatildeo pode-se verificar que o NetBeans

cria determinados ficheiros e diretorias referentes ao projeto

(bluidxml e nbproject) e onde na estrutura do projeto a pasta

Web Pages tem referecircncia agrave pasta web e a Source Packa-

ges tem referecircncia agrave pasta src Todos os ficheiros de confi-

guraccedilatildeo ficam dentro da pasta WEB-INF e no caso da pasta

Libraries o seu conteuacutedo eacute um conjunto de atalhos cuja sua

localizaccedilatildeo pode ser referenciada a quaisquer pastas exter-

nas ao projeto No entanto recomenda-se criar uma pasta lib

debaixo de WEB-INF com as bibliotecas a ser usadas pela

aplicaccedilatildeo para evitar erros originados por utilizaccedilatildeo do mes-

mo ficheiro de biblioteca por mais do que um projeto e para

facilitar a passagem do projeto para outro ambiente ou ma-

quina pois assim basta soacute passar a pasta com o projeto sem

haver preocupaccedilotildees com importaccedilatildeo de bibliotecas

Criaccedilatildeo de uma JSP

Se abrirmos a paacutegina JSP criada pelo IDE ela vai ter um

aspecto semelhante a este

Uma vez que esta paacutegina tem o nome de index caso seja

feito o deploy da aplicaccedilatildeo a mesma vai apresentar uma

paacutegina de fundo branco com o tiacutetulo JSP Page e a frase Hel-

lo World

Para realizar o deploy da aplicaccedilatildeo basta carregar sobre o

botatildeo de play situado no painel de topo do IDE Netbeans ou

entatildeo ir a Run ndash Run Project

Caso o nome da paacutegina seja alterado e natildeo exista nenhuma

paacutegina com o nome index o servidor natildeo consegue encon-

trar nenhuma paacutegina inicial Entatildeo em seguida vamos alterar

o nome da nossa paacutegina inicial para homejsp e vamos con-

figurar o nosso webxml de maneira a criarmos um filtro de

sessatildeo que vai definir que o servidor no arranque da mesma

redirecionar-se para uma determinada servlet

Para tal se formos agrave opccedilatildeo de File ndash New Filehellip na secccedilatildeo

Web selecionar o tipo de ficheiro Standard Development

Descriptor (webxml)

Uma vez criado o ficheiro teraacute o seguinte conteuacutedo por defei-

to

Temos agora o ficheiro webxml onde poderemos colocar as

nossas referecircncias agraves servlets que vamos criar atribuindo-

lhes um url pattern a fim de poderem ser acedidas

Para natildeo termos trabalho o IDE por si soacute resolve todas as

tags que necessitamos de colocar no webxml na altura em

que criamos uma servlet caso natildeo seja resolvido pelo IDE

Para mapearmos a servlet WelcomeServlet no package

mainservlet com o url pattern Welcome o que deveria de ser

colocado seria algo deste geacutenero (ver as tags fornecidas)

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtJSP Pagelttitlegt ltheadgt ltbodygt lth1gtHello Worldlth1gt ltbodygt lthtmlgt

ltxml version=10 encoding=UTF-8gt ltweb-app xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=httpjavasuncomxml nsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsd version=30gt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

ltxml version=10 encoding=UTF-8gt ltweb-app version=30 xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=

TEMA DA CAPA

11

Mas natildeo eacute necessaacuterio escrever estas tags ateacute porque o Net-

Beans natildeo permite a criaccedilatildeo de servlets que jaacute possuam refe-

recircncias no webxml como tal o que podemos fazer eacute ir a opccedilatildeo

File ndash New Filehellip e dentro do Web selecionar Servlet

Em seguida o IDE vai recomendar a natildeo criar classes na raiz

dos packages e como tal vamos preencher o campo Package

com mainservlet e como nome WelcomeServlet

Dado o passo seguinte o IDE automaticamente cria a estru-

tura dos packages introduzidos e apresenta o formulaacuterio de

configuraccedilatildeo da servlet

Carregando sobre a check box e alterando o URL Pattern

para Welcome teremos automaticamente criado as tags

pretendidas no webxml

Uma vez criada a servlet vem com os meacutetodos herdados de

HttpServlet doGet() e doPost() implementados e com um

meacutetodo chamado processRequest() que envia coacutedigo

HTML O que vamos fazer eacute apagar este meacutetodo e colocar a

vazio o meacutetodo doPost() e introduzir a seguinte linha no

meacutetodo doGet()

Com esta linha criada e uma vez chamada a servlet que por

defeito responde por GET o pedido vai ser reencaminhado

para a nossa paacutegina criada homejsp

Fazendo deploy coloca-se o URL httplocalhost8080Teste

Welcome e verifica-se que a nossa servlet estaacute a fazer o

reencaminhamento para a nossa paacutegina inicial

Como proacuteximo passo vamos enviar variaacuteveis para uma ser-

vlet onde a mesma iraacute processar e enviar uma resposta En-

tatildeo o que se pretende eacute tomando os mesmos passos de cria-

ccedilatildeo da WelcomeServlet vamos criar a SomaServlet com o

seguinte coacutedigo

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

httpjavasuncomxmlnsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsdgt ltservletgt ltservlet-namegtWelcomeServletltservlet-namegt ltservlet-classgtmainservletWelcomeServlet ltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtWelcomeServletltservlet-namegt lturl-patterngtWelcomelturl-patterngt ltservlet-mappinggt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

getServletContext()getRequestDispatcher( homejsp)forward(request response)

package mainservlet import javaioIOException import javaxservletServletException import javaxservlethttpHttpServlet import javaxservlethttpHttpServletRequest import javaxservlethttpHttpServletResponse public class SomaServlet extends HttpServlet public static final String TEXTO = texto public static final String VALOR_1 = valor1 public static final String VALOR_2 = valor2 public static final String RESULTADO = resultado

TEMA DA CAPA

12

E para interagirmos com a servlet vamos criar as paacuteginas so-

majsp e resultadojsp onde mais uma vez vamos ao menu

File ndash New Filehellip selecionamos JSP e preenchemos o nome

sem a extensatildeo no campo File Name

somajsp

Com o objectivo de evitar erros a servlet possui constantes

que permitem que haja uma coerecircncia entre as variaacuteveis envia-

das e recebidas com o objectivo de evitar errosPode-se ob-

servar que a servlet uma vez iniciada envia uma variaacutevel atra-

veacutes de requestsetAttribute() Uma vez chamado o setAttri-

bute() requer 2 paracircmetros

requestsetAttribute(NomeDoAtributo UmObjectoQQ)

O primeiro paracircmetro como descrito atribui um nome sen-

do esse o nome que deve ser usado nas paacuteginas JSP para

puderem capturar a variaacutevel enviada que se vai encontrar

descrita no segundo paracircmetro que por sua vez eacute sempre

convertida da servlet para object Como tal teve que ser

efectuado o cast do objecto agrave chegada para o tipo de variaacute-

vel que tinha antes de ser enviada

String atributo = (String) requestgetAttribute

(NomeDoAtributo)

(Recepccedilatildeo do atributo)

Caso o que se pretenda seja o contraacuterio enviar variaacuteveis no

sentido JSP agrave Servlet a paacutegina JSP deve de conter um for-

mulaacuterio HTML com o meacutetodo que se pretende POST ou

GET e na action o URL pattern da servlet em questatildeo E os

nomes dos inputs satildeo as referecircncias que a servlet usa para

receber as variaacuteveis das paacuteginas JSP variaacuteveis essas quem

vecircm como String e como tal devem de ser convertidas para o

tipo desejado (Como demonstrado no coacutedigo acima referi-

do) Vamos entatildeo testar acedendo ao URL http

localhost8080TesteSoma

Porem a aplicaccedilatildeo funciona mas apenas mostra paacuteginas

caso as mesmas sejam escritas no URL pois uma vez que

renomeamos o indexjsp para homejsp natildeo existe de mo-

mento nenhuma paacutegina inicial ou seja caso escrevesse-

mos httplocalhost8080Teste a aplicaccedilatildeo natildeo vai mostrar

nenhuma paacutegina

Para solucionarmos esse problema vamos entatildeo criar um

filtro que remeta para uma determinada servlet filtro esse

que vai aguardar que uma determinada variaacutevel se altere de

estado para desbloquear as restantes paacuteginas Com este

tipo de classes podemos definir niacuteveis de acesso dentro da

nossa aplicaccedilatildeo restringindo a mesma quando certas variaacute-

veis natildeo forem validadas ou natildeo se encontram com o valor

pretendido (por exemplo um determinado nome de utilizador

e palavra chave)

Vamos entatildeo novamente a File ndash New Filehellip e seleciona-

mos Filter

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

Override protected void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException requestsetAttribute(TEXTO Insira 2 numeros e submeta para obter o resultado) getServletContext()getRequestDispatcher (somajsp)forward(request response) Override protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException int resultado try int val1 = IntegerparseInt (requestgetParameter(VALOR_1)) int val2 = IntegerparseInt (requestgetParameter(VALOR_2)) resultado = val1 + val2 requestsetAttribute(RESULTADO +resultado) catch (NumberFormatException e) requestsetAttribute(RESULTADO Valores natildeo validos) getServletContext()getRequestDispatcher (resultadojsp)forward(request response)

ltpage import=mainservletSomaServletgt ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lt String texto = (String) requestgetAttribute (SomaServletTEXTO)gt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtSomalttitlegt ltheadgt ltbodygt lth2gtlt=textogtlth2gt ltform action=Soma method=POSTgt Valor 1ltinput type=text name= lt=SomaServletVALOR_1gtgt Valor 2ltinput type=text name= lt=SomaServletVALOR_2gtgt ltbrgt ltinput type=submit name=submitgt ltformgt ltbodygt lthtmlgt

TEMA DA CAPA

13

caccedilatildeo e restriccedilatildeo de acessos os filtros permitem a execuccedilatildeo

de certas linhas de coacutedigo que mantecircm estados numa aplica-

ccedilatildeo e eacute o siacutetio ideal para colocar a parte do coacutedigo da aplica-

ccedilatildeo que manipula variaacuteveis de sessatildeo

Apoacutes criar-se a classe do tipo Filter ignorando o coacutedigo ge-

rado o filtro deveraacute possuir o seguinte coacutedigo

Uma vez criado o filtro este vai redirecionar todos os pedidos

agrave aplicaccedilatildeo para a WelcomeServlet enquanto a variaacutevel

validSession estiver a NULL como tal na servlet Welcome-

Servlet coloca-se a seguinte linha

requestgetSession()setAttribute(UrlFilterSESSION

gotSession)

Assim que o filtro passar pela WelcomeServlet a variaacutevel

validSession vai deixar de estar a NULL colocando o filtro a

fazer um encadeamento com os restantes pedidos que apa-

recerem

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

No seguinte passo vamos atribuir o nome de UrlFilter e coloca

-lo num novo package mainfilter

Semelhante ao passo de criaccedilatildeo do mapeamento das servlets

no webxml o IDE igualmente cria automaticamente um mape-

amento do filtro no ficheiro XML contudo o coacutedigo gerado eacute

ligeiramente diferente (Ver referecircncia de tags do webxml)

Apoacutes dar seguinte neste passo e natildeo preencher nada no proacutexi-

mo o IDE gera uma classe filtro por defeito e gera o seu mape-

amento no webxml semelhante a

Muito semelhante ao que se vai encontrar num mapeamento

de uma servlet apenas com a diferenccedila do nome das tags de

servlet para filter e o seu mapeamento seraacute muacuteltiplo para todos

os URLs que se deseja correr um determinado filtro antes de

haver o redireccionamento Uacuteteis para criar poliacuteticas de autenti-

ltfiltergt ltfilter-namegtUrlFilterltfilter-namegt ltfilter-classgtmainfilterUrlFilter ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtUrlFilterltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt

package mainfilter import javaioIOException import javaxservlet import javaxservlethttp public class UrlFilter implements Filter FilterConfig filterConfig public static final String SESSION = session Override public void doFilter(ServletRequest req ServletResponse resp FilterChain chain) throws IOException ServletException if (req instanceof HttpServletRequest) String path = ((HttpServletRequest) req)getServletPath() HttpSession session = ((HttpServletRequest) req)getSession(false) boolean sessionValidator = false if (session = null) String validSession = (String) sessiongetAttribute(SESSION) if (validSession = null) sessionValidator = true if (pathequals(Welcome) ampamp sessionValidator) ((HttpServletResponse) resp)sendRedirect(filterConfiggetServletContext ()getContextPath() + Welcome) else chaindoFilter(req resp) Override public void init(FilterConfig filterConfig) thisfilterConfig = filterConfig Override public void destroy()

TEMA DA CAPA

14

Apoacutes implementado quando se aceder agrave aplicaccedilatildeo pelo URL

apontado para a raiz (httplocalhost8080Teste) o servidor

com conhecimento da existecircncia de um filtro vai chama-lo para

cada vez que o cliente acede a qualquer servlet ou JSP

Para finalizar este exemplo vamos soacute criar um link na paacutegina

homejsp que nos vai apontar para a paacutegina somajsp atraveacutes

da SomaServlet

lta href=SomagtSomarltagt

Dentro da aplicaccedilatildeo os URL pattern que foram definidos no

webxml servem igualmente para os links HTML chamando

sempre o meacutetodo doGet() da servlet

Conclusatildeo

Este artigo mostra numa forma introdutoacuteria como se pode criar

uma aplicaccedilatildeo Java com uma interface Web tendo em conta

que as capacidades do Java EE e das suas bibliotecas nome-

adamente Servlets Filters e as configuraccedilotildees necessaacuterias para

criar uma aplicaccedilatildeo Web baacutesica com conceitos adicionais de

XML( no seu geral) JSP e MVC

BibliografiaReferecircncias

httpwwworaclecomtechnetworkjavajavasedownloads

jre7-downloads-1880261html

httpwwworaclecomtechnetworkjavajavaeedownloads

indexhtml

httpsnetbeansorgfeaturesindexhtml

httpenwikipediaorgwikiJava_EE_version_history

httpwwwjsptutcom

httpsdevelopersgooglecomappenginedocsjavaconfig

webxml

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

A PROGRAMAR Programaccedilatildeo em C const

Jogo da Vida

JBoss Aplication Server 7

PHP Uma framework ldquofrom scratchrdquo (Parte 1)

A PROGRAMAR

16

Uma das ldquorecentesrdquo adiccedilotildees agrave linguagem C foi o qualificador

const Ao contraacuterio do que se possa pensar utilizar const

natildeo cria uma constante mas sim uma variaacutevel soacute-de-leitura

O que queremos dizer com isto Vejamos o seguinte exem-

plo

Qual o valor de i apoacutes execuccedilatildeo da linha 4 Embora possa

parecer estranho i vai ter o valor 73 apesar de termos de-

clarado i como constante Por este motivo variaacuteveis qualifi-

cadas com const natildeo satildeo constantes verdadeiras em C (satildeo-

no em C++) e natildeo podem por este motivo ser utilizadas em

certos lugares como a definiccedilatildeo do tamanho de arrays ou

em cases de um switch (excepto com extensotildees dos compi-

ladores)

De que nos serve entatildeo um qualificador const se natildeo asse-

gura que a variaacutevel permanece inalterada Bem a utilizaccedilatildeo

de const para qualificar variaacuteveis impede de facto a sua

alteraccedilatildeo na maioria dos casos Natildeo podemos alterar i direc-

tamente por exemplo (ie i = 73 emite um erro) No exemplo

apresentado acima enganaacutemos o compilador (linha 2) com o

cast de ampi para o tipo int sem cast um compilador bem

configurado emitiraacute pelo menos um aviso de que o qualifica-

dor const eacute descartado na atribuiccedilatildeo de ampi a ptr um pequeno

sinal de alarme para o programador (eacute soacute estar atento)

Podemos como referido acima qualificar uma variaacutevel com

const e impedir que seja alterada directamente Se tentar-

mos apontar um apontador a essa variaacutevel o compilador

avisa-nos que a qualificaccedilatildeo de const seraacute perdida e pode-

mos alterar a variaacutevel atraveacutes do apontador Haveraacute maneira

de impedir que isto aconteccedila Na realidade a questatildeo eacute

outra como utilizar o qualificador const com apontadores

Existem 4 formas de qualificar um apontador com const

obtendo-se diferentes niacuteveis de acesso de leitura eou escri-

ta da variaacutevel apontada atraveacutes do mesmo Para que natildeo

existam duacutevidas eacute importante reter que o qualificador const

qualifica uma variaacutevel e natildeo um local na memoacuteria Por outras

palavras (e recorrendo ao exemplo inicial) qualificar i como

const soacute impedir a alteraccedilatildeo do valor atraveacutes da variaacutevel i

Quando apontamos um apontador ao endereccedilo de i pode-

mos fazer o que quisermos com o valor laacute armazenado inde-

pendentemente de como i foi declarado

A primeira forma de usar const num apontador eacute surpreen-

dentemente natildeo usar const num apontador Na realidade

(obviamente) esta natildeo eacute uma utilizaccedilatildeo do qualificador const

Programaccedilatildeo em C const mas este artigo natildeo estaria completo sem se falar dela Um

apontador simples de forma tipo p permite-nos fazer vaacuterias

coisas podemos apontaacute-lo a qualquer local da memoacuteria que

queiramos e desde que apontado a um endereccedilo vaacutelido

podemos alterar o valor aiacute armazenado com o operador de

indirecccedilatildeo (eg p = 3) Este tipo de apontador natildeo apresenta

restriccedilotildees nenhumas (por esse motivo eacute que o compilador

emite um aviso quando tentamos apontaacute-lo a uma variaacutevel

const excepto na presenccedila de casts)

Segue-se entatildeo a criaccedilatildeo de um apontador para uma variaacute-

vel constante Este tipo de apontador apresenta uma particu-

laridade embora seja possiacutevel apontaacute-lo a qualquer endere-

ccedilo de memoacuteria natildeo eacute possiacutevel utilizar este apontador para

alterar o conteuacutedo do endereccedilo apontado Logicamente este

era o tipo de apontador que precisaacutevamos no exemplo inici-

al se temos uma variaacutevel constante queremos apontar para

ela com um apontador para uma variaacutevel constante

Se lermos a declaraccedilatildeo de ptr da direita para a esquerda

tudo faz sentido ptr eacute um apontador () para um const int E

de facto i eacute um const int tudo parece bem Quando tentamos

modificar o valor apontado por ptr o compilador emite um

erro queixa-se que estamos a tentar atribuir um valor a uma

variaacutevelendereccedilo soacute de leitura Este era o comportamento

que procuraacutevamos inicialmente

Passemos agora para a terceira forma de usar const com

apontadores Uma espeacutecie de ldquoinversordquo de um apontador

para uma variaacutevel constante eacute um apontador constante para

uma variaacutevel (natildeo constante) A diferenccedila do anterior para

este eacute que agora passamos a conseguir alterar o valor apon-

tado (por outras palavras ptr = 73 passa a ser possiacutevel)

mas natildeo nos eacute possiacutevel apontar ptr para outra variaacutevel

Uma vez mais da direita para a esquerda ptr eacute um aponta-

dor constante ( const) para um int Podemos utilizar ptr agrave

vontade para modificar o valor de 42 para 73 mas eacute-nos

impossiacutevel alterar o endereccedilo para o qual ptr aponta Este

tipo de apontadores eacute uacutetil quando nos queremos assegurar

de que natildeo haacute alteraccedilotildees acidentais do local para onde um

apontador aponta Um pormenor importante sendo ptr um

apontador cujo endereccedilo natildeo pode ser alterado devemos

1 const int i = 42 2 int ptr = (int)ampi 3 4 ptr = 73

1 const int i = 42 2 const int ptr = ampi 3 4 ptr = 73 erro

1 const int i = 42 2 int const ptr = ampi 3 4 ptr = 73 ok 5 ptr = NULL erro

A PROGRAMAR

17

apontaacute-lo para onde queremos no momento da sua declara-

ccedilatildeo sob pena de ficar apontado para um local aleatoacuterio sem

possibilidade de alteraccedilatildeo

A quarta (e uacuteltima) forma de utilizar const num apontador eacute

como devem ter imaginado a combinaccedilatildeo das duas uacuteltimas

um apontador constante para uma variaacutevel constante Este eacute

o tipo de apontador mais limitado de todos uma vez que a

uacutenica coisa que podemos fazer com ele apoacutes a sua declara-

ccedilatildeo eacute consultar o valor para o qual aponta Natildeo podemos

alterar i se ptr for deste tipo nem podemos apontar ptr para

NULL ou outro endereccedilo qualquer

Desta vez utilizamos const em dois locais agrave esquerda do

asterisco para qualificar a variaacutevel apontada e agrave direita do

asterisco para qualificar o apontador Neste caso nenhuma

das operaccedilotildees funcionaraacute o compilador assegura-se que

natildeo utilizaremos ptr para alterar o valor para o qual aponta

nem tentaremos apontar ptr para outro endereccedilo

Neste artigo cobrimos algumas utilizaccedilotildees do qualificador

const na linguagem C (volto a lembrar estamos a falar de C

e natildeo de ldquoCC++rdquo) e foi tambeacutem referido como utilizar este

qualificador para melhorar o coacutedigo que escrevemos de for-

ma a prevenir asneiras relativamente comuns quando se lida

com apontadores

Falta no entanto mencionar outra utilidade do const docu-

mentaccedilatildeo Quando o programador utiliza const de uma for-

ma pensada estaacute a documentar o seu coacutedigo Se virmos uma

funccedilatildeo que aceita como argumento const void podemos

imediatamente imaginar que o endereccedilo passado nunca seraacute

alterado pela funccedilatildeo em causa enquanto que um simples

void natildeo nos informa sobre as intenccedilotildees da API Natural-

mente se o programador da API declarar um argumento

com const e depois utilizar casts para se livrar da qualifica-

ccedilatildeo entatildeo aiacute all bets are off e nada eacute garantido Mas assu-

mamos que isso eacute a excepccedilatildeo e natildeo a regra

Existem ainda muacuteltiplos aspectos que natildeo foram cobertos

neste artigo nomeadamente a conversatildeo impliacutecita de T para

const T e T para const T Esta conversatildeo eacute bastante uacutetil

quando queremos passar um valor do tipo T a uma funccedilatildeo

que requer const T como argumento Se pensarmos bem

faz sentido em qualquer lugar onde eacute necessaacuterio um const

T podemos utilizar um T perfeitamente (que nunca seraacute al-

terado) Por outro lado a conversatildeo inversa (de const T ou

const T para T e T respectivamente) natildeo eacute permitida e

tambeacutem isso faz sentido se uma funccedilatildeo pede um valor do

tipo T natildeo faz sentido aceitar um const T porque isso im-

plicaria potenciais alteraccedilotildees ao valor apontado (que satildeo

proibidas pelo qualificador const)

As conversotildees impliacutecitas relativas ao const terminam por

aqui Em C natildeo haacute conversatildeo de T para const T o que

significa que numa funccedilatildeo que aceite um argumento const

T seraacute emitido um aviso se tentarmos passar um T Neste

caso temos que recorrer a um cast para silenciar o compila-

dor Nada disto eacute um erro no entanto os casts surgiram

porque satildeo necessaacuterios na linguagem C e recusar a sua

utilizaccedilatildeo eacute negar a linguagem Haacute que saber quando e co-

mo fazer as coisas da forma correcta

Para terminar recomendo uma olha- dela agraves

manpages da biblioteca standard de C jaacute utilizam const

abundantemente nota-se bem o seu valor como documenta-

ccedilatildeo dentro do coacutedigo Aleacutem deste aspecto da documentaccedilatildeo

a utilizaccedilatildeo de const leva agrave criaccedilatildeo de coacutedigo mais previsiacutevel

e seguro e serve tambeacutem como dica para possiacuteveis optimi-

zaccedilotildees feitas pelo compiladorUsem const Informem e enco-

rajem a utilizaccedilatildeo de const especialmente aos iniciados

porque vale a pena

PROGRAMACcedilAtildeO EM C CONST

1 const int i = 42 2 const int const ptr = ampi 3 4 ptr = 73 erro 5 ptr = NULL erro

AUTOR

Escrito por Antoacutenio Pedro Cunha (pwseo)

Meacutedico natural de Guimaratildees formado na Universidade do Minho

Programador autodidacta em parte dos tempos livres inscrito no foacuterum desde 2006

Website httppwseoalojnet

Ao contraacuterio do

que se possa pen-

sar utilizar const natildeo

cria uma constante

mas sim uma variaacutevel

soacute de leitura

A PROGRAMAR

18

Nesta ediccedilatildeo vamos propor ao leitor um olhar sobre um fa-

moso algoritmo da deacutecada de 70

O seu inventor John Horton Conway nasceu em Liverpool

em Dezembro de 1937 e eacute um dos matemaacuteticos mais conhe-

cidos da nossa era em todo o mundo Estudou na Universi-

dade de Cambridge e ainda hoje eacute uma mente ativa nas

mais variadas teorias como por exemplo a teoria dos coacutedigos

e a teoria com- binatoacuteria dos

jogos

Ilustraccedilatildeo 1 - John Conway

O algoritmo escolhido para esta ediccedilatildeo foi criado em 1970

por Conway ndash o Jogo da Vida ndash sendo este um jogo para

zero jogadores Este jogo tornou-se mundialmente famoso

atraveacutes de uma coluna na revista Scientific American Em

1971 foi tema de capa e tinha entatildeo relanccedilado uma aacuterea da

Matemaacutetica a dos autoacutematos celulares que satildeo estruturas

matemaacuteticas uacuteteis em simulaccedilotildees de processos fiacutesicos e

bioloacutegicos e que a um niacutevel teoacuterico podem comportar-se

como computadores

Um autoacutemato celular eacute um modelo discreto e cada autoacutemato

deste tipo eacute representado por uma grelha de ceacutelulas poden-

do essas ceacutelulas assumir um nuacutemero finito de estados que

variam de acordo com cada modelo Outra caracteriacutestica a

considerar eacute que o tempo de evoluccedilatildeo eacute tambeacutem discreto

por exemplo o estado de uma ceacutelula no tempo t eacute sempre

obtido tendo em consideraccedilatildeo o estado dessa mesma ceacutelula

(e respetiva vizinhanccedila) no tempo t-1 Cada vez que todas as

regras determiniacutesticas satildeo aplicadas a toda a grelha uma

nova geraccedilatildeo eacute produzida

Isto foi um dos motes de partida para que Conway criasse o

Jogo da Vida Este jogo eacute considerado um autoacutemato celular

bidimensional em que satildeo simulados processos de evoluccedilatildeo

de ceacutelulas bioloacutegicas Estudos jaacute efetuados provam que este

eacute um autoacutemato computacional universal isto eacute eacute capaz de

simular qualquer sistema evolucionaacuterio possiacutevel

(reprogramando as respetivas regras determiniacutesticas se isso

for necessaacuterio)

Jogo da Vida Devido agraves analogias com o aumento reduccedilatildeo e alteraccedilatildeo de

um sistema de supostos organismos vivos (as ceacutelulas) este

jogo pertence agrave classe dos ldquojogos de simulaccedilatildeordquo pois recriam

processos do mundo-real

Voltando de novo ao tema principal do nosso artigo eacute impor-

tante recordar ao leitor que este jogo eacute para zero jogadores

o utilizador eacute apenas responsaacutevel pelos valores de inicializa-

ccedilatildeo do sistema Depois desses valores serem introduzidos

as geraccedilotildees seguintes seratildeo sempre calculadas com base

nas regras determiniacutesticas do algoritmo

Neste jogo num dado instante cada ceacutelula tem dois estados

possiacuteveis ldquovivardquo ou ldquomortardquo

As regras do jogo da vida satildeo simples ora vejamos

Uma ceacutelula viva com menos de dois vizinhos vivos

morre por solidatildeo

Uma ceacutelula viva com mais de trecircs vizinhos vivos mor-

re por sobrepopulaccedilatildeo (por escassez de recursos)

Uma ceacutelula viva com exatamente dois ou trecircs vizinhos

vivos permanece viva

Uma ceacutelula morta com exatamente trecircs vizinhos vivos

torna-se viva

Ao contraacuterio do artigo anterior desta seacuterie a soluccedilatildeo propos-

ta para este problema (na linguagem C) propotildee-se a ser

algo extremamente simples escrita de forma quase elemen-

tar

Implementaccedilatildeo do Algoritmo

Para simular o sistema de jogo foi usada uma matriz e para

que o caacutelculo das regras fosse simples foi considerado que

todas as ceacutelulas dessa matriz teriam 8 vizinhos A forma

mais direta encontrada para isso foi inserir a matriz do utiliza-

dor (que neste artigo seraacute a matriz secundaacuteria) numa matriz

com dimensatildeo [linhas+2][colunas+2] (matriz principal) para

garantir que ateacute as ceacutelulas dos ldquocantosrdquo teriam os tais 8 vizi-

nhos

De forma a simplificar a leitura da nossa implementaccedilatildeo defi-

nimos que cada ceacutelula viva teraacute o valor 1 (representada pela

macro CELVIVA) e que cada ceacutelula morta teraacute o valor 0

(representada pela macro CELMORTA)

No inicio da funccedilatildeo jogo() satildeo pedidos ao utilizador os valo-

res para o nuacutemero de linhas e colunas do sistema de jogo e

o nuacutemero de geraccedilotildees a simular

Apoacutes termos esses valores eacute entatildeo criada a matriz principal

com todos os campos inicializados a -1 para que seja efetua-

A PROGRAMAR

19

da uma ldquolimpezardquo da memoacuteria utilizada Seguidamente e atra-

veacutes desses valores eacute inicializada dentro na matriz principal a

submatriz (matriz secundaacuteria) que eacute usada para calcular os

valores das ceacutelulas em cada geraccedilatildeo Neste caso eacute inicializa-

da a matriz com a dimensatildeo que o utilizador pediu com o valor

de CELMORTA em todos os campos

Apoacutes gerar a matriz secundaacuteria eacute perguntado ao utilizador

quantas ceacutelulas vivas pretende ter no jogo Seguidamente satildeo

pedidas as coordenadas dessas mesmas ceacutelulas Quando o

programa recebe esses valores (da linha e da coluna pretendi-

da) entatildeo a essas posiccedilotildees da matriz eacute atribuiacutedo o valor CEL-

VIVA

Recapitulando para representar uma ceacutelula viva eacute usado o

valor 1 e para representar uma ceacutelula morta eacute usado o valor 0

Todas as outras posiccedilotildees da matriz principal permanecem inal-

teradas com o valor -1

Assim o que o algoritmo faz eacute contabilizar quantas ceacutelulas

vivas estatildeo nos 8 vizinhos Ou seja por outras palavras para

cada posiccedilatildeo (ij) da matriz o programa vai verificar as posi-

ccedilotildees (i-1 j-1) (i-1 j) (i-1 j+1) (i j-1) (i j+1) (i+1 j-1) (i+1 j)

e (i+1 j+1) Caso o valor de cada uma dessas ceacutelulas seja

igual a 1 (CELVIVA ie ceacutelula viva) a variaacutevel de contagem

(cvivas) eacute incrementada uma unidade

Apoacutes a verificaccedilatildeo de todas as posiccedilotildees eacute verificado se a ceacutelu-

la da posiccedilatildeo (i j) eacute uma ceacutelula viva ou morta e satildeo verificadas

as regras do jogo para que se possa decidir se a ceacutelula (ij)

permanece viva ou se morre (tomando respetivamente o valor

CELVIVA e CELMORTA na submatriz)

Usando a variaacutevel i como auxiliar para as linhas e a variaacutevel j

como auxiliar para as colunas os caacutelculos iniciam-se na posi-

ccedilatildeo (11) da matriz principal pois eacute nestas coordenadas que se

inicia a matriz secundaacuteria (ie o sistema de jogo do utilizador)

Os caacutelculos satildeo feitos em todas as posiccedilotildees (ij) apenas da

matriz secundaacuteria daiacute que a condiccedilatildeo de execuccedilatildeo dos ciclos

for seja enquanto o i e o j forem menores que o valor das li-

nhas e das colunas introduzidas pelo utilizador Ou seja a ma-

triz principal natildeo eacute toda processada nos caacutelculos dos vizinhos

vivos para que natildeo sejam gastos recursos de computaccedilatildeo

desnecessariamente

Ilustraccedilatildeo 2 - Exemplo de verificaccedilatildeo de Ceacutelulas

Ceacutelula a ceacutelula a matriz atual eacute processada sendo que apoacutes

esse processamento o resultado do caacutelculo (se a ceacutelula vive

ou morre) eacute colocado na posiccedilatildeo correspondente na matriz

nova (que eacute uma matriz com as mesmas caracteriacutesticas da

matriz atual isto eacute tem tambeacutem uma matriz principal e uma

matriz secundaacuteria)

Apoacutes esse caacutelculo eacute mostrada no ecratilde a matriz secundaacuteria

da matriz nova e a informaccedilatildeo das ceacutelulas da matriz nova eacute

copiada para a matriz atual de forma a que na proacutexima itera-

ccedilatildeo do for principal (que executa o mesmo numero de vezes

quantas geraccedilotildees o utilizador peccedila ao programa) a informa-

ccedilatildeo volte a ser processada de forma anaacuteloga

Para que fosse mais simples ao utilizador o uso do nosso

programa foi tomada em consideraccedilatildeo para que natildeo se

tornasse aborrecido estar sempre a iniciar a execuccedilatildeo do

programa caso o utilizador quisesse continuar a jogar que o

programa apenas teraacute fim quando o utilizador escolher sair

do programa neste caso introduzindo o valor 0 no menu prin-

cipal do mesmo

Se o utilizador preferir jogar novamente entatildeo basta carregar

em 1 e o programa volta a gerar uma nova jogada gerando

um novo sistema de geraccedilotildees consoante os valores introdu-

zidos pelo utilizador Na nossa implementaccedilatildeo quando o

programa mostra o sistema de jogo as ceacutelulas vivas satildeo

representadas pelo siacutembolo

Coacutedigo do Programa

Este eacute apenas um excerto da funccedilatildeo que calcula a proacutexima

geraccedilatildeo tendo como base uma matriz que represente a gera-

ccedilatildeo anterior O coacutedigo completo poderaacute ser consultado no

foacuterum do PP

JOGO DA VIDA

void jogo(void) for (int g = 0 g lt geracoes g++) printf(nnGERACAO d g + 1) for (int i = 1 i lt= linhas i++) for (int j = 1 j lt= colunas j++) int cvivas = 0 if (matrizActual[i-1][j-1] == CELVIVA) cvivas++ if (matrizActual[i-1][j] == CELVIVA) cvivas++ if (matrizActual[i-1][j+1] == CELVIVA) cvivas++ if (matrizActual[i][j-1] == CELVIVA) cvivas++ if (matrizActual[i][j+1] == CELVIVA) cvivas++ if (matrizActual[i+1][j-1] == CELVIVA) cvivas++ if (matrizActual[i+1][j] == CELVIVA)

A PROGRAMAR

20

Como o leitor pode verificar nas linhas acima este eacute um algorit-

mo bastante simples e de raacutepida implementaccedilatildeo Eacute de referir

ainda que o coacutedigo do artigo desta ediccedilatildeo foi implementado

segundo o standard C99 (suportado pelos compiladores GCC

Clang e Pelles C) que nos permite programar de uma forma

portaacutevel e ainda assim confortaacutevel (comentaacuterios comeccedilados

com variable-length arrays tipo de dados bool entre outros)

Caso o leitor queira compilar o coacutedigo deste artigo em Linux

deve utilizar a linha de comando gcc -Wall -Wextra -std=c99 -

pedantic jogo-da-vida jogo-da-vidac

O objetivo principal deste algoritmo eacute entatildeo que o utilizador

possa decidir qual a sua populaccedilatildeo inicial e que apoacutes isso pos-

sa observar o comportamento do seu sistema Ao longo dos

anos muitas configuraccedilotildees foram testadas e experimentadas

com este jogo O jogo da vida convida a experimentar diversas

configuraccedilotildees sendo que agrave maior parte das configuraccedilotildees

iniciais escolhidas bastam apenas trecircs ou quatro geraccedilotildees

para a populaccedilatildeo desaparecer completamente Contudo haacute

algumas configuraccedilotildees jaacute conhecidas como configuraccedilotildees de

ldquoVida Eternardquo por haver sempre ceacutelulas vivas ao longo de mui-

tas geraccedilotildees (e ateacute mesmo de geraccedilotildees infinitas) como mostra

por exemplo imagem seguinte (obtida com a execuccedilatildeo do

nosso programa)

Ilustraccedilatildeo 3 - Exemplo configuraccedilatildeo Vida Eterna (Bloco)

Existem ainda diferentes configuraccedilotildees que podem ocorrer

no Jogo da Vida (configuraccedilotildees essas que o utilizador pode

facilmente encontrar na internet relativas a vaacuterios estudos jaacute

feitos sobre este algoritmo) Os exemplos mais simples satildeo

mostrados abaixo com as ceacutelulas vivas em preto e as ceacutelu-

las mortas em branco

Haacute configuraccedilotildees que satildeo alvo de vaacuterios estudos cientiacuteficos

por exemplo se dois gliders satildeo colocados em direccedilatildeo a um

bloco o bloco vai aproximar-se da fonte dos gliders mas por

outro lado se trecircs gliders satildeo colocados no mesmo lugar o

bloco vai afastar-se desses gliders Este facto eacute conhecido

como a ldquomemoacuteria de bloco deslizante e pode ser usada para

simular um contador

Eacute possiacutevel construir portas loacutegicas AND OR e NOT usando

gliders tal como eacute possiacutevel construir uma imagem que aja

como uma maacutequina de estado finito conectada a dois conta-

dores

O que significa que esta disposiccedilatildeo possui o mesmo poder

computacional de uma maacutequina de Turing universal ou seja

Jogo da Vida pode ser tatildeo poderoso quanto qualquer com-

putador com memoacuteria ilimitada dando origem ao Turing com-

pleto como jaacute vaacuterios estudos comprovam esse mesmo feito

Mais uma vez recordo ao leitor que pode experimentar sem

qualquer restriccedilatildeo as configuraccedilotildees iniciais que mais lhe

agradarem Este artigo eacute o terceiro de uma seacuterie de artigos

de programaccedilatildeo tendo como base principal a linguagem C

que esperamos que siga atentamente

JOGO DA VIDA

cvivas++ if (matrizActual[i+1][j+1] == CELVIVA) cvivas++ if (isAlive ampamp cvivas lt 2) DIE else if (isAlive ampamp cvivas gt 3) DIE else if (isAlive ampamp (cvivas == 2 || cvivas == 3)) LIVE else if (isDead ampamp cvivas == 3) LIVE else DIE

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

a matriz principal

natildeo eacute toda proces-

sada (hellip) para que natildeo

sejam gastos recur-

sos de computaccedilatildeo

A PROGRAMAR

21

Introduccedilatildeo

Atualmente a plataforma Java eacute uma das mais utilizadas no

mundo e muito disso se deve agrave capacidade da plataforma

suportar outras linguagens como por exemplo JRuby Groovy

e Scala Milhares de aplicativos para Web e Mobile satildeo de-

senvolvidos a cada mecircs utilizando esta plataforma como

base A plataforma Java mudou muito desde seu iniacutecio e

provavelmente vai continuar evoluindo nos proacuteximos anos

Em paralelo com essas mudanccedilas visualizamos os servido-

res de aplicaccedilatildeo que cada vez mais oferecem recursos de

alta complexidade como componentes de balanceamento

de carga inteligente implementaccedilatildeo de autenticaccedilatildeo (JAAS)

troca de mensagens assiacutencronas (JMS) controle de transa-

ccedilatildeo (JTA) persistecircncia de objetos (JPA) componentes para

criaccedilatildeo de aplicaccedilotildees distribuiacutedas e clusterizadas (EJB) API

Java para processamento de arquivos XML e Webservices

(JAX-WS e JAX-B) e muitas outras tecnologias facilitando o

desenvolvimento e padronizaccedilatildeo de aplicaccedilotildees Eles tam-

beacutem disponibilizam uma infraestrutura estaacutevel e escalonaacutevel

para aplicaccedilotildees de missatildeo criacutetica Um dos grandes desafios

dos servidores de aplicaccedilatildeo eacute acoplar serviccedilos de grande

complexidade deixando-os estaacuteveis e flexiacuteveis

Nas versotildees iniciais a plataforma ainda conhecida como

Java2EE natildeo estava madura e seus recursos nos servidores

de aplicaccedilatildeo eram carregados de forma hieraacuterquica consu-

mindo muitos recursos e tornando o startup altamente custo-

so

A arquitetura dos principais servidores de aplicaccedilatildeo foi rede-

senhada para que seus recursos possam ser iniciados de

modo concorrente ou sob demanda As melhorias tambeacutem

podem ser notadas no consumo de memoacuteria onde em uma

simples maacutequina desktop pode-se facilmente configurar

serviccedilos de alta disponibilidade e escalaacuteveis para realizaccedilatildeo

de testes em tempo de desenvolvimento

Se vocecirc deseja um ambiente com alta disponibilidade esca-

lonaacutevel e que seja independente de fabricante (de forma a

evitar o vendor lock-in) o Java EE e seus servidores de apli-

caccedilatildeo foram feitos para si

JBoss Application Server 7

JBoss Application Server 7 ou apenas JBoss AS 7 eacute um ser-

vidor de aplicaccedilatildeo de coacutedigo aberto que eacute 100 compatiacutevel

com a especificaccedilatildeo Java EE 6 Em versotildees anteriores do

Java EE mesmo utilizando somente algumas tecnologias

para o desenvolvimento da aplicaccedilatildeo eacuteramos obrigados a

lidar com todos os recursos implementados no servidor Para

resolver esse problema no Java EE 6 foi inserido o conceito

JBoss Aplication Server 7 de profile que tem como objetivo criar configuraccedilotildees com fins

especiacuteficos como por exemplo o Web Profile que possui tec-

nologias para o desenvolvimento web

Ateacute ao momento a versatildeo atual do JBoss AS foi baixada

mais de 150 mil vezes Para mais informaccedilotildees visite o site

do projeto httpwwwjbossorgjbossas

Recentemente o projeto recebeu um novo nome e futura-

mente se chamaraacute WildFly Mais informaccedilotildees podem ser

encontradas em httpwwwwildflyorgfaq

Requisitos

Como todo servidor de aplicaccedilatildeo o JBoss AS 7 requer um

ambiente com JDK 16JDK 17 devidamente configurado e

instalado O Java Development Kit (JDK) eacute um conjunto de

utilitaacuterios para criaccedilatildeo de softwares para plataforma Java

Existem vaacuterias implementaccedilotildees cada qual com a sua finali-

dade

Para baixar o JDK 7 navegue ateacute a paacutegina de download da

Oracle em httpwwworaclecomtechnetworkjavajavase

downloadsindexhtml e escolha a opccedilatildeo Java Platform

(JDK) Em seguida vocecirc seraacute direcionado para outra paacutegina

onde deveraacute aceitar a License Agreement Baixe a versatildeo

jdk-7u21-linux-x64rpm

Para instalar o JDK execute o seguinte comando

$ sudo rpm -Uvh jdk-7u21-linux-x64rpm

Execute o comando java --version para verificar se o JDK

estaacute instalado

$ java --version

java version 170_21

Java(TM) SE Runtime Environment (build 170_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 2321-b01 mixed

mode)

Duvidas na instalaccedilatildeo Consulte o link

httpdocsoraclecomjavase7docswebnotesinstall

indexhtml

Instalando o JBoss AS 7

O JBoss AS 7 pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgjbossasdownloads Para

instalar basta descompactar o arquivo jboss-as-

711Finalzip utilizando um utilitaacuterio de descompressatildeo

A PROGRAMAR

22

Boas Praacuteticas

Nunca inicie o JBoss utilizando o usuaacuterio root pois a platafor-

ma Java oferece APIs para execuccedilatildeo de coacutedigos nativos do

sistema operacional e mecanismos de gerenciamento remoto

No Linux crie um usuaacuterio com privileacutegios de root para iniciar o

serviccedilo do JBoss Jaacute no Windows crie um usuaacuterio com poderes

administrativos mas com privileacutegios reduzidos

Uma vez instalado eacute fortemente aconselhaacutevel iniciar o JBoss

AS para verificar se existe alguma incompatibilidade com a

arquitetura do JDK utilizado ou ateacute mesmo se a memoacuteria dispo-

nibilizada eacute suficiente

Execute uma simples instacircncia standalone e acesse a url http

localhost8080 para verificar se o JBoss foi iniciado correta-

mente

$ jboss-as-711Finalbinstandalonesh

Domain Mode x Standalone Mode

O JBoss AS 7 possui dois modelos de trabalho conhecidos

como Standalone Mode e Domain Mode No Standalone Mode

podemos trabalhar com uma uacutenica instacircncia muito semelhante

a versotildees anteriores do JBoss AS 5 e JBoss AS 6 Para utilizar

o Standalone mode basta iniciar o script JBOSS_HOME

standalonesh no Linux

Agora vocecirc deve estar se perguntando se eacute possiacutevel criar um

ambiente de alta disponibilidade utilizando o Standalone

Mode A resposta eacute Sim Eacute possiacutevel criar um ambiente com

recursos clusterizados replicaccedilatildeo de sessatildeo e tudo mais Se

vocecirc jaacute utilizou outras versotildees do JBoss deve estar pensan-

do em utilizar o famoso Farm Deployment onde a aplicaccedilatildeo

era replicada para todos os noacutes do cluster Esse recurso natildeo

existe no Standalone Mode pelo que vocecirc teraacute que realizar

o deploy em todos os noacutes um por um Isso natildeo eacute um proble-

ma se forem 3 ou 4 instacircncias mas imagine se forem umas

20 instacircncias

Uma soluccedilatildeo para esse problema seria a utilizaccedilatildeo de ferra-

mentas como o RHQ (httpwwwjbossorgrhq) para realiza-

ccedilatildeo do deploy em muacuteltiplas instacircncias o que acarretaria con-

sumo de mais recursos e tempo Para solucionar esse pro-

blema temos uma soluccedilatildeo bem simples jaacute embutida no servi-

dor de aplicaccedilatildeo o Domain Mode e eacute sobre isso que vamos

falar no proacuteximo toacutepico

Introduccedilatildeo ao Domain Mode

O Domain Mode permite iniciar vaacuterias instacircncias e tambeacutem

oferece uma maneira centralizada de gerenciamento dos

recursos facilitando a administraccedilatildeo das instacircncias JBoss O

Domain Mode pode ser visto como uma unidade de instacircn-

cias que compartilham recursos e configuraccedilotildees e satildeo admi-

nistradas por um processo chamado Domain Controller

Para iniciar o JBoss AS 7 de modo domain execute o script

JBOSS_HOMEdomainsh no Linux ou JBOSS_HOME

domainbat no Windows

Quando iniciamos o JBoss em Domain Mode na configura-

ccedilatildeo default temos no miacutenimo quatro processos um Host

Controller um Process Controller e dois Servers

Domain Controller Ele eacute quem controla o gerenciamento

do domain Nele estatildeo as configuraccedilotildees que satildeo comparti-

lhadas entre as instacircncias que estatildeo nesse domain

Process Controller Ele eacute de grande importacircncia pois ele eacute

responsaacutevel pela criaccedilatildeo das instacircncias e tambeacutem do Host

Controller que vamos falar a seguir O Process Controller

natildeo deve ser confundido com uma instacircncia ele eacute

simplesmente um processo na JVM

Host Controller Como Domain Controller o Host Controller

tambeacutem coordena as instacircncias do domain Ele eacute o

responsaacutevel por fazer algo semelhando ao Farm Deployment

(natildeo existe nessa versatildeo) ou seja ele distribui o arquivo

deployado para todas as instacircncias do domain

Servers Satildeo as instacircncias em si onde estatildeo as aplicaccedilotildees

deployadas Um ponto importante eacute que cada server eacute um

processo Java

Entre os benefiacutecios da utilizaccedilatildeo do Modo Domain que noacutes

podemos citar estatildeo

Gestatildeo Centralizada

JBOSS APLICATION SERVER 7

A PROGRAMAR

23

Configuraccedilatildeo Centralizada

Deploy Centralizado

Manutenccedilatildeo Centralizada

Preparando a Infra Estrutura

Nesse artigo estamos utilizando Trecircs servidores Dois deles

seratildeo utilizados pelas as instacircncias JBoss e Um seraacute utilizado

Pelo Domain Controller e Apache Web Server para realizar o

Balanceamento de carga

Crie um grupo e adicione um usuaacuterio para ser utilizado

pelo JBoss AS 7 em todos os servidores

$ sudo groupadd jboss

$ sudo useradd -s binbash -d homejboss -m -g jboss

jboss

Faccedila tambeacutem o download do JBoss AS 7 no diretoacuterio

tmp

$ cd tmp

$ wget httpdownloadjbossorgjbossas71jboss-as-

711Finaljboss-as-711Finalzip

Crie a estrutura de diretoacuterios para armazenar o JBoss

$ sudo mkdir usrlocaljboss

$ chown jbossjboss usrlocaljboss

$ su jboss

$ mkdir usrlocaljboss

$ cd usrlocaljboss

$ unzip tmpjboss-as-711Finalzip

Finalmente o JBoss AS 7 estaacute instalado em usr

localjbossjboss-as-711 Final em todos os servidores

Configurando Alta Disponibilidade

Para aplicaccedilotildees com muitas solicitaccedilotildees a busca pela

melhora do desempenho eacute quase constante Um dos

meios mais utilizados eacute o Balanceamento de Carga

que consiste em distribuir a carga das solicitaccedilotildees em

vaacuterios servidores ou instacircncias proporcionando a

melhora no tempo de reposta

O JBoss AS 7 possui um componente nativo

conhecido como mod_cluster que foi criado para

atender a mecanismos de balanceamento de carga

alinhados ao conceito de Cloud O Mod Cluster vem

com algoritmos de balanceamento de carga mais

avanccedilados que se baseiam na carga da aplicaccedilatildeo ou

seja quantidades de sessotildees conexotildees abertas

entre outros Ele pode ser customizado conforme a

necessidade da aplicaccedilatildeo visando um ambiente

elaacutestico Um das vantagens eacute tambeacutem o

descobrimento automaacutetico de novas instacircncias JBoss

(utilizando Multicast) natildeo havendo a necessidade de

configuraccedilotildees extras

As configuraccedilotildees do mod_cluster devem ser

realizadas no JBoss AS 7 e no Apache Web Server

que seraacute utilizado como Proxy reverso

Instalando Apache Web Server

No Servidor Balancer instale o Apache Web Server

Basta executar o seguinte comando

$ sudo yum install httpd -y

Inicie o serviccedilo e verifique se paacutegina de testes eacute

carregada

$ sudo service httpd start

Instalando Mod Cluster

Ainda no Servidor Balancer instale o Mod Cluster Ele

pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgmod_cluster

downloads1-2-0-Final Para instalar basta

JBOSS APLICATION SERVER 7

A PROGRAMAR

24

descompactar o arquivo mod_cluster-120Final-linux2-

x64-ssltargz utilizando um utilitaacuterio de descompressatildeo

e copiar os moacutedulos para o diretoacuterio de moacutedulos do

Apache Web Server

Para baixar e extrair o arquivo execute

$ cd tmp

$ wget httpdownloadsjbossorg

mod_cluster120Finalmod_cluster-120Final-

linux2-x64-ssltargz

$ tar -zxvf mod_cluster-120Final-linux2-x64-

ssltargz

Copie os moacutedulos para o Apache

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_advertiseso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_managerso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_proxy_clusterso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_slotmemso etchttpdmodules

Edite o arquivo etchttpdconfhttpdconf e comente a

linha LoadModule proxy_balancer_module modules

mod_proxy_balancerso para natildeo ocorrer um conflito

com LoadModule proxy_cluster_module modules

mod_proxy_clusterso

LoadModule proxy_balancer_module modules

mod_proxy_balancerso

Crie o arquivo mod_clusterconf e adicione a seguinte

configuraccedilatildeo

$ sudo vim etchttpdconfdmod_clusterconf

Reinicie o Apache

$ sudo service httpd restart

Acesse o mod_cluster-manager e verifique se as

informaccedilotildees sobre a versatildeo do mod_cluster estatildeo

aparecendo

Arquitetura dos Servidores em Modo Domain

Para realizar os testes do balanceamento de carga

com o mod_cluster vamos subir o Domain Controller

e depois vamos conectar dois Hosts Controller com

uma Instacircncia JBoss em cada

Criando os Perfis dos Servidores JBoss

No Servidor Balancer crie o perfil chamado master

que seraacute o Domain Controller

$ cp -Rap usrlocaljbossjboss-as-711Final

domain usrlocaljbossjboss-as-711Finalmaster

JBOSS APLICATION SERVER 7

Content Mod Cluster LoadModule slotmem_module modules mod_slotmemso LoadModule manager_module modules mod_managerso LoadModule proxy_cluster_module modules mod_proxy_clusterso LoadModule advertise_module modules mod_advertiseso ltVirtualHost 80gt ltDirectory gt Order denyallow Allow from all ltDirectorygt KeepAliveTimeout 60 ManagerBalancerName mycluster MaxKeepAliveRequests 0 ServerAdvertise On EnableMCPMReceive On ltVirtualHostgt ltLocation mod_cluster-managergt SetHandler mod_cluster-manager Order denyallow Allow from all ltLocationgt

A PROGRAMAR

25

No Servidor Host-01 crie o perfil chamado host01 que

seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost01

No Servidor Host-02 crie o perfil chamado host02 que

tambeacutem seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost02

Configurando Toda a Arquitetura

Como vimos anteriormente todas as configuraccedilotildees e

gerenciamento satildeo realizadas de forma centralizada no

Domain Controller Quando for necessaacuterio adicionar um

novo grupo de servidores configurar logs criar

datasources alterar portas entre outras coisas tudo

isso deveraacute ser feito no domainxml do Domain

Controller que nesse caso eacute chamado de master Sendo

assim todas as nossas instacircncias JBoss usufruiratildeo das

configuraccedilotildees realizadas para o Domain ou para o

Server Group em questatildeo

A primeira coisa a ser feita eacute definir qual o conjunto de

tecnologias (subsystems) seratildeo utilizadas na aplicaccedilatildeo

Isso pode variar conforme os requisitos de cada

sistema Um conjunto de tecnologias (subsystems) no

JBoss 7 eacute chamado de profile

ltprofile name=full-hagt

O JBoss AS 7 possui 4 profiles por padratildeo ldquodefaultrdquo

ldquofullrdquo ldquohardquo ldquofull-hardquo mas nada impede de noacutes

copiarmos qualquer um deles e renomeaacute-los conforme

nossos requisitos No Java EE 6 foi introduzido o

conceito de Profiles onde se pode criar um subconjunto

de tecnologias presentes na spec Java EE ou ateacute

mesmo adicionar novas definidas pela JCP (Java

Community Process)

Mais informaccedilotildees

httpscommunityjbossorgwiki

JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Noacutes vamos utilizar o profile ha pois nele os recursos

para clusterizaccedilatildeo estatildeo disponiacuteveis

Depois de definir o profile o proacuteximo criar um Grupo de

Servidores Server Group Um server group nada mais eacute

que um agrupamento de instacircncias JBoss Nessa

arquitetura vamos utilizar apenas um server group Isso

pode ser definido na tag ltserver-groupsgt no domainxml

do master (Domain Controller)

Crie um Server Group chamado apps que utilize o

profile ha

$ vim usrlocaljbossjboss-as-711Finalmaster

configurationdomainxml

Os outros Server Groups podem ser removidos

No profile ha especificamente no subsystem web

adicione o atributo instance-id

O instance-id seraacute passado como paracircmetro na

inicializaccedilatildeo do Host Controller

O proacuteximo passo eacute configurar o atributo proxy list no

subsystem modcluster

Nesse atributo estaacute configurado o IP e porta do

Apache Web Server

No Servidor Host-01 edite o arquivo usrlocaljboss

jboss-as-711Finalhost01configurationhost-

slavexml para criar a instacircncia JBoss

Na tag ltserversgt eacute onde estatildeo de fato as nossas

instacircncias JBoss Quando criamos um novo ltservergt

estamos criando uma nova instacircncia JBoss

Conforme foi definido na arquitetura o Host Controller

01 conteraacute apenas uma instacircncia JBoss chamada

instance-one

Deixe o ltserversgt como abaixo

Definimos que a instacircncia JBoss instance-one faraacute

parte do Server Group apps

Para finalizar na tag lthostgt adicione o nome host01

lthost name=host01 xmlns=urnjbossdomain12gt

JBOSS APLICATION SERVER 7

ltserver-group name=apps profile=hagt ltjvm name=defaultgt ltheap size=1303m max-size=1303mgt ltpermgen max-size=256mgt ltjvmgt ltsocket-binding-group ref=ha-socketsgt ltserver-groupgt

ltsubsystem xmlns=urnjbossdomainweb12 de-fault-virtual-server=default-host instance- id=$jbossservername native=falsegt

ltsubsystem xmlns=urnjbossdomainmodcluster10gt ltmod-cluster-config advertise-socket=modcluster proxy-list=19216823818680gt ltdynamic-load-providergt ltload-metric type=busynessgt ltdynamic-load-providergt ltmod-cluster-configgt ltsubsystemgt

ltserversgt ltserver name=instance-one group=appsgt ltservergt ltserversgt

A PROGRAMAR

26

Repita os procedimentos realizados no servidor Host -01

em Host-02 alterando apenas o nome do servidor que

seraacute instance-two e do lthostgt que seraacute host02No

ambiente em que realizei os testes o sevidores possuem

os seguintes IPs

Domain Controller+Apache WebServer 192168238186

Host Controller 01 192168238187

Host Controller 02 192168238188

Inicie o Domain Controler (master) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalmaster

-Djbosshostdefaultconfig=host-masterxml -

Djbossbindaddress=192168238186 -

Djbossbindaddressmanagement=192168238186

Verifique o log

JBoss AS 711Final Brontes (Host Controller) started

in 15505ms - Started 11 of 11 services (0 services are

passive or on-demand)

O Domain Controller foi iniciado com sucesso Conecte

primeiro Host Controller 01 (Host-01) ao Master Inicie o

Perfil host01 utilizando os seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost01

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238187

-Djbossbindaddress=192168238187

-Djbossservername=host-01

Agora observe os logs no Domain Controller e perceba

que o Host Controller 01 se conectou ao Domain

JBAS010918 Registered remote slave host host01

JBoss AS 711Final Brontes

Observe tambeacutem o Mod Cluster Manager em

http192168238186mod_cluster-manager e veja que

a nossa primeira instacircncia jaacute apareceu

Inicie o Host Controller 02 (slave02) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost02

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238188

-Djbossbindaddress=192168238188

-Djbossservername=host-02

Observando novamente o log Domain Controller e

verifique que o Host Controller 02 se tambeacutem

conectou

JBAS010918 Registered remote slave host host02

JBoss AS 711Final Brontes

No Mod Cluster Manager em http192168238186

mod_cluster-manager jaacute estatildeo as duas instacircncias

Para testar o Balanceamento vamos fazer o deploy da

aplicaccedilatildeo SystemProps que pode ser baixada http

googlyjynK Para fazer o deploy conecte do domain

controller utilizando o CLI

[jbosslocalhost jboss]$ sudo jboss-as-711Final

binjboss-clish -c controller=1921682381869999

[domain1921682381869999 ] deploy tmp

systempropswar --server-groups=apps

A aplicaccedilatildeo foi deployada para as instacircncias do server

group apps Acesse a url do balanceador e verifique

se a aplicaccedilatildeo estaacute disponiacutevel

http192168238186systemprops

JBOSS APLICATION SERVER 7

A PROGRAMAR

27

Perceba que estamos na instance-one Entatildeo para

testarmos o funcionamento do balanceamento de carga

vamos parar a Instacircncia instance-one e quando

tentarmos um novo acesso seraacute redirecionado para o

instance-two

No CLI execute o seguinte comando para parar o

instance-one

[domain1921682381869999 ] host=host01server -

config=instance-onestop

outcome =gt success

result =gt STOPPING

Acesse novamente a aplicaccedilatildeo http192168238186

systemprops

Perceba que agora estamos no instance-two Concluiacutemos assim que o balanceamento de carga estaacute funcionando

Conclusatildeo

O JBoss AS 7 trouxe a evoluccedilatildeo arquitetural que era esperada como pode ser vista nesse artigo Carregamento de moacutedulos dinacircmico gerenciamento centralizado e tempo de startup reduzido satildeo apenas

algumas das inuacutemeras melhorias trazidas nessa versatildeo

Espera-se que a plataforma JBoss continue evoluindo

trazendo sempre mais benefiacutecios a todos que utilizam

os produtos desse ecossistema Cada membro da

comunidade tambeacutem pode fazer a sua parte seja

colaborando com artigos ou participando de

discussotildees para encontrar melhorias para a

plataforma Cabe a noacutes aceitar o convite de melhorar

cada vez mais essa tecnologia

JBOSS APLICATION SERVER 7

AUTOR Escrito por Mauricio Magnani Jr

Consultor JBoss com 6 anos de experiecircncia no mercado Trabalhou na RedHat como Engenheiro de Suporte JBoss atenden-

do clientes da Ameacuterica Latina e EUA Criador e mantenedor do blog httpsjbossdiverswordpresscom e membro ativo do

Grupo de Usuaacuterios JBoss do Brasil Hoje eacute Senior Java Software Engineer no Groupon Brasil Possui as certificaccedilotildees Red Hat

Certified JBoss Administrator on JBoss EAP 5 e JBoss EAP 6

Milhares de apli-

cativos para Web

e Mobile satildeo desenvol-

vidos a cada mecircs utili-

zando esta plataforma

como base A platafor-

ma Java mudou muito

desde seu iniacutecio e pro-

vavelmente vai conti-

nuar evoluindo nos

proacuteximos anos

A PROGRAMAR

28

Para o desenvolvimento de aplicaccedilotildees Web existem um sem

nuacutemero de frameworks gratuitas e mais ou menos bem con-

ceituadas Contudo temos vaacuterios problemas associados que

com o crescer de uma aplicaccedilatildeo podem trazer vaacuterios recuos

no seu desenvolvimento Um dos maiores eacute o oacutebvio satildeo

gratuitas e por isso mesmo o coacutedigo eacute lido por milhares de

pessoas em todo o mundo tornando as falhas de seguranccedila

bastante visiacuteveis e faacuteceis de explorar Outro grande proble-

ma eacute o facto de trazerem funcionalidades especiacuteficas em que

muitas vezes natildeo as usamos tornando-se em alguns casos

um ldquocanhatildeo para matar um mosquitordquo Pegando na aborda-

gem das correntes frameworks podemos noacutes proacuteprios cons-

truir algo soacutelido o suficiente para uma grande aplicaccedilatildeo

Vamos nesta seacuterie de trecircs artigos construir uma framework

passo-a-passo comeccedilando pelo baacutesico mas o mais importan-

te o routing

htaccess

Tirando partido do serviccedilo Apache delegamos o enclausura-

mento do nosso sistema de ficheiros agrave regras htaccess Natildeo

permitimos a listagem de ficheiros nem a execuccedilatildeo de outros

scripts PHP agrave excepccedilatildeo do indexphp sendo este o respon-

saacutevel pelo routing da framework Para garantirmos que estas

regras satildeo cumpridas e que o indexphp seja sempre chama-

do redireccionamos todos os pedidos de execuccedilatildeo de

scripts para o mesmo indexphp dando-lhe todos os argu-

mentos do URL originalmente fornecidos Desta forma o

utilizador natildeo sabe a que ficheiros ou pastas estaacute a aceder

A esta regra temos de adicionar uma excepccedilatildeo a pasta con-

tent onde temos todos os conteuacutedos como imagens ficheiros

CSS viacutedeos etc No fundo todos aqueles ficheiros que o

browser do utilizador vai descarregar Para mantermos o

enclausuramento da nossa aplicaccedilatildeo natildeo eacute aconselhado

natildeo colocarmos nessa pasta nenhum tipo de script visto que

pode ser executado arbitrariamente do exterior o contraacuterio

do que queremos

configphp

PHP Uma framework ldquofrom scratchrdquo (Parte 1) Usaremos este ficheiro como auxilio para definiccedilotildees de cami-

nhos para pastas e configuraccedilotildees por defeito

define(DS DIRECTORY_SEPARATOR)

Esta definiccedilatildeo eacute uma redundacircncia eacute definida simplesmente

por conveniecircncia na escrita do coacutedigo

define(BASE_PATHhttplocalhost)

Aqui definimos o caminho URL para a nossa aplicaccedilatildeo

define(DEFAULT_PAGEhello)

Esta eacute a nossa paacutegina por defeito caso nenhuma tenha sido

requirida

define(ROOT$_SERVER[DOCUMENT_ROOT])

Aqui eacute definido o caminho para a pasta da aplicaccedilatildeo

Uma vez definidas as configuraccedilotildees passamos agrave parte mais

importante o routing

Visto que temos todos os requests redireccionados para o

indexphp agora temos de fazer sentido dos argumentos

que satildeo passados pelo URL

Aqui separamos os argumentos em duas partes a paacutegina

que queremos aceder e os argumentos para esta paacutegina O

seguinte pedido

httplocalhosthellofoobar

resulta em

RewriteEngine on RewriteCond $1 ^(allowphp|indexphp|content) RewriteRule ^()$ indexphp$1 [L] ltFiles htaccessgt order allowdeny deny from all ltFilesgt

define(DS DIRECTORY_SEPARATOR) define(BASE_PATHhttplocalhost) define(DEFAULT_PAGEhello) define(ROOT$_SERVER[DOCUMENT_ROOT])

function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url

array (size=2) page =gt string hello (length=5) args =gt array (size=2) 0 =gt string foo (length=3) 1 =gt string bar (length=3)

A PROGRAMAR

29

(hellip)micro-

framework temos um

sistema de routing que

nos iraacute permitir nos

dois proacuteximos artigos

alargar os horizontes

passando a uma pro-

gramaccedilatildeo OOP e imple-

mentando MVC

De seguida encaminhamos para a paacutegina requerida

Aqui verificamos se a paacutegina que eacute pedida existe no case de

existir importamos o ficheiro caso contrario enviamos o header

de erro e terminamos a aplicaccedilatildeo

Indexphp

ROOT

Indexphp

Configphp

htaccess

Pages

Hellophp

Com esta micro-framework temos um sistema de routing que

nos iraacute permitir nos dois proacuteximos artigos alargar os horizon-

tes passando a uma programaccedilatildeo OOP e implementando

MVC Finalmente iremos implementar um pequeno driver

para MySQL e um debugger

Dependecircncias

Apache com mod_rewrite e PHP

P VS NP COMPREENDER O MAIOR PROBLEMA POR RESOLVER EM COMPUTACcedilAtildeO

function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

ltphp require_once (configphp) function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

callHook() gt

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

COLUNAS C - Observable vs Task

Visual (Not) Basic - Operator Overloading

C

32

Nas ediccedilotildees anteriores vimos como transformar uma API

baseada assiacutencrona em eventos numa API baseada em ob-

servaacuteveis (observables) ou numa API baseada em tarefas

A questatildeo que se levanta eacute quando usar qual

Quando Usar Observaacuteveis

A programaccedilatildeo baseada em observaacuteveis eacute tambeacutem conheci-

da como programaccedilatildeo reativa e comeccedilou a ser usada como

alternativa a assiacutencrona baseada em eventos porque a pro-

gramaccedilatildeo assiacutencrona baseada em tarefas ainda natildeo estava

disponiacutevel (ou natildeo estava disponiacutevel em todas as platafor-

mas)

Na verdade o campo de batalha da programaccedilatildeo reativa

satildeo as correntes de eventos (event streams) Eacute aqui que a

utilizaccedilatildeo de eventos se torna tambeacutem mais natural

Uma API baseada em eventos em que o evento apenas eacute

disparado uma vez eacute na verdade uma API baseada em

chamadas de resposta (callback) O facto de ser implemen-

tada com o mecanismo de eventos da plataforma NET natildeo

faz dela uma API baseada em eventos

A existecircncia da necessidade de combinar vaacuterias correntes de

eventos e relacionaacute-los entre si eacute tambeacutem uma boa indicaccedilatildeo

para a utilizaccedilatildeo de observaacuteveis

Quando Usar Tarefas

Como o nome indica uma tarefa eacute algo que tem um iniacutecio e

um fim Assim sendo todas as API assiacutencronoas baseadas

num mecanismo de chamada de resposta (callback) satildeo

candidatadas a ser transformadas numa API assiacutencrona

baseada em tarefas Mesmo que o mecanismo de chamada

de resposta sejam eventos NET

Matriz De Aplicabilidade

Baseando-nos nas consideraccedilotildees anteriores e porque nem

sempre tudo eacute assiacutencrono chegamos agrave seguinte matriz de

aplicabilidade

Conclusatildeo

No final natildeo existe uma resposta maacutegica O que numa situa-

ccedilatildeo pode ser um observaacutevel noutra pode ser uma tarefa

Recursos

O GeoCoordinateWatcher Como Um Serviccedilo Reativo - Re-

vista PROGRAMAR - 39ordf Ediccedilatildeo - Fevereiro 2013

Trazendo Async E Await ao Serviccedilo de Contactos do Win-

dows Phone - Revista PROGRAMAR - 40ordf Ediccedilatildeo - Abril

2013

Extensotildees Reativas (Rx)

Programaccedilatildeo assiacutencrona com async e await (C e Visual

Basic)

C - OBSERVABLE VS TASK

Siacutencrono Assiacutencrono

Um uacutenico valor - Tarefa

Muacuteltiplos valo-

res

Enumeraacutevel Observaacutevel

AUTOR

Escrito por Paulo Morgado

Bacharel em Engenharia Electroacutenica e Telecomunicaccedilotildees (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa

e Licenciado em Engenharia Informaacutetica pela Faculdade de Ciecircncias e Tecnologia da Universidade Nova de Lisboa exerce

variadas funccedilotildees relacionadas com o desenvolvimento distribuiccedilatildeo e manutenccedilatildeo de software haacute mais de 10 anos Participa

em diversas comunidades nacionais e internacionais (pontoNETpt NetPonto SharePointPT SQLPort Portugal-a-Programar

CodeProject CodePlex etc) Pelo seu contributo para com estas comunidades a Microsoft premeia-o com o preacutemio MVP

(C) desde 2003 Eacute ainda co-autor do livro ldquoLINQ Com Crdquo da FCA httpPauloMorgadoNET - PauloMorgado

o campo de bata-

lha da programaccedilatildeo re-

ativa satildeo as correntes

de eventos (event stre-

ams)

VISUAL (NOT) BASIC

33

ldquoNatildeo podes somar batatas com elefantesrdquo

Frases como a anterior ou semelhantes jaacute vos passaram

por a consideraccedilatildeo em alguma altura da vossa vida Quer

tenha sido nos vossos primeiros passos a matemaacutetica ou

ainda na semana passada em qualquer implementaccedilatildeo de

software mais rebuscada algueacutem algures transmitiu dessa

forma que natildeo eacute possiacutevel operar aquelas duas variaacuteveis

De facto batatas e elefantes natildeo satildeo tipicamente operaacuteveis

a menos que a resposta de que estamos agrave procura seja dife-

rente

Saber como operar

A soluccedilatildeo da soma de batatas com elefantes reside precisa-

mente na resposta que procuramos obter

Eu posso dizer que Elefante + Batata eacute igual a 4 se for es-

pecificado que a soma de seres-vivos opera aritmeticamente

o nuacutemero de pernas do ser Natildeo posso Claro que posso

Soacute precisamos de definir que os seres-vivos satildeo operaacuteveis

assim e de que forma Eacute aqui que entra o ldquooverloadrdquo de ope-

radores

Operadores

Operadores sim Quando se falam de operadores referem-

se todos aqueles que estatildeo provavelmente a passar-vos na

cabeccedila agora tanto unaacuterios como binaacuterios mas nem todos

Unaacuterios + - Not IsTrue IsFalse CType

Binaacuterios + - amp Like Mod And Or Xor ^ ltlt

gtgt = ltgt gt lt gt= lt=

Estes operadores fazem sentido nos usos comuns onde jaacute

sabemos para que servem e que resultados vatildeo surtir

Agrave luz da especificaccedilatildeo anterior podemos afirmar com segu-

ranccedila que Elefante gt Batata porque uma batata natildeo tem

pernas e porque conhecemos o operador gt (maior que)

A implementaccedilatildeo do operador pode basear-se em qualquer

aspecto dos seus operandos mas natildeo eacute boa ideia contradi-

zer a loacutegica do operador que se estaacute a definir Por razotildees

oacutebvias natildeo eacute boa ideia por exemplo implementar overloads

de tal forma que Batata - Elefante = -4 ao mesmo tempo que

Batata gt Elefante = TRUE Natildeo faz sentido porque natildeo esta-

mos a usar o mesmo criteacuterio Se Batata ndash Elefante eacute menor

que zero a Batata deveria ser menor que o Elefante e natildeo o

contraacuterio

Natildeo eacute que seja impossiacutevel mas vai tornar o coacutedigo muito

mais difiacutecil de ler o que vai contra a facilidade do overload

de operadores

Overload

A ideia natildeo eacute inventar novos operadores O que queremos

realmente indicar eacute qual o procedimento a seguir para conse-

guir aplicar o anaacutelogo do operador para determinado tipo ou

determinados tipos Assim o operador + por exemplo teraacute

de continuar a fazer sentido na aritmeacutetica ao mesmo tempo

que faz sentido na soma de seres-vivos se tentarmos somar

nuacutemeros entra o operador aritmeacutetico se tentarmos somar

batatas com elefantes entra a nossa implementaccedilatildeo do ope-

rador

Portanto e em tom de resumo da mesma forma que defini-

mos overloads de meacutetodos tambeacutem se definem overloads

de operadores com base na sua assinatura

Jaacute chega de elefantes e batatas natildeo

Efectivamente jaacute Natildeo conveacutem esticar a analogia ateacute porque

nem todos os operadores fazem sentido com uma classe de

seres vivos As coisas comeccedilam a ficar mais claras com

exemplos de implementaccedilatildeo

Vamos considerar a seguinte classe para exemplificar

Como seraacute de esperar se tentarmos por exemplo comparar

instacircncias desta classe o Visual Basic natildeo saberaacute o que

fazer para comparar Eacute um tipo composto que compreende

OPERATOR OVERLOADING

Public Class Veiculo Public Enum TipoVeiculo AUTOMOVEL MOTO PESADO End Enum Public Enum TipoCombustivel GASOLINA GASOLEO HIBRIDO ELECTRICO GPL End Enum Public Property Tipo As TipoVeiculo Public Property Marca As String Public Property Modelo As String Public Property Cilindrada As Integer Public Property Combustivel As TipoCombustivel Public Property NumeroPortas As Short Sub New(Tipo As TipoVeiculo Marca As String Modelo As String Cilindrada As Integer Combustivel As TipoCombustivel NumeroPortas As Short) _Tipo = Tipo _Marca = Marca _Modelo = Modelo _Cilindrada = Cilindrada _Combustivel = Combustivel _NumeroPortas = NumeroPortas End Sub End Class

VISUAL (NOT) BASIC

34

membros que noacutes mesmos criamos e seria impossiacutevel perce-

ber automaticamente quais as caracteriacutesticas a comparar

Este coacutedigo natildeo compila com dois erros em Carro1 = Carro2

e Carro2 = Carro3

Operator = is not defined for types OperatorOverloadVeicu-

lo and OperatorOverloadVeiculo

E tem toda a razatildeo O operador igual (=) natildeo estaacute nem im-

plementado na classe nem tem nenhum overload que im-

plique uma operaccedilatildeo binaacuteria com dois tipos Veiculo

Vamos entatildeo implementar um operador para o igual (=) que

consiga determinar se estamos na presenccedila do mesmo

veiacuteculo ou natildeo Vamos considerar que a cilindrada natildeo eacute um

factor para distinguir dois carros

Basta acrescentar os seguintes meacutetodos na classe Veiculo

Algumas implementaccedilotildees de operadores implicam que se

implementem tambeacutem a sua negaccedilatildeo No caso do operador

igual (=) eacute necessaacuterio natildeo soacute especificar o que eacute consider-

ado igual mas tambeacutem o que eacute considerado diferente

Assim o coacutedigo anterior jaacute eacute correctamente compilado e

produz o seguinte output

Carro1 = Carro2 False

Carro2 = Carro3 True

O que eacute verdade Como operaccedilotildees aritmeacuteticas natildeo faziam

muito sentido com uma classe a representar um veiacuteculo

vamos considerar esta nova classe

Esta classe representa um vector tridimensional Manteacutem um

valor para X para Y e para Z Natildeo adianta realizar

operaccedilotildees aritmeacuteticas com o Vector uma vez que novamen-

te o Visual Basic natildeo saberia o que fazer com ele

Vamos entatildeo acrescentar alguns operadores

Assim jaacute eacute possiacutevel efectuar algumas operaccedilotildees com esta

classe

OPERADOR LIKE

Public Shared Operator =(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return False If V1Combustivel ltgt V2Combustivel Then Return False If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return False If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return False If V1NumeroPortas ltgt V2NumeroPortas Then Return False Return True End Operator Public Shared Operator ltgt(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return True If V1Combustivel ltgt V2Combustivel Then Return True If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return True If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return True If V1NumeroPortas ltgt V2NumeroPortas Then Return True Return False End Operator

Public Class Vector3 Public Property X As Decimal Public Property Y As Decimal Public Property Z As Decimal Sub New(X As Decimal Y As Decimal Z As Decimal) _X = X _Y = Y _Z = Z End Sub Public Overrides Function ToString() As String Return StringFormat((012) _X _Y _Z) End Function End Class

Public Shared Operator +(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X + V1X V2Y + V1Y V2Z + V1Z) End Operator Public Shared Operator -(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X - V1X V2Y - V1Y V2Z - V1Z) End Operator Public Shared Operator (V1 As Vector3 V2 As Vector3) Return (V2X V1X) + (V2Y V1Y) + (V2Z V1Z) End Operator Public Shared Operator (V1 As Vector3 E1 As Decimal) Return New Vector3(E1 V1X E1 V1Y E1 V1Z) End Operator Public Shared Operator amp(S1 As String V1 As Vector3) Return S1 amp V1ToString End Operator

Dim V1 As New Vector3(3 2 1) Dim V2 As New Vector3(1 2 3) DebugWriteLine(Adiccedilatildeo amp (V1 + V2)) DebugWriteLine(Subtraccedilatildeo amp (V1 - V2)) DebugWriteLine(Produto escalar amp (V1 V2)) DebugWriteLine(Multiplicaccedilatildeo com escalar amp (V2 3))

Dim Carro1 As New Veiculo(AUTOMOVEL Ford Ka 1249 GASOLINA 3) Dim Carro2 As New Veiculo(AUTOMOVEL Ford Ka 1250 GASOLEO 3) Dim Carro3 As New Veiculo(AUTOMOVEL Ford Ka 1251 GASOLEO 3) DebugWriteLine(Carro1 = Carro2 amp (Carro1 = Carro2)) DebugWriteLine(Carro2 = Carro3 amp (Carro2 = Carro3))

VISUAL (NOT) BASIC

35

O que produz

Adiccedilatildeo (444)

Subtraccedilatildeo (-202)

Produto escalar 10

Multiplicaccedilatildeo com escalar (369)

Foi necessaacuterio especificar o operador de concatenaccedilatildeo para

que o Visual Basic saiba como tratar a concatenaccedilatildeo de uma

String com o resultado de uma outra operaccedilatildeo com a mesma

classe

Neste caso estamos apenas a concatenar a String com a

representaccedilatildeo String da classe que definimos anteriormen-

te Ao analisar os operadores podemos verificar que existem

dois overloads para a multiplicaccedilatildeo

Um implica dois vectores e o outro um vector e um decimal

A nossa implementaccedilatildeo dita que se forem fornecidos dois

vectores o resultado seraacute o produto escalar dos dois vec-

tores

Se for fornecido apenas um vector e um valor escalar o re-

sultado seraacute outro vector que representa o produto desse

vector com um escalar

Existe com certeza aplicaccedilotildees matemaacuteticas (e natildeo soacute) mais

interessantes mas as apresentadas demonstram a facilidade

com que implementamos os nossos proacuteprios comportamen-

tos de operadores

Conclusatildeo

Operator overloading permite uma notaccedilatildeo mais proacutexima do

domiacutenio alvo o que promove a legibilidade e dissipa duacutevidas

de interpretaccedilatildeo Esta eacute a sua maior vantagem

No entanto se as implementaccedilotildees natildeo forem de encontro ao

sentido natural dos operadores o efeito poderaacute ser o perfeito

contraacuterio

Eacute um caso tiacutepico de melhor amigo ou pior inimigo Natildeo haacute

meio-termo

OPERADOR LIKE

AUTOR

Escrito por Seacutergio Ribeiro

Curioso e autodidata com uma enorme paixatildeo por tecnologias de informaccedilatildeo e uma saudaacutevel relaccedilatildeo com a NET Fra-

mework Moderador global na comunidade PortugalProgramar desde Setembro de 2009 Alguns frutos do seu trabalho

podem ser encontrados em httpwwwsergioribeirocom

Operator overlo-

ading permite uma no-

taccedilatildeo mais proacutexima do

domiacutenio alvo

Media Partners da Revista PROGRAMAR

EVENTOS

37

No passado dia 25 de Maio de 2013 realizou-se na Microsoft

Portugal no Parque das Naccedilotildees o 1ordm evento presencial da

comunidade Portugal a Programar Ainda antes das 9h come-

ccedilaram a chegar os participantes crescia o entusiasmo envolto

em todo o evento e pouco a pouco todos noacutes fomos dando

cara aos nicks a que nos habituaacutemos ao longo dos anos

Pontualmente a organizaccedilatildeo deu iniacutecio ao evento PROGRA-

MAR 2013 com Jorge Paulino David Pintassilgo e Rui Gon-

ccedilalves a abrir o evento Brevemente foi-nos dada a conhecer

a comunidade PP assim como os quatro pontos-chave que

a caracterizam

Foacuterum PP

Wiki

Portal de Downloads

Revista Programar

Parafraseando o anfitriatildeo Jorge Paulino ldquoeste foi um projeto

que se iniciou a 28 de Maio de 2005 para dar resposta agrave ne-

cessidade de partilhar informaccedilatildeo e experiecircncias nesta aacutereardquo

Apoacutes a apresentaccedilatildeo do evento e da comunidade seguiu-se

um discurso inspirador de um dos oradores Rui Delgado

acerca da necessidade de se empreender em Portugal

Com o limite de inscriccedilotildees a ser atingido em apenas trecircs dias

o 1ordm evento do PP contou com a presenccedila de 19 oradores

voluntaacuterios que deram origem a 18 apresentaccedilotildees teacutecnicas e

a 2 workshops praacuteticos Cerca de 250 participantes estiveram

presentes no edifiacutecio da Microsoft Lisbon Experience

EVENTO PROGRAMAR 2013

EVENTOS

38

Pelas diversas salas do evento partilharam-se experiecircncias e

conhecimento As apresentaccedilotildees decorreram 3 em simultacirc-

neo e foram as seguintes

Apresentaccedilatildeo das novidades de Java EE 7 (Ernest

Duarte)

As novidades do C 50 (Paulo Morgado)

ASPNET SignalR ndash Comunicaccedilatildeo em real-time sim-

ples e para todo mundo (Glauco Godoi)

Conquistar o mundo com aplicaccedilotildees feitas agrave velocida-

de da luz (Ricardo Marques)

CRM Como escolher De raiz ou sistema jaacute desen-

volvido (Pedro Azevedo)

Desenvolvimento de Aplicaccedilotildees em Windows Phone 8

(Nuno Silva)

Desenvolvimento em SharePoint por onde comeccedilar

(Rodrigo Pinto)

Desenvolvimento raacutepido de siacutetios web com personali-

zaccedilatildeo de Joomla ( Rui Guimaratildees )

DMVs ndash Conhece o teu SQL Server (Vitor Pombeiro)

Empreendedorismo em TI (Fernando Martins)

HTML5 e CSS3 ndash raacutepido e eficaz para o presente

(Seacutergio Laranjeira)

Introduccedilatildeo ao Cloud Computing e ao Windows Azure

(Vitor Tomaz)

Microsoft Kinect SDK (Rui Simatildeo)

Plataforma de desenvolvimento para Windows Store

Apps (Nuno Silva)

Powershell agrave minha maneira (Bruno Lopes)

O desenvolvimento de aplicaccedilotildees moacuteveis antes da 1ordf

linha de coacutedigo (Alberto Silva)

SEO ndash A importacircncia do Search Engine Optimization

(Miguel Lobato)

SQL Server ndash Performance e Tunning (Pedro Martins)

E ainda os workshops praacuteticos

Workshop ndash Integraccedilatildeo de CRM Dynamics com Java

e NET (Pedro Azevedo)

Workshop ndash Web em Realtime (Seacutergio Costa)

EVENTOS

39

Durante o decorrer das sessotildees houve ainda oferta de brindes

(gentilmente oferecidos pelos patrocinadores) aos participan-

tes

Outro ponto que marcou este PROGRAMAR 2013 foi o con-

curso de aplicaccedilotildees Windows Phone e Windows 8 vencido

por Jorge Costa com o jogo ldquoLittle Bitsrdquo sendo o segundo

lugar atribuiacutedo a Mauro Castro pela aplicaccedilatildeo ldquoPortugalrsquos Eve-

ningsrdquo

Houve ainda demostraccedilotildees do Microsoft Kinect (Rui Simatildeo) e

do Leap Motion (Diniz Vieira) a todos os participantes interes-

sados e todo o dia foi passado num espiacuterito descontraiacutedo e

animado aumentando assim os laccedilos entre toda a comunida-

de

A toda a organizaccedilatildeo e a todos os oradores envolvidos dei-

xamos um agradecimento especial agradecendo tambeacutem a

todos os patrocinadores nomeadamente a Microsoft Portugal

ESET Portugal FCA Editora Rumos e Truewind-Chiron Nun-

ca deixando de referir tambeacutem os Media Parters que ajuda-

ram a toda a divulgaccedilatildeo deste evento

A todos os elementos da comunidade que fazem com que a

Portugal-a-Programar seja cada vez mais conhecida no nosso

paiacutes e aleacutem-fronteiras a todos deixamos um ldquoMuito Obriga-

dordquo relembrando mais uma vez que este eacute um projeto de to-

dos e para todos e que a mais pequena accedilatildeo pode fazer a

diferenccedila

Eacute com satisfaccedilatildeo e orgulho que podemos afirmar que o 1ordm

Evento Presencial do PP foi um sucesso pois mesmo apoacutes

as sessotildees terem terminado houve ainda quem se mantives-

se no local partilhando experiecircncias de um dia cheio de emo-

ccedilotildees

E citando um dos oradores do evento Rui Delgado ldquoOh Yes

Muito Bomrdquohellip Venha o PROGRAMAR 2014

Paacutegina do evento httpeventoportugal-a-programarpt

(hellip) a mais peque-

na accedilatildeo pode fazer a

diferenccedila

Anaacutelises Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

C 50 com Visual Studio 2012

Review

41

Tiacutetulo Android ndash Introduccedilatildeo ao Desenvol-

vimento de Aplicaccedilotildees

Autor Ricardo Queiroacutes

Editora FCA

Paacuteginas 224

ISBN 978-972-722-763-1

O Android tornou-se na plataforma de dispositivos moacuteveis

mais usada no mundo e como tal existe um interesse cres-

cente dos programadores em criarem soluccedilotildees para esse

mercado Para quem queira dar aquele 1ordm passo no desen-

volvimento de aplicaccedilatildeo em Android o livro ldquoAndroid - Intro-

duccedilatildeo ao desenvolvimento de aplicaccedilotildeesrdquo de Ricardo Quei-

roacutes eacute uma boa escolha

Conteacutem passo a passo desde a configuraccedilatildeo do ambiente

de desenvolvimento ateacute agrave concepccedilatildeo de uma aplicaccedilatildeo para

Android na sua iacutentegra Destaca exemplos muito uacuteteis que

podem ser reaproveitados noutra aplicaccedilatildeo pois contempla

o desenho de uma interface graacutefica a gestatildeo de dados da

aplicaccedilatildeo atraveacutes de gestatildeo de ficheiros ou bases de dados

utilizaccedilatildeo de APIs de localizaccedilatildeo mapas e sensores e a

criaccedilatildeo do jogo do galo

Durante a sua leitura pode-se constatar que eacute um livro rico

em imagens explicativas e exemplificativas que nos ajudam

a perceber o que devemos fazer e o que devemos alcanccedilar

com a construccedilatildeo de todo o coacutedigo escrito

Infelizmente jaacute eacute habitual que nos sejam apresentados os

tiacutepicos tons acinzentados das ilustraccedilotildees e a ausecircncia de

qualquer tipo de realce de sintaxe no coacutedigo-exemplo o que

por vezes pode-se tornar cansativo ao olhar

Um factor alheio ao autor do livro mas que a editora em

causa deveria ter em consideraccedilatildeo por forma a facilitar a

leitura

ldquoAndroid ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildeesrdquo

de Ricardo Queiroacutes eacute um bom livro para quem jaacute tenha algu-

ma experiecircncia em programaccedilatildeo Java e que queira explorar

as potencialidades do Android

Android ndash Introduccedilatildeo ao Desenvolvimento de Aplicaccedilotildees

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

(hellip) destaca exem-

plos muito uacuteteis que

podem ser reaproveita-

dos noutra aplicaccedilatildeo

(hellip)

Review

42

Tiacutetulo C 50 com Visual Studio 2012

Autor Henrique Loureiro

Editora FCA

Paacuteginas 608

ISBN 978-972-722-752-5

Elementos de programaccedilatildeo

Abordam-se os temas de programaccedilatildeo mais elementar com

referecircncias agrave programaccedilatildeo iterativa passando pela orientada

a objecto O texto estaacute nitidamente orientado para um puacutebli-

co que tem noccedilotildees baacutesicas de programaccedilatildeo explicando a

loacutegica de uma funccedilatildeo ateacute agrave heranccedila de classes Tenta de

uma forma sucinta demonstrar na praacutetica ou seja com code-

snipets como construir de uma forma coerente uma aplica-

ccedilatildeo em C recorrendo ao Visual Studio

Usabilidade - Eacute tambeacutem abordada a importacircncia da usabili-

dade do user-interface numa qualquer aplicaccedilatildeo Satildeo de-

monstrados os conceitos baacutesicos de Interaccedilatildeo Homem-

Maacutequina e como aplica-los aos Windows Forms Este tema

serve de ponte para um tema bem mais extensivo Windows

Forms e programaccedilatildeo orientada agrave GUI detalhando alguns

dos componentes que a NET traz buit-in Explica a funciona-

lidade e a interecccedilatildeo com os componentes mais genericas e

mais usuais para uma aplicaccedilatildeo que se use de um sistema

de janelas como GUI A explicaccedilatildeo embora limitada a pou-

cos elementos eacute bastante completa dando ecircnfase aos

events associados a este tipo de modulos explicando assim

a programaccedilatildeo assiacutencrona em Windows Forms

Modelaccedilatildeo de dados e LINQ - Temos uma explicaccedilatildeo

bottom-to-top da noccedilatildeo de modelaccedilatildeo de dados Sendo nes-

te tema um pouco mais extenso explicando toda a noccedilatildeo da

Modelaccedilatildeo e das Formas Normais Recorre-se ao SQL Ser-

ver para fazer toda a explicaccedilatildeo na praacutetica dos conceitos

sendo bastante ilustrativo com diagramas e screenshots de

um processo de criaccedilatildeo e normalizaccedilatildeo de uma base de

dados Tendo a base de dados criada no SQL Sever passa

agrave explicaccedilatildeo do que eacute o LINQ e sua sintaxe em C Aqui eacute

feita mais uma vez a ponte com Windows Froms utilizando

componentes anteriormente demonstrados mapeando tabe-

las e manipulaccedilotildees baacutesicas Outra vez grande ecircnfase aos

events

C 50 com Visual Studio 2012

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

Sistema Operativo e Input Output Comeccedilando pela base

expotildee passo-a-passo como manipular as Tarefas e Proces-

sos do Windows explicando tambeacutem como colmatar as dife-

renccedilas entre versotildees do sistema operativo Daacute exemplos de

como manipular ficheiros de texto dando uma introduccedilatildeo agrave

encriptaccedilatildeo que vem built-in na NET Mostra como se usa o

Graphics da NET explicando os seus conceitos base dese-

nho e animaccedilatildeo chegando a agrave impressatildeo destes mesmos

graacuteficos desenhados Com este tema aprofunda a explicaccedilatildeo

dos Windows Forms fazendo a ponte para WPF

WPF XML e XAML - Tendo explicado Windows Forms pas-

sa agrave explicaccedilatildeo das diferenccedilas e semelhanccedilas do mesmo

com WPF dando tambeacutem a sua opiniatildeo sobre o futuro das

mesmas dando a entender que WPF iraacute substituir Windows

Forms eventualmente Para o efeito comeccedila por explicar o

que eacute XML dando exemplos de aplicaccedilotildees em C NET para

manipulaccedilatildeo deste tipo de dados passando para um niacutevel

acima o XAML Exemplo atraacutes de exemplo demonstra como

usar as potencialidade do WPF mostrando como usar

Graphics com a sintaxe XAML incluindo animaccedilatildeo

WebViews views modelares e navegaccedilatildeo entre diferentes

ecratildes numa soacute janela

Integraccedilatildeo com Microsoft Office e Windows Store - Eacute

tambeacutem mostrada a facilidade com que se integra uma apli-

caccedilatildeo feita em C comas a principais ferramentas do MS

Office Word Excel PowerPoint Access e Outlook Demons-

tra agrave semelhanccedila de outras ferramentas Microsoft que haacute

sempre uma Class buit-in na NET para criar e manipular

este tipo de documentos da famiacutelia Microsoft No caso da

Windows Store daacute exemplos vocacionados para Windows 8

e como tirar partido do conceito visual Metro e seus layouts

geneacutericos fazendo aplicaccedilotildees como uma calculadora e uma

WebView

Opiniatildeo pessoal - Na minha opiniatildeo este livro eacute ideal no

mundo acadeacutemico servindo perfeitamente como suporte a

um professor para leccionar uma cadeira de programaccedilatildeo

OOP ou ateacute para programaccedilatildeo 2D Tambeacutem natildeo acharia

descabido servir como suporte a um aluno para evoluir da

programaccedilatildeo iterativa para OOP visto que o livro estaacute repleto

de exemplos e exerciacutecios tendo ateacute no final 3 projectos from

scratch de aplicaccedilotildees completas explicando todo o processo

loacutegico na elaboraccedilatildeo de todos os aspectos da mesma de

base de dados normalizada interacccedilatildeo Homem-Maacutequina a

comercializaccedilatildeo na Windows Store

COMUNIDADES Comunidade NetPonto mdash Telerik RadControls - Raacutepida implementaccedilatildeo da

paacutegina Sobre para Windows Phone Apps

COMUNIDADE NETPONTO

44

httpnetpontoorg

Introduccedilatildeo

A Telerik RadControls disponibiliza um projeto template que

permite escolher um conjunto de funcionalidade que seratildeo

incluida no projeto aquando da sua criaccedilatildeo A paacutegina

Sobre eacute uma delas

Truque A Telerik oferece uma versatildeo de teste que permite

explorar os controlos O programa Nokia Premium Developer

permite aos seus membros terem uma licenccedila vaacutelida destes

Ecratildes

Para compreender melhor o que iremos fazer primeiro

iremos criar a paacutegina Sobre que eacute fornecida pelo projeto

template da Telerik cujo resultado eacute

Paacutegina Sobre gerada por omissatildeo pelo projeto template da Telerik

Depois iremos customizar a paacutegina para que esta tenha a

sua proacutepria informaccedilatildeo o resultado seraacute

Customizaccedilatildeo da paacutegina Sobre

Criaccedilatildeo do projeto

Para comeccedilar o projeto eacute recomendado que se instale os

Telerik RadControls (versatildeo de teste)

1 Seleccedilatildeo do projeto que se iraacute criar

Criando o projeto

2 A Telerik tem uma interface para a seleccedilatildeo inicial

Selecione a plataforma e referecircncias da Telerik que

queremos

Selecionando a plataforma e as referecircncias

3 Seleccedilatildeo da funcionalidade paacutegina Sobre

Quando o projeto eacute criado iremos obter a paacutegina por omissatildeo

podemos ver nos ecratildes

TELERIK RADCONTROLS - RAacutePIDA IMPLEMENTACcedilAtildeO DA PAacuteGINA SOBRE PARA WINDOWS PHONE APPS

COMUNIDADE NETPONTO

45

httpnetpontoorg

O resultado da estrutura do projeto seraacute

Customizaccedilatildeo

Comecemos por analisar a paacutegina Home Page

Cujo XAML eacute

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleMainPage xmlns=http schemasmicrosoftcomwinfx2006xaml presentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg

markup-compatibility2006 xmlnsphone= clr-namespaceMicrosoftPhone Controlsassembly=MicrosoftPhone xmlnsshell= clr-namespaceMicrosoft PhoneShellassembly=MicrosoftPhone FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation=Portrait SupportedOrientations=Portrait shellSystemTrayIsVisible=True mcIgnorable=dgt lt-- LayoutRoot is the root grid where all page content is placed --gt ltGrid xName=LayoutRoot Background=Transparentgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt lt-- LOCALIZATION NOTE To localize the displayed strings copy their val-ues to appropriately named keys in the apps neutral language resource file (AppResourcesresx) then replace the hard-coded text value between the attributes quotation marks with the binding clause whose path points to that string name For example Text=Binding Path=LocalizedResourcesApplicationTitle Source=StaticResource LocalizedStrings This binding points to the templates string resource named ApplicationTitle Adding supported languages in the Project Properties tab will create a new resx file per language that can

COMUNIDADE NETPONTO

46

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

carry the translated values of your UI strings The binding in these examples will cause the value of the attributes to be drawn from the resx file that matches the CurrentUICulture of the app at run time --gt lt-- TitlePanel contains the name of the application and page title --gt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=MY APPLICATION gt ltTextBlock xName=PageTitle Margin=9-700 Style=StaticResource PhoneTextTitle1Style Text=page name gt ltStackPanelgt lt-- ContentPanel - place additional content here --gt ltGrid xName=ContentPanel GridRow=1 Margin=120120gt ltListBox Margin=140-120 FontFamily=StaticResource PhoneFontFamilySemiLight FontSize=StaticResource PhoneFontSizeExtraLargegt ltListBoxItem Content=About Tap=GoToAbout gt ltListBoxgt ltGridgt lt-- Uncomment to see an alignment grid to help ensure your controls are aligned on common bound-aries The image has a top margin of -32px to account for the System Tray Set this to 0 (or remove the margin altogether) if the System Tray is hidden Before shipping remove this XAML and the image itself--gt lt-- ltImage Source=AssetsAlignmentGridpng VerticalAlignment=Top Height=800 Width=480 Margin=0 GridRow=0 GridRowSpan=2 IsHit-TestVisible=False gt --gt ltGridgt lt-- Sample code showing usage of ApplicationBar -

-gt ltphonePhoneApplicationPageApplicationBargt ltshellApplicationBar IsMenuEnabled=True IsVisible=Truegt ltshellApplicationBarIconButton IconUri=Imagesappbar_button1png Text=Button 1 gt ltshellApplicationBarIconButton IconUri=Imagesappbar_button2png Text=Button 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBarMenuItem Text=MenuItem 1 gt ltshellApplicationBarMenuItem Text=MenuItem 2 gt ltshellApplicationBarMenuItemsgt ltshellApplicationBargt ltphonePhoneApplicationPageApplicationBargt ltphonePhoneApplicationPagegt Para navegar para a paacutegina Sobre eacute necessaacuterio clicar na palavra About (tap gesture) o coacutedigo referente eacute ltListBoxItem Content=About Tap=GoToAbout gt E em code behind iremos ter ltsummarygt Navigates to about page ltsummarygt private void GoToAbout(object sender GestureEventArgs e) thisNavigationServiceNavigate(new Uri(Aboutxaml UriKindRelativeOrAbsolute)) Por fim a paacutegina AboutPage seraacute O coacutedigo XAML seraacute ltphonePhoneApplicationPage xClass=NokiaDevRadControlsSampleAbout xmlns=httpschemasmicrosoftcomwinfx2006xamlpresentation xmlnsx=http schemasmicrosoftcomwinfx2006xaml xmlnsd=http schemasmicrosoftcomexpressionblend2008 xmlnsmc=http schemasopenxmlformatsorg markup-compatibility2006 xmlnsphone=clr-namespace MicrosoftPhoneControlsassembly=MicrosoftPhone xmlnsshell=clr-namespace

COMUNIDADE NETPONTO

47

httpnetpontoorg

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

E o code behind

MicrosoftPhoneShellassembly=MicrosoftPhone xmlnsviewModels=clr-namespace NokiaDevRadControlsSampleViewModels Name=Root FontFamily= StaticResource PhoneFontFamilyNormal FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneForegroundBrush Orientation= Portrait SupportedOrientations=Portrait dDesignHeight=768 dDesignWidth=480 shellSystemTrayIsVisible=True mcIgnorable=dgt ltGrid xName=LayoutRoot Background=Transparentgt ltGridDataContextgt ltviewModelsCommandSampleViewModel gt ltGridDataContextgt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height= gt ltGridRowDefinitionsgt ltStackPanel xName=TitlePanel GridRow=0 Margin=1217028gt ltTextBlock xName=ApplicationTitle Style=StaticResource PhoneTextNormalStyle Text=APP TITLE gt ltTextBlock xName=PageTitle Margin=9-700 Style= StaticResource PhoneTextTitle1Style Text=about gt ltStackPanelgt ltGrid xName=ContentPanel GridRowSpan=2 Margin=12160121gt ltGridRowDefinitionsgt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition Height=Auto gt ltRowDefinition gt ltGridRowDefinitionsgt ltStackPanelgt ltTextBlock Margin=120120 FontFamily= StaticResource PhoneFontFamilySemiBold FontSize= StaticResource PhoneFontSizeLarge Text=Binding ApplicationName ElementName=Root gt ltStackPanel Orientation=Horizontalgt ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Version number gt

ltTextBlock Margin=120120 FontSize= StaticResource PhoneFontSizeNormal Text=Binding Version ElementName =Root gt ltStackPanelgt ltStackPanelgt ltTextBlock GridRow=1 Margin=12241224 FontSize=StaticResource PhoneFontSizeNormal Foreground=StaticResource PhoneSubtleBrush TextWrapping=Wrapgt This application show an About page sample for Windows Phone applications ltLineBreak gt See more about it please see the following referenceampquot ltTextBlockgt ltHyperlinkButton GridRow=2 Margin=01200 HorizontalAlignment=Left Command=Binding SendAnEmailCommand Content=technical supportfeedback email FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltHyperlinkButton GridRow=3 Margin=01200 HorizontalAlignment=Left Command=Binding RateThisAppCommand Content=rate this app FontSize= StaticResource PhoneFontSizeNormal Foreground= StaticResource PhoneAccentBrush gt ltStackPanel GridRow=4 Margin=1201250 VerticalAlignment= Bottomgt ltImage HorizontalAlignment=Left Source=Images CompanyLogopng Stretch=None gt ltTextBlock Margin=01200 FontSize= StaticResource PhoneFontSizeNormal Text=Copyright (c) 2013 Nokia Developer Wiki gt ltTextBlock FontSize= StaticResource PhoneFontSizeNormal Text=Nokia gt ltStackPanelgt ltGridgt ltGridgt ltphonePhoneApplicationPagegt

public partial class About INotifyPropertyChanged

COMUNIDADE NETPONTO

48

httpnetpontoorg

Nota O exemplo natildeo implementa o padratildeo MVVM mas

poderia

Usa a classe ApplicationManifest do (Cimbalino toolkit - cujo

coacutedigo fornte eacute este)

Usa a classe SendAnEmailCommand que eacute a implementaccedilatildeo

do ICommand e tem como finalidade enviar emails Sendo

utilizado na opccedilatildeo de suporte feedback

Usa a classe RateThisAppCommand que eacute a implementaccedilatildeo

do ICommand e serve para avaliar a aplicaccedilatildeo

Truque Se pretende um exemplo mais avanccedilado consulte o

artigo Paacutegina avanccedilada Sobre para aplicaccedilotildees de Windows

Phone

Referecircncias

Online Help ou download CHM (ZIP 14MB) ()

Telerik Examples - Windows Phone Application ()

Telerik RadControls for Windows Phone ()

Join Nokia Premium Developer Program and get RadControls

for free ()

() Artigos disponiacuteveis apenas em Inglecircs

Em conclusatildeo podemos concluir que existe vaacuterias formas de

implementar numa aplicaccedilatildeo da Windows Phone uma

paacutegina ldquoSobrerdquo ou ldquoAcercardquo sendo um processo que se pode

minimizar e enriquece a aplicaccedilatildeo

Este artigo foi originalmente escrito para a comunidade

Nokia Developer mais especificamente para a Wiki Paacutegina

Acerca de para aplicaccedilotildees de Windows Phone

PAacuteGINA AVANCcedilADA ldquoSOBRErdquo PARA APLICACcedilOtildeES DE WINDOWS PHONE

ltsummarygt The application manifest ltsummarygt private readonly ApplicationManifest _applicationManifest ltsummarygt Initializes a new instance of the ltsee cref=Aboutgt class ltsummarygt public About() InitializeComponent() class that helps to get the application name and version (that is defined in manifest) var applicationManifestService = new ApplicationManifestService() _applicationManifest = applicationManifestService GetApplicationManifest() ltsummarygt The property changed ltsummarygt public event PropertyChangedEventHandler PropertyChanged ltsummarygt Gets the application name ltsummarygt public string ApplicationName get if (_applicationManifest = null) return _applicationManifestAppTitle return ND ltsummarygt Gets the version ltsummarygt public string Version get if (_applicationManifest = null) return _applicationManifestAppVersion return ND ltsummarygt

The on property changed ltsummarygt ltparam name=propertyNamegt The property name ltparamgt protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null) var handler = PropertyChanged if (handler = null) handler(this new PropertyChangedEventArgs(propertyName))

AUTOR

Escrito Por Sara Silva

eacute licenciada em Matemaacutetica ndash Especialidade em Computaccedilatildeo pela Universidade de Coimbra e eacute Microsoft Certified Pro-

fissional Developer Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps O

seu Blog eacute wwwsaramgsilvacom e o twitter eacute saramgsilva

No Code Game Salad

No Code

50

ldquoNuma altura em que as aplicaccedilotildees estatildeo a dominar em

forccedila torna-se imperativo saber programarhelliprdquo E o leitor

tambeacutem tem esta opiniatildeo

Ora neste artigo esta eacute uma ideia que vamos deixar por

terra Se o leitor eacute algueacutem que gosta e se interessa pelo

mundo dos pequenos jogos e por novas tecnologias mas que

natildeo se sente agrave vontade no mundo da programaccedilatildeo pode (e

deve) experimentar o GameSalad Mas por outro lado

mesmo sendo um programador experiente o uso desta

ferramenta pode tambeacutem ajudar bastante

A GameSalad Inc eacute uma empresa norte-americana que

desenvolve ferramentas web para a criaccedilatildeo de pequenos

jogos Fundada em 2007 com o nome de Gendai Games em

2009 lanccedilou o GameSalad Creator e em 2010 mudou

oficialmente o seu nome passando chamar-se GameSalad

O importante para os criadores desta tecnologia eacute a

conceccedilatildeo de uma ideia O Game Salad Creator eacute

principalmente direcionado aos utilizadores que natildeo tecircm

bases em programaccedilatildeo permitindo que qualquer pessoa

possa fazer o seu proacuteprio jogo 2D para plataformas moacuteveis

IOS Android ou jogos HTLM5 para browsers Com uma

interface limpa e relativamente simples este software utiliza

o sistema ldquodrag-and-droprdquo para desenvolver os seus jogos

ou seja desde que tenhamos uma ideia em mente podemos

facilmente pocirc-la em praacutetica arrastando os componentes da

mesma para o ldquopalco de jogordquo

Assim facilmente o leitor pode definir as imagens de fundo

das vaacuterias cenas que compotildeem o jogo e todos os

intervenientes dessas cenas satildeo chamados ldquoAtoresrdquo em que

o comportamento destes ldquoAtoresrdquo eacute definido por regras de

jogo (eventos) que o proacuteprio utilizador define Eacute tudo uma

questatildeo de loacutegica e eacute o utilizador que define essa loacutegica Por

exemplo podemos definir eventos especiacuteficos como colisotildees

e definir o que o ldquoatorrdquo deve fazer quando ocorre uma

colisatildeo isto eacute se deve mudar de rumo e perder pontos ou se

deve ser destruiacutedo perdendo uma vida por exemplo Tudo

se baseia na nossa escolha

Podemos tambeacutem adicionar a banda sonora a nosso gosto e

para verificar o comportamento real da nossa aplicaccedilatildeo

basta-nos apenas recorrer ao simulador que o GameSalad

Creator nos disponibiliza Natildeo precisamos de ter o

equipamento real para o qual estamos a projetar o nosso

jogo

O site principal deste projeto wwwgamesaladcom em pouco

tempo atingiu milhares de utilizadores um pouco por todo o

mundo Inicialmente projetado para desenvolver aplicaccedilotildees

apenas para dispositivos Apple hoje em dia eacute tambeacutem

possiacutevel fazer o download da versatildeo Windows A versatildeo

base eacute gratuita e permite a qualquer interessado publicar os

seus jogos para a versatildeo web e para a versatildeo MAC Caso

prefira a versatildeo paga o GameSalad Creator Pro permite tudo

isto e tambeacutem publicar os seus projetos para a plataforma

Android e para o Windows 8 aleacutem de outros extras Caso

opte por ter uma conta premium pode ainda publicar no

mercado de aplicaccedilotildees escolhendo se quer disponibilizar

gratuitamente o seu jogo ou natildeo Caso opte disponibilizar

uma versatildeo paga do jogo que desenvolveu o utilizador tem

direito a 70 do ganho obtido pelo seu jogo

Este projeto tem tambeacutem atraveacutes do proacuteprio site uma grande

comunidade de utilizadores que partilham ideias e

experiecircncias ajudando-se mutuamente em vaacuterios projetos

Tem uma ideia para um jogo Entatildeo estaacute na altura de a por

em praacutetica Saber programar deixou de ser um requisito com

a ajuda do GameSalad Creator aproveite e decirc largas agrave

imaginaccedilatildeo

Game Salad

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

Elege o melhor artigo desta ediccedilatildeo

Revista PROGRAMAR httptinyccProgramarED41_V

No Code

52

Esta foi a aplicaccedilatildeo vencedora do concurso de aplicaccedilotildees

que se realizou no 1ordm Evento Presencial da Comunidade

Portugal-a-Programar Trata-se de um jogo para Windows

Phone 7x e 8 bastante interessante e ateacute ldquovicianterdquo para

quem gosta de jogos do tipo puzzle

Os pequenos Bits estatildeo em perigo e soacute vocecirc pode ajudaacute-los

Bits satildeo uma espeacutecie muito especial de aves encontradas

em uma ilha remota E eles precisam chegar ao seu ninho

a fim de criar seus filhos Mas os bits das Trevas estatildeo com

ciuacutemes e vatildeo tentar tudo ao seu alcance para impedir os Bits

de chegar ao ninho

Bits eacute um jogo de quebra-cabeccedilas fantaacutestico onde vocecirc tem

de combinar habilidade com sorte para ajudar os Bits a

sobreviver Combine trecircs Bits da mesma cor para ganhar

pontos enquanto os Bits prestos ldquoevilrdquo tentam detecirc-los Os

ldquoAnjos Bitsrdquo (brancos) podem salvar os Bits de cor destruindo

os Bits Pretos proacuteximos

PROJECTO EM DESTAQUE NA COMUNIDADE PP LITTLE BITS

PASSATEMPO

DESENVOLVIMENTO

WINDOWS 8

A comunidade Portugal a Programar com o apoio da Microsoft estaacute a criar um passatempo de desen-

volvimento de aplicaccedilotildees para Windows 8 exclusivamente para membros registados na comunidade

Desenvolve uma ou mais aplicaccedilotildees para o Windows 8 e ganha fantaacutesticos preacutemios

1 MOCHILA APP ME UP PARA TODOS os que publiquem uma App na Windows 8 Store

2 TELEFONES NOKIA LUMIA 820 (Dev Edition) para os primeiros 2 a publicarem 3 Apps na

Windows 8 Store

1 TABLET ASUS ME400C para a melhor App publicada e 1 NOKIA LUMIA 820 para a segun-

da melhor aplicaccedilatildeo

Satildeo vaacutelidas apenas aplicaccedilotildees publicadas entre 1 e 30 de Junho de 2013

Todos os estudantes tecircm acesso gratuito agrave Windows Store atraveacutes do programa DreamSpark e por is-

so natildeo haacute motivos para natildeo concorrer Mais informaccedilotildees e candidaturas atraveacutes do email passatem-

posportugal-a-programarpt

Alguns recursos interessantes para iniciar

Windows 8 Store Apps - Do sonho agrave realidade (revista PROGRAMAR)

Microsoft DreamSpark Windows 8 Apps development

Windows App (MSDN)

O staff da comunidade seraacute o juacuteri que iraacute escolher a melhor aplicaccedilatildeo a concurso e o vencedor seraacute divul-

gado na primeira quinzena de Julho Para atribuiccedilatildeo do Tablet Asus ME400C eacute necessaacuterio existirem no

miacutenimo 3 aplicaccedilotildees a concurso Qualquer caso omisso seraacute resolvido pelo staff da comunidade natildeo sen-

do passiacutevel de recurso e o juri iraacute rever e validar todas as aplicaccedilotildees de modo a que tenham um minimo de

qualidade e originalidade

Veja tambeacutem as ediccedilotildees anteriores da Revista PROGRAMAR

e muito mais em hellip wwwrevista-programarinfo

34

ordf Ed

iccedilatilde

o - A

bril 2

01

2

35

ordf Ed

iccedilatilde

o - J

un

ho

201

2

36

ordf Ed

iccedilatilde

o - A

go

sto

20

12

37

ordf Ed

iccedilatilde

o - O

utu

bro

20

12

38

ordf Ed

iccedilatilde

o - D

ezem

bro

20

12

39

ordf Ed

iccedilatilde

o - F

eve

reiro

20

13

Page 7: Revista Programar 41

TEMA DA CAPA

8

ltservlet-namegt agrave define o nome da servlet

ltservlet-classgt agrave aponta o caminho da servlet na apli-

caccedilatildeo

ltload-on-startupgt agrave quando o valor for 1 a servlet

seraacute inicializada no inicio da aplicaccedilatildeo

ltservlet-mappinggt agrave caso a servlet efectue operaccedilotildees

requeridas por elementos externos

ltservlet-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltservletgt

lturl-patterngt agrave define um url para a servlet

ltfiltergt agrave semelhante agrave tag ltservletgt com a diferenccedila

de que esta permite enquadrar uma classe de filtro na

aplicaccedilatildeo que permita a existecircncia de sessotildees na

aplicaccedilatildeo Web ou qualquer segmento de coacutedigo que

necessite de ser constantemente executado

ltfilter-namegt agrave define o nome da classe filtro

ltfilter-classgt agrave aponta o caminho da class na aplica-

ccedilatildeo

ltfilter-mappinggt agrave sempre necessaacuterio definir para

uma classe filtro

ltfilter-namegt agrave define o nome teraacute de ser o mesmo

que se encontra na tag ltfiltergt

lturl-patterngt agrave para possuir o efeito de filtro o url seraacute

todos os existentes ou seja

lterror-pagegt agrave tag existente para definir paacuteginas de

erro que sejam geradas pelo web server e que pos-

sam ocorrer na aplicaccedilatildeo

lterror-codegt agrave define o tipo de coacutedigo de erro gerado

pelo web server (404-page not found 500-internal

server errorhellip)

ltlocationgt agrave localiza a paacutegina de erro personalizada

dentro da aplicaccedilatildeo

Estrutura de uma aplicaccedilatildeo Web Java

O exemplo que vai ser aqui apresentado seraacute montado num

Web Archive (ficheiro war) que poderaacute depois ser colocado

num servidor Web sendo os mais conhecidos o Apache

Tomcat e o Oracle Glassfish Ambos disponiacuteveis gratuita-

mente e no pacote de Java EE do IDE NetBeans que os ins-

tala em modo desenvolvimento na maacutequina local

Nota As aplicaccedilotildees necessaacuterias para a criaccedilatildeo deste exem-

plo satildeo o Java Runtime Environment (JRE) o Java Deve-

lopment Kit (JDK) e o IDE NetBeans

A estrutura normal de uma aplicaccedilatildeo java desta natureza

tem por norma a seguinte estrutura

O ficheiro WAR criado se o abrirmos tem uma estrutura de

pastasficheiros orientada ao modelo de desenvolvimento

MVC (Model-view-controller) onde a View estaacute incluiacuteda dire-

tamente na raiz do projeto onde se pode encontrar as paacutegi-

nas JSP e HTML acompanhadas pelos devidos ficheiros

JavaScript e CSS necessaacuterios Caso haja ausecircncia de um

Deployment Descriptor (ficheiro de configuraccedilatildeo referente a

uma determinada aplicaccedilatildeo que neste caso seraacute o webxml)

o servidor Web procura sempre por um indexjsp como paacutegi-

na inicial

Dentro da pasta WEB-INF estatildeo todas as classes bibliote-

cas ficheiros de configuraccedilatildeo e servlets necessaacuterias para

processar a informaccedilatildeo mostrada pelas JSPs

Em suma ter-se-aacute entatildeo algo deste geacutenero

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

9

Nota Nesta estrutura optou-se por colocar as paacuteginas dinacirc-

micas debaixo do WEB-INF pois uma vez que podemos usar

as servlets para controlar o que se deve ou natildeo ser mostrado

perante os pedidos vindos do cliente Isto torna a aplicaccedilatildeo

mais segura na questatildeo de mapeamento de URLs

Desenvolvimento

Neste exemplo vai-se usar o IDE NetBeans pois eacute aquele

que a Oracle recomenda encontra-se disponiacutevel para Win-

dows Linux Solaris e Mac OS X sendo mais simples de

configurar O NetBeans encontra-se disponiacutevel para downlo-

ad no proacuteprio site e no site da Oracle como complemento do

Java Development Kit 7 (Ver bibliografia)

Primeiros passos

Para dar iniacutecio agrave construccedilatildeo da nossa aplicaccedilatildeo Java Web

no NetBeans basta ir a File ndash New Project e aparece-nos a

seguinte janela

E vamos selecionar Java Web ndash Web Application Em se-

guida definimos a localizaccedilatildeo e o nome da nossa aplicaccedilatildeo

Dando o nome de Teste a esta aplicaccedilatildeo no passo seguinte

o nome que foi atribuiacutedo eacute automaticamente dado como

Context Path ou seja a aplicaccedilatildeo iraacute ser identificada no De-

ployment descriptor como Teste e uma vez colocada no servi-

dor teraacute o seguinte URL httphostnameportTeste

Neste exemplo vamos usar para o servidor GlassFish da Ora-

cle a versatildeo 6 do Java EE e o IDE Netbeans

O servidor escolhido pode ser posteriormente alterado caso

queira-se testar a aplicaccedilatildeo noutros ambientes contudo eacute de-

sencorajado a alteraccedilatildeo da versatildeo sem primeiro verificar a

existecircncia de possiacuteveis incompatibilidades com coacutedigo e biblio-

tecas que estejam a ser usadas O uacuteltimo seraacute ignorado uma

vez que este exemplo que vamos criar natildeo vai possuir nenhum

framework

Uma vez concluiacutedo todos os passos verificamos que automati-

camente o IDE criou-nos uma estrutura com uma paacutegina in-

dexjsp na raiz uma pasta WEB-INF vazia e atalhos para a

pasta de sources bibliotecas e de ficheiros de configuraccedilatildeo

com o tradicional MANIFESTMF criado

A estrutura visiacutevel natildeo corresponde agrave estrutura real de diretori-

as para se visualizar isso basta ir ao separador Files situado eacute

esquerda como mostra a imagem seguinte

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

TEMA DA CAPA

10

Caso natildeo esteja criado o atalho pode-se sempre aceder indo

agrave opccedilatildeo Window ndash File abrindo o separador e recolocando o

atalho

Numa breve comparaccedilatildeo pode-se verificar que o NetBeans

cria determinados ficheiros e diretorias referentes ao projeto

(bluidxml e nbproject) e onde na estrutura do projeto a pasta

Web Pages tem referecircncia agrave pasta web e a Source Packa-

ges tem referecircncia agrave pasta src Todos os ficheiros de confi-

guraccedilatildeo ficam dentro da pasta WEB-INF e no caso da pasta

Libraries o seu conteuacutedo eacute um conjunto de atalhos cuja sua

localizaccedilatildeo pode ser referenciada a quaisquer pastas exter-

nas ao projeto No entanto recomenda-se criar uma pasta lib

debaixo de WEB-INF com as bibliotecas a ser usadas pela

aplicaccedilatildeo para evitar erros originados por utilizaccedilatildeo do mes-

mo ficheiro de biblioteca por mais do que um projeto e para

facilitar a passagem do projeto para outro ambiente ou ma-

quina pois assim basta soacute passar a pasta com o projeto sem

haver preocupaccedilotildees com importaccedilatildeo de bibliotecas

Criaccedilatildeo de uma JSP

Se abrirmos a paacutegina JSP criada pelo IDE ela vai ter um

aspecto semelhante a este

Uma vez que esta paacutegina tem o nome de index caso seja

feito o deploy da aplicaccedilatildeo a mesma vai apresentar uma

paacutegina de fundo branco com o tiacutetulo JSP Page e a frase Hel-

lo World

Para realizar o deploy da aplicaccedilatildeo basta carregar sobre o

botatildeo de play situado no painel de topo do IDE Netbeans ou

entatildeo ir a Run ndash Run Project

Caso o nome da paacutegina seja alterado e natildeo exista nenhuma

paacutegina com o nome index o servidor natildeo consegue encon-

trar nenhuma paacutegina inicial Entatildeo em seguida vamos alterar

o nome da nossa paacutegina inicial para homejsp e vamos con-

figurar o nosso webxml de maneira a criarmos um filtro de

sessatildeo que vai definir que o servidor no arranque da mesma

redirecionar-se para uma determinada servlet

Para tal se formos agrave opccedilatildeo de File ndash New Filehellip na secccedilatildeo

Web selecionar o tipo de ficheiro Standard Development

Descriptor (webxml)

Uma vez criado o ficheiro teraacute o seguinte conteuacutedo por defei-

to

Temos agora o ficheiro webxml onde poderemos colocar as

nossas referecircncias agraves servlets que vamos criar atribuindo-

lhes um url pattern a fim de poderem ser acedidas

Para natildeo termos trabalho o IDE por si soacute resolve todas as

tags que necessitamos de colocar no webxml na altura em

que criamos uma servlet caso natildeo seja resolvido pelo IDE

Para mapearmos a servlet WelcomeServlet no package

mainservlet com o url pattern Welcome o que deveria de ser

colocado seria algo deste geacutenero (ver as tags fornecidas)

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtJSP Pagelttitlegt ltheadgt ltbodygt lth1gtHello Worldlth1gt ltbodygt lthtmlgt

ltxml version=10 encoding=UTF-8gt ltweb-app xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=httpjavasuncomxml nsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsd version=30gt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

ltxml version=10 encoding=UTF-8gt ltweb-app version=30 xmlns=httpjavasuncomxmlnsjavaee xmlnsxsi=httpwwww3org2001 XMLSchema-instance xsischemaLocation=

TEMA DA CAPA

11

Mas natildeo eacute necessaacuterio escrever estas tags ateacute porque o Net-

Beans natildeo permite a criaccedilatildeo de servlets que jaacute possuam refe-

recircncias no webxml como tal o que podemos fazer eacute ir a opccedilatildeo

File ndash New Filehellip e dentro do Web selecionar Servlet

Em seguida o IDE vai recomendar a natildeo criar classes na raiz

dos packages e como tal vamos preencher o campo Package

com mainservlet e como nome WelcomeServlet

Dado o passo seguinte o IDE automaticamente cria a estru-

tura dos packages introduzidos e apresenta o formulaacuterio de

configuraccedilatildeo da servlet

Carregando sobre a check box e alterando o URL Pattern

para Welcome teremos automaticamente criado as tags

pretendidas no webxml

Uma vez criada a servlet vem com os meacutetodos herdados de

HttpServlet doGet() e doPost() implementados e com um

meacutetodo chamado processRequest() que envia coacutedigo

HTML O que vamos fazer eacute apagar este meacutetodo e colocar a

vazio o meacutetodo doPost() e introduzir a seguinte linha no

meacutetodo doGet()

Com esta linha criada e uma vez chamada a servlet que por

defeito responde por GET o pedido vai ser reencaminhado

para a nossa paacutegina criada homejsp

Fazendo deploy coloca-se o URL httplocalhost8080Teste

Welcome e verifica-se que a nossa servlet estaacute a fazer o

reencaminhamento para a nossa paacutegina inicial

Como proacuteximo passo vamos enviar variaacuteveis para uma ser-

vlet onde a mesma iraacute processar e enviar uma resposta En-

tatildeo o que se pretende eacute tomando os mesmos passos de cria-

ccedilatildeo da WelcomeServlet vamos criar a SomaServlet com o

seguinte coacutedigo

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

httpjavasuncomxmlnsjavaee httpjavasuncomxmlnsjavaee web-app_3_0xsdgt ltservletgt ltservlet-namegtWelcomeServletltservlet-namegt ltservlet-classgtmainservletWelcomeServlet ltservlet-classgt ltservletgt ltservlet-mappinggt ltservlet-namegtWelcomeServletltservlet-namegt lturl-patterngtWelcomelturl-patterngt ltservlet-mappinggt ltsession-configgt ltsession-timeoutgt 30 ltsession-timeoutgt ltsession-configgt ltweb-appgt

getServletContext()getRequestDispatcher( homejsp)forward(request response)

package mainservlet import javaioIOException import javaxservletServletException import javaxservlethttpHttpServlet import javaxservlethttpHttpServletRequest import javaxservlethttpHttpServletResponse public class SomaServlet extends HttpServlet public static final String TEXTO = texto public static final String VALOR_1 = valor1 public static final String VALOR_2 = valor2 public static final String RESULTADO = resultado

TEMA DA CAPA

12

E para interagirmos com a servlet vamos criar as paacuteginas so-

majsp e resultadojsp onde mais uma vez vamos ao menu

File ndash New Filehellip selecionamos JSP e preenchemos o nome

sem a extensatildeo no campo File Name

somajsp

Com o objectivo de evitar erros a servlet possui constantes

que permitem que haja uma coerecircncia entre as variaacuteveis envia-

das e recebidas com o objectivo de evitar errosPode-se ob-

servar que a servlet uma vez iniciada envia uma variaacutevel atra-

veacutes de requestsetAttribute() Uma vez chamado o setAttri-

bute() requer 2 paracircmetros

requestsetAttribute(NomeDoAtributo UmObjectoQQ)

O primeiro paracircmetro como descrito atribui um nome sen-

do esse o nome que deve ser usado nas paacuteginas JSP para

puderem capturar a variaacutevel enviada que se vai encontrar

descrita no segundo paracircmetro que por sua vez eacute sempre

convertida da servlet para object Como tal teve que ser

efectuado o cast do objecto agrave chegada para o tipo de variaacute-

vel que tinha antes de ser enviada

String atributo = (String) requestgetAttribute

(NomeDoAtributo)

(Recepccedilatildeo do atributo)

Caso o que se pretenda seja o contraacuterio enviar variaacuteveis no

sentido JSP agrave Servlet a paacutegina JSP deve de conter um for-

mulaacuterio HTML com o meacutetodo que se pretende POST ou

GET e na action o URL pattern da servlet em questatildeo E os

nomes dos inputs satildeo as referecircncias que a servlet usa para

receber as variaacuteveis das paacuteginas JSP variaacuteveis essas quem

vecircm como String e como tal devem de ser convertidas para o

tipo desejado (Como demonstrado no coacutedigo acima referi-

do) Vamos entatildeo testar acedendo ao URL http

localhost8080TesteSoma

Porem a aplicaccedilatildeo funciona mas apenas mostra paacuteginas

caso as mesmas sejam escritas no URL pois uma vez que

renomeamos o indexjsp para homejsp natildeo existe de mo-

mento nenhuma paacutegina inicial ou seja caso escrevesse-

mos httplocalhost8080Teste a aplicaccedilatildeo natildeo vai mostrar

nenhuma paacutegina

Para solucionarmos esse problema vamos entatildeo criar um

filtro que remeta para uma determinada servlet filtro esse

que vai aguardar que uma determinada variaacutevel se altere de

estado para desbloquear as restantes paacuteginas Com este

tipo de classes podemos definir niacuteveis de acesso dentro da

nossa aplicaccedilatildeo restringindo a mesma quando certas variaacute-

veis natildeo forem validadas ou natildeo se encontram com o valor

pretendido (por exemplo um determinado nome de utilizador

e palavra chave)

Vamos entatildeo novamente a File ndash New Filehellip e seleciona-

mos Filter

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

Override protected void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException IOException requestsetAttribute(TEXTO Insira 2 numeros e submeta para obter o resultado) getServletContext()getRequestDispatcher (somajsp)forward(request response) Override protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException int resultado try int val1 = IntegerparseInt (requestgetParameter(VALOR_1)) int val2 = IntegerparseInt (requestgetParameter(VALOR_2)) resultado = val1 + val2 requestsetAttribute(RESULTADO +resultado) catch (NumberFormatException e) requestsetAttribute(RESULTADO Valores natildeo validos) getServletContext()getRequestDispatcher (resultadojsp)forward(request response)

ltpage import=mainservletSomaServletgt ltpage contentType=texthtml pageEncoding=UTF- 8gt ltDOCTYPE htmlgt lt String texto = (String) requestgetAttribute (SomaServletTEXTO)gt lthtmlgt ltheadgt ltmeta http-equiv=Content-Type content=texthtml charset=UTF-8gt lttitlegtSomalttitlegt ltheadgt ltbodygt lth2gtlt=textogtlth2gt ltform action=Soma method=POSTgt Valor 1ltinput type=text name= lt=SomaServletVALOR_1gtgt Valor 2ltinput type=text name= lt=SomaServletVALOR_2gtgt ltbrgt ltinput type=submit name=submitgt ltformgt ltbodygt lthtmlgt

TEMA DA CAPA

13

caccedilatildeo e restriccedilatildeo de acessos os filtros permitem a execuccedilatildeo

de certas linhas de coacutedigo que mantecircm estados numa aplica-

ccedilatildeo e eacute o siacutetio ideal para colocar a parte do coacutedigo da aplica-

ccedilatildeo que manipula variaacuteveis de sessatildeo

Apoacutes criar-se a classe do tipo Filter ignorando o coacutedigo ge-

rado o filtro deveraacute possuir o seguinte coacutedigo

Uma vez criado o filtro este vai redirecionar todos os pedidos

agrave aplicaccedilatildeo para a WelcomeServlet enquanto a variaacutevel

validSession estiver a NULL como tal na servlet Welcome-

Servlet coloca-se a seguinte linha

requestgetSession()setAttribute(UrlFilterSESSION

gotSession)

Assim que o filtro passar pela WelcomeServlet a variaacutevel

validSession vai deixar de estar a NULL colocando o filtro a

fazer um encadeamento com os restantes pedidos que apa-

recerem

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

No seguinte passo vamos atribuir o nome de UrlFilter e coloca

-lo num novo package mainfilter

Semelhante ao passo de criaccedilatildeo do mapeamento das servlets

no webxml o IDE igualmente cria automaticamente um mape-

amento do filtro no ficheiro XML contudo o coacutedigo gerado eacute

ligeiramente diferente (Ver referecircncia de tags do webxml)

Apoacutes dar seguinte neste passo e natildeo preencher nada no proacutexi-

mo o IDE gera uma classe filtro por defeito e gera o seu mape-

amento no webxml semelhante a

Muito semelhante ao que se vai encontrar num mapeamento

de uma servlet apenas com a diferenccedila do nome das tags de

servlet para filter e o seu mapeamento seraacute muacuteltiplo para todos

os URLs que se deseja correr um determinado filtro antes de

haver o redireccionamento Uacuteteis para criar poliacuteticas de autenti-

ltfiltergt ltfilter-namegtUrlFilterltfilter-namegt ltfilter-classgtmainfilterUrlFilter ltfilter-classgt ltfiltergt ltfilter-mappinggt ltfilter-namegtUrlFilterltfilter-namegt lturl-patterngtlturl-patterngt ltfilter-mappinggt

package mainfilter import javaioIOException import javaxservlet import javaxservlethttp public class UrlFilter implements Filter FilterConfig filterConfig public static final String SESSION = session Override public void doFilter(ServletRequest req ServletResponse resp FilterChain chain) throws IOException ServletException if (req instanceof HttpServletRequest) String path = ((HttpServletRequest) req)getServletPath() HttpSession session = ((HttpServletRequest) req)getSession(false) boolean sessionValidator = false if (session = null) String validSession = (String) sessiongetAttribute(SESSION) if (validSession = null) sessionValidator = true if (pathequals(Welcome) ampamp sessionValidator) ((HttpServletResponse) resp)sendRedirect(filterConfiggetServletContext ()getContextPath() + Welcome) else chaindoFilter(req resp) Override public void init(FilterConfig filterConfig) thisfilterConfig = filterConfig Override public void destroy()

TEMA DA CAPA

14

Apoacutes implementado quando se aceder agrave aplicaccedilatildeo pelo URL

apontado para a raiz (httplocalhost8080Teste) o servidor

com conhecimento da existecircncia de um filtro vai chama-lo para

cada vez que o cliente acede a qualquer servlet ou JSP

Para finalizar este exemplo vamos soacute criar um link na paacutegina

homejsp que nos vai apontar para a paacutegina somajsp atraveacutes

da SomaServlet

lta href=SomagtSomarltagt

Dentro da aplicaccedilatildeo os URL pattern que foram definidos no

webxml servem igualmente para os links HTML chamando

sempre o meacutetodo doGet() da servlet

Conclusatildeo

Este artigo mostra numa forma introdutoacuteria como se pode criar

uma aplicaccedilatildeo Java com uma interface Web tendo em conta

que as capacidades do Java EE e das suas bibliotecas nome-

adamente Servlets Filters e as configuraccedilotildees necessaacuterias para

criar uma aplicaccedilatildeo Web baacutesica com conceitos adicionais de

XML( no seu geral) JSP e MVC

BibliografiaReferecircncias

httpwwworaclecomtechnetworkjavajavasedownloads

jre7-downloads-1880261html

httpwwworaclecomtechnetworkjavajavaeedownloads

indexhtml

httpsnetbeansorgfeaturesindexhtml

httpenwikipediaorgwikiJava_EE_version_history

httpwwwjsptutcom

httpsdevelopersgooglecomappenginedocsjavaconfig

webxml

INTRODUCcedilAtildeO AO JAVA EE E JAVA WEB

AUTOR

Escrito por Joseacute Marques

Natural de Coruche formado em Gestatildeo e programaccedilatildeo de sistemas informaacuteticos e teacutecnico especialista de gestatildeo de redes

Membro do PP desde Abril de 2013

A PROGRAMAR Programaccedilatildeo em C const

Jogo da Vida

JBoss Aplication Server 7

PHP Uma framework ldquofrom scratchrdquo (Parte 1)

A PROGRAMAR

16

Uma das ldquorecentesrdquo adiccedilotildees agrave linguagem C foi o qualificador

const Ao contraacuterio do que se possa pensar utilizar const

natildeo cria uma constante mas sim uma variaacutevel soacute-de-leitura

O que queremos dizer com isto Vejamos o seguinte exem-

plo

Qual o valor de i apoacutes execuccedilatildeo da linha 4 Embora possa

parecer estranho i vai ter o valor 73 apesar de termos de-

clarado i como constante Por este motivo variaacuteveis qualifi-

cadas com const natildeo satildeo constantes verdadeiras em C (satildeo-

no em C++) e natildeo podem por este motivo ser utilizadas em

certos lugares como a definiccedilatildeo do tamanho de arrays ou

em cases de um switch (excepto com extensotildees dos compi-

ladores)

De que nos serve entatildeo um qualificador const se natildeo asse-

gura que a variaacutevel permanece inalterada Bem a utilizaccedilatildeo

de const para qualificar variaacuteveis impede de facto a sua

alteraccedilatildeo na maioria dos casos Natildeo podemos alterar i direc-

tamente por exemplo (ie i = 73 emite um erro) No exemplo

apresentado acima enganaacutemos o compilador (linha 2) com o

cast de ampi para o tipo int sem cast um compilador bem

configurado emitiraacute pelo menos um aviso de que o qualifica-

dor const eacute descartado na atribuiccedilatildeo de ampi a ptr um pequeno

sinal de alarme para o programador (eacute soacute estar atento)

Podemos como referido acima qualificar uma variaacutevel com

const e impedir que seja alterada directamente Se tentar-

mos apontar um apontador a essa variaacutevel o compilador

avisa-nos que a qualificaccedilatildeo de const seraacute perdida e pode-

mos alterar a variaacutevel atraveacutes do apontador Haveraacute maneira

de impedir que isto aconteccedila Na realidade a questatildeo eacute

outra como utilizar o qualificador const com apontadores

Existem 4 formas de qualificar um apontador com const

obtendo-se diferentes niacuteveis de acesso de leitura eou escri-

ta da variaacutevel apontada atraveacutes do mesmo Para que natildeo

existam duacutevidas eacute importante reter que o qualificador const

qualifica uma variaacutevel e natildeo um local na memoacuteria Por outras

palavras (e recorrendo ao exemplo inicial) qualificar i como

const soacute impedir a alteraccedilatildeo do valor atraveacutes da variaacutevel i

Quando apontamos um apontador ao endereccedilo de i pode-

mos fazer o que quisermos com o valor laacute armazenado inde-

pendentemente de como i foi declarado

A primeira forma de usar const num apontador eacute surpreen-

dentemente natildeo usar const num apontador Na realidade

(obviamente) esta natildeo eacute uma utilizaccedilatildeo do qualificador const

Programaccedilatildeo em C const mas este artigo natildeo estaria completo sem se falar dela Um

apontador simples de forma tipo p permite-nos fazer vaacuterias

coisas podemos apontaacute-lo a qualquer local da memoacuteria que

queiramos e desde que apontado a um endereccedilo vaacutelido

podemos alterar o valor aiacute armazenado com o operador de

indirecccedilatildeo (eg p = 3) Este tipo de apontador natildeo apresenta

restriccedilotildees nenhumas (por esse motivo eacute que o compilador

emite um aviso quando tentamos apontaacute-lo a uma variaacutevel

const excepto na presenccedila de casts)

Segue-se entatildeo a criaccedilatildeo de um apontador para uma variaacute-

vel constante Este tipo de apontador apresenta uma particu-

laridade embora seja possiacutevel apontaacute-lo a qualquer endere-

ccedilo de memoacuteria natildeo eacute possiacutevel utilizar este apontador para

alterar o conteuacutedo do endereccedilo apontado Logicamente este

era o tipo de apontador que precisaacutevamos no exemplo inici-

al se temos uma variaacutevel constante queremos apontar para

ela com um apontador para uma variaacutevel constante

Se lermos a declaraccedilatildeo de ptr da direita para a esquerda

tudo faz sentido ptr eacute um apontador () para um const int E

de facto i eacute um const int tudo parece bem Quando tentamos

modificar o valor apontado por ptr o compilador emite um

erro queixa-se que estamos a tentar atribuir um valor a uma

variaacutevelendereccedilo soacute de leitura Este era o comportamento

que procuraacutevamos inicialmente

Passemos agora para a terceira forma de usar const com

apontadores Uma espeacutecie de ldquoinversordquo de um apontador

para uma variaacutevel constante eacute um apontador constante para

uma variaacutevel (natildeo constante) A diferenccedila do anterior para

este eacute que agora passamos a conseguir alterar o valor apon-

tado (por outras palavras ptr = 73 passa a ser possiacutevel)

mas natildeo nos eacute possiacutevel apontar ptr para outra variaacutevel

Uma vez mais da direita para a esquerda ptr eacute um aponta-

dor constante ( const) para um int Podemos utilizar ptr agrave

vontade para modificar o valor de 42 para 73 mas eacute-nos

impossiacutevel alterar o endereccedilo para o qual ptr aponta Este

tipo de apontadores eacute uacutetil quando nos queremos assegurar

de que natildeo haacute alteraccedilotildees acidentais do local para onde um

apontador aponta Um pormenor importante sendo ptr um

apontador cujo endereccedilo natildeo pode ser alterado devemos

1 const int i = 42 2 int ptr = (int)ampi 3 4 ptr = 73

1 const int i = 42 2 const int ptr = ampi 3 4 ptr = 73 erro

1 const int i = 42 2 int const ptr = ampi 3 4 ptr = 73 ok 5 ptr = NULL erro

A PROGRAMAR

17

apontaacute-lo para onde queremos no momento da sua declara-

ccedilatildeo sob pena de ficar apontado para um local aleatoacuterio sem

possibilidade de alteraccedilatildeo

A quarta (e uacuteltima) forma de utilizar const num apontador eacute

como devem ter imaginado a combinaccedilatildeo das duas uacuteltimas

um apontador constante para uma variaacutevel constante Este eacute

o tipo de apontador mais limitado de todos uma vez que a

uacutenica coisa que podemos fazer com ele apoacutes a sua declara-

ccedilatildeo eacute consultar o valor para o qual aponta Natildeo podemos

alterar i se ptr for deste tipo nem podemos apontar ptr para

NULL ou outro endereccedilo qualquer

Desta vez utilizamos const em dois locais agrave esquerda do

asterisco para qualificar a variaacutevel apontada e agrave direita do

asterisco para qualificar o apontador Neste caso nenhuma

das operaccedilotildees funcionaraacute o compilador assegura-se que

natildeo utilizaremos ptr para alterar o valor para o qual aponta

nem tentaremos apontar ptr para outro endereccedilo

Neste artigo cobrimos algumas utilizaccedilotildees do qualificador

const na linguagem C (volto a lembrar estamos a falar de C

e natildeo de ldquoCC++rdquo) e foi tambeacutem referido como utilizar este

qualificador para melhorar o coacutedigo que escrevemos de for-

ma a prevenir asneiras relativamente comuns quando se lida

com apontadores

Falta no entanto mencionar outra utilidade do const docu-

mentaccedilatildeo Quando o programador utiliza const de uma for-

ma pensada estaacute a documentar o seu coacutedigo Se virmos uma

funccedilatildeo que aceita como argumento const void podemos

imediatamente imaginar que o endereccedilo passado nunca seraacute

alterado pela funccedilatildeo em causa enquanto que um simples

void natildeo nos informa sobre as intenccedilotildees da API Natural-

mente se o programador da API declarar um argumento

com const e depois utilizar casts para se livrar da qualifica-

ccedilatildeo entatildeo aiacute all bets are off e nada eacute garantido Mas assu-

mamos que isso eacute a excepccedilatildeo e natildeo a regra

Existem ainda muacuteltiplos aspectos que natildeo foram cobertos

neste artigo nomeadamente a conversatildeo impliacutecita de T para

const T e T para const T Esta conversatildeo eacute bastante uacutetil

quando queremos passar um valor do tipo T a uma funccedilatildeo

que requer const T como argumento Se pensarmos bem

faz sentido em qualquer lugar onde eacute necessaacuterio um const

T podemos utilizar um T perfeitamente (que nunca seraacute al-

terado) Por outro lado a conversatildeo inversa (de const T ou

const T para T e T respectivamente) natildeo eacute permitida e

tambeacutem isso faz sentido se uma funccedilatildeo pede um valor do

tipo T natildeo faz sentido aceitar um const T porque isso im-

plicaria potenciais alteraccedilotildees ao valor apontado (que satildeo

proibidas pelo qualificador const)

As conversotildees impliacutecitas relativas ao const terminam por

aqui Em C natildeo haacute conversatildeo de T para const T o que

significa que numa funccedilatildeo que aceite um argumento const

T seraacute emitido um aviso se tentarmos passar um T Neste

caso temos que recorrer a um cast para silenciar o compila-

dor Nada disto eacute um erro no entanto os casts surgiram

porque satildeo necessaacuterios na linguagem C e recusar a sua

utilizaccedilatildeo eacute negar a linguagem Haacute que saber quando e co-

mo fazer as coisas da forma correcta

Para terminar recomendo uma olha- dela agraves

manpages da biblioteca standard de C jaacute utilizam const

abundantemente nota-se bem o seu valor como documenta-

ccedilatildeo dentro do coacutedigo Aleacutem deste aspecto da documentaccedilatildeo

a utilizaccedilatildeo de const leva agrave criaccedilatildeo de coacutedigo mais previsiacutevel

e seguro e serve tambeacutem como dica para possiacuteveis optimi-

zaccedilotildees feitas pelo compiladorUsem const Informem e enco-

rajem a utilizaccedilatildeo de const especialmente aos iniciados

porque vale a pena

PROGRAMACcedilAtildeO EM C CONST

1 const int i = 42 2 const int const ptr = ampi 3 4 ptr = 73 erro 5 ptr = NULL erro

AUTOR

Escrito por Antoacutenio Pedro Cunha (pwseo)

Meacutedico natural de Guimaratildees formado na Universidade do Minho

Programador autodidacta em parte dos tempos livres inscrito no foacuterum desde 2006

Website httppwseoalojnet

Ao contraacuterio do

que se possa pen-

sar utilizar const natildeo

cria uma constante

mas sim uma variaacutevel

soacute de leitura

A PROGRAMAR

18

Nesta ediccedilatildeo vamos propor ao leitor um olhar sobre um fa-

moso algoritmo da deacutecada de 70

O seu inventor John Horton Conway nasceu em Liverpool

em Dezembro de 1937 e eacute um dos matemaacuteticos mais conhe-

cidos da nossa era em todo o mundo Estudou na Universi-

dade de Cambridge e ainda hoje eacute uma mente ativa nas

mais variadas teorias como por exemplo a teoria dos coacutedigos

e a teoria com- binatoacuteria dos

jogos

Ilustraccedilatildeo 1 - John Conway

O algoritmo escolhido para esta ediccedilatildeo foi criado em 1970

por Conway ndash o Jogo da Vida ndash sendo este um jogo para

zero jogadores Este jogo tornou-se mundialmente famoso

atraveacutes de uma coluna na revista Scientific American Em

1971 foi tema de capa e tinha entatildeo relanccedilado uma aacuterea da

Matemaacutetica a dos autoacutematos celulares que satildeo estruturas

matemaacuteticas uacuteteis em simulaccedilotildees de processos fiacutesicos e

bioloacutegicos e que a um niacutevel teoacuterico podem comportar-se

como computadores

Um autoacutemato celular eacute um modelo discreto e cada autoacutemato

deste tipo eacute representado por uma grelha de ceacutelulas poden-

do essas ceacutelulas assumir um nuacutemero finito de estados que

variam de acordo com cada modelo Outra caracteriacutestica a

considerar eacute que o tempo de evoluccedilatildeo eacute tambeacutem discreto

por exemplo o estado de uma ceacutelula no tempo t eacute sempre

obtido tendo em consideraccedilatildeo o estado dessa mesma ceacutelula

(e respetiva vizinhanccedila) no tempo t-1 Cada vez que todas as

regras determiniacutesticas satildeo aplicadas a toda a grelha uma

nova geraccedilatildeo eacute produzida

Isto foi um dos motes de partida para que Conway criasse o

Jogo da Vida Este jogo eacute considerado um autoacutemato celular

bidimensional em que satildeo simulados processos de evoluccedilatildeo

de ceacutelulas bioloacutegicas Estudos jaacute efetuados provam que este

eacute um autoacutemato computacional universal isto eacute eacute capaz de

simular qualquer sistema evolucionaacuterio possiacutevel

(reprogramando as respetivas regras determiniacutesticas se isso

for necessaacuterio)

Jogo da Vida Devido agraves analogias com o aumento reduccedilatildeo e alteraccedilatildeo de

um sistema de supostos organismos vivos (as ceacutelulas) este

jogo pertence agrave classe dos ldquojogos de simulaccedilatildeordquo pois recriam

processos do mundo-real

Voltando de novo ao tema principal do nosso artigo eacute impor-

tante recordar ao leitor que este jogo eacute para zero jogadores

o utilizador eacute apenas responsaacutevel pelos valores de inicializa-

ccedilatildeo do sistema Depois desses valores serem introduzidos

as geraccedilotildees seguintes seratildeo sempre calculadas com base

nas regras determiniacutesticas do algoritmo

Neste jogo num dado instante cada ceacutelula tem dois estados

possiacuteveis ldquovivardquo ou ldquomortardquo

As regras do jogo da vida satildeo simples ora vejamos

Uma ceacutelula viva com menos de dois vizinhos vivos

morre por solidatildeo

Uma ceacutelula viva com mais de trecircs vizinhos vivos mor-

re por sobrepopulaccedilatildeo (por escassez de recursos)

Uma ceacutelula viva com exatamente dois ou trecircs vizinhos

vivos permanece viva

Uma ceacutelula morta com exatamente trecircs vizinhos vivos

torna-se viva

Ao contraacuterio do artigo anterior desta seacuterie a soluccedilatildeo propos-

ta para este problema (na linguagem C) propotildee-se a ser

algo extremamente simples escrita de forma quase elemen-

tar

Implementaccedilatildeo do Algoritmo

Para simular o sistema de jogo foi usada uma matriz e para

que o caacutelculo das regras fosse simples foi considerado que

todas as ceacutelulas dessa matriz teriam 8 vizinhos A forma

mais direta encontrada para isso foi inserir a matriz do utiliza-

dor (que neste artigo seraacute a matriz secundaacuteria) numa matriz

com dimensatildeo [linhas+2][colunas+2] (matriz principal) para

garantir que ateacute as ceacutelulas dos ldquocantosrdquo teriam os tais 8 vizi-

nhos

De forma a simplificar a leitura da nossa implementaccedilatildeo defi-

nimos que cada ceacutelula viva teraacute o valor 1 (representada pela

macro CELVIVA) e que cada ceacutelula morta teraacute o valor 0

(representada pela macro CELMORTA)

No inicio da funccedilatildeo jogo() satildeo pedidos ao utilizador os valo-

res para o nuacutemero de linhas e colunas do sistema de jogo e

o nuacutemero de geraccedilotildees a simular

Apoacutes termos esses valores eacute entatildeo criada a matriz principal

com todos os campos inicializados a -1 para que seja efetua-

A PROGRAMAR

19

da uma ldquolimpezardquo da memoacuteria utilizada Seguidamente e atra-

veacutes desses valores eacute inicializada dentro na matriz principal a

submatriz (matriz secundaacuteria) que eacute usada para calcular os

valores das ceacutelulas em cada geraccedilatildeo Neste caso eacute inicializa-

da a matriz com a dimensatildeo que o utilizador pediu com o valor

de CELMORTA em todos os campos

Apoacutes gerar a matriz secundaacuteria eacute perguntado ao utilizador

quantas ceacutelulas vivas pretende ter no jogo Seguidamente satildeo

pedidas as coordenadas dessas mesmas ceacutelulas Quando o

programa recebe esses valores (da linha e da coluna pretendi-

da) entatildeo a essas posiccedilotildees da matriz eacute atribuiacutedo o valor CEL-

VIVA

Recapitulando para representar uma ceacutelula viva eacute usado o

valor 1 e para representar uma ceacutelula morta eacute usado o valor 0

Todas as outras posiccedilotildees da matriz principal permanecem inal-

teradas com o valor -1

Assim o que o algoritmo faz eacute contabilizar quantas ceacutelulas

vivas estatildeo nos 8 vizinhos Ou seja por outras palavras para

cada posiccedilatildeo (ij) da matriz o programa vai verificar as posi-

ccedilotildees (i-1 j-1) (i-1 j) (i-1 j+1) (i j-1) (i j+1) (i+1 j-1) (i+1 j)

e (i+1 j+1) Caso o valor de cada uma dessas ceacutelulas seja

igual a 1 (CELVIVA ie ceacutelula viva) a variaacutevel de contagem

(cvivas) eacute incrementada uma unidade

Apoacutes a verificaccedilatildeo de todas as posiccedilotildees eacute verificado se a ceacutelu-

la da posiccedilatildeo (i j) eacute uma ceacutelula viva ou morta e satildeo verificadas

as regras do jogo para que se possa decidir se a ceacutelula (ij)

permanece viva ou se morre (tomando respetivamente o valor

CELVIVA e CELMORTA na submatriz)

Usando a variaacutevel i como auxiliar para as linhas e a variaacutevel j

como auxiliar para as colunas os caacutelculos iniciam-se na posi-

ccedilatildeo (11) da matriz principal pois eacute nestas coordenadas que se

inicia a matriz secundaacuteria (ie o sistema de jogo do utilizador)

Os caacutelculos satildeo feitos em todas as posiccedilotildees (ij) apenas da

matriz secundaacuteria daiacute que a condiccedilatildeo de execuccedilatildeo dos ciclos

for seja enquanto o i e o j forem menores que o valor das li-

nhas e das colunas introduzidas pelo utilizador Ou seja a ma-

triz principal natildeo eacute toda processada nos caacutelculos dos vizinhos

vivos para que natildeo sejam gastos recursos de computaccedilatildeo

desnecessariamente

Ilustraccedilatildeo 2 - Exemplo de verificaccedilatildeo de Ceacutelulas

Ceacutelula a ceacutelula a matriz atual eacute processada sendo que apoacutes

esse processamento o resultado do caacutelculo (se a ceacutelula vive

ou morre) eacute colocado na posiccedilatildeo correspondente na matriz

nova (que eacute uma matriz com as mesmas caracteriacutesticas da

matriz atual isto eacute tem tambeacutem uma matriz principal e uma

matriz secundaacuteria)

Apoacutes esse caacutelculo eacute mostrada no ecratilde a matriz secundaacuteria

da matriz nova e a informaccedilatildeo das ceacutelulas da matriz nova eacute

copiada para a matriz atual de forma a que na proacutexima itera-

ccedilatildeo do for principal (que executa o mesmo numero de vezes

quantas geraccedilotildees o utilizador peccedila ao programa) a informa-

ccedilatildeo volte a ser processada de forma anaacuteloga

Para que fosse mais simples ao utilizador o uso do nosso

programa foi tomada em consideraccedilatildeo para que natildeo se

tornasse aborrecido estar sempre a iniciar a execuccedilatildeo do

programa caso o utilizador quisesse continuar a jogar que o

programa apenas teraacute fim quando o utilizador escolher sair

do programa neste caso introduzindo o valor 0 no menu prin-

cipal do mesmo

Se o utilizador preferir jogar novamente entatildeo basta carregar

em 1 e o programa volta a gerar uma nova jogada gerando

um novo sistema de geraccedilotildees consoante os valores introdu-

zidos pelo utilizador Na nossa implementaccedilatildeo quando o

programa mostra o sistema de jogo as ceacutelulas vivas satildeo

representadas pelo siacutembolo

Coacutedigo do Programa

Este eacute apenas um excerto da funccedilatildeo que calcula a proacutexima

geraccedilatildeo tendo como base uma matriz que represente a gera-

ccedilatildeo anterior O coacutedigo completo poderaacute ser consultado no

foacuterum do PP

JOGO DA VIDA

void jogo(void) for (int g = 0 g lt geracoes g++) printf(nnGERACAO d g + 1) for (int i = 1 i lt= linhas i++) for (int j = 1 j lt= colunas j++) int cvivas = 0 if (matrizActual[i-1][j-1] == CELVIVA) cvivas++ if (matrizActual[i-1][j] == CELVIVA) cvivas++ if (matrizActual[i-1][j+1] == CELVIVA) cvivas++ if (matrizActual[i][j-1] == CELVIVA) cvivas++ if (matrizActual[i][j+1] == CELVIVA) cvivas++ if (matrizActual[i+1][j-1] == CELVIVA) cvivas++ if (matrizActual[i+1][j] == CELVIVA)

A PROGRAMAR

20

Como o leitor pode verificar nas linhas acima este eacute um algorit-

mo bastante simples e de raacutepida implementaccedilatildeo Eacute de referir

ainda que o coacutedigo do artigo desta ediccedilatildeo foi implementado

segundo o standard C99 (suportado pelos compiladores GCC

Clang e Pelles C) que nos permite programar de uma forma

portaacutevel e ainda assim confortaacutevel (comentaacuterios comeccedilados

com variable-length arrays tipo de dados bool entre outros)

Caso o leitor queira compilar o coacutedigo deste artigo em Linux

deve utilizar a linha de comando gcc -Wall -Wextra -std=c99 -

pedantic jogo-da-vida jogo-da-vidac

O objetivo principal deste algoritmo eacute entatildeo que o utilizador

possa decidir qual a sua populaccedilatildeo inicial e que apoacutes isso pos-

sa observar o comportamento do seu sistema Ao longo dos

anos muitas configuraccedilotildees foram testadas e experimentadas

com este jogo O jogo da vida convida a experimentar diversas

configuraccedilotildees sendo que agrave maior parte das configuraccedilotildees

iniciais escolhidas bastam apenas trecircs ou quatro geraccedilotildees

para a populaccedilatildeo desaparecer completamente Contudo haacute

algumas configuraccedilotildees jaacute conhecidas como configuraccedilotildees de

ldquoVida Eternardquo por haver sempre ceacutelulas vivas ao longo de mui-

tas geraccedilotildees (e ateacute mesmo de geraccedilotildees infinitas) como mostra

por exemplo imagem seguinte (obtida com a execuccedilatildeo do

nosso programa)

Ilustraccedilatildeo 3 - Exemplo configuraccedilatildeo Vida Eterna (Bloco)

Existem ainda diferentes configuraccedilotildees que podem ocorrer

no Jogo da Vida (configuraccedilotildees essas que o utilizador pode

facilmente encontrar na internet relativas a vaacuterios estudos jaacute

feitos sobre este algoritmo) Os exemplos mais simples satildeo

mostrados abaixo com as ceacutelulas vivas em preto e as ceacutelu-

las mortas em branco

Haacute configuraccedilotildees que satildeo alvo de vaacuterios estudos cientiacuteficos

por exemplo se dois gliders satildeo colocados em direccedilatildeo a um

bloco o bloco vai aproximar-se da fonte dos gliders mas por

outro lado se trecircs gliders satildeo colocados no mesmo lugar o

bloco vai afastar-se desses gliders Este facto eacute conhecido

como a ldquomemoacuteria de bloco deslizante e pode ser usada para

simular um contador

Eacute possiacutevel construir portas loacutegicas AND OR e NOT usando

gliders tal como eacute possiacutevel construir uma imagem que aja

como uma maacutequina de estado finito conectada a dois conta-

dores

O que significa que esta disposiccedilatildeo possui o mesmo poder

computacional de uma maacutequina de Turing universal ou seja

Jogo da Vida pode ser tatildeo poderoso quanto qualquer com-

putador com memoacuteria ilimitada dando origem ao Turing com-

pleto como jaacute vaacuterios estudos comprovam esse mesmo feito

Mais uma vez recordo ao leitor que pode experimentar sem

qualquer restriccedilatildeo as configuraccedilotildees iniciais que mais lhe

agradarem Este artigo eacute o terceiro de uma seacuterie de artigos

de programaccedilatildeo tendo como base principal a linguagem C

que esperamos que siga atentamente

JOGO DA VIDA

cvivas++ if (matrizActual[i+1][j+1] == CELVIVA) cvivas++ if (isAlive ampamp cvivas lt 2) DIE else if (isAlive ampamp cvivas gt 3) DIE else if (isAlive ampamp (cvivas == 2 || cvivas == 3)) LIVE else if (isDead ampamp cvivas == 3) LIVE else DIE

AUTOR

Escrito por Rita Peres

Natural de Castelo Branco licenciou-se em Engenharia Informaacutetica pela Universidade da Beira Interior Membro do PP

desde Janeiro de 2010

a matriz principal

natildeo eacute toda proces-

sada (hellip) para que natildeo

sejam gastos recur-

sos de computaccedilatildeo

A PROGRAMAR

21

Introduccedilatildeo

Atualmente a plataforma Java eacute uma das mais utilizadas no

mundo e muito disso se deve agrave capacidade da plataforma

suportar outras linguagens como por exemplo JRuby Groovy

e Scala Milhares de aplicativos para Web e Mobile satildeo de-

senvolvidos a cada mecircs utilizando esta plataforma como

base A plataforma Java mudou muito desde seu iniacutecio e

provavelmente vai continuar evoluindo nos proacuteximos anos

Em paralelo com essas mudanccedilas visualizamos os servido-

res de aplicaccedilatildeo que cada vez mais oferecem recursos de

alta complexidade como componentes de balanceamento

de carga inteligente implementaccedilatildeo de autenticaccedilatildeo (JAAS)

troca de mensagens assiacutencronas (JMS) controle de transa-

ccedilatildeo (JTA) persistecircncia de objetos (JPA) componentes para

criaccedilatildeo de aplicaccedilotildees distribuiacutedas e clusterizadas (EJB) API

Java para processamento de arquivos XML e Webservices

(JAX-WS e JAX-B) e muitas outras tecnologias facilitando o

desenvolvimento e padronizaccedilatildeo de aplicaccedilotildees Eles tam-

beacutem disponibilizam uma infraestrutura estaacutevel e escalonaacutevel

para aplicaccedilotildees de missatildeo criacutetica Um dos grandes desafios

dos servidores de aplicaccedilatildeo eacute acoplar serviccedilos de grande

complexidade deixando-os estaacuteveis e flexiacuteveis

Nas versotildees iniciais a plataforma ainda conhecida como

Java2EE natildeo estava madura e seus recursos nos servidores

de aplicaccedilatildeo eram carregados de forma hieraacuterquica consu-

mindo muitos recursos e tornando o startup altamente custo-

so

A arquitetura dos principais servidores de aplicaccedilatildeo foi rede-

senhada para que seus recursos possam ser iniciados de

modo concorrente ou sob demanda As melhorias tambeacutem

podem ser notadas no consumo de memoacuteria onde em uma

simples maacutequina desktop pode-se facilmente configurar

serviccedilos de alta disponibilidade e escalaacuteveis para realizaccedilatildeo

de testes em tempo de desenvolvimento

Se vocecirc deseja um ambiente com alta disponibilidade esca-

lonaacutevel e que seja independente de fabricante (de forma a

evitar o vendor lock-in) o Java EE e seus servidores de apli-

caccedilatildeo foram feitos para si

JBoss Application Server 7

JBoss Application Server 7 ou apenas JBoss AS 7 eacute um ser-

vidor de aplicaccedilatildeo de coacutedigo aberto que eacute 100 compatiacutevel

com a especificaccedilatildeo Java EE 6 Em versotildees anteriores do

Java EE mesmo utilizando somente algumas tecnologias

para o desenvolvimento da aplicaccedilatildeo eacuteramos obrigados a

lidar com todos os recursos implementados no servidor Para

resolver esse problema no Java EE 6 foi inserido o conceito

JBoss Aplication Server 7 de profile que tem como objetivo criar configuraccedilotildees com fins

especiacuteficos como por exemplo o Web Profile que possui tec-

nologias para o desenvolvimento web

Ateacute ao momento a versatildeo atual do JBoss AS foi baixada

mais de 150 mil vezes Para mais informaccedilotildees visite o site

do projeto httpwwwjbossorgjbossas

Recentemente o projeto recebeu um novo nome e futura-

mente se chamaraacute WildFly Mais informaccedilotildees podem ser

encontradas em httpwwwwildflyorgfaq

Requisitos

Como todo servidor de aplicaccedilatildeo o JBoss AS 7 requer um

ambiente com JDK 16JDK 17 devidamente configurado e

instalado O Java Development Kit (JDK) eacute um conjunto de

utilitaacuterios para criaccedilatildeo de softwares para plataforma Java

Existem vaacuterias implementaccedilotildees cada qual com a sua finali-

dade

Para baixar o JDK 7 navegue ateacute a paacutegina de download da

Oracle em httpwwworaclecomtechnetworkjavajavase

downloadsindexhtml e escolha a opccedilatildeo Java Platform

(JDK) Em seguida vocecirc seraacute direcionado para outra paacutegina

onde deveraacute aceitar a License Agreement Baixe a versatildeo

jdk-7u21-linux-x64rpm

Para instalar o JDK execute o seguinte comando

$ sudo rpm -Uvh jdk-7u21-linux-x64rpm

Execute o comando java --version para verificar se o JDK

estaacute instalado

$ java --version

java version 170_21

Java(TM) SE Runtime Environment (build 170_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 2321-b01 mixed

mode)

Duvidas na instalaccedilatildeo Consulte o link

httpdocsoraclecomjavase7docswebnotesinstall

indexhtml

Instalando o JBoss AS 7

O JBoss AS 7 pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgjbossasdownloads Para

instalar basta descompactar o arquivo jboss-as-

711Finalzip utilizando um utilitaacuterio de descompressatildeo

A PROGRAMAR

22

Boas Praacuteticas

Nunca inicie o JBoss utilizando o usuaacuterio root pois a platafor-

ma Java oferece APIs para execuccedilatildeo de coacutedigos nativos do

sistema operacional e mecanismos de gerenciamento remoto

No Linux crie um usuaacuterio com privileacutegios de root para iniciar o

serviccedilo do JBoss Jaacute no Windows crie um usuaacuterio com poderes

administrativos mas com privileacutegios reduzidos

Uma vez instalado eacute fortemente aconselhaacutevel iniciar o JBoss

AS para verificar se existe alguma incompatibilidade com a

arquitetura do JDK utilizado ou ateacute mesmo se a memoacuteria dispo-

nibilizada eacute suficiente

Execute uma simples instacircncia standalone e acesse a url http

localhost8080 para verificar se o JBoss foi iniciado correta-

mente

$ jboss-as-711Finalbinstandalonesh

Domain Mode x Standalone Mode

O JBoss AS 7 possui dois modelos de trabalho conhecidos

como Standalone Mode e Domain Mode No Standalone Mode

podemos trabalhar com uma uacutenica instacircncia muito semelhante

a versotildees anteriores do JBoss AS 5 e JBoss AS 6 Para utilizar

o Standalone mode basta iniciar o script JBOSS_HOME

standalonesh no Linux

Agora vocecirc deve estar se perguntando se eacute possiacutevel criar um

ambiente de alta disponibilidade utilizando o Standalone

Mode A resposta eacute Sim Eacute possiacutevel criar um ambiente com

recursos clusterizados replicaccedilatildeo de sessatildeo e tudo mais Se

vocecirc jaacute utilizou outras versotildees do JBoss deve estar pensan-

do em utilizar o famoso Farm Deployment onde a aplicaccedilatildeo

era replicada para todos os noacutes do cluster Esse recurso natildeo

existe no Standalone Mode pelo que vocecirc teraacute que realizar

o deploy em todos os noacutes um por um Isso natildeo eacute um proble-

ma se forem 3 ou 4 instacircncias mas imagine se forem umas

20 instacircncias

Uma soluccedilatildeo para esse problema seria a utilizaccedilatildeo de ferra-

mentas como o RHQ (httpwwwjbossorgrhq) para realiza-

ccedilatildeo do deploy em muacuteltiplas instacircncias o que acarretaria con-

sumo de mais recursos e tempo Para solucionar esse pro-

blema temos uma soluccedilatildeo bem simples jaacute embutida no servi-

dor de aplicaccedilatildeo o Domain Mode e eacute sobre isso que vamos

falar no proacuteximo toacutepico

Introduccedilatildeo ao Domain Mode

O Domain Mode permite iniciar vaacuterias instacircncias e tambeacutem

oferece uma maneira centralizada de gerenciamento dos

recursos facilitando a administraccedilatildeo das instacircncias JBoss O

Domain Mode pode ser visto como uma unidade de instacircn-

cias que compartilham recursos e configuraccedilotildees e satildeo admi-

nistradas por um processo chamado Domain Controller

Para iniciar o JBoss AS 7 de modo domain execute o script

JBOSS_HOMEdomainsh no Linux ou JBOSS_HOME

domainbat no Windows

Quando iniciamos o JBoss em Domain Mode na configura-

ccedilatildeo default temos no miacutenimo quatro processos um Host

Controller um Process Controller e dois Servers

Domain Controller Ele eacute quem controla o gerenciamento

do domain Nele estatildeo as configuraccedilotildees que satildeo comparti-

lhadas entre as instacircncias que estatildeo nesse domain

Process Controller Ele eacute de grande importacircncia pois ele eacute

responsaacutevel pela criaccedilatildeo das instacircncias e tambeacutem do Host

Controller que vamos falar a seguir O Process Controller

natildeo deve ser confundido com uma instacircncia ele eacute

simplesmente um processo na JVM

Host Controller Como Domain Controller o Host Controller

tambeacutem coordena as instacircncias do domain Ele eacute o

responsaacutevel por fazer algo semelhando ao Farm Deployment

(natildeo existe nessa versatildeo) ou seja ele distribui o arquivo

deployado para todas as instacircncias do domain

Servers Satildeo as instacircncias em si onde estatildeo as aplicaccedilotildees

deployadas Um ponto importante eacute que cada server eacute um

processo Java

Entre os benefiacutecios da utilizaccedilatildeo do Modo Domain que noacutes

podemos citar estatildeo

Gestatildeo Centralizada

JBOSS APLICATION SERVER 7

A PROGRAMAR

23

Configuraccedilatildeo Centralizada

Deploy Centralizado

Manutenccedilatildeo Centralizada

Preparando a Infra Estrutura

Nesse artigo estamos utilizando Trecircs servidores Dois deles

seratildeo utilizados pelas as instacircncias JBoss e Um seraacute utilizado

Pelo Domain Controller e Apache Web Server para realizar o

Balanceamento de carga

Crie um grupo e adicione um usuaacuterio para ser utilizado

pelo JBoss AS 7 em todos os servidores

$ sudo groupadd jboss

$ sudo useradd -s binbash -d homejboss -m -g jboss

jboss

Faccedila tambeacutem o download do JBoss AS 7 no diretoacuterio

tmp

$ cd tmp

$ wget httpdownloadjbossorgjbossas71jboss-as-

711Finaljboss-as-711Finalzip

Crie a estrutura de diretoacuterios para armazenar o JBoss

$ sudo mkdir usrlocaljboss

$ chown jbossjboss usrlocaljboss

$ su jboss

$ mkdir usrlocaljboss

$ cd usrlocaljboss

$ unzip tmpjboss-as-711Finalzip

Finalmente o JBoss AS 7 estaacute instalado em usr

localjbossjboss-as-711 Final em todos os servidores

Configurando Alta Disponibilidade

Para aplicaccedilotildees com muitas solicitaccedilotildees a busca pela

melhora do desempenho eacute quase constante Um dos

meios mais utilizados eacute o Balanceamento de Carga

que consiste em distribuir a carga das solicitaccedilotildees em

vaacuterios servidores ou instacircncias proporcionando a

melhora no tempo de reposta

O JBoss AS 7 possui um componente nativo

conhecido como mod_cluster que foi criado para

atender a mecanismos de balanceamento de carga

alinhados ao conceito de Cloud O Mod Cluster vem

com algoritmos de balanceamento de carga mais

avanccedilados que se baseiam na carga da aplicaccedilatildeo ou

seja quantidades de sessotildees conexotildees abertas

entre outros Ele pode ser customizado conforme a

necessidade da aplicaccedilatildeo visando um ambiente

elaacutestico Um das vantagens eacute tambeacutem o

descobrimento automaacutetico de novas instacircncias JBoss

(utilizando Multicast) natildeo havendo a necessidade de

configuraccedilotildees extras

As configuraccedilotildees do mod_cluster devem ser

realizadas no JBoss AS 7 e no Apache Web Server

que seraacute utilizado como Proxy reverso

Instalando Apache Web Server

No Servidor Balancer instale o Apache Web Server

Basta executar o seguinte comando

$ sudo yum install httpd -y

Inicie o serviccedilo e verifique se paacutegina de testes eacute

carregada

$ sudo service httpd start

Instalando Mod Cluster

Ainda no Servidor Balancer instale o Mod Cluster Ele

pode ser baixado gratuitamente no site da

comunidade httpwwwjbossorgmod_cluster

downloads1-2-0-Final Para instalar basta

JBOSS APLICATION SERVER 7

A PROGRAMAR

24

descompactar o arquivo mod_cluster-120Final-linux2-

x64-ssltargz utilizando um utilitaacuterio de descompressatildeo

e copiar os moacutedulos para o diretoacuterio de moacutedulos do

Apache Web Server

Para baixar e extrair o arquivo execute

$ cd tmp

$ wget httpdownloadsjbossorg

mod_cluster120Finalmod_cluster-120Final-

linux2-x64-ssltargz

$ tar -zxvf mod_cluster-120Final-linux2-x64-

ssltargz

Copie os moacutedulos para o Apache

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_advertiseso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_managerso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_proxy_clusterso etchttpdmodules

$ sudo cp tmpoptjbosshttpdlibhttpdmodules

mod_slotmemso etchttpdmodules

Edite o arquivo etchttpdconfhttpdconf e comente a

linha LoadModule proxy_balancer_module modules

mod_proxy_balancerso para natildeo ocorrer um conflito

com LoadModule proxy_cluster_module modules

mod_proxy_clusterso

LoadModule proxy_balancer_module modules

mod_proxy_balancerso

Crie o arquivo mod_clusterconf e adicione a seguinte

configuraccedilatildeo

$ sudo vim etchttpdconfdmod_clusterconf

Reinicie o Apache

$ sudo service httpd restart

Acesse o mod_cluster-manager e verifique se as

informaccedilotildees sobre a versatildeo do mod_cluster estatildeo

aparecendo

Arquitetura dos Servidores em Modo Domain

Para realizar os testes do balanceamento de carga

com o mod_cluster vamos subir o Domain Controller

e depois vamos conectar dois Hosts Controller com

uma Instacircncia JBoss em cada

Criando os Perfis dos Servidores JBoss

No Servidor Balancer crie o perfil chamado master

que seraacute o Domain Controller

$ cp -Rap usrlocaljbossjboss-as-711Final

domain usrlocaljbossjboss-as-711Finalmaster

JBOSS APLICATION SERVER 7

Content Mod Cluster LoadModule slotmem_module modules mod_slotmemso LoadModule manager_module modules mod_managerso LoadModule proxy_cluster_module modules mod_proxy_clusterso LoadModule advertise_module modules mod_advertiseso ltVirtualHost 80gt ltDirectory gt Order denyallow Allow from all ltDirectorygt KeepAliveTimeout 60 ManagerBalancerName mycluster MaxKeepAliveRequests 0 ServerAdvertise On EnableMCPMReceive On ltVirtualHostgt ltLocation mod_cluster-managergt SetHandler mod_cluster-manager Order denyallow Allow from all ltLocationgt

A PROGRAMAR

25

No Servidor Host-01 crie o perfil chamado host01 que

seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost01

No Servidor Host-02 crie o perfil chamado host02 que

tambeacutem seraacute um dos Hosts Controllers

$ cp -Rap usrlocaljbossjboss-as-711Finaldomain

usrlocaljbossjboss-as-711Finalhost02

Configurando Toda a Arquitetura

Como vimos anteriormente todas as configuraccedilotildees e

gerenciamento satildeo realizadas de forma centralizada no

Domain Controller Quando for necessaacuterio adicionar um

novo grupo de servidores configurar logs criar

datasources alterar portas entre outras coisas tudo

isso deveraacute ser feito no domainxml do Domain

Controller que nesse caso eacute chamado de master Sendo

assim todas as nossas instacircncias JBoss usufruiratildeo das

configuraccedilotildees realizadas para o Domain ou para o

Server Group em questatildeo

A primeira coisa a ser feita eacute definir qual o conjunto de

tecnologias (subsystems) seratildeo utilizadas na aplicaccedilatildeo

Isso pode variar conforme os requisitos de cada

sistema Um conjunto de tecnologias (subsystems) no

JBoss 7 eacute chamado de profile

ltprofile name=full-hagt

O JBoss AS 7 possui 4 profiles por padratildeo ldquodefaultrdquo

ldquofullrdquo ldquohardquo ldquofull-hardquo mas nada impede de noacutes

copiarmos qualquer um deles e renomeaacute-los conforme

nossos requisitos No Java EE 6 foi introduzido o

conceito de Profiles onde se pode criar um subconjunto

de tecnologias presentes na spec Java EE ou ateacute

mesmo adicionar novas definidas pela JCP (Java

Community Process)

Mais informaccedilotildees

httpscommunityjbossorgwiki

JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Noacutes vamos utilizar o profile ha pois nele os recursos

para clusterizaccedilatildeo estatildeo disponiacuteveis

Depois de definir o profile o proacuteximo criar um Grupo de

Servidores Server Group Um server group nada mais eacute

que um agrupamento de instacircncias JBoss Nessa

arquitetura vamos utilizar apenas um server group Isso

pode ser definido na tag ltserver-groupsgt no domainxml

do master (Domain Controller)

Crie um Server Group chamado apps que utilize o

profile ha

$ vim usrlocaljbossjboss-as-711Finalmaster

configurationdomainxml

Os outros Server Groups podem ser removidos

No profile ha especificamente no subsystem web

adicione o atributo instance-id

O instance-id seraacute passado como paracircmetro na

inicializaccedilatildeo do Host Controller

O proacuteximo passo eacute configurar o atributo proxy list no

subsystem modcluster

Nesse atributo estaacute configurado o IP e porta do

Apache Web Server

No Servidor Host-01 edite o arquivo usrlocaljboss

jboss-as-711Finalhost01configurationhost-

slavexml para criar a instacircncia JBoss

Na tag ltserversgt eacute onde estatildeo de fato as nossas

instacircncias JBoss Quando criamos um novo ltservergt

estamos criando uma nova instacircncia JBoss

Conforme foi definido na arquitetura o Host Controller

01 conteraacute apenas uma instacircncia JBoss chamada

instance-one

Deixe o ltserversgt como abaixo

Definimos que a instacircncia JBoss instance-one faraacute

parte do Server Group apps

Para finalizar na tag lthostgt adicione o nome host01

lthost name=host01 xmlns=urnjbossdomain12gt

JBOSS APLICATION SERVER 7

ltserver-group name=apps profile=hagt ltjvm name=defaultgt ltheap size=1303m max-size=1303mgt ltpermgen max-size=256mgt ltjvmgt ltsocket-binding-group ref=ha-socketsgt ltserver-groupgt

ltsubsystem xmlns=urnjbossdomainweb12 de-fault-virtual-server=default-host instance- id=$jbossservername native=falsegt

ltsubsystem xmlns=urnjbossdomainmodcluster10gt ltmod-cluster-config advertise-socket=modcluster proxy-list=19216823818680gt ltdynamic-load-providergt ltload-metric type=busynessgt ltdynamic-load-providergt ltmod-cluster-configgt ltsubsystemgt

ltserversgt ltserver name=instance-one group=appsgt ltservergt ltserversgt

A PROGRAMAR

26

Repita os procedimentos realizados no servidor Host -01

em Host-02 alterando apenas o nome do servidor que

seraacute instance-two e do lthostgt que seraacute host02No

ambiente em que realizei os testes o sevidores possuem

os seguintes IPs

Domain Controller+Apache WebServer 192168238186

Host Controller 01 192168238187

Host Controller 02 192168238188

Inicie o Domain Controler (master) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalmaster

-Djbosshostdefaultconfig=host-masterxml -

Djbossbindaddress=192168238186 -

Djbossbindaddressmanagement=192168238186

Verifique o log

JBoss AS 711Final Brontes (Host Controller) started

in 15505ms - Started 11 of 11 services (0 services are

passive or on-demand)

O Domain Controller foi iniciado com sucesso Conecte

primeiro Host Controller 01 (Host-01) ao Master Inicie o

Perfil host01 utilizando os seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost01

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238187

-Djbossbindaddress=192168238187

-Djbossservername=host-01

Agora observe os logs no Domain Controller e perceba

que o Host Controller 01 se conectou ao Domain

JBAS010918 Registered remote slave host host01

JBoss AS 711Final Brontes

Observe tambeacutem o Mod Cluster Manager em

http192168238186mod_cluster-manager e veja que

a nossa primeira instacircncia jaacute apareceu

Inicie o Host Controller 02 (slave02) utilizando os

seguintes paracircmetros

usrlocaljbossjboss-as-711Finalbindomainsh

-Djbossdomainbasedir=usrlocaljbossjboss -as-

711Finalhost02

-Djbosshostdefaultconfig=host-slavexml

-Djbossdomainmasteraddress=192168238186

-Djbossbindaddressmanagement=192168238188

-Djbossbindaddress=192168238188

-Djbossservername=host-02

Observando novamente o log Domain Controller e

verifique que o Host Controller 02 se tambeacutem

conectou

JBAS010918 Registered remote slave host host02

JBoss AS 711Final Brontes

No Mod Cluster Manager em http192168238186

mod_cluster-manager jaacute estatildeo as duas instacircncias

Para testar o Balanceamento vamos fazer o deploy da

aplicaccedilatildeo SystemProps que pode ser baixada http

googlyjynK Para fazer o deploy conecte do domain

controller utilizando o CLI

[jbosslocalhost jboss]$ sudo jboss-as-711Final

binjboss-clish -c controller=1921682381869999

[domain1921682381869999 ] deploy tmp

systempropswar --server-groups=apps

A aplicaccedilatildeo foi deployada para as instacircncias do server

group apps Acesse a url do balanceador e verifique

se a aplicaccedilatildeo estaacute disponiacutevel

http192168238186systemprops

JBOSS APLICATION SERVER 7

A PROGRAMAR

27

Perceba que estamos na instance-one Entatildeo para

testarmos o funcionamento do balanceamento de carga

vamos parar a Instacircncia instance-one e quando

tentarmos um novo acesso seraacute redirecionado para o

instance-two

No CLI execute o seguinte comando para parar o

instance-one

[domain1921682381869999 ] host=host01server -

config=instance-onestop

outcome =gt success

result =gt STOPPING

Acesse novamente a aplicaccedilatildeo http192168238186

systemprops

Perceba que agora estamos no instance-two Concluiacutemos assim que o balanceamento de carga estaacute funcionando

Conclusatildeo

O JBoss AS 7 trouxe a evoluccedilatildeo arquitetural que era esperada como pode ser vista nesse artigo Carregamento de moacutedulos dinacircmico gerenciamento centralizado e tempo de startup reduzido satildeo apenas

algumas das inuacutemeras melhorias trazidas nessa versatildeo

Espera-se que a plataforma JBoss continue evoluindo

trazendo sempre mais benefiacutecios a todos que utilizam

os produtos desse ecossistema Cada membro da

comunidade tambeacutem pode fazer a sua parte seja

colaborando com artigos ou participando de

discussotildees para encontrar melhorias para a

plataforma Cabe a noacutes aceitar o convite de melhorar

cada vez mais essa tecnologia

JBOSS APLICATION SERVER 7

AUTOR Escrito por Mauricio Magnani Jr

Consultor JBoss com 6 anos de experiecircncia no mercado Trabalhou na RedHat como Engenheiro de Suporte JBoss atenden-

do clientes da Ameacuterica Latina e EUA Criador e mantenedor do blog httpsjbossdiverswordpresscom e membro ativo do

Grupo de Usuaacuterios JBoss do Brasil Hoje eacute Senior Java Software Engineer no Groupon Brasil Possui as certificaccedilotildees Red Hat

Certified JBoss Administrator on JBoss EAP 5 e JBoss EAP 6

Milhares de apli-

cativos para Web

e Mobile satildeo desenvol-

vidos a cada mecircs utili-

zando esta plataforma

como base A platafor-

ma Java mudou muito

desde seu iniacutecio e pro-

vavelmente vai conti-

nuar evoluindo nos

proacuteximos anos

A PROGRAMAR

28

Para o desenvolvimento de aplicaccedilotildees Web existem um sem

nuacutemero de frameworks gratuitas e mais ou menos bem con-

ceituadas Contudo temos vaacuterios problemas associados que

com o crescer de uma aplicaccedilatildeo podem trazer vaacuterios recuos

no seu desenvolvimento Um dos maiores eacute o oacutebvio satildeo

gratuitas e por isso mesmo o coacutedigo eacute lido por milhares de

pessoas em todo o mundo tornando as falhas de seguranccedila

bastante visiacuteveis e faacuteceis de explorar Outro grande proble-

ma eacute o facto de trazerem funcionalidades especiacuteficas em que

muitas vezes natildeo as usamos tornando-se em alguns casos

um ldquocanhatildeo para matar um mosquitordquo Pegando na aborda-

gem das correntes frameworks podemos noacutes proacuteprios cons-

truir algo soacutelido o suficiente para uma grande aplicaccedilatildeo

Vamos nesta seacuterie de trecircs artigos construir uma framework

passo-a-passo comeccedilando pelo baacutesico mas o mais importan-

te o routing

htaccess

Tirando partido do serviccedilo Apache delegamos o enclausura-

mento do nosso sistema de ficheiros agrave regras htaccess Natildeo

permitimos a listagem de ficheiros nem a execuccedilatildeo de outros

scripts PHP agrave excepccedilatildeo do indexphp sendo este o respon-

saacutevel pelo routing da framework Para garantirmos que estas

regras satildeo cumpridas e que o indexphp seja sempre chama-

do redireccionamos todos os pedidos de execuccedilatildeo de

scripts para o mesmo indexphp dando-lhe todos os argu-

mentos do URL originalmente fornecidos Desta forma o

utilizador natildeo sabe a que ficheiros ou pastas estaacute a aceder

A esta regra temos de adicionar uma excepccedilatildeo a pasta con-

tent onde temos todos os conteuacutedos como imagens ficheiros

CSS viacutedeos etc No fundo todos aqueles ficheiros que o

browser do utilizador vai descarregar Para mantermos o

enclausuramento da nossa aplicaccedilatildeo natildeo eacute aconselhado

natildeo colocarmos nessa pasta nenhum tipo de script visto que

pode ser executado arbitrariamente do exterior o contraacuterio

do que queremos

configphp

PHP Uma framework ldquofrom scratchrdquo (Parte 1) Usaremos este ficheiro como auxilio para definiccedilotildees de cami-

nhos para pastas e configuraccedilotildees por defeito

define(DS DIRECTORY_SEPARATOR)

Esta definiccedilatildeo eacute uma redundacircncia eacute definida simplesmente

por conveniecircncia na escrita do coacutedigo

define(BASE_PATHhttplocalhost)

Aqui definimos o caminho URL para a nossa aplicaccedilatildeo

define(DEFAULT_PAGEhello)

Esta eacute a nossa paacutegina por defeito caso nenhuma tenha sido

requirida

define(ROOT$_SERVER[DOCUMENT_ROOT])

Aqui eacute definido o caminho para a pasta da aplicaccedilatildeo

Uma vez definidas as configuraccedilotildees passamos agrave parte mais

importante o routing

Visto que temos todos os requests redireccionados para o

indexphp agora temos de fazer sentido dos argumentos

que satildeo passados pelo URL

Aqui separamos os argumentos em duas partes a paacutegina

que queremos aceder e os argumentos para esta paacutegina O

seguinte pedido

httplocalhosthellofoobar

resulta em

RewriteEngine on RewriteCond $1 ^(allowphp|indexphp|content) RewriteRule ^()$ indexphp$1 [L] ltFiles htaccessgt order allowdeny deny from all ltFilesgt

define(DS DIRECTORY_SEPARATOR) define(BASE_PATHhttplocalhost) define(DEFAULT_PAGEhello) define(ROOT$_SERVER[DOCUMENT_ROOT])

function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url

array (size=2) page =gt string hello (length=5) args =gt array (size=2) 0 =gt string foo (length=3) 1 =gt string bar (length=3)

A PROGRAMAR

29

(hellip)micro-

framework temos um

sistema de routing que

nos iraacute permitir nos

dois proacuteximos artigos

alargar os horizontes

passando a uma pro-

gramaccedilatildeo OOP e imple-

mentando MVC

De seguida encaminhamos para a paacutegina requerida

Aqui verificamos se a paacutegina que eacute pedida existe no case de

existir importamos o ficheiro caso contrario enviamos o header

de erro e terminamos a aplicaccedilatildeo

Indexphp

ROOT

Indexphp

Configphp

htaccess

Pages

Hellophp

Com esta micro-framework temos um sistema de routing que

nos iraacute permitir nos dois proacuteximos artigos alargar os horizon-

tes passando a uma programaccedilatildeo OOP e implementando

MVC Finalmente iremos implementar um pequeno driver

para MySQL e um debugger

Dependecircncias

Apache com mod_rewrite e PHP

P VS NP COMPREENDER O MAIOR PROBLEMA POR RESOLVER EM COMPUTACcedilAtildeO

function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

ltphp require_once (configphp) function routeURL() $urlArray = array() $urlArray = explode($_SERVER [REQUEST_URI]) array_shift($urlArray) $url = array() if (isset($urlArray[0]) || $urlArray[0]==) $url[page] = DEFAULT_PAGE $url[args] = array() else $url[page] = $urlArray[0] array_shift($urlArray) if(count($urlArray)gt0) $url[args] = $urlArray else $url[args] = array() return $url function callHook() $queryString = array() $url = routeURL() $page = $url[page]php if ( file_exists(pages DS $page) ) include_once(pages DS $page) else header(HTTP10 404 Not Found) exit

callHook() gt

AUTOR

Escrito por Ricardo Perre

Estuda Eng da Computaccedilatildeo Graacutefica e Multimeacutedia no Instituto Politeacutecnico de Viana do Castelo eacute programador focado em

web tendo bastante experiencia em PHP Foca-se em aplicaccedilotildees e escalonamento das mesmas Caso se resumisse seria

descobrir inventar e fazer

COLUNAS C - Observable vs Task

Visual (Not) Basic - Operator Overloading

C

32

Nas ediccedilotildees anteriores vimos como transformar uma API

baseada assiacutencrona em eventos numa API baseada em ob-

servaacuteveis (observables) ou numa API baseada em tarefas

A questatildeo que se levanta eacute quando usar qual

Quando Usar Observaacuteveis

A programaccedilatildeo baseada em observaacuteveis eacute tambeacutem conheci-

da como programaccedilatildeo reativa e comeccedilou a ser usada como

alternativa a assiacutencrona baseada em eventos porque a pro-

gramaccedilatildeo assiacutencrona baseada em tarefas ainda natildeo estava

disponiacutevel (ou natildeo estava disponiacutevel em todas as platafor-

mas)

Na verdade o campo de batalha da programaccedilatildeo reativa

satildeo as correntes de eventos (event streams) Eacute aqui que a

utilizaccedilatildeo de eventos se torna tambeacutem mais natural

Uma API baseada em eventos em que o evento apenas eacute

disparado uma vez eacute na verdade uma API baseada em

chamadas de resposta (callback) O facto de ser implemen-

tada com o mecanismo de eventos da plataforma NET natildeo

faz dela uma API baseada em eventos

A existecircncia da necessidade de combinar vaacuterias correntes de

eventos e relacionaacute-los entre si eacute tambeacutem uma boa indicaccedilatildeo

para a utilizaccedilatildeo de observaacuteveis

Quando Usar Tarefas

Como o nome indica uma tarefa eacute algo que tem um iniacutecio e

um fim Assim sendo todas as API assiacutencronoas baseadas

num mecanismo de chamada de resposta (callback) satildeo

candidatadas a ser transformadas numa API assiacutencrona

baseada em tarefas Mesmo que o mecanismo de chamada

de resposta sejam eventos NET

Matriz De Aplicabilidade

Baseando-nos nas consideraccedilotildees anteriores e porque nem

sempre tudo eacute assiacutencrono chegamos agrave seguinte matriz de

aplicabilidade

Conclusatildeo

No final natildeo existe uma resposta maacutegica O que numa situa-

ccedilatildeo pode ser um observaacutevel noutra pode ser uma tarefa

Recursos

O GeoCoordinateWatcher Como Um Serviccedilo Reativo - Re-

vista PROGRAMAR - 39ordf Ediccedilatildeo - Fevereiro 2013

Trazendo Async E Await ao Serviccedilo de Contactos do Win-

dows Phone - Revista PROGRAMAR - 40ordf Ediccedilatildeo - Abril

2013

Extensotildees Reativas (Rx)

Programaccedilatildeo assiacutencrona com async e await (C e Visual

Basic)

C - OBSERVABLE VS TASK

Siacutencrono Assiacutencrono

Um uacutenico valor - Tarefa

Muacuteltiplos valo-

res

Enumeraacutevel Observaacutevel

AUTOR

Escrito por Paulo Morgado

Bacharel em Engenharia Electroacutenica e Telecomunicaccedilotildees (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa

e Licenciado em Engenharia Informaacutetica pela Faculdade de Ciecircncias e Tecnologia da Universidade Nova de Lisboa exerce

variadas funccedilotildees relacionadas com o desenvolvimento distribuiccedilatildeo e manutenccedilatildeo de software haacute mais de 10 anos Participa

em diversas comunidades nacionais e internacionais (pontoNETpt NetPonto SharePointPT SQLPort Portugal-a-Programar

CodeProject CodePlex etc) Pelo seu contributo para com estas comunidades a Microsoft premeia-o com o preacutemio MVP

(C) desde 2003 Eacute ainda co-autor do livro ldquoLINQ Com Crdquo da FCA httpPauloMorgadoNET - PauloMorgado

o campo de bata-

lha da programaccedilatildeo re-

ativa satildeo as correntes

de eventos (event stre-

ams)

VISUAL (NOT) BASIC

33

ldquoNatildeo podes somar batatas com elefantesrdquo

Frases como a anterior ou semelhantes jaacute vos passaram

por a consideraccedilatildeo em alguma altura da vossa vida Quer

tenha sido nos vossos primeiros passos a matemaacutetica ou

ainda na semana passada em qualquer implementaccedilatildeo de

software mais rebuscada algueacutem algures transmitiu dessa

forma que natildeo eacute possiacutevel operar aquelas duas variaacuteveis

De facto batatas e elefantes natildeo satildeo tipicamente operaacuteveis

a menos que a resposta de que estamos agrave procura seja dife-

rente

Saber como operar

A soluccedilatildeo da soma de batatas com elefantes reside precisa-

mente na resposta que procuramos obter

Eu posso dizer que Elefante + Batata eacute igual a 4 se for es-

pecificado que a soma de seres-vivos opera aritmeticamente

o nuacutemero de pernas do ser Natildeo posso Claro que posso

Soacute precisamos de definir que os seres-vivos satildeo operaacuteveis

assim e de que forma Eacute aqui que entra o ldquooverloadrdquo de ope-

radores

Operadores

Operadores sim Quando se falam de operadores referem-

se todos aqueles que estatildeo provavelmente a passar-vos na

cabeccedila agora tanto unaacuterios como binaacuterios mas nem todos

Unaacuterios + - Not IsTrue IsFalse CType

Binaacuterios + - amp Like Mod And Or Xor ^ ltlt

gtgt = ltgt gt lt gt= lt=

Estes operadores fazem sentido nos usos comuns onde jaacute

sabemos para que servem e que resultados vatildeo surtir

Agrave luz da especificaccedilatildeo anterior podemos afirmar com segu-

ranccedila que Elefante gt Batata porque uma batata natildeo tem

pernas e porque conhecemos o operador gt (maior que)

A implementaccedilatildeo do operador pode basear-se em qualquer

aspecto dos seus operandos mas natildeo eacute boa ideia contradi-

zer a loacutegica do operador que se estaacute a definir Por razotildees

oacutebvias natildeo eacute boa ideia por exemplo implementar overloads

de tal forma que Batata - Elefante = -4 ao mesmo tempo que

Batata gt Elefante = TRUE Natildeo faz sentido porque natildeo esta-

mos a usar o mesmo criteacuterio Se Batata ndash Elefante eacute menor

que zero a Batata deveria ser menor que o Elefante e natildeo o

contraacuterio

Natildeo eacute que seja impossiacutevel mas vai tornar o coacutedigo muito

mais difiacutecil de ler o que vai contra a facilidade do overload

de operadores

Overload

A ideia natildeo eacute inventar novos operadores O que queremos

realmente indicar eacute qual o procedimento a seguir para conse-

guir aplicar o anaacutelogo do operador para determinado tipo ou

determinados tipos Assim o operador + por exemplo teraacute

de continuar a fazer sentido na aritmeacutetica ao mesmo tempo

que faz sentido na soma de seres-vivos se tentarmos somar

nuacutemeros entra o operador aritmeacutetico se tentarmos somar

batatas com elefantes entra a nossa implementaccedilatildeo do ope-

rador

Portanto e em tom de resumo da mesma forma que defini-

mos overloads de meacutetodos tambeacutem se definem overloads

de operadores com base na sua assinatura

Jaacute chega de elefantes e batatas natildeo

Efectivamente jaacute Natildeo conveacutem esticar a analogia ateacute porque

nem todos os operadores fazem sentido com uma classe de

seres vivos As coisas comeccedilam a ficar mais claras com

exemplos de implementaccedilatildeo

Vamos considerar a seguinte classe para exemplificar

Como seraacute de esperar se tentarmos por exemplo comparar

instacircncias desta classe o Visual Basic natildeo saberaacute o que

fazer para comparar Eacute um tipo composto que compreende

OPERATOR OVERLOADING

Public Class Veiculo Public Enum TipoVeiculo AUTOMOVEL MOTO PESADO End Enum Public Enum TipoCombustivel GASOLINA GASOLEO HIBRIDO ELECTRICO GPL End Enum Public Property Tipo As TipoVeiculo Public Property Marca As String Public Property Modelo As String Public Property Cilindrada As Integer Public Property Combustivel As TipoCombustivel Public Property NumeroPortas As Short Sub New(Tipo As TipoVeiculo Marca As String Modelo As String Cilindrada As Integer Combustivel As TipoCombustivel NumeroPortas As Short) _Tipo = Tipo _Marca = Marca _Modelo = Modelo _Cilindrada = Cilindrada _Combustivel = Combustivel _NumeroPortas = NumeroPortas End Sub End Class

VISUAL (NOT) BASIC

34

membros que noacutes mesmos criamos e seria impossiacutevel perce-

ber automaticamente quais as caracteriacutesticas a comparar

Este coacutedigo natildeo compila com dois erros em Carro1 = Carro2

e Carro2 = Carro3

Operator = is not defined for types OperatorOverloadVeicu-

lo and OperatorOverloadVeiculo

E tem toda a razatildeo O operador igual (=) natildeo estaacute nem im-

plementado na classe nem tem nenhum overload que im-

plique uma operaccedilatildeo binaacuteria com dois tipos Veiculo

Vamos entatildeo implementar um operador para o igual (=) que

consiga determinar se estamos na presenccedila do mesmo

veiacuteculo ou natildeo Vamos considerar que a cilindrada natildeo eacute um

factor para distinguir dois carros

Basta acrescentar os seguintes meacutetodos na classe Veiculo

Algumas implementaccedilotildees de operadores implicam que se

implementem tambeacutem a sua negaccedilatildeo No caso do operador

igual (=) eacute necessaacuterio natildeo soacute especificar o que eacute consider-

ado igual mas tambeacutem o que eacute considerado diferente

Assim o coacutedigo anterior jaacute eacute correctamente compilado e

produz o seguinte output

Carro1 = Carro2 False

Carro2 = Carro3 True

O que eacute verdade Como operaccedilotildees aritmeacuteticas natildeo faziam

muito sentido com uma classe a representar um veiacuteculo

vamos considerar esta nova classe

Esta classe representa um vector tridimensional Manteacutem um

valor para X para Y e para Z Natildeo adianta realizar

operaccedilotildees aritmeacuteticas com o Vector uma vez que novamen-

te o Visual Basic natildeo saberia o que fazer com ele

Vamos entatildeo acrescentar alguns operadores

Assim jaacute eacute possiacutevel efectuar algumas operaccedilotildees com esta

classe

OPERADOR LIKE

Public Shared Operator =(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return False If V1Combustivel ltgt V2Combustivel Then Return False If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return False If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return False If V1NumeroPortas ltgt V2NumeroPortas Then Return False Return True End Operator Public Shared Operator ltgt(V1 As Veiculo V2 As Veiculo) If V1Tipo ltgt V2Tipo Then Return True If V1Combustivel ltgt V2Combustivel Then Return True If Not V1MarcaToLowerEquals (V2MarcaToLower) Then Return True If Not V1ModeloToLowerEquals (V2ModeloToLower) Then Return True If V1NumeroPortas ltgt V2NumeroPortas Then Return True Return False End Operator

Public Class Vector3 Public Property X As Decimal Public Property Y As Decimal Public Property Z As Decimal Sub New(X As Decimal Y As Decimal Z As Decimal) _X = X _Y = Y _Z = Z End Sub Public Overrides Function ToString() As String Return StringFormat((012) _X _Y _Z) End Function End Class

Public Shared Operator +(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X + V1X V2Y + V1Y V2Z + V1Z) End Operator Public Shared Operator -(V1 As Vector3 V2 As Vector3) Return New Vector3(V2X - V1X V2Y - V1Y V2Z - V1Z) End Operator Public Shared Operator (V1 As Vector3 V2 As Vector3) Return (V2X V1X) + (V2Y V1Y) + (V2Z V1Z) End Operator Public Shared Operator (V1 As Vector3 E1 As Decimal) Return New Vector3(E1 V1X E1 V1Y E1 V1Z) End Operator Public Shared Operator amp(S1 As String V1 As Vector3) Return S1 amp V1ToString End Operator

Dim V1 As New Vector3(3 2 1) Dim V2 As New Vector3(1 2 3) DebugWriteLine(Adiccedilatildeo amp (V1 + V2)) DebugWriteLine(Subtraccedilatildeo amp (V1 - V2)) DebugWriteLine(Produto escalar amp (V1 V2)) DebugWriteLine(Multiplicaccedilatildeo com escalar amp (V2 3))

Dim Carro1 As New Veiculo(AUTOMOVEL Ford Ka 1249 GASOLINA 3) Dim Carro2 As New Veiculo(AUTOMOVEL Ford Ka 1250 GASOLEO 3) Dim Carro3 As New Veiculo(AUTOMOVEL Ford Ka 1251 GASOLEO 3) DebugWriteLine(Carro1 = Carro2 amp (Carro1 = Carro2)) DebugWriteLine(Carro2 = Carro3 amp (Carro2 = Carro3))

VISUAL (NOT) BASIC

35

O que produz

Adiccedilatildeo (444)

Subtraccedilatildeo (-202)

Produto escalar 10