Revista programar 32ª Edição - Dezembro 2011

  • Published on
    06-Apr-2016

  • View
    216

  • Download
    4

DESCRIPTION

A Revista PROGRAMAR um projeto iniciado e desenvolvido por membros da comunidade Portugal-a-Programar, com o objectivo de suprir a falta de uma revista de qualidade sobre programao e de promover a criao de contedos relacionados com programao, em portugus. Site: http://netponto.org/revista-programar

Transcript

  • EDITORIAL

    2

    EQUIPA PROGRAMAR 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

    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.

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

    programar.org

    Website http://www.revista-programar.info

    ISSN 1 647-071 0

  • NDICE

    3

    TEMA DE CAPA

    iOS, Cocoa Touch & MVC

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

    A PROGRAMAR

    COLUNAS

    COMUNIDADES

    EVENTOS

    03 Dez 2011 - 4 Evento da Comunidade Azure PT

    16 a 18 Dez 2011 - Windows Phone 7 App Code Camp (Palmela)

    17 Dez 2011 - 25 Reunio Presencial da Comunidade NetPonto em Lisboa

    27 Fev a 1 Mar 2012 - XIX SINFO - Semana Informtica IST

    17 Maro 2012 - SQL Pass Saturday Portugal #115

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

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

    meros aleatrios. Augusto Manzano

    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

    SQL Azure Fedarations

    Introduo s SQL Azure Federations. Victor Tomz

    Enigmas de C#: Arrays

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

    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

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

    tor sobre este tema. Fernando Martins

    7

    15

    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.

    NetPonto - BizTalk Server - Princpios Bsicos dos Mapas

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

    18

    24

    29

    31

    40

    47

    42

  • NOTICIAS

    4

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

    Os quatro grandes vendedores de software

    - Microsoft, Oracle, IBM e SAP tm mo-

    tivos 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 Gart-ner com os seus clientes.

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

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

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

    pressou alguma surpresa por tantos clientes continuarem a

    trabalhar com a Oracle apesar de relatarem que a Oracle o

    vendedor com quem mais difcil lidar.

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

    toma-se a si prpria como um lder rgido, mas o seu verda-

    deiro negcio vender servios de consultoria. Parra prospe-

    rar, os gestores de conta da IBM tentam obter controlo sobre

    a estratgia de TI de uma empresa de forma a poderem conti-

    nuar a empurrar novos produtos. Gaughan recomenda que se

    tome uma aproximao colaborativa ou de parceria.

    A SAP confunde os clientes com o preo. Muitos dos cli-

    entes da SAP pedem a Gartner ajuda para descobrir os pre-

    os e licenciamento da SAP, uma vez que a SAP tem termos

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

    da, 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.

    Fonte: Business Insider, 19 de Novembro de 2011

    Traduo: Sara Santos

    Uma aplicao que usa peas Lego com o objectivo de permi-

    tir que crianas consigam fazer programao informtica ga-

    nhou o primeiro prmio da edio deste ano do Sapo Code-

    bits.

    O Codebits, que comeou na quinta-feira e terminou este s-

    bado, reuniu cerca de 800 participantes, que se dividiram em

    equipas para o habitual concurso de desenvolvimento de pro-

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

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

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

    quncia novamente seguida.

    Programao com Lego Vence Quin-ta Edio de Codebits

  • NOTICIAS

    5

    O significado atribudo s sequncias de peas depende da-

    quilo para que a aplicao que as fotografa tiver sido concebi-

    da uma aplicao pode interpretar trs peas vermelhas

    como uma instruo para emitir um som e outra como uma

    instruo para mostrar um nmero.

    Com este conceito, as peas Lego podem ser usadas para

    criar imagens animadas, fazer msica, construir uma calcula-

    dora ou, teoricamente, para qualquer tipo de efeito que se

    consiga produzir com uma linguagem de programao.

    Este processo implica que as crianas ou algum por elas

    memorize o que significa cada sequncia de peas. As crian-

    as 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 tecno-

    logia, ainda necessria a killer app a expresso tipica-

    mente usada para designar um uso de uma tecnologia que

    promove significativamente a sua adopo e, eventualmente,

    a transforma num sucesso comercial.

    No ltimo dia do Codebits, que decorreu no Pavilho Atlnti-

    co, 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 pbli-

    co, que podia votar nos projectos no final de cada apresenta-

    o.

    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), referindo-

    se ao facto de as ideias nascidas no Codebits poderem ser

    integradas no Sapo ou desenvolvidas em parceria com a em-

    presa. Vinte destes projectos sero contactados para traba-

    lharem connosco, adiantou.

    As 25 Piores Palavras-passe do Ano

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

    teriormente divulgadas online por hackers.

    Muitos dos utilizadores usam sequncias numricas e alfab-

    ticas 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 pala-

    vras-passe seguras e fortes, muitas continuam a escolh-las

    fracas, fceis de adivinhar, colocando-se em risco de fraude e

    de roubo de identidade.

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

    tes servios que consulta online.

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

    que, em mdia, cada pessoa utiliza 25 palavras-passe dife-

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

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

    sword e evite usar palavras verdadeiras.

    Finalmente, no use nenhuma destas 25 piores palavras-

    passe 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

    7

    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, permitin-

    do ao programador escolher a melhor soluo para o seu

    problema, com os recursos que dispe.

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

    go.

    Cocoa Touch uma camada de alto nvel do iOS, composta por um con-

    junto de frameworks que disponibilizam ferramentas que

    permitem ao leitor utilizar todo o potencial que a plataforma

    iOS tem para oferecer, ao mesmo tempo, permite desenvol-

    ver aplicaes que transmitem ao utilizador uma sensao

    familiar durante a sua utilizao graas utilizao transver-

    sal nas vrias aplicaes do Sistema Operativo.

    Figura 2 A arquitectura do iOS

    iOS, Cocoa Touch & MVC Entre as frameworks do Cocoa Touch de maior relevo esto

    as seguintes:

    Core Animation

    Core Location

    Core Audio

    Core Data

    UIKit

    A mais importante das frameworks que compem o Cocoa

    Touch sem dvida a UIKit.

    Esta framework, baseada em Objective-C, disponibiliza uma

    vasta quantidade de funcionalidades e ferramentas que per-

    mitem ao leitor desenvolver UI, gerir eventos (toque, gestos),

    aceder ao acelermetro, cmara fotogrfica, bateria, sensor

    de proximidade e biblioteca de imagens.

    Figura 3 Alguns dos componentes de UI do UIKit

    O leitor vai, com toda a certeza, reconhecer alguns dos com-

    ponentes da figura 3 disponibilizados pela UIKit Framework.

    A documentao acessvel e objectiva, permite desenvol-

    ver aplicaes para iOS num curto espao de tempo, o de-

    sign e a experincia de utilizao proporcionada pelos com-

    ponentes de esta framework so transversais a todo o Siste-

    ma 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 Ap-

    plication.

    Controller

    View Model

  • TEMA DA CAPA

    8

    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 5 Primeira execuo do projecto

    O template escolhido fornece um conjunto de funcionalida-

    des bsicas para uma aplicao que pretende ter um interfa-

    ce 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 per-

    mita visualizar o detalhe de um feed.

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

    a ao Controller o tipo de objectos a serem manipulados e

    enviados para a View.

    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, confor-

    me as figuras abaixo apresentam.

    Figura 7 Interface da classe RssFeed

    Figura 8 Implementao da classe RssFeed

    Agora que j est definido o modelo, vamos criar um reposi-

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

    #import @interface RssFeed : NSObject {} @property (nonatomic, retain) NSString *FeedTitulo; @property (nonatomic, retain) NSString *FeedSumario; @property (nonatomic, retain) NSString *FeedUrl; @end

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

    iOS, Cocoa Touch & MVC

  • TEMA DA CAPA

    9

    Figura 9 Interface da classe Repository

    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.

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

    tes do Repository.

    Figura 11 Interface do Controller RootViewController

    Agora que existe onde guardar os dados recebidos, neces-

    srio fornece-los ao controlo UITableViewController. Para

    isso, preciso alterar o mtodo viewDidLoad na implementa-

    o do Controller (RootViewContoller.m).

    Figura 12 Alterao do mtodo viewDidLoad no Controller Ro-

    otViewController

    O Controller alimenta o controlo UITableView, notificado

    dos seus eventos porque uma sub-classe de UITa-

    bleViewController, o que o torna um Controller especializado

    em lidar com Views que contm controlos do tipo UITa-

    bleView.

    A grande vantagem na utilizao de este Controller, que

    contm um template que ajuda a lidar com o controlo UITa-

    bleView. Um dos mtodos includo nesse template o num-

    berOfRowsInSection, 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.

    Figura 13 Notificar o controlo do nmero de elementos que vai

    conter

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

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

  • TEMA DA CAPA

    10

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

    bleView.

    O leitor pode aproveitar novamente a vantagem de o Control-

    ler ser uma sub-classe de UITableViewController, porque no

    template j existe um mtodo definido para fornecer os da-

    dos ao UITableView, apenas necessrio alterar um pouco

    o cdigo existente.

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

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

    Figura 15 Libertao da memria alocada

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

    isso basta executar o projecto.

    Figura 17 - Primeira execuo do projecto

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

    bilizar uma View para o detalhe do feed.

    Para isso vamos adicionar um novo Controller, o De-

    tailViewController, mas desta vez o novo Controller uma

    sub-classe de UIViewController.

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

    feed

    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.

    - (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]; }

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

    } return cell; }

    - (void)dealloc { [super dealloc]; [feeds release]; }

    iOS, Cocoa Touch & MVC

  • TEMA DA CAPA

    11

    Para apresentar o detalhe da feed, proposto criar um UILa-

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

    Figura 19 View de detalhe de feeds

    Agora necessrio definir o Controller da View acima apre-

    sentada, e para isso basta colocar na interface do De-

    tailViewController a definio das propriedades que com-

    pem a View bem como definir um novo construtor para o

    Controller, para suportar receber um objecto do tipo RssFeed

    quando instanciado.

    Figura 20 Definio do Interface do Controller DetailViewController

    No ficheiro de implementao do DetailViewController ne-

    cessrio implementar o novo construtor, a gesto de mem-

    ria dos objectos criados e gerir o evento TouchDown do bo-

    to FeedOnSafari.

    Figura 21 Implementao do Controller DetailViewController 7

    Para terminar apenas falta referenciar os componentes defi-

    nidos no Controller com os componentes definidos na View.

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

    nente definido na View e qual a aco que o Controller ne-

    cessita de executar quando um desses componentes dispara

    um evento.

    Neste caso, o boto feedOnSafari, quando a View detecta

    um toque, pede ao Controller para executar o evento linkBut-

    tonClick, que por sua vez vai lanar o Safari cmo o URL da

    feed.

    #import "RssFeed.h" #import @interface DetailViewController : UIViewController

    @property (retain, nonatomic) IBOutlet UILabel *FeedTitle; @property (retain, nonatomic) IBOutlet UIButton *FeedOnSafari;@property (retain, nonatomic) IBOutlet UITextView *FeedSummary; @property (retain, nonatomic) RssFeed *feedDetail; - (id)initWithFeed:(RssFeed *)feed; @end

    - (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]]; } - (void)dealloc { [super dealloc]; [feedDetail release]; } @end

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

    iOS, Cocoa Touch & MVC

  • TEMA DA CAPA

    12

    AUTOR

    Escrito por Bruno Pires

    Exerce funes de consultor de IT na Novabase desde 2008, com experincia de maior relevo nas reas da banca e televi-

    so digital, onde ganhou competncias nas mais vrias tecnologias. Membro da Comunidade NetPonto (http://netponto.org) e

    autor do blog http://blog.blastersystems.com - Twitter: @brunoacpires

    Figura 22 Outlets referenciadas no Organizer da View

    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.

    tambm necessrio alterar o mtodo cellForRowAtIndex-

    Path 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 didSe-

    lectRowAtIndexPath para este invocar ao navigationControl-

    ler a navegao para um novo ecr.

    Figura 23 Alterao necessria no mtodo j definido na figura 14

    Figura 24 Mtodo a alterar para existir navegar para o detalhe da

    feed selecionada

    Figura 25 Comportamento final da aplicao

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

    blastersystems.com/ContentDownload/PAPTBC.zip

    - (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; }

    (void)tableView:(UITableView *)tableView

    didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    {

    DetailViewController *details = [[DetailViewController alloc] initWithFeed:

    (RssFeed*) [feeds objectAtIndex:indexPath.row]]; [self.navigationController

    pushViewController:details animated:YES];

    [details release];

    }

    iOS, Cocoa Touch & MVC

  • 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

    15

    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

    O mtodo de gerao de nmeros pseudo-aleatrios produto

    do meio indicado em Banks et al. (2009), sendo um algo-

    ritmo 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 dgi-

    tos e sobre estes valores traar a aco do algoritmo.

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

    ra 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 acrescen-

    tar 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 produ-

    to. 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, consi-

    dere os como sementes os valores 32534 e 58461

    GNA - GERAO DE NMEROS ALEATRIOS (Parte 2)

    Observe que aps aplicao do mtodo so obtidos os valo-

    res 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).

    Iterao Valor

    Multiplicado

    Produto do

    Meio

    0 32534

    58461 01901970174

    1 58461

    01970 00115168170

    2 01970

    15168 00029880960

    3 15168

    29880 00453219840

    4 29880

    53219 01590183720

    5 53219

    90183 04799449077

    6 90183

    99449 08968609167

    7 99449

    68609 06823096441

    8 68609

    23096 01584593464

    9 23096

    84593 01953759928

    SE (td < 11) ENTO T = 11 td ZEROS = 0 PARA I = 1, T, 1 ZEROS = ZEROS + 0 FIM_PARA p = ZEROS + p FIM_SE

  • A PROGRAMAR

    16

    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.

    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.

    N1 = passa a ser o valor de N2.

    N2 = passa a ser o valor de MP.

    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.

    BIBLIOGRAFIA

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

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

    Education. 2010.

    AUTOR

    Escrito por Augusto Manzano

    Natural da Cidade de So Paulo, tem experincia em ensino e desenvolvimento de programao de software desde 1 986.

    professor da rede federal de ensino no Brasil, no Instituto Federal de Educao, Cincia e Tecnologia. tambm autor, pos-

    suindo na sua carreira vrias obras publicadas na rea da computao.

    GNA - GERAO DE NMEROS ALEATRIOS (Parte 2)

  • A PROGRAMAR

    18

    Introduo

    Na edio nmero 30 da revista Portugal a Programar fal-

    mos 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 fun-

    cionalidade 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 implemen-

    tar certas funcionalidades o mais certo usarmos um dele-

    gate. Ou ento implementar na prpria classe.

    Sendo assim, muito provavelmente, tirando os atributos da

    framework como o Serializable ou o WebMethod dificilmente

    iremos usar outros.

    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.

    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.

    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.

    Naturalmente temos de comear por criar o nosso atributo:

    Automatizao de tarefas usando atributos

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

    classe que no artigo anterior. Em vez de herdarmos de Attri-

    bute vamos herdar de ContextAttribute. Isto indica fra-

    mework 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 GetPro-

    pertiesForNewContext. Neste mtodo temos como tarefa

    adicionar uma propriedade nossa lista de propriedades do

    novo contexto.

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

    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

    (IConstructionCallMessage ctorMsg) { ctorMsg.ContextProperties.Add(new LogProperty()); } }

    class LogProperty : IContextProperty, IContribute-ObjectSink { /* * Temos de indicar qual o nome * pela qual a property vai ser * conhecida dentro do contexto */ public string Name { get { return "Log"; } } /* * 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 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; }

  • A PROGRAMAR

    19

    Nos comentrios est a explicao para a maior parte do

    cdigo. No entanto, h um mtodo que especial. no m-

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

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

    todo 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 recebe-

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

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

    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:

    Como podemos ver bastante simples. Tal como nos atribu-

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

    Vejamos ento o que acontece se tentarmos usar este objec-

    to:

    Aquilo que vemos que acontece muito pouco:

    O nosso mtodo imprime aquilo que esperado dele, e nada

    mais.

    Automatizao de tarefas usando atributos

    class LogSink : IMessageSink { // Precisamos de guardar a prxima // mensagem para a poder retornar private IMessageSink nextSink; public LogSink(IMessageSink nextSink) { this.nextSink = nextSink; } public IMessageSink NextSink { get { return this.nextSink; } } // Comportamento a executar caso a mensagem seja // chamada de forma assncrona Vamo-nos limitar a // chamar a prxima mensagem e devolver o resultado public IMessageCtrl AsyncProcessMessage (IMessage msg, IMessageSink replySink) { IMessageCtrl rtnMsgCtrl = nextSink. AsyncProcessMessage(msg, replySink); return rtnMsgCtrl; } // Aqui onde vamos fazer a nossa intercepo // Por agora vamos, simplesmente, chamar // a prxima mensagem. public IMessage SyncProcessMessage(IMessage msg) { IMessage rtnMsg =

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

    [Log] public class LoggedObject : ContextBoundObject { public void metodo(String str) { Console.WriteLine("This is a method that prints " + str); } }

    static void Main(string[] args) { LoggedObject lo = new LoggedObject(); lo.Metodo("shrubbery"); }

  • A PROGRAMAR

    20

    Antes de tentarmos ir mais adiante com o nosso logger, va-

    mos ver se a nossa mensagem est a ser correctamente

    executada na cadeia. Vamos voltar ao mtodo SyncProces-

    sMessage do objecto LogSink e colocar o nosso debug:

    Se corrermos a aplicao novamente j vemos algo de dife-

    rente:

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

    gem faz o seu trabalho.

    Vamos ento tentar transformar o nosso sink num logger

    com informao util:

    Se tentarmos correr este cdigo j vemos algo mais interes-

    sante:

    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:

    No entanto, visto que o nosso mtodo demasiado bsico,

    vamos faze-lo demorar mais tempo artificialmente:

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

    que inserimos, demorou mais uns milsimos de segundo:

    Automatizao de tarefas usando atributos

    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; }

    public IMessage SyncProcessMessage(IMessage msg)

    {

    // A mensagem que recebemos tem // a informao que procuramos

    IMethodCallMessage mcm = (msg as IMethodCallMessage);

    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);

    IMethodReturnMessage mrm = (rtnMsg as IMethodReturnMessage);

    return mrm;

    }

    public IMessage SyncProcessMessage(IMessage msg) { // A mensagem que recebemos tem a // informao que procuramos MethodCallMessage mcm = (msg as IMethodCallMessage); 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; Console.WriteLine("Demorou " + (after - before) + " a correr."); IMethodReturnMessage mrm = (rtnMsg as IMethodReturnMessage); return mrm; }

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

  • A PROGRAMAR

    21

    Temos assim uma forma de registar todos os acessos a um

    determinado objecto.

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

    mente, sabendo qual o utilizador que est a tentar usar a

    funcionalidade, e que tipo de permisses tem, se pode per-

    mitir ou impedir que use essa funcionalidade da aplicao.

    No h solues, h compromissos

    No entanto, como em quase todas as decises de arquitectu-

    ra 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 per-

    formance. S para se ter uma ideia, vamos fazer algumas

    medies.

    Para comear, vamos ver quanto tempo demora para impri-

    mir 10000 vezes a mesma frase, usando o nosso logger.

    Vamos alterar o mtodo Main:

    Vemos que este cdigo demorou 11 segundos a correr

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

    linhas).

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

    ContextBoundObject nem usa o atributo de log, e alteramos

    novamente o Main:

    Temos o seguinte resultado:

    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.

    Automatizao de tarefas usando atributos

    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; Console.WriteLine("\n\n\nDemorou " + (after - before) + " a correr."); WaitForKeyPressAndExit(); }

    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; Console.WriteLine("Demorou " + (afterSum - beforeSum) + " a correr."); } DateTime after = DateTime.Now; Console.WriteLine("\n\n\nDemorou " + (after - before) + " a correr."); WaitForKeyPressAndExit(); }

  • A PROGRAMAR

    22

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

    nar lgica de controlo antes e depois da execuo de um

    mtodo. Este proxy chamado automaticamente pela fra-

    mework fazendo com que deixe de ser uma preocupao

    nossa. Teremos assim menos repetio de cdigo e um con-

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

    Automatizao de tarefas usando atributos

    Dadas as seguintes classes:

    Qual a sada do seguinte cdigo?

    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; } }

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

    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, dis-

    cos/memrias mais rpidas... No entanto tudo isto custa di-

    nheiro. Alm de que, muitas vezes, h optimizaes que tm

    de ser feitas no cdigo, ao nvel dos algoritmos e das biblio-

    tecas 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 neces-

    srias de fazer de forma repetida.

    Enigmas de C# Arrays por Paulo Morgado

    Veja a resposta na pgina 29

    new Posio3D { X = 2, Y = 1, Z = 3 }, new Posio3D { X = 3, Y = 2, Z = 1 } }; try { Process(array); Console.WriteLine("Dados processados!"); } catch (Exception ex) { Console.WriteLine("{0}: {1}", ex.GetType().FullName, ex.Message); } }

  • Elege o melhor artigo desta edio

    Revista PROGRAMAR http://tiny.cc/ProgramarED32_V

  • A PROGRAMAR

    24

    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.

    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.

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

    Escalabilidade

    Scale Up

    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.

    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.

    Introduo s SQL Azure Federations 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.

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

    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.

    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.

    Outro cliente muito importante das federations sero as

    aplicaes multi-tenant, vamos tentar perceber porqu.

  • A PROGRAMAR

    25

    Multi-tenant

    Quando se desenha uma aplicao multi-tenant (multi-

    cliente), 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.

    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.

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

    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.2 Todos os clientes numa nica base de 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.

    Sharding

    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.

    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.

    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.

    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

    Distribuio dos dados

    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.

    Introduo s SQL Azure Federations

  • A PROGRAMAR

    26

    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.

    Particionados

    Nesta categoria estaro a grande maioria dos dados onde

    cada pedao de dados reside numa e apenas numa base

    de dados.

    Arquitectura

    Figura 4.1 Arquitectura das federations

    Federation Root

    Refere-se base de dados central que contm todas as

    informaes sobre o particionamento dos dados.

    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 4.2 Arquitectura das federations member

    Federation Distribution Key

    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.

    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.

    Introduo s SQL Azure Federations

  • A PROGRAMAR

    27

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

    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.

    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.

    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.

    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.

    No futuro termos mais operaes disponveis tais como:

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

    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.

    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.

    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.

    Figura 5.1 Primeira fase do SPLIT

    Introduo s SQL Azure Federations

    -- Criar a base de dados root

    CREATE DATABASE AppDB (EDITION='business',MAXSIZE=50GB)

    -- Criar uma federation

    CREATE FEDERATION ClientesFed(ID BIGINT RANGE)

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

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

    CREATE TABLE Distrito(DistritoID tinyint primary key, Nome nvarchar(128))

    USE FEDERATION ClientesFed (ID = 110) WITH RESET, FILTERING=ON

    ALTER FEDERATION ClientesFed SPLIT (ID=200)

    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)

  • A PROGRAMAR

    28

    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.

    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.

    Figura 5.2 Segunda fase do SPLIT

    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.

    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.

    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

    Introduo s SQL Azure Federations

    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.

  • A PROGRAMAR

    29

    (continuao da pgina 22)

    Resultado

    System. ArrayTypeMismatchException: Attempted to access

    an element as a type incompatible with the array.

    Explicao

    Aquando do lanamento da plataforma .NET, a nica forma

    ter uma coleo tipada, sem ter de a desenvolver, era o ar-

    ray.

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

    rncias (implcita ou explicita) de A para B, a mesma conver-

    so de referncias existe de um array de tipo A[R] para um

    array do tipo B[R], em que R uma especificao de dimen-

    so (mas a mesma para ambos os tipos).

    Por isso, possvel escrever o seguinte cdigo:

    Mas porque isto apenas vlido caso exista uma converso

    de referncias, o seguinte cdigo no vlido:

    Esta relao designada por covarincia de arrays. A cova-

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

    Devido a esta covarincia de arrays, as atribuies de valor

    a elementos de arrays de tipos referncia inclui uma valida-

    o em tempo de execuo para garantir que o valor atribu-

    do ao elemento do array de um tipo permitido. Se tal no

    acontecer, ser lanada uma

    System.ArrayTypeMismatchException

    Concluso

    Pelo demonstrado, a passagem de arrays entre interfaces

    programticas (APIs) desaconselhada (e desnecessria

    aps a verso 2.0 da plataforma).

    A utilizao de arrays deve ser mantida privada ou em situa-

    es 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 o

    suficiente. Se ICollection for suficiente, no se deve usar

    IList.

    Ligaes

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

    Covariance and Contravariance in C#, Part Two: Array Cova-

    riance http://bit.ly/sicYL9

    Covarincia e Contravarincia em

    Genricos http://bit.ly/sMiv5M

    Enigmas do C#: Arrays

    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.

    Posio2D[] a1 = new Posio3D[5]; Posio[] a2 = a1;

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

  • COLUNAS VISUAL (NOT) BASIC Um pouco mais de Windows Phone 7

    CoreDump Free as in Beer

  • VISUAL (NOT) BASIC

    31

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

    sencial para acesso ao meio, comear a desenvolver algu-

    mas brincadeiras, despertar vontades e quem sabe, mudar

    opinies.

    Desta vez, e assumindo que o essencial foi absorvido na

    edio 27, gostaria de passar a apresentar acessos s funci-

    onalidades e caractersticas mais pertinentes destes apare-

    lhos 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 capacida-

    de de interagir no s com o aparelho, mas com o meio que

    o rodeia, das mais variadas formas e para os mais variados

    fins.

    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, conse-

    quentemente, os Start Tiles. Eu vou chamar s tiles).

    precioso na medida em que para estes tiles que o utiliza-

    dor tem de olhar praticamente cada vez que desbloqueia o

    telefone. Se a aplicao puder de alguma forma dar feed-

    back 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 notifica-

    es de todos os sistemas dos quais se esperam notifica-

    es.

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

    levam directamente para determinada pgina da nossa apli-

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

    Um pouco mais de Windows Phone 7

    Integrao com o ambiente

    Tiles

    A forma mais simples de interagir com o menu "mosaico",

    para alm de alterar o tile da aplicao, atravs da criao

    de "standard tiles".

    Estes tiles possuem duas faces 173x173 que podemos usar

    para apresentar informao, da forma que nos for mais con-

    veniente.

    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.

  • VISUAL (NOT) BASIC

    32

    Um pouco mais de Windows Phone 7

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

    ShellTile a API responsvel por a interaco com o Start

    Menu.

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

    Todos os outros na coleco, se alguns, so tiles secund-

    rios.

    Assim, podemos alcanar e alterar a tile principal da seguinte

    forma:

    Com pouco mais, podemos utilizar a API para criar novos

    tiles, ou tiles secundrios:

    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.

    Por exemplo, apontando para o ltimo tile, no caso de ter-

    mos apenas tile principal e um secundrio:

    Para utilizaes mais especficas, tambm possvel progra-

    mar uma actualizao a um tile.

    A actualizao automtica possvel com ShellTileSchedule,

    mas apenas possvel actualizar a imagem de fundo, a par-

    tir de um URL:

    No garantido que o tile actualize imediatamente, mesmo

    que a nossa programao de tempo seja para o alterar ape-

    nas uma vez, sem repetio.

    Estas actualizaes so feitas em grupos e com frequncia

    pr-determinada, e no dependem da aplicao.

    Pode demorar at uma hora para que uma actualizao sur-

    ta efeito.

    Em baixo, o resultado da programao programada do cdi-

    go exemplo:

    Para actualizar mais do que a imagem de fundo, seria

    necessrio recorrer a Push Notifications, que no vou

    cobrir no artigo.

    Este facto fora-me a omitir outras funcionalidades

    interessantes como a Toast Notification.

    lupa:

    StandardTileData

    BackBackgroundImage

    Imagem de fundo da face traseira

    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)

    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)

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

    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()

  • VISUAL (NOT) BASIC

    33

    Um pouco mais de Windows Phone 7

    BackContent

    Texto a apresentar no corpo da face traseira

    BackgroundImage

    Imagem de fundo da face dianteira

    BackTitle

    Texto a apresentar no ttulo da face traseira

    Count

    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

    tile

    Start

    Inicia a actualizao programada

    StartTime

    Define a data a partir da qual o programa tem efeito

    Stop

    Interrompe e termina a actualizao programada

    Resources

    Para manter a coerncia, durante a execuo da aplicao,

    importante existir um local a partir do qual se podem con-

    sultar uma srie de opes transversais ao aparelho.

    A coleco Resources, em Application.Current.Resources

    pode no s ser usada como repositrio temporrio de al-

    guns parmetros que queremos ter disponveis em qualquer

    pgina, mas tambm pode ser usada para consultar parme-

    tros do aparelho em si, ou do sistema operativo, bastante

    importantes para a integrao da aplicao.

    Um bom exemplo so por exemplo as cores e os brushes

    que esto a ser utilizados no sistema.

    a partir desta coleco que se pode consultar, entre deze-

    nas de outros parmetros, a Accent color que o utilizador

    escolheu e se o tema escuro ou claro.

    A coleco composta por chaves nicas e o seu respectivo

    valor.

    Application.Current.Resources.Add

    ("urlPAP", New Uri

    ("http://www.portugal-a-programar.org"))

    MessageBox.Show(DirectCast

    Application.Current.Resources("urlPAP"),

    Uri).AbsoluteUri)

  • VISUAL (NOT) BASIC

    34

    Um pouco mais de Windows Phone 7

    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.

    As chaves correspondentes s cores do tema mais pertinen-

    tes so:

    Tipo SolidBrush

    PhoneAccentBrush (brush com cor dos destaques,

    igual cor dos tiles. Conhecida como a accent co-

    lor)

    PhoneForegroundBrush

    PhoneBackgroundBrush

    Tipo Color

    PhoneAccentColor (cor dos destaques, igual cor

    dos tiles. Conhecida como a accent color)

    PhoneBackgroundColor

    PhoneForegroundColor

    Tipo Double para tamanho de fonte

    PhoneFontSizeSmall

    PhoneFontSizeNormal

    PhoneFontSizeMedium

    PhoneFontSizeMediumLarge

    PhoneFontSizeLarge

    PhoneFontSizeExtraLarge

    PhoneFontSizeExtraExtraLarge

    PhoneFontSizeHuge

    Tipo Visibility

    PhoneDarkThemeVisibility (no tema light, assume

    Visibility.Collapsed)

    PhoneLightThemeVisibility (no tema dark, assume

    Visibility.Collapsed)

    Tipo Double para opacidade

    PhoneDarkThemeOpacity (no tema dark, assume 1.0,

    opaco)

    PhoneLightThemeOpacity (no tema light, assume 1.0,

    opaco)

    Para as utilizar basta usar uma das chaves expostas no dici-

    onrio Resources.

    Ser devolvido o tipo especificado, com a informao preten-

    dida.

    Por exemplo:

    DeviceStatus

    Para alm dos parmetros de cor, tamanho e outros, que

    nos permitem a integrao visual da nossa aplicao, ne-

    cessrio tambm conhecer o aparelho para determinar de

    que forma se dever adaptar e como se dever comportar.

    Muita da informao bsica do aparelho encontra-se em

    Microsoft.Phone.Info

    Depois, para alm dessa informao geral, existe tambm

    informao em mbitos mais reduzidos, por exemplo, a dis-

    ponibilidade ou o nome da ligao de dados, que nos re-

    mete a Microsoft.Phone.Net:

    Ou a disponibilidade fsica de alguns sensores, em Micro-

    soft.Devices.Sensors, por exemplo:

    Application.Current.Resources.Add

    ("parametro1", "teste!")

    MessageBox.Show

    (Application.Current.Resources

    ("parametro1))

    Application.Current.Resources_("PhoneDarkThemeOpacity")

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

    Microsoft.Phone.Net.NetworkInformation. NetworkInterface.NetworkInterfaceType.ToString Microsoft.Phone.Net.NetworkInformation. NetworkInterface.GetIsNetworkAvailable

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

  • VISUAL (NOT) BASIC

    35

    Um pouco mais de Windows Phone 7

    Entre outros.

    ApplicationBar

    Todas as aplicaes tm a possibilidade de usufruir de um

    menu configurvel, e de comportamento e contornos trans-

    versais ao sistema operativo.

    Este componente de extrema importncia quando a nossa

    aplicao compreende uma maximizao de espao til em

    paralelo com um elevado nmero de funcionalidades.

    A ApplicationBar constituda por 4 Botes com cone e n

    Itens em lista vertical.

    No obrigatrio utilizar ambos, assim como no obrigat-

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

    Finalmente, podem assumir qualquer cor, qualquer nvel de

    opacidade e ainda suportam dois modos de recolha: o nor-

    mal, onde os botes esto visveis, e o minimizado onde

    recolhida apenas expe o ponto de expanso.

    A ApplicationBar pode ser pr-configurada via XAML.

    No cdigo acima, os constituintes so adicionados em runti-

    me a uma ApplicationBar adicionada via XAML.

    No est includo qualquer handling dos eventos necess-

    rios para o funcionamento, como o click.

    Basta acrescentar um handler por cada boto ou item, por

    exemplo:

    Caso no seja adicionada via XAML, a propriedade Applicati-

    onBar 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 ar-

    mazenar algum tipo de informao de forma a que possa ser

    recuperada independentemente da aplicao terminar ou do

    aparelho ser desligado.

    AddHandler appBot.Click, AddressOf BotaoTocado

    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)

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

    '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) ISTF.CreateDirectory("pasta") '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))

  • VISUAL (NOT) BASIC

    36

    Um pouco mais de Windows Phone 7

    A IsolatedStorage responde desde essa necessidade, at

    necessidade de uma aplicao que apenas implique pesa-

    das operaes com ficheiros, ou que exija um elevado grau

    de organizao no seu sistema de dados.

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

    fico.

    Neste local, nos possvel criar pastas, ficheiros, copiar fi-

    cheiros, consultar datas de modificao, virtualmente todas

    as operaes com ficheiros que teramos em um outro siste-

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

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

    da. Caso contrrio, devolve False.

    Se o pedido para aumentar a quota for de valor inferior

    actual quota, disparada uma excepo.

    As quotas so expressas em bytes.

    ISTF.IncreaseQuotaTo(2000000)

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

    ground Transfers.

    As Background Transfers so unidades de um servio de

    transferncias de ficheiros existente na framework, que utili-

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

    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.

    O BackgroundTransferService recebe BackgroundTransfer-

    Request, e cada um destes pedidos pode implicar o downlo-

    ad de um ficheiro para a IsolatedStorage, ou o upload de um

    ficheiro da IsolatedStorage.

    Em ambos os casos, importante que os handlers Transfer-

    ProgressChanged e TransferStatusChanged sejam regista-

    dos para que se consiga dar feedback ao utilizador.

    As transferncias so identificadas inequivocamente por o

    seu RequestID, que automaticamente gerado a cada pedi-

    do.

    Quanto uma transferncia completa, no desaparece. Esta

    ter que ser removida por aplicao.

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

    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/revista- programar/edicoes/download.php?e=31&t=forum")) AddHandler BGT.TransferProgressChanged, AddressOf repProgresso AddHandler BGT.TransferStatusChanged, AddressOf repEstado BGT.DownloadLocation = New Uri("shared/transfers/ revista.pdf", UriKind.RelativeOrAbsolute) Microsoft.Phone.BackgroundTransfer. BackgroundTransferService.Add(BGT) Private Sub repProgresso(ByVal sender As Object, ByVal e AsMicrosoft.Phone.BackgroundTransfer. BackgroundTransferEventArgs) ' e.Request.BytesReceived ' e.Request.TotalBytesToReceive ' aces de actualizao End Sub Private Sub repEstado(ByVal sender As Object, ByVal e As Microsoft.Phone.BackgroundTransfer .BackgroundTransferEventArgs) ApplicationTitle.Text = e.Request.TransferStatus.ToString

  • VISUAL (NOT) BASIC

    37

    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.

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

    cem um feedback visual ao utilizador, que indica que alguma

    coisa est a executar e far consequentemente com que

    aguarde.

    Na verdade, uma Indeterminate ProgressBar uma progres-

    sbar comum, mas com a propriedade IsIndeterminate verda-

    deira.

    Basta utilizar a visibilidade para mostrar ou ocultar a barra.

    Leitura do exterior

    Acelermetro, giroscpio e bssola

    Os aparelhos WP7 esto, tipicamente, munidos de compo-

    nentes que lhe permitem perceber como que esto a ser

    orientados e movimentados no espao fsico.

    Estes trs componentes funcionam todos de forma seme-

    lhante, mas do leituras distintas.

    Estas leituras podem ser utilizadas em separado, ou em con-

    junto 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).

    Cada sensor preparado de maneira semelhante, configu-

    rando qual o intervalo de tempo entre as actualizaes (ou

    seja, qual a frequncia com que a leitura feita), adicionan-

    do 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 cali-

    brar.

    A captura comea assim que o mtodo Start for chamado, e

    termina quando for chamado o Stop.

    For Each BGTR As Microsoft.Phone. BackgroundTransfer.BackgroundTransferRequest In Microsoft.Phone.BackgroundTransfer. BackgroundTransferService.Requests 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 Next

    Dim IPB As New ProgressBar IPB.IsIndeterminate = True ContentPanel.Children.Add(IPB)

    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

  • VISUAL (NOT) BASIC

    38

    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)

    Um pouco mais de Windows Phone 7

    Eis um exemplo de obteno de dados da bssola:

    Do giroscpio:

    E do acelermetro:

    Leitura do acelermetro

    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.

    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.

    Vector3 um tipo de dados que armazena essencialmente 3

    valores, XY e Z, representando consequentemente um vec-

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

    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

    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

  • VISUAL (NOT) BASIC

    39

    GPS

    Os dados da geo-localizao, atravs de satlites de posicio-

    namento, no considerado um sensor, tendo sido abrigada

    no namespace System.Device.Location, classe GeoCoordi-

    nateWatcher.

    relativamente fcil comear a capturar a localizao, bas-

    tando apenas registar um handler para as mudanas de po-

    sio.

    O handler parecido com os dos sensores:

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

    Em suma

    Apenas a criatividade em conjunto com a utilidade ditam o

    sucesso de uma aplicao, mas importante ter conheci-

    mento das possibilidades que nos so oferecidas.

    Existem muito mais pequenas e grandes funcionalidades

    que merecem ser exploradas: apenas foquei as que conside-

    ro 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

    Um pouco mais de Windows Phone 7

    Dim GPS As New System.Device.Location.GeoCoordinateWatcher AddHandler GPS.PositionChanged, AddressOf dadosGPS GPS.Start()

    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

  • CoreDump

    40

    Open Source Software (OSS), free as in speach, not as in

    beer...

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

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

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

    mentos 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 ser-

    visse melhor a organizao. Nos anos 90 o mesmo se come-

    ou a passar com a Microsoft. Hoje em dia h situaes on-

    de essa questo se coloca ao nvel do OSS. Em particular

    em solues maduras como sistemas operativos para servi-

    dores ou servidores web, comum observar algum questio-

    nar porque no se optou por uma distribuio de Linux ou

    pelo Apache.

    Free as in Beer Atualmente as organizaes tecnologicamente maduras vm

    o OSS como free as in speach e no como free as in be-

    er. 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 organiza-

    es efetuarem escolhas baseadas no mrito e no por ou-

    tros critrios mais duvidosos aos olhos de um tcnico com-

    petente.

    As organizaes imaturas continuam, e acredito que continu-

    aro, 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, operacio-

    nais 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 ne-

    cessidades da empresa. Na verdade no. E porqu? Por-

    que 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 impli-

    cam. No nos podemos esquecer que esta uma organiza-

    o tecnologicamente imatura, se no o fosse, teria efetuado

    a sua escolha de forma consciente.

    Felizmente as organizaes tm evoludo e os departamen-

    tos 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 organiza-

    es 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 expe-

    rincia profissional nas reas de Tecnologias e Sistemas de Informao. Criou a sua prpria consultora sendo a sua especiali-

    dade a migrao de dados.

  • COMUNIDADES AzurePT - Multiplas identidades no seu WebSite usando Windows

    Azure AppFabric ACS

    NetPonto - Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE AZUREPT

    42

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

    tei neste website?, qual ser o utilizador que utilizei no re-

    gisto?, para j no falar na dificuldade de lembrar da pala-

    vra-chave que foi utilizada para o mesmo. Com todas estas

    questes o que em muitas situaes acontece que come-

    amos 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 esta-

    mos completamente agarrados, porque nem sequer sabe-

    mos todos os locais em que determinada identidade existe.

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

    cer 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 en-

    contravam completamente acessveis e desencriptadas na

    base de dados?

    Imaginemos o seguinte cenrio,

    Enquanto me encontrava a navegar na internet deparei-

    me com um website muito interessante que tem uma rdio

    online e msicas muito recentes, aquilo que eu fiz imediata-

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

    Este um cenrio relativamente comum de acontecer, a

    questo que todos ns j estamos devidamente prepara-

    dos para dizer logo que essa no parece uma boa opo por

    uma questo simples, a confiana. O website pode ser exce-

    lente, pode ter msica excelente mas esse o seu negcio,

    mas quando falamos de questes relacionadas com paga-

    mentos ou outras questes sensveis j pensamos melhor e

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

    nadas com cartes de crdito, identidades, e outras informa-

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

    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, Twit-

    ter, Facebook, entre outros. Mas a questo que se coloca

    como conseguimos ns criar um website que tem exacta-

    mente o mesmo tipo de funcionamento, e no querendo pe-

    dir demasiado, como que o conseguimos efectuar com o

    mnimo de trabalho possvel?

    Conceitos base

    Para que consigamos responder a esta questo necessi-

    tamos de em primeiro lugar compreender os conceitos que

    se encontram na base desta soluo. E para iniciarmos va-

    mos 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 identida-

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

    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, con-

    fia/federa essa responsabilidade num IdP.

    Tambm bastante importante o conceito de FG - Fede-

    ration Gateway que bsicamente nos define quais as identi-

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

    Para finalizar existe um outro conceito que o Tipo de

    Federao (Federation Type) que define a forma como o

  • COMUNIDADE AZUREPT

    43

    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.

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

    quer 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 vali-

    dao das informaes ser efectuada de uma forma

    proactiva utilizando servios para que seja efectuada

    a validao e respectiva identificao do utilizador.

    Problema

    Tendo todos estes conceitos em conta, o problema que

    ns queremos criar uma relao de confiana para com di-

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

    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.

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

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

    Soluo

    Mas como poderemos solucionar este problema com o Win-

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

    Vamos iniciar o processo com a criao de um WebSite nor-

    mal em Visual Studio:

    Windows Azure AppFabric ACS

  • COMUNIDADE AzurePT

    44

    Se lanarmos agora o WebSite temos que um site normalis-

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

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

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

    Ao escolhermos o boto Access Control Service que se en-

    contra no topo do portal passamos imediatamente ao portal

    de gesto deste mesmo servio.

    Neste portal a primeira operao que iremos efectuar defi-

    nir os Identity Providers que iremos disponibilizar, e neste

    caso vamos escolher Google e Yahoo.

    Ficando com o seguinte:

    Windows Azure AppFabric ACS

  • COMUNIDADE AZUREPT

    45

    Vamos agora efectuar a relao de confiana entre o nosso

    WebSite e o Windows Azure AppFabric ACS. Para isso va-

    mos 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 refern-

    cia ao STS (Security Token Service).

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

    acesso ao nosso WebSite

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

    vice no Windows Azure.

    Vamos para j efectuar sempre Next nos restantes passos,

    uma vez que estamos num ambiente de testes e no quere-

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

    A partir deste momento j existe uma relao de confiana

    entre o WebSite e o ACS. Para finalizar apenas falta registar-

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

    Windows Azure AppFabric ACS

  • COMUNIDADE AZUREPT

    46

    Para finalizar vamos opo Rule Groups e seleccionamos

    o grupo que foi criado predefenidamente para o nosso Web-

    Site e seleccionamos o Generate, para que todas as regras

    de converso dos diversos IdPs utilizados sejam criadas.

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

    zados 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 responsabilida-

    de do ACS a partir deste momento.

    Agora lanamos novamente a soluo e tudo funciona, sen-

    do que antes de chegarmos ao nosso WebSite temos o se-

    guinte quadro que nos permite escolher o IdP que queremos

    utilizar.

    Concluso

    Em resumo, todos concordamos que importante que cada

    vez existam menos identidades digitais espalhadas pela In-

    ternet, 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 confi-

    gurao e instalao necessria para este tipo de sistemas,

    e com o auxilio da WIF Windows Identity Foundation, torna

    muito simples conseguir o resultado esperado.

    Windows Azure AppFabric ACS

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

    nidades Portuguesas como PontoNetPT, XAMLPT e Fundador da AzurePT (Windows Azure em Portugus)."

  • COMUNIDADE NETPONTO

    47

    http://netponto.org

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

    dos na traduo de mensagens.

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

    mento de mensagens, capaz de tratar, validar, transformar e

    controlar inmeros processos, simplificando as necessidades

    de adaptao de cada sistema a interligar. Ou seja, um com-

    ponente de infra-estrutura essencial nas ligaes entre em-

    presas (B2B - Business-to-Business) e cada vez mais, usado

    para ligar sistemas, tambm eles, cada vez mais complexos

    dentro das organizaes (EAI - Enterprise Application Inte-

    gration). 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 men-

    sagens apenas.

    De maneira simples podemos definir que o BizTalk um

    servidor de integrao, projectado para trabalhar com men-

    sagens, ideal para ser usado principalmente para integrao

    de aplicaes corporativas (EAI), integrao de sistemas

    entre parceiros de negcio (B2B) e para gesto de proces-

    sos de negcio (BPM).

    Arquitectura

    As mensagens entram no BizTalk atravs de uma porta lgi-

    ca (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:

    Biztalk Server - Princpios Bsicos dos Mapas

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

    mendas 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 prin-

    cipal objectivo:

    Converter as mensagens que podem estar em dife-

    rentes 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 esque-

    mas 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 subs-

    critores (1 ou mais interessados nessa mensagem) a vo

    receber. Estes subscritores podem ser outras portas de sa-

    da (Routing) ou entram em orquestraes lanando novos

    processos, ou acordando os que estavam espera (via cam-

    pos correlacionveis).

    O que so os mapas de BizTalk e onde podem ser utiliza-

    dos?

    Os mapas de BizTalk so representaes grficas de docu-

    mentos XSLT (Extensible Stylesheet Language Transformati-

    on) que permitem efectuar, de forma simples e visual, trans-

    formaes s mensagens XML.

  • COMUNIDADE NETPONTO

    48

    http://netponto.org

    Podemos enumerar os standards usandos no BizTalk Map-

    per:

    XML (Extensible Markup Language) contm os da-

    dos das mensagens;

    XML Schema (XSD - XML Schema Definition) defi-

    ne o formato das mensagens;

    E XSLT (Extensible Stylesheet Language Transfor-

    mation) define as regras de tranformao das men-

    sagens;

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

    tes:

    Transformaes de Sintaxe: este tipo de transfor-

    maes ocorrem nas pipelines de recepo ou envio

    e tm como objectivo transformar um documento nou-

    tra representao, por exemplo de CSV para XML.

    Aqui o documento mantem os mesmos dados

    (semntica), mas muda a sintaxe com que repre-

    sentado. Ou seja traduzimos o documento mas, nor-

    malmente, no o modificamos em termos de estrutu-

    ra. Por norma este tipo de transformao bidireccio-

    nal, uma vez que continuamos a ter o mesmo conte-

    do semntico. Podemos aplicar a mesma lgica de

    transformao e voltar a obter um documento no seu

    formato original.

    Transformaes de Semntica: este tipo de trans-

    formaes ocorre por norma apenas nos mapas de

    BizTalk. Aqui o documento mantem a mesma sintaxe

    com que representado (XML), mas muda a sua se-

    mntica. 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 impor-

    tantes para a sua reconstruo.

    Nota: Neste artigo vamos falar apenas nas transformaes

    de semntica, ou seja, nos mapas de BizTalk.

    Onde podem ser utilizados os mapas?

    Conforme a imagem a baixo demonstra, os mapas de Bi-

    zTalk podem ser utilizados entrada, nas orquestraes, ou

    nas portas de sada.

    A grande diferena entre utilizar nas portas ou em orquestra-

    es, 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 Desig-

    ner

    O editor de mapas, BizTalk Mapper Designer, possibilita

    efectuar transformaes de mensagens XML complexas de

    forma visual e extremamente simples, expressas em associ-

    aes grficas de ligaes (links) que definem as relaes

    entre os vrios elementos das mensagens.

    Estas relaes entre elementos so internamente implemen-

    tadas como transformaes XSLT (Extensible Stylesheet

    Language Transformation) que o standard recomendado

    pela Worldwide Web Consortium (W3C) para efectuar trans-

    formaes entre esquemas XML

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    49

    http://netponto.org

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

    tra-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;

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

    quema de destino, para a mensagem final.

    Cada mapa pode ter at 20 pginas (mapper grids),

    acedveis atravs dos separadores (tabs) que se en-

    contram no fundo da grelha de mapeamento ponto

    4.

    Para alm destes 3 mdulos, existem 2 janelas de extrema

    importncia para o programador:

    Janela de Ferramentas (toolbox window): normal-

    mente encontra-se no lado esquerdo do esquema de

    origem ponto 5; Providencia acesso a todas as

    functoids que podemos utilizar nos 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 es-

    quema de destino ponto 6.

    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.

    O utilizador tambm pode especificar transformaes mais

    complexas usando functoids. Podemos considerar uma func-

    toid como funes pr-definidas que podemos utilizar para

    efectuar mapeamentos ou transformaes complexas.

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

    es 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 trans-

    formao.

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    50

    http://netponto.org

    BizTalk fornece um extenso conjunto de functoids que po-

    dem 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 desti-

    no.

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

    so 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, de-

    terminando assim se os dados de sada so criados

    ou no.

    Mathematical Functoids: Utilize as functoids mate-

    mticas para executar clculos numricos especfi-

    cos, 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 conhe-

    cidas tais como: calcular comprimento, concatenao

    de elementos, extrair bloco de texto, converter para

    maisculas ou minsculas.

    No entanto, a plataforma permite que sejam criadas novas

    functoids pelos programadores assim como organizar e criar

    novas categorias.

    Projecto de referncia para criao e instalao de novas

    functoids: BizTalk Mapper Extensions UtilityPack.

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

    mamente til por forma a organizar-nos e desta forma torn-

    los mais legveis. Apesar de em pequenos mapas, uma pgi-

    na 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 con-

    seguirmos 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 ope-

    raes que podemos efectuar sobre as pginas:

    Adicionar nova pgina: esta a funcionalidade mais

    comum, adicionar novas pginas permite-nos organi-

    zar 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 se-

    paradores de forma a tornar as diferentes pginas

    mais legveis visualmente.

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    51

    http://netponto.org

    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

    Reorganizar as pginas existentes: muita das vezes

    temos a necessidade de organizar a disposio das

    pginas numa sequncia diferente, para isso basta:

    Pressionar boto direito sofre o separador da pgina,

    e seleccionar a opo Reorder Pages

    Transformaes - Funcionalidades bsicas dos mapas

    Quando estamos a efectuar uma transformao de mensa-

    gens 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

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

    do destino, sem efectuarmos qualquer tipo de operao so-

    bre os valores (cpia directa).

    Para isso apenas de necessitamos de efectuar drag-and-

    drop do elemento de origem para o esquema destino. Na

    imagem seguinte est exemplificado o elemento Morada.

    Concatenao de valores

    Concatenar diferentes valores da origem para um determina-

    do elemento no esquema de destino outra das operaes

    quotidianas em transformaes, para isso apenas necessita-

    mos de:

    Abrir a janela de ferramentas e arrastar para a grelha a func-

    toid String Concatenate;

    Conforme foi explicado no ponto anterior, arrastar uma liga-

    o entre os elementos pretendidos e a functoid String Con-

    catenate, 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;

    Nota: a ordem de entrada dos elementos na functoid im-

    portante, uma vez que a concatenao efectuada pela

    ordem de entrada dos elementos (iremos aprofundar este

    tema mais frente).

    Seleces condicionadas

    Muitas das vezes no queremos simplesmente mover valo-

    res 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 distin-

    tas 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 ne-

    cessitamos:

    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;

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    52

    http://netponto.org

    Arrastar uma ligao do elemento pretendido da ori-

    gem 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 boolea-

    no, controlar a sada dos valores da origem para o

    destino, ou seja, recebe dois valores:

    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.

    Arrastar uma ligao da functoid Logical String para

    a functoid Value Mapping;

    Arrastar uma ligao do elemento CodigoPostal do

    esquema de origem para a functoid Value Mapping;

    Arrastar uma ligao da functoid Value Mapping

    para o elemento CodigoPostal do esquema de desti-

    no;

    Scripts customizados

    Scripts customizados so utilizados normalmente em trans-

    formaes mais complexas ou por forma a facilitar algumas

    condies. Basicamente existem dois cenrios para utilizar-

    mos 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 tor-

    nam-se extremamente complexas para resolver um

    problema do mapeamento.

    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

    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.

    Esto ao dispor do programador 6 tipos de scripts:

    External Assembly: Permite-nos associar e invocar

    esta functoid com uma funo existente numa assem-

    bly existente na Global Assembly Cache (GAC).

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

    cdigo C# directamente na functoid (Inline Script Buf-

    fer property).

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

    cdigo JScript .NET

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

    uso de cdigo Visual Basic .NET

    Inline XSLT: Esta opo permite-nos associar e invo-

    car scripts XSLT directamente na functoid (Inline

    Script Buffer property).

    Inline XSLT Call Template: idntico anterior, no en-

    tanto esta permite-nos invocar templates XSLT direc-

    tamente da functoid.

    Neste exemplo, queremos transformar a data de nascimento

    na idade da pessoa, neste cenrio devemos:

    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:

    Efectuar duplo click na functoid Scripting e seleccio-

    nar 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:

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    53

    http://netponto.org

    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, ne-

    cessitaremos de consultar um sistema externo, por exemplo

    base de dados, por forma a adquirimos mais informaes

    para preencher os dados necessrios na mensagem final.

    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;

    Nota: Como podem verificar, esta functoid no requer ne-

    nhum dado de entrada, retornando a data e hora actual do

    sistema.

    Como organizar os mapas BizTalk

    Os mapas podem tornar-se extremamente complexos, difi-

    cultando assim a sua leitura e manuteno.

    O editor de mapas do BizTalk providencia duas importantes

    funcionalidades que nos permitem minimizar este problema:

    Pginas

    Etiquetas para as ligaes

    Pginas

    As pginas permitindo organizar os mapas, especialmente

    os mais complexos, em subdivises lgicas de mapeamen-

    tos. Esta funcionalidade j foi descrita anteriormente.

    Etiquetas para as ligaes

    Nas verses anteriores do produto, por defeito, era apresen-

    tado a query XPATH se uma ligao fosse estabelecida a

    uma functoid:

    /*[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 ligeiramen-

    te melhorado, sendo que actualmente o valor defeito o

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    54

    http://netponto.org

    nome do elemento do esquema de origem de onde pro-

    vem a ligao:

    Ou o nome da functoid anterior:

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

    tendida.

    Normalmente esta funcionalidade esquecida pelos progra-

    madores.

    Apesar de parecer uma funcionalidade banal e sem impacto

    significativo, a meu ver, trata-se de uma funcionalidade im-

    portante a longo prazo. Enquanto as ideias esto frescas

    sabemos o que estamos a fazer, mas se for necessrio inter-

    vir passado algum tempo e rever os mapeamentos, esta

    funcionalidade ir tornar a nossa tarefa mais facilitada.

    Operaes possveis de efectuar sobre os mapas

    Na fase de desenvolvimento, temos ao dispor 3 funcionalida-

    des, includas no Visual Studio, que nos permite testar e

    validar os mapas:

    Testar mapas

    Validar mapas

    Depurar mapas

    Estas funcionalidades esto ao dispor dos programadores de

    uma forma fcil e directamente da ferramenta de desenvolvi-

    mento, Visual Studio, no necessitando assim de executar

    (build) e publicar (deploy) os mapas ou at mesmo criar e

    configurar portas.

    Testar mapas (Test Map)

    Deveremos testar o nosso mapa de uma forma continua, no

    apenas no final do desenvolvimento, mas sempre que neces-

    srio 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 selecci-

    onar 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).

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    55

    http://netponto.org

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

    priedades do mapa antes de corremos o teste:

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

    cheiro de entrada.

    Nesta janela tambm podemos configurar diversas proprie-

    dades 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 esque-

    mas.

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

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

    Nota: Esta opo dever ser configurada como True para

    os testes finais.

    Validar mapas (Validate Map)

    Esta opo permite-nos validar a estrutura do mapa. Pode-

    mos desta forma inspeccionar e analisar o cdigo XSLT ge-

    rado pelo compilador, fornecendo-nos informaes

    adicionais de como os mapas funcionam assim como mais

    uma outra opo de depurao (debug).

    Para executar esta opo basta:

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

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

    Esta funcionalidade faz uso de algumas propriedades dos

    mapas, tais como TestMap Input Instance e TestMap Out-

    put Instance. Portanto, antes de depurar o mapa, ser ne-

    cessrio configurar as suas propriedades dos mapas, com

    especial foco nas duas anteriores.

    Para executar esta opo, teremos de:

    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.

    Quando voc pressiona F11 numa chamada a

    uma functoid, o Visual Studio ir entrar para o

    cdigo C# associado functoid.

    Biztalk Server - Princpios Bsicos dos Mapas

  • COMUNIDADE NETPONTO

    56

    http://netponto.org

    Concluso

    Devido ao inmero nmero de sistemas e aplicao distintas

    existentes nas organizaes, imperativo usar boas ferra-

    mentas 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 Fo-

    rums), contribuidor no MSDN Code Gallery e autor do Blog: http://bit.ly/oFLwB4- Twitter: @sandro_asp Membro da comuni-

    dade BizTalk Brasil: http://bit.ly/9NI7ie

    Podemos definir o

    BizTalk como um ser-

    vidor de encaminha-

    mento de mensagens,

    capaz de tratar, vali-

    dar, transformar e

    controlar inmeros

    processos

    Biztalk Server - Princpios Bsicos dos Mapas

  • Veja tambm as edies anteriores da Revista PROGRAMAR

    e muito mais em www.revista-programar.info

    30

    Ed

    i

    o - A

    go

    sto

    20

    11

    28

    Ed

    i

    o - A

    bril 2

    01

    1

    29

    Ed

    i

    o - J

    un

    ho

    20

    11

    26

    Ed

    i

    o - D

    ezem

    bro

    20

    10

    27

    Ed

    i

    o - F

    eve

    reiro

    201

    1

    31

    Ed

    i

    o - O

    utu

    bro

    20

    11