You are on page 1of 50

EDITORIAL

EQUIPA PROGRAMAR
Coordenadores Antnio Silva Fernando Martins Editor Antnio Santos Design Srgio Alves Twitter: @scorpion_blood Redaco Antnio Silva Augusto Manzano Bruno Lopes Fernando Martins Rui Melo Sara Silva Srgio Ribeiro Vtor Tomaz

(Des)Informao
Actualmente muito se tm falado sobre tudo. Falado e especulado. Com a sada de Steve Jobs da Apple especula-se qual sero as implicaes para a marca da ma. Com o lanamento do Windows 8 especula-se sobre a capacidade deste conquistar o mercado dos tablets. Com a conferncia da Apple Lets talk about IPhone especulou-se sobre o possvel anncio da data de lanamento do IPhone 5. Com o abandono da Nokia, especulou-se o que aconteceria ao sistema operativo Meego. E muito mais se especula. Infelizmente a nossa sociedade vive presa s especulaes, e creio que o melhor exemplo disso, nem est na rea tecnolgica, mas sim na rea financeira com a crise em que vivemos ser altamente ampliada pelas especulaes. H uns anos atrs sempre que algum queria dar um exemplo financeiramente forte sobre especulaes falava sobre a famosa Quinta-feira negra, onde as aces de um dia tiveram efeitos nos anos seguintes e onde aconteceu a muitos acordar rico e adormecer pobre. Todavia hoje no precismos de dar um exemplo to longnquo no tempo e em que muitos no conhecem as verdadeiras consequncias. Agora podemos fala no presente. Mas no precismos de falar apenas na rea financeira, podemos falar de qualquer rea, inclusivamente a informtica. Apesar de o IPhone 5 ainda no ter sido lanado, nem existirem provas de que alguma vez ir ver a luz do dia, a publicidade feita em torno dele, torna-o no alvo de curiosidade para o bem e para o mal. Chamar-lhe-ia publicidade gratuita. Se eu dissesse que era provvel um canal de televiso deixasse de existir no dia x, estaria a especular. Provavelmente teria pouco reflexo na sociedade, uma vez que os prprios meios de comunicao social me dariam pouco tempo de antena, ao invs destes assuntos sobre grandes empresas. Contudo estaria a distorcer o mercado, criando expectativa em volta de algo que eu apenas defendia/acreditava, mas sem ter provas ou factos. Numa rea cujo nome deriva de Informao automtica, a verdadeira informao que processada, comparativamente com o total de dados cada vez menor. Cada vez mais recorremos a uma ferramenta que deveria armazenar e processar dados gerando informao, contudo devido falta de fidedignidade das fontes e contrariedade dos dados l introduzidos muitas vezes gerada desinformao. Se eu disse-se que o mundo acabava hoje dentro de 5 minutos, mesmo que muita gente acredita-se em mim pouco podia fazer at verificar a veracidade dessa informao. Passados 5 minutos saberiam se era verdade ou no. Se eu disser que o mundo acaba em 21 de Dezembro de 2012 ainda se ter muito que esperar at se conseguir confirmar ou no a afirmao. Por isso no informao, mas sim especulao. Especulao que faz vender, que mexe com os mercados, que coloca em muitos os nervos flor da pele, que deixa outros com um sorriso de vitria, que impede o sono tranquilo de muitos, mas que no passa de uma simples afirmao, cuja veracidade no pode ser demonstrada na altura em que foi proferida. NR: Em notcia de ltima hora soube-se do falecimento de Steve Jobs. Para o bem e para o mal foi um nome incontornvel no mundo da tecnologia, e que contribuiu para a sua evoluo., por isso aqui ficam registadas as nossas condolncias.

Staff Antnio Santos Fbio Canada Fbio Domingos Jorge Paulino Pedro Martins Sara Santos Contacto revistaprogramar@portugal-aprogramar.org Website http://www.revista-programar.info ISSN 1 647-071 0

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

NDICE
TEMA DE CAPA
7 Netponto - NHibernate - Tcnicas para software melhor e mais rpido Saiba mais sobre estas tcnicas para melhor software e mais rpido. Bruno Lopes

A PROGRAMAR
17 Gerao de Nmeros Aleatrios O primeiro de 4 artigos do mesmo autor da excelente srie Programao em Lua, desta vez sobre gerao de nmeros aleatrios. Augusto Manzano Programar para Windows Azure Conhea alguns detalhes bem como alguns cuidados que deveremos ter em conta quando desenvolvemos para esta plataforma. Vtor Tomaz Programao Orientada a Objectos em Java 6 Saiba as melhores prticas e mtodos de programao neste paradigma em Java 6. Antnio Silva DataBinding em Silverlight 4 Conhea o conceito de Databinding na plataforma Silverlight. Sara Silva

21

25 30

COLUNAS
36 43 Visual (NOT) Basic - Primeiros Passos com GDI+ Saiba mais sobre a API responsvel por tudo o que nos chega aos olhos no mundo Windows. Srgio Ribeiro Core Dump - Martelo <=> Inpcia Neste artigo de opinio, conhea segundo o autor, a origem das falhas nas bases de muitos profissionais de TI. Fernando Martins

COMUNIDADES
45 SharePointPtPadro alternativo de Sharepoint Neste artigo da comunidade SharePointPT, saiba como desconstruir as abordagens mais tradicionais, atravs de uma soluo pouco comum atravs de uma arquitectura que optimiza os mdulos de maior interesse para o cenrio apresentado. Rui Melo.

EVENTOS
19 a 21 Out 18 Out 28 Out 10 a 12 Nov 02 Nov Capsi 2011 Upload Lisboa 24 Reunio Presencial NetPonto Sapo Codebits V SASIG 4

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

NOTICIAS
O melhor amigo do Ipad portugus e ecolgico
Kork2 foi desenhado pela A Produkt e produzido em Paos de Brando num material reciclado e reciclvel. o canivete suo do Ipad e foi desenhado pela A Produkt, empresa sediada em Portugal rendida aos encantos da cortia. O Kork2 sucessor do Kork por direito ajusta-se ao Ipad2, protegendo-o e tornando a sua utilizao ainda mais confortvel e dinmica. Simples, leve, ergonmico, recortado (pela 3DCork, de Paos de Brando) num material reciclado e reciclvel. So estes alguns dos segredos que atraram o Kork2 at s prateleiras do MoMA de Nova Iorque e de Tquio. Todos os pormenores so estudados ao milmetro por Michael Andersen e Benedita Feij, dupla que se lanou no mercado Apple com o StickyStrap para o iPhone antes de colocarem o iPad nas passarelas internacionais. Fazemos um exerccio de especulao porque os desenhos da Apple esto normalmente fechados a sete chaves, explicou ao P3 Michael Andersen, ansioso pelos desenhos detalhados do iPhone5 e do iPad3. Vamos trabalhando com esses rumores at termos o objecto nas mos para avanarmos com os desenhos finais. Os moldes so feitos ao milmetro porque a cortia um material extremamente complicado de moldar, prossegue um dos fundadores da A Produkt, responsvel por produtos originais que, graas a materiais portugueses, fazem a ponte entre a tecnologia e a natureza. A A Produkt no exclui uma futura aventura no mundo da cermica e da indstria txtil. Fonte: Pblico, texto de Lus Octvio Costa

Apple pode continuar a limitar uso do Mac OS aos seus computadores


A Apple tem o direito de restringir a utilizao do sistema operativo OS X aos computadores fabricados pela empresa. A deciso do tribunal de recurso norte-americano foi conhecida esta semana, trs anos depois de iniciada a batalha legal contra a Psystar, uma fabricante de "clones" dos produtos da ma. A sentena anterior j havia dado razo empresa de Steve Jobs, mas a Psystar - embora no tenha reclamado da violao de direitos de autor de que foi acusada por copiar o hardware da Apple - interps recurso da deciso alegando que as condies de licenciamento impostas para o Mac OS constituam uma tentativa ilegal para estender a proteo dos direitos de autor a produtos que no podem beneficiar dela. A Psystar alegou que ao limitar o uso do software da Apple aos produtos fabricados pela marca, a empresa estava a recorrer indevidamente proteo que a lei dispensa aos direitos de autor para falsear a concorrncia. Note-se que a fabricante de "sucedneos" dos Mac tinha comprado cpias do Mac OS X para instalar nos computadores que vendia. A juza considerou que a concorrente no tinha apresentado provas de que as condies de licenciamento do sistema operativo fossem lesivas da concorrncia ou criatividade. Os termos das licenas do software da Apple "no restringem a possibilidade de os concorrentes desenvolverem o seu prprio software, nem impede os clientes de usarem componentes de outra marca em computadores Apple", entendeu a magistrada, citada pela Ars Technica. O que a Apple faz restringir o uso de software da marca ao seu prprio hardware e a Psystar, que produz os seus prprios computadores, livre de desenvolver software para eles, concluiu. A deciso chega no culminar de um processo que teve incio em Julho de 2008, quando a Apple pediu a condenao da Psystar por copiar os seus produtos. A sentena representa uma vitria importante para a fabricante do iPhone, que v corroborada a "intocabilidade" do seu ecossistema e assegurado o direito a no disponibilizar o seu sistema operativo a outras fabricantes. Escrito ao abrigo do novo Acordo Ortogrfico Fonte: Tek Sapo

Windows 8 - Novo Explorador


Segundo o blog oficial da equipa de desenvolvimento do Windows 8, o explorador do Windows semelhana do Microsoft Office, uma ribbon. Outra das novidades, o facto deste possibilitar a abertura de ficheiros iso e vhd sem necessidade de aplicaes de terceiros. Imagens do novo explorador neste site: http://bit.ly/rj8vjI Blog oficial do Windows 8: http://blogs.msdn.com/b/b8/ Fonte: P@P

NOTICIAS
Investigadores quebram criptografia SSL
Acesso a bancos portugueses e estrangeiros em risco A segurana perfeita um mitoj dizia o ditado! Nos dias de hoje, a segurana de muitos sites (especialmente de homebanking, ou compras online) passa pelo uso do protocolo SSL (Secure Sockets Layer), que permite (permitia) a integridade e confidencialidade dos dados que so passados entre o cliente e o servidor. Segundo informaes disponveis no site The Register, os investigadores tailandeses Thai Duong e Juliano Rizzo conseguiram pela primeira vez, quebrar o, at agora inquebrvel, protocolo SSL e assim decifrar a informao que passada ponto a ponto (entre o cliente e o servidor). A noticia preocupante e alarmante mas a descoberta levada a cabo pelo grupo de investigadores apenas pe em causa a segurana as verses 1.0 e anteriores do TLS (Transport Layer Security) o sucessor do SSL. At ao momento no h qualquer informao sobre vulnerabilidades que afectem a verso 1.1 ou 1.2 do TLS. A demonstrao de tal feito ocorrer na conferncia Ekoparty , que se realizar em Buenos Aires no final desta semana. Thai Duong e Juliano Rizzo iro apresentar o exploit que usaram para conseguir derrubar o SSL e ao qual deram o nome de BEAST. O exploit foi programado em JavaScript e funciona como um snifer, tendo a capacidade de decifrar a informao. Segundo os autores, o exploit funciona tambm em sites que usam HSTS (HTTP Strict Transport Security). Duong referiu que a demo que iro apresentar na conferncia Ekoparty, consistir na decifragem de um cookie de autenticao, utilizado no servio Paypal. Mas o que o SSL? SSL um protocolo criptogrfico baseado em cifras assimtricas que providencia segurana e integridade dos dados transmitidos em redes como a Internet. Este protocolo ajuda a prevenir que entre as duas extremidades da comunicao no exista nenhum acesso indevido ou falsifiquem os dados transmitidos, ou seja, apenas o emissor e o receptor podem ver a informao da mensagem transmitida. Existem vrias aplicaes para este protocolo, como por exemplo o comrcio electrnico, servidores Web, servidores FTP, etc.Para identificar facilmente se esto a visualizar um site seguro basta verificar no URL que em vez de estar o normal http:// se encontra https://. Para saber mais: http://bit.ly/ p1MV0Y Fonte: Sapo Fonte: www.berlios.de Traduo: Sara Santos

BerliOS ser fechado em 31.12.2011


O BerliOS foi fundado h 10 anos como um dos primeiros depsitos na Europa. Foi desenvolvido e mantido por Fraunhofer FOKUS. Como Europeu, o projecto no-proprietrio BerliOS tinha como objective apoiar vrios intervenientes e providenciar uma funo de mediao neutra. Em 2011 cerca de 4710 projectos foram alojados no BerliOS, com 50,000 utilizadores registados e mais de 2.6 milhes de ficheiros descarregados cada ms. Estamos orgulhosos de, com o BerliOS, termos trazido a ideia de um depsito OSS Europa. Entretanto, o conceito tem permanecido e existem muitas alternativas boas. Infelizmente, como instituto de pesquisa Fraunhofer FOKUS tem apenas algumas oportunidades para operar um depsito como o BerliOS. Tal projecto apenas funcionar com um financiamento de seguimento, ou com patrocinadores ou parceiros que assumam o controlo do depsito. No campo de OSS um empreendimento difcil. Num inqurito recente a comunidade indicou algum apoio em fundos e mo-de-obra pelos quais gostaramos de vos agradecer. Infelizmente, o resultado no suficiente para colocar o projecto numa base financeira sustentvel. Alm disso, a procura de patrocinadores ou parceiros foi sem xito. O Open Source entendido pela Fraunhofer FOKUS como um paradigma para a futura utilizao de inteligncia orientada da TI. Magoa-nos ainda mais o facto de sermos forados a descontinuar o alojamento para BerliOS em 31/12/2011. Como programador, dever exportar o seu projecto BerliOS para outro depsito. Como alternativas ver: http://bit.ly/18Pp6N . No nosso site iro encontrar um guia em como retirar os dados dos vossos projectos do portal e migrlos para uma plataforma diferente. Ver: http://bit.ly/qGJfAo . A Fraunhofer FOKUS tem um forte compromisso com o Open Source e interoperabilidade, e est envolvida em numerosos projectos OSS de sucesso. O instituto est focado no desenvolvimento de padres de qualidade para o software open source e em particular na inoperabilidade tcnica, semntica e organizacional entre componentes de software open source e software closed source. Exemplo das nossas actividade OSS incluindo a nossa gesto do Centro de Competncia Alemo QualiPSo. Agradecemos a todos terem utilizado o BerliOS ao longo dos anos.Fraunhofer FOKUS http://www.fokus.fraunhofer.de

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido
No artigo da edio anterior abordamos os temas de configurao de NHibernate, diferentes formas de mapear as entidades e diferentes formas de obter os dados da base de dados no contexto do seguinte domnio: public class Edicao { public virtual DateTime DataEdicao {get; set; } public virtual Artigo TemaDeCapa { get; set; } public virtual IList<Artigo> Artigos {get;set;} } public class Artigo { public virtual int Id { get; set; } public virtual string Titulo { get; set; } public virtual ISet<Autor> Autores {get;set; } } public class Autor { public virtual int Id { get; set; } public virtual string Nome { get; set; } public virtual string Email { get; set; } public virtual ISet<Artigo> Artigos {get;set; } } Neste artigo vamos ver como podemos aproveitar algumas das funcionalidades mais avanadas do NHibernate para tornar as nossas aplicaes mais eficientes, reduzindo o nmero de pedidos base de dados assim como a quantidade de dados que so transmitidos. Em certos momentos iremos usar a ferramenta NHProf para observar a comunicao entre a nossa aplicao e a base de dados. Performance Uma das falcias de computao distribuda de que latncia zero. Na realidade, qualquer chamada a um sistema remoto ordens de magnitude mais lenta do que a mesma chamada a um sistema local e dentro do mesmo processo. Outra falcia de que a largura de banda infinita. Como tal boa prtica reduzir o nmero de chamadas remotas ao servidor de dados e o tamanho dos dados a receber e enviar se queremos ter aplicaes com boa performance mesmo quando em carga. Como reduzir o nmero de chamadas Um dos casos tpicos onde fazemos mais chamadas base de dados do que o necessrio quando mostramos uma listagem de itens que necessita de dados de mais do que uma tabela: foreach (var artigo in session.QueryOver<Artigo>().List()) { var autores = artigo.Autores.Select(a => a.Nome); Console.Out.WriteLine( "Artigo {0} com autores {1}", artigo.Titulo, string.Join(", ", autores.ToArray())); }

Neste caso, estamos a mostrar o ttulo de um artigo em conjunto com os autores. Se olharmos para o SQL gerado vemos que por cada artigo vamos base de dados buscar os autores:

Este comportamento resultante das capacidades de lazyloading da biblioteca em conjunto com as configuraes por omisso que carregam os objectos de cada relao apenas quando esta acedida. Tal comportamento implica que vo ser efectuados no mnimo tantos queries quanto artigos mostrarmos. Qualquer latncia no acesso ao servidor de sql aumenta significativamente o tempo de resposta da nossa aplicao, quando na realidade seria possvel minimizar as chamadas base de dados e obter todos os dados de uma s vez. Select N+1 A esta classe de problemas d-se o nome de Select N+1, em virtude de ser efectuada uma chamada base de dados para obter a lista de objectos raiz, e posteriormente N chamadas para obter os objectos relacionados de cada raiz. uma fonte tpica de problemas de performance, e em quase todos os casos pode ser resolvida com um carregamento mais inteligente dos dados.

Eager-Loading
Embora a intuio seja de que o oposto de lazy-loading seja eager-loading, na realidade existem vrias formas de fazer eager-loading de dados, pelo que devem ser usadas em circunstncias diferentes.

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido
possvel configurar este comportamento a nvel dos mapeamentos globais ou durante um query base de dados. Quando configurado no mapeamento pode ser feito a uma classe ou a uma relao. Quando feito durante o query sempre respectivo a uma relao. Quando uma classe indicada como no lazy-loaded, qualquer instncia da mesma criada pelo NHibernate deixar de ser uma proxy. A implicao de que qualquer relao que seja de um para um ou de muitos para um com uma classe que no possa ser lazy-loaded ter de ser logo concretizada. Considerando que queremos que a classe Artigo no seja lazy-loaded: public class ArtigoOverride : IAutoMappingOverride<Artigo> { public void Override(AutoMapping<Artigo>mapping) { mapping.Not.LazyLoad(); } } Quando carregamos uma Edicao (que tem uma coleco de artigos e um tema de capa): var edicao = session.Get<Edicao>(dataEdicao); O sql gerado inclui j o join necessrio para carregar o tema de capa: SELECT edicao0_.DataEdicao as DataEdicao3_1_, edicao0_.TemaDeCapa_id as TemaDeCapa2_3_1_, artigo1_.Id as Id0_0_, artigo1_.Titulo as Titulo0_0_ FROM [Edicao] edicao0_ left outer join [Artigo] artigo1_ on edicao0_.TemaDeCapa_id = artigo1_.Id WHERE edicao0_.DataEdicao = '2011-07-01T00:00:00.00' H aqui dois comportamentos que so necessrio distinguir: o da relao de muitos para um (TemaDeCapa) e o da relao de um para muitos (Artigos). Como a classe Artigo que deixa de ser lazy-loaded, quando o NHibernate faz um query a partir da Edicao repara que no vai poder criar a proxy para o TemaDeCapa, e cria o sql necessrio para carregar os dados do Artigo correspondente. No caso dos Artigos no surge esse problema porque no necessita de criar as instncias imediatamente, apenas uma lista que as vai guardar. At iterarmos por esta lista no precisamos de construir as respectivas instncias de Artigos. Um para obter os artigos, e um por cada artigo. Para carregar os dados dos Artigos sempre que uma edio carregada, usamos a seguinte configurao: public class EdicaoOverride : IAutoMappingOverride<Edicao> { public void Override(AutoMapping<Edicao>mapping) { mapping.HasMany(e => e.Artigos) .Not.LazyLoad(); } }

Neste caso estamos a indicar que quando uma Edicao carregada, os Artigos tambm o so. A forma de carregar os dados varia entre trs opes: select (comportamento por omisso), subselect e join. Quando usado o select, por cada entidade com a relao efectuado um select base de dados. Este o comportamento que existe por omisso e quer dizer que continuamos com um problema de Select N+1: Quando usado o subselect, por cada query ou entidade obtida da base de dados efectuado outro query que obtm os dados necessrios para popular as relaes. Este comportamento interessante nas relaes de muitos para muitos, como a entre Artigos e Autores. Se ns tivermos o seguinte query: Foreach ( var artigo in session.QueryOver<Artigo>() .Where(a => a.Id < idQuartoArtigo).List()) { var autores = artigo.Autores.Select(a => a.Nome); Console.Out.WriteLine( "Artigo {0} com autores {1}", artigo.Titulo, string.Join(", ", autores.ToArray())); }

Os queries gerados por omisso so 4:

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido
No entanto, se configurarmos a relao com um fetch por subselect passamos a ter apenas dois queries: SELECT TOP ( 2 /* @p0 */ ) this_.DataEdicao as DataEdicao3_1_, this_.TemaDeCapa_id as TemaDeCapa2_3_1_, artigos2_.Edicao_id as Edicao3_3_, artigos2_.Id as Id3_, artigos2_.Id as Id0_0_, artigos2_.Titulo as Titulo0_0_ FROM [Edicao] this_ left outer join [Artigo] artigos2_ on this_.DataEdicao = artigos2_.Edicao_id Neste caso o select que popula os autores filtrado pelo primeiro query atravs de um subselect: SELECT autores0_.Artigo_id as Artigo4_1_, autores0_.Id as Id1_, autores0_.Id as Id1_0_, autores0_.Nome as Nome1_0_, autores0_.Email as Email1_0_ FROM [Autor] autores0_ WHERE autores0_.Artigo_id in (SELECT this_.Id FROM [Artigo] this_ WHERE this_.Id < 1922 /* @p0 */)

Neste caso como feito o carregamento imediato dos artigos atravs de um join, vamos ter edies repetidas quando uma edio tem mais que um artigo. Como tal, esta opo no aconselhada na maioria dos casos, sendo prefervel configurar o carregamento de dados por query em vez de forma geral. Configurado por relao no mapeamento tem tambm a desvantagem de carregar os dados mesmo que no sejam usados. Como tal, estas solues so pouco flexveis, visto assumirem que se pretende sempre os mesmos dados relacionados com as entidades em todos os casos de uso. Para maior flexibilidade a soluo acaba por passar por indicar no query quais as coleces que se pretende carregar imediatamente: foreach (var artigo in session.QueryOver<Artigo> ().Fetch(a => a.Autores).Eager.List()) { Console.Out.WriteLine( "Artigo {0} com autores {1}", artigo.Titulo, string.Join(", ", artigo.Autores.Select( a => a.Nome).ToArray())); } Aqui estamos a indicar que queremos carregar a coleco Autores do Artigo juntamente com o artigo. O sql gerado usa joins para obter os dados das entidades relacionadas: SELECT this_.Id as Id0_1_, this_.Titulo as Titulo0_1_, autores2_.Artigo_id as Artigo4_3_, autores2_.Id as Id3_, autores2_.Id as Id1_0_, autores2_.Nome as Nome1_0_, autores2_.Email as Email1_0_ FROM [Artigo] this_ left outer join [Autor] autores2_ on this_.Id = autores2_.Artigo_id

Reduz o nmero de queries efectuadas base de dados, no entanto necessita que a base de dados suporte este mecanismo. Quando usado o join, como o nome indica, os dados da coleco so obtidos ao mesmo tempo que as entidades atravs de um join. Para o cdigo mencionado anteriormente passamos a ter apenas um query: SELECT this_.Id as Id0_1_, this_.Titulo as Titulo0_1_, autores2_.Artigo_id as Artigo4_3_, autores2_.Id as Id3_, autores2_.Id as Id1_0_, autores2_.Nome as Nome1_0_, autores2_.Email as Email1_0_ FROM [Artigo] this_ left outer join [Autor] autores2_ on this_.Id = autores2_.Artigo_id WHERE this_.Id < 2225 /* @p0 */ necessrio ter em ateno a forma como se usa estas funcionalidades gerais de eager-loading. Por exemplo, ao configurar a coleco de Artigos de uma Edicao para ser automaticamente obtida por join, o seguinte cdigo pode ter um resultado inesperado: foreach (var edicao in session.QueryOver<Edicao> ().Take(2).List()) { Console.Out.WriteLine("Edicao {0} ", edicao.DataEdicao); } primeira vista deveramos obter duas edies distintas. E em muitos casos isso que temos. No entanto ocasionalmente encontramos edies duplicadas, e ao olharmos para o sql gerado vemos qual o problema:

Se olharmos para os mtodos Get e Load, no temos nenhuma forma de configurar eager-loading nesses casos.

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido
Como tal, a forma de o fazer com uma query por id, configurando ai que relaes que pretendemos carregar logo: foreach (var artigo in session.QueryOver<Artigo> () .Where(a => a.Id == idTerceiroArtigo) .Fetch(a => a.Autores).Eager.List()) { var autores = artigo.Autores.Select( a => a.Nome).ToArray(); Console.Out.WriteLine( "Artigo {0} com autores {1}", artigo.Titulo, string.Join(", ", autores)); } Neste caso tambm podemos vir a ter o problema de entidades duplicadas. No entanto como o carregamento feito por query, podemos fazer o tuning em cada caso de uso, de acordo com as necessidades reais. Mais frente neste artigo vamos ver uma forma mais correcta e menos dada a erros de resolver este problema, fazendo o carregamento de dados de forma fcil e rpida. BatchSize o nmero de instncias de uma relao que so carregadas em simultneo em vez de separadas. Configurado desta forma, o seguinte cdigo: foreach (var artigo in session.QueryOver<Artigo> ().List()) { var autores = artigo.Autores.Select( a => a.Nome); Console.Out.WriteLine( "Artigo {0} com autores {1}", artigo.Titulo, string.Join(", ", autores.ToArray())); } Passa de :

Batch fetching
Outra forma de reduzir o nmero de vezes que efectuamos chamadas base de dados configurar relaes com batchfetching. Esta uma configurao que apenas pode ser feita no mapeamento, por oposio a eager-loading que tambm pode ser feita por query. Nestes casos, quando NHibernate detecta um acesso coleco, ele procura mais entidades dentro da mesma sesso que tenham essa relao e carrega os dados em conjuntos de N, reduzindo o nmero de chamadas base de dados. uma forma simples de melhorar performance, em particular se o tamanho dos conjuntos for similar ao tamanho das pginas de dados que apresentamos ao utilizador caso em que reduzimos significativamente o nmero de queries: uma para obter as entidades raiz, e uma por cada coleco que acedemos. Para tal, usando FluentNHibernate, apenas precisamos de declarar um override para a entidade e indicar que a relao tem um BatchSize do tamanho que pretendemos. public class ArtigoOverride : IAutoMappingOverride<Artigo> { public void Override(AutoMapping<Artigo> mapping) { mapping.HasMany(a => a.Autores) .BatchSize(10); } } Para:

Como podemos ver, em vez de uma chamada para obter o artigo e uma para cada autor, apenas fazemos uma chamada para obter o artigo, e outra para carregar os autores em batch.

Futures
Existe tambm o caso em que se pretende obter vrios dados que no esto relacionados entre si. Este caso acontece frequentemente quando uma pgina ou ecr mostra dados provenientes de vrias tabelas ou componentes do software, como um ecr de resumo, ou uma caixa de informao geral da aplicao. Se quisermos mostrar numa pgina um ndice de edies com nmero de artigos em cada uma, um ndice com os artigos da edio actual e um artigo em destaque com autores, a soluo mais directa passa por fazer trs queries separados, resultando em trs round-trips base de dados:

10

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido
var edicoes = session.QueryOver<Edicao>() .List(); var edicaoComArtigos = session .QueryOver<Edicao>() .Fetch(e => e.Artigos).Eager .WithSubquery.WhereProperty(e => e.DataEdicao) .In(QueryOver.Of<Edicao>() .Select(e => e.DataEdicao) .OrderBy(e => e.DataEdicao).Desc.Take(1)) .SingleOrDefault(); var artigoComAutor = session.QueryOver<Artigo>() .Where(a => a.Id == idTerceiroArtigo) .Fetch(a => a.Autores).Eager .SingleOrDefault(); foreach (var edicao in edicoes) { Console.Out.WriteLine( "Edicao {0} ", edicao.DataEdicao); } var artigos = edicaoComArtigos.Artigos.Select(a => a.Titulo).ToArray(); Console.Out.WriteLine( "Edicao {0} - Artigos {1}", edicaoComArtigos.DataEdicao, string.Join(", ", artigos)); var autores = artigoComAutor.Autores.Select(a => a.Nome).ToArray(); Console.Out.WriteLine( "Artigo {0} com autores {1}", artigoComAutor.Titulo, string.Join(", ", autores)); Usando a ferramenta NHProf para ver os pedidos que so feitos base de dados, vemos que so feitos 3 pedidos distintos: var edicoes = session.QueryOver<Edicao>() .Future(); var edicaoComArtigos = session .QueryOver<Edicao>() .Fetch(e => e.Artigos).Eager .WithSubquery.WhereProperty(e => e.DataEdicao) .In(QueryOver.Of<Edicao>() .Select(e => e.DataEdicao) .OrderBy(e => e.DataEdicao) .Desc.Take(1)) .FutureValue(); var artigoComAutor = session.QueryOver<Artigo>() .Where(a => a.Id == idTerceiroArtigo) .Fetch(a => a.Autores).Eager .FutureValue<Artigo>(); foreach (var edicao in edicoes) { Console.Out.WriteLine( "Edicao {0} ", edicao.DataEdicao); } var artigos = edicaoComArtigos.Value .Artigos.Select(a => a.Titulo) .ToArray(); Console.Out.WriteLine( "Edicao {0} - Artigos {1}", edicaoComArtigos.Value.DataEdicao, string.Join(", ", artigos)); var autores = artigoComAutor.Value.Autores.Select (a => a.Nome).ToArray(); Console.Out.WriteLine( "Artigo {0} com autores {1}", artigoComAutor.Value.Titulo, string.Join(", ", autores));

Na realidade podemos diferir a definio das operaes de acesso a dados da sua execuo. Podemos ter assim uma fase de preparao, onde se criam os queries que se pretendem fazer, e uma segunda fase onde se mostram os resultados. Desta forma, podemos preparar todos os queries e de uma s vez fazer todos os pedidos base de dados. este comportamento que os Futures nos permitem. A alterao ao cdigo mnima. Usamos Futures em vez de List, e FutureValue em vez de SingleOrDefault:

Desta forma, podemos preparar todos os queries e de uma s vez fazer todos os pedidos base de dados.
Enquanto os queries anteriores retornavam logo uma lista, o resultado de um Future ou de um FutureValue apenas a promessa de que no futuro quando precisarmos dos dados eles estaro l.

11

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido
O que o NHibernate faz registar internamente todos os Futures pedidos. Assim que um concretizado (quer por iterar sobre um IEnumerable de um Future, quer por aceder ao valor de um FutureValue), so enviados todos os queries registados para a base de dados e obtidos os resultados de uma s vez. O sql gerado exactamente o mesmo, mas foi todo enviado na mesma chamada, minimizando assim os problemas de latncia no acesso aos dados. Vemos ento que em vez de trs chamadas distintas fazemos apenas uma chamada que retorna trs conjuntos de resultados diferentes: Fazemos o eager-loading de todas as relaes, resultando num query com um nmero elevado de joins: Usamos Futures para carregar em queries diferentes relaes diferentes da mesma entidade. A terceira opo acaba por ser a que obtm tipicamente melhores resultados e concretizada da seguinte forma: var edicao = session.QueryOver<Edicao>() .Where(e => e.DataEdicao == dataEdicao) .Fetch(e => e.Artigos).Eager.FutureValue(); session.QueryOver<Edicao>() .Where(e => e.DataEdicao == dataEdicao) .Fetch(e => e.Patrocinadores) .Eager.FutureValue(); var artigos = edicao.Value .Artigos.Select(a => a.Titulo).ToArray(); Console.Out.WriteLine( "Edicao {0} - Artigos {1}", edicao.Value.DataEdicao, string.Join(", ", artigos)); var patrocinadores = edicao.Value .Patrocinadores.Select(a => a.Nome) .ToArray(); Console.Out.WriteLine( "Artigo {0} com autores {1}", edicao.Value.DataEdicao, string.Join(", ", patrocinadores));

De reparar que por omisso o Future assume que se retorna uma lista de entidades sobre as quais estamos a fazer o QueryOver, e o FutureValue assume que se retorna uma entidade. Como vamos ver mais frente com projeces, tambm possvel obter instncias que no as indicadas inicialmente como argumento de tipo ao QueryOver. Esta funcionalidade tem a grande vantagem de poder reduzir grandemente o nmero de chamadas base de dados com alteraes mnimas ao cdigo. Outro caso de uso prende-se com o carregamento de vrias relaes da mesma entidade. Assumindo que a classe Edicao passa a ser a seguinte: public class Edicao { public virtual DateTime DataEdicao {get;set;} public virtual Artigo TemaDeCapa {get;set; } public virtual IList<Artigo> Artigos{get;set;} public virtual IList<Patrocinador> Patrocinadores { get; set; } } public class Patrocinador { public virtual int Id { get; set; } public virtual string Nome { get; set; } }

Saliente-se que usamos apenas o valor do primeiro QueryOver. O segundo apenas usado para carregar os dados da coleco de forma indirecta. Isto possvel uma vez que o NHibernate implementa um identity map dentro da sesso. Quando acedemos ao valor do primeiro Future despoletamos todos os Futures registados at ao momento na sesso. Ao concretizar os objectos resultantes do segundo query, o NHibernate encontra a entidade j na sesso e preenche a coleco que foi carregada com os dados desse query, que incluem a relao Patrocinadores. Desta forma conseguimos popular as relaes necessrias apenas com uma chamada base de dados e um conjunto pequeno de queries com apenas um join cada um:

Se ns pretendemos mostrar uma edio com todos os artigos e todos os patrocinadores, temos vrias hipteses: Aproveitamos o lazy-loading e fazemos vrios pedidos base de dados:

12

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido Como reduzir o tamanho de cada chamada
At agora trabalhamos com as entidades completas. No entanto existem muitas operaes ou casos de uso que necessitam apenas de parte das entidades ou de dados agregados. Ir buscar todos os artigos de uma edio quando apenas pretendemos uma contagem de artigos da edio improdutivo quando podemos fazer esses clculos directamente na base de dados e obter apenas os dados que precisamos. Para este efeito usamos projeces em conjunto com transformadores. Count, Max, Aggregate Os casos mais simples so aqueles em que pretendemos obter um valor resultante de uma query: var edicaoMaisAntiga = session.QueryOver<Edicao> ().Select(Projections .Min<Edicao>(e => e.DataEdicao)) .SingleOrDefault<DateTime>(); Neste caso estamos a seleccionar o identificador da edio mais recente, e obter o numero de artigos dessa edio. Viewmodels O segundo caso de uso que exemplifico para projeces prende-se com situaes onde temos uma ou varias entidades com um nmero grande de campos e onde necessitamos apenas de parte dos campos, ou de dados agregados em conjunto com alguns campos. Da mesma forma que projectamos um valor de um resultado de um query podemos tambm projectar uma lista de valores: IList<Artigo> artigos = null; var edicoes = session.QueryOver<Edicao>() .JoinQueryOver( e => e.Artigos, () => artigos, JoinType.LeftOuterJoin) .SelectList( q => q.SelectGroup(e =>e.DataEdicao) .SelectCount(e => e.Artigos) ) .List<object[]>(); foreach (var edicao in edicoes) { Console.Out.WriteLine( "Edicao {0} com {1} artigos", edicao[0], edicao[1]); }

Neste caso estamos a procurar o valor mnimo de todas as datas de edio. Como este query devolve um valor do tipo DateTime, precisamos de indicar isso atravs do argumento de tipo do mtodo SingleOrDefault. claro que podemos usar um Future para os casos em que pretendemos obter vrios valores sem ter a penalizao de vrias chamadas base de dados: var edicaoMaisRecente = session.QueryOver<Edicao> ().Select(Projections .Max<Edicao>(e => e.DataEdicao)) .FutureValue<DateTime>();

Neste caso estamos a projectar a data de edio e o nmero de artigos que aparecem para cada edio. O sql gerado no tem surpresas: SELECT this_.DataEdicao as y0_, count(this_.DataEdicao) as y1_ FROM [Edicao] this_ inner join [Artigo] artigos1_ on this_.DataEdicao = artigos1_.Edicao_id GROUP BY this_.DataEdicao

Outra situao onde projeces so teis em subqueries, onde podemos projectar um valor para usar numa condio: Artigo artigo = null; var numeroArtigosEdicaoMaisRecente = session .QueryOver<Edicao>() .WithSubquery .WhereProperty(e => e.DataEdicao) .In(QueryOver.Of<Edicao>() .Select(e => e.DataEdicao) .OrderBy(e => e.DataEdicao).Desc.Take(1)) .JoinQueryOver(e => e.Artigos, () => artigo) .SelectList(q => q.SelectCount(() => artigo.Id)) .FutureValue<int>();

No entanto o acesso aos dados projectados torna-se propcio a erros, visto retornar uma lista de vectores de objectos. Seria muito mais fcil se pudssemos usar uma classe intermdia que armazenasse os campos obtidos. E tal possvel recorrendo a aliases e a um ResultTransformer.

13

TEMA DA CAPA
NHibernate - Tcnicas para software melhor e mais rpido
Com a seguinte classe: public class EdicaoComNumeroArtigos { public virtual DateTime DataEdicao {get;set;} public virtual int NumeroArtigos {get;set;} } Utilizamos expresses para indicar os nomes dos campos, sendo que na realidade o que o NHibernate faz apenas associar nomes dos campos projeco. Depois o transformador AliasToBean que tem o trabalho de para cada campo retornado do query procurar uma propriedade com um setter pblico e colocar o valor do campo nessa propriedade. Isto quer dizer que possvel indicar nomes invlidos ou ter outros problemas semelhantes nos queries, no entanto so erros facilmente detectados com testes de integrao que correm o query, visto o NHibernate identificar logo as irregularidades. Podemos alterar o query anterior para associar um alias a cada um dos campos e transformar os resultados em instncias da classe EdicaoComNumeroArtigos: IList<Artigo> artigos = null; EdicaoComNumeroArtigos viewModel = null; var edicoes = session.QueryOver<Edicao>() .JoinQueryOver( e => e.Artigos, () => artigos, JoinType.LeftOuterJoin) .SelectList(q => q.SelectGroup( e => e.DataEdicao) .WithAlias(() => viewModel.DataEdicao) .SelectCount(e => e.Artigos).WithAlias (() => viewModel.NumeroArtigos) ) .TransformUsing (Transformers.AliasToBean<EdicaoComNumeroArtigos> ()) .List<EdicaoComNumeroArtigos>(); foreach (var edicao in edicoes) { Console.Out.WriteLine( "Edicao {0} com {1} artigos", edicao.DataEdicao, edicao.NumeroArtigos); }

Concluso
Neste artigo analisamos algumas opes e funcionalidades que nos permitem melhorar as caractersticas de performance das nossas aplicaes, quer por um carregamento mais inteligente dos dados, como pela reduo do tamanho de dados que transferido da base de dados para a aplicao. Existem ainda algumas funcionalidades que no foram mencionadas, como interceptores, filtros, cache de segundo nvel e concorrncia optimista.

Ver artigo Revista PROGRAMAR - edio 30 de Agosto 2011: NHibernate - do Import Package primeira iterao

AUTOR
Bruno Lopes fez o curso de Engenharia Informtica no IST, e neste momento conta com mais de 5 anos de experincia profissional em IT, em particular nas reas de desenvolvimento de software web-based. Actualmente co-fundador da weListen Business Solutions, trabalhando no produto InnovationCast, e participa activamente na comunidade NetPonto, apresentando temas como NHibernate, RavenDB ou IoC. Tem blog em http://blog.brunomlopes.com, twitter em @brunomlopes e linkedin em http://pt.linkedin.com/in/brunomlopes

14

Elege o melhor artigo desta edio Revista PROGRAMAR


http://tiny.cc/ProgramarED31_V

A PROGRAMAR
Gerao de nmeros aleatrios (Parte 1) Diferenas ao Desenvolver em Windows Azure Programao Orientada a Objectos em Java 6 DataBinding em Silverlight 4

A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 1)
A partir deste artigo, sero apresentadas em quatro partes, informaes sobre a gerao de nmeros aleatrios ou random number generator em computadores. So muitos os mtodos existentes para a gerao de nmeros aleatrios. Podendo-se destacar: o mtodo do meio do quadrado (tema deste artigo), o mtodo produto do meio, o randu e o mtodo linear congruente. INTRODUO As discusses sobre gerao de nmeros aleatrios originam-se a partir das ideias dos filsofos gregos Demkritos e Epikurus, indicado por Silveira (2001) ao mostrar as propostas de: aleatoriedade objetiva, proposta por Epikurus, que afirma existir na Natureza o aleatrio verdadeiro, o qual ocorre a partir do desconhecimento das causas; aleatoriedade subjetiva, proposta por Demkritos, que afirma ser a Natureza determinista, onde tudo ocorre devido a uma causa. Para Doricio (1998) no existe o que se possa chamar de nmero aleatrio, o que corrobora com a afirmao indicada por Schildt (1990), ao dizer que o termo gerao de nmeros aleatrios um absurdo. Apesar da concordncia, ou no, sobre este tema, os computadores eletrnicos de alguma forma produzem sequncias de valores numricos, chamados nmeros aleatrios, a partir de duas abordagens: gerao de nmeros pseudo-aleatrios (PRNG Pseudo-Random Number Genarator); gerao de nmeros verdadeiramente aleatrios (TRNG True Ramdom Number Generator). O mecanismo PRNG a forma mais comum encontrada nos computadores eletrnicos. A palavra pseudo sugere, neste contexto, o uso de valores numricos que no so gerados de forma aleatria, uma vez que so obtidos por meios artificiais a partir de algoritmos matemticos elaborados para esta finalidade. O mecanismo TRNG no comum ou de fcil acesso (os equipamentos para esta finalidade so muito caros para utilizadores menos cientficos), uma vez que os valores chamados aleatrios so obtidos a partir de fenmenos oriundos da natureza, como: rudos ambientais, alteraes climticas, entre outros fenmenos. A gerao de nmeros aleatrios, sejam PRNG ou TRNG, so necessrias em vrios tipos de aplicao, destacando-se algumas, como as apontadas por Doricio (1998) e Zenil (2011): simulao aplicao de modelos cientficos na simulao de fenmenos naturais; amostragem aplicao de modelos cientficos baseados numa parte menor de um todo maior, que ser analisada; anlise numrica aplicao de modelos determinsticos numricos para a economia de tempo de computao; programao de computadores aplicao de valores aleatrios para testes de eficincia algortmica computacional; teoria de deciso auxiliar a tomada de deciso com base na escolha aleatria de dados; recreao aplicao em jogos de azar. A gerao de nmeros pseudo-aleatrios depende da escolha adequada dos parmetros usados para a gerao do nmero em si. Um desses parmetros, que merece ateno, o chamado semente (DIAS, 2005), o qual caracterizado por ser o valor inicial a ser usado para a gerao dos demais valores aleatrios subsequentes por meio de algum algoritmo especfico para esta finalidade. Segundo Dias (2005) a escolha da semente deve ser realizada com muito cuidado, pois a utilizao de uma mesma semente [] entre diferentes aplicaes [] pode ocasionar erros bastante comuns que levam a concluses que podem representar de forma incorreta o comportamento dessas aplicaes. Para a gerao de nmeros pseudo-aleatrios existe de um grande conjunto de algoritmos. Neste estudo, em particular apresentado o mtodo do meio do quadrado.

MTODO DO MEIO DO QUADRADO


A gerao de nmeros pseudo-aleatrios a partir do mtodo do meio do quadrado (middle square method) foi propostao em 1946 por John von Neumann, sendo este algoritmo considerado o primeiro mtodo de gerao de nmeros aleatrios (GIORDANO, FOX, WEIR, 2009 p.184; TRN, 2001). No mtodo do meio do quadrado, foi proposto por Von Neumann, o uso de um valor semente que, elevado ao quadrado, gera um resultado. Desse resultado retirado do

17

A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 1)
meio um nmero com o mesmo tamanho em dgitos, do valor usado para a semente. A partir do novo valor repete-se a operao para a obteno de um novo valor e assim por diante (TRN, 2001; WHELAN, 2011; STUBBE, 2011). Apesar de engenhoso, o mtodo apresenta algumas falhas. Segundo Knuth (KNUTH, 1969 p. 4), vrias pessoas fizeram uso do mtodo do meio do quadrado no incio da dcada de 1950 tendo sido utilizadas sementes com tamanho de quatro dgitos, sendo este o tamanho de semente mnimo recomendado. Descobriu-se que alguns valores levam a sequncias infinitas de gerao de valores pseudo-aleatrios, ao apresentarem valores como: 6100, 2100, 4100 e 8100. A partir da, o clculo do meio do quadrado efetua a repetio infinita da mesma sequncia. Descobriu-se tambm, que alguns valores usados levam obteno de valor zero como resultado do meio do quadrado, impossibilitando a continuidade do uso do mtodo, tais como os mltiplos de 1000 para as sementes de quadro dgitos. Um bom gerador de nmeros aleatrios deve gerar sequencias infinitas, sem resultar em zero. No deve repetir valores em sequncias. No entanto, para aplicaes que no requerem grande grau de preciso o mtodo do meio do quadrado pode ser til. t = tamanho em dgitos do quadrado de N: t = tamanho(N2). tqd = tamanho em dgitos do quadrado de N, sua obteno depende de algumas condies. SE ((d par) .E. (t impar)) .OU. ((d impor) .E. (t impar)) Acrescentar 00 esquerda de tqd SENO SE (d par) .E. (t par) ENTO Manter tqd como est tq = tamanho em dgitos do valor gerado para tqd.
SE (t impar) ENTO tq = d.2+1 SENO

m = posio inicial para extrao do quadrado do meio a partir da quantidade de dgitos tqd.

Tomando-se por como base o valor de semente 5678 (quatro dgitos de tamanho) e elevando-se este valor ao quadrado, obter-se- como resultado o valor 32239684 (oito dgitos de tamanho). Do quadrado obtido so retirados os quatro dgitos do meio desse quadrado. Assim sendo, do ao valor 32239684 tira-se o valor 2396.

ns = valor da prxima semente (valor pseudo-randmico gerado) aps extrao do quadrado do meio.

Na sequncia, a partir do valor 2396 calcula-se o seu quadrado, que resultar no valor 5740816 (sete dgitos de tamanho). No entanto, este segundo quadrado possui sete dgitos de tamanho e devido a isto necessita ser equacionado para que possua oito dgitos. Assim, basta acrescentar um valor zero esquerda do quadrado, de forma que fique assim representado 05740816. Deste ajuste, pega -se nos quatro dgitos do meio, que neste caso o valor 7408 e prossegue-se com a aplicao da tcnica de forma sequencial at o ponto desejado ou quando o meio do quadrado for 0000.

Com base no algoritmo do mtodo do meio do quadrado proposto por von Neumann e das etapas conjugadas , possvel obter os valores indicados na Tabela 1 a partir do fornecimento de uma semente que tenha entre 4 e 7 dgitos de tamanho.

O tamanho mximo em dgitos para a semente deve ser 5 para valores de 32 bits ou 15 para valores de 64 bits.

(d)

ALGORITMO DO MEIO DO QUADRADO A aplicao do mtodo pode ser efetivada a partir do algoritmo seguinte: N = entrada do nmero que representa a semente (> que 4 mx: 5 p/ 32 bits | 15 p/ 64 bits). d = tamanho em dgitos do valor N: d = tamanho(N).

4 5 6 7

(t ) 7 8 9 10 11 12 13 14

(tqd) 09999999 99999999 00999999999 09999999999 099999999999 999999999999 009999999999999 099999999999999

(tq) 8 11 12 15

(m) 3

(ns) 8 3,4 11

4 4,5 12 4 4,6 15 5 5,7

18

A PROGRAMAR
GNA - GERAO DE NMEROS ALEATRIOS (Parte 1)
CONCLUSO Neste artigo foi apresentado o mtodo de gerao de nmeros pseudo-aleatrios meio do quadrado, que considerado por vrios especialistas da rea da computao como sendo um mtodo no eficiente. No entanto, prefervel ter possuir em mos um mtodo no eficiente de gerao de nmeros aleatrios do que no possuir absolutamente nenhum mtodo. claro que para uma aplicao que exija maior preciso, ser necessrio considerar algum outro mtodo. No prximo artigo ser discutido o mtodo quadrado do meio, que uma variao do mtodo apresentado nesta parte. SCHILDT, H. Turbo C Avanado: Guia do Usurio. Rio de Janeiro: McGraw-Hill, 1990. 475 p. SILVEIRA, J. F. P. da. Tipos de Aleatori-edade. Rio Grande do Sul: Universidade Federal do Rio Grande do Sul, Departamento de Matemtica. 2001. Disponvel em: <http://bit.ly/ r2YYis> . Acesso em: 29 jun. 2011, 11:50:23. STUBBE, J. An Introduction to Random Number Generation and Simulation. cole Polytechnique Fdrale de Lausanne. Disponvel em: http://bit.ly/nvkNaP. Acesso em: 1 jul. 2011, 08:59:12. TRN, A. Probabilistic Algorithms: Spring 2001 Course. bo Akademi University: Department of Computer Science. 2001. Disponvel em <http://bit.ly/qYxYkQ>. Acesso em: 1 jul. 2011, 08:27:32.

BIBLIOGRAFIA
DIAS, G. N. A Influncia da Semente na Gerao de Seqncias de Nmeros Aleatrios atravs de Geradores de Nmeros (Pseudo) Aleatrios. Rio de Janeiro: Universidade Federal do Rio de Janeiro. 2005. Disponvel em: <http://bit.ly/ qznXtW>. Acesso em: 29 jun. 2011, 10:52:35. DORICIO, J. L. Nmero Aleatrios e Apli-caes. So Paulo: Universidade Federal de So Carlos, Departamento de Matemtica. 1998. GIORDANO, F. R.; FOX, W.F. & WEIR, M. D. A first course in mathematical modeling. 4. ed. California Books/Cole. P. 184, 2009. KNUTH, D. E. The Art of Computer Pro-gramming: series in computer science and information processing. 2d ed. Indiana: Addison-Wesley. 1981. REYS, A. E. L.; MACHADO, A. A.; FERREIRA, D. F.; DEMTRI, C. B. & RIBEIRO, P. J. Sistema Galileu de Educao Estatstica. So Paulo: Universidade de So Paulo, ESALQ. 2011. Disponvel em: http://bit.ly/q5jbT8 . Acesso em: 1 jul. 2011, 08:17:25.

WHELAN, S. F. Models - Stochastic Models. University College Dublin, School of Ma-thematical Sciences. Disponvel em: http://bit.ly/nIy2nT Acesso em: 1 jul. 2011, 08:39:54. ZENIL, H. John von Neumann's First Pseudorandom Number Generator Pseu-dorandom Number Generator. Champaign: Wolfram Demonstrations. 2011. Disponvel em < http:// bit.ly/6C7Q5 JohnVonNeumannsFirstPseudorandomNumberGenerator>. Acesso em: 15 ago. 2011, 08:23:56.

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

19

A PROGRAMAR
Programar para Windows Azure
O Windows Azure uma plataforma de alta disponibilidade e alta escalabilidade que fornecida como servio e tem por isso algumas caractersticas diferentes em relao s plataformas alvo tradicionais. Neste artigo vamos tentar alertar o leitor para alguns detalhes que encontramos em Windows Azure Compute, SQLAzure e Windows Azure Storage bem como alguns cuidados que deveremos ter quando desenvolvemos para estes servios. Capacidade VS Quantidade Em Windows Azure podemos escalar horizontalmente adicionando mais mquinas virtuais ou escalar verticalmente usando mquinas virtuais de maior capacidade. Dependendo do tipo de aplicao e da carga de trabalho que cada aplicao, dever ser escolhida a quantidade e capacidade das instncias de modo a optimizar os custos e desempenho. A deciso poder ser tomada tendo por base algumas das seguintes caractersticas: Maior capacidade Comunicao mais rpida e mais barata entre processos (mesma mquina) Pode sair mais barato nos casos em que se usam muito Queues porque podemos fazer Queue.GetMessages(32) e processar em paralelo Mquinas com maior capacidade tm uma maior e mais consistente performance de I/O Maior quantidade Permite uma escalabilidade mais granular e consequentemente mais barata Maior tolerncia a falhas. A falha de uma mquina virtual tm menor impacto Temos que usar Azure Storage para comunicar entre processos Local Storage Cada instncia de Windows Azure Compute representa um servidor virtual. Apesar de muitos dos recursos serem dedicados a essa instncia em particular, alguns recursos associados performance de I/O, tais como largura de banda e disco rgido, so partilhados entre as instncias presentes na mesma mquina fsica. Durante os perodos em que os recursos partilhados esto a ser muito utilizados poderemos ver a performance de I/O baixar para os nveis mnimos anunciados mas, em contrapartida, sempre que os recursos partilhados tiverem um nvel de utilizao inferior veremos essa performance aumentar. Quanto maior for o tamanho da instncia maior ser a performance mnima de I/O e consequentemente essa performance ser tambm mais consistente ao longo do tempo.

Windows Azure Compute


I/O Performance Existem cinco tipos de instncias de Windows Azure Compute que permitem a execuo de vrias cargas de trabalho e aplicaes com vrios nveis de complexidade. Tamanho da Extra Small Small Medium Large Extra large CPU
Memria Local Storage Largura de Banda

1.0 GHz 1.6 GHz 2 x 1.6 4 x 1.6 GHz 8 x 1.6 GHz

768 MB 1.75 GB 3.5 GB 7 GB 14 GB

20 GB 225 GB 490 GB 1,000 GB 2,040 GB

5 Mbps 100 Mbps 200 400 Mbps 800 Mbps

O Fabric Controller pode a qualquer momento destruir a mquina virtual e substituir por uma nova. Isso pode acontecer, por exemplo, sempre que seja detectado falhas na aplicao, falhas no hardware, ou simplesmente porque precisa de realizar actualizaes ao sistema operativo. Por essa razo a informao armazenada em local storage considerada voltil. Esta situao dever ser levada em conta, principalmente nos casos em que existe migrao de aplicaes para o Windows Azure. Algumas aplicaes desenhadas para correr apenas num servidor usam local storage para guardar alguns ficheiros de forma persistente.

21

A PROGRAMAR
Programar para Windows Azure
Como j vimos, em Windows Azure essa informao considerada voltil. Em contrapartida a migrao de aplicaes desenhadas para executar em web farms normalmente no apresentam este problema. Outro alerta em relao ao uso de local storage tem a ver com a visibilidade da informao. Tudo o que for escrito para local storage s vai ser visto pela instncia actual. Estamos a desenvolver para um ambiente altamente escalvel e na maioria dos casos manter a informao privada no a melhor opo. Existem casos em que vantajoso fazer cache local de alguns dados mas na maioria dos cenrios deve ser usado um tipo de storage persistente e partilhado.

No entanto existem algumas diferenas entre as quais se destacam as seguintes:


No existe Backup e Restore Uma das funcionalidades que ainda no existe em SQLAzure a capacidade de realizar backup ou restore de uma base de dados. Apesar do estarmos na presena de um servio de alta disponibilidade onde no existe a preocupao com a perca de informao, continuamos a ter que lidar com possveis corrupes nas bases de dados devido a erros nas aplicaes. No existe cross-database querying Em SQL Azure ns temos a capacidade de alugar bases de dados e no servidores de bases de dados. No existe garantia que todas as bases de dados que alugamos esto no mesmo servidor. A ideia principal que deveremos reter neste caso que no existe conectividade entre bases de dados. Se for necessrio combinar resultados de mais do que uma base de dados teremos que resolver essa questo na aplicao. Deveremos realizar as consultas a todas as bases de dados e depois, na aplicao, agregar os resultados. Analysis Services, Replication e Service Broker no esto disponveis como servio Apesar de estes servios ainda no estarem disponveis possvel usar SQL Azure como fonte de dados para a verso on-premisses de Analysis Services e Integration Services. No suporta Database Mirroring ou Failover Clustering Devido s caractersticas de alta disponibilidade do servio SQL Azure os servios de suporte a alta disponibilidade da verso on-premisses tais como database mirroring e failover cluster no so necessrios e no esto disponveis. Clustered Indexes so obrigatrios Todas as tabelas em SQL Azure necessitam de um ter um clustered index. Um clustered index um tipo de ndice especial que ordena a forma como os registos so gravados fisicamente. Esta uma das primeiras preocupaes na migrao de bases de dados para SQLAzure. No existe integrao com CLR

Roles
As instncias so pagas por hora de relgio As instncias so facturadas com base nas horas de relgio em que estiveram implementadas. As horas parciais sero facturadas como horas completas. Aps esta frase podermos ficar a pensar que se for usada uma instncia durante 30 minutos ser facturada 1 hora, mas este pensamento pode no ser verdade. Se fizer deployment de uma instncia s 16h50 e parar essa instncia s 17H10 ir pagar duas horas. Uma hora pela utilizao entre as 16h50 e as 17H00 e outra hora pela utilizao entre as 17h00 e as 17h10. Instncias que estejam implementadas menos de 5 minutos dentro de uma hora no sero contabilizadas. Cada novo deployment conta uma nova hora Deveremos evitar implementar, apagar e voltar a implementar instncias sempre que possvel. Cada nova implementao adiciona uma hora por cada instncia conta. Imagine que implementou uma instncia s 15h10 e parou a mesma s 15h20. Se fizer nova implementao o App Fabric ir arrancar uma nova mquina e ser cobrada uma nova hora completa.

Windows Azure Database


Limitaes O SQLAzure foi desenhado tendo como base o SQLServer sendo por isso natural que partilhe muitas das suas funcionalidades. O SQLAzure suporta mltiplas bases de dados bem como a maioria dos objectos presentes na verso onpremisses tais como tabelas, vistas, procedimentos armazenados, funes, restries (constraints) e triggers.

SQLAzure no suporta CLR. Qualquer base de dados construda usando CLR no ser possvel mover para o SQLAzure sem que se proceda a modificaes.

22

A PROGRAMAR
Programar para Windows Azure
No existe acesso s System Tables Devido a inexistncia de acesso ao hardware que suporta a base de dados em SQLAzure no existe acesso s system tables do SQLServer. Tambm no existe acesso s vistas e procedimentos armazenados do sistema. SQL Azure necessita de SQL Server Management Studio 2008 R2 Para poder aceder a bases de dados atravs do SQLServer Management Studio tem que actualizar para a verso 2008 R2. Apesar de as verses anteriores estabelecerem ligao com o servidor SQL Azure o Object Browser no ir funcionar. Podemos usar a verso gratuita desta ferramenta (SQL Server Management Studio Express 2008 R2). Em relao a custos com Windows Azure Storage, estes so medidos usando as seguintes variveis: Trfego: quantidade de dados transferidos de e para a o servio Transaces: quantidade de pedidos feitos ao servio Capacidade: Quantidade de informao armazenada Trfego O trfego consumido internamente no tem custo associado, ou seja, os dados transferidos entre servios presentes no mesmo datacenter no contam trfego. Trfego que tenha origem ou destino diferente do datacenter onde o storage service foi criado conta trfego, seja ele externo ou at mesmo outro datacenter Azure. Transaces Cada chamada a storage service conta uma transaco e cada transaco tem um custo. Apesar de o custo de cada transaco individualmente ser muito baixo (0.01$/10.000 transaces) deveremos ter esta situao em ateno no desenho das aplicaes porque rapidamente se consegue chegar a cenrios em que o nmero de transaces muito elevado. Alerta-se ainda para o facto de que cada pedido ao storage service conta uma transaco independentemente da origem. Isto significa que os pedidos de servios presentes no mesmo datacenter tambm contam transaces. A maioria dos pedidos ao storage service conta apenas uma transaco mas existem algumas chamadas a mtodos das Storage Client Library que podem resultar em vrias transaces (vrios pedidos): Upload para Blob Storage Procedimentos Armazenados A execuo de procedimentos armazenados no tem custos adicionais. Podemos tirar partido desta situao e usar algum poder de computao do servidor de SQL com o intuito de poupar no nmero de roles necessrios para a execuo da aplicao. De notar que no deveremos abusar destes recursos. Windows Azure Storage Relativamente a Windows Azure Storage vamos tentar perceber alguns dos custos associados a este servio e tentar perceber alguns dos cuidados que devero ser tidos em conta na hora de desenvolver sobre estes servios. Sempre que existe um pedido de upload para Blob Storage de um ficheiro com um tamanho superior a 32Mb a Storage Cliente Library divide automaticamente o pedido em mltiplos blocos de 4Mb. A cada bloco de 4Mb ir corresponder um pedido PutBlock que contar uma transaco cada. Existe ainda um PutBlockList no final que contar tambm uma transaco. O tamanho do bloco poder ser modificado atravs da propriedade CloudBlobClient.WriteBlockSizeInBytes. Consultas a tabelas Sempre que usar a classe CloudTableQuery para realizar consultas a um Azure Table Service ter automaticamente a resoluo de continuations tokens de modo a obter todos os resultados pretendidos.

Nem todos os dados so relacionais Esta afirmao no trs novidade nenhuma mas ganha especial importncia no conceito de Cloud Computing e Windows Azure. O Windows Azure dispe de diferentes suportes ao armazenamento de dados, cada um com as suas caractersticas e custos. Ao afirmar que nem todos os dados so relacionais pretendemos alertar para o facto de que dever ser escolhido o tipo de storage certo para o tipo de dados certo. O servio SQLAzure , relativamente a Azure Storage, um servio mais caro. SQLAzure custa cerca de 10$/GB (7.5/ GB) e TableStorage custa cerca de 0.15$/GB (0,11/GB). Neste sentido, poderemos como exemplo recomendar o armazenamento de imagens em Blob Storage ou a passagem de dados histricos ou dados de auditoria (Logs) da aplicao para Table Storage.

23

A PROGRAMAR
Programar para Windows Azure
Isto significa que sempre que a query retornar um continuation token ir ser lanado automaticamente um pedido dos restantes resultados e como j vimos anteriormente, cada pedido conta uma transaco. Table.SaveChanges Sempre que for realizada uma operao de Add, Update ou Delete sobre um objecto de uma tabela, esse objecto ser adicionado ao datacontext de modo a que, mais frente, esse pedido possa ser enviado ao Table Service. Os pedidos no so enviados imediatemente, so enviados quando for estar constantemente a fazer pooling na queue para detectar a entrada de novas mensagens. Imagine que existe um worker role com duas instncias (de modo cumprir o SLA) a fazer pooling com um intervalo de 1 segundo numa queue. Ao final de um ms haver um custo de mais de 5$ s derivado ao pooling. Poder ser implementado um esquema de espera exponencial para reduzir o nmero de chamadas de pooling queue. O incremento de tempo a esperar por cada chamada a uma queue vazia e o nmero mximo de tempo que esse backoff poder atingir dever ser adaptado tendo em considerao o cenrio para qual a queue est a ser utilizada. Concluso Atravs deste artigo esperamos ter conseguido desafiar o leitor para a necessidade de conhecer em detalhe a arquitectura dos servios e os custos associados de modo a que possa desenhar e desenvolver aplicaes para Windows Azure de forma eficiente e eficaz. Como dica final, no site de billing podemos ver o estado actual da subscrio at ao final do dia de ontem e desta forma ir verificando os custos das nossas aplicaes de modo a no existirem surpresas no final do ms.

chamado o mtodo SaveChangesWithRetries.


Quando esse mtodo chamado as alteraes pendentes so chamadas uma a uma sobre o table service resultando numa transaco cada. Existe no entanto uma excepo a esta situao. Sempre que as alteraes pendentes incidirem numa nica PartitionKey de uma tabela poderemos solicitar que as alteraes sejam efectuadas utilizando apenas um pedido atravs da chamada SaveChangesWithRetries (SaveChangesOptions.Batch). Alm de apenas contar uma transaces, submeter as alteraes pendentes em batch demora menos tempo e garante processamento transaccional (ou todas so aplicadas ou nenhuma aplicada). Queues Cada elemento numa Azure Queue custa 3 transaces Nos casos mais comuns usar uma queue para enviar uma mensagem de um role para outro custa cerca de 3 transaces porque so necessrias as operaes de Put, Get e Delete para processar uma mensagem. Poderemos diminuir o custo cada elemento na queue utilizando a operao GetMessages da Queue Service API para obter e processar at 32 mensagens de uma s vez e assim diminuir o custo at 2,03 transaces por elemento na queue. Usar backoff exponencial para tempos de espera Devido ausncia de notificaes nas queues necessrio

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

24

A PROGRAMAR
Programao Orientada a Objectos em Java 6
O objectivo deste artigo no ensinar os conceitos de POO, nem a programar em Java. Assim a leitura do artigo pressupe que o leitor j saiba os conceitos de POO, e conhea pelo menos a linguagem Java, ou outra de sintaxe semelhante para perceber os exemplos. O objectivo deste artigo referir as melhores prticas e mtodos de programar POO em Java 6. Este cdigo no d nenhum erro de sintaxe, no entanto qualquer programador que perceba o mnimo de Java ver que ao executar a aplicao dar um erro no ciclo. Porque tentar somar uma sequncia de caracteres com um nmero inteiro. Contudo se aplicarmos um cdigo semelhante no Java 6, graas s parametrizaes obteremos um erro de sintaxe. public int exemplo(){ ArrayList<Integer> v = new ArrayList<Integer>(); int soma = 0; v.add(new Integer(2)); v.add("Nome X"); //Aqui dar erro de sintaxe

Parametrizao das Coleces


Antes do Java 5, a maneira de implementao de coleces, por exemplo a classe ArrayList poderia levar inicialmente um int e posteriormente uma String. Assim era fcil que fosse gerado um erro em runtime, quando estivssemos por exemplo, a percorrer a coleco e somar todos os elementos. No entanto agora possvel parametrizar a coleco e dizer para ela s aceitar uma determinada estrutura de dados (ou estruturas descendentes que herdem naturalmente as mesmas propriedades). Assim quando antes poderamos ter no cdigo algo como: public int exemplo() { ArrayList v = new ArrayList(); int soma = 0; v.add(new Integer(2)); v.add("Nome X"); //... Iterator x = v.iterator(); while(x.hasNext()) soma += Integer.parseInt(x.next().toString ()); return soma; }

O ArrayList assim genericamente ArrayList<E>, sendo que o E pode ser substitudo por qualquer classe, mas no por dados de tipos primitivos (como o int, o double), mas isso resolvido de maneira simples, como explicado mais frente na seco AutoBoxing. Podemos aperceber-nos que a grande vantagem das parametrizaes, garantir mais segurana ao programador, de modo a que ele saiba que tipos de coisas esto em vrios locais. O tipo Object d uma sensao de liberdade, porque podemos meter tudo l dentro, algo como o (void *) do C. Contudo deixa uma responsabilidade acrescida ao programador que ter que ter em ateno sempre o que est realmente l dentro para no realizar operaes no permitidas. Pelo contrrio com as parametrizaes possvel saber exactamente que operaes so permitidas sobre a estrutura de dados, porque ao escrever o cdigo sabemos o que l estar. Outra grande vantagem a inexistncia de converses. No primeiro exemplo, depois de obter o valor da lista era necessrio converter para inteiro (e o valor obtido poderia ser inconvertvel para inteiro) e s depois somar. No segundo exemplo, o valor devolvido j do tipo que pretendemos (neste caso um inteiro, o que ns estvamos espera). AutoBoxing Infelizmente os tipos parametrizados no permitem trabalhar com tipos primitivos, algo que extremamente importante. Alis muitos dos problemas requerem vectores de inteiros. Ser que ento a nica soluo trabalhar com os Arrays originais? No. Todos os tipos primitivos possuem a correspondente classe. Por exemplo a classe Integer, corresponde ao tipo primitivo int.

25

A PROGRAMAR
Programao Orientada a Objectos em Java 6
Assim podemos facilmente fazer: ArrayList<Integer> v = new ArrayList<Integer>(); A seguir para adicionar elementos teramos que colocar algo deste gnero: v.add(new Integer(3)); v.add(new Integer(9)); int r = v.get(1).intValue(); O construtor necessrio, uma vez que os tipos no so compatveis. Alis o seguinte exemplo, compilado antes do Java 5 no funcionaria correctamente: int i; Integer j; i = 1; j = 2; i = j; j = i;

Isto porque int um tipo primitivo e Integer um tipo complexo. Logo no possvel fazer uma atribuio de um tipo primitivo para um tipo complexo. Tanto mais que o que est realmente armazenado em j um apontador para uma instncia da classe Integer. Felizmente devido ao AutoBoxing o exemplo a partir de Java 6 funciona perfeitamente, o que nos permite fazer tambm no ArrayList anteriormente criado algo mais simples: v.add(3); v.add(9); int r = v.get(1);

Figura 1: Exemplo do Diamon of Death


Na fig. 1 podemos ver um exemplo em que ambas as classes B e C herdam da classe D. Por sua vez, a classe A herda da B e C simultaneamente. Supondo que a classe D possui o mtodo xpto(), e tanto a classe B como a C na sua implementao reescrevem o mtodo. Supondo que ele chamado no contexto da classe A, e assumindo que ele no reescrito na classe A, ento qual seria o mtodo a ser chamado? O da classe B ou C? Nesse caso temos o famoso Diamante da Morte Como no possvel definir comportamentos nas interfaces, apesar de uma classe poder implementar vrias interfaces, mesmo que ambas possuam mtodos com a mesma assinatura, ele tm que ser definido na classe e esse que ser usado. Apesar de prevalecer o problema de mtodos com a mesma assinatura, mas com funes distintas, o que impossibilitava a implementao de ambas as interfaces. Aqui est um exemplo da declarao de uma interface. public interface Expiravel { public bool estaExpirado(); public GregorianCalendar expiraEm(); }

Pode parecer uma pequena diferena, mas numa linguagem como Java, onde muitas vezes necessrio escrever grandes linhas de cdigo, isto pode poupar bastante esforo num projecto.

Interfaces
Apesar de j existir antes de Java 5, as interfaces so uma maneira simples de Java ultrapassar as limitaes de herana simples, ao invs da mltipla do C++, e ao mesmo tempo evitando grande parte do problema do Diamante da Morte (Diamond of Death em Ingls), onde a mltipla herana pode criar problemas ao compilador e ao programador sobre qual o mtodo a ser executado.

26

A PROGRAMAR
Programao Orientada a Objectos em Java 6
Qualquer classe que implemente esta interface, ter que obrigatoriamente possuir aqueles dois mtodos especificados. Assim poder-se- facilmente percorrer, por exemplo uma lista de objectos de diferentes classes, mas com uma interface em comum. Como bvio, os nicos mtodos que podero ser chamados, sem serem necessrias converses, sero os definidos na interface. public abstract int maximoDiasEmprestimo(); public abstract String nomeTipo(); public abstract boolean utilizadorPodeRequisitar(String usercodigo); } public class Livro extends Publicacoes{ public Livro(String codigo){ //Cdigo } @Override public int maximoDiasEmprestimo(){ //Aqui j ter cdigo tambm return 7; }

Classes Abstractas
As classes abstractas so muito teis para possibilitar a poupana de cdigo, e garantir o funcionamento correcto da classe, que apesar de tudo estar incompleta. Imaginemos por exemplo o caso de uma Biblioteca. Poderia existir uma classe abstracta, para as publicaes, que teria informaes gerais, como o cdigo de identificao, se estava requisitado, se era possvel de requisitar, quantidade, estado, entre outros atributos. No entanto possuiria mtodos abstractos, que tm que ser codificados obrigatoriamente na primeira descendente no abstracta. Por exemplo os mtodos maximoDiasEmprestimo, nomeTipo, utilizadorPodeRequisitar, entre outros seriam definidos como abstractos e no possuiriam cdigo. Assim seriam codificados pelas classes Livro, DVD, Revista, e todos aqueles concretos que herdassem da classe abstracta mas os mtodos j codificados na classe abstracta poderiam ser aproveitados, poupando cdigo e trabalho. public abstract class Publicacoes { //Variveis que segundo as regras do encapsulamento devero ser privadas public Publicacoes(){ //Cdigo } public Publicacoes(String codigo){ //Cdigo } public String getCodigo(){ //Cdigo return "x"; } public int getQuantidade(){ //Cdigo return 0; } //... Mais mtodos pblicos e se necessrio alguns privados

@Override public String nomeTipo(){ //Aqui j ter cdigo return "Livro"; } tambm

@Override public boolean utilizadorPodeRequisitar(String usercodigo){ //Aqui j ter cdigo return true; } } Este um exemplo da aplicao de uma classe abstracta e de uma descendente que implementa as funes abstractas e como tal possvel de criar uma instncia do mesmo, onde, tal como na herana entre classes simples, podemos chamar os mtodos pblicos definidos e herdados da classe me. Diferentes Tipos de Coleces A JFC (JAVA Collections Framework) oferece ao programador muito mais que simplesmente o ArrayList. Este apenas uma pequena parte, embora seja talvez a mais utilizada nem sempre adequadamente. tambm

27

A PROGRAMAR
Programao Orientada a Objectos em Java 6
Para um conjunto de problemas que necessitem de uma coleco de valores guardados em memria, muitos programadores por desconhecimento utilizam muitas vezes os mtodos menos adequados. A JFC est dividida em trs grandes grupos as Listas (List<E>), os Conjuntos (Set<E>) e as Correspondncias(Map<K,V>). Supondo, por exemplo uma lista de amigos, qual seria talvez o grupo mais interessante? Todos eles podem de maneira mais ou menos expedita servir para guardar esta informao. Se a informao fosse guardada na lista teramos que ter em ateno que no poderamos repetir amigos e seria necessrio andar sempre a verificar a existncia o valor a inserir antes de o fazer. Como as listas no so ordenadas por definio, a pesquisa demoraria algum tempo para listas de amigos extensas. Nas correspondncias teramos o mesmo problema de verificar a existncia de amizade, mas teramos a vantagem de esta estar optimizada para pesquisas. Contudo teramos a desvantagem de por cada amigo ser necessrio guardar um valor, o que pode acabar por no ser uma desvantagem, se for necessrio, por exemplo guardar algo associado a essa amizade. Num conjunto no seria necessria a verificao de repetidos porque ele prprio faz essa verificao, uma vez que a definio matemtica de conjunto implica isso mesmo que no haja repeties. por isso importante estar a par das possibilidades existentes e saber decidir qual a melhor opo.

Concluso
Tal como disse no inicio este no pretendeu ser um artigo que ensinasse a programar Java, nem POO, mas sim um artigo que mostrasse algumas novidades de Java 6 em relao ao Java 2 (que por motivos de compatibilidade ainda existem em Java 6, mas so desaconselhados) e a sua ligao Programao Orientada a Objectos, j que possvel programar em Java sem ter em conta os princpios de POO. Apesar de tudo ficou ainda muito por dizer j que Java uma linguagem muito extensa e foram focados apenas alguns pormenores, no entanto so pormenores que podem permitir um cdigo mais limpo, talvez mais rpido e por ventura mais fcil de actualizar.

Bibliografia

http://wiki.portugal-a-programar.org/ dev_geral:java:tutorial:home http://download.oracle.com/javase/6/docs/api/

AUTOR
Antnio Silva, actualmente a frequentar o 3 ano da Licenciatura de Engenharia Informtica da Universidade do Minho sente uma enorme paixo pela programao, nomeadamente em VB.Net e C. Apesar disso possui um conhecimento sobre vrias outras linguagens de programao como Java, PHP, Javascript, C#, Haskell, entre outras.

28

Elege o melhor artigo desta edio Revista PROGRAMAR


http://tiny.cc/ProgramarED31_V

A PROGRAMAR
DataBinding em Silverlight 4
Neste artigo pretendo apresentar o conceito databinding em Silverlight 4. Vou comear por uma breve apresentao terica e em seguida irei apresentar vrios exemplos. De salientar que no terei em conta Design Patterns. Binding Target vai representar um objecto do tipo DependencyObject ou do tipo FrameworkElement, ou seja, na maioria dos casos o controlo da interface com o utilizador. Binding Source vai representar um objecto fonte a visualizar/editar; Dependency Property permite definir o valor da propriedade e reflectir/propagar a alterao do valor atribudo, assim como permite definir um valor de omisso. Value converter um conversor que permitir efectuar uma transformao

O conceito Databinding permite-nos de uma forma simples e consistente apresentar e interagir a informao da nossa aplicao, atravs da criao de um relacionamento entre dois objectos para que a alterao de uma propriedade de um deles seja reproduzida numa propriedade de um outro. Existindo uma separao entre a interface com o utilizador e a informao, estabelecido qual o fluxo entre os dois, a forma como a alterao reflectida, a forma como os erros so detectados e a forma como a informao mostrada na interface com o utilizador.

As propriedades a ter em conta:

Databinding permitenos de uma forma simples e consistente () a criao de um relacionamento entre dois objectos
A classe Binding representa a relao entre a interface com o utilizador e a informao. Esta classe est includa no namespace System.Windows.Data e na assembly System. Windows (na System.Windows.dll)

Converter permite converter a informao apresentar ao utilizador; ConverterCulture permite definir qual a cultura a utilizar no conversor; ConverterParameter permite definir o parmetro do conversor; ElementName permite definir o nome do controlo ao qual se est usar no binding como objecto fonte; FallbackValue permite definir qual o valor atribuir em caso de erro; Mode permite definir o modo do binding; Existem dois tipos: Default e Explicit. Path permite definir a propriedade a qual se atribui o binding; RelativeSource permite definir qual o objecto fonte associado, existindo uma hierarquia relativa ao objecto fonte actual; Source permite definir qual o objecto fonte; StringFormat permite especificar como formatar a informao a apresentar; TargetNullValue permite definir o valor a usar quando o objecto fonte nulo; UpdateSourceTrigger permite definir o tipo de actualizao do binding.

Fig.1 Esquema de relacionamento do Databinding

30

A PROGRAMAR
DataBinding em Silverlight 4
As propriedades ValidatesOnDataErrors; ValidatesOnExceptions; NotifyOnValidationError; ValidatesOnNotifyDataErrors esto relacionadas com validao de dados e notificao de erros. Devem ser definidos a quando da implementao da interface IDataErrorInfo ou INotifyDataErrorInfo. De seguida iremos apresentar alguns exemplos prticos! Suponhamos a criao de uma classe chamada Professional, que representa um profissional da comunidade NetPonto. Esta classe implementa as interfaces IProfessional, que define o que um Professional e a interface INotifyPropertyChanged, que permite propagar as alteraes que ocorrerem. public Professional() { _isProgrammer = true; } #region ------ Properties -----public string Name { get { return _name; } set { _name = value; OnPropertyChanged("Name"); } } public DateTime DateOfBirth { get { return _dateOfBirth; } set { _dateOfBirth = value; OnPropertyChanged("DateOfBirth"); }

} public string Address { get { return _address; } set { _address = value; OnPropertyChanged("Adress"); }

} public string Locality { get { return _locality; } set { _locality = value; OnPropertyChanged("Locality"); } } public class Professional : INotifyPropertyChanged, IProfessional { #region ------ Private members -----private private private private private private private private string _name; DateTime _dateOfBirth; string _address; string _locality; int _postalCode; string _mail; int _contact; bool _isProgrammer; public int PostalCode { get { return _postalCode; } set { _postalCode = value; OnPropertyChanged("PostalCode"); } } public int Contact { get { return _contact; }

#endregion

31

A PROGRAMAR
DataBinding em Silverlight 4
set { } } public string Mail { get { return _mail; } set { _mail = value; OnPropertyChanged("Mail"); } } public bool IsProgrammer { get { return _isProgrammer; } set { _isProgrammer = value; OnPropertyChanged("IsProgrammer"); } } #endregion #region ------ INotifyPropertyChanged -----/// <summary> /// Called when [property changed]. /// </summary> /// <param name="propertyName">Name of the property.</param> public void OnPropertyChanged( string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs (propertyName)); } public event PropertyChangedEventHandler PropertyChanged; #endregion } Em XAML: <TextBox Name="tbxName" Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=Default}"/> Ou em code-behind: var binding =new Binding("Name") { Mode = BindingMode.TwoWay, _ UpdateSourceTrigger _ =UpdateSourceTrigger.Default }; tbxName.SetBinding(TextBox.TextProperty, _ binding);

Caso prtico 1
_contact = value; OnPropertyChanged("Contact"); Suponhamos que pretendemos interagir a propriedade Name com uma TextBox.

Caso prtico 2
Suponhamos que pretendemos interagir a propriedade IsProgrammer com uma CheckBox. Em XAML: <CheckBox Name="ckboxIsProgrammed" IsChecked="{Binding Path=IsProgrammer, Mode=TwoWay,UpdateSourceTrigger=Default}"/>

Ou em code-behind: var binding = new Binding("IsProgrammer") { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.Default };

ckboxIsProgrammed.SetBinding (CheckBox.IsCheckedProperty, binding); Nota: Nos prximos casos prticos o source atribudo no DataContext da Page e o binding ir subir na hierarquia at encontrar o source.

32

A PROGRAMAR
DataBinding em Silverlight 4 Caso prtico 3
Suponhamos que pretendemos apresentar o PostalCode numa label, usando um conversor para formatar a informao. Como o PostalCode um valor inteiro que guarda o cdigo postal, o PostalCodeConverter o conversor que separa os primeiros 4 dgitos dos 3 ltimos dgitos usando um hfen. A classe PostalCodeConverter implementa a interface IValueConverter e consiste na implementao de dois mtodos fundamentais, o Convert e o ConvertBack. public class PostalCodeConverter:IValueConverter { public object Convert(object value, System.Type targetType, object parameter, System.Globalization .CultureInfo culture) { return value.ToString().Substring(0, 4) + "-" + value.ToString().Substring(4, 3); } public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) { return int.Parse(value.ToString().Remove('-')); } } No XAML: preciso definir o namespace xmlns:sdk="http://schemas.microsoft.com/ winfx/2006/xaml/presentation/sdk" preciso definir o conversor nos resources: <navigation:Page.Resources> <Demo:PostalCodeConverter x:Key="postalCodeConverter" /> </navigation:Page.Resources> xmlns:sdk="http://schemas.microsoft.com/ winfx/2006/xaml/presentation/sdk" <sdk:DataGrid x:Name="datagrid" AutoGenerateColumns="False"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="Nome" MinWidth="200" Binding="{Binding Name}" /> <sdk:DataGridTextColumn Header="Cdigo Postal" Width="100" MaxWidth="150" Binding="{Binding Path=PostalCode, Converter={StaticResource postalCodeConverter}}"/> <sdk:DataGridTextColumn Header="Endereo" Width="50" Binding="{Binding Path=Address}"/> <sdk:DataGridTextColumn Header="Localidade" Binding="{Binding Path=Locality}"/> </sdk:DataGrid.Columns> </sdk:DataGrid> <sdk:Label Name="lblPostalCode" Content="{Binding Path=PostalCode, Mode=TwoWay, UpdateSourceTrigger=Default, Converter={StaticResource postalCodeConverter}}" /> Em code-behind: datagrid.ItemsSource = professionals;

Caso prtico 4
Atribuir uma lista de profissionais a uma listbox, apresentando a propriedade Name. No XAML: <ListBox Name="lbxProfessional" DisplayMemberPath="Name"/> Em code behind: var professionals = new List<Professional>(); ... lbxProfessional.ItemsSource = professionals;

Caso prtico 5
Atribuir uma lista de profissionais a uma datagrid. No XAML: preciso definir o namespace

Definio da label

33

A PROGRAMAR
DataBinding em Silverlight 4

Caso prtico 6
Definir um ItemTemplate para uma listbox. No XAML: <ListBox Name="lbxProfessionalWidthDataTemplate"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical"> <TextBlock Text="{Binding Path=Name}"/> <TextBlock Text="{Binding _ Path=PostalCode, Converter={StaticResource postalCodeConverter}}"/> <TextBlock <TextBlock <TextBlock <TextBlock Text="{Binding Text="{Binding Text="{Binding Text="{Binding Path=Address}"/> Path=Locality}"/> Path=Contact}"/> Path=Mail}"/> Ou <TextBox Name="tbxDateOfBirth" Grid.Column="2" Grid.Row="2" Text="{Binding Path=DateOfBirth, StringFormat=MMM dd yyyy}"/> No XAML: <TextBox Name="tbxDateOfBirth" Grid.Column="2" Grid.Row="2" Text="{Binding Path=DateOfBirth, StringFormat=MM-dd-yyyy}"/>

Concluso

</StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> Em concluso, o conceito Databinding uma forma simples e eficiente de visualizao e edio da informao nas aplicaes desenvolvidas em Silverlight.

Caso prtico 7
Formatar o dia de aniversrio usando o StringFormat.

AUTOR
Sara Silva, licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra, actualmente Software Developer no Porto. O entusiasmo pela rea resultou na obteno dos ttulos de Microsoft Certified Profissional Developer Windows 3.5, Microsoft Certified Tecnology Specialist WPF 3.5, WPF 4 e Windows Forms.

34

COLUNAS
VISUAL (NOT) BASIC Primeiros passos com GDI+ CoreDump Martelo <=> Inpcia

VISUAL (NOT) BASIC


Primeiros passos com GDI+
GDI? GDI ou Graphic Device Interface a API responsvel, directa ou indirectamente, total ou parcialmente, por tudo o que nos chega aos olhos no mundo Windows. Se no existe acelerao por hardware e estamos a ver curvas, linhas, texto e grficos desenhados, porque a GDI assim o permite. Atravs desta API conseguimos, de forma bastante penosa (para os produtos de desenvolvimento Microsoft de outrora), desenhar geometria, grficos e fontes para o ecr ou para a impressora.

A classe Graphics a nossa porta da frente. Podemos preparar uma superfcie GDI+ com muita facilidade. No decorrer do artigo, vou desenhar tudo num panel, aproveitando o disparo do evento Paint, que ocorre sempre que a rea de desenho precise de ser actualizada, quer por indicao explcita invalidando o interface do objecto PanelGDI.Invalidate() ,ou porque a rea saiu do ecr ou tem outra janela a tapar. Normalmente podemos referenciar a superfcie GDI do objecto por:
Dim GDI As Graphics = PanelGDI.CreateGraphics()

Com a evoluo dos tempos, surgem novas necessidades e por volta do Windows XP a Microsoft cria uma API para C/ C++ que chamou simplesmente de GDI+. A API resistiu at hoje, onde j se tentam incutir tecnologias baseadas em GDI mas que visam substitu-la, como Direct2D. A nova API reduziu significativamente a complexidade para o programador.

Neste caso, como vamos utilizar o disparo do evento Paint, um dos parmetros que nos chegam do evento precisamente uma referncia superfcie GDI: Dim GDI As Graphics = e.Graphics

GDI na .NET A API j se tinha tornado mais poderosa, mais fcil e representando uma bela fatia no bolo da relevncia de um sistema operativo, s seria natural criar um acesso de alto nvel, muito mais fcil e controlado na .NET framework. De facto a Microsoft no poderia ter tornado o namespace mais simples.

Preparar para os primeiros rabiscos Com a superfcie GDI preparada, poderamos comear a desenhar imediatamente. Existem essencialmente desenhar: 4 maneiras diferentes para

Bitmap, Pen, Brush e Font, servem respectivamente para desenhar imagens, desenhar linhas, pintar reas e desenhar letras. Diferentes mtodos utilizam diferentes formas de desenhar e todos em conjunto formam composies. Estas formas de desenhar tm que ser preparadas antes de poderem ser utilizadas, mas antes

Para ganharmos acesso a todas as classes expostas bastanos importar / fazer referncia ao namespace System.Drawing. neste namespace que se encontram todas as classes e sub-namespaces que nos permitem trabalhar imediatamente com a API. Onde posso desenhar? Como todos os componentes passam pela GDI, todos representam uma potencial folha em branco para os nossos dotes artsticos. Isto significa que todos os exemplos neste artigo, se aplicados por exemplo num form, podem perfeitamente ser aplicados desde o panel at a um item de listbox.

Tamanho, posio e cor Antes de poder comear a desenhar importante entender algumas classes que nos ajudam a posicionar, dimensionar e colorir os nossos rabiscos:

36

VISUAL (NOT) BASIC


Primeiros passos com GDI+
Point / PointF O Point uma estrutura que representa essencialmente um conjunto de dois valores, X e Y, que representam uma coordenada num referencial bidimensional. Podemos criar um ponto directamente no construtor: Dim Ponto As New Point(25, 35) Dim PontoF As New PointF(20.5F, 22.03F) As principais formas de desenhar Bitmap / Image A classe Bitmap representa uma imagem completa, com todas as suas propriedades e informao de cor pixel a pixel. Nos mtodos que impliquem desenhar imagens, uma instncia desta classe que vai ser usada. Bitmap tem vrios construtores, bastante especficos, mas vamos apenas considerar dois para este artigo. Dim Imagem As New Bitmap("C:\imagem.png") Dim Imagem As New Bitmap(800, 600) O primeiro construtor vai instanciar a classe com a informao da imagem indicada. O segundo construtor vai criar uma imagem abstracta, com 800x600 px O primeiro construtor vai instanciar a classe com a informao da imagem indicada. O segundo construtor vai criar uma imagem abstracta, com 800x600 px Pen A Pen necessria para todos os mtodos que impliquem o desenho de linhas, curvas e contornos. Podemos criar uma Pen apenas por indicar a sua cor e espessura: Mas existem mais propriedades na classe Pen que lhe Dim P As New Pen(Color.Black,2)

Size / SizeF O Size uma estrutura que representa um conjunto de dois valores, Width e Height, que representam valores de largura e altura, respectivamente. Podemos criar uma dimenso directamente no construtor: Dim Dimensao As New Size(800, 600) Dim DimensaoF As New SizeF(100.05F, 100.07F) Rectangle / RectangleF O Rectangle uma estrutura que representa um conjunto de 4 valores, X, Y, Width e Height, que representam um combinado de coordenadas XY e dimenso. Podemos criar um Rectangle directamente no construtor: Color Dim Rectangulo As New Rectangle(0, 0, 100, 100) Dim RectanguloF As _ New RectangleF(0.5F, 0.8F, 100.03F, 100.25F) A Color uma estrutura que representa um conjunto de 4 valores, A, R, G e B que representam os 4 canais que constituem uma cor aRGB: A para Alpha, ou o canal de opacidade, RG e B para Red, Green e Blue, respectivamente. Cada canal comporta valores que variam dos 0 (ausncia) at 255 (presena total) A classe Color no tem construtores. Podemos obter uma cor quer atravs da enumerao disponvel, quer por utilizao de alguns mtodos disponveis. Dim Cor As Color = Color.FromArgb(255, 255, 0, 0) Dim Cor As Color = Color.Red Dim Cor As Color = Color.FromName("Red") Dim Cor As Color = _ Color.FromKnownColor(KnownColor.ActiveBorder)

podem conferir mais caractersticas visveis, tais como a forma terminal ou o estilo da linha, que no vou abordar. Brush O Brush necessrio para todos os mtodos que impliquem preenchimento de reas. Existem vrios tipos de pincel que permitem a aplicao de texturas, gradientes, padres ou simplesmente uma cor. Vou focar essencialmente o SolidBrush, para cores nicas e o LinearGradientBrush para gradientes de duas cores simples. Podemos criar SolidBrush directamente no construtor: Dim B As New SolidBrush(Color.Red) Tambm podemos criar LinearGradientBrush directamente no construtor: Dim B As New LinearGradientBrush(New _

Com estas noes estamos aptos a colorir e posicionar os nossos rabiscos.

Point(0, 0), New

Point(100, 100), Color.Red, Color.Green)

37

VISUAL (NOT) BASIC


Primeiros passos com GDI+
necessrio um ponto onde o gradiente vai iniciar e um ponto onde vai terminar, bem como as cores nesses mesmos pontos. A mistura de cor no intervalo intermdio automaticamente calculada. Existem classes que desempenham um papel importante na mistura de cores do gradiente, mas no as vamos abordar. Observemos diferentes colocaes dos pontos do gradiente abaixo: DrawBezier (Pen, Ponto1,Ponto2,Ponto3,Ponto4) O mtodo DrawBezier desenha uma curva de Bzier com 4 pontos de controlo. Existem mais overloads, mas so redundantes. Dim pt1 As New Point(0, 0) Font A Font necessria para todos os mtodos que impliquem o uso das fontes do sistema. Ser tipicamente utilizada sempre que for necessrio escrever alguma coisa na superfcie GDI. Podemos criar uma Font directamente no construtor: Dim F As New Font("Arial", 14) Dim F As New Font("Arial", 14, FontStyle.Bold Or _ FontStyle.Italic) Dim F As New Font("Arial", 14, FontStyle.Bold Or _ FontStyle.Italic, GraphicsUnit.Pixel) Os mtodos, finalmente. Descrita toda a preparao, est na altura de explorar os mtodos da classe Graphics. O namespace Drawing vasto e bastante completo. Vou apontar apenas o que considero mais importante. DrawCurve / DrawColsedCurve (Pen,Pontos(),Tenso) O mtodo DrawCurve desenha uma curva linear, passando por os pontos no array Pontos(), aplicando a tenso defenida (valor de 0.0 a 1.0) DrawClosedCurve em tudo semelhante, mas liga o ltimo ponto em Pontos() ao primeiro, fechando a curva. Existem mais overloads. Dim pt1 As New Point(0, 0) Dim pt2 As New Point(80, 20) Dim pt3 As New Point(20, 80) Dim pt4 As New Point(100, 100) Dim pts As Point() = New Point() {pt1, pt2, pt3, pt4} Dim g As Graphics = e.Graphics g.DrawCurve(New Pen(Brushes.Black, 2), pts, 0F) g.DrawCurve(New Pen(Brushes.Black, 2), pts, 0.5F) g.DrawCurve(New Pen(Brushes.Black, 2), pts, 1F) Dim pt2 As New Point(80, 20) Dim pt3 As New Point(20, 80) Dim pt4 As New Point(100, 100) Dim g As Graphics = e.Graphics g.DrawBezier(New Pen(Brushes.Black, 2), _ pt1, pt2, pt3, pt4)

DrawArc(Pen,X,Y,Width,Height,AnguloInicial,Varrimento)

O mtodo DrawArc desenha um arco com as propriedades da Pen, com centro em XY, includo no rectngulo de largura Width e altura Height, centrado. A curva comea no AnguloInicial e desenhada at ao ngulo AnguloInicial + Varrimento. Os ngulos so dados em graus. Existem mais overloads, mas so redundantes. Dim g As Graphics = e.Graphics g.DrawArc(New Pen(Brushes.Black, 2), 0, 0, 100, 100, 0, 90) g.DrawArc(New Pen(Brushes.Black, 2), 0, 0, 100, 100, 180, 90)

38

VISUAL (NOT) BASIC


Primeiros passos com GDI+
DrawEllipse (Pen, Rectangulo) O mtodo DrawEllipse desenha uma elipse inscrita no rectngulo especificado. A elipse desenhada no centro do rectngulo o que faz com que se possa afirmar que, por exemplo, num quadrado 100x100, o mtodo DrawEllipse vai desenhar uma circunferncia centrada em x=50 e y=50 com raio de 50px Dim rect1 As New Rectangle(0, 0, 100, 100) Dim rect2 As New Rectangle(0, 0, 100, 50) Dim g As Graphics = e.Graphics g.DrawEllipse(New Pen(Brushes.Black, 2), rect1) g.DrawEllipse(New Pen(Brushes.Black, 2), rect2) DrawLine (Pen,Ponto1,Ponto2) O mtodo DrawLine desenha uma linha com origem em Ponto1 e destino em Ponto2. Existem mais overloads, mas so redundantes. Dim pt1 As New Point(25, 25) Dim pt2 As New Point(75, 75) Dim g As Graphics = e.Graphics g.DrawLine(New Pen(Brushes.Black, 2), pt1, pt2)

DrawPie (Pen,X,Y,Width,Height,AnguloInicial,Varrimento) O mtodo DrawPie desenha uma seco de um crculo, lembrando uma fatia de pizza ou tarte (Pie). A circunferncia inscrita no rectngulo formado por XY, Width e Height e desenhada a seco da circunferncia que comea no AnguloInicial e termina em AnguloInicial+Varrimento. Os ngulos so dados em graus. Existem mais overloads, mas so redundantes. Dim g As Graphics = e.Graphics g.DrawPie(New Pen(Brushes.Black, 2), _ 0, 0, 100, 100, 0, 90) g.DrawPie(New Pen(Brushes.Black, 2), _ 0, 0, 100, 100, 180, 90) Dim B As New Bitmap("c:\pap.png") Dim Ponto As New Point(0, 0) Dim g As Graphics = e.Graphics g.DrawImage(B, Ponto) Dim Rectangulo As New Rectangle(0, 50, 50, 50) g.DrawImage(B, Rectangulo)

DrawImage (Bitmap,Ponto / Rectangulo) O mtodo DrawImage desenha a informao de uma classe Bitmap com origem no ponto especificado ou com origem e dimenses ditadas pelo rectngulo. Existem outros mtodos semelhantes e muitos overloads, a maioria redundantes. O canal Alpha perfeitamente respeitado e obtm-se bonitos resultados com PNG.

39

VISUAL (NOT) BASIC


Primeiros passos com GDI+
DrawPolygon (Pen,Pontos()) O mtodo DrawPolygon desenha um polgono, ao ligar sequencialmente todos os pontos especificados, voltando ao primeiro depois do ltimo. Existe apenas mais um overload para utilizar valores com casas decimais. Dim pt1 As New Point(50, 0) Dim pt2 As New Point(60, 40) Dim pt3 As New Point(100, 40) Dim pt4 As New Point(65, 60) Dim pt5 As New Point(80, 100) Dim pt6 As New Point(50, 70) Dim pt7 As New Point(20, 100) Dim pt8 As New Point(35, 60) Dim pt9 As New Point(0, 40) Dim pt10 As New Point(40, 40) Dim pts As Point() = New Point() _ {pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9, pt10} Dim g As Graphics = e.Graphics g.DrawPolygon(New Pen(Brushes.Black, 2), pts) DrawString (Texto,Fonte,Brush,Rectangulo,StringFormat) O mtodo DrawString desenha texto a partir de uma string, com uma determinada fonte e conjunto de caractersticas de formato. Existem overloads, alguns redundantes.

Dim F As New Font("Arial", 7, FontStyle.Italic) Dim SF As New StringFormat SF.Alignment = StringAlignment.Center Dim R As New Rectangle(0, 50, 100, 40) Dim g As Graphics = e.Graphics g.DrawString("Portugal-a-Programar", F, _ Brushes.Black, R, SF) SF.FormatFlags = StringFormatFlags.DirectionVertical _ Or StringFormatFlags.LineLimit F = New Font("Arial", 10, FontStyle.Italic _ Or FontStyle.Bold) g.DrawString("GDI+", F, Brushes.Black, 0, 20, SF)

DrawRectangle (Pen,X,Y,Width.Height) O mtodo DrawRectangle desenha um rectngulo com origem no XY especificado e com as dimenses especificadas. Existem mais overloads, mas so redundantes. Dim g As Graphics = e.Graphics g.DrawRectangle(New _ Pen(Brushes.Black, 2), 10, 10, 80, 40) A maioria dos mtodos de prefixo Draw existe numa segunda verso Fill. A operao semelhante, mas as reas geradas so preenchidas de acordo com um brush fornecido, quer seja ele slido, gradiente, textura, hatch ou de qualquer outro tipo. Performance versus Qualidade A classe Graphics possui algumas propriedades que definem a forma como a GDI vai render os grficos.

40

VISUAL (NOT) BASIC


Primeiros passos com GDI+
Como em tudo, se pretendemos qualidade temos de sacrificar performance e vice-versa. Eis algumas das propriedades mais comuns e seus efeitos: MeasureString Nos casos em que desenhamos texto indicando apenas uma posio de origem XY, este desenhado de forma linear, sem qualquer limite. O mtodo MeasureString permite-nos medir o tamanho que essa string vai ocupar, para que possamos fazer correctamente os nossos clculos. Tambm possvel medir as dimenses de uma string desenhada dentro de uma rea, que faz com que possamos ter noo do quanto cresceu nos casos onde ocorre wordwrap. O mtodo MeasureString muito semelhante ao mtodo DrawString, pois precisa de saber exactamente como que o texto foi (ou vai ser) desenhado, para que possa internamente fazer a simulao. O mtodo devolve-nos as dimenses do texto, em largura e altura, num tipo de dados SizeF.

Pen Cap / Dash Style Ao desenhar linhas, sobretudo com alguma espessura visvel, podemos notar que os terminais da linha so abruptamente cortados, como normal. O pen cap determina precisamente como esses terminais so desenhados. Existem alguns caps disponveis, para alm da possibilidade de desenhar os nossos prprios caps (custom). Algumas dicas Para alm dos caps e de outras propiedades, possvel determinar como vai ser o traado da linha, o Dash Style. Para este exemplo foi necessrio utilizar a classe GraphicsPath, a qual no est prevista para este artigo.

Double Buffer Se a inteno usar a GDI+ para criar algum tipo de movimento, tal como um pequeno jogo, algo que necessite de constante e rpido refrescamento, rapidamente se nota que se torna impossvel de continuar pois cada ciclo de refrescamento reflectido de forma negativa na superfcie GDI. Isto traduz-se num piscar insuportvel que causado pela constante soma de execuo do refrescamento e dos grficos propriamente ditos. Nestes casos podemos, sacrificando um pouco de performance, utilizar um Double buffer que far com que as actualizaes sejam feitas em paralelo com a apresentao, o que se traduz numa actualizao suave da superfcie GDI, mas um pouco mais demorada. Num objecto como a Form, basta alimentar a propriedade DoubleBuffered para True.

Dim g1 As Graphics = PanelGDI.CreateGraphics Dim g2 As Graphics = Panel1.CreateGraphics Dim g3 As Graphics = Panel2.CreateGraphics Dim g4 As Graphics = Panel3.CreateGraphics Dim g5 As Graphics = Panel4.CreateGraphics g1.Clear(Color.White) g2.Clear(Color.White) g3.Clear(Color.White) g4.Clear(Color.White) g5.Clear(Color.White)

41

VISUAL (NOT) BASIC


Primeiros passos com GDI+
Dim pt1 As New Point(20, 20) Impresso Dim pt2 As New Point(80, 20) Dentro do namespace Drawing, pertencente ao namespace Dim pt3 As New Point(20, 80) Printing, encontramos algumas classes como PrintDocuDim pt4 As New j conhecem80) fazer impresso de ment, que muitos Point(80, para dados. Dim MyP As New Pen(Brushes.Black, 6) No uma falha o namespace Printing estar includo no g1.DrawBezier(MyP, pt1, pt2, pt3, pt4) 'IMG1 namespace Drawing. Na verdade, possvel desenhar documentos para a impresMyP = New Pen(Brushes.Black, 6) sora exactamente da mesma forma que os desenharamos MyP.StartCap = LineCap.DiamondAnchor no form. MyP.EndCap = LineCap.ArrowAnchor g2.DrawBezier(MyP, pt1, pt2, pt3, pt4) 'IMG2 Em suma... MyP = New Pen(Brushes.Black, 6) O namespace Drawing e a GDI+ no geral, oferecem-nos um MyP.DashStyle = DashStyle.Custompartir do qual podegrande potencial para a imaginao, a mos criar aplicaes New Single() {0.5F, 1.0F, 0.5F, MyP.DashPattern = visualmente ricas. 1.0F} como se programa com a API, em nvel mais elevaA forma do com o As New AdjustableArrowCap(1, 2) Dim Setanamespace Drawing concede uma simplicidade de tal forma que possvel desenhar uma linha com duas linhas Seta.Filled = False de cdigo. MyP.CustomEndCap = Seta Se queremos enriquecer visualmente uma aplicao Wing3.DrawBezier(MyP, pt1, pt2, pt3, pt4) 'IMG3 e Forms, nem vale a pena procurar mais. A GDI+ ideal est includa na .NET. MyP = New Pen(Brushes.Black, 6) MyP.DashCap = DashCap.Round MyP.EndCap = LineCap.RoundAnchor g4.DrawBezier(MyP, pt1, pt2, pt3, pt4) 'IMG4 MyP = New Pen(Brushes.Black, 1.5F) Dim GP As New GraphicsPath() Dim cpt1 As New Point(5, 0) Dim cpt2 As New Point(6, 4) Dim cpt3 As New Point(10, 4) Dim cpt4 As New Point(6, 6) Dim cpt5 As New Point(8, 10) Dim cpt6 As New Point(5, 7) Dim cpt7 As New Point(2, 10) Dim cpt8 As New Point(3, 6) Dim cpt9 As New Point(0, 4) Em suma... O namespace Drawing e a GDI+ no geral, oferecem-nos um grande potencial para a imaginao, a partir do qual podemos criar aplicaes visualmente ricas. A forma como se programa com a API, em nvel mais elevado com o namespace Drawing concede uma simplicidade de tal forma que possvel desenhar uma linha com duas linhas de cdigo. Se queremos enriquecer visualmente uma aplicao WinForms, nem vale a pena procurar mais. A GDI+ ideal e est includa na .NET. Dim cpts As Point() = New Point() _ {cpt1, cpt2, cpt3, cpt4, cpt5, cpt6, cpt7, cpt8, cpt9, cpt10} GP.AddPolygon(cpts) Dim MyC As New CustomLineCap(Nothing, GP) MyP.EndCap = LineCap.Custom MyP.StartCap = LineCap.Custom MyP.CustomStartCap = MyC MyP.CustomEndCap = MyC g5.DrawBezier(MyP, pt1, pt2, pt3, pt4) 'IMG5

I mpresso Dentro do namespace Drawing, pertencente ao namespace Printing, encontramos algumas classes como PrintDocument, que muitos j conhecem para fazer impresso de dados. No uma falha o namespace Printing estar includo no namespace Drawing. Na verdade, possvel desenhar documentos para a impressora exactamente da mesma forma que os desenharamos no form.

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

42

CoreDump
Martelo <=> Inpcia
Esta semana conversava com um colega e amigo sobre o facto da maioria dos profissionais de TI que chegam actualmente ao mercado de trabalho no compreenderem as bases sobre as quais assentam as tecnologias que utilizam. Pode parecer conversa de velho do restelo, de quem tinha de saber configurar um disco rgido como master ou slave atravs de jumpers no hardware ou de quem tinha de saber configurar o DOS correctamente para poder fazer uso total dos 4 MB de RAM que estavam disponveis e libertar ao mximo os mticos 640Kb. Acreditem que nenhuma destas experincias saudosista e que o tema da conversa no originou da... A verdade que actualmente detecto falhas nas bases de muitos profissionais de TI que, ou por no terem sido bem orientados, ou pela actual facilidade tecnolgica, ou por simples preguia pessoal, no compreendem na totalidade as tecnologias com que trabalham diariamente. So exemplos tpicos a utilizao de frameworks, que facilitam o desenvolvimento atravs da elevao de conceitos e abstraco, a utilizao de bases de dados e a utilizao do paradigma Object Oriented. Uma framework simplifica e agiliza o desenvolvimento, mas tambm esconde e abstrai o trabalho que est por detrs, fazendo querer a muitos dos seus utilizadores que magia. Como resultado, temos muitas vezes profissionais de TI incapazes de compreender a sua ferramenta de trabalho, ficando sua merc. Este desconhecimento torna-se relevante quando se deparam com determinados bugs relacionados com a framework ou quando necessitam de implementar uma soluo que sai fora do mbito da aplicao da framework. preocupante observar que todos os problemas de lentido de uma aplicao se resolvem com mais RAM ou mais CPU sem sequer se identificar a causa do problema recorrendo utilizao de um profiler. Uma base de dados imprescindvel para qualquer sistema informtico, e desconhecer a 3 Forma Normal meio caminho andado para um sistema deficiente. Este problema visvel na nossa prpria comunidade, onde recorrentemente se vm estagirios e estudantes futuros profissionais de TI a desenvolverem projectos em que criam tabelas sem saber o que representam e no terem qualquer noo das suas relaes. gritante observar que a nica soluo para uma query lenta passa pela criao de um ndice, quando a primeira abordagem deve ser sempre a observao do plano de execuo e a reescrita da query de forma mais eficiente. E quando chegamos aos paradigmas, enfim... Constato que muitos no sabem sequer o que a herana no paradigma OO, fazendo classes que diferem apenas num pequeno conjunto de atributos distinto. Pior, ignoram mecanismos como clculo lambda e paradigmas como os da programao funcional. Tenho outro amigo que costuma dizer, em relao a este tipo de comportamento padro, que quando a nica ferramenta que se conhece o martelo, todos os problemas parecem um prego. E a verdade que esta frase resume um pouco o que se passa. Em vez de se compreender o que se passa para procurar a melhor soluo a aplicar, martela-se a nica soluo que se conhece... Por vezes a aplicao da soluo escala com o problema e quanto maior o problema, maior a martelada... Fico a pensar se ser ironia ou pura casualidade o facto de tantas aplicaes terem um martelo como cone em algumas das suas opes de menu. bvio que compreender as bases da tecnologia imprescindvel para saber o que andamos a fazer. Se no compreendermos as bases da tecnologia, dificilmente saberemos o que estamos a fazer e se no sabemos o que estamos a fazer, ento o resultado do nosso trabalho nunca ser grande coisa... Ningum nasce ensinado, mas nunca na histria da Humanidade foi to simples, rpido e barato aceder ao conhecimento. Na rea de TI no faltam livros, blogs, fruns e afins onde tudo se encontra documentado e descrito para nossa compreenso. Infelizmente, tambm aqui, vejo que muitos usam a internet de forma errada, fazendo copypaste programming em vez de compreenderem a soluo e, quando o cdigo copiado de um qualquer site no funciona primeira, o resultado um post com um pedido de ajuda. Infelizmente, a nossa comunidade tambm tem exemplos de sobra deste tipo A culpa da formao inadequada s responsvel at certo ponto, uma vez que todos estes problemas se resolvem com a adopo de uma postura e atitude de querer saber e compreender por parte de cada um. Por isso peo a todos os que pretendem trabalhar em TI que faam um favor a vocs prprios: larguem o martelo, continuem a aprender e no cedam inpcia.

AUTOR

Fernando Martins, faz parte da gerao que se iniciou nos ZX Spectrum 48K. Tem um Mestrado em Informtica e mais de uma dcada de experincia profissional nas reas de Tecnologias e Sistemas de Informao. Criou a sua prpria consultora sendo a sua especialidade a migrao de dados.

43

COMUNIDADES
SharePointPT - Padro alternativo de Sharepoint

COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org

Padro alternativo de Sharepoint: a pesquisa como fonte de dados parte I Arquitectura


A plataforma Sharepoint tem sido nos ltimos anos, um importante suporte para o desenvolvimento de solues empresariais de intra/extra/internet. Com maior ou menor dificuldade as equipas entram no padro de desenvolvimento modular (p.e. webparts) ou via extenso da prpria plataforma, suportado por pacotes de instalao (wsps) e funcionalidades empacotadas (features), tendo asseguradas de base algumas funcionalidades interessantes, como p.e.: Controlo de acessos Motor de workflows Plataforma de edio de contedos Servios transversais (pesquisa, excel, business intelligence, etc) Instalao de pacotes em toda a farm de forma automtica Neste artigo pretende-se desconstruir as abordagens mais tradicionais, apresentando uma soluo pouco comum atravs de uma arquitectura, mas que optimiza os mdulos de maior interesse para o cenrio apresentado, centrando-se principalmente na componente de indexao e pesquisa do Sharepoint. Este cenrio corresponde a parte de uma implementao real. Neste 1 artigo, abordada a componente de arquitectura da soluo e componentes de alto nvel, para permitir a visualizao da soluo. No 2 artigo da srie, ser descrita a componente mais tcnica, incluindo a configurao das regras de pesquisa, das propriedades (crawlled e managed), models de consumo dos dados e o respectivo empacotamento da soluo de indexao. Robustez: os tempos de indisponibilidade so crticos para a organizao; dada a especialidade do negcio a suportar pela plataforma, a aplicao no dever apresentar picos dirios de utilizao, prevendo-se um volume de utilizadores estvel no perodo 06:00 at s 02:00, altura em que a utilizao decai para um valor residual; No perder 1 nica encomenda: a plataforma dever permitir recuperar todas as encomendas que possam falhar, para posterior processamento por operadores; Ter um portal para gerir a informao genrica dos produtos. A XPTO tem um volume de aproximadamente 20.000 utilizadores registados, com um acesso dirio previsto de 10%.

Arquitectura
Como componentes da arquitectura, proposta uma abordagem distribuda em vrios componentes/plataformas, tirando proveito das principais caractersticas de cada uma: Apresentao: IIS (Internet Information Services), .Net 4 e MVC Como principais vantagens destas tecnologias temos a escalabilidade, robustez e flexibilidade Gesto de contedos e indexao: Sharepoint A gesto de contedos e indexao so alguns dos principais pontos fortes da plataforma Sharepoint Gesto de catlogo: Commerce Server A plataforma de comrcio electrnico centra-se

Cenrio
A empresa XPTO necessita de um portal pblico que disponibilize uma loja de comrcio electrnico, tendo como principais requisitos: Performance: carregamento de pginas at 3 segundos, independentemente do volume de acessos; Escalabilidade: a plataforma deve permitir um processo evolutivo simples e slido;

Esta arquitectura conta ainda com as plataformas Biztalk na componente de integrao e com o CRM na componente de gesto de clientes, ficando no entanto de fora do tema proposto neste artigo. A camada de apresentao integralmente suportada por uma implementao MVC, cujos models vo beber dados principalmente s plataformas Commerce e Sharepoint (search services). A gesto de contedos suportada por um portal Sharepoint, onde as caractersticas de produtos, ficheiros

45

COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org

Padro alternativo de Sharepoint: a pesquisa como fonte de dados


multimdia e documentos so geridos e mantidos por circuitos de aprovao standard. Toda a informao de catlogo e stock mantida na plataforma Commerce, que tembm suporta toda a parte de carrinho de compras. Uma vez que a informao se encontra distribuda nas plataformas Commerce, Sharepoint e ainda em alguns sistemas externos, opta-se pela utilizao da componente de indexao para unir esta informao dispersa, atravs da construo de uma plataforma de indexao costumizada, composta por uma componente de listagem e um segundo nvel com o detalhe dos produtos.

Este padro apresenta como principais vantagens: Melhor organizao da aplicao pela diviso das vrias lgicas em zonas separadas; No usa view state ou forms, o que d um maior controlo sobre a aplicao e sobre a informao trocada com o utilizador; Melhor suporte para um padro de desenvolvimento TDD (Test Driven Development um padro que promove o desenvolvimento baseado na existncia de testes unitrios); Dada a granularidade fina dos componentes, uma boa aposta para equipas de maior dimenso.

Stock, preo, carrinho e perfil

Dados de produtos

IIS,MVC

Dados de Catlogo

Commerce

Sharepoint Edio de contedos

SQL Server

Indexao e pesquisa Padro MVC (Model-View-Controller)


Tema para um artigo s por si, o MVC um padro de implementao que merece uma breve referncia para enquadramento (e para despertar o interesse pelos padres, para quem ainda no os conhece). O padro arquitectural MVC separa as camadas aplicacionais em 3 componentes: Model: responsvel pela representao e manuteno dos estados dos dados; View: camada de apresentao, responsvel por mostrar os dados e interagir com o utilizador; Controller: camada de lgica que toma as decises baseada nos dados inseridos pelos utilizadores na View, passando a informao necessria ao Model correspondente para manuseamento dos dados. Tendo a pesquisa como fonte de dados da camada de apresentao, vrios pontos surgem como requisitos deste componente: Fornecer informao de carcter genrico, contida num portal de Sharepoint; Fornecer informao de catlogo, contida no Commerce Server; Fornecer informao de cariz tcnico, contida em outros sistemas externos; Com base nestas necessidades optou-se pela seguinte abordagem: Criao de um conjunto de pginas de ndice em cascata, que comeam por listar sites com link para o nvel seguinte onde passa o site seleccionado no link; no nvel seguinte lista os sub-sites do site seleccionado e por ltimo, lista os produtos com link para a pgina de detalhe do produto.

46

COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org

Padro alternativo de Sharepoint: a pesquisa como fonte de dados


List sites List subsites List products Produt detail
multithreaded permite paralelizar as vrias recolhas e diminuir significativamente o tempo de carregamento da pgina. Uma vez que esta pgina ser chamada tantas vezes, quantos os produtos existentes, tem um impacto significativo na durao total do processo de indexao e consequentemente na desactualizao da informao para o utilizador final (p.e. se uma indexao demorar 1 hora, h a probabilidade dos dados dos produtos apresentados estejam desactualizados at 1 hora atrs). O modelo do processo de recolha de informao e gerao da pgina de indexao apresentado no diagrama seguinte.

Pgina de detalhe do produto que recebe por parmetro o sub-site, bem como o cdigo do produto e gera uma pgina de detalhe contendo os dados necessrios para a camada de apresentao. Estes dados, ao serem indexados na mesma pgina ficam relacionados entre si. Ao incluirmos uma chave (ex. id do produto), vamos poder aceder-lhe como uma entidade.

O cdigo gerado pela pgina de detalhe do produto algo do tipo: <html> <head> <title>Detalhe de produto</title> <meta name="ProductName" content="Single Track King" /> <meta name="ProductCategory" content="Bicicletas Todo Terreno" /> Os principais desafios da componente de indexao, revelam-se nesta altura e vale a pena salientar: Uma vez que para um comportamento correcto desta pgina, os dados tm de ser indexados em metatags e consequentemente so indexados como texto pelo Sharepoint; Ao indexar via metatags, perde-se a caracterizao dos dados (ver O que perdemos com a indexao via metatags); Esta pgina tem de aceder a vrios sistemas, desde listas de Sharepoint a web services e WCFs de outras plataformas, o que a torna pesada; uma abordagem <meta name="ProductDescription" content="A melhor btt de sempre." /> <meta name="ProductImage" content="/images/products/1234567.jpg" /> <meta name="ProductId" content="1234567" /> </head> <body></body> </html> Ao ser indexada esta pgina far com que sejam criadas propriedades (crawlled properties de Sharepoint), com os nomes ProductName, ProductCategory, ProductDescription, etc. que por sua vez podero ser promovidas por configura-

47

COMUNIDADE SHAREPOINTPT
http://www.sharepointpt.org

Padro alternativo de Sharepoint: a pesquisa como fonte de dados


A abordagem do processo de indexao propositadamente simplista, para permitir tirarmos proveito do modelo multithreaded da pesquisa, levando-nos a construir as pginas to simples e pequenas quanto possvel, evitando desta forma esgotar os recursos das mquinas. O que perdemos com a indexao via metatags O processo de indexao baseado em metatags tem uma desvantagem imediata que a descaracterizao do tipo de dados, uma vez que estaremos a indexar pginas HTML, em cujos campos de meta so sempre indexados como texto. No nosso cenrio, esta desvantagem minimizada, uma vez que os dados indexados so utilizados apenas para gerao da apresentao, baseando-se os dados e processo de compra na plataforma Commerce. sempre possvel efectuar transformaes de tipo (cast ou parse) que devidamente efectuadas no trazem desvantagens em termo de estabilidade, mas so operaes pesadas em termos de ciclos de processamento trazendo uma degradao significativa da performance quando invocadas frequentemente. string myText = "123456"; int myVal; melhor performance, mas potencialmente mais onerosa tendo em conta o licenciamento; Via servios (Query Via servios (Query Web Service); soluo mais flexvel mas com alguma desvantagem em termos de performance.

Concluso
Plataformas com a complexidade do Sharepoint so candidatas a implementaes inovadoras, uma vez que disponibilizam um conjunto grande de funcionalidades, para os quais nem todos os cenrios foram equacionados pelas equipas de produto e/ou arquitectura. Neste artigo apresentada uma soluo diferente das habitualmente recomendas, mas com provas dadas de escalabilidade e fiabilidade para um ambiente empresarial bastante exigente. Espero com este exemplo conseguir despertar em si, o pensamento fora da caixa. No prximo artigo desta srie, ser abordada a componente de implementao da soluo, com exemplos de cdigo de cada um dos componentes.

if (!int.TryParse(myText, out myVal)) { // Ocorreu um erro no processo de parse // tratar o erro neste ponto }

Referncias
Nota: apesar de estarmos numa publicao em lngua portuguesa, as referncias apresentadas so na maioria dos casos para as verses inglesas. Isto deve-se somente a, por experincia prpria, o contedo em ingls ser mais rico e actualizado que nas restantes lnguas.

Consumo da informao
Estando a informao devidamente indexada pelo Sharepoint, altura de ser consumida e renderizada nas mquinas responsveis pela apresentao dos dados. O consumo da informao, efectuado pelos models MVC, poder ser feito de duas formas: Via API (Query Object Model), necessitando de ter o Sharepoint instalado nestas mquinas; soluo de

IIS http://www.iis.net Microsoft Commerce Server - http://bit.ly/s5Uu2 Microsoft Sharepoint Server - http://bit.ly/qmpwu3 MVC - http://www.asp.net/mvc SharePoint Search Service Tool - http://bit.ly/ZY9H3 Test Driven Development - http://bit.ly/qAIxha The Search Developer Story in SharePoint 2010 - Query Interfaces - http://bit.ly/bnaA4G

AUTOR
Rui Melo - rui.melo@microsoft.com Desde h 12 anos, no mundo das IT, iniciou a carreira na rea de I&D de comrcio electrnico. Passou por empresas como SMD, Pararede, Newvalue e Link, integrou os quadros da Microsoft como consultor h cerca de 5 anos, mais focado na plataforma Sharepoint. Envolvido desde cedo na comunidade SharepointPT, tem na partilha de conhecimento uma forte motivao. Blog: http://mystepstones.wordpress.com.

48

Veja tambm as edies anteriores da Revista PROGRAMAR

28 Edio - Abril 2011

25 Edio - Setembro 2010

29 Edio - Junho 2011

26 Edio - Dezembro 2010

30 Edio - Agosto 2011

27 Edio - Fevereiro 2011

e muito mais em www.revista-programar.info

You might also like