Você está na página 1de 27

<2>

editorial
ndice
3
4
10
13
14
24

notcias/links
tema de capa
- Metaprogramao em
C++
a programar
- Processamento de texto
em AWK, Parte 2
- DEI@Academy
- Google Web Toolkit,
Parte 2
electrnica
- Arduino e Aquisio de
Dados
equipa PROGRAMAR
coordenadores
Joel Ramos
Pedro Abreu
editor
Antnio Silva
capa
Maurcio Rodrigues
redaco
Cristian Gonalves
Fbio Ferreira
Fbio Pedrosa
Francisco Almeida
Nuno Santos
equipa de reviso
Bruno Oliveira
Fernando Martins
Miguel Rentes
Nuno Joo
equipa de divulgao
David Ferreira
contacto
revistaprogramar
@portugal-a-programar.org
website
www.revista-programar.info
issn
1647-0710
Como fazer uma montanha andar?
O Departamento de Cincia de Computadores da Faculdade de Cincias da
Universidade do Porto (DCC-FCUP) recebeu, a 29 de Maio, a final das Olimpadas
Nacionais de Informtica (ONI). Realizadas em Portugal desde 1989, so a mais
representativa competio para alunos do secundrio e nesta final que se inicia
tipicamente o processo de seleco da delegao portuguesa para as Olimpadas
Internacionais de Informtica (IOI), a realizar em Agosto. Nos ltimos anos, seguiu-se
s ONI um estgio para os alunos seleccionados, de forma a prepar-los para o nvel
competitivo que encontram nas IOI e concluir a seleco dos alunos, escolhendo-se os
quatro melhores para a prova internacional.
Este ano, a prova foi organizada sob circunstncias excepcionais. A Caixa Geral de
Depsitos, principal patrocinador em edies anteriores, retirou-se. Seguiu-se ento a
procura de novos apoios, mas apesar do esforo por parte da organizao, os
patrocinadores encontrados no devem substituir a ajuda financeira com que a Caixa
Geral de Depsitos contribua, o que conduz situao actual. A reduo dos recursos
fez j uma grande vtima - no haver estgio para os seleccionados, pelo menos nos
moldes habituais - mas ameaa tambm a prova internacional, existindo a
possibilidade de Portugal no poder apresentar nas IOI a totalidade dos concorrentes
seleccionados.
Torna-se, desta vez, ainda mais difcil conseguir os to ansiados resultados, ainda para
mais competindo contra concorrentes com anos de preparao. certo que os tempos
so de crise e a deciso da Caixa Geral de Depsitos no pode ser condenada; sabe-se
tambm que a informtica no um dos mais privilegiados sectores na educao e as
ONI ainda so tidas por muitos em menor considerao que as mais nobres Olimpadas
da Matemtica e, eventualmente, da Fsica. definitivamente condenvel, no entanto,
que se tenha atingido uma situao destas, ao ponto de estar em risco a participao
nas IOI de alguns dos alunos apurados e de no se assegurarem condies
minimamente competitivas de preparao para o nvel internacional. Alguma empresa
ir, no futuro, absorver cada um destes jovens programadores e, de certa forma,
beneficiar da sua experincia nesta vertente. Porque no investir ento na sua
preparao, porque no suportar a escalada dos concorrentes portugueses rumo s to
longnquas mas to atingveis medalhas nas IOI?
Em primeiro lugar, h que melhorar a visibilidade dada aos patrocinadores. Ter um
grande logtipo no site, nas t-shirts e no local da final no , na verdade, um grande
retorno publicitrio para um bom patrocnio, pelo que apoiar o evento no se revela
claramente vantajoso para as empresas. O actual palmars portugus nas IOI tambm
no melhora a situao, o que nos traz a inevitvel relao recursos-resultados. A falta
de resultados pode diminuir os apoios, principalmente a nvel financeiro, mas a falta de
apoios impede uma boa preparao e limita os desempenhos dos concorrentes,
acabando por amputar as suas ambies. perfeitamente previsvel que um bom
investimento inicial abriria caminho a uma srie de bons resultados, e essa srie de
bons resultados traria definitivamente mais visibilidade aos patrocinadores,
principalmente atravs da comunicao social. O que falta s esse mesmo
investimento. E enquanto no houver algum capaz de o perceber, enquanto a
vontade de obter resultados por parte dos concorrentes e o nvel de preparao a que
so sujeitos se mantiverem to distantes, igualmente distantes continuaro os
resultados. No s nas IOI, no s nas competies; tudo isto se aplica na construo
de um futuro e de uma sociedade capaz de ambicionar sempre o prximo passo. Por
esse futuro esperamos.
Pedro Abreu
<3>
notcias/links
Lanamento do Clojure 1.0
http://clojure.blogspot.com/2009/05/clojure-10.html
Course | Programming Methodology
Metodologia de Programao uma introduo
engenharia de aplicaes informticas com nfase em
princpios modernos de engenharia de software: orientao
a objectos, estruturao, encapsulamento, abstraco e
testes. Usa-se a linguagem Java, com destaque para um
bom estilo de programao e para o uso das funcionalidades
presentes na linguagem.
http://www.youtube.com/view_play_list?p=84A56BC7F
4A1F852
Google AJAX Libraries API
http://code.google.com/intl/pt-PT/apis/ajaxlibs/
Prximos eventos
Carnegie Mellon Portugal Summer Academy
2009
http://www.cmuportugal.org/summeracademy/
Olimpadas Nacionais de Informtica 2009
3 dos 4 finalistas que podero representar Portunal
nas International Olympiad in Informatics (IOI) so membros
do P@P, sendo que 1 deles um dos coordenadores desta
revista, e outro um redactor.
http://www.dcc.fc.up.pt/oni/2009/
<4>
Metaprogramao em
C++
Introduo
Toda a gente que conhece minimamente a linguagem C++ j
ouviu falar em templates. O conceito inovador de template
foi oficialmente introduzido no standard de implementao
em 1998 e trouxe uma lufada de ar fresco, tanto ao C++,
como a um nmero de outras linguagens mais recentes (por
exemplo, tambm linguagens como o Java ou C# foram
enriquecidas com as suas prprias tcnicas de programao
genrica). Neste artigo, iremos rever os templates, bem
como as suas propriedades, e explorar algumas das
possibilidades raramente consideradas com templates.
O que so e o que fazem templates
O verdadeiro potencial dos templates que nem sempre foi
evidente. Mas isso mudou com o tempo. Em primeiro lugar,
vejamos com o prximo exemplo, uma utilizao clssica de
templ ates, com base nas suas capaci dades de
parametrizao.
O que est em cima so dois tpicos exemplos de livro
terico de templates de funes e respectivas instanciaes.
Essencialmente, o que um template faz permitir escrever
uma funo de forma parametrizada, isto , antes de saber
de que tipo so as variveis envolvidas. Isto bastante til
no senti do em que de uma s vez se garanti u a
implementao das funes max e sqr para qualquer tipo de
varivel (a varivel genrica T). de salientar outra
caracterstica importante dos templates: o seu mecanismo
de instanciao. Um template de uma funo no uma
funo, mas um prottipo. Isto , o compilador verifica a
sintaxe, mas ignora a validade lgica de um template. Isto
at que o template seja chamado no cdigo. Por exemplo, a
funo max no existe em parte alguma do cdigo antes de
ser instanciada ao chamarmos max<int>. E novamente, ao
chamarmos max<double>. Ou seja, o compilador tomou o
prottipo da funo max e de cada vez que o programador
pediu uma nova forma da funo, utilizou-o para criar uma
nova funo max em overload. Como devem ter reparado,
podemos chamar max<double> sem especificar o tipo
double, porque o compilador capaz de deduzir que verso
do template deve ser usada a partir dos argumentos da
funo. Apenas exigimos para esta funo que ambos os
argumentos sejam do mesmo tipo T.
Para alm de templates de funes, existem templates de
classes. E, similarmente, cumprem a mesma tarefa que os
templates de funes: permitem declarar uma classe de
forma genrica. A classe genrica Sequencia implementada
neste exemplo revela a sintaxe a que poderamos recorrer
para parametrizar uma classe em funo do tipo de varivel
do contedo.
tema de capa
template<class T = double>
class Sequencia
{
private:
long quant;
T *p;
public:
Sequencia(const long n = 10)
{ quant = n; p = new T[n]; }
virtual Sequencia()
{ delete[] p; }
};
...
Sequencia<double> s1;
Sequencia<unsigned long> s2;
Sequencia s3; // Instanciao
automtica a double
Sequencia<Sequencia> s4; // possvel
template<class T>
T max(const T &a, const T &b)
{ return a > b ? a : b; }
template<class T>
T sqr(const T &a)
{ return a*a; }
...
int n = 2, m = 5;
max<int>(n,m); // Devolve 5
double x = 0.67, y = 2.71828;
max(x,y); // Devolve 2.71828
int r = 12;
sqr(r); // Devolve 144
<5>
O que este template de classe tem de interessante o valor
automtico para o tipo. Isto quer dizer que se omitirmos o
parmetro de tipo na declarao do template, o compilador
seguir a indicaco dada de que por omisso, o contedo
do tipo double. Outro pormenor interessante que at
possvel criar um objecto Sequencia de objectos Sequencia.
Tal a flexibilidade dos templates.
Propriedades dos templates
At agora, no temos visto nada de especial, a no ser uma
funcionalidade que at pode vir a dar jeito para certos tipos
de funes e estruturas. agora altura de reflectir sobre as
propriedades dos templates:
Aceitam como parmetros tipos genricos (class ou
typename), apontadores para funes, ou constantes literais
inteiras ou booleanas (ou seja, desde que o valor seja
conhecido aquando da compilao).
Ao serem instanciados, os parmetros-tipo so
verificados contra o cdigo utilizado.
Podem utilizar qualquer nmero de parmetros, e
estes podem ser deduzidos.
Podem ser instanciados recursivamente.
Estas propriedades so muito interessantes. Na prtica, um
mecanismo de instanciao que permite utilizar valores
inteiros, e ainda para mais, recursivamente, o mesmo que
uma linguagem de programao em si. Este resultado abre
portas a uma infinidade de possibilidades: o mecanismo de
instanciao dos templates funcionalmente similar a uma
mquina de Turing. Por outras palavras, os templates podem
levar um compilador de C++ a comportar-se como um
interpretador! Isto demonstrar-se- na prxima seco.
Um primeiro metaprograma
Sabendo agora que um template tambm aceita inteiros
(ateno, constantes literais) como parmetro, e sabendo da
sua recursividade, vamos experimentar um pouco o conceito
de metaprogramao fazendo o compilador calcular o
factorial de um nmero.
O aspecto interessante neste exemplo que uma vez
compilado o cdigo, o mtodo esttico Factorial<6>::valor()
no faz qualquer chamada a funes, e limita-se a devolver a
constante 720. O compilador instanciou 6 classes
Factorial<N>, uma para cada valor de N. Cada classe forou o
compi l ador a cri ar a cl asse de ordem i nferi or,
decrementando o N sucessivamente at ltima
especializao Factorial<1>. Durante a compilao, os
valores N, N-1, , 1 so sucessivamente multiplicados
dando finalmente origem ao valor 720 como uma constante
literal. O factorial calculado durante a compilao.
Aplicaes de templates
Sejamos sinceros, por muito engraado que seja coagir o
compilador a calcular um factorial ou a gerar nmeros
primos, bvio que faz-lo no compilador no tem grande
utilidade prtica. Nesse caso, perguntar-se-o muitos, para
que mais serviro templates, afinal? Como possvel prever
no exemplo dado anteriormente, um template de uma
classe ou estrutura pode ser tratado como um programa que
gera cdi go durante a compi l ao. Atravs da
especializao, por exemplo possvel criar classes cuja
implementao depende da plataforma ou de um parmetro
do sistema, de uma forma mais elegante que utilizando
macros: ao invs de se limitarem a fazer substituio de
texto, os templates passam argumentos e verificam os tipos.
tema de capa
template<typename T, bool Windows_Vista>
class AMinhaClasse
{
private:
T _idAlgumaCoisa
public:
...
};
// As especializaes verificam a
verso:
template<typename T>
class AMinhaClasse<T,true>
{
private:
T _idAlgumaCoisa
public:
const bool Especifico()
{ return 1; }
};
...
Factorial<6>::valor();
// Devolve 6! (ou seja, 720)
template<int N>
class Factorial
{
public:
static inline int valor()
{ return N*Factorial<N-
1>::valor(); }
};
// Isto uma especializao:
template<>
class Factorial<1>
{
public:
static inline int valor()
<6>
tema de capa
Olhando para este pedao de cdigo, que possvel obter o
mesmo comportamento com macros de #if, podemo-nos
perguntar quanto sua relevncia. Ora bem, a verdade a
instanciao de AMinhaClasse at consultou uma macro
para saber que especializao usar mas por outro lado, a
parametrizao em T certifica-se de que a classe no ser
compilada no executvel a no ser que seja utilizada, e
simultaneamente, quando esta for compilada, a
implementao propcia ao sistema ser escolhida. Mas
pensemos ainda em melhores exemplos do uso de
parmetros que no so tipos: e se eu tivesse por exemplo
em mente uma classe de buffer genrico, que faz converso
automtica, em funo do tamanho do tipo de varivel que
recebe? Poderamos por exemplo, ter uma classe que utiliza
uma s i nt a x e s e me l ha nt e a a l go c omo
OMeuBuffer<char,sizeof(double)>.
A propsito deste ltimo exemplo, esta tcnica, de tornar
classes transparentes aos tipos utilizados tem um nome:
traits. Normalmente, uma trait envolve uma converso ou
um typedef para tornar o cdigo do programador de uma
classe completamente agnstico dos tipos utilizados e
devolvidos. Outro conceito til de metaprogramao o de
policies. Similarmente a uma trait, uma policy filtra o cdigo
em funo dos tipos utilizados, mas neste caso, faz uma
deciso de que algoritmo usar. Imaginemos o exemplo
seguinte que refina a nossa anterior classe Sequencia com
uma policy:
{
// Cdigo especfico para
Vista...
// ... ou 7, claro ;)
}
};
template<typename T>
class AMinhaClasse<T,false>
{
private:
T _idAlgumaCoisa
public:
const bool Especifico()
{
// Cdigo genrico para XP...
}
};
...
// Em qualquer verso de Windows:
const bool is_vista = (VERSAO_WIN >=
6);
// Isto compila se is_vista
constante!
AMinhaClasse amc<long,is_vista>;
amc.Especifico();
Note-se que, se s se tivesse utilizado a primeira ou a
segunda instncia de OutraSequencia, um dos algoritmos
teria sido excluido da prpria compilao. Neste caso, o
interessante ver como uma classe se pode assim adaptar a
diversas condies, sem interferir no cdigo do
programador. claro que fcil imaginar exemplos muito
melhores, como por exemplo, aplicaes em singletons, mas
a ideia tornar claro como os templates so uma valiosa
ferramenta para construir bibliotecas, da qual um bom
exemplo a Standard Template Library. Algumas aplicaes
avanadas de templates fazem parte da implementao de
apontadores inteligentes (tradicionalmente, este tipo de
classe tem uma designao com o sufixo _ptr). Apontadores
template<typename T, bool
Is_Small=true>
struct EscolheAlgoritmo
{
static void sort(T *p)
{
... // Fazer um InsertionSort
}
};
template<typename T>
struct EscolheAlgoritmo<T,false>
{
static void sort(T *p)
{
... // Fazer um QuickSort
}
};
template<int N, class T = double>
class OutraSequencia
{
private:
T *dados;
...
public:
void sort()
{

EscolheAlgoritmo<T,(N<20)>::sort(dados)
;
}
...
};
...
// Depois, uma questo de usar com:
OutraSequencia a<15,double>;
OutraSequencia b<30,char>;
a.sort(); // Faz um InsertionSort
b.sort(); // Faz um QuickSort
<7>
O que se passa com este cdigo que, enquanto o operador
torna a sintaxe agradvel ao programador, esta operao
extremamente ineficiente! A primeira alternativa corre pelo
menos trs ciclos for e cria pelo menos dois vectores
temporrios. Torna-se prefervel escrever o ciclo
explicitamente! Ou seja, seria interessante convencer o
compilador a gerar um nico ciclo for, com um nico vector
temporrio na pior das hipteses, independentemente do
nmero de termos somados. Vejamos esta soluo atravs
da aplicao de templates
inteligentes so apontadores que fazem a sua prpria
gesto de memria, e como tal, utilizam combinaes de
traits e policies para determinar o seu comportamento em
determinadas situaes. Desta forma, ajudam a impedir
bastantes erros subtis no cdigo. Utilizando templates, h
diferentes tipos de ponteiros inteligentes: alguns probem a
cpia, outros incluem tcnicas de reference counting. Os
apontadores podem ser origem de muitas dores de cabea,
e toda a ajuda pouca!
Uma grande poro das aplicaes de templates cai na rea
da computao numrica. Em clculo numrico, os
templates ajudam a reduzir redundncias de cdigo,
minimizando chamadas a mtodos virtuais e removendo
ambiguidades (atravs do clebre Barton-Nackman trick,
em que uma classe base recursivamente parametrizada
em funo das derivadas). No que diz respeito a clculo, o
exemplo mais interessante, contudo, so os templates de
expresses. Estes requerem alguma prtica e envolvem
alguma complexidade. Como tal, mais razovel dar apenas
um curto exemplo do que templates de expresses fazem
sem entrar em detalhes, antes de concluir esta discusso.
Imaginemos, portanto, uma tpica classe de vector, e um
operator+ global que soma dois objectos da mesma classe
usando um ciclo for.
tema de capa
template<typename T>
class Vector
{
...
};
template<typename T>
const Vector<T>& operator+
(const Vector<T> &a,
const Vector<T> &b)
{
const int s = a.size();
Vector temp(s);
for(int i = 0; i < s; ++i)
a[i] + b[i];
return temp;
}
...
Vector<double> a,b,c,d;
...
d = a + b + c; // usando o operador
...
for(int i = 0; i < d.size(); ++i) //
metodo a la C
d[i] = a[i] + b[i] + c[i];
template<typename T>
class Vector
{
private:
T *_ptr;
int _num;
public:
...
template<typename Expr>
const Vector& operator= (const
Expressao<T,Expr> &expr)
{
for(int i = 0; i < _num; ++i) //
ciclo de acesso indirecto
_ptr[i] = expr[i];
}
};
...
template<typename T, typename Expr>
class Expressao
{
private:
Expr e;
public:
inline const T& operator[](int i)
// Membro acedido a partir de Vector
{ return e[i]; }
};
template<typename T, typename OpEsq,
typename OpDir> // Os operandos esto
parametrizados
class Adicao
{
private:
OpEsq esq;
OpDir dir;
public:
inline const T& operator[](int i)
{ return esq[i]+dir[i]; }
};
...
<8>
tema de capa
Vector<double> a,b,c,d;
...
d = a + b + c; // Um nico ciclo
Lendo de baixo para cima, podemos ver que o compilador
comea a interpretar a expresso pela esquerda devido
igual precedncia. O desenrolar iterativo medida que os
templates so instanciados ilustrado na figura seguinte.
d afectado por um objecto Expressao, consistindo de um
Concluses
Ficou muita coisa por explorar, mas com certeza a ideia das
interessantes aplicaes de templates no desenho de
bibliotecas ficou patente atravs dos exemplos dados. Os
templates de C++ tm uma capacidade impressionante de
permitir polimorfismo esttico, determinado aquando da
compilao, ao ponto de permitir liberdades extremas de
compilao condicional. Tambm permitem construir
autnticos idiomas alternativos da linguagem, e tudo isto
com um impacto mnimo na eficincia no cdigo compilado.
Infelizmente, actualmente este poder sobre a linguagem
vem com um custo associado em termos de complexidade,
levando a complexidades extremas s para permitir
definies intuitivas que tornem classes parametrizadas
teis. Argumentativamente, esta dificuldade s sentida
por quem desenha as bibliotecas para benefcio dos
programadores que as utilizam, mas erros de compilao
difceis de ler, que se obtm quando se usam determinados
parmetros em erro, nunca ajudaram ni ngum.
Obviamente, h solues que esto a ser implementadas
para melhorar esta situao (inclusivamente tornando
alguns dos truques aqui mencionados obsoletos), mas isso
ser abordado num futuro artigo sobre a nova especificao
de C++: o C++0x.
Bibliografia
Ulrich W. Eisenecker: Generative Programming:
Methods, Tools, and Applications, Addison-Wesley
David Vandervoorde, Nicolai M. Josuttis: C++
Templates: The Complete Guide, Addison-Wesley
http://ubiety.uwaterloo.ca/ tveldhui/papers/Expressio
n-Templates/exprtmpl.html
Todd Veldhuizen: Using C++ template metaprograms,
C++ Report, Vol. 7, No. 4 (May 1995), pp. 36-43
John J. Barton, Lee R. Nackman: Scientific and
Engineering C++: An Introduction with Advanced Techniques
and Examples, Addison-Wesley
objecto Adicao. Este objecto Adicao, por sua vez,
instanciado com um operando Vector a e com outro objecto
Adicao (que representa a soma b+c). Se lermos a definio
de Adicao, vemos que tem um operator[], tal como supomos
que Vector tem. A soma resolvida em trs passagens de
referncia: o compilador passa o acesso aos elementos das
Vectors ao objecto Expressao (atravs do seu prprio
operator[]). Finalmente, o operator= passa o resultado a d.
Deste modo, a soma foi efectuada dentro de um nico ciclo
for. Obviamente, o processo cria objectos intermdios de
classes auxiliares para passar as referncias aos elementos
dos vectores, mas permite efectuar de forma eficiente uma
soma num vector longo, e tudo isto sem sacrificar o conforto
de uma sintaxe intuitiva. Esta tcnica de implementao de
objectos eficientes para computao numrica foi inventada
independentemente por Todd Veldhuizen e Daveed
Vandevoorde.
Francisco Almeida foi Licenciado em Engenharia Fsica pela
Universidade de Lisboa em 2003 e agora um aluno finalista de
Doutoramento de Fsica pela Universidade Catlica de Lovaina,
Blgica. Para alm de Cincia, tem interesse em Programao
Orientada por Objectos e Algoritmia. A sua linguagem de
programao preferida sempre foi o C++, mas tambm considera
Java, C# e D muito interessantes.
francisco.almeida@portugal-a-programar.org
Francisco Almeida
<9>
<10>
Processamento de texto
em AWK - Parte II
Introduo
O AWK uma linguagem utilizada em ambientes UNIX para
processar dados baseados em texto. Na edio anterior
apresentmos aqui um artigo de introduo a esta
linguagem. Nesta edio, apresentamos alguns dos seus
aspectos mais avanados.
Campos e variveis
Nos exemplos anteriores, os acessos a campos eram sempre
feitos atravs de um literal inteiro (do tipo $1). No entanto,
este acesso tambm pode ser feito atravs de um inteiro
armazenado numa varivel.
Por exemplo, o seguinte programa l um nmero no
primeiro campo e escreve o seu contedo:
Para alm disto, os campos (tal como as variveis especiais)
podem ser modificados como se fossem variveis. Por
exemplo, o seguinte programa escreve o input sem o
segundo campo:
Arrays
Em AWK possvel definir arrays (apenas unidimensionais)
para guardar um conjunto de valores relacionados. Apesar
de apresentarem uma sintaxe semelhante aos arrays
utilizados em C, existem algumas diferenas quanto sua
forma de utilizao:
No necessrio especificar uma dimenso para o array.
Ele ajustado automaticamente sempre que necessrio
guardar um novo valor;
Os arrays so associativos, ou seja, funcionam como um
mapa entre uma chave (o ndice) e um valor.
O seguinte exemplo ilustra as vantagens da utilizao deste
tipo de arrays, contando as palavras (registos) no input:
a programar
{ campo = $1; print $campo }
{ for(i = 1; i <= NF; i++)
contador[$i]++ } # O ciclo executado
para cada linha de input.
END { for(palavra in contador) print
palavra, contador[palavra] }
A sintaxe do ciclo for na ltima linha permite iterar sobre
todos os elementos de um array.
Este ciclo for no final corresponde iterao sobre o array.
Note-se que este ciclo no garante a ordem no acesso s
posies do array. Note-se que este ciclo no garante a
nenhuma ordem no acesso aos dados.
A instruo delete pode ser utilizada para remover um
elemento do array.
Funes
As funes tem como objectivo simplificar a resoluo de
problemas que de outra forma se tornariam complexos.
Como h funes s quais necessrio recorrer com alguma
frequncia, existem um conjunto de funes predefinidas e
prontos a ser utilizadas.
Funes sobre nmeros
sqrt(n): Devolve a raiz quadrada de n;
log(n): Devolve o logaritmo de base e de n;
exp(n): Devolve a potncia de base e de n;
int(n): Devolve a parte inteira de n.
Exemplos:
sqrt(4) # Devolve 2
sqrt(5) # Devolve 2,23607
log(1) # Devolve 0
log(2) # Devolve 0,693147
exp(0) # Devolve 1
exp(1) # Devolve 1,71828
int(3.14159) # Devolve 3
{ $2 = ""; print }
<11>
Ciclos, Loops
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 a
11 b
12 c
13 d
14 e
15 f
16 10
17 11
18 12
19 13
20 14
Funes sobre strings
substr(string, inicio, tamanho): Devolve a substring
de string que comea em inicio e tem o tamanho tamanho.
split(string, array, separador): Guarda em array as
substrings de string separadas pela string separador.
usado um espao como separador se este for omitido.
index(string, padrao): Devolve o ndice da primeira
ocorrncia de padrao em string (ou 0 se no existir nenhuma
ocorrncia).
Nota: O nicio da string corresponde ao ndice 1. Da mesma
forma, a funo split coloca as substrings em ndices a partir
de 1.
Exemplos:
a programar
printf e sprintf
Tem sido usada a instruo print para escrever texto no ecr.
No entanto, tambm possvel usar a funo printf para
produzir uma string formatada.
A formatao atravs da funo printf funciona da mesma
forma que em C, utilizando (principalmente) os seguintes
cdigos de controlo de formato:
%c: Escreve um char;
%d: Escreve um int em formato decimal;
%f: Escreve um float;
%o: Escreve um nmero em formato octal;
%s: Escreve uma string;
%u: Escreve um unsigned int;
%x: Escreve um int em formato hexadecimal.
Com isto, possvel escrever o nmero de cada registo do
input em formatos decimal e hexadecimal com o seguinte
programa:
{ printf("%d %x\n", NR, NR) }
substr("programar", 4, 4) # Devolve
"gram"
split("portugal-a-programar",
palavras, "-")
print palavras[1] # portugal
print palavras[2] # a
print palavras[3] # programar
index("portugal-a-programar", "port")
# Devolve 1
index("portugal-a-programar", "b") #
Devolve 0
Ser produzido o seguinte texto:
A funo sprintf funciona de forma anloga, mas devolve a
string em vez de a escrever.
Funes definidas pelo utilizador
Para alm das funes predefinidas, possvel tambm
definir novas funes. Estas funes devem ser definidas no
incio do programa (antes do primeiro bloco). Para o fazer
utiliza-se a seguinte sintaxe:
function nome(parametros) {
instrucoes
}
A instruo return indica qual o valor a ser devolvido pela
funo quando a sua execuo termina.
Redireccionamento de output
Para alm de escrever o resultado no ecr, tambm
possvel envi-lo para um ficheiro ou comando. Em AWK
exi stem trs operadores rel aci onados com o
redireccionamento de output:
>: Redirecciona o output para um ficheiro;
>>: O mesmo que o anterior, mas caso o ficheiro j
exista o output adicionado no fim;
|: Redirecciona o output para um comando Unix.
<12>
Por exemplo, possvel enviar o nmero de cada registo
para um ficheiro out.txt com o seguinte programa:
a programar
{ print NR >> "out.txt" }
Concluso
Este artigo serve de complemente ao artigo introdutrio
publicado na edio anterior. Este artigo pode parecer
complexo para um programador no-familiarizado nesta
linguagem, sendo nesse caso aconselhvel a leitura do
referido artigo na edio anterior.
Fbio Ferreira frequenta desde 2005 o curso de Engenharia
Informtica e de Computadores no Instituto Superior Tcnico,
estando actualmente na rea de especializao de Sistemas
Inteligentes. Para alm disto, tem interesse por algoritmia, Python
e sistemas Unix.
fabio.ferreira@portugal-a-programar.org
Fbio Ferreira
<13>
Apresentao
O DEI Academy uma plataforma online que tem como
objectivo ajudar alunos do secundrio a aprender a
programar.
Uma iniciativa do Departamento de Engenharia Informtica
da Universidade de Coimbra, o site ensina principalmente a
linguagem Python e muitos dos conceitos que vais aprender
em qualquer curso de informtica.
Se ainda no sabes se ests interessado em seguir
informtica, ou simplesmente queres aprender mais sobre
programao, este site dever ser uma boa ferramenta.
O site est disponvel no endereo http://academy.dei.uc.pt.
Passado, Presente e Futuro
O site abriu s no ano passado e rene actualmente mais de
300 utilizadores frequentes.
Melhormos o aspecto da pgina, adicionmos mais
contedos, crimos um sistema de desafios e pontos
integrado no site, entre outros.
No futuro prximo pretendemos integrar ainda mais
desafios e concursos peridicos.
Desafios
No se aprende a programar sem praticar muito.
Agora enquanto aprendes os conceitos na pgina, podes
resolver mini-desafios que aparecem directamente na
pgina dos manuais.
Estes mini-desafios so resolvidos na mesma linguagem dos
contedos (Python) e podem ser submetidos directamente
para avaliao automtica. O sistema pretende ser muito
simples, e evitar o uso de sistemas de avaliao mais
complexos.
A resoluo dos desafios d-te direito a pontos sempre que a
resposta seja aceite. No futuro existir um ranking dos
utilizadores com mais pontos.
Comunidade
No queremos que os utilizadores estejam limitados aos
nossos contedos!
Queremos acima de tudo gerar discusso, partilha de
conhecimento e sentido de entreajuda. Incentivamos os
utilizadores a partilhar todo o gnero de informao e
feedback ao site no nosso frum.
Sistema de Avaliao Automtica
Para aqueles mais interessados no funcionamento interno
da nossa plataforma, o sistema de avaliao automtica do
cdigo Python dever ser a funcionalidade mais
interessante.
Actualmente este sistema feito atravs do servio Google
App Engine que permite executar cdigo Python de forma
escalvel, sem existir preocupaes com o possvel excesso
de carga no processador, e isolar cada cdigo para motivos
de segurana.
Concluso
Espero ter dado a conhecer melhor o projecto, e que tenha
despertado a curiosidade dos leitores,
http://academy.dei.uc.pt.
Fbio Pedrosa
DEI@Academy
a programar
<14>
Google Web Toolkit
Aps a introduo plataforma Google Web Toolkit (GWT)
na anterior edio da Revista Programar (19 Edio:
http://blog.portugal-a-programar.org/2009/04/14/revista-
programar-19-edicao-abril-2009/) eis um novo artigo numa
nova edio da Revista, sobre a mesma plataforma, mas
com novos conceitos e algumas novidades.
Nota: Se ainda no leu o primeiro artigo de Introduo ao
Googl e Web Tool ki t, anteri ormente referi do,
recomendado que o faa para que deste modo possa se
familiarizar com a plataforma, e assim, tirar o mximo
proveito deste novo artigo.
Resumindo, neste artigo
Iro estar em destaque diversos aspectos do Google Web
Toolkit. Inicialmente ser abordado o novo plugin do GWT
para Eclipse, lanado recentemente pela Google e que
permite a integrao de aplicaes GWT com o Google
Application Engine (GAE) . De seguida demonstrada uma
das mais importantes peas do GWT, o mecanismo RPC, que
permite a fcil implementao de mecanismos de
comunicao entre cliente e servidor.
O que vai aprender?
Ao longo do artigo o leitor ir:
Configurar o Google Web Toolkit no Eclipse,
utilizando para tal o novo plugin disponibilizado pela
Google;
Implementar mecanismos de comunicao entre
cliente/servidor atravs de RPC (Remote Procedure Call);
Seguindo estes passos, no final do artigo o leitor ter
construdo uma simples aplicao GWT, resultado da
configurao e implementao dos aspectos anteriormente
referidos, compreendendo no s como elas funcionam
como tambm como que estas se integram na plataforma
GWT.
Requisitos
Para a realizao deste artigo foram utilizadas as seguintes
tecnologias:
Eclipse 3.4.2 (Ganymede). De acordo com a
documentao da Google (http://code.google.com/intl/pt-
PT/eclipse/docs/download.html), o plugin funciona com as
verses Eclipse 3.3(Europa) e Eclipse 3.4(Ganymede).
GWT 1.6;
Google Chrome.
Sistema Operativo XP Home Edition
Nota: Note-se que para este exemplo utilizado o Eclipse,
mas o desenvolvimento de aplicaes GWT pode ser feito
utilizando qualquer IDE Java.
Google Plugin for Eclipse
Recentemente a Google anunciou o lanamento de um novo
plugin para o Eclipse. Este novo plugin, alm de facilitar a
criao de aplicaes GWT, permite a integrao das
mesmas no Google App Engine (o que o Google App
Engi ne? - ht t p: / / code. googl e. com/ i nt l / pt -
PT/appengine/docs/whatisgoogleappengine.html ). Usando
uma simples sequncia de tarefas possvel publicar
qualquer aplicao GWT nos servidores da Google.
Esta realmente uma grande novidade, pois inicialmente o
Google App Engine apenas permitia o desenvolvimento de
aplicaes em Python e s muito recentemente foi
anunciado o suporte linguagem Java. No entanto,
necessrio ter alguns cuidados na medida em que a
linguagem Java no inteiramente suportada. As limitaes
e s t o d o c u m e n t a d a s e m
http: //groups. googl e. com/group/googl e-appengi ne-
java/web/will-it-play-in-app-engine.
Este novo plugin da Google para o GWT inclui wizards para a
criao de entrypoints, mdulos e pginas Web, suporte
realizao de testes unitrios, entre outros.
Instalando o Plugin
possvel fazer o download do Eclipse no seguinte
endereo-
http://mac.softpedia.com/get/Development/Editors/Eclipse-
SDK.shtml.
Depois de descarregado o Eclipse, possvel ento
proceder-se instalao do plugin. Para quem no est
muito familiarizado com a plataforma, o Eclipse torna a
instalao de plugins uma tarefa bem simples, na medida
em que esta pode ser feita utilizando apenas um url que
indica o plugin a instalar. Os passos para a instalao so
mostrados de seguida.
a programar
<15>
Depois de abrir o Eclipse, ir ao menu Help -> Software
Updates
Figura 1 Eclipse Instalando Plugins
Logo de seguida, surge uma nova janela designada
Software Updates and Add-ons onde possvel verificar
actualizaes e software disponvel. Clicando no boto
direita Add Site surge novamente uma nova janela onde
necessrio colocar o url do plugin desejado. Neste caso, para
a instalao do plugin Google, o url o seguinte -
http://dl.google.com/eclipse/plugin/3.4.
Figura 2 Fornecendo o endereo do plugin
Figura 3 Lista de Plugins
O plugin ento adicionado lista de plugins. Como
possvel verificar na imagem seguinte, so instalados no s
o plugin, como tambm os SDKs do Google App Engine e a
ultima verso da plataforma Google Web Toolkit, o GWT 1.6.
Figura 4 Instalao do plugin
Para comear a instalao, seleccionar o checkbox
correspondente e clicar no boto Install direita. Inicia-se
ento o processo de instalao do plugin no Eclipse.
Finalizado o processo, o plugin est instalado, configurado e
pronto a ser utilizado.
Criando uma aplicao GWT
A partir de agora possvel criar aplicaes GWT no Eclipse
apenas com uns simples cliques. Para criar uma nova
aplicao GWT, basta clicar com o boto direito do rato
sobre a rea esquerda do Eclipse no Package Explorer.
Ir surgir um menu onde dever clicar em New,
aparecendo assim um submenu, no qual dever clicar em
Web Application Project, tal como mostra a figura
seguinte.
a programar
<16>
Figura 5 Criando uma aplicao GWT no Eclipse
Ir surgir uma nova Janela onde devem ser especificados o
Nome do Projecto e o package onde os ficheiros do projecto
sero alojados. Vamos definir o Nome do Projecto como
My F i r s t GWTAp p e o p a c k a g e c o mo
gwt.sample.myproject.
Clicando em Finish gerada toda a estrutura do projecto.
Figura 6 Aplicao GWT
Foram criados um conjunto de ficheiros padro, onde neste
caso, o MyFirstGWTApp.java consiste no EntryPoint da
aplicao e os restantes ficheiros implementam o servio
RPC de comunicao entre o cliente e o servidor. Temos
assim uma aplicao GWT por omisso, pelo que a partir
desta estrutura inicial possvel ento desenvolver a
aplicao Web desejada.
Para correr a aplicao, basta clicar com o boto direito do
rato em cima do projecto, clicando depois em Run As -> Web
Application, executando a aplicao em Hosted Mode.
Hosted Mode consiste no browser interno do GWT usado na
fase de desenvolvimento, permitindo o debbuging das
aplicaes em cdigo Java. Para mais informao pode
consultar o artigo de introduo ao GWT publicado na 19
edi o da Revi sta ( http: / / bl og. por tugal - a-
programar.org/2009/04/14/revista-programar-19-edicao-
abril-2009/).
Figura 7 Executando a Aplicao
Depois de executada a aplicao, possvel visualizar na
consola do Eclipse a seguinte mensagem The server is
running at http://localhost:8080, o que significa que a
aplicao est tambm em execuo no servidor local, pelo
que pode ser acedida atravs do browser pelo url referido.
Deste modo, o plugin da Google torna muito simples a
criao de aplicaes GWT.
Figura 8 Consola do Eclipse
Disponibilizando a sua aplicao Web
Como j foi dito anteriormente, este plugin tambm permite
a integrao de aplicaes GWT no GAE. Ou seja, fazendo
uso da infra-estrutura da Google, possvel desenvolver
uma aplicao Web no Eclipse e, em poucos passos, public-
la nos seus servidores.
Como pode ser observado, ao instalar o plugin no Eclipse
surgiram novos elementos no menu superior, sendo um
destes o logtipo do GAE.
a programar
<17>
Figura 9 Publicando a aplicao no Google App Engine
Ao clicar neste boto possvel publicar a aplicao nos
servidores da Google. Mas para isso necessrio, antes de
mais, criar uma conta no GAE. Este passo no aqui
detalhado mas possvel consultar os passos necessrios
para tal no seguinte link - http://code.google.com/intl/pt-
PT/appengine/docs/java/gettingstarted/uploading.html.
Depois de criada a conta no GAE e o ID para a respectiva
aplicao, basta clicar no boto acima referido, iniciando-se
ento a publicao da aplicao.
Figura 10 Publicando a aplicao no Google App Engine (2)
Depois de publicada, possvel aceder aplicao atravs
do domnio criado no GAE
RPC no GWT Hello Server! Can I ask you
something?
O que RPC?
O Remote Procedure Calls (RPC) Chamadas de
Procedimento Remoto) um mecanismo que permite fazer
a chamada a procedimentos remotos como se estes fossem
locais. Ou seja, implementa um servio de comunicao
entre sistemas remotos, abstraindo o programador dos
detalhes de implementao.
Assim, sempre que o programador necessite de comunicar
com o respectivo servio remoto, f-lo de forma
transparente como se de uma chamada local se tratasse.
Deste modo, para a comunicao entre cliente/servidor, o
GWT disponibiliza o mecanismo RPC fazendo com que
cliente e servidor possam trocar/partilhar objectos Java
entre si atravs do protocolo HTTP, de uma forma rpida e
transparente.
Como funciona? To simples quanto isto
De seguida mostrado o diagrama correspondente ao RPC
no GWT:
Figura 11 Diagrama RPC
Como possvel observar no diagrama anterior (retirado e
traduzido de
http://library.igcar.gov.in/readit2007/tutori/tools/gwt-
windows-
1.4.10/doc/html/com.google.gwt.doc.DeveloperGuide.Remot
eProcedureCalls.PlumbingDiagram.html) existem trs cores
distintas, vermelho, azul e verde, que representam
respectivamente:
as interfaces disponibilizadas pelo GWT;
as classes que so necessrias implementar pelo
programador;
e a classe que gerada automaticamente pelo GWT,
ou seja o Proxy, que ir servir de intermedirio entre o
cliente e o servidor.
As classes de maior importncia para o programador so
obviamente as pintadas a azul, pois so estas que tm de ser
implementadas pelo prprio.
Assim, para se definir um servio GWT necessrio
implementar no lado cliente duas interfaces, o YourService
e o YourServiceAsync e, no lado servidor ento feita a
respectiva implementao (YourServiceImpl) do servio
(interfaces) declarado no lado cliente.
At agora, o que pode provocar alguma confuso a
interface YourServiceAsync. Isto significa que para cada
servio declarado, necessrio criar uma verso assncrona
do mesmo. Mas agora a pergunta que se coloca : Porqu
criar uma verso assncrona do servio?
a programar
<18>
AJAX Asynchronous Javascript and XML
O GWT uma plataforma orientada ao desenvolvimento de
aplicaes Web baseada na tecnologia Asynchronous
Javascript and XML (AJAX). A grande novidade desta
tecnologia o facto de no serem feitos pedidos de pginas
completas ao servidor, mas sim realizados pequenos
pedidos assncronos que ao serem retornados pelo servidor
actualizam pequenas partes da pgina.
Deste modo o GWT, no mecanismo de comunicao com o
servidor, ao fazer um pedido no lado cliente tem que
assegurar uma forma de poder receber a resposta quando
este for enviado pelo servidor. Para isso, criado um objecto
callback do tipo AsynCallback que ir conter a resposta
enviada pelo servidor. Podemos pensar no AsyncCallback
como um EventListener que fica escuta da resposta do
servidor para que quando este retorne o resultado o cliente
possa ser notificado. Deste modo a aplicao no fica
bloqueada espera da resposta e outras tarefas podem
ser realizadas entretanto.
Mais adiante ir ser implementado um exemplo prtico
onde vai ser possvel visualizar e compreender melhor como
funciona o AsyncCallback, bem como todo o processo de
comunicao cliente/servidor no GWT.
Serializao
De uma forma simples, a serializao consiste em
transformar um objecto num conjunto de bits armazenados
consecutivamente; e a deserializao consiste na
transformao inversa, de forma a ser possvel recuperar o
objecto tal como se encontrava no momento da
serializao. Esta tcnica muito til quando se pretende,
por exemplo, guardar objectos num buffer de memria, num
ficheiro, ou transmiti-los atravs da Rede.
Esta tcnica utilizada pelo mecanismo de RPC no GWT,
pois como j foi dito anteriormente, o RPC permite a troca
de objectos entre cliente e servidor atravs do protocolo
HTTP.
Mas para que tal acontea necessrio que os objectos a
partilhar implementem serializao. Um objecto destinado
ao cliente serializado pelo servidor, e depois enviado
atravs de HTTP; j no lado cliente o objecto recuperado
atravs da sua deserializao.
Porqu serializao?
Um objecto representa uma estrutura de dados cuja
informao est normalmente espalhada pela memria e
que pode ser acedida aleatoriamente. No entanto, se
pretendemos transmitir essa estrutura atravs de um canal
sequencial, necessrio que essa informao seja agrupada,
tarefa essa que realizada pela serializao. Depois de
transmitida, essa informao novamente recolocada na
memria recuperando-se a estrutura de dados/objecto at
ento serializado, ou seja, a chamada deserializao.
Este parece mostrar-se um processo complicado mas, uma
vez que a serializao j suportada pelo GWT, torna-se
tudo muito simples e transparente para o programador.
Tudo o que este tem de fazer garantir que os objectos
partilhados entre cliente/servidor implementem a
serializao.
Note-se que falarmos de serializao no GWT no bem
como falar de serializao em Java, pois no podemos
esquecer que temos Javascript no lado cliente e Java no lado
servidor.
Deste modo, um objecto serializvel no GWT se:
um tipo primitivo, como char, byte, short,
int,long,boolean,float, ordouble;
String, Date,
Character,Byte,Short,Integer,Long,Boolean,Float,
orDouble;
um array de tipos serializveis;
uma classe serializvel;
uma classe que tem pelo menos uma subclasse
serializvel.
Para saber mais sobre serializao no GWT consulte
http://developerlife.com/tutorials/?p=131.
RPC - Na prtica
Voltando aplicao GWT MyFirstGWTApp criada logo no
incio deste artigo, possvel observar que j
implementado automaticamente um servio para esse
efeito, o GreetingService. Este um servio bsico, com
uma simples troca de mensagens entre o cliente e o
servidor, mas que j nos d uma ideia de como so
implementados os mecanismos de comunicao
cliente/servidor no GWT.
a programar
<19>
Pela imagem observa-se que so implementados os trs
passos necessrios para estabelecer a comunicao entre
cliente e servidor. No lado cliente declarado o servio
Greeti ngServi ce e a sua verso ass ncrona
GreetingServiceAsync e no lado servidor a implementao
do respectivo servio, designado GreetingServiceImpl.
Este exemplo ser assim reaproveitado para que o leitor
possa entender na prtica como as coisas se processam.
No entanto, neste caso, o cliente e o servidor trocam entre si
strings, que consistem em objectos da classe String, que por
sua vez j implementa serializao. Na tentativa de explorar
um pouco mais a serializao e a troca de objectos entre o
cl i ente e o servi dor, vamos cri ar uma cl asse
GreetingMessage (que implemente serializao) de modo a
que a mensagem retornada pelo servidor seja instncia da
respectiva classe. Deste modo o leitor aprender a
implementar a serializao e a utiliz-la sempre que precisar
partilhar objectos entre cliente/servidor.
Implementando o mecanismo RPC
A nossa aplicao, designada MyFirstApp, constituda por
5 ficheiros:
No lado Cliente:
MyFirstApp (consiste no EntryPoint da aplicao)
GreetingService (corresponde ao servio requisitado pelo
cliente)
GreetingServiceAsync (verso assncrona do servio);
GreetingMessage (classe que ser implementada por
ns para a construo de mensagens a trocar entre
cliente/servidor);

No lado Servidor:
GreetingServiceImpl (corresponde a implementao
do servio declarado no lado cliente)
Antes de mais Implementando a classe
GreetingMessage
Dever criar antes de mais uma nova classe,no lado cliente,
designada Greeting Message e copiar o seguinte cdigo para
esta nova classe:
//Greating Message.java
package gwt.sample.myproject.client;
import
com.google.gwt.user.client.rpc.IsSerial
izable;
public class GreetingMessage
implements IsSerializable {
private static final long
serialVersionUID = 1L;
//attributes
private String title;
private String content;
//empty constructor --> is
mandatory for serializable
classes...
public GreetingMessage() {}
//constructor
public GreetingMessage(String
title, String content)
{
this.title = title;
this.content = content;
}
//get's and set's methods
public String getTitle()
{
return title;
}
public String getContent()
{
return content;
}
public void setTitle(String
newTitle)
{
this.title = newTitle;
}
public void setContent(String
newContent)
{
this.content = newContent;
}
//creating a Message
public GreetingMessage
createNewMessage(String title, String
content)
{
GreetingMessage newMessage =
new GreetingMessage(title, content);
return newMessage;
}
}
a programar
<20>
Como podemos observar, e tal como j foi di to
anteriormente, as classes cujos objectos iro ser partilhados
entre cliente e servidor devem implementar serializao,
mais concretamente a interface IsSerializable. Um aspecto
que ainda no foi referido o facto de que todas as classes
que implementem serializao tm de possuir um
construtor vazio. definido que a classe GreetingMessage
possui como atributos title e content, ambos do tipo String,
que iro consistir respectivamente no ttulo e no contedo
da mensagem a criar.
Implementando o Servio GreetingService - 1
Passo
Uma vez definida a classe GreetingMessage ser agora
implementado o respectivo servio GreetingService. O
primeiro passo para a elaborao do servio a definio da
sua interface no lado cliente. A interface tem que estender a
interface RemoteService e, tanto os parmetros como os
valores de retorno do servio (mtodo) tm de ser
serializveis. Deste modo temos:
Figura 13 Definindo um servio no GWT
Temos assim a interface (servio) GreetingService que
estende a interface RemoteService e que implementa um
mtodo de mesmo nome GreetingService, que tem como
parmetro uma String que corresponde ao nome de cliente,
e que retorna uma instncia da classe GreetingMessage por
sua vez serializvel.
Implementando o Servio GreetingService - 2
Passo
Agora que o servio j foi definido, vamos definir a sua
verso assncrona.
As classes que representam a verso assncrona do servio
tm de ter sempre nome igual classe que define o servio
seguido do sufixo Async. Deste modo, para este caso a
verso assncrona ser designada GreetingServiceAsync.
Figura 14 Verso assncrona do servio
O mtodo definido pela classe assncrona no deve possuir
valor de retorno, ou seja, deve ser sempre void uma vez
que o resultado retornado pelo servidor ir ser guardado
num objecto callback (j referido anteriormente), objecto
este que deve ser adicionado como parmetro no mtodo da
classe assncrona, tal como mostra a imagem anterior.
Relembrando: quando o servidor responde, o objecto
callback guarda a resposta e notifica o cliente.
Implementando o Servio GreetingService - 3
Passo
Finalmente, para termos uma completa definio do servio
falta somente a sua respectiva implementao no lado
servidor. Tal como acontece com a verso assncrona do
servio, a classe que o implementa deve ter sempre nome
igual seguido do sufixo Impl. Deste modo, para o nosso
exemplo, a classe que implementa o servio ter o nome
GreetingServiceImpl.
Alm disso, esta classe tem de estender a interface
RemoteServiceServlet. Esta interface representa a classe
base servlet e tem como funo processar os pedidos do
cliente. Deste modo, para cada servio implementado
cr i ado um ser vl et ( o que um ser vl et ? -
http://pt.wi ki pedi a.org/wi ki /Servl et) que se i r
responsabilizar pelo processamento do pedido. Mais adiante
ser explicado o que um servlet e como este criado e
configurado.
De seguida, deve substituir o cdigo existente no ficheiro
GreetingServiceImpl.java pelo seguinte cdigo:
package gwt.sample.myproject.server;
import
gwt.sample.myproject.client.GreetingSer
vice;
import
gwt.sample.myproject.client.GreetingMes
sage;
import
com.google.gwt.user.server.rpc.RemoteSe
rviceServlet;
/**
* The server side implementation of
the RPC service.
*/
@SuppressWarnings("serial")
public class GreetingServiceImpl
extends RemoteServiceServlet
implements
GreetingService {
GreetingMessage gMessagePointer =
new GreetingMessage();
public GreetingMessage
greetServer(String input) {
a programar
<21>
Como pode ser observado foram feitas algumas alteraes
ao cdigo que j se encontrava criado A diferena que o
servidor agora utiliza a classe GreetingMessage para
construir a mensagem de resposta ao cliente. O resultado
acaba por ser o mesmo, no entanto o servidor envia a
mensagem como um objecto serializado, instncia da classe
GreetingMessage anteriormente criada por ns.
RPC - Mission acomplished? Quase -
4Passo
Como j foi dito, para cada servio implementado criado
um servlet responsvel por suportar o respectivo servio, ou
seja, ao criar um novo servio, o programador tem de
mapear ou configurar um novo servlet ao respectivo servio.
Mas, como configurar um novo servlet? muito simples
A aplicao MyFirstApp contm um ficheiro designado
web.xml (MyFirstApp/war/WEB-INF/web.xml) onde so
configurados os servlets.
Figura 15 web.xml
Desta forma, para definir/configurar um novo servlet
necessrio definir:
o seu nome;
a classe que implementa o servio; e
o endereo onde o servio prestado, ou seja, o
endereo do servidor que contm o ficheiro que implementa
o servio.
Na imagem anterior, se tomarmos ateno ao url do servio,
vemos que este definido de uma forma muito simples
(/myfirstgwtapp/greet); o GWT vem mais uma vez facilitar a
vida do programador, na medida em que utiliza uma
anotao para automatizar o processo de criao do
endereo.
Figura 16 Definindo o endereo
A interface GreetingService, interface do servio no lado
cl i ent e, ut i l i za uma anot ao desi gnada
RemoteServiceRelativePath que ir fazer com que o proxy,
gerado automati camente pel o GWT, real i ze as
configuraes necessrias para o mapeamento do servio.
Note-se que a anotao tem como argumento um nome
igual quele que foi definido no endereo do servlet do
ficheiro web.xml - /myfirstgwtapp/greet. Estes nomes tero
de ser sempre iguais.
//server build new greeting
message and returns to client...
return buildMessage(input);
}
//building new Greeting Message...
private GreetingMessage
buildMessage(String input) {
String serverInfo =
getServletContext().getServerInfo();
String userAgent =
getThreadLocalRequest().getHeader("User
-Agent");
String content = "Hello, " +
input + "!! Welcome to GWT World"
+"!<br><br>I
am running " + serverInfo
+ ".<br><br>It
looks like you are using:<br>" +
userAgent;
//create the message....
delegates to GreetingMessage class
GreetingMessage gMessage =
gMessagePointer.createNewMessage("",
content);
return gMessage;
}
}
a programar
<22>
Figura 17 Remote Proxy
Olhando para a classe MyFirstApp, vemos que logo de incio
criada uma instncia do servio que vai ser utilizado.
Invocando a funo GWT.create() permitida a criao de
um proxy que ir ser o intermedirio entre o cliente e o
servidor para o respectivo servio.
Agora que o proxy para o servio est criado, ento
definida a funo que ir invocar o servio. Para este
exemplo, o mtodo designado sendNameToServer().
Figura 18 Invocando o servio GreetingService
Utilizando a instncia do servio anteriormente criada
(greetingService), ento invocado o mtodo assncrono do
servio (pintado a azul), passando como argumentos o nome
do cliente textToServer e o objecto callback responsvel por
notificar o cliente aquando da resposta do servidor.
onFailure, onSucess
Sabe-se que, por vezes, no possvel estabelecer
comunicao com o servidor pelas mais variadas razes,
pelo que o pedido do cliente pode ter dois resultados
possveis: sucesso e insucesso. por isso que o objecto
callback suporta dois mtodos, designados onFailure e
onSucess, onde o programador define o desejado para cada
um dos casos anteriores.
O mtodo onFailure() recebe como parmetro a causa que
provocou a falha de comunicao com o servidor, enquanto
que o mtodo onSucess() recebe como parmetro o
resultado enviado pelo servidor, consequncia do pedido do
cliente.
Executando a aplicao
A aplicao MyFirstGWT est pronta a ser executada. Temos
deste modo uma aplicao que implementa, atravs de RPC,
um servio designado GreetingService, que por sua vez
permite a troca de uma mensagem entre o cliente e o
servidor.
O resultado o seguinte:
Figura 19 Executando a aplicao (Hosted Mode)
Clicando em Compile/Browse poder ver o resultado no
browser. O que o GWT faz compilar todo o cdigo Java em
Javascript (da que o processo possa demorar um pouco)
para este ser ento executado no browser.
E voil o servio est completamente implementado,
configurado e pronto a ser usado.
5 e ltimo passo Invocando o servio
GreetingService
Agora que o servio j est disponvel, podemos ento
invoc-lo na nossa aplicao. Este invocado na classe
principal da aplicao, ou seja, na classe MyFirstGWTApp
que corresponde ao EntryPoint da mesma.
a programar
<23>
Figura 20 Executando a aplicao (Web Mode)
Concluso
Mais uma vez o Google Web Toolkit mostrou ser uma
plataforma poderosa e em verdadeira ascenso,
disponibilizando agora um novo plugin que vem automatizar
e simplificar o uso da plataforma.
O anncio de que o Google App Engine j suporta a
linguagem Java foi uma grande novidade e, a sua integrao
no plugin da Google para o Eclipse, s veio motivar ainda
mais o uso do GWT na medida em que os programadores
conseguem ver publicadas as suas aplicaes num piscar de
olhos, no tendo de se preocupar com os aspectos que
envolvem configurao do servidor.
O mecanismo RPC disponibilizado pelo GWT mostra-se
muito til e poderoso, pois vem facilitar o processo de
comunicao cliente/servidor, flexibilizando o processo de
troca de dados entre ambos.
So estas e muitas outras razes que tornam o Google Web
Toolkit uma plataforma poderosa, agradvel e atraente a
quem desenvolve ou pretende desenvolver aplicaes Web
Espero que tenha achado o artigo til. At a prxima edio
da Revista Programar!
Bibliografia
[Using the Google Plugin for Eclipse]
http://code.google.com/intl/pt-
PT/appengine/docs/java/tools/eclipse.html
[Google Plugin for Eclipse]
http://www.infoq.com/br/news/2009/04/google-eclipse-
plugin
[Remote Procedure Calls]
http://code.google.com/docreader/#p=google-web-toolkit-
doc-1-5&s=google-web-toolkit-doc-1-
5&t=DevGuideRemoteProcedureCalls
[GWT Tutorial - Building a GWT RPC Service]
http://developerlife.com/tutorials/?p=125
[Making Remote Procedure Calls]
http://code.google.com/intl/pt-
PT/webtoolkit/tutorials/1.6/RPC.html#serialize
Licenciado em Engenharia de Informtica pela Universidade da
Madeira, est agora a concluir o Mestrado no respectivo curso na
mesma universidade.Gosta de linguagens como Java e C#, mas no
futuro profissional gostaria de enveredar pelo desenvolvimento de
aplicaes Web, dando foco a um tema ou aspecto que tem ganho
cada vez mais relevncia no Mundo do Software - a Usabilidade -
neste caso concreto, a Usabilidade na Web.
cristian.goncalves@portugal-a-programar.org
Cristian Gonalves
a programar
<24>
Arduino e a Aquisio de
Dados
Introduo
objectivo deste segundo artigo, abordando o Arduino,
tentar explorar um problema que pode afectar os
utilizadores que necessitem de uma maior velocidade de
aquisio de dados para a sua aplicao, nomeadamente
utilizando o Arduino.
Assim, abordaremos a problemtica que envolve a taxa de
amostragem, j que, para fazer a leitura de sensores
(acelermetros, termopares, entre outros) com esta
ferramenta, de uma forma eficiente, necessrio o
controlo deste factor.
Se quisermos medir o comportamento de um objecto em
queda durante 5 segundos, mas s amostrarmos- obter o
valor da sua altura em relao ao solo, utilizando um sensor
adequado, - de 15 em 15 segundos, facilmente se conclu
que os dados obtidos no tm utilidade. Este exemplo
ilustra assim a necessidade de abordar este problema, pois
cada vez mais se est a utilizar o Arduino como
ferramenta de aquisio de dados, especialmente devido
sua possibilidade de interface Ethernet ou Zigbee, atravs
da sua capacidade de acrescentar um shield.
O Arduino uma ferramenta com enormes potencialidades,
que cada vez mais comea a ser utilizada em projectos de
relativa complexidade. Isto deve-se no s ao seu baixo
custo, mas tambm sua simplicidade de utilizao.
Fig. 1 Exemplo de shield Zigbee e Ethernet
Fundamento terico
Na leitura de sensores, as amostras so geralmente
adquiridas em intervalos fixos de tempo. Contudo, em casos
especficos, a periodicidade de amostragem pode ser
alterada.
Desta forma, quer aumentando ou diminuindo o intervalo
de tempo entre amostras, a principal questo prende-se
com a periodicidade da prpria amostragem, visto que
quanto maior for, maior tero de ser tambm a capacidade
de processamento e de armazenamento.
O nmero de vezes em que se realiza a amostragem em uma
unidade de tempo a chamada taxa de amostragem,
geralmente, medida em Hertz.
Dizer-se que a taxa de amostragem de 100Hz, significa que
em cada segundo so tomadas 100 medidas de uma
determinada variao de voltagem do sinal de entrada.
Dessa forma, quanto maior for a taxa de amostragem, mais
exacta ser a representao do sinal original.
Ao estudar-se a amostragem, necessria a sensibilizao
para um dos fenmenos que podem ocorrer: o Aliasing.
Para o evitar deve-se respeitar o teorema Nyquist que,
basicamente, diz-nos que a taxa de amostragem deve ser no
mnimo duas vezes a maior frequncia que desejamos
registar. Se no respeitarmos este teorema, o sinal
amostrado no poder ser recuperado sem perda de
informao.
Fig. 2 Exemplo de Aliasing
A onda azul na Figura 2 a reconstruo da onda original (a
vermelho), sem respeitar este teorema. E, como se pode
constatar, no existe uma reconstruo da onda original,
havendo assim perda de informao.
A soluo para aumentar a taxa de amostragem no Arduino
passa essencialmente por aumentar a velocidade do
conversor analgico-digital (ADC) como veremos de
seguida.
ADC
O conversor analgico digital presente no ATmega168
(Arduino) possui 10 bit de resoluo.
O ADC est preparado para um sinal de entrada analgica de
tenso varivel de 0V a 5V, gerando nmeros binrios de 0
(0000000000) a 1023 (1111111111), que dependem
essencialmente do sinal colocado na entrada. (Ver Nuno
Pessanha Santos, Introduo ao Arduino, Revista
PROGRAMAR, 17 edio)
excepo da primeira converso que leva 25 ADC ciclos de
clock, pois efectua a inicializao do ADC, uma converso
demora 13 ADC ciclos de clock. Ou seja, se tivermos um
clock de 1 MHz vamos ter, aproximadamente:
electrnica
<25>
O que vai limitar, como referido anteriormente, a largura de
banda a utilizar para 38,5 kHz -segundo o teorema de
Nyquist.
Arduino Vs ADC
Nem sempre a maior taxa de amostragem a mais indicado.
Seria errado pensarmos deste modo, pois ao aumentar a
taxa de amostragem vamos, tambm, aumentar o espao e
o processamento necessrio dos dados.
Assim, dever-se- encontrar a menor taxa de amostragem
que consiga satisfazer os nossos objectivos, pois no vamos
ter quaisquer melhorias no nosso objectivo ao colocar taxas
de amostragem excessivamente elevadas, j que
poderemos estar a exigir esforos de processamento que
no podemos fornecer.
O input clock do ADC encontra-se dividido por um factor de
diviso Prescaler. O valor deste factor pode ser
modificado, alterando o valor do contedo do registo
ADCSRA.
Fig. 3 Contedo do registo ADCSRA
Fig. 4 Combinaes possveis
Os bits que nos interessam para este caso so o ADPS2,
ADPS1 e o ADPS0.
Na tabela, podemos analisar quais as combinaes destes
trs bits e a partir destas fazer alguns clculos que nos
possibilitam definir a taxa de amostragem adequada, por
exemplo:
Se tivermos o bit 0 (ADPS0) a 1, o bit 1 (ADPS1) a 1 e o bit 2
(ADSP2) a 0, obtemos segundo a tabela acima um factor de
diviso de 8.
O Arduino tem um clock de sistema de 16 MHz, obtendo
assim um input clock para o ADC de 2 MHz.
O mesmo raciocnio seria tomado para qualquer factor de
diviso possvel - 2,4,8,16,32,64 e 128.
Destes 2 MHz obtidos para um factor de diviso de 8, temos
de os dividir por 13 - Nmero de ciclos de clock gastos na
converso para obter a respectiva taxa de amostragem.
Ou seja, com esta taxa obtemos 150000 amostras por cada
segundo. Contudo, estes valores so apenas tericos, no
sendo estes os obtidos na realidade.
Como alterar o Prescaler
Exemplo de cdigo fonte que permite alterar o valor do
Prescaler.
No exemplo de cdigo acima apresentado, possvel fazer
uma leitura de quanto tempo gasto, na realidade, a
efectuar a converso de analgico para digital.
Nas linhas 9,10 e 11 estabelecido o contedo dos registos
responsveis pelo factor de diviso. A instruo sbi atribui o
valor 1 e a instruo cbi atribui o valor 0, sendo a instruo
constituda por:
Instruo (registo, bit a estabelecer);
Analisando a instruo da linha 9, a ttulo de exemplo,
podemos ver que utilizada a instruo sbi (Atribui o valor 1)
electrnica
0 0 0 2
2 1 0 0
0 1 0 4
8 1 1 0
1 0 0 16
32 1 0 1
ADPS2 ADPS1 ADPS0 Factor de diviso
1 1 0 64
1 1 1 128
(1)#ifndef cbi
(2)#define cbi(sfr, bit)
(_SFR_BYTE(sfr) &= _BV(bit))
(3)#endif
(4)#ifndef sbi
(5)#define sbi(sfr, bit)
(_SFR_BYTE(sfr) |= _BV(bit))
(6)#endif
(7)void setup(void) {
(8)Serial.begin(9600);
(9)sbi(ADCSRA, ADPS2);
(10)cbi(ADCSRA, ADPS1);
(11)cbi(ADCSRA, ADPS0);
(12)}
(13)int a;
(14)int b;
(15)int c;
(16)void loop()
(17){ b = micros();
(18)a = analogRead(0);
(19)c = micros();
(20)Serial.print(c-b);
(21)Serial.print('-');
(22)Serial.println(a);
(23)}
<26>
ao bit 2 (ADPS2) do registo ADCSRA.
Atravs da instruo Serial.begin, so enviados, pela porta
srie, os valores do tempo de converso. (Respectivamente
c-b )
Deste modo, ao fazer a diferena entre o valor c (linha 20) e
o valor b (linha 18), vamos obter o valor do tempo
dispendido a executar a funo analogRead. Isto , obtemos
assim o valor real de tempo dispendido a efectuar a
converso de analgico para digital.
No obtendo, como foi referido anteriormente, os valores
tericos calculados.
Concluso
O tema aqui abordado permite uma melhoria das
capacidades do Arduino como datalogger.
electrnica
fcil perceber que, recorrendo ao datasheet do
microcontrolador e sabendo o nome dos registos existentes,
possvel uma configurao mais personalizada desta
ferramenta, isto , qualquer registo existente assim
passvel de ser configurado. O que abre portas para um
rendimento mais elevado, nas aplicaes desejadas.
Este artigo no representa, obviamente, tudo o que h a
aprender sobre este tema, tendo o leitor de, caso tenha
necessidade, aprofundar os seus conhecimentos nesta rea.
Se o primeiro contacto com o Arduino ou sentiu
curiosidade em aprender, leia o artigo Introduo ao
Arduino na 17 edio da revista PROGRAMAR.
Pois o saber no ocupa espao de memria.
Nuno Pessanha Santos um apaixonado pela rea da electrnica e
das telecomunicaes, estando actualmente a frequentar na Escola
Naval o primeiro ano do mestrado integrado no ramo de Armas e
Electrnica na classe de Engenheiros Navais.
nuno.santos@portugal-a-programar.org
Nuno Santos
<27>
Equipa PROGRAMAR
Um projecto Portugal-a-Programar.org
Queres participar na Revista
PROGRAMAR? Queres integrar este
projecto, escrever artigos e ajudar a
tornar esta revista num marco da
programao nacional?
Vai a
www.revista-programar.info
para mais informaes em como
participar,
ou ento contacta-nos por
revistaprogramar
@portugal-a-programar.org
Precisamos do apoio de todos para
tornar este projecto ainda maior...
contamos com a tua ajuda!

Você também pode gostar