• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Revista programar 27
 

Revista programar 27

on

  • 811 views

 

Statistics

Views

Total Views
811
Views on SlideShare
811
Embed Views
0

Actions

Likes
0
Downloads
12
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Revista programar 27 Revista programar 27 Document Transcript

    • EditorialEDITORIAL EQUIPA PROGRAMAR Expressa-te! Coordenadores Sem dúvida que nos últimos tempos têm-se falado bastante na liberdade de António Silva expressão, como os casos de divulgação de documentos por parte do Fernando Martins Wikileaks, as “milenares” censuras na China no uso da Internet (agora até estão censuradas pesquisas sobre o actual estado do Egipto), a tentativa de Editor obter os dados de acesso às contas do Facebook dos tunisinos por parte do António Silva próprio governo, para limitar a troca e partilha de informações, e ainda mais recentemente o corte dos serviços de internet no Egipto aplicado a toda a Design população, para que esta não possa comunicar sobre a situação actual do Sérgio Alves (@scorpion_blood) país (entretanto, e pelo menos parcialmente o corte foi cancelado), o caso da Ensitel que queria obrigar uma cliente a retirar a informação sobre as Redacção reclamações que tinha feito para a empresa, entre muitos outros que Augusto Manzano, Caio Proiete, Carlos poderia enumerar. Gonçalves, CoolThingsPT, Fernando Martins, João Mares, Paulo Morgado, Ricardo Na realidade ao longo dos séculos a denominada censura sempre existiu, Rodrigues, Ricardo Trindade, Rodrigo Pinto, mesmo em países designados como altamente evoluídos. Porque se me Sara Barbosa, Sara Silva, Sérgio Ribeiro apetecer colocar online dados de outra pessoa sem a sua autorização não o posso fazer, e que é isso senão uma forma de censura? No entanto essa Staff censura parece razoável porque o seu intuito é proteger os cidadãos. A António Santos, Fábio Domingos, Jorge grande questão é, até que ponto pode ir essa censura? No caso do Paulino, Marco Marques Wikileaks essa é uma questão com muitas pontas. Afinal, grande parte da informação revelada lá é considerada sigilosa nos países onde foi obtida, Contacto nomeadamente os EUA. Na verdade a proibição de reproduzir informação revistaprogramar@portugal-a-programar.info sem autorização considerada secreta, nada mais é que censura. Mas aqui parece mais difícil avaliar se esta censura é a favor dos cidadãos ou contra Website eles. E aí as opiniões e os argumentos dividem-se. http://www.revista-programar.info Com a evolução, aquilo que muitos denominam de Web 2.0 fez muitas ISSN pessoas descobrirem que o que dizem ou fazem pode ter repercussões em 1 647-071 0 todo mundo, gerando ondas de solidariedade ou aversão, mas abanando as estruturas da sociedade. O facto de cada um de nós poder ser também um meio de informação (ou por vezes desinformação) traz enormes responsabilidades. Quando foi lançada a suspeita que a licenciatura do Engº Sócrates tinha sido tirada ao Domingo, a página da Wikipédia referente à sua pessoa foi bloqueada por edições abusivas. A verdade é que com este poder muitos caem na tentação de apresentar as suas opiniões como se fossem factos consumados, e isso gera o famoso “diz que disse”. António SilvaA revista PROGRAMAR é um projecto voluntário, sem fins lucrativos. Todos os artigos são da responsabilidade dos autores, não podendo a revista ou acomunidade ser responsabilizada por alguma imprecisão ou erro. Para qualquer dúvida ou esclarecimento poderá sempre contactar-nos. 2
    • Índice INDICETEMA DE CAPA 6 Introdução ao ASP .NET MVC 3.0A PROGRAMAR 13 Lua – Linguagem de Programação (Parte 7) 22 Flex e Byacc - Parte III 26 Optimização de SQL em Oracle - Índices 31 jQuery – A frameworkCOLUNAS 38 PROGRAMADOR EXCÊNTRICO - 6 regras para utilizar AJAX 40 VISUAL (NOT) BASIC - Windows Phone 7 47 CORE DUMP - gcc -Wall myApp.c -linstantaneous -o successCOMUNIDADES 51 Desenvolvimento em SharePoint 201 0 59 GuiaTV CoolthingsPT 62 Habilitar external users no SharePoint online – Office365 66 O Futuro da Programação Assíncrona da Plataforma .NETANÁLISES 70 Silverlight 4.0 – Curso CompletoEVENTOS1 8 Fev. ESAF LanParty 20111 8 Fev. 5º Portugal Girl Geek Dinner21 Fev. Windows Azure BootCamp Lisboa 2011 - Lisboa23 Fev. Visual Studio S201 0 - Workshop Desenvolvimento Aplicacional - Porto28 Fev. Microsoft Business Integration RoadShow - Lisboa04 Mar. XNA Pizza Night 2011 Spring Edition05 Mar. 3º Encontro WordPress Portugal em Lisboa26 Mar. Sessão Presencial NetPonto - Lisboa 3
    • NOTICIAS Noticias ZX S p e c tru m : N o fu tu ro , Po rtu ga l s o b e d e p o s i ç ã o n o va m o s re gre s s a r a o p a s s a d o ra n ki n g d e i n o va ç ã o e u ro p e uQue uma parte do mundo está em modo revivalista dos Nos últimos cinco anos Portugal subiu sete posições noeighties já toda a gente percebeu. Da roupa aos ranking europeu de inovação, passando este ano à frenteacessórios, passando pela música e pelos carros, as de Espanha e da Itália e liderando o grupo de inovadorestendências vão desaguar ao período da História que moderados. Conquistando o 1 5º lugar do Europeanconsagrou Madonna como ícone. Sem surpresas, os Innovation Scoreboard de 201 0, o país continua, aindavideojogos retro também voltaram à ribalta, a ponto de a assim, abaixo da média na maioria dos indicadores.empresa de programação Elite ter decidido reeditar o ZXSpectrum, que fez as delícias daqueles que agora andam O estudo já está online e vai ser apresentado hoje emna casa dos 30. Bruxelas mas os traços gerais já foram divulgados, mostrando que a Suécia, Dinamarca, Finlândia e Alemanha continuam no pelotão da frente. Portugal conquista porém o troféu de ser o país que mais subiu nos últimos cinco anos, sobretudo devido ao crescimento de empresas inovadoras e à melhoria do ensino de nível secundário. O s a c tu a i s e n d e re ç o s d e PT re c e b e p ré m i o e u ro p e u d e I n te rn e t e stã o a a c a b a r fi b ra ó p ti c aNo início do mês, a entidade americana responsável pelos Portugal Telecom (PT) recebeu hoje um prémio queendereços de Internet, chamada IANA, anunciou que tinha reconhece a rede de fibra óptica da operadora como «aatribuído os últimos endereços disponíveis, o que deu azo a melhor e mais inovadora na Europa», anunciou hoje avárias notícias sobre o esgotamento da Internet empresa em comunicado.Devido ao término dos blocos IPv4 disponíveis, os RIRs «Este prémio vem reconhecer o elevado nível de(Regional Internet Registries), entidades regionais excelência do trabalho, empenho e dedicação das equipasadministradoras mundiais desses endereços, terão que da PT, e o sucesso da estratégia que adoptámos, quebuscar métodos para administrar apenas os endereços que privilegia a inovação, a execução operacional e parceriasjá existem. Isso pode virar um transtorno devido ao com líderes da indústria, de modo a podermos oferecer aosaumento do número de usuários e serviços que solicitam nossos clientes em Portugal os melhores e mais avançadosnovos endereços. No continente asiático, essa diminuição serviços disponíveis no mercado», disse o presidente-nos endereços será sentida em larga escala, pois o número executivo, Zeinal Bava.de acessos e serviços relacionados a grande rede crescevertiginosamente. Cerca de um milhão de casas em Portugal têm já acesso á fibra óptica da PT. O objectivo da operadora é reforçar a"O IPv4 está, oficialmente, esgotado. Longa vida ao oferta em mais 600 mil casas até ao final do ano.IPv6." 4
    • TEMA DE CAPAIntrodução ao ASP .NET MVC 3.0
    • TEMA DE CAPAI n tro d u ç ã o a o ASP . N E T M VC 3 . 0Desde o lançamento da plataforma Microsoft .NET, momento em que escrevo este artigo é a 3.0 RTM,passamos a contar com um framework de disponibilizada recentemente pela Microsoft, e quedesenvolvimento de aplicações Web chamado ASP está disponível para download gratuitamente através.NET, que oferece diversos componentes de base do seguinte endereço:para a criação destas aplicações, como por exemplo,autenticação, autorização, controlo de sessões dos http://tinyurl.com/downloadmvc3utilizadores, cookies, entre outras funcionalidades,juntamente com um modelo de programação É importante destacar que o ASP .NET MVC 3.0baseado em páginas e eventos que permite utiliza novos recursos que fazem parte do .NETdesenvolver aplicações Web de uma forma muito Framework 4.0, e por isso necessita ter esta versãosemelhante ao desenvolvimento de aplicações do .NET Framework e o Visual Studio 201 0 paraWindows Forms. desenvolver aplicações (não é possível utilizar o Visual Studio 2008).Este modelo de programação chama-se ASP .NETWebForms, e era o único modelo existente no O Visual Studio 201 0 não inclui o ASP .NET MVC 3.0,framework ASP .NET até o início de 2009, quando foi mas sim o ASP .NET MVC 2.0, portanto a versão 3.0então lançado pela Microsoft a primeira versão do deve ser instalada manualmente.ASP .NET MVC, que é uma alternativa ao modeloWebForms existente, e oferece um modelo de Model-View-Controller (MVC)programação muito mais simplificado e directo, ebaseado num padrão (design pattern) bastante O padrão Model-View-Controler ou MVC permiteconhecido e utilizado em vários outros frameworks e separar o código necessário para interagir com aplataformas, chamado Model-View-Controller (MVC). interface com utilizador através de três conceitos: Model, View e Controller, onde cada um tem uma responsabilidade específica. ASP .NET MVC (...) oferece ummodelo de programação muitomais simplificado e directo, ebaseado num padrão bastanteconhecido (...)Assim, actualmente um developer que queiradesenvolver uma aplicação Web na plataformaMicrosoft .NET tem à sua disposição duas No ASP .NET MVC, um Controller corresponde a umaalternativas ou modelos de programação que pode classe que pode ser responsável por receber asescolher de acordo com a sua preferência: ASP .NET informações solicitadas pelo cliente (navegador), eWebForms e ASP .NET MVC. enviar uma resposta num formato apropriado, de acordo com a solicitação que recebeu.A versão mais recente do ASP .NET MVC no 6
    • TEMA DE CAPA I n tro d u ç ã o a o AS P . N E T M VC 3 . 0 - Promove a reutilização de código (Por exemplo: O padrão Model-View- Uma mesma View pode ser utilizada com diferentesControler ou MVC permite separar Models); - E provavelmente o mais importante: Ajuda oso código necessário para interagir developers a manter o foco em um único aspecto dacom a interface com utilizador aplicação, de cada vez.através de três conceitos: Model,View e Controller Funcionamento do ASP .NET MVC 3O recebimento das informações acontece através de Quando o framework inicia o processamento de umamétodos existentes nesta classe (Controller), requisição, obtém um determinado endereço (URL)chamados Action. Um Controller pode possuir uma ou que é então utilizado para determinar qual será omais acções (Actions) possíveis de serem Controller que será responsável por responder a estaexecutadas, e cada Action é então responsável por requisição, e qual será a Action deste Controller quereceber as informações enviadas através do cliente será executada. Por exemplo:(navegador) efectuar qualquer processamento queseja necessário e então enviar a resposta apropriada. http://portugal-a-programar.org/revista/edicoesPara enviar esta resposta, a Action do Controller No exemplo acima, o framework ASP .NET MVCinterage com o modelo aplicacional (Model) analisa o texto da URL que está após o endereço dogeralmente composto de várias classes que site, e identifica “revista” como sendo o nome doimplementam a lógica de negócio da aplicação, e Controller que deve ser responsável por responder adesta forma, o Controller consegue preparar a esta requisição, e “edicoes” como sendo o nome doresposta a ser enviada de volta para o cliente método (Action) a ser executado neste Controller.(navegador). Para que esta requisição seja processada comEsta resposta normalmente corresponde a uma View, sucesso, é preciso que um dos assemblies docuja responsabilidade é construir a resposta ao projecto (ou em assemblies referenciados) possuapedido solicitado, no formato apropriado. As Views uma classe com as características abaixo, casonormalmente são compostas por código HTML e contrário a resposta enviada será um erro do tipoJavaScript, misturado com trechos de código C# ou “404 Not Found”:VB .NET utilizando uma sintaxe chamada Razor. - Precisa ser uma classe pública (Public);Este modelo de programação traz uma série de - Precisa ser uma classe concreta (deve ser possívelbenefícios aos developers, como: instanciar objectos desta classe... Não pode ser uma classe abstrata (abstract), ou uma interface);- É possível ter diferentes representações (Views) de - Precisa ser uma classe derivada da classeuma mesma informação (Model); System.Web.MVC.Controller;- Novas interfaces com o utilizador (Views) podem ser - Precisa ser uma classe que tenha o mesmo nomefacilmente adicionadas, removidas ou alteradas, sem identificado através da URL como sendo o nome dagrande impacto ao restante da aplicação; Controller, seguido da palavra “Controller”, e precisa- A resposta a uma requisição pode ser facilmente ter um método com o mesmo nome identificado naalterada (pois está centralizada num Controller); URL como sendo a Action a ser executada, e que retorne um objecto do tipo 7
    • TEMA DE CAPAI n tro d u ç ã o a o ASP . N E T M VC 3 . 0System.Web.Mvc.ActionResult ou de uma classe partir do Visual Studio 201 0 deve aceder ao menuderivada desta. File, seleccionar New, e então Project, onde poderá seleccionar o tipo de projecto “ASP.NET MVC 3 WebNo exemplo acima, a classe responsável por Application”, e definir o nome do projecto e o localprocessar este tipo de requisições (http://portugal-a- onde será gravado.programar.org/revista/edicoes) deve chamar-seRevistaController, e deve possuir um métodochamado Edicoes. public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo }"); routes.MapRoute( "Default", // Route name A seguir será apresentado um ecrã onde onde pode "{controller}/{action}/{id}", // URL escolher o template que deseja utilizar para o novo with parameters projecto, o View Engine (mecanismo que será new { controller = "Home", action = utilizado para construir as Views), e tem a opção de "Index", id = UrlParameter.Optional } // criar um projecto de testes unitários para acompanhar Parameter defaults este novo projecto que está a ser criado. ); } Caso o nome do Controller e/ou da Action não esteja presente no endereço (URL), a aplicação ASP .NET MVC assume os valores “Home” para Controller e“Index” para Action, ou seja, para uma requisição do tipo http://portugal-a-programar.org/ onde não são informados os valores para Controller e Action, espera-se que exista uma classe chamada“HomeController” que por sua vez possua um método chamado “Index”.Esta é uma convenção padrão que está definida noficheiro Global.asax e que pode ser alterada sedesejar: Os templates que pode escolher são: “Empty” eCriando o seu primeiro projecto ASP “Internet Application”..NET MVC 3 A principal diferença entre os dois é que o “InternetPara iniciar um novo projecto ASP .NET MVC 3, a Application” já inclui algumas classes, controllers e 8
    • TEMA DE CAPA I n tro d u ç ã o a o AS P . N E T M VC 3 . 0views de exemplo que podem ser utilizadas como - Content: Pasta onde deve colocar as imagens ebase para o desenvolvimento da aplicação, enquanto estilos (CSS) utilizados no projecto;que o “Empty” apenas uma estrutura mínimo - Controllers: Pasta onde deve colocar todos osnecessária para começar. Controllers da aplicação; - Models: Pasta onde deve colocar os serviços, repositórios e outras classes que implementam a O Razor é a grande novidade lógica da aplicação;do ASP.NET MVC 3 e possui uma - Scripts: Pasta onde deve colocar os ficheirossintaxe simplificada e (...) mais JavaScript utilizados no projecto; - Views: Pasta onde deve colocar os ficheiroselegante responsávels por construir as Views; Os View Engines que pode escolher são “ASPX” e Esta é uma estrutura sugerida e pode ser“Razor”. O View Engine define, entre outras coisas, a completamente alterada se desejar (necessita de linguagem que será utilizada para a construção das alguns tweaks em alguns casos). Views, onde o mistura-se código HTML e JavaScript com código C# (ou VB .NET). Criação da página inicial do siteASPX é o View Engine que foi introduzido na primeira Para criar a página inicial (home-page) da aplicaçãoversão do ASP .NET, juntamente com o modelo Web, o primeiro passo é criar o controller chamadoWebForms e possui uma sintaxe que utiliza tags do “HomeController” (que é uma classe com este nome),tipo “<% ... %>” para identificar os trechos de código. que será responsável por receber/responder requisições feitas para a página principal do site.Já o Razor é a grande novidade do ASP .NET MVC 3e possui uma sintaxe simplificada e considerada mais Para isto, clique com o botão direito na pastaelegante, pelo que é o View Engine padrão do Controllers no Solution Explorer, seleccione “Add” eASP.NET MVC 3. então “Controller...”. No nome do controller defina “HomeController” e seleccione “Add”. Para o exemplo explicado neste artigo, foi seleccionado o template “Empty” e o View Engine Será criado um ficheiro com o home“Razor”. “HomeController.cs” (ou .vb se utiliza Visual Basic .NET) na pasta “Controllers” com o seguinteAo criar o novo projecto “ASP.NET MVC 3 Web conteúdo:Application” é criada uma estrutura como mostra a using System.Web.Mvc;figura abaixo: namespace Portugal_a_Programar.Web.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() 9
    • TEMA DE CAPAI n tro d u ç ã o a o ASP . N E T M VC 3 . 0 { @{ return View(); ViewBag.Title = "Index"; } } } } <h2>Index</h2>A partir deste momento, ao executar esta aplicação, Neste momento, o projecto possui uma estruturaqualquer requisição feita para a home-page do site similar a figura abaixo:(ex: http://portugal-a-programar.org/ ouhttp://localhost:1 234/) fará com que um novo objectoda classe HomeController seja automaticamenteinstanciado pelo framework ASP .NET MVC, e ométodo Index será executado. A resposta destemétodo Index será então enviada de volta para ocliente (navegador) que fez a requisição.O método Index neste exemplo possui apenas umachamada para um outro método da própria classechamado View, um método herdado da classeController. O que este método faz é executar solicitarao View Engine que seja construída uma determinadaView, e como não foram passados parâmetros, estemétodo assume que a View possui o mesmo nomedo método (Index), e que está dentro de uma pastacom o mesmo nome do Controller que está a serexecutado (Home). O próximo passo é criar esta View chamada “Index”, E já consegue executar a aplicação e visualizar a na estrutura de pastas do projecto. Para isso, vá ao página inicial com a palavra “Index”. Para executar a Solution Explorer e dentro da pasta Views crie uma aplicação, basta seleccionar o botão “Play” no Visual nova pasta chamada “Home” (botão direito na pasta Studio, ou utilizar as teclas de atalho (F5 ou CTRL +“Views” => “Add” => “New Folder”), e então clique F5). com o botão direito nesta nova pasta e seleccione“Add” e então “View...”. No nome da View defina“Index” e seleccione “Add”. Será criado um ficheiro com o home “Index.cshtml” (ou .vbhtml se utiliza Visual Basic .NET) na pasta“ViewsHome” com o seguinte conteúdo: 10
    • TEMA DE CAPA I n tro d u ç ã o a o AS P . N E T M VC 3 . 0ConclusãoComo foi possível ver ao longo do artigo, queabordou de uma forma muito superficial o A comunidade NetPonto é uma iniciativafuncionamento e estrutura deste novo modelo de independente e sem fins lucrativos, que temprogramação Web, o ASP .NET MVC 3 torna-se como simples e único objectivo a partilha debastante simples de utilizar a partir do momento em conhecimento na área de arquitectura eque se percebe as convenções utilizadas para definir desenvolvimento de software na plataformaas diferentes partes de uma aplicação, e ao mesmo .NET, na tentativa de disseminar o conhecimentotempo permite-nos ter uma maior separação entre a diferenciado de cada um de seus membros.lógica de negócio e a interface com o utilizador. Cada um de nós tem diferentes talentos, e com as dezenas de tecnologias que são lançadas O ASP.NET MVC 3 (...) permite- todos os dias, é muito difícil (para não dizernos ter uma maior separação entre impossível) estar por dentro de tudo, e essa é uma das principais vantagens em fazer parte dea lógica de negócio e a interface uma comunidade de pessoas ligadas à nossacom o utilizador área. Podemos aprender mais, e mais rápido, com as experiências de cada um. Visite-nos em http://netponto.org AUTOR Escrito por Caio Proiete Exerce as funções de arquitecto de software e analista-programador na área da banca, e ministra cursos de formação em tecnologias Microsoft .NET como freelancer para empresas e centros de formação. É formador certificado pela Microsoft (MCT), Microsoft Certified Professional Developer (MCPD) nas áreas Windows, Web e Enterprise, é Microsoft Most Valuable Professional (MVP) em ASP .NET, e líder da Comunidade NetPonto (http://netponto.org), onde organiza reuniões presenciais todos os meses, e apresenta sessões de assuntos relacionados com desenvolvimento de software na plataforma Microsoft .NET. É autor do blog http://caioproiete.net - Twitter: @CaioProiete 11
    • A PROGRAMARLua – Linguagem de Programação (Parte 7)Flex e Byacc - Parte IIIOptimização de SQL em Oracle - ÍndicesjQuery – A framework
    • A PROGRAMARLu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7)No artigo anterior foi feita a explanação sobre o uso TABELAS MANIPULADAS POR FUNÇÕESdo ambiente interactivo de programação Lua, além dedas operações de acesso a arquivo. Na quarta parte desta série de fora abordado o usoNeste artigo como prometido será tratado os de tabelas com listas de registos, unidimensionais eassuntos relacionados a definição do escopo de bidimensionais.variáveis, o uso de tabelas manipuladas por funções, Agora será feita uma extensão a este estudo pordescrição de dados e uso de programação orientada meio do uso das funções de inserção e remoção dea objectos. elementos em tabelas: insert() e remove() da biblioteca padrão table. O programa seguinte efectua a acção de entrada eESCOPO DE VARIÁVEL saída de elementos na tabela VETOR.A definição de variável em linguagem Lua ocorre -- inicio do programa TAB01sempre como escopo global. Caso haja anecessidade de fazer uso de uma variável com local VETOR = {}escopo local deve-se antes do nome da variável usar for I = 2, 10, 2 doa instrução local. O escopo local é determinado pelo table.insert(VETOR, I)bloco no qual a variável foi declarada. Uma variável endcom escopo local que seja declarada fora dequalquer bloco é visível em todo o programa. for I = 1, 5 doPor exemplo, o trecho de código seguinte é iniciado print("["..I.."] = "..VETOR[I])com a variável X global com valor 33. Dentro da enddecisão com a instrução if … then / end a variável X é -- fim do programa TAB01definida como local possuindo o valor 5. X = 33 Em seguida escreva o código de programa em um print(X) –- mostra valor 33 editor de texto, gravando-o com o nome tab01 .lua e if (X > 5) then execute-o com a linha de comando lua 5.1 tab01 .lua. local X = 5 Note a apresentação da saída do programa como: print(X) –- mostra valor 5 end print(X) –- mostra valor 33 [1] = 2 [2] = 4 [3] = 6Ao ser executado o trecho de código anterior será [4] = 8apresentado os valores 33, 5 e 33, sendo o valor 33 [5] = 10para a variável X com escopo global e o valor 5 paraa variável X com escopo local. Perceba que foram definidos para a tabela VETOR a entrada dos valores pares de 2 até 1 0 de 2 em 2 por meio da função insert() da biblioteca table. A função insert() da biblioteca table fez uso no 13
    • A PROGRAMARLu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7)programa de dois parâmetros, sendo o primeiro [4] = 6parâmetro a definição do nome da tabela e o [5] = 8segundo parâmetro o valor a ser inserido dentro da [6] = 10tabela. Na sua operação esta função pode trabalharcom até três parâmetros, sendo o segundo parâmetrode uso opcional. Assim sendo, foram usados no Além da inserção do valor 9 na posição 1 da tabelaprograma anterior, de fato, o primeiro e o terceiro VETOR está em uso a função maxn() que percorre aparâmetros da função insert(). tabela contando quantos elementos existem. DestaQuando a função table.insert() está em uso ela forma, a instrução N = table.maxn(VETOR) atribuiefectua a entrada do valor na posição n + 1 , onde “n” como valor para a variável N a quantidade derepresenta o tamanho da tabela. No entanto, esta elementos na tabela VETOR.função permite escolher a posição de inserção de um Observe que após a inserção do valor 9 na primeiraelemento junto a tabela, bastando fazer uso de um posição da tabela ocorreu o manejamento de umaparâmetro a mais indicado na segunda posição. posição a mais para acomodar os elementosO programa seguinte efectua a entrada na tabela de existentes.quatro valores pares e em seguida efectua a inserção Para fazer a remoção de elementos de uma tabelado valor numérico impar 9 na primeira posição da usa-se a função table.remove().tabela. O programa seguinte efectua a remoção de elementos de uma tabela definida de forma estática. -- inicio do programa TAB02 -- inicio do programa TAB03 local VETOR = {} local VETOR = {0, 2, 4, 6, 8} for I = 2, 10, 2 do table.insert(VETOR, I) table.remove(VETOR) end N = table.maxn(VETOR) table.insert(VETOR, 1, 9) for I = 1, N do N = table.maxn(VETOR) print("["..I.."] = "..VETOR[I]) end for I = 1, N do -- fim do programa TAB03 print("["..I.."] = "..VETOR[I]) end Em seguida escreva o código de programa em um -- fim do programa TAB02 editor de texto, gravando-o com o nome tab03.lua e execute-o com a linha de comando lua 5.1 tab03.lua.Em seguida escreva o código de programa em um Após a execução do programa ocorre a apresentaçãoeditor de texto, gravando-o com o nome tab02.lua e da saída:execute-o com a linha de comando lua 5.1 tab02.lua. [1] = 0Após a execução do programa ocorre a apresentação [2] = 2da saída: [3] = 4 [4] = 6 [1] = 9 [2] = 2 [3] = 4 14
    • A PROGRAMAR Lu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7)Note que a função remove() com a definição do for I = 1, 5 doparâmetro VETOR efectuou a remoção do último NOME = io.read()elemento da tabela. No entanto, esta função permite table.insert(VETOR, NOME)a remoção de elementos a partir de uma posição enddefinida, observe o código seguinte: for I = 1, 5 do -- inicio do programa TAB04 print("["..I.."] = "..VETOR[I]) end local VETOR = {0, 2, 4, 6, 8} table.sort(VETOR) table.remove(VETOR, 3) print() N = table.maxn(VETOR) for I = 1, 5 do for I = 1, N do print("["..I.."] = "..VETOR[I]) print("["..I.."] = "..VETOR[I]) end end -- fim do programa TAB05 -- fim do programa TAB04 Em seguida escreva o código de programa em umEm seguida escreva o código de programa em um editor de texto, gravando-o com o nome tab05.lua eeditor de texto, gravando-o com o nome tab04.lua e execute-o com a linha de comando lua 5.1 tab05.lua.execute-o com a linha de comando lua 5.1 tab04.lua. Após a execução do programa forneça a entrada deApós a execução do programa ocorre a apresentação cinco nomes. Por exemplo, se forem fornecidos osda saída: nomes: Joca, Augusto, Sílvio, Paula e Sílvia, ocorrerá como saída: [1] = 0 [2] = 2 [1] = Joca [3] = 6 [2] = Augusto [4] = 8 [3] = Silvio [4] = Paula [5] = SilviaPerceba que o valor 4 que estava na terceira posiçãofoi removido. Com a remoção do valor 4 ocorreu o [1] = Augustomanejamento dos outros valores. [2] = JocaNo processo de manipulação de tabelas por funções [3] = Paulahá ainda a possibilidade de fazer uso da função sort() [4] = Silviada biblioteca table para colocar os elementos em [5] = Silvioordem ascendente se forem strings ou crescente seforem números.O programa seguinte demonstra o uso da função Observe que na primeira parte da saída ocorrera atable.sort(). apresentação dos nomes na ordem de entrada e após a execução da função sort() ocorre a -- inicio do programa TAB05 apresentação dos nomes em ordem ascendente como indicado na segunda parte da saída. local VETOR = {} 15
    • A PROGRAMARLu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7)DESCRIÇÃO DE DADOS -- inicio do programa TAB06Uma das características operacionais de Lua desde function pessoa(DADOS)seu desenvolvimento é a capacidade de ser usada print(DADOS.nome)como uma linguagem de descrição de dados. No endsentido de fazer uso desta característica crie umarquivo lua com o seguinte conteúdo: dofile("popula.lua") -- fim do programa TAB06 pessoa Em seguida escreva o código de programa em um { editor de texto, gravando-o com o nome tab06.lua e nome = "Augusto", execute-o com a linha de comando lua 5.1 tab06.lua. profissao = "Professor", idade = 45 Note que ao ser executado o programa os nomes } existentes na descrição de dados do arquivo popula.lua são apresentados. pessoa Observe que a função pessoa() efectua o { recebimento de um parâmetro denominado DADOS nome = "Antonio", que conterá os registos de todos os dados do arquivo profissao = "Medico", popula.lua denominados pessoa e os insere na idade = 55 variável que se encontra definida como seu } parâmetro, neste caso DADOS. O parâmetro DADOS pessoa está sendo tratado como se fosse uma tabela. Os { nomes do registos existentes são apresentados por nome = "Mariana", meio da função print(). profissao = "Engenheiro", Atente para o fato da função em uso possuir o idade = 30 mesmo nome de identificação de registo do arquivo } popula.lua. Para auxilio na obtenção dos dados do arquivo pessoa { popula.lua faz-se uso da função dofile() que abre o nome = "Marcelo", arquivo indicado e faz a execução do seu conteúdo profissao = "Medico", como se este conteúdo fosse um trecho de código idade = 45 escrito na linguagem Lua. } Outra possibilidade de uso do recurso de descrição de dados é a definição de uma tabela a partir dosGrave o arquivo com o nome popula.lua e observe dados existentes no arquivo popula.lua. A partir daque cada um dos registos está identificado com o definição da tabela é possível efectuar operações denome pessoa. Esta é uma segunda maneira de se controlo dos dados. Observe o código de programadefinir registos na linguagem Lua. seguinte:Na sequência será definido um programa que fará -- inicio do programa TAB07uso da função pessoa() que fará a apresentação dosnomes armazenados no arquivo de dados popula.lua. local DADOS = {} local IND local VLR 16
    • A PROGRAMAR Lu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7) META-TABELAS function pessoa(CONTEUDO) Meta-tabela é um recurso que permite modificar o table.insert(DADOS, CONTEUDO) comportamento de uma tabela no sentido de definir end qual ação pode ser tomada quando da realização de dofile("popula.lua") uma operação sobre esta tabela. Cada tabela em uso pode ter associada uma meta-tabela. for IND, VLR in pairs(DADOS) do Para se definir uma meta-tabela é preciso utilizar a if (VLR.idade >= 45) then função setmetatable() que faz uso de dois print(VLR.nome) parâmetros, sendo o primeiro parâmetro o nome da end tabela e o segundo parâmetro o nome da meta- end tabela. Assim sendo, observe a seguinte definição de -- fim do programa TAB07 meta-tabela:Em seguida escreva o código de programa em um local MT = {}editor de texto, gravando-o com o nome tab07.lua e local TN = {}execute-o com a linha de comando lua 5.1 tab07.lua. setmetatable(TN, MT)Ao ser executado o programa anterior serãoapresentados os nomes Augusto, Antonio e Marcelo Onde MT é a meta-tabela e TN é a tabela normal. Istoque são os nomes dos registos cujas idades são posto, significa dizer que MT é uma meta-tabela demaiores ou iguais a 45 anos. TN.Para a execução do programa perceba o trecho de O próximo programa tentará efetuar a soma de doiscódigo da função pessoa() que por meio do valores associados cada um a uma tabela paraparâmetro CONTEUDO faz a inserção deste dentro criação de uma terceira tabela. Mas não conseguiráda tabela DADOS. efetivar esta ação e no momento do processamentoObserve que as variáveis de uso do programa estão da adição ocorrerá um erro que interromperá adefinidas com escopo de visibilidade local. execução do programa. Observe o código seguinte:Além deste efeito operacional o programa ainda fazuso de um laço for tipo genérico. Um laço genérico é -- inicio do programa TAB08usado para percorrer os valores de uma tabela, seusíndices ou as linhas de um arquivo. Neste caso, o TABELA1 = {} TABELA2 = {}laço genérico está percorrendo as posições da tabela TABELA3 = {}DADOS por meio da função iteradora pairs(). Casoqueira percorrer os índices de uma tabela usa-se a TABELA1.a = 2função ipairs() e para as linhas de um arquivo usa-se TABELA1.b = 4a função io.lines(). TABELA1.c = 6A função pairs() após percorrer os valores de umatabela retorna três valores, sendo o valor da posição TABELA2.a = 3do próximo elemento na tabela, retorna a tabela e TABELA2.b = 5retorna o valor nil quando ultrapassar o fim da tabela. TABELA2.c = 7As variáveis IND e VLR do laço for genérico guardamrespectivamente os valores do índice e do conteúdo TABELA3 = TABELA1 + TABELA2da tabela DADOS. print(TABELA3.a) 17
    • A PROGRAMARLu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7) print(TABELA3.b) TABELA1.a = 2 print(TABELA3.c) TABELA1.b = 4 TABELA1.c = 6 -- fim do programa TAB08 TABELA2.a = 3Em seguida escreva o código de programa em um TABELA2.b = 5editor de texto, gravando-o com o nome tab08.lua e TABELA2.c = 7tente executar o programa com a linha de comando TABELA3 = TABELA1 + TABELA2lua 5.1 tab06.lua.Note que assim que o programa for executado será print(TABELA3.a)apresentada a mensagem de erro attempt to perform print(TABELA3.b)arithmetic on global TABELA1 (a table value). print(TABELA3.c)O erro ocorre devido ao fato das tabelas TABELA1 e -- fim do programa TAB09TABELA2 não possuírem meta-tabelas associadas. Alinguagem Lua tenta efectuar a adição de formatradicional, o que leva a uma falha na execução doprograma. Em seguida escreva o código de programa em umPara sanar o problema é necessário definir para as editor de texto, gravando-o com o nome tab09.lua etabelas normais uma operação de adição exclusiva execute-o com a linha de comando lua 5.1 tab09.lua.para essas tabelas que serão associadas as suas Ao executar o programa serão apresentados osmeta-tabelas. resultados das adições dos valores das tabelasA operação de soma será efectuada pelo uso do TABELA1 e TABELA2, sendo 5, 9 e 1 3.campo __add (antes de add usa-se duas vezes o Além do uso do campo __add é possível efectuarsímbolo under-line). Assim sendo, observe o próximo operações com os campos:código de programa: __sub (subtração); -- inicio do programa TAB09 __mul (multiplicação); __div (divisão); TABELA1 = {} __mod (resto de divisão de inteiros); TABELA2 = {} __pow (exponenciação); TABELA3 = {} __concat (concatenação); METATAB = {} __len (tamanho); __eq (igualdade); setmetatable(TABELA1, METATAB) __it (menor que); METATAB.__add = function(V1, V2) __le (menor igual), entre outras. TABAUX = {} setmetatable(TABAUX, getmetatable(V1)) No programa tab09.lua para execução da adição a TABAUX.a = V1.a + V2.a linguagem Lua verifica a existência da meta-tabela e TABAUX.b = V1.b + V2.b procura pelo campo __add que encontra-se definido TABAUX.c = V1.c + V2.c para a meta-tabela METATAB. Encontrando executa return TABAUX acção de adição desejada. end 18
    • A PROGRAMAR Lu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7)ORIENTAÇÃO A OBJECTO etapa de desenvolvimento do método que fará a criação do objecto em memória a partir da classeA linguagem Lua não é orientada a objectos, mas isto TALUNO.não impede que se faça uso deste paradigma de Note o código do método new seguinte:programação.Para operar com classes, atributos, métodos e function TALUNO.new(OBJECTO, ATRIB)heranças, observe o que se apresenta em seguida.. ATRIB = ATRIB or {}Para fazer uso do paradigma da orientação a setmetatable(ATRIB, OBJECTO) OBJECTO.__index = OBJECTOobjectos em Lua é preciso criar protótipos de classes return ATRIBa partir de meta-tabelas dos objetos desta classe com endo uso do campo __index.Primeiramente faz-se a criação da estrutura básicade registo que será a base da classe. Assim sendo, A função (método) ALUNO.new() faz uso de doisconsiderando-se a criação de uma classe parâmetros, sendo o primeiro parâmetro adenominada TALUNO com os atributos NOME, representação do objecto em si de nome OBJECTO,NOTAS e MEDIA, faça: o segundo parâmetro representa os atributos da classe TALUNO. Esta função será usada para TALUNO = { instanciar um objecto. NOME, A linha ATRIB = ATRIB or {} faz com que ocorra a NOTAS = {}, criação de um objecto vazio caso não seja passado MEDIA nenhuma informação para este parâmetro. } A linha setmetatable(ATRIB, OBJECTO) estabelece ATRIB como sendo meta-tabela de OBJECTO.Observe que a definição da estrutura de uma classe Na sequência faz-se a atribuição OBJECT aé realizada sobre a mesma definição que se faz para OBJECTO.__index de modo que se houver uma definição de um registo. A linguagem Lua não é acesso a um atributo ausente do objecto a linguagemorientada a objectos, pois se fosse permitiria a Lua fará sua busca em ATRIB.definição dentro da estrutura TALUNO da indicação A linha return ATRIB devolve para o métodode chamada de um método. Assim sendo, este ALUNO.new() o atributo do objecto criado.requinte não pode ser usado em Lua, mas também Após definir a classe e estabelecer o método que faránão impede o uso da orientação a objectos. a criação do objecto, será definida a instância doNormalmente as linguagens de programação que objecto. Observe o seguinte:operam com o paradigma de orientação a objectosconseguem definir uma variável a partir da estrutura ALUNO = TALUNO.new(TALUNO)de uma classe. A esta acção se dá o nome deinstância e a variável usada é chamada de objecto. A partir deste ponto é possível escrever um programaAlgumas das linguagens de programação com orientado a objecto em linguagem Lua.orientação a objectos fazem a instância de um Na sequência será necessário preparar um métodoobjecto a partir do uso de um método interno para o cálculo da média do aluno. O resultado dachamado new, como ocorre em Java (TALUNO média será atribuído ao atributo MEDIA do objectoALUNO = new TALUNO();). Será então necessário ALUNO. Desta forma, estará sendo simulado o usocriar na linguagem Lua um método semelhante. de métodos do tipo off-line. Considere o códigoApós definir a estrutura da classe passa-se para a seguinte: 19
    • A PROGRAMARLu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7) function ALUNO:CMEDIA() ALUNO.NOTAS[I] = NOTA MEDIA = 0 end for I = 1, 4 do ALUNO.MEDIA = ALUNO.CMEDIA() MEDIA = MEDIA + ALUNO.NOTAS[I] end print() RESULTADO = MEDIA / 4 print("Nome ...: "..ALUNO.NOME) return RESULTADO for I = 1, 4 do end NOTA = ALUNO.NOTAS[I] print("Nota "..I.." .: "..NOTA) endA partir desta explanação considere o código de print("Media ..: "..ALUNO.MEDIA)programa seguinte com a manipulação de uma -- fim do programa TAB10classe, de atributos e de métodos. -- inicio do programa TAB10 Em seguida escreva o código de programa em um editor de texto, gravando-o com o nome tab1 0.lua e TALUNO = { execute-o com a linha de comando lua 5.1 tab1 0.lua. NOME, Após exemplificar o uso de classes, atributos e NOTAS = {}, métodos é oportuno exemplificar o uso de herança. MEDIA Para demonstrar este aspecto será definida uma } classe TSALA com atributo SALA que será herdado function TALUNO.new(OBJECTO, ATRIB) pela classe TALUNO. Observe o trecho: ATRIB = ATRIB or {} TSALA = { setmetatable(ATRIB, OBJECTO) SALA OBJECTO.__index = OBJECTO } return ATRIB end TALUNO = {TSALA, NOME, ALUNO = TALUNO.new(TALUNO) NOTAS = {}, function ALUNO.CMEDIA() MEDIA } MEDIA = 0 for I = 1, 4 do Note que na classe TALUNO há a definição de uso da MEDIA = MEDIA + ALUNO.NOTAS[I] classe TSALA. O uso de TSALA como atributo de end TALUNO é uma referência directa de herança sob a RESULTADO = MEDIA / 4 classe TSALA e também ao seu atributo SALA. Desta return RESULTADO forma, está se simulando em Lua a definição de end herança entre classe. Esta referência seria em C++ io.write("Nome .....: ") (class TALUNO: public TSALA). ALUNO.NOME = io.read() O código seguinte demonstra na linguagem Lua o for I = 1, 4 do uso de herança. io.write(I.."a. nota .: ") NOTA = io.read("*number") 20
    • A PROGRAMAR Lu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7)-- inicio do programa TAB11 io.write("Sala .....: ") ALUNO.SALA = io.read() TSALA = { for I = 1, 4 do SALA io.write(I.."a. nota .: ") } NOTA = io.read("*number") ALUNO.NOTAS[I] = NOTA TALUNO = {TSALA, end NOME, ALUNO.MEDIA = ALUNO.CMEDIA() NOTAS = {}, MEDIA print() } print("Nome ...: "..ALUNO.NOME) print("Sala ...: "..ALUNO.SALA) function TALUNO.new(OBJECTO, ATRIB) for I = 1, 4 do ATRIB = ATRIB or {} NOTA = ALUNO.NOTAS[I] setmetatable(ATRIB, OBJECTO) print("Nota "..I.." .: "..NOTA) OBJECTO.__index = OBJECTO end return ATRIB print("Media ..: "..ALUNO.MEDIA) end -- fim do programa TAB11 ALUNO = TALUNO.new(TALUNO) Em seguida escreva o código de programa em um function ALUNO.CMEDIA() editor de texto, gravando-o com o nome tab11 .lua e MEDIA = 0 execute-o com a linha de comando lua 5.1 tab11 .lua. for I = 1, 4 do MEDIA = MEDIA + ALUNO.NOTAS[I] end CONCLUSÃO RESULTADO = MEDIA / 4 return RESULTADO Neste artigo foi dado atenção as acções de end processamento baseadas no uso de escopos de io.write("Nome .....: ") variáveis, funções de tabelas, descrição de dados e ALUNO.NOME = io.read() orientação a objectos. No próximo artigo será tratado o assunto de uso de arquivos com a linguagem Lua..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, possuindo na sua carreira várias obras publicadas na área da computação. 21
    • A PROGRAMARFl e x e B ya c c - Pa rte I I IAo longo desta série de artigos, temos vindo a ver Também vamos necessitar dum novo token que noscomo utilizar as ferramentas flex e byacc para indique uma variável, e de outro token que sirvaescrever uma calculadora simples. No primeiro artigo como operador de atribuição. Vejamos a novavimos como escrever o scanner da nossa calculadora primeira secção do parser:usando flex e no segundo como escrever o parserusando byacc. Neste artigo veremos o que nos falta %{para conseguir criar o executável da nossa #include <cstdlib>calculadora, e como lhe adicionar funcionalidade #include <cmath>eficientemente. #include <iostream> #include <map>O ficheiro do parser que vimos no artigo anterior #include <string>estaria completo, mas como o código do scanner é Ce o do parser é C++, precisamos de dar uma ajuda extern "C"ao byacc. { int yyparse(void); #include <cstdlib> int yylex(void); int yywrap() extern "C" { { return 1; int yyparse(void); } int yylex(void); void yyerror(char *); int yywrap() { } return 1; } std::map<std::string, double> varMap; void yyerror(char *); %} } %union {Declaramos as funções do scanner que o parser usa double d;como funções C no bloco dos #includes do parser e char * s;resolvemos o problema. Para concluir o exemplo };vejamos como expandir a nossa calculadora,adicionando-lhe variáveis por exemplo. Introduzir %token<d> NUMBERvariáveis implica alterar o parser e o scanner %token<s> VARIABLEsimultaneamente. Começando pelo parser, vejamos %token NLdo que precisamos para ter variáveis. Sendo umacalculadora simples as nossas variáveis vão conter %right =sempre doubles, e são identificadas por uma string, %left + -portanto podemos usar um map para as guardar. %left * / 22
    • A PROGRAMAR Fl e x e B ya c c - Pa rte I I I %right ^ varMap[key] = $3; %nonassoc UMINUS $$ = varMap[key]; } %type<d> expr | ( expr ) { $$ = $2; } ;Temos o mapa onde guardamos as variáveis,varMap, um novo tipo na %union, char * para o novo %%token VARIABLE, e um operador de atribuição =,associativo à direita e com a menor precedência detodos os operadores. A segunda secção do parser A gramática mantém-se praticamente inalterada, sósegue-se: adicionámos duas novas produções, uma para indicar que uma expressão pode ser uma variável e a outra %% para indicar que uma expressão pode ser uma atribuição. Ambas têm acções associadas, a primeira expr_list : expr NL { std::cout << $1 << verifica se a variável se encontra no mapa, se sim std::endl; } atribui à cabeça o valor da variável no mapa, se não |expr_list expr NL { std::cout atribui zero. A segunda atribui ao valor da variável no << $2 << std::endl; } mapa o valor da expressão, e à cabeça o valor da ; variável no mapa, ou seja é possível escrever (f = 3) + 5 e obter 8 mas sendo atribuído 3 a f. A terceira expr : NUMBER { $$ = $1; } secção mantém-se inalterada portanto com isto | VARIABLE concluímos o parser. { std::string key($1); O novo scanner necessita de ainda menos alterações $$ = (varMap.find(key) != que o parser, basta enviarmos os novos tokens varMap.end())? varMap[key] : 0; VARIABLE e =. Para o token VARIABLE } adicionamos a seguinte expressão regular na | - expr %prec UMINUS { $$ = primeira secção, -$2; } | expr + expr { $$ = IDENTIFIER [A-Za-z_][A-Za-z0-9_]* $1+$3; } e a seguinte regra na segunda secção: | expr - expr { $$ = Para adicionar o token = só necessitamos de alterar $1-$3; } | expr * expr { $$ = {IDENTIFIER} { yylval.s = strdup(yytext); $1*$3; } return VARIABLE; } | expr / expr { $$ = a regra, $1/$3; } | expr ^ expr { $$ = [-+*/^()] return *yytext; pow($1, $3); } para: | VARIABLE = expr { [-+*/=^()] return *yytext; std::string key($1); 23
    • A PROGRAMARFl e x e B ya c c - Pa rte I I IOs ficheiros finais do scanner e do parser encontram- %{se abaixo. #include <cstdlib> #include <cmath> %option outfile="CalculatorScanner.c" #include <iostream> #include <map> %{ #include <string> #include "CalculatorParser.tab.h" extern "C" void yyerror(char * err_msg) { { int yyparse(void); printf("%sn", err_msg); int yylex(void); exit(1); int yywrap() } { return 1; %} } void yyerror(char *); IDENTIFIER [A-Za-z_][A-Za-z0-9_]* } WS [ t] std::map<std::string, double> varMap; NL "n"|"r"|"rn" DIG [0-9] %} %union { MANTISSA ({DIG}*.{DIG}+)|({DIG}+.) double d; EXPONENT [eE][-+]?{DIG}+ char * s; }; INT (0|[1-9]{DIG}*) DOUBLE {MANTISSA}{EXPONENT}? %token<d> NUMBER %token<s> VARIABLE %% %token NL {IDENTIFIER} { yylval.s = strdup(yytext); %right = return VARIABLE; } %left + - {INT}|{DOUBLE} { yylval.d = strtod(yytext, %left * / NULL); return NUMBER; } %right ^ %nonassoc UMINUS [-+*/=^()] return *yytext; %type<d> expr {NL} return NL; %% {WS} ; /* ignore whitespace */ expr_list : expr NL { std::cout << $1 << std::endl; } . yyerror("Unknown character"); | expr_list expr NL { std::cout << $2 << std::endl; } %% ; 24
    • A PROGRAMAR Fl e x e B ya c c - Pa rte I I I Tendo dado ao scanner o nome deexpr : NUMBER { $$ = $1; } CalculatorScanner.l e ao parser o nome de | VARIABLE CalculatorParser.y, basta correr os seguintes { comandos na shell para criar o executável calculator. std::string key($1); $$ = (varMap.find(key) != flex CalculatorScanner.l byacc -dtv -bvarMap.end())? varMap[key] : 0; CalculatorParser CalculatorParser.y } gcc -c CalculatorScanner.c | - expr %prec UMINUS { $$ = g++ -c CalculatorParser.tab.c-$2; } g++ -o calculator CalculatorParser.tab.o | expr + expr { $$ = CalculatorScanner.o$1+$3; } | expr - expr { $$ = Esta série de artigos pretende-se apenas como uma$1-$3; } introdução a estas ferramentas e como tal não cobre | expr * expr { $$ = muitos dos aspectos do flex e do byacc.$1*$3; } Compreender o uso de estados num analisador | expr / expr { $$ = lexical é fundamental em aplicações mais$1/$3; } sofisticadas, e a introdução às gramáticas aqui feita é | expr ^ expr { $$ = ténue e não aborda os conceitos com exactidão,pow($1, $3); } tendendo a focar-se em explicações mais intuitivas. | VARIABLE = expr Para usar estas ferramentas com proficiência, é { necessário mais estudo, para o qual pode consultar: std::string key($1); varMap[key] = $3; http://dinosaur.compilertools.net/ $$ = varMap[key]; } E ler os seguintes livros: | ( expr ) { $$ = $2; } ; • lex & yacc, 2nd edition, John R. Levine,%% Tony Mason, Doug Brown, 1 995, ISBN 1 0: 1 -56592- 000-7, ISBN 1 3: 9781 565920002, OReilly &int main() Associates{ • Compilers: Principles, Techniques, & Tools yyparse(); (2nd Edition) (“livro do dragão”), Alfred V. Aho, Monica} S. Lam, Ravi Sethi, Jeffrey D. Ullman, 2006, ISBN-1 0: 0321 486811 , ISBN-1 3: 978-0321 48681 3, Addison- Wesley ProfessionalAUTOR Escrito por João Mares Estando actualmente no terceiro ano de LEIC no IST, interessa-se preferencialmente por arquitectura de computadores e computação gráfica. 25
    • A PROGRAMARO p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e sNa última edição, iniciámos a temática da Podemos considerar que uma base de dados é umaoptimização de SQL recorrendo à utilização de bind biblioteca. Dependendo da normalização da base devariables. Verificámos que, em casos específicos, o dados, esta poderá ter n tabelas. Consideremos queaumento de desempenho do Oracle é significativo e a nossa base de dados tem apenas uma tabela e quefulcral para o sucesso de uma aplicação. a mesma se encontra na primeira forma normal. Cada entrada da tabela é um livro de um determinadoA optimização de SQL vai muito mais além das bind autor, com um título, tema, editora, etc., e comvariables e da correcta gestão da shared pool. Nesta dezenas de páginas de texto. Portanto, com váriosedição, vamos explorar os índices e perceber como a campos.(in)correcta utilização dos mesmos pode afectar odesempenho das queries. A completa compreensão Na biblioteca, se pretendemos procurar um livro,dos efeitos de um índice implica um conhecimento temos duas opções: ou percorremos toda a bibliotecamais profundo das técnica de diagnóstico de queries ou consultamos o catálogo.do Oracle. No entanto, essa não é a intenção desteartigo, pretendendo apenas mostrar o que é e comofunciona um índice. Na biblioteca, se pretendemos procurar um livro, temos duasO índice é um dos objectos que está presente na opções: ou percorremos toda ageneralidade das bases de dados. No Oracle, emparticular, o índice é um objecto que está associado a biblioteca ou consultamos ouma ou várias colunas da tabela e é comum catálogo.encontrar-se relacionado com qualquer tabela. Parase compreender a ideia do índice, vamos fazer a Em Oracle, estas pesquisas traduzem-se num fullanalogia de uma base de dados com uma biblioteca. table scan ou num index scan, respectivamente. Podemos deduzir o modo como o optimizador do Oracle efectua as pesquisas, se visitarmos a biblioteca. Vejamos como procederíamos para encontrar as seguintes entradas: (ver tabela1 ) É fácil identificarmos as situações em que o optimizador recorre ao index scan ou ao full table scan, nos casos extremos em que sabemos que o resultado da query será muito ou pouco selectivo, respectivamente. O nosso senso comum leva-nos a escolher a melhor opção e o mesmo deverá acontecer com o “senso comum” do optimizador. Mas, o que acontece nos restantes casos em que não é lógico e directo escolher uma opção, tal como no caso dos livros de 1 980? Nestas situações, o 26
    • A PROGRAMAR O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e sOracle recorre às estatísticas. Tabela1Entre as várias informações que as estatísticas Note-se o parâmetro estimate_percent que vai definirrecolhem, destacamos aqui a informação da base de a percentagem de dados da base de dados a seremdados relativamente à dimensão das tabelas, dos analisados para a obtenção da estimativa.índices e da sua selectividade (número de chavesdiferentes), bem como da existência de histogramas. Após o cálculo das estatísticas, o optimizador conhece o número de chaves de um índice mas nãoA recolha automática das estatísticas poderá já estar a forma como essas chaves estão distribuídas.activada através de um job mas, em certascircunstâncias e, em bases de dados de grande Criemos um índice sobre a coluna do ano de ediçãodimensão, é normal encontrar-se inactiva. Este é um do livro (ex.: data_edicao):procedimento muito pesado para a base de dados e CREATE INDEX T_LIVROS$DATA_EDICAO ONque, se efectuado em horário de produção, poderá T_LIVROS(DATA_EDICAO);afectar significativamente o desempenho dasaplicações. Daí que este procedimento só deva seragendado para períodos mortos da base de dados. O optimizador sabe que existem livros de 1 970, 1 971 , …, 1 980, etc.. Os histogramas de frequência indicamUm método manual de recolha das estatísticas para quantos títulos existem referentes a cada ano. Sóum determinado objecto é executar o seguinte assim, o optimizador pode tomar a decisão correctaprocedimento de PL/SQL que aplicaremos sobre a para encontrar todos os livros de 1 980: ou recorrendotabela t_livros do utilizador usr_biblioteca: ao index scan, se forem poucos exemplares, comparativamente à dimensão da tabela; ou begin recorrendo ao full table scan, se existirem muitos dbms_stats.gather_table_stats( exemplares. ownname=>usr_biblioteca, tabname=>t_livros, A temática das estatísticas e histogramas requer uma estimate_percent=>30, análise mais detalhada mas que foge do âmbito deste method_opt=>for all indexed artigo. columns size auto, cascade=>true ); end; 27
    • A PROGRAMARO p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e sPodemos ver na figura a síntese do procedimentoadoptado pelo optimizador ao receber uma query. (...) o índice tem umaO que indexar? característica que o diferencia daJá conhecemos as vantagens de um índice e, à tabela: é ordenado (...)partida, apetece indexar tudo na base de dados. Mas,a indexação total poderá não ser uma boa opção. não sabemos qual a primeira letra do título. Todas as chaves deverão ser percorridas o que, em situaçõesO índice é um objecto que ocupa o seu espaço na em que o tamanho do índice é semelhante àbase de dados. Um índice de uma coluna tem tantos dimensão da tabela, não traz qualquer vantagem.valores quanto essa coluna. Se a coluna contiver mil Portanto, há também que ter em conta o modo comoregistos, então o índice terá mil entradas, também. se efectuam as pesquisas.No entanto, o índice tem uma característica que odiferencia da tabela: é ordenado. Logo, uma pesquisa Voltemos ao exemplo da biblioteca. Imaginemos queindexada será muito mais rápida do que uma um dos campos do livro é o código ISBN. Comopesquisa total à tabela. Mas, nem sempre é assim. sabemos, o ISBN é um código único. Logo, o número de chaves do índice associado a este campo seráNa pesquisa: igual ao total de obras, excluindo os exemplares SELECT TITULO duplicados. Uma pesquisa a um índice ordenado será FROM T_LIVROS muito mais rápida do que uma pesquisa total a uma WHERE TITULO LIKE OS MAIA% tabela desordenada. Portanto, faz sentido indexar este campo.O índice salta directamente para a letra O, pois é aprimeira letra do título. No entanto, nesta pesquisa: Consideremos agora o campo idioma. Numa biblioteca portuguesa, de certo que a grande maioria SELECT TITULO dos livros serão de língua portuguesa. Valerá a pena FROM T_LIVROS construir um índice com milhares de entradas todas WHERE TITULO LIKE %MAIA% 28
    • A PROGRAMAR O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e siguais? Na prática, valerá a pena um índice SELECT *bibliotecário ordenado simplesmente pelo idioma e FROM T_LIVROSque há-de conter quase todas as obras da biblioteca? WHERE AUTOR LIKE EÇA% AND TITULO LIKE OSA resposta é não. MAI%Uma boa escolha do que se vai indexar é umaquestão de bom senso e implica um conhecimento à A justificação está no facto de que o índicepriori do conteúdo da tabela. Podemos criar uma concatenado só é utilizado se a pesquisa for feitatabela sem índices e apenas os implementarmos à pela mesma ordem da criação do índice. Isto é, se omedida que a solução vai crescendo, à medida que índice recai sobre as colunas (a,b,c), a pesquisatemos dados que nos permitam identificar o que deverá incidir sobre as colunas (a), (a,b) ou (a,b,c),queremos pesquisar e quão organizada e selectiva mantendo a ordem do índice.está essa informação. Indexar uma coluna em que amaioria das entradas são idênticas é um desperdício Índices de funçõesde espaço e não traz qualquer benefício aooptimizador. Na pesquisa de campos de texto, o índice de coluna poderá nunca ser utilizado. Vejamos o caso em queIndexação concatenada os títulos dos livros estão inseridos na base de dados com letras maiúsculas e minúsculas. Se efectuarmosAlém da simples indexação de uma coluna, podemos a seguinte query:também concatenar dois campos da tabela num sóíndice. Por exemplo, criando um índice para o SELECT TITULO FROM T_LIVROS WHERE TITULO =conjunto de título e autor: Os Maias CREATE INDEX T_LIVROS$TIT_AUT ON o índice será usado e trará o resultado certo. Mas, se T_LIVROS(TITULO, AUTOR) não soubermos como os dados foram introduzidos na tabela, ou se tivermos um utilizador da biblioteca aEste índice vai permitir uma pesquisa mais rápida nas efectuar consultas, podemos ter que recorrer àqueries: pesquisa: SELECT * SELECT TITULO FROM T_LIVROS WHERE FROM T_LIVROS LOWER(TITULO) LIKE oS MaiAs WHERE TITULO LIKE OS MAI% AND AUTOR LIKEEÇA%; Neste caso, o índice não é utilizado, pois os valores guardados no índice são sensíveis a maiúsculas eou minúsculas. A transformação da cadeia de caracteres para minúsculas não vai produzir resultados na SELECT * pesquisa do índice. A solução passa pela criação de FROM T_LIVROS uma function index: WHERE TITULO LIKE OS MAI% AND AUTOR LIKE%QUEIR%; CREATE INDEX T_LIVROS$LOWER_TITULO ON T_LIVROS(LOWER(TITULO))mas não surtirá qualquer efeito em: 29
    • A PROGRAMARO p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e sValores NULL O acompanhamento e aO Oracle não guarda valores NULL. Podemosverificar, tentando introduzir uma linha totalmente monitorização dos índices e dasNULL numa tabela. Como tal, também os índices não queries através de planos deguardam os valores NULL dos campos de uma execução permite conhecer atabela. Portanto, uma pesquisa: fundo o porquê das ilações (...) SELECT * FROM T_LIVROS WHERE TEMA IS NULL O que aqui tentámos expor foi apenas uma pequena abordagem desmistificando a verdadeiravai obrigar a um full table scan, mesmo que exista um natureza deste objecto tão falado no mundo dasíndice altamente selectivo para esta coluna. bases de dados mas cuja utilização é, muitas vezes, desconhecida e mal aplicada.ConclusãoA utilização e parametrização de índices é um tema Nota: Agradeço ao Eng.º José Aser, formador dobem mais complexo. O acompanhamento e a Citeforma, a sua colaboração na ajuda da revisão dosmonitorização dos índices e das queries através de meus artigos de Oracle, bem como no conhecimentoplanos de execução permite conhecer a fundo o que me transmitiu no curso de SQL Avançado.porquê das ilações acima descritas. AUTOR Escrito por Ricardo Trindade É actualmente o responsável pela área informática dos Serviços Sociais da Câmara Municipal de Lisboa onde efectua, desde administração de sistemas, até programação em .NET. Está também ligado ao projecto N-Ideias na área da consultoria, webdesign e software, trabalhando essencialmente com BDs Oracle, PostgreSQL e SQL Server. 30
    • A PROGRAMARj Qu e ry – A fra m e wo rkNeste segundo artigo vou entrar mais em detalhe nas • Contextualizar selecção:funcionalidades do jQuery, como o motor de $("algumselector", contexto) -> deste modoselectores, que é uma das funcionalidades core, as podemos restringir o âmbito do nosso selector a umfuncionalidades de traversing e de manipulation. contexto, que é uma nossa selecção prévia.Uma das funcionalidades que torna o jQuery muitocompacto é o chaining (encadeamento). Este Por atributo:consiste no facto de qualquer função executada • Elemento contém atributo:sobre um objecto jQuery, retorna o objecto (com as $("[attributo]") -> selecciona todos osdevidas alterações efectuadas na função), permitindo elementos que tenham o atributo especificadoum executar funções encadeadas, num estilo de • Valor atributo igual a:código altamente compacto e mesmo assim $("[atributo=valor]") -> selecciona todos osextremamente perceptível. elementos cujo atributo especificado tenhaRelativamente ao motor de selectores, ele é o que exactamente o valor especificadonos permite, através de uma sintaxe mista entre • Valor atributo diferente de:XPath, CSS e algumas extensões nativas ao jQuery, $("[atributo!=valor]") -> selecciona todos osobter um conjunto de elementos do DOM. elementos cujo atributo especificado tenha um valorExiste vários tipos de selectores, por atributo, diferente do valor especificadohierárquico, filtros pelo tipo de elemento, pelo estado • Valor atributo contém:do elemento, etc: $("[atributo*=texto]") -> seleccionar todos os elementos cujo atributo especificado contém o textoPor elemento: especificado • Filtro universal: $("*") -> selecciona todos os elementos; • Selecção por classe: $(".classe") -> selecciona todos os elementos • Valor atributo termina com:que contenham determinada classe; $("[atributo$=texto]") -> seleccionar todos os • Selecção por nome de elemento: elementos cujo atributo especificado termina com o $("elemento") -> selecciona todos os texto especificadoelementos com este nome • Valor atributo começa com: • Selecção por id de elemento: $("[atributo^=texto]") -> seleccionar todos os $("#id") -> selecciona o elemento com este id elementos cujo atributo especificado começa com o • Selecção múltipla: texto especificado $("selector1 , selector2, selectorN") ->selecciona a união de todos os selectores • Múltiplos filtros por atributo: $("[atributo=valor][atributo^=texto]") ->Genérico: selecciona todos os elementos que correspondam à • Transformar um objecto num objecto jQuery intersecção de todos os filtros $(objecto) -> ao dar como input ao motor deselectores um objecto, o jQuery encarrega-se de Por conteúdo:transformá-lo num objecto jQuery automaticamente • Elemento contém texto: 31
    • A PROGRAMARj Qu e ry – A fra m e wo rk $(":contains(texto)") -> selecciona todos os <li class="inner"></li>elementos que contenham o texto especificado (case <li class="inner"></li>sensitive) </ul> • Elemento contém texto: </li> $(":has(elemento)") -> selecciona todos os </ul>elementos que contenham o elemento especificado $("ul.main").find(li.inner).size()Depois de ter dado uma visão sobre o poder dosselectores jQuery, vamos ao que interessa: <html> Neste caso, o objecto jQuery iria conter a duas li com <head> a class inner, e a função size invocada no final <script type="text/javascript" permite ao utilizar saber exactamente quantos src="jquery-1.4.4.min.js"></script> elementos do DOM contém o objecto jQuery. </head> <body> A nível de traversing existem algumas funções chave <a href="http://www.portugal-a- como a já falada find, entre outras: programar.org/">PaP</a> </body> • add(): com esta função podemos adicionar ao </html> objecto jQuery mais elementos do DOM, através de selector ou objecto que referencie um elemento, ou até fornecer html que adiciona o elemento ao objectoExistem vários modos de obter uma referência à jQuery, mas não o mostra na página, visto que temosâncora segundo o que foi dito anteriormente: de utilizar uma das funções de adição de elementos 1 . $("a") visto que é a única âncora do ao DOM de seguida, para tornar o pedaço de HTMLdocumento parte do DOM; 2. $("a:contains(PaP)") através do seu • children(): esta função é similar à find com aconteúdo diferença que só permite encontrar elementos no 3. $("a[href*=portugal-a-programar]") através nível imediatamente abaixo ao dos elementos nodo atributo href objecto jQuery; 4. $("a[href^=http://www.portugal]") através • contents(): função similar à anterior, mas que incluido início do atributo href além dos elementos, também o texto; 5. $(document).find("a") deste modo estamos • each(): esta função permite iterar pelos items dea encapsular o objecto document num objecto jQuery, um objecto jQuery:e a utilizar a função de traversing find que possibilitapesquisar dentro de um objecto jQuery pelos seus $(li).each(function(index) {descendentes, neste caso pelos descendentes do alert([ + index + ] : +document, mas um melhor exemplo poderia ser: $(this).text()); <ul class="main"> }); <li class="first-li"></li> <li class="last-li"></li> • parent(): obter o parent de cada item de um objecto jQuery apenas um nível acima; <li class="parent"> • parents(): obter o parent de cada item de um <ul> objecto jQuery até ao topo da árvore DOM; 32
    • A PROGRAMAR j Qu e ry – A fra m e wo rk • is(): retorna um bool que nos diz se os items de um • wrap(), unwrap(): a primeira envolve todos osobjecto jQuery correspondem ao selector indicado elementos do objecto jQuery num html passado porcomo parâmetro; parâmetro, e a segunda remove os parents de todos • filter(): esta função é também similar à find mas ao os elementos do objecto jQuery;contrário deste, remove os items filtrados do objecto • wrapAll(), wrapInner(): a primeira envolve todos osjQuery elementos do objecto jQuery num único parent, passado por parâmetro, enquanto que a segundaQuanto a manipulation, existem muitas funções envolve os descendentes de todos os elementos doutilizadas frequentemente: objecto jQuery no parent passado por parâmetro; • addClass(), hasClass(), removeClass(),toggleClass(): estas funções, como o próprio nome Já tendo uma visão de como podemos obter, refinar eindica, têm como função adicionar classes, retornar manipular a nossa lista de elementos num objectoum bool caso tenha ou não determinada classe, jQuery, passemos a casos de uso.remover classes, ou adicionar caso não tenha ou Neste caso queremos gerar dinâmicamente uma listaremover caso tenha determinadas classes, de li com base num dado JSON (JavaScript Objectrespectivamente; Notation), dentro de uma ul: • append(): com o append, como o próprio nomeindica, adiciona-se HTML a todos os elementos de <html>um objecto jQuery; <head> • attr(), removeAttr(): com a função attr, podemos ler <script type="text/javascript"atributos, escrever em atributo, ou ou vários de cada src="jquery-1.4.4.min.js"></script>vez, e até utilizar uma função como callback, para </head>computar o valor de um atributo. Com a removeAttr, <body>podemos remover atributos; <ul class="main"> • clone(): esta função cria uma cópia de todos os </ul>elementos num objecto jQuery, incluindo os seus </body>descendentes e é a indicada para copiar elementos </html>numa página. Opcionalmente também pode copiar oseventos, caso passemos o parâmetro com valor true; var items = {"news":[{"title":"PaP has a new • css(): através da função css podemos manipular o magazine","lead":"some text to fillstyle de um elemento, sem preocupações com this..."},{"title":"This is the seconddiferentes nomenclaturas destas propriedades entre article","lead":"some other text to fillcada browser, funciona de modo similar à função attr; this..."}]}; • empty(): com esta função podemos limpar oconteúdo de um ou vários elementos, tanto var $ul = $("ul.main"); /*aqui, uma das boaselementos descendentes como texto; práticas, sempre que criamos um objecto de • html(): retorna o conteúdo html de um elemento jQuery com base num dado selector, devemosutilizando o innerHTML; sempre guardar o resultado numa var, deste modo estamos a colocar o resultado de execução do selector em cache, para não se • text(): retorna o texto de todos os elementos do repetir a mesma operação N vezes. Quanto aoobjecto jQuery, à excepção de elementos do tipo prefixo de $ é algo que se costuma utilizarinput, para os quais é usada a função val() descrita para tornar o código mais legível, de modoabaixo; 33
    • A PROGRAMARj Qu e ry – A fra m e wo rk que sempre que uma var tem este prefixo, adicionar as clonadas à mesma ul, adicionar depreende-se que é um objecto jQuery.*/ algum texto extra com o número da linha a cada span da li e alguns estilos directamente /*quanto à função $.each, é uma das utilities no atributo style. Finalmente obter o texto do jQuery, que permite iterar sobre arrays e de todas as li, sem HTML.*/ objects e como callback para cada iteracção, define-se uma function que recebe 2 //a função end() é utilizada para voltar ao parâmetro, como primeiro o index da context anterior, ou seja, neste caso, antes iteracção, e como segundo o valor actual da do find() iteracção, neste caso o valor é o objecto que $ul.wrap("<div/>").children().wrapInner("<spa contém as propriedades title e lead, n/>").find("span").addClass("testing").end(). definidas no JSON acima.*/ clone().appendTo($ul); $.each(items.news, function(index, value) { var text = $ul.append("<li>"+value.title+"</li>"); $ul.find("span").append(function(index,html) }); { return " : " + (index+1); /*gerando o html abaixo, imaginemos que }).css({"font-weight":"bold", queremos, colocar uma div como parent da ul, "color":"blue"}).parent().text(); /*aqui envolver o texto de cada li numa span, utiliza-se o método css() mas ao invés de adicionar classes às li, clonar as li e passar cada propriedade style em diferentes adicionar as clonadas à mesma ul, adicionar invocações à função, invoca-se apenas uma algum texto extra com o número da linha a vez, usando um objecto com as várias cada li e alguns estilos directamente no propriedade definidas*/ atributo style. Finalmente obter o texto de alert(text); //mostrar o texto das 4 li todas as li, sem HTML.*/ //o html final depois de todas as <html> transformações é: <head> <script type="text/javascript" <html> src="jquery-1.4.4.min.js"></script> <head> </head> <script type="text/javascript" <body> src="jquery-1.4.4.min.js"></script> <ul class="main"> </head> <li>PaP has a new magazine</li> <body> <li>This is the second article</li> <div> </ul> <ul class="main"> </body> <li><span class="testing" </html> style="font-weight: bold; color: blue; ">PaP has a new magazine : 1</span></li> /*gerando o html abaixo, imaginemos que <li><span class="testing" queremos, colocar uma div como parent da ul, style="font-weight: bold; color: blue; ">This envolver o texto de cada li numa span, is the second article : 2</span></li> adicionar classes às li, clonar as li e <li><span class="testing" 34
    • A PROGRAMAR j Qu e ry – A fra m e wo rk Neste exemplo, conseguimos ilustrar a utilização destyle="font-weight: bold; color: blue; ">PaP grande parte das funções descritas anteriormente.has a new magazine : 3</span></li><li><span Neste segundo artigo consegui desvendarclass="testing" style="font-weight: bold; ligeiramente melhor o poder do jQuery, assim comocolor: blue; ">This is the second article : uma pequena parte da sua funcionalidade, em artigos4</span></li> subsequentes irei continuar a demonstrar aspectos </ul> com o handling de eventos, manipulação do DOM e </div> também interacções em AJAX, stay tuned! </body></html>AUTOR Escrito por Ricardo Rodrigues É técnico Nível III em Informática/Gestão pela Fundação Escola Profissional de Setúbal, tendo ingressado após na FCT da Universidade Nova de Lisboa. Posteriormente frequentou vários cursos da Microsoft em diversas áreas como Windows Forms,ASP.NET, Securing .NET Applications, WCF, WWF, Web Services e COM+ tendo obtido as certificações MCP .NET 2.0, MCAD .NET 1 .1 , MCSD .NET 1 .1 , MCPD Windows, Web e Distributed Applications e MCPD - Enterprise Applications Developer. (MCP Profile) Contribui activamente em comunidades como StackOverflow e também possui um blog/twitter como temática relacionada: Blog / @ricmrodrigues 35
    • COLUNASPROGRAMADOR EXCÊNTRICO - 6 regras para utilizar AJAXVISUAL (NOT) BASIC - Windows Phone 7CORE DUMP - gcc -Wall myApp.c -linstantaneous -o success
    • PROGRAMADOR EXCÊNTRICO6 re gra s p a ra u ti l i za r AJ AXAJAX, ou Asyncronous JavaScript And XML, temganho muita força nos últimos tempos. Os O princípio da melhoria progressiva do Ajax é bemProgramadores Web têm feito coisas magníficas com conhecido, porque comummente é utilizado de formao AJAX, mas também já vi grandes erros e uma má discreta no JavaScript, como mostra a imagemaplicação do AJAX. acima.Queria partilhar convosco, através da minha Então, o que deves fazer é construir o teu site paraexperiência como Programador Web mas também funcionar sem JavaScript, e só depois adicionarcomo utilizador frequente da Internet, seis regras JavaScript como sendo um acessório, da mesmapara utilizar o AJAX. forma que utilizas o HTML como linguagem de marcação e depois o CSS para melhorar o visual daAJAX para melhorar, não para funcionar página.Em primeiro lugar, a parte mais importante na criação Informa sempre o utilizador do que está ade um site de qualidade é fazer com que ele seja acontecerfuncional. Como? Não importa, contanto que outilizador saiba que funcione. Um utilizador genérico Não há nada pior que clicar em algo e não ver nada aaté é capaz de ignorar a velocidade de load do site se acontecer por 2 segundos. Os utilizadores estãoele fizer o que quer que seja para o qual foi habituados a clicar e avançar para a acçãoprogramado. seleccionada, ou pelo menos, ver o progresso da acção solicitada.Dito isto, queres que um utilizador ao desligar oJavaScript deixe de conseguir utilizar o site, que ele Lembra-te que a tecnologia AJAX é relativamentedeixe de ser funcional? Sendo que para esse recente, se os utilizadores não souberem o que estáutilizador o site não funciona, ele certamente não irá a acontecer vão pensar que o site não está avoltar. funcionar. Sugiro que utilizem uma mensagem não intrusiva, que mostre o estado da acção solicitada.Nada melhor que a imagem abaixo para explicarcomo deve ser o processo: Usaste AJAX? Boa! A mim não me interessa Encara a verdade, na maioria dos sites, 90% ou mais dos utilizadores não sabem o que é AJAX ou o porquê de ser uma boa tecnologia. Eu, pessoalmente, aprecio um bom script em AJAX, mas será que todos os demais também apreciam? Obviamente que não. A não ser que tenhas um site focado apenas em Profissionais Web, faz um favor aos utilizadores do teu site, e não mostres a mensagem “Feito com AJAX”. 38
    • PROGRAMADOR EXCÊNTRICO 6 re gra s p a ra u ti l i za r AJ AXEu como utilizador não me interessa saber que tipo utilizador não pode manipular o vosso script.de tecnologias e/ou magias obscuras utilizaste, desdeque o site funcione para mim é o que interessa. Certifiquem-se que validam todas as variáveis GET e POST antes de executarem qualquer acção do vossoAJAX só no Fim script.Entregar o Projecto deverá ser o objectivo número AJAX poupa tempo no Load… Mas o teuum, então adiciona o AJAX no fim do projecto ou Framework JavaScript nãodepois que o site esteja feito. Claro que, o AJAX podepoupar que uma página seja actualizada, mas os O teu script em AJAX consegue poupar umautilizadores estão habituados à maneira antiga. Não actualização da página ao utilizador, sem carregar oconsigo imaginar um cliente teu satisfeito com "Não header, footer e sidebar? Óptimo. O teu Frameworkestá feito, mas olhe como esta caixa é actualizada JavaScript tem 80kb? Trabalho em vão.sem actualizar a página!". Certifica-te que apenas carregas o teu FrameworkEu opto sempre pela maneira antiga (na verdade, quando for realmente necessário, e não adicionesstandard é provavelmente a palavra correcta), faço o mais código do que o absolutamente necessário parasite, e só depois no fim é que acrescento melhorias a página. Poupar tempo de load, neste caso, não éna sua funcionalidade eficiente ou user-friendly.As Regras de Segurança também se aplicam Eu opto sempre pela maneiraO URL do AJAX pode até estar escondido no teu antiga ... faço o site, e só depois nocódigo, e assim a maioria dos utilizadores não o vê, fim é que acrescento melhorias namas aposto que consigo encontra-lo. Se é possível sua funcionalidadede ser encontrado é possível de ser explorado. Nãoassumem que só porque fizeram o código do vossoformulário e/ou página à prova de bala que um AUTOR Escrito por Carlos Gonçalves Finalista em Engenharia Informática de Gestão na Escola Superior de Tecnologia de Setúbal do Instituto Politécnico de Setúbal. Actualmente trabalho como Freelancer em Web Development, sou uma pessoa tendencialmente optimista e adapto-me bem a novas circunstâncias. Sempre disposto a aprender, desde o início identifiquei-me com o meu trabalho e gosto de fazer as coisas de maneira simples e objectiva. 39
    • VISUAL (NOT) BASICWi n d o ws Ph o n e 7Que melhor maneira poderia existir para demonstraro poder da .NET Framework do que uma verdadeirademonstração de união?O resultado é a entrada da linguagem Visual Basic.NET na corrida móvel de última geração: o WindowsPhone 7.O desenvolvimento é feito utilizando o poderosoVisual Studio, com todas as comodidades a eleassociadas.Acesso ao ambiente de desenvolvimentoÀ semelhança das versões Mobile, precisamos de O ambiente de desenvolvimentoinstalar kits de desenvolvimento que se vão integrarcom o nosso Visual Studio. Para os interessados que Para quem já estava familiarizado com aplicaçõesnão tenham mais do que a versão Express do Visual Silverlight no VB, o ambiente já é confortável.Basic, lamento informar que o kit não se lhe associa. O designer do lado esquerdo, onde podemos não sóUtilizadores de Windows XP: também nada podem visualizar a interpretação do XAML (eXtensiblefazer. Application Markup Language) mas também provocar alterações visuais que se reflectem no XAML.Para desenvolver para Windows Phone 7 (WP7) sem O manifesto XAML propriamente dito a meio e os jáqualquer custo, podemos usar o Visual Studio conhecidos "Project Explorer" e "Properties" à direita.Express for Windows Phone, mas condicionados a Tudo isto é obviamente configurável das formas aC#. que já estamos habituados nas versões anteriores doO que existe agora é uma versão do kit de Visual Studio.desenvolvimento que se associa ao Visual Studio201 0 Professional e só aí é possível começar a Tipos de páginaescrever aplicações em VB.Nesta solução, não podemos usar XNA nem Existem vários 3 tipos de páginas base, onde todosExpression Blend pois ainda não são suportados. os outros controlos são dispostos: Portrait/Landscape, Panorama e Pivot, cada um deles Depois de ter um Visual Studio suportado, com características distintas. precisamos de instalar as Windows Phone DeveloperTools, que preparam o ambiente necessário para Portrait/Landscape emular um “telefone”, e de seguida a CTP que vai É este o tipo de página base que é empregue ao criar acrescentar as templates e suporte para os projectos um novo projecto para uma aplicação."Mobile" no nosso Visual Studio para o Visual Basic. Trata-se de um modo de visualização regular, onde No final ficarão disponíveis algumas templates dos os conteúdos são dispostos no espaço visível projectos mobile, como podem observar na seguinte disponível, sem qualquer particularidade. imagem. As duas denominações, portrait e landscape, derivam 40
    • VISUAL (NOT) BASIC Wi n d o ws Ph o n e 7 apenas da forma como estamos a segurar o telefone, com o Panorama. e consequentemente da forma como estamos a olhar A grande diferença reside numa separação mais para o ecrã. distinta dos vários grupos: não existe tanto a ideia da Existem apenas duas formas possíveis: ou temos o continuidade. telefone orientado em "retrato", vertical, ou em"paisagem", horizontal. Às duas orientações possíveis Finalmente um exemplo acrescentam-se as variações inversas, onde a orientação de 0º é a inversa da orientação 1 80º mas A melhor forma de expor todos os aspectos básicos no entanto ambas verticais, e 90º é inversa da para vos iniciar no mundo WP é, e será sempre, a orientação 270º mas no entanto ambas horizontais. execução de uma pequena aplicação.A orientação é automaticamente adoptada sempre O que se vai construir é um leitor de RSS 2.0 (Real que os recursos físicos do aparelho detectem Simple Syndication), ainda que não se aproveitem variação na orientação da força gravitacional exercida todas as capacidades do padrão 2.0. sobre o mesmo. 1 - Criar um projecto com o templatePanorama “Windows Phone Application”Panorama é um tipo de página base que nos permite O ambiente vai carregar com todos os elementosdispor os itens num plano horizontal, virtualmente familiares, e anteriormente descritos. A página queinfinito. têm no “designer” é uma página Portrait/Landscape.Apesar de existirem separações distintas entre asvárias páginas do panorama, a navegação é feita de 2- O leitor de RSS que vamos criar lê doisforma contínua, como que se esteja a arrastar uma RSS simultaneamente. Poderia ser apenas um, oufolha que se observa através de uma abertura. poderiam ser virtualmente infinitos, mas vamos criarA navegação pode ser feita a qualquer altura, em apenas 2 “hardcoded” para demonstrar mais tarde asambas as direcções. páginas “pivot” e não confundir muito quem está aÉ um modo de visualização ideal para apresentar começar. Criem duas caixas de texto com nomesgrandes quantidades de informação relacionada que “txRSS1 ” e “txRSS2” e de seguida um botão de nomede outra forma se teriam de distribuir por vários “btLer”. Usem também os pontos de controlo nosecrãs. centros de das arestas da esquerda e direita para ancorar o controlo aos limites horizontais doPivot container. Isto fará com que o controlo “estique”Pivot é um tipo de página base bastante semelhante horizontalmente caso o container também estique. 3- Trocar os textos dos títulos na parte superior para identificarem a página e a aplicação. 4- Testem a aplicação. Ainda não faz nada a este ponto, mas é importante que tentem escrever algo nas caixas de texto para ver como é que o WP7 gere a introdução de escrita. 41
    • VISUAL (NOT) BASICWi n d o ws Ph o n e 7 Number Disponibiliza introdução para o âmbito de escrita numérica Text Disponibiliza introdução para o âmbito de escrita TelephoneNumber Disponibiliza introdução para o âmbito telefónico EmailNameOrAddress Disponibiliza introdução para o âmbito de escrita alfanumérica Estes tipos de introdução devem ser alterados no XAML, na propriedade InputScope de cada caixa de texto, utilizando as denominações descritas. Os diferentes métodos de introdução disparam diferentes teclados virtuais, para que a velocidade e comodidade de introdução seja óptima. Em desenvolvimento, o emulador não permite introdução através do nosso teclado físico e existe um atalho para mudar essa situação. Se carregarem em Pause/Break passa a ser possível introduzir escrita com o teclado do computador.Métodos de IntroduçãoNotaram certamente que ao tocar na textbox surgiuum teclado QWERTY virtual.No contexto das aplicações para aparelhos decomunicação móveis, as letras não são suficientespara cobrir todas as necessidades.Existem 5 principais métodos de introdução: 5- A leitura dos “feeds” vai ser feita numa outraURL página, uma página pivot onde vamos organizar cadaDisponibiliza introdução para o âmbito web um dos dois “feeds” em items diferentes do pivot. Através do menu de contexto que se obtém com o clique direito do rato sobre o nome do projecto no 42
    • VISUAL (NOT) BASIC Wi n d o ws Ph o n e 7Solution Explorer, escolham “Add” e depois “Newitem”. De entre os templates escolham “WindowsPhone Pivot Page” e apliquem o nome “Leitor.xaml”.A nova página surge no editor. 6- Depois de trocar os títulos superiores, 8- Depois de colocar os dois “WebBrowser”, eadicionem um componente “WebBrowser”. de lhes colocar os nomes “wbVista1 ” e “wbVista2”,Disponham-no como na imagem e usem os pontos precisamos de adicionar uma referência necessária àde controlo nos centros de cada aresta para ancorar forma como vamos ler XML, que é o formato doso controlo aos limites do container. Isto fará com que “RSS feeds”.o controlo “estique” caso o container também estique. Temos de escolher “Add reference” através do menu 7- Por defeito uma pivot page já vem com de contexto resultante do clique direito do rato sobre o nome do projecto, no Solution Explorer. Vamos assim, adicionar referência a “System.Xml.Linq” 9- Depois de todos os componentes se encontrarem nas suas posições está na altura de começar a escrever código. Voltemos à primeira página. É necessário fazer com que o botão valide as introduções nas caixas de texto e que envie os seus valores para a segunda página. Navegação entre páginas Para quem sempre programou Visual Basic, a navegação entre páginas vai parecer no mínimo estranha. Podemos imaginar o WP7 como um browser que nos apresenta páginas baseadas numa linguagem de marcação localizada algures, apontada por um URL: o ficheiro XAML existe, construímos um URI que nos aponte a ele, neste caso através de um caminho relativo, e utilizamos essa instância do novo URI no método Navigate do NavigationService. Depois de carregar no botão, a página actual "perde-dois itens de do pivot, que neste caso sãoexactamente quantos precisamos. PrivateSubButton1_Click(ByValsenderAsSystem.ODepois de colocar o “WebBrowser” num item, para bject, ByVal e Asnão complicar, teremos que o duplicar para o System.Windows.RoutedEventArgs)segundo item. HandlesButton1.ClickIsto pode ser alcançado através do designer mas NavigationService.Navigate(Newtorna-se muito mais fácil se identificarem a linha que Uri("/Leitor.xaml"), UriKind.Relative))representa o “WebBrowser” no XAML e a copiarem EndSubpara o outro item do pivot. 43
    • VISUAL (NOT) BASICWi n d o ws Ph o n e 7se" e a nova é carregada e apresentada. garantido, temos também de garantir que conseguimos resgatar esses valores na nova página.Passagem de valores entre duas páginas Resgatar valores do cabeçalho da páginaCom o sistema de navegação equiparado a umbrowser, sem poder criar instâncias de objectos Depois de ter a página carregada (e só depois deForm, como normalmente fazemos no Visual Basic estar completamente carregada, isto é importante)Windows Forms, transportar valores como um podemos resgatar os valores do cabeçalho dasimples número poderiam tornar-se em tarefas página, utilizando o NavigationContext, e servirmo-complicadas. nos deles da forma que entendermos.Já que para a navegação entre páginas temos de 11 - Ao conseguirmos agregar toda aconstruir um URI, é perfeitamente possível passarparâmetros através do URL, o que já reduz Private Sub Leitor_Loaded(ByVal sender Assignificativamente a complexidade para transportar Object, ByVal e Asvalores. System.Windows.RoutedEventArgs) HandlesComo pretendemos passar dois endereços distintos, MyBase.Loadedpodemos adicionar os dois parâmetros ao URL e Dim RSS1URL As String =transportar com eles os valores de texto das caixas NavigationContext.QueryString("rss1")de texto. Dim RSS2URL As String =Depois de carregar no botão, ocorre exactamente o NavigationContext.QueryString("rss2") End Sub NavigationService.Navigate(New Uri(String.Format("/Leitor.xaml?rss1={0}&rss2 informação na segunda página, e da segunda página ={1}", txRSS1.Text, txRSS2.Text), estiver completamente carregada, é altura de fazer as UriKind.Relative)) chamadas, procedimentos e handlers necessáriosmesmo que numa navegação normal, pois estamos a para fazer os pedidos dos itens dos “feeds”.apontar à mesma para uma página, mas o docabeçalho já constam os valores passados no URL.Juntando à passagem de valores a validação simples Private Sub Leitor_Loaded(ByVal sender Asdas caixas, ficamos com: Object, ByVal e As 1 0- Depois do transporte de valores estar System.Windows.RoutedEventArgs) Handles MyBase.Loaded Private Sub btLer_Click(ByVal sender As Dim RSS1URL As String = System.Object, ByVal e As NavigationContext.QueryString("rss1") System.Windows.RoutedEventArgs) Handles Dim RSS2URL As String = btLer.Click NavigationContext.QueryString("rss2") If txRSS1.Text = String.Empty Or txRSS1.Text = String.Empty Then Dim CRSS1 As New CarregarRSS(RSS1URL) MessageBox.Show("URLs vazios!") : Exit Sub Dim CRSS2 As New CarregarRSS(RSS2URL) NavigationService.Navigate(New Uri(String.Format("/Leitor.xaml?rss1={0}&rss2 AddHandler CRSS1.ChegouTitulo, AddressOf ={1}", txRSS1.Text, txRSS2.Text), ChegouTitulo1 UriKind.Relative)) AddHandler CRSS2.ChegouTitulo, AddressOf End Sub 44
    • VISUAL (NOT) BASIC Wi n d o ws Ph o n e 7 ChegouTitulo2 Depois de carregar no botão, a segunda página é AddHandler CRSS1.HTMLPronto, AddressOf carregada e é apresentado o feed da primeira caixa HTMLPronto1 de texto. Podemos passar para o segundo feed AddHandler CRSS2.HTMLPronto, AddressOf arrastando o título do feed para a esquerda ou para a HTMLPronto2 direita. End Sub Private Sub ChegouTitulo1(ByVal Titulo As String) RSS1.Header = Titulo End Sub Private Sub ChegouTitulo2(ByVal Titulo As String) RSS2.Header = Titulo End Sub Private Sub HTMLPronto1(ByVal HTML As String) wbVista1.NavigateToString(HTML) End Sub Private Sub HTMLPronto2(ByVal HTML As String) wbVista2.NavigateToString(HTML) End Sub 1 2- Adicionem ao projecto o ficheiroCarregarRSS.vb, cujo link podem encontrar no finaldo artigo. Trata-se da classe criada para ler os feeds,que não é relevante para o desenvolvimento emWP7. Orientação do aparelho 1 3- A aplicação está completa. Se têm a oportunidade de estar a fazer debugCorram agora a aplicação. O primeiro ecrã apresenta directamente no telefone, já devem ter reparado comas duas caixas. certeza no comportamento da aplicação quandoPreencham as caixas com dois feeds diferentes, por inclinamos o telefone nas posições que normalmenteexemplo: disparam mudanças de apresentação noutras aplicações nativas: não acontece rigorosamenteO “nosso” feed: nada.http://www.portugal-a- No emulador, podem inclinar o aparelho em 90ºprogramar.org/forum/index.php?type=rss;action=.xml através dos botões para o efeito, disponíveis noO feed de notícias do JN: menu do lado direito.http://feeds.jn.pt/JN-ULTIMAS Por defeito, as páginas estão configuradas para 45
    • VISUAL (NOT) BASICWi n d o ws Ph o n e 7ignorar qualquer outra orientação que não seja O desenvolvimento em WP7 assenta em WindowsPortrait. Presentation Framework com todas as vantagensA propriedade SupportedOrientations dita as conhecidas da .NET Framework.orientações suportadas por aquela página e na Os IDE para os quais o desenvolvimento WP7 semaioria dos casos, passá-la para aplica estão muito bem conseguidos e bastantePortraitOrLandscape resolve o layout para a polidos, o que torna a experiência bastante agradávelorientação pretendida, mas também é obviamente e produtiva, desviando o foco do programador parapossível controlarmos os comportamentos. pormenores que não interessam tanto como aTroquem a propriedade SupportedOrientations no aplicação em si.XAML de cada uma das duas páginas para: Não tive oportunidade de fazer debug no aparelhoPortraitOrLandscape físico, mas se estiver tão boa como o antigo Windows Mobile já está com nota positiva. Links VB CTP para WP7: http://www.microsoft.com/downloads/en/details.aspx? FamilyID=a808a69d-611 9-47b7-b858-262be5c4991 5 WP Developer Tools RTW:Conclusão http://www.microsoft.com/downloads/en/details.aspx? FamilyID=04704acf-a63a-4f97-952c-8b51 b34b00ceAinda que diferentes, nota-se perfeitamente o esforçoque a Microsoft está a fazer para substituir WindowsForms por Windows Presentation Framework. AUTOR Escrito por Sérgio Ribeiro Curioso e auto-didacta com uma enorme paixão por tecnologias de informação e uma saudável relação 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 46
    • CORE DUMPgc c - Wa l l m yAp p . c - l i n sta n ta n e o u s - o s u c c e s sDesde a década de 1 970 que a área de informática totalmente irrelevante para o sucesso, excepto,tem sido prolifera na geração de empresas, obviamente, se o negócio se baseia precisamente naempreendedores e aplicações de sucesso. Estes tecnologia em si. Aprender esta lição é de extremasucessos, muitas vezes bombásticos e sempre importância e muitas vezes não é compreendida pormediáticos, parecem indicar que é muito fácil criar um quem faz o desenvolvimento. Ninguém compra umnegócio multi-milionário do dia para a noite. Quando produto por este ser desenvolvido em determinadaum bom programador olha para uma aplicação de tecnologia.sucesso identifica imediatamente um conjunto de Outra lição de extrema importância é que umvariáveis que o levam, invariavelmente, a concluir “Eu programador não é um designer e também não é umsou capaz de fazer isto!” e costuma rematar com “E utilizador comum, o que tipicamente o leva aaté sou capaz de o fazer melhor!” E tipicamente um desenhar aplicações funcionalmente más. E como sebom programador diz a verdade numa situação não bastasse ainda fica ofendido com os utilizadoresdestas.[1 ] por estes não compreenderem que para activar aSe juntarmos à capacidade técnica o baixo custo assinatura digital apenas têm de correr determinadoactual de criar uma aplicação e de a disponibilizar comando numa shell com permissões depara todo o mundo ficamos a pensar porque razão administração![2]apenas uma ínfima a quantidade de programadorescria e gere o seu próprio negócio e porque não são (...) um programador não é umtodos multi-milionários. designer e também não éA resposta é bastante simples, e ao contrário de 99% um utilizador comum (...)das respostas dadas por quantos lêem esta coluna, arazão não é dinheiro para arrancar. A questão Uma terceira lição de extrema importância é que umatambém não é técnica nem tecnológica mas sim de aplicação não é um produto. Um produto épersonalidade. Apenas uma infama parte dos constituído por muito mais do que uma aplicação deprogramadores é realmente empreendedor e desses software. Por exemplo, um produto tem um manualnem todos têm a coragem de arriscar a voar por si. E de instruções que efectivamente explica o produto etodos quantos arriscam mudar de vida sofrem na pele como operar com o mesmo.todas as torturas e maus tratos que advém da gestãode um negócio próprio, a começar pelo facto de que Por esta altura muitos estão a pensar “mas eunão existem sucessos instantâneos, muito menos compreendo tudo isto, acho que tenho veia depara negócios multi-milionários. Sem dúvida que há empreendedor”. A todos vocês que pensaram issoexcepções à regra, mas mesmo essas excepções vou lançar um desafio. Respondam às seguintesque tiveram uma capitalização exponencial sofreram questões:as dores de cabeça de um negócio pequeno onde,cada dia passado era uma vitória e sem havercertezas quanto ao mês seguinte. 1 . Quantos projectos vossos já idealizaram? 2. Desses, quantos começaram?Uma lição muito importante para quem pretende ser 3. Dos projectos que começaram, quantosempreendedor é compreender que a tecnologia é terminaram? 47
    • CORE DUMPgc c - Wa l l m yAp p . c - l i n sta n ta n e o u s - o s u c c e s s4. Dos projectos que terminaram, quantos Muitas vezes o programador aspirante alançaram para o mercado? empreendedor valida a ideia com amigos e familiares. Aqui acontecem duas coisas, quem tem Se a resposta foi “nenhum” à questão 1 , então vocês conhecimentos técnicos compreende a coisa e não são empreendedores. Se a resposta foi apaixona-se pela ideia e diz “espectacular” e quem“nenhum” à questão 2, então vocês não são não tem conhecimentos técnicos acredita no que lhe empreendedores. Se a resposta foi “nenhum” à é dito e diz que “é boa ideia”. Há vários erros aqui, questão 3, então vocês não são empreendedores. Se um deles é que os amigos técnicos compram a parte a resposta foi “nenhum” à questão 4, então vocês não sexy do desenvolvimento da aplicação, outro é que o são empreendedores. A minha aposta é que a larga aspirante a empreendedor não sabe explicar a uma maioria de vocês respondeu “imensos” às duas qualquer pessoa o que realmente vai ser essa sua primeiras questões, mas muito poucos responderam ideia. Mas o erro mais grosseiro é não saber“um” ou “dois” e muitíssimo poucos terão respondido responder à pergunta “que problema é que isso“um” à quarta pergunta. resolve?” Se não houver um problema, então não éAcima de tudo um empreendedor “ships it”. Um necessária nenhuma solução, pelo que a ideia cairá empreendedor tem, pelo menos, um projecto que já por terra. Havendo um problema, e quanto mais difícil terminou. Só há produto quando este se encontra de resolver melhor, então tal terá de ser expresso concluído. No entanto um empreendedor tem numa frase curta e clara, finda a qual a nossa tia-avó também de saber quando desistir de um projecto e compreende perfeitamente que produto será saber adaptar o seu produto ao longo do caminho. construído.[3]Tipicamente a ideia inicial é apenas isso mesmo, uma ideia que se tem no início. É apenas a semente que, bem cuidada, germinará algo de que poderemos (...) que problema é que isso oferecer e alguém quererá comprar. Resumindo, e resolve? para os que ainda continuam animados, desenvolver um produto é a parte fácil. Para todos os que ainda não abandonaram a leitura desta coluna furiosos comigo por lhes estar a deitarO empreendedorismo, de forma geral, não se esgota por terra ser o próximo multi-milionário da web, peçona construção do produto. Na verdade isso é apenas apenas mais um minuto.um meio para atingir um fim. E o fim é a criação deum negócio, inicialmente sustentável e mais tarde de É que mesmo com uma ideia validada e uma vontadesucesso. inabalável de desenvolver um software que se vai vender como bolos quentes porque resolve umE também aqui é necessário explicar que o sucesso problema complexo a um número infindável denão existe apenas se conseguirmos entrar para a pessoas, há imensas variáveis que o programadorFortune 500. A maioria dos empreendedores aspirante não pensou ou, pior, pensou de formaconsidera o seu negócio um sucesso quando este lhe leviana. É necessário ter a consciência de que nãodá aquilo que o empreendedor procura na vida. Mas basta construir um bom produto de software, épara lá chegar há um longo caminho a percorrer. necessário vendê-lo. Isto implica uma estratégia deTipicamente esse caminho começa com uma ideia, marketing e de vendas. E não, gastar uns trocos, oumas antes da sua concretização é necessário passar mesmo uns milhares, em Google Ads não épor vários estados, sendo um dos mais importantes o suficiente. Da mesma forma, não é suficiente colocarda validação da ideia. um link para download da aplicação para que alguém a use. Da mesma forma, não é suficiente ter um 48
    • CORE DUMP gc c - Wa l l m yAp p . c - l i n sta n ta n e o u s - o s u c c e s smanual de instruções, é necessário estar preparado [1] A prová­lo está o facto de determinada aplicaçãopara dar suporte à aplicação e, em alguns casos, até de sucesso ser clonada por várias empresas e porformação. vezes até melhor do que original. Mas só ser bomE enquanto tudo isto se desenrola é necessário tratar não basta, e por isso os clones raramente destronamda burocracia inerente ao negócio, recolher feedback quem chegou primeiro.dos utilizadores, corrigir bugs em produção, ajustar oroad map para a próxima release, melhorar a [2]Todos quantos não compreenderam o que acabei de dizer nesta linha têm duas hipóteses: (i) esquecer Dos projectos que o empreendedorismo, ou (ii) contactar­me para vos explicar o que isto tem de mal.começaram, quantosterminaram? [3]Para os mais cépticos deixo um desafio. Olhem para o vosso desktop e vejam se têm algumafuncionalidade, escolher um novo plano de aplicação instalada que não vos seja útil. Todas elasalojamento, dar o produto a conhecer a mais vos resolvem um problema, seja apenas ouvir umpessoas, pagar as contas do mês e, no meio de tudo MP3 ou efectuar o controlo de versões em ambientesisto, ter umas horas para dormir por dia e tentar fazer distribuídos.com que o temo “fim-de-semana” passe a ter omesmo significado que os nossos amigos não-empreendedores lhe dão...Ainda sobrou alguém a ler? Então estás à espera dequê? Valida a tua ideia e mão à obra. Garanto-te queé uma experiência profissional única da tua vida, equem sabe, talvez venhas mesmo a ser o próximomulti-milionário! Boa sorte! ;) AUTOR Escrito por Fernando Martins Faz parte da geração que se iniciou nos ZX Spectrum 48K. Tem um Mestrado em Informática e mais de uma década de experiência profissional nas áreas de Tecnologias e Sistemas de Informação. Criou a sua própria consultora sendo a sua especialidade a migração de dados. 49
    • COMUNIDADESDesenvolvimento em SharePoint 2010GuiaTV CoolthingsPTHabilitar external users no SharePoint online – Office365O Futuro da Programação Assíncrona da Plataforma .NET
    • COMUNIDADE SHAREPOINTPTD e s e n vo l vi m e n to e m Sh a re Po i n t 2 0 1 0Developer em Sharepoint? aplicacionais:Desde muito cedo que esta maniataraobsessão pordebitar linhas de código pelo puro prazer de moverum pixel de um lado para o outro, tem-meatormentado como se de um vírus se tratasse. Nãosei se é mania ou não mas sempre gostei deassuntos que me fizessem pensar e criar algo novo.Sim , eu confesso na minha essência sou umDeveloper , e presumo que vocês que lêem estaslinhas também o são, senão não teriam chegado atéaqui.Um developer, e isto na minha opinião terá de tersempre uma percepção global das coisas e focus nodesenvolvimento, um pouco de bom senso, e muitapaciência. Estas eram as métricas gerais seguidaspor mim até meados de 2004. SharePoint... Pareceu-me interessante a aposta, e aqui estou.Não desfazendo os outros tão prestigiados "cargos” Sites: Criação e Gestão de sites Internos ede IT, Project Manager, and whatever, penso que a Externos. Infraestrutura única para todos os sitesocupação de Developer é a mais cool de todas. Um empresariais Web : Intranet, Extranets e Internetdeveloper de SharePoint obrigatoriamente tem mais Communities: Ambiente de colaboraçãovalências de que só a de desenvolvimento: somos social, Ferramentas com capacidades sociais, comoAdministradores de Sistemas, Helpdesks, Arquitectos blogs, wikis, rssfeeds, tagging, perfis pessoais recios, Testers, DBA , Designer e utilizadores finais da em informaçãoplataforma. Em SharePoint é extremamente rigorosa Content:Gestão documental , políticas dea interacção com a plataforma mas torna-se retenção e classificação automática de conteúdos,gratificante as tecnologias que abrange e a Search: Pesquisas com grande relevância,potencialidade das áreas que toca é surpreendente. contexto social e refinamento Insights: Business Inteligence com acesso aMicrosoft SharePoint Server, o que é? informações em bases de dados, relatórios e aplicações empresariais.Embora muitas pessoas já tenham uma ideia clara do Composites: Ferramentas e componentesque o produto SharePoint representa, existem ainda para criação de soluções comerciaisalgumas dúvidas relativamente ao que este produtopretende atingir. Sendo uma plataforma consolidada nestas diferentesDe uma forma muito sucinta SharePoint é uma áreas, com tantas funcionalidades OutOfTheBox, éplataforma corporativa Microsoft assente sobre áreas clara a necessidade de customização e criação defuncionais. novas, especificas a cada tipo de negócio e cliente.Nesta última versão, 201 0 e existem 6 cores “Developer’s , Developer’s, Developer’s” , sim somos 51
    • COMUNIDADE SHAREPOINTPTD e s e n vo l vi m e n to e m S h a re Po i n t 2 0 1 0nós e estamos aqui. Camada Aplicacional(Application Layer)à Camada de Apresentação(Presentation Layer). Estes diferentesSharePoint 201 0 e tecnologias inerentes layers podem estar localizados numa só máquina (Standalone Server)Antes de tudo, é importante que um developerperceba e entenda minimamente a arquitectura daplataforma e alguns dos seus mecanismos inerentes:SharePoint é baseada na framework .NET,subdividindo-se em 2 tecnologias principais:SharePoint Foundation: Tecnologia subjacente atodos os sites SharePoint, encontra-se disponívelgratuitamente. É o core aplicacional da plataforma te.Podemos utilizar o SharePoint Foundation para criar ou espalhados em diversas máquinas (Small,sites tipificados de colaboração, blogs , wikis Medium, Large Farm)SharePoint Server: Tecnologia servidor. Inclui todasas funcionalidades do SharePoint Foundation alémde funcionalidades e capacidades adicionais comoGestão de Conteúdos, B.I., Pesquisa empresarial.A figura acima ilustra as diferentes tecnologiasinerentes à plataforma. Essencialmente temos osistema operativo, Windows Server 2008, o IIS ,SqlServer, a .Net Framework e ASP.Net, o SharePoint Fisicamente esse conceito também é real, temosFoundation e o SharePoint Server em si. servidores físicos que espelham o mesmo conceito.Embora o SharePoint 201 0 funcione em Windows 7 O esquema físico da farm SharePoint foi pensado deou Windows Vista , não é suportado pela Microsoft forma a ser escalado horizontalmente eem ambientes de produção e para desenvolvimento verticalmente, caso exista necessidade maisrecomendo avidamente a utilização de tecnologia capacidade a nível do User Interface , podem serserver. O ambiente em que desenvolvemos deverá adicionados mais Servidores de Frontend (Web front-ser semelhante ao que desenvolvemos, always ! end), se existir necessidade de aumento da capacidade dos Serviços, podem ser adicionadosArquitectura mais Servidores Aplicacionais (Application Servers). E finalmente se existir necessidade de maisA infraestrutura do SharePoint 201 0 foi pensada de capacidade a nível de base de dados, podem serforma a respeitar uma arquitectura lógica de 3 adicionados mais Servidores de Base de Dadoscamadas: Camada dos Dados(Database Layer), à (Database Server). 52
    • COMUNIDADE SHAREPOINTPT D e s e n vo l vi m e n to e m S h a re Po i n t 2 0 1 0Quaisquer que sejam as necessidades, é permitido Aquando a saída da versão 2007 da plataforma, adesenhar uma topologia que as complemente com integração com a ferramenta de desenvolvimentouma flexibilidade extrema. Visual Studio era muito limitada. Em meados de 2007, as soluções e features eram criadasE como plataforma de desenvolvimento? manualmente, com edição de ficheiros XML , não existindo qualquer ferramenta out of the box ou add-“Estás a desenvolver em coisas já feitas” comentava in no Visual Studio que pudesse facilitar esta tarefa. uma pessoa amiga um dia destes. Inúmeras equipas de desenvolvimento em É verdade, a framework do SharePoint é realmente SharePoint em todo o mundo, tiveram que criar os muito completa mas não é suficiente para muitos dos seus próprios automatismos e mecanismos de casos e pode ser estendida. Da mesma forma que criação destas funcionalidades. No decorrer deste hoje, é vulgar falarmos em desenvolvimento em .NET processo, foram lançadas algumas ferramentas e (que by the way também é uma coisa já feita) add-ins para o Visual Studio dos quais se destaca o também é natural cada vez mais pensarmos além do WSPBuilder(http://wspbuilder.codeplex.com/) que o core aplicacional e virarmos a nossa atenção Com esta nova versão do SharePoint 201 0 e do para implementações corporativas de alto nível. E Visual Studio 201 0, a música é outra. garanto-vos que o desafio é superior. Os Projectos para SharePoint 201 0 estão Com uma framework e Object model extremamente completamente integrados com o Visual Studio 201 0, ricos em métodos e funcionalidades é possível existindo diversos templates que podemos utilizar: estender a plataforma a um nível quase ilimitado. Em termos de desenvolvimentos foca-se 2 pontos cruciais: Soluções e Features. Uma Solução SharePoint, não é mais do que um pacote comprimido com extensão WSP, contendo componentes que caracterizam funcionalidades(Features) dentro da plataforma. Um único pacote pode ter mais da uma funcionalidade. De um forma mais simples, acaba por ser o ficheiro de instalação (vulgo Setup.exe ) de aplicações em SharePoint . Uma farm de Sharepoint pode englobar inúmeros servidores, pelo que com esta tecnologia, podemos instalar uma solução numa máquina que pertença à farm e esta é propagada e instalada em todos os servidores que pertencem a essa Farm. Cool, não? Features, têm por objectivo reduzir a complexidade envolvida na personalização de sites simples, inclusão e manutenção de novas funcionalidades. Cada um destes projectos permite a inclusão de Estão intrinsecamente ligadas ao core aplicacional e vários items sendo que alguns dos templates são podem ser activadas via interface gráfico ou soluções vazias com pelo menos um item command-line. predefinido. Passemos então a um caso prático: o objectivo desteSharePoint e o Visual Studio 201 0 que vos apresento passa por criar uma funcionalidade de registar os contactos dos actuais 53
    • COMUNIDADE SHAREPOINTPTD e s e n vo l vi m e n to e m S h a re Po i n t 2 0 1 0membros da Comunidade Portuguesa de SharePoint funcionalidades por toda a Farm. Para tal vamos criar um tipo de conteúdo (ContentType) com alguns campos e criar uma lista baseadanesse tipo de conteúdo.Apesar de ser um exemplo simples, acaba pordemonstrar algumas funcionalidades que aplataforma disponibiliza1 . Abrir o Visual Studio, no menu principal,seleccional a opção File>New Project •Em Installed Templates, seleccionar a opçãoSharePoint>201 0 e Empty SharePoint Project •Digitar o nome do projecto, e a sualocalização : neste caso o nome escolhido foiSPugPtMembersList e a localização do projecto iráser c:workSPugPtMembersList Neste exemplo vamos criar uma Farm Solution. •Seleccionar o botão OK •Seleccionar a opção “Deploy as a farm solution” •Seleccionar o botão "OK” 3. Temos então o projecto Visual Studio. Comecemos por adicionar alguns itens ao projecto, nomeadamente uma Feature para provisionar o nosso Content Type •Seleccionar o projecto com o botão direito do rato e seleccionar a opção Add>NewItem •Seleccionar o item “Content Type” e o digitar o nome “ContentTypes” para este item. •Seleccionar o botão “Add”2. De seguida, surge o ecrã abaixo, com informaçãocom o url do site SharePoint em que vamostrabalhar, neste caso é http://vm201 0/ pois é o sitepor omissão criado aquando a instalação doSharePoint.Nesta versão do SharePoint existem 2 tipos desoluções que podem ser criadas: Sandbox e Farmsolutions.Sandbox solutions são soluções em que osprocessos de execução, correm em ambientes muitocontrolados com restrições variadas tendo em vistaum enclausuramento aplicacional em toda a Farm deSharePoint. 4. Os content types são elementos com herança peloFarm solutions , são soluções mais abrangentes, que vamos seleccionar o content type mais simplescontemplando desde o inicio uma aplicação de de todos: Item 54
    • COMUNIDADE SHAREPOINTPT D e s e n vo l vi m e n to e m S h a re Po i n t 2 0 1 0 •Seleccionar a opção “Item” <Field ID="{FBAFB32B-D2FA-4BE6-BA7C- •Seleccionar o botão “Finish” CAA3E9534545}" Name="MemberName" DisplayName="Name" Group="SpugPtMembers Columns" Type="Text" Required="TRUE" ShowInViewForms="TRUE" ShowInDisplayForm="TRUE" ShowInNewForm="TRUE" ></Field > <Field ID="{4DBBB65D-A401-41E8-BA71- C200EEFBB7F3}" Name="MemberCompany" DisplayName="Company" Group="SpugPtMembers Columns" Type="Text" ShowInViewForms="TRUE" ShowInDisplayForm="TRUE" ShowInNewForm="TRUE" ></Field > <Field ID="{706647BC-77EA-46E0-A4F3- CCD9BD291A85}" Name="MemberEmail"5. Neste momento, já temos a nossa Feature criada. DisplayName="Email" Group="SpugPtMembersComo podem ter verificado por omissão o Visual Columns" Type="Text" Required="TRUE"Studio cria estes items com nomes e conteúdos com ShowInViewForms="TRUE"denotações automáticas. ShowInDisplayForm="TRUE" ShowInNewForm="TRUE"Desta forma: ></Field > •Editar na window “Solution Explorer” o nome <Field ID="{B7F1842E-4862-43F9-8D4A-da “Feature1 ” para “ContentTypes” 9D6C0B5A2BC4}" Name="MemberPhone" DisplayName="Phone" Group="SpugPtMembers Columns" Type="Text" ShowInViewForms="TRUE" ShowInDisplayForm="TRUE" ShowInNewForm="TRUE" ></Field > •Inserir os seguintes campos , como 1 ºs •Editar o ficheiro Elements.xml com conteúdo elementos do ficheiro Elements.xmlmais contextualizado e lógico •E inserir as seguintes referências aos mesmos dentro do elemento <FieldsRefs>: <FieldRef ID="{FBAFB32B-D2FA-4BE6-BA7C- CAA3E9534545}" Name="MemberName" /> <FieldRef ID="{4DBBB65D-A401-41E8-BA71- C200EEFBB7F3}" Name="MemberCompany" /> <FieldRef ID="{706647BC-77EA-46E0-A4F3- CCD9BD291A85}" Name="MemberEmail" /> <FieldRef ID="{B7F1842E-4862-43F9-8D4A- •Após edição do campos Name, 9D6C0B5A2BC4}" Name="MemberPhone" />Group,Description e o nome da Feature temos:Resta acrescentar alguns campos, de forma a Ficamos então com algo como :caracterizar o nosso Content Type: 55
    • COMUNIDADE SHAREPOINTPTD e s e n vo l vi m e n to e m S h a re Po i n t 2 0 1 0 6. Resta-nos ainda caracterizar a nossa feature . Desta forma seleccionar a feature “ContentTypes” , e com o botão do lado direito, seleccionar a opção •No ecrã seguinte , digitar em “What is the“View Designer” display name…” o seguinte texto “SpugPt Members Editar os campos Title e Description como mostra a List” figura abaixo. •Deseleccionar a opção “add a list instance Não esquecer de seleccionar o Scope da Feature ….” para Site •Seleccionar o botão “Finish” Neste momento temos a nossa Feature de ContentType , claramente definida, com conotações lógicas e Mais uma vez, teremos que editar o conteúdo deste campos inerentes. novo ficheiro Elements.xml criado , mas desta vez só 7. Vamos de seguida criar uma list definition de forma precisamos alterar o campo Description. a provisionar uma definição de uma lista SharePoint baseada neste Content Type criadoAssim: •Seleccionar o projecto com o botão direito do rato e seleccionar a opção Add>NewItem •Seleccionar o item “List Definition from Content Type” e o digitar o nome“SpugPtMembersList” para este item. •Seleccionar o botão “Add” 7.Finalmente, temos a solução completa pelo que só 56
    • COMUNIDADE SHAREPOINTPT D e s e n vo l vi m e n to e m S h a re Po i n t 2 0 1 0nos falta fazer a instalação no nosso SharePoint •Seleccionar a opção Lists> SpugPt Members ListComo? Fácil.Primeiro executamos o Build da solução •Digitar SpugPtMembers na caixa de textoe de seguida o Deploy e a nossa solução fica •Seleccionar o botão “Create”instalada no SharePoint. Temos a nossa lista criada, resta-nos adicionar itensComo teste final, vamos criar a nossa lista e criaralguns itens.Para tal: •Aceder ao site SharePoint, via browser ,neste exemplo “http://vm201 0” •Seleccionar a opção Site Settings > More •Seleccionar a opção “Add new item”Options et Voilá! 57
    • COMUNIDADE SHAREPOINTPTD e s e n vo l vi m e n to e m S h a re Po i n t 2 0 1 0Conclusão Resta-me fazer-vos um convite: todos os meses aos 2ª Sábados, a Comunidade Portuguesa deEmbora tenha sido um exemplo muito simples, SharePoint apresenta 1 sessão e chalk talks comespero que tenha atingido o objectivo de como o membros activos na tecnologia onde podemos trocardesenvolvimento em SharePoint encontra-se ideias, e esclarecer dúvidas e acima de tudo trocarextremamente facilitado comparativamente com as experiências.versões anteriores. É uma plataforma extremamente Apareçam, e espero que tenha sido útil.poderosa como ferramenta corporativa e comoplataforma de desenvolvimento. Dentro deste tema Aquele abraço com muitos Dispose à misturaexistem claramente imensos subtópicos, integraçõese tipo de implementação e neste momento é claroque este é um produto da Microsoft que irá evoluir econsolidar-se cada vez mais. AUTOR Escrito por Rodrigo Pinto SharePoint Specialist, Evangelist, SharePoint Portuguese User Group (SPUGPT) Founder Com 1 2 anos de experiência em Software Engineering & Architecture, é SharePoint Specialist, Evangelist na Indra. Tem experiência nas diversas áreas do SharePoint ,destacando-se as áreas de object model, implementação de soluções, e Web Content Management com conteúdos media. Evangelista acérrimo de um roadmap de best pratices na plataforma SharePoint assente em rigor e criatividade , procura disponibilizar estas provas de conceito pela comunidade, clientes e parceiros. É o fundador da Comunidade Portuguesa de SharePoint.(www.sharepointpt.org) 58
    • COMUNIDADE ANDROIDPTG u i a TV C o o l th i n gs PTA aplicação GuiaTv é uma aplicação para dispositivos Mas assim que soubemos da exist ncia do concursomóveis com o sistema operativo Android que permite definimos logo essa data como a deadline paraaos utilizadores visualizarem a programação dos apresentar a versão beta da aplicação. Paracanais de televisão de uma forma simples e ao conseguirmos cumprir os prazos por nós definidos, foimesmo tempo apelativa. Foi esta aplicação que necessário cortar algumas funcionalidades maisgarantiu à equipa CoolthingsPT o primeiro prémio do complexas e diminuir a prioridade a algumas tarefasConcurso de Programação para Android (CPA) da que poderiam ser mais motivantes. Tudo isto, paracomunidade Androidpt (http://www.androidpt.com/). garantirmos que tinhamos tempo suficiente para criar todas as funcionalidades básicas da aplicação. Ecrã Guia TVEsta aplicação foi a primeira aposta da startup Ecrã Zappingnacional CoolthingsPT. Os objectivos da Método de DesenvolvimentoCoolthingsPT a curto prazo passam por fazer daCoolthingsPT uma marca com qualidade a nível No desenvolvimento da aplicação, a equipanacional e internacional, tanto no desenvolvimento de empregou métodos ágeis de desenvolvimento deaplicações Android como em serviços de consultoria software. Desses métodos destaca-se o scrum, ondenessa área. se encaixam as reuniões em que cada membro basicamente comenta aquilo que fez na últimaO desenvolvimento da aplicação começou algum sessão de desenvolvimento, o que pretendetempo antes do anúncio do 1 º CPA desenvolver nessa sessão de desenvolvimento e os(http://concurso.androidpt.com/). entraves que prevê para essa mesma sessão. Esta 59
    • COMUNIDADE ANDROIDPTG u i a TV C o o l th i n gs PTprática é muito interessante porque permite a todos a funcionalidades que pretendiamos no mesmo ecrãos membros da equipa estarem actualizados sobre o permitindo assim uma navegação mais fluida para odesenvolvimento de todas as frentes de utilizador.desenvolvimento da aplicação e terem em todas assessões de desenvolvimento uma visão geral do Todas as TabHosts do GuiaTV sofreram umaestado de desenvolvimento da aplicação. modificação visual na implementação da TabHost,Para além destas reuniões, também é importante pois esta não era suficientemente atractivasalientar uma prática que nós achamos importante na visualmente e não se adequava ao tema daequipa CoolthingsPT que é o facto de programarmos aplicação. Estas alterações foram possíveis porque aem pares e discutirmos a melhor forma de plataforma android oferece total liberdade aodesenvolver uma funcionalidade entre toda a equipa. developer para alterar do modo pretendido os componentes existentes na API. A visualização de todos os canais disponiveis da MEO e da ZON são apresentados ao utilizador dentro de uma "HorizontalScrollView". Esta view foi escolhida para apresentar os mais de 200 canais porque permite uma interacção rápida com os mesmos, o que permite uma alteração rápida de canal e é ao mesmo tempo visualmente atractiva e cativante. Relativamente ao modo de obtenção da informação dos canais e respectiva programação, esta é efectuada por requisições "post", sendo a resposta obtida no formato "xml". Relativamente à obtenção da informação da MEO, foi utilizado o webservice disponibilizado pela sapo disponivel no seguinte endereço: http://services.sapo.pt/Metadata/Service/EPG Ecrã Destaques No que diz respeito aos destaques, é utilizado umEstrutura da Aplicação webservice que recolhe os destaques diáriamente, colocando a informação posteriormente numaUma das primeiras e principais dificuldades na "listView".implementação do GuiaTV foi definir claramente quala estrutura da interface a utilizar. Depois de Para proceder ao parsing da informação obtida emexperimentar algumas aplicações já existentes, xml é utilizada a API SAX(Simple API for XML) pois édecidimos optar por utilizar uma interface com tabs um "parser" rápido e gasta relativamente menosrecorrendo ao uso de "Tabhost"s. A TabHost é um tipo memória quando comparado com DOM(Documentde ViewGroup disponível na API do Android. Fazendo Object Model). Isto faz com que seja adequado parauso destas TabHosts, é possível agrupar o conteúdo um dispositivo móvel dada a memória ser maisda aplicação em tabs dentro de uma TabActivity. Com limitada.este tipo de interface, conseguimos apresentar todas 60
    • COMUNIDADE ANDROIDPT G u i a TV C o o l th i n gs PTUm dos objectivos iniciais era permitir a utilização daaplicação no modo offline, para tal foi criado umserviço para obtenção da informação dos canaisfavoritos, guardando a mesma numa base de dadosinterna ( sqlite ). Sendo que os canais favoritos sãodefinidos pelo utilizador, foi necessário encontrar umaforma simples, intuítiva e cativante para proceder aessa selecção. A funcionalidade de Zapping estádirectamente ligada aos favoritos, expondo ainformação dos programas que estão a decorrer nomomento nos canais favoritos, bem como apercentagem de programa já decorrida.Tanto a lista que mostra a programação de cada Ecrã Principal Ecrã Guia TV canal como a lista de canais favoritos no Zapping é * Os icones apresentados são somente exemplos e utilizado um "ListAdapter", que extende do não representam os finais."BaseAdapter" e que é modificada sempre que houver alterações, ou seja, quando se muda de canal ou Como se vê nas imagens acima apresentadas, a quando um canal é adicionado ou removido dos interface foi remodelada de acordo com as favoritos. Esta é a forma mais funcional e correcta de "guidelines" de construção de aplicações proposta apresentar informação numa aplicação android. pela Google. Mais informações sobre este assunto em:Sneak Peek http://android- developers.blogspot.com/201 0/05/twitter-for-android-Actualmente estamos a preparar a próxima versão do closer-look-at.htmlGuiaTV CoolthingsPT que incluiu, por exemplo,pesquisa automática da box Meo para mudança decanais, "zapping" automático, menu deconfigurações, ordenação de canais, restruturação dainterface visual, entre outras.De seguida apresentamos duas imagens da próximaversão da aplicação GuiaTV CoolthingsPT. AUTOR Escrito por CoolThingsPT Equipa constituída por: Bernardo Pina, Celso Cardoso, Claudia Peixoto, Diogo Júnior, Juarez Braga, Manuel Silva, Renato Oliveira. Esté é o primeiro projecto conjunto desta equipa. 61
    • COMUNIDADE CODIFICANDO.NETC o m o h a b i l i t a r e xt e rn a l u s e rs n o S h a re Po i n t o n l i n e –O ffi c e 3 6 5Office 365 será lançado em 2011 , produto onlinecom um poder de produtividade e maturidade já Em admin, na lista de serviços disponíveis,visto em relação ao BPOS seleccione a opção “manage” no SharePoint Online:(http://www.microsoft.com/online/), dentre os recursosque foram anunciados e já testados por alguns nobeta, vou apresentar o recurso de external users noSharePoint Online. No SharePoint online disponívelno BPOS (versão 2007 do SharePoint) não erapossível acesso de usuários externos.Uma característica interessante e que é importantepara garantir uma colaboração rica e completa comtodos os colaboradores, parceiros e até clientes, é apossibilidade de compartilhar um site de documentosatravés do SharePoint Online. Agora no SharePointOnline que será lançado no Office365, que já vemcom a versão 201 0 do SharePoint isso será possível.Detalhes do Office365 visite: http://www.microsoft.com/pt-br/cloud/ Figura 2 - Serviços disponíveis http://office365.microsoft.com/en-US/ Em manage, você será direccionado aoNesse artigo pretendo em primeira mão mostrar Administration Center do SharePoint Online, dentrecomo é fácil habilitar e configurar para acesso de as opções de configurações, vá em “manage siteusuários externos usando o Windows Live ID para colletions”:acessar informações do seu site SharePoint.Primeiro passo é registar na secção de administraçãodo Office365: Figura 3 - Administration Center SharePoint Vá em “Site Colletions”, veja que nos sites abaixo a opção “External Users” está deny. Isso significa queFigura 1 - Página de login no Office365 nem dos sites está habilitado para acesso para 62
    • COMUNIDADE CODIFICANDO.NET C o m o h a b i l i ta r e xte rn a l u s e rs n o S h a re Po i n t o n l i n e – O ffi c e 3 6 5acesso de usuários externos. Repare que imediatamente já foi alterado de deny para allow na opção de external users. Figura 8 - Alteração concluídaFigura 4 - Sites Collections Depois de habilitado você vai criar o utilizador no seuEscolha o site que deseja habilitar o acesso externo. site. A criação desse utilizador funciona da seguinteSeleccione o site, clique em ‘settings’, ‘manage forma: você adiciona o utilizador através do e-mailexternal users’, escolha opção ‘allow’ e confirme o que será usado para acederao site, escolhe o grupoprocedimento. na qual o utilizador deve pertencer e confirma. Quando confirmar, o Office365 envia um e-mail para o utilizador informando que foi convidado para acessar o site e deve aceitar o invite. Para adicionar o utilizador, entre no site, exemplo no meu caso: ‘https://2s.sharepoint.com/sites/office365’, clique em ‘sites actions’, ‘site settings’:Figura 5 - Habilitando external users Figura 9 - Site ActionsFigura 6 – Salvando alteração Clique em ‘external users permissions’:Figura 7 - Confirmando liberação para external users 63
    • COMUNIDADE CODIFICANDO.NETC o m o h a b i l i ta r e xte rn a l u s e rs n o Sh a re Po i n t o n l i n e – O ffi c e 3 6 5 enviado para um endereço do hotmail, então fiz o acesso ao hotmail e já consegui visualizar o e-mail recebido. Figura 1 2 - Exemplo de e-mailFigura 1 0 - Users and Permissions Após aceitar o convite o utilizador já será direcionadoAdicione o e-mail, permissão (é possível atribuir o a pagina de autenticação do Online Services. Noutilizador a um grupo especifico, ficando mais fácil momento que o utlizador digitar o e-mail (no casocontrolar as permissões dos utilizadores dentro do hotmail – Live ID) e clicar no campo senha o camposeu site e garantido a segurança das informações) e fica isolado para digitar a senha e automaticamente,mensagem personalizada que vai para o convidado aparece uma mensagem informando para fazer oexterno: sign in directo da página do hotmail. Basta clicar em ‘sign in at hotmail’ e seguir em frente com o login.Figura 11 - Add External UsersNota: Caso o usuário não aceite o convite que Figura 1 3 - Sign inrecebeu por e-mail, ele não será adicionado comomembro do site no SharePoint e também terá acesso Depois que ocorrer autenticação e se tudo estivernegado no site em questão. OK, você será direcionado para home do site SharePoin. Repare o utilizador hotmail registado no Processo de convite foi concluído, agora falta o site: utilizador aceitar o convite para liberação no site. Processo simples, basta o utilizador verificar o e-mail que recebeu e aceitar o convite clicando no campo‘accept your invitation’. Neste artigo o e-mail foi 64
    • COMUNIDADE CODIFICANDO.NET C o m o h a b i l i ta r e xte rn a l u s e rs n o S h a re Po i n t o n l i n e – O ffi c e 3 6 5Figura 1 4 - Home do site SharePoint Um detalhe, caso queria excluir, editar e visualizar os utilizadores, basta ir no SharePoint > site actions >Agora sim, você já pode usufruir do external users e site settings e clicar em people and groups, você teráfacilitar a partilha de documentos e aumentar a lista de utilizadores do seu site.produtividade da sua empresa. Neste passo a passo foi possível visualizar a maneira fácil e rápida de adicionar utilizadores para usufruir de conteúdos que hoje talvez você estaria enviando por e-mail para compartilhar com seus clientes, parceiros e que no SharePoint Online do Office365 será simplificado, poupando tempo e agilizando os processos. Agora é aguardar que a versão fique disponível paraFigura 1 5 - Visualizar pessoas e grupos todos testarem e usufruírem dos benefícios das versões 201 0 dos serviços online. AUTOR Escrito por Sara Barbosa MSP Microsoft. Faz parte da comunidade WININFO. Co-Leader da comunidade AzureServicesBr. Revê artigos para revista online Codificando.NET e-Magazine. Entusiasta Microsoft Online Services [BPOS] e [Office365] e actualmente faz parte da equipa Pensou.NET empresa Gold Certified Partner em Goiás. Mantém o seu blog: http://sarajbarbosa.wordpress.com e twitter: @sarabarbosa. 65
    • COMUNIDADE PONTONETPTO Fu tu ro d a Pro gra m a ç ã o As s ín c ro n a d a Pl a ta fo rm a.NETIntrodução tornar o código mais legível, mas não deixa de ser difícil perceber a intenção do código:Existe alguma confusão entre execução paralela,concorrente e assíncrona. var wr = WebRequest.Create(url); wr.BeginGetResponse(Execução paralela significa que vários troços de ar =>código são executados ao mesmo tempo (em {paralelo). var rs = wr.EndGetResponse(ar) .GetResponseStream();Execução concorrente significa que vários troços de var sr = new StreamReader(rs);código podem aceder aos mesmos dados, não Console.WriteLine(necessariamente ao mesmo tempo, mas durante uma sr.ReadToEnd());operação (que pode ser interrompida). }, null);Execução assíncrona significa que o código éexecutado fora da linha lógica do código actual. Event-based Asynchronous Pattern (EAP)Os três modos de execução acima referidos podemocorrer isoladamente ou em combinação. Vários A partir da versão 2.0 começaram a surgir algumastroços de código podem estar em execução implementações da Event-based Asynchronoussimultaneamente sem que isso signifique Patter (EAP) c) que consiste num métodoconcorrência se não acederem aos mesmos OperationAsync e um evento OperationCompleted.recursos. Uma operação assíncrona pode serexecutada sincronamente. Um exemplo da utilização deste padrão é a classe WebClient.Assynchronou Programming Model(APM) Mais uma vez, usando métodos anónimos ou expressões Lambda talvez até se perceba a intençãoAté à versão 4.0 da plataforma .NET a norma para do código:operações assíncronas era o AssynchronousProgramming Model (APM) a) que consiste em dois var wc = new WebClient();métodos que chamados BeginOperation e wc.DownloadProgressChanged +=EndOperation. (dps, dpe) => {Este modelo é seguido pela quase totalidade das Console.Write(classes da Base Class Library (BCL), como, por "r{0}%: {1} of {2}",exemplo, as streams. b) dpe.ProgressPercentage, dpe.BytesReceived,Os métodos anónimos introduzidos no C# 2.0 ou as dpe.TotalBytesToReceive);expressões Lambda introduzidas no C# 3.0 podem }; 66
    • COMUNIDADE PONTONETPT O Fu tu ro d a Pro gra m a ç ã o As s ín c ro n a d a Pl a ta fo rm a . N E T poderia ser passado à factory um token de cancelamento (CancellationToken). e) wc.DownloadStringCompleted += (dss, dse) => O Futuro Da Programação Assíncrona Na { Plataforma .NET Console.Write(r); Console.WriteLine(dse.Result); A próxima versão da plataforma .NET vai trazer, não }; um novo padrão de execução ou uma nova biblioteca, mas uma nova forma de escrever código wc.DownloadStringAsync(uri); assíncrono.Task-based Asynchronous Pattern (TAP) Assentando na TPL, a nova forma de escrever código introduz duas novas palavras chave: async (AsyncA plataforma 4.0 introduziu uma nova forma de em Visual Basic) e await (Await em Visual Basic).programação assíncrona baseada em tarefas que fazuso da Task Parellel Library (TPL). d) A palavra chave async é aplicada aos métodos e indica ao compilador que deve reescrever o métodoEsta biblioteca permite a execução de tarefas de forma assíncrona.assíncronas mesmo que as classes usadas não A palavra chave await identifica, dentro de umtenham uma API assíncrona, assim como definir a método, a execução assíncrona de um método.tarefa a executar após a conclusão de uma tarefa(continuação) e permite o cancelamento da execução Com este novo modelo de programação assíncronaa tarefa. vai ser possível escrever código como este:Esta API por ter surgido após o C# 3.0 foi desenhada public static async Task<byte[]>já com vista à utilização de expressões Lambda: DownloadDataAsync( string url, Task.Factory.StartNew( CancellationToken cancellationToken, () => IProgress<long> progress) { { return new WebClient() using(var request = .DownloadString(uri); WebRequest.Create(url)) }).ContinueWith( using(var response = await task => request.GetResponseAsync()) { using(var responseStream = Console.WriteLine(task.Result); response.GetResponseStream()) } using(var result = new MemoryStream()) ); { awaitAqui torna-se mais claro que a intenção do código é responseStream.CopyToAsync(result,descarregar um texto e, no final, enviá-lo para a cancellationToken, progress);consola. return result.ToArray(); }Caso fizesse sentido cancelar a tarefa em execução, } 67
    • COMUNIDADE PONTONETPTO Fu tu ro d a Pro gra m a ç ã o As s ín c ro n a d a Pl a ta fo rm a . N E TQue será usado do seguinte modo: - Parallel Programming with .NET byte[] result = await DownloadDataAsync( (http://blogs.msdn.com/b/pfxteam/archive/tags/async/) url, Blogue da equipa de Parallel Programming. cancellationToken, - Lucians VBlog progress); (http://blogs.msdn.com/b/lucian/archive/tags/async/) Blogue de Lucian Wischik – Program Manager daAs equipas dos respectivos compiladores ainda têm linguagem Visual Basic.alguns problemas para resolver, mas não fugirá muitodisto e existe já uma CTP de uma primeira - Fabulous Adventures In Codingimplementação. (http://blogs.msdn.com/b/ericlippert/) Blogue de Eric Lippert – Programador na equipa doRecursos compilador de C#.- Asynchronous Programming Design Patterns - Task-based Asynchronous Pattern (http://msdn.microsoft.com/library/ms228969.aspx) (http://www.microsoft.com/downloads/details.aspx?Fa milyID=4969771 d-9855-4421 -baa0-c91 848db4ab0)- Asynchronous Programming Overview Artigo do Lucian Wischik sobre a Task-based (http://msdn.microsoft.com/library/ms228963.aspx) Asynchronous Pattern e a sua utilização nas novas funcionalidades das linguagens C# e Visual Basic.- Event-based Asynchronous Pattern Overview (http://msdn.microsoft.com/library/wewwczdw.aspx) Hiperligações: a) http://msdn.microsoft.com/library/ms228963.aspx- Visual Studio Async CTP b)(http://www.microsoft.com/downloads/en/details.aspx http://msdn.microsoft.com/library/System.IO.Stream.a?FamilyID=1 871 2f38-fcd2-4e9f-9028-8373dc5732b2) spxExtensão ao Visual Studio 201 0 (não compatível com c) http://msdn.microsoft.com/library/wewwczdw.aspxo Visual Studio 201 0 SP1 ) que providencia as novas d) http://msdn.microsoft.com/library/dd46071 7.aspxfuncionalidades de programação assíncrona. e) http://msdn.microsoft.com/library/system.threading.ca ncellationtoken.aspx AUTOR Escrito por Paulo Morgado É licenciado em Engenharia Electrónica e Telecomunicações (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa e Licenciado em Engenharia Informática pela Faculdade de Ciências e Tecnologia da Universidade Nova de Lisboa. Pelo seu contributo para a comunidade de desenvolvimento em .NET em língua Portuguesa, a Microsoft premeia-o com o prémio MVP (C#) desde 2003. É ainda co-autor do livro “LINQ Com C#” da FCA. 68
    • ANÁLISESSilverlight 4.0 – Curso Completo
    • ANÁLISES i l ve rl i gh t 4. 0 – C u rs o C o m p l e toO livro Silverlight 4.0 – Curso Completo, de autoria deLuís Abreu e colaboração de João Carreiro, é um livrolançado pela FCA – Editora de Informática, com 400páginas e dividido em 1 5 capítulos. É apresentadocom o objectivo de “ensinar o programador que seestá a iniciar na plataforma Silverlight, sendo tambémuma ferramenta indispensável para o programadorconhecedor da plataforma Silverlight que pretendefazer a transição para a nova versão”.O livro começa por apresentar os requisitos, opúblico-alvo, convenções, código fonte e organizaçãodo mesmo, fazendo um pequeno resumo do que seráabordado em cada capítulo.De forma breve é apresentado no primeiro capítulo asprincipais funcionalidades do Silverlight 4.0 e é feito e apresentação dos diversos controlos layoutum enquadramento da tecnologia a nível histórico, a (Canvas, Inkpresenter, StackPanel e Grid), nãonível de arquitectura e a nível de desenvolvimento, ficando de parte o conceito de paneis virtuais emostrando interacção com o Visual Studio 201 0. Não painéis personalizados. O capítulo de Controlos iniciaficando de fora uma abordagem sobre Assemblies e com apresentação da hierarquia de controlos e emPacotes XAP e a integração com páginas Web. seguida é abordado os conceitos content control, items control, selectores, range controls, controlos de texto, sendo apresentado exemplos concreto para É apresentado com o cada conceito. Por fim é apresentado outros controlosobjectivo de “ensinar o generalistas, é o caso da Datagrid e Chart.programador que se está a iniciar No quarto capítulo, Recursos, é feita uma abordagemna plataforma Silverlight” sobre recursos binários, onde é exposta a forma como pode ser feito o acesso aos recursos,O segundo capítulo aborda os conceitos base, que localização de aplicações e por fim é feita aservem de suporte ao desenvolvimento de aplicações apresentação de recursos XAML, sendo abordado osSilverlight, de destacar o conceito XAML, dependency conceitos ResourceDictionary, MergedDicionary eproperties e attached properties, routed events e StaticResource.comandos, incluindo implementação prática destesconceitos. Personalização de Controlos, é o quinto capítulo, onde é abordado os conceitos relacionado comNos dois capítulos seguintes, é feita abordagem estilos, partilha de estilos, herança de estilos,sobre o Layout e Controlos. Em Layout, a abordagem propagação de estilos, temas, templates e estados.é mais direccionada para o processo de renderização Em cada um dos conceitos é apresentado exemplos 70
    • ANÁLISE S i l ve rl i gh t 4. 0 – C u rs o C o m p l e toque clarificam os conceitos teóricos. construção de um player e apresentação do elemento VideoBrush. Por fim, como seria de esperar, éNetworking apresenta as classes introduzidas pela apresentada a interacção com webcam e microfone.plataforma que permitem a obtenção remota dedados. Este capítulo abrange muitos conceitos da Silverlight e o Browser, é o décimo segundo capítulo,plataforma .Net e seria uma mais-valia ter sido que apresenta a forma como é feita a integração domencionadas referências de leitura opcional. Silverlight com uma página de HTML, como é controlada a interacção entre os restantesDataBinding, é o sexto capítulo, a introdução do componentes existentes numa página e o código deconceito data binding e a sua ilustração é uma mais- um user control de Silverlight.valia deste capítulo. É apresentada a forma como éfeita a propagação automática de alterações, usandoa interface INotifyPropertyChanged, os vários modos De salientar que ao longo dade binding, conversores e utilização de bindings emXAML. A validação de dados, faz parte deste capítulo, leitura, deparamo-nos com osendo feito comparação entre a implementação da recurso de diagramas parainterface IDataErrorInfo e INotifyDataErrorInfo. O mostrar a relação entre classes;capítulo termina com a exemplificação de binding emcolecções, cenários de master-detail e paginação,ordenação, agrupamento e filtragem. O décimo terceiro capítulo, Outros Serviços, é um capítulo onde foi colocado todos os conceitos queNo capítulo Gráficos e outros elementos visuais, é não se enquadravam nos outros capítulos, são eles:feito abordagem de dos vários objectos que permitem impressão (PrintDocument, eventos associado,definir o aspecto visual dos user controls de personalização, paginação e feedback de impressão),Silverlight, começando por apresentar geometrias, menu de contexto personalizado, Isolated Storageshapes, brushes, efeitos (zooming e panning), (gestão de ficheiros, escrita e leitura de ficheiro,imagens, fontes e perspectivas 3D. aumento de quota), acesso ao clipboard, drag-n-drop, navegação entre páginas e o controlo pivotviewer.O décimo capítulo, Animações, apresenta as váriasanimações que estão disponíveis em Silverlight, Aplicação Out of Browser, é um dos capítulos muitosendo apresentado em seguida alguns exemplos relevantes deste livro e nele apresentado algumaspráticos. Faz referência a animações com Keyframes considerações importantes, configurações ee Frame-a-frame e faz ainda algumas considerações desinstalação de aplicações, detecção do host desobre performance. No final faz uma pequena alojamento, actualização de aplicações instaladas,referência a ferramentas gráficas, nomeadamente o verificação do estado de ligação à rede, modo fullExpression Blend, no entanto esta ferramenta está trust entre outras funcionalidades específicas. Por fimfora de âmbito do livro. termina com Debugging de aplicações out of the browser sendo feita uma abordagem com o VisualMédia é o capítulo que apresenta os conceitos Studio.relacionadas com ficheiros de multimédia, sendo osmais relevantes MediaElement e MedialPlayer. È feita No último capítulo, Segurança aborda o modelo deuma abordagem dos eventos mais importante, segurança aplicado ao código de Silverlight,produção de vídeo, dowloand progressivo vs explicando o porquê de muitas restrições impostas.streaming, utilização de playlist e marcadores, Terminando com apresentação de alguns cuidados e 71
    • ANÁLISESi l ve rl i gh t 4. 0 – C u rs o C o m p l e toconsiderações a ter em conta no desenvolvimento. projecto no conjunto de projectos do código fonte do livro.De salientar que ao longo da leitura, deparamo-noscom o recurso de diagramas para mostrar a relação Em conclusão, este livro aborda os conceitos deentre classes; uso de imagens de apoio à Silverlight 4.0, está bem organizado em termos decompreensão de conceitos; destaque e notas de conteúdo, é de fácil leitura e é um bom guia paraaspectos mais ou menos relevantes, orientando o quem vai iniciar ou para quem já tem algunsleitor a poder complementar a sua leitura com outros conhecimentos nesta tecnologia.recursos; apresentação de exemplos práticos e emalguns casos é apresentada a implementação deconceitos.Um aspecto que pode ser melhorado é naapresentação dos exemplos, especificar o respectivo AUTOR Escrito por Sara Silva É licenciada em Matemática – Especialidade em Computação, pela Universidade de Coimbra, actualmente é Software Developer no Porto. O entusiasmo pela área resultou na obtenção dos títulos de Microsoft Certified Profissional Developer – Windows 3.5, Microsoft Certified Tecnology Specialist – WPF 3.5, WPF 4 e Windows Forms. Faz parte de várias comunidades, tendo uma participação activa na Comunidade NetPonto e no P@P. 72