Escolar Documentos
Profissional Documentos
Cultura Documentos
Revista - PROGRAMAR - 33-KINECT Hack PDF
Revista - PROGRAMAR - 33-KINECT Hack PDF
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
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
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
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.
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.
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;
public MainWindow()
{
InitializeComponent();
}
7
TEMA DA CAPA
Kinect Hack
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();
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;
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;
depthBitmap.UnlockBits(data);
return depthBitmap.getBitmapImage();
}
catch (Exception ex)
{
throw ex;
}
}
10
TEMA DA CAPA
Kinect Hack
Notas finais
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!
* 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:
14
A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 3)
CONCLUSO
BIBLIOGRAFIA
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
Exemplo 1
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);
this.Super = Ponto;
this.Super(x,y);
*/
Exemplo 2
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();
};
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 x = p3.obterX();
var y = p3.obterY();
var z = p3.obterZ();
Terminando:
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
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
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;
Preliminares em POO
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.
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.
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.
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;
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.
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:
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
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
Console.WriteLine()
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
32
VISUAL (NOT) BASIC
Iterators
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
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
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 ;).
38
COMUNIDADE SHAREPOINTPT
Desenvolvimento em SharePoint 2010 - Parte 2
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)
39
COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org
Lista de Logs
40
COMUNIDADE SHAREPOINTPT
Desenvolvimento em SharePoint 2010 - Parte 2
Em termos da estrutura da nova definio de lista temos:
<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>
41
COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org
/// <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]
}
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
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
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):
46
COMUNIDADE NETPONTO http://netponto.org
47
COMUNIDADE NETPONTO
http://netponto.org
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.
48
COMUNIDADE NETPONTO http://netponto.org
<ns0:Destino xmlns:ns0="http://
ComoFuncinamOsMapas.Schema2">
<Pessoa>
<Nome>Elsa Ligia</Nome>
</Pessoa>
</ns0:Destino>
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. }
49
COMUNIDADE NETPONTO
http://netponto.org
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.
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:
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)
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:
-- #2
-- #3
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.
Federated Tables
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.
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
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
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