Você está na página 1de 60

EDITORIAL

EQUIPA PROGRAMAR Reinventado


H 31 anos aparecia o primeiro computador a receber o acrnimo Personal
Computer, ou PC, no ano de 1981, lanado pela IBM. Muito antes do Computador
Coordenadores Pessoal, outros computadores j existiam, e foram muitas as inovaes que fizeram
Antnio Santos do computador o PC. Em 1968 Douglas Engelbart, inventou um dispositivo
Fernando Martins apontador, que agora conhecido como rato, e faz parte dos PCs como os
conhecemos, e usamos todos os dias, para todas das tarefas que realizamos num
PC.
Editor
Antnio Santos O Altair 8800, deliciou o mundo e os leitores da Popular Electronics, e apesar
de pouco mais fazer do que ligar e desligar algumas luzes foi o impulso para toda
uma evoluo. Em volta dessa mquina um grupo de estudantes e hobistas
Design
interessados fundaram o Homebrew Computer Club, que influenciou o mundo da
Srgio Alves
tecnologia como o conhecemos. A essas maquinas seguiram outras, sempre em
Twitter: @scorpion_blood
constante evoluo at aparecer o que conhecemos como Computador Pessoal,
com teclado, rato, monitor, unidade de disquetes e disco rgido.
Redaco
Seguindo a previso de Gordon E. Moore e at ultrapassando a mesma, os
Bruno Pires
Augusto Manzano pcs evoluram mas sempre tiveram muita coisa em comum com os PCs do
Igor Nunes principio, e o conceito de PC. Ao longo dos anos assistimos a toda uma evoluo
Lus Cunha sem uma ruptura com o passado dos PCs.
Sandro Pereira
Neste momento os tablets abrem todo um novo mundo, quase fazendo
Fernando Martins
Paulo Morgado acreditar que vamos assistir ao fim dos PCs como os conhecemos, para dar lugar a
Pedro Martins uma nova maquina que nos acompanha para todo o lado, onde escrevemos ou at
Rodrigo Pinto ditamos o que pretendemos, sem teclado, sem rato, sem drive de disquetes, mas
Vtor Tomaz acopulvel a uma Docking Station, com teclado, e aos poucos o PC como a maioria
Flvio Geraldes de ns o conheceu, acabar por dar lugar ao novo gadget que encher o nosso
espao, que no lhe conheo ainda o nome pois no um tradicional PC, nem um
tablet, muito menos um Ultra-Mobile PC. A nica coisa que parece certa, que no
Staff futuro o PC como o conhecemos, deixar o engenho de Engelbart, substituindo-o por
Antnio Santos uma tela tctil, os cabos deixaro de povoar os espaos de trabalho e para onde
Fbio Canada quer que formos o computador verdadeiramente pessoal ir connosco.
Fbio Domingos
Jorge Paulino Da minha parte resta-me agradecer a oportunidade que me foi dada, e
Pedro Martins acreditar que a Revista PROGRAMAR ir mais longe e mais alm, pois esta a
Sara Santos minha primeira edio como coordenador. um legado difcil de seguir, o que o
Antnio Silva deixou, mas estou convicto que com toda a equipa levaremos a
Contacto Revista PROGRAMAR para o infinito e mais alm, tal como ele o desejou na sua
revistaprogramar@portugal-a- ultima edio como coordenador. Estou convicto que estaremos altura dos novos
programar.org desafios neste mundo em mudana e que traremos a cada edio novos artigos,
sempre para agradar aos nossos to estimados leitores.

Website
http://www.revista-programar.info
Antnio Santos
<antonio.santos@revista-programar.info>
ISSN
1 647-071 0

A revista PROGRAMAR um projecto voluntrio sem fins lucrativos. Todos os artigos so da responsabilidade dos autores, no
podendo a revista ou a comunidade ser responsvel por alguma impreciso ou erro. Para qualquer dvida ou esclarecimento
poder sempre contactar-nos.

2
NDICE
TEMA DE CAPA
6 Kinect Hacks
Aprenda a programar para este dispositivo da Microsoft. Bruno Pires

A PROGRAMAR
14 Gerao de Nmeros Aleatrios (Parte 3)
O terceiro de 4 artigos do mesmo autor da excelente srie Programao em Lua, desta vez sobre gerao de nme-
ros aleatrios. Augusto Manzano

17 Herana, em JavaScript
Saiba como usar a funcionalidade herana do paradigma da programao orientada por objetos na linguagem de pro-
gramao JavaScript. Lus Cunha

Programao Orientada aos Objetos em Pascal


23 Pensa que o Pascal uma linguagem apenas de aprendizagem e que parou no tempo? Ento mude de ideias e veja
como pode tirar partido do paradigma da programao orientada aos objetos nesta linguagem. Igor Nunes

COLUNAS
30 Visual (not) Basic: Iterators
Saiba como pode utilizar iteradores na prxima verso da linguagem de programao Visual Basic (neste momento
disponvel em Developer Preview). Pedro Martins

34 Core Dump: Ambientes Produtivos


Ser que os ambientes produtivos disponibilizados pela gesto aos trabalhadores so os melhores? Conhea a opini-
o deste autor. Fernando Martins

36 Enigmas de C#: Disposable Structs


Mais um enigma da linguagem de programao C#, desta vez envolvendo Disposable Structs. Paulo Morgado

COMUNIDADES
38 SharepointPT - Desenvolvimento em SharePoint 2010 - Parte 2
Continuao do artigo anterior, desta vez saiba como desenvolver um sistema bsico de logging. Rodrigo Pinto

45 NetPonto - BizTalk Server - Princpios Bsicos dos Mapas - Parte 2


Continuao do artigo sobre princpios bsicos dos mapas publicado na edio anterior. Sandro Pereira

52 AzurePT - SQL Azure Federations na Prtica


Aprenda a implementar o padro Sharding, que permite aumentar a escalabilidade de bases de dados de grandes
dimenses. Vtor Tomaz

EVENTOS
Semana Informtica do IST
Saiba mais informaes sobre este evento www.sinfo.ist.utl.pt e na pagina 59 desta edio

EVENTOS
04 Fev 2012 6 Evento da Comunidade AzurePT
08 Fev 2012 Terceiro Evento da Comunidade HTML5PT
11 Fev 2012 4 Reunio Presencial da Comunidade NetPonto - Coimbra
18 Fev 2012 1 Evento da Comunidade AzurePT - Porto
18 Fev 2012 27 Reunio Presencial da Comunidade NetPonto - Lisboa
22 Fev 2012 XIX encontro da comunidade SQLPort,
17 Mar 2012 SQL Pass Saturday Portugal #115
24 Mar 2012 28 Reunio Presencial da Comunidade NetPonto - Lisboa
Para mais informaes/eventos: http://bit.ly/PAP_Eventos

3
NOTICIAS
Google apresenta alternativa ao "As pessoas vo ter de viver
JavaScript com o que escreveram e parti-
lharam hoje daqui a 20 anos"

A Google apresentou hoje uma nova linguagem de programa- O Conselheiro de Informao para a Inovao e Tecnologia
o para desenvolvimento de aplicaes Web, que visa afir- de Hillary Clinton considera que a longo prazo a memria in-
mar-se como uma alternativa ao popular JavaScript. Os inte- delvel da Internet vai ter implicaes na forma como as pes-
ressados podem comear a experimentar a novidade ainda soas socializam. Porque o que se diz na Internet no desapa-
em fase de testes. rece.

Dart o nome da proposta da gigante das pesquisas, dada a Numa conversa online onde o SAPO Notcias esteve presente
conhecer esta segunda-feira, numa conferncia na Dinamarca como participante, o Conselheiro de Informao para a Inova-
e detalhada numa mensagem publicada no blog da compa- o e Tecnologia da secretria de Estado norte-americana
nhia. defendeu hoje que as redes sociais podem gerar complica-
es no futuro. As pessoas vo ter de viver com o que escre-
veram e partilharam hoje daqui a 20 anos, porque a memria
Segundo avanou o programador Lars Bak, a nova linguagem da Internet no desaparece, explicou. Se partilhamos uma
destina-se a todo o tipo de escalas, desde os projectos pe- frase ou imagem, esses contedos vo estar na rede daqui a
quenos e no estruturados aos grandes e complexos. Os ob- vrios anos.
jectivos enunciados passam pela criao de uma "linguagem
estruturada mas simples" para a programao Web. O especialista em Redes Sociais avanou que preciso estar
atento e ser responsvel pelo que se diz online, para evitar
Oferecer uma alternativa com a qual os programadores se "conflitos" no futuro. As crianas de oito anos podem daqui a
sintam familiarizados e que se apresente como intuitiva, sen- 10 anos ser confrontadas com aquilo que disseram no passa-
do, por isso, fcil de aprender e "assegurar que a nova lingua- do, indicou.
gem garante alta performance em todos os modernos
browsers e ambientes, desde os dispositivos portteis exe- Durante a conferncia, o perito destacou a importncia das
cuo ao nvel do servidor", explica o responsvel online. redes sociais no processo democrtico. A partir do momento
que toda a gente consegue com o seu telemvel registar ima-
A acompanhar a apresentao oficial foi colocado disposi- gens ou vdeos e partilh-los na Internet, isso significa que
o dos programadores um site dedicado nova linguagem, temos mais acesso a informaes e mais democracia, indi-
onde se incluem ferramentas para criao de programas em cou, dando o exemplo da Primavera rabe.
Dart, amostras de cdigo e tutoriais, especificaes da lingua- A Internet "no pode ser controlada"
gem e fruns de discusso.
Relativamente cibersegurana, Alec Ross destacou que as
Os programas criados em Dart podero ser corridos numa redes sociais podem ter um efeito nuclear. Estas ferramen-
mquina virtual dedicada ou recorrendo a um compilador que tas podem ser usadas para boas ou ms causas e no pos-
traduza o cdigo para JavaScript para que este possa ser lido svel controlar isso, explicou. Para o especialista, a melhor
pelos browsers que no suportam a nova linguagem. forma de quebrar a partilha de informaes falsas repor
imediatamente verdade, porque a Internet no deve, nem
O browser da Google dever servir como um veculo para pode ser controlada.
levar a novidade Web. Segundo adiantou Lars Bak, a m- Alec Ross salientou que as redes socias tm um papel funda-
quina virtual de Dart ainda no est integrada no Chrome, mental no desenvolvimento econmico. Quanto mais ligada
mas os responsveis planeiam explorar essa possibilidade. estiver a populao entre si, melhor ser o empreendedoris-
mo e maior ser o crescimento econmico, asseverou. O
Escrito ao abrigo do novo Acordo Ortogrfico norte-americano de 40 anos acrescentou ainda que a estrat-
Fonte: Tek Sapo gia dos Estados Unidas nas redes sociais de "ter voz e ou-
vir. O especialista referiu-se s redes sociais como a forma
de comunicao por excelncia do Sculo XXI e desvalorizou
a ideia de que possam ser mais um veculo de propaganda
poltica.
A propaganda poltica no funciona nas redes sociais porque
h centenas de fontes e as pessoas que esto na internet tm
cada vez mais literacia e formao, concluiu.

Nuno de Noronha Xavier

Este artigo foi escrito ao abrigo do novo acordo ortogrfico.


Fonte: Tek Sapo

4
TEMA DA CAPA
Kinect Hack
TEMA DA CAPA
Kinect Hack
O Kinect um dispositivo para a consola Microsoft Xbox 360, Toda esta comoo gerada volta do Kinect e a sua utiliza-
que atravs da deteco de movimentos e gestos realizados o fora do seu ambiente natural, levou criao da organi-
pelo utilizador ou at atravs do reconhecimento por voz, zao sem fins lucrativos OpenNI (Open Natural Interaction)
permite que o leitor consiga interagir com a consola e com os e em ltima instncia, pressionou a Microsoft para relevar/
jogos de vdeo que suportam este hardware de uma forma alterar os seus planos para o Kinect e disponibilizar o Micro-
natural, substituindo assim os controlos tradicionais que as soft Kinect SDK.
consolas disponibilizam.
Assim, o leitor tem ao seu dispor a escolha entre duas solu-
Foi anunciado pela primeira vez em Junho de 2009 confe- es para desenvolver as suas aplicaes com o Kinect, a
rncia E3 sob o nome de cdigo Natal. Colocado venda Framework OpenNI ou o Kinect SDK da Microsoft, actual-
em Novembro de 2010, o Kinect garantiu um lugar na hist- mente em verso Beta, no entanto j foi anunciado que a
ria, em apenas 60 dias foram comercializados 8 milhes de verso comercial vai estar disponvel em Fevereiro de 2012,
unidades. acompanhada de uma nova verso de hardware, suportado
oficialmente Microsoft.
primeira vista, o Kinect assemelha-se a uma webcam com
um formato no muito convencional, mas na verdade, trata- importante salientar ao leitor que, antes de enveredar por
se de muito mais do que isso. composto por uma cmara qualquer uma destas hipteses, indispensvel verificar os
RGB, um projector de raios IR que em conjunto com uma termos e condies de garantia do dispositivo.
segunda cmara monocromtica de IR constri a informao
em 3D com os meta-dados e um microfone vectorial Kinect Demo
(composto por quatro microfones colocados estrategicamen-
importante que o leitor tenha em mente que as escolhas
te no dispositivo), que o tornam capaz de isolar e identificar
executadas para desenvolver este artigo no so as nicas
as vozes dos vrios jogadores e, para finalizar, possui um
ao seu dispor, a Framework OpenNI suportada em ambien-
pequeno motor que lhe permite ajustar automaticamente o
tes Windows, Linux e Mac OSX com as linguagens C++, C#
seu ngulo de viso para detectar todos os jogadores pre-
e Java, Python, ActionScript, entre outras.
sentes.
O objectivo de esta aplicao demonstrar ao leitor as po-
As caractersticas tcnicas que o Kinect apresenta a um pre-
tencialidades do Kinect e como utilizar este potencial para
o acessvel, suscitaram imediatamente muito interesse a
criar aplicaes inovadoras.
uma comunidade que reconheceu de imediato as potenciali-
dades que um dispositivo como este proporciona.

Sendo assim, ainda durante o ms de lanamento, uma em-


presa ofereceu uma recompensa a quem conseguisse de-
senvolver um driver open-source que permitisse o Kinect ser
utilizado foram do seu mbito, ou seja, fora do ecossistema
da Xbox 360, para que o dispositivo pudesse ser utilizado
para outros fins que no o entretenimento.

Apenas alguns dias aps o seu lanamento, foi disponibiliza-


do um driver para o Sistema Operativo Linux (Libfreenect)
que permitia a utilizao tanto da cmara RGB como dos
sensores de profundidade 3-D. Em Dezembro do mesmo
ano, a empresa PrimeSense, que proprietria de tecnolo-
gia semelhante apresentada pelo Kinect, lanou a sua pr- Figura 1 Aplicao a desenvolver no decorrer do artigo
pria verso do driver Open-Source para Kinect, bem como
O projecto desenvolvido com recurso a C#/WPF com a
um Middleware dotado de um conjunto de funcionalidades
utilizao da Framework OpenNI como base de suporte do
at ento apenas disponveis na consola da Microsoft, como
Kinect.
a capacidade de deteco de gestos e tracking de indiv-
duos. Para simplificar e no sujeitar o leitor a um grande conjunto
de informao sobre OpenNI, pois esse no o objectivo a

6
TEMA DA CAPA
Kinect Hack
que se prope o artigo, no vo ser includos demasiados Existem trs fontes de dados que possvel explorar: RGB,
detalhes sobre esta Framework, no entanto, aconselhada a Depth e IR, todas elas disponibilizam a informao necess-
visita o website http://www.OpenNI.org, onde poder encon- ria para construir uma imagem e os seus metadados.
trar uma vasta documentao sobre o tema.
FrontEnd
Arquitectura
Desenvolvido em WPF, o FrontEnd o interface entre o
Esta aplicao assenta sobre uma soluo que composta Kinect e o utilizador, onde possvel alterar as fontes de
por um conjunto de 8 projectos em C#. Os principais motivos informao do Kinect e assim controlar as suas funcionalida-
que motivaram a essa opo, foram em primeiro lugar, uma des.
gesto cuidada da organizao, diviso de responsabilida-
des e garantir que a arquitectura da aplicao permite que a public partial class MainWindow : Window
{
informao chega ao leitor de forma simples e clara, em se- public enum CameraStream
gundo lugar, dado que o cdigo desenvolvido se tornou de- {
masiado extenso para ser exposto por completo no artigo, VGA,
IR,
optou-se assim por disponibilizar o cdigo fonte no endereo Depth,
http://kinecthack.codeplex.com/ onde leitor pode executar o Skl
seu download e, utilizar livremente, o exemplo demonstrado }
como ponto de partida para uma investigao mais aprofun- private bool isRecording = false;
dada sobre o tema. private bool isPlaying = false;

private PapKinect service;


private CameraStream CameraType;

public MainWindow()
{
InitializeComponent();
}

private void btnDepth_Click(object sender,


RoutedEventArgs e)
{
try
{
if (service != null)
{
service.StopServices();
}
CameraType = CameraStream.Depth;
Figura 2 Arquitectura da aplicao service = new PapKinect
(PapKinect.KinectServiceType.Depth);
service.KinectDataUpdated += new
A camada de FrontEnd uma aplicao WPF onde est EventHandler(service_KinectDataUpdated);
definido o User Interface da aplicao e as aces que so service.ProcessDepth();
}
despoletadas mediante a interaco do utilizador com a apli- catch (Exception ex)
cao. {
MessageBox.Show(ex.Message);
Quando o utilizador executa uma operao, como ligar a }
cmara VGA, a camada de FrontEnd, atravs da camada de }
Service, fornece uma imagem da fonte VGA do Kinect
private void btnIR_Click(object sender,
(Image VGA). Esta lgica da arquitectura aplica-se a todas RoutedEventArgs e)
as fontes de informao ilustradas na Figura 2 identificadas {
com a cor laranja. try
{
if (service != null)
Assim, a lgica da aplicao est na camada Service e os {
dados so processados na camada onde a fonte de informa- service.StopServices();
o que foi pedida. }
CameraType = CameraStream.IR;
service = new PapKinect
Com esta arquitectura possvel, por exemplo, sobrepor a (PapKinect.KinectServiceType.IR);
informao da fonte VGA e Skeleton e apresenta-la cama- service.KinectDataUpdated += new
EventHandler(service_KinectDataUpdated);
da de FrontEnd. service.ProcessInfraRed();
}

7
TEMA DA CAPA
Kinect Hack

catch (Exception ex) {


{ CameraType = CameraStream.Depth;
MessageBox.Show(ex.Message); service = new PapKinect
} (PapKinect.KinectServiceType.Depth);
service.KinectDataUpdated += new EventHandler
} (service_KinectDataUpdated);
}
private void btnVga_Click(object sender, service.StartDepthRecording(filename);
RoutedEventArgs e) }
{ else
try {
{ isRecording = false;
if (service != null) service.StopRecording();
{ MessageBox.Show("Stopped recording.");
service.StopServices(); }
} }
CameraType = CameraStream.VGA; catch (Exception ex)
service = new PapKinect {
(PapKinect.KinectServiceType.VGA); MessageBox.Show(ex.Message);
service.KinectDataUpdated += new EventHandler }
(service_KinectDataUpdated);
service.ProcessVGA(); }
}
catch (Exception ex) private void btnPlayer_Click(object sender,
{ RoutedEventArgs e)
MessageBox.Show(ex.Message); {
} try
} {
if (!isPlaying)
private void btnSkeleton_Click(object sender, {
RoutedEventArgs e) MessageBox.Show("Click again to stop
{ player.");
try string filename = string.Empty;
{ Microsoft.Win32.OpenFileDialog dlg = new
if (service != null) Microsoft.Win32.OpenFileDialog();
{ dlg.DefaultExt = ".oni";
service.StopServices(); dlg.Filter = "OpenNI Recordings (.oni)
} |*.oni";
CameraType = CameraStream.Skl; if (dlg.ShowDialog() == true)
service = new PapKinect {
(PapKinect.KinectServiceType.Skl); filename = dlg.FileName;
service.KinectDataUpdated += new EventHandler }
(service_KinectDataUpdated); else
service.ProcessSkeleton(); return;
}
catch (Exception ex) isPlaying = true;
{ if (service == null)
MessageBox.Show(ex.Message); {
} service = new PapKinect
} (PapKinect.KinectServiceType.Depth);
service.PlayRecording(filename);
private void btnRecorder_Click(object sender, service.GetNewPlayerFrame += new
RoutedEventArgs e) EventHandler
{ (service_GetNewPlayerFrame);
try }
{ }
if (!isRecording) else
{ {
string filename = string.Empty; isPlaying = false;
service.StopPlayer();
MessageBox.Show("Click again to stop service.GetNewPlayerFrame -=
recording."); service_GetNewPlayerFrame;
MessageBox.Show("Player stoppped.");
Microsoft.Win32.SaveFileDialog dlg = new }
Microsoft.Win32.SaveFileDialog(); }
dlg.DefaultExt = ".oni"; catch (Exception ex)
dlg.Filter = "OpenNI Recordings (.oni) {
|*.oni";
if (dlg.ShowDialog() == true) MessageBox.Show(ex.Message);
{
filename = dlg.FileName; }
}
}
isRecording = true;
if (service == null) void service_GetNewPlayerFrame(object sender,

8
TEMA DA CAPA
Kinect Hack
Existem nesta camada um conjunto de mtodos pblicos,
EventArgs e)
{ que so os servios disponibilizados. Esses servios assen-
if (service!=null) tam num conjunto de variveis que so instanciadas conso-
{ ante o servio que requisitado, no entanto, estas variveis
kinectData.Source = esto agrupadas de uma forma lgica.
service.GetPlayerDepthFrame();

} public enum KinectServiceType


{
} VGA,
IR,
void service_KinectDataUpdated(object sender, Depth,
EventArgs e) Skl
{ }

switch (CameraType) private KinectServiceType ServiceType;


public event EventHandler KinectDataUpdated;
{ public event EventHandler GetNewPlayerFrame;

case CameraStream.VGA:
kinectData.Source = service.GetVGAFrame(); O primeiro grupo identifica uma enumerao que utilizada
break; no construtor da classe Service e serve para identificar qual
case CameraStream.IR: o tipo de fonte de informao que o servio vai utilizar para
kinectData.Source = service.GetInfraRedFrame(); executar o seu trabalho, de seguida temos a definio dos
break; eventos que a camada Service vai disponibilizar e que j
case CameraStream.Depth: foram explicados anteriormente.
kinectData.Source = service.GetDepthFrame();
break; private Context ctx;
private DepthGenerator depthGenerator;
case CameraStream.Skl: private IRGenerator irGenerator;
kinectData.Source = service.GetSkeletonFrame(); private ImageGenerator vgaGenerator;
break;

} O segundo grupo identifica as variveis que pertencem a


classes da Framework OpenNI, a classe Context uma clas-
}
se que podemos considerar como base de acesso e configu-
} rao do Kinect, atravs de esta classe que so carrega-
das as configuraes do dispositivo e esta a classe que
Existe uma instncia da classe PapKinect, que permite ace-
gere todas as fontes de informao o leitor tem ao seu dis-
der camada Service. Esta camada disponibiliza um conjun-
por.
to de servios ao FrontEnd, mas o mais importante sem
dvida o evento KinenctDataUpdated, que disparado sem-
Cada fonte de informao disponibilizada pelo OpenNI atra-
pre que existe uma nova frame para ser apresentada, e que
vs do Kinect, tem o seu prprio gerador, a classe DepthGe-
mediante o tipo de fonte de informao que o utilizador esco-
nerator identifica a fonte de informao gerada pelo projector
lhe para visualizar, vai executar um pedido ao mtodo cor-
IR e cmara monocromtica, a classe IR identifica a fonte de
respondente e apresentar a imagem no controlo KinectData.
infra-vermelhos e a classe ImageGenerator identifica a fonte
de VGA.
O evento GetNewPlayerFrame utilizado apenas quando a
aplicao est a reproduzir um vdeo que foi gravado atravs private PapDepth serviceDepth;
de esta aplicao, e como o prprio nome indica, quando private PapIR serviceIR;
private PapVGA serviceVGA;
chamado, o evento executa um pedido camada Service private PapSkeleton serviceSkl;
para esta lhe fornecer um novo frame de vdeo. private PapRecorder serviceRecorder;

private Bitmap depthBitmap;


Service private WriteableBitmap vgaBitmap;
private WriteableBitmap irBitmap;
Como o prprio nome indica, trata-se de uma camada de
servio, o seu objectivo cumprir com os pedidos que lhe De seguida so identificadas as variveis que pertencem s
so requisitados pelo FrontEnd, mantendo contidas dentro classes que tm como responsabilidade processar a informa-
de si, as regras de lgica e de negcio da aplicao, criando o de contexto e do gerador correspondente, bem como os
uma clara separao de responsabilidades entre as vrias Bitmaps que vo conter as imagens depois de a informao
camadas. cedida pelos geradores ser processada.

9
TEMA DA CAPA
Kinect Hack
public void ProcessDepth() Como na camada Service o contexto e gerador j foram inici-
{ alizados, nesta camada apenas inicializado o Bitmap que
depthGenerator = ctx.FindExistingNode vai ser utilizado para guardar a informao que o gerador
(NodeType.Depth) as DepthGenerator;
serviceDepth = new PapDepth(); fornece.
depthBitmap = serviceDepth.StartDataProcessing
(ctx, depthGenerator);
} public unsafe BitmapImage UpdateDepth
(DepthGenerator generator, Bitmap depthBitmap)
A lgica de esta camada est dividida por dois grandes gru- {
try
pos, os mtodos de inicializao e os mtodos de execuo. {
Sempre que o leitor selecciona uma funcionalidade no Fron- var metadata = new DepthMetaData();
tEnd, inicializado na camada de Service o processo corres- var rect = new Rectangle(0, 0,
depthBitmap.Width, depthBitmap.Height);
pondente, esse processo cria o contexto de execuo e inici- var data = depthBitmap.LockBits(rect,
aliza o gerador necessrio, a partir de um ficheiro XML de System.Drawing.Imaging.ImageLockMode.WriteOnly,
configurao, para cumprir a tarefa requisitada, existindo por System.Drawing.Imaging.PixelFormat.
Format24bppRgb);
isso um mtodo com o prefixo Process para cada uma das generator.GetMetaData(metadata);
fontes de informao.
ushort* pDepth = (ushort*)
Seguindo a lgica anteriormente definida, existe um mtodo generator.DepthMapPtr.ToPointer();
com o prefixo Get para cada uma das fontes de informao,
estes mtodos so requisitados sempre que existem novos for (int i = 0; i < metadata.YRes; i++)
{
dados disponveis no Kinect que necessitam de ser proces- byte* pDest = (byte*)data.Scan0.ToPointer() +
sados pela sua fonte de informao. i * data.Stride;

for (int j = 0; j < metadata.XRes; j++,


ImageDepth pDepth++, pDest += 3)
{
uma das camadas de processamento de fonte de informa- pDest[0] = (byte)(*pDepth >> 0);
o, esta tem como objectivo processar a informao que o pDest[1] = (byte)(*pDepth >> 1);
pDest[2] = (byte)(*pDepth >> 2);
DepthGenerator fornece e transforma-la numa imagem. }
}

depthBitmap.UnlockBits(data);
return depthBitmap.getBitmapImage();
}
catch (Exception ex)
{
throw ex;
}
}

Quando o Kinect disponibiliza novos para processamento, o


evento KinectDataUpdated executado e requisitado a
esta camada que processe a informao fornecida pelo
Kinect, que neste caso est contida no DepthGenerator.
Figura 3 Histograma 3D

public Bitmap StartDataProcessing(Context ctx,


DepthGenerator generator)
{ De seguida obtida a metadata contida no DepthGenerator
if (generator != null) e so percorridos todos os pixis do Bitmap de destino, colu-
{
var mapMode = generator.MapOutputMode; na a coluna, e atribuda uma cor a cada pixel consoante a
return new Bitmap(mapMode.XRes, map
Mode.YRes, distncia a que cada pixel identificado no metadata se en-
Sytem.Drawing.Imaging.PixelFormat._
Format24bppRgb); contra do Kinect e, assim, a imagem devolvida trata-se nada
}
else mais, nada menos do que um histograma 3D.
{
throw new Exception("There is no node
defined for Depth, verify OpenNI
config file.");
}
}

10
TEMA DA CAPA
Kinect Hack
Notas finais

O que torna a metadata que o Kinect disponibiliza to inte-


ressante a capacidade que fornece ao leitor de identificar a
distncia a que se encontra cada um dos pixis/objectos do
sensor num sistema geomtrico (com coordenadas x,y,z),
tudo isto em conjunto com um algoritmo de deteco e
tracking de pessoas e/ou gestos, como disponibilizado pelo
OpenNI Nite, permite revelar o verdadeiro potencial do
Kinect ou dispositivos semelhantes como o Asus Xtion
(tambm suportado pelo OpenNI).

Dado que o cdigo escrito para este artigo mais extenso


do que o comum, e sendo um dos objectivos motivar o leitor
e leva-lo a aprofundar os conhecimentos sobre este tema,
bem como proporcionar-lhe uma explicao sobre os pontos
principais do projecto e exemplificar a lgica da arquitectura,
encontra-se disponvel o cdigo fonte de esta soluo no
endereo http://kinecthack.codeplex.com/.

AUTOR
Escrito por Bruno Pires
Exerce funes de consultor de IT na Novabase desde 2008, com experincia de maior relevo nas reas da banca e televi-
so digital, onde ganhou competncias nas mais vrias tecnologias. Membro da Comunidade NetPonto (http://netponto.org) e
autor do blog http://blog.blastersystems.com - Twitter: @brunoacpires

11
DIVULGA A REVISTA
PROGRAMAR E GANHA
UM KINECT!

Para poderes ganhar um Kinect s tens de


divulgar a revista PROGRAMAR e enviar
um email para o endereo
concurso.kinect@revista-programar.info
com o endereo da divulgao*.

* REGULAMENTO/CONDIES DE PARTICIPAO

A divulgao da revista pode ser feita em blogs/pginas pessoais e nas redes sociais (twitter, facebook,
linkedin, etc), devendo referir obrigatoriamente Revista PROGRAMAR n 33 e o endereo http://tiny.cc/
ProgramarED33. Devem ento enviar para o email concurso.kinetic@revista-programar.info o endereo
com a participao, sendo apenas aceite por utilizador:
- um email de divulgao nas redes sociais
- um email de divulgao no blog/pgina pessoal

Assim, caso divulguem nos dois locais, tero duas inscries para poder ganhar um Kinect.

A participao vlida at ao dia 15 de Fevereiro de 2011 e o resultado do sorteio ser divulgado no dia
seguinte. Os moderadores da comunidade Portugal-a-Programar e staff da revista PROGRAMAR no po-
dem participar nesta iniciativa. Todos os casos omissos sero resolvidos pelo staff da revista e no so pas-
sveis de recurso.
A PROGRAMAR
Gerao de nmeros aleatrios (Parte 2)
Herana, em JavaScript
Programao Orientada aos Objectos em Pascal
A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 3)
Nos artigos anteriores foram mostrados os mtodos de Parte inteira inferior, tambm chamada cho, e parte inteira
gerao de nmeros pseudo-aleatrios meio do quadrado do superior, tambm chamada teto apresentada por KNUTH
meio e produto do meio. Em continuao ser mostrado (1999, p. 47).
neste artigo o mtodo RANDU.
A tabela seguinte apresenta a sequncia de dez valores
INTRODUO gerados por meio do mtodo RANDU, a partir da semente
32534.
O algoritmo RANDU foi muito utilizado nas dcadas de 1960
e 1970 para gerar valores aleatrios em computadores de
Iterao Valor interagido RANDU
grande porte (mainframe) da IBM.
0 32534 2132245826
Este considerado por alguns como sendo um dos, seno, o
pior mtodo de gerao de valores pseudo-aleatrios, 1 2132245826 2055763910
segundo informado na WIKIPEDIA (2008), por gerar valores
pares ou mpares, mas nunca mistos. Se a semente 2 2055763910 1734305618
fornecida for mpar, todos os valores gerados so mpares,
se a semente fornecida for par, todos os valores gerados so 3 1734305618 493893110
pares. Assim necessrio ter cuidado com os valores
gerados pelo mtodo. No entanto, deve-se levar em 4 493893110 239509986
considerao que se o mtodo fosse to ruim como alguns
dizem, por qual motivo uma empresa com o porte da IBM o 5 239509986 1286989222
usaria por tantos anos?
6 1286989222 1271378162
O mtodo RANDU opera com valores baixos e com valores
de qualquer quantidade de dgitos, o que uma vantagem 7 1271378162 340333270
sobre os mtodos quadrado do meio e produto do meio. A
faixa de operao de abrangncia dos valores depender da 8 340333270 1337014402
capacidade do computador em uso.
9 1337014402 664119686
Para obter valores pseudo-aleatrios com o mtodo RANDU
deve-se fazer uso da frmula aritmtica:

Onde xi o valor inicial de uma semente e xi+1 o valor


calculado da prxima semente que iterativamente passar a
ser o valor da prxima semente xi.

A operao de diviso encontra-se definida na frmula


dentro da funo parte inteiraque pode ser representada
como:

Apesar das crticas, esse mtodo quando estendido a um


ciclo iterativo de 1000 valores no gera valores zerados.

14
A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 3)

CONCLUSO

Neste artigo foi apresentado o mtodo de gerao de


nmeros pseudo-aleatrios meio do produto, sendo este
mais eficiente que o mtodo do meio do quadrado, pois
demora mais a apresentar valores zerados.

BIBLIOGRAFIA

KNUTH, D. E. The Art of Computer Programming:


Fundamental Algorithms. vol 1, 3. Ed, Massachusetts:
Addison-Wesley, 1999.

WIKIPEDIA, a enciclopdia livre. RANDU. Disponvel em:


<http://en.wikipedia.org
/wiki/RANDU>. Acesso em: 3 jan. 2012, 16:54:52.

AUTOR
Escrito por Augusto Manzano
Natural da Cidade de So Paulo, tem experincia em ensino e desenvolvimento de programao de software desde 1 986.
professor da rede federal de ensino no Brasil, no Instituto Federal de Educao, Cincia e Tecnologia. tambm autor, pos-
suindo na sua carreira vrias obras publicadas na rea da computao.

15
A PROGRAMAR
Herana, em JavaScript
Funo Construtora Ponto
Introduo
Apresentando-se o JavaScript como uma linguagem de pro- var Ponto = function(x,y){
gramao que desfruta de uma sintaxe semelhante do var _x = x;
var _y = y;
Java, C, C++, etc., sendo ainda uma linguagem orientada a
objectos, surge com esta a possibilidade de desenvolver a this.obterX = function(){
herana entre objectos. return _x;
};
Herana

A herana um princpio da programao OO onde se espe- this.obterY = function(){


cifica uma entidade base (no Java ou C# essa entidade return _y;
};
representada por uma classe), onde esta contm toda a in-
formao comum a outras entidades (tambm representada this.iguais = function(ponto){
por classes no Java ou C#) mais particulares. if(this == ponto)
return true;
Essas entidades particulares herdam da entidade base toda
a informao que esta contm, restando apenas adicionar as if (_x == ponto.obterX()
novas caractersticas. && _y == ponto.obterY())
return true;
Para uma melhor compreenso, nada melhor que utilizar
exemplos prticos. return false;
};
Herana, em Javascript

Imagine-se um Ponto, caracterizado pelas suas coordenadas }


x e y. Para caso de exemplo, imagine-se dois outros tipos de
pontos mais especficos: um PontoCor que contm para Vejamos a definio da funo construtora para o objecto,
alm das coordenadas a sua cor, e um Ponto3D, onde as Ponto.
suas coordenadas so definidas a 3 dimenses, sendo ne- Como descrito atrs, o objecto Ponto contm as variveis _x
cessrio a especificao de uma terceira coordenada, z. e _y, que simulam as coordenadas do ponto. So parametri-
zadas na iniciao do objecto e esto acessveis atravs das
propriedades obterX e obterY. Disponibiliza tambm o mto-
do de comparao, iguais.
A criao de objectos do tipo Ponto e a obteno das coor-
denadas ser a seguinte:

Exemplo 1

var p1 = new Ponto(2, 3);


var px = new Ponto(2, 3);

Fig.1 Representao hierrquica das entidades Ponto, PontoCor e var x = p1.obterX();


Ponto3D. var y = p1.obterY();
var iguais = p1.iguais(px);

Se para a representao em Java do modelo de desenho da alert(X: + x + Y: + y + \n


Fig.1, seria necessrio desenvolver trs classes (Ponto, Pon- + "Iguais: " + iguais);
toCor e Ponto3D), em JavaScript ser necessrio criar trs
funes construtoras que sero utilizadas na iniciao dos Quando iniciados os objectos, uma representao da sua
objectos do tipo Ponto, PontoCor e Ponto3D. estrutura, poder ser algo do gnero ilustrado na Fig.2, em
que a varivel p1 tem uma referncia para um objecto Ponto

17
A PROGRAMAR
Herana, em JavaScript
que contm a informao das propriedades, na forma: Na definio anterior, foi anotado em comentrio junto pri-
|nome |valor |. meira instruo dentro do scope da funo, a palavra
Herana. De facto, a instruo:

Ponto.call(this, x, y);

a chave da herana no JavaScript, no contexto deste ar-


tigo1. Qualquer funo que pretenda herdar as caractersti-
cas de Ponto, necessita apenas de incluir esta instruo
(preferencialmente dever ser a primeira instruo dentro da
funo; no que seja obrigatrio, mas por uma questo est-
tica).

A funo call permite invocar uma funo de forma explcita,


onde no primeiro parmetro passado aquele que ser o
Fig.2 Representao dos objectos Ponto em memria.
this dentro da funo que chamada, sendo os restantes
parmetros, os argumentos definidos para a funo.
Uma vez que as variveis _x e _y esto definidas localmente
dentro da funo construtora Ponto, os seus tempos de vida,
Isto torna tudo possvel: o this da funo PontoCor ser o
sero o tempo de vida de execuo da funo. Desta forma
this dentro da funo Ponto e deste modo ir ter acesso s
permitido aceder a estas devido existncia do mecanis-
propriedades que Ponto dispe, garantido assim, a herana
mo de captura de contexto.
das propriedades.
Relembre-se que em cada iniciao de um objecto Ponto, o
this ser sempre o objecto que iniciado. Quer isto dizer que
no Exemplo 1, p1 o this do objecto iniciado tendo por isso 1 A herana em JavaScript, poder ser tambm efectuada
acesso s propriedades obterX e obterY, tal como h propri- atravs da utilizao de prottipos, mas isso seria assunto
edade iguais. para um outro artigo.
Assumindo que este cdigo ser integrado e executado no Nota
contexto de um ficheiro HTML, o browser dever mostrar a
informao das coordenadas, bem como a informao de
comparao dos pontos, ou seja, se o ponto this e o ponto
/*
Ponto.call(this, x, y);
recebido por parmetro, so ou no iguais (tanto em referen-
cia como em coordenadas), que neste exemplo retornar
true. Veja-se a mensagem seguinte, retornada pelo browser: Poderia ser substituda por duas outras instrues:

this.Super = Ponto;
this.Super(x,y);
*/

Em seguida, apresenta-se um exemplo de iniciao de ob-


jectos PontoCor, bem como a chamada s propriedades que
foram herdadas de Ponto.

Fig.3 Janela de alert no browser.

Exemplo 2

Funo Construtora PontoCor var p2 = new PontoCor(2, 3, Azul);


var px = new Ponto(2, 3);

Continuando com a definio das funes que representam var x = p2.obterX();


os objectos ilustrados na Fig.1, apresenta-se em seguida a var y = p2.obterY();
funo construtora para o objecto PontoCor. var cor = p2.obterCor();
var iguais = p2.iguais(px);

alert(X: + x + Y: + y + Cor:

18
A PROGRAMAR
Herana, em JavaScript
+ cor + \n this.obterZ = function(){
+ "Iguais: " + iguais); return _z;
};
Como expectvel, os valores obtidos para as variveis,
iro conter o valor com que o objecto foi iniciado. Em relao // Sobrecarga de mtodos
igualdade entre pontos, utilizada a comparao que foi this.super_iguais = this.iguais;
herdada de Ponto uma vez que um PontoCor e um Ponto
so iguais, se as suas coordenadas forem iguais. A Fig.4, this.iguais = function(ponto3D){
mostra o resultado da execuo do browser de um ficheiro if (!(ponto3D instanceof Ponto3D))
return false;
HTML onde estava contido o cdigo anterior.
return this.super_iguais(ponto3D)
&& _z == ponto3D.obterZ();
};

Concluindo a definio dos objectos propostos inicialmente


(Fig.1), veja-se em seguida a definio para a funo cons-
trutora, Ponto3D.
Fig.4 Janela de alert no browser.
Tal como na definio da funo construtora de PontoCor,
Tal como referido anteriormente, quando iniciado um ob-
tambm a funo construtora Ponto3D inclui na sua defini-
jecto, ele ir conter todas as propriedades na forma |nome
o a instruo:
|valor |. No caso de PontoCor (e qualquer outro objecto que
pretenda usufruir do mecanismo de herana), ir conter adi- Ponto.call(this, x, y);
cionalmente, as propriedades herdadas da entidade base.
uma vez que ir tambm herdar as caractersticas de um
Veja-se na Fig.5, a representao da estrutura do objecto Ponto, s quais ir ainda juntar a nova coordenada z (que
com as suas propriedades, juntamente com as propriedades programaticamente ser a varivel _z). Deste modo, ter
que herdou de Ponto. acesso s propriedades obterX, obterY e iguais, e s quais
ir juntar obterZ, que tambm este executa captura de con-
texto.

Recordando um pouco o que sucede com a herana em


outros ambientes programticos (por exemplo no Java ou
C#), poder, por vrios motivos, surgir a necessidade de
alterar/manipular o comportamento de uma funo que
herdada. O processo de recriar uma funo com o mesmo
nome de uma funo herdada, designa-se de Sobrecarga
(chamado override nas plataformas Java ou C#). Neste con-
Fig.5 Representao dos objectos PontoCor em memria.
texto, ocorreu a necessidade de sobrecarregar a funo
Tal como no objecto Ponto, a varivel _cor fica inacessvel iguais, uma vez que a comparao de dois Ponto3D no
atravs de qualquer objecto PontoCor. Contudo, tambm ir igual comparao feita entre pontos a duas coordenadas.
ser acedida dentro do mtodo obterCor devido h j referida
captura de contexto que realizada pela funo.
De modo a no perder a referncia para a funo herdada
iguais e como forma de reutilizar esse troo de cdigo j
Funo Construtora Ponto3D desenvolvido, foi mantida a referncia numa nova proprieda-
de, super_iguais, que depois utilizada na nova funo refe-
var Ponto3D = function(x,y,z){
renciada pela propriedade iguais.
Ponto.call(this, x, y); Apesar de no se poderem criar novos tipos em JavaScript,
a instruo:
var _z = z;
x instanceof FuncX
Verifica se uma determinada varivel/propriedade x repre-

19
A PROGRAMAR
Herana, em JavaScript
senta um objecto iniciado por uma determinada funo cons- Isto, porque convm no esquecer que a funo foi sobre-
trutora FuncX. carregada para ter um comportamento diferente daquele que
Segue-se o Exemplo 3, onde so ilustrados exemplos de tinha nos objectos Ponto. Logo, o seu cdigo ir estar num
iniciao de objectos Ponto3D, bem como o acesso s suas zona junto com cdigo da funo obterZ. Veja-se ento na
propriedades. Fig.7, o que acaba de ser descrito.

Exemplo 3

var p3 = new Ponto3D(1, 3, 7);


var py = new Ponto3D(1, 3, 7);
var px = new Ponto(1, 3);

var x = p3.obterX();
var y = p3.obterY();
var z = p3.obterZ();

var iguais = p3.iguais(px);


var iguais3D = p3.iguais(py);
Fig.7 Representao dos objectos Ponto3D em memria.
alert(X: + x + Y: + y + Z:
+ z + \n
+ "Iguais: " + iguais + \n Reprensentao dos Objectos
+ "Igual(3D): " + iguais3D);

Tal como expectvel, as propriedades que retornam os


valores das coordenadas do ponto, iro retornar os valores Repare-se na representao dos objectos ao longo do artigo.
com que o ponto foi iniciado, nomeadamente 1, 3 e 7, para x, Os valores das propriedades no contm o cdigo fonte das
y e z, respectivamente. Em relao comparao de objec- funes, referenciando uma zona representada pela circun-
tos utilizando a propriedade iguais, foram realizadas duas ferncia. Isto sucede, uma vez que o cdigo das funes
comparaes: uma primeira onde se compara se o ponto p3 mantido numa zona comum a qualquer objecto que seja inici-
igual ao ponto px, onde expectvel que seja retornado ado a partir da funo construtora. Assim, evita-se que todas
false visto que um Ponto3D no um Ponto, e uma segunda as funes de um objecto contenham o cdigo fonte dentro
comparao, onde se compara se o ponto p3 igual ao pon- deste, evitando um desperdcio excessivo de memria pela
to py, onde ai sim, expectvel que o retorno seja verdadei- replicao do cdigo fonte por todos os objectos.
ro.

Por forma a comprovar este facto, o cdigo do exemplo ante- Concluso


rior, foi inserido num ficheiro HTML, e executado pelo
browser, que retornou a seguinte mensagem: Durante o artigo, foi ilustrado um exemplo de desenho para o
caso onde se pretendeu usar o mecanismo de herana, na
definio de pontos. Contudo, desenvolver este mecanismo
torna-se mais simples (espera-se) depois de ler na integra o
artigo.

Terminando:

Fig.6 Janela de alert no browser.

Em relao a uma representao dos objectos iniciados a


partir da funo construtora Ponto3D, os objectos no esca-
pam a uma estrutura algo afigurada com as representaes Qualquer entidade Y que pretenda herdar caractersticas de
dos objectos que se falaram ao longo do artigo. Contudo, uma base X, basta apenas incluir a chamada explicita fun-
existe um pormenor a ter em ateno: a propriedade iguais, o base passando-lhe o this, tais como os restantes par-
no ir ter o cdigo da sua funo na mesma zona onde est metros de iniciao, ou seja:
cdigo dos outros mtodos herdados. var X = function(n){
...

20
A PROGRAMAR
Herana, em JavaScript
} Caso o leitor pretenda testar o cdigo presente no artigo,
var Y = function(n,m){ bem como outro tipos de funcionalidades do JavaScript, po-
der desfrutar da utilizao de uma biblioteca opensource
X.call(this, n); para realizao de testes unitrios em JavaScript, designada
...
QUnit.
}
*/
Bibliografia:
Espera-se que o leitor tenha desfrutado deste artigo, e que
melhor ainda, fique com o conhecimento para desenvolver FLANAGAN, David. JavaScript: The Definitive Guide, 5th
Herana, em JavaScript. Edition. O'Reilly, August 2006

Sugesto Toda a restante informao foi adquirida durante as aulas de


licenciatura.
/*

AUTOR
Escrito por Lus Cunha

Finalista do curso Eng Informatica e de Computadores, pelo Instituto Superior de Engenharia de Lisboa (ISEL). Desempenha
funes de Consultor de TI. http://www.facebook.com/sucunha90

Enigmas de C# - Disposable Structs


por Paulo Morgado

Dada a seguinte estrutura: Qual a sada do seguinte cdigo?

public struct DisposableStruct : IDisposable using (var v = new DisposableStruct())


{ {
public bool isDisposed; v.Dispose();
}
public void Dispose()
{ var s = new DisposableStruct();
Console.WriteLine( using (s)
this.isDisposed {
? "Already disposed!!!" s.Dispose();
: "Disposing..."); }

this.isDisposed = true;
} Veja a resposta e explicao na pgina 36!
}

21
Elege o melhor artigo desta edio
Revista PROGRAMAR
http://tiny.cc/ProgramarED33_V
A PROGRAMAR
Programao Orientada aos Objectos em Pascal
Introduo Doravante, a linguagem Object Pascal ser designada to-
somente por Pascal por duas razes:
H quem pense no Pascal como uma linguagem fraca e anti-
quada que no acompanhou os novos tempos. Mas, na reali- 2. Genericamente, qualquer dialecto derivado do Pascal
dade, o Pascal evoluiu em vrios dialectos, sendo o mais (leia-se Standard Pascal) ser designado exacta e
proeminente o Delphi. somente por Pascal;

3. Para simplificar a leitura do presente artigo.

Os trechos de cdigo aqui presentes foram todos testados


recorrendo ao Free Pascal 2.4.4.

Em todos os cdigos aqui presentes foi utilizado o modo de


compatibilidade com Delphi do Free Pascal, pelo que estar
presente nestes a directiva de compilao {$mode delphi}.

Preliminares em POO

O mbito do presente no artigo no uma explicao alon-


gada deste paradigma. Contudo, vale uma explicao no
mbito do Pascal e daquilo que ser utilizado adiante.

Sero ento abordados os conceitos principais deste paradi-


gma, sendo estes: classes, mtodos, propriedades, instn-
cias, herana e visibilidade (ou proteco).

Hoje em dia possvel programar nesta linguagem segundo Classes, mtodos, propriedades e instncias
o paradigma POO (Programao Orientada aos Objectos),
Uma classe um conjunto de objectos com caractersticas
programar DLLs (Dynamic Link Libraries), fazer programas
iguais. Um mtodo da classe no mais do que uma capaci-
no s em consola mas tambm com recurso a GUI. Permite
dade da classe, ou seja, um procedimento ou funo. Uma
igualmente a ligao a bases de dados, como o MySQL,
propriedade uma caracterstica do objecto. Uma instncia
bem como a criao de IDEs. O grande exemplo o, infeliz-
da classe um objecto com todas as caractersticas dessa
mente descontinuado, IDE Dev-Pascal, da Bloodshed, um
mesma classe.
IDE open-source, escrito totalmente em Delphi e recorrendo
a uma velha verso do FPC (Free Pascal Compiler) e do De forma prtica, vamos considerar este paradigma num
GPC (GNU Pascal Compiler) como compiladores opcionais caso da vida real.
integrados.
Considere-se a classe Ser Humano:
Posta esta breve introduo, os objectivos para o presente
artigo so: Propriedades altura, peso, idade, sexo, cor do ca-
belo.
1. Dar a conhecer noes tericas bsicas sobre o para-
digma POO;
Mtodos andar, falar, sentar, dormir, cozinhar, tra-
balhar.
Apresentar o dialecto Object Pascal;
Igor Nunes uma instncia desta classe, por exemplo. Sen-
Utilizar ferramentas do Free Pascal e do Delphi para do uma instncia, Igor Nunes ter exactamente as proprieda-
criar programas segundo o paradigma POO des altura, peso, idade, etc., bem como os mtodos andar,
falar, dormir, etc. J a instncia Joo ter exactamente as
Criar uma classe til para os leitores. mesmas propriedades e mtodos. O prprio leitor uma
instncia desta classe!

23
A PROGRAMAR
Programao Orientada aos Objectos em Pascal
Herana Considerando a classe Ser Humano, temos que, por exem-
plo:
Uma das capacidades mais impressionantes e teis do para-
digma POO a possibilidade de uma classe herdar mtodos O mtodo falar protegido, j que no visvel a
e propriedades de outra. Neste mbito, temos ento duas outras classes como Leo, Pinguim ou Urso, mas
classes, uma que deriva de outra: visvel s classes que lhe tm herana, como por
exemplo Etnias e Raas;
Classe principal (ou Main Class) classe que tm os mto-
dos e propriedades gerais; A propriedade altura pblica, j que qualquer um
pode ver e saber quanto mede um ser humano em
Classe derivada (ou Inherited Class) classe que vai
altura;
buscar os mtodos e propriedades da anterior deriva da
classe principal. De referir que, se nenhum bloco de visibilidade for criado,
ento tudo o que for declarado na classe considerado p-
blico por default.

Colocada a teoria essencial do paradigma POO, segue-se a


exemplificao da sua implementao em Pascal, no antes
de dar a conhecer o dialecto do Pascal que suporta este
mesmo paradigma.

O Object Pascal

Representao de herana entre classes em UML. Apresentado em 1986, o Object Pascal foi uma linguagem
de programao com a mesma sintaxe do Standard Pascal,
Voltando classe Ser Humano:
de 1971, e j com as modificaes introduzidas pelo Exten-
1. Mamfero uma Main Class de Ser Humano; ded Pascal, e foi concebido por uma equipa da Apple Com-
puter (hoje Apple Inc.), liderada por Larry Tesler, em conjun-
2. Caucasiano uma classe derivada de Ser Humano;
to com o criador do Pascal, Niklaus Wirth.
3. Reino Animal uma Main Class de Mamfero;
O seu nome original teria sido Clascal, e foi concebido devi-
do ao facto de este ser necessrio para uma Framework da
Isto significa ento que, respectivamente: poca, a MacApp.

1. Ser Humano um Mamfero; Deu-se assim o suporte do Pascal ao paradigma POO.

2. Caucasiano um Ser Humano; Com a introduo do POO no Pascal, esta linguagem tornou-
3. Mamfero do Reino Animal. se muito mais poderosa e moderna, sendo cada vez mais
um exemplo da estruturao de um programa, mdulo ou
biblioteca.

Visibilidade de mtodos e propriedades A sintaxe do Pascal variou consoante os dialectos que foram
surgindo. Contudo, podemos ter dois padres de referncia,
A classe pode ter mtodos e propriedades com visibilidades sendo o utilizado neste artigo o segundo:
diferentes:
Free Pascal;
Pblicas podem ser vistos por qualquer outra clas-
se, programa ou unidade; Delphi.

Privadas s podem ser vistos pela prpria classe, Passemos ento implementao em cdigo.
isto , pelos restantes mtodos e propriedades, inde-
pendentemente da sua visibilidade. S esto ocultos Classes
para fora da classe, e no para dentro da classe. So
igualmente ocultos para classes derivadas. Um conjunto novo de palavras reservadas surgiu, e entre
elas esto as palavras reservadas Object e Class. de
Protegidas so visveis to-somente pela classe e referir que um Object pode ser qualquer coisa, sendo, por-
por qualquer outra que derive desta.

24
A PROGRAMAR
Programao Orientada aos Objectos em Pascal
tanto, a me de todos os tipos de dados, incluindo procedi- ser B, por exemplo), e escrever ser o mtodo pblico que
mentos e funes. ir escrever o resultado da funo privada conversor.

Para agora, a palavra que nos interessa a Class. Com esta PROGRAM exemplo;
type CEx = class
palavra reservada criamos uma classe, tal como o seu nome
private function conversor ( const
sugere.
texto : string) : string;
public
Em Pascal, uma classe dever ser sempre declarada num procedure escrever(const texto : string);
tipo (type) j que as instncias da classe sero criadas co- end;
mo variveis (var). procedure CEx.escrever(const texto : string);
begin writeln(conversor(texto));
Este tipo no comea com a palavra reservada begin mas end;
sim com a prpria palavra class, mas termina obrigatoria- function CEx.conversor(const texto : string) :
mente com end. Dentro deste bloco que se cria teremos a string; var i : integer; t : string;
declarao, mas no programao, dos mtodos da classe. begin t := '';
Igualmente, aqui estaro as propriedades. for i:=1 to length(texto) do
t := t + char(ord(texto[i])+1);
Para definir as visibilidades, podemos criar trs blocos. Ne- result := t;
end;
nhuma delas necessita de estar num bloco begin-end j que
BEGIN
se considera que o bloco termina quando encontrada a (* Bloco principal de execuo *)
declarao de um outro bloco, ou o fim da classe. END.

Na prtica, a estrutura de uma classe ser a seguinte:


Como podemos reparar, apesar de conversor ser uma fun-
type Nome_Classe = class private o privada, escrever pode-lhe aceder j que ambos estes
// parte privada mtodos pertencem mesma classe. Em suma, o programa
protected principal poder aceder ao procedimento escrever mas nun-
// parte protegida ca funo conversor.
public
// parte pblica Alm disso, e muito importante de reter, o facto de o mto-
end; do de cada classe ser programado identificando em primeiro
lugar qual a classe a que pertence o mtodo, e s depois
Mtodos dizendo o nome do mtodo.

A parte principal de uma classe o conjunto dos seus mto- procedure/function classe.mtodo({argumentos})
dos as habilidades da classe, os processos que esta
capaz de realizar. E, em Pascal, os mtodos no so mais Fica a nota para o facto de no se ter utilizado a funo pa-
do que procedimentos e funes. dro succ que nos daria de imediato o carcter ASCII se-
guinte percebemos desta forma como funciona esta funo
Na classe, estes apenas so declarados. Nunca so progra- para o caso dos caracteres.
mados nesta parte:
Propriedades
type Nome_Classe = class
private function funcao(const texto : Uma propriedade, por si s, no possui nenhum valor. Uma
tipo_dado) : tipo_output; propriedade um atalho para uma varivel que, e essa
public procedure procedimento ( const sim, possui um valor especfico. Por exemplo, o nosso peso
argumentos : tipo_dado);
uma medida de massa que aparece na balana, mas, por
end;
detrs desse valor, est um mecanismo que mediu, registou
Neste caso no temos mtodos protegidos. Como podemos e fez output desse mesmo valor. Neste exemplo, abordmos
verificar, os mtodos da classe so declarados dentro dos tudo o que h numa propriedade:
seus blocos.
Input de um dado (com o seu devido registo);
Ento, onde so programados? A resposta : tal como outro
procedimento e funo quaisquer: fora do bloco principal do Output desse mesmo dado (com a sua devida leitura).
programa.
Uma propriedade , ento, um conjunto de dois mtodos
Neste caso, queremos que a funo privada conversor con- (um input e outro output) que atribuem e lem o valor de uma
verta um carcter ASCII para o seu sucessor (A passar a varivel da classe.

25
A PROGRAMAR
Programao Orientada aos Objectos em Pascal
property propriedade : tipo_dado read tncia. Caso no faamos a construo, a varivel do tipo da
metodo_leitura write metodo_escrita; classe ser uma referncia nula e, logo, surgir uma excep-
o na execuo do programa.
Para melhor entender este conceito, vamos partir de um
exemplo prtico e que ser j parte da nossa implementao O tipo de dados geral TObject tem o seu construtor: o Crea-
prtica: te. Vamos invocar este construtor nas nossas classes para
podermos construir o nosso. O processo de herana ser
type TAngle = class feito pela palavra reservada inherited.
private VDEG : real; // Varivel da qual depende
a propriedade O construtor dever ser pblico, e declarado pela palavra
procedure DefinirValorDEG(const valor : real); reservada constructor. Poder receber argumentos ou no,
public
property ValorDEG : real depende do processo de construo da classe.
read VDEG write DefinirValorDEG;
end; Regra geral, com o construtor damos os valores por default
s propriedades da classe. Estes valores podero vir dos
procedure TAngle.DefinirValorDEG
(const valor : real); argumentos.
(* Atribui valor propriedade em graus *)
begin type Nome_Classe = class
private // parte privada
self.VDEG := valor; protected // parte protegida
end; public
constructor Create({argumentos do construtor});
end;
Isto o que acontece na prtica e na grande maioria das constructor Classe.Create({argumentos do constru-
tor});
propriedades. Como podemos ver, a propriedade, de seu begin
nome ValorDEG, tem uma varivel por detrs que possui o inherited Create; // Invoca construtor da classe
seu valor: a varivel privada VDEG. ascendente TObject.
(* Cdigo do construtor *)
Aqui comeamos j a ganhar noo da vantagem das visibi- end;
lidades das propriedades: o que nos interessa que se veja Instncia
a propriedade da classe, e no a varivel na qual est atribu-
da o valor dessa propriedade. Assim, mantemos essa vari- Por fim, agora que a classe est criada, vamos criar instn-
vel privada. cias desta. Uma instncia criada por uma varivel do tipo
da classe. Em Pascal:
Para fazer o output da propriedade, bastar ler o valor da
sua varivel VDEG, pelo que o nome do mtodo de escrita var Instncia : Nome_Classe;
o prprio nome da varivel. O mtodo de escrita dever ser
sempre uma funo, mas como a varivel em si uma fun- No bloco de execuo, antes de utilizar qualquer mtodo ou
o, este processo torna-se vlido. atribuir ou ler qualquer propriedade, necessrio criar a ins-
tncia atravs do construtor:
J a escrita necessita de um procedimento. Neste caso,
crimos o procedimento DefinirValorDEG que tem nica e Instncia := Nome_Classe.Construtor({argumentos});
exclusivamente um argumento. Todo e qualquer mtodo de
escrita dever ter um e um s argumento, sendo este do
mesmo tipo que a varivel da qual depende a propriedade. Note-se bem que, no construtor, o nome da classe que se
este argumento que recebe o valor a ser atribudo proprie- coloca e no o nome da instncia!
dade, leia-se varivel. E, daqui em diante, pode-se utilizar qualquer mtodo da clas-
Neste caso, DefinirValorDEG recebe valor e atribu-o se, atribuir e ler propriedades desta, mas, para cada instn-
varivel VDEG. Para no confundir com nenhuma varivel cia, cada valor. Se tivermos dez instncias, cada uma pode
global com o mesmo nome que pode ser criado para o pro- ter um valor diferente para uma mesma propriedade. Isto
grama, utilizamos a palavra reservada self, que indica ao perceptvel no caso da classe Ser Humano:
compilador que a varivel VDEG a referente classe cujo
O Joo pesa 75Kg;
mtodo est ali a ser programado: neste caso, a classe TAn-
gle. O Andr pesa 64Kg;

Construtores A Joana pesa os seus leves 52Kg;

Uma instncia de uma classe, que ser vista a seguir, no J a Mariana chega aos 86Kg;
pode surgir do nada. A instncia tem de ter um construtor de
modo a que a varivel que criarmos seja, de facto, uma ins-

26
A PROGRAMAR
Programao Orientada aos Objectos em Pascal
Destrutor Alm disso, o objectivo que, quando se cria ou se modifica
o ngulo, o valor mude automaticamente para os respectivos
J que neste artigo no vamos criar destrutores, fica a refe-
valores no outro tipo de ngulo. Ou seja, se atribuirmos em
rncia que, para qualquer classe, podemos utilizar o destru-
graus, o valor em radianos modificado automaticamente
tor geral: o Free.
para o valor correspondente.
Instncia.Free;
Por fim, no programa, vamos testar rapidamente o construtor
e os conversores.
Antes de terminar um programa, as instncias devem ser, Passando tudo isto para Pascal:
ento, destrudas:
{$mode delphi} // Utiliza a nomenclatura do Delphi.
Implementao prtica
PROGRAM Teste_Classes;
Terminada que est a introduo terica utilizao de Pro- uses crt, math; // Unidades necessrias
gramao Orientada aos Objectos em Pascal, a melhor for- type TAngulo = (Deg, Rad); // Tipo de ngulo: Graus
//ou Radianos.
ma de consolidar estes conhecimentos com um exerccio
TAngle = class private (* S visvel para a classe
prtico. *) // Variveis onde so //
Criemos, ento, uma classe, de seu nome TAngle, e que //guardados os valores das
//propriedades.
permita guardar o valor de um ngulo em graus e radianos e
VRAD : real; // Radianos
tenha as devidas funes de converso. Para tal, teremos: VDEG : real; // Graus
// Mtodos que permitem atribuir valores s
Mtodos:
//propriedades.
Conversor radianos -> graus; procedure DefinirValorRAD(const valor : real);
procedure DefinirValorDEG(const valor : real);
Conversor graus -> radianos.
public (* Visvel para todo o programa *)
Propriedades: // Propriedades
property ValorRAD : real read VRAD write
Valor do ngulo em graus; DefinirValorRAD; property ValorDEG : real read
Valor do ngulo em radianos. VDEG write DefinirValorDEG;
// Conversores function Deg2Rad(const deg :
real) : real; function Rad2Deg(const rad :
real) : real;
// Construtor da classe
constructor Criar(const valor : real;
TipoAng : TAngulo);
end;
constructor TAngle.Criar(const valor : real;
TipoAng : TAngulo);
(* Construtor *)
begin
inherited Create; // Invoca construtor da classe
ascendente TObject.
Para as propriedades, necessitaremos dos devidos e respec- case TipoAng of
tivos mtodos de escrita: // Conversores, consoante o tipo de ngulo
//introduzido.
Definir valor em graus; Rad : begin self.ValorRAD := valor;
Definir valor em radianos. self.ValorDEG := Rad2Deg(valor);
end; Deg : begin self.ValorDEG := valor;
E, para a criao de uma instncia da classe, necessitare- self.ValorRAD := Deg2Rad(valor);
mos de um construtor, construtor esse que ter dois argu- end;
mentos: end;
end;
Valor do ngulo; procedure TAngle.DefinirValorRAD(const valor :
real);(* Atribui valor propriedade em radianos *)
Tipo de ngulo (graus ou radianos).
begin self.VRAD := valor;
Para o tipo de ngulo, vamos criar especialmente o tipo de self.VDEG := self.Rad2Deg(valor);
dados TAngulo, e que no deve ser confundido com a clas- end;
procedure TAngle.DefinirValorDEG(const valor :
se TAngle, e que assumir os valores deg ou rad, respec-
real); (* Atribui valor propriedade em graus *)
tivamente para graus e para radianos.

27
A PROGRAMAR
Programao Orientada aos Objectos em Pascal
begin self.VDEG := valor; novas palavras reservadas.
self.VRAD := self.Deg2Rad(valor);
A entrada deste paradigma reforou ainda mais o objectivo
end; function TAngle.Deg2Rad(const deg : real) :
desta linguagem de programao: a programao estrutura-
real;
begin result := (pi * deg) / 180; da, com cabea, tronco e membros como se diz na gria
end; popular.
function TAngle.Rad2Deg(const rad : real) : real;
Conclui-se, sendo assim, que, apesar de muitos lhe chama-
begin result := (rad * 180) / pi;
end; rem uma linguagem ultrapassada, o Pascal est longe de ser
var Angulo : TAngle; BEGIN uma linguagem do passado. Pascal uma linguagem do
Angulo := TAngle.Criar(90, deg); // cria ngulo de sculo XXI.
//90
writeln('Em radianos: ', Angulo.Deg2Rad
(Angulo.ValorDEG):0:3); // Converte em radianos
Links teis
Angulo.ValorRAD := pi; // atribui 180 em radianos
writeln('pi(rad) em graus: ', Angulo.Rad2Deg Uma lista de documentos teis da Wiki P@P, relacionados
(Angulo.ValorRAD):0:3); com o presente artigo.
readln; // pausa
Angulo.Free(); Tutorial de Pascal (2011)
END.
Parte I Procedimentos e funes
Parte VI Sucessor e predecessor
Apesar de os valores convertidos serem facilmente obtidos
pela propriedade correspondente ao tipo de ngulo pretendi- Parte VI Lista padro do Pascal
do, a forma como realizmos a converso nos procedimen- Tutorial de Delphi noes bsicas
tos writeln demonstram como se podem utilizar vrios mto- Procedimentos e Funes Passagem por Parmetro / Pas-
dos de uma vez s. sagem por Referncia
Note-se que se pode utilizar o bloco with para se evitar es- Indentao
crever continuamente o nome da instncia seguido do mto-
do ou propriedade que se pretende. Contudo necessria
precauo no caso de haver vrias instncias e classes cu- Fontes biliogrficas de apoio
jos mtodos e propriedades partilham os mesmos nomes.
http://pt.wikipedia.org/wiki/Ficheiro:UML_heranca.GIF
Em caso de dvida sobre o que vai o compilador assumir,
considere sempre escrever na forma completa: no-
me_classe.mtodo().

Fica ento assim uma classe til que o leitor poder utilizar
livremente nas suas programaes em Pascal. Sinta-se
vontade para a expandir com novos mtodos e proprieda-
des, j que a melhor forma de aprender a tentar.

Concluso
Aps este artigo, percebemos que o Pascal, j h quase 30
anos atrs, suporta o paradigma da Programao Orientada
aos Objectos sem que a sua sintaxe original tivesse de ser
alterada: apenas houve ligeiras adaptaes e a entrada de

AUTOR
Escrito por Igor Nunes

Estudante de Cincias Farmacuticas na Universidade da Beira Interior, entrou no mundo da programao aos 14 anos com
TI-Basic. Dois anos depois descobriu o Pascal, que ainda hoje a sua LP de eleio. Mais recentemente introduziu-se ao
VB.NET e ao Delphi.

Membro do P@P desde Abril de 2010 (@thoga31), actualmente membro da Wiki Team e Moderador Local dos quadros de
Pascal e Delphi/Lazarus. Escreveu o novo Tutorial de Pascal da Wiki P@P, bem como os Tutoriais de TI-Basiz Z80 e de Intro-
duo Lgica e Algoritmia.

28
COLUNAS
VISUAL (NOT) BASIC Iterators
CoreDump Ambientes Produtivos
Enigmas de C#: Disposable Structs
VISUAL (NOT) BASIC
Iterators
Os Iterators ou iteradores foram introduzidos no C# 2.0 Estas interfaces so utilizadas por exemplo, numa coleco
(Visual Studio 2005) e agora, com o Visual Studio 2011 List(Of T), Dictionary(Of TKey, TValue), ArrayList, etc.
(Developer Preview), est tambm disponvel no Visual Ba-
sic. Vantagens

Para quem ainda no tem o Visual Studio 2011 Developer Tratar um possvel erro directamente no Iterator;
Preview, pode descarrega-lo atravs desta hiperligao A cada chamada, o Iterator recomea a partir do re-
http://tinyurl.com/6qq8558 torno anterior.

Basicamente um Iterator um mtodo que realiza uma itera- Limitaes


o sobre uma coleco, utilizando o Yield para retornar os
elementos da coleco um-a-um. Os Iterators utilizam um
Um Iterator no pode receber parmetros por refern-
mecanismo assncrono que consegue retornar os itens logo
cia;
que estejam disponveis sem ter de esperar que a coleco
Um Iterator no pode ser utilizado num evento, numa
esteja completamente construda.
instncia de um construtor, num construtor/destrutor
esttico;
Quando estamos a falar de uma coleco grande pode tra-
zer vantagens significativas, quer em tempo, quer em recur- No suporta o mtodo Reset.
sos, uma vez que o tempo de espera diminui e tambm por-
que o seu mecanismo pode evitar a alocao em memria Diferenas entre os Iterators em C# e Iterators em Visual
que seria utilizada caso a coleco estive-se completamente Basic.NET
carregada. So a base da programao genrica. Para obter
a informao basta utiliza uma simples instruo For Each Em VB possvel retornar um item dentro de um blo-
Next directamente numa instncia de um objecto que utilize co Try Catch Finally;
Iterators ou ento numa funo ou propriedade. possvel sair de um Iterator em VB atravs de um
Exit Function ou de um Return, em C# s possvel
Para criar um objecto que utiliza um Iterator basta implemen- utilizando o yield return;
tar uma das seguintes interfaces: Em VB possvel ter um Iterator annimo, em C#
no.
IEnumerable
IEnumerable(Of T) Onde usar
IEnumerator
Os Iterators podem ser utilizados apenas em funes ou
IEnumerator(Of T)
propriedades. Eis alguns exemplos:

Iterator Simples

Este exemplo utiliza uma instruo For Each Next que cha-
ma o Iterator que por sua vez retorna vrios itens utilizando a
instruo Yield. Vamos ento criar um Iterator simples.

Um exemplo de utilizao:

'Iterator com 3 retornos


Private Iterator Function Nomes() As _
System.Collections.IEnumerable
Yield "Pedro"
Yield "Srgio"
Yield "Manuel"
End Function

30
VISUAL (NOT) BASIC
Iterators
No final ele ainda tentou ir para a linha 17 mas como j no
Sub Main() haviam mais retornos a iterao foi dada como finalizada.
'Inicia um ciclo For Each Next
sobre a funo Nomes
For Each S In Nomes()
Console.WriteLine(S) Tempo de Espera
Next
Console.Read()
End Sub Este exemplo mostra como o retorno efectuado de uma
maneira assncrona, para isso vamos utilizar duas funes,
Output: Pedro, Srgio, Manuel ambas devolvem uma coleco do tipo List(Of Integer), mas
uma com Iterators e outra com o mtodo normal

Para entender melhor o comportamento, basta fazer Step


Debug ao cdigo, ao faze-lo podero ver como ele a cada Imports System.Threading
Public Iterator Function _
iterao vai recomear no retorno anterior, evitando assim AlgunsNumerosComIterator() _
que toda a coleco seja novamente percorrida. As IEnumerable(Of Integer)
Yield 1
Thread.Sleep(1000)
O IntelliTrace d numa pequena noo do que se passou: Yield 2
Thread.Sleep(1000)
Yield 3
Thread.Sleep(1000)
Yield 4
Thread.Sleep(1000)
Yield 5
End Function

Public Function _
AlgunsNumerosSemIterator() _
As List(Of Integer)
Dim L As New List(Of Integer)
L.Add(1)
Thread.Sleep(1000)
L.Add(2)
Thread.Sleep(1000)
L.Add(3)
Thread.Sleep(1000)
L.Add(4)
Thread.Sleep(1000)
L.Add(5)
Return L
End Function

Utilizao

'Chama a nossa funo com Iterator


For Each N In AlgunsNumerosComIterator()
Console.WriteLine(N)
Next

Console.WriteLine()

'Chama a nossa funo sem Iterator


For Each N In AlgunsNumerosSemIterator()
Console.WriteLine(N)
Next

Console.ReadKey()

Output::
Analisando os mtodos MoveNext, podemos verificar que no
primeiro retorno foram executadas as linhas 12 e 14 (a linha 1, 2, 3, 4, 5
13 faz parte da linha 12, apenas esta dividida em duas), no 1, 2, 3, 4, 5
segundo retorno foram executadas as linhas 14 e 15 e no
terceiro as linhas 15 e 16.

31
VISUAL (NOT) BASIC
Iterators
As duas funes retornam exactamente a mesma coisa e no
Private PosicaoActual As Integer = 0
mesmo intervalo de tempo, no entanto a primeira, a cada
segundo escreve na consola um nmero enquanto a segun- 'Metodo para preencher a nossa lista
da escreve tudo de uma s vez. Public Sub Adicionar(ByVal Valor As T)
Array(PosicaoActual) = Valor
PosicaoActual += 1
Para compreenderem melhor no h nada como experimen- End Sub
tar.
'Iterator implementado na interface
'IEnumerable(Of T)
Iterator parametrizvel 'Este Iterator utilizado por defeito
'quando percorremos directamente
'a instncia do objecto.
Este exemplo mostra como utilizar um Iterator em que o re- Public Iterator Function _
torno gerado mediante informaes passadas por parme- GetEnumerator() As IEnumerator(Of T) _
Implements IEnumerable(Of T).GetEnumerator
tro. For i = 0 To PosicaoActual - 1
Yield Array(i)
Imports System.Collections.Generic Next
Private Iterator Function _ End Function
SequenciaDeNumeros(
ByVal NumeroInicial As Integer, 'Iterator implementado na interface
ByVal NumeroFinal As Integer) _ ' IEnumerable(Of T)
As IEnumerable(Of Integer) Public Iterator Function _
For NumeroActual As Integer = NumeroInicial _ GetEnumerator1() As IEnumerator _
To NumeroFinal Implements IEnumerable.GetEnumerator
Yield NumeroActual Yield GetEnumerator()
Next End Function
End Function
'Este Iterator retorna os primeiros x
'nmeros da coleco
Utilizao: Public Iterator Function _
Primeiros(ByVal Total As Integer) _
As IEnumerable(Of T)
Sub Main() If Array.Length < Total Then
'Inicia um ciclo For Each Next sobre a funo Throw New Exception(
'SequenciaDeNumeros onde indicado tambm o "Este valor no valido")
'valor inicial e o valor final End If
For Each I In SequenciaDeNumeros(1, 10) For i = 0 To Total - 1
Console.WriteLine(I) Yield Array(i)
Next Next
Console.Read() End Function
End Sub
End Class
Output: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Tipos Annimos (Object) Utilizao:

Sub Main() Sub Main()


'Esta funo retorna um Iterator de tipo anonimo 'Declara uma nova instncia da lista
Dim Coleccao = Iterator Function() As IEnumerable Dim L As New ListaGenerica(Of Integer)
Yield "Pedro" 'Adiciona alguns itens
Yield "Srgio" For i = 1 To 25
End Function L.Adicionar(i)
Next
For Each S In Coleccao() 'Chama o Iterator directamente na instncia
Console.WriteLine(S) 'quando fazemos isto ele pega no Iterator
Next 'por defeito, chamado GetEnumerator()
Console.Read() For Each I In L
Console.WriteLine(I)
End Sub Next
Console.WriteLine()
Output: Pedro, Srgio 'Aqui como esta funo j no implementada
'com a interface, j necessrio indicar o
Com listas genricas 'nome da funo a utilizar
For Each I In L.Primeiros(5)
Console.WriteLine(I)
Public Class ListaGenerica(Of T) Next
'Implementa a interface IEnumerable(Of T)
Implements IEnumerable(Of T) Console.Read()

Private Array As T() = New T(24) {} End Sub

32
VISUAL (NOT) BASIC
Iterators

Output: crona. Ao utilizar Iterators utilizamos uma maneira simples


para diminuir o tempo resposta ao percorrer coleces, con-
1, 2, 3, (), 23, 24, 25. tribuindo assim para uma melhor programao.
1, 2, 3, 4, 5
Referencias
Concluso
MSDN - http://tinyurl.com/79zowdd
Com este artigo dei a conhecer uma nova funcionalidade do Wikipedia - http://tinyurl.com/3yv487
VB e tambm uma nova forma de programar de forma assn- All About Iterators - http://tinyurl.com/78uadzu

AUTOR
Escrito por Pedro Martins
tcnico Nvel III em Informtica/Gesto pela Escola Profissional Cisave moderador do quadro Visual Basic.NET e
ASP.NET na comunidade Portugal-a-Programar e tambm faz parte do staff da WikiTeam

Media Partners da Revista PROGRAMAR

33
CoreDump
Ambientes Produtivos
A rea de informtica um dos casos mais prementes onde seu porttil e ser-lhe atribudo um desktop quando chega ao
a gesto comete erros infantis no que toca disponibilizao cliente, ou ser-lhe atribuda uma secretria onde se encontra
de um ambiente produtivo. Estes erros so particularmente um desktop, mesmo que no seja para seu uso. Quando se
visveis na rea da consultoria, onde aos consultores exter- tenta ligar o porttil acontece sempre o mesmo filme: no h
nos no so dadas as melhores condies de trabalho (e a nenhuma tomada elctrica livre e se por um feliz acaso hou-
bem da verdade, aos colaboradores internos tambm no). ver um ponto de rede livre, este encontra-se desligado no
bastidor.
Um dos erros mais comuns a utilizao de open spaces,
uma ideia que ganhou particular fora a partir dos anos 50 certo que o wifi veio minimizar este problema, mas os hubs
sob a ideia de que colocar mltiplas pessoas num espao de 8 portas e as extenses triplas ligadas a extines quntu-
aberto proporciona mais oportunidades para observar e plas continuam a existir aos molhos em cima e em baixo das
aprender com aqueles que so mais experientes e possuem secretrias, sempre acompanhadas por um emaranhado de
competncias diferentes. Na verdade, h at estudos que fios que gostam de se enrolar nas nossas cadeiras ou nos
provam que a produtividade de curto termo pode aumentar. nossos ps. Tudo isto em edifcios (ditos) modernos que tm
Mas h tambm estudos que mostram que este tipo de ambi- pr-instalao de rede informtica, como tanta vez ouo os
ente pode ter quebras de produtividade at 15% e reduzir o comerciais da rea imobiliria apregoarem. Quem se depara
bem estar das pessoas at 32%.[1] com esta triste realidade sabe que por vezes esta situao
se torna to ridcula que quando se quer carregar um telem-
Mas qualquer pessoa com bom senso no necessita de estu-
vel necessrio lig-lo a uma tomada na casa de banho ou
dos cientficos para observar que totalmente contra-
na copa. Pensar em ter um segundo monitor ligado ao com-
produtivo ter num mesmo espao dezenas de pessoas com
putador ento, nem pensar...
competncias e funes distintas sentadas lado-a-lado. Ra-
pidamente nos apercebemos que impossvel manter a con- Os erros no terminam aqui, e h situaes mais ou menos
centrao para desenhar uma arquitectura quando ao nosso extremas que se tornam to caricatas como ridculas, como
lado est um comercial cujo telemvel toca constantemente seja a situao em que uma impressora tem direito a um
e que passa o dia a falar ao telefone e a gritar com a produ- lugar janela e plantas verdes sua volta e os profissionais
o por no conseguir cumprir o prazo acordado com o clien- se encontram ao fundo da sala, 12 por fila em 3 filas segui-
te. Situao semelhante se passa quanto estamos a pensar das e que nem o estore podem abrir porque o ar condiciona-
numa soluo para um problema complexo e na secretria do no funciona e como tal tm de manter as janelas fecha-
nossa frente se desenrola uma reunio com trs pessoas das. Ou a situao em que a mquina do caf fica mesmo ao
onde por vezes os nimos se exaltam na tentativa de fazer lado da equipa de desenvolvimento, vendo-se forada a su-
ver que determinada opinio a melhor de todas as que se portar o irritante rudo do processo de moagem e compacta-
encontram em discusso. o do caf e extraco da gua, vezes e vezes e vezes
sem conta durante todo dia... Como se no bastasse, toda a
S quem nunca trabalhou num local fechado e sossega-
gente se rene volta da mquina para conversar ou fazer
do no consegue avaliar a extenso dos danos que este
mini-reunies...
tipo de ambiente faz. Mas o que mais me espanta que
este tipo de ambiente continua a ser patrocinado pelos pr- Os exemplos so inmeros, basta olharem vossa volta e
prios clientes, sendo a prtica comum. Sendo os clientes que vo encontr-los sem dificuldade. Estes erros infantis podem
pagam estas falhas de produtividade dos seus colaborado- ser fcil e rapidamente suprimidos. Quem fizer as contas
res e as horas dos consultores externos, deviam ser os pr- ao custo de uma hora de trabalho de todos quantos so
prios a zelarem pelos seus interesses e proporcionar um afectados por estes erros, rapidamente se apercebe que
ambiente produtivo que permitisse a execuo das tarefas o valor obtido at hora de almoo j cobria o investi-
de forma expedita e com qualidade. No entanto, os clientes, mento na melhoria do ambiente para o tornar produtivo.
que tantas vezes se queixam do preo, parecem gostar
de pagar esta factura, uma vez que so os prprios que
Um bom gestor sabe que este tipo de ambiente contra-
atribuem estes horrendos lugares.
produtivo mas, no entanto, estes ambientes prevalecem
Mas h outros erros igualmente infantis que se repetem um
pouco por todo o lado. A falta de tomadas elctricas e pontos
de rede um deles. comum um consultor externo levar o [1] Working in an office is bad for your brain.

AUTOR
Escrito por Fernando Martins
Faz parte da gerao que se iniciou nos ZX Spectrum 48K. Tem um Mestrado em Informtica e mais de uma dcada de expe-
rincia profissional nas reas de Tecnologias e Sistemas de Informao. Criou a sua prpria consultora sendo a sua especiali-
dade a migrao de dados.

34
ENIGMAS C#
Enigmas do C#: Disposable Structs
(continuao da pgina 21) Como esperado, quando se invoca o mtodo Dispose mais
que uma vez na mesma instncia emitida a mensagem
Already Disposed!!!.
Resultado
No entanto, quando a resource-acquisition da forma ex-
Disposing... pression, como o segundo caso, o cdigo expandido
Already disposed!!! para:
Disposing...
Disposing...
DisposableStruct s;
DisposableStruct _s;
s = new DisposableStruct();
Explicao _s = s;
try
Segundo a especificao do C# (8.13) a instruo using {
definida como: s.Dispose();
}
using-statement: finally
using ( resource-acquisition ) {
embedded-statement _s.Dispose();
resource-acquisition: }
local-variable-declaration
expression
Como se pode constatar, o mtodo Dispose invocado uma
Quando a resource-acquisition da forma local-variable- vez para a varivel s e outra para a varivel _s.
declaration, como o primeiro caso, o cdigo expandido
para: Tratando-se de um tipo por valor (value type 1.3) como
so as struct (1.7), cada varivel tem a sua cpia dos dados
e no possvel efectuar operaes sobre uma varivel
DisposableStruct v; afectarem outra (excepto no caso de parmetros ref e out).
v = new DisposableStruct();
try Assim sendo, o mtodo Dispose ao ser invocado uma vez
{ para a varivel s e outra para a varivel _s significa que nun-
v.Dispose(); ca invocado mais que uma vez sobre os mesmos dados.
}
finally
Concluso
{
v.Dispose();
O simples fato de que quando se copia uma instncia de um
}
tipo por valor se est a criar uma nova cpia dos dados, ao
contrrio dos tipos por referncia onde se copia apenas uma
referncia para os dados, faz com que seja necessria espe-
Como se pode constatar, o mtodo Dispose invocado duas cial ateno quando se lida com estes tipos.
vezes para a varivel v.
Ligaes teis

C# Reference

AUTOR
Escrito por Paulo Morgado
licenciado em Engenharia Electrnica e Telecomunicaes (Sistemas Digitais) pelo Instituto Superior de Engenharia de
Lisboa e Licenciado em Engenharia Informtica pela Faculdade de Cincias e Tecnologia da Universidade Nova de Lisboa.
Pelo seu contributo para a comunidade de desenvolvimento em .NET em lngua Portuguesa, a Microsoft premeia-o com o
prmio MVP (C#) desde 2003. ainda co-autor do livro LINQ Com C# da FCA.

36
COMUNIDADES
SharepointPT - Desenvolvimento em SharePoint 2010 - Parte 2
NetPonto - Biztalk Server - Princpios Bsicos dos Mapas (2)
SQL Azure Federations na prtica
COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org

Desenvolvimento em SharePoint 2010 - Parte 2


Restruturao
Refactoring, Feature Activation Dependencies, Event
Receivers e um sistema de Logging
A 1 coisa que reparo, quando revisito o projecto , que te-
Dando continuidade ao artigo anterior de Desenvolvimento nho 1 feature ContentTypes a instalar 2 funcionalidades
em SharePoint 2010 em que foi criada uma funcionalidade distintas , os content types e a definio da lista .
de registo de contactos dos actuais membros da Comunida-
de Portuguesa de SharePoint, neste artigo vamos potenciar Humm.
a nossa soluo com mais uma funcionalidade: um sistema
bsico de logging. No me parece bem, pois em termos de boas prticas de
implementao importante separar contextos, ou seja, de-
Apesar de ser, mais uma vez, um exemplo simples, acaba
veria ter uma feature que instalasse o content type e outra
por demonstrar as potencialidades que a plataforma disponi-
biliza. que instala-se a definio da lista.

Se bem se recordam, a nossa lista de membros da Comuni- Boa prctica #1: Esta questo de restruturao ou refacto-
dade Portuguesa de SharePoint era qualquer coisa como ring em projectos de desenvolvimento SharePoint ou qual-
isto: quer outro tipo, um factor a considerar, SEMPRE . Sejam
crticos nas vossas implementaes e nas das vossas equi-
pas, e experimentem novas formas de desenvolvimento ;).

1. De volta ao nosso projecto, vamos criar uma nova


feature SpugPtMembersList

Seleccionar Features , clicar com o boto direito do


rato para abrir o menu de contexto e seleccio-
nar Add Feature

e em termos do projecto Visual Studio, a estrutura era esta :

38
COMUNIDADE SHAREPOINTPT
Desenvolvimento em SharePoint 2010 - Parte 2

2. Caracterizar a feature : No final teremos algo deste gnero

Title: SpugPtMembersList
Description: Criar definio da lista de membros
Scope: Site
Seleccionar Item SpugPtMembersList (1) da cai-
xa Items in Solutions e pass-lo para Items in
the Feature, seleccionando a opo (seta ) destina-
da a esse efeito (2)

3. Aps esta operao, teremos algo deste gnero:

Feature Activation Dependencies

Para garantir essa operacionalidade, vou utilizar o conceito


de dependncia entre features.

1. Seleccionar a feature SpugPtMembersList , e com o


boto do lado direito, seleccionar a opo View Designer

2. Seleccionar a opo Feature Activation Dependencies,


existente no canto inferior esquerda feature
SpugPtMembersList

Editar na window Solution Explorer o nome da Feature1


para SpugPtMembersList

4. Finalmente, remover o elemento de List Definition da


feature antiga ContentTypes

Seleccionar a feature ContentTypes , e com o boto do


lado direito, seleccionar a opo View Designer
3. Ao seleccionar essa opo, esta expande-se e deve-
mos, seleccionar a opo Add

Seleccionar Item SpugPtMembersList da caixa Items in


the Feature e pass-lo para Items in Solutions
,seleccionando a opo (seta ) destinada a esse efeito (<)

39
COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org

Desenvolvimento em SharePoint 2010 - Parte 2


4. Seleccionar SpugPtMembers ContentType e nova- 2. Caracterizar a feature :
mente a opo Add
Title: SpugPtLogs
Description: Criar lista de provisionamento de logs
Scope: Site

1. Seleccionar o projecto com o boto direito do rato e selec-


cionar a opo Add>NewItem

2. Seleccionar o item List Definition e o digitar o no-


me SpugPtLogs para este item.

3. Seleccionar o boto Add

Neste momento temos a garantia que a feature que instala a


definio de lista no despoletada antes da feature de con-
tent types. :)

Lista de Logs

Este artigo objectiva a criao de um mecanismo de logging


de operaes na lista de membros da SpugPt de forma a
que possamos auditar de alguma forma o provisionamento
de informao.

Assim , precisamos de uma lista complementar para provisi-


onar os logs propriamente disto:

1. Vamos criar uma nova feature SpugPtLogs


4. No ecr seguinte , digitar em What is the display na-
Seleccionar Features , clicar com o boto direito do rato me, o seguinte texto SPugPtLogsList
para abrir o menu de contexto e seleccionar Add Feature
5. Seleccionar em What is the type, a opo Custom
List

6. Seleccionar o boto Finish

40
COMUNIDADE SHAREPOINTPT
Desenvolvimento em SharePoint 2010 - Parte 2
Em termos da estrutura da nova definio de lista temos:

1. Renomear ListInstance1 para Logs

<ListInstance Title="Logs"
OnQuickLaunch="TRUE"
TemplateType="10001" Com a lista de logs criada, passemos ao sistema de logging
Url="Lists/Logs" em si.
Description="Lista de Logs (SpugPt)">
</ListInstance> Event Receivers
</Elements>

Uma das funcionalidades associadas s listas de Share-


Point, que apresenta um grande potencial e acrescenta mais
valor s nossas solues na plataforma, a de podemos
2. Dentro de Logs, editar o Elements.xml para que fique des-
criar e associar Event Handlers a objectos de provisiona-
ta forma (alterar s os elementos a bold)
mento de informao do SharePoint.

<ListTemplate A ideia essencial deste mecanismo despoletarmos algum


="" Name="SPugPtLogsList" =""
="" Type="10001" ="" tipo de funcionalidade quando alguma operao inferida no
="" BaseType="0" ="" contedo provisionado por estes objectos.
="" OnQuickLaunch="TRUE" =""
="" SecurityBits="11" ="" 1. Seleccionar elemento SpugPtMemberLists e adicionar
="" Sequence="410" =""
novo item
="" DisplayName="SPugPtLogsList" =""
="" Description="SPugPtLogsList Definition" =""
="" Image="/_layouts/images/itgen.png"/>
</Elements>

3. Editar o outro Elements.xml visvel para que fique desta


2. Seleccionar template EventReceiver e o digitar o nome
forma (alterar s os elementos a bold)
MembersListEventReceiver para este item
Boa prctica #2: Criar e caracterizar a feature antes da im-
plementao da funcionalidade em si.

Como j criamos a feature todos estes novos elementos so


automaticamente associados a esta feature. Definir a estru-
tura primeiro, s depois as implementaes.

Estrutura do projecto Visual Studio nesta fase:

41
COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org

Desenvolvimento em SharePoint 2010 - Parte 2


3. A ttulo de exemplo, s vamos fazer log de itens que so 5. Substituir a classe MembersListEventReceiver na sua
adicionados, actualizados ou eliminados da lista de mem- totalidade, pelo cdigo abaixo
bros.
/// <summary>
/// List Item Events
Desta forma, seleccionar os eventos respectivos como de- /// </summary>
monstra a figura abaixo, e seleccionar Finish. public class MembersListEventReceiver :
SPItemEventReceiver
{
SPListItem itm = null;

/// <summary>
/// An item was added.
/// </summary>
public override void ItemAdded
(SPItemEventProperties properties)
{
base.ItemAdded(properties);
itm = properties.ListItem;
LogOperation(properties, itm.Title, "
foi adicionado !");
}
/// <summary>
/// An item was updated.
4. Teremos algo deste gnero:
/// </summary>
public override void ItemUpdated
/// <summary> (SPItemEventProperties properties)
/// List Item Events {
/// </summary> base.ItemUpdated(properties);
public class MembersListEventReceiver : itm = properties.ListItem;
SPItemEventReceiver LogOperation(properties, itm.Title, "
{ foi actualizado !");
/// <summary> }
/// An item was added. /// <summary>
/// </summary> /// An item was deleted.
public override void ItemAdded /// </summary>
(SPItemEventProperties properties) public override void ItemDeleted
{ (SPItemEventProperties properties)
base.ItemAdded(properties); {
} base.ItemDeleted(properties);
/// <summary> LogOperation(properties, , " foi apa
/// An item was updated. gado !");
/// </summary> }
public override void ItemUpdated public void LogOperation(SPItemEventProperties
(SPItemEventProperties properties) properties, string memberName, string message)
{ {
base.ItemUpdated(properties); //Valida se a lista Logs existe
} SPList lst = properties.Web.Lists.TryGetList
/// <summary> ("Logs");
/// An item was deleted. if (lst == null)
/// </summary> throw new Exception("Lista de Logs no pro
public override void ItemDeleted visionada");
(SPItemEventProperties properties) //Se existir regista a operao
{ SPListItem itm = lst.AddItem();
base.ItemDeleted(properties); itm["Title"] = String.Concat("O membro ",
} memberName, message);
} itm.Update();
}
// [BEST PRACTICES]>>>
// Desactiva o trigger dos eventos , para que
// possamos fazer as nossas operaes
// Aps as nossas operaes, activa de novo o

42
COMUNIDADE SHAREPOINTPT
Desenvolvimento em SharePoint 2010 - Parte 2
// trigger

bool oldValue;
public MembersListEventReceiver()
{
this.oldValue = base.EventFiringEnabled;
base.EventFiringEnabled = false;
}
#region IDisposable Members
public void Dispose()
{
base.EventFiringEnabled = oldValue;
}
// <<<[BEST PRACTICES]
}

Por cada operao de insero, actualizao e eliminao


de um item de uma lista, a plataforma despoleta vrias ve-
zes a actualizao desse item, levando a que os registo de temos os respectivo log de operaes. :)
logging sejam inseridos mais do que uma vez aquando cada
operao inferida nos registos da lista de membros. Concluso

Embora tenha sido mais uma vez um exemplo muito simples,


Como tal, o cdigo indicado, como [BEST PRACTI- espero que tenha atingido o objectivo.
CES] complementa esta funcionalidade na perfeio
Prximo artigo: Webparts funcionalidades e afins
Assim, ao inserirmos registos na lista de membros.
NOTA: Neste artigo est espelhada numa das imagens uma
funcionalidade que no foi detalhada aqui.

Quem for o mais atento e mais rpido a descobrir e tiver inte-


resse, terei todo o prazer em divulgar um roadmap de suces-
so para iniciao de implementaes desta natureza.
;) Enviem os vossos palpites para spugpt@gmail.com.

Resta-me fazer-vos um convite: todos os meses aos 2 S-


bados, a Comunidade Portuguesa de SharePoint apresenta
2 sesses e chalk talks com membros activos na tecnologia
onde podemos trocar ideias, esclarecer dvidas e acima de
tudo trocar experincias.

Apaream e espero que tenha sido til. Aquele abrao com


muitos Dispose mistura

AUTOR
Escrito por Rodrigo Pinto
SharePoint MVP , Architect, Evangelist, SharePoint Portuguese User Group (SPUGPT) Founder
Com 12 anos de experincia em Software Engineering & Architecture, SharePoint Specialist, Evangelist na Indra. Tem
experincia nas diversas reas do SharePoint ,destacando-se as reas de object model, implementao de solues, e Web
Content Management com contedos media Evangelista acrrimo de um roadmap de best pratices na plataforma SharePoint
assente em rigor e criatividade , procura disponibilizar estas provas de conceito pela comunidade, clientes e parceiros. o
fundador da Comunidade Portuguesa de SharePoint.(www.sharepointpt.org)

43
A encaminhar e direccionar carreiras no
caminho da excelncia na informtica
CURSOS EM DESTAQUE

O QUE J FEZ ESTE ANO PARA AUMENTAR A SUA EMPREGABILIDADE?


Invista em si e no seu CV, faa cursos de formao e recicle os seus conhecimentos!

Descontos especiais para membros da comunidade


Portugal-a-Programar!
http://ciclo.pt/protocolos/portugal-a-programar
Edifcio Bela Vista Office - Estrada de Pao de Arcos, 66 Salas 1-16A e 1-16B - 2735-336 Cacm - Portugal http://ciclo.pt Tel.: +351 214 096 930 e-mail: contacto@ciclo.pt
COMUNIDADE NETPONTO http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas (2)

Os mapas, ou transformaes, so um dos componentes


mais comuns nos processos de integrao. Funcionam como
tradutores essenciais no desacoplamento entre os diferentes
sistemas a interligar. Este artigo tem como objectivo explicar
como os mapas so processados internamente pelo motor
do produto medida que exploramos o editor de mapas do Modelo de processamento dos Mapas
BizTalk Server.
Embora tradicionalmente a informao seja extrada da ori-
gem medida que vai sendo processada, na realidade nos
modelos baseado em XSLT o que acontece exactamente o
Este artigo tem como base o exemplo do artigo publicado na
contrrio: Cada elemento no destino provoca a procura pelo
32 edio da Revista PROGRAMAR onde explicado em
correspondente na origem. Vejamos um exemplo tradicional:
detalhe as funcionalidades bsicas dos mapas e como po-
dem ser implementadas. Pretende ser uma nota introdutria A origem percorrida de inicio ao fim do ficheiro;
e destinada a quem est a dar os primeiros passos nesta
tecnologia. A informao extraida da origem na ordem exacta
que encontrada;
Conforme explicado no artigo anterior, quando estamos a
efectuar uma transformao de mensagens so 5 as funcio- As regras de mapeamento so construidas medida
nalidades comuns que normalmente nos surgem: que a origem percorrida.

Mapeamento simples de um determinado valor (cpia O BizTalk tambm utiliza esta tcnica nas converses dos
directa) ficheiros texto (Flat Files) para formato XML (transformaes
de sintaxe, tambm explicado no artigo anterior), no entanto
Concatenao de valores as transformaes nos mapas utilizam uma abordagem dife-
rente, como iremos verificar mais frente neste artigo.
Seleces condicionadas
Um dos factores importantes quando utilizamos ferramentas
Scripts customizados
de integrao tambm termos em ateno as tecnologias
Adicionar novos dados standards existentes, e foi isso o que os criadores do produto
fizeram. O BizTalk trabalha internamente, quase exclusiva-
Tendo por base estas funcionalidades vamos explicar como mente, com documentos XML, sendo que fazia sentido utili-
o motor de mapas do BizTalk traduz e processa estas liga- zarem uma tecnologia standard para efectuarem este tipo de
es internamente. transformaes, para isso o W3C definiu o XSLT (Extensible
Stylesheet Language Transformation) como o formato pa-
dro para representar as transformaes entre documentos
Para melhor compreendermos o seu funcionamento efectu- XML.
amos algumas alteraes estrutura do esquema (schema)
do documento final: acrescentamos um elemento opcional Desta forma todas as ligaes e functoids que so visiveis
(EstadoCivil) e desorganizamos intencionalmente a estrutu- graficamente na grelha de mapeamentos no so mais do
ra do documento. que uma representao grfica de um documento XSLT que
permite transformar o documento de origem num determina-
do formato especificado pelo esquema de destino.

45
COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas (2)


Podemos dizer que os mapas de BizTalk tm sempre o seu Adicionalmente, iremos efectuar uma lgica de mape-
foco no documento final, fazendo assim sentido que as re- amento mais avanado para calcular os totais de cha-
gras de transformao sejam processadas na sequencia madas internacionais e nacionais utilizando ciclos,
requerida para o criar. Quando o mapa compilado, essas seleces condicionas e operaes matemticas.
regras so traduzidas em queries XPATH e funes XSLT
por forma a transformar a informao pretendida, ou seja, as
regras de mapeamento so construidas a partir da estrutura Conforme podem verificar, intensionalmente trocamos a or-
de destino e no da origem como algumas ferramentas tradi- dem dos elementos no esquema de origem, por forma a veri-
cionais. ficarmos com mais facilidade como os mapas de BizTalk
funcionam.
Sendo assim, os mapas de BizTalk seguem o seguinte mo-
delo: Desta forma obtivemos o seguinte mapa final:

O motor de mapeamento do BizTalk percorre a estru-


tura de destino do inicio ao fim;

As regras de mapeamento so construidas e executa-


das conforme os links so encontrados na estrutura
de destino;

A informao extraida da origem quando um link


encontrado na estrutura de destino.

Nota: Podemos utilizar um XSLT criado por uma aplicao


Nota: A ordem pelo qual efectuamos as ligaes entre os
externa e inclu-lo no mapa atravs de XSLT custom script
elementos da origem para os elementos de destino, neste
ou importando um ficheiro XSLT que efectua a transforma-
cenrio, no tem qualquer importncia para o compilador, no
o total do mapa (obviamente o editor grfico do mapa de
entanto o mesmo j no se pode dizer para as functoids. As
BizTalk no representar as ligaes visualmente).
functoids necessitam de determinados parmetros de entra-
da que podem variar sendo a ordem de entrada importante.

Desconstruindo um mapa A imagem anterior do mapa de BizTalk na realidade a se-


guinte representao do documento XSLT: https://
Neste artigo vamos utilizar as operaes bsicas de mapea-
gist.github.com/1597897
mento descritas anteriormente, e analisar as decises toma-
das pelo compilador de mapas do BizTalk Mapper Desig- Com base neste documento vamos seguir o comportamento
ner. Basicamente neste mapeamento existem dois esque- do compilador. O que ele efectua , traduzir as ligaes exis-
mas similares, no qual pretendemos mapear os elementos tentes no mapa medida que os encontra enquanto percorre
da origem no seu correcto destino e ao qual implementamos o esquema de destino:
os seguintes desafios:
O primeiro elemento encontrado Morada, como
tem uma ligao associada, a mesma traduzido por
expresso XPath (Morada/text()) que define o ele-
Concatenar o Nome e Apelido por forma a obtermos o
mento a extrair da origem:
nome completo (concatenao de valores);
O segundo elemento encontrado o CodigoPostal
Mapear a Morada no seu elemento de destino
(mapeamento simples de um determinado valor) <Morada>
<xsl:value-of select="Morada/text()" />
Transformar a data de nascimento em idade (scripts </Morada>
customizados);

O Cdigo Postal s dever ser mapeado se tiver uma que tambm ele tem uma ligao associada. Trata-se
string valida, caso contrrio no ser mapeado de uma seleco condicionada que ser traduzida
(seleces condicionadas); para uma condio XSLT (xsl:if):

O elemento Estado Civil opcional e como no temos <xsl:variable name="var:v1" se-


lect="userCSharp:LogicalIsString(string
elementos para o mapear, o mesmo dever ser igno- (CodigoPostal/text()))" />
rado (adicionar novos dados). <xsl:if test="string($var:v1)='true'">

46
COMUNIDADE NETPONTO http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas (2)

<xsl:variable name="var:v2" select="@Custo" />


select="CodigoPostal/text()" /> <xsl:variable name="var:v9"
<CodigoPostal> select="userCSharp:AddToCumulativeSum(0,string
<xsl:value-of select="$var:v2" /> ($var:v8),&quot;1000&quot;)" />
</CodigoPostal> </xsl:if>
</xsl:if> </xsl:for-each>
<xsl:variable name="var:v10"
O terceiro elemento EstadoCivil, uma vez que no select="userCSharp:GetCumulativeSum(0)" />
tem nenhuma ligao associada, o mesmo ignorado <TotalInternacional>
<xsl:value-of select="$var:v10" />
no mapeamento. </TotalInternacional>

O quarto elemento processado NomeCompleto, </Facturacao>
este elemento tem uma ligao associada, que cor-
responde ao valor $var:v3 que construdo a partir da A sequncia das ligaes
concatenao dos vrios inputs e a execuo da fun-
o userCSharp:StringConcat que visualmente era o A ordem com que as ligaes so associadas no destino
String Concatenate Functoid: tem um grande impacto no resultado final. Esta afirmao
verdadeira e ao mesmo tempo falsa!
<xsl:variable name="var:v3" Na realidade a ordem com que associamos as ligaes
select="userCSharp:StringConcat(string
(Drag&Drop) dos elementos de origem para diferentes ele-
(Nome/text()) , &quot; &quot; , string
(Apelido/text()))" /> mentos de destino irrelevante, uma vez que o compilador,
<NomeCompleto> conforme explicado anteriormente, ir processar pela ordem
<xsl:value-of select="$var:v3" /> correcta Excepto se tivermos de associar diversas ligaes
</NomeCompleto> para o mesmo elemento de destino ou functoid. Nestes dois
ltimos casos a ordem com que se efectua a associao
extremamente importante, podendo originar resultados ines-
O quinto elemento o Idade, uma ligao encon-
perados.
trada o que significa que ir ser efectuado o mapea-
mento do script customizado que estava dentro do
CSharp Inline Scripting Functoid:
Impacto da ordem das ligaes nas functoids
<xsl:variable name="var:v4" se- Uma grande parte das functoids existentes na Toolbox espe-
lect="userCSharp:CalcularIdade(string
(DataNascimento/text()))" /> ra vrios parmetros de entrada, um exemplo prtico a
<Idade> functoid Value Mapping Functoid.
<xsl:value-of select="$var:v4" />
</Idade>
Esta functoid retorna o valor do segundo parmetro se o
Por fim encontrado o n (record) Facturacao com
valor do primeiro for igual a True, caso contrrio no re-
elementos: TotalInternacional e TotalNacional. De
tornado nada. Desta forma necessrio respeitar a ordem
realar que apesar de no termos definido nenhum
com que associamos as ligaes:
ciclo atravs da functoid Loop o compilador e sufici-
entemente inteligente para perceber que estamos a A primeira ligao a associar a esta functoid ter de
tratar de um ciclo e traduzi-lo correctamente, no en- enviar um valor booleano (true/false)
tanto ir criar para cada um dos elementos um ciclo
prprio. Para uma melhor optimizao seria necess- O segundo ser o valor que queremos retornar na
rio utilizarmos um script customizado. functoid.

A troca na associao das ligaes ir originar erros de


<Facturacao> mapeamento ou em resultados inesperados, conforme a
<xsl:variable name="var:v5" functoid utilizada.
select="userCSharp:InitCumulativeSum(0)" />
<xsl:for-each
select="/s0:PessoaOrigem/Chamada">
<xsl:variable name="var:v6" Reorganizao das ligaes (links) nas functoids muito
select="userCSharp:StringLeft(string(@Destino) ,
&quot;4&quot;)" /> fcil, para isso basta abrir o detalhe (duplo clique) e usar os
<xsl:variable name="var:v7" botes de ordenao.
select="userCSharp:LogicalEq(string($var:v6) ,
&quot;+351&quot;)" />
<xsl:if test="string($var:v7)='true'">
<xsl:variable name="var:v8"

47
COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


Este cdigo efectua o mapeamento dos todos os elementos
existentes no n Clientes no esquema de origem, para os
elementos no n Pessoa no esquema de destino.

A segunda Scripting functoid contm um cdigo XSLT idn-


tico (https://gist.github.com/1598161) mas desta vez ir
mapear todos os elementos existentes no n Empregado
no esquema de origem, para os elementos no n Pessoa
no esquema de destino.

O resultado expectvel no documento final aparecerem


todos os clientes no n Pessoa e de seguida todos os em-
pregados. Se trocarmos a ordem da associao das ligaes
no esquema final, iremos verificar que o resultado tambm
ele ir aparecer trocado.

Podemos validar o resultado deste cenrio nos seguintes


links:

Mensagem original:
https://gist.github.com/1598182
Resultado expectado:
https://gist.github.com/1598172
Resultado se trocarmos a ordem da associao:
https://gist.github.com/1598188
Impacto da ordem das ligaes nos elementos no esque-
ma de destino A excepo regra da sequncia das ligaes

Alterar a ordem da sequncia na associao das ligaes no Em resumo, o motor de mapas processa as regras percor-
mesmo elemento do esquema de destino poder tambm ter rendo o esquema de destino do incio ao fim, processando
impacto no resultado final pretendido. as ligaes pela ordem que os encontra e em caso de mlti-
plas ligaes num determinado elemento ou functoid, as
Infelizmente, quando associamos diferentes ligaes no
mesmas so processados pela ordem de associao. Isto
mesmo elemento, no existe nenhuma forma ou local no
significa que as ligaes associadas aos ns pais so pro-
editor grfico onde podemos verificar a ordem da associa-
cessadas antes das ligaes associadas aos filhos.
o, semelhana do que acontece com as functoids. A
nica forma de verificarmos a ordem nestes casos inspec- Um exemplo deste cenrio o uso de condies no n pai
cionar o cdigo XSLT gerado ou testando o mapa. quando pretendemos condicionar o resultado final segundo
uma determinada condio. Vamos ento procurar todos os
Um bom exemplo deste cenrio quando associamos duas
nomes dos clientes do sexo feminino. Para isso iremos criar
Scripting functoid com diferentes inline XSLT scripts ao mes-
um mapa com as seguintes configuraes:
mo destino, uma vez mais a troca na associao poder ter
resultados inesperados.

Neste exemplo a 1 Scripting functoid contm o seguinte


cdigo XSLT:
<xsl:for-each select="Cliente">
<Pessoa> Adicionar a Looping Functoid, associando o n de origem
<Nome><xsl:value-of select="Nome/text()" /></ Cliente ao n de destino Pessoa
Nome>
Adicionar uma Equal Functoid e associar o elemento de
<Sexo><xsl:value-of select="Sexo/text()" /></
Sexo> origem Sexo do n Cliente functoid e de seguida a func-
</Pessoa> toid ao n de destino Pessoa
</xsl:for-each>
Editar a Equal Functoid e editar a segunda condio com o

48
COMUNIDADE NETPONTO http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


valor F para construirmos uma equao equivalente a Se- que percorre os vrios elementos do n : obter o valor gera-
xo=F: do na Equal Functoid, representada na varivel v1;

Sendo a segunda operao validar a condio (IF) do valor


da primeira operao (v1), ou seja, vai testar se o valor de
v1 True. Se a condio for verdadeira o cdigo dentro
da condio executado, caso contrrio ir passar para o
prximo elemento sem executar nada. Obtendo assim o out-
put desejado:

<ns0:Destino xmlns:ns0="http://
ComoFuncinamOsMapas.Schema2">
<Pessoa>
<Nome>Elsa Ligia</Nome>
</Pessoa>
</ns0:Destino>

Excepo: Processar ligaes fora de ordem


No entanto existe uma importante excepo a esta regra de
sequncia, especialmente quando utilizamos scripts customi-
zados nos elementos recursivos.

Um bom exemplo deste cenrio a utilizao de scripts de


incremento de contadores. Podemos ilustrar este cenrio,
adicionando duas Scripting Functoids ao mapa:

A primeira contendo a inicializao e incremento do


contador;

int contador = 0;
Ligar o elemento de origem Nome do n Cliente ao public void IncrementarContador()
{
elemento de destino Nome do n Pessoa contador += 1;
}

A Equal Functoid vai retornar o valor True se o elemento A segunda obtendo o valor do contador
Sexo for igual a F, caso contrrio ser retornado o valor
False. O que origina que o n Pessoa s mapeado se o public int RetornarContador()
{
valor retornado for igual a True, obtendo assim a condio return contador;
que pretendamos. }

Se verificarmos o cdigo gerado,

Nota: Este exemplo estar associado a um ciclo (Loop), ou


<xsl:template match="/s0:Origem"> elemento recursivo.
<ns0:Destino>
<xsl:for-each select="Cliente">
<xsl:variable name="var:v1" se-
lect="userCSharp:LogicalEq(string(Sexo/text()) ,
"F")" />
<xsl:if test="$var:v1">
<Pessoa>
<Nome>
<xsl:value-of select="Nome/text
()" />
</Nome>
</Pessoa>
</xsl:if>
</xsl:for-each>
</ns0:Destino>
</xsl:template>

Seria esperado que no primeiro ciclo o resultado do segundo


Iremos verificar que a primeira aco do mapa, aps o ciclo script fosse o valor 1, no segundo ciclo obtivssemos o
valor 2 e assim sucessivamente. No entanto, se testarmos

49
COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


o mapa vamos verificar que a realidade diferente: Cdigo Fonte

Todo o cdigo fonte utilizado neste artigo encontra-se dispo-


<ns0:Destino xmlns:ns0="http:// nvel no MSDN Code Gallery para download:
ComoFuncinamOsMapas.Schema2">
<Pessoa><Linha>0</Linha></Pessoa> Funcionalidades bsicas dos mapas de BizTalk
<Pessoa><Linha>1</Linha></Pessoa>
<Pessoa><Linha>2</Linha></Pessoa>
</ns0:Destino>

Conforme podemos verificar no resultado em cima, a se- Concluso


quncia com que as ligaes so executadas : Com este artigo exploramos alguns mapeamentos comuns
associados aos mapas, tentando desmontar as opes que
Criar o n (elemento) Pessoa;
a mquina tomou para cumprir com a inteno original do
Criar os elementos filhos e executar as ligaes asso- mapa visual.
ciadas aos mesmos: Quando comearem a explorar o mundo dos mapas, existem
Executar a funo RetornarContador que ir duas questes que devem avaliar com maior ateno:
retornar o valor 0 na primeira iterao.

Executar as ligaes associadas ao n pai: Qual a melhor forma para resolver um problema: garanti-
damente existem vrias abordagens para resolver um deter-
Executar a funo IncrementarContador.
minado problema. Muitas vezes decidir a melhor acaba por
Como podemos atestar verificando o cdigo XSL produzido ser o mais difcil. Compilar e analisar o cdigo gerado pode
pelo mapa: ser um bom princpio para comear a conhecer o impacto de
determinadas opes.

<xsl:template match="/s0:Origem"> Testes incrementais: muita das vezes camos na tentao


<ns0:Destino> de tentar resolver um determinado problema de transforma-
<xsl:for-each select="Cliente">
<Pessoa> o de incio ao fim e s depois de finalizarmos que vamos
<xsl:variable name="var:v1" testar a soluo. Deixar para o final pode tornar extrema-
select="userCSharp:RetornarContador()" />
<Linha> mente difcil detectar problemas em mapeamentos comple-
<xsl:value-of select="$var:v1" /> xos. Limitar o mbito dos testes dever ser um processo
</Linha> contnuo e incremental durante a criao de mapas devendo
<xsl:variable name="var:v2"
select="userCSharp:IncrementarContador()" /> ser efectuados logo que seja completado um significativo
<xsl:value-of select="$var:v2" /> bloco de trabalho.
</Pessoa>
</xsl:for-each>
</ns0:Destino>
</xsl:template> Espero que este tipo de Hacking ajude a entender o compor-
tamento e as tcnicas de debugging elementares para este
tipo de problemas. Como todas as reas em constante matu-
Claro que podemos alterar o cdigo existente nas Scripting rao, acompanhar os diferentes autores online provavel-
Functoids por forma a contornamos este comportamento e mente a forma mais natural para ir descobrindo novos pa-
obter assim o resultado pretendido. No entanto este exemplo dres e respectivas solues.
serve para alertar que, em alguns cenrios, especialmente
no uso de scripts customizados nos ns recursivos, neces-
srio verificar e validar a sequncia em que estes so execu-
tados.

AUTOR
Escrito por Sandro Pereira
Actualmente Senior Software Developer na empresa DevScope. Microsoft Most Valuable Professional (MVP) em Microsoft
BizTalk. O seu principal foco de interesse so as tecnologias e plataformas de Integrao (EAI): BizTalk e SOAP / XML /
XSLT e Net, que utiliza desde 2002. um participante bastante activo nos fruns da Microsoft (MSDN BizTalk Server Fo-
rums), contribuidor no MSDN Code Gallery e autor do Blog: http://bit.ly/oFLwB4- Twitter: @sandro_asp Membro da comuni-
dade BizTalk Brasil: http://bit.ly/9NI7ie

50
COMUNIDADE AzurePT
SQL Azure Federations na prtica
Na edio passada introduzimos de forma terica as SQL logins e permisses e apenas sobre ela que podemos
Azure Federations, vamos neste artigo realizar um pequeno executar os comandos de CREATE, ALTER ou DROP de
exemplo prtico e analisar algumas dicas de utilizao das bases de dados e utilizadores. Como vamos criar uma nova
Federations nas nossas aplicaes.
base de dados para executar os exemplos deste artigo
teremos que efectuar uma ligao a essa base de dados.
As SQL Azure Federations so a implementao do padro
de sharding. Sharding um padro que permite aumentar a Neste exemplo estamos a utilizar um servidor de base de
escalabilidade e a performance de grandes bases de dados. dados vazio pelo que a ligao ir ser estabelecida por
Aplicar o padro a uma base de dados significa partir essa omisso sobre a base de dados master. Caso o utilizador
base de dados em pedaos mais pequenos e distribui-los tenha j alguma base de dados criada no servidor dever
por vrios servidores de modo a obter escalabilidade. A cada nas opes do SQL Server Management Studio (SSMS)
pedao resultante chamamos de shard. indicar que pretende ligar base de dados master sob a
pena de a ligao ser criada sobre uma base de dados j
A base de dados raiz (root) poder ter vrias federaes.
existente e no conseguir criar a nova.
Cada federao poder ter vrios membros (shards) e cada
membro poder ter vrias unidades atmicas. A Criar esta base de dados no portal seria muito mais fcil,
escalabilidade mxima atingida quando todas as unidades bastava adicion-la ao servidor pretendido mas, de forma a
atmicas esto contidas em apenas um membro da dar mais alguma experincia aos nossos leitores
federao, ou seja, cada membro de uma federao tem relativamente a ligaes a base de dados em SQL Azure
apenas uma unidade atmica. optou-se por explicar estes detalhes.

Cada membro da federao suportado por uma instncia Para os menos experientes, alerta-se ainda para o facto de
de base de dados SQL Azure. Uma unidade atmica a que o login ter que estar no formato <login>@<server>
unidade mnima indivisvel que poderemos ter dentro dos como pode verificar na imagem seguinte:
membros e representa uma instncia da federation key
(chave da federao).

Exemplo

Vamos assumir que o leitor j dispe de uma instncia de Feita a ligao vamos comear por a base de dados onde
servidor SQL Azure. Caso no tenha pode muito facilmente vamos criar as nossas federations atravs do comando
aceder ao portal de Windows Azure em https:// CREATE DATABASE Demo. Aps este passo, torna-se
windows.azure.com/default.aspx e criar um novo servidor na necessrio mudar a ligao da base de dados master para a
sua subscrio. No se esquea de adicionar o seu base de dados Demo que acabmos de criar.
endereo de IP actual nas regras da firewall.
Note que o comando USE DEMO ir produzir o erro USE
Vamos agora estabelecer ligao base de dados master statement is not supported to switch between databases. Use
do servidor para podemos criar a nossa base de dados de a new connection to connect to a different Database. Sendo
demonstrao. Todos os servidores de SQL Azure dispem necessrio desligar a ligao e voltar a ligar escolhendo
de uma base de dados com o nome master. Esta base de como base de dados Demo ou simplesmente mudando a
dados responsvel, entre outras coisas, por armazenar os ligao atravs da lista de bases de dados disponveis do
SSMS.

52
COMUNIDADE AzurePT
SQL Azure Federations na prtica
Essa mudana de ligao faz-se atravs do comando:

USE FEDERATION ProdutosFed(ID = 0) WITH RESET, FIL-


TERING=OFF

O comando USE FEDERATION prprio do SQL Azure mas


fornece ao utilizador uma experincia de utilizao muito
semelhante ao comando USE do SQL Server.

Caso o leitor se esteja a questionar o porqu do ID=0 , neste


momento a federao tem apenas um membro pelo que
qualquer ID ser vlido para realizar as operaes
pretendidas.

Vamos agora criar o esquema das tabelas da federao:

CREATE TABLE Categoria(


Vamos agora criar o esquema. CategoriaID INT PRIMARY KEY,
Categoria NVARCHAR(100))
No artigo de introduo falmos de dados centralizados.
Dados centralizados so dados sobre os quais no existem CREATE TABLE Produto(
muitas operaes de leitura e escrita e que esto disponveis ProdutoID BIGINT PRIMARY KEY,
Nome NVARCHAR(200),
e que apenas esto disponveis numa nica localizao. Categoria INT REFERENCES Categoria
(CategoriaID),
Neste exemplo vamos criar uma tabela Loja que ir ficar ) FEDERATED ON (ID=ProdutoID)
alojada apenas na nossa base de dados raiz sendo por isso
considerado dados centralizados.
A primeira tabela ser uma tabela de dados de referncia,
CREATE TABLE Loja( que ser replicada por todos os eventuais membros da
LojaID INT PRIMARY KEY, federao, porque no tem o atributo FEDERATED ON. Em
Nome NVARCHAR(100)) oposio, os dados da tabela Produto sero considerados
dados particionados porque j dispe do atributo
At aqui nada de novo, vamos ento dar inicio criao da FEDERATED ON.
nossa primeira federao. Para tal iremos executar o
seguinte comando: Realizando algumas inseres nas tabelas poderemos
verificar que neste momento ambas as tabelas contm todos
CREATE FEDERATION ProdutosFed (ID BIGINT RANGE) os dados.

Como vimos no artigo de introduo, ser criada uma nova INSERT INTO Categoria VALUES (1,'Frescos')
base de dados para alojar esta federao e inicialmente INSERT INTO Categoria VALUES (2,'Secos')
INSERT INTO Categoria VALUES (3,'Lquidos')
todos os seus membros. Aps a execuo do comando
anterior poderemos logo verificar que a nova base de dados INSERT INTO Produto VALUES (10,'Iogurte',1)
j foi criada. INSERT INTO Produto VALUES (20,'Leite',1)
INSERT INTO Produto VALUES (110,'Massa',2)
INSERT INTO Produto VALUES (120,'Cerveja',3)

SELECT * FROM Categoria;


SELECT * FROM Produto;

Antes de criar o schema da nossa federao teremos que


mudar a ligao para a nova base de dados.

53
COMUNIDADE AzurePT
SQL Azure Federations na prtica
Estamos agora em condies de realize o primeiro
particionamento dos dados e iremos realizar essa operao
atravs dos comandos:

USE FEDERATION Root WITH RESET


GO
ALTER FEDERATION ProdutosFed SPLIT AT(ID=100)

O primeiro comando serve para mudarmos a ligao para a


base de dados raiz (Demo). Os comandos de SPLIT e DROP
so sempre executados sobre a base de dados raiz porque
esta a base de dados que contm os metadados que
suportam as operaes.

O segundo comando o comando que efectivamente ordena


o particionamento dos dados.

Com vimos no artigo de introduo, o diviso de uma


federation em duas resulta na criao de duas novas bases O primeiro conjunto de comandos efectua uma ligao 1
de dados e na cpia filtrada dos dados para as respectivas parte dos dados, ou seja, todos os produtos com ID inferior a
bases de dados novas. O tempo que esta operao demora 100.
proporcional dimenso dos dados a copiar mas a
informao mais importante nesta fase ser a de que no O segundo comando efectua uma ligao 2 parte dos
possvel iniciar novo particionamento dos dados sem que o dados (produtos com ID igual ou superior a 100).
anterior tenha terminado.
O terceiro comando usa a opo FILTERING = ON de modo
Para monitorizar a existncia de algum processo de SPLIT a a que a ligao seja filtrada e desta forma s se consiga
ocorrer podemos fazer uso dos metadados presentes na aceder aos dados do ID que foi passado como parmetro. As
base de dados raiz: aplicaes multitenant podero tirar muito partido desta
opo.
select * from sys.dm_federation_operations
Cada uma das bases de dados particionadas ter uma cpia
Aps a operao de SPLIT estar completa termos agora os completa da tabela Categoria dado que se tratam de dados
dados particionados em duas bases de dados. Para verificar de referncia. As consultas a esta tabela so ainda
essa situao vamos realizar algumas consultas e observar independentes do ID e do FILTERING. Caso se pretenda
os resultados: alterar os dados presentes nesta tabela ter que ter em
ateno que ter que realizar essa alterao em todos os
membros da federao (em todas as bases de dados).
-- #1
Como seria de esperar, temos neste momento 3 bases de
USE FEDERATION ProdutosFed(ID = 10) WITH RESET, dados neste servidor, uma base de dados raiz que suporta
FILTERING=OFF os dados centralizados e duas base de dados que suportam,
GO
SELECT * FROM Produto; no nosso exemplo, metade dos dados federados cada uma.
GO

-- #2

USE FEDERATION ProdutosFed(ID = 110) WITH RESET,


FILTERING=OFF
GO
SELECT * FROM Produto;
GO

-- #3

USE FEDERATION ProdutosFed(ID = 110) WITH RESET,


FILTERING=ON
GO
SELECT * FROM Produto;

54
COMUNIDADE AzurePT
SQL Azure Federations na prtica
J falmos nos metadados que esto presentes na base de O nome da federao e tem que ser nico dentro de uma
dados raiz. Atravs de vistas sobre esses metadados base de dados SQL Azure.
poderemos retirar algumas informaes tais como as
federaes presentes, as distribuies de cada federao, O nome da distribuio tambm o identificados que iremos
os membros que cada federao tem e os respectivos utilizar para referir a chave da federao quando, por
limites, etc. exemplo, utilizarmos o comando CREATE TABLE
FEDERATED ON(...) ou o comando USE FEDERATION.
SELECT * FROM sys.federations
SELECT * FROM sys.federation_distributions O tipo de dados ter que ser INT, BIGINT,
SELECT * FROM sys.federation_member_distributions
UNIQUEIDENTIFIER ou VARBINARY(n) onde o n poder ir
at 900.

Neste momento RANGE a nica opo de particionamento


disponvel.

Federated Tables

As tabelas particionadas (federated tables) so as tabelas


que tm os seus dados divididos por vrios membros. Estas
tabelas so criadas dentro das federaes atravs da adio
do atributo FEDERATED ON aquando da criao das
Todas estas operaes podem ser realizadas atravs do mesmas.
SQL Azure Management Portal mas, como j referimos,
tambm objectivo dar mais alguma sensibilidade ao utilizador CREATE TABLE Produto()FEDERATED ON (ID=ProdutoID)
sobre o que realmente se passa l dentro.
necessrio passar como parmetro no atributo qual a
coluna desta tabela que representa a chave da federao.
Relativamente e esta coluna temos as seguintes regras:

O tipo de dados desta coluna tem que ser


obrigatoriamente igual ao tipo de dados da chave da
federao.
No pode ter valor nulo.
No pode ser actualizada para valores fora do range
do membro actual.
No pode ser uma computed column.
Tem que fazer parte de todas as unique e clustered
indexes.
Tem que fazer parte de todas as chaves estrangeiras
Regras para outras federated tables.
Sendo necessrio indicar uma coluna como sendo a coluna
Vamos agora verificar quais as regras para a correcta que representa a chave da federao podemos concluir que
construo de uma base de dados com federaes. todas as tabelas particionadas tm que conter a chave da
federao. Esta regra implica que, em algumas tabelas,
Criao da Federao
tenhamos que proceder a uma desnormalizao do
esquema.
CREATE FEDERATION nome_federacao (nome_distribuicao
<tipo> RANGE) Relativamente a esquema, temos ainda as seguintes regras:
Todas as chaves estrangeiras entre federated tables
Para criar uma federao usamos o comando CREATE
tm que conter a chave da federao.
FEDERATION e alm do nome da federao passamos 3
parmetros, nome da distribuio, tipo de dados e tipo de No podem existir reference tables com chaves
distribuio. estrangeiras para uma federated table.

55
COMUNIDADE AzurePT
SQL Azure Federations na prtica
Uma federated table pode ter chaves estrangeiras FEDERATION para estabelecer a ligao ao membro
para reference tables sem restries. correcto e a partir da podemos fazer uma utilizao como se
de uma base de dados tradicional se tratasse.
Os membros da federao no suportam:
USE FEDERATION ProdutosFed(ID = 1) WITH RESET,
Index Views FILTERING=ON
Colunas Identity No caso em que necessria a participao de dados de
Tipo de dados timestamp e rowversion mais do que um membro da federao o comportamento j
ter que ser diferente. Neste momento as fan out queries no
Note ainda que no obrigatrio que os membros da
so suportadas pelo que teremos que realizar estas
federao tenham todos o mesmo esquema, cada membro
pode ter o seu esquema desde que respeite as regras. S consultas individualmente a todos os membros da federao
podero ser realizadas alterao ao esquema de um e agregar os resultados na aplicao.
membro atravs de ligaes sem filtro (FILTERING=OFF). Mas mesmo neste caso a resoluo do problema no muito
complicada. Podemos tirar partido da vista
Reference Tables sys.federation_member_distributions para obter a lista de
membros da federao e quais os seus limites inferiores e
So tabelas sobre os quais apenas existem operaes de
superiores.
leitura (as escritas so possveis mas raras) e que por
questes de performance esto disponveis em todos os
membros da federao. Os seus dados so copiados
integralmente durante as operaes de SPLIT.

Estas tabelas so criadas dentro dos membros da federao


atravs de CREATE TABLE sem o atributo FEDERATED
ON. No exemplo anterior a tabela Categoria uma reference
Note que o limite mximo superior representado por NULL.
table.
Tenha em conta ainda que apenas na tabela raiz que
Em relao a restries tenha em ateno que no podem consegue obter todos os membros e as suas distribuies.
existir chaves estrangeiras para tabelas particionadas Em cada membro da federao esta vista tambm est
(federated tables) e que as limitaes relativamente a identity disponvel mas tem apenas resultados para o prprio
e timestamp se mantm tambm para reference tables. membro.

S podero ser realizadas alterao a dados ou ao esquema LINQ


de uma referece table atravs de ligaes sem filtro
Como vimos anteriormente ter que ser emitido um USE
(FILTERING=OFF).
FEDERATION antes da primeira consulta base de dados.
Central Tables Em LINQ para SQL existe um pormenor, temos que abrir a
ligao antes de emitir o USE FEDERATION.
As tabelas centrais so tabelas que existem apenas na base
using (DataClasses1DataContext db = new
de dados raiz. So tabelas sobre as quais no existem DataClasses1DataContext())
muitas operaes de leitura ou escrita, normalmente so {
tabelas de metadados ou configuraes. db.Connection.Open();
db.ExecuteCommand("USE FEDERATION ProdutosFed(ID
= 110) WITH RESET, FILTERING=OFF");
Como no so tabelas que fazem parte das operaes de var lista = from p in db.Produtos select new
SPLIT no se aplicam as restries que vimos para os outros { ID = p.ProdutoID, Produto = p.Nome };
tipos de tabelas. Note apenas que os dados destas tabelas dataGridView1.DataSource = lista;
}
no esto visveis quando estamos conectados a um
membro de uma federao. S poderemos aceder a estes Entity Framework
dados atravs de uma ligao directa base de dados raiz.
A utilizao em Entity Framework tem o mesmo requisito,
teremos que abrir a ligao antes de emitir o USE
Utilizao nas aplicaes
FEDERATION.
Podemos dividir a utilizao de SQL Azure Federations em using (DemoEntities db = new DemoEntities())
dois casos. {
db.Connection.Open();
O primeiro e mais simples, acontece quando a carga de string federationCmdText = @"USE FEDERATION
ProdutosFed(ID = 110) WITH RESET, FILTERING=OFF";
trabalho incide sobre uma unidade atmica da federao. db.ExecuteStoreCommand(federationCmdText);
Neste caso basta apenas executar o comando USE

56
COMUNIDADE AzurePT
SQL Azure Federations na prtica
var lista = from p in db.Produto select new { ID = So elas lazy loading, LoadProperty() e Load().
p.ProdutoID, Produto = p.Nome };
dataGridView1.DataSource = lista; Em alternativa deveremos fazer eager loading. Lazy loading
} trata-se de apenas inicializar os objectos no momento em
que estes so necessrios. Eager loading o contrrio de
lazy loading, ou seja, iniciar os objectos no momento em que
Tem ainda outro requisito, as SQL Azure Federations no
so criados.
suportam MARS (Multiple Active Result Sets). Devido a esta
situao teremos que modificar a connection string com Em LINQ podemos fazer eager loading atravs do mtodo
multipleactiveresultsets=False; DataLoadOptions.LoadWith<T>() de modo a que todos os
resultados sejam obtidos da base de dados no momento da
<add name="DemoEntities" connectionString="() instanciao.
multipleactiveresultsets=False; () />
Em Entity Framework, o eager loading realizado atravs do
mtodo Include:
A inexistncia de suporte a MARS (Multiple Active Result
Sets) um assunto importante que iremos ver mais frente. DataLoadOptions dataLoadOptions = new DataLoadOp-
Entity Framework Code First tions();
dataLoadOptions.LoadWith<Produto>(c =>
Em Entity Framework Code First a abertura da ligao feita c.Categoria);
de forma ligeiramente diferente porque ObjectContext utiliza db.LoadOptions = dataLoadOptions;
um tipo de ligao diferente.
Outra opo utilizar o mtodo ToList() ou ToArray() antes
de um ciclo de modo a que os resultados possam ser logo
((IObjectContextAdapter)
db).ObjectContext.Connection.Open();
var produtos = from p in db.Produto.Include
("Categoria1") select p;
Transaces
Relativamente a transaces temos que ter ainda em conta
trazidos para memria no momento da construo. Neste
que o TransactionScope s dever ser instanciado depois de
caso teremos que ter a opo LazyLoading activa.
emitido o USE FEDERATIONS de modo a que a transaco
seja estabelecida sobre o membro da federao. Concluso

using (DemoEntities db = new DemoEntities()) var produtos = (from p in db.Produto select


{ p).ToList();
db.Connection.Open(); foreach (Produto produto in produtos)
string federationCmdText = @"USE FEDERATION {
ProdutosFed(ID = 110) WITH RESET, FILTERING=OFF"; Categoria categoria = produto.Categoria1;
using (TransactionScope scope = new }
TransactionScope
(TransactionScopeOption.RequiresNew))
{
//(...) Esperamos que com este artigo o leitor tenha aprofundado
} mais os seus conhecimentos de SQL Azure Federations e
} que se sinta mais confiante na hora de abordar o uso desta
tecnologia.
Multiple Active Result Sets (MARS)
Actualmente no existe suporte para Multiple Active Result Referncias
Sets em SQL Azure Federations.
Your Data in the Cloud - http://bit.ly/fnxTNn
Isto significa que no poderemos usar algumas Windows Azure Customer Advisory Team - http://bit.ly/
caractersticas que os ORMs (Object-relational mappin) nos qV4G1n
fornecem actualmente e que so suportadas pelo MARS. MSDN Library - http://bit.ly/wIHmkP

AUTOR
Escrito por Vtor Tomaz
Consultor independente na rea das tecnologias de informao. Tem especial interesse por cloud computing, programao
concorrente e segurana informtica. membro de algumas comunidades tais como Portugal-a-Programar, NetPonto,
AzurePT, HTML5PT e GASP.

57
Veja tambm as edies anteriores da

www.revista-programar.info
Revista PROGRAMAR

30 Edio - Agosto 2011 27 Edio - Fevereiro 2011

e muito mais em
31 Edio - Outubro 2011 28 Edio - Abril 2011
32 Edio - Dezembro 2011 29 Edio - Junho 2011
EVENTOS
XIX Semana da Informtica do IST
Para quem ainda no conhece, a Semana Informtica do IST
(SINFO), um evento organizado desde 1993 pelos alunos
dos cursos de licenciatura/mestrado em Engenharia Inform-
tica e Computadores do Instituto Superior Tcnico, e tem
como objetivo principal aproximao dos alunos de Inform-
tica ao mundo tecnolgico-empresarial que os rodeia, tanto
no panorama nacional como internacional.
Esta iniciativa, que se realiza entre os dias 27 de Fevereiro
e 2 de Maro de 2012, e que este ano atinge a sua XIX edi-
o, conta com um elenco de luxo de personalidades ligadas
informtica ou s tecnologias, onde se pode destacar Ri-
chard Matthew Stallman, fundador do movimento free soft-
ware, do projeto GNU, e da Free Software Foundation
("Fundao para o Software Livre") cuja vinda inteira-
mente patrocinada pela Ordem dos Engenheiros; Joo Da-
mas, um dos guardies das 14 chaves do sistema de nomes
de domnio (DNS); Nuno Subtil Engenheiro de Software
da NVIDIA; Zeinal Bava CEO da Portugal Telecom; Mirko Cada dia, ter um tema, assim:
Gozzo European General Manager na Riot Games, empresa
2-feira 27 de Fev.: Jogos e Multimdia
bastante conhecida pelo jogo League of Legends; Paulo
Taylor, cofundador do Ebuddy, e vencedor do prmio de
Empreendedorismo Inovador da Dispora Portuguesa em 3-feira 28 de Fev.: Inteligncia Artificial e Robtica
2009; Celso Martinho, Board member na PT Inovao, Di-
rector Tecnologia de Produto na Portugal Telecom, CTO e
Co-Fundador na SAPO e James Portnow, CEO da Rainma- 4-feira 29 de Fev.: Software na Sociedade
ker Games e escritor da Webseries Extra-Credits.
Estaro tambm presentes nas SINFO instituies e empre- 5-feira 01 de Mar.: O Futuro da Web
sas como a Ordem dos Engenheiros, a VILT, a Microsoft, a
Altitude Software, a ANSOL, a Novabase, a Deloitte, a EDP,
a Polcia Judiciria, o Millenium BCP, a Hitachi Consulting, a 6-feira 02 de Mar.: Leic++: Investigao e Empreen-
CapGemini, a Logica, a Indra, a Accenture, a Rumos - entre dorismo Para o ltimo dia ficou reservado o tema
outras. LEIC++: Investigao e Empreendedorismo.
Segundo a organizao do evento, a SINFO primariamente
direcionada aos alunos de Informtica do Instituto Superior
A comunidade Portugal-a-Programar associa-se a esta
Tcnico e outras faculdades. No entanto, dada a grande
abrangncia de temas tecnolgicos e atividades, o pblico- iniciativa como media partner.
alvo alarga-se aos restantes alunos da instituio e a qual-
quer indivduo ou empresa que se interesse pelos temas
abordados, incluindo professores, empresas ou simples curi-
osos. Sendo por isso um evento direcionado para todos os
interessados nesta matria.
O evento ir decorrer no campus da Alameda do Instituto
Superior Tcnico, e abrange dois edifcios em simultneo, o
Pavilho Central e o Pavilho de Civil, que alberga um anfite-
atro com lotao para 300 pessoas e duas salas de
showroom com capacidade para 50 e 70 pessoas, respetiva-
mente.

59

Você também pode gostar