Revista programar 27
Editorial

EDITORIAL
  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 Silva



A revista PROGRAMAR é um projecto voluntário, sem fins lucrativos. Todos os artigos são da responsabilidade dos autores, não podendo a revista ou a
comunidade ser responsabilizada por alguma imprecisão ou erro. Para qualquer dúvida ou esclarecimento poderá sempre contactar-nos.

                                                                         2
Índice

                                                                                  INDICE
TEMA DE CAPA
             6    Introdução ao ASP .NET MVC 3.0


A 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 framework


COLUNAS
             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 success


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


ANÁLISES
             70   Silverlight 4.0 – Curso Completo




EVENTOS
1 8 Fev.   ESAF LanParty 2011
1 8 Fev.   5º Portugal Girl Geek Dinner
21 Fev.    Windows Azure BootCamp Lisboa 2011 - Lisboa
23 Fev.    Visual Studio S201 0 - Workshop Desenvolvimento Aplicacional - Porto
28 Fev.    Microsoft Business Integration RoadShow - Lisboa
04 Mar.    XNA Pizza Night 2011 Spring Edition
05 Mar.    3º Encontro WordPress Portugal em Lisboa
26 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 u
Que uma parte do mundo está em modo revivalista dos               Nos últimos cinco anos Portugal subiu sete posições no
eighties já toda a gente percebeu. Da roupa aos                   ranking europeu de inovação, passando este ano à frente
acessórios, passando pela música e pelos carros, as               de Espanha e da Itália e liderando o grupo de inovadores
tendências vão desaguar ao período da História que                moderados. Conquistando o 1 5º lugar do European
consagrou Madonna como ícone. Sem surpresas, os                   Innovation Scoreboard de 201 0, o país continua, ainda
videojogos 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 ZX
Spectrum, que fez as delícias daqueles que agora andam            O estudo já está online e vai ser apresentado hoje em
na 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 a
No início do mês, a entidade americana responsável pelos          Portugal Telecom (PT) recebeu hoje um prémio que
endereços de Internet, chamada IANA, anunciou que tinha           reconhece a rede de fibra óptica da operadora como «a
atribuído os últimos endereços disponíveis, o que deu azo a       melhor e mais inovadora na Europa», anunciou hoje a
vá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 equipas
administradoras mundiais desses endereços, terão que              da PT, e o sucesso da estratégia que adoptámos, que
buscar métodos para administrar apenas os endereços que           privilegia a inovação, a execução operacional e parcerias
já existem. Isso pode virar um transtorno devido ao               com líderes da indústria, de modo a podermos oferecer aos
aumento do número de usuários e serviços que solicitam            nossos clientes em Portugal os melhores e mais avançados
novos 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 cresce
vertiginosamente.                                                 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 CAPA
Introdução ao ASP .NET MVC 3.0
TEMA DE CAPA

I n tro d u ç ã o a o ASP . N E T M VC 3 . 0
Desde 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 que
desenvolvimento 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/downloadmvc3
utilizadores, cookies, entre outras funcionalidades,
juntamente com um modelo de programação                    É importante destacar que o ASP .NET MVC 3.0
baseado em páginas e eventos que permite                   utiliza novos recursos que fazem parte do .NET
desenvolver aplicações Web de uma forma muito              Framework 4.0, e por isso necessita ter esta versão
semelhante ao desenvolvimento de aplicações                do .NET Framework e o Visual Studio 201 0 para
Windows Forms.                                             desenvolver aplicações (não é possível utilizar o
                                                           Visual Studio 2008).
Este modelo de programação chama-se ASP .NET
WebForms, 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.0
então lançado pela Microsoft a primeira versão do          deve ser instalada manualmente.
ASP .NET MVC, que é uma alternativa ao modelo
WebForms existente, e oferece um modelo de                 Model-View-Controller (MVC)
programação muito mais simplificado e directo, e
baseado num padrão (design pattern) bastante               O padrão Model-View-Controler ou MVC permite
conhecido e utilizado em vários outros frameworks e        separar o código necessário para interagir com a
plataformas, 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 um
modelo de programação muito
mais simplificado e directo, e
baseado num padrão bastante
conhecido (...)
Assim, actualmente um developer que queira
desenvolver uma aplicação Web na plataforma
Microsoft .NET tem à sua disposição duas                   No ASP .NET MVC, um Controller corresponde a uma
alternativas ou modelos de programação que pode            classe que pode ser responsável por receber as
escolher de acordo com a sua preferência: ASP .NET         informações solicitadas pelo cliente (navegador), e
WebForms 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 diferentes
Controler ou MVC permite separar                            Models);
                                                            - E provavelmente o mais importante: Ajuda os
o código necessário para interagir                          developers a manter o foco em um único aspecto da
com a interface com utilizador                              aplicação, de cada vez.
através de três conceitos: Model,
View e Controller                                           Funcionamento do ASP .NET MVC 3
O recebimento das informações acontece através de           Quando o framework inicia o processamento de uma
mé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á o
mais acções (Actions) possíveis de serem                    Controller que será responsável por responder a esta
executadas, e cada Action é então responsável por           requisição, e qual será a Action deste Controller que
receber as informações enviadas através do cliente          será executada. Por exemplo:
(navegador) efectuar qualquer processamento que
seja necessário e então enviar a resposta apropriada.       http://portugal-a-programar.org/revista/edicoes

Para enviar esta resposta, a Action do Controller           No exemplo acima, o framework ASP .NET MVC
interage com o modelo aplicacional (Model)                  analisa o texto da URL que está após o endereço do
geralmente composto de várias classes que                   site, e identifica “revista” como sendo o nome do
implementam a lógica de negócio da aplicação, e             Controller que deve ser responsável por responder a
desta forma, o Controller consegue preparar a               esta requisição, e “edicoes” como sendo o nome do
resposta a ser enviada de volta para o cliente              método (Action) a ser executado neste Controller.
(navegador).
                                                             Para que esta requisição seja processada com
Esta resposta normalmente corresponde a uma View,            sucesso, é preciso que um dos assemblies do
cuja responsabilidade é construir a resposta ao              projecto (ou em assemblies referenciados) possua
pedido solicitado, no formato apropriado. As Views           uma classe com as características abaixo, caso
normalmente são compostas por código HTML e                  contrário a resposta enviada será um erro do tipo
JavaScript, 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ível
benefí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 classe
uma mesma informação (Model);                               System.Web.MVC.Controller;
- Novas interfaces com o utilizador (Views) podem ser       - Precisa ser uma classe que tenha o mesmo nome
facilmente adicionadas, removidas ou alteradas, sem         identificado através da URL como sendo o nome da
grande 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 na
alterada (pois está centralizada num Controller);           URL como sendo a Action a ser executada, e que
                                                            retorne         um        objecto         do      tipo

                                                        7
TEMA DE CAPA
I n tro d u ç ã o a o ASP . N E T M VC 3 . 0


System.Web.Mvc.ActionResult ou de uma classe                 partir do Visual Studio 201 0 deve aceder ao menu
derivada desta.                                              File, seleccionar New, e então Project, onde poderá
                                                             seleccionar o tipo de projecto “ASP.NET MVC 3 Web
No exemplo acima, a classe responsável por                   Application”, e definir o nome do projecto e o local
processar este tipo de requisições (http://portugal-a-       onde será gravado.
programar.org/revista/edicoes) deve chamar-se
RevistaController, e deve possuir um método
chamado 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 no
ficheiro Global.asax e que pode ser alterada se
desejar:
                                                              Os templates que pode escolher são: “Empty” e
Criando o seu primeiro projecto ASP                          “Internet Application”.
.NET MVC 3
                                                             A principal diferença entre os dois é que o “Internet
Para 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 . 0


views de exemplo que podem ser utilizadas como                - Content: Pasta onde deve colocar as imagens e
base 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 os
necessá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 ficheiros
sintaxe simplificada e (...) mais                             JavaScript utilizados no projecto;
                                                              - Views: Pasta onde deve colocar os ficheiros
elegante                                                      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 site
ASPX é o View Engine que foi introduzido na primeira           Para criar a página inicial (home-page) da aplicação
versão do ASP .NET, juntamente com o modelo                    Web, o primeiro passo é criar o controller chamado
WebForms 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 3
e possui uma sintaxe simplificada e considerada mais           Para isto, clique com o botão direito na pasta
elegante, pelo que é o View Engine padrão do                   Controllers no Solution Explorer, seleccione “Add” e
ASP.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 seguinte
Ao 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 CAPA
I 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 estrutura
qualquer requisição feita para a home-page do site            similar a figura abaixo:
(ex:         http://portugal-a-programar.org/     ou
http://localhost:1 234/) fará com que um novo objecto
da classe HomeController seja automaticamente
instanciado pelo framework ASP .NET MVC, e o
método Index será executado. A resposta deste
método Index será então enviada de volta para o
cliente (navegador) que fez a requisição.

O método Index neste exemplo possui apenas uma
chamada para um outro método da própria classe
chamado View, um método herdado da classe
Controller. O que este método faz é executar solicitar
ao View Engine que seja construída uma determinada
View, e como não foram passados parâmetros, este
método assume que a View possui o mesmo nome
do método (Index), e que está dentro de uma pasta
com o mesmo nome do Controller que está a ser
executado (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 . 0




Conclusão
Como foi possível ver ao longo do artigo, que
abordou de uma forma muito superficial o                       A comunidade NetPonto é uma iniciativa
funcionamento e estrutura deste novo modelo de                 independente e sem fins lucrativos, que tem
programação Web, o ASP .NET MVC 3 torna-se                     como simples e único objectivo a partilha de
bastante simples de utilizar a partir do momento em            conhecimento na área de arquitectura e
que se percebe as convenções utilizadas para definir           desenvolvimento de software na plataforma
as diferentes partes de uma aplicação, e ao mesmo              .NET, na tentativa de disseminar o conhecimento
tempo 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 dizer
nos ter uma maior separação entre                              impossível) estar por dentro de tudo, e essa é
                                                               uma das principais vantagens em fazer parte de
a lógica de negócio e a interface                              uma comunidade de pessoas ligadas à nossa
com 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 PROGRAMAR
Lua – Linguagem de Programação (Parte 7)
Flex e Byacc - Parte III
Optimização de SQL em Oracle - Índices
jQuery – A framework
A PROGRAMAR

Lu 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ÇÕES
do ambiente interactivo de programação Lua, além de
das operações de acesso a arquivo.                            Na quarta parte desta série de fora abordado o uso
Neste artigo como prometido será tratado os                   de tabelas com listas de registos, unidimensionais e
assuntos 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 por
descrição de dados e uso de programação orientada             meio do uso das funções de inserção e remoção de
a objectos.                                                   elementos em tabelas: insert() e remove() da
                                                              biblioteca padrão table.
                                                              O programa seguinte efectua a acção de entrada e
ESCOPO DE VARIÁVEL                                            saída de elementos na tabela VETOR.

A definição de variável em linguagem Lua ocorre                -- inicio do programa TAB01
sempre como escopo global. Caso haja a
necessidade 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 do
a instrução local. O escopo local é determinado pelo
                                                                   table.insert(VETOR, I)
bloco no qual a variável foi declarada. Uma variável
                                                                 end
com escopo local que seja declarada fora de
qualquer bloco é visível em todo o programa.                     for I = 1, 5 do
Por exemplo, o trecho de código seguinte é iniciado                print("["..I.."] = "..VETOR[I])
com a variável X global com valor 33. Dentro da                  end
decisão com a instrução if … then / end a variável X é
                                                               -- fim do programa TAB01
definida 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] = 6
Ao ser executado o trecho de código anterior será              [4] = 8
apresentado os valores 33, 5 e 33, sendo o valor 33            [5] = 10
para a variável X com escopo global e o valor 5 para
a 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 PROGRAMAR
Lu 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] = 6
parâmetro a definição do nome da tabela e o
                                                                [5] = 8
segundo parâmetro o valor a ser inserido dentro da
                                                                [6] = 10
tabela. Na sua operação esta função pode trabalhar
com até três parâmetros, sendo o segundo parâmetro
de uso opcional. Assim sendo, foram usados no                  Além da inserção do valor 9 na posição 1 da tabela
programa anterior, de fato, o primeiro e o terceiro            VETOR está em uso a função maxn() que percorre a
parâmetros da função insert().                                 tabela contando quantos elementos existem. Desta
Quando a função table.insert() está em uso ela                 forma, a instrução N = table.maxn(VETOR) atribui
efectua a entrada do valor na posição n + 1 , onde “n”         como valor para a variável N a quantidade de
representa 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 primeira
elemento junto a tabela, bastando fazer uso de um              posição da tabela ocorreu o manejamento de uma
parâmetro a mais indicado na segunda posição.                  posição a mais para acomodar os elementos
O 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 tabela
do 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ção
editor 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] = 0
Após a execução do programa ocorre a apresentação
                                                                [2] = 2
da 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 do
parâ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
                                                                 end
definida, 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 um
Em seguida escreva o código de programa em um                 editor de texto, gravando-o com o nome tab05.lua e
editor 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 de
Após a execução do programa ocorre a apresentação             cinco nomes. Por exemplo, se forem fornecidos os
da 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] = Silvia
Perceba que o valor 4 que estava na terceira posição
foi removido. Com a remoção do valor 4 ocorreu o               [1] = Augusto
manejamento dos outros valores.                                [2] = Joca
No processo de manipulação de tabelas por funções              [3] = Paula
há ainda a possibilidade de fazer uso da função sort()         [4] = Silvia
da biblioteca table para colocar os elementos em               [5] = Silvio
ordem ascendente se forem strings ou crescente se
forem números.
O programa seguinte demonstra o uso da função                 Observe que na primeira parte da saída ocorrera a
table.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 PROGRAMAR
Lu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7)


DESCRIÇÃO DE DADOS                                              -- inicio do programa TAB06

Uma 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                      end
sentido de fazer uso desta característica crie um
arquivo 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 dos
Grave o arquivo com o nome popula.lua e observe                dados existentes no arquivo popula.lua. A partir da
que cada um dos registos está identificado com o               definição da tabela é possível efectuar operações de
nome pessoa. Esta é uma segunda maneira de se                  controlo dos dados. Observe o código de programa
definir registos na linguagem Lua.                             seguinte:
Na sequência será definido um programa que fará                 -- inicio do programa TAB07
uso da função pessoa() que fará a apresentação dos
nomes 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ão
apresentados os nomes Augusto, Antonio e Marcelo               Onde MT é a meta-tabela e TN é a tabela normal. Isto
que são os nomes dos registos cujas idades são                 posto, significa dizer que MT é uma meta-tabela de
maiores 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 dois
código da função pessoa() que por meio do                      valores associados cada um a uma tabela para
parâ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 processamento
Observe que as variáveis de uso do programa estão              da adição ocorrerá um erro que interromperá a
definidas com escopo de visibilidade local.                    execução do programa. Observe o código seguinte:
Além deste efeito operacional o programa ainda faz
uso de um laço for tipo genérico. Um laço genérico é            -- inicio do programa TAB08
usado 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(). Caso
queira percorrer os índices de uma tabela usa-se a                TABELA1.a = 2
função ipairs() e para as linhas de um arquivo usa-se             TABELA1.b = 4
a função io.lines().                                              TABELA1.c = 6
A função pairs() após percorrer os valores de uma
tabela retorna três valores, sendo o valor da posição             TABELA2.a = 3
do próximo elemento na tabela, retorna a tabela e                 TABELA2.b = 5
retorna o valor nil quando ultrapassar o fim da tabela.           TABELA2.c = 7
As variáveis IND e VLR do laço for genérico guardam
respectivamente os valores do índice e do conteúdo                TABELA3 =     TABELA1 + TABELA2

da tabela DADOS.
                                                                  print(TABELA3.a)



                                                          17
A PROGRAMAR
Lu 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 = 3
Em seguida escreva o código de programa em um                     TABELA2.b = 5
editor de texto, gravando-o com o nome tab08.lua e                TABELA2.c = 7

tente executar o programa com a linha de comando
                                                                  TABELA3 = TABELA1 + TABELA2
lua 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 TAB09
TABELA2 não possuírem meta-tabelas associadas. A
linguagem Lua tenta efectuar a adição de forma
tradicional, o que leva a uma falha na execução do
programa.                                                      Em seguida escreva o código de programa em um
Para sanar o problema é necessário definir para as             editor de texto, gravando-o com o nome tab09.lua e
tabelas 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 os
meta-tabelas.                                                  resultados das adições dos valores das tabelas
A 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 efectuar
sí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 classe
A 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 = OBJECTO
objectos em Lua é preciso criar protótipos de classes
                                                                return ATRIB
a partir de meta-tabelas dos objetos desta classe com
                                                              end
o uso do campo __index.
Primeiramente faz-se a criação da estrutura básica
de registo que será a base da classe. Assim sendo,           A função (método) ALUNO.new() faz uso de dois
considerando-se a criação de uma classe                      parâmetros, sendo o primeiro parâmetro a
denominada 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 um
a definição de um registo. A linguagem Lua não é             acesso a um atributo ausente do objecto a linguagem
orientada 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étodo
de 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 do
Normalmente as linguagens de programação que                 objecto. Observe o seguinte:
operam com o paradigma de orientação a objectos
conseguem definir uma variável a partir da estrutura          ALUNO = TALUNO.new(TALUNO)

de uma classe. A esta acção se dá o nome de
instância e a variável usada é chamada de objecto.           A partir deste ponto é possível escrever um programa
Algumas 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étodo
objecto a partir do uso de um método interno                 para o cálculo da média do aluno. O resultado da
chamado new, como ocorre em Java (TALUNO                     média será atribuído ao atributo MEDIA do objecto
ALUNO = new TALUNO();). Será então necessário                ALUNO. Desta forma, estará sendo simulado o uso
criar na linguagem Lua um método semelhante.                 de métodos do tipo off-line. Considere o código
Após definir a estrutura da classe passa-se para a           seguinte:


                                                        19
A PROGRAMAR
Lu 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)
                                                                    end
A partir desta explanação considere o código de                     print("Media ..: "..ALUNO.MEDIA)
programa seguinte com a manipulação de uma
                                                                -- fim do programa TAB10
classe, 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 PROGRAMAR

Fl e x e B ya c c - Pa rte I I I
Ao longo desta série de artigos, temos vindo a ver          Também vamos necessitar dum novo token que nos
como utilizar as ferramentas flex e byacc para              indique uma variável, e de outro token que sirva
escrever uma calculadora simples. No primeiro artigo        como operador de atribuição. Vejamos a nova
vimos como escrever o scanner da nossa calculadora          primeira secção do parser:
usando flex e no segundo como escrever o parser
usando 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 é C
e 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> NUMBER
variáveis implica alterar o parser e o scanner               %token<s> VARIABLE
simultaneamente. Começando pelo parser, vejamos              %token NL
do que precisamos para ter variáveis. Sendo uma
calculadora 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 de
todos 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 PROGRAMAR
Fl e x e B ya c c - Pa rte I I I


Os 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 de
expr       : 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 -b
varMap.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, O'Reilly &
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 Professional

AUTOR

                   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 PROGRAMAR

O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e s
Na última edição, iniciámos a temática da                     Podemos considerar que uma base de dados é uma
optimização de SQL recorrendo à utilização de bind            biblioteca. Dependendo da normalização da base de
variables. Verificámos que, em casos específicos, o           dados, esta poderá ter n tabelas. Consideremos que
aumento de desempenho do Oracle é significativo e             a nossa base de dados tem apenas uma tabela e que
fulcral para o sucesso de uma aplicação.                      a mesma se encontra na primeira forma normal.
                                                              Cada entrada da tabela é um livro de um determinado
A optimização de SQL vai muito mais além das bind             autor, com um título, tema, editora, etc., e com
variables e da correcta gestão da shared pool. Nesta          dezenas de páginas de texto. Portanto, com vários
edição, vamos explorar os índices e perceber como a           campos.
(in)correcta utilização dos mesmos pode afectar o
desempenho 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 biblioteca
mais profundo das técnica de diagnóstico de queries           ou consultamos o catálogo.
do Oracle. No entanto, essa não é a intenção deste
artigo, pretendendo apenas mostrar o que é e como
funciona um índice.                                                Na biblioteca, se pretendemos
                                                              procurar um livro, temos duas
O índice é um dos objectos que está presente na               opções: ou percorremos toda a
generalidade das bases de dados. No Oracle, em
particular, o índice é um objecto que está associado a        biblioteca ou consultamos o
uma ou várias colunas da tabela e é comum                     catálogo.
encontrar-se relacionado com qualquer tabela. Para
se compreender a ideia do índice, vamos fazer a               Em Oracle, estas pesquisas traduzem-se num full
analogia 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 s




Oracle recorre às estatísticas.                                                                             Tabela1
Entre as várias informações que as estatísticas              Note-se o parâmetro estimate_percent que vai definir
recolhem, destacamos aqui a informação da base de            a percentagem de dados da base de dados a serem
dados relativamente à dimensão das tabelas, dos              analisados para a obtenção da estimativa.
índices e da sua selectividade (número de chaves
diferentes), 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ão
A 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 certas
circunstâncias e, em bases de dados de grande                Criemos um índice sobre a coluna do ano de edição
dimensã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 ON
que, se efectuado em horário de produção, poderá
                                                              T_LIVROS(DATA_EDICAO);
afectar significativamente o desempenho das
aplicações. Daí que este procedimento só deva ser
agendado 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 indicam
Um 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 correcta
procedimento de PL/SQL que aplicaremos sobre a               para encontrar todos os livros de 1 980: ou recorrendo
tabela 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 PROGRAMAR
O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e s




Podemos ver na figura a síntese do procedimento
adoptado pelo optimizador ao receber uma query.
                                                                     (...) o índice tem uma
O que indexar?
                                                                 característica que o diferencia da
Já 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ções
O í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 como
registos, então o índice terá mil entradas, também.              se efectuam as pesquisas.
No entanto, o índice tem uma característica que o
diferencia da tabela: é ordenado. Logo, uma pesquisa             Voltemos ao exemplo da biblioteca. Imaginemos que
indexada será muito mais rápida do que uma                       um dos campos do livro é o código ISBN. Como
pesquisa 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 é a
primeira 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 s


iguais? Na prática, valerá a pena um índice
                                                              SELECT *
bibliotecário ordenado simplesmente pelo idioma e
                                                              FROM T_LIVROS
que há-de conter quase todas as obras da biblioteca?
                                                              WHERE AUTOR LIKE 'EÇA%' AND TITULO LIKE 'OS
A resposta é não.
                                                              MAI%'

Uma boa escolha do que se vai indexar é uma
questão de bom senso e implica um conhecimento à             A justificação está no facto de que o índice
priori do conteúdo da tabela. Podemos criar uma              concatenado só é utilizado se a pesquisa for feita
tabela sem índices e apenas os implementarmos à              pela mesma ordem da criação do índice. Isto é, se o
medida que a solução vai crescendo, à medida que             índice recai sobre as colunas (a,b,c), a pesquisa
temos 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 a
maioria das entradas são idênticas é um desperdício          Índices de funções
de espaço e não traz qualquer benefício ao
optimizador.                                                 Na pesquisa de campos de texto, o índice de coluna
                                                             poderá nunca ser utilizado. Vejamos o caso em que
Indexação concatenada                                        os títulos dos livros estão inseridos na base de dados
                                                             com letras maiúsculas e minúsculas. Se efectuarmos
Alé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 a
Este í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 LIKE
'EÇA%';                                                      Neste caso, o índice não é utilizado, pois os valores
                                                             guardados no índice são sensíveis a maiúsculas e
ou                                                           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 PROGRAMAR
O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e s


Valores NULL
                                                                         O acompanhamento e a
O Oracle não guarda valores NULL. Podemos
verificar, tentando introduzir uma linha totalmente                  monitorização dos índices e das
NULL numa tabela. Como tal, também os índices não                    queries através de planos de
guardam os valores NULL dos campos de uma                            execução permite conhecer a
tabela. 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 verdadeira
vai 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ão
A utilização e parametrização de índices é um tema                   Nota: Agradeço ao Eng.º José Aser, formador do
bem mais complexo. O acompanhamento e a                              Citeforma, a sua colaboração na ajuda da revisão dos
monitorização dos índices e das queries através de                   meus artigos de Oracle, bem como no conhecimento
planos 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 BD's
                        Oracle, PostgreSQL e SQL Server.




                                                                30
A PROGRAMAR

j Qu e ry – A fra m e wo rk
Neste segundo artigo vou entrar mais em detalhe nas             • Contextualizar selecção:
funcionalidades do jQuery, como o motor de                             $("algumselector", contexto) -> deste modo
selectores, que é uma das funcionalidades core, as             podemos restringir o âmbito do nosso selector a um
funcionalidades de traversing e de manipulation.               contexto, que é uma nossa selecção prévia.
Uma das funcionalidades que torna o jQuery muito
compacto é 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 os
devidas alterações efectuadas na função), permitindo           elementos que tenham o atributo especificado
um executar funções encadeadas, num estilo de                   • Valor atributo igual a:
código altamente compacto e mesmo assim                                 $("[atributo='valor']") -> selecciona todos os
extremamente perceptível.                                      elementos cujo atributo especificado tenha
Relativamente ao motor de selectores, ele é o que              exactamente o valor especificado
nos 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 os
obter um conjunto de elementos do DOM.                         elementos cujo atributo especificado tenha um valor
Existe vários tipos de selectores, por atributo,               diferente do valor especificado
hierá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 texto
Por 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 especificado
elementos 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 de
selectores um objecto, o jQuery encarrega-se de                Por conteúdo:
transformá-lo num objecto jQuery automaticamente                • Elemento contém texto:

                                                          31
A PROGRAMAR
j 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 dos
selectores 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 objecto
Existem 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 HTML
documento                                                        parte do DOM;
          2. $("a:contains('PaP')") através do seu                  • children(): esta função é similar à find com a
conteúdo                                                         diferença que só permite encontrar elementos no
          3. $("a[href*='portugal-a-programar']") através        nível imediatamente abaixo ao dos elementos no
do atributo href                                                 objecto jQuery;
          4. $("a[href^='http://www.portugal']") através          • contents(): função similar à anterior, mas que inclui
do 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 de
a encapsular o objecto document num objecto jQuery,              um objecto jQuery:
e a utilizar a função de traversing find que possibilita
pesquisar 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 os
objecto jQuery correspondem ao selector indicado                elementos do objecto jQuery num html passado por
como 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 os
jQuery                                                          elementos do objecto jQuery num único parent,
                                                                passado por parâmetro, enquanto que a segunda
Quanto a manipulation, existem muitas funções                   envolve os descendentes de todos os elementos do
utilizadas 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 e
indica, têm como função adicionar classes, retornar             manipular a nossa lista de elementos num objecto
um 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 lista
remover caso tenha determinadas classes,                        de li com base num dado JSON (JavaScript Object
respectivamente;                                                Notation), dentro de uma ul:
   • append(): com o append, como o próprio nome
indica, 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 os
eventos, 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 fill
style de um elemento, sem preocupações com                       this..."},{"title":"This is the second
diferentes nomenclaturas destas propriedades entre               article","lead":"some other text to fill
cada browser, funciona de modo similar à função attr;            this..."}]};
    • empty(): com esta função podemos limpar o
conteúdo de um ou vários elementos, tanto                        var $ul = $("ul.main"); /*aqui, uma das boas
elementos 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, devemos
utilizando 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 ao
objecto jQuery, à excepção de elementos do tipo                  prefixo de $ é algo que se costuma utilizar
input, para os quais é usada a função val() descrita             para tornar o código mais legível, de modo
abaixo;

                                                           33
A PROGRAMAR
j 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 de
style="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 desvendar
class="testing" style="font-weight: bold;
                                                                  ligeiramente melhor o poder do jQuery, assim como
color: blue; ">This is the second article :
                                                                  uma pequena parte da sua funcionalidade, em artigos
4</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
Revista programar 27
COLUNAS
PROGRAMADOR EXCÊNTRICO - 6 regras para utilizar AJAX
VISUAL (NOT) BASIC - Windows Phone 7
CORE DUMP - gcc -Wall myApp.c -linstantaneous -o success
PROGRAMADOR EXCÊNTRICO
6 re gra s p a ra u ti l i za r AJ AX
AJAX, ou Asyncronous JavaScript And XML, tem
ganho muita força nos últimos tempos. Os                      O princípio da melhoria progressiva do Ajax é bem
Programadores Web têm feito coisas magníficas com             conhecido, porque comummente é utilizado de forma
o AJAX, mas também já vi grandes erros e uma má               discreta no JavaScript, como mostra a imagem
aplicação do AJAX.                                            acima.

Queria partilhar convosco, através da minha                   Então, o que deves fazer é construir o teu site para
experiência como Programador Web mas também                   funcionar sem JavaScript, e só depois adicionar
como utilizador frequente da Internet, seis regras            JavaScript como sendo um acessório, da mesma
para utilizar o AJAX.                                         forma que utilizas o HTML como linguagem de
                                                              marcação e depois o CSS para melhorar o visual da
AJAX 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á a
de um site de qualidade é fazer com que ele seja              acontecer
funcional. Como? Não importa, contanto que o
utilizador saiba que funcione. Um utilizador genérico         Não há nada pior que clicar em algo e não ver nada a
até é capaz de ignorar a velocidade de load do site se        acontecer por 2 segundos. Os utilizadores estão
ele fizer o que quer que seja para o qual foi                 habituados a clicar e avançar para a acção
programado.                                                   seleccionada, ou pelo menos, ver o progresso da
                                                              acção solicitada.
Dito isto, queres que um utilizador ao desligar o
JavaScript deixe de conseguir utilizar o site, que ele        Lembra-te que a tecnologia AJAX é relativamente
deixe 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á a
voltar.                                                       funcionar. Sugiro que utilizem uma mensagem não
                                                              intrusiva, que mostre o estado da acção solicitada.
Nada melhor que a imagem abaixo para explicar
como 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 AX


Eu como utilizador não me interessa saber que tipo                     utilizador não pode manipular o vosso script.
de tecnologias e/ou magias obscuras utilizaste, desde
que 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 vosso
AJAX só no Fim                                                         script.

Entregar o Projecto deverá ser o objectivo número                      AJAX poupa tempo no Load… Mas o teu
um, então adiciona o AJAX no fim do projecto ou                        Framework JavaScript não
depois que o site esteja feito. Claro que, o AJAX pode
poupar que uma página seja actualizada, mas os                         O teu script em AJAX consegue poupar uma
utilizadores estão habituados à maneira antiga. Não                    actualização da página ao utilizador, sem carregar o
consigo imaginar um cliente teu satisfeito com "Não                    header, footer e sidebar? Óptimo. O teu Framework
está 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 Framework
Eu opto sempre pela maneira antiga (na verdade,                        quando for realmente necessário, e não adiciones
standard é provavelmente a palavra correcta), faço o                   mais código do que o absolutamente necessário para
site, 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 maneira
O URL do AJAX pode até estar escondido no teu                          antiga ... faço o site, e só depois no
código, e assim a maioria dos utilizadores não o vê,                   fim é que acrescento melhorias na
mas aposto que consigo encontra-lo. Se é possível
                                                                       sua funcionalidade
de ser encontrado é possível de ser explorado. Não
assumem que só porque fizeram o código do vosso
formulá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) BASIC

Wi n d o ws Ph o n e 7
Que melhor maneira poderia existir para demonstrar
o poder da .NET Framework do que uma verdadeira
demonstração de união?
O resultado é a entrada da linguagem Visual Basic
.NET na corrida móvel de última geração: o Windows
Phone 7.
O desenvolvimento é feito utilizando o poderoso
Visual Studio, com todas as comodidades a ele
associadas.

Acesso ao ambiente de desenvolvimento
À semelhança das versões Mobile, precisamos de                          O ambiente de desenvolvimento
instalar kits de desenvolvimento que se vão integrar
com o nosso Visual Studio. Para os interessados que          Para quem já estava familiarizado com aplicações
nã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 (eXtensible
fazer.                                                       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 a
C#.                                                          que já estamos habituados nas versões anteriores do
O que existe agora é uma versão do kit de                    Visual Studio.
desenvolvimento que se associa ao Visual Studio
201 0 Professional e só aí é possível começar a              Tipos de página
escrever aplicações em VB.
Nesta solução, não podemos usar XNA nem                      Existem vários 3 tipos de páginas base, onde todos
Expression 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 Developer
Tools, 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 template
Panorama                                                       “Windows Phone Application”
Panorama é um tipo de página base que nos permite               O ambiente vai carregar com todos os elementos
dispor os itens num plano horizontal, virtualmente              familiares, e anteriormente descritos. A página que
infinito.                                                       têm no “designer” é uma página Portrait/Landscape.
Apesar de existirem separações distintas entre as
várias páginas do panorama, a navegação é feita de                      2- O leitor de RSS que vamos criar lê dois
forma contínua, como que se esteja a arrastar uma               RSS simultaneamente. Poderia ser apenas um, ou
folha que se observa através de uma abertura.                   poderiam ser virtualmente infinitos, mas vamos criar
A navegação pode ser feita a qualquer altura, em                apenas 2 “hardcoded” para demonstrar mais tarde as
ambas 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 nomes
grandes quantidades de informação relacionada que              “txRSS1 ” e “txRSS2” e de seguida um botão de nome
de outra forma se teriam de distribuir por vários              “btLer”. Usem também os pontos de controlo nos
ecrãs.                                                          centros de das arestas da esquerda e direita para
                                                                ancorar o controlo aos limites horizontais do
Pivot                                                           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) BASIC
Wi 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ção
Notaram certamente que ao tocar na textbox surgiu
um teclado QWERTY virtual.
No contexto das aplicações para aparelhos de
comunicação móveis, as letras não são suficientes
para cobrir todas as necessidades.
Existem 5 principais métodos de introdução:
                                                         5- A leitura dos “feeds” vai ser feita numa outra
URL                                                      página, uma página pivot onde vamos organizar cada
Disponibiliza 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 7


Solution Explorer, escolham “Add” e depois “New
item”. De entre os templates escolham “Windows
Phone 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”, e
adicionem       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 dos
o 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ão
exactamente quantos precisamos.
                                                               PrivateSubButton1_Click(ByValsenderAsSystem.O
Depois de colocar o “WebBrowser” num item, para
                                                               bject, ByVal e As
não complicar, teremos que o duplicar para o
                                                               System.Windows.RoutedEventArgs)
segundo item.
                                                               HandlesButton1.Click
Isto pode ser alcançado através do designer mas
                                                                        NavigationService.Navigate(New
torna-se muito mais fácil se identificarem a linha que
                                                               Uri("/Leitor.xaml"), UriKind.Relative))
representa o “WebBrowser” no XAML e a copiarem
                                                               EndSub
para o outro item do pivot.

                                                         43
VISUAL (NOT) BASIC
Wi n d o ws Ph o n e 7


se" 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ágina
Com o sistema de navegação equiparado a um
browser, sem poder criar instâncias de objectos            Depois de ter a página carregada (e só depois de
Form, como normalmente fazemos no Visual Basic             estar completamente carregada, isto é importante)
Windows Forms, transportar valores como um                 podemos resgatar os valores do cabeçalho da
simples 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 a
construir um URI, é perfeitamente possível passar
parâmetros através do URL, o que já reduz                   Private Sub Leitor_Loaded(ByVal sender As
significativamente a complexidade para transportar          Object, ByVal e As
valores.                                                    System.Windows.RoutedEventArgs) Handles
Como pretendemos passar dois endereços distintos,           MyBase.Loaded
podemos 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ários
mesmo que numa navegação normal, pois estamos a            para fazer os pedidos dos itens dos “feeds”.
apontar à mesma para uma página, mas o do
cabeçalho já constam os valores passados no URL.
Juntando à passagem de valores a validação simples          Private Sub Leitor_Loaded(ByVal sender As
das 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 ficheiro
CarregarRSS.vb, cujo link podem encontrar no final
do artigo. Trata-se da classe criada para ler os feeds,
que não é relevante para o desenvolvimento em
WP7.
                                                               Orientação do aparelho
        1 3- A aplicação está completa.
                                                               Se têm a oportunidade de estar a fazer debug
Corram agora a aplicação. O primeiro ecrã apresenta            directamente no telefone, já devem ter reparado com
as duas caixas.                                                certeza no comportamento da aplicação quando
Preencham as caixas com dois feeds diferentes, por             inclinamos o telefone nas posições que normalmente
exemplo:                                                       disparam mudanças de apresentação noutras
                                                               aplicações nativas: não acontece rigorosamente
O “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 no
O 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) BASIC
Wi n d o ws Ph o n e 7


ignorar qualquer outra orientação que não seja                   O desenvolvimento em WP7 assenta em Windows
Portrait.                                                        Presentation Framework com todas as vantagens
A 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 se
maioria      dos      casos,     passá-la  para                  aplica estão muito bem conseguidos e bastante
PortraitOrLandscape resolve o layout para a                      polidos, o que torna a experiência bastante agradável
orientação pretendida, mas também é obviamente                   e produtiva, desviando o foco do programador para
possível controlarmos os comportamentos.                         pormenores que não interessam tanto como a
Troquem 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 aparelho
PortraitOrLandscape                                              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 b34b00ce
Ainda que diferentes, nota-se perfeitamente o esforço
que a Microsoft está a fazer para substituir Windows
Forms 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 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 s

Desde 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 na
empreendedores e aplicações de sucesso. Estes                 tecnologia em si. Aprender esta lição é de extrema
sucessos, muitas vezes bombásticos e sempre                   importância e muitas vezes não é compreendida por
mediáticos, parecem indicar que é muito fácil criar um        quem faz o desenvolvimento. Ninguém compra um
negócio multi-milionário do dia para a noite. Quando          produto por este ser desenvolvido em determinada
um bom programador olha para uma aplicação de                 tecnologia.
sucesso identifica imediatamente um conjunto de               Outra lição de extrema importância é que um
variáveis que o levam, invariavelmente, a concluir “Eu        programador não é um designer e também não é um
sou capaz de fazer isto!” e costuma rematar com “E            utilizador comum, o que tipicamente o leva a
até sou capaz de o fazer melhor!” E tipicamente um            desenhar aplicações funcionalmente más. E como se
bom programador diz a verdade numa situação                   não bastasse ainda fica ofendido com os utilizadores
destas.[1 ]                                                   por estes não compreenderem que para activar a
Se juntarmos à capacidade técnica o baixo custo               assinatura digital apenas têm de correr determinado
actual de criar uma aplicação e de a disponibilizar           comando numa shell com permissões de
para todo o mundo ficamos a pensar porque razão               administração![2]
apenas uma ínfima a quantidade de programadores
cria e gere o seu próprio negócio e porque não são                (...) um programador não é um
todos 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, a
razão não é dinheiro para arrancar. A questão                 Uma terceira lição de extrema importância é que uma
també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 de
programadores é realmente empreendedor e desses               software. Por exemplo, um produto tem um manual
nem todos têm a coragem de arriscar a voar por si. E          de instruções que efectivamente explica o produto e
todos quantos arriscam mudar de vida sofrem na pele           como operar com o mesmo.
todas as torturas e maus tratos que advém da gestão
de um negócio próprio, a começar pelo facto de que            Por esta altura muitos   estão a pensar “mas eu
não existem sucessos instantâneos, muito menos                compreendo tudo isto,    acho que tenho veia de
para negócios multi-milionários. Sem dúvida que há            empreendedor”. A todos   vocês que pensaram isso
excepções à regra, mas mesmo essas excepções                  vou lançar um desafio.    Respondam às seguintes
que 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 haver
certezas 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, quantos
empreendedor é compreender que a tecnologia é                 terminaram?

                                                         47
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 s


4. Dos projectos que terminaram, quantos                                      Muitas vezes o programador aspirante a
lanç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 deitar
O empreendedorismo, de forma geral, não se esgota                             por terra ser o próximo multi-milionário da web, peço
na construção do produto. Na verdade isso é apenas                            apenas mais um minuto.
um meio para atingir um fim. E o fim é a criação de
um negócio, inicialmente sustentável e mais tarde de                          É que mesmo com uma ideia validada e uma vontade
sucesso.                                                                      inabalável de desenvolver um software que se vai
                                                                              vender como bolos quentes porque resolve um
E também aqui é necessário explicar que o sucesso                             problema complexo a um número infindável de
não existe apenas se conseguirmos entrar para a                               pessoas, há imensas variáveis que o programador
Fortune 500. A maioria dos empreendedores                                     aspirante não pensou ou, pior, pensou de forma
considera o seu negócio um sucesso quando este lhe                            leviana. É necessário ter a consciência de que não
dá 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 de
Tipicamente esse caminho começa com uma ideia,                                marketing e de vendas. E não, gastar uns trocos, ou
mas 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 colocar
da 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 s


manual de instruções, é necessário estar preparado             [1] A prová­lo está o facto de determinada aplicação
para dar suporte à aplicação e, em alguns casos, até           de sucesso ser clonada por várias empresas e por
formação.                                                      vezes até melhor do que original. Mas só ser bom
E enquanto tudo isto se desenrola é necessário tratar          não basta, e por isso os clones raramente destronam
da burocracia inerente ao negócio, recolher feedback           quem chegou primeiro.
dos utilizadores, corrigir bugs em produção, ajustar o
road 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,                 quantos
terminaram?                                                    [3]Para os mais cépticos deixo um desafio. Olhem
                                                               para o vosso desktop e vejam se têm alguma
funcionalidade, escolher um novo plano de                      aplicação instalada que não vos seja útil. Todas elas
alojamento, dar o produto a conhecer a mais                    vos resolvem um problema, seja apenas ouvir um
pessoas, pagar as contas do mês e, no meio de tudo             MP3 ou efectuar o controlo de versões em ambientes
isto, ter umas horas para dormir por dia e tentar fazer        distribuídos.
com que o temo “fim-de-semana” passe a ter o
mesmo significado que os nossos amigos não-
empreendedores lhe dão...

Ainda sobrou alguém a ler? Então estás à espera de
quê? Valida a tua ideia e mão à obra. Garanto-te que
é uma experiência profissional única da tua vida, e
quem sabe, talvez venhas mesmo a ser o próximo
multi-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
COMUNIDADES
Desenvolvimento em SharePoint 2010
GuiaTV CoolthingsPT
Habilitar external users no SharePoint online – Office365
O Futuro da Programação Assíncrona da Plataforma .NET
COMUNIDADE SHAREPOINTPT

D e s e n vo l vi m e n to e m Sh a re Po i n t 2 0 1 0

Developer em Sharepoint?                                    aplicacionais:

Desde muito cedo que esta maniataraobsessão por
debitar linhas de código pelo puro prazer de mover
um pixel de um lado para o outro, tem-me
atormentado como se de um vírus se tratasse. Não
sei se é mania ou não mas sempre gostei de
assuntos que me fizessem pensar e criar algo novo.
Sim , eu confesso na minha essência sou um
Developer , e presumo que vocês que lêem estas
linhas também o são, senão não teriam chegado até
aqui.
Um developer, e isto na minha opinião terá de ter
sempre uma percepção global das coisas e focus no
desenvolvimento, um pouco de bom senso, e muita
paciência. Estas eram as métricas gerais seguidas
por 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 e
de IT, Project Manager, and whatever, penso que a           Externos. Infraestrutura única para todos os sites
ocupação de Developer é a mais cool de todas. Um            empresariais Web : Intranet, Extranets e Internet
developer de SharePoint obrigatoriamente tem mais                    Communities: Ambiente de colaboração
valências de que só a de desenvolvimento: somos             social, Ferramentas com capacidades sociais, como
Administradores de Sistemas, Helpdesks, Arquitectos         blogs, wikis, rssfeeds, tagging, perfis pessoais recios
, Testers, DBA , Designer e utilizadores finais da          em informação
plataforma. Em SharePoint é extremamente rigorosa                    Content:Gestão documental , políticas de
a 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 a
Microsoft 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 componentes
que o produto SharePoint representa, existem ainda          para criação de soluções comerciais
algumas dúvidas relativamente ao que este produto
pretende atingir.                                             Sendo uma plataforma consolidada nestas diferentes
De 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 de
funcionais.                                                  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 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


nós e estamos aqui.                                             Camada Aplicacional(Application Layer)à Camada de
                                                                Apresentação(Presentation Layer). Estes diferentes
SharePoint 201 0 e tecnologias inerentes                        layers podem estar localizados numa só máquina
                                                                (Standalone Server)
Antes de tudo, é importante que um developer
perceba e entenda minimamente a arquitectura da
plataforma e alguns dos seus mecanismos inerentes:
SharePoint é baseada na framework .NET,
subdividindo-se em 2 tecnologias principais:
SharePoint Foundation: Tecnologia subjacente a
todos os sites SharePoint, encontra-se disponível
gratuitamente. É 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 todas
as funcionalidades do SharePoint Foundation além
de funcionalidades e capacidades adicionais como
Gestão de Conteúdos, B.I., Pesquisa empresarial.




A figura acima ilustra as diferentes tecnologias
inerentes à plataforma. Essencialmente temos o
sistema operativo, Windows Server 2008, o IIS ,
SqlServer, a .Net Framework e ASP.Net, o SharePoint             Fisicamente esse conceito também é real, temos
Foundation 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 de
ou Windows Vista , não é suportado pela Microsoft               forma a ser escalado horizontalmente e
em ambientes de produção e para desenvolvimento                 verticalmente, caso exista necessidade mais
recomendo avidamente a utilização de tecnologia                 capacidade a nível do User Interface , podem ser
server. 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 adicionados
Arquitectura                                                    mais Servidores Aplicacionais (Application Servers).
                                                                E finalmente se existir necessidade de mais
A infraestrutura do SharePoint 201 0 foi pensada de             capacidade a nível de base de dados, podem ser
forma a respeitar uma arquitectura lógica de 3                  adicionados mais Servidores de Base de Dados
camadas: 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 0


Quaisquer que sejam as necessidades, é permitido              Aquando a saída da versão 2007 da plataforma, a
desenhar uma topologia que as complemente com                 integração com a ferramenta de desenvolvimento
uma flexibilidade extrema.                                    Visual Studio era muito limitada. Em meados de
                                                              2007,     as soluções e features eram criadas
E 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 deste
SharePoint e o Visual Studio 201 0                            que vos apresento passa por criar uma
                                                              funcionalidade de registar os contactos dos actuais

                                                         53
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


membros da Comunidade Portuguesa de SharePoint                  funcionalidades por toda a Farm
. Para tal vamos criar um tipo de conteúdo (Content
Type) com alguns campos e criar uma lista baseada
nesse tipo de conteúdo.
Apesar de ser um exemplo simples, acaba por
demonstrar algumas         funcionalidades que a
plataforma disponibiliza

1 . Abrir o Visual Studio, no menu principal,
seleccional a opção File>New Project
         •Em Installed Templates, seleccionar a opção
SharePoint>201 0 e Empty SharePoint Project
         •Digitar o nome do projecto, e a sua
localização : neste caso o nome escolhido foi
SPugPtMembersList 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ção
com o url do site SharePoint em que vamos
trabalhar, neste caso é http://vm201 0/ pois é o site
por omissão criado aquando a instalação do
SharePoint.
Nesta versão do SharePoint existem 2 tipos de
soluções que podem ser criadas: Sandbox e Farm
solutions.
Sandbox solutions são soluções em que os
processos de execução, correm em ambientes muito
controlados com restrições variadas tendo em vista
um enclausuramento aplicacional em toda a Farm de
SharePoint.                                                     4. Os content types são elementos com herança pelo
Farm solutions , são soluções mais abrangentes,                 que vamos seleccionar o content type mais simples
contemplando 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="SpugPtMembers
Como 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.xml
mais 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 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




 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 Content
Type , 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 criado
Assim:
         •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 0


nos falta fazer a instalação no nosso SharePoint           •Seleccionar a opção Lists> SpugPt Members List
Como? Fácil.Primeiro executamos o Build da solução                 •Digitar SpugPtMembers na caixa de texto
e 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 itens




Como teste final, vamos criar a nossa lista e criar
alguns 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 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


Conclusão                                                              Resta-me fazer-vos um convite: todos os meses aos
                                                                       2ª Sábados, a Comunidade Portuguesa de
Embora tenha sido um exemplo muito simples,                            SharePoint apresenta 1 sessão e chalk talks com
espero que tenha atingido o objectivo de como o                        membros activos na tecnologia onde podemos trocar
desenvolvimento em SharePoint encontra-se                              ideias, e esclarecer dúvidas e acima de tudo trocar
extremamente 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 como
plataforma de desenvolvimento. Dentro deste tema                       Aquele abraço com muitos Dispose à mistura
existem claramente imensos subtópicos, integrações
e tipo de implementação e neste momento é claro
que este é um produto da Microsoft que irá evoluir e
consolidar-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 ANDROIDPT

G u i a TV C o o l th i n gs PT
A aplicação GuiaTv é uma aplicação para dispositivos         Mas assim que soubemos da exist ncia do concurso
móveis com o sistema operativo Android que permite           definimos logo essa data como a deadline para
aos utilizadores visualizarem a programação dos              apresentar a versão beta da aplicação. Para
canais de televisão de uma forma simples e ao                conseguirmos cumprir os prazos por nós definidos, foi
mesmo tempo apelativa. Foi esta aplicação que                necessário cortar algumas funcionalidades mais
garantiu à equipa CoolthingsPT o primeiro prémio do          complexas e diminuir a prioridade a algumas tarefas
Concurso de Programação para Android (CPA) da                que poderiam ser mais motivantes. Tudo isto, para
comunidade Androidpt (http://www.androidpt.com/).            garantirmos que tinhamos tempo suficiente para criar
                                                             todas as funcionalidades básicas da aplicação.




                     Ecrã Guia TV
Esta aplicação foi a primeira aposta da startup                                  Ecrã Zapping
nacional CoolthingsPT. Os objectivos da                      Método de Desenvolvimento
CoolthingsPT a curto prazo passam por fazer da
CoolthingsPT uma marca com qualidade a nível                 No desenvolvimento da aplicação, a equipa
nacional e internacional, tanto no desenvolvimento de        empregou métodos ágeis de desenvolvimento de
aplicações Android como em serviços de consultoria           software. Desses métodos destaca-se o scrum, onde
nessa área.                                                  se encaixam as reuniões em que cada membro
                                                             basicamente comenta aquilo que fez na última
O desenvolvimento da aplicação começou algum                 sessão de desenvolvimento, o que pretende
tempo 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 ANDROIDPT
G u i a TV C o o l th i n gs PT


prá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 o
desenvolvimento de todas as frentes de                      utilizador.
desenvolvimento da aplicação e terem em todas as
sessões de desenvolvimento uma visão geral do               Todas as TabHosts do GuiaTV sofreram uma
estado 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 atractiva
salientar uma prática que nós achamos importante na         visualmente e não se adequava ao tema da
equipa CoolthingsPT que é o facto de programarmos           aplicação. Estas alterações foram possíveis porque a
em pares e discutirmos a melhor forma de                    plataforma android oferece total liberdade ao
desenvolver 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 um
Estrutura da Aplicação                                       webservice que recolhe os destaques diáriamente,
                                                             colocando a informação posteriormente numa
Uma das primeiras e principais dificuldades na              "listView".
implementação do GuiaTV foi definir claramente qual
a estrutura da interface a utilizar. Depois de              Para proceder ao parsing da informação obtida em
experimentar 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 menos
recorrendo ao uso de "Tabhost"s. A TabHost é um tipo        memória quando comparado com DOM(Document
de ViewGroup disponível na API do Android. Fazendo          Object Model). Isto faz com que seja adequado para
uso destas TabHosts, é possível agrupar o conteúdo          um dispositivo móvel dada a memória ser mais
da 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 PT


Um dos objectivos iniciais era permitir a utilização da
aplicação no modo offline, para tal foi criado um
serviço para obtenção da informação dos canais
favoritos, guardando a mesma numa base de dados
interna ( sqlite ). Sendo que os canais favoritos são
definidos pelo utilizador, foi necessário encontrar uma
forma simples, intuítiva e cativante para proceder a
essa selecção. A funcionalidade de Zapping está
directamente ligada aos favoritos, expondo a
informação dos programas que estão a decorrer no
momento nos canais favoritos, bem como a
percentagem 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.html
GuiaTV CoolthingsPT que incluiu, por exemplo,
pesquisa automática da box Meo para mudança de
canais,      "zapping"     automático,  menu      de
configurações, ordenação de canais, restruturação da
interface visual, entre outras.
De seguida apresentamos duas imagens da próxima
versã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.NET

C 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 5
Office 365 será lançado em 2011 , produto online
com 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 recursos
que foram anunciados e já testados por alguns no
beta, vou apresentar o recurso de external users no
SharePoint Online. No SharePoint online disponível
no BPOS (versão 2007 do SharePoint) não era
possível acesso de usuários externos.

Uma característica interessante e que é importante
para garantir uma colaboração rica e completa com
todos os colaboradores, parceiros e até clientes, é a
possibilidade de compartilhar um site de documentos
através do SharePoint Online. Agora no SharePoint
Online que será lançado no Office365, que já vem
com 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 ao
Nesse artigo pretendo em primeira mão mostrar                 Administration Center do SharePoint Online, dentre
como é fácil habilitar e configurar para acesso de            as opções de configurações, vá em “manage site
usuários externos usando o Windows Live ID para               colletions”:
acessar informações do seu site SharePoint.

Primeiro passo é registar na secção de administração
do Office365:




                                                              Figura 3 - Administration Center SharePoint

                                                              Vá em “Site Colletions”, veja que nos sites abaixo a
                                                              opção “External Users” está deny. Isso significa que
Figura 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 5


acesso 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ída
Figura 4 - Sites Collections
                                                                  Depois de habilitado você vai criar o utilizador no seu
Escolha o site que deseja habilitar o acesso externo.             site. A criação desse utilizador funciona da seguinte
Seleccione o site, clique em ‘settings’, ‘manage                  forma: você adiciona o utilizador através do e-mail
external users’, escolha opção ‘allow’ e confirme o               que será usado para acederao site, escolhe o grupo
procedimento.                                                     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 Actions




Figura 6 – Salvando alteração




                                                                  Clique          em        ‘external          users         permissions’:


Figura 7 - Confirmando liberação para external users

                                                            63
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 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-mail
Figura 1 0 - Users and Permissions
                                                                                       Após aceitar o convite o utilizador já será direcionado
Adicione o e-mail, permissão (é possível atribuir o                                    a pagina de autenticação do Online Services. No
utilizador a um grupo especifico, ficando mais fácil                                   momento que o utlizador digitar o e-mail (no caso
controlar as permissões dos utilizadores dentro do                                     hotmail – Live ID) e clicar no campo senha o campo
seu 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 o
externo:                                                                               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 Users

Nota: Caso o usuário não aceite o convite que                                          Figura 1 3 - Sign in
recebeu por e-mail, ele não será adicionado como
membro do site no SharePoint e também terá acesso                                      Depois que ocorrer autenticação e se tudo estiver
negado 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 5




Figura 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 para
Figura 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 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
.NET
Introduçã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 podem
ocorrer isoladamente ou em combinação. Vários              A partir da versão 2.0 começaram a surgir algumas
troços de código podem estar em execução                   implementações da Event-based Asynchronous
simultaneamente sem que isso signifique                    Patter (EAP) c) que consiste num método
concorrência se não acederem aos mesmos                    OperationAsync e um evento OperationCompleted.
recursos. Uma operação assíncrona pode ser
executada 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ção
Até à versão 4.0 da plataforma .NET a norma para           do código:
operações assíncronas era o Assynchronous
Programming 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 (Async
A 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 faz
uso da Task Parellel Library (TPL). d)
                                                               A palavra chave async é aplicada aos métodos e
                                                               indica ao compilador que deve reescrever o método
Esta 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 um
tenham 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íncrona
a 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())
     );
                                                                       {
                                                                             await
Aqui 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 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


Que 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,
                                                                                - Lucian's VBlog
       progress);
                                                                                 (http://blogs.msdn.com/b/lucian/archive/tags/async/)
                                                                                Blogue de Lucian Wischik – Program Manager da
As equipas dos respectivos compiladores ainda têm                               linguagem Visual Basic.
alguns problemas para resolver, mas não fugirá muito
disto e existe já uma CTP de uma primeira                                       - Fabulous Adventures In Coding
implementação.                                                                   (http://blogs.msdn.com/b/ericlippert/)
                                                                                Blogue de Eric Lippert – Programador na equipa do
Recursos                                                                        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)                               spx
Extensão ao Visual Studio 201 0 (não compatível com                             c) http://msdn.microsoft.com/library/wewwczdw.aspx
o Visual Studio 201 0 SP1 ) que providencia as novas                            d) http://msdn.microsoft.com/library/dd46071 7.aspx
funcionalidades 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ÁLISES
Silverlight 4.0 – Curso Completo
ANÁLISE
S i l ve rl i gh t 4. 0 – C u rs o C o m p l e to
O livro Silverlight 4.0 – Curso Completo, de autoria de
Luís Abreu e colaboração de João Carreiro, é um livro
lançado pela FCA – Editora de Informática, com 400
páginas e dividido em 1 5 capítulos. É apresentado
com o objectivo de “ensinar o programador que se
está a iniciar na plataforma Silverlight, sendo também
uma ferramenta indispensável para o programador
conhecedor da plataforma Silverlight que pretende
fazer a transição para a nova versão”.

O livro começa por apresentar os requisitos, o
público-alvo, convenções, código fonte e organização
do mesmo, fazendo um pequeno resumo do que será
abordado em cada capítulo.

De forma breve é apresentado no primeiro capítulo as
principais funcionalidades do Silverlight 4.0 e é feito        e apresentação dos diversos controlos layout
um enquadramento da tecnologia a nível histórico, a            (Canvas, Inkpresenter, StackPanel e Grid), não
nível de arquitectura e a nível de desenvolvimento,            ficando de parte o conceito de paneis virtuais e
mostrando interacção com o Visual Studio 201 0. Não            painéis personalizados. O capítulo de Controlos inicia
ficando de fora uma abordagem sobre Assemblies e               com apresentação da hierarquia de controlos e em
Pacotes 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 controlos
objectivo     de     “ensinar   o                              generalistas, é o caso da Datagrid e Chart.
programador que se está a iniciar
                                                               No quarto capítulo, Recursos, é feita uma abordagem
na 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 a
servem de suporte ao desenvolvimento de aplicações             apresentação de recursos XAML, sendo abordado os
Silverlight, de destacar o conceito XAML, dependency           conceitos ResourceDictionary, MergedDicionary e
properties e attached properties, routed events e              StaticResource.
comandos, incluindo implementação prática destes
conceitos.                                                     Personalização de Controlos, é o quinto capítulo,
                                                               onde é abordado os conceitos relacionado com
Nos 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 to


que 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 de
dados. 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 do
mencionadas referências de leitura opcional.                 Silverlight com uma página de HTML, como é
                                                             controlada a interacção entre os restantes
DataBinding, é o sexto capítulo, a introdução do             componentes existentes numa página e o código de
conceito 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, usando
a interface INotifyPropertyChanged, os vários modos               De salientar que ao longo da
de binding, conversores e utilização de bindings em
XAML. A validação de dados, faz parte deste capítulo,        leitura, deparamo-nos com o
sendo feito comparação entre a implementação da              recurso    de   diagramas     para
interface IDataErrorInfo e INotifyDataErrorInfo. O           mostrar a relação entre classes;
capítulo termina com a exemplificação de binding em
colecçõ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 que
No 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 Storage
shapes, 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árias
animações que estão disponíveis em Silverlight,              Aplicação Out of Browser, é um dos capítulos muito
sendo apresentado em seguida alguns exemplos                 relevantes deste livro e nele apresentado algumas
práticos. Faz referência a animações com Keyframes           considerações importantes, configurações e
e Frame-a-frame e faz ainda algumas considerações            desinstalação de aplicações, detecção do host de
sobre 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 full
Expression Blend, no entanto esta ferramenta está            trust entre outras funcionalidades específicas. Por fim
fora de âmbito do livro.                                     termina com Debugging de aplicações out of the
                                                             browser sendo feita uma abordagem com o Visual
Média é o capítulo que apresenta os conceitos                Studio.
relacionadas com ficheiros de multimédia, sendo os
mais relevantes MediaElement e MedialPlayer. È feita         No último capítulo, Segurança aborda o modelo de
uma 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ÁLISE
Si l ve rl i gh t 4. 0 – C u rs o C o m p l e to


consideraçõ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-nos
com o recurso de diagramas para mostrar a relação                     Em conclusão, este livro aborda os conceitos de
entre classes; uso de imagens de apoio à                              Silverlight 4.0, está bem organizado em termos de
compreensão de conceitos; destaque e notas de                         conteúdo, é de fácil leitura e é um bom guia para
aspectos mais ou menos relevantes, orientando o                       quem vai iniciar ou para quem já tem alguns
leitor a poder complementar a sua leitura com outros                  conhecimentos nesta tecnologia.
recursos; apresentação de exemplos práticos e em
alguns casos é apresentada a implementação de
conceitos.

Um aspecto que pode ser melhorado é na
apresentaçã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
Revista programar 27

Mais conteúdo relacionado

PPT
III SECIN Palestra Geracoes XYZ, web 2.0 e a comunicacao cientifica
PDF
Digicorp aula2 28 05 2010
PDF
Cases de sucesso nas mídias sociais
PPTX
Twitter
PDF
Marketing Digital: Cases de Sucesso nas Mídias Sociais
PDF
Comportamento Digital Centro-Oeste_Palestra Melina Alves
PDF
Pesquisa Medialogue Reputação Digital - 13 Razões para pensar sobre o tema
PPT
Intercon 2009 Buzz Report
III SECIN Palestra Geracoes XYZ, web 2.0 e a comunicacao cientifica
Digicorp aula2 28 05 2010
Cases de sucesso nas mídias sociais
Twitter
Marketing Digital: Cases de Sucesso nas Mídias Sociais
Comportamento Digital Centro-Oeste_Palestra Melina Alves
Pesquisa Medialogue Reputação Digital - 13 Razões para pensar sobre o tema
Intercon 2009 Buzz Report

Mais procurados (12)

PDF
Portfolio Kingo Labs
PDF
Conectado Cap16
DOCX
FACEBOOK ESTÁ SE TRANSFORMANDO A HUMANIDADE NO FUTURO “THE MATRIX”?
PDF
Pesquisa o twitter foi mais longe
PDF
A Revolução das Redes Sociais
PDF
Redes sociais
PDF
Aula 3 gestão de perfis e conteúdos
PDF
teste 2
PDF
RP e as Mídias Sociais
PDF
Manual Twitter 6 Mb by @jasper
PPTX
O uso devido e indevido das redes sociais pelos profissionais de saúde
PDF
Aula 2 - FAAP - Gestão de crise, políticas e normas de conduta e algumas ferr...
Portfolio Kingo Labs
Conectado Cap16
FACEBOOK ESTÁ SE TRANSFORMANDO A HUMANIDADE NO FUTURO “THE MATRIX”?
Pesquisa o twitter foi mais longe
A Revolução das Redes Sociais
Redes sociais
Aula 3 gestão de perfis e conteúdos
teste 2
RP e as Mídias Sociais
Manual Twitter 6 Mb by @jasper
O uso devido e indevido das redes sociais pelos profissionais de saúde
Aula 2 - FAAP - Gestão de crise, políticas e normas de conduta e algumas ferr...
Anúncio

Destaque (20)

PPT
PPTX
Aprender y enseñar en colaboración
DOCX
Trabajo de micolta computacion
PPTX
Cortina quintero armando
PPTX
Leone lcañetetarea
PPTX
web 2.0
PPTX
13 aniversario 111111113334455567
PPTX
Web 2.0, Brenda Y Sofia.
PPTX
Las drogaas
DOCX
Faces de la evolución de la tecnología
PDF
Cea030.lista.04
PPTX
Trabajo de periódico
PPTX
Presentaciones digitales
PDF
Relatório da oficina de formação de mediadores de incentivo à leitura
PDF
Revista programar 11
PPTX
Sistema operativo wndows 7
PDF
15592411 apostila-substituicao-tributaria
PPTX
Saber 2
DOC
Ass #10 swot
PPTX
REGLAMENTO ESTUDIANTIL UNIVERSIDAD POPULAR DEL CESAR
Aprender y enseñar en colaboración
Trabajo de micolta computacion
Cortina quintero armando
Leone lcañetetarea
web 2.0
13 aniversario 111111113334455567
Web 2.0, Brenda Y Sofia.
Las drogaas
Faces de la evolución de la tecnología
Cea030.lista.04
Trabajo de periódico
Presentaciones digitales
Relatório da oficina de formação de mediadores de incentivo à leitura
Revista programar 11
Sistema operativo wndows 7
15592411 apostila-substituicao-tributaria
Saber 2
Ass #10 swot
REGLAMENTO ESTUDIANTIL UNIVERSIDAD POPULAR DEL CESAR
Anúncio

Semelhante a Revista programar 27 (20)

PDF
Revista programar 31
PDF
Novas Tecnologias da Comunicação
PDF
Revista programar 29
PDF
Atualidades 1 - 9º ano
PDF
Revista programar 36
PPTX
As transformações na era digital
PPT
Ensino mediado 2 2011
PPT
Ensino mediado 2 2011
PDF
O twitter foi mais longe
PDF
Redes sociais, ciencia e desenvolvimento
PDF
O digital ficou velho
PDF
Adriana rabassa
PPTX
Bibliotecas de hoje e do futuro
PPT
Comunicações digitais até 2008
PDF
Revista Info Ceará
PPTX
Bibliotecas de hoje e do futuro::como entender e vivenciar a atual revolução ...
PDF
Revista espirito livre_001
PPTX
Massmedia trabalhodegrupo-090319213544-phpapp02
PDF
Uma janela para o mundo: o desafio da inclusão digital em áreas rurais
PPT
A Comunicação na Web
Revista programar 31
Novas Tecnologias da Comunicação
Revista programar 29
Atualidades 1 - 9º ano
Revista programar 36
As transformações na era digital
Ensino mediado 2 2011
Ensino mediado 2 2011
O twitter foi mais longe
Redes sociais, ciencia e desenvolvimento
O digital ficou velho
Adriana rabassa
Bibliotecas de hoje e do futuro
Comunicações digitais até 2008
Revista Info Ceará
Bibliotecas de hoje e do futuro::como entender e vivenciar a atual revolução ...
Revista espirito livre_001
Massmedia trabalhodegrupo-090319213544-phpapp02
Uma janela para o mundo: o desafio da inclusão digital em áreas rurais
A Comunicação na Web

Mais de Filipe Bezerra Sousa (20)

PDF
Revista programar 23
PDF
Revista Programar 43
PDF
Revista Programar 42
PDF
Revista Programar 41
PDF
Revista Programar 40
PDF
Revista programar 38
PDF
Revista programar 37
PDF
Revista programar 39
DOCX
Como criar metas por fred graef
DOCX
Estudo de produtividade com eclipse
PDF
Revista espirito livre_035_fevereiro2012
PDF
Revista programar 34
PDF
Revista programar 33
PDF
Revista programar 32
PDF
Revista programar 30
PDF
Revista programar 28
PDF
Revista programar 26
PDF
Revista programar 25
PDF
Revista espirito livre_0019_outubro2010
PDF
Revista espirito livre_016_julho2010
Revista programar 23
Revista Programar 43
Revista Programar 42
Revista Programar 41
Revista Programar 40
Revista programar 38
Revista programar 37
Revista programar 39
Como criar metas por fred graef
Estudo de produtividade com eclipse
Revista espirito livre_035_fevereiro2012
Revista programar 34
Revista programar 33
Revista programar 32
Revista programar 30
Revista programar 28
Revista programar 26
Revista programar 25
Revista espirito livre_0019_outubro2010
Revista espirito livre_016_julho2010

Último (12)

PPT
Conceitos básicos de Redes Neurais Artificiais
PDF
Jira Software projetos completos com scrum
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Tipos de servidor em redes de computador.pptx
PPTX
Analise Estatica de Compiladores para criar uma nova LP
PPTX
Utilizando code blockes por andre backes
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PDF
Processos no SAP Extended Warehouse Management, EWM100 Col26
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Conceitos básicos de Redes Neurais Artificiais
Jira Software projetos completos com scrum
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Tipos de servidor em redes de computador.pptx
Analise Estatica de Compiladores para criar uma nova LP
Utilizando code blockes por andre backes
Viasol Energia Solar -Soluções para geração e economia de energia
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Processos no SAP Extended Warehouse Management, EWM100 Col26
Manejo integrado de pragas na cultura do algodão
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf

Revista programar 27

  • 2. Editorial EDITORIAL 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 Silva A revista PROGRAMAR é um projecto voluntário, sem fins lucrativos. Todos os artigos são da responsabilidade dos autores, não podendo a revista ou a comunidade ser responsabilizada por alguma imprecisão ou erro. Para qualquer dúvida ou esclarecimento poderá sempre contactar-nos. 2
  • 3. Índice INDICE TEMA DE CAPA 6 Introdução ao ASP .NET MVC 3.0 A 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 framework COLUNAS 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 success COMUNIDADES 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 .NET ANÁLISES 70 Silverlight 4.0 – Curso Completo EVENTOS 1 8 Fev. ESAF LanParty 2011 1 8 Fev. 5º Portugal Girl Geek Dinner 21 Fev. Windows Azure BootCamp Lisboa 2011 - Lisboa 23 Fev. Visual Studio S201 0 - Workshop Desenvolvimento Aplicacional - Porto 28 Fev. Microsoft Business Integration RoadShow - Lisboa 04 Mar. XNA Pizza Night 2011 Spring Edition 05 Mar. 3º Encontro WordPress Portugal em Lisboa 26 Mar. Sessão Presencial NetPonto - Lisboa 3
  • 4. 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 u Que uma parte do mundo está em modo revivalista dos Nos últimos cinco anos Portugal subiu sete posições no eighties já toda a gente percebeu. Da roupa aos ranking europeu de inovação, passando este ano à frente acessórios, passando pela música e pelos carros, as de Espanha e da Itália e liderando o grupo de inovadores tendências vão desaguar ao período da História que moderados. Conquistando o 1 5º lugar do European consagrou Madonna como ícone. Sem surpresas, os Innovation Scoreboard de 201 0, o país continua, ainda videojogos 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 ZX Spectrum, que fez as delícias daqueles que agora andam O estudo já está online e vai ser apresentado hoje em na 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 a No início do mês, a entidade americana responsável pelos Portugal Telecom (PT) recebeu hoje um prémio que endereços de Internet, chamada IANA, anunciou que tinha reconhece a rede de fibra óptica da operadora como «a atribuído os últimos endereços disponíveis, o que deu azo a melhor e mais inovadora na Europa», anunciou hoje a vá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 equipas administradoras mundiais desses endereços, terão que da PT, e o sucesso da estratégia que adoptámos, que buscar métodos para administrar apenas os endereços que privilegia a inovação, a execução operacional e parcerias já existem. Isso pode virar um transtorno devido ao com líderes da indústria, de modo a podermos oferecer aos aumento do número de usuários e serviços que solicitam nossos clientes em Portugal os melhores e mais avançados novos 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 cresce vertiginosamente. 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
  • 5. TEMA DE CAPA Introdução ao ASP .NET MVC 3.0
  • 6. TEMA DE CAPA I n tro d u ç ã o a o ASP . N E T M VC 3 . 0 Desde 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 que desenvolvimento 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/downloadmvc3 utilizadores, cookies, entre outras funcionalidades, juntamente com um modelo de programação É importante destacar que o ASP .NET MVC 3.0 baseado em páginas e eventos que permite utiliza novos recursos que fazem parte do .NET desenvolver aplicações Web de uma forma muito Framework 4.0, e por isso necessita ter esta versão semelhante ao desenvolvimento de aplicações do .NET Framework e o Visual Studio 201 0 para Windows Forms. desenvolver aplicações (não é possível utilizar o Visual Studio 2008). Este modelo de programação chama-se ASP .NET WebForms, 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.0 então lançado pela Microsoft a primeira versão do deve ser instalada manualmente. ASP .NET MVC, que é uma alternativa ao modelo WebForms existente, e oferece um modelo de Model-View-Controller (MVC) programação muito mais simplificado e directo, e baseado num padrão (design pattern) bastante O padrão Model-View-Controler ou MVC permite conhecido e utilizado em vários outros frameworks e separar o código necessário para interagir com a plataformas, 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 um modelo de programação muito mais simplificado e directo, e baseado num padrão bastante conhecido (...) Assim, actualmente um developer que queira desenvolver uma aplicação Web na plataforma Microsoft .NET tem à sua disposição duas No ASP .NET MVC, um Controller corresponde a uma alternativas ou modelos de programação que pode classe que pode ser responsável por receber as escolher de acordo com a sua preferência: ASP .NET informações solicitadas pelo cliente (navegador), e WebForms 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
  • 7. 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 diferentes Controler ou MVC permite separar Models); - E provavelmente o mais importante: Ajuda os o código necessário para interagir developers a manter o foco em um único aspecto da com a interface com utilizador aplicação, de cada vez. através de três conceitos: Model, View e Controller Funcionamento do ASP .NET MVC 3 O recebimento das informações acontece através de Quando o framework inicia o processamento de uma mé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á o mais acções (Actions) possíveis de serem Controller que será responsável por responder a esta executadas, e cada Action é então responsável por requisição, e qual será a Action deste Controller que receber as informações enviadas através do cliente será executada. Por exemplo: (navegador) efectuar qualquer processamento que seja necessário e então enviar a resposta apropriada. http://portugal-a-programar.org/revista/edicoes Para enviar esta resposta, a Action do Controller No exemplo acima, o framework ASP .NET MVC interage com o modelo aplicacional (Model) analisa o texto da URL que está após o endereço do geralmente composto de várias classes que site, e identifica “revista” como sendo o nome do implementam a lógica de negócio da aplicação, e Controller que deve ser responsável por responder a desta forma, o Controller consegue preparar a esta requisição, e “edicoes” como sendo o nome do resposta a ser enviada de volta para o cliente método (Action) a ser executado neste Controller. (navegador). Para que esta requisição seja processada com Esta resposta normalmente corresponde a uma View, sucesso, é preciso que um dos assemblies do cuja responsabilidade é construir a resposta ao projecto (ou em assemblies referenciados) possua pedido solicitado, no formato apropriado. As Views uma classe com as características abaixo, caso normalmente são compostas por código HTML e contrário a resposta enviada será um erro do tipo JavaScript, 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ível benefí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 classe uma mesma informação (Model); System.Web.MVC.Controller; - Novas interfaces com o utilizador (Views) podem ser - Precisa ser uma classe que tenha o mesmo nome facilmente adicionadas, removidas ou alteradas, sem identificado através da URL como sendo o nome da grande 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 na alterada (pois está centralizada num Controller); URL como sendo a Action a ser executada, e que retorne um objecto do tipo 7
  • 8. TEMA DE CAPA I n tro d u ç ã o a o ASP . N E T M VC 3 . 0 System.Web.Mvc.ActionResult ou de uma classe partir do Visual Studio 201 0 deve aceder ao menu derivada desta. File, seleccionar New, e então Project, onde poderá seleccionar o tipo de projecto “ASP.NET MVC 3 Web No exemplo acima, a classe responsável por Application”, e definir o nome do projecto e o local processar este tipo de requisições (http://portugal-a- onde será gravado. programar.org/revista/edicoes) deve chamar-se RevistaController, e deve possuir um método chamado 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 no ficheiro Global.asax e que pode ser alterada se desejar: Os templates que pode escolher são: “Empty” e Criando o seu primeiro projecto ASP “Internet Application”. .NET MVC 3 A principal diferença entre os dois é que o “Internet Para iniciar um novo projecto ASP .NET MVC 3, a Application” já inclui algumas classes, controllers e 8
  • 9. TEMA DE CAPA I n tro d u ç ã o a o AS P . N E T M VC 3 . 0 views de exemplo que podem ser utilizadas como - Content: Pasta onde deve colocar as imagens e base 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 os necessá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 ficheiros sintaxe simplificada e (...) mais JavaScript utilizados no projecto; - Views: Pasta onde deve colocar os ficheiros elegante 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 site ASPX é o View Engine que foi introduzido na primeira Para criar a página inicial (home-page) da aplicação versão do ASP .NET, juntamente com o modelo Web, o primeiro passo é criar o controller chamado WebForms 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 3 e possui uma sintaxe simplificada e considerada mais Para isto, clique com o botão direito na pasta elegante, pelo que é o View Engine padrão do Controllers no Solution Explorer, seleccione “Add” e ASP.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 seguinte Ao 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
  • 10. TEMA DE CAPA I 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 estrutura qualquer requisição feita para a home-page do site similar a figura abaixo: (ex: http://portugal-a-programar.org/ ou http://localhost:1 234/) fará com que um novo objecto da classe HomeController seja automaticamente instanciado pelo framework ASP .NET MVC, e o método Index será executado. A resposta deste método Index será então enviada de volta para o cliente (navegador) que fez a requisição. O método Index neste exemplo possui apenas uma chamada para um outro método da própria classe chamado View, um método herdado da classe Controller. O que este método faz é executar solicitar ao View Engine que seja construída uma determinada View, e como não foram passados parâmetros, este método assume que a View possui o mesmo nome do método (Index), e que está dentro de uma pasta com o mesmo nome do Controller que está a ser executado (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
  • 11. TEMA DE CAPA I n tro d u ç ã o a o AS P . N E T M VC 3 . 0 Conclusão Como foi possível ver ao longo do artigo, que abordou de uma forma muito superficial o A comunidade NetPonto é uma iniciativa funcionamento e estrutura deste novo modelo de independente e sem fins lucrativos, que tem programação Web, o ASP .NET MVC 3 torna-se como simples e único objectivo a partilha de bastante simples de utilizar a partir do momento em conhecimento na área de arquitectura e que se percebe as convenções utilizadas para definir desenvolvimento de software na plataforma as diferentes partes de uma aplicação, e ao mesmo .NET, na tentativa de disseminar o conhecimento tempo 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 dizer nos ter uma maior separação entre impossível) estar por dentro de tudo, e essa é uma das principais vantagens em fazer parte de a lógica de negócio e a interface uma comunidade de pessoas ligadas à nossa com 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
  • 12. A PROGRAMAR Lua – Linguagem de Programação (Parte 7) Flex e Byacc - Parte III Optimização de SQL em Oracle - Índices jQuery – A framework
  • 13. A PROGRAMAR Lu 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ÇÕES do ambiente interactivo de programação Lua, além de das operações de acesso a arquivo. Na quarta parte desta série de fora abordado o uso Neste artigo como prometido será tratado os de tabelas com listas de registos, unidimensionais e assuntos 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 por descrição de dados e uso de programação orientada meio do uso das funções de inserção e remoção de a objectos. elementos em tabelas: insert() e remove() da biblioteca padrão table. O programa seguinte efectua a acção de entrada e ESCOPO DE VARIÁVEL saída de elementos na tabela VETOR. A definição de variável em linguagem Lua ocorre -- inicio do programa TAB01 sempre como escopo global. Caso haja a necessidade 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 do a instrução local. O escopo local é determinado pelo table.insert(VETOR, I) bloco no qual a variável foi declarada. Uma variável end com escopo local que seja declarada fora de qualquer bloco é visível em todo o programa. for I = 1, 5 do Por exemplo, o trecho de código seguinte é iniciado print("["..I.."] = "..VETOR[I]) com a variável X global com valor 33. Dentro da end decisão com a instrução if … then / end a variável X é -- fim do programa TAB01 definida 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] = 6 Ao ser executado o trecho de código anterior será [4] = 8 apresentado os valores 33, 5 e 33, sendo o valor 33 [5] = 10 para a variável X com escopo global e o valor 5 para a 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
  • 14. A PROGRAMAR Lu 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] = 6 parâmetro a definição do nome da tabela e o [5] = 8 segundo parâmetro o valor a ser inserido dentro da [6] = 10 tabela. Na sua operação esta função pode trabalhar com até três parâmetros, sendo o segundo parâmetro de uso opcional. Assim sendo, foram usados no Além da inserção do valor 9 na posição 1 da tabela programa anterior, de fato, o primeiro e o terceiro VETOR está em uso a função maxn() que percorre a parâmetros da função insert(). tabela contando quantos elementos existem. Desta Quando a função table.insert() está em uso ela forma, a instrução N = table.maxn(VETOR) atribui efectua a entrada do valor na posição n + 1 , onde “n” como valor para a variável N a quantidade de representa 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 primeira elemento junto a tabela, bastando fazer uso de um posição da tabela ocorreu o manejamento de uma parâmetro a mais indicado na segunda posição. posição a mais para acomodar os elementos O 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 tabela do 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ção editor 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] = 0 Após a execução do programa ocorre a apresentação [2] = 2 da saída: [3] = 4 [4] = 6 [1] = 9 [2] = 2 [3] = 4 14
  • 15. 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 do parâ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 end definida, 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 um Em seguida escreva o código de programa em um editor de texto, gravando-o com o nome tab05.lua e editor 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 de Após a execução do programa ocorre a apresentação cinco nomes. Por exemplo, se forem fornecidos os da 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] = Silvia Perceba que o valor 4 que estava na terceira posição foi removido. Com a remoção do valor 4 ocorreu o [1] = Augusto manejamento dos outros valores. [2] = Joca No processo de manipulação de tabelas por funções [3] = Paula há ainda a possibilidade de fazer uso da função sort() [4] = Silvia da biblioteca table para colocar os elementos em [5] = Silvio ordem ascendente se forem strings ou crescente se forem números. O programa seguinte demonstra o uso da função Observe que na primeira parte da saída ocorrera a table.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
  • 16. A PROGRAMAR Lu a – Li n gu a ge m d e Pro gra m a ç ã o ( Pa rte 7) DESCRIÇÃO DE DADOS -- inicio do programa TAB06 Uma 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 end sentido de fazer uso desta característica crie um arquivo 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 dos Grave o arquivo com o nome popula.lua e observe dados existentes no arquivo popula.lua. A partir da que cada um dos registos está identificado com o definição da tabela é possível efectuar operações de nome pessoa. Esta é uma segunda maneira de se controlo dos dados. Observe o código de programa definir registos na linguagem Lua. seguinte: Na sequência será definido um programa que fará -- inicio do programa TAB07 uso da função pessoa() que fará a apresentação dos nomes armazenados no arquivo de dados popula.lua. local DADOS = {} local IND local VLR 16
  • 17. 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ão apresentados os nomes Augusto, Antonio e Marcelo Onde MT é a meta-tabela e TN é a tabela normal. Isto que são os nomes dos registos cujas idades são posto, significa dizer que MT é uma meta-tabela de maiores 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 dois código da função pessoa() que por meio do valores associados cada um a uma tabela para parâ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 processamento Observe que as variáveis de uso do programa estão da adição ocorrerá um erro que interromperá a definidas com escopo de visibilidade local. execução do programa. Observe o código seguinte: Além deste efeito operacional o programa ainda faz uso de um laço for tipo genérico. Um laço genérico é -- inicio do programa TAB08 usado 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(). Caso queira percorrer os índices de uma tabela usa-se a TABELA1.a = 2 função ipairs() e para as linhas de um arquivo usa-se TABELA1.b = 4 a função io.lines(). TABELA1.c = 6 A função pairs() após percorrer os valores de uma tabela retorna três valores, sendo o valor da posição TABELA2.a = 3 do próximo elemento na tabela, retorna a tabela e TABELA2.b = 5 retorna o valor nil quando ultrapassar o fim da tabela. TABELA2.c = 7 As variáveis IND e VLR do laço for genérico guardam respectivamente os valores do índice e do conteúdo TABELA3 = TABELA1 + TABELA2 da tabela DADOS. print(TABELA3.a) 17
  • 18. A PROGRAMAR Lu 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 = 3 Em seguida escreva o código de programa em um TABELA2.b = 5 editor de texto, gravando-o com o nome tab08.lua e TABELA2.c = 7 tente executar o programa com a linha de comando TABELA3 = TABELA1 + TABELA2 lua 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 TAB09 TABELA2 não possuírem meta-tabelas associadas. A linguagem Lua tenta efectuar a adição de forma tradicional, o que leva a uma falha na execução do programa. Em seguida escreva o código de programa em um Para sanar o problema é necessário definir para as editor de texto, gravando-o com o nome tab09.lua e tabelas 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 os meta-tabelas. resultados das adições dos valores das tabelas A 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 efectuar sí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
  • 19. 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 classe A 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 = OBJECTO objectos em Lua é preciso criar protótipos de classes return ATRIB a partir de meta-tabelas dos objetos desta classe com end o uso do campo __index. Primeiramente faz-se a criação da estrutura básica de registo que será a base da classe. Assim sendo, A função (método) ALUNO.new() faz uso de dois considerando-se a criação de uma classe parâmetros, sendo o primeiro parâmetro a denominada 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 um a definição de um registo. A linguagem Lua não é acesso a um atributo ausente do objecto a linguagem orientada 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étodo de 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 do Normalmente as linguagens de programação que objecto. Observe o seguinte: operam com o paradigma de orientação a objectos conseguem definir uma variável a partir da estrutura ALUNO = TALUNO.new(TALUNO) de uma classe. A esta acção se dá o nome de instância e a variável usada é chamada de objecto. A partir deste ponto é possível escrever um programa Algumas 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étodo objecto a partir do uso de um método interno para o cálculo da média do aluno. O resultado da chamado new, como ocorre em Java (TALUNO média será atribuído ao atributo MEDIA do objecto ALUNO = new TALUNO();). Será então necessário ALUNO. Desta forma, estará sendo simulado o uso criar na linguagem Lua um método semelhante. de métodos do tipo off-line. Considere o código Após definir a estrutura da classe passa-se para a seguinte: 19
  • 20. A PROGRAMAR Lu 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) end A partir desta explanação considere o código de print("Media ..: "..ALUNO.MEDIA) programa seguinte com a manipulação de uma -- fim do programa TAB10 classe, 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
  • 21. 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
  • 22. A PROGRAMAR Fl e x e B ya c c - Pa rte I I I Ao longo desta série de artigos, temos vindo a ver Também vamos necessitar dum novo token que nos como utilizar as ferramentas flex e byacc para indique uma variável, e de outro token que sirva escrever uma calculadora simples. No primeiro artigo como operador de atribuição. Vejamos a nova vimos como escrever o scanner da nossa calculadora primeira secção do parser: usando flex e no segundo como escrever o parser usando 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 é C e 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> NUMBER variáveis implica alterar o parser e o scanner %token<s> VARIABLE simultaneamente. Começando pelo parser, vejamos %token NL do que precisamos para ter variáveis. Sendo uma calculadora 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
  • 23. 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 de todos 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
  • 24. A PROGRAMAR Fl e x e B ya c c - Pa rte I I I Os 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
  • 25. A PROGRAMAR Fl e x e B ya c c - Pa rte I I I Tendo dado ao scanner o nome de expr : 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 -b varMap.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, O'Reilly & 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 Professional AUTOR 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
  • 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 s Na última edição, iniciámos a temática da Podemos considerar que uma base de dados é uma optimização de SQL recorrendo à utilização de bind biblioteca. Dependendo da normalização da base de variables. Verificámos que, em casos específicos, o dados, esta poderá ter n tabelas. Consideremos que aumento de desempenho do Oracle é significativo e a nossa base de dados tem apenas uma tabela e que fulcral para o sucesso de uma aplicação. a mesma se encontra na primeira forma normal. Cada entrada da tabela é um livro de um determinado A optimização de SQL vai muito mais além das bind autor, com um título, tema, editora, etc., e com variables e da correcta gestão da shared pool. Nesta dezenas de páginas de texto. Portanto, com vários edição, vamos explorar os índices e perceber como a campos. (in)correcta utilização dos mesmos pode afectar o desempenho 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 biblioteca mais profundo das técnica de diagnóstico de queries ou consultamos o catálogo. do Oracle. No entanto, essa não é a intenção deste artigo, pretendendo apenas mostrar o que é e como funciona um índice. Na biblioteca, se pretendemos procurar um livro, temos duas O índice é um dos objectos que está presente na opções: ou percorremos toda a generalidade das bases de dados. No Oracle, em particular, o índice é um objecto que está associado a biblioteca ou consultamos o uma ou várias colunas da tabela e é comum catálogo. encontrar-se relacionado com qualquer tabela. Para se compreender a ideia do índice, vamos fazer a Em Oracle, estas pesquisas traduzem-se num full analogia 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
  • 27. A PROGRAMAR O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e s Oracle recorre às estatísticas. Tabela1 Entre as várias informações que as estatísticas Note-se o parâmetro estimate_percent que vai definir recolhem, destacamos aqui a informação da base de a percentagem de dados da base de dados a serem dados relativamente à dimensão das tabelas, dos analisados para a obtenção da estimativa. índices e da sua selectividade (número de chaves diferentes), 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ão A 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 certas circunstâncias e, em bases de dados de grande Criemos um índice sobre a coluna do ano de edição dimensã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 ON que, se efectuado em horário de produção, poderá T_LIVROS(DATA_EDICAO); afectar significativamente o desempenho das aplicações. Daí que este procedimento só deva ser agendado 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 indicam Um 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 correcta procedimento de PL/SQL que aplicaremos sobre a para encontrar todos os livros de 1 980: ou recorrendo tabela 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
  • 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 s Podemos ver na figura a síntese do procedimento adoptado pelo optimizador ao receber uma query. (...) o índice tem uma O que indexar? característica que o diferencia da Já 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ções O í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 como registos, então o índice terá mil entradas, também. se efectuam as pesquisas. No entanto, o índice tem uma característica que o diferencia da tabela: é ordenado. Logo, uma pesquisa Voltemos ao exemplo da biblioteca. Imaginemos que indexada será muito mais rápida do que uma um dos campos do livro é o código ISBN. Como pesquisa 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 é a primeira 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
  • 29. A PROGRAMAR O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e s iguais? Na prática, valerá a pena um índice SELECT * bibliotecário ordenado simplesmente pelo idioma e FROM T_LIVROS que há-de conter quase todas as obras da biblioteca? WHERE AUTOR LIKE 'EÇA%' AND TITULO LIKE 'OS A resposta é não. MAI%' Uma boa escolha do que se vai indexar é uma questão de bom senso e implica um conhecimento à A justificação está no facto de que o índice priori do conteúdo da tabela. Podemos criar uma concatenado só é utilizado se a pesquisa for feita tabela sem índices e apenas os implementarmos à pela mesma ordem da criação do índice. Isto é, se o medida que a solução vai crescendo, à medida que índice recai sobre as colunas (a,b,c), a pesquisa temos 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 a maioria das entradas são idênticas é um desperdício Índices de funções de espaço e não traz qualquer benefício ao optimizador. Na pesquisa de campos de texto, o índice de coluna poderá nunca ser utilizado. Vejamos o caso em que Indexação concatenada os títulos dos livros estão inseridos na base de dados com letras maiúsculas e minúsculas. Se efectuarmos Alé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 a Este í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 LIKE 'EÇA%'; Neste caso, o índice não é utilizado, pois os valores guardados no índice são sensíveis a maiúsculas e ou 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
  • 30. A PROGRAMAR O p ti m i za ç ã o d e SQL e m O ra c l e - Ín d i c e s Valores NULL O acompanhamento e a O Oracle não guarda valores NULL. Podemos verificar, tentando introduzir uma linha totalmente monitorização dos índices e das NULL numa tabela. Como tal, também os índices não queries através de planos de guardam os valores NULL dos campos de uma execução permite conhecer a tabela. 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 verdadeira vai 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ão A utilização e parametrização de índices é um tema Nota: Agradeço ao Eng.º José Aser, formador do bem mais complexo. O acompanhamento e a Citeforma, a sua colaboração na ajuda da revisão dos monitorização dos índices e das queries através de meus artigos de Oracle, bem como no conhecimento planos 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 BD's Oracle, PostgreSQL e SQL Server. 30
  • 31. A PROGRAMAR j Qu e ry – A fra m e wo rk Neste segundo artigo vou entrar mais em detalhe nas • Contextualizar selecção: funcionalidades do jQuery, como o motor de $("algumselector", contexto) -> deste modo selectores, que é uma das funcionalidades core, as podemos restringir o âmbito do nosso selector a um funcionalidades de traversing e de manipulation. contexto, que é uma nossa selecção prévia. Uma das funcionalidades que torna o jQuery muito compacto é 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 os devidas alterações efectuadas na função), permitindo elementos que tenham o atributo especificado um executar funções encadeadas, num estilo de • Valor atributo igual a: código altamente compacto e mesmo assim $("[atributo='valor']") -> selecciona todos os extremamente perceptível. elementos cujo atributo especificado tenha Relativamente ao motor de selectores, ele é o que exactamente o valor especificado nos 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 os obter um conjunto de elementos do DOM. elementos cujo atributo especificado tenha um valor Existe vários tipos de selectores, por atributo, diferente do valor especificado hierá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 texto Por 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 especificado elementos 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 de selectores um objecto, o jQuery encarrega-se de Por conteúdo: transformá-lo num objecto jQuery automaticamente • Elemento contém texto: 31
  • 32. A PROGRAMAR j 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 dos selectores 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 objecto Existem 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 HTML documento parte do DOM; 2. $("a:contains('PaP')") através do seu • children(): esta função é similar à find com a conteúdo diferença que só permite encontrar elementos no 3. $("a[href*='portugal-a-programar']") através nível imediatamente abaixo ao dos elementos no do atributo href objecto jQuery; 4. $("a[href^='http://www.portugal']") através • contents(): função similar à anterior, mas que inclui do 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 de a encapsular o objecto document num objecto jQuery, um objecto jQuery: e a utilizar a função de traversing find que possibilita pesquisar 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
  • 33. 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 os objecto jQuery correspondem ao selector indicado elementos do objecto jQuery num html passado por como 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 os jQuery elementos do objecto jQuery num único parent, passado por parâmetro, enquanto que a segunda Quanto a manipulation, existem muitas funções envolve os descendentes de todos os elementos do utilizadas 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 e indica, têm como função adicionar classes, retornar manipular a nossa lista de elementos num objecto um 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 lista remover caso tenha determinadas classes, de li com base num dado JSON (JavaScript Object respectivamente; Notation), dentro de uma ul: • append(): com o append, como o próprio nome indica, 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 os eventos, 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 fill style de um elemento, sem preocupações com this..."},{"title":"This is the second diferentes nomenclaturas destas propriedades entre article","lead":"some other text to fill cada browser, funciona de modo similar à função attr; this..."}]}; • empty(): com esta função podemos limpar o conteúdo de um ou vários elementos, tanto var $ul = $("ul.main"); /*aqui, uma das boas elementos 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, devemos utilizando 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 ao objecto jQuery, à excepção de elementos do tipo prefixo de $ é algo que se costuma utilizar input, para os quais é usada a função val() descrita para tornar o código mais legível, de modo abaixo; 33
  • 34. A PROGRAMAR j 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
  • 35. A PROGRAMAR j Qu e ry – A fra m e wo rk Neste exemplo, conseguimos ilustrar a utilização de style="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 desvendar class="testing" style="font-weight: bold; ligeiramente melhor o poder do jQuery, assim como color: blue; ">This is the second article : uma pequena parte da sua funcionalidade, em artigos 4</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
  • 37. COLUNAS PROGRAMADOR EXCÊNTRICO - 6 regras para utilizar AJAX VISUAL (NOT) BASIC - Windows Phone 7 CORE DUMP - gcc -Wall myApp.c -linstantaneous -o success
  • 38. PROGRAMADOR EXCÊNTRICO 6 re gra s p a ra u ti l i za r AJ AX AJAX, ou Asyncronous JavaScript And XML, tem ganho muita força nos últimos tempos. Os O princípio da melhoria progressiva do Ajax é bem Programadores Web têm feito coisas magníficas com conhecido, porque comummente é utilizado de forma o AJAX, mas também já vi grandes erros e uma má discreta no JavaScript, como mostra a imagem aplicação do AJAX. acima. Queria partilhar convosco, através da minha Então, o que deves fazer é construir o teu site para experiência como Programador Web mas também funcionar sem JavaScript, e só depois adicionar como utilizador frequente da Internet, seis regras JavaScript como sendo um acessório, da mesma para utilizar o AJAX. forma que utilizas o HTML como linguagem de marcação e depois o CSS para melhorar o visual da AJAX 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á a de um site de qualidade é fazer com que ele seja acontecer funcional. Como? Não importa, contanto que o utilizador saiba que funcione. Um utilizador genérico Não há nada pior que clicar em algo e não ver nada a até é capaz de ignorar a velocidade de load do site se acontecer por 2 segundos. Os utilizadores estão ele fizer o que quer que seja para o qual foi habituados a clicar e avançar para a acção programado. seleccionada, ou pelo menos, ver o progresso da acção solicitada. Dito isto, queres que um utilizador ao desligar o JavaScript deixe de conseguir utilizar o site, que ele Lembra-te que a tecnologia AJAX é relativamente deixe 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á a voltar. funcionar. Sugiro que utilizem uma mensagem não intrusiva, que mostre o estado da acção solicitada. Nada melhor que a imagem abaixo para explicar como 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
  • 39. PROGRAMADOR EXCÊNTRICO 6 re gra s p a ra u ti l i za r AJ AX Eu como utilizador não me interessa saber que tipo utilizador não pode manipular o vosso script. de tecnologias e/ou magias obscuras utilizaste, desde que 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 vosso AJAX só no Fim script. Entregar o Projecto deverá ser o objectivo número AJAX poupa tempo no Load… Mas o teu um, então adiciona o AJAX no fim do projecto ou Framework JavaScript não depois que o site esteja feito. Claro que, o AJAX pode poupar que uma página seja actualizada, mas os O teu script em AJAX consegue poupar uma utilizadores estão habituados à maneira antiga. Não actualização da página ao utilizador, sem carregar o consigo imaginar um cliente teu satisfeito com "Não header, footer e sidebar? Óptimo. O teu Framework está 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 Framework Eu opto sempre pela maneira antiga (na verdade, quando for realmente necessário, e não adiciones standard é provavelmente a palavra correcta), faço o mais código do que o absolutamente necessário para site, 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 maneira O URL do AJAX pode até estar escondido no teu antiga ... faço o site, e só depois no código, e assim a maioria dos utilizadores não o vê, fim é que acrescento melhorias na mas aposto que consigo encontra-lo. Se é possível sua funcionalidade de ser encontrado é possível de ser explorado. Não assumem que só porque fizeram o código do vosso formulá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
  • 40. VISUAL (NOT) BASIC Wi n d o ws Ph o n e 7 Que melhor maneira poderia existir para demonstrar o poder da .NET Framework do que uma verdadeira demonstração de união? O resultado é a entrada da linguagem Visual Basic .NET na corrida móvel de última geração: o Windows Phone 7. O desenvolvimento é feito utilizando o poderoso Visual Studio, com todas as comodidades a ele associadas. Acesso ao ambiente de desenvolvimento À semelhança das versões Mobile, precisamos de O ambiente de desenvolvimento instalar kits de desenvolvimento que se vão integrar com o nosso Visual Studio. Para os interessados que Para quem já estava familiarizado com aplicações nã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 (eXtensible fazer. 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 a C#. que já estamos habituados nas versões anteriores do O que existe agora é uma versão do kit de Visual Studio. desenvolvimento que se associa ao Visual Studio 201 0 Professional e só aí é possível começar a Tipos de página escrever aplicações em VB. Nesta solução, não podemos usar XNA nem Existem vários 3 tipos de páginas base, onde todos Expression 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 Developer Tools, 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
  • 41. 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 template Panorama “Windows Phone Application” Panorama é um tipo de página base que nos permite O ambiente vai carregar com todos os elementos dispor os itens num plano horizontal, virtualmente familiares, e anteriormente descritos. A página que infinito. têm no “designer” é uma página Portrait/Landscape. Apesar de existirem separações distintas entre as várias páginas do panorama, a navegação é feita de 2- O leitor de RSS que vamos criar lê dois forma contínua, como que se esteja a arrastar uma RSS simultaneamente. Poderia ser apenas um, ou folha que se observa através de uma abertura. poderiam ser virtualmente infinitos, mas vamos criar A navegação pode ser feita a qualquer altura, em apenas 2 “hardcoded” para demonstrar mais tarde as ambas 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 nomes grandes quantidades de informação relacionada que “txRSS1 ” e “txRSS2” e de seguida um botão de nome de outra forma se teriam de distribuir por vários “btLer”. Usem também os pontos de controlo nos ecrãs. centros de das arestas da esquerda e direita para ancorar o controlo aos limites horizontais do Pivot 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
  • 42. VISUAL (NOT) BASIC Wi 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ção Notaram certamente que ao tocar na textbox surgiu um teclado QWERTY virtual. No contexto das aplicações para aparelhos de comunicação móveis, as letras não são suficientes para cobrir todas as necessidades. Existem 5 principais métodos de introdução: 5- A leitura dos “feeds” vai ser feita numa outra URL página, uma página pivot onde vamos organizar cada Disponibiliza 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
  • 43. VISUAL (NOT) BASIC Wi n d o ws Ph o n e 7 Solution Explorer, escolham “Add” e depois “New item”. De entre os templates escolham “Windows Phone 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”, e adicionem 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 dos o 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ão exactamente quantos precisamos. PrivateSubButton1_Click(ByValsenderAsSystem.O Depois de colocar o “WebBrowser” num item, para bject, ByVal e As não complicar, teremos que o duplicar para o System.Windows.RoutedEventArgs) segundo item. HandlesButton1.Click Isto pode ser alcançado através do designer mas NavigationService.Navigate(New torna-se muito mais fácil se identificarem a linha que Uri("/Leitor.xaml"), UriKind.Relative)) representa o “WebBrowser” no XAML e a copiarem EndSub para o outro item do pivot. 43
  • 44. VISUAL (NOT) BASIC Wi n d o ws Ph o n e 7 se" 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ágina Com o sistema de navegação equiparado a um browser, sem poder criar instâncias de objectos Depois de ter a página carregada (e só depois de Form, como normalmente fazemos no Visual Basic estar completamente carregada, isto é importante) Windows Forms, transportar valores como um podemos resgatar os valores do cabeçalho da simples 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 a construir um URI, é perfeitamente possível passar parâmetros através do URL, o que já reduz Private Sub Leitor_Loaded(ByVal sender As significativamente a complexidade para transportar Object, ByVal e As valores. System.Windows.RoutedEventArgs) Handles Como pretendemos passar dois endereços distintos, MyBase.Loaded podemos 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ários mesmo que numa navegação normal, pois estamos a para fazer os pedidos dos itens dos “feeds”. apontar à mesma para uma página, mas o do cabeçalho já constam os valores passados no URL. Juntando à passagem de valores a validação simples Private Sub Leitor_Loaded(ByVal sender As das 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
  • 45. 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 ficheiro CarregarRSS.vb, cujo link podem encontrar no final do artigo. Trata-se da classe criada para ler os feeds, que não é relevante para o desenvolvimento em WP7. Orientação do aparelho 1 3- A aplicação está completa. Se têm a oportunidade de estar a fazer debug Corram agora a aplicação. O primeiro ecrã apresenta directamente no telefone, já devem ter reparado com as duas caixas. certeza no comportamento da aplicação quando Preencham as caixas com dois feeds diferentes, por inclinamos o telefone nas posições que normalmente exemplo: disparam mudanças de apresentação noutras aplicações nativas: não acontece rigorosamente O “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 no O 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
  • 46. VISUAL (NOT) BASIC Wi n d o ws Ph o n e 7 ignorar qualquer outra orientação que não seja O desenvolvimento em WP7 assenta em Windows Portrait. Presentation Framework com todas as vantagens A 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 se maioria dos casos, passá-la para aplica estão muito bem conseguidos e bastante PortraitOrLandscape resolve o layout para a polidos, o que torna a experiência bastante agradável orientação pretendida, mas também é obviamente e produtiva, desviando o foco do programador para possível controlarmos os comportamentos. pormenores que não interessam tanto como a Troquem 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 aparelho PortraitOrLandscape 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 b34b00ce Ainda que diferentes, nota-se perfeitamente o esforço que a Microsoft está a fazer para substituir Windows Forms 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
  • 47. 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 s Desde 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 na empreendedores e aplicações de sucesso. Estes tecnologia em si. Aprender esta lição é de extrema sucessos, muitas vezes bombásticos e sempre importância e muitas vezes não é compreendida por mediáticos, parecem indicar que é muito fácil criar um quem faz o desenvolvimento. Ninguém compra um negócio multi-milionário do dia para a noite. Quando produto por este ser desenvolvido em determinada um bom programador olha para uma aplicação de tecnologia. sucesso identifica imediatamente um conjunto de Outra lição de extrema importância é que um variáveis que o levam, invariavelmente, a concluir “Eu programador não é um designer e também não é um sou capaz de fazer isto!” e costuma rematar com “E utilizador comum, o que tipicamente o leva a até sou capaz de o fazer melhor!” E tipicamente um desenhar aplicações funcionalmente más. E como se bom programador diz a verdade numa situação não bastasse ainda fica ofendido com os utilizadores destas.[1 ] por estes não compreenderem que para activar a Se juntarmos à capacidade técnica o baixo custo assinatura digital apenas têm de correr determinado actual de criar uma aplicação e de a disponibilizar comando numa shell com permissões de para todo o mundo ficamos a pensar porque razão administração![2] apenas uma ínfima a quantidade de programadores cria e gere o seu próprio negócio e porque não são (...) um programador não é um todos 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, a razão não é dinheiro para arrancar. A questão Uma terceira lição de extrema importância é que uma també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 de programadores é realmente empreendedor e desses software. Por exemplo, um produto tem um manual nem todos têm a coragem de arriscar a voar por si. E de instruções que efectivamente explica o produto e todos quantos arriscam mudar de vida sofrem na pele como operar com o mesmo. todas as torturas e maus tratos que advém da gestão de um negócio próprio, a começar pelo facto de que Por esta altura muitos estão a pensar “mas eu não existem sucessos instantâneos, muito menos compreendo tudo isto, acho que tenho veia de para negócios multi-milionários. Sem dúvida que há empreendedor”. A todos vocês que pensaram isso excepções à regra, mas mesmo essas excepções vou lançar um desafio. Respondam às seguintes que 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 haver certezas 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, quantos empreendedor é compreender que a tecnologia é terminaram? 47
  • 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 s 4. Dos projectos que terminaram, quantos Muitas vezes o programador aspirante a lanç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 deitar O empreendedorismo, de forma geral, não se esgota por terra ser o próximo multi-milionário da web, peço na construção do produto. Na verdade isso é apenas apenas mais um minuto. um meio para atingir um fim. E o fim é a criação de um negócio, inicialmente sustentável e mais tarde de É que mesmo com uma ideia validada e uma vontade sucesso. inabalável de desenvolver um software que se vai vender como bolos quentes porque resolve um E também aqui é necessário explicar que o sucesso problema complexo a um número infindável de não existe apenas se conseguirmos entrar para a pessoas, há imensas variáveis que o programador Fortune 500. A maioria dos empreendedores aspirante não pensou ou, pior, pensou de forma considera o seu negócio um sucesso quando este lhe leviana. É necessário ter a consciência de que não dá 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 de Tipicamente esse caminho começa com uma ideia, marketing e de vendas. E não, gastar uns trocos, ou mas 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 colocar da 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
  • 49. 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 s manual de instruções, é necessário estar preparado [1] A prová­lo está o facto de determinada aplicação para dar suporte à aplicação e, em alguns casos, até de sucesso ser clonada por várias empresas e por formação. vezes até melhor do que original. Mas só ser bom E enquanto tudo isto se desenrola é necessário tratar não basta, e por isso os clones raramente destronam da burocracia inerente ao negócio, recolher feedback quem chegou primeiro. dos utilizadores, corrigir bugs em produção, ajustar o road 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, quantos terminaram? [3]Para os mais cépticos deixo um desafio. Olhem para o vosso desktop e vejam se têm alguma funcionalidade, escolher um novo plano de aplicação instalada que não vos seja útil. Todas elas alojamento, dar o produto a conhecer a mais vos resolvem um problema, seja apenas ouvir um pessoas, pagar as contas do mês e, no meio de tudo MP3 ou efectuar o controlo de versões em ambientes isto, ter umas horas para dormir por dia e tentar fazer distribuídos. com que o temo “fim-de-semana” passe a ter o mesmo significado que os nossos amigos não- empreendedores lhe dão... Ainda sobrou alguém a ler? Então estás à espera de quê? Valida a tua ideia e mão à obra. Garanto-te que é uma experiência profissional única da tua vida, e quem sabe, talvez venhas mesmo a ser o próximo multi-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
  • 50. COMUNIDADES Desenvolvimento em SharePoint 2010 GuiaTV CoolthingsPT Habilitar external users no SharePoint online – Office365 O Futuro da Programação Assíncrona da Plataforma .NET
  • 51. COMUNIDADE SHAREPOINTPT D e s e n vo l vi m e n to e m Sh a re Po i n t 2 0 1 0 Developer em Sharepoint? aplicacionais: Desde muito cedo que esta maniataraobsessão por debitar linhas de código pelo puro prazer de mover um pixel de um lado para o outro, tem-me atormentado como se de um vírus se tratasse. Não sei se é mania ou não mas sempre gostei de assuntos que me fizessem pensar e criar algo novo. Sim , eu confesso na minha essência sou um Developer , e presumo que vocês que lêem estas linhas também o são, senão não teriam chegado até aqui. Um developer, e isto na minha opinião terá de ter sempre uma percepção global das coisas e focus no desenvolvimento, um pouco de bom senso, e muita paciência. Estas eram as métricas gerais seguidas por 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 e de IT, Project Manager, and whatever, penso que a Externos. Infraestrutura única para todos os sites ocupação de Developer é a mais cool de todas. Um empresariais Web : Intranet, Extranets e Internet developer de SharePoint obrigatoriamente tem mais Communities: Ambiente de colaboração valências de que só a de desenvolvimento: somos social, Ferramentas com capacidades sociais, como Administradores de Sistemas, Helpdesks, Arquitectos blogs, wikis, rssfeeds, tagging, perfis pessoais recios , Testers, DBA , Designer e utilizadores finais da em informação plataforma. Em SharePoint é extremamente rigorosa Content:Gestão documental , políticas de a 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 a Microsoft 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 componentes que o produto SharePoint representa, existem ainda para criação de soluções comerciais algumas dúvidas relativamente ao que este produto pretende atingir. Sendo uma plataforma consolidada nestas diferentes De 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 de funcionais. 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
  • 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 0 nós e estamos aqui. Camada Aplicacional(Application Layer)à Camada de Apresentação(Presentation Layer). Estes diferentes SharePoint 201 0 e tecnologias inerentes layers podem estar localizados numa só máquina (Standalone Server) Antes de tudo, é importante que um developer perceba e entenda minimamente a arquitectura da plataforma e alguns dos seus mecanismos inerentes: SharePoint é baseada na framework .NET, subdividindo-se em 2 tecnologias principais: SharePoint Foundation: Tecnologia subjacente a todos os sites SharePoint, encontra-se disponível gratuitamente. É 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 todas as funcionalidades do SharePoint Foundation além de funcionalidades e capacidades adicionais como Gestão de Conteúdos, B.I., Pesquisa empresarial. A figura acima ilustra as diferentes tecnologias inerentes à plataforma. Essencialmente temos o sistema operativo, Windows Server 2008, o IIS , SqlServer, a .Net Framework e ASP.Net, o SharePoint Fisicamente esse conceito também é real, temos Foundation 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 de ou Windows Vista , não é suportado pela Microsoft forma a ser escalado horizontalmente e em ambientes de produção e para desenvolvimento verticalmente, caso exista necessidade mais recomendo avidamente a utilização de tecnologia capacidade a nível do User Interface , podem ser server. 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 adicionados Arquitectura mais Servidores Aplicacionais (Application Servers). E finalmente se existir necessidade de mais A infraestrutura do SharePoint 201 0 foi pensada de capacidade a nível de base de dados, podem ser forma a respeitar uma arquitectura lógica de 3 adicionados mais Servidores de Base de Dados camadas: Camada dos Dados(Database Layer), à (Database Server). 52
  • 53. 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 Quaisquer que sejam as necessidades, é permitido Aquando a saída da versão 2007 da plataforma, a desenhar uma topologia que as complemente com integração com a ferramenta de desenvolvimento uma flexibilidade extrema. Visual Studio era muito limitada. Em meados de 2007, as soluções e features eram criadas E 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 deste SharePoint e o Visual Studio 201 0 que vos apresento passa por criar uma funcionalidade de registar os contactos dos actuais 53
  • 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 membros da Comunidade Portuguesa de SharePoint funcionalidades por toda a Farm . Para tal vamos criar um tipo de conteúdo (Content Type) com alguns campos e criar uma lista baseada nesse tipo de conteúdo. Apesar de ser um exemplo simples, acaba por demonstrar algumas funcionalidades que a plataforma disponibiliza 1 . Abrir o Visual Studio, no menu principal, seleccional a opção File>New Project •Em Installed Templates, seleccionar a opção SharePoint>201 0 e Empty SharePoint Project •Digitar o nome do projecto, e a sua localização : neste caso o nome escolhido foi SPugPtMembersList 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ção com o url do site SharePoint em que vamos trabalhar, neste caso é http://vm201 0/ pois é o site por omissão criado aquando a instalação do SharePoint. Nesta versão do SharePoint existem 2 tipos de soluções que podem ser criadas: Sandbox e Farm solutions. Sandbox solutions são soluções em que os processos de execução, correm em ambientes muito controlados com restrições variadas tendo em vista um enclausuramento aplicacional em toda a Farm de SharePoint. 4. Os content types são elementos com herança pelo Farm solutions , são soluções mais abrangentes, que vamos seleccionar o content type mais simples contemplando desde o inicio uma aplicação de de todos: Item 54
  • 55. 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="SpugPtMembers Como 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.xml mais 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
  • 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 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 Content Type , 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 criado Assim: •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
  • 57. 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 nos falta fazer a instalação no nosso SharePoint •Seleccionar a opção Lists> SpugPt Members List Como? Fácil.Primeiro executamos o Build da solução •Digitar SpugPtMembers na caixa de texto e 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 itens Como teste final, vamos criar a nossa lista e criar alguns 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
  • 58. 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 Conclusão Resta-me fazer-vos um convite: todos os meses aos 2ª Sábados, a Comunidade Portuguesa de Embora tenha sido um exemplo muito simples, SharePoint apresenta 1 sessão e chalk talks com espero que tenha atingido o objectivo de como o membros activos na tecnologia onde podemos trocar desenvolvimento em SharePoint encontra-se ideias, e esclarecer dúvidas e acima de tudo trocar extremamente 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 como plataforma de desenvolvimento. Dentro deste tema Aquele abraço com muitos Dispose à mistura existem claramente imensos subtópicos, integrações e tipo de implementação e neste momento é claro que este é um produto da Microsoft que irá evoluir e consolidar-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
  • 59. COMUNIDADE ANDROIDPT G u i a TV C o o l th i n gs PT A aplicação GuiaTv é uma aplicação para dispositivos Mas assim que soubemos da exist ncia do concurso móveis com o sistema operativo Android que permite definimos logo essa data como a deadline para aos utilizadores visualizarem a programação dos apresentar a versão beta da aplicação. Para canais de televisão de uma forma simples e ao conseguirmos cumprir os prazos por nós definidos, foi mesmo tempo apelativa. Foi esta aplicação que necessário cortar algumas funcionalidades mais garantiu à equipa CoolthingsPT o primeiro prémio do complexas e diminuir a prioridade a algumas tarefas Concurso de Programação para Android (CPA) da que poderiam ser mais motivantes. Tudo isto, para comunidade Androidpt (http://www.androidpt.com/). garantirmos que tinhamos tempo suficiente para criar todas as funcionalidades básicas da aplicação. Ecrã Guia TV Esta aplicação foi a primeira aposta da startup Ecrã Zapping nacional CoolthingsPT. Os objectivos da Método de Desenvolvimento CoolthingsPT a curto prazo passam por fazer da CoolthingsPT uma marca com qualidade a nível No desenvolvimento da aplicação, a equipa nacional e internacional, tanto no desenvolvimento de empregou métodos ágeis de desenvolvimento de aplicações Android como em serviços de consultoria software. Desses métodos destaca-se o scrum, onde nessa área. se encaixam as reuniões em que cada membro basicamente comenta aquilo que fez na última O desenvolvimento da aplicação começou algum sessão de desenvolvimento, o que pretende tempo 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
  • 60. COMUNIDADE ANDROIDPT G u i a TV C o o l th i n gs PT prá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 o desenvolvimento de todas as frentes de utilizador. desenvolvimento da aplicação e terem em todas as sessões de desenvolvimento uma visão geral do Todas as TabHosts do GuiaTV sofreram uma estado 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 atractiva salientar uma prática que nós achamos importante na visualmente e não se adequava ao tema da equipa CoolthingsPT que é o facto de programarmos aplicação. Estas alterações foram possíveis porque a em pares e discutirmos a melhor forma de plataforma android oferece total liberdade ao desenvolver 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 um Estrutura da Aplicação webservice que recolhe os destaques diáriamente, colocando a informação posteriormente numa Uma das primeiras e principais dificuldades na "listView". implementação do GuiaTV foi definir claramente qual a estrutura da interface a utilizar. Depois de Para proceder ao parsing da informação obtida em experimentar 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 menos recorrendo ao uso de "Tabhost"s. A TabHost é um tipo memória quando comparado com DOM(Document de ViewGroup disponível na API do Android. Fazendo Object Model). Isto faz com que seja adequado para uso destas TabHosts, é possível agrupar o conteúdo um dispositivo móvel dada a memória ser mais da aplicação em tabs dentro de uma TabActivity. Com limitada. este tipo de interface, conseguimos apresentar todas 60
  • 61. COMUNIDADE ANDROIDPT G u i a TV C o o l th i n gs PT Um dos objectivos iniciais era permitir a utilização da aplicação no modo offline, para tal foi criado um serviço para obtenção da informação dos canais favoritos, guardando a mesma numa base de dados interna ( sqlite ). Sendo que os canais favoritos são definidos pelo utilizador, foi necessário encontrar uma forma simples, intuítiva e cativante para proceder a essa selecção. A funcionalidade de Zapping está directamente ligada aos favoritos, expondo a informação dos programas que estão a decorrer no momento nos canais favoritos, bem como a percentagem 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.html GuiaTV CoolthingsPT que incluiu, por exemplo, pesquisa automática da box Meo para mudança de canais, "zapping" automático, menu de configurações, ordenação de canais, restruturação da interface visual, entre outras. De seguida apresentamos duas imagens da próxima versã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
  • 62. COMUNIDADE CODIFICANDO.NET C 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 5 Office 365 será lançado em 2011 , produto online com 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 recursos que foram anunciados e já testados por alguns no beta, vou apresentar o recurso de external users no SharePoint Online. No SharePoint online disponível no BPOS (versão 2007 do SharePoint) não era possível acesso de usuários externos. Uma característica interessante e que é importante para garantir uma colaboração rica e completa com todos os colaboradores, parceiros e até clientes, é a possibilidade de compartilhar um site de documentos através do SharePoint Online. Agora no SharePoint Online que será lançado no Office365, que já vem com 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 ao Nesse artigo pretendo em primeira mão mostrar Administration Center do SharePoint Online, dentre como é fácil habilitar e configurar para acesso de as opções de configurações, vá em “manage site usuários externos usando o Windows Live ID para colletions”: acessar informações do seu site SharePoint. Primeiro passo é registar na secção de administração do Office365: Figura 3 - Administration Center SharePoint Vá em “Site Colletions”, veja que nos sites abaixo a opção “External Users” está deny. Isso significa que Figura 1 - Página de login no Office365 nem dos sites está habilitado para acesso para 62
  • 63. 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 5 acesso 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ída Figura 4 - Sites Collections Depois de habilitado você vai criar o utilizador no seu Escolha o site que deseja habilitar o acesso externo. site. A criação desse utilizador funciona da seguinte Seleccione o site, clique em ‘settings’, ‘manage forma: você adiciona o utilizador através do e-mail external users’, escolha opção ‘allow’ e confirme o que será usado para acederao site, escolhe o grupo procedimento. 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 Actions Figura 6 – Salvando alteração Clique em ‘external users permissions’: Figura 7 - Confirmando liberação para external users 63
  • 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 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-mail Figura 1 0 - Users and Permissions Após aceitar o convite o utilizador já será direcionado Adicione o e-mail, permissão (é possível atribuir o a pagina de autenticação do Online Services. No utilizador a um grupo especifico, ficando mais fácil momento que o utlizador digitar o e-mail (no caso controlar as permissões dos utilizadores dentro do hotmail – Live ID) e clicar no campo senha o campo seu 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 o externo: 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 Users Nota: Caso o usuário não aceite o convite que Figura 1 3 - Sign in recebeu por e-mail, ele não será adicionado como membro do site no SharePoint e também terá acesso Depois que ocorrer autenticação e se tudo estiver negado 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
  • 65. 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 5 Figura 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 para Figura 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
  • 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 .NET Introduçã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 podem ocorrer isoladamente ou em combinação. Vários A partir da versão 2.0 começaram a surgir algumas troços de código podem estar em execução implementações da Event-based Asynchronous simultaneamente sem que isso signifique Patter (EAP) c) que consiste num método concorrência se não acederem aos mesmos OperationAsync e um evento OperationCompleted. recursos. Uma operação assíncrona pode ser executada 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ção Até à versão 4.0 da plataforma .NET a norma para do código: operações assíncronas era o Assynchronous Programming 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
  • 67. 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 (Async A 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 faz uso da Task Parellel Library (TPL). d) A palavra chave async é aplicada aos métodos e indica ao compilador que deve reescrever o método Esta 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 um tenham 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íncrona a 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()) ); { await Aqui 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
  • 68. 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 Que 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, - Lucian's VBlog progress); (http://blogs.msdn.com/b/lucian/archive/tags/async/) Blogue de Lucian Wischik – Program Manager da As equipas dos respectivos compiladores ainda têm linguagem Visual Basic. alguns problemas para resolver, mas não fugirá muito disto e existe já uma CTP de uma primeira - Fabulous Adventures In Coding implementação. (http://blogs.msdn.com/b/ericlippert/) Blogue de Eric Lippert – Programador na equipa do Recursos 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) spx Extensão ao Visual Studio 201 0 (não compatível com c) http://msdn.microsoft.com/library/wewwczdw.aspx o Visual Studio 201 0 SP1 ) que providencia as novas d) http://msdn.microsoft.com/library/dd46071 7.aspx funcionalidades 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
  • 70. ANÁLISE S i l ve rl i gh t 4. 0 – C u rs o C o m p l e to O livro Silverlight 4.0 – Curso Completo, de autoria de Luís Abreu e colaboração de João Carreiro, é um livro lançado pela FCA – Editora de Informática, com 400 páginas e dividido em 1 5 capítulos. É apresentado com o objectivo de “ensinar o programador que se está a iniciar na plataforma Silverlight, sendo também uma ferramenta indispensável para o programador conhecedor da plataforma Silverlight que pretende fazer a transição para a nova versão”. O livro começa por apresentar os requisitos, o público-alvo, convenções, código fonte e organização do mesmo, fazendo um pequeno resumo do que será abordado em cada capítulo. De forma breve é apresentado no primeiro capítulo as principais funcionalidades do Silverlight 4.0 e é feito e apresentação dos diversos controlos layout um enquadramento da tecnologia a nível histórico, a (Canvas, Inkpresenter, StackPanel e Grid), não nível de arquitectura e a nível de desenvolvimento, ficando de parte o conceito de paneis virtuais e mostrando interacção com o Visual Studio 201 0. Não painéis personalizados. O capítulo de Controlos inicia ficando de fora uma abordagem sobre Assemblies e com apresentação da hierarquia de controlos e em Pacotes 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 controlos objectivo de “ensinar o generalistas, é o caso da Datagrid e Chart. programador que se está a iniciar No quarto capítulo, Recursos, é feita uma abordagem na 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 a servem de suporte ao desenvolvimento de aplicações apresentação de recursos XAML, sendo abordado os Silverlight, de destacar o conceito XAML, dependency conceitos ResourceDictionary, MergedDicionary e properties e attached properties, routed events e StaticResource. comandos, incluindo implementação prática destes conceitos. Personalização de Controlos, é o quinto capítulo, onde é abordado os conceitos relacionado com Nos 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
  • 71. ANÁLISE S i l ve rl i gh t 4. 0 – C u rs o C o m p l e to que 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 de dados. 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 do mencionadas referências de leitura opcional. Silverlight com uma página de HTML, como é controlada a interacção entre os restantes DataBinding, é o sexto capítulo, a introdução do componentes existentes numa página e o código de conceito 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, usando a interface INotifyPropertyChanged, os vários modos De salientar que ao longo da de binding, conversores e utilização de bindings em XAML. A validação de dados, faz parte deste capítulo, leitura, deparamo-nos com o sendo feito comparação entre a implementação da recurso de diagramas para interface IDataErrorInfo e INotifyDataErrorInfo. O mostrar a relação entre classes; capítulo termina com a exemplificação de binding em colecçõ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 que No 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 Storage shapes, 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árias animações que estão disponíveis em Silverlight, Aplicação Out of Browser, é um dos capítulos muito sendo apresentado em seguida alguns exemplos relevantes deste livro e nele apresentado algumas práticos. Faz referência a animações com Keyframes considerações importantes, configurações e e Frame-a-frame e faz ainda algumas considerações desinstalação de aplicações, detecção do host de sobre 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 full Expression Blend, no entanto esta ferramenta está trust entre outras funcionalidades específicas. Por fim fora de âmbito do livro. termina com Debugging de aplicações out of the browser sendo feita uma abordagem com o Visual Média é o capítulo que apresenta os conceitos Studio. relacionadas com ficheiros de multimédia, sendo os mais relevantes MediaElement e MedialPlayer. È feita No último capítulo, Segurança aborda o modelo de uma 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
  • 72. ANÁLISE Si l ve rl i gh t 4. 0 – C u rs o C o m p l e to consideraçõ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-nos com o recurso de diagramas para mostrar a relação Em conclusão, este livro aborda os conceitos de entre classes; uso de imagens de apoio à Silverlight 4.0, está bem organizado em termos de compreensão de conceitos; destaque e notas de conteúdo, é de fácil leitura e é um bom guia para aspectos mais ou menos relevantes, orientando o quem vai iniciar ou para quem já tem alguns leitor a poder complementar a sua leitura com outros conhecimentos nesta tecnologia. recursos; apresentação de exemplos práticos e em alguns casos é apresentada a implementação de conceitos. Um aspecto que pode ser melhorado é na apresentaçã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