EDITORIALEQUIPA PROGRAMAR                          RIP                                                 No inicio de Outubr...
ÍNDICETEMA DE CAPA  7     iOS, Cocoa Touch & MVC        Conheça mais algumas técnicas de programação para os dispositivos ...
NOTICIASO que a Microsoft, Oracle, IBM e SAP                                 invulgares para a facturação da entrada e saí...
NOTICIASO significado atribuído às sequências de peças depende da-            As 25 Piores Palavras-passe do Anoquilo para...
TEMA DA CAPAiOS, Cocoa Touch & MVC
TEMA DA CAPAiOS, Cocoa Touch & MVCMVC                                                                   Entre as framework...
TEMA DA CAPAiOS, Cocoa Touch & MVC                                                                   Este template contém ...
TEMA DA CAPA                                                                                             iOS, Cocoa Touch ...
TEMA DA CAPAiOS, Cocoa Touch & MVCJá existem os feeds na estrutura de dados do Controller e jáinformamos o UITableView do ...
TEMA DA CAPA                                                                                                          iOS,...
TEMA DA CAPAiOS, Cocoa Touch & MVC                                                                           (void)tableVi...
Elege o melhor artigo desta edição       Revista PROGRAMAR      http://tiny.cc/ProgramarED32_V
A PROGRAMARGeração de números aleatórios (Parte 2)Automatização de tarefas usando atributosSQL Azure FedarationsEnigmas de...
A PROGRAMARGNA - GERAÇÃO DE NÚMEROS ALEATÓRIOS (Parte 2)No artigo anterior foi indicado o método de geração de            ...
A PROGRAMARGNA - GERAÇÃO DE NÚMEROS ALEATÓRIOS (Parte 2)T = tamanho ajustado para onze dígitos, onde 11-td igual ao       ...
A PROGRAMARAutomatização de tarefas usando atributos                                                                    (I...
A PROGRAMAR                                                                     Automatização de tarefas usando atributosN...
A PROGRAMARAutomatização de tarefas usando atributosAntes de tentarmos ir mais adiante com o nosso logger, va-        Se t...
A PROGRAMAR                                                                      Automatização de tarefas usando atributos...
A PROGRAMARAutomatização de tarefas usando atributosConclusão                                                             ...
Elege o melhor artigo desta edição       Revista PROGRAMAR      http://tiny.cc/ProgramarED32_V
A PROGRAMARIntrodução às SQL Azure FederationsO cloud computing tem sido um assunto muito debatido, no             Scale O...
A PROGRAMAR                                                                            Introdução às SQL Azure Federations...
A PROGRAMARIntrodução às SQL Azure Federations                                                                 Federation ...
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Revista programar 32
Upcoming SlideShare
Loading in …5
×

Revista programar 32

920 views
838 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
920
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
25
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Revista programar 32

  1. 1. EDITORIALEQUIPA PROGRAMAR RIP No inicio de Outubro faleceu Steve Jobs, mais precisamente um dia antes do lançamento da edição anterior da Revista PROGRAMAR. Sete dias depois faleceu Coordenadores Dennis Ritchie. Doze dias depois faleceu John McCarthy. Independentemente de se António Silva gostar ou não, a verdade é que aquilo que fizeram influenciou a vida de muitas Fernando Martins pessoas. Dennis Ritchie foi um dos pais do C, linguagem que influenciou a vida de todos os programadores, quer directa quer indirectamente, quer usem ou não C para programar. John McCarthy foi o pai do Lisp, que apesar de não estar tão Editor disseminado na programação, têm uma grande relevância, principalmente na área António Santos da Inteligência Artificial. Steve Jobs levou a Apple rumo ao sucesso, depois da empresa sem si ter afundado, quase a ponto de se extinguir. E é verdade que cada um fez muito mais, estes são, no entanto, e na minha opinião as marcas mais Design importantes de cada um deles. Sérgio Alves Twitter: @scorpion_blood Assim, não tenho qualquer receio de afirmar que todos eles merecem a nossa consideração pelo que fizeram e alcançaram, quer se concorde ou não com algumas ideias e filosofias. Mas a verdade é que o mais destacado foi sem dúvida Steve Redacção Jobs. Mereceu notícias de abertura em canais de televisão, notícias de primeira Bruno Pires página em jornais e revistas, entre outras, enquanto Dennis Ritchie e John McCarthy Augusto Manzano Sandro Pereira ficaram quanto muito com algumas linhas em jornais e revistas, e um pouco mais em Fernando Martins revistas e comunidades ligadas à programação e tecnologia. Muitos insurgiram-se Nuno Godinho pelo facto de não haver o mesmo destaque entre todos. Mas a verdade é que ambos Paulo Morgado viviam muito mais à sombra da sociedade em geral que Steve Jobs. Contudo não Sérgio Ribeiro foram esquecidos. O Fedora 16, lançado cerca de um mês depois da morte de Vítor Tomaz Dennis Ritchie foi-lhe dedicado. Durante a sua vida John McCarthy recebeu também Flávio Geraldes inúmeros prémios, como por exemplo o prémio Turing. Também é verdade que muitos se apressaram quase a colocar Steve Jobs num pedestal, removendo-lhe os defeitos. Mas ele tinha os seus, tal como Dennis e John. Mas seria melhor pessoa, Staff melhor “informático” que os outros dois? É provável que não. Apenas era mais António Santos visível, e o mediatismo fez o resto. Mas a verdade é que terminaram a sua existência Fábio Canada terrena tal como a conhecíamos. Talvez sem puderem dizer um adeus a quem Fábio Domingos gostavam ou queriam, tal como Dennis Ritchie que faleceu sozinho em sua casa. Jorge Paulino Pedro Martins Da minha parte resta-me deixar um obrigado aos três pela sua contribuição Sara Santos para as tecnologias da informação, e um até sempre a todos os leitores e equipa da Revista PROGRAMAR, pois esta será a minha última edição como coordenador. Contacto Foram mais de 3 anos de participação neste projecto, passando por redactor, revistaprogramar@portugal-a- revisor, editor e agora coordenador. Bastante tempo, considerando que o projecto programar.org tem aproximadamente 6 anos. Mas saio com a sensação de dever cumprido, sabendo que fiz todos o que estava ao meu alcance para levar a revista mais longe, com ajuda de toda a equipa da Revista PROGRAMAR, a quem deixo também um Website muito obrigado. Durante o tempo que estive como editor e coordenador mudámos o http://www.revista-programar.info visual para algo mais apelativo, criámos parcerias com comunidades, passamos a distinguir os artigos mais votados, entre várias outras mudanças internas. Tudo isto graças à excelente equipa que torna possível a existência da Revista PROGRAMAR. ISSN Saio também com a certeza de ser bem substituído pelo António Santos, aquém 1 647-071 0 deixo desde já um obrigado, e desejo que com a sua a ajuda a Revista PROGRAMAR chegue ao “infinito e mais além”. Até sempre, António Silva <antonio.silva@revista-programar.info>A revista PROGRAMAR é um projecto voluntário sem fins lucrativos. Todos os artigos são da responsabilidade dos autores, não podendo a revista ou a comunidade ser responsável por alguma imprecisão ou erro. Para qualquer dúvida ou esclarecimento poderá sempre contactar-nos. 2
  2. 2. ÍNDICETEMA DE CAPA 7 iOS, Cocoa Touch & MVC Conheça mais algumas técnicas de programação para os dispositivos móveis da Apple. Bruno PiresA PROGRAMAR 15 Geração de Números Aleatórios (Parte 2) O segundo de 4 artigos do mesmo autor da excelente série “Programação em Lua”, desta vez sobre geração de nú- meros aleatórios. Augusto Manzano 18 Automatização de tarefas usando atributos Continuação do artigo sobre atributos em C# da edição número 30. Neste artigo, conheça melhor o funcionamento do conceito de contextos nesta linguagem. Flávio Geraldes 24 SQL Azure Fedarations Introdução às SQL Azure Federations. Victor Tomáz 29 Enigmas de C#: Arrays Saiba porque motivo, um array pode invocar uma System.ArrayTypeMismatchException. Paulo MorgadoCOLUNAS 31 Visual (NOT) Basic - Um pouco mais de Windows Phone 7 Saiba como pode tirar partido de algumas funcionalidades e características no desenvolvimento de aplicações para esta plataforma. Sérgio Ribeiro 40 Core Dump - Free as in Beer Atualmente, as empresas usam software open source, não por ser livre, mas por ser grátis. Conheça a opinião do au- tor sobre este tema. Fernando MartinsCOMUNIDADES 42 AzurePt - Como suportar múltiplas identidades no seu WebSite com Windows Azure AppFabric ACS Saiba como resolver o problema das identidades em demasia através do Azure. Nuno Godinho. 47 NetPonto - BizTalk Server - Princípios Básicos dos Mapas Explore através deste artigo, o editor de mapas do BizTalk Server. Sandro PereiraEVENTOS 03 Dez 2011 - 4° Evento da Comunidade Azure PT 16 a 18 Dez 2011 - Windows Phone 7 App Code Camp (Palmela) 17 Dez 2011 - 25ª Reunião Presencial da Comunidade NetPonto em Lisboa 27 Fev a 1 Mar 2012 - XIX SINFO - Semana Informática IST 17 Março 2012 - SQL Pass Saturday Portugal #115 Para mais informações/eventos: http://bit.ly/PAP_Eventos 3
  3. 3. NOTICIASO que a Microsoft, Oracle, IBM e SAP invulgares para a facturação da entrada e saída de dados nosNão Dizem aos Clientes sistemas. Gaughan também disse que uma grande transição tecnológica que estava a guiar as receitas da SAP durante os “Os quatro grandes vendedores de software últimos anos - movimentando clientes existentes do velho - Microsoft, Oracle, IBM e SAP – têm mo- sistema R/3 par o novo Business Suite - está quase termina- tivos escondidos que os clientes precisam da, o que significa que a SAP terá que ser mais agressiva de compreender, de outra forma podem ser com taxas de manutenção. Ele recomendou o bloqueio dos levados a comprar produtos e serviços que preços de manutenção agora. não servem as suas necessidades. Esse é De uma forma geral, Gaughan disse que a maior parte da o takeaway de uma palestra recente da inovação que está a ser feita por estas empresas está nos Gartner na Austrália, relatado pela IT News. seus braços de pesquisa. O seu verdadeiro objectivo é proteger o “satus quo” o maior tempo que for possível.Num simpósio esta semana, o analista da Gartner, DennisGaughan, explicou o que os quatro grandes vendedores estãorealmente a tentar fazer, baseando-se na experiência da Gart- Fonte: Business Insider, 19 de Novembro de 2011ner com os seus clientes. Tradução: Sara SantosA Microsoft quer principalmente proteger Windows e oOffice. A Microsoft é uma empresa de plataformas e o seu Programação com Lego Vence Quin-maior objective é proteger os seus monopólios altamente lu- ta Edição de Codebitscrativos de Windows e Office, enquanto ao mesmo tempoestabelece outras plataformas que farão com que seja mais Uma aplicação que usa peças Lego com o objectivo de permi-difícil para os clientes separarem-se delas mais tarde. A nova tir que crianças consigam fazer programação informática ga-funcionalidade é dada a “conta-gotas” aos utilizadores dessas nhou o primeiro prémio da edição deste ano do Sapo Code-plataformas medulares, mas os novos produtos existem para bits.proteger o núcleo. Ele aconselhou a que fosse tida extrema O Codebits, que começou na quinta-feira e terminou este sá-precaução antes de mudar para o Office 365, e disse que não bado, reuniu cerca de 800 participantes, que se dividiram emse entre numa mentalidade “toda-Microsoft. equipas para o habitual concurso de desenvolvimento de pro- jectos – as equipas têm 48 horas para criar e apresentar umaOs produtos da Oracle não funcionam muito bem juntos. ideia. Para além dos prémios (computadores, telemóveis eA força de vendas da Oracle é extremamente agressiva em outros aparelhos), as melhores ideias recebem apoio do Sapoempurrar um conjunto de produtos, mas tem muito menos para serem desenvolvidas. O júri atribuiu o primeiro prémio apontos de integração do que a SAP. De facto, a integração é uma aplicação móvel que fotografa uma base onde é possívelnormalmente deixada inteiramente ao cuidado do cliente. A colocar peças Lego e que converte a disposição e cor dessasOracle está igualmente muito relutante em falar sobre mapas peças num pequeno programa informático.de produto por temer que produtos futuros canibalizem osexistentes. A empresa obtém mais de 90% dos seus lucros O conceito foi trazido ao Codebits pelo programador alemão aatravés de taxas de manutenção e fará o que for necessário viver em Portugal Peter Bouda. O informático Pedro Leite, umpara manter essas taxas em entrada. Gaughan também ex- dos elementos da equipa de três pessoas que desenvolveu apressou alguma surpresa por tantos clientes continuarem a aplicação, explica que a ideia permite às crianças “usaremtrabalhar com a Oracle apesar de relatarem que a Oracle é “o algo tangível” para fazerem programação informática (umavendedor com quem é mais difícil lidar.” tarefa que tradicionalmente envolve escrever código usando linguagens com sintaxe própria). A IBM quer apoderar-se da tua estratégia de TI. A IBM Na demonstração feita no Codebits, uma sequência de peçastoma-se a si própria como um líder rígido, mas o seu verda- Lego foi usada para animar, no ecrã, uma pequena figuradeiro negócio é vender serviços de consultoria. Parra prospe- também da conhecida marca de brinquedos. As primeiras trêsrar, os gestores de conta da IBM tentam obter controlo sobre peças (duas vermelhas e uma verde) eram usadas para dar aa estratégia de TI de uma empresa de forma a poderem conti- instrução de que a figura devia mover-se para a direita e asnuar a empurrar novos produtos. Gaughan recomenda que se três peças imediatamente à frente indicavam quantas vezestome uma aproximação colaborativa ou de parceria. esse movimento deveria ser feito. A linha seguinte dava uma nova instrução à figura (por exemplo, saltar). E a linha final A SAP confunde os clientes com o preço. Muitos dos cli- pode servir para determinar se a animação pára ou se a se-entes da SAP pedem a Gartner ajuda para descobrir os pre- quência é novamente seguida.ços e licenciamento da SAP, uma vez que a SAP tem termos 4
  4. 4. NOTICIASO significado atribuído às sequências de peças depende da- As 25 Piores Palavras-passe do Anoquilo para que a aplicação que as fotografa tiver sido concebi-da – uma aplicação pode interpretar três peças vermelhascomo uma instrução para emitir um som e outra como uma A empresa SplashData, especialista em aplicações parainstrução para mostrar um número. smartphones incluindo gestão de palavras-passe, divulgou a lista das 25 piores passwords de 2011. Ou seja, aquelas que mais facilmente são descobertas por hackers.Com este conceito, as peças Lego podem ser usadas para Esta lista da SplashData baseia-se no estudo de milhões decriar imagens animadas, fazer música, construir uma calcula- palavras-passe “roubadas” durante este ano e que foram pos-dora ou, teoricamente, para qualquer tipo de efeito que se teriormente divulgadas online por hackers.consiga produzir com uma linguagem de programação. Muitos dos utilizadores usam sequências numéricas e alfabé-Este processo implica que as crianças – ou alguém por elas – ticas carregando em teclas contíguas do teclado - comomemorize o que significa cada sequência de peças. “As crian- “123456” ou “qwerty” - ou então a própria palavra “password”.ças são uma esponja”, afirmou Pedro Leite, mostrando-se De acordo com o director-executivo da SplashData, Morganconfiante de que isto não será um obstáculo à utilização do Slain - citado pelo site especializado em tecnologia Mashableconceito. Porém, admitiu que, uma vez desenvolvida a tecno- - “mesmo que as pessoas sejam encorajadas a escolher pala-logia, ainda é necessária “a killer app” – a expressão tipica- vras-passe seguras e fortes, muitas continuam a escolhê-lasmente usada para designar um uso de uma tecnologia que fracas, fáceis de adivinhar, colocando-se em risco de fraude epromove significativamente a sua adopção e, eventualmente, de roubo de identidade”.a transforma num sucesso comercial. A hesitação dos utilizadores na escolha de uma passwordNo último dia do Codebits, que decorreu no Pavilhão Atlânti- difícil poderá prender-se com o facto de, actualmente, cadaco, em Lisboa, foram mostrados cerca de 80 projectos, com pessoa ter de decorar várias palavras-passe para os diferen-cada equipa a ter 90 segundos para fazer a apresentação, tes serviços que consulta online.num último esforço para convencer o júri (que acompanhou o Um estudo de 2007, levado a cabo pela Microsoft, concluiutrabalho das equipas ao longo dos dois dias) e ainda com o que, em média, cada pessoa utiliza 25 palavras-passe dife-objectivo de conseguir os sete prémios atribuídos pelo públi- rentes e que, diariamente, usa oito delas. Desde 2007 queco, que podia votar nos projectos no final de cada apresenta- este número terá certamente aumentado.ção. O roubo de palavras-passe é um problema que afecta muitas“O Codebits faz parte da necessidade de o Sapo ter sangue pessoas em todo o mundo. Em 2010 a Comissão Federal denovo”, afirmou, no encerramento do evento, Abílio Martins, Comércio dos EUA recebeu 1,3 milhões de queixas por fraudeadministrador do Sapo (que pertence ao grupo PT), referindo- ou roubo de identidade.se ao facto de as ideias nascidas no Codebits poderem serintegradas no Sapo ou desenvolvidas em parceria com a em- Como pode, então, tornar a sua password mais segura?presa. “Vinte destes projectos serão contactados para traba- Usando uma variedade não sequencial de letras, números elharem connosco”, adiantou. símbolos e mudando a palavra-passe a cada seis meses. Outras dicas importantes: não use sempre a mesma pas- sword e evite usar palavras verdadeiras. Finalmente, não use nenhuma destas 25 piores palavras- passe do ano elencadas pela SlashData: 1.password, 2.123456, 3.12345678, 4.qwerty, 5.abc123, 6.monkey, 7.1234567, 8.letmein, 9.trustno1, 10.dragon, 11.baseball, 12.111111, 13.iloveyou, 14.master, 15.sunshine, 16.ashley, 17.bailey, 18.passw0rd, 19.shadow, 20.123123, 21.654321, 22.superman, 23.qazwsx, 24.michael, 25. football. Fonte: www.publico.pt 5
  5. 5. TEMA DA CAPAiOS, Cocoa Touch & MVC
  6. 6. TEMA DA CAPAiOS, Cocoa Touch & MVCMVC Entre as frameworks do Cocoa Touch de maior relevo estãoA grande maioria das plataformas de desenvolvimento de as seguintes:software permitem aos programadores desenvolver softwarecom base nos mais diversos padrões de arquitectura. Essa  Core Animationabordagem oferece um elevado grau de liberdade, permitin-do ao programador escolher a melhor solução para o seu  Core Locationproblema, com os recursos que dispõe.  Core Audio Controller  Core Data  UIKit A mais importante das frameworks que compõem o Cocoa View Model Touch é sem dúvida a UIKit. Esta framework, baseada em Objective-C, disponibiliza uma Figura 1 - MVC vasta quantidade de funcionalidades e ferramentas que per- mitem ao leitor desenvolver UI, gerir eventos (toque, gestos),Nos últimos anos tem-se vindo a assistir a uma evolução e aceder ao acelerómetro, câmara fotográfica, bateria, sensorconsolidação neste campo, principalmente quando o tema de proximidade e biblioteca de imagens.são os padrões de camada de apresentação e o CocoaTouch não foge a essa tendência. Apple definiu o padrão dearquitectura de software Model-View-Controller (MVC), comopadrão de referência para o desenvolvimento de aplicaçõespara os dispositivos que utilizam iOS (iPod, iPhone, iPad).O tema do MVC já foi abordado na edição nº27 da revistaPROGRAMAR, é pretendido que o leitor tenha em mente oconceito, pois este tema é incontornável no decorrer do arti-go. Figura 3 – Alguns dos componentes de UI do UIKitCocoa Touch O leitor vai, com toda a certeza, reconhecer alguns dos com-É uma camada de alto nível do iOS, composta por um con- ponentes da figura 3 disponibilizados pela UIKit Framework.junto de frameworks que disponibilizam ferramentas que A documentação é acessível e objectiva, permite desenvol-permitem ao leitor utilizar todo o potencial que a plataforma ver aplicações para iOS num curto espaço de tempo, o de-iOS tem para oferecer, ao mesmo tempo, permite desenvol- sign e a experiência de utilização proporcionada pelos com-ver aplicações que transmitem ao utilizador uma sensação ponentes de esta framework são transversais a todo o Siste-familiar durante a sua utilização graças à utilização transver- ma Operativo, o que garante ao leitor que o utilizador se vaisal nas várias aplicações do Sistema Operativo. sentir familiarizado com as suas aplicações. É aconselhado ao leitor, que antes de prosseguir, tenha em mente o artigo Introdução ao Objective-C e à plataforma iOS publicado no nº 30 da revista Programar. Leitor de RSS Para consolidar os conceitos apresentados anteriormente, o melhor é passar à prática e desenvolver um leitor de RSS. Execute o XCode, ferramenta incluída no iOS SDK, e crie um novo projecto recorrendo ao template Navigation-based Ap- plication. Figura 2 – A arquitectura do iOS 7
  7. 7. TEMA DA CAPAiOS, Cocoa Touch & MVC Este template contém uma View (RootViewController.xib) e um Controller (RootViewController.h/.m). A View, já contém um controlo do tipo UITableView, que é apresentado na figura 5 e o Controller contém os métodos e eventos necessários para fornecer ao controlo UITableView a informação necessária para apresentar os dados na View. Sendo assim, torna-se necessário criar um Model que forne- ça ao Controller o tipo de objectos a serem manipulados e enviados para a View.Figura 4 – Template Navigation-based ApplicationEste template oferece uma estrutura serve como ponto departida para desenvolver a nossa aplicação.Sem escrever qualquer tipo de código, se o leitor executar oprojecto, vai verificar que a aplicação se apresenta já umformato reconhecível. Figura 6 – Adicionar uma nova classe É necessário adicionar uma nova classe, definida como uma sub-classe de NSObject, ao projecto com o nome RssFeed, onde vão ser definidas as propriedades de uma feed, confor- me as figuras abaixo apresentam. #import <Foundation/Foundation.h> @interface RssFeed : NSObject {} @property (nonatomic, retain) NSString *FeedTitulo; @property (nonatomic, retain) NSString *FeedSumario; @property (nonatomic, retain) NSString *FeedUrl; @end Figura 7 – Interface da classe RssFeed Figura 5 – Primeira execução do projecto #import "RssFeed.h"O template escolhido fornece um conjunto de funcionalida- @implementation RssFeeddes básicas para uma aplicação que pretende ter um interfa- @synthesize FeedSumario;ce de navegação, o que é o caso. @synthesize FeedTitulo; @synthesize FeedUrl;Considera-se que um leitor de RSS básico, necessita de pelo @endmenos um ecrã com uma lista de feeds e um outro que per-mita visualizar o detalhe de um feed. Figura 8 – Implementação da classe RssFeed Agora que já está definido o modelo, vamos criar um reposi- tório que tem como objectivo fornecer ao Controller a lista de feeds a apresentar, repetindo o passo executado na figura 6, mas desta a classe vai chamar-se Repository. Nesta classe são definidas uma estrutura de dados para guardar os feeds e um método que devolve uma lista de feeds, conforme as figuras embaixo apresentam. 8
  8. 8. TEMA DA CAPA iOS, Cocoa Touch & MVC De seguida, vamos proceder às alterações necessárias ao#import "RssFeed.h"#import <Foundation/Foundation.h> Controller para este obter os dados para alimentar a View.@interface Repository : NSObject { Para isso, torna-se necessário criar uma estrutura de dados NSMutableArray *FeedsList; no RootViewContoller.h para acomodar os dados provenien-} tes do Repository.+ (NSArray*)getRssFeeds;@endFigura 9 – Interface da classe Repository #import "Repository.h" #import "DetailViewController.h" #import <UIKit/UIKit.h>#import "Repository.h" @interface RootViewController :@implementation Repository UITableViewController { }+ (NSArray*)getRssFeeds{ @property (nonatomic, retain) NSArray *feeds; @end NSMutableArray *feedList = [[NSMutableArrayalloc] init]; Figura 11 – Interface do Controller RootViewController for (int i = 0; i<20; i++) { if (i % 2 ==0) { Agora que existe onde guardar os dados recebidos, é neces- RssFeed *item1 = [[RssFeed alloc] init]; sário fornece-los ao controlo UITableViewController. Para item1.FeedTitulo = @"Revista Programar Nº30"; item1.FeedSumario = @"Publiquei na edição nº 30 isso, é preciso alterar o método viewDidLoad na implementa- da Revista Programar um artigo com o nome ção do Controller (RootViewContoller.m). “Introdução ao Objective-C e à plataforma iOS”. Nesta edição os leitores tiveram 15 dias para votar nos seus 3 artigos favoritos. Após a Agora que existe onde guardar os dados recebidos, é neces- conclusão da votação, o meu artigo ficou sário fornece-los ao controlo UITableViewController. Para classificado em 2º lugar. Devo confessar que não isso, é preciso alterar o método viewDidLoad na implementa- estava à espera, ainda [...] "; item1.FeedUrl = @"http://blastersystems.com/ ção do Controller (RootViewContoller.m). blog/2011/08/revista-programar-n30/? utm_source=rss&utm_medium=rss&utm_campaign= - (void)viewDidLoad revista-programar-n30"; { [feedList addObject:item1]; [super viewDidLoad]; [item1 release]; feeds = (NSArray*)[[Repository getRssFeeds] retain]; } } else{ RssFeed *item2 = [[RssFeed alloc] init]; Figura 12 – Alteração do método viewDidLoad no Controller Ro- item2.FeedTitulo = @"HTML5 & CSS3 no Visual otViewController Studio 2010"; item2.FeedSumario = @"Muito se tem falados nos últimos meses nos novos standards para Web O Controller alimenta o controlo UITableView, é notificado HTML5 e CSS3, comparações com outras dos seus eventos porque é uma sub-classe de UITa- tecnologias, milhares de blog posts, artigos de opinião e discussões sobre o assunto. bleViewController, o que o torna um Controller especializado Embora ainda não sejam um standard fechado, já em lidar com Views que contêm controlos do tipo UITa- existem projectos desenvolvidos outros bleView. projectos em desenvolvimento recorrendo a estas tecnologias[...] "; A grande vantagem na utilização de este Controller, é que item2.FeedUrl = @"http://blastersystems.com/ blog/2011/06/html5-css3-no-visual-studio-2010- contém um template que ajuda a lidar com o controlo UITa- 2/?utm_source=rss&utm_medium=rss&utm_campaign= bleView. Um dos métodos incluído nesse template é o num- html5-css3-no-visual-studio-2010-2"; berOfRowsInSection, que informa o UITableView do número [feedList addObject:item2]; de elementos que vai conter. [item2 release]; Como o leitor já obteve do Repository os feeds, pode agora } informar o UITableView do número de elementos que lhe } return [feedList autorelease]; vamos fornecer.}@end - (void)viewDidLoad { [super viewDidLoad]; feeds = (NSArray*)[[Repository getRssFeeds] Figura 10 – Implementação da classe Repository retain]; }A classe Repository contém apenas um método que constróium conjunto de feeds estáticos e os agrega numa estrutura Figura 13 – Notificar o controlo do número de elementos que vai conterde dados para mais tarde alimentar o controlo UITableView. 9
  9. 9. TEMA DA CAPAiOS, Cocoa Touch & MVCJá existem os feeds na estrutura de dados do Controller e jáinformamos o UITableView do número de elementos que lhevamos fornecer, apenas resta adicionar as feeds ao UITa-bleView.O leitor pode aproveitar novamente a vantagem de o Control-ler ser uma sub-classe de UITableViewController, porque notemplate já existe um método definido para fornecer os da-dos ao UITableView, apenas é necessário alterar um poucoo código existente.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"myCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } Figura 17 - Primeira execução do projecto if (feeds !=nil) { [cell.textLabel setText:((RssFeed*) [feeds Nesta fase temos um leitor de RSS parcialmente construído, objectAtIndex:indexPath.row]).FeedTitulo]; já apresentamos no dispositivo a lista de feeds. No entanto } no início do projecto definimos que também iriamos disponi- return cell; bilizar uma View para o detalhe do feed.} Para isso vamos adicionar um novo Controller, o De- Figura 14 – Alimentar o UITableView com os dados a apresentar tailViewController, mas desta vez o novo Controller é uma sub-classe de UIViewController.Com base no número de feeds vai apresentar, percorre aestrutura de dados que contém as feeds a passa o título dafeed à célula.Estas células são objectos do tipo UITableViewCell, e sãoaltamente extensíveis, podendo o leitor customiza-las e apre-sentar a informação de outras formas.Para concluir esta primeira fase do leitor de RSS, dado que agestão de memória dos objectos criados pelo programadorse encontram a seu cargo, torna-se obrigatório libertar amemória alocada à estrutura de dados que contém as feedsquando a View é libertada. - (void)dealloc { [super dealloc]; [feeds release]; Figura 18 – Adicionar um novo Controller e View para o detalhe do } feed Figura 15 – Libertação da memória alocada Quando é criado, é composto por 3 ficheiros, um para definirAgora, apenas resta ao leitor testar o código produzido, para a interface do Controller outro para definir a implementaçãoisso basta executar o projecto. do Controller e ainda um terceiro para definir a View que vai exibir o detalhe dos feeds. 10
  10. 10. TEMA DA CAPA iOS, Cocoa Touch & MVCPara apresentar o detalhe da feed, é proposto criar um UILa-bel para apresentar o título da feed, um UITextView para - (id)initWithFeed:(RssFeed *)feed{apresentar o sumário do feed e um UIButton para abrir afonte da feed no safari. self = [super init]; if (self) { feedDetail = feed; } return self; } - (void)viewDidLoad { [super viewDidLoad]; [FeedTitle setText:feedDetail.FeedTitulo]; [FeedSummary setText:feedDetail.FeedSumario]; } - (void)viewDidUnload { [super viewDidUnload]; } -(IBAction)linkButtonClick:(id)sender { NSString* launchUrl = feedDetail.FeedUrl;; Figura 19 – View de detalhe de feeds [[UIApplication sharedApplication] openURL: [NSURL URLWithString: launchUrl]]; }Agora é necessário definir o Controller da View acima apre-sentada, e para isso basta colocar na interface do De- - (void)dealloctailViewController a definição das propriedades que com- {põem a View bem como definir um novo construtor para o [super dealloc];Controller, para suportar receber um objecto do tipo RssFeed [feedDetail release];quando é instanciado. } @end#import "RssFeed.h"#import <UIKit/UIKit.h>@interface DetailViewController : UIViewController Figura 21 – Implementação do Controller DetailViewController 7@property (retain, nonatomic) IBOutlet UILabel*FeedTitle; Para terminar apenas falta referenciar os componentes defi-@property (retain, nonatomic) IBOutlet UIButton nidos no Controller com os componentes definidos na View.*FeedOnSafari;@property (retain, nonatomic)IBOutlet UITextView *FeedSummary; Esse processo é executado através de outlets, que nada mais são do que apontadores que permitem ao compilador@property (retain, nonatomic) RssFeed *feedDetail; saber onde se encontra no Controller definido um compo-- (id)initWithFeed:(RssFeed *)feed;@end nente definido na View e qual a acção que o Controller ne- cessita de executar quando um desses componentes disparaFigura 20 – Definição do Interface do Controller DetailViewController um evento.No ficheiro de implementação do DetailViewController é ne- Neste caso, o botão feedOnSafari, quando a View detectacessário implementar o novo construtor, a gestão de memó- um toque, pede ao Controller para executar o evento linkBut-ria dos objectos criados e gerir o evento TouchDown do bo- tonClick, que por sua vez vai lançar o Safari cmo o URL datão FeedOnSafari. feed.#import "DetailViewController.h"@implementation DetailViewController@synthesize FeedOnSafari;@synthesize FeedSummary;@synthesize FeedTitle;@synthesize feedDetail; 11
  11. 11. TEMA DA CAPAiOS, Cocoa Touch & MVC (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { DetailViewController *details = [[DetailViewController alloc] initWithFeed: (RssFeed*) [feeds objectAtIndex:indexPath.row]]; [self.navigationController Figura 22 – Outlets referenciadas no Organizer da View pushViewController:details animated:YES];Dá-se por concluído o ecrã de detalhe da feed, apenas falta [details release];alterar o ficheiro de implementação do RootViewController }para que este navegue para a View de detalhe quando éselecionada uma feed. Figura 24 – Método a alterar para existir navegar para o detalhe da feed selecionadaÉ também necessário alterar o método cellForRowAtIndex-Path e adicionar um indicador na célula de cada feed paraque o utilizador compreenda que existe um ecrã de detalhepara o qual pode navegar e alterar também o método didSe-lectRowAtIndexPath para este invocar ao navigationControl-ler a navegação para um novo ecrã.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"myCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.accessoryType = UITableViewCellSelectionStyleBlue; if (feeds !=nil) { [cell.textLabel setText:((RssFeed*) [feeds objectAtIndex:indexPath.row]).FeedTitulo]; Figura 25 – Comportamento final da aplicação } O código fonte da aplicação encontra-se disponível em http:// return cell; blastersystems.com/ContentDownload/PAPTBC.zip}Figura 23 – Alteração necessária no método já definido na figura 14AUTOR Escrito por Bruno Pires Exerce funções de consultor de IT na Novabase desde 2008, com experiência de maior relevo nas áreas da banca e televi- são digital, onde ganhou competências nas mais várias tecnologias. Membro da Comunidade NetPonto (http://netponto.org) e autor do blog http://blog.blastersystems.com - Twitter: @brunoacpires 12
  12. 12. Elege o melhor artigo desta edição Revista PROGRAMAR http://tiny.cc/ProgramarED32_V
  13. 13. A PROGRAMARGeração de números aleatórios (Parte 2)Automatização de tarefas usando atributosSQL Azure FedarationsEnigmas de C#: Arrays
  14. 14. A PROGRAMARGNA - GERAÇÃO DE NÚMEROS ALEATÓRIOS (Parte 2)No artigo anterior foi indicado o método de geração de Valor Produto donúmeros pseudo-aleatórios meio do quadrado. Em Iteração Multiplicado Meiocontinuação será mostrado neste o método do produto do 32534meio. 0 01901970174 58461INTRODUÇÃO 58461 1 00115168170 01970O método de geração de números pseudo-aleatórios produto 01970do meio é indicado em Banks et al. (2009), sendo um algo- 2 00029880960 15168ritmo idêntico ao algoritmo utilizado para o quadrado do 15168meio. A diferença deste método está no fato de pegar-se 3 00453219840dois valores como sementes com o mesmo número de dígi- 29880tos e sobre estes valores traçar a acção do algoritmo. 29880 4 01590183720 53219ALGORITMO DO MEIO DO PRODUTO 53219 5 04799449077Para fazer uso do método do meio do produto pega-se em 90183dois valores de sementes e efectua-se a sua multiplicação. É 90183 6 08968609167ideal que os valores de sementes sejam valores com um 99449tamanho de cinco dígitos e que não possuam na sua estrutu- 99449ra valores zero em qualquer uma das posições. 7 06823096441 68609 68609Do produto obtido tira-se o valor do meio contento o mesmo 8 01584593464número de dígitos das sementes utilizadas. Para sementes 23096iniciais de cinco dígitos obter-se-á um produto do meio que 23096 9 01953759928deve ter um tamanho de onze dígitos. Se o valor obtido não 84593tiver onze dígitos de tamanho torna-se necessário acrescen-tar á esquerda do valor tantos zeros quantos necessários Observe que após aplicação do método são obtidos os valo-para completar o tamanho de onze dígitos. Esta atitude é res 01970, 15168, 29880, 53219, 90183, 99449, 68609,necessária no sentido de que se consiga extrair exactamente 23096, 84593 e 53759.cinco dígitos do meio deixando de cada lado três dígitos dedistância. A aplicação do método pode ser realizada a partir do algoritmo seguinte:De seguida multiplica-se o valor do meio do produto com ovalor da segunda semente e obtém-se assim um novo produ-to. Tira-se deste novo produto os dígitos do novo meio com a N1/N2 = informação obtida manualmente ou por outro meiomesma quantidade de dígitos do valor da semente e efectua para a formação dos números das duas sementes iniciais,-se a multiplicação deste valor pelo valor do meio anterior e tendo o tamanho de cinco dígitos.assim por diante. p = resultado do produto obtido com a multiplicação dosA tabela a seguir apresenta a sequência de geração de dez valores de N1 com N2 (p = N1 x N2).valores obtidos a partir do método do meio do. Assim, consi-dere os como sementes os valores 32534 e 58461 td = tamanho em dígitos do resultado do produto de N1 e N2: td = tamanho(p). SE (td < 11) ENTÃO T = 11 – td ZEROS = 0 PARA I = 1, T, 1 ZEROS = ZEROS + “0” FIM_PARA p = ZEROS + p FIM_SE 15
  15. 15. A PROGRAMARGNA - GERAÇÃO DE NÚMEROS ALEATÓRIOS (Parte 2)T = tamanho ajustado para onze dígitos, onde 11-td igual ao CONCLUSÃOnúmero de zeros a ser inserido à esquerda de p, se td formenor que 11. Neste artigo foi apresentado o método de geração de números pseudo-aleatórios meio do produto, sendo esteMP = meio do produto que será utilizado como o valor da mais eficiente que o método do meio do quadrado, poispróxima semente que é a extração do valor central de cinco demora mais a apresentar valores zero.dígitos do valor p, ou seja, cinco dígitos a partir do quartodígito. BIBLIOGRAFIAN1 = passa a ser o valor de N2. BANKS, J., CARSON, J. S., NELSON, B. L. & NICOL, D. M.N2 = passa a ser o valor de MP. Discrete Event System Simulation. 5. ed. USA: Pearson Education. 2010.AUTOR Escrito por Augusto Manzano Natural da Cidade de São Paulo, tem experiência em ensino e desenvolvimento de programação de software desde 1 986. É professor da rede federal de ensino no Brasil, no Instituto Federal de Educação, Ciência e Tecnologia. É também autor, pos- suindo na sua carreira várias obras publicadas na área da computação. 16
  16. 16. A PROGRAMARAutomatização de tarefas usando atributos (IConstructionCallMessage ctorMsg) {Introdução ctorMsg.ContextProperties.Add(new LogProperty());Na edição número 30 da revista Portugal a Programar falá- }mos de atributos em C#. Vimos como podíamos usar esta }funcionalidade para reconhecer um certo tipo de classes, oumesmo atribuir-lhes certas funcionalidades. Sendo uma fun- Como se pode ver, neste caso, não herdamos da mesmacionalidade muito interessante convenhamos que, na prática, classe que no artigo anterior. Em vez de herdarmos de Attri-muito raramente a iremos utilizar. Se quisermos caracterizar bute vamos herdar de ContextAttribute. Isto indica à fra-uma determinada classe ou que esta tenha determinados mework que este é um atributo especial e que queremos quecomportamentos provavelmente iremos usar uma interface seja tido em conta na criação de contextos.ou herança. Se quisermos guardar informação ou implemen-tar certas funcionalidades o mais certo é usarmos um dele- Um dos métodos a que temos de fazer override é o GetPro-gate. Ou então implementar na própria classe. pertiesForNewContext. Neste método temos como tarefa adicionar uma propriedade nossa à lista de propriedades doSendo assim, muito provavelmente, tirando os atributos da novo contexto.framework como o Serializable ou o WebMethod dificilmenteiremos usar outros. Ora, se usamos a propriedade, temos de a criar:No entanto, há um tipo de atributos que pode ser muito útil. class LogProperty : IContextProperty, IContribute-Acima de tudo porque, ao contrário daqueles que falámos no ObjectSinkúltimo artigo, não precisa de ser chamado por nós. Ao invés {disso é automaticamente chamado pela framework quando /*um objecto nosso – que tenha esse atributo – é usado. * Temos de indicar qual o nome * pela qual a property vai serCriar um proxy de objectos * conhecida dentro do contexto */Este funcionamento parte do conceito de contextos. Quando public string Name {um objecto é criado, é criado também um contexto, onde get { return "Log"; }este objecto está inserido. Este contexto tem uma cadeia de }funções, que são executadas cada vez que se entra ou saido contexto, ou seja, cada vez que se chama um método, ou /*um método retorna. Aquilo que podemos fazer é colocar a * O que fazer quando o contexto ficanossa funcionalidade nesse processo. Ou seja, criar uma * bloqueado. Tipicamente não é relevanteespécie de proxy. */ public void Freeze(Context newContext)Com um exemplo prático talvez se perceba mais facilmente. {}Vamos então fazer um sistema de log’s que nos permite // Temos de verificar se o novo contexto // está OKsaber qual a classe e o método que está a ser chamado,quais os argumentos, e quanto tempo demora a execução public bool IsNewContextOK(Context newCtx)do método. { // Temos de verificar se o novo contextoNaturalmente temos de começar por criar o nosso atributo: // que recebemos tem a nossa property LogProperty p = newCtx.GetProperty("Log") asclass LogAttribute : ContextAttribute LogProperty; { if (p == null) // Temos de passar para o pai o nome do { //atributo de contexto. // Se não tiver alguma coisa está mal public LogAttribute(): base("Log"){} return false; /*Neste método adicionamos a nossa property } * ao contexto que está a ser criado para o // Se tiver continuamos * objecto */ return true; }public override void GetPropertiesForNewContext 18
  17. 17. A PROGRAMAR Automatização de tarefas usando atributosNos comentários está a explicação para a maior parte do nextSink.SyncProcessMessage(msg);código. No entanto, há um método que é especial. É no mé- IMethodReturnMessage mrm = (rtnMsg astodo GetObjectSink que a «magia» vai acontecer. Até agora IMethodReturnMessage);temos estado a criar as classes necessárias para construir a return mrm;cadeia de objectos que vão ser chamados no contexto. Mas }é aqui que efectivamente estamos a colocar o nosso código. } Se precisamos de uma mensagem, vamos então cria-la:.Nos comentários está a explicação para a maior parte do Como se pode ver este objecto é, por agora, relativamentecódigo. No entanto, há um método que é especial. É no mé- simples. Limitamo-nos a chamar a mensagem seguinte natodo GetObjectSink que a «magia» vai acontecer. Até agora cadeia, e retornamos a resposta. Um proxy sem lógica detemos estado a criar as classes necessárias para construir a negócio.cadeia de objectos que vão ser chamados no contexto. Masé aqui que efectivamente estamos a colocar o nosso código. Usar o proxyO LogSink é uma mensagem que, para todos os efeitos, vaiser o nosso proxy. As mensagens vão sendo chamadas, Mas como se usam estes atributos? Vamos criar uma classesequencialmente, até ao objecto final. Neste método recebe- simples que vai ser sujeita a registo através do nosso logger:mos o objecto propriamente dito, e qual a mensagem a serchamada após a nossa. Aquilo que temos de fazer é criar a [Log]nossa mensagem, onde guardamos quem é o próximo na public class LoggedObject : ContextBoundObjectfila, e devolvemos a mensagem para a plataforma. { public void metodo(String str)Se precisamos de uma mensagem, vamos então cria-la: { Console.WriteLine("This is a method that prints " + str);class LogSink : IMessageSink } { } // Precisamos de guardar a próxima // mensagem para a poder retornar Como podemos ver é bastante simples. Tal como nos atribu- tos normais, basta colocar o nosso atributo como atributo private IMessageSink nextSink; desta classe. Tem, no entanto, um pequeno truque. Desde o public LogSink(IMessageSink nextSink) { this.nextSink = nextSink; inicio que se tem falado de contextos. Que estes atributos } são usados quando entramos ou saímos de um contexto. public IMessageSink NextSink Temos então de dizer à framework que queremos que este { objecto esteja associado a um contexto. Para isso basta get { return this.nextSink; } herdar da classe ContextBoundObject. } Vejamos então o que acontece se tentarmos usar este objec-// Comportamento a executar caso a mensagem seja to:// chamada de forma assíncrona Vamo-nos limitar a// chamar a próxima mensagem e devolver o resultado static void Main(string[] args) { public IMessageCtrl AsyncProcessMessage LoggedObject lo = new LoggedObject(); (IMessage msg, IMessageSink replySink) lo.Metodo("shrubbery"); { } IMessageCtrl rtnMsgCtrl = nextSink. AsyncProcessMessage(msg, replySink); Aquilo que vemos é que acontece muito pouco: return rtnMsgCtrl; }// Aqui é onde vamos fazer a nossa intercepção// Por agora vamos, simplesmente, chamar// a próxima mensagem. O nosso método imprime aquilo que é esperado dele, e nada public IMessage SyncProcessMessage(IMessage msg) mais. { IMessage rtnMsg = 19
  18. 18. A PROGRAMARAutomatização de tarefas usando atributosAntes de tentarmos ir mais adiante com o nosso logger, va- Se tentarmos correr este código já vemos algo mais interes-mos ver se a nossa mensagem está a ser correctamente sante:executada na cadeia. Vamos voltar ao método SyncProces-sMessage do objecto LogSink e colocar o nosso debug:public IMessage SyncProcessMessage(IMessage msg) { Console.WriteLine("Antes de executar o método."); IMessage rtnMsg = nextSink.SyncProcessMessage(msg); Console.WriteLine("Depois de executar o Podemos ver que executámos um LoggedObject, qual o método."); nome do método que foi executado, e o parâmetro que foi IMethodReturnMessage mrm = (rtnMsg as passado. Falta-nos apenas do tempo que demorou a correr: IMethodReturnMessage); return mrm; public IMessage SyncProcessMessage(IMessage msg) } { // A mensagem que recebemos tem a // informação que procuramos MethodCallMessage mcm = (msg as IMethodCallMessage);Se corrermos a aplicação novamente já vemos algo de dife- Console.WriteLine("Tipo do objecto: " +rente: mcm.TypeName); Console.WriteLine("Nome do método: " + mcm.MethodName); Console.WriteLine("Parametros: " + String.Join (", ", mcm.Args)); DateTime before = DateTime.Now;Estamos no bom caminho. A nossa mensagem está a ser IMessage rtnMsg = nextSink.SyncProcessMessagecorrectamente colocada na cadeia de mensagens do objecto (msg);e, quando o método do objecto é chamado, a nossa mensa- DateTime after = DateTime.Now;gem faz o seu trabalho. Console.WriteLine("Demorou " + (after - before)Vamos então tentar transformar o nosso sink num logger + " a correr.");com informação util: IMethodReturnMessage mrm = (rtnMsg as IMethodReturnMessage);public IMessage SyncProcessMessage(IMessage msg) return mrm; } { // A mensagem que recebemos tem No entanto, visto que o nosso método é demasiado básico, // a informação que procuramos vamos faze-lo demorar mais tempo artificialmente: IMethodCallMessage mcm = public void Metodo(String str) (msg as IMethodCallMessage); { Console.WriteLine("Tipo do objecto: " + Console.WriteLine("This is a method that prints mcm.TypeName); " + str + " once"); Console.WriteLine("Nome do método: " + Thread.Sleep(1500); mcm.MethodName); Console.WriteLine("And prints " + str + " again"); Console.WriteLine("Parametros: " + } String.Join(", ", mcm.Args)); IMessage rtnMsg = nextSink.SyncProcessMessage Se corrermos isto vemos que, para além do segundo e meio (msg); que inserimos, demorou mais uns milésimos de segundo: IMethodReturnMessage mrm = (rtnMsg as IMethodReturnMessage); return mrm; } 20
  19. 19. A PROGRAMAR Automatização de tarefas usando atributosTemos assim uma forma de registar todos os acessos a um Vemos que este código demorou 11 segundos a correrdeterminado objecto. (NOTA: foi retirado o sleep do método que imprime as duasAqui, para efeitos demonstrativos, imprimimos a informação linhas).para o ecrã, no entanto pode muito facilmente ser guardada, Agora, criamos um objecto igual, mas que não herda depor exemplo, numa base de dados. Pode-se até ir um pouco ContextBoundObject nem usa o atributo de log, e alteramosmais longe e registar também qual é o utilizador que está a novamente o Main:fazer o acesso. E até criar um sistema de permissões. Facil-mente, sabendo qual o utilizador que está a tentar usar a static void Main(string[] args)funcionalidade, e que tipo de permissões tem, se pode per- {mitir ou impedir que use essa funcionalidade da aplicação. NotLoggedObject nlo = new NotLoggedObject(); DateTime before = DateTime.Now;Não há soluções, há compromissos for (int i = 0; i < 10000; i++) {No entanto, como em quase todas as decisões de arquitectu- String str = "shrubbery";ra deste tipo, é necessário ter em conta aquilo que se tem de Console.WriteLine("Tipo do objecto: " +abdicar quando se quer certas regalias. nlo.GetType().ToString()); Console.WriteLine("Nome do método: " +Esta funcionalidade tem um grande peso em termos de per- "Soma");formance. Só para se ter uma ideia, vamos fazer algumas Console.WriteLine("Parametros: " + str);medições. DateTime beforeSum = DateTime.Now; nlo.Metodo(str);Para começar, vamos ver quanto tempo demora para impri- DateTime afterSum = DateTime.Now;mir 10000 vezes a mesma frase, usando o nosso logger.Vamos alterar o método Main: Console.WriteLine("Demorou " + (afterSum - beforeSum) + " a correr."); static void Main(string[] args) } { DateTime after = DateTime.Now; LoggedObject lo = new LoggedObject(); Console.WriteLine("nnnDemorou " + DateTime before = DateTime.Now; (after - before) + " a correr."); int sum = 0; WaitForKeyPressAndExit(); for (int i = 0; i < 10000; i++) } { lo.Metodo("shrubbery"); Temos o seguinte resultado: } DateTime after = DateTime.Now; Console.WriteLine("nnnDemorou " + (after - before) + " a correr."); WaitForKeyPressAndExit(); } Com programação tradicional temos um código quase 40% mais rápido. Isto, em sistemas críticos, pode ser o suficiente para não termos a disponibilidade que esperamos. 21
  20. 20. A PROGRAMARAutomatização de tarefas usando atributosConclusão que uma determinada aplicação deixe de ser útil, pois nãoUtilizando o contexto do objecto podemos injectar um proxy faz o seu serviço no tempo definido. Há sempre formas deque vai ser chamado sempre que esse objecto seja utilizado. aumentar a capacidade de um serviço, adicionar máquinas aDesta forma podemos criar um proxy que nos permite adicio- um cluster, aumentar a capacidade de processamento, dis-nar lógica de controlo antes e depois da execução de um cos/memórias mais rápidas... No entanto tudo isto custa di-método. Este proxy é chamado automaticamente pela fra- nheiro. Além de que, muitas vezes, há optimizações que têmmework fazendo com que deixe de ser uma preocupação de ser feitas no código, ao nível dos algoritmos e das biblio-nossa. Teremos assim menos repetição de código e um con- tecas usadas. No entanto, nos casos em que é possível detrolo mais fino na execução da nossa aplicação. ser usado, temos aqui uma forma de ter código bastante limpo, que simplifica em muito certas tarefas que são neces- sárias de fazer de forma repetida.Mas isso não vem sem um custo. Neste caso um custo deperformance. Este é um processo pesado e que pode levar aAUTOR Escrito por Flávio Geraldes Licenciou-se em Engenharia Informática e Computadores no Instituto Superior Técnico tendo-se especializado na área de Programação e Sistemas de Informação. Após a finalização do curso juntou-se à Sybase SBS Software onde teve oportunidade de trabalhar com várias tecnologias focando-se particularmente em .NET. Actualmente é consultor da Sybase SBS Software numa empresa de telecomunicações onde é responsável pelo desenho e desenvolvimento de várias aplicações. Enigmas de C# Arrays por Paulo MorgadoDadas as seguintes classes:public class Posição new Posição3D{ {} X = 2, Y = 1,public class Posição2D : Posição Z = 3{ }, public int X { get; set; } new Posição3D public int Y { get; set; } {} X = 3, Y = 2,public class Posição3D : Posição2D Z = 1{ } public int Z { get; set; } };} try { Process(array);Qual é a saída do seguinte código? Console.WriteLine("Dados processados!"); } catch (Exception ex)public static void Exec() {{ Console.WriteLine("{0}: {1}", var array = new Posição3D[] ex.GetType().FullName, { ex.Message); new Posição3D } { } X = 1, Y = 2, Z = 3 }, Veja a resposta na página 29 22
  21. 21. Elege o melhor artigo desta edição Revista PROGRAMAR http://tiny.cc/ProgramarED32_V
  22. 22. A PROGRAMARIntrodução às SQL Azure FederationsO cloud computing tem sido um assunto muito debatido, no Scale Outmundo das tecnologias de informação não só pelacapacidade de computação de alta disponibilidade, Outra limitação natural, quem em muitos cenários se revelaescalabilidade e elasticidade bem como pela redução de mais importante ainda, é a capacidade de processamento docustos que o modelo baseado em serviços proporciona. servidor. Quantas vezes as necessidades de escalabilidade são provocadas pelo aumento da carga de processamento?O SQL Azure da Microsoft fornece um conjunto de serviços, Imagine um website de vendas de bilhetes onde devido aoque implementa as capacidades de armazenamento e lançamento de um evento o número de pedidos ao servidorprocessamento de dados relacionais na cloud. O SQL Azure aumenta drasticamente durante alguns dias.é um serviço de alta disponibilidade e tolerante a falhas,onde os programadores não têm que se preocupar com Numa aplicação multicamada suportada pela plataformainstalação, configuração ou manutenção dos servidores de Windows Azure, a gestão da capacidade de resposta abases de dados. pedidos na camada de apresentação ou na camada lógica de negócio é simples, podemos por exemplo aumentar ouSQL Azure é baseado numa versão especial do Microsoft diminuir o número de servidores (web e worker roles)SQL Server pelo que permite ainda ao programador ser consoante a carga a que o website está a ser sujeita (scalebastante produtivo dado que usa o mesmo modelo relacional out).baseado em T-SQL e permite usar as mesmas ferramentasde desenvolvimento e gestão usadas nas bases de dadoslocais.Actualmente, dentro da Web Editions, podemos adquirirbases de dados até 5Gb onde se paga cerca de 9.99$ se abase de dados tiver até 1Gb ou 49.95$ se o tamanho forentre 1 e 5Gb. Dentro da Business Edition podemos ter umabase de dados até 50Gb onde o pagamento é fraccionadoem blocos de 10Gb sendo que cada 10Gb custa 99.99$.Escalabilidade O problema é que este modelo de escalabilidade elástica não estava presente na camada de acesso a dados (base deScale Up dados) sem que houvesse a necessidade de o implementar.Actualmente o modelo de escalabilidade mais simples de As SQL Azure Federations vêm fornecer à camada deutilizar em SQL Azure é a escalabilidade vertical (scale up), acesso a dados essa capacidade, ou seja, será possívelou seja, aumentar o tamanho máximo de armazenamento na aumentar ou diminuir o número de nós que constitui abase de dados. camada de acesso a dados sem que a mesma fique indisponível durante essas alterações. Vêm ainda permitir um aumento mais granular do espaço de armazenamento e consequente poupança de custos. Outro “cliente” muito importante das federations serão as aplicações multi-tenant, vamos tentar perceber porquê.Figura 1.1 – Escalabilidade Vertical (Scale Up)Como vimos anteriormente a escalabilidade em SQL Azureestá, em termos de capacidade de armazenamento limitadaa 50Gb. Brevemente irá haver um aumento deste limite para150Gb mas o que se pretende que o leitor retenha é que acapacidade de armazenamento em cada base de dados élimitada. Poderemos chegar a uma altura em que acapacidade de armazenamento disponível não é suficiente. 24
  23. 23. A PROGRAMAR Introdução às SQL Azure FederationsMulti-tenant ShardingQuando se desenha uma aplicação multi-tenant (multi- Para resolver este problema era necessário recorrer àcliente), uma das primeiras e grandes opções que se tem implementação manual de sharding. Sharding é um padrãoque tomar tem a ver com a distribuição ou não dos dados que permite aumentar a escalabilidade e a performance dedos clientes por várias base de dados. grandes bases de dados. Aplicar o padrão a uma base de dados significa “partir” essa base de dados em pedaços maisDe uma forma geral podemos optar por meter todos os pequenos e distribui-los por vários servidores de modo adados dos clientes numa única base de dados ou ter uma obter escalabilidade. A cada pedaço resultante chamamosbase de dados para cada cliente. Existe ainda uma opção de shard.intermédia que é ter vários schema dentro de uma únicabase de dados onde cada cliente tem um schema. Não Neste padrão são as linhas das tabelas que são divididasiremos considerar esta opção por se enquadrar dentro da pelos vários servidores. Uma outra opção seria realizar oopção de guardar todos os dados numa única base de dados particionamento vertical. No particionamento vertical osrelativamente à análise que pretendemos fazer. dados são separados por distribuição de tabelas completas entre os servidores. Meter a tabela de clientes num servidorQuando o alojamento é on-premisses (local), a opção mais e a tabela de vendas noutro servidor seria um exemplo decomum é o fornecimento de uma base de dados para cada partição vertical. A partição de dados por valor (sharding)cliente. permite atingir maior escalabilidade porque, por exemplo, não está limitada ao número de tabelas existentes naUma base de dados por cliente aplicação e permite a divisão de tabelas com mais acessos.Figura 2.1 – Uma base de dados por cliente (tenant)Esta opção tem as suas vantagens e desvantagens mas o Figura 2.3 – Sharding de uma base de dadosque importa reter neste caso é que, no alojamento local, nãoexiste o limite mínimo em relação ao custo de uma base de Nas aplicações multi-tenant podemos começar com umadados. Na cloud este limite mínimo é actualmente de 1Gb, única base de dados e, à medida que o volume de carga vaiou seja, o custo mínimo de uma base de dados em SQL crescendo, usar o padrão de sharding para distribuir osAzure é de 9.99$. dados dos clientes por várias bases de dados.Dependendo da aplicação esta pode ser uma opçãodemasiado cara e, nesse caso, a opção por juntar todos osdados dos clientes numa única base de dados pode ser aopção mais correcta.Tudo numa base de dados Figura 2.4 – Sharding numa aplicação multi-tenant Com SQL Azure Federations vamos poder usar este padrão com “muito pouco esforço” e sem ter downtimes. SQL Azure FederationsFigura 2.2 – Todos os clientes numa única base de dadosTanto uma opção como a outra têm problemas de Distribuição dos dadosescalabilidade. Ter todos os dados numa única base de Um conceito muito importante antes de entrarmos nadados, além do limite de 50Gb para dados pode ter arquitectura das SQL Azure Federations é a distribuição dosproblemas de capacidade de processamento. Ter uma base dados. Conforme pode verificar na figura seguinte existemde dados por cliente pode ser bastante dispendioso ou, no dados centralizados, particionados e replicados.limite, os 50Gb de armazenamento podem não chegar paraum cliente que tenha muita informação para armazenar. 25
  24. 24. A PROGRAMARIntrodução às SQL Azure Federations Federation Federations são os objectos que suportam a funcionalidade de distribuição dos dados entre as várias partições. Estes objectos representam o schema da federation e contêm a chave da distribuição, o tipo de dados e o estilo da distribuição. Na imagem anterior a base de dados AppDB representa uma base de dados com federations. Uma base de dados pode ter várias federations. Federation Member (Shard) A cada partição de dados dentro de uma federation chamamos federation member. Na imagem acima podemos observar uma federation para a tabela Clientes com vários Figura 3.1 – Distribuição dos dados membros. Cada federation member contêm uma parte dos dados e é suportado por uma instância de base de dadosCentralizados SQL Azure que fornece lhe capacidade de armazenamento e computação.Como exemplo de dados centralizados poderemos ter astabelas de configurações. São dados sobre os quais nãoexistem muitas operações de leitura e escrita e que estãodisponíveis apenas num único local.ReplicadosNeste caso imagine a tabela de códigos postais dos CTT.São dados sobre os quais apenas existem operações deleitura (as escritas são possíveis mas raras) e que porquestões de performance estão disponíveis em todas asbases de dados da aplicação. Dados replicados (referencedata) são muito importantes relativamente a operações de Figura 4.2 – Arquitectura das federations memberjoin. Federation Distribution KeyParticionados Os dados são distribuídos pelos vários federation membersNesta categoria estarão a grande maioria dos dados onde com base na federation key. Esta chave deve ser um campocada “pedaço” de dados reside numa e apenas numa base que identifica univocamente cada partição possível para osde dados. dados. Na imagem anterior podemos verificar que o campo ID é a federation key.Arquitectura Atomic Unit Uma unidade atómica representa todo o conjunto de dados com a mesma federation key. Na imagem anterior podemos observar que todos os clientes com ID=100 são uma unidade atómica. Como o próprio nome indica, não é possível dividir uma unidade atómica, ou seja, dentro de uma federation, todas as tabelas com a mesma federation key ficam garantidamente no mesmo federation member. Exemplo Figura 4.1 – Arquitectura das federations Não é objectivo deste artigo ensinar a criar e a manipular federations mas para não defraudar alguns leitores maisFederation Root curiosos vamos ver alguma ver um exemplo para que possamos ficar desde já familiarizados com alguma sintaxe.Refere-se à base de dados central que contêm todas asinformações sobre o particionamento dos dados. 26

×