Você está na página 1de 58

EDITORIAL

EQUIPA PROGRAMAR
Coordenadores
Antnio Silva
Fernando Martins
Editor
Antnio Santos
Design
Srgio Alves
Twitter: @scorpion_blood
Redaco
Bruno Pires
Augusto Manzano
Sandro Pereira
Fernando Martins
Nuno Godinho
Paulo Morgado
Srgio Ribeiro
Vtor Tomaz
Flvio Geraldes
Staff
Antnio Santos
Fbio Canada
Fbio Domingos
Jorge Paulino
Pedro Martins
Sara Santos
Contacto
revistaprogramar@portugal-aprogramar.org
Website
http://www.revista-programar.info
ISSN
1 647-071 0

RIP
No inicio de Outubro faleceu Steve Jobs, mais precisamente um dia antes do
lanamento da edio anterior da Revista PROGRAMAR. Sete dias depois faleceu
Dennis Ritchie. Doze dias depois faleceu John McCarthy. Independentemente de se
gostar ou no, a verdade que aquilo que fizeram influenciou a vida de muitas
pessoas. Dennis Ritchie foi um dos pais do C, linguagem que influenciou a vida de
todos os programadores, quer directa quer indirectamente, quer usem ou no C para
programar. John McCarthy foi o pai do Lisp, que apesar de no estar to
disseminado na programao, tm uma grande relevncia, principalmente na rea
da Inteligncia Artificial. Steve Jobs levou a Apple rumo ao sucesso, depois da
empresa sem si ter afundado, quase a ponto de se extinguir. E verdade que cada
um fez muito mais, estes so, no entanto, e na minha opinio as marcas mais
importantes de cada um deles.
Assim, no tenho qualquer receio de afirmar que todos eles merecem a nossa
considerao pelo que fizeram e alcanaram, quer se concorde ou no com algumas
ideias e filosofias. Mas a verdade que o mais destacado foi sem dvida Steve
Jobs. Mereceu notcias de abertura em canais de televiso, notcias de primeira
pgina em jornais e revistas, entre outras, enquanto Dennis Ritchie e John McCarthy
ficaram quanto muito com algumas linhas em jornais e revistas, e um pouco mais em
revistas e comunidades ligadas programao e tecnologia. Muitos insurgiram-se
pelo facto de no haver o mesmo destaque entre todos. Mas a verdade que ambos
viviam muito mais sombra da sociedade em geral que Steve Jobs. Contudo no
foram esquecidos. O Fedora 16, lanado cerca de um ms depois da morte de
Dennis Ritchie foi-lhe dedicado. Durante a sua vida John McCarthy recebeu tambm
inmeros prmios, como por exemplo o prmio Turing. Tambm verdade que
muitos se apressaram quase a colocar Steve Jobs num pedestal, removendo-lhe os
defeitos. Mas ele tinha os seus, tal como Dennis e John. Mas seria melhor pessoa,
melhor informtico que os outros dois? provvel que no. Apenas era mais
visvel, e o mediatismo fez o resto. Mas a verdade que terminaram a sua existncia
terrena tal como a conhecamos. Talvez sem puderem dizer um adeus a quem
gostavam ou queriam, tal como Dennis Ritchie que faleceu sozinho em sua casa.
Da minha parte resta-me deixar um obrigado aos trs pela sua contribuio
para as tecnologias da informao, e um at sempre a todos os leitores e equipa da
Revista PROGRAMAR, pois esta ser a minha ltima edio como coordenador.
Foram mais de 3 anos de participao neste projecto, passando por redactor,
revisor, editor e agora coordenador. Bastante tempo, considerando que o projecto
tem aproximadamente 6 anos. Mas saio com a sensao de dever cumprido,
sabendo que fiz todos o que estava ao meu alcance para levar a revista mais longe,
com ajuda de toda a equipa da Revista PROGRAMAR, a quem deixo tambm um
muito obrigado. Durante o tempo que estive como editor e coordenador mudmos o
visual para algo mais apelativo, crimos parcerias com comunidades, passamos a
distinguir os artigos mais votados, entre vrias outras mudanas internas. Tudo isto
graas excelente equipa que torna possvel a existncia da Revista PROGRAMAR.
Saio tambm com a certeza de ser bem substitudo pelo Antnio Santos, aqum
deixo desde j um obrigado, e desejo que com a sua a ajuda a Revista
PROGRAMAR chegue ao infinito e mais alm.
At sempre,
Antnio Silva
<antonio.silva@revista-programar.info>

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.

NDICE
TEMA DE CAPA
7

iOS, Cocoa Touch & MVC


Conhea mais algumas tcnicas de programao para os dispositivos mveis da Apple. Bruno Pires

A PROGRAMAR
15

Gerao de Nmeros Aleatrios (Parte 2)


O segundo de 4 artigos do mesmo autor da excelente srie Programao em Lua, desta vez sobre gerao de nmeros aleatrios. Augusto Manzano

18

Automatizao de tarefas usando atributos


Continuao do artigo sobre atributos em C# da edio nmero 30. Neste artigo, conhea melhor o funcionamento do
conceito de contextos nesta linguagem. Flvio Geraldes

24

SQL Azure Fedarations


Introduo s SQL Azure Federations. Victor Tomz

29

Enigmas de C#: Arrays


Saiba porque motivo, um array pode invocar uma System.ArrayTypeMismatchException. Paulo Morgado

COLUNAS
31

Visual (NOT) Basic - Um pouco mais de Windows Phone 7


Saiba como pode tirar partido de algumas funcionalidades e caractersticas no desenvolvimento de aplicaes para
esta plataforma. Srgio Ribeiro

40

Core Dump - Free as in Beer


Atualmente, as empresas usam software open source, no por ser livre, mas por ser grtis. Conhea a opinio do autor sobre este tema. Fernando Martins

COMUNIDADES
42

AzurePt - Como suportar mltiplas identidades no seu WebSite com Windows Azure AppFabric ACS
Saiba como resolver o problema das identidades em demasia atravs do Azure. Nuno Godinho.

47

NetPonto - BizTalk Server - Princpios Bsicos dos Mapas


Explore atravs deste artigo, o editor de mapas do BizTalk Server. Sandro Pereira

EVENTOS
03
16
17
27
17

Dez 2011
a 18 Dez 2011
Dez 2011
Fev a 1 Mar 2012
Maro 2012

4 Evento da Comunidade Azure PT


Windows Phone 7 App Code Camp (Palmela)
25 Reunio Presencial da Comunidade NetPonto em Lisboa
XIX SINFO - Semana Informtica IST
SQL Pass Saturday Portugal #115

Para mais informaes/eventos: http://bit.ly/PAP_Eventos

NOTICIAS
O que a Microsoft, Oracle, IBM e SAP
No Dizem aos Clientes

invulgares para a facturao da entrada e sada de dados nos


sistemas. Gaughan tambm disse que uma grande transio
tecnolgica que estava a guiar as receitas da SAP durante os
ltimos anos - movimentando clientes existentes do velho
sistema R/3 par o novo Business Suite - est quase terminada, o que significa que a SAP ter que ser mais agressiva
com taxas de manuteno. Ele recomendou o bloqueio dos
preos de manuteno agora.
De uma forma geral, Gaughan disse que a maior parte da
inovao que est a ser feita por estas empresas est nos
seus braos de pesquisa. O seu verdadeiro objectivo
proteger o satus quo o maior tempo que for possvel.

Os quatro grandes vendedores de software


- Microsoft, Oracle, IBM e SAP tm motivos escondidos que os clientes precisam
de compreender, de outra forma podem ser
levados a comprar produtos e servios que
no servem as suas necessidades. Esse
o takeaway de uma palestra recente da
Gartner na Austrlia, relatado pela IT News.
Num simpsio esta semana, o analista da Gartner, Dennis
Gaughan, explicou o que os quatro grandes vendedores esto
realmente a tentar fazer, baseando-se na experincia da Gartner com os seus clientes.

Fonte: Business Insider, 19 de Novembro de 2011


Traduo: Sara Santos

A Microsoft quer principalmente proteger Windows e o


Office. A Microsoft uma empresa de plataformas e o seu
maior objective proteger os seus monoplios altamente lucrativos de Windows e Office, enquanto ao mesmo tempo
estabelece outras plataformas que faro com que seja mais
difcil para os clientes separarem-se delas mais tarde. A nova
funcionalidade dada a conta-gotas aos utilizadores dessas
plataformas medulares, mas os novos produtos existem para
proteger o ncleo. Ele aconselhou a que fosse tida extrema
precauo antes de mudar para o Office 365, e disse que no
se entre numa mentalidade toda-Microsoft.

Programao com Lego Vence Quinta Edio de Codebits


Uma aplicao que usa peas Lego com o objectivo de permitir que crianas consigam fazer programao informtica ganhou o primeiro prmio da edio deste ano do Sapo Codebits.
O Codebits, que comeou na quinta-feira e terminou este sbado, reuniu cerca de 800 participantes, que se dividiram em
equipas para o habitual concurso de desenvolvimento de projectos as equipas tm 48 horas para criar e apresentar uma
ideia. Para alm dos prmios (computadores, telemveis e
outros aparelhos), as melhores ideias recebem apoio do Sapo
para serem desenvolvidas. O jri atribuiu o primeiro prmio a
uma aplicao mvel que fotografa uma base onde possvel
colocar peas Lego e que converte a disposio e cor dessas
peas num pequeno programa informtico.

Os produtos da Oracle no funcionam muito bem juntos.


A fora de vendas da Oracle extremamente agressiva em
empurrar um conjunto de produtos, mas tem muito menos
pontos de integrao do que a SAP. De facto, a integrao
normalmente deixada inteiramente ao cuidado do cliente. A
Oracle est igualmente muito relutante em falar sobre mapas
de produto por temer que produtos futuros canibalizem os
existentes. A empresa obtm mais de 90% dos seus lucros
atravs de taxas de manuteno e far o que for necessrio
para manter essas taxas em entrada. Gaughan tambm expressou alguma surpresa por tantos clientes continuarem a
trabalhar com a Oracle apesar de relatarem que a Oracle o
vendedor com quem mais difcil lidar.

O conceito foi trazido ao Codebits pelo programador alemo a


viver em Portugal Peter Bouda. O informtico Pedro Leite, um
dos elementos da equipa de trs pessoas que desenvolveu a
aplicao, explica que a ideia permite s crianas usarem
algo tangvel para fazerem programao informtica (uma
tarefa que tradicionalmente envolve escrever cdigo usando
linguagens com sintaxe prpria).

A IBM quer apoderar-se da tua estratgia de TI. A IBM


toma-se a si prpria como um lder rgido, mas o seu verdadeiro negcio vender servios de consultoria. Parra prosperar, os gestores de conta da IBM tentam obter controlo sobre
a estratgia de TI de uma empresa de forma a poderem continuar a empurrar novos produtos. Gaughan recomenda que se
tome uma aproximao colaborativa ou de parceria.

Na demonstrao feita no Codebits, uma sequncia de peas


Lego foi usada para animar, no ecr, uma pequena figura
tambm da conhecida marca de brinquedos. As primeiras trs
peas (duas vermelhas e uma verde) eram usadas para dar a
instruo de que a figura devia mover-se para a direita e as
trs peas imediatamente frente indicavam quantas vezes
esse movimento deveria ser feito. A linha seguinte dava uma
nova instruo figura (por exemplo, saltar). E a linha final
pode servir para determinar se a animao pra ou se a sequncia novamente seguida.

A SAP confunde os clientes com o preo. Muitos dos clientes da SAP pedem a Gartner ajuda para descobrir os preos e licenciamento da SAP, uma vez que a SAP tem termos

NOTICIAS
As 25 Piores Palavras-passe do Ano

O significado atribudo s sequncias de peas depende daquilo para que a aplicao que as fotografa tiver sido concebida uma aplicao pode interpretar trs peas vermelhas
como uma instruo para emitir um som e outra como uma
instruo para mostrar um nmero.

A empresa SplashData, especialista em aplicaes para


smartphones incluindo gesto de palavras-passe, divulgou a
lista das 25 piores passwords de 2011. Ou seja, aquelas que
mais
facilmente
so
descobertas
por
hackers.
Esta lista da SplashData baseia-se no estudo de milhes de
palavras-passe roubadas durante este ano e que foram posteriormente divulgadas online por hackers.

Com este conceito, as peas Lego podem ser usadas para


criar imagens animadas, fazer msica, construir uma calculadora ou, teoricamente, para qualquer tipo de efeito que se
consiga produzir com uma linguagem de programao.

Muitos dos utilizadores usam sequncias numricas e alfabticas carregando em teclas contguas do teclado - como
123456 ou qwerty - ou ento a prpria palavra password.
De acordo com o director-executivo da SplashData, Morgan
Slain - citado pelo site especializado em tecnologia Mashable
- mesmo que as pessoas sejam encorajadas a escolher palavras-passe seguras e fortes, muitas continuam a escolh-las
fracas, fceis de adivinhar, colocando-se em risco de fraude e
de roubo de identidade.

Este processo implica que as crianas ou algum por elas


memorize o que significa cada sequncia de peas. As crianas so uma esponja, afirmou Pedro Leite, mostrando-se
confiante de que isto no ser um obstculo utilizao do
conceito. Porm, admitiu que, uma vez desenvolvida a tecnologia, ainda necessria a killer app a expresso tipicamente usada para designar um uso de uma tecnologia que
promove significativamente a sua adopo e, eventualmente,
a transforma num sucesso comercial.

A hesitao dos utilizadores na escolha de uma password


difcil poder prender-se com o facto de, actualmente, cada
pessoa ter de decorar vrias palavras-passe para os diferentes servios que consulta online.

No ltimo dia do Codebits, que decorreu no Pavilho Atlntico, em Lisboa, foram mostrados cerca de 80 projectos, com
cada equipa a ter 90 segundos para fazer a apresentao,
num ltimo esforo para convencer o jri (que acompanhou o
trabalho das equipas ao longo dos dois dias) e ainda com o
objectivo de conseguir os sete prmios atribudos pelo pblico, que podia votar nos projectos no final de cada apresentao.

Um estudo de 2007, levado a cabo pela Microsoft, concluiu


que, em mdia, cada pessoa utiliza 25 palavras-passe diferentes e que, diariamente, usa oito delas. Desde 2007 que
este nmero ter certamente aumentado.
O roubo de palavras-passe um problema que afecta muitas
pessoas em todo o mundo. Em 2010 a Comisso Federal de
Comrcio dos EUA recebeu 1,3 milhes de queixas por fraude
ou roubo de identidade.

O Codebits faz parte da necessidade de o Sapo ter sangue


novo, afirmou, no encerramento do evento, Ablio Martins,
administrador do Sapo (que pertence ao grupo PT), referindose ao facto de as ideias nascidas no Codebits poderem ser
integradas no Sapo ou desenvolvidas em parceria com a empresa. Vinte destes projectos sero contactados para trabalharem connosco, adiantou.

Como pode, ento, tornar a sua password mais segura?


Usando uma variedade no sequencial de letras, nmeros e
smbolos e mudando a palavra-passe a cada seis meses.
Outras dicas importantes: no use sempre a mesma password e evite usar palavras verdadeiras.
Finalmente, no use nenhuma destas 25 piores palavraspasse
do
ano
elencadas
pela
SlashData:
1.password, 2.123456, 3.12345678, 4.qwerty, 5.abc123,
6.monkey, 7.1234567, 8.letmein, 9.trustno1, 10.dragon,
11.baseball, 12.111111, 13.iloveyou, 14.master, 15.sunshine,
16.ashley, 17.bailey, 18.passw0rd, 19.shadow, 20.123123,
21.654321, 22.superman, 23.qazwsx, 24.michael, 25. football.
Fonte: www.publico.pt

TEMA DA CAPA
iOS, Cocoa Touch & MVC

TEMA DA CAPA
iOS, Cocoa Touch & MVC
Entre as frameworks do Cocoa Touch de maior relevo esto
as seguintes:

MVC
A grande maioria das plataformas de desenvolvimento de
software permitem aos programadores desenvolver software
com base nos mais diversos padres de arquitectura. Essa
abordagem oferece um elevado grau de liberdade, permitindo ao programador escolher a melhor soluo para o seu
problema, com os recursos que dispe.

Controller

View

Core Animation

Core Location

Core Audio

Core Data

UIKit

A mais importante das frameworks que compem o Cocoa


Touch sem dvida a UIKit.

Model

Esta framework, baseada em Objective-C, disponibiliza uma


vasta quantidade de funcionalidades e ferramentas que permitem ao leitor desenvolver UI, gerir eventos (toque, gestos),
aceder ao acelermetro, cmara fotogrfica, bateria, sensor
de proximidade e biblioteca de imagens.

Figura 1 - MVC
Nos ltimos anos tem-se vindo a assistir a uma evoluo e
consolidao neste campo, principalmente quando o tema
so os padres de camada de apresentao e o Cocoa
Touch no foge a essa tendncia. Apple definiu o padro de
arquitectura de software Model-View-Controller (MVC), como
padro de referncia para o desenvolvimento de aplicaes
para os dispositivos que utilizam iOS (iPod, iPhone, iPad).
O tema do MVC j foi abordado na edio n27 da revista
PROGRAMAR, pretendido que o leitor tenha em mente o
conceito, pois este tema incontornvel no decorrer do artigo.

Figura 3 Alguns dos componentes de UI do UIKit

Cocoa Touch

O leitor vai, com toda a certeza, reconhecer alguns dos componentes da figura 3 disponibilizados pela UIKit Framework.

uma camada de alto nvel do iOS, composta por um conjunto de frameworks que disponibilizam ferramentas que
permitem ao leitor utilizar todo o potencial que a plataforma
iOS tem para oferecer, ao mesmo tempo, permite desenvolver aplicaes que transmitem ao utilizador uma sensao
familiar durante a sua utilizao graas utilizao transversal nas vrias aplicaes do Sistema Operativo.

A documentao acessvel e objectiva, permite desenvolver aplicaes para iOS num curto espao de tempo, o design e a experincia de utilizao proporcionada pelos componentes de esta framework so transversais a todo o Sistema Operativo, o que garante ao leitor que o utilizador se vai
sentir familiarizado com as suas aplicaes.
aconselhado ao leitor, que antes de prosseguir, tenha em
mente o artigo Introduo ao Objective-C e plataforma iOS
publicado no n 30 da revista Programar.
Leitor de RSS
Para consolidar os conceitos apresentados anteriormente, o
melhor passar prtica e desenvolver um leitor de RSS.
Execute o XCode, ferramenta includa no iOS SDK, e crie um
novo projecto recorrendo ao template Navigation-based Application.

Figura 2 A arquitectura do iOS


7

TEMA DA CAPA
iOS, Cocoa Touch & MVC
Este template contm uma View (RootViewController.xib) e
um Controller (RootViewController.h/.m).
A View, j contm um controlo do tipo UITableView, que
apresentado na figura 5 e o Controller contm os mtodos e
eventos necessrios para fornecer ao controlo UITableView
a informao necessria para apresentar os dados na View.
Sendo assim, torna-se necessrio criar um Model que fornea ao Controller o tipo de objectos a serem manipulados e
enviados para a View.

Figura 4 Template Navigation-based Application

Este template oferece uma estrutura serve como ponto de


partida para desenvolver a nossa aplicao.
Sem escrever qualquer tipo de cdigo, se o leitor executar o
projecto, vai verificar que a aplicao se apresenta j um
formato reconhecvel.
Figura 6 Adicionar uma nova classe

necessrio adicionar uma nova classe, definida como uma


sub-classe de NSObject, ao projecto com o nome RssFeed,
onde vo ser definidas as propriedades de uma feed, conforme as figuras abaixo apresentam.
#import <Foundation/Foundation.h>
@interface RssFeed : NSObject {}
@property (nonatomic, retain) NSString *FeedTitulo;
@property (nonatomic, retain) NSString
*FeedSumario;
@property (nonatomic, retain) NSString *FeedUrl;
@end
Figura 7 Interface da classe RssFeed

Figura 5 Primeira execuo do projecto

#import "RssFeed.h"
@implementation RssFeed
@synthesize FeedSumario;
@synthesize FeedTitulo;
@synthesize FeedUrl;
@end

O template escolhido fornece um conjunto de funcionalidades bsicas para uma aplicao que pretende ter um interface de navegao, o que o caso.
Considera-se que um leitor de RSS bsico, necessita de pelo
menos um ecr com uma lista de feeds e um outro que permita visualizar o detalhe de um feed.

Figura 8 Implementao da classe RssFeed


Agora que j est definido o modelo, vamos criar um repositrio que tem como objectivo fornecer ao Controller a lista de
feeds a apresentar, repetindo o passo executado na figura
6, mas desta a classe vai chamar-se Repository.
Nesta classe so definidas uma estrutura de dados para
guardar os feeds e um mtodo que devolve uma lista de
feeds, conforme as figuras embaixo apresentam.

TEMA DA CAPA
iOS, Cocoa Touch & MVC
De seguida, vamos proceder s alteraes necessrias ao
Controller para este obter os dados para alimentar a View.
Para isso, torna-se necessrio criar uma estrutura de dados
no RootViewContoller.h para acomodar os dados provenientes do Repository.

#import "RssFeed.h"
#import <Foundation/Foundation.h>
@interface Repository : NSObject {
NSMutableArray *FeedsList;
}
+ (NSArray*)getRssFeeds;
@end

#import "Repository.h"
#import "DetailViewController.h"
#import <UIKit/UIKit.h>
@interface RootViewController :
UITableViewController {
}
@property (nonatomic, retain) NSArray *feeds;
@end

Figura 9 Interface da classe Repository

#import "Repository.h"
@implementation Repository
+ (NSArray*)getRssFeeds{
NSMutableArray *feedList = [[NSMutableArray
alloc] init];

Figura 11 Interface do Controller RootViewController

for (int i = 0; i<20; i++) {


if (i % 2 ==0) {
RssFeed *item1 = [[RssFeed alloc] init];
item1.FeedTitulo = @"Revista Programar N30";
item1.FeedSumario = @"Publiquei na edio n 30
da Revista Programar um artigo com o nome
Introduo ao Objective-C e plataforma iOS.
Nesta edio os leitores tiveram 15 dias para
votar nos seus 3 artigos favoritos. Aps a
concluso da votao, o meu artigo ficou
classificado em 2 lugar. Devo confessar que no
estava espera, ainda [...] ";
item1.FeedUrl = @"http://blastersystems.com/
blog/2011/08/revista-programar-n30/?
utm_source=rss&utm_medium=rss&utm_campaign=
revista-programar-n30";

Agora que existe onde guardar os dados recebidos, necessrio fornece-los ao controlo UITableViewController. Para
isso, preciso alterar o mtodo viewDidLoad na implementao do Controller (RootViewContoller.m).
- (void)viewDidLoad
{
[super viewDidLoad];
feeds = (NSArray*)[[Repository getRssFeeds]
retain];
}
Figura 12 Alterao do mtodo viewDidLoad no Controller RootViewController

[feedList addObject:item1];
[item1 release];

O Controller alimenta o controlo UITableView, notificado


dos seus eventos porque uma sub-classe de UITableViewController, o que o torna um Controller especializado
em lidar com Views que contm controlos do tipo UITableView.

}
else{
RssFeed *item2 = [[RssFeed alloc] init];
item2.FeedTitulo = @"HTML5 & CSS3 no Visual
Studio 2010";
item2.FeedSumario = @"Muito se tem falados nos
ltimos meses nos novos standards para Web
HTML5 e CSS3, comparaes com outras
tecnologias, milhares de blog posts, artigos
de opinio e discusses sobre o assunto.
Embora ainda no sejam um standard fechado, j
existem projectos desenvolvidos outros
projectos em desenvolvimento recorrendo a
estas tecnologias[...] ";
item2.FeedUrl = @"http://blastersystems.com/
blog/2011/06/html5-css3-no-visual-studio-20102/?utm_source=rss&utm_medium=rss&utm_campaign=
html5-css3-no-visual-studio-2010-2";

A grande vantagem na utilizao de este Controller, que


contm um template que ajuda a lidar com o controlo UITableView. Um dos mtodos includo nesse template o numberOfRowsInSection, que informa o UITableView do nmero
de elementos que vai conter.
Como o leitor j obteve do Repository os feeds, pode agora
informar o UITableView do nmero de elementos que lhe
vamos fornecer.

[feedList addObject:item2];
[item2 release];

- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return [feeds count] -1;
}

}
}
return [feedList autorelease];
}
@end

Figura 13 Notificar o controlo do nmero de elementos que vai


conter

Figura 10 Implementao da classe Repository

A classe Repository contm apenas um mtodo que constri


um conjunto de feeds estticos e os agrega numa estrutura
de dados para mais tarde alimentar o controlo UITableView.

TEMA DA CAPA
iOS, Cocoa Touch & MVC
J existem os feeds na estrutura de dados do Controller e j
informamos o UITableView do nmero de elementos que lhe
vamos fornecer, apenas resta adicionar as feeds ao UITableView.
O leitor pode aproveitar novamente a vantagem de o Controller ser uma sub-classe de UITableViewController, porque no
template j existe um mtodo definido para fornecer os dados ao UITableView, apenas necessrio alterar um pouco
o cdigo existente.
- (UITableViewCell *)tableView:(UITableView *)
tableView cellForRowAtIndexPath:(NSIndexPath *)
indexPath
{
static NSString *CellIdentifier = @"myCell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
}

Figura 17 - Primeira execuo do projecto

if (feeds !=nil)
{
[cell.textLabel setText:((RssFeed*) [feeds
objectAtIndex:indexPath.row]).FeedTitulo];

Nesta fase temos um leitor de RSS parcialmente construdo,


j apresentamos no dispositivo a lista de feeds. No entanto
no incio do projecto definimos que tambm iriamos disponibilizar uma View para o detalhe do feed.

}
return cell;
}

Para isso vamos adicionar um novo Controller, o DetailViewController, mas desta vez o novo Controller uma
sub-classe de UIViewController.

Figura 14 Alimentar o UITableView com os dados a apresentar

Com base no nmero de feeds vai apresentar, percorre a


estrutura de dados que contm as feeds a passa o ttulo da
feed clula.
Estas clulas so objectos do tipo UITableViewCell, e so
altamente extensveis, podendo o leitor customiza-las e apresentar a informao de outras formas.
Para concluir esta primeira fase do leitor de RSS, dado que a
gesto de memria dos objectos criados pelo programador
se encontram a seu cargo, torna-se obrigatrio libertar a
memria alocada estrutura de dados que contm as feeds
quando a View libertada.
- (void)dealloc
{
[super dealloc];
[feeds release];
}

Figura 18 Adicionar um novo Controller e View para o detalhe do


feed

Figura 15 Libertao da memria alocada

Quando criado, composto por 3 ficheiros, um para definir


a interface do Controller outro para definir a implementao
do Controller e ainda um terceiro para definir a View que vai
exibir o detalhe dos feeds.

Agora, apenas resta ao leitor testar o cdigo produzido, para


isso basta executar o projecto.

10

TEMA DA CAPA
iOS, Cocoa Touch & MVC
Para apresentar o detalhe da feed, proposto criar um UILabel para apresentar o ttulo da feed, um UITextView para
apresentar o sumrio do feed e um UIButton para abrir a
fonte da feed no safari.

- (id)initWithFeed:(RssFeed *)feed{
self = [super init];
if (self) {
feedDetail = feed;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[FeedTitle setText:feedDetail.FeedTitulo];
[FeedSummary setText:feedDetail.FeedSumario];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
-(IBAction)linkButtonClick:(id)sender {
NSString* launchUrl = feedDetail.FeedUrl;;
[[UIApplication sharedApplication] openURL:
[NSURL URLWithString: launchUrl]];
}

Figura 19 View de detalhe de feeds

Agora necessrio definir o Controller da View acima apresentada, e para isso basta colocar na interface do DetailViewController a definio das propriedades que compem a View bem como definir um novo construtor para o
Controller, para suportar receber um objecto do tipo RssFeed
quando instanciado.

- (void)dealloc
{
[super dealloc];
[feedDetail release];
}
@end

#import "RssFeed.h"
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController

Figura 21 Implementao do Controller DetailViewController

@property (retain, nonatomic) IBOutlet UILabel


*FeedTitle;
@property (retain, nonatomic) IBOutlet UIButton
*FeedOnSafari;@property (retain, nonatomic)
IBOutlet UITextView *FeedSummary;

Para terminar apenas falta referenciar os componentes definidos no Controller com os componentes definidos na View.

Figura 20 Definio do Interface do Controller DetailViewController

Esse processo executado atravs de outlets, que nada


mais so do que apontadores que permitem ao compilador
saber onde se encontra no Controller definido um componente definido na View e qual a aco que o Controller necessita de executar quando um desses componentes dispara
um evento.

No ficheiro de implementao do DetailViewController necessrio implementar o novo construtor, a gesto de memria dos objectos criados e gerir o evento TouchDown do boto FeedOnSafari.

Neste caso, o boto feedOnSafari, quando a View detecta


um toque, pede ao Controller para executar o evento linkButtonClick, que por sua vez vai lanar o Safari cmo o URL da
feed.

@property (retain, nonatomic) RssFeed *feedDetail;


- (id)initWithFeed:(RssFeed *)feed;
@end

#import "DetailViewController.h"
@implementation DetailViewController
@synthesize FeedOnSafari;
@synthesize FeedSummary;
@synthesize FeedTitle;
@synthesize feedDetail;
11

TEMA DA CAPA
iOS, Cocoa Touch & MVC
(void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *details =
[[DetailViewController alloc] initWithFeed:
(RssFeed*) [feeds objectAtIndex:indexPath.row]];
[self.navigationController
pushViewController:details animated:YES];

Figura 22 Outlets referenciadas no Organizer da View

[details release];

D-se por concludo o ecr de detalhe da feed, apenas falta


alterar o ficheiro de implementao do RootViewController
para que este navegue para a View de detalhe quando
selecionada uma feed.

}
Figura 24 Mtodo a alterar para existir navegar para o detalhe da
feed selecionada

tambm necessrio alterar o mtodo cellForRowAtIndexPath e adicionar um indicador na clula de cada feed para
que o utilizador compreenda que existe um ecr de detalhe
para o qual pode navegar e alterar tambm o mtodo didSelectRowAtIndexPath para este invocar ao navigationController a navegao para um novo ecr.
- (UITableViewCell *)tableView:(UITableView *)
tableView cellForRowAtIndexPath:(NSIndexPath *)
indexPath
{
static NSString *CellIdentifier = @"myCell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
}
cell.accessoryType =
UITableViewCellSelectionStyleBlue;
if (feeds !=nil) {
[cell.textLabel setText:((RssFeed*)
[feeds objectAtIndex:indexPath.row]).FeedTitulo];
}
return cell;

Figura 25 Comportamento final da aplicao

O cdigo fonte da aplicao encontra-se disponvel em http://


blastersystems.com/ContentDownload/PAPTBC.zip

Figura 23 Alterao necessria no mtodo j definido na figura 14

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

12

Elege o melhor artigo desta edio


Revista PROGRAMAR
http://tiny.cc/ProgramarED32_V

A PROGRAMAR
Gerao de nmeros aleatrios (Parte 2)
Automatizao de tarefas usando atributos
SQL Azure Fedarations
Enigmas de C#: Arrays

A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 2)
No artigo anterior foi indicado o mtodo de gerao de
nmeros pseudo-aleatrios meio do quadrado. Em
continuao ser mostrado neste o mtodo do produto do
meio.

INTRODUO

Iterao
0
1

O mtodo de gerao de nmeros pseudo-aleatrios produto


do meio indicado em Banks et al. (2009), sendo um algoritmo idntico ao algoritmo utilizado para o quadrado do
meio. A diferena deste mtodo est no fato de pegar-se
dois valores como sementes com o mesmo nmero de dgitos e sobre estes valores traar a aco do algoritmo.

2
3
4

ALGORITMO DO MEIO DO PRODUTO


Para fazer uso do mtodo do meio do produto pega-se em
dois valores de sementes e efectua-se a sua multiplicao.
ideal que os valores de sementes sejam valores com um
tamanho de cinco dgitos e que no possuam na sua estrutura valores zero em qualquer uma das posies.
Do produto obtido tira-se o valor do meio contento o mesmo
nmero de dgitos das sementes utilizadas. Para sementes
iniciais de cinco dgitos obter-se- um produto do meio que
deve ter um tamanho de onze dgitos. Se o valor obtido no
tiver onze dgitos de tamanho torna-se necessrio acrescentar esquerda do valor tantos zeros quantos necessrios
para completar o tamanho de onze dgitos. Esta atitude
necessria no sentido de que se consiga extrair exactamente
cinco dgitos do meio deixando de cada lado trs dgitos de
distncia.
De seguida multiplica-se o valor do meio do produto com o
valor da segunda semente e obtm-se assim um novo produto. Tira-se deste novo produto os dgitos do novo meio com a
mesma quantidade de dgitos do valor da semente e efectua
-se a multiplicao deste valor pelo valor do meio anterior e
assim por diante.
A tabela a seguir apresenta a sequncia de gerao de dez
valores obtidos a partir do mtodo do meio do. Assim, considere os como sementes os valores 32534 e 58461

5
6
7
8
9

Valor
Multiplicado
32534
58461
58461
01970
01970
15168
15168
29880
29880
53219
53219
90183
90183
99449
99449
68609
68609
23096
23096
84593

01901970174
00115168170
00029880960
00453219840
01590183720
04799449077
08968609167
06823096441
01584593464
01953759928

Observe que aps aplicao do mtodo so obtidos os valores 01970, 15168, 29880, 53219, 90183, 99449, 68609,
23096, 84593 e 53759.
A aplicao do mtodo pode ser realizada a partir do
algoritmo seguinte:

N1/N2 = informao obtida manualmente ou por outro meio


para a formao dos nmeros das duas sementes iniciais,
tendo o tamanho de cinco dgitos.
p = resultado do produto obtido com a multiplicao dos
valores de N1 com N2 (p = N1 x N2).
td = tamanho em dgitos do resultado do produto de N1 e N2:
td = tamanho(p).
SE (td < 11) ENTO
T = 11 td
ZEROS = 0
PARA I = 1, T, 1
ZEROS = ZEROS + 0
FIM_PARA
p = ZEROS + p
FIM_SE

15

Produto do
Meio

A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 2)
T = tamanho ajustado para onze dgitos, onde 11-td igual ao
nmero de zeros a ser inserido esquerda de p, se td for
menor que 11.

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 zero.

MP = meio do produto que ser utilizado como o valor da


prxima semente que a extrao do valor central de cinco
dgitos do valor p, ou seja, cinco dgitos a partir do quarto
dgito.

BIBLIOGRAFIA

N1 = passa a ser o valor de N2.

BANKS, J., CARSON, J. S., NELSON, B. L. & NICOL, D. M.


Discrete Event System Simulation. 5. ed. USA: Pearson
Education. 2010.

N2 = passa a ser o valor de MP.

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, possuindo na sua carreira vrias obras publicadas na rea da computao.

16

A PROGRAMAR
Automatizao de tarefas usando atributos
(IConstructionCallMessage ctorMsg)
{
ctorMsg.ContextProperties.Add(new
LogProperty());
}
}

Introduo
Na edio nmero 30 da revista Portugal a Programar falmos de atributos em C#. Vimos como podamos usar esta
funcionalidade para reconhecer um certo tipo de classes, ou
mesmo atribuir-lhes certas funcionalidades. Sendo uma funcionalidade muito interessante convenhamos que, na prtica,
muito raramente a iremos utilizar. Se quisermos caracterizar
uma determinada classe ou que esta tenha determinados
comportamentos provavelmente iremos usar uma interface
ou herana. Se quisermos guardar informao ou implementar certas funcionalidades o mais certo usarmos um delegate. Ou ento implementar na prpria classe.

Como se pode ver, neste caso, no herdamos da mesma


classe que no artigo anterior. Em vez de herdarmos de Attribute vamos herdar de ContextAttribute. Isto indica framework que este um atributo especial e que queremos que
seja tido em conta na criao de contextos.
Um dos mtodos a que temos de fazer override o GetPropertiesForNewContext. Neste mtodo temos como tarefa
adicionar uma propriedade nossa lista de propriedades do
novo contexto.

Sendo assim, muito provavelmente, tirando os atributos da


framework como o Serializable ou o WebMethod dificilmente
iremos usar outros.

Ora, se usamos a propriedade, temos de a criar:

No entanto, h um tipo de atributos que pode ser muito til.


Acima de tudo porque, ao contrrio daqueles que falmos no
ltimo artigo, no precisa de ser chamado por ns. Ao invs
disso automaticamente chamado pela framework quando
um objecto nosso que tenha esse atributo usado.

class LogProperty : IContextProperty, IContributeObjectSink


{
/*
* Temos de indicar qual o nome
* pela qual a property vai ser
* conhecida dentro do contexto
*/
public string Name
{
get { return "Log"; }
}

Criar um proxy de objectos


Este funcionamento parte do conceito de contextos. Quando
um objecto criado, criado tambm um contexto, onde
este objecto est inserido. Este contexto tem uma cadeia de
funes, que so executadas cada vez que se entra ou sai
do contexto, ou seja, cada vez que se chama um mtodo, ou
um mtodo retorna. Aquilo que podemos fazer colocar a
nossa funcionalidade nesse processo. Ou seja, criar uma
espcie de proxy.

/*
* O que fazer quando o contexto fica
* bloqueado. Tipicamente no relevante
*/
public void Freeze(Context newContext)
{}
// Temos de verificar se o novo contexto
// est OK

Com um exemplo prtico talvez se perceba mais facilmente.


Vamos ento fazer um sistema de logs que nos permite
saber qual a classe e o mtodo que est a ser chamado,
quais os argumentos, e quanto tempo demora a execuo
do mtodo.

public bool IsNewContextOK(Context newCtx)


{
// Temos de verificar se o novo contexto
// que recebemos tem a nossa property
LogProperty p = newCtx.GetProperty("Log") as
LogProperty;
if (p == null)
{
// Se no tiver alguma coisa est mal
return false;
}
// Se tiver continuamos
return true;
}

Naturalmente temos de comear por criar o nosso atributo:


class LogAttribute : ContextAttribute
{
// Temos de passar para o pai o nome do
//atributo de contexto.
public LogAttribute(): base("Log"){}
/*Neste mtodo adicionamos a nossa property
* ao contexto que est a ser criado para o
* objecto */
public override void GetPropertiesForNewContext

18

A PROGRAMAR
Automatizao de tarefas usando atributos
Nos comentrios est a explicao para a maior parte do
cdigo. No entanto, h um mtodo que especial. no mtodo GetObjectSink que a magia vai acontecer. At agora
temos estado a criar as classes necessrias para construir a
cadeia de objectos que vo ser chamados no contexto. Mas
aqui que efectivamente estamos a colocar o nosso cdigo.

nextSink.SyncProcessMessage(msg);
IMethodReturnMessage mrm = (rtnMsg as
IMethodReturnMessage);
return mrm;
}
}

Se precisamos de uma mensagem, vamos ento cria-la:.


Nos comentrios est a explicao para a maior parte do
cdigo. No entanto, h um mtodo que especial. no mtodo GetObjectSink que a magia vai acontecer. At agora
temos estado a criar as classes necessrias para construir a
cadeia de objectos que vo ser chamados no contexto. Mas
aqui que efectivamente estamos a colocar o nosso cdigo.
O LogSink uma mensagem que, para todos os efeitos, vai
ser o nosso proxy. As mensagens vo sendo chamadas,
sequencialmente, at ao objecto final. Neste mtodo recebemos o objecto propriamente dito, e qual a mensagem a ser
chamada aps a nossa. Aquilo que temos de fazer criar a
nossa mensagem, onde guardamos quem o prximo na
fila, e devolvemos a mensagem para a plataforma.

Como se pode ver este objecto , por agora, relativamente


simples. Limitamo-nos a chamar a mensagem seguinte na
cadeia, e retornamos a resposta. Um proxy sem lgica de
negcio.
Usar o proxy
Mas como se usam estes atributos? Vamos criar uma classe
simples que vai ser sujeita a registo atravs do nosso logger:
[Log]
public class LoggedObject : ContextBoundObject
{
public void metodo(String str)
{
Console.WriteLine("This is a method
that prints " + str);
}
}

Se precisamos de uma mensagem, vamos ento cria-la:


class LogSink : IMessageSink
{
// Precisamos de guardar a prxima
// mensagem para a poder retornar

Como podemos ver bastante simples. Tal como nos atributos normais, basta colocar o nosso atributo como atributo
desta classe. Tem, no entanto, um pequeno truque. Desde o
inicio que se tem falado de contextos. Que estes atributos
so usados quando entramos ou samos de um contexto.
Temos ento de dizer framework que queremos que este
objecto esteja associado a um contexto. Para isso basta
herdar da classe ContextBoundObject.

private IMessageSink nextSink;


public LogSink(IMessageSink nextSink) {
this.nextSink = nextSink;
}
public IMessageSink NextSink
{
get { return this.nextSink; }
}

Vejamos ento o que acontece se tentarmos usar este objecto:

// Comportamento a executar caso a mensagem seja


// chamada de forma assncrona Vamo-nos limitar a
// chamar a prxima mensagem e devolver o resultado

static void Main(string[] args)


{
LoggedObject lo = new LoggedObject();
lo.Metodo("shrubbery");
}

public IMessageCtrl AsyncProcessMessage


(IMessage msg, IMessageSink replySink)
{
IMessageCtrl rtnMsgCtrl = nextSink.
AsyncProcessMessage(msg, replySink);
return rtnMsgCtrl;
}

Aquilo que vemos que acontece muito pouco:

// Aqui onde vamos fazer a nossa intercepo


// Por agora vamos, simplesmente, chamar
// a prxima mensagem.
O nosso mtodo imprime aquilo que esperado dele, e nada
mais.

public IMessage SyncProcessMessage(IMessage msg)


{
IMessage rtnMsg =

19

A PROGRAMAR
Automatizao de tarefas usando atributos
Antes de tentarmos ir mais adiante com o nosso logger, vamos ver se a nossa mensagem est a ser correctamente
executada na cadeia. Vamos voltar ao mtodo SyncProcessMessage do objecto LogSink e colocar o nosso debug:

Se tentarmos correr este cdigo j vemos algo mais interessante:

public IMessage SyncProcessMessage(IMessage msg)


{
Console.WriteLine("Antes de executar o mtodo.");
IMessage rtnMsg =
nextSink.SyncProcessMessage(msg);
Console.WriteLine("Depois de executar o
mtodo.");
IMethodReturnMessage mrm = (rtnMsg as
IMethodReturnMessage);
return mrm;
}

Podemos ver que executmos um LoggedObject, qual o


nome do mtodo que foi executado, e o parmetro que foi
passado. Falta-nos apenas do tempo que demorou a correr:
public IMessage SyncProcessMessage(IMessage msg)
{
// A mensagem que recebemos tem a
// informao que procuramos
MethodCallMessage mcm = (msg as
IMethodCallMessage);

Se corrermos a aplicao novamente j vemos algo de diferente:

Console.WriteLine("Tipo do objecto: " +


mcm.TypeName);
Console.WriteLine("Nome do mtodo: " +
mcm.MethodName);
Console.WriteLine("Parametros: " + String.Join
(", ", mcm.Args));
DateTime before = DateTime.Now;
IMessage rtnMsg = nextSink.SyncProcessMessage
(msg);
DateTime after = DateTime.Now;

Estamos no bom caminho. A nossa mensagem est a ser


correctamente colocada na cadeia de mensagens do objecto
e, quando o mtodo do objecto chamado, a nossa mensagem faz o seu trabalho.

Console.WriteLine("Demorou " + (after - before)


+ " a correr.");
IMethodReturnMessage mrm = (rtnMsg as
IMethodReturnMessage);
return mrm;
}

Vamos ento tentar transformar o nosso sink num logger


com informao util:
public IMessage SyncProcessMessage(IMessage msg)
{

No entanto, visto que o nosso mtodo demasiado bsico,


vamos faze-lo demorar mais tempo artificialmente:

// A mensagem que recebemos tem


// a informao que procuramos
IMethodCallMessage mcm =
(msg as IMethodCallMessage);

public void Metodo(String str)


{
Console.WriteLine("This is a method that prints
" + str + " once");
Thread.Sleep(1500);
Console.WriteLine("And prints " + str + "
again");
}

Console.WriteLine("Tipo do objecto: " +


mcm.TypeName);
Console.WriteLine("Nome do mtodo: " +
mcm.MethodName);
Console.WriteLine("Parametros: " +
String.Join(", ", mcm.Args));
IMessage rtnMsg = nextSink.SyncProcessMessage
(msg);

Se corrermos isto vemos que, para alm do segundo e meio


que inserimos, demorou mais uns milsimos de segundo:

IMethodReturnMessage mrm = (rtnMsg as


IMethodReturnMessage);
return mrm;
}

20

A PROGRAMAR
Automatizao de tarefas usando atributos
Temos assim uma forma de registar todos os acessos a um
determinado objecto.

Vemos que este cdigo demorou 11 segundos a correr


(NOTA: foi retirado o sleep do mtodo que imprime as duas
linhas).

Aqui, para efeitos demonstrativos, imprimimos a informao


para o ecr, no entanto pode muito facilmente ser guardada,
por exemplo, numa base de dados. Pode-se at ir um pouco
mais longe e registar tambm qual o utilizador que est a
fazer o acesso. E at criar um sistema de permisses. Facilmente, sabendo qual o utilizador que est a tentar usar a
funcionalidade, e que tipo de permisses tem, se pode permitir ou impedir que use essa funcionalidade da aplicao.

Agora, criamos um objecto igual, mas que no herda de


ContextBoundObject nem usa o atributo de log, e alteramos
novamente o Main:

static void Main(string[] args)


{
NotLoggedObject nlo = new NotLoggedObject();
DateTime before = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
String str = "shrubbery";
Console.WriteLine("Tipo do objecto: " +
nlo.GetType().ToString());
Console.WriteLine("Nome do mtodo: " +
"Soma");
Console.WriteLine("Parametros: " + str);
DateTime beforeSum = DateTime.Now;
nlo.Metodo(str);
DateTime afterSum = DateTime.Now;

No h solues, h compromissos
No entanto, como em quase todas as decises de arquitectura deste tipo, necessrio ter em conta aquilo que se tem de
abdicar quando se quer certas regalias.
Esta funcionalidade tem um grande peso em termos de performance. S para se ter uma ideia, vamos fazer algumas
medies.
Para comear, vamos ver quanto tempo demora para imprimir 10000 vezes a mesma frase, usando o nosso logger.
Vamos alterar o mtodo Main:

Console.WriteLine("Demorou " + (afterSum beforeSum) + " a correr.");


}
DateTime after = DateTime.Now;
Console.WriteLine("\n\n\nDemorou " +
(after - before) + " a correr.");
WaitForKeyPressAndExit();

static void Main(string[] args)


{
LoggedObject lo = new LoggedObject();
DateTime before = DateTime.Now;
int sum = 0;
for (int i = 0; i < 10000; i++)
{
lo.Metodo("shrubbery");
}
DateTime after = DateTime.Now;

}
Temos o seguinte resultado:

Console.WriteLine("\n\n\nDemorou " +
(after - before) + " a correr.");
WaitForKeyPressAndExit();
}

Com programao tradicional temos um cdigo quase 40%


mais rpido.
Isto, em sistemas crticos, pode ser o suficiente para no
termos a disponibilidade que esperamos.

21

A PROGRAMAR
Automatizao de tarefas usando atributos
que uma determinada aplicao deixe de ser til, pois no
faz o seu servio no tempo definido. H sempre formas de
aumentar a capacidade de um servio, adicionar mquinas a
um cluster, aumentar a capacidade de processamento, discos/memrias mais rpidas... No entanto tudo isto custa dinheiro. Alm de que, muitas vezes, h optimizaes que tm
de ser feitas no cdigo, ao nvel dos algoritmos e das bibliotecas usadas. No entanto, nos casos em que possvel de
ser usado, temos aqui uma forma de ter cdigo bastante
limpo, que simplifica em muito certas tarefas que so necessrias de fazer de forma repetida.

Concluso
Utilizando o contexto do objecto podemos injectar um proxy
que vai ser chamado sempre que esse objecto seja utilizado.
Desta forma podemos criar um proxy que nos permite adicionar lgica de controlo antes e depois da execuo de um
mtodo. Este proxy chamado automaticamente pela framework fazendo com que deixe de ser uma preocupao
nossa. Teremos assim menos repetio de cdigo e um controlo mais fino na execuo da nossa aplicao.

Mas isso no vem sem um custo. Neste caso um custo de


performance. Este um processo pesado e que pode levar a

AUTOR
Escrito por Flvio Geraldes
Licenciou-se em Engenharia Informtica e Computadores no Instituto Superior Tcnico tendo-se especializado na rea de
Programao e Sistemas de Informao. Aps a finalizao do curso juntou-se Sybase SBS Software onde teve
oportunidade de trabalhar com vrias tecnologias focando-se particularmente em .NET. Actualmente consultor da Sybase
SBS Software numa empresa de telecomunicaes onde responsvel pelo desenho e desenvolvimento de vrias
aplicaes.

Enigmas de C# Arrays
por Paulo Morgado
Dadas as seguintes classes:
public class Posio
{
}
public class Posio2D : Posio
{
public int X { get; set; }
public int Y { get; set; }
}
public class Posio3D : Posio2D
{
public int Z { get; set; }
}

};
try
{

Qual a sada do seguinte cdigo?


public static void Exec()
{
var array = new Posio3D[]
{
new Posio3D
{
X = 1,
Y = 2,
Z = 3
},

new Posio3D
{
X = 2,
Y = 1,
Z = 3
},
new Posio3D
{
X = 3,
Y = 2,
Z = 1
}

Process(array);
Console.WriteLine("Dados processados!");
}
catch (Exception ex)
{
Console.WriteLine("{0}: {1}",
ex.GetType().FullName,
ex.Message);
}

Veja a resposta na pgina 29


22

Elege o melhor artigo desta edio


Revista PROGRAMAR
http://tiny.cc/ProgramarED32_V

A PROGRAMAR
Introduo s SQL Azure Federations
O cloud computing tem sido um assunto muito debatido, no
mundo das tecnologias de informao no s pela
capacidade de computao de alta disponibilidade,
escalabilidade e elasticidade bem como pela reduo de
custos que o modelo baseado em servios proporciona.

Scale Out
Outra limitao natural, quem em muitos cenrios se revela
mais importante ainda, a capacidade de processamento do
servidor. Quantas vezes as necessidades de escalabilidade
so provocadas pelo aumento da carga de processamento?
Imagine um website de vendas de bilhetes onde devido ao
lanamento de um evento o nmero de pedidos ao servidor
aumenta drasticamente durante alguns dias.

O SQL Azure da Microsoft fornece um conjunto de servios,


que implementa as capacidades de armazenamento e
processamento de dados relacionais na cloud. O SQL Azure
um servio de alta disponibilidade e tolerante a falhas,
onde os programadores no tm que se preocupar com
instalao, configurao ou manuteno dos servidores de
bases de dados.

Numa aplicao multicamada suportada pela plataforma


Windows Azure, a gesto da capacidade de resposta a
pedidos na camada de apresentao ou na camada lgica
de negcio simples, podemos por exemplo aumentar ou
diminuir o nmero de servidores (web e worker roles)
consoante a carga a que o website est a ser sujeita (scale
out).

SQL Azure baseado numa verso especial do Microsoft


SQL Server pelo que permite ainda ao programador ser
bastante produtivo dado que usa o mesmo modelo relacional
baseado em T-SQL e permite usar as mesmas ferramentas
de desenvolvimento e gesto usadas nas bases de dados
locais.
Actualmente, dentro da Web Editions, podemos adquirir
bases de dados at 5Gb onde se paga cerca de 9.99$ se a
base de dados tiver at 1Gb ou 49.95$ se o tamanho for
entre 1 e 5Gb. Dentro da Business Edition podemos ter uma
base de dados at 50Gb onde o pagamento fraccionado
em blocos de 10Gb sendo que cada 10Gb custa 99.99$.

O problema que este modelo de escalabilidade elstica


no estava presente na camada de acesso a dados (base de
dados) sem que houvesse a necessidade de o implementar.

Escalabilidade
Scale Up

As SQL Azure Federations vm fornecer camada de


acesso a dados essa capacidade, ou seja, ser possvel
aumentar ou diminuir o nmero de ns que constitui a
camada de acesso a dados sem que a mesma fique
indisponvel durante essas alteraes. Vm ainda permitir
um aumento mais granular do espao de armazenamento e
consequente poupana de custos.

Actualmente o modelo de escalabilidade mais simples de


utilizar em SQL Azure a escalabilidade vertical (scale up),
ou seja, aumentar o tamanho mximo de armazenamento na
base de dados.

Outro cliente muito importante das federations sero as


aplicaes multi-tenant, vamos tentar perceber porqu.
Figura 1.1 Escalabilidade Vertical (Scale Up)
Como vimos anteriormente a escalabilidade em SQL Azure
est, em termos de capacidade de armazenamento limitada
a 50Gb. Brevemente ir haver um aumento deste limite para
150Gb mas o que se pretende que o leitor retenha que a
capacidade de armazenamento em cada base de dados
limitada. Poderemos chegar a uma altura em que a
capacidade de armazenamento disponvel no suficiente.

24

A PROGRAMAR
Introduo s SQL Azure Federations
Multi-tenant

Sharding

Quando se desenha uma aplicao multi-tenant (multicliente), uma das primeiras e grandes opes que se tem
que tomar tem a ver com a distribuio ou no dos dados
dos clientes por vrias base de dados.

Para resolver este problema era necessrio recorrer


implementao manual de sharding. Sharding um padro
que permite aumentar a escalabilidade e a performance de
grandes bases de dados. Aplicar o padro a uma base de
dados significa partir essa base de dados em pedaos mais
pequenos e distribui-los por vrios servidores de modo a
obter escalabilidade. A cada pedao resultante chamamos
de shard.

De uma forma geral podemos optar por meter todos os


dados dos clientes numa nica base de dados ou ter uma
base de dados para cada cliente. Existe ainda uma opo
intermdia que ter vrios schema dentro de uma nica
base de dados onde cada cliente tem um schema. No
iremos considerar esta opo por se enquadrar dentro da
opo de guardar todos os dados numa nica base de dados
relativamente anlise que pretendemos fazer.

Neste padro so as linhas das tabelas que so divididas


pelos vrios servidores. Uma outra opo seria realizar o
particionamento vertical. No particionamento vertical os
dados so separados por distribuio de tabelas completas
entre os servidores. Meter a tabela de clientes num servidor
e a tabela de vendas noutro servidor seria um exemplo de
partio vertical. A partio de dados por valor (sharding)
permite atingir maior escalabilidade porque, por exemplo,
no est limitada ao nmero de tabelas existentes na
aplicao e permite a diviso de tabelas com mais acessos.

Quando o alojamento on-premisses (local), a opo mais


comum o fornecimento de uma base de dados para cada
cliente.
Uma base de dados por cliente

Figura 2.1 Uma base de dados por cliente (tenant)


Esta opo tem as suas vantagens e desvantagens mas o
que importa reter neste caso que, no alojamento local, no
existe o limite mnimo em relao ao custo de uma base de
dados. Na cloud este limite mnimo actualmente de 1Gb,
ou seja, o custo mnimo de uma base de dados em SQL
Azure de 9.99$.

Figura 2.3 Sharding de uma base de dados


Nas aplicaes multi-tenant podemos comear com uma
nica base de dados e, medida que o volume de carga vai
crescendo, usar o padro de sharding para distribuir os
dados dos clientes por vrias bases de dados.

Dependendo da aplicao esta pode ser uma opo


demasiado cara e, nesse caso, a opo por juntar todos os
dados dos clientes numa nica base de dados pode ser a
opo mais correcta.
Tudo numa base de dados

Figura 2.4 Sharding numa aplicao multi-tenant


Com SQL Azure Federations vamos poder usar este padro
com muito pouco esforo e sem ter downtimes.
SQL Azure Federations

Figura 2.2 Todos os clientes numa nica base de dados


Distribuio dos dados

Tanto uma opo como a outra tm problemas de


escalabilidade. Ter todos os dados numa nica base de
dados, alm do limite de 50Gb para dados pode ter
problemas de capacidade de processamento. Ter uma base
de dados por cliente pode ser bastante dispendioso ou, no
limite, os 50Gb de armazenamento podem no chegar para
um cliente que tenha muita informao para armazenar.

Um conceito muito importante antes de entrarmos na


arquitectura das SQL Azure Federations a distribuio dos
dados. Conforme pode verificar na figura seguinte existem
dados centralizados, particionados e replicados.

25

A PROGRAMAR
Introduo s SQL Azure Federations
Federation
Federations so os objectos que suportam a funcionalidade
de distribuio dos dados entre as vrias parties. Estes
objectos representam o schema da federation e contm a
chave da distribuio, o tipo de dados e o estilo da
distribuio. Na imagem anterior a base de dados AppDB
representa uma base de dados com federations. Uma base
de dados pode ter vrias federations.
Federation Member (Shard)
A cada partio de dados dentro de uma federation
chamamos federation member. Na imagem acima podemos
observar uma federation para a tabela Clientes com vrios
membros. Cada federation member contm uma parte dos
dados e suportado por uma instncia de base de dados
SQL Azure que fornece lhe capacidade de armazenamento e
computao.

Figura 3.1 Distribuio dos dados


Centralizados
Como exemplo de dados centralizados poderemos ter as
tabelas de configuraes. So dados sobre os quais no
existem muitas operaes de leitura e escrita e que esto
disponveis apenas num nico local.
Replicados
Neste caso imagine a tabela de cdigos postais dos CTT.
So dados sobre os quais apenas existem operaes de
leitura (as escritas so possveis mas raras) e que por
questes de performance esto disponveis em todas as
bases de dados da aplicao. Dados replicados (reference
data) so muito importantes relativamente a operaes de
join.

Figura 4.2 Arquitectura das federations member


Federation Distribution Key

Particionados

Os dados so distribudos pelos vrios federation members


com base na federation key. Esta chave deve ser um campo
que identifica univocamente cada partio possvel para os
dados. Na imagem anterior podemos verificar que o campo
ID a federation key.

Nesta categoria estaro a grande maioria dos dados onde


cada pedao de dados reside numa e apenas numa base
de dados.
Arquitectura

Atomic Unit
Uma unidade atmica representa todo o conjunto de dados
com a mesma federation key. Na imagem anterior podemos
observar que todos os clientes com ID=100 so uma unidade
atmica. Como o prprio nome indica, no possvel dividir
uma unidade atmica, ou seja, dentro de uma federation,
todas as tabelas com a mesma federation key ficam
garantidamente no mesmo federation member.
Exemplo
No objectivo deste artigo ensinar a criar e a manipular
federations mas para no defraudar alguns leitores mais
curiosos vamos ver alguma ver um exemplo para que
possamos ficar desde j familiarizados com alguma sintaxe.

Figura 4.1 Arquitectura das federations


Federation Root
Refere-se base de dados central que contm todas as
informaes sobre o particionamento dos dados.

26

A PROGRAMAR
Introduo s SQL Azure Federations
No futuro termos mais operaes disponveis tais como:

-- Criar a base de dados root

ALTER FEDERATION ClientesFed SPLIT AT


(ID=200,400,...,800)
ALTER FEDERATION ClientesFed MERGE AT (ID=200)
ALTER FEDERATION ClientesFed MERGE AT
(ID=200,400,...,800)

CREATE DATABASE AppDB


(EDITION='business',MAXSIZE=50GB)

-- Criar uma federation


CREATE FEDERATION ClientesFed(ID BIGINT RANGE)

Vamos ento ver como feita a diviso de um federation


member de modo a que o sistema no fique indisponvel e a
operao seja completamente transparente para o utilizador.

A federation foi criada com o tipo de dados BIGINT e um


esquema de partio RANGE. Os tipos de dados possveis
na verso actual so INT, BIGINT, UNIQUEIDENTIFIER e
VARBINARY(900).

A operao de split executada em duas fases. A primeira


fase tem como objectivo preparar a transio e a segunda
fase ser a realizao da transio.

-- Ligao ClientesFed
USE FEDERATION ClientesFed (ID=0) WITH RESET,
FILTERING=OFF

SPLIT is executed in 2 phases; first phase is executed


synchronously and focuses on setting up the operation in
motion. The second phase happens asynchronously and
typically is where bulk of the time is spent.

Repare que a sintaxe utiliza a palavra reservada USE


seguida de FEDERATION na sintaxe de ligao a uma
federation. Temos que indicar qual a unidade atmica que
nos queremos conectar, o que neste caso indiferente
porque acabmos de criar a federation e portanto todos ID
so vlidos.

Fase 1
Nesta primeira fase instanciadas duas novas base de dados
para alojar, uma para cada parte dos dados. Essas bases de
dados tero o estado SPLITTING na tabela sys.databases.

CREATE TABLE Cliente(


ClienteID bigint,
Nome nvarchar[100],
primary key (ClienteID)
FEDERATED ON (ID = ClienteID)

So criadas as entradas nas tabelas de metadata que iro


suportar
o
progresso
da
operao
(sys.dm_federation_operation*) e preparadas as operaes
de cpia dos dados.

A sintaxe de criao de uma tabela neste caso no tem nada


de novo excepo da ltima linha que permite anotar a
tabela como fazendo parte da federation e indicar qual a
coluna que serve de federation key a coluna ClienteID.
Repare que o tipo de dados dessa coluna tem que ser igual
ao tipo de dados definido para a federation key.
CREATE TABLE Distrito(DistritoID
tinyint primary key, Nome nvarchar(128))
Se no for indicado o FEDERATED ON estamos a criar uma
tabela com dados de referncia que ir ser replicada por
todos os federation members.
USE FEDERATION ClientesFed (ID = 110) WITH RESET,
FILTERING=ON
Temos agora um exemplo de uma ligao a uma unidade
atmica. Neste exemplo estamos a criar uma ligao
unidade atmica com ID=110 dado que a opo FILTERING
est ON.
SPLIT
Neste momento a nica operao suportada a operao
de Split (diviso) com um parmetro.

Figura 5.1 Primeira fase do SPLIT

ALTER FEDERATION ClientesFed SPLIT (ID=200)

27

A PROGRAMAR
Introduo s SQL Azure Federations
Repare que o downtime que existe muito pequeno porque
trata-se apenas de alteraes na metadata e mascarado
pela retry logic que devemos ter nas aplicaes que usam
SQL Azure e portanto o erro no chega a ser visvel aos
utilizadores da aplicao.

Enquanto esta fase corre a aplicao continua a funcionar


sobre a base de dados original e alm das operaes de
CRUD podem ainda ser realizar alteraes ao schema.
Fase 2
nesta fase que ocorre a transaco do schema e dos
dados para as novas base de dados.

Concluso
A plataforma Windows Azure j permitia a construo de
camadas de apresentao e camadas de lgica de negcio
altamente escalveis mas estava ligeiramente atrs no que
respeita a camadas de acesso a dados sobre bases de
dados. As camadas de acesso a dados sobre storage j so
altamente escalveis mas agora as SQL Azure Federations
vm trazer ao SQL Azure a mesma possibilidade sem que
tenha que existir uma implementao manual do padro de
sharding.

O Schema e todas as tabelas com dados replicados (tabela


de cdigos postais dos CTT por exemplo) so copiados para
ambas as bases de dados novas. Os dados a particionar
sero filtrados e copiados para a respectiva base de dados.
Alm das bases de dados novas os dados sero tambm
copiados para as respectivas cpias secundrias.
Aps todos os dados terem sido copiados d-se a troca. A
base de dados original passa para o estado offline
quebrando assim todas as ligaes existentes e
imediatamente aps isso as novas bases de dados passam
para o estado online e comeam a aceitar os novos pedidos
de ligao.

Referncias
Building Scale-Out Database Solutions on SQL Azure - Lev
Novik
http://bit.ly/dUS2P6
Building Scalable Database Solutions Using Microsoft SQL
Azure Database Federations - Cihan Biyikoglu
http://bit.ly/mSL5nW
Your Data in the Cloud - Cihan Biyikoglu
http://bit.ly/fnxTNn

Figura 5.2 Segunda fase do SPLIT

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.

28

A PROGRAMAR
Enigmas do C#: Arrays
Devido a esta covarincia de arrays, as atribuies de valor
a elementos de arrays de tipos referncia inclui uma validao em tempo de execuo para garantir que o valor atribudo ao elemento do array de um tipo permitido. Se tal no
acontecer, ser lanada uma

(continuao da pgina 22)


Resultado
System. ArrayTypeMismatchException: Attempted to access
an element as a type incompatible with the array.

System.ArrayTypeMismatchException
Explicao
Concluso

Aquando do lanamento da plataforma .NET, a nica forma


ter uma coleo tipada, sem ter de a desenvolver, era o array.

Pelo demonstrado, a passagem de arrays entre interfaces


programticas (APIs) desaconselhada (e desnecessria
aps a verso 2.0 da plataforma).

A plataforma (e as suas linguagens C# e Visual Basic)


permite a converso entre arrays de tipos referncia. Para
dois tipos referncia A e B, se existir uma converso de referncias (implcita ou explicita) de A para B, a mesma converso de referncias existe de um array de tipo A[R] para um
array do tipo B[R], em que R uma especificao de dimenso (mas a mesma para ambos os tipos).

A utilizao de arrays deve ser mantida privada ou em situaes em que a sua errada manipulao no pode levar
inconsistncia dos sistemas, como o caso de leitura ou
escrita de streams.
Para os restantes casos, deve ser usada a mais simples
interface que satisfaa os requisitos. Por exemplo, se apenas
se pretende enumerar os elementos, IEnumerable<T> o
suficiente. Se ICollection<T> for suficiente, no se deve usar
IList<T>.

Por isso, possvel escrever o seguinte cdigo:

Posio2D[] a1 = new Posio3D[5];


Posio[] a2 = a1;

Ligaes
Mas porque isto apenas vlido caso exista uma converso
de referncias, o seguinte cdigo no vlido:

C# Reference http://bit.ly/tfDPKa

int[] a3 = (int[])(new long[5]);

Covariance and Contravariance in C#, Part Two: Array Covariance http://bit.ly/sicYL9


Covarincia e Contravarincia em
Genricos http://bit.ly/sMiv5M

Esta relao designada por covarincia de arrays. A covarincia de arrays, em particular, significa que um valor de um
array do tipo A[R] pode ser uma referncia para um array do
tipo B[R], desde que exista uma converso implcita entre B
e A.

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.

29

COLUNAS
VISUAL (NOT) BASIC Um pouco mais de Windows Phone 7
CoreDump Free as in Beer

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7
Integrao com o ambiente

Em uma edio anterior, na edio nmero 27, foi abordado


o desenvolvimento VB.NET para Windows Phone 7 (WP7)
na coluna, de uma forma bsica, como que a fornecer o essencial para acesso ao meio, comear a desenvolver algumas brincadeiras, despertar vontades e quem sabe, mudar
opinies.

Tiles

Desta vez, e assumindo que o essencial foi absorvido na


edio 27, gostaria de passar a apresentar acessos s funcionalidades e caractersticas mais pertinentes destes aparelhos no geral, e do sistema operativo em particular e no
tanto na construo da aplicao em si.
Estas funcionalidades e caractersticas ajudam a produzir
possvel interesse do pblico na aplicao, por ter capacidade de interagir no s com o aparelho, mas com o meio que
o rodeia, das mais variadas formas e para os mais variados
fins.
A forma mais simples de interagir com o menu "mosaico",
para alm de alterar o tile da aplicao, atravs da criao
de "standard tiles".

Existem vrios complementos externos s aplicaes mas


um dos mais preciosos ter de ser a possibilidade de fazer a
aplicao interagir com os "tiles", ou os mosaicos do ecr de
espera (a Microsoft gosta de lhe chamar Start screen, consequentemente, os Start Tiles. Eu vou chamar s tiles).

Estes tiles possuem duas faces 173x173 que podemos usar


para apresentar informao, da forma que nos for mais conveniente.

precioso na medida em que para estes tiles que o utilizador tem de olhar praticamente cada vez que desbloqueia o
telefone. Se a aplicao puder de alguma forma dar feedback atravs desses tiles, conseguimos chamar a ateno
do utilizador sem precisar de correr a aplicao, ou de l
estar. um local onde suposto estarem todas as notificaes de todos os sistemas dos quais se esperam notificaes.

Podemos optar por utilizar apenas uma das faces, ou ambas.


Neste ltimo caso, a tile alterna da frente para trs de alguns
em alguns segundos, automaticamente.

Para alm disto, os tiles funcionam como atalhos, que nos


levam directamente para determinada pgina da nossa aplicao. Tudo isto pode jogar a nosso favor.
Vamos comear precisamente por a.

Os assuntos abordados foram executados na verso 7.1 do


Windows Phone SDK.
possvel que a maioria no esteja disponvel na verso
7.0.

31

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7
ShellTile a API responsvel por a interaco com o Start
Menu.

tile.BackBackgroundImage = New
Uri("/imagens/backtile.png", UriKind.Relative)
tiles.Update(tile)

A propriedade ActiveTiles da ShellTile a coleco que


contm todos os tiles associados aplicao e onde o ndice
0 (zero, o primeiro) sempre o tile da prpria aplicao
(usado para quando se cria um atalho para a aplicao no
Start Menu).

Para utilizaes mais especficas, tambm possvel programar uma actualizao a um tile.
A actualizao automtica possvel com ShellTileSchedule,
mas apenas possvel actualizar a imagem de fundo, a partir de um URL:

Todos os outros na coleco, se alguns, so tiles secundrios.

Dim sTS As New ShellTileSchedule


sTS.Recurrence = UpdateRecurrence.Interval
sTS.RemoteImageUri = New
Uri("http://www.portugal-a-programar.org/staff/
imagens/banners/pap_2011.png")
sTS.Interval = UpdateInterval.EveryHour
sTS.StartTime = DateTime.Now
sTS.Start()

Assim, podemos alcanar e alterar a tile principal da seguinte


forma:
Dim tile As New StandardTileData
tile.Title = "o meu tile"
tile.BackTitle = "aplicao dos tiles!"
meusTiles.Update(tile)

No garantido que o tile actualize imediatamente, mesmo


que a nossa programao de tempo seja para o alterar apenas uma vez, sem repetio.

Com pouco mais, podemos utilizar a API para criar novos


tiles, ou tiles secundrios:

Estas actualizaes so feitas em grupos e com frequncia


pr-determinada, e no dependem da aplicao.

Dim tile As New StandardTileData


tile.Title = "o meu tile"
tile.BackTitle = "parte de trs"
tile.BackContent = "parte de trs do meu tile"
tile.Count = 8
tile.BackgroundImage = New
Uri("/imagens/tile.png", UriKind.Relative)
tile.BackBackgroundImage = New
Uri("/imagens/backtile.png", UriKind.Relative)
ShellTile.Create(New
Uri("/MainPage.xaml", UriKind.Relative), tile)

Pode demorar at uma hora para que uma actualizao surta efeito.
Em baixo, o resultado da programao programada do cdigo exemplo:

Os tiles secundrios podem, no s, ser completamente


personalizados, mas tambm podem apontar para uma outra
pgina na aplicao, com ou sem parmetros adicionais.
Imagine-se por exemplo um calendrio onde poderamos
criar um tile por cada dia, e esse tile arrancasse o calendrio
naquele dia especfico.
Se for necessrio alterar um tile secundrio, o mtodo em
todo semelhante ao de alterar o tile principal, mas temos de
referenciar um tile secundrio.

Para actualizar mais do que a imagem de fundo, seria


necessrio recorrer a Push Notifications, que no vou
cobrir no artigo.

Por exemplo, apontando para o ltimo tile, no caso de termos apenas tile principal e um secundrio:

Este facto fora-me a omitir outras funcionalidades


interessantes como a Toast Notification.

Dim tiles As ShellTile = ShellTile.ActiveTiles.Last


Dim tile As New StandardTileData
tile.Title = "o meu tile *"
tile.BackTitle = "parte de trs *"
tile.BackContent = "parte de trs do meu tile *"
tile.Count = 0
tile.BackgroundImage = New
Uri("/imagens/tile.png", UriKind.Relative)

lupa:
StandardTileData

BackBackgroundImage
Imagem de fundo da face traseira

32

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7

Resources

BackContent
Texto a apresentar no corpo da face traseira

Para manter a coerncia, durante a execuo da aplicao,


importante existir um local a partir do qual se podem consultar uma srie de opes transversais ao aparelho.

BackgroundImage
Imagem de fundo da face dianteira

A coleco Resources, em Application.Current.Resources


pode no s ser usada como repositrio temporrio de alguns parmetros que queremos ter disponveis em qualquer
pgina, mas tambm pode ser usada para consultar parmetros do aparelho em si, ou do sistema operativo, bastante
importantes para a integrao da aplicao.

BackTitle
Texto a apresentar no ttulo da face traseira

Count

Um bom exemplo so por exemplo as cores e os brushes


que esto a ser utilizados no sistema.

Nmero a apresentar no contador da face dianteira

Title
Texto a apresentar no ttulo da face dianteira

ShellTileSchedule

Interval
Define a frequncia da actualizao. Definida por um

Enum

MaxUpdateCount

Nmero mximo de actualizaes a efectuar, desde o


ltimo Start. Zero para actualizar indefinidamente, at ordem
de Stop.

Recurrence

Define se a actualizao nica ou se dever repetir

RemoteImageUri
Endereo da imagem a utilizar para a actualizao do

a partir desta coleco que se pode consultar, entre dezenas de outros parmetros, a Accent color que o utilizador
escolheu e se o tema escuro ou claro.

tile

Start
Inicia a actualizao programada

A coleco composta por chaves nicas e o seu respectivo


valor.

StartTime

Application.Current.Resources.Add
("urlPAP", New Uri
("http://www.portugal-a-programar.org"))
MessageBox.Show(DirectCast
Application.Current.Resources("urlPAP"),
Uri).AbsoluteUri)

Define a data a partir da qual o programa tem efeito

Stop
Interrompe e termina a actualizao programada

33

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7

Application.Current.Resources.Add
("parametro1", "teste!")

PhoneLightThemeVisibility (no tema dark, assume


Visibility.Collapsed)

MessageBox.Show
(Application.Current.Resources
("parametro1))

Tipo Double para opacidade

Tanto a chave como o valor so do tipo Object, para uma


elevada versatilidade, pelo que sempre boa ideia proceder
a casts ou converses de tipo para trabalhar com a coleco.

PhoneDarkThemeOpacity (no tema dark, assume 1.0,


opaco)

PhoneLightThemeOpacity (no tema light, assume 1.0,


opaco)

As chaves correspondentes s cores do tema mais pertinentes so:

Para as utilizar basta usar uma das chaves expostas no dicionrio Resources.

Tipo SolidBrush

Ser devolvido o tipo especificado, com a informao pretendida.

PhoneAccentBrush (brush com cor dos destaques,


igual cor dos tiles. Conhecida como a accent color)

PhoneForegroundBrush

PhoneBackgroundBrush

Por exemplo:
Application.Current.Resources_
("PhoneDarkThemeOpacity")

DeviceStatus
Para alm dos parmetros de cor, tamanho e outros, que
nos permitem a integrao visual da nossa aplicao, necessrio tambm conhecer o aparelho para determinar de
que forma se dever adaptar e como se dever comportar.

Tipo Color

PhoneAccentColor (cor dos destaques, igual cor


dos tiles. Conhecida como a accent color)

PhoneBackgroundColor

PhoneForegroundColor

Muita da informao bsica do aparelho encontra-se em


Microsoft.Phone.Info
AppliMicrosoft.Phone.Info.Device.
Status.DeviceFirmwareVersion
Microsoft.Phone.Info.DeviceStatus.
DeviceManufacturer.Microsoft.Phone.
Info.DeviceStatus.DeviceName
Microsoft.Phone.Info.DeviceStatus.PowerSource.
ToString

Tipo Double para tamanho de fonte

PhoneFontSizeSmall

PhoneFontSizeNormal

PhoneFontSizeMedium

PhoneFontSizeMediumLarge

PhoneFontSizeLarge

PhoneFontSizeExtraLarge

PhoneFontSizeExtraExtraLarge

PhoneFontSizeHuge

Depois, para alm dessa informao geral, existe tambm


informao em mbitos mais reduzidos, por exemplo, a disponibilidade ou o nome da ligao de dados, que nos remete a Microsoft.Phone.Net:
Microsoft.Phone.Net.NetworkInformation.
NetworkInterface.NetworkInterfaceType.ToString
Microsoft.Phone.Net.NetworkInformation.
NetworkInterface.GetIsNetworkAvailable
Ou a disponibilidade fsica de alguns sensores, em Microsoft.Devices.Sensors, por exemplo:

Tipo Visibility

PhoneDarkThemeVisibility (no tema light, assume


Visibility.Collapsed)

Microsoft.Devices.Sensors.Compass.IsSupported
Microsoft.Devices.Sensors.Gyroscope.IsSupported

34

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7
Entre outros.

ApplicationBar.MenuItems.Add
(New ApplicationBarMenuItem("item1"))
ApplicationBar.MenuItems.Add
(New ApplicationBarMenuItem("item2"))

ApplicationBar
Todas as aplicaes tm a possibilidade de usufruir de um
menu configurvel, e de comportamento e contornos transversais ao sistema operativo.

A ApplicationBar pode ser pr-configurada via XAML.


No cdigo acima, os constituintes so adicionados em runtime a uma ApplicationBar adicionada via XAML.

Este componente de extrema importncia quando a nossa


aplicao compreende uma maximizao de espao til em
paralelo com um elevado nmero de funcionalidades.

No est includo qualquer handling dos eventos necessrios para o funcionamento, como o click.
Basta acrescentar um handler por cada boto ou item, por
exemplo:
AddHandler appBot.Click, AddressOf BotaoTocado

Caso no seja adicionada via XAML, a propriedade ApplicationBar estar nula at que uma instncia de ApplicationBar
lhe seja atribuda.
As imagens a utilizar como cones dos botes, devero ser
PNG, e devero ser marcadas com a Build Action Content
para que possam ser utilizadas.
IsolatedStorage

Em todas as aplicaes, por mais pequenas que sejam,


muito provvel que exista uma situao em que ideal armazenar algum tipo de informao de forma a que possa ser
recuperada independentemente da aplicao terminar ou do
aparelho ser desligado.

A ApplicationBar constituda por 4 Botes com cone e n


Itens em lista vertical.

'Preparar o tnel de ligao com a nossa


'isolatedstorage
Dim ISTF As IsolatedStorageFile = _
IsolatedStorageFile.GetUserStoreForApplication()
MessageBox.Show(A quota para a aplicao de
& ISTF.Quota.ToString & bytes)

No obrigatrio utilizar ambos, assim como no obrigatrio utilizar apenas um em detrimento do outro: o seu uso est
ao nosso critrio.
Podem existir um mximo de 4 botes, e os botes podem
ou no utilizar uma pequena descrio.

ISTF.CreateDirectory("pasta")

Finalmente, podem assumir qualquer cor, qualquer nvel de


opacidade e ainda suportam dois modos de recolha: o normal, onde os botes esto visveis, e o minimizado onde
recolhida apenas expe o ponto de expanso.

'Escrever linhas para um ficheiro na


'isolatedstorage
Using SW As New IO.StreamWriter(New
IsolatedStorageFileStream("pap.txt",
FileMode.Create, FileAccess.Write, ISTF))
SW.WriteLine("linha1")
SW.WriteLine("linha2")
End Using
'Ler dados a partir de um ficheiro na
'isolatedstorage
Using SR As New IO.StreamReader
(New IsolatedStorageFileStream
("pasta\pap.txt",
FileMode.OpenOrCreate,
FileAccess.ReadWrite, ISTF))

ApplicationBar.BackgroundColor = Colors.Red
ApplicationBar.ForegroundColor = Colors.LightGray
ApplicationBar.Opacity = 1D
ApplicationBar.Buttons.Clear()
ApplicationBar.MenuItems.Clear()
Dim appBot As New ApplicationBarIconButton
appBot.Text = "boto!"
appBot.IconUri = New Uri("/imagens/perg.png",
UriKind.Relative) 'build como content
ApplicationBar.Buttons.Add(appBot)

35

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7
So independentes da aplicao, e funcionam sempre. Por
esta razo, esto aptas para analisar a situao do telefone
e decidir, por exemplo, que no dever transferir um ficheiro
de elevadas dimenses sem estar ao alcance de uma WiFi,
ou ligado uma fonte de energia externa.

While Not SR.EndOfStream


MessageBox.Show(SR.ReadLine)
End While
End Using

O BackgroundTransferService recebe BackgroundTransferRequest, e cada um destes pedidos pode implicar o download de um ficheiro para a IsolatedStorage, ou o upload de um
ficheiro da IsolatedStorage.

A IsolatedStorage responde desde essa necessidade, at


necessidade de uma aplicao que apenas implique pesadas operaes com ficheiros, ou que exija um elevado grau
de organizao no seu sistema de dados.

Em ambos os casos, importante que os handlers TransferProgressChanged e TransferStatusChanged sejam registados para que se consiga dar feedback ao utilizador.

Podemos encarar a IsolatedStorage como uma pasta que


reside algures no aparelho, no interessa onde, e que est
de alguma forma relacionada com uma aplicao em especfico.

As transferncias so identificadas inequivocamente por o


seu RequestID, que automaticamente gerado a cada pedido.

Neste local, nos possvel criar pastas, ficheiros, copiar ficheiros, consultar datas de modificao, virtualmente todas
as operaes com ficheiros que teramos em um outro sistema de ficheiros, incluindo listagens. Assim como qualquer
outro sistema de ficheiros, a IsolaredStorage tambm tem
um limite. Esse limite est pr-definido para cada aplicao,
com uma quota.

Dim ISTF As IsolatedStorageFile =


IsolatedStorageFile.GetUserStoreForApplication()
If Not ISTF.DirectoryExists("shared\transfers")
Then
ISTF.CreateDirectory("shared\transfers")
End If
Dim BGT As New Microsoft.Phone.BackgroundTransfer.
BackgroundTransferRequest(New Uri
("http://www.portugal-a-programar.org/revistaprogramar/edicoes/download.php?e=31&t=forum"))

Eis o exemplo de uma operao com ficheiros que engloba


os essenciais:
Quando a quota por defeito no suficiente, possvel pedir
um aumento da quota, e a concesso da exclusiva gesto
do sistema operativo.
Se for possvel, o mtodo devolve True e a quota aumentada. Caso contrrio, devolve False.

AddHandler BGT.TransferProgressChanged,
AddressOf repProgresso
AddHandler BGT.TransferStatusChanged,
AddressOf repEstado

Se o pedido para aumentar a quota for de valor inferior


actual quota, disparada uma excepo.

BGT.DownloadLocation = New Uri("shared/transfers/


revista.pdf", UriKind.RelativeOrAbsolute)
Microsoft.Phone.BackgroundTransfer.
BackgroundTransferService.Add(BGT)

As quotas so expressas em bytes.


ISTF.IncreaseQuotaTo(2000000)

Private Sub repProgresso(ByVal sender As Object,


ByVal e AsMicrosoft.Phone.BackgroundTransfer.
BackgroundTransferEventArgs)
' e.Request.BytesReceived
' e.Request.TotalBytesToReceive
' aces de actualizao
End Sub

Se a aplicao for desinstalada, a IsolatedStorage associada


destruda.

Background Transfers
A propsito das IsolatedStorages, sendo esses os locais
onde se devem operar ficheiros, importante referir as Background Transfers.

Private Sub repEstado(ByVal sender As Object, ByVal


e As Microsoft.Phone.BackgroundTransfer
.BackgroundTransferEventArgs)
ApplicationTitle.Text =
e.Request.TransferStatus.ToString

As Background Transfers so unidades de um servio de


transferncias de ficheiros existente na framework, que utilizam os meios e circunstncias sua disposio, quer sejam
ligaes de dados celulares ou WiFi, bateria ou alimentao
externa para descobrir a melhor forma e a melhor altura para
transferir ficheiros.

Quanto uma transferncia completa, no desaparece. Esta


ter que ser removida por aplicao.

36

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7
Por esta razo, uma aplicao que lide com transferncias
desta natureza, tem a responsabilidade de verificar as filas
de transferncias de cada vez que arrancar, para determinar
se a transferncia precisa de alguma aco ou se precisa de
ser removida.

Dim IPB As New ProgressBar


IPB.IsIndeterminate = True
ContentPanel.Children.Add(IPB)
Basta utilizar a visibilidade para mostrar ou ocultar a barra.

For Each BGTR As Microsoft.Phone.


BackgroundTransfer.BackgroundTransferRequest
In Microsoft.Phone.BackgroundTransfer.
BackgroundTransferService.Requests

Leitura do exterior
Acelermetro, giroscpio e bssola

Select Case BGTR.TransferStatus


Case Microsoft.Phone.BackgroundTransfer.
TransferStatus.Completed
Microsoft.Phone.BackgroundTransfer.
BackgroundTransferService.Remove(BGTR)
MessageBox.Show("Transferencia com RequestID="
& BGTR.RequestId & " terminou enquanto
no estava na aplicao!")
'outras aces, como dar feedback ao UI
para saber que terminou
Case Microsoft.Phone.BackgroundTransfer.
TransferStatus.Paused,
Microsoft.Phone.BackgroundTransfer.
TransferStatus.Transferring,
Microsoft.Phone.BackgroundTransfer.
TransferStatus.WaitingForExternalPower,
'outras aces, como feedback ao UI para
'continuar
End Select

Os aparelhos WP7 esto, tipicamente, munidos de componentes que lhe permitem perceber como que esto a ser
orientados e movimentados no espao fsico.
Estes trs componentes funcionam todos de forma semelhante, mas do leituras distintas.
Estas leituras podem ser utilizadas em separado, ou em conjunto para se complementarem em determinadas aplicaes.
A classe Motion do namespace Sensors utiliza as leituras
destes componentes para calcular movimentos e orientaes
com mais preciso (por exemplo para realidade aumentada).

If Sensors.Accelerometer.IsSupported Then
Dim Accel As New Sensors.Accelerometer
Accel.TimeBetweenUpdates =
New TimeSpan(0, 0, 0, 0, 100)
AddHandler Accel.CurrentValueChanged,
AddressOf dadosAccel
Accel.Start()
End If

Next
Indeterminate ProgressBar
Em algumas operaes onde no possvel prever o tempo
de execuo ou no se possa quantificar o progresso as
Indeterminate ProgressBars so importantes porque oferecem um feedback visual ao utilizador, que indica que alguma
coisa est a executar e far consequentemente com que
aguarde.

Cada sensor preparado de maneira semelhante, configurando qual o intervalo de tempo entre as actualizaes (ou
seja, qual a frequncia com que a leitura feita), adicionando o handler para reportar as leituras, e no caso da bssola
um handler que dispara caso se detecte que a preciso da
bssola est afectada de forma a que seja necessrio calibrar.
A captura comea assim que o mtodo Start for chamado, e
termina quando for chamado o Stop.

Na verdade, uma Indeterminate ProgressBar uma progressbar comum, mas com a propriedade IsIndeterminate verdadeira.

37

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7
Eis um exemplo de obteno de dados da bssola:
Private Sub dadosComp(ByVal sender As Object,
ByVal e As Sensors.SensorReadingEventArgs(Of _
Sensors.CompassReading))
Deployment.Current.Dispatcher.BeginInvoke(
Sub()
'caso a preciso da leitura esteja abaixo de
'15, as letras do boto ficam brancas (OK)
'as letras ficam vermelhas se for disparado o
'evento Calibration. Para o exemplo, esse
'handler colocava as letras do boto vermelhas
'o que indica que a calibrao era necessria
If e.SensorReading.HeadingAccuracy < 15 Then
Button8.Foreground = New SolidColorBrush
(Colors.White)
Dim preciso As Double =
e.SensorReading.HeadingAccuracy
Dim orientacaoMag As Double =
e.SensorReading.MagneticHeading
Dim magnetometro As _
Microsoft.Xna.Framework.Vector3 =
e.SensorReading.MagnetometerReading
Dim verdadeiraOri As Double =
e.SensorReading.TrueHeading
End Sub
End Sub)

Leitura do acelermetro

Do giroscpio:
Private Sub dadosGyro(sender As Object, e As _
Sensors.SensorReadingEventArgs(Of _
Sensors.GyroscopeReading))
Deployment.Current.Dispatcher.BeginInvoke(
Sub()
Dim rrX As _
Microsoft.Xna.Framework.Vector3 =
e.SensorReading.RotationRate
End Sub)
End Sub

Leitura da bssola

No tive oportunidade de utilizar um aparelho com giroscpio


para apresentar leituras.
necessrio o invoke, pois no garantido que as leituras
voltem no thread da UI.

E do acelermetro:

As leituras so adaptadas ao tipo de sensor e tero de ser


interpretadas no seu contexto, o que requer conhecimentos
matemticos no campo da fsica.

Private Sub dadosAccel(ByVal sender As Object,


ByVal e As Sensors.SensorReadingEventArgs(Of _
Sensors.AccelerometerReading))
Deployment.Current.Dispatcher.BeginInvoke(
Sub()
Dim acel As _
Microsoft.Xna.Framework.Vector3 =
e.SensorReading.Acceleration
End Sub)
End Sub

Vector3 um tipo de dados que armazena essencialmente 3


valores, XY e Z, representando consequentemente um vector no espao.
A classe Vector3 pode ser encontrada no namespace
Microsoft.Xna.Framework.
Cada leitura acompanhada por uma estampa de tempo
(SensorReading.Timestamp).
Estes dados podem ser necessrios para cruzar com leituras
de outros sensores no decorrer de um intervalo, e determinar
rotas ou melhorar mdias.

38

VISUAL (NOT) BASIC


Um pouco mais de Windows Phone 7
GPS
Os dados da geo-localizao, atravs de satlites de posicionamento, no considerado um sensor, tendo sido abrigada
no namespace System.Device.Location, classe GeoCoordinateWatcher.
relativamente fcil comear a capturar a localizao, bastando apenas registar um handler para as mudanas de posio.
Dim GPS As New
System.Device.Location.GeoCoordinateWatcher
AddHandler GPS.PositionChanged,
AddressOf dadosGPS
GPS.Start()

Leitura do GPS
A velocidade dada em metro por segundo, orientao em
graus relativos a norte, altitude e precises em metros.
Cada relatrio de posio tambm acompanhado por uma
estampa de tempo (Location.Timestamp).

O handler parecido com os dos sensores:


Private Sub dadosGPS(ByVal sender As Object,
ByVal e As System.Device.Location.
GeoPositionChangedEventArgs
(Of System.Device.Location.GeoCoordinate))
Deployment.Current.Dispatcher.BeginInvoke(
Sub()
Dim latitude As Double =
e.Position.Location.Latitude
Dim longitude As Double =
e.Position.Location.Longitude
Dim velocidade As Double =
e.Position.Location.Speed
Dim altitude As Double =
e.Position.Location.Altitude
Dim orientacao As Double =
e.Position.Location.Course
Dim precisaoVert As Double =
e.Position.Location.VerticalAccuracy
Dim precisaoHorz As Double =
e.Position.Location.HorizontalAccuracy
End Sub)
End Sub

Em suma
Apenas a criatividade em conjunto com a utilidade ditam o
sucesso de uma aplicao, mas importante ter conhecimento das possibilidades que nos so oferecidas.
Existem muito mais pequenas e grandes funcionalidades
que merecem ser exploradas: apenas foquei as que considero de maior interesse e que podem ser integradas num maior
nmero de aplicaes, tratem elas do que tratarem.

AUTOR
Srgio Ribeiro, curioso e auto-didacta com uma enorme paixo por tecnologias de informao e uma saudvel relao com
a .NET framework.
Moderador do quadro de Visual Basic.NET na comunidade Portugal@Programar desde Setembro de 2009.
Alguns frutos do seu trabalho podem ser encontrados em http://www.sergioribeiro.com

39

CoreDump
Free as in Beer
Open Source Software (OSS), free as in speach, not as in
beer...

Atualmente as organizaes tecnologicamente maduras vm


o OSS como free as in speach e no como free as in beer. Essas organizaes compreendem a diferena e, acima
de tudo, fazem escolhas de software conscientes, colocando
lado-a-lado vrias solues proprietrias e open source para
medir a sua eficcia na resoluo dos seus problemas. Esta
abordagem agnstica e independente permite s organizaes efetuarem escolhas baseadas no mrito e no por outros critrios mais duvidosos aos olhos de um tcnico competente.

Por muito altrusta que pretenda ser, a verdade que muito


do OSS proliferou por ser free as in beer... E se hoje em dia
solues OSS tm um grau de maturidade que ningum
questiona, a verdade que muitas organizaes continuam
a optar por OSS no pelas suas caratersticas, no por ser
livre mas sim por ser grtis!
Este erro comum de confundir software livre com software
gratuito continua a existir. Um excelente exemplo a recente
adoo por parte do governo portugus de OSS precisamente por no querer renovar licenas de software proprietrio.
Ou seja, um caso claro e assumido de escolha de OSS por
ser free as in beer...

As organizaes imaturas continuam, e acredito que continuaro, a escolher o OOS por o conceberem como gratuito.
Mas quando a escolha de um produto se foca no preo de
aquisio do mesmo, corre-se o risco da escolha no se
adequar realidade ou s necessidades da organizao.
Escolher OSS, ou um software proprietrio gratuito, nesta
base revela uma falha enorme ao nvel da gesto, fazendo
com que a organizao incorra em custos no previstos e
alguns dissabores. Esse custos so, muitas vezes, operacionais e escondidos, ou varrido para debaixo do tapete. Por
exemplo, quando algum tem de fazer uma quantidade de
trabalho manual adicional para completar uma tarefa que
deveria ser totalmente automatizada.

Por esta altura muitos esto a pensar mas isso OSS,


qualquer um pode mexer no cdigo e adequ-lo s necessidades da empresa. Na verdade no. E porqu? Porque o fator de escolha foi o preo, e uma organizao que
escolhe assim no est disposta a pagar a uma empresa ou
a um profissional para adaptar a soluo s necessidades da
organizao. Mesmo que isso fosse bastante mais barato do
que todo o custo operacional adicional que as falhas implicam. No nos podemos esquecer que esta uma organizao tecnologicamente imatura, se no o fosse, teria efetuado
a sua escolha de forma consciente.

Imagem de Geek and Poke.

Se nos anos 70 e 80 algum tinha um problema num sistema


que havia sido comprado a um concorrente da IBM, estava
em maus lenis e tinha de responder Why not IBM?. A
IBM dominava a informtica empresarial e todos os departamentos de IT eram IBM. Os que no eram, quando havia um
problema tinham de explicar administrao porque no
haviam comprado IBM, mesmo que a soluo adotada servisse melhor a organizao. Nos anos 90 o mesmo se comeou a passar com a Microsoft. Hoje em dia h situaes onde essa questo se coloca ao nvel do OSS. Em particular
em solues maduras como sistemas operativos para servidores ou servidores web, comum observar algum questionar porque no se optou por uma distribuio de Linux ou
pelo Apache.

Felizmente as organizaes tm evoludo e os departamentos de IT tm hoje competncias que no tinham 10 anos


atrs. Isso faz com que cada vez mais os departamentos de
IT sejam integrados na estratgia de negcio das organizaes e consigam responder com solues tecnolgicas cada
vez melhores.

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 experincia profissional nas reas de Tecnologias e Sistemas de Informao. Criou a sua prpria consultora sendo a sua especialidade a migrao de dados.

40

COMUNIDADES
AzurePT - Multiplas identidades no seu WebSite usando Windows
Azure AppFabric ACS
NetPonto - Biztalk Server - Princpios Bsicos dos Mapas

COMUNIDADE AZUREPT
Multiplas identidades no seu WebSite usando Windows Azure AppFabric ACS
podemos inclusivamente deixar de utilizar o mesmo se
no existir alternativa, mais uma vez porque a confiana
absolutamente crucial quando falamos de questes relacionadas com cartes de crdito, identidades, e outras informaes sensveis. A situao seria completamente diferente se
o website nos desse a possibilidade de no colocar os dados
directamente no mesmo, mas sim redireccionar-nos para um
website de um banco, ou PayPal ou outro qualquer sistema
no qual eu tenha uma elevada confiana para tratar os meus
dados.

Introduo
Uma das questes que actualmente mais se tem falado o
facto de existirem demasiadas identidades actualmente na
internet, pois quem no passou at hoje pelas seguintes
questes quando chega a um website, ser que j me registei neste website?, qual ser o utilizador que utilizei no registo?, para j no falar na dificuldade de lembrar da palavra-chave que foi utilizada para o mesmo. Com todas estas
questes o que em muitas situaes acontece que comeamos a ter quase um padro para o nome do utilizador e
palavra-chave que utilizamos no registo nos websites, o que
no claramente uma boa prtica de segurana, mas isso
ou andar com uma aplicao em que descrevemos todos os
websites em que nos registamos, juntamente com o nome do
utilizador e palavra-chave utilizada. Isto sempre uma mina
de ouro porque se algum apanhar esta informao estamos completamente agarrados, porque nem sequer sabemos todos os locais em que determinada identidade existe.

Por tudo isto cada vez mais so as solues e websites


que em vez de terem a sua prpria gesto de identidades
tm relaes de confiana com fornecedores de identidades
bem conhecidos, como por exemplo o LiveId, GoogleId, Twitter, Facebook, entre outros. Mas a questo que se coloca
como conseguimos ns criar um website que tem exactamente o mesmo tipo de funcionamento, e no querendo pedir demasiado, como que o conseguimos efectuar com o
mnimo de trabalho possvel?

Tambm bastante problemtico em termos de segurana


que muitas vezes ns registamos os nossos dados num
determinado website, sem utilizar os dados reais porque em
primeiro lugar, no sabemos exactamente o que vai acontecer no mesmo, nem o que o prprio website vai fazer com os
mesmos. Isto importante porque quantos de ns j no
vimos aplicaes em que as prprias palavras-chave se encontravam completamente acessveis e desencriptadas na
base de dados?

Conceitos base
Para que consigamos responder a esta questo necessitamos de em primeiro lugar compreender os conceitos que
se encontram na base desta soluo. E para iniciarmos vamos olhar para o conceito de IdP Identity Provider, que
uma aplicao/soluo que tem como funo principal gerir
identidades. Neste caso como fornecedores de identidade
teramos o LiveId, GoogleId, TwitterId, FacebookId, etc. Uma
das vantages de utilizarmos estes fornecedores de identidades que a maioria das pessoas j tm um deles ou mais, e
isso ir permitir que o utilizador para poder utilizar a nossa
soluo no passe a ter mais uma identidade digital.

Imaginemos o seguinte cenrio,


Enquanto me encontrava a navegar na internet depareime com um website muito interessante que tem uma rdio
online e msicas muito recentes, aquilo que eu fiz imediatamente foi registar-me. Aps isso descobri que existe uma
subscrio que por um pequeno valor consigo ter acesso a
um conjunto maior de msicas e ainda mais recentes, e a
possibilidade de efectuar o descarregamento de algumas
para dispositivos como iPod, PC, etc. Para efectuar essa
subscrio necessito de colocar os dados relativos ao meu
carto de crdito no site (nmero e cdigo de segurana),
para que eles possam todos os meses debitar o meu carto
de forma a pagar a subscrio.

Outro conceito muito importante o RP - Relaying


Party que representa a aplicao/soluo que confia a parte
de validao das identidades num IdP. Quando existe este
tipo de relao de confiana entre um RP e um IdP, diz-se
que estamos perante uma Identidade Federada, uma vez
que no a soluo que trata das identidades mas sim, confia/federa essa responsabilidade num IdP.
Tambm bastante importante o conceito de FG - Federation Gateway que bsicamente nos define quais as identidade que a nossa soluo vai suportar, e que ir permitir ao
utilizador seleccionar qual o IdP que deseja utilizar e efectuar
o reencaminhamento para esse mesmo IdP sempre que for
necessrio identificar um utilizador desse tipo.

Este um cenrio relativamente comum de acontecer, a


questo que todos ns j estamos devidamente preparados para dizer logo que essa no parece uma boa opo por
uma questo simples, a confiana. O website pode ser excelente, pode ter msica excelente mas esse o seu negcio,
mas quando falamos de questes relacionadas com pagamentos ou outras questes sensveis j pensamos melhor e

Para finalizar existe um outro conceito que o Tipo de


Federao (Federation Type) que define a forma como o

42

COMUNIDADE AZUREPT
Windows Azure AppFabric ACS
At aqui tudo bem, agora s falta compreender como que
poderemos efectuar a relao de confiana entre o RP e o
IdP e como poderemos utilizar um FG para que possamos
ter mais do que um IdP.

processo de routeamento entre o FG e o IdP efectuado,


sendo que o mesmo poder ser efectuado de duas formas:

Passivo Necessita de redireccionamento. Exemplo


seria um browser, em que ns quando vamos ao site
da XBOX, quando pedimos para fazer o login, somos
imediatamente redireccionados para o site do LiveId,
e apenas quando formos correctamente validados
pelo mesmo retornamos ao site da XBOX.

Windows Azure AppFabric Access Control Service (ACS)


Uma das formas de resolvermos este problema utilizando o
Windows Azure AppFabric Access Control Service, que
nada mais do que um servio que nos fornecido dentro da
plataforma de Cloud Computing da Microsoft, o Windows
Azure, e que desde logo funciona como Federation Gateway. Para alm disso a Microsoft tem tambm um bloco
denominado WIF Windows Identity Foundation que o
responsvel por simplificar todo o processo de trabalho com
Federao de Identidade e Claim-based Identity.

Activo No necessita de redireccionamento, efectua


a passagem das informaes de identidade de uma
forma proactiva. Exemplo deste tipo de federao
seria uma aplicao Windows Forms ou uma qualquer soluo rica que no corre dentro de um
browser, e na qual no poderemos redireccionar para
um site. Neste caso o que ir acontecer que a validao das informaes ser efectuada de uma forma
proactiva utilizando servios para que seja efectuada
a validao e respectiva identificao do utilizador.

Soluo
Mas como poderemos solucionar este problema com o Windows Azure AppFabric ACS? Para isso necessitamos de ter
instalado o Visual Studio 2010 SP1, as Windows Azure Tools
for Visual Studio 2010, preferencialmente a verso 1.6 que
saiu ainda muito pouco tempo e o WIF Runtime e SDK.

Problema
Tendo todos estes conceitos em conta, o problema que
ns queremos criar uma relao de confiana para com diversos IdPs e por isso mesmo necessitamos de um FG, e
uma vez que estamos num ambiente Web, dentro do
browser iremos utilizar a Federao Passiva, uma vez que
ser possvel efectuar o redireccionamento.

Vamos iniciar o processo com a criao de um WebSite normal em Visual Studio:

43

COMUNIDADE AzurePT
Windows Azure AppFabric ACS
Ao escolhermos o boto Access Control Service que se encontra no topo do portal passamos imediatamente ao portal
de gesto deste mesmo servio.

Se lanarmos agora o WebSite temos que um site normalissimo com uma gesto de identidade tradicional.

Vamos agora preparar o Windows Azure AppFabric Access


Control Service e definir quais os Identity Providers (IdP)
que vamos querer que sejam possveis de utilizar no nosso
WebSite. Para isso vamos ao site http://windows.azure.com,
ao tab de Service Bus, Access Control & Caching.

Onde escolhemos o n Access Control. Vamos para este


exemplo criar um novo namespace com o nome
MyFederatedWebSite.

Neste portal a primeira operao que iremos efectuar definir os Identity Providers que iremos disponibilizar, e neste
caso vamos escolher Google e Yahoo.
Ficando com o seguinte:

O que este passo ir fazer criar uma nova entrada no DNS


do Windows Azure com este nome para o tratamento de
federao de identidade. O que acontece que alm da
entrada no DNS tambm provisionado para ns um ambiente com todos os elementos necessrios para efectuar este
tipo de processo j devidamente configurados, bem como a
disponibilizao de um backOffice de gesto do mesmo.

44

COMUNIDADE AZUREPT
Windows Azure AppFabric ACS
E que neste caso desejamos utilizar um STS j existente,
que ser o que foi criado no momento em que efectuamos o
pedido de gerao do namespace para Access Control Service no Windows Azure.

Vamos agora efectuar a relao de confiana entre o nosso


WebSite e o Windows Azure AppFabric ACS. Para isso vamos seleccionar a opo Application Integration onde nos
so fornecidos os dados necessrios paraefectuar a dita
relao.

Agora voltemos ao Visual Studio 2010 e vamos associar uma


referncia ao ACS. Para isso vamos adiccionar uma referncia ao STS (Security Token Service).
Vamos para j efectuar sempre Next nos restantes passos,
uma vez que estamos num ambiente de testes e no queremos ter uma grande entropia no mesmo para que possamos
rpidamente ver tudo em funcionamento, mas claramente em
produo no seria esta a melhor opo.
No final recebemos uma notificao muito importante.

Vamos definir que o Application Uri a utilizar ser o uri de


acesso ao nosso WebSite
A partir deste momento j existe uma relao de confiana
entre o WebSite e o ACS. Para finalizar apenas falta registarmos ao nvel do ACS tambm este RP bem como gerar as
regras de converso para as diversas informaes dos IdP
para algo comum e visvel para o WebSite, uma vez que
cada um destes IdP funciona de forma diferente, e contm
informaes diferentes, teremos de transformar num formato
comum para que o nosso WebSite independentemente do
IdP utilizado tenha sempre a noo de quem o utilizador,
email, etc.
Para isso vamos novamente ao portal de gesto do ACS, e
escolhemos a opo Relying Party Applications, onde iremos
adiccionar o nosso WebSite. Para simplificar vamos importar
o ficheiro FederationMetadata.xml que foi gerado no WebSite
no momento da criao da referncia ao STS.

45

COMUNIDADE AZUREPT
Windows Azure AppFabric ACS
A partir deste momento o nosso WebSite est registado no
ACS e tambm a relao de confiana est efectuada. Alm
de tudo isso, as regras de converso dos diversos IdPs utilizados foram efectuadas automticamente.
Agora vamos terminar as configuraes do lado do nosso
WebSite, e para isso iremos retirar do web.config todas as
entradas relativas a authentication, membership, profile e
roleManager, uma vez que tudo isto ser da responsabilidade do ACS a partir deste momento.
Agora lanamos novamente a soluo e tudo funciona, sendo que antes de chegarmos ao nosso WebSite temos o seguinte quadro que nos permite escolher o IdP que queremos
utilizar.

Para finalizar vamos opo Rule Groups e seleccionamos


o grupo que foi criado predefenidamente para o nosso WebSite e seleccionamos o Generate, para que todas as regras
de converso dos diversos IdPs utilizados sejam criadas.

Concluso
Em resumo, todos concordamos que importante que cada
vez existam menos identidades digitais espalhadas pela Internet, e por isso mesmo a Federao de Identidade uma
soluo muito interessante, o problema que nem sempre
simples. Neste caso, o Windows Azure AppFabric Access
Control Service vem ajudar-nos substancialmente na medida
em que simplifica muito o processo tratando de toda a configurao e instalao necessria para este tipo de sistemas,
e com o auxilio da WIF Windows Identity Foundation, torna
muito simples conseguir o resultado esperado.

AUTOR
Escrito por Nuno Godinho. Consultor Independente com 10 anos de Experincia e principal responsabilidade de ajudar os
clientes a identificar, planear, gerir e desenvolver solues e produtos de software. Especialista em Tecnologias Microsoft.
Orador em alguns dos maiores eventos de desenvolvimento da Microsoft Portugal como MSDN, TechDays, DevDays, alm de
eventos internacionais como TechEd Europa, TechEd Online Worldwide, MVP Nation e CloudViews.Org. Microsoft MVP h 4
anos, inicialmente em ASP.NET e a partir do incio deste ano em Windows Azure com blogs em http://bit.ly/ufTstn (Portugus
e Ingls) e http://bit.ly/s6f5ec (Ingls), INETA Country Leader por Portugal, e parte da equipa de gesto de por diversas comunidades Portuguesas como PontoNetPT, XAMLPT e Fundador da AzurePT (Windows Azure em Portugus)."

46

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas

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. Neste artigo, medida que exploramos
o editor de mapas do BizTalk Server, exploramos os seus
principais conceitos enquanto abordamos temas como a
arquitectura deste servidor e alguns dos padres mais usados na traduo de mensagens.

Um adaptador FILE poderia ser por exemplo uma pasta de


rede (\\fileshare.local\Encomendas\) e um filtro (*.edifact) e,
paralelamente poderamos tambm estar a receber encomendas por um Web Service (SOAP/REST/XML).
Quando o servidor recebe uma mensagem num adaptador,
este executa um pipeline. O pipeline simplesmente uma
composio sequencial de componentes que tem como principal objectivo:

Este artigo pretende ser uma nota introdutria e destinada a


quem est a dar os primeiros passos nesta tecnologia.
Podemos definir o BizTalk como um servidor de encaminhamento de mensagens, capaz de tratar, validar, transformar e
controlar inmeros processos, simplificando as necessidades
de adaptao de cada sistema a interligar. Ou seja, um componente de infra-estrutura essencial nas ligaes entre empresas (B2B - Business-to-Business) e cada vez mais, usado
para ligar sistemas, tambm eles, cada vez mais complexos
dentro das organizaes (EAI - Enterprise Application Integration). Para alm dos padres Fire & Forget, o BizTalk
tambm usado para cenrios mais complexos onde o
workflow depende de vrias mensagens que precisam de ser
correlacionadas para orquestrao processos de negcio
(BPM - Business Process Management). Neste artigo vamos
focar no processo de mapeamento e transformao de mensagens apenas.
De maneira simples podemos definir que o BizTalk um
servidor de integrao, projectado para trabalhar com mensagens, ideal para ser usado principalmente para integrao
de aplicaes corporativas (EAI), integrao de sistemas
entre parceiros de negcio (B2B) e para gesto de processos de negcio (BPM).

Converter as mensagens que podem estar em diferentes formatos (arquivos de texto (Flat File), arquivos
compactados - ZIP), para o formato que o BizTalk usa
internamente para processar as mensagens: XML
(Extensible Markup Language).

Validar as mensagens recebidas. No seu normal


funcionamento, o BizTalk s processa mensagens
reconhecidas internamente, para isso utiliza esquemas XML (XML Schema) que permitem descrever a
estrutura (record, elemento, atributo, nome, tipo de
dado) e define as regras de validao (se ou no
obrigatrio, numero de vezes que o elemento pode
aparecer, hierarquia) das mensagens XML.

De seguida as mensagens so despejadas internamente na


MessageBox (base de dados) onde so os diferentes subscritores (1 ou mais interessados nessa mensagem) a vo
receber. Estes subscritores podem ser outras portas de sada (Routing) ou entram em orquestraes lanando novos
processos, ou acordando os que estavam espera (via campos correlacionveis).

Arquitectura

O que so os mapas de BizTalk e onde podem ser utilizados?

As mensagens entram no BizTalk atravs de uma porta lgica (portas de recepo ou Recieve Port) que so compostas
por 1 ou varias portas fsicas (locais de recepo ou Recieve
Locations). Cada local de recepo possui uma configurao
especfica para um adaptador, como podemos verificar no
exemplo seguinte:

Os mapas de BizTalk so representaes grficas de documentos XSLT (Extensible Stylesheet Language Transformation) que permitem efectuar, de forma simples e visual, transformaes s mensagens XML.

47

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


Podemos enumerar os standards usandos no BizTalk Mapper:

XML (Extensible Markup Language) contm os dados das mensagens;

XML Schema (XSD - XML Schema Definition) define o formato das mensagens;

Nota: Neste artigo vamos falar apenas nas transformaes


de semntica, ou seja, nos mapas de BizTalk.

E XSLT (Extensible Stylesheet Language Transformation) define as regras de tranformao das mensagens;

Onde podem ser utilizados os mapas?


Conforme a imagem a baixo demonstra, os mapas de BizTalk podem ser utilizados entrada, nas orquestraes, ou
nas portas de sada.

De realar que todos eles so uma recomendao da W3C


(Worldwide Web Consortium) - consrcio internacional, que
agrega empresas, rgos governamentais e organizaes
independentes, e que visa desenvolver standards para a
criao e a interpretao de contedos para a Web.
Podemos caracterizar dois tipos de transformaes existentes:

Transformaes de Sintaxe: este tipo de transformaes ocorrem nas pipelines de recepo ou envio
e tm como objectivo transformar um documento noutra representao, por exemplo de CSV para XML.
Aqui o documento mantem os mesmos dados
(semntica), mas muda a sintaxe com que representado. Ou seja traduzimos o documento mas, normalmente, no o modificamos em termos de estrutura. Por norma este tipo de transformao bidireccional, uma vez que continuamos a ter o mesmo contedo semntico. Podemos aplicar a mesma lgica de
transformao e voltar a obter um documento no seu
formato original.
A grande diferena entre utilizar nas portas ou em orquestraes, que a utilizao na ltima pode ter mltiplos inputs
de mensagens (transformaes de vrios documentos para
um documento final transformaes N1) e nas portas
apenas permite uma nica mensagem de input
(transformaes 11).

Introduo ao editor de mapas - BizTalk Mapper Designer

Transformaes de Semntica: este tipo de transformaes ocorre por norma apenas nos mapas de
BizTalk. Aqui o documento mantem a mesma sintaxe
com que representado (XML), mas muda a sua semntica. Tipicamente so operaes One-way, uma
vez que quando extramos e agregamos partes de
informao de um documento e compomos um outro
documento diferente, podendo perde detalhes importantes para a sua reconstruo.

O editor de mapas, BizTalk Mapper Designer, possibilita


efectuar transformaes de mensagens XML complexas de
forma visual e extremamente simples, expressas em associaes grficas de ligaes (links) que definem as relaes
entre os vrios elementos das mensagens.
Estas relaes entre elementos so internamente implementadas como transformaes XSLT (Extensible Stylesheet
Language Transformation) que o standard recomendado
pela Worldwide Web Consortium (W3C) para efectuar transformaes entre esquemas XML

48

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas

Janela de Propriedades (properties window): nesta


janela podemos ver e modificar as propriedades de
um objecto seleccionado na grelha ou nos esquemas,
normalmente encontra-se disponvel direita do esquema de destino ponto 6.

Esta ferramenta encontra-se integrada no Visual Studio e


composta essencialmente por 3 mdulos:

Esquema de Origem (source schema): trata-se da


estrutura de dados da mensagem de origem e encontra-se na parte esquerda da janela principal ponto
1;

Esquema de Destino (destination schema): trata-se


da estrutura de dados da mensagem final aps ser
efectuada a transformao e encontra-se na parte
direita da janela principal ponto 2;

Ligaes e Functoids
As transformaes num mapa podem ser definidas na forma
de relaes simples, como copiar um nome ou um endereo
de um documento para outro. Podemos expressar uma cpia
directa dos dados usando uma ligao, que representada
no BizTalk Mapper Designer como uma linha que liga os
elementos da origem para os elementos de destino.

Grelha de mapeamento (mapper grid): encontra-se


no meio da janela principal, entre as duas estruturas
de dados (origem e destino) - ponto 3;
Esta zona desempenha um papel crtico na definio
de mapas, contendo as ligaes e as functoids que
iram controlar a forma como os dados de origem da
mensagem so transformados, de acordo com o esquema de destino, para a mensagem final.
Cada mapa pode ter at 20 pginas (mapper grids),
acedveis atravs dos separadores (tabs) que se encontram no fundo da grelha de mapeamento ponto
4.

Para alm destes 3 mdulos, existem 2 janelas de extrema


importncia para o programador:

O utilizador tambm pode especificar transformaes mais


complexas usando functoids. Podemos considerar uma functoid como funes pr-definidas que podemos utilizar para
efectuar mapeamentos ou transformaes complexas.

Janela de Ferramentas (toolbox window): normalmente encontra-se no lado esquerdo do esquema de


origem ponto 5; Providencia acesso a todas as
functoids que podemos utilizar nos mapas.

Tipicamente num mapa, os dados so copiados da origem


para o destino, arrastando ligaes entre os elementos dos
dois esquemas. As functoids ficam no meio destas operaes e aplicam uma operao sobre os dados de entrada, de
modo a transform-los s exigncias do destino. BizTalk
Mapper Designer representa uma functoid como uma caixa
no meio da ligao ou ligaes entre os elementos de transformao.

49

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


No entanto, a plataforma permite que sejam criadas novas
functoids pelos programadores assim como organizar e criar
novas categorias.

BizTalk fornece um extenso conjunto de functoids que podem ser usadas nos mapas para executar uma variedade de
operaes nos dados que esto a ser transformados a partir
de uma mensagem de origem para uma mensagem de destino.

Projecto de referncia para criao e instalao de novas


functoids: BizTalk Mapper Extensions UtilityPack.

Por defeito, as functoids esto organizadas em 9 categorias


com base nas suas funes:

Advanced Functoids: Usadas para criar vrios tipos


de manipulao de dados, como a implementao de
script personalizado (C#, Visual Basic .NET, XSLT),
mapear valores ou gerir e extrair dados de elementos
recursivos.

Conversion Functoids: Funes tpicas de converso de valores como: converso de caracteres para
ASCII ou de nmeros de uma base para outra
(Hexadecimal, decimal).

Cumulative Functoids: Usadas para realizar vrios


tipos de operaes de acumulao de valores que
ocorrem vrias vezes numa mensagem.

Database Functoids: Utilizadas principalmente para


pesquisar dados existentes em base de dados.

Date and Time Functoids: Trata-se de um conjunto


de operaes sobre datas como: adicionar data, hora,
data e hora, ou adicionar dias a uma data especfica.

Logical Functoids: Estas funes permitem controlar


de forma condicional o mapeamento dos valores de
origem ou o comportamento de outras functoids, determinando assim se os dados de sada so criados
ou no.

Mathematical Functoids: Utilize as functoids matemticas para executar clculos numricos especficos, como adio, multiplicao ou diviso.

Scientific Functoids: Usadas para realizar clculos


cientficos especficos, como funes logartmicas,
exponenciais ou trigonomtricas.

String Functoids: Usadas para manipular dados


alfanumricos (texto) atravs de funes bem conhecidas tais como: calcular comprimento, concatenao
de elementos, extrair bloco de texto, converter para
maisculas ou minsculas.

Grelha de Mapeamento
A grelha de mapeamento desempenha um papel crtico na
definio de mapas, ela ir conter as ligaes e functoids
que iro controlar a forma como os dados de origem de uma
mensagem so transformados numa mensagem de destino
de acordo com o seu esquema.
A grelha poder ter mltiplas camadas, num mximo de 20,
chamadas de pginas. Particionar os mapas em diferentes
pginas, alm de ser uma boa prtica, pode-se tornar extremamente til por forma a organizar-nos e desta forma tornlos mais legveis. Apesar de em pequenos mapas, uma pgina ser suficiente, quando lidamos com esquemas complexos
como EDI, infestar uma pgina com inmeras ligaes e
functoids torna-os ilegveis, chegando ao ponto de no conseguirmos distinguir um elemento do outro.
Podemos definir as pginas como contentores de ligaes e
functoids, que servem apenas para organizar os mapas, isto
porque ao nvel do compilador no tm qualquer impacto
uma vez que so invisveis.
Operaes possveis nas pginas
Por defeito os mapas so criados com apenas uma pgina,
com o nome Page 1, apesar das operao mais frequentes
serem a de criao e renomeao, so 4 operaes as operaes que podemos efectuar sobre as pginas:

50

Adicionar nova pgina: esta a funcionalidade mais


comum, adicionar novas pginas permite-nos organizar diferentes zonas do mapa em contentores.

Pressionar boto direito sofre o separador da pgina,


e seleccionar a opo Add Page

Renomear uma pgina existente: muita das vezes


esquecida, esta opo permite-nos renomear os separadores de forma a tornar as diferentes pginas
mais legveis visualmente.

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


Para isso apenas de necessitamos de efectuar drag-anddrop do elemento de origem para o esquema destino. Na
imagem seguinte est exemplificado o elemento Morada.

Pressionar boto direito sofre o separador da pgina,


e seleccionar a opo Rename Page

Eliminar uma pgina existente: eliminao de pginas


desnecessrias ou obsoletas.

Pressionar boto direito sofre o separador da pgina,


e seleccionar a opo Delete Page

Concatenao de valores

Reorganizar as pginas existentes: muita das vezes


temos a necessidade de organizar a disposio das
pginas numa sequncia diferente, para isso basta:

Concatenar diferentes valores da origem para um determinado elemento no esquema de destino outra das operaes
quotidianas em transformaes, para isso apenas necessitamos de:

Pressionar boto direito sofre o separador da pgina,


e seleccionar a opo Reorder Pages

Abrir a janela de ferramentas e arrastar para a grelha a functoid String Concatenate;


Conforme foi explicado no ponto anterior, arrastar uma ligao entre os elementos pretendidos e a functoid String Concatenate, por exemplo os elementos Nome e Apelido;
Arrastar a ligao da functoid String Concatenate para o
elemento no esquema de destino, neste caso o
NomeCompleto;

Transformaes - Funcionalidades bsicas dos mapas


Nota: a ordem de entrada dos elementos na functoid importante, uma vez que a concatenao efectuada pela
ordem de entrada dos elementos (iremos aprofundar este
tema mais frente).

Quando estamos a efectuar uma transformao de mensagens so 5 as funcionalidades bsicas que normalmente nos
surgem:

Mapeamento simples de um determinado valor (cpia


directa)

Concatenao de valores

Seleces condicionadas

Scripts customizados

Adicionar novos dados

Seleces condicionadas
Muitas das vezes no queremos simplesmente mover valores da origem para o destino, s vezes necessitamos de
gerar a sada dos dados de acordo com certas condies.
Podemos efectuar estas condies de muitas formas distintas atravs de functoids ou scripts customizados, aqui fica
um exemplo: Testar se o valor na origem uma string vlida,
se sim mape-la para o esquema de origem, para isso necessitamos:

Mapeamento simples de um determinado valor (cpia


directa)

Esta a operao mais bsica de todas as operaes, onde


pretendemos mover um valor da origem para um determinado destino, sem efectuarmos qualquer tipo de operao sobre os valores (cpia directa).

Arrastar a functoid Logical String para a grelha, esta


functoid permite validar se um determinado valor
uma string vlida, semelhante a funo C#
String.IsNullOrEmpty

Retorna False se a string for vazia ou nula;

Retorna True caso seja uma string vlida;

51

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas

Arrastar uma ligao do elemento pretendido da origem para a functoid Logical String, neste caso o
elemento CodigoPostal;

Arrastar a functoid Value Mapping para a grelha,


esta functoid providencia, atravs de um valor booleano, controlar a sada dos valores da origem para o
destino, ou seja, recebe dois valores:

ajudarem de forma fcil a resolver o problema, eu


utilizo as functoids existentes, se a utilizao das
mesmas, se torna extremamente complexa, ento
opto por utilizar scripts customizados.

O primeiro ter de ser um booleano (True/


False);

O segundo ser o valor a ser mapeado;

Caso o primeiro seja verdadeiro, o valor


mapeado para o esquema de destino, caso
seja falso, o mesmo no mapeado.

Esto ao dispor do programador 6 tipos de scripts:

External Assembly: Permite-nos associar e invocar


esta functoid com uma funo existente numa assembly existente na Global Assembly Cache (GAC).

Inline C#: Esta opo permite-nos associar e invocar


cdigo C# directamente na functoid (Inline Script Buffer property).

Inline JScript .NET: Igual anterior, mas com uso de


cdigo JScript .NET

Arrastar uma ligao da functoid Logical String para


a functoid Value Mapping;

Inline Visual Basic .NET: Igual s anteriores, mas com


uso de cdigo Visual Basic .NET

Arrastar uma ligao do elemento CodigoPostal do


esquema de origem para a functoid Value Mapping;

Inline XSLT: Esta opo permite-nos associar e invocar scripts XSLT directamente na functoid (Inline
Script Buffer property).

Arrastar uma ligao da functoid Value Mapping


para o elemento CodigoPostal do esquema de destino;

Inline XSLT Call Template: idntico anterior, no entanto esta permite-nos invocar templates XSLT directamente da functoid.

Neste exemplo, queremos transformar a data de nascimento


na idade da pessoa, neste cenrio devemos:

Scripts customizados
Scripts customizados so utilizados normalmente em transformaes mais complexas ou por forma a facilitar algumas
condies. Basicamente existem dois cenrios para utilizarmos esta functoid:

Quando nenhuma das functoids existentes permite


efectuar o que pretendemos, o exemplo que vamos
ver converter uma data de nascimento em idade.

Ou quando a utilizao das functoids existentes tornam-se extremamente complexas para resolver um
problema do mapeamento.

Arrastar a functoid Scripting para a grelha;

Arrastar uma ligao do elemento DataNascimento


do esquema de origem para a functoid Scripting;

Arrastar uma ligao da functoid Scripting para o


elemento Idade do esquema de destino;

O mapeamento encontra-se efectuado, faltando-nos apenas


configurar a script customizado. Para este cenrio vamos
utilizar um script do tipo Inline C#, e para isso devemos:

Existe uma regra que normalmente usa-mos para


definir se devemos utilizar functoids ou utilizar scripts
customizados que nos diz: se para um determinado
mapeamento utilizarmos mais de 6 functoids, ento
deveremos utilizar scripts customizados.
Eu gosto de utilizar esta regra de forma ponderada e
no letra, ou seja, se as functoids existentes me

52

Efectuar duplo click na functoid Scripting e seleccionar o separador Script Functoid Configuration;

Na opo Select script type, seleccionar da lista a


opo Inline C#;

Na opo Inline script colocar o seguinte script:

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


Como organizar os mapas BizTalk
Os mapas podem tornar-se extremamente complexos, dificultando assim a sua leitura e manuteno.

O editor de mapas do BizTalk providencia duas importantes


funcionalidades que nos permitem minimizar este problema:
Adicionar novos dados
Em muitos cenrios temos a necessidade de adicionar novos
dados mensagem final que no existem na mensagem de
origem. normal encontrarem situaes em que, com base
em alguns dados existentes na mensagem de origem, necessitaremos de consultar um sistema externo, por exemplo
base de dados, por forma a adquirimos mais informaes
para preencher os dados necessrios na mensagem final.

Pginas

Etiquetas para as ligaes

Pginas
As pginas permitindo organizar os mapas, especialmente
os mais complexos, em subdivises lgicas de mapeamentos. Esta funcionalidade j foi descrita anteriormente.

Um exemplo mais bsico e simples adicionar mensagem


final um carimbo de data/hora actual em que a mensagem
processada, para isso devemos:

Arrastar a functoid Date and Time para a grelha;

Arrastar uma ligao da functoid Date and Time


para o elemento no esquema de destino
DataHoraProcessamento;

Etiquetas para as ligaes


Nas verses anteriores do produto, por defeito, era apresentado a query XPATH se uma ligao fosse estabelecida a
uma functoid:

Nota: Como podem verificar, esta functoid no requer nenhum dado de entrada, retornando a data e hora actual do
sistema.

/*[local-name()='PessoaOrigem' and namespace-uri()


='http://ComoFuncinamOsMapas.PessoaOrigem']/*
[local-name()='Nome' and namespace-uri()='']

Ou o nome da functoid caso a ligao proviesse de outra


functoid, o que poder dificultar a leitura dos mapas.
Nesta verso do produto este comportamento foi ligeiramente melhorado, sendo que actualmente o valor defeito o
53

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


Na fase de desenvolvimento, temos ao dispor 3 funcionalidades, includas no Visual Studio, que nos permite testar e
validar os mapas:

nome do elemento do esquema de origem de onde provem a ligao:

Testar mapas

Validar mapas

Depurar mapas

Ou o nome da functoid anterior:

Estas funcionalidades esto ao dispor dos programadores de


uma forma fcil e directamente da ferramenta de desenvolvimento, Visual Studio, no necessitando assim de executar
(build) e publicar (deploy) os mapas ou at mesmo criar e
configurar portas.

No entanto, o editor de mapas permite-nos colocar etiquetas


nas ligaes, originando a que a mesma substitua a query
XPATH (nas verses antigas) ou o nome do elemento do
esquema de origem, para isso devemos:

Seleccionar a ligao e com o boto direito do rato


seleccionar a opo Properties;

Preencher a propriedade Label com a etiqueta pretendida.

Testar mapas (Test Map)


Deveremos testar o nosso mapa de uma forma continua, no
apenas no final do desenvolvimento, mas sempre que necessrio ou quando um bloco de transformao importante seja
concludo.

Para isso apenas necessitamos de:

Abrir a janela do Solution Explorer

Seleccionar o mapa em causa

Premir o boto direito do rato sobre o mapa e seleccionar a opo Test Map

Por defeito uma instncia do esquema de entrada gerada


automaticamente com valores, tambm eles por omisso, de
acordo com o seu tipo e testada no mapa seleccionado. No
final apresentado o resultado gerado ou os erros ocorridos
na execuo do mesmo na janela de sada (Output).

Normalmente esta funcionalidade esquecida pelos programadores.


Apesar de parecer uma funcionalidade banal e sem impacto
significativo, a meu ver, trata-se de uma funcionalidade importante a longo prazo. Enquanto as ideias esto frescas
sabemos o que estamos a fazer, mas se for necessrio intervir passado algum tempo e rever os mapeamentos, esta
funcionalidade ir tornar a nossa tarefa mais facilitada.
Operaes possveis de efectuar sobre os mapas

54

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas


rado pelo compilador, fornecendo-nos informaes

No entanto, muita das vezes, este cenrio no o ideal, e o


que pretendemos testar um documento existente com um
mapa. Para isso apenas necessitamos de configurar as propriedades do mapa antes de corremos o teste:

adicionais de como os mapas funcionam assim como mais


uma outra opo de depurao (debug).
Para executar esta opo basta:

Efectuar o procedimento anterior, mas em vez de


seleccionar a opo Test Map, iremos seleccionar a
opo Properties;
Na janela de propriedades configurar a propriedade
TestMap Input Instance com o caminho para o ficheiro de entrada.

Aceder ao Solution Explorer;

Boto direito do rato sobre o mapa (arquivo *. btm)

E seleccione a opo "Validar Map".

Uma ligao para o XSLT gerado ser apresentada na janela de sada (Output).

Depurar mapas (Debug Map)


Esta opo permite-nos efectuar a depurao (debug) de
mapas e assim identificar e corrigir problemas complexos de
mapeamento na fase de desenvolvimento.

Nesta janela tambm podemos configurar diversas propriedades como: o formato de entrada e sada dos documentos,
assim como o caminho final do documento de sada, mas
mais importante podemos configurar se pretendemos validar
os formatos de entrada e sada com os respectivos esquemas.

Esta funcionalidade faz uso de algumas propriedades dos


mapas, tais como TestMap Input Instance e TestMap Output Instance. Portanto, antes de depurar o mapa, ser necessrio configurar as suas propriedades dos mapas, com
especial foco nas duas anteriores.

Esta segunda opo: validar formato do ficheiro de sada


(Validate Test Map Output), extremamente importante para
os testes intermdios. Ao configurar esta opo como False
permite-nos testar um mapa incompleto sem ser apresentados erros de testes ou falta de dados obrigatrios, muito
deles associados a zonas por mapear, permitindo-nos assim
apenas validar o trabalho efectuado at data.

Para executar esta opo, teremos de:

Nota: Esta opo dever ser configurada como True para


os testes finais.
Validar mapas (Validate Map)

Aceder ao Solution Explorer

Boto direito do rato sobre o mapa (arquivo *. btm)

E seleccione a opo "Debug Map".

Pressione a tecla F10 ou F11 para depurar o cdigo


XSL.

Esta opo permite-nos validar a estrutura do mapa. Podemos desta forma inspeccionar e analisar o cdigo XSLT ge-

55

Quando voc pressiona F11 numa chamada a


uma functoid, o Visual Studio ir entrar para o
cdigo C# associado functoid.

COMUNIDADE NETPONTO
http://netponto.org

Biztalk Server - Princpios Bsicos dos Mapas

Podemos definir o
BizTalk como um servidor de encaminhamento de mensagens,
capaz de tratar, validar, transformar e
controlar inmeros
processos

Concluso
Devido ao inmero nmero de sistemas e aplicao distintas
existentes nas organizaes, imperativo usar boas ferramentas e tcnicas para produzir solues que funcionem
durante muitos anos de uma forma controlada e fcil de
manter. Ao mesmo tempo novos processos so adicionados
e os existentes vo sofrendo pequenas melhorias, tudo sem
perder o rasto ao que est a acontecer em produtivo.
O BizTalk ajuda-nos a resolver muitos destes problemas,
dispondo de inmeras funcionalidades out of the box com o
produto. Neste artigo acho que consegui explicar de uma
forma intuitiva os principais conceitos bsicos dos mapas de
BizTalk, medida que exploramos o seu editor.

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 Forums), contribuidor no MSDN Code Gallery e autor do Blog: http://bit.ly/oFLwB4- Twitter: @sandro_asp Membro da comunidade BizTalk Brasil: http://bit.ly/9NI7ie

56

Veja tambm as edies anteriores da


Revista PROGRAMAR
29 Edio - Junho 2011

27 Edio - Fevereiro 2011

26 Edio - Dezembro 2010

28 Edio - Abril 2011

30 Edio - Agosto 2011

31 Edio - Outubro 2011

e muito mais em
www.revista-programar.info

Você também pode gostar