Sie sind auf Seite 1von 61

EDITORIAL

2
EQUIPA PROGRAMAR
try: keepUpWork: Except Error: print again break

Tentamos Ousamos falhar, tentamos de novo E no final do dia, tentamos
outra vez!
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 via-
se 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.
Coordenador
Antnio Pedro Cunha Santos


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-a-
programar.org

Website
http://www.revista-programar.info

ISSN
1 647-071 0
NDICE

3
TEMA DE CAPA
Estendendo uma aplicao criada no App Studio da Microsoft (Sara Silva)
A PROGRAMAR
COLUNAS
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
JSF - Parte 3 (Managed beans) (Lus Soares)
Pascal Array de argumentos (Igor Nunes)
Criar uma aplicao para Android com mapa (Joo Silva )
C# CRUD (Create, Read, Update & Delete) (Fbio Pinho)
C# - Novas Funcionalidades Do C# 6.0 Anteviso De Abril De 2014 (Paulo Morgado)
Visual(NOT)Basic - Mtodos de extenso o que preciso, como quero (Srgio Ribeiro)
CoreDump - Programador ^ Gestor (Fernando Martins)
6
13
COMUNIDADES
Comunidade NetPonto Criando aplicaes Windows Phone 8.1 e Windows 8.1 usando o App Studio da Microsoft
(Sara Silva)
46
49
34
15
19
ANLISES
Segurana em Redes Informticas (4. Ed. Aumentada) (David Sopas)
Estruturas de Dados e Algoritmos em C (Nuno Santos)
NO CODE
O Windows Phone 8.1 e a atualizao do Windows 8.1 (Sara Silva) 55
26

47
40
43
NOTICIAS

4

Dar Voz ao AVC" aplicao inform-
tica para ajuda a pessoas com AVC
Dar Voz ao AVC" uma aplicao de software recentemente
desenvolvida por Fethi Houita, ex-aluno do curso de Engenha-
ria Informtica [LEInf ] da Escola Superior de Tecnologia e
Gesto do Instituto Politcnico de Viana do Castelo [ESTG-
IPVC].
A aplicao (app) visa poder dotar as pessoas que sofreram
AVC (e ficaram afsicas), de uma ferramenta para poder ex-
pressar 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.
Nem todas as pessoas que sofreram AVC e tm afasia pode-
ro usar a app, porque necessitam que a compreenso esteja
intacta e de possuir recursos intelectuais e cognitivos para
utilizar o tablet e a app.
Para Jorge Ribeiro, atual coordenador do curso de Engenha-
ria Informtica, este e outros projetos de ex-alunos refletem o
conhecimento e as competncias adquiridas ao longo do cur-
so, possibilitando-lhes reunir um conjunto de competncias e
know-how na rea da Engenharia Informtica. Reflete tam-
bm 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.
Adicionalmente, este mais um exemplo de sucesso em em-
preendedorismo.
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
Fonte IPVC.pt
Portugus garante lugar no muro da
fama da Adobe
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 progra-
madores 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 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 envia-
do para a Exame Informtica.
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 verda-
de encaminham os internautas para um endereo malicioso,
que poder ser usado para suportar estratagemas que desvi-
am dados confidenciais.
Segundo Manuel Sousa, a falha afetava todo o domnio ado-
be.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
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 reconhecen-
do o mrito do jovem finalista do secundrio com a atribuio
de um lugar no muro da fama dos caadores de bugs.
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.
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 distin-
guiu 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

6
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.
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.
Estendendo uma aplicao criada no App Studio da Microsoft
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.
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

7
O resultado ser o seguinte,
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
De seguida, devemos editar a seo Twitter, para definir
uma entrada de dados para teste e para definir os Bindings
do DataTemplates.
Comecemos por definir os Bindings, primeiro da pgina
principal:
Em seguida da pgina de detalhe:
Por fim vamos criar uma entrada falsa, no separador de da-
dos:
possvel importar dados de um ficheiro CSV ou inserir ma-
nualmente, neste caso, apenas foi criada uma entrada ma-
nualmente.
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.
No Visual Studio, o projeto ir ter a seguinte estrutura:
AppStudio.Windows projeto para a aplicao Win-
dows 8.1
AppStudio.WindowsPhone projeto para a aplicao
Windows Phone 8.1
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
TEMA DA CAPA

8
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 es-
trutura de dados usadas nas duas aplicaes e con-
tm ainda os providers de dados (facebook, fe-
eds,)
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 AppStu-
dio.Data

















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

9
return data;
}
Em TwitterDataSource, devemos alterar o mtodo LoadData
para:
Em vez de usar o ServiceDataProvider devemos criar o Twit-
terDataProvider que ser


Para obter as chaves

dever aceder ao dev.twitter.com e criar uma aplicao e em
seguida obter as chaves.

necessrio instalar o pacote do Nuget linqtoTwitter no pro-
jeto AppStudio.Data, mas como este projeto uma Portable
Class Library com targets para Windows Phone 8.1 e Win-
dows 8.1, a instalao do pacote ir falhar. Para dar a volta a
este problema, uma vez que ainda no existe uma atualiza-
o, deve-se instalar o pacote no projecto AppStu-
dio.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 gne-
ro

App\packages\linqtotwitter.3.0.2\lib\portable-
win8+net45+wp8 e deve-se selecionar a dll LinqToTwit-
terPcl.dll e assim o projeto AppStudio.Data ir ter a refern-
cia do LinToTwitterPcl.

Depois de correr a aplicao iremos ter o seguinte resultado,
para Windows Phone 8.1






















Seco da pgina principal Pgina de detalhes

A verso Windows 8.1 tem o seguinte aspeto
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;
}
public class TwitterDataProvider
{
TwitterContext twitterCtx;

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

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")
});
}
const string ConsumerKey = ".";
const string ConsumerSecret = "";
const string AccessToken = " ";
const string AccessTokenSecret = "";
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
TEMA DA CAPA

10
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 infor-
mao que na pgina inicial, por tanto iremos remover.

No projeto de cada aplicao, podemos encontrar uma pasta
chamada Views que contm uma pasta chamada DataTem-
plates, que por sua vez contm o dicionrio de recursos para
cada seco. Se abrirmos o ficheiro TwitterViews, encontra-
mos o DataTemplate TwitterItem que representa cada item
do feed do Twitter.
Para a verso do Windows Phone 8.1, podemos alterar
Para a verso de Windows 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}">
</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" />

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

<TextBlock Grid.Row="1"
Grid.ColumnSpan="2" Margin="0, 0, 5, 0"
Style="{StaticResource ItemSmallText}"
MaxHeight="200" VerticalAlignment="Top"
Text="{Binding Description}" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="TwitterListSnapped">
<Grid Width="230">
<GridView ItemsSource="{Binding Pre-
viewItems}" SelectedItem="{Binding NavigationItem,
Mode=TwoWay}"
S e l e c t i o n M o d e = " N o n e "
I s S w i p e E n a b l e d = " F a l s e " S c r o l l V i e w -
er.VerticalScrollBarVisibility="Hidden"
ItemTemplate="{StaticResource
TwitterItemSnapped}">
</GridView>
<ProgressBar Height="40" Fore-
ground="White" VerticalAlignment="Top" IsIndeter-
minate="True" Visibility="{Binding ProgressBarVis-
ibility}" />
</Grid>
</DataTemplate>

<!-- ListPhotoLeftDescription Item -->
<DataTemplate x:Key="TwitterItem">
<Grid Width="480" Height="240">
<Grid.RowDefinitions>
<RowDefinition Height="0"/>
<RowDefinition Height="130"/>
<RowDefinition Height="160"/>
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
TEMA DA CAPA

11
E assim obtemos um novo aspeto da aplicao, para Win-
dows Phone 8.1 iremos ter:



















E para Windows 8.1 iremos ter
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.
EXTENDENDO UMA APLICAO CRIADA NO APP STUDIO DA MICROSOFT
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<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>
AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra e Microsoft Certified Profissio-
nal 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.
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


13
Este o 3 artigo da srie. Assume portanto que j tem um
projeto de exemplo JSF a funcionar. altura de fazer algu-
mas experincias, nomeadamente criar um backing bean.

Um backing bean uma classe Java que responde a pedi-
dos 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 mlti-
plos 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.
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 dispon-
vel para todas as sesses;
Session: o bean existe por utilizador; til para dados refe-
rentes ao que utilizador est a fazer durante um periodo de
utilizao;
View: semelhante ao session, mas por tab; como que
se cada tab do browser representasse uma sesso diferen-
te;
Request: a nica gesto de estado que existe dura apenas
o pedido e por isso o mais leve.
Para exemplificar como funciona um managed bean crie-
mos 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:
Clique com o boto direito do rato em Source Packa-
ges e faa New > Java Class:
2. D-lhe o nome de ClientesBean e coloque-o no packa-
ge pt.revista.programar.
3. O bean criado estar automaticamente disponvel para
ser usado nos XHTML sob a forma de
JSF - Parte 3 (Managed beans)
clientesBean (tcnica conhecida como convention over
configuration). Para tal, anote a classe com as anotaes
@ManagedBean e @SessionScoped (disponveis em ja-
vax.faces.bean).
Agora, crie uma propriedade com getter/setter chama-
da nome. Ficar com o seguinte cdigo:
Agora, na pasta Web Pages, v a index.html e
dentro de h:body coloque o seguinte cdigo:
Tal cdigo ir comunicar com o managed bean criado anteri-
ormente. O boto ir submeter o formulrio.
6. Agora precisamos da pgina para onde seremos redi-
recionados. 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:
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;
}

Public void setNome(String nome) {
this.nome = nome;
}
}
<h:form>
<h:inputText Value="#{clientsBean.nome}" />
<h:commandButton Acton="resultado
"value="enviar" />
</h:form>
<h:body>
<h:outputText value="Boa tarde #
{clientesBean.nome}" />
</h:body>
A PROGRAMAR

14
9. Agora est tudo em ordem. J temos uma pgina que
recebe o seu nome, um bean que o guarda e uma pgi-
na 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 conside-
ravelmente e damos por ns a fazer coisas muito complexas
em muito pouco tempo.
H que assinalar tambm que, ao usar JSF, devemos tentar
sempre conhecer e fazer uso das suas funcionalidades.

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.
Espero que tenha gostado do artigo. Qualquer dvida, sinta-
se vontade para me contactar. Consoante o interesse da
comunidade poderei escrever mais artigos sobre o tema,
nomeadamente sobre a integrao e utilizao do PrimeFa-
ces.
JSF - PARTE 3 (MANAGED BEANS)
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 reutili-
zar 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.
() uma espcie
de servlet de alto n-
vel. Entre vrias ou-
tras funes, faz a liga-
o camada dos ser-
vios que pode ser
uma BD, um servidor
remoto ou outro ()Um
managed bean repre-
senta o Controller no
padro MVC ()
A PROGRAMAR


15
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 conjun-
to, uma das consequncias destas regras a impossibilida-
de de se implementarem funes varidicas, isto , fun-
es com um nmero indefinido de argumentos s quais
podemos fornecer virtualmente uma infinidade de argumen-
tos, no havendo a restrio de ser possvel passar apenas
N argumentos em determinada ordem e com determinados
tipos.
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).
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 defini-
es); so apenas instrues que o compilador trata de for-
ma especial para nos permitir utiliz-las como se fossem
varidicas.
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.
Todo o cdigo presente neste artigo foi compilado recorren-
do ao Free Pascal Compiler, verso 2.6.2, em ambiente Win-
dows

, sendo totalmente portvel para outras plataformas.


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.
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 runti-
me. Dadas as suas caractersticas, tornou-se uma forma de
criar o equivalente a pequenas listas ligadas com muito mai-
or segurana uma vez que a gesto de recursos no fica a
cargo do programador. De referir que os arrays dinmicos
Pascal array de argumentos
tm os seus dados contguos em memria semelhana de
um array esttico e ao contrrio das listas ligadas.
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.
Outra caracterstica de elevado interesse o facto de se
poder passar um fragmento de um array. Vejamos o seguinte
exemplo:
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.
Todas estas funcionalidades compe aquilo a que se deno-
mina de passagem de arrays abertos (em ingls, open
arrays): a possibilidade de receber um array sem conheci-
mento prvio da sua dimenso, bem como a possibilidade de
realizar a passagem parcial de um array.
Passagem de um array de argumentos
A evoluo da passagem de arrays abertos levou natural-
mente implementao de uma funcionalidade til: o array
of const.
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.
function Average(list : array of byte) : real;
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;
VAR XS : ARRAY[1..20] OF BYTE;
// ...
WRITELN(AVERAGE(XS[10..20]):0:3);
A PROGRAMAR

16
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, clas-
ses e interfaces podem.
Vamos criar um procedimento que recebe um array of const e
nos d informaes acerca dos argumentos recebidos:
Quando o procedimento recebe este array, ocorre uma conver-
so dos seus elementos para um record variante com caracte-
rsticas particulares. Segundo a documentao do Free Pascal,
esta a sua definio:
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 argu-
mento 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-
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!
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 passa-
dos. Esta informao pode ser obtida com a funo Length.
Caso no haja argumentos, iremos mostrar a mensagem
Sem argumentos.
Para proceder anlise dos argumentos, iremos iterar pelos
elementos do array. Sendo este um open array, cuja dimen-
so desconhecemos, necessitaremos das funes Low e
High que devolvem, respectivamente, os ndices menor e
maior do array (isto , as posies do primeiro e ltimo ele-
mento).
No sendo objectivo do presente artigo fazer uma explora-
o 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.
Como foi referido, os elementos do array so convertidos ao
record infra-apresentado, pelo que possuem campos. Natu-
ralmente, 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 Lon-
gInt):
PASCAL ARRAY DE ARGUMENTOS
FOR I:=LOW(ARGS) TO HIGH(ARGS) DO
// ANLISE DOS ARGUMENTOS
PROCEDURE FOO(ARGS : ARRAY OF TVARREC);
PROCEDURE FOO(ARGS : ARRAY OF CONST);
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;
PROCEDURE FOO(ARGS : ARRAY OF CONST);
VAR I : SMALLINT;
BEGIN
IF LENGTH(ARGS) > 0 THEN
// ANLISE DOS ARGUMENTOS
ELSE
WRITELN('SEM ARGUMENTOS.');
END;
CASE ARGS[I].VTYPE OF
VTINTEGER :
WRITELN('INTEGER = ',
A PROGRAMAR


17
Sendo um Integer, o campo variante vinteger possui o valor
deste argumento. Notificamos acerca do tipo de dados do ar-
gumento, 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, co-
mo por exemplo PShortString). Para alguns destes necessita-
mos de recorrer ao operador ^, o qual nos indica o valor arma-
zenado 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 apon-
tador, devolvendo automaticamente o valor l armazenado (por
exemplo, o tipo de dados AnsiString).
Comecemos por analisar o tipo de dados Extended:
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, exis-
tem 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 ca-
racteres;
WideString semelhante ao AnsiString, cada caracter
ocupa 2 bytes ao invs de apenas 1, e permite armaze-
nar caracteres no formato UTF-16.
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 compi-
lador trata as strings de forma automtica, no sendo, portanto,
responsabilidade do programador determinar onde esta come-
a 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 Shor-
tString:
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 necess-
rio fornece ao prprio programa ferramentas para gerir estas
strings de forma autnoma. Portanto, bastar neste caso reali-
zar type casting o programa ir aceder localizao na
memria onde a AnsiString est armazenada, e automatica-
mente vai process-la:
Para apontadores, e tendo em conta a quantidade de ende-
reos que actualmente uma memria RAM possui, fazemos
type casting para o tipo LongInt de forma a conhecermos o
endereo:
Para finalizar, iremos analisar as classes e os objectos. Es-
tes 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 de-
nominada ClassName. Desta forma, o nosso objectivo neste
procedimento determinar o nome da classe ou objecto a
que pertence o nosso argumento:
O nosso procedimento Foo ter ento este aspecto:
PASCAL ARRAY DE ARGUMENTOS
VTEXTENDED :
WRITELN('EXTENDED = ',
ARGS[I].VEXTENDED^);
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 REFERENCE = ',
ARGS[I].VCLASS.CLASSNAME);
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

18
Ensaio com os arrays de argumentos
Coloquemos o procedimento Foo numa unit denominada Ar-
gMgr (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.
Analisemos o output do programa:
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 ca-
racteres ASCII por defeito.
Como ltima referncia, de notar o output para a varivel
sl: o procedimento informou-nos que esta uma classe,
mais propriamente a classe TStringList.
printf criao de bindings para a linguagem C
O Free Pascal oferece uma utilidade que outros compilado-
res, incluindo o prprio Delphi, no oferecem do mesmo mo-
do. 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:
Conclumos assim a nossa viagem pelos arrays de argumen-
tos, comummente designados apenas por arrays of const, os
quais nos permitem simular procedimentos e funes varidi-
cos. No , decerto, uma das ferramentas mais utilizadas
pelos programadores de Free Pascal, Object Pascal e Del-
phi. Todavia, um instrumento til que est disposio, o
qual fornece imensa flexibilidade na passagem de argumen-
tos a procedimentos e funes.
PASCAL ARRAY DE ARGUMENTOS
END
ELSE
WRITELN('SEM ARGUMENTOS.');
WRITELN;
END;
{$MODE OBJFPC}
PROGRAM ARTIGO45;
USES ARGMGR, CLASSES;

VAR S : STRING = 'VARIAVEL S';
SL : TSTRINGLIST;

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

AnsiString = Igor Nunes
Integer = 31

Pointer = 471399
Pointer = 0
Boolean = FALSE
Char = K

ShortString = variavel s
Class = TStringList
Extended = 3.1400000000
{$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.
AUTOR
Escrito por Igor Nunes
Curioso na rea da tecnologia e em especial da programao, tem uma saudvel relao com o Object Pascal e conhece-
dor das bases de outras linguagens de programao, como Haskell, C, Python e VB.NET. No P@P, membro da Wiki Team
e Moderador Global.
A PROGRAMAR


19
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.
O Android est disponvel com cdigo aberto desde 21 Outu-
bro de 2008. O Google publicou todo o cdigo sob a licena
Apache. No entanto, ele depende de uma autorizao da pr-
prio Google para poder aceder biblioteca de aplicaes, Play
Store.
Com a API do Google Maps v2 para Android, possvel adicio-
nar mapas com base em dados do Google Maps numa aplica-
o. A API, que lida automaticamente com acesso aos servi-
dores do Google Maps, possui mtodos que permitem adicio-
nar 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, Goo-
gle, disponibiliza uma verso optimizada onde permite o down-
load gratuito, em http://developer.android.com/sdk/index.html.
Aps descarregar o IDE tem reunidos os elementos necess-
rios 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_64-
20131030 (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








Neste passo possvel dar o nome ao projeto e escolher as
verses para que estar disponvel a aplicao desenvolvi-
da. Neste caso ir correr em dispostivos com verso 11 at
19.
Next
Nesta janela pode escolher o logotipo por defeito ou criar o
seu prprio.
Next

Criar uma aplicao para Android com mapa
A PROGRAMAR

20
Next
Cada atividade (janela) composta por trs ficheiros e aqui
podemos alterar o seu nome se pretendermos.
Finish
Importar a bi bl i oteca, uma vez que esta permi te ace-
der 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-windows-
x86_64-20131030
\sdk\extras\google\google_play_services\libproject. Caso no
encontre esta diretoria, deve verificar se o Google Play Servi-
ces no Android SDK Manager, est instalado, se no estiver
apenas tem de selecionar e descarregar.
Aps garantir que o projeto google_play_services_lib existe,
prosseguir da seguinte forma:
Eclipse > Import > Android > Existing Android Code
Into Workspace> Next
Passos a seguir:
Browse > ir a pasta de trabalho adt-bundle..XXXXX./
sdk/extras/google/google_play_services/libproject/
google-play-services_lib
CRIAR UMA APLICAO PARA ANDROID COM MAPA
A PROGRAMAR


21
Passo a seguir:
Mapa > Properties




















Android > Library > add..
Select Google-play-services_lib > ok
Ok
Alterar Manifest
Neste momento o projeto est criado, necessrio configu-
rar 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 funcionali-
dade no est disponvel.
Passos a seguir:
Eclipse > Mapa > bin > AndroidManifest.xml
CRIAR UMA APLICAO PARA ANDROID COM MAPA
<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"/>
A PROGRAMAR

22

Logo de seguida inciciar o manifest encontras packa-
ge=NAMESPACE
Copias o teu namesapce
No AndroidManifest.xml trocar onde tem
<NAMESPACE> pelo que acabas de copiar
Obter a API_Key
A chave do Google Maps API v2 baseada num pequeno for-
mulrio 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 desen-
volvimento) 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 goo-
gle console.
Abrir o projeto > APIs & auth > APIs > Activar o Google
Maps Android API v2
APIs & auth > Credentials > Create New Key > Ando-
rid Key
Passos a seguir:
Voltar ao Eclipse > Window > Preferences >Android >
Build
Copiar a tua SHA1 fingerprint
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 encon-
tras package=NAMESPACE
Copias o teu namesapce
Retornar ao Google Console e colar o nome da app
depois do ;
CRIAR UMA APLICAO PARA ANDROID COM MAPA
A PROGRAMAR


23
Passos a seguir:
Depois de carregar em criar, a google ir fornecer uma
key
Deve substituir no manifest
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 activi-
ty_main.xml
Passos a seguir:
Eclipse > Mapa > res > layout >activity_main.xml
Alterar a Activity
Uma Activity representa uma interface que nos apresenta-
da e, alm do ficheiro XML que define o aspeto grfico, exis-
te um ficheiro .JAVA onde definido o cdigo das funcionali-
dades.
Neste caso, bastar codificarmos o mtodo onCreate que faz
parte do ciclo de vida de uma atividade e executado sem-
pre que a atividade mostrada ao utilizador. Neste mtodo o
que iremos fazer associar o layout XML que acima defini-
mos.
Passos a seguir:
Eclipse > Mapa > src >MainActivity.java
CRIAR UMA APLICAO PARA ANDROID COM MAPA
<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"/>
<?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"/>
A PROGRAMAR

24
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
Ok
Start Avd
(Depois do emulador iniciar) Selecione Choose a
running Andorid device
Ok
CRIAR UMA APLICAO PARA ANDROID COM MAPA
package com.programar.mapa;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import android.app.Activity;
import 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();
}

}
A PROGRAMAR


25





























No final deste tutorial possvel visualizar no emulador ou dis-
positivo mvel um mapa como este.
CRIAR UMA APLICAO PARA ANDROID COM MAPA
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.
A PROGRAMAR

26
Introduo
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.
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)
Resultado final
O artigo tambm exemplifica a utilizao do controlo Data-
GridView 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.
O leitor poder fazer download do projecto para fins educaci-
onais (ver link 4).
C# CRUD (Create, Read, Update & Delete)
Estrutura
Uma estrutura de projecto bem delineada poupa-nos imenso
tempo. A estrutura deste projecto muito simples.
Classes
Neste artigo necessrio a criao de duas classes distin-
tas. 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.
class dbconfig
{
private string server;
private string user;
private string password;
private string 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= */
}
}
A PROGRAMAR


27
No construtor da classe desde logo foi assumido quais os valo-
res por defeito de ligao base de dados. No entanto dada
a possibilidade de, aquando a iniciao da classe, definir a
configurao desejada.
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 se-
gura, em termos de realizao de queries, pois permite a pas-
sagem de parmetros. Apenas duas funes foram criadas:
Funo get() Realiza a operao Ler (Read), cuja finalidade
devolver informaes da base de dados.
Funo set() Realiza as operaes de Criar (Create), Actuali-
zar (Update) e Eliminar (Delete).
Para que a utilizao desta classe funcione em pleno ser ne-
cessrio adicionar quatro referncias.
Sempre que a classe dbhandler iniciada o seu construtor ir
chamar o construtor da classe dbconfig e por sua vez estabele-
cer uma ligao com a base de dados MySQL.
A utilizao de um DataSet bastante benfico (em compa-
rao com o DataReader) por vrias razes:
No preciso que estabeleamos uma ligao, pois o
mtodo .Fill() j faz isso;
Podemos de imediato atribuir o DataSource a um
controlo (como o caso da DataGridView);
possvel fazer queries dentro do DataSet, pois este
guarda os dados como se de uma tabela se tratasse.
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 par-
metro (para a funo) se assim preferir.
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 realiza-
das directamente pelos diversos eventos (Load, userAdde-
dRow, RowValidating, CellEndEdit, onClick, MouseDown).
Referncias e Variveis
Para que tudo funcione em pleno necessrio adicionar a
referncia do MySQL
C# CRUD (CREATE, READ, UPDATE & DELETE)
dbconfig db = new dbconfig("localhost", "root", "",
"outra_base_dados");
/* 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 dbconfig db;
private MySqlConnection connection;
private MySqlCommand command;
private MySqlDataAdapter dAdapter;
private DataSet dSet;

public dbhandler()
{
db = new dbconfig();
connection = new MySqlConnection
(db.get());
}
}
public DataSet get(string __query, [Optional]
MySqlParameter[] __param)
{
this.command = new MySqlCommand(__query,
this.connection);

if (__param != null)
{ this.command.Parameters.AddRange(__param); }

this.dAdapter= new MySqlDataAdapter
(this.command);
this.dSet = new DataSet();

/* input exemplo: 'SELECT * FROM tabela
WHERE id = @id' output: 'FROM tabela' */
Regex rgx = new Regex("FROM\\s\\w+");
MatchCollection matches = rgx.Matches
(__query);
/* output: 'tabela' */
string table = matches[0].Value.Replace
("FROM ", "");

this.dAdapter.Fill(this.dSet, table);

return this.dSet;
}
public int set(string __query, [Optional]
MySqlParameter[] __param)
{
this.command = new MySqlCommand(__query,
this.connection);

if (__param != null) {
command.Parameters.AddRange(__param); }

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

return this.command.ExecuteNonQuery();
// retorna o nmero de linhas afectadas
}
using MySql.Data.MySqlClient;
A PROGRAMAR

28
Bem como adicionar algumas variveis privadas a este formu-
lrio:
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.
Os dois eventos userAddedRow e RowValidating tem como
finalidade a insero de informao na base de dados.
O evento CellEndEdit ter como objectivo proporcionar a actu-
alizao da informao.
E por fim os eventos onClick e MouseDown vo criar uma es-
trutura 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
O evento Load tem a seguinte estrutura:
Como o leitor poder comprovar, neste trecho de cdigo
apenas foram delineadas as queries necessrias constru-
o da DataGridView, assim como toda a estrutura das colu-
nas. Falta ento adicionar dados informativos provenientes
da base de dados.
E finalizamos o evento load. Recapitulando o processo: defi-
nimos 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.
C# CRUD (CREATE, READ, UPDATE & DELETE)
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>();
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");

/* 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");

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

var clube = new DataGridViewComboBoxColumn() {
HeaderText = "Clube",
DataSource = dSetClubes.Tables[0],
ValueMember = "id",
DisplayMember = "descricao",
AutoSizeMode =
DataGridViewAutoSizeColumnMode.None,
FlatStyle = FlatStyle.Standard
};

var foto = new DataGridViewImageColumn() {
HeaderText = "",
AutoSizeMode =
DataGridViewAutoSizeColumnMode.None,
Width = 64
};

this.dataGridView1.Columns.AddRange(foto, nome,
data_nascimento, valor_estimado, clube);
this.dataGridView1.RowTemplate.MinimumHeight = 50;
for (int i = 0; i <= dSetJogadores.Tables
[0].Rows.Count - 1; i++) {

string _imgDefault = "no_image.gif";

Image _img = imageResize(new Bitmap
(Application.StartupPath + "/imagens/
jogadores/" + _imgDefault), new Size(64, 64));

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)));
}

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

/* 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());

/* Guarda a posio do ID na DataGridView */
_dicJogadores.Add(i, Convert.ToInt32
(dSetJogadores.Tables[0].Rows[i].
ItemArray[0].ToString()));

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

}
public static Image imageResize(Image img, Size
size)
{ return (Image)(new Bitmap(img, size));
}
A PROGRAMAR


29
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.
definido qual o ndice de linha actual para ser utilizado no
evento RowValidating:
O leitor decerto notar que nesta insero no est incutida a
coluna foto, por razes estruturais. A insero da foto ser
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 nota-
r 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:
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.
C# CRUD (CREATE, READ, UPDATE & DELETE)
private void dataGridView1_UserAddedRow(object
sender, DataGridViewRowEventArgs e)
{
_userAddedRowIndex =
this.dataGridView1.CurrentRow.Index;
}
if(e.RowIndex == _userAddedRowIndex){

/* 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());

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()));

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),
new MySqlParameter
("@datanascimento",_datanascimento),
new MySqlParameter("@valorestimado",
_valorestimado),
new MySqlParameter("@id_clube", _id_clube)
};

if (dbQuery.set("INSERT INTO jogadores (nome,
data_nascimento, valor_estimado, id_clube) " +
"VALUES (@nome, @datanascimento,
@valorestimado, @id_clube)", _sqlParams) > 0) {

// 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);

}
}
if (e.RowIndex != _userAddedRowIndex)

{

/* necessrio verificar se no se trata de uma
adio de linha */

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()));

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()));

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

new MySqlParameter
("@datanascimento",_datanascimento),

new MySqlParameter("@valorestimado",
_valorestimado), new MySqlParameter
("@id_clube", _id_clube),

new MySqlParameter("@id", _dicJogadores
[e.RowIndex])

};


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

}
A PROGRAMAR

30

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.
No evento MouseDown colocado o seguinte cdigo:
O cdigo acima representa a criao do controlo ContextMe-
nuStrip apenas quando o boto direito do rato for pressiona-
do. 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 de-
sejarmos.
Sempre que elimina uma linha da base de dados necess-
rio tambm eliminar essa mesma linha do dicionrio de joga-
dores de forma a manter ambas as estruturas de dados cor-
rectas.
C# CRUD (CREATE, READ, UPDATE & DELETE)
if (e.Button ==
System.Windows.Forms.MouseButtons.Right) {
var _hit = this.dataGridView1.HitTest
(e.X, e.Y);

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

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

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"));

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

this.dataGridView1.ContextMenuStrip = _menu;

/* enviado por parmetro o indce da
linha actual */
_eliminarLinha.Click += delegate
(object _sender, EventArgs _e) {
eliminarLinha_click(sender, e, _hit.RowIndex); };
_alterarFoto.Click += delegate(object
_sender, EventArgs _e) { alterarFoto_click(sender,
e, _hit.RowIndex); };

}
}
private void eliminarLinha_click(object sender,
EventArgs e, int index)
{
int id = _dicJogadores[index];

MySqlParameter[] _sqlParams =
new MySqlParameter[] {
new MySqlParameter("@id", _dicJogadores
[index])
};

if (dbQuery.set("DELETE FROM jogadores WHERE
id = @id", _sqlParams) > 0) {
this.dataGridView1.Rows.RemoveAt(index);
_dicJogadores.Remove(index);
}
}
private void alterarFoto_click(object sender, Even-
tArgs e, int index) {

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

if (_opf.ShowDialog() ==
System.Windows.Forms.DialogResult.OK) {

int id = _dicJogadores[index];

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 */
};

if (dbQuery.set("UPDATE jogadores SET foto
= @foto WHERE id = @id", _sqlParams) > 0)
{
string _path =
Application.StartupPath + "/imagens/jogadores/"
+ id + "/";
System.IO.Directory.CreateDirectory
A PROGRAMAR


31
Por fim, no se permite a seleco de ficheiros que no preen-
cham 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 segu-
rana 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

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)));

}
}
}
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
A primeira classe
(dbconfig) ir tratar da
configurao do aces-
so base de dados. A
segunda classe
(dbhandler) ir permitir
a realizao de
queries / operaes
CRUD.
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#

34
Introduo
No passado evento //build/, a Microsoft disponibilizou uma
verso de anteviso da verso 6.0 da linguagem de progra-
mao C#.
Trata-se de uma verso preliminar, pelo que algumas funcio-
nalidades podero sofre alteraes, no fazer parte da ver-
so final ou novas funcionalidades podero ainda ser adicio-
nadas.
Esta nova verso da linguagem inaugura tambm uma nova
postura da Microsoft no que diz respeito ao cdigo aberto e
participao da comunidade.
De facto, em direto numa sesso de abertura (keynote do
segundo dia, aproximadamente a 01:15:50), Anders Hejls-
berg publicou no CodePlex cdigo fonte da plataforma de
compiladores e os compiladores de C# e Visual Basic pro-
jeto Roslyn.
Alm do cdigo fonte, foram publicadas as notas das reuni-
es de desenho, onde se pode consultar o racional por de-
trs de cada nova funcionalidade.
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 ver-
so de anteviso anteriormente referida.
Inicializao De Auto-Propriedades
Passa a ser possvel adicionar inicializadores a autopropri-
edades (auto-property) da mesma forma que se pode adicio-
nar a campos (field):
O inicializador inicializa diretamente o campo que d suporte
propriedade. Por essa razo passa a fazer sentido existi-
rem auto-propriedades sem assessores de escrita (setter):
Auto-propriedades apenas de leitura s so permitidas se
existir um inicializador. Caso contrrio nunca poderiam con-
ter qualquer valor para alm do valor por omisso do seu
tipo.
Tal como acontece com os inicializadores dos campos, os
inicializadores de auto-propriedades no podem referenciar
this afinal so executados antes do objeto estar devida-
mente inicializado. Isto faria com que no houvesse muitas
escolhas interessantes para inicializar as auto-propriedades.
Especialmente as auto-propriedades apenas de leitura pare-
ceriam inteis se no pudessem, de alguma forma, ser inicia-
lizadas a partir de valores passados no construtor do objeto.
No entanto, os construtores primrios veem mudar isto.
Construtores Primrios
Os construtores primrios (primary constructors) permitem
que os parmetros do construtor sejam declarados direta-
mente na classe (class) ou estrutura (struct) sem a necessi-
dade da declarao explcita do construtor no corpo da de-
clarao do tipo. Estes parmetros esto disponveis como
nomes simples sendo o seu mbito (scope) toda a declara-
o do tipo.
Nota: O desenho desta funcionalidade foi alterado e segue-
se a descrio do novo desenho. No entanto, no foi poss-
vel ter estas alteraes na verso de anteviso, pelo que,
podero ser encontradas situaes que correspondem
semntica anterior: os parmetros so capturados implicita-
mente e no existe sintaxe para a captura explcita.
Parmetros Em Classes E Estruturas
Aqui est um exemplo de uma classe com um construtor
primrio:
Obter o mesmo efeito sem construtores primrios teria re-
querido 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:
No extrato de cdigo anterior foram evidenciados os pedaos
que se tornam desnecessrios com a introduo dos cons-
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
public class Cliente
{
public string Nome { get; set; } = "Jos";
public string Apelido { get; set; } =
"Silva";
}
public class Cliente
{
public string Nome { get; } = "Jos";
public string Apelido { get; } = "Silva";
}
public class Cliente(string nome, string apelido)
{
public string Nome { get; } = nome;
public string Apelido { get; } = apelido;
}
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; } }
}
C#

35
trutores primrios e auto-propriedades apenas de leitura
inicializadas.
O objetivo desta funcionalidade expressar os tipos de for-
ma 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 auto-
propriedades apenas de leitura, mutvel e imutvel passam
a estar em p de igualdade.
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 constitu-
dos apenas por inicializaes. No entanto, muitos so os que
se tm manifestado em favor da sua existncia. Qual a tua
opinio?
Parmetros Campo
Nota: Os campos parmetro (field parameters) no funcio-
nam na corrente verso de anteviso.
Por omisso, os parmetros de um construtor primrio exis-
tem 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 par-
metro desapareceu.
Foi considerado (e experimentado) deixar os parmetros
serem implicitamente capturados em campos privados ge-
rados pelo compilador se fossem usados depois da constru-
o, mas isso levava a cdigo suprfluo e sujeito a erros
onde muitas vezes os parmetros eram inadvertidamente
capturados em campos.
Claro que se podem declarar campos privados e inicializa-los
com um parmetro:
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.
Para evitar isto, existe uma sintaxe para capturar explicita-
mente em campos os parmetros dos construtores primrios
Quando se usa o modificador de acessibilidade (o mais pro-
vvel ser private) num construtor primrio isso significa a
existncia de um parmetro e um campo com o mesmo no-
me e a inicializao do campo com o parmetro. Desta for-
ma, vai ser possvel referir-se a esse campo em mtodos e
propriedades aps a inicializao:
Construtores Explcitos
Uma declarao de classe com construtor primrio continua
a poder definir outros construtores. No entanto, para assegu-
rar que os argumentos so mesmo passados ao construtor
primrio, todos os construtores devem chamar um inicializa-
dor this():
Construtores explcitos podem chamar-se entre si, mas dire-
ta ou indiretamente tero de chamar o construtor primrio no
final porque o nico construtor que pode chamar o iniciali-
zador base().
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 indireta-
mente o construtor primrio.
Incializador Base
O construtor primrio chama sempre, implcita ou explicita-
mente, o inicializador base. Se no for especificado um inici-
alizador base, como com todos os construtores, ser chama-
do o construtor base sem parmetros.
A forma de explicitamente chamar o inicializador base pas-
sando uma lista de argumentos na especificao da classe
base:
Tipos Parciais
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 especifica-
o da classe base.
Using Static
Nota: a implementao corrente desta funcionalidade no
reflete o desenho atual. Mais detalhes abaixo.
public class Cliente(
string nome,
string apelido,
DateTime aniversrio)
{
public string Nome { get; } = nome;
public string Apelido { get; } = apelido;
private DateTime _aniversrio = aniversrio;
}
public class Cliente(
string nome,
string apelido,
private DateTime aniversrio)
{
public string Nome { get; } = nome;
public string Apelido { get; } = apelido;
}
public int Idade { get { return CalcularIdade
(aniversrio); } }
public Ponto()
: this(0, 0) // chama o construtor primrio
{
}
class BufferFullException()
: Exception("Buffer full")
{
}
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
C#

36
Esta funcionalidade permite especificar um tipo numa clusu-
la using, tornando todos os membros estticos acessveis
desse tipo sem qualificao no cdigo subsequente:
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?
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:
Range um normal mtodo esttico, portanto a chamada
marcada com (1) pode e deve ser permitida. A implementa-
o atual no faz nada de especial com mtodos de exten-
so, portanto permite a chamada a Where como mtodo
esttico em (2), mas no como mtodo de extenso em (3).
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 m-
todos estticos ( apenas um situao de recurso para os
raros casos em que existem ambiguidades) e no h interes-
se em venham a causar confuso no namespace de topo.
Por isso, numa futura verso, (2) no ser permitido.
Expresses De Declarao
As expresses de declarao permitem declarar variveis
locais no meio de expresses, com ou sem inicializao.
Aqui esto alguns exemplos:
Isto particularmente til para parmetros de sada (out),
onde deixa de ser necessrio declarlos previamente, nu-
ma 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:
Intuitivamente, o escopo das variveis declaradas numa ex-
presso estendese para o bloco exterior mais prximo,
instruo estruturada (como if ou while) ou instrues embe-
bidas (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.
Na maioria dos casos, as expresses de declarao permi-
tem var apenas se existir um inicializador de que se possa
inferir o tipo, tal como nas instrues de declarao. No en-
tanto, se a declarao da expresso passado num par-
metro de sada (out), ser tentada a resoluo de sobrecar-
gas (overlaod resolution) sem o tipo desse argumento e infe-
rido o tipo a partir do mtodo selecionado:
As expresses de declarao podem requerer alguma habi-
tuao e pode ser sujeitas a abusos em novos e interessan-
tes modos. Experimentem e digam o que pensam.
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:
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 poste-
riormente a que haja um dump do stack, pode-se ver de on-
de foi originalmente lanada em vez de de onde foi relana-
da.
using System.Console;
using System.Math;
class Program
{

static void Main()
{
WriteLine(Sqrt(3 * 3 + 4 * 4));
}
}
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)
}
}
if (int.TryParse(s, out int i)) { }
GetCoordinates(out var x, out var y);
Console.WriteLine("Result: {0}",
(int x = GetValue()) * x);

if ((string s = o as string) != null) { s }
from s in strings
select int.TryParse(s, out int i) ? i : -1;
void GetCoordinates(out int x, out int y) { }
GetCoordinates(out var x, out var y); // inferido
//int
try
{ }
catch (Exception e) if (myfilter(e))
{

}
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
C#

37
Literais Binrios E Separadores De Dgitos
Nota: Na atual verso de anteviso, esta funcionalidade est
disponvel apenas para Visual Basic.
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!
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:
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 direta-
mente a chaves atravs de qualquer indexador que o novo
objeto possua:
No caso de as chaves serem strings, algumas vezes quere-
se pensar nelas quase como sendo um tipo fraco de mem-
bros 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:
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-
xador que receba uma nica chave do tipo string. No entan-
to, dada a fraca receo pela comunidade desta funcionali-
dade, foi decidida a sua remoo na verso final.
Await Em Blocos Catch E Finally
No C# 5.0 a palavra-chave await no era permitida em blo-
cos catch e finally porque se pensava no ser possvel a
sua implementao. Finalmente descobriuse como poderia
ser implementado.
Isto era uma limitao significativa e obrigava a cdigo nada
bonito para dar a volta e compensar esta falta. Tal j no
mais necessrio:
A implementao algo complicada, mas no temos de nos
preocupar com isso. essa a razo de ter async na lingua-
gem.
Mtodos De Extenso Add Em Inicializadores De Cole-
es
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 es-
quecido. Isto foi resolvido: o cdigo gerado para um iniciali-
zador de coleo poder usar um mtodo de extenso cha-
mado Add. No uma grande funcionalidade, mas til e,
afinal, a sua implementao no novo compilador consistiu
em remover a validao que a impedia.
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 pode-
ro ainda sofrer alteraes ou ser retiradas em funo do
feedback da comunidade.
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:
var bits = 0b00101110;
var bits = 0b0010_1110;
var hex = 0x00_2E;
var dec = 1_234_567_890;
var numbers = new Dictionary<int, string>
{
[7] = "sete",
[9] = "nove",
[13] = "treze"
};
var customer = new JsonData
{
$first = "Anders", // => ["first"] = "Anders"
last = "Hejlsberg" // => ["last"] = "Hejlsberg"
};
string first = customer.$first;
// => customer["first"]
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();
}
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);
}
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
C#

38
Inicializadores De Eventos
Esta funcionalidade planeada vai permitir a inicializao de
eventos nos inicializadores de objetos:
Operador ;
Esta funcionalidade ainda em considerao permitiria que
uma sequncia de instrues seja combinada de forma a
formar uma nica instruo lgica:
Params IEnumerable
Esta funcionalidade planeada vai permitir a utilizao, para
alm de arrays, de enumeradores em conjugao com o
modificador params:
Interpolao De Strings
Esta funcionalidade ainda em considerao permitiria a utili-
zao de identificadores na construo de strings:
Trata-se de uma funcionalidade que tem gerado alguma dis-
cusso que pode ser seguida aqui.
Operador NameOf
Esta funcionalidade ainda em considerao permitiria a ob-
teno do nome de um membro de um tipo semelhana de
tipeof:
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:
passar a escrever:
Mas como que este novo operador (?.) se vai comportar
em sequncias? Existem duas hipteses: ou associativo
esquerda ou associativo direita.
Associatividade Esquerda
Esta opo significaria que sequncias do tipo a?.b?.c seri-
am equivalentes a ((a?.b)?.c). Uma consequncia desta
abordagem que, uma vez usado o operador de propaga-
o de null (?.), teria de ser usado em todas os acessos pos-
teriores na sequncia porque o valor sobre o qual se estaria
a aceder ao membro seguinte poderia ser nulo (null).
Associatividade Direita
Esta opo significaria que sequncias do tipo a?.b?.c seri-
am equivalentes a (a?(.b?.c)). Uma consequncia desta
abordagem que o operador de propagao de null (?.) po-
de ser usado em combinao com o operador . em qualquer
combinao. Cdigo como o seguinte seria vlido:
Discusso E Opo Escolhida
Aps longa discusso pblica, optou-se pela associatividade
direita por ser a que a maioria dos intervenientes achou
mais natural e til.

Private Protected
A combinao dos modificadores de acessibilidade protected
e internal em C# corresponde ao modificador de acesso Fa-
millyOrAssembly 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.
var boto = new Button
{
...
Click += (source, e) => ...
...
};
(var x = Foo(); Write(x); x*x)
int Avg(params IEnumerable<int> numbers) { }
"\{p.First} \{p.Last} is \{p.Age} years old."
string s = nameof(Console.Write);
var temp = GetCustomer();
string name = (temp == null) ? null : temp.name;
var temp = GetCustomer()?.name;
int? l = cliente?.Nome.Length;
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
()a Microsoft
disponibilizou uma ver-
so de anteviso da
verso 6.0 da lingua-
gem de programao
C# () inaugura tam-
bm uma nova postura
da Microsoft no que diz
respeito ao cdigo
aberto ()
C#

39
Uma vez que a CLR tambm tem um modificador de acesso
FamillyAndAssembly que faz com que o membro seja aces-
svel apenas por tipos que estejam na mesma assembly do
tipo declarante and sejam derivados deste.
A proposta inicial foi a utilizao combinada dos modificado-
res private e protected, mas no foi bem recebida pela comu-
nidade. 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 pode-
r j no estar disponvel na altura que este artigo for publi-
cado.
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
teis e a nova plataforma permite explorar mais facilmente
novas funcionalidades.
A grande novidade a abertura ao pblico em geral da dis-
cusso e desenvolvimento da linguagem e plataforma de
compiladores. Participem na discusso.
Recursos
//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
C# - NOVAS FUNCIONALIDADES DO C# 6.0 ANTEVISO DE ABRIL DE 2014
VISUAL (NOT) BASIC

40
O que preciso, como quero mais ou menos. Mais para
mais.
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.
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 cha-
mados a partir de uma instncia.
Isto significa que podemos at acrescentar mtodos direta-
mente na classe String ou Integer? Bom, sim!
Note-se que os mtodos de extenso no se tratam de mate-
rial novo! Foram implementados na verso 9 do VB (includa
no Visual Studio 2008).
So no entanto, (e por razes que desconheo) pouco co-
nhecidos, se bem que tenha a certeza de que j tenham
usado extenses centenas de vezes sem darem por isso.
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. Pro-
meto.
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 exem-
plo:
um mtodo de extenso da classe String.
A classe Extension fornecida como atributo do mtodo per-
tence classe CompilerServices em Sys-
tem.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 estender definido por o tipo
do primeiro parmetro, o que obriga a que um mtodo de
extenso tenha, no mnimo, um parmetro. Se existirem
mais parmetros, j iro fazer parte da assinatura do mto-
do.
Estamos a falar, portanto, de magia do compilador!
O Visual Basic fica a saber que tem de invocar o mtodo
como sendo um mtodo auxiliar comum, mas leva automati-
camente a referncia instncia que originou a invocao
no primeiro parmetro.
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.
S para estarmos a pensar na mesma situao, quando es-
crevo mtodos auxiliares estou a pensar naqueles pequenos
mtodos que ajudam a desempenhar um ou vrios processa-
mentos 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 pala-
vras de uma String, e por a adiante.
Vou utilizar, a ttulo de exemplo, um mtodo auxiliar que co-
loca um ponto final em uma frase (String) e uma letra
grande no incio, por exemplo: gostava de escrever me-
lhor passa para Gostava de escrever melhor.
Traduzindo este mtodo auxiliar para extenso, ficaria:
No precisam de procurar diferenas. Eu digo-vos o que
mudou: nada. A grande maioria dos mtodos auxiliares po-
dem ser traduzidos apenas colocando o atributo que o trans-
forma 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 des-
creve ou implementa o mtodo. Esto na forma como o m-
todo invocado e descoberto.
A primeira grande vantagem de utilizar extenses, em detri-
mento de mtodos auxiliares, o facto de estas se encontra-
MTODOS DE EXTENSO O QUE PRECISO, COMO QUERO
<Extension()>
Public Sub FazerNada(Str As String)
'fao o que prometo!
End Sub
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 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
VISUAL (NOT) BASIC

41
rem perfeitamente integradas com o Intellisense (as caixas
de sugesto de contexto), no contexto do tipo que esto a
estender:
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:
A segunda grande diferena/vantagem passa tambm por
aqui: no necessrio fornecer a referncia a trabalhar, ex-
plicitamente. O Visual Basic sabe que a referncia a traba-
lhar a mesma que provocou a invocao. Isto possibilita
invocaes em cadeia. Neste caso no evidente, porque
uma segunda chamada ao mtodo Pontuar na mesma refe-
rncia 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 Func-
tion que devolve uma String que representa a frase pontua-
da.
Na abordagem sem extenses, aplicar o mtodo duas vezes
seria da seguinte forma:
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:
frase = frase.Pontuar.Pontuar()
Frase uma String que processada com a primeira exten-
so 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 Intelli-
sense, aplicadas a um pedao de cdigo escrito para traba-
lhar tipos que no controlamos diretamente. E quem diz m-
todos auxiliares diz qualquer tipo de mtodo. Manda a ne-
cessidade e criatividade.
Alguns exemplos de extenses
possvel estender classes, estruturas, interfaces e delega-
tes.
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 fun-
o.
Posso comear por reescrever a extenso Pontuar para que
produza um valor, que como deve ser implementada:
Invocao: MinhaFrase.Pontuar()
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:
Invocao: MeuNumero.NumeroImpar()
As extenses tambm no precisam forosamente de traba-
lhar 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:
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.
Dim frase As String = "revista programar"
frase.Pontuar() 'recorrendo exteno
Pontuar(frase) 'recorrendo exteno
<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
<Extension()>
Public Function NumeroImpar(ByVal num As Integer)
As Boolean
If num Mod 2 = 0 Then Return False Else
Return True
End Function
<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
MTODOS DE EXTENSO O QUE PRECISO, COMO QUERO
VISUAL (NOT) BASIC

42
Posso dar um outro exemplo de uma extenso que no
transforma a instncia, mas faz algo diferente com ela:
Invocao: TextoAFalar.Falar()
Estendemos a String e usamos o sintetizador de discurso
para falar o contedo da String.
As extenses tambm so teis quando queremos saber
outro tipo de informaes relacionadas com o tipo da instn-
cia, como por exemplo, devolver o nmero de palavras numa
String:
Invocao: AMinhaFrase.Palavras()
Por fim, e como exemplo mais interessante, podemos jogar
com os tipos genricos e implementar um mtodo semelhan-
te ao Where das colees de IEnumerable, mas para aplicar
em arrays:
Ao indicarmos que o primeiro parmetro do tipo Array de T,
estamos na prtica a indicar que estamos a estender qual-
quer array de qualquer tipo.
Como existem especificidades para comparar cada tipo, pas-
samos um segundo parmetro (que na verdade o nico,
como j sabem) que um delegate. A invocao deste mto-
do 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.
Invocao exemplo: MinhaArrayDeInteger.Filtrar(Function(el)
el < 10)
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)
Devolve: {2,4,9}
Como identificar extenses que j usava?
J tiveram, certamente, oportunidade de reparar que a ex-
tenso identificada na caixa de sugestes com um smbolo
ligeiramente diferente do smbolo do mtodo: a extenso
apresenta uma pequena seta escura, no sentido descenden-
te, do lado direito.
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 ex-
tenses?
AUTOR
Escrito por Srgio Ribeiro
Curioso e autodidata com uma enorme paixo por tecnologias de informao e uma saudvel relao com a .NET Fra-
mework.
Moderador global na comunidade Portugal@Programar desde Setembro de 2009. Alguns frutos do seu trabalho
podem ser encontrados em http://www.sergioribeiro.com
MTODOS DE EXTENSO O QUE PRECISO, COMO QUERO
<Extension()>
Public Sub Falar(texto As String)
Dim s As New System.Speech.Synthesis.
SpeechSynthesizer()
s.Speak(texto)
End Sub
<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
<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
CoreDump

43
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.
O facto de se ser um bom programador no habilita nin-
gum 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.
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.
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 no-
vo cargo exige. J assisti variadssimas vezes a situaes
destas, em que o novo PM continua a fazer desenvolvi-
mento 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 conse-
guir controlar o projeto e, consequentemente a aumentar os
nveis de stress de toda a gente envolvida no processo.
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 atitu-
des do novo PM so, muitas vezes, mal interpretadas e tan-
tas 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-
mar atitudes que j criticou no passado com pessoas de
quem gosta.

Foto: filme Office Space
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 enge-
nharia 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 resul-
tado faz com que a organizao tenha uma excelente equipa
de engenharia de software, dando-lhe assim uma vantagem
competitiva sobre a sua concorrncia.
Mas para tal, ambas as partes, o novo PM e a organizao,
tm de ter conscincia de que existe um processo de apren-
dizagem e de que deve ser dada formao adequada pes-
soa a promover. Se tal for feito, a transio ser mais pacfi-
ca, o novo PM no se sentir frustrado e a organizao obte-
r o rendimento desejado de um PM.
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 engenhei-
ros de software a maus gestores.
CORE DUMP [12] - PROGRAMADOR ^ GESTOR
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 expe-
rincia profissional nas reas de Tecnologias e Sistemas de Informao. Criou a sua prpria consultora sendo a sua especiali-
dade a migrao de dados.

Media Partners da Revista PROGRAMAR
Anlises
Segurana em Redes Informticas (4. Ed. Aumentada)
Estruturas de Dados e Algoritmos em C
Review

46

Ttulo: Segurana em Redes Informticas
(4. Ed. Aumentada)
Autor: Andr Zquete
Editora: FCA - Editora de Informtica,
Lda.
Pginas: 432
ISBN: 978-972-722-767-9
O livro "Segurana em Redes Informticas (4. Ed. Aumenta-
da)" uma obra, segundo o autor, destinada a administrado-
res de redes ou alunos na rea de segurana de redes.
No propriamente um livro de consulta de bolso devido ao
seu contedo tcnico e extensividade. O prprio autor o indi-
ca que o livro "Segurana em Redes Informticas no pre-
tende ser um catlogo de problemas e solues".
O passo-a-passo dos diversos procedimentos dos tpicos
descritos no livro foi deixado de lado.
Esta 4. edio tem como principais temas os seguintes:
- Criptografia
- Gesto de Chaves Pblicas (inclui uma descrio detalha-
da do funcionamento do nosso Carto de Cidado)
- Vulnerabilidades em Mquinas de Sistemas Distribudos
- Vulnerabilidades em Redes Locais e de Grande Escala
- Firewalls
- Sistemas de Deteco de Intruso (inclui os casos de estu-
do dos sistemas mais populares actualmente - Tripwire,
Snort e Antisniff)
- Redes Privadas Virtuais
- Segurana em Redes Sem Fios 802.11
- Protocolos de Autenticao
De facto, esta obra ilustra muito bem estes temas, onde sali-
ento a explicao ao detalhe dos algoritmos e tcnicas crip-
togrficas, 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
temas: o Carto de Cidado e o captulo novo relativo a Pro-
tocolos de Autenticao de pessoas e sistemas em redes
informticas.
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 certifica-
o 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 interes-
santes para o leitor comum, leia-se sem grande conhecimen-
to da rea de segurana de redes. Embora tenha termos
tcnicos, sempre importante a informao e dicas forneci-
das nestes dois captulos.
Para ajudar o leitor, toda a estrutura da informao da obra
est indicada para ser clara e fcil de identificar.
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.
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.
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.
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 reco-
mendo o livro para uso de estudo aos docentes de
"Segurana de Redes".
Parabns ao autor Andr Zquete por esta obra completa.
Espero que continue actualizar com a mesma qualidade futu-
ras edies.
Segurana em Redes Informticas (4. Ed. Aumentada)
AUTOR
Escrito por Pedro Pinto
Pedro Pinto - Licenciado em Engenharia Electrotcnica e de Computadores, Mestre em Redes e Servios de Comunicao e
doutorando na FEUP. As suas reas de interesse so: Routing, QoS e Segurana. Atualmente docente no Instituto Politc-
nico de Viana do Castelo (IPVC) onde leciona unidades curriculares na rea das redes de computadores. .
Review

47
Ttulo: Estruturas de Dados e Algoritmos
em C
Autor: Antnio Adrego da Rocha
Editora: FCA - Editora de Informtica,
Lda.
Pginas: 616
ISBN: 978 972 722 769 3
Programao, a linguagem do futuro permite executar prati-
camente tudo, se no mesmo tudo aquilo que a nossa imagi-
nao possa equacionar. No entanto o desenvolvimento de
solues de software de mdia e elevada complexidade trs
consigo a necessidade de aprofundar os conceitos algortmi-
cos 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 apon-
tar, 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 solu-
es recorrendo implementao de tipos de dados abstrac-
tos.
A organizao dos contedos foi escolhida mediante a sua
importncia e dependncia entre contedos, incluindo exem-
plos de cada tipo de implementao, exerccios complemen-
tares 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 importn-
cia das estruturas de dados e algoritmos na programao.
Os grandes temas abordados na obra estendem-se desde o
estudo do paradigma da programao modular em C, apre-
sentando os aspectos fundamentais da implementao de
tipos de dados abstractos recorrendo metodologia de pro-
Estruturas de Dados e Algoritmos em C
gramao defensiva, estudo das principais estruturas de
dados dinmicas, principais classes de algoritmos, imple-
mentao de diferentes tipos de memrias e por fim o estudo
dos tipos de dados abstracto grafo / dgrafo e os seus algorit-
mos mais importantes.
No final de cada sub-captulo existe um resumo dos conte-
dos a reter o que facilita de certa forma a reviso de conte-
dos quando j sabemos previamente em que tema se insere.
O contedo de simples leitura e de fcil percepo, sendo
que usada uma linguagem muito user-frendly o que facili-
ta 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 devidamen-
te comentado so uma enorme ajuda na percepo da real
implementao dos contedos abordados.
Como estudante de Engenharia Informtica considero a obra
Estruturas de Dados e Algoritmos em C uma obra de quali-
dade 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 refern-
cia sobre o tema e escrita em lngua Portuguesa.
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/
COMUNIDADES
Comunidade NetPonto Criando aplicaes Windows Phone 8.1 e Win-
dows 8.1 usando o App Studio da Microsoft
COMUNIDADE NETPONTO

49
http://netponto.org
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.
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 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.








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.





Neste momento estamos prontos para comear a criar
aplicaes! Para tal basta clicar no boto Start new project.
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.
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
CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
COMUNIDADE NETPONTO

50
http://netponto.org
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.
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.
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)
A primeira pgina apresenta o nome da aplicao e o
logotipo da mesma (no topo do lado esquerdo) e apresenta a
definio do contedo da aplicao, que constitudo por
cinco 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.
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:
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.

CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
COMUNIDADE NETPONTO

51
http://netponto.org
Tema (Theme)
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.
Mosaicos (Tiles)
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.
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.
Publicar (Publish)
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.
Depois de todas as configuraes possvel finalizar a
aplicao clicando no boto Finish.
Finalizar (Finish)
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
COMUNIDADE NETPONTO

52
http://netponto.org
clicar no boto Generate obtemos um ecr onde podemos
escolher qual a aplicao que pretendemos gerar.
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.
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.
CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
Ao gerar a aplicao para Windows 8.1 obtemos o seguinte
ecr:
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 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.
COMUNIDADE NETPONTO

53
http://netponto.org
Ao selecionar o Web App Template iremos ter a seguinte
pgina
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.
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
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,








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.
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.
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.
CRIANDO APLICAES WINDOWS PHONE 8.1 E WINDOWS 8.1 USANDO O APP STUDIO DA MICROSOFT
AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra e Microsoft Certified Profissio-
nal 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.
No Code
O Windows Phone 8.1 e a atualizao do Windows 8.1
No Code

55
Este artigo tem como objetivo apresentar as principais
novidades do Windows Phone 8.1 e da atualizao do
Windows 8.1.
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 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.
De salientar, que o menu rpido personalizvel e o Action
Center est acessvel mesmo que o dispositivo esteja
bloqueado (LockScreen).
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.
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 Windows Phone 8.1 e a atualizao do Windows 8.1

No Code

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

















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.
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.
O utilizador vai ter a possibilidade de obter mais feedback no
uso do seu dispositivo atravs do Data Sense, Wi-Fi Sense,
No Code

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
















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

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

No Code

58






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



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.
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 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:
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:
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 Profissio-
nal 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.
Elege o melhor artigo desta edio
Revista PROGRAMAR
http://bit.do/ProgramarED45_V
Veja tambm as edies anteriores da
Revista PROGRAMAR

e muito mais em
www.revista-programar.info
3
9


E
d
i

o

-

F
e
v
e
r
e
i
r
o

2
0
1
3

4
1


E
d
i

o

-

J
u
n
h
o

2
0
1
3

4
4


E
d
i

o

-

F
e
v
e
r
e
i
r
o


2
0
1
4

4
2


E
d
i

o

-

S
e
t
e
m
b
r
o

2
0
1
3

4
0


E
d
i

o

-

A
b
r
i
l


2
0
1
3

4
3


E
d
i

o

-

D
e
z
e
m
b
r
o

2
0
1
3

Das könnte Ihnen auch gefallen