Você está na página 1de 61

EDITORIAL

EQUIPA PROGRAMAR

try: keepUpWork: Except Error: print again break

Coordenador
Antnio Pedro Cunha Santos

Tentamos Ousamos falhar, tentamos de novo E no final do dia, tentamos


outra vez!

Editor
Antnio Pedro Cunha Santos
Design
Srgio Alves
Twitter: @scorpion_blood
Redaco
Fbio Pinho
Fernando Martins
Igor Nunes
Joo Silva
Lus Soares
Nuno Santos
Paulo Morgado
Sara Silva
Staff
Antnio Santos
Antnio Silva
Jorge Paulino
Rita Peres
Rui Gonalves
Contacto
revistaprogramar@portugal-aprogramar.org
Website
http://www.revista-programar.info
ISSN
1 647-071 0

Esta semana vi um cartoon engraado sobre o desenvolvimento de


aplicaes open-source! Achei particularmente caricato, pelas semelhanas do
cartoon com esta nossa e vossa revista. Vou tentar codificar o cartoon em palavras,
apesar do sucesso ser pouco provvel! No cartoon aparecia como ttulo: O que as
pessoas pensam sobre como as aplicaes open-source so feitas e tinha vrios
grupos de pessoas, a trabalharem simultaneamente em ideias a construir algo, a
testar a construir, a idealizar E abaixo tinha uma segunda quadricula intitulada O
que realmente acontece, onde se via um sujeito solitrio, com aspecto de cansado
com o balo de fala onde se lia let me just close one more ticket before sleep, e viase no fundo um relgio onde as horas marcavam perto de 2h da manh. Era mais ou
menos isto. Recomendo verem a imagem original na web, pois bem mais ilustrativa
e engraada.
De facto tantos projectos so comeados por um monte de gente e mantidos
por um idealista que fica acordado todas as noites at altas horas, apenas para
manter o projecto vivo. De certa forma com este projecto que a revista,
exactamente isso que acontece! As pessoas pensam algo, mas a realidade
ligeiramente diferente! Caricata coincidncia!
Cada noite passada a programar faz-me pensar na nostalgia de outros
tempos em que programar era mais desafio que trabalho, era mais prazer que
ocupao, era mais paixo que dever Era como escrever num newsgroup a
resposta a algo, ou partilhar aquela coisa que a gente tinha acabado de fazer,
apesar das horas j irem bem avanadas e o dia j se fizesse notar, por entre as
janelas fechadas.
Toda esta nostalgia me fez lembrar o gosto que pessoalmente tenho em editar esta
revista. As horas que ela consome a todos ns que a fazemos e o gosto que temos
em faz-lo. As vezes que pensamos que no vamos conseguir, mas continuamos
em frente e almejamos mais! Porque na realidade somos programadores! Isso de
alguma forma est no nosso ADN.
Por todas estas razes, pela nostalgia e o gosto de trabalhar nesta edio
prometemos continuar o trabalho, aprendendo, superando, tentando de novo!
"Porque ns, programadores, somos gente de ideias, e no desistimos!

Por isso e por muito mais Programar ontem, hoje e amanh!


At prxima edio.

Antnio Santos

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

NDICE
TEMA DE CAPA
6

Estendendo uma aplicao criada no App Studio da Microsoft (Sara Silva)

A PROGRAMAR
13

JSF - Parte 3 (Managed beans) (Lus Soares)

15

Pascal Array de argumentos (Igor Nunes)

19

Criar uma aplicao para Android com mapa (Joo Silva )

26

C# CRUD (Create, Read, Update & Delete) (Fbio Pinho)

COLUNAS
34

C# - Novas Funcionalidades Do C# 6.0 Anteviso De Abril De 2014 (Paulo Morgado)

40

Visual(NOT)Basic - Mtodos de extenso o que preciso, como quero (Srgio Ribeiro)

43

CoreDump - Programador ^ Gestor (Fernando Martins)

ANLISES
46

Segurana em Redes Informticas (4. Ed. Aumentada) (David Sopas)

47

Estruturas de Dados e Algoritmos em C (Nuno Santos)

COMUNIDADES
49

Comunidade NetPonto Criando aplicaes Windows Phone 8.1 e Windows 8.1 usando o App Studio da Microsoft
(Sara Silva)

NO CODE
55

O Windows Phone 8.1 e a atualizao do Windows 8.1 (Sara Silva)

EVENTOS
27 de Maio a 26 de Junho - OpenDays Engenharia Informtica IPVC
13 a 14 de Outubro RubyConf

Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-programar.pt

NOTICIAS
Dar Voz ao AVC" aplicao informtica para ajuda a pessoas com AVC

Portugus garante lugar no muro da


fama da Adobe

Dar Voz ao AVC" uma aplicao de software recentemente


desenvolvida por Fethi Houita, ex-aluno do curso de Engenharia Informtica [LEInf ] da Escola Superior de Tecnologia e
Gesto do Instituto Politcnico de Viana do Castelo [ESTGIPVC].

Um jovem de Leiria garantiu um lugar no "muro da fama" dos


caadores de bugs da Adobe, com a descoberta de uma falha
que permitia injetar cdigo malicioso.
Manuel Sousa, 17 anos, garantiu um lugar na lista de programadores que descobrem bugs e falhas de segurana nas
solues da Adobe. A entrada nesta pgina que disntingue
descobridores de falhas ocorreu h trs semanas, depois de
alertar os responsveis da Adobe para uma falha que poderia
ser usada para ataques de Cross Site Scripting (XSS).

A aplicao (app) visa poder dotar as pessoas que sofreram


AVC (e ficaram afsicas), de uma ferramenta para poder expressar sentimentos, emoes, e desejos simples. uma
aplicao que emula parte do trabalho do terapeuta da Fala,
com elementos de comunicao alternativa que, em vez de
estarem no papel, so dotados de maior interactividade e tm
som, comportando mais vantagens.

A falha permitia injetar cdigo-fonte na pgina, precisamente


naqueles nmeros de navegao que costuma estar no fundo
de algumas pginas de procura, para avanar de uma pgina
para as seguintes, explica Manuel Sousa num e-mail enviado para a Exame Informtica.

Nem todas as pessoas que sofreram AVC e tm afasia podero usar a app, porque necessitam que a compreenso esteja
intacta e de possuir recursos intelectuais e cognitivos para
utilizar o tablet e a app.

Os ataques de XSS distinguem-se por permitirem a insero


de cdigos que alteram parte ou a totalidade de um site. Este
tipo de falhas pode ser usada para alterar a aparncia do site,
ou, numa variante mais comum e grave, para inserir mdulos
que aparentam pertencer ao site legtimo, mas que na verdade encaminham os internautas para um endereo malicioso,
que poder ser usado para suportar estratagemas que desviam dados confidenciais.

Para Jorge Ribeiro, atual coordenador do curso de Engenharia Informtica, este e outros projetos de ex-alunos refletem o
conhecimento e as competncias adquiridas ao longo do curso, possibilitando-lhes reunir um conjunto de competncias e
know-how na rea da Engenharia Informtica. Reflete tambm o facto de permitir aos alunos estarem preparados para
saber fazer e por as mos na massa, refletindo-se o seu
desempenho na elevada taxa de empregabilidade e na boa
reputao do curso por parte dos empregadores, quer a nvel
regional, nacional e internacional.

Segundo Manuel Sousa, a falha afetava todo o domnio adobe.com, no sendo necessrio o utilizador estar registado no
site da companhia que produz o Photoshop para se tornar
vtima de um hacker que tentasse explorar a vulnerabilidade

Adicionalmente, este mais um exemplo de sucesso em empreendedorismo.

O jovem de Leiria descobriu a falha ao cabo de uma semana


de anlise ao site principal da Adobe. A companhia demorou
cerca de um ms a remendar a vulnerabilidade reconhecendo o mrito do jovem finalista do secundrio com a atribuio
de um lugar no muro da fama dos caadores de bugs.

Link da aplicao: https://play.google.com/store/apps/details?


id=darvozao.avc
Link para a pgina de Fethi Houita, ex-Aluno ESTG-IPVC:
fr.linkedin.com/pub/fethi-houita/4b/627/185

No a primeira vez que Manuel Sousa garante uma entrada


direta para um dos muros da fama dos caadores de bugs: no
incio do ano, o jovem de 17 anos recebeu idntica distino
da Google s que dessa vez a descoberta de uma falha
XSS valeu-lhe tambm um prmio de 3000 dlares.

Fonte IPVC.pt

S costumo realizar testes em sites que tm programas j


estabelecidos para ajudar os "caadores" a reportarem falhas.
Algumas dessas empresas oferecem prmios monetrios,
distines nos muros da fama, ou apenas brindes, explica.
Alm da Google e da Adobe, Manuel Sousa tambm se distinguiu com a descoberta de uma falha no Portal das Finanas
que permitia ataques de phishing e o consequente desvio de
dados dos internautas.
Fonte exameinformatica.sapo.pt
Blog: http://manuel-sousa.blogspot.pt/

TEMA DE CAPA
Estendendo uma aplicao criada no App Studio da Microsoft

TEMA DA CAPA
Estendendo uma aplicao criada no App Studio da Microsoft
Este artigo tem como objetivo explicar como extender uma
aplicao que foi inicialmente gerada pelo App Studio da
Microsoft.
No meu ltimo artigo, Criando aplicaes Windows Phone
8.1 e Windows 8.1 usando o App Studio da Microsoft, foi
apresentado o servio da App Studio, os vrios tipos de
templates para criar aplicaes, as vrias fases do
desenvolvimento da aplicao no servio e por fim a gerao
dos pacotes e a obteno do cdigo.

Para adicionar o feed do Twitter, iremos ter uma nova


sesso chamada Twitter. Esta seco pode ser criada no
App Studio usando uma das opes de seces avanadas,
a Collection.

Atualmente o App Studio no tem suporte para feed do


Twitter, no entanto possvel extender a aplicao para
suportar esta funcionalidade, ora vejamos como o podemos
fazer.
Na aplicao do Contoso Ltd, criada a partir de um template
fornecido pelo App Studio temos vrias seces:

About us uma seco do tipo HTML

Catalog uma seco do tipo coleo dinmica

Team uma seco do tipo coleo dinmica

News uma seco do tipo Bing

Contact us uma seco do tipo Menu, que contm


aes de menus.

Ao criar a seco do tipo Collection, temos que definir o


Nome, escolher a opo Dynamic resources data in the
cloud e em seguida clicar em Add default columns (ir criar
toda a estrutura de dados necessria para a coleo, caso o
utilizador pretenda criar a sua prpria estrutura deve usar a
opo Create new).

TEMA DA CAPA
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
Em seguida da pgina de detalhe:

O resultado ser o seguinte,

Por fim vamos criar uma entrada falsa, no separador de dados:

Depois de confirmar, iremos ter mais uma seo na pgina


de contedos

Como referi no meu artigo anterior, podemos alterar a ordem


das sees, fazendo arrastar e largar (Drag & Drop), desta
forma iremos ter

possvel importar dados de um ficheiro CSV ou inserir manualmente, neste caso, apenas foi criada uma entrada manualmente.
De seguida, devemos editar a seo Twitter, para definir
uma entrada de dados para teste e para definir os Bindings
do DataTemplates.

Neste momento, estamos prontos para gerar novos pacotes


e com isto obter nova verso do cdigo fonte, para assim
continuar o desenvolvimento no Visual Studio 2013.

Comecemos por definir os Bindings, primeiro da pgina


principal:

No Visual Studio, o projeto ir ter a seguinte estrutura:

AppStudio.Windows projeto para a aplicao Windows 8.1

AppStudio.WindowsPhone projeto para a aplicao


Windows Phone 8.1

TEMA DA CAPA
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT

AppStudio.Shared projeto partilhado pelas duas


aplicaes

AppStudio.BackgroundAgent projeto que d suporte


a background agents

AppStudio.Data projeto que consiste numa portable


class library e contm toda a informao sobre a estrutura de dados usadas nas duas aplicaes e contm ainda os providers de dados (facebook, feeds,)

O resultado do deploy da aplicao no Windows Phone


(seco do Twitter)

Para alterar esta pgina, para que use dados reais do Twitter
necessrio fazer algumas alteraes no projecto AppStudio.Data

TEMA DA CAPA
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
Em TwitterDataSource, devemos alterar o mtodo LoadData
para:

public
async
Task<IEnumerable<TwitterSchema>>
LoadData()
{
if (_data == null)
{
try
{
var serviceDataProvider =
new TwitterDataProvider();
_data = await serviceDataProvider.Load();
}
catch (Exception ex)
{
AppLogs.WriteError
("TwitterDataSource.LoadData",
ex.ToString());
}
}
return _data;
}

Para obter as chaves

const
const
const
const

string
string
string
string

ConsumerKey = ".";
ConsumerSecret = "";
AccessToken = " ";
AccessTokenSecret = "";

dever aceder ao dev.twitter.com e criar uma aplicao e em


seguida obter as chaves.
necessrio instalar o pacote do Nuget linqtoTwitter no projeto AppStudio.Data, mas como este projeto uma Portable
Class Library com targets para Windows Phone 8.1 e Windows 8.1, a instalao do pacote ir falhar. Para dar a volta a
este problema, uma vez que ainda no existe uma atualizao, deve-se instalar o pacote no projecto AppStudio.Windows e depois no projecto AppStudio.Data, deve-se
fazer Add Reference>Browser e em seguida procurar pela
pasta que contm o pacote instalado, que ser algo do gnero

Em vez de usar o ServiceDataProvider devemos criar o TwitterDataProvider que ser


public class TwitterDataProvider
{
TwitterContext twitterCtx;

App\packages\linqtotwitter.3.0.2\lib\portablewin8+net45+wp8 e deve-se selecionar a dll LinqToTwitterPcl.dll e assim o projeto AppStudio.Data ir ter a referncia do LinToTwitterPcl.

public TwitterDataProvider()
{
var auth = new SingleUserAuthorizer()
{
CredentialStore =
new SingleUserInMemoryCredentialStore
{
ConsumerKey = ConsumerKey,
ConsumerSecret =
ConsumerSecret,
AccessToken = AccessToken,
AccessTokenSecret =
AccessTokenSecret
}
};
}

return data;

Depois de correr a aplicao iremos ter o seguinte resultado,


para Windows Phone 8.1

twitterCtx = new TwitterContext(auth);

public async Task


<IEnumerable<TwitterSchema>> Load()
{
var searchresults = await (from tweet
in twitterCtx.Search where tweet.Type
== SearchType.Search && tweet.Query ==
"#contoso" && tweet.Count == 100
select tweet).SingleOrDefaultAsync();
var data = new List<TwitterSchema>();
foreach (var status in
searchresults.Statuses)
{
data.Add(new TwitterSchema()
{
Title = status.User.Name,
Description = status.Text,
ImageUrl =
status.User.ProfileImageUrl,
Subtitle =
status.CreatedAt.ToString("t")
});
}

Seco da pgina principal

Pgina de detalhes

A verso Windows 8.1 tem o seguinte aspeto

TEMA DA CAPA
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
</ListView>
<ProgressBar Width="380" Height="40"
Foreground="White" VerticalAlignment="Top"
IsIndeterminate="True" Visibility="{Binding
ProgressBarVisibility}" />
</Grid>
</DataTemplate>
<!-- ListPhotoLeftDescription Item -->
<DataTemplate x:Key="TwitterItem">
<Grid Width="380">
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Grid.Row="0" Grid.Column="0"
Margin="0, 8" Source="{Binding ImageUrl}"
MaxHeight="50" MaxWidth="50"
Stretch="UniformToFill"
VerticalAlignment="Center" />

Como se pode observar o aspeto da interface para a seco


do Twitter, no muito agradvel e como tal podemos alterar
o cdigo XAML para assim obtermos um resultado melhor.
Outro aspeto que podemos alterar o facto de ao clicar no
item navegamos para a pgina de detalhe, o que neste caso
no faz muito sentido porque ir apresentar a mesma informao que na pgina inicial, por tanto iremos remover.

<StackPanel Grid.Row="0"
Grid.Column="1">
<TextBlock Margin="16, 8, 5, 10"
Style="{StaticResource ItemHeaderWrapText}"
MaxHeight="50" VerticalAlignment="Center"
Text="{Binding Title,
Converter={StaticResource TextPlainConverter},
ConverterParameter=140}" />
<TextBlock Margin="16, 8, 5, 10"
Style="{StaticResource ItemSubheaderText}"
MaxHeight="110" VerticalAlignment="Top"
Text="{Binding Subtitle}" />
</StackPanel>

No projeto de cada aplicao, podemos encontrar uma pasta


chamada Views que contm uma pasta chamada DataTemplates, que por sua vez contm o dicionrio de recursos para
cada seco. Se abrirmos o ficheiro TwitterViews, encontramos o DataTemplate TwitterItem que representa cada item
do feed do Twitter.

<TextBlock Grid.Row="1"
Grid.ColumnSpan="2" Margin="0, 0, 5, 0"
Style="{StaticResource ItemSmallText}"
MaxHeight="200" VerticalAlignment="Top"
Text="{Binding Description}" />
</Grid>
</DataTemplate>
Para a verso de Windows 8.1, podemos alterar

Para a verso do Windows Phone 8.1, podemos alterar


<DataTemplate x:Key="TwitterList">
<Grid>
<ListView ItemsSource="{Binding
Items}" SelectedItem="{Binding
NavigationItem, Mode=TwoWay}"
SelectionMode="None"
IsSwipeEnabled="False"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
ItemTemplate="{StaticResource
TwitterItem}">

10

<DataTemplate x:Key="TwitterListSnapped">
<Grid Width="230">
<GridView ItemsSource="{Binding PreviewItems}" SelectedItem="{Binding NavigationItem,
Mode=TwoWay}"
SelectionMode="None"
IsSwipeEnabled="False"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
ItemTemplate="{StaticResource
TwitterItemSnapped}">
</GridView>
<ProgressBar
Height="40"
Foreground="White" VerticalAlignment="Top" IsIndeterminate="True" Visibility="{Binding ProgressBarVisibility}" />
</Grid>
</DataTemplate>
<!-- ListPhotoLeftDescription Item -->
<DataTemplate x:Key="TwitterItem">
<Grid Width="480" Height="240">
<Grid.RowDefinitions>
<RowDefinition Height="0"/>
<RowDefinition Height="130"/>
<RowDefinition Height="160"/>

TEMA DA CAPA
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

E para Windows 8.1 iremos ter

<Image Grid.Row="1" Grid.Column="0" Margin="0, 8"


Source="{Binding ImageUrl, Converter=
{StaticResource ThumbnailConverter},
ConverterParameter=220}" MaxHeight="110"
Stretch="UniformToFill"
VerticalAlignment="Top" />
<StackPanel Grid.Row="1"
Grid.Column="1" Orientation="Vertical">
<TextBlock
Margin="16, 0, 10,
0" Style="{StaticResource ItemHeaderWrapText}"
MaxHeight="50"
VerticalAlignment="Center" Text="{Binding Title,
Converter={StaticResource TextPlainConverter},
ConverterParameter=140}" />
<TextBlock Margin="16, 8, 10,
10" Style="{StaticResource ItemSubheaderText}"
MaxHeight="110"
VerticalAlignment="Top" Text="{Binding Subtitle,
Converter={StaticResource TextPlainConverter},
ConverterParameter=280}" />
</StackPanel>
<TextBlock Grid.Row="2"
Grid.ColumnSpan="2" Margin="0, 0, 10, 0"
Style="{StaticResource ItemSmallText}"
MaxHeight="60"
VerticalAlignment="Top"
Text="{Binding Description}" />
</Grid>
</DataTemplate>

Em concluso, conclui-se que muito simples extender a


aplicao gerada pelo App Studio, no entanto no possvel
fazer o upload desta verso para o App Studio, todas as
alteraes feitas na aplicao no App Studio implicam um
merge entre verses.

E assim obtemos um novo aspeto da aplicao, para Windows Phone 8.1 iremos ter:

AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra e Microsoft Certified Profissional Developer. Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps. O seu Blog
www.saramgsilva.com e o twitter @saramgsilva.

11

A PROGRAMAR
JSF - Parte 3 (Managed beans)
Pascal array de argumentos
Criar uma aplicao para Android com mapa
C# CRUD (Create, Read, Update & Delete)

A PROGRAMAR
JSF - Parte 3 (Managed beans)
Este o 3 artigo da srie. Assume portanto que j tem um
projeto de exemplo JSF a funcionar. altura de fazer algumas experincias, nomeadamente criar um backing bean.

clientesBean (tcnica conhecida como convention over


configuration). Para tal, anote a classe com as anotaes
@ManagedBean e @SessionScoped (disponveis em javax.faces.bean).

Um backing bean uma classe Java que responde a pedidos e gere o estado dos componentes JSF. uma espcie
de servlet de alto nvel. Entre vrias outras funes, faz a
ligao camada dos servios que pode ser uma BD, um
servidor remoto ou outro. Uma aplicao pode conter mltiplos backing beans.

Os backing beans mais conhecidos em Java so os


managed beans e os named beans (ou CDI beans). Os
primeiros so mais comuns; os segundos mais flexveis. Os
conceitos so muito semelhantes. Usaremos os primeiros
devido facilidade de utilizao e porque o Tomcat apenas
suporta esses.

package pt.revista.programar;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class ClientesBean implements Serializable
{
String nome;
public string getNome(){
return nome;
}

Um managed bean representa o Controller no padro MVC.


Caracteriza-se consoante o seu mbito (scope). Os mais
importantes so:
}

Application: o bean persiste na aplicao estando disponvel para todas as sesses;

Session: o bean existe por utilizador; til para dados referentes ao que utilizador est a fazer durante um periodo de
utilizao;

Public void setNome(String nome) {


this.nome = nome;
}
Agora, na pasta Web Pages, v a index.html e
dentro de h:body coloque o seguinte cdigo:

<h:form>
<h:inputText Value="#{clientsBean.nome}" />
<h:commandButton Acton="resultado
"value="enviar" />
</h:form>

View: semelhante ao session, mas por tab; como que


se cada tab do browser representasse uma sesso diferente;

Tal cdigo ir comunicar com o managed bean criado anteriormente. O boto ir submeter o formulrio.

Request: a nica gesto de estado que existe dura apenas


o pedido e por isso o mais leve.

6.

Agora precisamos da pgina para onde seremos redirecionados.


Teremos
de
cham-la
de
resultado.xhtml para que a action no boto anterior
seja respeitada.Para criar est pgina carregue com o
boto direito sobre Web Pages > New > Other >
Web > XHTML > Next; d-lhe o nome resultado
e faa Finish.

7.

Apague todo o contedo e copie o contedo de


index.html.

8.

Vamos apenas substituir o contedo de h:body de


maneira a ficar:

Para exemplificar como funciona um managed bean criemos um. Para efeitos de aprendizagem, comecemos com um
bean de sesso, o que apresenta menos desafios. Para tal,
aps ter o projeto JSF (criado no artigo anterior) aberto:

Agora, crie uma propriedade com getter/setter chamada nome. Ficar com o seguinte cdigo:

Clique com o boto direito do rato em Source Packages e faa New > Java Class:

2. D-lhe o nome de ClientesBean e coloque-o no package pt.revista.programar.

<h:body>
<h:outputText value="Boa tarde #
{clientesBean.nome}" />
</h:body>

3. O bean criado estar automaticamente disponvel para


ser usado nos XHTML sob a forma de

13

A PROGRAMAR
JSF - PARTE 3 (MANAGED BEANS)
9.

Agora est tudo em ordem. J temos uma pgina que


recebe o seu nome, um bean que o guarda e uma pgina que o exibe. Para ver tudo em ao, clique com o
boto direito no projeto e faa Run.

O JSF um mundo construdo em cima das tecnologias que j


conhece (HTTP, servlets, JavaScript, etc.), pelo que por vezes
estranho que seja to alto nvel. Aps alguns anos a us-lo
posso garantir que depois do perodo inicial de aprendizagem,
compensa: a velocidade de desenvolvimento aumenta consideravelmente e damos por ns a fazer coisas muito complexas
em
muito
pouco
tempo.

() uma espcie
de servlet de alto nvel. Entre vrias outras funes, faz a ligao camada dos servios que pode ser
uma BD, um servidor
remoto ou outro ()Um
managed bean representa o Controller no
padro MVC ()
Isto porque provvel que ele resolva o nosso problema e
no seja preciso escrever cdigo especfico. Seja chamadas
Ajax, personalizao do componente, utilizao da query
string, entre outros, o JSF j pensou nisso. Se precisamos
de um componente mais avanado, existem as bibliotecas
de componentes (ICEfaces, RichFaces, PrimeFaces), que
trazem componentes muito ricos, flexveis e funcionais.
improvvel que tenhamos de recorrer a cdigo JavaScript
para operaes comuns; a ideia de usar uma framework
server-side mesmo essa: ser tudo personalizvel por via
dos atributos XHTML dos componentes.

H que assinalar tambm que, ao usar JSF, devemos tentar


sempre conhecer e fazer uso das suas funcionalidades.

Espero que tenha gostado do artigo. Qualquer dvida, sintase vontade para me contactar. Consoante o interesse da
comunidade poderei escrever mais artigos sobre o tema,
nomeadamente sobre a integrao e utilizao do PrimeFaces.

AUTOR
Escrito por Lus Soares
Formado em Engenharia Informtica e de Computadores no Instituto Superior Tcnico (Licenciatura e Mestrado). Sou web
developer, _tendo j colaborado em projetos de telecomunicaes e dos _media. Gosto de linguagens de alto nvel, de reutilizar cdigo, de refactoring para simplificar. Gosto de ensinar. Escrevi um livro sobre jQuery (goo.gl/nw2Zb).
Os meus contactos esto em luissoares.com para qualquer dvida sobre o artigo ou outra informao.

14

A PROGRAMAR
Pascal array de argumentos
A definio da linguagem Pascal estabelece desde os seus
primrdios regras bastante rgidas acerca da passagem de
argumentos a uma funo ou procedimento. No seu conjunto, uma das consequncias destas regras a impossibilidade de se implementarem funes varidicas, isto , funes com um nmero indefinido de argumentos s quais
podemos fornecer virtualmente uma infinidade de argumentos, no havendo a restrio de ser possvel passar apenas
N argumentos em determinada ordem e com determinados
tipos.

tm os seus dados contguos em memria semelhana de


um array esttico e ao contrrio das listas ligadas.

Vrias linguagens permitem a implementao de funes


varidicas, como por exemplo C e at Haskell (com recurso
a alguns truques que envolvem aspectos avanados dos
tipos de dados).

function Average(list : array of byte) : real;

Da mesma forma, deixou de ser obrigatria a criao de


tipos de dados para a passagem de arrays em argumentos.
Se antes era necessrio um tipo para cada dimenso e um
procedimento para cada tipo, o trabalho do programador fora
imensamente facilitado.
Por exemplo, pode-se receber um array de nmeros inteiros
de pequena dimenso e sem sinal da seguinte forma:

Recorrendo s funes Low e High, e mais recentemente


com a estrutura de repetio for-in, torna-se simples iterar
os elementos do array.

O facto de Pascal no permitir a implementao de funes


varidicas pode suscitar algumas dvidas. Mtodos standard
que formam a base do Pascal so aparentemente varidicos,
como o writeln e o readln. No entanto, estes mtodos no
so exactamente funes ou procedimentos verdadeiros. A
sua implementao no definida em termos da linguagem
Pascal (que, como foi dito, no permite este tipo de definies); so apenas instrues que o compilador trata de forma especial para nos permitir utiliz-las como se fossem
varidicas.

FUNCTION AVERAGE(LIST : ARRAY OF BYTE) : REAL;


VAR I : BYTE;
BEGIN
AVERAGE := 0.0;
FOR I:=LOW(LIST) TO HIGH(LIST) DO
AVERAGE := AVERAGE + LIST[I]);
AVERAGE := AVERAGE / LENGTH(LIST);
END;
Outra caracterstica de elevado interesse o facto de se
poder passar um fragmento de um array. Vejamos o seguinte
exemplo:

Todavia, o rio no encontra a sua foz neste ponto. Apesar de


esta funcionalidade no ser permitida, existe uma forma de a
simular. Compiladores e dialectos mais recentes, como o
Delphi e o Free Pascal, permitem a passagem de arrays de
argumentos, a qual tem por princpio a passagem de arrays
abertos, conceito que ser brevemente revisto.

VAR XS : ARRAY[1..20] OF BYTE;


// ...
WRITELN(AVERAGE(XS[10..20]):0:3);
Neste caso, apenas do nosso interesse calcular a mdia
da segunda metade do array xs. Portanto, definimo-lo com a
sintaxe xs[10..20]. Desta forma, apenas os elementos do
ndice 10 ao 20 so passados funo Average.

Todo o cdigo presente neste artigo foi compilado recorrendo ao Free Pascal Compiler, verso 2.6.2, em ambiente Windows, sendo totalmente portvel para outras plataformas.

Todas estas funcionalidades compe aquilo a que se denomina de passagem de arrays abertos (em ingls, open
arrays): a possibilidade de receber um array sem conhecimento prvio da sua dimenso, bem como a possibilidade de
realizar a passagem parcial de um array.

Passagem de open arrays


Quando o Pascal foi dado a conhecer ao mundo em 1971,
os arrays eram estticos, com uma dimenso bem definida,
uma vez que na altura no fora ainda introduzido o conceito
de array dinmico.

Passagem de um array de argumentos


A evoluo da passagem de arrays abertos levou naturalmente implementao de uma funcionalidade til: o array
of const.

Com o evoluir da linguagem, este conceito foi implementado,


e pela primeira vez os arrays no necessitavam de ter uma
dimenso bem definida esta podia ser controlada em runtime. Dadas as suas caractersticas, tornou-se uma forma de
criar o equivalente a pequenas listas ligadas com muito maior segurana uma vez que a gesto de recursos no fica a
cargo do programador. De referir que os arrays dinmicos

Classicamente, os elementos de um array so de um tipo


bem definido. No entanto, const uma palavra reservada
que define constantes. Desta forma, um array of const define
algo diferente: um array cujos elementos so constantes
de tipo indefinido.

15

A PROGRAMAR
PASCAL ARRAY DE ARGUMENTOS
Como primeira nota, h que referir que estruturas no podem
ser passadas nestes arrays. Apenas tipos de dados simples
(tipos numricos, alfanumricos e apontadores), objectos, classes e interfaces podem.
Vamos criar um procedimento que recebe um array of const e
nos d informaes acerca dos argumentos recebidos:
PROCEDURE FOO(ARGS : ARRAY OF CONST);
Quando o procedimento recebe este array, ocorre uma converso dos seus elementos para um record variante com caractersticas particulares. Segundo a documentao do Free Pascal,
esta a sua definio:
TYPE
PTRINT = LONGINT;
PVARREC = ^TVARREC;
TVARREC = RECORD
CASE VTYPE : PTRINT OF
VTINTEGER
:
(VINTEGER: LONGINT);
VTBOOLEAN
:
(VBOOLEAN: BOOLEAN);
VTCHAR
:
(VCHAR: CHAR);
VTWIDECHAR
:
(VWIDECHAR: WIDECHAR);
VTEXTENDED
:
(VEXTENDED: PEXTENDED);
VTSTRING
:
(VSTRING: PSHORTSTRING);
VTPOINTER
:
(VPOINTER: POINTER);
VTPCHAR
:
(VPCHAR: PCHAR);
VTOBJECT
:
(VOBJECT: TOBJECT);
VTCLASS
:
(VCLASS: TCLASS);
VTPWIDECHAR :
(VPWIDECHAR: PWIDECHAR);
VTANSISTRING :
(VANSISTRING: POINTER);
VTCURRENCY
:
(VCURRENCY: PCURRENCY);
VTVARIANT
:
(VVARIANT: PVARIANT);
VTINTERFACE :
(VINTERFACE: POINTER);
VTWIDESTRING :
(VWIDESTRING: POINTER);
VTINT64
:
(VINT64: PINT64);
VTQWORD
:
(VQWORD: PQWORD);
END;

tes aos argumentos no pode ser feito da forma tradicional:


um array clssico tem os seus elementos armazenados em
reas contguas de memria em que cada elemento ocupa
exactamente N bytes. Neste caso, cada argumento ter a
sua localizao num bloco da memria distinto. Isto explica o
facto de haver um apontador (o tipo PVarRec).
Conclui-se que um array of const , em ltima instncia, um
array of TVarRec dentro do procedimento ou funo. Mas
ateno, nunca se deve declarar o argumento desta forma!
PROCEDURE FOO(ARGS : ARRAY OF TVARREC);
Para implementar esta funo, vamos primeiramente definir
o seu objectivo:

Receber um array of const e devolver, no monitor, o


tipo de dados de cada argumento, assim como o seu
valor ou nome.

Para tal, ser til controlar quantos argumentos foram passados. Esta informao pode ser obtida com a funo Length.
Caso no haja argumentos, iremos mostrar a mensagem
Sem argumentos.
PROCEDURE FOO(ARGS : ARRAY OF CONST);
VAR I : SMALLINT;
BEGIN
IF LENGTH(ARGS) > 0 THEN
// ANLISE DOS ARGUMENTOS
ELSE
WRITELN('SEM ARGUMENTOS.');
END;
Para proceder anlise dos argumentos, iremos iterar pelos
elementos do array. Sendo este um open array, cuja dimenso desconhecemos, necessitaremos das funes Low e
High que devolvem, respectivamente, os ndices menor e
maior do array (isto , as posies do primeiro e ltimo elemento).
FOR I:=LOW(ARGS) TO HIGH(ARGS) DO
// ANLISE DOS ARGUMENTOS
No sendo objectivo do presente artigo fazer uma explorao exaustiva de todos os tipos de dados possveis de serem
passados no array of const, iremos tratar apenas os mais
comuns e alguns que possuem algumas particularidades.

Portanto, cada elemento ser um record no qual o campo


VType indica qual o tipo de dados do argumento, e conforme o
valor deste campo haver um segundo que contm o valor do
argumento. Por exemplo, se VType for vtString, ento o argumento do tipo ShortString (comummente designado apenas
como string), e o seu valor pode ser acedido atravs do campo
VString.
Uma vez que cada elemento pode ter um tamanho em bytes
diferente dos restantes, o armazenamento dos dados referen-

16

Como foi referido, os elementos do array so convertidos ao


record infra-apresentado, pelo que possuem campos. Naturalmente, uma estrutura de deciso case-of ir analisar o
valor do campo vtype, informando acerca do tipo de dados
do argumento. Caso no seja conhecido, mostrar-se- a
mensagem desconhecido. Comecemos por analisar um
caso simples: o argumento um Integer. Desta forma, vtype
ir assumir o valor vtInteger (uma constante do tipo LongInt):
CASE ARGS[I].VTYPE OF
VTINTEGER :
WRITELN('INTEGER = ',

A PROGRAMAR
PASCAL ARRAY DE ARGUMENTOS
Sendo um Integer, o campo variante vinteger possui o valor
deste argumento. Notificamos acerca do tipo de dados do argumento, seguido do valor. O mesmo se aplica aos tipos de
dados Boolean e Char.
No entanto, alguns tipos de dados necessitam de uma forma
diferente de aceder ao valor. Alguns campos variantes so, na
verdade, apontadores (o seu tipo de dados comea por P, como por exemplo PShortString). Para alguns destes necessitamos de recorrer ao operador ^, o qual nos indica o valor armazenado no ponteiro que lhe fornecemos (apontador^). Para
outros casos, necessitaremos de fazer type casting uma vez
que os seus tipos de dados permitem a recepo de um apontador, devolvendo automaticamente o valor l armazenado (por
exemplo, o tipo de dados AnsiString).
Comecemos por analisar o tipo de dados Extended:
VTEXTENDED :
WRITELN('EXTENDED = ',
ARGS[I].VEXTENDED^);
Este um caso simples. No entanto, as strings tm algumas
diferenas. No Pascal moderno (leia-se Free Pascal, Object
Pascal e Delphi), no existe apenas um tipo de dados string. O
tipo de dados string apareceu aps o aparecimento do Pascal,
e apenas podia armazenar 255 caracteres. Hoje em dia, existem vrios tipos de dados da famlia da string, sendo os mais
proeminentes os seguintes:

ShortString apenas permite 255 caracteres;

AnsiString null-terminated e no tem limite de caracteres;

WideString semelhante ao AnsiString, cada caracter


ocupa 2 bytes ao invs de apenas 1, e permite armazenar caracteres no formato UTF-16.

zar type casting o programa ir aceder localizao na


memria onde a AnsiString est armazenada, e automaticamente vai process-la:
VTANSISTRING :
WRITELN('ANSISTRING = ',
ANSISTRING(ARGS[I].VANSISTRING));
Para apontadores, e tendo em conta a quantidade de endereos que actualmente uma memria RAM possui, fazemos
type casting para o tipo LongInt de forma a conhecermos o
endereo:
VTPOINTER :
WRITELN('POINTER = ',
LONGINT(ARGS[I].VPOINTER));
Para finalizar, iremos analisar as classes e os objectos. Estes no possuem um valor visto no serem tipos de dados
simples. Apesar disso, possvel passar um objecto ou uma
classe como argumento num array of const. Ambos os tipos
de dados TObject e TClass possuem uma propriedade denominada ClassName. Desta forma, o nosso objectivo neste
procedimento determinar o nome da classe ou objecto a
que pertence o nosso argumento:
VTOBJECT :
WRITELN('OBJECT = ',
ARGS[I].VOBJECT.CLASSNAME);
VTCLASS :
WRITELN('CLASS REFERENCE = ',
ARGS[I].VCLASS.CLASSNAME);
O nosso procedimento Foo ter ento este aspecto:

Desta forma, uma ShortString o equivalente a um array of


char com 255 elementos. Naturalmente, o argumento ser um
ponteiro para a localizao deste array. Internamente, o compilador trata as strings de forma automtica, no sendo, portanto,
responsabilidade do programador determinar onde esta comea e termina (isto difere do C, por exemplo). Bastar, portanto,
aceder ao valor armazenado no bloco de memria indicado
pelo apontador, e ser-nos- devolvido o contedo da ShortString:
VTSTRING :
WRITELN('SHORTSTRING = ',
ARGS[I].VSTRING^);
O tipo AnsiString necessita de ser tratado com um processo
ligeiramente diferente. Uma vez que o campo VAnsiString
do tipo Pointer (ou seja, o tipo de dados do valor armazenado
no endereo desconhecido ou tem uma dimenso indefinida),
no basta recorrer ao operador ^. Como foi dito, o compilador
trata deste processo automaticamente, e sempre que necessrio fornece ao prprio programa ferramentas para gerir estas
strings de forma autnoma. Portanto, bastar neste caso reali-

17

PROCEDURE FOO(ARGS : ARRAY OF CONST);


VAR I : SMALLINT;
BEGIN
IF LENGTH(ARGS) > 0 THEN
FOR I:=LOW(ARGS) TO HIGH(ARGS) DO
CASE ARGS[I].VTYPE OF
VTINTEGER :
WRITELN('INTEGER = ',
ARGS[I].VINTEGER);
VTBOOLEAN :
WRITELN('BOOLEAN = ',
ARGS[I].VBOOLEAN);
VTCHAR :
WRITELN('CHAR = ',
ARGS[I].VCHAR);
VTEXTENDED :
WRITELN('EXTENDED = ',
ARGS[I].VEXTENDED^:0:10);
VTSTRING :
WRITELN('SHORTSTRING = ',
ARGS[I].VSTRING^);
VTANSISTRING :
WRITELN('ANSISTRING = ',
ANSISTRING(ARGS[I].VANSISTRING));
VTPOINTER :
WRITELN('POINTER = ',
LONGINT(ARGS[I].VPOINTER));
VTOBJECT :
WRITELN('OBJECT = ',
ARGS[I].VOBJECT.CLASSNAME);
VTCLASS :
WRITELN('CLASS = ',
ARGS[I].VCLASS.CLASSNAME);
ELSE
WRITELN('DESCONHECIDO!');

A PROGRAMAR
PASCAL ARRAY DE ARGUMENTOS
Como ltima referncia, de notar o output para a varivel
sl: o procedimento informou-nos que esta uma classe,
mais propriamente a classe TStringList.

END
ELSE
WRITELN('SEM ARGUMENTOS.');
WRITELN;
END;

printf criao de bindings para a linguagem C

Ensaio com os arrays de argumentos


Coloquemos o procedimento Foo numa unit denominada ArgMgr (de Argument Manager). Para a testar, iremos importar a
unit classes para podermos testar a passagem de classes e
objectos. Note-se que necessria a compiler directive
{$mode objfpc} para permitir o seu uso.

{$MODE OBJFPC}
PROGRAM ARTIGO45;
// DECLARAO STANDARD DA FUNO
PROCEDURE PRINTF(FMT : PCHAR;
ARGS : ARRAY OF CONST);
CDECL; EXTERNAL 'C';
BEGIN
PRINTF('%S IGUAL A %D.',
['DOBRO DE 3', 6]);
END.

{$MODE OBJFPC}
PROGRAM ARTIGO45;
USES ARGMGR, CLASSES;
VAR S : STRING = 'VARIAVEL S';
SL : TSTRINGLIST;

O Free Pascal oferece uma utilidade que outros compiladores, incluindo o prprio Delphi, no oferecem do mesmo modo. Com os arrays of const, possvel criar facilmente um
binding com a funo printf da linguagem C. O seguinte
cdigo indica como se deve declarar a funo do standard
da linguagem C, exemplificando de seguida o seu uso:

BEGIN
S := TSTRINGLIST.CREATE;
FOO([]);
FOO(['IGOR NUNES', 31]);
FOO([@FOO, NIL, FALSE, 'K']);
FOO([S, SL, 3.14]);
S.FREE;
END.

Conclumos assim a nossa viagem pelos arrays de argumentos, comummente designados apenas por arrays of const, os
quais nos permitem simular procedimentos e funes varidicos. No , decerto, uma das ferramentas mais utilizadas
pelos programadores de Free Pascal, Object Pascal e Delphi. Todavia, um instrumento til que est disposio, o
qual fornece imensa flexibilidade na passagem de argumentos a procedimentos e funes.

Analisemos o output do programa:


Sem argumentos.
AnsiString = Igor Nunes
Integer = 31
Pointer = 471399
Pointer = 0
Boolean = FALSE
Char = K
ShortString = variavel s
Class = TStringList
Extended = 3.1400000000
Repare-se que a varivel s, do tipo string, foi considerada uma
ShortString. Isto acontece uma vez que, por defeito, o Free
Pascal considera que o tipo de dados string se refere ao tipo
ShortString.
Por outro lado, uma string escrita directamente no argumento
considerada uma AnsiString. Mais uma vez, o Free Pascal
assume que uma string escrita directamente como argumento
deste tipo, uma vez que, segundo as actuais regras, estas
strings no tm um tamanho definido e s podem assumir caracteres ASCII por defeito.

AUTOR
Escrito por Igor Nunes
Curioso na rea da tecnologia e em especial da programao, tem uma saudvel relao com o Object Pascal e conhecedor das bases de outras linguagens de programao, como Haskell, C, Python e VB.NET. No P@P, membro da Wiki Team
e Moderador Global.

18

A PROGRAMAR
Criar uma aplicao para Android com mapa
Android
Android um sistema operativo baseado no ncleo do Linux 6
para dispositivos mveis, desenvolvido pela Open Handset
Alliance, liderada pela Google. Segundo a Google, mais de 1
milho de utilizadores. Este sistema foi adoptado por vrias
marcas de topo de mercado HTC, Samsung, Sony, Motorola,
LG e Nokia.

Neste passo possvel dar o nome ao projeto e escolher as


verses para que estar disponvel a aplicao desenvolvida. Neste caso ir correr em dispostivos com verso 11 at
19.

Next

O Android est disponvel com cdigo aberto desde 21 Outubro de 2008. O Google publicou todo o cdigo sob a licena
Apache. No entanto, ele depende de uma autorizao da prprio Google para poder aceder biblioteca de aplicaes, Play
Store.
Com a API do Google Maps v2 para Android, possvel adicionar mapas com base em dados do Google Maps numa aplicao. A API, que lida automaticamente com acesso aos servidores do Google Maps, possui mtodos que permitem adicionar marcadores, polgonos, sobreposies, e ainda mudar a
viso de uma rea do mapa.
Ide
O Ide mais utilizado para o desenvolvimento de android o
Eclipse. A empresa multinacional de servios e software, Google, disponibiliza uma verso optimizada onde permite o download gratuito, em http://developer.android.com/sdk/index.html.
Aps descarregar o IDE tem reunidos os elementos necessrios para o desenvolvimento de aplicaes para o android.
Com o processo de download terminado, ir ter uma pasta de
trabalho contendo o nome: adt-bundle-windows-x86_6420131030 (pode diferir um pouco mediante a verso).

Passos a seguir:

Abrir a pasta adt-bundle-windows-x86_64-20131030 >


eclipse > eclipse.exe > ok

Criar um projecto

File > New > Android Application Project

19

Nesta janela pode escolher o logotipo por defeito ou criar o


seu prprio.

Next

A PROGRAMAR
CRIAR UMA APLICAO PARA ANDROID COM MAPA

Aps garantir que o projeto google_play_services_lib existe,


prosseguir da seguinte forma:

Next

Eclipse > Import > Android > Existing Android Code


Into Workspace> Next

Cada atividade (janela) composta por trs ficheiros e aqui


podemos alterar o seu nome se pretendermos.

Finish

Importar a biblioteca, uma vez que esta permite aceder ao mapa.


Neste passo iremos importar a biblioteca Google Play Services,
ou seja, vamos juntar nossa pasta de trabalho uma pasta que
contem todos os servios de mapas da Ggoogle. Desta forma,
ser-nos- permitido invocar todas as funcionalidades no nosso
projeto.
O projeto est localizado na diretoria adt-bundle-windowsx86_64-20131030
\sdk\extras\google\google_play_services\libproject. Caso no
encontre esta diretoria, deve verificar se o Google Play Services no Android SDK Manager, est instalado, se no estiver
apenas tem de selecionar e descarregar.

20

Passos a seguir:

Browse > ir a pasta de trabalho adt-bundle..XXXXX./


sdk/extras/google/google_play_services/libproject/
google-play-services_lib

A PROGRAMAR
CRIAR UMA APLICAO PARA ANDROID COM MAPA
Passo a seguir:

Select Google-play-services_lib > ok

Ok

Mapa > Properties

Alterar Manifest
Neste momento o projeto est criado, necessrio configurar o ficheiro AndoridManifest.xml. Este ficheiro tem como
objetivo, entre outros, definir as permisses que a aplicao
ter. Imaginemos um exemplo prtico, os mapas da google
permitem saber a nossa localizao. Para isso o nosso
telemvel precisa de utilizar o gps ou a internet, e se essas
permisses no forem dadas neste ficheiro, essa funcionalidade no est disponvel.

Passos a seguir:

Android > Library > add..

Eclipse > Mapa > bin > AndroidManifest.xml

<permission
android:name="<NAMESPACE>
.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<uses-feature android:glEsVersion="0x00020000"
android:required="true"/>
<uses-permissionandroid:name="<NAMESPACE>
.permission.MAPS_RECEIVE"/>
<uses-permissionandroid:name="android.permission.
INTERNET"/>
<uses-permissionandroid:name="android.permission.
WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="com.google.android.
providers.gsf.permission.READ_GSERVICES"/>
<uses-permissionandroid:name=
"android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission
.ACCESS_FINE_LOCATION"/>
<uses-permissionandroid:name="android.permission
.READ_CONTACTS"/>
<uses-permissionandroid:name="android.
permission.ACCESS_NETWORK_STATE"/>

21

A PROGRAMAR
CRIAR UMA APLICAO PARA ANDROID COM MAPA

Logo de seguida inciciar o manifest encontras package=NAMESPACE

Copias o teu namesapce

No
AndroidManifest.xml
trocar
onde
<NAMESPACE> pelo que acabas de copiar

tem

Obter a API_Key

APIs & auth > Credentials > Create New Key > Andorid Key

Passos a seguir:

Voltar ao Eclipse > Window > Preferences >Android >


Build

Copiar a tua SHA1 fingerprint

A chave do Google Maps API v2 baseada num pequeno formulrio de certificado digital do aplicativo, conhecido como
SHA-1 fingerprint. Porque a fingerprint nica, o Google
Maps pode us-la como forma de identificar a sua aplicao.
(foste buscar isto a algum lado?)
Existem dois tipos de certificado: o certificado de debug ( o que
vamos usar e serve apenas para propsito de testes e desenvolvimento) e certificados gerados que nos permitem, por
exemplo, colocar a aplicao no Google Play.

Ir a este link https://console.developers.google.com/


project e, posteriomente, criar um novo projeto no google console.

Passos a seguir:

Colar na janela do google console seguida de ;

Buscar o nome completo da aplicao

Eclipse Mapa > bin > AndroidManifest.xml

Logo de seguida a inciciar o manifest encontras package=NAMESPACE

Copias o teu namesapce

Abrir o projeto > APIs & auth > APIs > Activar o Google
Maps Android API v2

22

Retornar ao Google Console e colar o nome da app


depois do ;

A PROGRAMAR
CRIAR UMA APLICAO PARA ANDROID COM MAPA

<?xmlversion="1.0"encoding="utf-8"?>
<fragmentxmlns:android="http://schemas.android.com/
apk/res/android"
android:id="@+id/map"
android:name=
"com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Alterar a Activity
Passos a seguir:

Depois de carregar em criar, a google ir fornecer uma


key

Uma Activity representa uma interface que nos apresentada e, alm do ficheiro XML que define o aspeto grfico, existe um ficheiro .JAVA onde definido o cdigo das funcionalidades.
Neste caso, bastar codificarmos o mtodo onCreate que faz
parte do ciclo de vida de uma atividade e executado sempre que a atividade mostrada ao utilizador. Neste mtodo o
que iremos fazer associar o layout XML que acima definimos.
Passos a seguir:

Deve substituir no manifest


<meta-dataandroid:name=
"com.google.android.gms.version"
android:value="@integer/
google_play_services_version"/>
<meta-data
android:
name="com.google.android.maps.v2.API_KEY"
android:value="Substituir aqui"/>

Ateno isto dever ser colocado dentro da tag application


Alterar Layout
Em Android, o aspeto grfico de cada atividade definido num
ficheiro XML.Neste caso, vamos editar o ficheiro activity_main.xml
Passos a seguir:

Eclipse > Mapa > res > layout >activity_main.xml

23

Eclipse > Mapa > src >MainActivity.java

A PROGRAMAR
CRIAR UMA APLICAO PARA ANDROID COM MAPA
package com.programar.mapa;
import
import
import
import

Ok

Start Avd

(Depois do emulador iniciar) Selecione Choose a


running Andorid device

Ok

com.google.android.gms.maps.GoogleMap;
com.google.android.gms.maps.MapFragment;
android.app.Activity;
android.os.Bundle;

publicclass MainActivity extends Activity {


@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((MapFragment) getFragmentManager
().findFragmentById(R.id.map)).getMap();
}
}
Executar aplicao
A criao do AVD (emulador de dispositivos android) feita da
seguinte forma:
Ir a Window\Android Virtual Device Manager

New

Preencher segundo a imagem seguinte

24

A PROGRAMAR
CRIAR UMA APLICAO PARA ANDROID COM MAPA

No final deste tutorial possvel visualizar no emulador ou dispositivo mvel um mapa como este.

AUTOR
Escrito por Joo Silva

natural de Viana Castelo. Atualmente aluno do curso de Engenharia Informtica no Instituto Politcnico de
Viana do Castelo (IPVC). Teve o primeiro contacto com programao para dispositivos mveis nas Unidades
Curriculares de Projeto e Computao Mvel do referido curso.

25

A PROGRAMAR
C# CRUD (Create, Read, Update & Delete)
Introduo

Estrutura

A partir deste artigo o leitor ter a possibilidade de aprender


a utilizar as quatro operaes mais comuns na interao com
a base de dados.

Uma estrutura de projecto bem delineada poupa-nos imenso


tempo. A estrutura deste projecto muito simples.

O artigo utiliza o sistema de base de dados MySQL mas


poder ser adaptvel, sem grande esforo, a outro SGBD.
Instalao
Para que o leitor consiga estabelecer uma conexo com o
MySQL necessrio:
1.

A instalao do MySQL Connector (ver link 1)

2.

Adicionar a referncia do MySQL ao projecto (ver link


2)

3.

Criar uma base de dados com duas tabelas


jogadores e clubes (ver link 3)
Classes

Resultado final

Neste artigo necessrio a criao de duas classes distintas. A primeira classe (dbconfig) ir tratar da configurao do
acesso base de dados. A segunda classe (dbhandler) ir
permitir a realizao de queries / operaes CRUD.

O artigo tambm exemplifica a utilizao do controlo DataGridView em pleno, usufruindo da possibilidade de imagens
e listas de itens dentro do mesmo. Todo o cdigo abaixo
escrito ser utilizado dentro dos eventos deste controlo, pelo
que no ser necessrio a adio de mais nenhum objecto
ao formulrio.

class dbconfig
{
private
private
private
private

string
string
string
string

server;
user;
password;
database;

/* Pode-se, desde logo, atribuir valores


por defeito */
public dbconfig(string __server =
"localhost", string __user = "root",
string __password = "",
string __database = "footballmanager")
{
this.server
= __server;
this.user
= __user;
this.password = __password;
this.database = __database;
}
public string get() {
return "Server=" + this.server +
";Database=" + this.database +
";Uid=" + this.user + ";Pwd="
+ this.password;
/* Output: Server=localhost;
Database=footballmanager:Uid=root;
Pwd= */
}

O leitor poder fazer download do projecto para fins educacionais (ver link 4).

26

A PROGRAMAR
C# CRUD (CREATE, READ, UPDATE & DELETE)
No construtor da classe desde logo foi assumido quais os valores por defeito de ligao base de dados. No entanto dada
a possibilidade de, aquando a iniciao da classe, definir a
configurao desejada.

/* output: 'tabela' */
string table = matches[0].Value.Replace
("FROM ", "");
this.dAdapter.Fill(this.dSet, table);

dbconfig db = new dbconfig("localhost", "root", "",


"outra_base_dados");

return this.dSet;
}

Tudo o que o preciso para estabelecer uma ligao com o


servidor de MySQL est nesta classe de configurao.
A classe dbhandler simplista mas totalmente funcional e segura, em termos de realizao de queries, pois permite a passagem de parmetros. Apenas duas funes foram criadas:

A utilizao de um DataSet bastante benfico (em comparao com o DataReader) por vrias razes:

No preciso que estabeleamos uma ligao, pois o


mtodo .Fill() j faz isso;

Funo get() Realiza a operao Ler (Read), cuja finalidade


devolver informaes da base de dados.

Podemos de imediato atribuir o DataSource a um


controlo (como o caso da DataGridView);

Funo set() Realiza as operaes de Criar (Create), Actualizar (Update) e Eliminar (Delete).

possvel fazer queries dentro do DataSet, pois este


guarda os dados como se de uma tabela se tratasse.

Para que a utilizao desta classe funcione em pleno ser necessrio adicionar quatro referncias.

O leitor poder verificar que foi incutido nesta funo o uso


das expresses regulares, que tem como aplicao devolver
o nome da tabela da query. No obrigatrio a utilizao
deste mtodo, o nome da tabela pode ser passado via parmetro (para a funo) se assim preferir.

/* Permite a ligao com a base de dados */


using MySql.Data.MySqlClient;
/* Permite a utilizao da funcionalidade
[Optional] <- disponvel apenas na framework 4.0 */
using System.Runtime.InteropServices;
/* Permitem a chamada das funes directamente */
using System.Data;
using System.Text.RegularExpressions;
class dbhandler
{
private
private
private
private
private

public int set(string __query, [Optional]


MySqlParameter[] __param)
{
this.command = new MySqlCommand(__query,
this.connection);
if (__param != null) {
command.Parameters.AddRange(__param); }

dbconfig db;
MySqlConnection connection;
MySqlCommand command;
MySqlDataAdapter dAdapter;
DataSet dSet;

if (this.connection.State !=
ConnectionState.Open) {
this.connection.Open();
}

public dbhandler()
{
db = new dbconfig();
connection = new MySqlConnection
(db.get());
}

Sempre que a classe dbhandler iniciada o seu construtor ir


chamar o construtor da classe dbconfig e por sua vez estabelecer uma ligao com a base de dados MySQL.
public DataSet get(string __query, [Optional]
MySqlParameter[] __param)
{
this.command = new MySqlCommand(__query,
this.connection);

return this.command.ExecuteNonQuery();
// retorna o nmero de linhas afectadas

Sim, a funo set() contm apenas este trecho de cdigo.


Por precauo retornado o nmero de linhas afectadas
para perceber se foi ou no executado com sucesso.
A nossa classe est concluda. A classe executa eficazmente
os mtodos estipulados pelo CRUD de forma segura e muito
simples. Resta agora colocar esta classe em aco.
Formulrio
No formulrio apenas ser necessrio adicionar o controlo
DataGridView. Todas as operaes do CRUD sero realizadas directamente pelos diversos eventos (Load, userAddedRow, RowValidating, CellEndEdit, onClick, MouseDown).

if (__param != null)
{ this.command.Parameters.AddRange(__param); }
this.dAdapter= new MySqlDataAdapter
(this.command);
this.dSet = new DataSet();

Referncias e Variveis
Para que tudo funcione em pleno necessrio adicionar a
referncia do MySQL

/* input exemplo: 'SELECT * FROM tabela


WHERE id = @id' output: 'FROM tabela' */
Regex rgx = new Regex("FROM\\s\\w+");
MatchCollection matches = rgx.Matches
(__query);

using MySql.Data.MySqlClient;

27

A PROGRAMAR
C# CRUD (CREATE, READ, UPDATE & DELETE)
Bem como adicionar algumas variveis privadas a este formulrio:
private libs.dbhandler dbQuery =
new libs.dbhandler();
/* Retm o indce e ID respectivos a cada jogador
na DataGridView */
private Dictionary<int, int>
_dicJogadores = new Dictionary<int, int>();

};
this.dataGridView1.Columns.AddRange(foto, nome,
data_nascimento, valor_estimado, clube);
this.dataGridView1.RowTemplate.MinimumHeight = 50;
Como o leitor poder comprovar, neste trecho de cdigo
apenas foram delineadas as queries necessrias construo da DataGridView, assim como toda a estrutura das colunas. Falta ento adicionar dados informativos provenientes
da base de dados.

Eventos e Funes
No evento Load vamos criar toda a estrutura da DataGridView,
desde os tipos de colunas (Textbox, Image e Combobox), bem
como selecionar o contedo proveniente da base de dados.

for (int i = 0; i <= dSetJogadores.Tables


[0].Rows.Count - 1; i++) {
string _imgDefault = "no_image.gif";

Os dois eventos userAddedRow e RowValidating tem como


finalidade a insero de informao na base de dados.

Image _img = imageResize(new Bitmap


(Application.StartupPath + "/imagens/
jogadores/" + _imgDefault), new Size(64, 64));

O evento CellEndEdit ter como objectivo proporcionar a actualizao da informao.

if (dSetJogadores.Tables[0].Rows[i].
ItemArray[4].ToString() != string.Empty){
_img = new Bitmap(imageResize(new
Bitmap(Application.StartupPath + "/imagens/
jogadores/" +dSetJogadores.Tables[0].
Rows[i].ItemArray[4].ToString()),
new Size(64, 64)));
}

E por fim os eventos onClick e MouseDown vo criar uma estrutura capaz de eliminar informao bem como de actualizar a
foto de um jogador, tudo isto atravs da criao, em run-time,
de um ContextMenuStrip atribudo DataGridView.
Ler dados

string _nome = dSetJogadores.


Tables[0].Rows[i].ItemArray[1].ToString();
string _datanascimento =
dSetJogadores.Tables[0].Rows[i].
ItemArray[2].ToString();

O evento Load tem a seguinte estrutura:


DataSet dSetJogadores = dbQuery.get("SELECT jog.id,
jog.nome, jog.data_nascimento, jog.valor_estimado,
jog.foto, club.descricao, club.id " +
"FROM jogadores AS jog " +
"LEFT JOIN clubes AS club ON club.id = jog.id_clube
" + "ORDER BY jog.nome ASC");

/* O valor, que est em float (10,2),


ultrapassa as casas decimais.
* ento preciso haver uma converso
desse valor para double e, por sua
vez, formatar esse valor com duas
casas 'N2'.*/
string _valorestimado =
Convert.ToDouble(dSetJogadores.Tables[0].
Rows[i].ItemArray[3].ToString()).ToString("N2");
int _clube = Convert.ToInt32
(dSetJogadores.Tables[0].Rows[i].
ItemArray[6].ToString());

/* A tabela clubes uma tabela secundria que se


interliga com a tabela jogadores.
* Para que a ComboboxColumn contenha todos os
valores desta tabela, necessrio abastec-la pela
via do DataSource
*/
DataSet dSetClubes = dbQuery.get
("SELECT id, descricao FROM clubes");

/* Guarda a posio do ID na DataGridView */


_dicJogadores.Add(i, Convert.ToInt32
(dSetJogadores.Tables[0].Rows[i].
ItemArray[0].ToString()));

var nome = new DataGridViewTextBoxColumn(){


HeaderText = "Nome", MinimumWidth = 150 };
var data_nascimento =
new DataGridViewTextBoxColumn(){
HeaderText = "Data Nascimento" };
var valor_estimado =
new DataGridViewTextBoxColumn()
{ HeaderText = "Valor Estimado()" };

this.dataGridView1.Rows.Add(new
object[] { _img, _nome, _datanascimento,
_valorestimado, _clube });
}

var clube = new DataGridViewComboBoxColumn() {


HeaderText = "Clube",
DataSource = dSetClubes.Tables[0],
ValueMember = "id",
DisplayMember = "descricao",
AutoSizeMode =
DataGridViewAutoSizeColumnMode.None,
FlatStyle = FlatStyle.Standard
};

E finalizamos o evento load. Recapitulando o processo: definimos as queries; definimos a estrutura da DataGridView;
atribumos a informao das queries s linhas.
Se o leitor correr a aplicao neste momento, possivelmente
dar-lhe- erro na funo imageResize(), pois esta ainda no
foi adicionada ao formulrio.

var foto = new DataGridViewImageColumn() {


HeaderText = "",
AutoSizeMode =
DataGridViewAutoSizeColumnMode.None,
Width = 64

public static Image imageResize(Image img, Size


size)
{
return (Image)(new Bitmap(img, size));
}

28

A PROGRAMAR
C# CRUD (CREATE, READ, UPDATE & DELETE)
Adicionar dados
Para que seja possvel a adio de novas linhas directamente
na base de dados, precisamos de dois eventos para garantir a
fiabilidade dos dados e evitar possveis erros.
private void dataGridView1_UserAddedRow(object
sender, DataGridViewRowEventArgs e)
{
_userAddedRowIndex =
this.dataGridView1.CurrentRow.Index;
}

possvel aps a concluso da insero dos dados na base


de dados.
Actualizar dados
O trecho de cdigo de actualizao de dados praticamente
idntico ao da insero de dados, pelo que o leitor no notar grande diferena. apenas estabelecida uma condio
para prevenir enganos.
Portanto, no evento CellEndEdit (que ocorre aps se clicar
fora da clula), temos o seguinte cdigo:

definido qual o ndice de linha actual para ser utilizado no


evento RowValidating:

if (e.RowIndex != _userAddedRowIndex)
{

if(e.RowIndex == _userAddedRowIndex){

/* necessrio verificar se no se trata de uma


adio de linha */

/* Verifica se existe ou no valores nas


clulas */

string _nome = (string.IsNullOrEmpty


(this.dataGridView1.Rows[e.RowIndex].
Cells[1].Value.ToString()) ? "undefined" :
this.dataGridView1.Rows[e.RowIndex].
Cells[1].Value.ToString());

string _nome = (string.IsNullOrEmpty


(this.dataGridView1.Rows[e.RowIndex].
Cells[1].Value.ToString()) ? "undefined" :
this.dataGridView1.Rows[e.RowIndex].Cells[1].
Value.ToString());

DateTime _datanascimento =
(this.dataGridView1.Rows[e.RowIndex].
Cells[2].Value == null ? DateTime.Today :
Convert.ToDateTime(this.dataGridView1.Rows
[e.RowIndex].Cells[2].Value.ToString()));

DateTime _datanascimento = (this.dataGridView1.


Rows[e.RowIndex].Cells[2].Value == null ?
DateTime.Today :
Convert.ToDateTime(this.dataGridView1.Rows
[e.RowIndex].Cells[2].Value.ToString()));

double _valorestimado = (this.dataGridView1.


Rows[e.RowIndex].Cells[3].Value == null ? 0.0f :
Convert.ToDouble(this.dataGridView1.Rows
[e.RowIndex].Cells[3].Value.ToString()));

double _valorestimado =
(this.dataGridView1.Rows[e.RowIndex].
Cells[3].Value == null ? 0.0f :
Convert.ToDouble(this.dataGridView1.Rows
[e.RowIndex].Cells[3].Value.ToString()));

int _id_clube = (this.dataGridView1.Rows


[e.RowIndex].Cells[4].Value == null ? 1 :
Convert.ToInt32(this.dataGridView1.Rows
[e.RowIndex].Cells[4].Value.ToString()));

int _id_clube = (this.dataGridView1.Rows


[e.RowIndex].Cells[4].Value == null ? 1 :
Convert.ToInt32(this.dataGridView1.Rows
[e.RowIndex].Cells[4].Value.ToString()));

MySqlParameter[] _sqlParams =
new MySqlParameter[] {
new MySqlParameter("@nome", _nome),

MySqlParameter[] _sqlParams =
new MySqlParameter[] {
new MySqlParameter("@nome", _nome),
new MySqlParameter
("@datanascimento",_datanascimento),
new MySqlParameter("@valorestimado",
_valorestimado),
new MySqlParameter("@id_clube", _id_clube)
};

new MySqlParameter
("@datanascimento",_datanascimento),
new MySqlParameter("@valorestimado",
_valorestimado), new MySqlParameter
("@id_clube", _id_clube),
new MySqlParameter("@id", _dicJogadores
[e.RowIndex])

if (dbQuery.set("INSERT INTO jogadores (nome,


data_nascimento, valor_estimado, id_clube) " +
"VALUES (@nome, @datanascimento,
@valorestimado, @id_clube)", _sqlParams) > 0) {

};
dbQuery.set("UPDATE jogadores SET nome =
@nome, data_nascimento = @datanascimento,
valor_estimado = @valorestimado, id_clube =
@id_clube " + "WHERE id = @id", _sqlParams);

// necessrio actualizar os indces do


//dicionrio
int _lastid = Convert.ToInt32(dbQuery.get
("SELECT id FROM jogadores ORDER BY id DESC LIMIT
1").Tables[0].Rows[0].ItemArray[0].ToString());

_dicJogadores.Add(e.RowIndex, _lastid);
}

}
O leitor decerto notar que nesta insero no est incutida a
coluna foto, por razes estruturais. A insero da foto ser

29

No novamente atribudo nenhum valor para a foto pois


esta no foi selecionada em nenhuma parte. Ser ento na
criao de um ContextMenuStrip que iremos providenciar a
eliminao de dados bem como a adio/alterao da foto.

A PROGRAMAR
C# CRUD (CREATE, READ, UPDATE & DELETE)
(object _sender, EventArgs _e) {
eliminarLinha_click(sender, e, _hit.RowIndex); };
_alterarFoto.Click += delegate(object
_sender, EventArgs _e) { alterarFoto_click(sender,
e, _hit.RowIndex); };
}

}
O cdigo acima representa a criao do controlo ContextMenuStrip apenas quando o boto direito do rato for pressionado. Verifica se no se trata de uma nova linha, pois caso se
trate no faz sentido mostrar este controlo e por fim cria dois
mtodos capazes de tratar da informao da forma que desejarmos.
private void eliminarLinha_click(object sender,
EventArgs e, int index)
{
int id = _dicJogadores[index];
MySqlParameter[] _sqlParams =
new MySqlParameter[] {
new MySqlParameter("@id", _dicJogadores
[index])
};
Eliminao dados
Para que tudo funcione na perfeio, vamos precisar de criar
dois mtodos de click (Eliminar linha e Alterar foto) e utilizar o
evento MouseDown que a DataGridView nos fornece para criar
o ContextMenuStrip.

if (dbQuery.set("DELETE FROM jogadores WHERE


id = @id", _sqlParams) > 0) {
this.dataGridView1.Rows.RemoveAt(index);
_dicJogadores.Remove(index);
}

Sempre que elimina uma linha da base de dados necessrio tambm eliminar essa mesma linha do dicionrio de jogadores de forma a manter ambas as estruturas de dados correctas.

No evento MouseDown colocado o seguinte cdigo:


if (e.Button ==
System.Windows.Forms.MouseButtons.Right) {
var _hit = this.dataGridView1.HitTest
(e.X, e.Y);

private void alterarFoto_click(object sender, EventArgs e, int index) {

this.dataGridView1.ClearSelection();
this.dataGridView1.Rows
[_hit.RowIndex].Selected = true;
this.dataGridView1.ContextMenuStrip =
null; // Limpa os ContextMenuStrip existentes

var _opf = new OpenFileDialog(){


AddExtension = false,
Multiselect = false,
Filter = "Image files (*.jpg, *.jpeg,
*.gif, *.png) | *.jpg; *.jpeg; *.gif; *.png",
Title = "Escolha a imagem"
};

/* O 'ContextMenuStrip' s deve ser mostrado


nas linhas existentes */
if (this.dataGridView1.Rows
[_hit.RowIndex].IsNewRow == false) {
ContextMenuStrip _menu =
new ContextMenuStrip();

if (_opf.ShowDialog() ==
System.Windows.Forms.DialogResult.OK) {
int id = _dicJogadores[index];

ToolStripMenuItem _eliminarLinha = new


ToolStripMenuItem("Eliminar linha", Image.FromFile
(Application.StartupPath + "/imagens/delete.png"));
ToolStripMenuItem _alterarFoto = new
ToolStripMenuItem("Alterar Foto", Image.FromFile
(Application.StartupPath + "/imagens/
pick_image.gif"));

MySqlParameter[] _sqlParams =
new MySqlParameter[] {
new MySqlParameter("@id", _dicJogadores
[index]), new MySqlParameter("@foto", id +
"/" + _opf.SafeFileName.ToString())
/* O caminho correcto a inserir na base
de dados: id/nome_ficheiro.extenso */
};

_menu.Items.AddRange(new ToolStripItem[]
{ _eliminarLinha, _alterarFoto });

if (dbQuery.set("UPDATE jogadores SET foto


= @foto WHERE id = @id", _sqlParams) > 0)
{
string _path =
Application.StartupPath + "/imagens/jogadores/"
+ id + "/";
System.IO.Directory.CreateDirectory

this.dataGridView1.ContextMenuStrip = _menu;
/* enviado por parmetro o indce da
linha actual */
_eliminarLinha.Click += delegate

30

A PROGRAMAR
C# CRUD (CREATE, READ, UPDATE & DELETE)
(_path);
// Caso no exista, ir criar a pasta
/* Copia o ficheiro seleccionado
para a pasta do jogador */
System.IO.File.Copy(_opf.FileName,
_path + _opf.SafeFileName, true);
this.dataGridView1.Rows[index].Cell[0].
Value = new Bitmap(imageResize
(new Bitmap(_path + _opf.SafeFileName),
new Size(64, 64)));

Por fim, no se permite a seleco de ficheiros que no preencham os requisitos do filtro; actualiza-se a informao na base
de dados; envia-se a foto selecionada para a pasta do jogador;
actualiza-se a clula da foto da DataGridView.

Concluso
Neste artigo construmos uma estrutura vantajosa em termos
de utilizao de classes, seguindo um modelo mais orientado a
objectos. Definimos tambm um modelo bastante reduzido em
termos de cdigo, mantendo mesmo assim o melhor da segurana e rapidez.
Links de referncia

MySQL Connector - http://tinyurl.com/2r3t2a

MySQL Referncia - http://tinyurl.com/lcdqoao

Estrutura Base Dados - http://pastebin.com/jPFXtXhE

Download do projecto - http://tinyurl.com/k2cegr7

A primeira classe
(dbconfig) ir tratar da
configurao do acesso base de dados. A
segunda
classe
(dbhandler) ir permitir
a realizao de
queries
CRUD.

operaes

AUTOR
Escrito por Fbio Pinho
Programador entusiasta nas mais diversas linguagens, sendo PHP, .NET e Java (Android) as suas preferncias.
site pessoal: http://stuffpinho.com

31

COLUNAS
C# - Novas Funcionalidades Do C# 6.0 Anteviso De Abril De 2014
Visual(NOT)Basic - Mtodos de extenso o que preciso, como quero
Core Dump [12] - Programador ^ Gestor

C#
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
ter qualquer valor para alm do valor por omisso do seu
tipo.

Introduo
No passado evento //build/, a Microsoft disponibilizou uma
verso de anteviso da verso 6.0 da linguagem de programao C#.

Tal como acontece com os inicializadores dos campos, os


inicializadores de auto-propriedades no podem referenciar
this afinal so executados antes do objeto estar devidamente inicializado. Isto faria com que no houvesse muitas
escolhas interessantes para inicializar as auto-propriedades.
Especialmente as auto-propriedades apenas de leitura pareceriam inteis se no pudessem, de alguma forma, ser inicializadas a partir de valores passados no construtor do objeto.
No entanto, os construtores primrios veem mudar isto.

Trata-se de uma verso preliminar, pelo que algumas funcionalidades podero sofre alteraes, no fazer parte da verso final ou novas funcionalidades podero ainda ser adicionadas.
Esta nova verso da linguagem inaugura tambm uma nova
postura da Microsoft no que diz respeito ao cdigo aberto e
participao da comunidade.

Construtores Primrios

De facto, em direto numa sesso de abertura (keynote do


segundo dia, aproximadamente a 01:15:50), Anders Hejlsberg publicou no CodePlex cdigo fonte da plataforma de
compiladores e os compiladores de C# e Visual Basic projeto Roslyn.

Os construtores primrios (primary constructors) permitem


que os parmetros do construtor sejam declarados diretamente na classe (class) ou estrutura (struct) sem a necessidade da declarao explcita do construtor no corpo da declarao do tipo. Estes parmetros esto disponveis como
nomes simples sendo o seu mbito (scope) toda a declarao do tipo.

Alm do cdigo fonte, foram publicadas as notas das reunies de desenho, onde se pode consultar o racional por detrs de cada nova funcionalidade.

Nota: O desenho desta funcionalidade foi alterado e seguese a descrio do novo desenho. No entanto, no foi possvel ter estas alteraes na verso de anteviso, pelo que,
podero ser encontradas situaes que correspondem
semntica anterior: os parmetros so capturados implicitamente e no existe sintaxe para a captura explcita.

Estado Da Implementao Das Funcionalidades


O estado atualizado da implementao das funcionalidades
de ambas as linguagens pode ser consultado aqui.
Funcionalidades Implementadas
Comecemos por percorrer, sem qualquer ordem especial, as
funcionalidades j implementadas e disponibilizadas na verso de anteviso anteriormente referida.

Parmetros Em Classes E Estruturas


Aqui est um exemplo de uma classe com um construtor
primrio:

Inicializao De Auto-Propriedades

public class Cliente(string nome, string apelido)


{
public string Nome { get; } = nome;
public string Apelido { get; } = apelido;
}

Passa a ser possvel adicionar inicializadores a autopropriedades (auto-property) da mesma forma que se pode adicionar a campos (field):

Obter o mesmo efeito sem construtores primrios teria requerido campos privados para guardar os valores de nome e
apelido, um construtor explcito para os inicializar e um corpo
de leitura para Nome e Apelido para os expor:

public class Cliente


{
public string Nome { get; set; } = "Jos";
public string Apelido { get; set; } =
"Silva";
}

public class Cliente


{
private string nome;
private string apelido;
public Cliente(string nome, string apelido)
{
this.nome = nome;
this.apelido = apelido;
}
public string First { get { return nome; } }
public string Last { get { return apelido; } }
}

O inicializador inicializa diretamente o campo que d suporte


propriedade. Por essa razo passa a fazer sentido existirem auto-propriedades sem assessores de escrita (setter):
public class Cliente
{
public string Nome { get; } = "Jos";
public string Apelido { get; } = "Silva";
}
Auto-propriedades apenas de leitura s so permitidas se
existir um inicializador. Caso contrrio nunca poderiam con-

No extrato de cdigo anterior foram evidenciados os pedaos


que se tornam desnecessrios com a introduo dos cons-

34

C#
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
trutores primrios e auto-propriedades apenas de leitura
inicializadas.

O objetivo desta funcionalidade expressar os tipos de forma mais concisa. Note-se, no entanto, que tambm remove
uma diferena importante na linguagem entre tipos mutveis
e tipos imutveis: as auto-propriedades eram uma forma
abreviada apenas disponvel se se estivesse na disposio
de tornar a classe mutvel e, por isso, a tentao para o
fazer por omisso era enorme. Agora, com autopropriedades apenas de leitura, mutvel e imutvel passam
a estar em p de igualdade.

public string Nome { get; } = nome;


public string Apelido { get; } = apelido;
Quando se usa o modificador de acessibilidade (o mais provvel ser private) num construtor primrio isso significa a
existncia de um parmetro e um campo com o mesmo nome e a inicializao do campo com o parmetro. Desta forma, vai ser possvel referir-se a esse campo em mtodos e
propriedades aps a inicializao:
public int Idade { get { return CalcularIdade
(aniversrio); } }
Construtores Explcitos

De momento no existe uma forma de explicitar um corpo


para o construtor primrio. O comit no conseguiu chegar a
uma boa sintaxe e pensa que no ser muito importante
porque a maioria dos corpos de construtores so constitudos apenas por inicializaes. No entanto, muitos so os que
se tm manifestado em favor da sua existncia. Qual a tua
opinio?

Uma declarao de classe com construtor primrio continua


a poder definir outros construtores. No entanto, para assegurar que os argumentos so mesmo passados ao construtor
primrio, todos os construtores devem chamar um inicializador this():
public Ponto()
: this(0, 0) // chama o construtor primrio
{
}

Parmetros Campo
Nota: Os campos parmetro (field parameters) no funcionam na corrente verso de anteviso.

Construtores explcitos podem chamar-se entre si, mas direta ou indiretamente tero de chamar o construtor primrio no
final porque o nico construtor que pode chamar o inicializador base().

Por omisso, os parmetros de um construtor primrio existem apenas em tempo de inicializao. Membros como as
propriedades e mtodos no se podem a eles referir porque,
quando so chamados, o objeto j foi construdo e o parmetro desapareceu.

No caso de estruturas (struct) com construtores primrios, os


construtores explcitos no podem chamar o construtor por
omisso (sem parmetros): tm de chamar direta ou indiretamente o construtor primrio.

Foi considerado (e experimentado) deixar os parmetros


serem implicitamente capturados em campos privados gerados pelo compilador se fossem usados depois da construo, mas isso levava a cdigo suprfluo e sujeito a erros
onde muitas vezes os parmetros eram inadvertidamente
capturados em campos.

Incializador Base
O construtor primrio chama sempre, implcita ou explicitamente, o inicializador base. Se no for especificado um inicializador base, como com todos os construtores, ser chamado o construtor base sem parmetros.

Claro que se podem declarar campos privados e inicializa-los


com um parmetro:

A forma de explicitamente chamar o inicializador base passando uma lista de argumentos na especificao da classe
base:

public class Cliente(


string nome,
string apelido,
DateTime aniversrio)
{
public string Nome { get; } = nome;
public string Apelido { get; } = apelido;
private DateTime _aniversrio = aniversrio;
}

class BufferFullException()
: Exception("Buffer full")
{
}
Tipos Parciais

Infelizmente o campo privado no poderia usar o mesmo


nome do parmetro e necessita de um nome alternativo, por
exemplo prefix-lo com uma barra inferior.

Se um tipo for declarado em mltiplas partes, apenas uma


das partes pode declarar parmetros de construtor primrio e
apenas essa parte pode declarar argumentos na especificao da classe base.

Para evitar isto, existe uma sintaxe para capturar explicitamente em campos os parmetros dos construtores primrios

Using Static

public class Cliente(


string nome,
string apelido,
private DateTime aniversrio)
{

Nota: a implementao corrente desta funcionalidade no


reflete o desenho atual. Mais detalhes abaixo.

35

C#
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
Esta funcionalidade permite especificar um tipo numa clusula using, tornando todos os membros estticos acessveis
desse tipo sem qualificao no cdigo subsequente:

Aqui esto alguns exemplos:


if (int.TryParse(s, out int i)) { }
GetCoordinates(out var x, out var y);
Console.WriteLine("Result: {0}",
(int x = GetValue()) * x);

using System.Console;
using System.Math;
class Program
{

if ((string s = o as string) != null) { s }

static void Main()


{
WriteLine(Sqrt(3 * 3 + 4 * 4));
}

Isto particularmente til para parmetros de sada (out),


onde deixa de ser necessrio declarlos previamente, numa linha separada. Isto agradvel na maioria dos casos,
mas em cenrios onde apenas expresses so permitidas,
necessrio para a utilizao de parmetros de sada. Em
clusulas de consulta, por exemplo:

Esta funcionalidade tem a capacidade de tornar o cdigo


mais curto. Existe alguma preocupao de que possa causar
alguma confuso no namespace e causar ambiguidades,
especialmente em classes que no foram desenhadas para
serem abertas desta forma. Com quantos mtodos Create
() pode uma pessoa lidar se ficar confusa com o que est
a criar?

from s in strings
select int.TryParse(s, out int i) ? i : -1;
Intuitivamente, o escopo das variveis declaradas numa expresso estendese para o bloco exterior mais prximo,
instruo estruturada (como if ou while) ou instrues embebidas (como o corpo de um if ou while). Tambm corpos de
expresses lambda, clusulas de consulta e inicializadores
de campos e propriedades atuam como limites de escopo.

Mtodos De Estenso
Os mtodos de extenso so mtodos estticos. Isto levanta
a questo de como uma diretiva using static os vai expor.
Como um mtodo de topo no escopo? Como um mtodo de
extenso? Ambos? Vejamos um exemplo:

Na maioria dos casos, as expresses de declarao permitem var apenas se existir um inicializador de que se possa
inferir o tipo, tal como nas instrues de declarao. No entanto, se a declarao da expresso passado num parmetro de sada (out), ser tentada a resoluo de sobrecargas (overlaod resolution) sem o tipo desse argumento e inferido o tipo a partir do mtodo selecionado:

using System.Linq.Enumerable; // Apenas o tipo, e


//no todo o namespace
class Program
{

static void Main()


{
var range = Range (5, 17);// (1)
var odd = Where
(range, i => i % 2 == 1); // (2)
var even = range.Where
(i => i % 2 == 0); // (3)
}

void GetCoordinates(out int x, out int y) { }


GetCoordinates(out var x, out var y); // inferido
//int
As expresses de declarao podem requerer alguma habituao e pode ser sujeitas a abusos em novos e interessantes modos. Experimentem e digam o que pensam.

Range um normal mtodo esttico, portanto a chamada


marcada com (1) pode e deve ser permitida. A implementao atual no faz nada de especial com mtodos de extenso, portanto permite a chamada a Where como mtodo
esttico em (2), mas no como mtodo de extenso em (3).

Filtros De Excees
Os filtros de excees j existiam no Visual Basic e no F# e
agora existem tambm no C#. Este o aspeto que tero:
try
{ }
catch (Exception e) if (myfilter(e))
{

Isto no o que pretendido. Permitir (3) satisfaria o longo


pedido para tornar disponveis mtodos de extenso mais
seletivamente pelo tipo em que esto definidos e no apenas
pelo namespace. Por outro lado, os mtodos de extenso
raramente foram desenhados para serem usados como mtodos estticos ( apenas um situao de recurso para os
raros casos em que existem ambiguidades) e no h interesse em venham a causar confuso no namespace de topo.
Por isso, numa futura verso, (2) no ser permitido.

Se a expresso entre parntesis avaliar para verdadeiro, o


bloco catch executado, caso contrrio a exceo continua
o seu caminho.
Os filtros de excees so preferveis a apanhar e relanar
porque deixam o stack inalterado. Se a exceo levar posteriormente a que haja um dump do stack, pode-se ver de onde foi originalmente lanada em vez de de onde foi relanada.

Expresses De Declarao
As expresses de declarao permitem declarar variveis
locais no meio de expresses, com ou sem inicializao.

36

C#
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
Literais Binrios E Separadores De Dgitos

xador que receba uma nica chave do tipo string. No entanto, dada a fraca receo pela comunidade desta funcionalidade, foi decidida a sua remoo na verso final.

Nota: Na atual verso de anteviso, esta funcionalidade est


disponvel apenas para Visual Basic.

Await Em Blocos Catch E Finally

Pretende-se permitir literais binrios em C#. J no vai ser


necessrio pertencer-se irmandade secreta do Hex para
especificar vetores de bits ou valores do tipo flag!

No C# 5.0 a palavra-chave await no era permitida em blocos catch e finally porque se pensava no ser possvel a
sua implementao. Finalmente descobriuse como poderia
ser implementado.

var bits = 0b00101110;


Para literais longos (e estes novos literais binrios podem
facilmente ser muito longos) a possibilidade de especificar
dgitos em grupos pode ser muito til. O C# permitir o uso
da barra inferior em literais para separar grupos de dgitos:

Isto era uma limitao significativa e obrigava a cdigo nada


bonito para dar a volta e compensar esta falta. Tal j no
mais necessrio:
Resource res = null;
try
{
// Podia-se fazer isto.
res = await res.OpenAsync();

}
catch (ResourceException e)
{
// Agora pode-se fazer isto ...
await res.LogAsync(res, e);
}
finally
{
// ... e isto
if (res != null) await res.CloseAsync();
}

var bits = 0b0010_1110;


var hex = 0x00_2E;
var dec = 1_234_567_890;
Podem se usar quantos se quiser e onde se quiser, exceto
no incio.
Membros Indexados E Inicializadores De Elementos
Os inicializadores de objetos e colees podem ser muito
uteis para inicializar campos e propriedades de objetos de
forma declarativa ou para dar a uma coleo um conjunto
inicial de elementos. A inicializao de dicionrios no to
elegante. Nesta verso adicionada uma nova sintaxe aos
inicializadores de objetos que permite atribuir valores diretamente a chaves atravs de qualquer indexador que o novo
objeto possua:

A implementao algo complicada, mas no temos de nos


preocupar com isso. essa a razo de ter async na linguagem.
Mtodos De Extenso Add Em Inicializadores De Colees

var numbers = new Dictionary<int, string>


{
[7] = "sete",
[9] = "nove",
[13] = "treze"
};

Quando inicialmente se implementaram os inicializadores de


colees no C#, os mtodos Add que so chamados no
podiam ser mtodos de extenso. No Visual Basic isto foi
uma possibilidade desde o incio e o C# parece ter sido esquecido. Isto foi resolvido: o cdigo gerado para um inicializador de coleo poder usar um mtodo de extenso chamado Add. No uma grande funcionalidade, mas til e,
afinal, a sua implementao no novo compilador consistiu
em remover a validao que a impedia.

No caso de as chaves serem strings, algumas vezes querese pensar nelas quase como sendo um tipo fraco de membros do objeto. Este o caso, por exemplo, quando se tem
dados semiestruturados em formatos de comunicao como
JSON, que como se fosse um objeto mas no fortemente
tipado em C#. adicionada nesta verso uma sintaxe para
membros indexados, que permitem fazer de conta que uma
chave literal string como se fosse um membro:

Funcionalidades No Implementadas
Algumas funcionalidades no foram ainda implementadas
mas esto j planeadas ou em considerao para verso
final do C# 6.0. Sendo assim, algumas funcionalidades podero ainda sofrer alteraes ou ser retiradas em funo do
feedback da comunidade.

var customer = new JsonData


{
$first = "Anders", // => ["first"] = "Anders"
last = "Hejlsberg" // => ["last"] = "Hejlsberg"
};
string first = customer.$first;
// => customer["first"]

Declarao De Corpo De Membros Por Expresso


Esta funcionalidade planeada consiste na declarao de
propriedades apenas de leitura e mtodos atravs de uma
simples expresso:

Os membros indexados so identificados com o smbolo $ e


podem ser usados em inicializadores de objetos e acesso a
membros. So simplesmente traduzidos para a forma inferior
que indexar com literais do tipo string podendo, portanto,
ser utilizados onde quer que o objeto rector tenha um inde-

public class Point(int x, int y)


{
public int X => x;
public int Y => y;
public double Dist => Math.Sqrt(x* x + y* y);
public Point Move(int dx, int dy) => new
Point(x + dx, y + dy);
}

37

C#
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
Inicializadores De Eventos

Associatividade Esquerda

Esta funcionalidade planeada vai permitir a inicializao de


eventos nos inicializadores de objetos:

Esta opo significaria que sequncias do tipo a?.b?.c seriam equivalentes a ((a?.b)?.c). Uma consequncia desta
abordagem que, uma vez usado o operador de propagao de null (?.), teria de ser usado em todas os acessos posteriores na sequncia porque o valor sobre o qual se estaria
a aceder ao membro seguinte poderia ser nulo (null).

var boto = new Button


{
...
Click += (source, e) => ...
...
};

Associatividade Direita
Esta opo significaria que sequncias do tipo a?.b?.c seriam equivalentes a (a?(.b?.c)). Uma consequncia desta
abordagem que o operador de propagao de null (?.) pode ser usado em combinao com o operador . em qualquer
combinao. Cdigo como o seguinte seria vlido:

Operador ;
Esta funcionalidade ainda em considerao permitiria que
uma sequncia de instrues seja combinada de forma a
formar uma nica instruo lgica:
(var x = Foo(); Write(x); x*x)

int? l = cliente?.Nome.Length;

Params IEnumerable

Discusso E Opo Escolhida

Esta funcionalidade planeada vai permitir a utilizao, para


alm de arrays, de enumeradores em conjugao com o
modificador params:

Aps longa discusso pblica, optou-se pela associatividade


direita por ser a que a maioria dos intervenientes achou
mais natural e til.

int Avg(params IEnumerable<int> numbers) { }


Interpolao De Strings

()a
Microsoft
disponibilizou uma verso de anteviso da
verso 6.0 da linguagem de programao
C# () inaugura tambm uma nova postura
da Microsoft no que diz
respeito
ao
cdigo
aberto ()

Esta funcionalidade ainda em considerao permitiria a utilizao de identificadores na construo de strings:


"\{p.First} \{p.Last}

is \{p.Age}

years old."

Trata-se de uma funcionalidade que tem gerado alguma discusso que pode ser seguida aqui.
Operador NameOf
Esta funcionalidade ainda em considerao permitiria a obteno do nome de um membro de um tipo semelhana de
tipeof:
string s = nameof(Console.Write);
Propagao De Null
Esta funcionalidade planeada vai permitir escrever cdigo
mais conciso quando est em causa um acesso encadeado
em que podem ocorrer valores null.
No caso mais simples, ir permitir quando agora se escreve:
var temp = GetCustomer();
string name = (temp == null) ? null : temp.name;

Private Protected
A combinao dos modificadores de acessibilidade protected
e internal em C# corresponde ao modificador de acesso FamillyOrAssembly da CLR. A aplicao deste modificador
significa que este membro ou tipo apenas acessvel por
tipos que estejam na mesma assembly do tipo declarante ou
sejam derivados deste.

passar a escrever:
var temp = GetCustomer()?.name;
Mas como que este novo operador (?.) se vai comportar
em sequncias? Existem duas hipteses: ou associativo
esquerda ou associativo direita.

38

C#
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
Uma vez que a CLR tambm tem um modificador de acesso
FamillyAndAssembly que faz com que o membro seja acessvel apenas por tipos que estejam na mesma assembly do
tipo declarante and sejam derivados deste.

teis e a nova plataforma permite explorar mais facilmente


novas funcionalidades.
A grande novidade a abertura ao pblico em geral da discusso e desenvolvimento da linguagem e plataforma de
compiladores. Participem na discusso.

A proposta inicial foi a utilizao combinada dos modificadores private e protected, mas no foi bem recebida pela comunidade. Aps longa discusso pblica, ainda no h, data
da escrita deste artigo, uma deciso definitiva. Foi criado um
inqurito para escolher a opo mais consensual, mas poder j no estar disponvel na altura que este artigo for publicado.

Recursos

Concluso
Esta verso no introduz funcionalidades fraturantes como
foi o caso do LINQ ou async-await porque os esforos da
equipa tm estado na nova plataforma de compiladores. Mas
mesmo assim foram introduzidas algumas funcionalidades

//build/

Sesses do //build/ 2014

Anders Hejlsberg

Projeto Roslyn

Notas das reunies de desenho do C#

Estado da implementao das funcionalidades das


linguagens C# e Visual Basic

AUTOR
Escrito por Paulo Morgado
Bacharel em Engenharia Electrnica e Telecomunicaes (Sistemas Digitais) pelo Instituto Superior de Engenharia de Lisboa
e Licenciado em Engenharia Informtica pela Faculdade de Cincias e Tecnologia da Universidade Nova de Lisboa exerce
variadas funes relacionadas com o desenvolvimento, distribuio e manuteno de software h mais de 10 anos. Participa
em diversas comunidades nacionais e internacionais (pontoNETpt, NetPonto, SharePointPT, SQLPort, Portugal-a-Programar,
CodeProject, CodePlex, etc.). Pelo seu contributo para com estas comunidades, a Microsoft premeia-o com o prmio MVP
(C#) desde 2003. ainda co-autor do livro LINQ Com C# da FCA. http://PauloMorgado.NET/ - @PauloMorgado

39

VISUAL (NOT) BASIC


MTODOS DE EXTENSO O QUE PRECISO, COMO QUERO
O que preciso, como quero mais ou menos. Mais para
mais.

O Visual Basic fica a saber que tem de invocar o mtodo


como sendo um mtodo auxiliar comum, mas leva automaticamente a referncia instncia que originou a invocao
no primeiro parmetro.

Comecemos por o bsico: o que so mtodos de extenso?


Em poucas palavras, mtodos de extenso so uma forma
de injetar funcionalidades escritas por ns, personalizadas,
diretamente em tipos que tomamos como fechados, quer
sejam os escritos por a Microsoft ou os escritos por o vizinho
de cima.

Eu tenho o meu mdulo de mtodos auxiliares. Vou usar


extenses para qu?
Os mtodos de extenso so, no fundo, uma encarnao
dos vossos mtodos auxiliares mas no devido contexto.

Quando escrevo injetar funcionalidades estou-me a referir a


mtodos implementados por ns que para o Visual Studio
fazem parte de determinada classe, e que podem ser chamados a partir de uma instncia.

S para estarmos a pensar na mesma situao, quando escrevo mtodos auxiliares estou a pensar naqueles pequenos
mtodos que ajudam a desempenhar um ou vrios processamentos sobre um tipo, como por exemplo, validar uma
String, formatar uma String, verificar se um nmero mpar,
remover duplicados de um array, contar o nmero de palavras de uma String, e por a adiante.

Isto significa que podemos at acrescentar mtodos diretamente na classe String ou Integer? Bom, sim!
Note-se que os mtodos de extenso no se tratam de material novo! Foram implementados na verso 9 do VB (includa
no Visual Studio 2008).

Vou utilizar, a ttulo de exemplo, um mtodo auxiliar que coloca um ponto final em uma frase (String) e uma letra
grande no incio, por exemplo: gostava de escrever melhor passa para Gostava de escrever melhor.

So no entanto, (e por razes que desconheo) pouco conhecidos, se bem que tenha a certeza de que j tenham
usado extenses centenas de vezes sem darem por isso.

Public Sub Pontuar(ByRef Frase As String)


Frase =
Frase(0).ToString.ToUpperInvariant &
Frase.Substring(1)
For Each final As String In {".", "!", "?"}
If Frase.EndsWith(final) Then Exit Sub
Next
Frase &= "."
End Sub

Basta continuar a ler, no s para saber onde tem usado


extenses e como que as pode identificar, mas tambm
para aprender (naturalmente) como as escrever. fcil. Prometo.
A esta altura pertinente, com certeza: como?
Como devem calcular, no estamos na verdade a escrever o
mtodo
diretamente
na
classe
alvo.
O mtodo descrito e implementado em um mdulo e tem
de estar devidamente assinalado como extenso. Por exemplo:

Traduzindo este mtodo auxiliar para extenso, ficaria:


<Extension()>
Public Sub Pontuar(ByRef Frase As String)
Frase =
Frase(0).ToString.ToUpperInvariant &
Frase.Substring(1)
For Each final As String In {".", "!", "?"}
If Frase.EndsWith(final) Then Exit Sub
Next
Frase &= "."
End Sub

<Extension()>
Public Sub FazerNada(Str As String)
'fao o que prometo!
End Sub
um mtodo de extenso da classe String.

No precisam de procurar diferenas. Eu digo-vos o que


mudou: nada. A grande maioria dos mtodos auxiliares podem ser traduzidos apenas colocando o atributo que o transforma
em
extenso.
Neste caso, a nica diferena nem sequer est relacionada
com a implementao em si, trata-se apenas do atributo do
mtodo.
Onde que est ento a grande diferena? Existem duas
grandes diferenas, mas no esto na forma como se descreve ou implementa o mtodo. Esto na forma como o mtodo invocado e descoberto.

A classe Extension fornecida como atributo do mtodo pertence

classe
CompilerServices
em
System.Runtime.CompilerServices. O mdulo que usarem para
descrever as extenses dever importar este namespace
para facilitar o uso do atributo.
O tipo que o mtodo pretende
do primeiro parmetro, o que
extenso tenha, no mnimo,
mais parmetros, j iro fazer
do.
Estamos a falar, portanto,

estender definido por o tipo


obriga a que um mtodo de
um parmetro. Se existirem
parte da assinatura do mto-

A primeira grande vantagem de utilizar extenses, em detrimento de mtodos auxiliares, o facto de estas se encontra-

de magia do compilador!

40

VISUAL (NOT) BASIC


MTODOS DE EXTENSO O QUE PRECISO, COMO QUERO
rem perfeitamente integradas com o Intellisense (as caixas
de sugesto de contexto), no contexto do tipo que esto a
estender:

Para demonstrar vrios tipos de assinaturas e extenses,


deixo-vos
com
alguns
exemplos.
De notar que so sugestes de implementao, no garanto
que sejam as formas mais eficazes de desempenhar a funo.
Posso comear por reescrever a extenso Pontuar para que
produza um valor, que como deve ser implementada:
<Extension()>
Public Function Pontuar(ByRef Frase As String)
As String
Frase =
Frase(0).ToString.ToUpperInvariant &
Frase.Substring(1)
For Each final As String In {".", "!", "?"}
If Frase.EndsWith(final) Then Return
Frase
Next
Return Frase & "."
End Function

Sendo frase do tipo String, as sugestes dos membros vo


incluir no separador All as nossas extenses desse tipo.
Se no fosse extenso, o mtodo teria de ser chamado de
forma arbitrria, ou seja, eu teria de me lembrar que existia
um mtodo chamado Pontuar:
Dim frase As String = "revista programar"
frase.Pontuar() 'recorrendo exteno
Pontuar(frase) 'recorrendo exteno

Invocao: MinhaFrase.Pontuar()

A segunda grande diferena/vantagem passa tambm por


aqui: no necessrio fornecer a referncia a trabalhar, explicitamente. O Visual Basic sabe que a referncia a trabalhar a mesma que provocou a invocao. Isto possibilita
invocaes em cadeia. Neste caso no evidente, porque
uma segunda chamada ao mtodo Pontuar na mesma referncia no vai alterar nada, e tambm no possvel, dado
que o mtodo Pontuar no produz valor, mas a ttulo de
exemplo vamos assumir que o mtodo Pontuar uma Function que devolve uma String que representa a frase pontuada.
Na abordagem sem extenses, aplicar o mtodo duas vezes
seria da seguinte forma:

O nico parmetro indica a classe que vai estender, a String.


Sem parmetros adicionais.
Um outro exemplo de extenso, desta vez uma extenso do
Integer que indica se determinada instncia representa um
nmero mpar ou no:
<Extension()>
Public Function NumeroImpar(ByVal num As Integer)
As Boolean
If num Mod 2 = 0 Then Return False Else
Return True
End Function
Invocao: MeuNumero.NumeroImpar()
As extenses tambm no precisam forosamente de trabalhar a instncia. Podem simplesmente fazer qualquer outra
coisa com ela. Segue um exemplo que estende qualquer
classe e que escreve para debug a sua representao em
String:

frase = Pontuar(Pontuar(frase))
O resultado da invocao interior era utilizado como alvo de
trabalho
na
invocao
exterior.
Com extenso, a sintaxe torna-se muito mais natural, e est
acompanhada por o Intellisense:

<Extension()>
Public Sub [Debug](valor As Object)
Dim momento As DateTime = Now()
Dim output As New System.Text.StringBuilder("[")
output.Append(momento.ToShortDateString)
output.Append("][")
output.Append(momento.ToShortTimeString)
output.Append("] Dump de varivel: ")
output.Append(valor.ToString)
System.Diagnostics.Debug.WriteLine
(output.ToString)
End Sub

frase = frase.Pontuar.Pontuar()
Frase uma String que processada com a primeira extenso e produz uma String que processada com a extenso
que lhe sucede.
Existe uma inegvel vantagem em utilizar extenses em tudo
o que toca, no s organizao e legibilidade do cdigo,
mas tambm ao vosso ndice de produtividade. Enfim, todas
as vantagens que se podem ter com a utilizao do Intellisense, aplicadas a um pedao de cdigo escrito para trabalhar tipos que no controlamos diretamente. E quem diz mtodos auxiliares diz qualquer tipo de mtodo. Manda a necessidade e criatividade.

Invocao: MinhaVariavel.Debug()
Uso os parntesis retos porque Debug j o nome de uma
classe existente nos namespaces importados por defeito.
Ainda que neste caso no houvesse perigo de coliso, boa
prtica.
Com uma simples invocao, o mtodo regista em debug a
data e hora, seguida da representao.

Alguns exemplos de extenses


possvel estender classes, estruturas, interfaces e delegates.

41

VISUAL (NOT) BASIC


MTODOS DE EXTENSO O QUE PRECISO, COMO QUERO
Posso dar um outro exemplo de uma extenso que no
transforma a instncia, mas faz algo diferente com ela:

Ao indicarmos que o primeiro parmetro do tipo Array de T,


estamos na prtica a indicar que estamos a estender qualquer
array
de
qualquer
tipo.
Como existem especificidades para comparar cada tipo, passamos um segundo parmetro (que na verdade o nico,
como j sabem) que um delegate. A invocao deste mtodo tem de levar como parmetro uma funo que devolva
True ou False, sendo o True para determinar elementos que
obedecem ao filtro, e False os que se vo descartar.

<Extension()>
Public Sub Falar(texto As String)
Dim s As New System.Speech.Synthesis.
SpeechSynthesizer()
s.Speak(texto)
End Sub
Invocao: TextoAFalar.Falar()
Estendemos a String e usamos o sintetizador de discurso
para falar o contedo da String.

Invocao exemplo: MinhaArrayDeInteger.Filtrar(Function(el)


el < 10)

As extenses tambm so teis quando queremos saber


outro tipo de informaes relacionadas com o tipo da instncia, como por exemplo, devolver o nmero de palavras numa
String:

Esta invocao resulta num novo array cujos elementos so


os da instncia invocadora, quando estes inferiores a 10. Ou
seja, por exemplo:
{2,45,67,4,9,10}.Filtrar(Function(el) el < 10)

<Extension()>
Public Function Palavras(ByVal texto As String) As
Integer
While texto.Contains(" ") Or
texto.Contains(vbTab)
texto = texto.Replace(" ", " ").
texto.Replace(vbTab, " ")
End While
Dim p As String() = texto.Split(" ")
Dim inc As Integer = 0
For Each tmp As String In p
If tmp.Length > 1 Then inc += 1
Next
Return inc
End Function

Devolve: {2,4,9}
Como identificar extenses que j usava?
J tiveram, certamente, oportunidade de reparar que a extenso identificada na caixa de sugestes com um smbolo
ligeiramente diferente do smbolo do mtodo: a extenso
apresenta uma pequena seta escura, no sentido descendente, do lado direito.

Invocao: AMinhaFrase.Palavras()
Por fim, e como exemplo mais interessante, podemos jogar
com os tipos genricos e implementar um mtodo semelhante ao Where das colees de IEnumerable, mas para aplicar
em arrays:
<Extension()>
Public Function Filtrar(Of T)(arr As T(), filtro
As Func(Of T, Boolean)) As Array
Dim ret(0) As T
For i As Integer = 0 To arr.Length - 1
Dim tmp As T = arr(i)
If filtro.Invoke(tmp) Then
If i < arr.Length - 1 And i <> 0 Then
ReDim Preserve ret(ret.Length)
ret(ret.Length - 1) = tmp
End If
Next
Return ret
End Function

Quantas vezes j utilizaram mtodos Microsoft com este


smbolo? As extenses mais famosas, e que mais devem
usar, so as extenses LINQ. Repararam que o Where, o
Find, e at o Count de colees de IEnumerables so extenses?

AUTOR
Escrito por Srgio Ribeiro
Curioso e autodidata com uma enorme paixo por tecnologias de informao e uma saudvel relao com a .NET Framework.
Moderador global na comunidade Portugal@Programar desde Setembro de 2009. Alguns frutos do seu trabalho
podem ser encontrados em http://www.sergioribeiro.com

42

CoreDump
CORE DUMP [12] - PROGRAMADOR ^ GESTOR
Uma evoluo tpica na carreira de programador chegar a
gestor. O PM, a carinhosa abreviatura de Project Manager,
muitas vezes algum que chega gesto de projeto tendo
feito um percurso tcnico e, tantas vezes, sem formao em
gesto.

mar atitudes que j criticou no passado com pessoas de


quem gosta.

O facto de se ser um bom programador no habilita ningum a ser um bom gestor de equipa ou de projeto na
rea das tecnologias de informao. Infelizmente, comum
promover os melhores engenheiros de software a gestores
menos capazes.
Este percurso parece lgico na viso das organizaes, em
particular das mais tradicionais, que no compreendem a
necessidade de proporcionar uma carreira tcnica a estes
profissionais. Como tal, na sua viso, o resultado do bom
trabalho que desenvolvem no desenvolvimento de software
a promoo para cargo de gesto.
Foto: filme Office Space

Se as organizaes tm responsabilidade neste ponto, os


engenheiros de software tambm tm a sua quota-parte,
uma vez no explicam que essa promoo no faz sentido
sem, pelo menos, formao adequada na rea de gesto.

Toda esta situao, embora comum, no condena o novo


PM a ser um mau gestor para sempre. Na verdade, o facto
de compreender muito bem toda a componente de engenharia de software e de conhecer os elementos da sua
equipa, permite-lhe planear, gerir e controlar de forma a
que a sua equipa tenha uma boa produtividade. O resultado faz com que a organizao tenha uma excelente equipa
de engenharia de software, dando-lhe assim uma vantagem
competitiva sobre a sua concorrncia.

Quando uma promoo deste tipo acontece, comum ver o


novo gestor a lutar com extrema dificuldade em saber o que
fazer, em especial com imensos problemas em conseguir
largar a sua zona de conforto e a fazer aquilo que o seu novo cargo exige. J assisti variadssimas vezes a situaes
destas, em que o novo PM continua a fazer desenvolvimento porque tem dificuldade em delegar essas tarefas
na sua equipa, em gerir os recursos que tem, a chamar a
s as tarefas mais complexas por achar que o faz melhor
do que qualquer outro na sua equipa e, pior a no conseguir controlar o projeto e, consequentemente a aumentar os
nveis de stress de toda a gente envolvida no processo.

Mas para tal, ambas as partes, o novo PM e a organizao,


tm de ter conscincia de que existe um processo de aprendizagem e de que deve ser dada formao adequada pessoa a promover. Se tal for feito, a transio ser mais pacfica, o novo PM no se sentir frustrado e a organizao obter o rendimento desejado de um PM.

Quando as coisas descarrilam, comum entrar nos cliches


do vamos fazer um esforo, o que faz com que o novo PM
tenha de se esforar por fazer com que a sua equipe conclua
as tarefas a tempo e com a qualidade necessria para que a
entrega do projeto no seja comprometida. Para tal, as atitudes do novo PM so, muitas vezes, mal interpretadas e tantas vezes vista como algum a quem a promoo lhe subiu
cabea. Simultaneamente, do outro lado, o sentimento do
novo PM de frustrao e at alguma agonia por ter de to-

Mas, e se a pessoa em causa no quiser sair da carreira


tcnica? Tal como referi no inicio, as organizaes devem
estar preparadas para estas situaes, e devem conseguir
proporcionar uma evoluo na carreira tcnica.
Cada vez mais as organizaes tm esta conscincia, mas
ainda estamos longe de deixar de promover bons engenheiros de software a maus gestores.

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

43

Media Partners da Revista PROGRAMAR

Anlises
Segurana em Redes Informticas (4. Ed. Aumentada)
Estruturas de Dados e Algoritmos em C

Review
Segurana em Redes Informticas (4. Ed. Aumentada)
Ttulo: Segurana em Redes Informticas
(4. Ed. Aumentada)

temas: o Carto de Cidado e o captulo novo relativo a Protocolos de Autenticao de pessoas e sistemas em redes
informticas.

Autor: Andr Zquete

No propriamente um livro de consulta de bolso devido ao


seu contedo tcnico e extensividade. O prprio autor o indica que o livro "Segurana em Redes Informticas no pretende ser um catlogo de problemas e solues".

Em relao ao Carto de Cidado, penso que importante


focar este tema dado que est presente no dia-a-dia dos
portugueses. Conhecer a segurana deste smartcard uma
mais-valia. O livro oferece informao relativa ao tipo de
autenticao, as assinaturas digitais, hierarquias de certificao e a segurana que o Carto de Cidado nos oferece. Na
minha opinio, um dos tpicos mais interessantes. Para alm
disso, juntamente com o captulo 9 (Segurana em Redes
Sem Fios 802.11 / Wi-Fi), estes captulos podem ser interessantes para o leitor comum, leia-se sem grande conhecimento da rea de segurana de redes. Embora tenha termos
tcnicos, sempre importante a informao e dicas fornecidas nestes dois captulos.

O passo-a-passo dos diversos procedimentos dos tpicos


descritos no livro foi deixado de lado.

Para ajudar o leitor, toda a estrutura da informao da obra


est indicada para ser clara e fcil de identificar.

Esta 4. edio tem como principais temas os seguintes:

Ao longo do livro, o autor fornece diagramas explicativos e


detalhados, pecando apenas na falta de exemplos prticos
com ferramentas para o efeito. Talvez este ponto estivesse
fora do objectivo do autor.

Editora: FCA - Editora de Informtica,


Lda.
Pginas: 432
ISBN: 978-972-722-767-9
O livro "Segurana em Redes Informticas (4. Ed. Aumentada)" uma obra, segundo o autor, destinada a administradores de redes ou alunos na rea de segurana de redes.

- Criptografia
- Gesto de Chaves Pblicas (inclui uma descrio detalhada do funcionamento do nosso Carto de Cidado)

No final, o livro conta com uma tabela de correspondncia


dos principais termos tcnicos em portugus europeu e o
portugus brasileiro. Sem dvida um contedo til dado que
a informao em portugus na web bastante diversificada
em ambos os pases.

- Vulnerabilidades em Mquinas de Sistemas Distribudos


- Vulnerabilidades em Redes Locais e de Grande Escala
- Firewalls

Para concluir, na minha opinio pessoal, o autor deveria


referir por outros temas mais actuais o "ciberpraga" ou
"atacante habilidoso". No meu ponto de vista, so termos
desactualizados.

- Sistemas de Deteco de Intruso (inclui os casos de estudo dos sistemas mais populares actualmente - Tripwire,
Snort e Antisniff)
- Redes Privadas Virtuais

Eu recomendo o livro para administradores de redes que


queiram aprender as bases e a teoria, dado que por vezes
esquecida em tutoriais e manuais de rede. Tambm recomendo o livro para uso de estudo aos docentes de
"Segurana de Redes".

- Segurana em Redes Sem Fios 802.11


- Protocolos de Autenticao
De facto, esta obra ilustra muito bem estes temas, onde saliento a explicao ao detalhe dos algoritmos e tcnicas criptogrficas, cujo o leitor poder praticar diversos tipos de cifra.
Esta verso aumentada, para alm da reviso e o acrscimo
de captulos em relao edio anterior, inclui mais dois

Parabns ao autor Andr Zquete por esta obra completa.


Espero que continue actualizar com a mesma qualidade futuras edies.

AUTOR
Escrito por David Sopas
Analista de segurana web, programador, fundador, editor do WebSegura.net e lder do projeto ScanPW.
Colabora regularmente com a comunicao social em assuntos relacionados com a segurana da informao.

46

Review
Estruturas de Dados e Algoritmos em C
gramao defensiva, estudo das principais estruturas de
dados dinmicas, principais classes de algoritmos, implementao de diferentes tipos de memrias e por fim o estudo
dos tipos de dados abstracto grafo / dgrafo e os seus algoritmos mais importantes.

Ttulo: Estruturas de Dados e Algoritmos


em C
Autor: Antnio Adrego da Rocha
Editora: FCA - Editora de Informtica,
Lda.

No final de cada sub-captulo existe um resumo dos contedos a reter o que facilita de certa forma a reviso de contedos quando j sabemos previamente em que tema se insere.

Pginas: 616
ISBN: 978 972 722 769 3

O contedo de simples leitura e de fcil percepo, sendo


que usada uma linguagem muito user-frendly o que facilita muito a leitura da obra, no se tornando extremamente
tcnica do ponto de vista da linguagem utilizada. O uso de
exemplos explicativos de cdigo implementado e devidamente comentado so uma enorme ajuda na percepo da real
implementao dos contedos abordados.

Programao, a linguagem do futuro permite executar praticamente tudo, se no mesmo tudo aquilo que a nossa imaginao possa equacionar. No entanto o desenvolvimento de
solues de software de mdia e elevada complexidade trs
consigo a necessidade de aprofundar os conceitos algortmicos que no fundo so a base da programao.
com esse mesmo objectivo de aprofundar os conceitos
algortmicos dos programadores que se apresenta este livro
Estruturas de Dados e Algoritmos em C.
Ao nvel fsico da edio no tenho nada de errado a apontar, sendo que a tipografia de qualidade permitindo uma
fcil e rpida percepo visual dos contedos abordados.
O livro Estruturas de Dados e Algoritmos em C uma obra
que se destina a programadores e a alunos de programao,
apresentando nfase na decomposio funcional das solues recorrendo implementao de tipos de dados abstractos.
A organizao dos contedos foi escolhida mediante a sua
importncia e dependncia entre contedos, incluindo exemplos de cada tipo de implementao, exerccios complementares e at algumas recomendaes de outras leituras sobre
a temtica em questo.
Dividido em cinco grandes temas e onze captulos principais,
as primeiras pginas da obra so orientadas a uma pequena
introduo ao que a obra se propes a abordar assim como
a tecer algumas consideraes sobre a utilidade e importncia das estruturas de dados e algoritmos na programao.

Como estudante de Engenharia Informtica considero a obra


Estruturas de Dados e Algoritmos em C uma obra de qualidade na apresentao dos contedos necessrios para
aprender e conhecer com alguma profundidade as estruturas
de dados e algoritmos que to importantes so no dia-a-dia
de um programador ou estudante de programao, tendo
tudo o que necessrio para se tornar uma obra de referncia sobre o tema e escrita em lngua Portuguesa.

Os grandes temas abordados na obra estendem-se desde o


estudo do paradigma da programao modular em C, apresentando os aspectos fundamentais da implementao de
tipos de dados abstractos recorrendo metodologia de pro-

AUTOR
Escrito por Nuno Santos
Curioso e autodidacta com uma grande paixo pela programao e robtica, frequnta o curso de Engenharia Informtica na
UTAD alimentando o sonho de ainda vir a ser um bom Engenheiro Informtico. Estudante, Blogger, e moderador no frum
Lusorobtica so algumas das suas actividades. Os seus projectos podem ser encontrados em: http://
omundodaprogramacao.com/

47

COMUNIDADES
Comunidade NetPonto Criando aplicaes Windows Phone 8.1 e Windows 8.1 usando o App Studio da Microsoft

COMUNIDADE NETPONTO
http://netponto.org

CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
Este artigo tem como objetivo apresentar o App Studio da
Microsoft, de forma a criar aplicaes para Windows Phone
8.1 e Windows 8.1.

Neste momento estamos prontos para comear a criar


aplicaes! Para tal basta clicar no boto Start new project.

H uns meses atrs a Microsoft lanou o Windows Phone


App Studio Beta, servio este que permite que qualquer
pessoa sem conhecimentos de programao consiga criar
aplicaes para Windows Phone em apenas 4 passos:
Tenha uma ideia, adicione o contedo, escolha o estilo e use
a aplicao. Recentemente, mais especificamente no
evento //Build/ da Microsoft que se realizou no passado ms
de Abril, foi lanada uma nova verso deste servio e foi
lanado tambm a verso Windows App Studio Beta, que
para alm das aplicaes de Windows Phone, agora
passamos a poder criar aplicaes Windows 8.1 neste
servio.

O App Studio fornece um conjunto de templates para ajudar


os utilizadores na criao das aplicaes. Estes templates
no so mais que aplicaes demos de temas especficos e
mais usados.

O
servio
pode
ser
acedido
a
partir
de
appstudio.windowsphone.com. E para comear a us-lo
necessrio uma conta Outlook, Live Id ou no caso de no ter
uma conta destas deve usar uma conta que esteja associada
ao Windows Live Id. Caso no esteja associado, pode
associar qualquer endereo de email a este servio na
seguinte referncia: http://bit.ly/1gywtmO ou na pgina de
login, clicar em Inscrever.

De salientar que todos os templates so aplicaes C#/XAML


e esto disponveis tanto para Windows Phone 8.1 como
para Windows 8.1, exceto o Web App Template que apenas
est disponvel para Windows Phone.
Ao selecionar um template do tipo Empty App estamos a
criar uma aplicao de raiz, do zero. Este template muito
utilizado em casos em que os outros templates no
satisfaam as necessidades do utilizador ou para o caso de
utilizadores mais avanados que j tem alguma experincia
com o App Studio. O utilizador ir definir todo o tipo de
contedo, estilos e ter que usar toda a sua criatividade para
obter uma great app. No caso do template Web App
Template o utilizador ir tambm criar a aplicao do zero,
mas neste caso dado um Url de base que ser o ponto
inicial da aplicao e ter acesso a alguns botes na
AppBar, este template o ideal para site que se adaptam a
dispositivos mveis. Por outro lado, os outros templates
disponveis j permitem ao utilizador ter um guia de

Ao fazer o login pela primeira vez, ir aparecer um ecr de


permisses de acesso sua conta, no entanto esta
permisso pode vir a ser alterada mais tarde se assim o
desejar. A seguir, ter que aceitar os temos de utilizao do
servio e definir um utilizador (User) para a conta de e-mail
que est usar.

49

COMUNIDADE NETPONTO
http://netponto.org

CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
orientao na aplicao que est a construir e apenas ter
que alterar os dados e customizar a aplicao a seu gosto.
Note-se que neste caso o utilizador poder mudar
radicalmente toda a aplicao inicialmente criada pelo
template.

definio do contedo da aplicao, que constitudo por


cinco seces:

Vejamos agora na prtica como podemos criar aplicaes


com estes templates.
Contoso Ltd Template
Depois de selecionar um template aparece um ecr onde
podemos visualizar a aplicao numa espcie de simulador
de Windows Phone 8.1 e Windows 8.1. No entanto, no
permitido a navegao para a pginas de detalhe.

About us uma seco do tipo HTML

Catalog uma seco do tipo coleo dinmica

Team uma seco do tipo coleo dinmica

News uma seco do tipo Bing

Contact us uma seco do tipo Menu, que contm


aes de menus.

No mximo podem ser definidas seis seces para a


aplicao, e depois de definida cada seco possvel editar,
apagar ou mover de posio de forma a ordenar da melhor
forma.
Para cada sesso possvel escolher uma das seguintes
opes:

Neste ecr j se consegue ficar com uma ideia da aplicao


sem a ter que instalar no dispositivo. Vejamos ento as
configuraes deste template.
Contedo (Content)

Rss adiciona a informao baseada no feed


fornecido pela referncia do rss

HTML - permite adicionar uma pgina esttica que


incluiu cdigo HTML permitindo criar contedo
personalizado

Youtube lista de vdeos com base no identificador do


utilizador no Youtube ou numa palavra de pesquisa

Flickr lista um conjunto de fotografias fornecidas


com base no Flickr UserId ou numa palavra de
pesquisa

Bing lista um conjunto de referncias web

Facebook lista o feed da pgina do facebook com


base no identificador da pgina

Menu permite criar uma lista de aes de menu que


podem recorrer a outras aplicaes para aes
diversas (por exemplo: indicar a morada da empresa e
usar o Here Maps, indicar o nmero de telemvel para
efetuar chamadas)

Collection permite definir dados estticos ou


dinmicos. No caso de dados dinmicos permitido
possvel importar/exportar dados de um ficheiro CSV.

Uma futura funcionalidade ser a fonte de dados twitter, que


neste momento no est disponvel no App Studio, mas que
foi mencionada na sesso sobre o tema que decorreu no //
Build/.
O App Studio j apresenta uma boa lista de fontes de dados,
permitindo o utilizador criar aplicaes interessantes, no
entanto, o facto de se basear em feeds existe algumas
limitaes no nmero de dados disponveis e na qualidade da
apresentao dos mesmos.

A primeira pgina apresenta o nome da aplicao e o


logotipo da mesma (no topo do lado esquerdo) e apresenta a

50

COMUNIDADE NETPONTO
http://netponto.org

CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
Apesar de esta pgina no mencionar o tamanho das
imagens, quando fazemos editar aparece um ecr que nos
informa sobre o tamanho possvel de cada imagem.

Tema (Theme)

Publicar (Publish)

Nesta pgina podemos definir a imagem ou cor de fundo da


aplicao, definir a cor do texto e a cor da Application bar.
Existindo trs opes, customizado (usando a imagem de
fundo), a preto (mais conhecido por Dark Style) ou a branco
(mais conhecido por Light Style). O boto Select permite
definir o estilo pretendido e depois disso preciso fazer
Save para guardar as configuraes. Note-se que ao lado
do texto Background image existe um boto que permite
fazer o upload da imagem de fundo.

Nesta pgina definido a lngua usada pela aplicao,


atualmente s possvel definir uma. possvel definir o
titulo, a descrio da aplicao, permitir incluir a pgina
Acerca de (About) e incluir publicidade na aplicao (que
obriga a configuraes finais no cdigo). E ainda possvel
associar a aplicao Loja do Windows, que por sua vez
requer que seja reservado um nome para a aplicao na
Loja.

Mosaicos (Tiles)

Depois de todas as configuraes possvel finalizar a


aplicao clicando no boto Finish.
Finalizar (Finish)

No separador Tiles, podemos definir que tipo de mosaicos


(tiles) pretendemos para a aplicao, existindo trs tipos: Flip
Template, Cycle Template e Icon Template. Neste caso foi
selecionado o Cycle Template e definido as imagens e texto
pretendido.
No separador Splash & Lock, definido as imagens para o
splash screen das aplicaes para Windows Phone 8.1 e
para Windows 8.1 e o lock screen do Windows Phone.

Nesta pgina podemos visualizar as aplicaes para cada


target (no sendo possvel navegar) e possvel gerar a
aplicao para assim obtermos o pacote da aplicao para
instalar em cada dispositivo ou ento obter o cdigo fonte. Ao

51

COMUNIDADE NETPONTO
http://netponto.org

CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
clicar no boto Generate obtemos um ecr onde podemos
escolher qual a aplicao que pretendemos gerar.

Ao gerar a aplicao para Windows 8.1 obtemos o seguinte


ecr:

Podemos gerar para ambos os casos, que implica duas


geraes diferentes. No entanto, para um utilizador mais
experiente e que esteja a usar o Visual Studio para testar a
sua aplicao, recomendo que seja feita a gerao para
Windows 8.1 porque o cdigo gerado uma soluo
Universal app que constitudo pelo projeto da aplicao
Windows Phone 8.1, pelo projeto da aplicao Windows 8.1,
por um projeto partilhado entre os projetos anteriores e neste
caso ainda contm um projeto do tipo portable class libray
com toda a estrutura de dados.

Onde podemos obter o pacote da aplicao Windows 8.1 e


depois usando PowerShell podemos instalar a aplicao num
PC com Windows 8.1.

Depois de gerado temos disponvel o pacote da aplicao


que nos permite testar a aplicao no dispositivo ou obter o
cdigo fonte e testar no simulador ou no dispositivo usando o
Visual Studio. Note-se que um utilizador que no tenha conta
de Developer e por essa razo no tem o dispositivo
desbloqueado, ter que instalar o certificado fornecido e s
depois poder instalar a aplicao no dispositivo usando
para tal o QRCode da aplicao ou a referncia web
fornecida. possvel partilhar a aplicao nas redes sociais
e por e-mail.

Depois desta gerao, ao obter o cdigo fonte vamos obter


uma soluo Universal app, que ter a seguinte estrutura:
Com o cdigo fonte cada uma das aplicaes pode ser
extendida de forma a adicionar novas funcionalidades, tais
como:

Permitir mais do que uma lngua

Permitir publicidade na aplicao

Suporte para twitter

Alterar a interface com o utilizador

Entre outras
Web App Template
Com j foi referido, este template s est disponvel para
aplicaes de Windows Phone e trata-se uma aplicao
Web. Vejamos ento na prtica como usar este template.

52

COMUNIDADE NETPONTO
http://netponto.org

CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
Ao selecionar o Web App Template iremos ter a seguinte
pgina

As aplicaes geradas pelo App Studio, devem ser testadas


em vrios dispositivos para garantir que a aplicao est a
funcionar correctamente e est de acordo com o que o
utilizador definiu. S depois de terminarem os testes que a
aplicao deve ser submitida na loja. De relembrar que na
pgina de Publish tinhamos a opo de ligar a aplicao
loja, e na pgina final depois da gerao da aplicao nos
fornecido a referncia dos pacotes para submeter na loja. As
aplicaes geradas pelo App Studio so submitidas ao
mesmo processo de cerfiticao que uma aplicao
desenvolvida por um programador.

Como se pode ver, o contedo desta aplicao resume-se


referncia de base da aplicao, que no mais que um
website que supostamente foi desenhado para dispositivos
mveis.
Neste exemplo, est-se a usar o endereo m.microsoft.com
mas poderamos utilizar por exemplo: booking.com,
m.sapo.pt, m.vodafone.pt, entre outras referncias.
As definies para Theme, Tiles e Publish so iguais ao
que foi apresentado no template Contoso Ldt.

Os utilizadores mais avanado, que pretendam extender a


aplicao dando novas funcionalidades no tem como
submeter essas alteraes no site do App Studio, para que
numa nova verso da aplicao no App Studio essas
alteraes sejam tidas em conta. A soluo passa por fazer
um merge entre o cdigo de fonte alterado e a nova verso
da aplicao. E apartir do momento que o cdigo fonte
alterado, o utilizador que responsvel pela criao do
pacotes da aplicao utilizado o Visual Studio.

Ao clicar em Finish iremos para a pgina de gerao do


pacote da aplicao e do cdigo fonte. E ao clicar em
Generator iremos ter o seguinte ecr

Para terminar, deixo uma referncia sobre o este tema que


podem consultar em Building apps without code using
AppStudio, onde possvel encontrar um conjunto de artigos,
vdeo e frum sobre o App Studio.
Em concluso, conclui-se que o App Studio apresenta uma
soluo rpida no desenvolvimento de aplicaes tanto para
Windows Phone 8.1 como para o Windows 8.1, sendo
possvel extender as funcionalidades da aplicao atravs do
cdigo fonte gerado. De salientar que apesar de todo o
automatismo associado, existem algumas limitaes que
devem ser trabalhadas de futuro para que as aplicaes
geradas pelo App Studio apresentem ainda mais qualidade.

Com j tinha referido, apenas iremos gerar a aplicao para


Windows Phone. E como podemos ver no template do
Contoso Ltd, neste caso tambm vamos ter disponvel o
certificado para instalar no dispositivo, a referncia web e o
QRCode do pacote da aplicao, partilha nas redes sociais e
via e-mail e o cdigo fonte.
O resultado final da aplicao, usando a referncia de base
m.sapo.pt,

AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra e Microsoft Certified Profissional Developer. Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps. O seu Blog
www.saramgsilva.com e o twitter @saramgsilva.

53

No Code
O Windows Phone 8.1 e a atualizao do Windows 8.1

No Code
O Windows Phone 8.1 e a atualizao do Windows 8.1
De salientar, que o menu rpido personalizvel e o Action
Center est acessvel mesmo que o dispositivo esteja
bloqueado (LockScreen).

Este artigo tem como objetivo apresentar as principais


novidades do Windows Phone 8.1 e da atualizao do
Windows 8.1.

O ecr de bloqueio apresenta uma alterao significativa,


sendo possvel configurar o mesmo. Exemplo disso a
possibilidade de manter o resumo do calendrio e
notificaes das aplicaes ou ento escolher a
apresentao semanal, destacando o dia da semana atual.

No passado dia 2 de Abril, foi apresentado pela Microsoft na


Keynote do //Build/, o Windows Phone 8.1 e uma atualizao
para o Windows 8.1. Para aqueles que no poderam assistir
em direto no dia do evento, o vdeo da Keynote est
disponvel em http://bit.ly/1oxd0fg.
Windows Phone 8.1
O Windows Phone 8.1 apresenta uma grande novidade, que
na opinio dos especialistas, vem melhorar a experincia de
utilizao do dispositivo, refiro-me ao Action Center!

O ecr principal (start screen) tambm apresenta novidades.


A partir de agora possvel escolher uma fotografia como
imagem de fundo, tornando o dispositivo ainda mais pessoal.
De salientar que os programadores tero que ter o cuidado
de lanar as aplicaes com os mosaicos (tiles) sem cor de
fundo para que esta imagem seja visvel.

Cortana foi a funcionalidade mais falada no evento, redes


socais e noticias, e a nova assistente digital da nova verso
do Windows Phone com base no Bing. Esta assistente
comea por aprender tudo sobre o utilizador, guardando toda
a informao num bloco de notas, possvel interagir
verbalmente ou por escrito. Tem a capacidade de responder
s questes mais mirabolantes do dia-a-dia, e tem a
capacidade de analisar os emails do prprio dispositivo
(depois de previa autorizao do utilizador) e com base nisso
ajudar o utilizador no seu dia-a-dia. Esta funcionalidade

O Action Center vai permitir o utilizador ficar a pare de todas


as notificaes das vrias aplicaes, assim como de
chamadas no atendidas, SMS recebidas e que ainda no
foram lidas e ainda possvel de forma rpida ativar o Modo
de Avio ou ligar/desligar o acesso internet.

55

No Code
extensvel e poder interagir com outras aplicaes, como
por exemplo o Skype, Facebook ou Twitter.

Esta funcionalidade s ficar disponvel em Portugal no ano


de 2015. E ser disponibilizada brevemente nos USA como
verso beta e no segundo semestre de 2014 ser publicado
nos USA, UK e China.

A aplicao Fotografia & Cmara apresenta as fotografias


mais recentes, organizando-as por data e localizao e ao
nvel da Cmara apresenta melhorias ao nvel da interface
com o utilizador.

introduzido um novo teclado inteligente, Word Flow


Keyboard, que permite descobrir qual a palavra que ests a
escrever e com isso diminuir o tempo necessrio para
escrever uma mensagem. E quanto mais se escrever usando
este teclado, mais ele saber sobre o utilizador e assim ir
adivinhar mais rapidamente a palavra que se vai escrever.
Atualmente suportado por 16 lnguas.

A aplicao Pessoas passa a estar diretamente ligada a


outras aplicaes relacionadas com redes sociais, permitindo
assim acesso a todas as funcionalidades das aplicaes
instaladas.
A aplicao Loja apresenta uma nova organizao na
apresentao das aplicaes e apresenta sugestes
consoante a localizao. possvel definir atualizaes
automticas das aplicaes ou apenas quando se est ligado
ao Wi-Fi, instalar aplicaes ou jogos em cartes SD e caso
o programador permita ser possvel fazer cpias de
segurana (backups) das aplicaes e dos jogos na
OneDrive. De referir, que todas as aplicaes de Windows
Phone 7.8 que j correm no Windows Phone 8.0 tambm iro
correr em Windows Phone 8.1 e o mesmo acontece com as
aplicaes de Windows Phone 8.0. No entanto, as aplicaes
Windows Phone 8.1 no iro correr em dispositivos com
Windows Phone 8.0 at estes ser atualizados para a verso
Windows Phone 8.1.
Ao nvel de envio de email, vai ser possvel enviar os
mesmos encriptados e ser a aplicao nativa de email que
ter esta funcionalidade. Os documentos do office podero
vir a ser protegido por password e ser possvel aceder a
documentos corporativos usando uma ligao por VPN.

A aplicao calendrio do Windows Phone foi redesenhada e


agora apresenta uma nova vista semanal que j h algum
tempo era requisitada pelos utilizadores, tendo agora um
aspeto semelhante ao Outlook para PC e tem integrado a
informao sobre o tempo. possvel sincronizar com o
calendrio do Google e ter mltiplos calendrios.

O utilizador vai ter a possibilidade de obter mais feedback no


uso do seu dispositivo atravs do Data Sense, Wi-Fi Sense,

56

No Code
Storage Sense, and Battery Saver, salientando que este ir
ter acesso informao de quais as aplicaes que esto a
consumir mais recursos. Poder editar a sua playlist e gerir a
sua coleo online de forma fcil e eficiente, e poder
comprar ou alugar vdeos atravs do Xbox Music e
finalmente possvel subscrever podcasts atravs de RSS
feeds ou atravs de pesquisa no Bing em todos os pases
em que o Windows Phone est disponvel.

Atualizao do Windows 8.1


A atualizao do Windows 8.1 focada na utilizao do rato
e teclado, permitindo ao utilizador ter uma melhor experincia
de utilizao, isto , quando estamos perante o ecr principal
e estamos perante uma utilizao de rato e teclado possvel
clicar no mosaico com o boto do lado direito e assim abrir
um menu de contexto que nos possibilita: remover do ecr
principal, fixar na barra de tarefas, desinstalar a aplicao,
mudar o tamanho do mosaico e ligar/desligar as notificaes
da aplicao. Desta forma a appbar no ir aparecer como
acontecia antes, note-se que para uma utilizao com touch
a usabilidade mantm-se.

Esta verso do Windows Phone tem a aplicao do Skype


integrada com o sistema de chamadas permitindo assim que
o utilizador mude de uma chamada normal para uma
chamada de vdeo no Skype.

As aplicaes modernas passam a estar acessvel a partir do


desktop, isto , possvel afixar aplicaes modernas na
barra de tarefas e quando estas esto a correr a aplicao
fica disponvel tambm na barra de tarefas permitindo ao
utilizar uma rpida troca entre as vrias aplicaes, assim
como uma fcil interao com as aplicaes, o caso da
aplicao Msica que apresenta um quick player.

O Internet Explorer 11 disponibilizado no Windows Phone


8.1 e permite ver todos os separadores abertos, assim como
os favoritos. Tem ainda as funcionalidades de guardar e
lembrar as passwords do utilizador, um modo de leitura de
escrita manual, fazer o upload de documentos e suporte para
WebGL.
Por fim, termino com uma nova funcionalidade, que j h
muito era requisitada por muitos, e que apenas era possvel
dentro da Microsoft, finalmente possvel projetar o
contedo do Windows Phone num PC, Tablet usando um
cabo USB ou atravs da TV (com suporte de Wireless
Miracast).

Perante uma utilizao de rato e teclado passamos a ter


disponvel uma barra no topo, que aparece quando o rato se
aproxima do topo do ecr, permitindo ao utilizador minimizar,
fechar ou ento definir que quer a aplicao aberta do lado
esquerdo ou do lado direito do ecr (split left/split right),
opo esta que surge no lado superior esquerdo.

Os utilizadores que sejam detentores de conta de


programador e que queriam ter acesso verso Windows
Phone 8.1 Preview (disponvel apartir de 10 de Abril)
consultem o seguinte artigo: Windows Phone Preview for
Developers.

57

No Code
Na Keynote do //Build/ foi apresentado o regresso do boto
iniciar com uma interface que inclui Live Tiles e foi ainda
apresentado aplicaes modernas a correr dentro de janelas,
no entanto estas novidades ainda no esto disponveis
nesta atualizao.
A atualizao do Windows 8.1 est disponvel via MSDN a
partir do dia 2 de Abril e apartir do dia 8 de Abril para o
pblico em geral atravs do Windows Update.
A pesquisa do Windows passa a estar integrada com a Loja,
permitindo que as pesquisas procurem por aplicaes que
satisfaa o termo inserido. Se no resultado da pesquisa
aparecer uma aplicao que pretendemos desinstalar,
possvel faze-lo atravs do menu de contexto e possvel
definir se pretende remover a aplicao de todos os PC
sincronizados pela atual conta.

A conta Microsoft vai permitir que um Windows Phone 8.1 e


um Windows 8.1 estejam sempre sincronizados de forma a
que se alterar o tema do Windows Phone 8.1 esta alterao
se ir refletir no Windows 8.1. Ao nvel da Loja e do consumo
de aplicaes o utilizador apenas ir pagar apenas uma vez,
isto , ao comprar uma aplicao na Loja do Windows Phone
o utilizador ter acesso mesma aplicao na Loja Windows
sem ter que pagar mais por isso, o contrrio recproco.
Outras definies como por exemplo o acesso ao Wi-Fi
tambm ser sincronizado entre dispositivos.
Por fim, gostaria de sugerir algumas demonstraes
disponveis no Youtube pela equipa de Windows Phone e do
Windows:

Passamos a ter notificao de quantas aplicaes novas


foram instaladas e quando consultamos a lista de aplicaes
instaladas, as aplicaes novas aparece destacadas para
que o utilizador consiga se aperceber quais so.

Introducing Windows Phone 8.1

Live Demo: New Windows Phone Start Screen and


Cortana

Meet Cortana: The New Windows Phone 8.1 Personal


Assistant

Introducing the Windows 8.1 Update


Para quem quiser ler mais notcias sobre este tema
consultem as seguintes referncias:

Os PC Settings passam a estar disponveis a partir de um


mosaico, facilitando assim o acesso s definies e passa a
ter disponvel o acesso ao CPanel Control no menu, opo
que anteriormente s era possvel aceder a partir das
definies do Desktop. Outra novidade a possibilidade de
ver o espao ocupado em disco e a possibilidade de
consultar o espao ocupado por cada aplicao moderna.

Novidades sobre a atualizao do Windows 8.1 e


Windows Phone 8.1 (Em Portugus)

Windows Phone 8.1 and Windows 8.1 News (Em


ingls)

Em concluso, o Windows Phone 8.1 apresenta-se com mais


funcionalidades que permite uma experincia mais rica e
pessoal, e a convergir para uma utilizao mais global uma
vez que a cada vez mais o Windows Phone e o Windows
esto sincronizados entre si. Por sua vez a atualizao do
Windows 8.1 vem facilitar a vida ao utilizador que diariamente
usa rato e teclado, aumentando assim a usabilidade do
prprio SO.

AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra e Microsoft Certified Profissional Developer. Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps. O seu Blog
www.saramgsilva.com e o twitter @saramgsilva.

58

Elege o melhor artigo desta edio


Revista PROGRAMAR
http://bit.do/ProgramarED45_V

Veja tambm as edies anteriores da


Revista PROGRAMAR
42 Edio - Setembro 2013

43 Edio - Dezembro 2013

44 Edio - Fevereiro 2014

39 Edio - Fevereiro 2013

40 Edio - Abril 2013

41 Edio - Junho 2013

e muito mais em
www.revista-programar.info

Você também pode gostar