Você está na página 1de 62

EDITORIAL

EQUIPA PROGRAMAR
Coordenador
Antnio Pedro Cunha Santos

Try { } catch{ }
"(...)dentro de poucos anos as pessoas tero mais facilidade de comunicar atravs
de mquinas do que pessoalmente, cara a cara."
Joseph Licklider,

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

In: THE COMPUTER AS A COMMUNICATION DEVICE

num misto de receio e orgulho que escrevo o editorial desta edio que a
primeira do ano 2014. Cresci a ler os editoriais da nossa revista e hoje encontro-me
a pensar no que escrever nestas linhas, esperando estar altura dos Grandes que
por aqui deixaram a sua marca e a sua experincia.
Numa poca em que hoje o que j no o ser amanh, marcada principalmente
pela evoluo tecnolgica, desejo-vos a todos um ano marcado positivamente pela
evoluo. Aos amadores e aos profissionais, passando pelos iniciantes, acabando
nos especialistas, sem nunca esquecer os curiosos a todos, que o ano seja de
conquistas.
Chegados a mais uma edio da Programar, a n 44, e aproveitando o facto de o
nmero desta edio, curiosamente, ser uma capicua em que o fim se pode tornar o
incio, quero recordar aos leitores que esta uma revista de ns para vs, mas
tambm de ns por vs. Porque sis vs, leitores que ns movem edio a edio.
Por mais e melhor.
E porque nesta nossa equipa cabe sempre mais um , a todos os que lem estas
linhas deixo o convite Se tiverem uma ideia, concretizem-na. Se tiverem vontade
de partilhar, fora!
Porque a partilha de ideias promove o crescimento intelectual e boas equipas
provocam mudanas. E porque a Programar um reflexo da partilha que existe na
nossa comunidade do P@P.
Numa altura que a tecnologia o mote e que o longe se torna perto Sonhem,
escrevam, programem e concretizem. E se por ventura, tropearem recomecem
de novo. Tornando cada falha um melhoramento pessoal, caminhando em prol da
evoluo. Porque se todos temos dias de Segmentation Fault, a verdade que
tambm todos aprendemos que no haver nunca um try sem um catch.
Porque ns, programadores, somos gente de ideias, e no desistimos!

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


At prxima edio.

Rita Peres

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

NDICE
TEMA DE CAPA
6

Criando Extenses para Google Chrome (Rafael Almeida)

A PROGRAMAR
9

JSF - Parte 2 - Como Criar um Projeto JSF (Lus Soares)

12

Aplicao de Licenas de Utilizador no SharePoint 2013 (Andr Vala)

15

Funes Annimas (Cristiano Ramos, Joo Silva)

17

Pascal - Operator Overloading (Igor Nunes)

21

Quero fazer uma aplicao simples! E agora? Por onde comeo? (Rita Peres)

36

Desbravando o goto! (Tiago Sousa)

38

Arduino: const vs #define (Nuno Santos)

41

Mitos do jQuery (Lus Soares)

COLUNAS
45

C# - Resoluo de Sobrecarga de Mtodo (Paulo Morgado)

ANLISES
49

Gesto de Sistemas e Redes em Linux - 3 Edio (Pedro Pinto)

50

JavaScript (2. Edio Atualizada) (Sara Freixo)

COMUNIDADES
52

NetPonto - Integrar o Facebook numa aplicao Windows Phone (Sara Silva)

NO CODE
58

O Impacto das Novas Tecnologias nas Crianas com Necessidades Educativas Especiais (Virgnia Belo Barata)

EVENTOS
28 a 28 de Fevereiro XXI SINFO IST Lisboa
11 a 17 de Abril
9 Encontro Nacional de Estudantes de Informtica (Universidade de Aveiro)

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

NOTICIAS
O seu telemvel pode ajudar a curar
cancro

AMD anuncia Opteron A1100 octacore ARM de 64 bits para servidores

Num projeto semelhante ao Folding@Home, tambm o poder


de processamento dos telemveis pode ser usado para ajudar
na investigao da luta contra o cancro.

Quem poderia pensar que os pequenos CPUs ARM, outrora


relegados para utilizaes mais modestas onde o baixo consumo era o factor crtico, viriam a fazer repensar a arquitectura usada nos servidores? No entanto isso mesmo que est
a acontecer, e a AMD quer estar na vanguarda desta ofensiva
com
o
seu
Opteron
A1100.
O mundo de hoje depende da "cloud" para funcionar, e a sustentar essa mesma cloud esto milhes de servidores espalhados pelo mundo - mquinas que esto a funcionar 24h por
dia, 7 dias por semana - e onde os custos energticos, tanto
do seu funcionamento como do seu arrefecimento, acabam
por tambm ser factor decisivo. por isso que o que importa
hoje em dia a relao potncia/consumo e no a "potncia
pura". Ser mais eficiente ter uma dzia de mquinas menos
potentes mas que aqueam menos e gastem menos energia
do que uma s, com potncia idntica, mas que gaste muito
mais
energia.
Este Opteron A1100 da AMD um SoC octa-core com cpus
ARM Cortex A57 de 64 bits, e que foi expressamente concebido para ser utilizado em servidores: suportando at 128GB de
RAM, 8 portas SATA3 (com largura de banda suficiente para
utilizar todas ao mximo simultaneamente), 2 portas ethernet
de
10Gbps,
e
PCIe
3.0.

A app Power Sleep, disponvel na Play Store, permite usar o


poder de processamento dos smartphones Android e usar
essa capacidade na investigao contra o cancro. A app foi
criada pela Samsung ustria e pela Universidade de Viena, e
funciona tambm como um alarme. Assim que o utilizador
programa o alarme, a app percebe que o telefone j no vai
ser usado e comea a processar os dados necessrios para o
clculo de comparaes entre sequncias de protenas.

A app est ligada SIMAP, a Similarity Matrix of Proteins,


uma base de dados que usada por investigadores da gentica, bioqumica, biologia molecular e da luta contra o cancro.
O entendimento de como as protenas so dispostas um
dos primeiros passos nestas investigaes, mas requer bastante poder de processamento. Numa altura em que j existem redes de computadores ligados em todo o mundo para
esta investigao, acrescentar o poder de processamento dos
smartphones vai contribuir para acelerar as descobertas, explica o Quartz.
Para os utilizadores mais zelosos de bateria e dos custos de
ligaes de dados, os responsveis indicam que a app s usa
o dispositivo se este estiver completamente carregado, ligado
corrente eltrica e com o Wi-Fi ligado.

No me parece difcil imaginar que no vo faltar interessados... e j dou comigo a imaginar quanto mais tempo faltar
at que estes chips ARM e seus derivados comecem a surgir
em mquinas desktop destinadas ao grande pblico. Mas...
tambm ser de esperar que a Intel esteja a preparar a sua
resposta a esta "ameaa" arquitectura x86 na qual tem dominado nas ltimas dcadas. De uma forma ou de outra, vai
ser interessante ver o impacto dos ARM nesta nova rea menos "mobile" a que normalmente os associamos.

Veja o vdeo preparado pela Samsung.


Fonte: Exame Informtica

Fonte http://abertoatedemadrugada.com/

TEMA DE CAPA
Criando Extenses para Google Chrome

TEMA DA CAPA
Criando extenses para Google Chrome
Atualmente o browser do nosso computador um dos
softwares mais utilizados diariamente, adicionalmente, temos
inmeros plugins que acrescentam funcionalidades extra.
Um plugin um pequeno software desenvolvido para
adicionar funcionalidades extra a softwares maiores, como o
exemplo dos browsers que utilizamos. Os plugins podem-nos
ajudar a automatizar pequenas tarefas no dia-a-dia ou at
melhorar a nossa experincia enquanto utilizadores da Web.

{
"manifest_version": 2,
"name": "Ruller",
"description": "Este plugin diz-nos quais as medidas atuais do nosso browser.",
"version": "1.0",
"icons": { "16": "icons/16x16.png", "48":
"icons/48x48.png", "128": "icons/128x128.png" },
!
"browser_action": {
"default_icon": {
"19": "icons/19x19.png",
"38": "icons/38x38.png"
},
"default_title": "Ruller"
}, !
"background": {
"scripts": ["background.js"]
}, !
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["jquery.min.js","content.js"]
}
]
} !

Neste artigo que vos trago hoje, vou explicar como podemos
desenvolver o nosso prprio plugin para o Google Chrome.

Passando explicao:
manifest_version - a verso do ficheiro manifest.json que
acabamos de criar, est atualmente na verso 2, sendo que
ficheiros na verso 1 no sero aceites pelos Google
Chrome.

Antes de comearmos devers ter como requisitos mnimos,


os seguintes conhecimentos:
HTML

name - Nome do nosso plugin, o que for definido neste


campo ser visvel publicamente na pgina dos plugins do
Chrome.

CSS
JavaScript

description - Breve descrio do plugin, tal como o nome, a


descrio ser visvel na pgina dos plugins do Chrome.

Para que possamos comear a desenvolver, basta criar um


novo directrio no nosso computador, abrir o nosso editor de
texto preferido e voil, estamos prontos!

version - Verso atual do nosso plugin, dever ser definido


pelo programador.

Se alguma vez desenvolveste um Website ou aplicao


Web, ento vais habituar-te rapidamente ao desenvolvimento
de plugins

icons - Aqui definimos quais os ficheiros a utilizar para as


diversas dimenses dos cones, os
mesmos devem estar no directrio criado anteriormente e
devero ser especificados no manifest.json

Declaraes
Devemos comear por criar um ficheiro de manifesto, ficheiro
este que contm todas as informaes do nosso plugin,
chamado manifest.json. Este ficheiro nada mais nada
menos do que um ficheiro com o contedo em formato
JSON.

browser_action - Aqui definimos o aspecto do cone que


est visvel ao lado da omnibar do
Chrome, especificando quais os cones a utilizar bem como o
ttulo que ser visvel no tooltip por cima do cone.

Neste artigo vamos criar um plugin para que nos informe


quais as medidas do browser de uma forma simples.Para
isso, criamos um ficheiro manifest.json com o seguinte
aspecto:

background - Conjunto de pginas ou scripts a serem


utilizados em plano de fundo. Mais para a frente irei
regressar a este assunto.

TEMA DA CAPA
CRIANDO EXTENSES PARA GOOGLE CHROME

mostrar-nos quais as medidas do nosso browser, no


momento em que damos o clique no nosso plugin.

content_scripts - So os ficheiros que fazem com que


o nosso plugin funcione. Devemos ter ateno s
dependncias do nosso cdigo, neste caso
necessrio a framework jQuery, logo tempos de
importar primeiro o jQuery. Neste exemplo vamos
usar o ficheiro do jQuery e o content.js, ficheiro que
contm o cdigo a ser desenvolvido. Aqui podemos
acrescentar regras e carregar estes ficheiros apenas
em alguns Websites, neste caso carregamos os
ficheiros para todos!

Utilizao
Agora que temos o nosso plugin feito, vamos colocar o
mesmo em funcionamento, mos obra!
Para isso, basta activarmos o modo de programador do
Google Chrome. Abrimos a pgina dos plugins do Google
Chrome e selecionamos a caixa que diz Modo de
programador.

Background:
O ficheiro que definimos como background no manifesto,
neste caso ir servir como vigia, estando espera que o
utilizador o chame. Neste ficheiro colocamos o seguinte
cdigo:

De
seguida,
clicamos
em
Carregar
extenso
descomprimida e indicamos onde est o directrio criado
anteriormente. Assim que estiver concludo, podemos ver o
nosso recm criado plugin activado e pronto a utilizar.

chrome.browserAction.onClicked.addListener
(function(tab)
{
chrome.tabs.getSelected(null, function(tab)
{
chrome.tabs.sendMessage(tab.id, "");
});
});

Agora que est tudo terminado, podemos testar o nosso


plugin!

Explicando, estamos a dizer ao nosso background.js que


assim que for feito um clique no cone do Plugin, este envia
uma mensagem indicando que o clique foi efetuado. Na
mensagem obrigatrio passarmos o id do Tab em que
estamos, bem como uma mensagem, que neste caso uma
string vazia.

Concluses
Com este artigo aprendemos a dar os primeiros passos na
criao de plugins para o Google Chrome.

Listener

Aproveito a ocasio para dar a conhecer um plugin


desenvolvido por mim, que tem como objectivo desbloquear
o contedo social em que somos obrigados a dar Like para
que o possamos ver. O plugin chama-se Social Unlocker e
podem
obter
mais
informaes
em:
http://
www.rafaelalmeida.pt/socialunlocker/

Como vimos anteriormente, assim que o utilizador efetua o


clique no boto do nosso plugin, enviada uma mensagem.
Mas para quem? aqui que entra o ficheiro content.js, que
definimos no manifest.json. No content.js temos o seguinte
cdigo:
chrome.extension.onMessage.addListener(function()
{
var width = $(window).width();
var height = $(window).height();
alert("Largura:" + width + "\nAltura: " +
height);
});

Gostaria de agradecer ao Jorge Paulino pelo convite e pela


oportunidade. Espero que tenham gostado e espero que
este artigo sirva de ajuda para que possam criar os vossos
plugins!

O cdigo acima, est espera que seja enviada uma


mensagem. Assim que a mesma enviada este adiciona um
listener, que vai fazer com que ele seja o receptor da
mensagem, executando assim a sua funo. Neste caso, ir

Escrito por Rafael Almeida


Aluno de Eng. Informtica da Universidade Fernando Pessoa. Programador Free-Lancer e autor do Plugin Social Unlocker.
http://www.rafaelalmeida.pt

A PROGRAMAR
JSFParte 2 Como Criar um Projeto JSF
Aplicao de Licenas de Utilizador no SharePoint 2013
Funes Annimas
PascalOperator Overloading
Quero fazer uma aplicao simples! E agora? Por onde comeo?
Desbravando o goto!
Arduino: const vs #define
Mitos do jQuery

A PROGRAMAR
JSF - parte 2 - Como Criar um Projeto JSF
selecionar os plugins da categoria Java Web and EE e instal-los (em Install). De seguida, deve reiniciar o IDE.

Este segundo artigo da srie incidir sobre o processo de


instalao e configurao do ambiente de desenvolvimento
para um projeto JSF, que comprovar o sucesso da operao. De seguida, analisaremos a estrutura do mesmo e faremos as primeiras modificaes. Em resumo, o artigo dividese
em:

Instalao do JDK: o SDK do Java

Instalao do IDE: o NetBeans com plugins Java EE

Instalao e registo de um servidor aplicacional para


Java: o Tomcat

Configurao e explicao de um projeto JSF

(se j tem o NetBeans e o JDK no sistema ento salte


para
o
passo
4)
Se ainda no tem nada instalado, pode obter um 2
em (JDK+IDE) no site de downloads da Oracle. Aqui,
procure pelo link da verso do JDK com o NetBeans;
no ecr posterior, realize o download para o seu S.O./
arquitetura.

4.

(se j tem o Tomcat no seu PC, salte para o passo 6)


Vamos instalar agora o servidor aplicacional (web
server).
Dirija-se pgina de downloads do Tomcat e opte
pelo download adequado ao seu S.O./arquitetura.

5.

Descompacte o ficheiro do servidor para uma pasta


sua escolha.

6.

Agora que tem o JDK, o IDE e o servidor aplicacional


instalados, est pronto para criar um projeto JSF.

Se, por outro lado, j tem o JDK no sistema, ento deve ir


diretamente ao site de downloads do NetBeans. Aqui, deve
sacar a verso do NetBeans Java EE.
2.

Instale a verso que tiver transferido.

3.

Abra o NetBeans

Nota: no caso de ter obtido a verso IDE+SDK, h um passo


adicional: deve ir a Tools > Plugins > Available Plugins,

A PROGRAMAR
JSF - PARTE 2 - COMO CRIAR UM PROJECTO JSF
Vamos criar um projeto do zero. Para tal, v a File >
New Project e selecione Java Web > Web Application.

9.

Selecione Apache Tomcat e clique em Next:

10.

Neste
ecr
de
configurao:
- indique a pasta base para onde descompactou o
Tomcat
no
passo
5
(Browse);
- insira admin/admin nos campos Username e
Password;
- clique em Finish.

11.

Nesta altura j dever ter o Tomcat presente e selecionado na listagem, pelo que dever pressionar Next:

12.

Poder agora indicar as bibliotecas iniciais (jars) a


associar ao projeto. Selecione o JavaServer Faces (JSF) e faa Finish:

Nota: Com o tipo de projeto criado, quem ir gerir as bibliotecas (dependncias) associadas aos projeto ser o NetBeans.
O Maven uma alternativa quando as coisas se complicam
(nesse caso deve escolher Maven > Web Application).
Se preferir, pode criar um projeto com base num sample project. Para tal, no ecr de New Project, deve selecionar
Samples e escolher um projeto que lhe agrade, partida dentro
de
HTML5,
Java
EE
ou
Maven.
Em ambos os casos, o resto do tutorial no se aplica.
Clique em Next.
7.

8.

Deve agora dar um nome ao projeto e fazer Next:

(se j tinha o Tomcat registado no NetBeans salte para


o
passo
11)
Como o NetBeans ainda no sabe da existncia do
Tomcat, devemos agora regist-lo (num prximo projeto
ele j estar disponvel e isto no ser mais necessrio). Para tal, clique em Add, ao lado de Server:

10

A PROGRAMAR
JSF - PARTE 2 - COMO CRIAR UM PROJECTO JSF
13.

Agora j tem tudo configurado, est pronto para correr o


projeto. Para tal, clique no boto de Run Project:

Voil depois de alguns instantes ver uma pgina do


browser com um Hello from Facelets!
Vamos ento conhecer um pouco melhor as entranhas do projeto. A melhor maneira olhar para a tab Projects. Esta tab
tem a organizao lgica do projeto, organizando os ficheiros
por categoria e no por como realmente esto no sistema de
ficheiros (para isso, use a tab Files).

Web Pages: onde encontrar os Facelets do projeto. Em


MVC, so a view. Estes ficheiros representam o markup (com
componentes JSF) que ser convertido para HTML (so substitutos dos JSP). So materializados em ficheiros .xhtml.

exemplo, poderiamos ter um managed bean chamado


Carrinho.java com os mtodos getProdutos, compra,
adicionaProduto, retiraProduto, etc. Depois, num Facelet,
era possvel ter a expresso #{carrinho.produtos} (o get
implcito
e
o
p
passa
a
minsculo).
Esta mesma pasta pode tambm conter servios, DAOs,
validadores, conversores, classes do domnio, DTOs, entre
outros.
Libraries: onde esto representadas as bibliotecas necessrias ao projeto. Encontrar l, no mnimo, o JDK e uma
implementao da norma JSF. Futuramente, poder ter uma
biblioteca de componentes (ex.: o PrimeFaces) (se o projeto
fosse do tipo Maven, esta pasta seria substituida por
Dependencies e Java Dependencies).

O Maven e uma alternativa quando as


coisas se complicam
(nesse caso deve escolher Maven > Web Application).
Configuration Files: os ficheiros de configurao do projeto. Por exemplo, o ficheiro web.xml que contem algumas
configuraes de alto nvel do projeto (por exemplo, o servlet
do JSF). O context.xml define em que endereo o projeto
lanado no browser (se o projeto fosse do tipo Maven, esta
pasta seria substituida pela Project Files e teria um
pom.xml para gerir as bibliotecas incluidas).

Source Packages: o cdigo Java propriamente dito, nomeadamente os managed beans. Os managed beans so o
controller em MVC, ou seja, o backing code (ou seja API)
disponibilizada aos componentes presentes nos Facelets. Por

O prximo artigo ensinar a criar um managed bean e a fazer uso do mesmo num Facelet.

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

11

A PROGRAMAR
Aplicao de Licenas de Utilizador no SharePoint 2013
De entre as vrias novas funcionalidades includas no SharePoint 2013, h uma que injustamente me passou despercebida at recentemente: User License Enforcement
(Aplicao de Licenas de Utilizador). Digo injustamente
porque uma funcionalidade que j fazia falta h muito tempo e acho que merece mais ateno do que tem recebido.

Add-SPUserLicenseMapping

Remove-SPUserLicenseMapping

Ativar e Desativar o User License Enforcement


Para validar se esta funcionalidade est ativa, deve ser utilizado o cmdlet Get-SPUserLicensing na consola de gesto
do SharePoint 2013. Retornar true se a funcionalidade est
ativa, e false caso contrrio (ver Figura 1). Como indicando
anteriormente, o User License Enforcement est inativo por
omisso.

At agora, qualquer utilizador com acesso a uma farm de


SharePoint teria acesso a todas as funcionalidades includas
na edio instalada do SharePoint (Standard ou Enterprise),
independentemente do nvel de CAL (Client Access License)
que lhe esteja associado. Isto significa que, se uma empresa
possui uma farm de SharePoint com licena Enterprise, qualquer utilizador conseguir aceder a todas as funcionalidades
Enterprise, mesmo que lhe tenha sido atribuda uma CAL
Standard.
Na maioria das grandes empresas, por questes de otimizao de custos, bastante comum encontrar cenrios em que
apenas so atribudas licenas Enterprise a alguns utilizadores, ficando todos os outros com licenas Standard. Uma das
formas de assegurar que cada utilizador consegue aceder
apenas s funcionalidades includas no seu nvel de licena
ter duas farms de SharePoint separadas, uma com edio
Standard e outra com a edio Enterprise. No entanto, esta
no uma soluo aceitvel na maioria dos casos.

Figura 1 Utilizao do cmdlet Get-SPUserLicensing

Para o ativar, basta executar o cmdlet EnableSPUserLicensing. Para o desativar, basta executar o cmdlet
Disable-SPUserLicensing. Nenhum dos cmdlets requer
parmetros ou retornar (ver Figura 2).

O SharePoint 2013 resolve esta questo com a nova capacidade de Aplicao de Licenas de Utilizador (ou User License Enforcement) que permite mapear licenas com utilizadores especficos ou com grupos de Active Directory. Quando o
User License Enforcement est ativo, os utilizadores conseguem aceder apenas s funcionalidades includas na sua
licena, as restantes sero bloqueadas. Quando est inativo,
que a opo por omisso, o SharePoint funciona como nas
verses anteriores.
A gesto do User License Enforcement realizada exclusivamente atravs de cmdlets de PowerShell na SharePoint
2013 Management Shell. Existem oito cmdlets que so explicados em detalhe mais abaixo:

Get-SPUserLicensing

Enable-SPUserLicensing

Disable-SPUserLicensing

Get-SPUserLicense

Get-SPUserLicenseMapping

New-SPUserLicenseMapping

Figura 2 Utilizao dos cmdlets Enable-SPUserLicensing e Disable


-SPUserLicensing

Agora que j falmos sobre como ativar e desativar o User


License Enforcement, aconselhvel mant-lo desativado
at que esteja corretamente configurado. De outra forma
poder, involuntariamente, bloquear o acesso s funcionalidades Enterprise para utilizadores que deveria ter acesso a
elas, ou permitir o acesso a funcionalidades que os utilizadores no deveriam ser autorizados a aceder.

12

A PROGRAMAR
APLICAO DE LICENAS DE UTILIZADOR NO SHAREPOINT 2013
Obter Licenas Disponveis
Para validar quais as licenas que esto disponveis na sua
farm de SharePoint, poder utilizar o cmdlet
GetSPUserLicense (ver figura 3).

tambm possvel mapear um Forms-based Role numa


licena usando os parmetros RoleProvider e Role em
vez do parmetro SecurityGroup:
$mapping = New-SPUserLicenseMapping
RoleProvider MyRoleProvider
Role Enterprise Users
License Enterprise
Finalmente, possvel mapear uma claim numa licena utilizando os parmetros ClaimType, -OriginalProvider e
Value, ou apenas o parmetro Claim com uma referncia
para um objecto SPClaim.

Figura 3 Utilizao do cmdlet Get-SPUserLicense

Existem cinco tipos de licena (embora na minha farm existam


apenas quatro):

Enterprise

Standard

Project

OfficeWebAppsEdit

Duet

Figura 4 Utilizao do cmdlet New-SPUserLicenseMapping

Aquando da criao do mapeamento, ainda possvel especificar qual a Web Application a que o mesmo se aplica, permitindo a configurao de licenas de utilizador por web application. Se no for especificada uma web application, o
mapeamento aplicado a toda a farm.

As licenas Enterprise e Standard correspondem s duas


edies do SharePoint Server, que j existem h vrias verses do produto. Para consultar as diferenas entre as duas,
basta aceder ao TechNet: http://technet.microsoft.com/en-us/
library/sharepoint-online-servicedescription.aspx#bkmk_FeaturesOnPremise.
Quanto aos outros tipos: a licena Project utilizada para controlar o acesso s funcionalidades de Project Server, a licena
OfficeWebAppsEdit utilizada para permitir aos utilizadores a
edio de documentos nas Office Web Apps, e a licena Duet
utilizada para permitir o acesso s funcionalidades do Duet
(integrao entre SharePoint e SAP).

Uma vez criado o mapeamento, necessrio executar o


cmdlet Add-SPUserLicenseMapping para o adicionar
farm:
Add-SPUserLicenseMapping Mapping $mapping
Obter Mapeamentos de Licenas de Utilizador
Para verificar quais os mapeamentos configurados na farm,
pode utilizar-se o cmdlet Get-SPUserLicenseMapping sem
quaisquer parmetros. Note-se que os mapeamentos definidos ao nvel de uma web application no sero retornados
quando se obtm os mapeamentos definidos para toda a
farm.

Mapeamento de Licenas de Utilizador


Mapear utilizadores em licenas , na prtica, mapear claims
em direitos. Para criar um novo mapeamento necessrio
executar o cmdlet New-SPUserLicenseMapping que pode ser
utilizado de vrias formas, dependendo do tipo de claim que
est a ser mapeado.
Pode mapear-se um grupo de Active Directory numa licena,
executando o seguinte comando:
$mapping = New-SPUserLicenseMapping
SecurityGroup Enterprise Users
License Enterprise

Figura 5 Utilizao do cmdlet Get-SPUserLicenseMapping

13

A PROGRAMAR
APLICAO DE LICENAS DE UTILIZADOR NO SHAREPOINT
Para listar os mapeamentos configurados para uma web application especfica, basta adicionar o parmetro Web Application com o respetivo endereo URL.
Remover Mapeamentos de Licenas de Utilizador

Notas Adicionais
H algumas notas adicionais que me parece importante lembrar:

A funcionalidade de User License Enforcement est


disponvel apenas para ambientes SharePoint 2013
On Premise. O SharePoint Online utiliza um modelo
de licenciamento por utilizador pelo que no necessita
desta funcionalidade para controlar o acesso a funcionalidades especficas.

O User License Enforcement s funciona com Web


Applications que usem autenticao baseada em
Claims.

Uma vez ativado, ter que ser associada uma licena


a todos os utilizadores, at s contas de servio. Se
nos esquecermos de associar uma licena a um utilizador, este ser classificado como Unlicensed e serlhe- vedado o acesso maioria das funcionalidades
do SharePoint.

Para remover um mapeamento utiliza-se o cmdlet RemoveSPUserLicenseMapping. O nico parmetro obrigatrio a


identidade do mapeamento (um GUID) que facilmente obtido
executando o cmdlet Get-SPUserLicenseMapping.
Efeitos do User License Enforcement
No que respeita ao User License Enforcement, as duas perguntas mais comuns so:

Onde que a licena aplicada?

O que acontece quando um utilizador tenta aceder a


uma funcionalidade que no est disponvel para o seu
tipo de licena?

Sobre a primeira pergunta, a licena aplicada nas seguintes


situaes:

Quando acedida uma pgina com web parts que requerem uma licena especfica (por exemplo a Excel
Viewer Web Part ou InfoPath Form Viewer);

Ao aceder galeria de web parts para adicionar uma


nova web part a uma pgina;

Ao selecionar um site template na criao de um novo


site;

Ao tentar editar um documento nas Office Web Apps.

Em relao ao que acontece nestas situaes, h duas hipteses:

Um utilizador sem a licena exigida no ver os componentes aos quais no tem acesso (web parts e site templates); ou

O SharePoint negar o acesso ao componente para o


qual o utilizador no tem licena, apresentando-lhe uma
mensagem que explica a razo pela qual no pode aceder-lhe.

a nova capacidade de Aplicacao de Licencas de Utilizador


que permite mapear licencas com utilizadores especificos ou com
grupos de Active Directory.
RefernciasPoder encontrar informao adicional sobre
cmdlets
PowerShell
no
TechNet:
http://
technet.microsoft.com/en-us/library/jj219609.aspx.

AUTOR
Escrito por Andr Vala

Licenciado e Mestre em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico, actualmente consultor snior na |create|it| e co-fundador da Comunidade Portuguesa de SharePoint. Autor do blog http://bit.ly/WxtVLz,
trabalha com SharePoint desde 2006, altura em que surgiu a primeira verso beta do SharePoint 2007. Tem participado
em vrios projectos nacionais e internacionais sobre SharePoint, e participa frequentemente como orador em eventos da
Microsoft relacionados com o mesmo tema.

14

A PROGRAMAR
Funes Annimas
Neste artigo vamos falar de funes annimas, da sua histria,
a sua usabilidade e ainda mostrar dois exemplos de implementao. Um ser em Python, enquanto o segundo ser em JavaScript, ou seja, mais orientado para o contexto Web. Mas
antes de falarmos em funes annimas vamos primeiro refletir
sobre o que uma funo, que algo, ligeiramente, complicado de explicar a um leigo em programao.

outras estruturas semelhantes, tal como o map, filter e reduce. Para tornar mais claro esta informao segue em baixo a
respresentao de duas funes, uma annima e outra no.
A verso utilizada do Python foi a 2.7.

J pensaram no que responderiam se lhes perguntssem o


que uma funo? A mais simples resposta era fazer uma
analogia com a matemtica: algo que aceita valores de entrada, transforma-os de alguma maneira e retorna algo no fim.
Continuando com a analogia, em matemtica, costumamos dar
nome s funes, assim como damos enquanto estamos a
programar, mais corretamente designado por identificador.
Agora imagine que tem uma funo, mas que esse identificador no existia. Esta seria uma funo que no tinha de estar
ligada a qualquer identificador. Aqui temos o princpio bsico
das funes annimas.

def fib_normal(N):
return N if N<2 else fibs(N-1)+fibs(N-2)

No presente artigo, vamos trat-las por funes annimas, mas so tambm conhecidas por funes lambda, por
terem sido criadas a partir do trabalho de Alonzo Church enquanto desenvolvia o clculo lambda. Elas so tpicas de linguagens funcionais, como o Haskell, Lisp, Ocaml, entre outras.
Com o passar dos anos, outras linguagens arranjaram mecanismos de implementar estas funes como por exemplo C#,
JavaScript, Python ou ainda Ruby.
Coloca-se uma nova questo: se estamos felizes com as funes comuns e parecem funcionar to bem, porque devemos
usar funes annimas? E quando devemos us-las? Dependendo da linguagem com que estamos habituados a programar, j deve ter surgido aquela situao em que o parmetro
de uma funo outra funo. Aqui teriamos de declarar uma
funo no incio ou no fim do bloco de cdigo para ser usada
uma nica vez. Com as funes annimas, e caso a linguagem
suporte closure ganhamos uma maior simplicidade no cdigo,
escrevendo estas funes estrategicamente colocadas onde
so usadas. So tambm muito utilizadas na tcnica de Currying, para transformar funes de mltiplos parmetros numa
cadeia de funes, onde apenas passado um de cada vez.
Posto tudo isto, e como cada caso um caso, vamos meter
mos obra, primeiro com Python e depois com JavaScript,
como j havia sido referido.
Em Python, ao contrrio de JavaScript, o uso de funes annimas assegurado atravs da palavra reservada lambda,
baseando-se no nome original dado a este tipo de funes, tal
como descrito em cima. Este tipo de funes podem ser definidas em qualquer local do cdigo e, como j referido anteriormente, sem um identificador respetivo. So muito utilizadas
como complemento s funes de manuseamento de listas e

15

1 Clculo do nmero N da sequncia de Fibonacci, utilizando funes normais.

print fib_normal(10)
2 Clculo do nmero N da sequncia de Fibonacci, utilizando funes annimas.
fib_anonima = lambda N: N if N<2 else fib_anonima
(N-1)+fib_anonima(N-2)
print fib_anonima(10)
No exemplo em cima apresentado podemos ver que em ambos os casos calculado a soma dos N primeiros elementos
da sequncia de Fibonacci. No primeiro caso apresentada
a funo fib_normal(N) que retorna essa soma, enquanto
que no segundo caso o clculo feito recorrendo declarao do lambda, que retorna essa mesma soma na varivel
fib_anonima.
Em JavaScript, no se torna muito diferente do exemplo anterior. Para declararmos uma funo em JavasScript podemos fazer de duas formas:
1 Declarando uma funo com o seu nome, neste
caso myFunction:
function myFunction() {
alert("Hello PaP!");
}
2 Ou ainda, usando o operador de funo, tornando assim
a funo annima:
var myFunction = function () {
alert("Hello PaP!");
}
Repare-se que neste ltimo caso a funo no tem nome.
A grande diferena entre estes dois tipos, em termos de execuo em JavaScript, que as funes declaradas normalmente so movidas para o incio do cdigo e so criadas
desde que o programa comea a execuo. As que so escritas com o operador apenas so geradas quando chega o
momento de as utilizar.
Este mecanismo permite uma diminuio do tempo de compilao, no entanto no permite a avaliao, por parte do
compilador, de potenciais erros de execuo que possam
ocorrer durante a execuo do programa.

A PROGRAMAR
FUNES ANNIMAS
Vamor ver outro exemplo em que as funes annimas so
habitualmente usadas em JavaScript:
var myFunction;
if (x != 0) {
myFunction = function () {
alert("!=0")
}
}
else {
myFunction = function () {
alert("= 0")
}
}
Neste exemplo, podemos ver que as instrues a desempenhar pela funo representada pela varivel myFunction sero
diferentes consoante o valor de x.

[...] se estamos felizes com as funcoes


comuns e parecem funcionar tao bem, porque
devemos usar funcoes
anonimas? E quando
devemos usa-las?

Concluso:
As funes annimas devem ser usadas conforme a experincia, a linguagem de desenvolvimento e o objetivo do programador, tendo em conta que, normalmente, as solues
desenvolvidas com recurso a estas so mais elegantes e
fceis de ler. Mais ainda podemos concluir que com o aparecimento do paradigma funcional nas linguagens de programao possvel utilizar todo potencial deste tipo de funes.

Agora
imagine
que tem uma funcao,
mas que esse identifica
- dor nao existia. Esta
seria uma funcao que
nao tinha de estar ligada a qualquer identificador. Aqui temos o
principio basico das
funcoes anonimas.
Esperamos ter agradado os leitores.

AUTOR
Escrito por Cristiano Ramos

Estudante de Engenharia Informtica na UBI


cdgramos@live.com.pt
www.cdgramos.com

AUTOR
Escrito por Joo Silva

Estudante de Engenharia Informtica na UBI


j0a0.silva.kle@gmail.com
www.linkedin.com/in/joaopfsilva

16

A PROGRAMAR
Pascal operator overloading
Vrias so as linguagens nas quais podemos fazer overload
de funes; esta funcionalidade permite que uma funo
possua vrias verses que admitam diferentes conjuntos de
argumentos, ficando o compilador encarregue de seleccionar
qual dos overloads o correcto aquando da invocao dessa funo. Uma das linguagens com essa capacidade o
Object Pascal moderno.

sativo implementar estes ciclos, mesmo com recurso a funes.


Com a capacidade de overloading dos operadores torna-se
possvel reduzir o rudo do cdigo. Para tal, implementamos
numa unit os overloads que nos forem teis.
Podemos, ento, comear a tirar apontamentos acerca da
sintaxe da implementao de operating overloading:

Em Pascal, este tipo de polimorfismo tambm se aplica aos


operadores, os quais podem de igual forma ser overloaded.

operator simbolo (operando1 : tipo1; operando2 :


tipo2) resultado : tipo3;

Na definio da linguagem Pascal segundo a documentao


do Free Pascal, os tokens (palavras que constituem o cdigo
do nosso programa) podem pertencer a vrias categorias,
cada uma delas com funes ou caractersticas particulares.
Uma dessas categorias a dos operadores, os quais so
um smbolo ou conjunto de dois smbolos, com uma funo
especfica, admitindo um ou dois operandos e devolvendo
um resultado. Os operadores so habitualmente funes
com nomes e sintaxe especiais (nomes compostos por smbolos e invocao infixa, por oposio tradicional invocao prefixa).

Operator uma palavra reservada comummente no reconhecida pela esmagadora maioria dos editores de texto e
IDE's (embora muitos nos permitam definir palavras reservadas adicionais). No entanto, uma palavra reservada que
equivale essencialmente function ou procedure. Neste
caso, indica ao programa que vai haver um overload de um
operador pr-existente, representado por simbolo.
Entre parntesis indicamos os operandos, tal como o fazemos com os argumentos de uma funo (afinal de contas,
um operador uma funo com dois argumentos). De seguida, vem algo que difere da sintaxe comum: aparece um novo
identificador. Em Pascal (Standard e Free Pascal), o resultado de uma funo atribudo a uma varivel local com nome
igual ao da prpria funo; no caso de um operador no
existe um identificador alfanumrico mas sim um smbolo (o
operador), o qual um nome vlido para uma varivel, e ao
qual no pode ser atribudo um valor. Portanto, temos de
criar o identificador que represente o resultado. Especificamos o seu nome, por conseguinte, aps a declarao dos
operandos, seguido do tipo de dados de output.

Dentro destes operadores, muitos deles podem ser overloaded, permitindo ao programador defini-los para novos tipos
de operandos, e com comportamentos diferentes do habitual, aumentando assim a expressividade do cdigo. A isto
chamamos operator overloading, objecto de estudo do
presente artigo.
Todo o cdigo do artigo foi compilado com Free Pascal Compiler, verso 2.6.2, em ambiente GNU/Linux (Ubuntu 12.04
LTS).

Overload de operadores aritmticos

Vejamos com mais pormenor a seguinte implementao:


operator * (n : integer; list : TIntegerArray) res : TIntegerArray;
var i : word;
begin
SetLength(res, Length(list));
for i := Low(list) to High(list) do
res[i] := n * list[i];
end;

Nem todos os operadores podem ser overloaded, mas os


mais comuns podem: os operadores de atribuio, aritmticos e de comparao.
Vamos partir de casos prticos para entender como se faz
overload de operadores em Free Pascal. Imagine-se, por
exemplo, que pretendemos multiplicar os valores de um array de nmeros inteiros, do tipo Integer, por um nmero tambm ele Integer, retornando um novo array.

Estamos a fazer overload ao operador de multiplicao *, o


qual tem dois operandos: n, do tipo integer, que vai ficar
esquerda do operador, e list, do tipo TIntegerArray, que vai
ficar direita. O resultado da operao ser atribudo ao
identificador res, e -nos indicado que o output do tipo TIntegerArray.

Regra geral, o que ns fazemos iterar pelos elementos do


array, aplicando o dito clculo. O resultado pode ficar no
mesmo array ou ser atribudo a um novo. Decerto o leitor j
teve situaes nas quais necessitou de realizar aplicao de
clculos simples a um array e tornou-se possivelmente can-

No podemos indicar de forma explcita que o tipo de dados


array of integer, uma vez que o compilador no o aceita.

17

A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
Deste modo, temos de criar um novo tipo de dados de modo a
que possamos fornecer este tipo na forma de um identificador.
type TIntegerArray = array of integer;
A partir do momento em que temos este overload definido,
podemos utilizar o operador * para multiplicar uma varivel do
tipo integer por outra do tipo TIntegerArray. No entanto, foi
referido que um ficava direita e outro esquerda. Vejamos o
que acontece se tentarmos compilar o seguinte cdigo (o overload do operador est na unit operover (de Operator Overloading) uma unit prpria onde iremos colocar o cdigo).
{$mode objfpc}
program artigo44;
uses operover;

list2 := list1 * 2;
for i := Low(list1) to High(list1) do
writeln('2 * ', list1[i] : 2, ' = ',
list2[i] : 2);
end.
O Free Pascal vai indicar o seguinte:
artigo44.pas(16,20) Error: Operator is not overloaded: "TIntegerArray" * "ShortInt"
Ns definimos que o primeiro operando integer, e ns fornecemos-lhe um TIntegerArray. Isto acontece porque o overloading de operadores sensvel ordem pela qual recebe os
operandos. Vamos, portanto, criar um segundo overload que
define a ordem inversa dos operandos:
operator * (list : TIntegerArray; n : integer)
res : TIntegerArray;
begin
res := n * list;
end;
Desta vez, a varivel do tipo TIntegerArray aparece esquerda
do operador, e a integer direita. Para implementar este overload recorremos ao overload definido anteriormente. A partir
deste momento, podemos multiplicar um integer por um TIntegerArray em qualquer ordem. Vamos testar o cdigo anterior, e
consideremos que list1 tem os valores {2, 7, 5, 9, 4}; este o
output do programa:
2
7
5
9
4

operator + (n : integer; list : TIntegerArray)


res : TIntegerArray;
var i : word;
begin
SetLength(res, Length(list));
for i := Low(list) to High(list) do
res[i] := n + list[i];
end;

Como se pode verificar, em tudo igual ao overload do operador *. De seguida iremos implementar o overload do operador de subtraco -. No entanto, para aumentar a versatilidade dos operadores e tornar, por ltimo, esta implementao mais compacta, iremos primeiro implementar o menos
unrio (o operador - que indica um valor negativo, como 4):

begin
(* Cdigo que adiciona valores a list1 *)

*
*
*
*
*

Vamos continuar com o overload do operador de adio +.

operator + (list : TIntegerArray; n : integer)


res : TIntegerArray;
begin
res := n + list;
end;

var list1 : TIntegerArray = nil;


list2 : TIntegerArray = nil;
i : integer;

2
2
2
2
2

mo que b/a. Nestes casos, talvez seja de vital importncia


definir bem o overloading para cada ordem de operandos.
Isto , 5-list dever dar um resultado diferente de list-5.

= 4
= 14
= 10
= 18
= 8

Como podemos verificar, list2 possui os valores de list1 multiplicados por 2 e pela ordem original. O nosso operador overloaded funcionou. Podemos fazer o mesmo para a soma. No
entanto, a subtraco e a diviso no tm a propriedade comutativa, ou seja, a-b no o mesmo que b-a, e a/b no o mes-

18

operator - (list : TIntegerArray) res :


TIntegerArray;
var i : word;
begin
SetLength(res, Length(list));
for i := Low(list) to High(list) do
res[i] := -list[i];
end;
Este operador s tem um operando, direita. Neste momento podemos definir o overload do operador -, de subtraco,
de forma bastante compacta:
operator - (n : integer; list : TIntegerArray)
res : TIntegerArray;
begin
res := n + (-list);
end;
operator - (list : TIntegerArray; n : integer)
res : TIntegerArray;
begin
res := (-n) + list;
end;
Repare-se que recorremos ao operador + e, no primeiro
caso, ao menos unrio para definir estes overloads. Podamos ter feito com ciclos, mas esta uma tcnica que permite
poupar algumas linhas de cdigo, tornando o cdigo mais
legvel.
Resta-nos o operador de diviso /, que retorna um nmero
real. Todavia, o nosso output tem sido um array of integer.
Para este caso, necessitaremos de um novo tipo de dados
para o output:
type TRealArray = array of real;

A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
operator < (list1, list2 : TIntegerArray)
res : boolean;
begin
res := list2 > list1;
end;

operator / (n : integer; list : TIntegerArray)


res : TRealArray;
var i : word;
begin
SetLength(res, Length(list));
for i := Low(list) to High(list) do
res[i] := n / list[i];
end;

Portanto, para implementar o overload de um operador de


comparao com a ordem dos operandos invertidos, recorremos ao overload do operador inverso.

operator / (list : TIntegerArray; n : integer)


res : TRealArray;
var i : word;
begin
SetLength(res, Length(list));
for i := Low(list) to High(list) do
res[i] := list[i] / n;
end;

O mesmo se aplica aos operadores <= e >=.


Por fim, os operadores de igualdade (=) e diferena (<>)
tambm podem ser overloaded.

Repare-se que recorremos ao operador + e, no primeiro caso,


ao menos unrio para definir estes overloads. Podamos ter
feito com ciclos, mas esta uma tcnica que permite poupar
algumas linhas de cdigo, tornando o cdigo mais legvel.
Resta-nos o operador de diviso /, que retorna um nmero
real. Todavia, o nosso output tem sido um array of integer.
Para este caso, necessitaremos de um novo tipo de dados
para o output:

Overload do operador IN

Desde a verso 2.6.0 do Free Pascal Compiler que o operador IN tambm pode ser overloaded. Este operador verifica,
por defeito, se um determinado valor pertence a um set. No
entanto, ele no tem a capacidade de fazer esta verificao
com um array.
Desta forma, vamos implementar um overload que o permita:

Implemente o overload de todos os operadores de comparao (excepto o de igualdade e o de diferena) de forma a


comparar dois arrays. Caso os arrays tenham tamanhos
diferentes, dever retornar False. Caso contrrio, se todo o
par de elementos cumprir a comparao, devolve True.
Vamos trocar por midos: se fizermos {1,2,3}>={1,4,2} iremos
obter False. Os arrays tm o mesmo tamanho, mas o segundo
par de elementos (o 2 do primeiro array, e o 4 do segundo) no
cumprem a comparao: 2>=4 falso, pelo que a comparao
dos arrays vai retornar False.
No implementamos os operadores de igualdade e de diferena pelo simples motivo de estes, por defeito, j terem a capacidade de comparar arrays.
Para implementar estes overloads de forma compacta, vamos
analisar a seguinte propriedade matemtica:

a>b o mesmo que b<a;

Portanto, basta implementar um dos operadores, e o outro ser


a aplicao do anterior, mas invertido. Em cdigo:

operator in (n : integer; list :


TIntegerArray) res : boolean;
var elem : integer;
begin
res := false;
for elem in list do
if n = elem then begin
res := true;
break;
end;
end;
Overload do operador de atribuio
Para terminar, s falta abordar um operador que tambm
pode ser overloaded: o operador de atribuio, :=.
A par do menos unrio, este operador s tem um operando,
o qual se encontra igualmente do seu lado direito. Para demonstrar como se faz overloading deste operador, vamos
receber um set of byte e transform-lo num array of integer.
type TIntegerArray = array of integer;
TByteSet = set of byte;
operator := (list : TByteSet) res :
TIntegerArray;
var elem : byte;
begin
res := nil;
for elem in list do begin
SetLength(res, Length(res)+1);
res[High(res)] := elem;
end;
end;

operator > (list1, list2 : TIntegerArray)


res : boolean;
var i : word;
begin
res := Length(list1) = Length(list2);
if res then
for i := Low(list1) to High(list1) do
if not(list1[i] > list2[i]) then
begin
res := false;
break;
end;
end;

O tipo de dados set implica que os dados fiquem automaticamente por ordem, independentemente da ordem em que os
declaramos no cdigo. Isto ser visto de seguida.

19

A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
Concluso

Consideremos a implementao de todos estes overloads numa unit denominada operover, tal como foi referido ao longo do
artigo. Vamos test-la com o seguinte programa:
{$mode objfpc}
program artigo44;
uses operover;
var list1 : TIntegerArray = nil;
list2 : TIntegerArray = nil;
i : integer;

writeln('list1 > list2? ':16, list1 >


list2);
writeln('list1 <= list2? ':16, list1 <=
list2);
writeln('-4 in list2? ':16, -4 in list2);
end.
O output deste programa o seguinte:
* -2 =
* -4 =
* -5 =
* -7 =
* -9 =
list1 >
list1 <=
-4 in

Desta forma terminamos esta incurso pelo mundo do overloading de operadores em Free Pascal. Basicamente qualquer tipo de dados pode ser fornecido a um operador, desde
que seja feito o seu overload. Esta uma ferramenta que
permite tornar a linguagem muito mais expressiva, compacta
e at intuitiva.

Esta funcionalidade de polimorfismo


tambem se aplica aos
operadores, os quais,
em algumas linguagens, podem de igual
forma ser overloaded.
[...] o overloading de
operadores e sensivel
a ordem pela qual recebe os operandos.

begin
list1 := [2,7,5,9,4];
list2 := -list1 * 2;
for i := Low(list1) to High(list1) do
writeln('2 * ', -list1[i]:2, ' = ', list2
[i]:3);

2
2
2
2
2

numa ordem aleatria, os dados foram colocados por ordem


crescente, isto por causa do modo como funciona o tipo de
dados set. Podemos portanto concluir que os operadores
esto a funcionar conforme era a nossa inteno.

-4
-8
-10
-14
-18
list2? TRUE
list2? FALSE
list2? TRUE

Como podemos constatar, apesar do set ter sido fornecido

Com a capacidade
de overloading dos
operadores
torna-se
possivel
reduzir
o
ruido do codigo
AUTOR
Escrito por Igor Nunes

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

20

A PROGRAMAR
Quero fazer uma aplicao simples! E agora? Por onde comeo?
No artigo da edio anterior falamos em rvores de vantagem na linguagem C, em que utilizamos como exemplo prtico um stand de automveis. Aproveitando o mote do stand
de automveis, nesta edio trago-vos um programa simples
acerca da gesto dessas viaturas.

pblico, isto porque este software faz a traduo entre o IP


pblico da ligao que temos no momento, para o host que
criamos na nossa conta free.
Quando executamos o No-IP colocamos o email usado e a
password escolhida.

Ao contrrio do que costume, desta vez a linguagem base


deste artigo o C# com uma ajuda por parte do SQL. Desta
vez a escolha recaiu na linguagem C# pelo simples motivo
de que no meu entender, criar interfaces grficas mais
rpido e simples faz-lo usando o C# do que o C.
Ao longo do artigo vamos explicar de forma simples e sem
grandes algoritmos como fazer de forma rpida uma pequena aplicao que interaja com uma base de dados.
Este portanto um artigo mais vocacionado a todos os nossos os leitores que ainda esto a dar os primeiros passos
neste tipo de aplicao, at porque a ideia deste artigo surgiu das dificuldades que eu prpria senti quando recentemente iniciei numa nova etapa.
Vamos por partes ento o que precisamos para este artigo?

Ilustrao 1 - Ecr de Login No-IP

Do SQL Server, que para este artigo foi utilizada a


verso Express que pode ser obtida gratuitamente no
site da Microsoft (http://www.microsoft.com/en-us/
download/details.aspx?id=29062).

Do No-IP, que para este artigo foi utilizado a sua verso Free que pode ser obtido em (http://
www.noip.com/)

Do Visual Studio (neste artigo foi utilizado a verso


VS 2010)

Seguidamente escolhemos o host que criamos (neste artigo


foi usado como host o artigoprogramar.no-ip.biz como mostra a imagem seguinte)

Se poderamos ter utilizado outros softwares para este artigo? Sim, de facto poderamos, e o leitor caso queira experimentar por si implementar o nosso exemplo pode utilizar
outros equivalentes que prefira.
1 Fase No-IP e o IP Fixo
Agora que j temos tudo o que precisamos, vamos comear
por registarmo-nos no No-IP para termos uma conta free e
vamos instalar o programa no computador que queremos
que tenha a nossa Base de Dados. Para quem no conhece,
o No-IP traduz o nosso IP dinmico para um IP Esttico que
pode ser acedido em qualquer parte. Isto porque a maior
parte das nossas ligaes internet quando nos ligamos
rede nunca temos o mesmo IP Pblico, este IP altera-se
quase sempre que tentamos estabelecer uma nova ligao.
O No-IP uma forma simples de termos sempre o mesmo IP

Ilustrao 2 - Escolha de Host No-IP

Ao clicarmos em Save, o No-IP actualiza-se e como mostra


a figura seguinte passa a verificar periodicamente qual o IP
pblico que temos no momento, para que o host que escolhemos anteriormente.

21

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Ou seja neste momento na nossa rede privada, o computador onde iremos instalar o SQL Server ir sempre responder
no IP 192.168.2.100.
Nota: Caso apenas quisssemos implementar este exemplo
na nossa rede de casa por exemplo, no precisaramos de
utilizar o No-IP. Isto porque dentro da nossa rede interna, os
computadores iriam reconhecer-se entre si.
2 Fase SQL SERVER

Ilustrao 3 - Verificao de IP pblico do No-IP

Agora que j temos o No-IP activo precisamos de o nosso router saiba que os pedidos que receber de fora da sua rede tm
que ser enviados para o computador que tem instalado a nossa base de dados. A forma mais rpida de fazermos isso dar
um IP Fixo ao computador em questo.

Nesta fase vamos ento instalar a nossa Base de Dados.


Aps fazermos o download da verso indicada ao nosso
sistema operativo, basta executarmos o assistente de instalao e seguirmos os passos que nos vo sendo mostrados.

Neste caso, indo a Painel de Controlo Ligaes de Rede


Propriedades e depois Propriedades TCP/IPv4 demos por
exemplo o ip 192.168.2.100.

Ilustrao 6 - Aceitar as condies da Verso EXPRESS do SQL


SERVER

Ilustrao 4 - Propriedade de rea Local do Computador da BD

Ilustrao 5 - Dar um IP Fixo na nossa rede interna ao computador da


BD

Ilustrao 7 - Opes de Instalao

22

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Mais frente neste artigo voltaremos a utilizar estes dados.
Por fim chegaremos ao menu que nos indica que instalamos
o SQL Server com sucesso como mostra a imagem seguinte.

Ilustrao 8 - Opes de Instalao - Continuao

Ora heis que neste momento chegmos a meio da nossa instalao da Base de Dados. Ser-nos- pedido que confirmemos
como queremos aceder nossa BD. Neste ecr devemos escolher a opo Mixed Mode que ns ir permitir aceder BD
quer por meio da autenticao da sesso do Windows quer por
meio da autenticao no SQL Server. Neste momento ser-nos pedido para escolhermos uma password de acesso para o
login sa (System Administrator).

Ilustrao 10 - Menu de confirmao de Instalao

Ilustrao 11 - Menu de confirmao de Instalao

Neste momento aps termos instalado o SQL Server (neste


caso a BD e o Management Studio SQL Server), se formos
aos programas instalados j poderemos ver que nos aparecem os novos programas como mostra a figura seguinte.

Ilustrao 9 - Escolher a password de acesso BD

Convm no esquecermos qual a password escolhida para


que mais tarde consigamos aceder facilmente base de dados
e podermos de forma rpida e eficaz alterarmos a informao
nela guardada.
Para este artigo os dados utilizados foram:
Login: sa
Password: p@ppassword
Ilustrao 12 - Instalao bem sucedida SQL Server

23

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Neste momento estamos quase prontos para comear a criar a
Base de Dados que vai suportar este nosso artigo.
Mas antes de comearmos convm tomar em conta alguns
pormenores que apesar de serem pequenos, tm uma importncia extrema ao bom funcionamento que pretendemos.

Para criar uma nova base de dados, clicamos com o boto


do lado direito do rato em cima de Databases e escolhemos New Database como mostrado na figura seguinte.

O SQL Server responde em duas portas especificas, a porta


1433 (TCP) e a porta 1434 (UDP). Contudo por defeito, quando
o instalamos pela primeira vez essa opo vem desactivada.
Convm portanto activarmos essa opo antes de prosseguir.
Para activar basta ir ao Painel de Controlo Programas Microsoft SQL Server 2012 Configuration Tools e abrir o SQL
Server Configuration Manager.

Ilustrao 15 - Criar uma nova BD

Aparecer um novo menu onde devemos colocar o nome da


BD assim como as caractersticas que queremos que a mesma tenha. Com possvel ver na imagem seguinte demos o
nome de PAP base de dados e deixmos as definies de
defeito.

Ilustrao 13 - Menu SQL Server Configuration Manager

Como podemos ver pela figura anterior o protocolo TCP/IP est


desactivado, devemos ento activa-lo (isto , passa-lo de
Disabled para Enable).
Posto isto vamos ento executar o SQL Server Management
Studio que nos ir permitir facilmente criar a nossa BD.
Executando-o, ir aparecer-nos o seguinte ecr.

Ilustrao 16 - Criar nova BD

Agora que j temos a base de dados precisamos de lhe adicionar as tabelas correspondentes.
Ilustrao 14 - Menu de entrada SQL Server

Carregando em Connect entraremos no SQL Server. No lado


esquerdo do ecr visvel o Object Explorer que nos ir ajudar a atingir o nosso objectivo

24

De forma anloga quando expandimos a nossa PAP (a base


de dados que acabamos de criar), so nos mostradas as sub
pastas que compe a mesma. Clicando mais uma vez com o

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
boto do lado direito em cima da subpasta Tables escolhemos
a opo New Table como ilustra a figura seguinte.

Ilustrao 19 - Criao de vrias tabelas BD

Neste exemplo consideramos quatro tabelas, que nos permitiro guardar toda a informao dos nossos veculos.

Ilustrao 17 - Criar nova tab

Agora basta-nos inserir os campos na mesma e escolher qual


o tipo de campos que queremos guarda nessa tabela da BD.
Por fim ao guardarmos a tabela que acabamos de criar damoslhe o nome que escolhermos, a figura seguinte mostra como foi
criada a tabela Carro que ir ser usada no nosso projecto
para este artigo.

Ilustrao 20 - Tabelas Usadas no Exemplo

Antes de passarmos ltima fase deste artigo vamos voltar


a fazer o ponto de situao.
Neste momento temos o No-IP que nos permite ter um ip fixo
pblico, temos o SQL Server com a base de dados PAP que
criamos, em que essa mesma base de dados tem 4 tabelas
(Carro, Utilizador, Revisao e KmsAnuais).
Agora que j temos tudo, podemos passar ento nossa
aplicao propriamente dita.
Ilustrao 18 - Criao da Tabela Carro

3 Fase A aplicao

Ao irmos criando as diferentes tabelas que compem a BD as


alteraes vo-se tornando visveis, como mostra a figura seguinte.

25

Nesta fase, executamos o Visual Studio e criamos um novo


projecto, neste caso criamos um projecto do tipo Windows
Forms Application que j bastante conhecido.

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
A imagem anterior mostra os carros que esto na base de
dados assim como o utilizador e os Kms que faltam para que
seja necessria a prxima inspeco desse veiculo.
Para isso foi criada a funo mostraCarros:
private void mostraCarros() {
//Separador Tabela Litros
SqlConnection conexao = new SqlConnection();
conexao.ConnectionString = @"Data
Source=artigoprogramar.no-ip.biz;user
id=sa;password=p@ppassword;Trusted_Connection=no;
database=PAP;connection timeout=30";
conexao.Open();
string sql2 = "select * from Carro";
SqlCommand cmd2 = new SqlCommand(sql2,
conexao);
cmd2.Connection = conexao;
cmd2.CommandText = sql2;
// cria o dataadapter...
SqlDataAdapter adapter2 = new
SqlDataAdapter();
adapter2.SelectCommand = cmd2;
try
{
// preenche o dataset...
System.Data.DataSet dataSet2 = new
System.Data.DataSet();
adapter2.Fill(dataSet2);

Ilustrao 21 - Criao do Projecto Windows Forms

Nota: Para o bom funcionamento deste projecto deve estar


instalado tambm a .NET Framework 4.0 ou superior.
Para ser mais simples explicar a aplicao em si, foram colocado diversos botes cada um contendo um cdigo especifico de
forma a que todos os leitores pudessem facilmente observar as
alteraes de que vamos falar neste artigo.

dataGridView1.DataSource =
dataSet2;
dataGridView1.DataMember =
dataSet2.Tables[0].TableName;

Ento a que nos propormos executar no projecto ilustra este


artigo?

}
catch

1.

Inserir um utilizador no sistema

2.

Inserir um carro no sistema

3.

Actualizar os Kms Mensais feitos pelo carro

4.

Saber quais os carros que esto prximos de ir prxima reviso.

5.

Gerir as revises feitas pelos carros

6.

Gerir os Kms feitos por essas mesmas viaturas

// MessageBox.Show("Erro !");
}
conexao.Close();
}
Vamos agora tomar um pouco de ateno funo anterior.
Lembram-se do nome do host que criamos com o No-IP e do
login e da password que escolhemos quando instalamos a
BD? nesta ligao que iremos usar esses dados.

Como foi referido para melhor ilustrar o cdigo de cada parte


destes pressupostos, foram criados diversos botes, cada um
com a sua funcionalidade especfica.

SqlConnection conexao = new SqlConnection();


conexao.ConnectionString = @"Data
Source=artigoprogramar.no-ip.biz;user
id=sa;password=p@ppassword;Trusted_Connection=no;
database=PAP;connection timeout=30";
conexao.Open();
Traduzindo: Informamos o nosso programa que a BD a
usar a que est no endereo artigoprogramar.no-ip.org, em
que faremos o login com o utilizador sa, com a password
p@ppassword, usando a base de dados PAP.
Seguidamente dizemos-lhe para abrir a conexo base de
dados e atravs da instruo SQL, pedimos os dados que
nos interessam da tabela que queremos.

Ilustrao 22 - Menu entrada da Aplicao

26

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Neste caso string sql2 = "select * from Carro";, ou seja, queremos tudo (*) o que est presente na tabela Carro.
Guardamos essa mesma informao num SQLAdapter e depois escolhemos usando um datagridview1, mostramos essa
informao aos nossos utilizadores finais. Ou seja, o datagridview usa como fonte de dados, a informao presente no
SQLAdapter que crimos.

de dados que a mesma deve apresentar?


Uma das formas mais simples usar DataBindings. E como?
Se clicarmos na ComboBox com o boto direito do rato, ir
aparecer a imagem seguinte.

Comecemos ento pelo boto Adicionar:


private void adicionarbutton_Click(object sender,
EventArgs e)
{
Adicionar add = new Adicionar();
add.ShowDialog();
mostraCarros();
}
Ora como visvel, o boto adicionar instancia a classe Adicionar enviando-nos para a interface grfica dessa mesma classe.
Assim que fizermos as alteraes nesse submenu, ao voltarmos ao menu inicial, novamente chamada a funo mostraCarros que vai actualizar novamente a listagem a ser mostrada.
Quando entramos na Classe Adicionar vemos o seguinte
Layout:

Ilustrao 24 - Criao de DataBinding

Escolhendo a opo Use Data Bound Items, poderemos


adicionar uma nova Data Source ao nosso projecto. Na
figura seguinte so visveis as diversas opes que podemos
adquirir assim como a que foi escolhida para este exemplo.

Ilustrao 23 - Classe Adicionar

Temos um TabControl com duas TabPages uma para


Adicionar Carro e outra para Adicionar Utilizador.
Comecemos pela TabPage Adicionar Carro, para adicionar
um carro temos que inserir a matricula do mesmo, o utilizador
do carro, assim como os Kms que o veiculo tem e com quantos
Kms dever essa viatura ir prxima reviso.
Neste exemplo obrigamos o utilizador a escolher um nome de
um utilizador que se encontre nos dados da ComboBox, ou
seja, quando adicionamos um carro, somos obrigados a escolher um utilizador que esteja j inserido no sistema.
Mas como podemos dizer nossa ComboBox qual o conjunto

27

Ilustrao 25 - Criao de DataBinding

No menu seguinte devemos ento colocar os dados referentes nossa BD.

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
(Por curiosidade, caso tivssemos escolhido no wizzard ambos os campos da tabela Utilizador, poderamos escolher
para o Display Member e para o Value Member valores diferentes caso o desejssemos. )
Quando executamos a nossa aplicao ir aparecer ento o
utilizador Rui no valor da ComboBox. (Aparece o utilizador
Rui, pois foi o que adicionamos previamente BD.)

Ilustrao 29 - ComboBox

Mas supondo agora que queramos inserir um novo carro na


BD, o qual queramos que tivesse o utilizador Guilherme.

Ilustrao 26 - Inserir Dados da ligao

Depois disto efectuada a ligao nossa BD e so-nos mostradas as tabelas que compem a mesma.

Para que isso acontecesse, tendo em conta que explicitamos


anteriormente que os dados a aparecer na ComboBox seriam o nome de todos os utilizadores inseridos na BD, apenas
teremos que adicionar um novo utilizador ao sistema. Posto
isto, clicando na TabPage Novo Utilizador.
Vamos adicionar o Guilherme assim como o seu contacto
telefnico.

Ilustrao 30 - Adicionar novo utilizador

Ilustrao 27 - Escolher Campos da Tabela Utilizador

Neste caso escolhemos o campo Nome da Tabela Utilizador.


Aps isso o wizzard traz-nos de volta ao ponto inicial, e escolhemos quer para o Display Member, como para o Value Member o tal campo Nome que escolhemos na BD.

Clicando ento no boto adicionar Utilizador, -nos dada a


informao de que o utilizador foi inserido com sucesso, e nos mostrada toda a informao da tabela Utilizador, mostrando que o Guilherme j faz parte do nosso sistema.

Ilustrao 31 - Novo utilizador Adicionado


Ilustrao 28 - Fonte de Dados da ComboBox

28

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Quando voltamos ao separador Adicionar Carro, clicando na
ComboBox, j temos no nosso conjunto de dados o
Guilherme, como mostra a figura seguinte.

por ns. Atravs do SqlCommand pedimos a execuo da


nossa String sql, usando a ConnectionString da nossa BD.
Caso os dados sejam introduzidos com sucesso essa mensagem mostrada ao utilizador, e fechamos conexo BD.
Depois disso, voltamos a chamar a funo verUtilizadores
(anloga funo mostraCarros()), de forma a mostrar no
datagridview a lista actualizada de utilizadores presentes no
sistema.
Gostaria ainda de chamar ao leitor a ateno para outra linha de cdigo que chamamos neste boto.
this.utilizadorTableAdapter.Fill
(this.pAPDataSet.Utilizador);

Ilustrao 32 - Dados da ComboBox

Mas voltando um pouco atrs, qual o cdigo do boto


Adicionar Utilizador?
private void AdicionarUtilizadorbutton_Click(object
sender, EventArgs e)
{
string nome = nometextBox.Text;
int contacto = Convert.ToInt32
(contactotextBox.Text);
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = @"Data
Source=artigoprogramar.no-ip.biz;user
id=sa;password=p@ppassword;Trusted_Connection=no;
database=PAP;connection timeout=30";
myConnection.Open();

Esta linha de cdigo foi originada pelo nosso DataBinding


quando usamos o wizzard para criarmos a fonte de dados
que iria preencher a nossa ComboBox, quando chamamos
novamente a linha de cdigo, ela vai renovar novamente a
fonte de dados desse elemento e por isso que o
Guilherme aparece logo na ComboBox da TabPage
Adicionar Carro. Caso no chamssemos esta funo, o
Guilherme apenas iria aparecer nas opes da ComboBox
na prxima vez que voltssemos a fazer load da classe Adicionar (clicando no boto Adicionar do Menu Principal).
Para adicionar o novo veculo vamos faze-lo de forma anloga insero de um novo utilizador:

try
{
String sql = "INSERT INTO Utilizador (Nome,
Contacto)" + " VALUES('" + nome + "'," +
contacto + ")";
SqlCommand commandTarefa = new SqlCommand(sql,
myConnection);
commandTarefa.ExecuteNonQuery();
MessageBox.Show("Novo utilizador Introduzido com
sucesso.");
myConnection.Close();
}
catch
{
MessageBox.Show("ERRO ao Inserir
novo utilizador.", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Ilustrao 33 - Inserir novo Carro


Carregando no boto adicionar carro, o novo carro inserido
e a informao da tabela Carro mostrada no datagridview.

nometextBox.Text = "";
contactotextBox.Text = "";

verUtilizadores();
this.utilizadorTableAdapter.Fill
(this.pAPDataSet.Utilizador);
Mais uma vez recapitulamos a ConnectionString BD, s que
desta vez em vez de seleccionarmos todos os dados presentes
na tabela, usamos a instruo simples da linguagem SQL de
forma a inserir uma nova linha na tabela Utilizador, com os
dados que inserimos nas textBoxs anteriormente preenchidas

29

Ilustrao 34 - Novo carro adicionado

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Cdigo Boto Adicionar Carro:
private void adicionarCarrobutton_Click(object
sender, EventArgs e)
{
string matricula = matriculatextBox.Text;
string utilizador = comboBox1.Text;
int kms = Convert.ToInt32
(kmstextBox.Text);
int kmsProximaRevisao = Convert.ToInt32
(kmsProximatextBox.Text);
myConnection.Open();
try
{
String sql = "INSERT INTO Carro
(Matricula, Utilizador, Kms,
ProximaRevisao)" + " VALUES('" +
matricula + "','" + utilizador +
"', "+kms+", "+kmsProximaRevisao+")";
SqlCommand command = new SqlCommand
(sql, myConnection);
command.ExecuteNonQuery();

Ilustrao 35 - Mostra carros prximos da reviso


Como o leitor pode verificar, ao carregar no boto Ver Prximos Reviso a primeira linha do datagridview foi pintada de
azul porque faltam precisamente 2000 Kms para a reviso
do veiculo utilizador pelo Rui.

String sql2 = "INSERT INTO


KmsAnuais (Matricula)" +
" VALUES('" + matricula + "')";
command = new SqlCommand(sql2,
myConnection);
command.ExecuteNonQuery();

private void colorirRevisaobutton_Click(object


sender, EventArgs e)
{
foreach (DataGridViewRow linha in
dataGridView1.Rows)
{

MessageBox.Show("Carro Introduzido
com sucesso.");
myConnection.Close();
}
catch
{
MessageBox.Show("ERRO ao Inserir
novo carro.", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}

try
{
int kms = Convert.ToInt32(linha.Cells
[2].Value.ToString());
int kmsProximaRevisao = Convert.ToInt32
(linha.Cells[3].Value.ToString());
int kmsfalta = kmsProximaRevisao - kms;
if (kmsfalta <= 2000)
{

matriculatextBox.Text = "";
kmstextBox.Text = "";
kmsProximatextBox.Text = "";
mostraCarros();

linha.DefaultCellStyle
.BackColor = Color.DeepSkyBlue;
}

}
Como o leitor pode verificar, o cdigo anlogo ao do boto
Adicionar Utilizador, com a excepo de que a informao do
Carro colocada em duas tabelas. Na tabela Carro e na tabela
KmsAnuais (em que falaremos mais frente no nosso artigo).
Voltemos agora novamente ao nosso Menu Principal. Um dos
outros botes que colocamos neste menu o boto Ver Prximos Reviso, e isto porque? No nosso exemplo para ser mais
simples visualizar neste momento temos apenas 2 carros, mas
poderamos ter muitos mais. Como seria a forma mais simples
de verificar quais os carros que tm que ir reviso num futuro
prximo? Poderamos fazer mais uma chamada BD para que
atravs de instrues SQL nos fossem mostrados os carros
cuja diferena entre os Kms Atuais e os Kms da prxima reviso fossem iguais ou inferiores a 2000 Kms. Ou j que temos
os dados da BD no datagridview podemos tambm facilmente
percorrer todas as linhas presentes nesse elemento e pintar
por exemplo, de azul todas as linhas dos veculos que estejam
dentro dessas condies, correcto?

30

}
catch {
}
}

Cdigo do Boto Ver Prximos Reviso:


Ou seja, de forma simples, a aplicao verifica o valor da
clula dos Kms Actuais e o valor da clula dos Kms da Prxima Reviso, v a diferena, e caso esteja dentro das caractersticas procuradas ele pinta a linha com a cor azul.
Passemos agora ao Boto Revises
Esse boto leva-nos ao submenu Revises em que nos so
mostradas todas as revises feitas pelos carros do sistema.
(o cdigo anlogo ao da funo mostraCarros e verUtiliza-

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
dor, com a diferena de que a funo verRevises selecciona e
mostra todos os dados da tabela Revisao)

Para inserirmos a informao basta-nos clicar no boto inserir e a informao ser actualizada da BD.
Cdigo do Boto Inserir Reviso:
private void inserirRevisaobutton_Click(object
sender, EventArgs e)
{
int kmsActuais = Convert.ToInt32
(kmsActuaistextBox.Text);
int kmsProximaRevisao =
Convert.ToInt32(proximaRevisaotextBox.Text);
int id = Convert.ToInt32
(idRevisaotextBox.Text);
string feito = feitotextBox.Text;
string matricula = comboBox1.Text;
try
{
SqlConnection myConnection = new
SqlConnection();
myConnection.Open();
String revisao = "INSERT INTO
Revisao (ID, Matricula, Feito)" +
" VALUES(" + id + ",'" + matricula +
"', '"+feito+"')";
SqlCommand commandTarefa = new
SqlCommand(revisao, myConnection);
commandTarefa.ExecuteNonQuery();

Ilustrao 36 - Mostra Revises

Carregando no boto Nova Reviso, nos mostrada uma


janela de forma a inserirmos os dados da reviso. Na comboBox aparecem todas as matrculas dos carros que esto no
sistema.

SqlCommand c = new SqlCommand


("UPDATE Carro SET Kms = " +
kmsActuais + ", ProximaRevisao =
"+kmsProximaRevisao+" WHERE
Matricula = '" + matricula + "';
", myConnection);
c.ExecuteNonQuery();
myConnection.Close();
MessageBox.Show("Inserido com
sucesso.");
this.Close();
}
catch
}

{
}
Como o leitor pode verificar, neste boto inserimos mais uma
linha nova na tabela Revisao e actualizamos (UPDATE) os
campos Kms e ProximaRevisao da tabela Carro. Mas que
linha vamos actualizar nessa tabela? A linha que corresponde aquela matrcula especfica.

Ilustrao 37 - Inserir nova reviso

pedido para colocarmos os kms actuais do carro e os Kms


em que o carro deve ir reviso assim como o que foi feito.

31

Antes de passarmos ao boto que nos falta (Gerir Kms)


vamos ponderar um cenrio. Imaginemos que tanto o Rui
como o Guilherme fazem diversos Kms para angariar clientes para o nosso stand, pode ser conveniente sabermos
quantos Kms fazem eles num ms. E ao fim do ano podemos querer saber quantos Kms fizeram eles nesse ano, a
sua mdia, etc. Ento convm irmos actualizando de ms a
ms a informao sobre as deslocaes deles.
No Menu Principal se clicarmos na linha correspondente ao
veiculo ser-nos- apresentada uma janela de forma a poder-

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
mos actualizar essa informao:

Para calcular a diferena entre os Kms que estamos a inserir


e os Kms Anteriores do carro temos o evento:
private void kmstextBox_TextChanged(object
sender, EventArgs e)
{
int kmsAnteriores = Convert.ToInt32
(kmslabel.Text);
int kmsActuais = Convert.ToInt32
(kmstextBox.Text);
diferencaKmslabel.Text = "" +
(kmsActuais - kmsAnteriores);
}
Isto , cada vez que estamos a inserir o valor dos Kms Actuais, o programa converte o valor inserido e calcula novamente a diferena, apresentando-a ao utilizador na label correspondente.
No boto Actualizar
private void actualizarbutton_Click(object
sender, EventArgs e)
{
String ms = comboBox1.Text;
int kms = Convert.ToInt32(kmstextBox.Text);
int difKms = Convert.ToInt32
(diferencaKmslabel.Text);

Ilustrao 38 - Actualizar Kms Mensais

Clicando no boto actualizar, o carro com a matrcula 22-BB-22


actualizado, passando a datagridview do Menu Inicial a mostrar a nova informao.

try
{
SqlConnection myConnection = new
SqlConnection();
myConnection.Open();
//Actualizar Tabela Carro - Actualizacao
SqlCommand c = new SqlCommand("UPDATE Carro
SET Kms = " + kms + " WHERE Matricula = '"
matriculalabel.Text + "'; ",
myConnection);
c.ExecuteNonQuery();
//Actualizar Tabela KmsAnuais - Kms
SqlCommand comma = new SqlCommand("UPDATE
KmsAnuais SET " + mes + " = " + difKms +
" WHERE Matricula = '" +
matriculalabel.Text + "'; ", myConnection);
comma.ExecuteNonQuery();
myConnection.Close();
MessageBox.Show("Actualizado com
sucesso.");
this.Close();
}
catch { }

Ilustrao 39 - Mostra Carros com Valores actualizados

Na janela Kms se o leitor reparar bem, so mostrados os Kms


anteriores e quando estamos a colocar os Kms actuais, o programa mostra-nos a diferena de Kms percorrida. Assim quando escolhemos o ms na ComboBox o que acontece que
iremos guardar essa diferena calculada na tal tabela de
KmsAnuais.

}
Como o leitor pode verificar, actualizamos os valores da Tabela Carro, e os valores da tabela KmsAnuais na coluna do
ms correspondente.
No exemplo, a diferena de Kms entre os Kms Actuais e os

32

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Kms Anteriores 3000 Kms e escolhemos actualizar o ms de
Janeiro, se verificarmos o interior da nossa BD, podemos ver
que o valor foi realmente actualizado com sucesso.

a 2 vezes o valor da mdia.


Quando ao cdigo do Boto Ver Grfico vamos por partes.
private void graficobutton_Click(object sender,
EventArgs e)
{
SqlConnection conexao = new
SqlConnection();
conexao.Open();

Ilustrao 40 - Valor correctamente inserido na BD

Suponha agora o leitor que com o passar do tempo actualizamos mensalmente todos os dados pertencentes a estes dois
veculos, tendo assim na nossa tabela KmsAnuais todos os
dados que correspondem aos kms que o Rui e o Guilherme
fizeram durante um ano.
Vamos ento agora falar do boto Gerir Kms. Este boto leva
-nos at ao SubMenu Gerir Kms que nos mostra a tabela
KmsAnuais.

string sql1 = "select SUM(Janeiro) AS


Janeiro from KmsAnuais;";
SqlCommand cmd1 = new SqlCommand
(sql1, conexao);
cmd1.Connection = conexao;
cmd1.CommandText = sql1;
String janeiro = cmd1.ExecuteScalar()
.ToString();
string sql2 = "select SUM(Fevereiro)
AS Fevereiro from KmsAnuais;";
SqlCommand cmd2 = new SqlCommand
(sql2, conexao);
cmd2.Connection = conexao;
cmd2.CommandText = sql2;
String fevereiro =
cmd2.ExecuteScalar().ToString();
string sql3 = "select SUM(Marco) AS
Marco from KmsAnuais;";
SqlCommand cmd3 = new SqlCommand
(sql3, conexao);
cmd3.Connection = conexao;
cmd3.CommandText = sql3;
String marco =
cmd3.ExecuteScalar().ToString();
string sql4 = "select SUM(Abril) AS
Abril from KmsAnuais;";
SqlCommand cmd4 = new SqlCommand
(sql4, conexao);
cmd4.Connection = conexao;
cmd4.CommandText = sql4;
String abril =
cmd4.ExecuteScalar().ToString();

Ilustrao 42 - Menu Gerir Kms

Quando clicamos nesse boto nos apresentado no datagridview2 a soma de todas os valores de todos os meses, assim como o total de de todos os carros assim como a mdia.
Ou seja temos os valores dos kms que a nossa frota percorreu
mensalmente, o total de kms anuais e a mdia desses dozes
meses. Essa mesma informao mostrada em grfico e a
mdia representada pela linha vermelha que aparece no grfico. Ou seja nas barras do grfico que aparecem abaixo da 1
linha vermelha significa que nesse ms os dois carros percorreram menos Kms que a mdia. A barra que corresponde ao
ms de Fevereiro que ultrapassa a 2 linha vermelha significa
que nesse ms os dois carros ultrapassaram o correspondente

33

string sql5 = "select SUM(Maio) AS


Maio from KmsAnuais;";
SqlCommand cmd5 = new SqlCommand
(sql5, conexao);
cmd5.Connection = conexao;
cmd5.CommandText = sql5;
String maio =
cmd5.ExecuteScalar().ToString();
string sql6 = "select SUM(Junho) AS
Junho from KmsAnuais;";
SqlCommand cmd6 = new SqlCommand
(sql6, conexao);
cmd6.Connection = conexao;
cmd6.CommandText = sql6;
String junho =
cmd6.ExecuteScalar().ToString();
string sql7 = "select SUM(Julho) AS
Julho from KmsAnuais;";
SqlCommand cmd7 = new SqlCommand
(sql7, conexao);
cmd7.Connection = conexao;
cmd7.CommandText = sql7;
String julho =
cmd7.ExecuteScalar().ToString();

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
System.Windows.Forms.
DataVisualization.Charting.Series series =
this.chart1.Series.Add(seriesArray[i]);
series.Points.Add(pointsArray[i]);
}

string sql8 = "select SUM(Agosto) AS


Agosto from KmsAnuais;";
SqlCommand cmd8 = new SqlCommand(sql8,
conexao);
cmd8.Connection = conexao;
cmd8.CommandText = sql8;
String agosto =
cmd8.ExecuteScalar().ToString();
string sql9 = "select SUM(Setembro) AS
Setembro from KmsAnuais;";
SqlCommand cmd9 = new SqlCommand(sql9,
conexao);
cmd9.Connection = conexao;
cmd9.CommandText = sql9;
String setembro =
cmd9.ExecuteScalar().ToString();

var series3 = chart1.Series[0];


var chartArea = chart1.ChartAreas
[series3.ChartArea];
chartArea.AxisY.StripLines.Add(new
StripLine
{
BorderDashStyle =
ChartDashStyle.Solid,
BorderColor = Color.Red,
Interval = media
});

string sql10 = "select SUM(Outubro) AS


Outubro from KmsAnuais;";
SqlCommand cmd10 = new SqlCommand
(sql10, conexao);
cmd10.Connection = conexao;
cmd10.CommandText = sql10;
String outubro =
cmd10.ExecuteScalar().ToString();

}
Primeiro calculamos a Soma de todas as colunas da BD, e
colocamos essa mesma informao dentro do datagridview2,
assim como o total de todas as somas e a mdia das mesmas.

string sql11 = "select SUM(Novembro) AS


Novembro from KmsAnuais;";
SqlCommand cmd11 = new SqlCommand
(sql11, conexao);
cmd11.Connection = conexao;
cmd11.CommandText = sql11;
String novembro =
cmd11.ExecuteScalar().ToString();

Depois seguidamente pegmos nos valores que estavam


nas clulas do datagridview2 e com esse vector de valores
criamos o grfico e utilizamos o valor da mdia para traar
os intervalos das linhas horizontais vermelhas.

string sql12 = "select SUM(Dezembro) AS


Dezembro from KmsAnuais;";
SqlCommand cmd12 = new SqlCommand
(sql12, conexao);
cmd12.Connection = conexao;
cmd12.CommandText = sql12;
String dezembro =
cmd12.ExecuteScalar().ToString();

Chegamos ento recta final do artigo desta edio. Se poderamos ter feito esta aplicao de exemplo de forma diferente? Podamos! E na maior parte dos casos poderamos t
-lo feito de forma mais correcta, mais acertada, consumindo
menos recursos computacionais, poderamo-nos ter preocupado com a segurana (porque no propriamente correcto
apresentar na ConnectionString a password da BD), podamos ter utilizado forma mais correctas de termos a certeza
do sucesso da nossa insero e actualizao de dados de
forma a no corromper a BD. No caso do cdigo do boto
Ver Grfico, poderamos ter formas mais simples de calcular todos os valores que apresentamos.

int total = Convert.ToInt32(janeiro) +


Convert.ToInt32(fevereiro) + Convert.ToInt32(marco)
+ Convert.ToInt32(abril) + Convert.ToInt32(maio) +
Convert.ToInt32(junho) + Convert.ToInt32(agosto) +
Convert.ToInt32(setembro) + Convert.ToInt32
(outubro) + Convert.ToInt32(novembro)
+Convert.ToInt32(dezembro);
double media = total / 12;
this.dataGridView2.Rows.Add(janeiro,
fevereiro, marco, abril, maio, junho, julho,
agosto, setembro, outubro, novembro, dezembro,
total, media);
//KMS
string[] seriesArray = { "Janeiro",
"Fevereiro", "Maro", "Abril", "Maio", "Junho",
"Julho", "Agosto", "Setembro", "Outubro",
"Novembro", "Dezembro" };
int[] pointsArray = { Convert.ToInt32
(janeiro), Convert.ToInt32(fevereiro),
Convert.ToInt32(marco), Convert.ToInt32(abril),
Convert.ToInt32(maio), Convert.ToInt32(junho),
Convert.ToInt32(julho), Convert.ToInt32(agosto),
Convert.ToInt32(setembro), Convert.ToInt32
(outubro), Convert.ToInt32(novembro),
Convert.ToInt32(dezembro) };
this.chart1.Palette =
ChartColorPalette.Excel;
this.chart1.Titles.Add("Kms Frota");

Mas este artigo quis apenas desmistificar alguns aspectos


das interaco entre as aplicaes que criamos e o SQL
Server e o seu funcionamento em rede.
Por exemplo, no incio do nosso artigo criamos o nosso host
com o No-IP (artigoprogramar.no-ip.biz), mas demos tambm ao computador em que instalamos a BD um ip fixo dentro da nossa rede (192.168.2.100). Se quisssemos que a
nossa aplicao funcionasse dentro da nossa rede interna
de casa bastaria que na ConnectionString colocssemos a
informao do IP em que temos o servio SQL a executar,
por exemplo:
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = @"Data
Source=192.168.2.100;user
id=sa;password=p@ppassword;Trusted_Connection=no;

for (int i = 0; i < seriesArray.Length;


i++)
{

34

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
database=PAP;connection timeout=30";
myConnection.Open();
Ento para qu colocarmos o artigoprogramar.no-ip.biz ? Porque este pormenor nos permite aceder nossa BD sem estarmos na mesma rede que o computador que detm o servio. E
como? - poder perguntar o leitor.
A forma mais simples seria abrir no nosso router a tal porta
1433 em que o servio SQL corre, e adicionar na lista do router
que todos os pedidos dirigidos a essa porta seriam enviados
para o computador da rede que tem o tal ip fixo que escolhemos no incio (no nosso caso 192.168.2.100).
Uma outra forma de acedermos BD seria criarmos uma VPN
na nossa rede (poderamos usar o 192.168.2.100 na ConnectionString) , permitindo-nos em qualquer lugar ligarmos rede
em que temos o SQL a correr, de forma a que a VPN nos permitisse enviar informao encriptada pela internet, dando-nos
um ip interno da nossa rede de casa.

Mas este artigo


quis apenas desmistificar alguns aspectos
das interaccao entre as
aplicacoes que criamos e o SQL Server e o
seu funcionamento em
rede.

dedicado a todos os leitores que estejam prontos a dar os


primeiros passos e que nem sempre sabem por onde iniciar,
aproveito tambm para deixar um agradecimento especial ao
nosso Coordenador da Programar (Antnio Santos), pois
sem a sua pacincia e dedicao, este artigo nunca teria
existido.

Ao longo do artigo
vamos explicar de forma simples e sem
grandes algoritmos como fazer de forma rapida uma peque- na aplicacao que interaja com
uma base de dados.
O cdigo ser disponibilizado no frum do Portugal-aProgramar a todos os leitores que tenham curiosidade de ver
o cdigo total do projecto. Encontramo-nos na prxima edio!

Mas isso ser sempre escolha de quem implementa o sistema.


Mais uma vez relembro ao leitor que neste artigo no foram
considerados pormenores que so sempre importantes quando
implementamos uma aplicao, como foi o exemplo j falado
da segurana, e das chamadas BD. Este um artigo de
exemplo, que procurou mostrar aos nossos leitores mais inexperientes que s vezes a complicao somos ns que a fazemos na nossa mente. Que para criarmos aplicaes simples
precisamos apenas de ideias e vontade. Este artigo ento

AUTOR
Escrito por Rita Peres
Natural de Castelo Branco, licenciou-se em Engenharia Informtica pela Universidade da Beira Interior. Membro do P@P
desde Janeiro de 2010.

35

A PROGRAMAR
Desbravando o goto!
Introduo

Utilizando os goto:

O assunto dos gotos um dos tpicos mais discutidos nos


fruns de programao. Varias criticas so reiteradas para a
sua no utilizao, mas ser o goto assim to malfico? No
ter realmente a sua utilidade? Com este artigo espero convence-lo que o goto ,como uma ferramenta de programao
que , tem lugar na sua caixa de ferramentas.

char *buf1, *buf2;


int err = OK;

O que ento o goto?


}

Para os mais distrados o goto esta presente em diversas


linguagens de programao. Esta ferramenta permite fazer
saltos unidirecionais para locais especficos quer estes sejam especificados pela linha de cdigo em que se encontra
ou por uma label.

if ((buf1 = malloc(100)) == NULL) {


err = ERR_MALLOC;
goto clean_up;
}
if (buf2 = malloc(200) == NULL ){
err = ERR_MALLOC;
goto clean_up2;
clean_up1:
return err; /* Visto que falhou a alocao,
no temos nada a libertar */
clean_up2:
free(buf1); /* Partindo do principio que a
alocao do buf2 essencial
para o funcionamento do programa */
return err;

goto label:
Na programao estruturada no temos qualquer obrigao em utilizador o goto.

Sem utilizar os goto:

Opinies Divididas em relao ao goto!


char *buf1, *buf2
int err = OK;
if ((buf = malloc(20)) == NULL)
return err;
if((buf2 = malloc(200)) == NULL){
free(buf1);
return err;
}

Em 1969 Dijkstra um artigo intitulado por Go to Statements Considered Harmful, e defendia a abolio do
goto em todas as linguagens de alto nvel. Dijkstra
apresenta dois argumentos, um deles que o goto
complica a prova que uma certa parcela de cdigo esta
correta e o seu segundo argumento foi que complica a
descrio de que que o programa fez ate um dado momento.

Neste pequeno exemplo observamos que a soluo utilizando os goto permite um codigo mais simples de visualizao.
Este tipo de tcnica esta muito presente no cdigo do kernel
do Linux. Os programadores entendem que esta a melhor
tcnica para solucionar os seus problemas.

Por sua vez Donald E. Knuth escreveu um artigo chamado Structured ProgrammingGoTo em que exemplifica as vantagens de usar goto em linguagens procedurais, como o caso de C.

Um outro exemplo clssico do uso de goto em ciclos encadeados. Como por exemplo:

Usos do Goto!
As linguagens de alto nvel atualmente possuem um
sistema de garbage collection que facilitem a vida ao
programador que no tem que perder tempo a se preocupar em dealocar o espao de memoria que foi usado. O goto muito til neste casos pois simplifica muito
o cdigo na leitura e elimina a necessidade de criao
de funes para esse efeito o que implicaria possveis
problemas com scope. tambm utilizado o goto em
casos de error checking. Em outras linguagens de alto
nvel a prprio linguagem disponibiliza mecanismos
que permite efetuar este tipo de ao como
try...exception(excepo), no caso do python. A titulo
de curiosidade a implementao do return, break e
continue utiliza o goto. Se analisar mos o cdigo gerado pelo compilador veramos que no h diferenas
entre o goto e um if, e sem prejuzos de memoria.

Em alternativa ao goto podemos utilizar uma flag para


for(condio)
for(condio)
for(condio)
goto final
sinalizar quando queremos sair do ciclo:
for(condio pretendida ){
flag = 0;
for(condio pretendida && !flag){
for(condio pretendida && !flag){
if(ao concluda)
flag = 1;
}
}
}

36

A PROGRAMAR
DESBRAVANDO O GOTO!
Concluso!

Como podemos verificar com a utilizao do goto podemos simplificar bastante o nosso cdigo.

Podemos ento concluir, que o goto apenas uma


ferramenta e que a m reputao do goto se deve apenas a sua m utilizao por parte do programador.

Maus usos do goto!


MENU:
switch(op){
case 1: goto ADD;
case 2: goto SUB;
case 3 : goto MULTI;
case 4 : goto DIV;
default: printf(Por favor escolha uma opo
valida\n); goto MENU;
}

Com este artigo espero ter lo esclarecido sobre a utilidade e os seus maus usos do goto. Com vista a expandirem do seu conhecimento, acerca do goto, para alem
deste artigo o caminho eletrotcnico para o artigo do
Knuth ser disponibilizado no final.
Anexo:
http://cs.sjsu.edu/~mak/CS185C/
KnuthStructuredProgrammingGoTo.pdf

Uma opo mais simples seria:


while(1)
{
if (op == 1)
result = value1 + value2 /* valores pedidos
previamente */
if (op == 2)
return = value1 value 2 /* Verificaes
necesarias */

[...] o goto est


presente em diversas
linguagens de programacao. Esta ferramenta permite fazer saltos
unidirecionais para locais especificos quer
estes sejam especificados pela linha de codigo em que se encontra
ou por uma label.

/*....*/
Na ultima opo mais fcil observarmos o que esta a
acontecer. Se alguma vez utilizar o goto certifique se
que esto presentes os critrios descritos em cima, se
no for este o caso levante se v beber/comer e volte a
refazer, ver que me agradecera quando precisar de
ler/modificar o seu cdigo no futuro.

[...]
Donald
E.
Knuth escreveu um artigo [...] em que exemplifica as vantagens de
usar goto em linguagens procedurais, como e o caso de C.
AUTOR
Escrito por Tiago Sousa

Programador autodidata. Com interesse em Sistemas Operativos. Tem conhecimento de C, Perl, Haskell. Entusiasta do movimento do software livre. Moderador do canal de irc e membro desde da comunidade 2009.

37

A PROGRAMAR
Arduino: const vs #define
Longe vo os tempos em que os computadores possuam
quantidades irrisrias de memria RAM quando comparadas
com os dias de hoje. Falo sim em quantidades na ordem dos
Kbytes de memria.

quando comparado com a definio de uma varivel do tipo


inteiro para definir o Pin.
Compilando o programa usando o #define obtenho:

Actualmente os programadores descuram um pouco essa


afinao e optimizao na alocao de memria das suas
aplicaes, mas ainda existe um pequeno grupo onde ainda
necessrio optimizar ao pormenor a alocao de memria,
refiro-me ento s reas da robtica e electrnica, de um
modo geral na utilizao de micro-controladores.
#define

#const

De uma forma simples podemos dizer que o #define uma


directiva do pr-processador do compilador que de certo
modo torna mais simples a definio de uma varivel esttica que ser usada mltiplas vezes, ou seja, no caso de ser
necessrio alterar o valor dessa mesma varivel esttica
basta mudar o valor do #define ao invs de andar a alterar
todas as variveis ao longo do cdigo.

De uma forma geral o que o modificador #const faz dizer


ao compilador que a varivel (ou ponteiro) no pode ser alterado no decorrer do cdigo. No entanto continua a ser uma
varivel e dependendo de onde seja usada pode ou no
consumir memria RAM.
Mas como o IDE usado pelo Arduino e seu compilador avrgcc inteligente o suficiente para saber que uma varivel
precedida pelo modificador #const no pode ser alterada
dentro do programa activo este ir tentar deixa-la fora da
memria RAM.

Por exemplo:
#define Pin 10
void setup()
{
pinMode(Pin, OUTPUT);
}

Pegando do exemplo dado anteriormente e usando o modificador #const o cdigo ficaria assim:
#const int Pin = 10;
void setup()
{
pinMode(Pin, OUTPUT);
}

void loop()
{
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
}

void loop()
{
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
}

O que realmente acontece ao compilar o cdigo acima o


seguinte:
#define Pin 10

O que realmente acontece ao compilar o cdigo acima o


seguinte:

void setup()
{
pinMode(10, OUTPUT);
}

#const int Pin = 10;


void setup()
{
pinMode(10, OUTPUT);
}
void loop()
{
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
}

void loop()
{
digitalWrite(10, HIGH);
delay(500);
digitalWrite(10, LOW);
delay(500);
A utilizao do #define uma funcionalidade muito til e
poderosa, no havendo na realidade perdas de performance

38

A PROGRAMAR
ARDUINO: CONST VS #DEFINE
Usando #define:

Mas ser que a utilizao do modificador #const ir consumir


mais ou menos memria RAM que o modificador #define?
Compilando o programa usando o #const obtenho:

O que certo que nenhum dos casos consome qualquer


memria RAM, mas no se deixem enganar pelo valor
Binary sketch size: 1.076 bytes apresentado pelo IDE do
Arduino, pois esse valor refere-se ao HEX file do cdigo e
no tem uma relao directa com a memria RAM utilizada
na realidade.

Usando #const:

Para averiguarmos com exactido a quantidade de memria


RAM ocupada podemos usar a ferramenta AVR-SIZE disponibilizada pelo IDE do Arduino.~

AVR-SIZE

A ferramenta avr-size ir dizer-nos realmente a quantidade


de memria RAM esttica que o programa est a usar.

Como podemos verificar o valor apresentado no campo


data que representa a memria RAM esttica realmente
usada pelas variveis inicializadas pelo programa 0 (zero),
logo podemos concluir que ambos a utilizao de ambos os
modificadores resulta na utilizao da mesma quantidade de
memria RAM esttica.

O processo de avaliar a quantidade de memria RAM esttica utilizada remete-nos para o uso da consola, mas primariamente temos de navegar at a pasta C:\Program Files (x86)
\Arduino\hardware\tools\avr\bin e encontrar o avr-size.
De seguida vamos navegar at ao ficheiro C:\Users
[Nome_utilizador]\AppData\Local\Temp\build[.]
[nome_Sketch].cpp.elf

O que usar? #define ou #const?


A real questo que se coloca qual dos modificadores deveremos usar, e seguramente a questo mais complicada de
responder, pois ambas as opes so vlidas e ambas ocupam o mesmo espao de memria RAM esttica no decorrer
do programa.

E de seguida vamos correr o avr-size com o ficheiro


nome_Sketch.cpp.elf e verificar o resultado.
O avr-size ir retornar as seguintes informaes:

text No mais que a memria flash usada para o


cdigo

data Representa a memria RAM esttica realmente usada pelas variveis inicializadas pelo programa

bss - Representa a memria RAM esttica realmente


usada pelas variveis inicializadas a zero pelo programa

Existe quem considere a utilizao do #define como uma m


prtica de programao pelo facto de estar mais propcia a
erros de codificao, como por exemplo no pedao de cdigo seguinte:
Cdigo correcto:
#define Pin 10
void setup()
{
pinMode(Pin, OUTPUT);
}

dec & hex Representa o somatrio da memria


RAM e Flash utilizadas pelo programa

void loop()

39

A PROGRAMAR
ARDUINO: CONST VS #DEFINE

que o compilador avr-gcc o suficiente inteligente para manter uma varivel precedida pelo modificador #const fora da
memria RAM esttica do programa a sua utilizao poder
ser uma vantagem. No entanto a substituio da varivel
precedida pelo modificador #define cumpre igualmente a sua
funo mas est mais propcia ocorrncia de erros de codificao.

digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
Cdigo com Erro:
#define Pin 10
void setup()
{
pinMode(3;, OUTPUT);
}

[...] o que o modificador #const faz e


dizer ao compilador
que a variavel (ou ponteiro) nao pode ser alterado no decorrer do
codigo. No entanto
continua a ser uma variavel e dependendo de
onde seja usada pode
ou nao consumir memoria RAM.

void loop()
{
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
}
Quando tentssemos compilar o pedao de cdigo com erro
obteramos um erro do tipo sketch_feb08a:6: error: expected
`;' before ')' token por parte do compilador.

De
uma
forma
simples podemos dizer
que o #define e uma directiva
do
preprocessador do compilador que [...] torna
mais simples a definicao de uma variavel
estatica [...]
Concluso:
A principal concluso que podemos retirar de que desde

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/

40

A PROGRAMAR
Mitos do jQuery

Esta separao da interface do seu comportamento facilita a


manuteno (ao programador web e ao web designer) mas
tambm a graceful degradation, que dita que o site deve
funcionar com o JavaScript desligado (pelo menos ter uma
verso com a funcionalidade mnima) sem "rebentar".

Mito #1: O jQuery substitui JavaScript

Bibliotecas/toolkits/frameworks JavaScript so apenas um


conjunto de utilitrios escritos em/para JavaScript que ajudam a gerir uma pgina e as suas interaes. Nenhuma biblioteca JavaScript substitui o JavaScript; uma biblioteca
apenas junta diversas funes e outros elementos reutilizveis. certo que, por uma questo de coerncia de cdigo,
se estivermos a usar uma biblioteca, as vrias instrues
JavaScript podem ser feitas recorrendo a essa biblioteca
mas isso no quer dizer que apenas com JavaScript no se
o faa.

Isto tambm se aplica ao jQuery UI (ou de outros plugins)


que geralmente assumem que h markup HTML, conferindolhe apenas um look&feel.

programador
deve escolher aquela
que mais se adequa as
necessidades
(consoante
os
browsers e plataformas
a suportar, as funcionalidades a desenvolver, etc.)

Por outro lado, h situaes em que no devemos forar o


uso de uma biblioteca. Quando a velocidade determinante
(e no h problemas de suporte cross-browser), escusado
colocar "mais chamadas no meio"; mais vale recorrer diretamente s API/JavaScript nativos do browser.

[]uma biblioteca
apenas junta diversas
funcoes e outros elementos
reutilizaveis
[]
Mito #2: O jQuery serve para construir interfaces

Mito #3: O jQuery a melhor biblioteca JavaScript

Este um grande mito que teima em permanecer. O jQuery


serve essencialmente para pequenas manipulaoes no
DOM. Deve evitar-se ao mximo construir "pedaos" de (ou
toda a) interface em JavaScript/jQuery que, por norma, servem para definir comportamento; a estrutura da interface
deve ser definida em markup HTML, o seu local por excelncia (pela mesma razo que no se deve ter CSS no cdigo
ou JavaScript no markup). suposto que JavaScript/jQuery
manipulem elementos j existentes no DOM. certo que por
vezes necessrio criar elementos programaticamente (ex.
$('<div />')), mas isso deve ser evitado. Por exemplo, em
chamadas Ajax, o servidor pode enviar "pedaos" diretamente em HTML; ou ento o HTML pode j estar definido
(escondido) e ser manipulado e depois exibido.

certo que o jQuery a biblioteca mais popular, pela sua


versatilidade e facilidade de aprendizagem. Contudo, incorreto dizer que a melhor. raro haver uma soluo milagrosa para todos os problemas; h apenas a ferramenta
ideal para o problema em causa. Existem inmeras bibliotecas JavaScript, fieis a diferentes filosofias. O programador
deve escolher aquela que mais se adequa s necessidades
(consoante os browsers e plataformas a suportar, as funcionalidades a desenvolver, etc.). Algumas vezes nem sequer
precisa uma biblioteca. Outras vezes basta usar polyfills...
Por vezes basta usar uma microframework (que se destina a
colmatar uma necessidade muito especfica)...

41

A PROGRAMAR
MITO #1: O JQUERY SUBSTITUI JAVASCRIPT
O mximo que se pode dizer que bibliotecas JavaScript
promovem a escrita de cdigo fcil de ler e modificar, oferecendo capacidades avanadas (ex.: classes), com isso aumentando muito a velocidade de desenvolvimento no geral.

Em concluso, no se deve forar o uso de nenhuma biblioteca. Deve haver argumentos que justifiquem o seu uso.
Bons argumentos so o site/webapp adquirir alguma complexidade ou haver diversos browsers e/ou plataformas a suportar. Nessa altura, o jQuery uma boa aposta, mas h que
considerar outras possibilidades.

Mito #5: O jQuery Mobile o jQuery para mobile


O nome jQuery Mobile muito enganador e a causa deste mito. Leva a crer que o jQuery Mobile a verso do jQuery mas para mobile. Na realidade um complemento. O
jQuery UI est para o desktop assim como o jQuery Mobile
est para o mobile. Ambos dependem do jQuery. Ambos
oferecem componentes grficos (ex.: listas, seletor de data,
tabs, etc.). Assim, o jQuery Mobile no alternativa ao jQuery; sim uma biblioteca de componentes para mobile tal
como o jQuery UI o para desktop.

Nao quer isto dizer que nao se deva


usar bibliotecas (a velocidade de desenvolvimento aumenta muito, assim como a inteligibilidade do codigo)!
Mas ao usar-se uma,
deve saber-se o que se
esta a passar "por baixo"

Mito #4: O jQuery torna o cdigo mais rpido


H at quem ache que a pgina fica mais rpida com jQuery... Na maioria das vezes, o cdigo at fica mais lento. O
jQuery facilita imenso a escrita de cdigo JavaScript, pelo
que fcil cair-se em em graves erros que afetam a performance (principalmente no mau uso de seletores e na manipulao do DOM). No quer isto dizer que no se deva usar
bibliotecas (a velocidade de desenvolvimento aumenta muito, assim como a inteligibilidade do cdigo)! Mas ao usar-se
uma, deve saber-se o que se est a passar "por baixo".

Para saber mais sobre o tema, aproveito para


fazer publicidade ao livro jQuery - A Sua Biblioteca JavaScript, em que apresentada biblioteca jQuery, e debatidos alguns tpicos relacionados com performance.

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

42

COLUNAS
C# - Resoluo de Sobrecarga de Mtodo

C#
C# - RESOLUO DE SOBRECARGA DE MTODO

O enigma desta edio -nos trazido por Jon Skeet.


Dado o seguinte cdigo:

Se no h sobrecargas aplicveis, ou nenhuma


melhor que as outras, ento a chamada invlida e leva a
um erro de compilao

class X
{
static int M
(Func<int?, byte> x, object y) { return 1; }
static int M
(Func<X, byte> x, string y) { return 2; }

Pode haver a tentao de saltar diretamente para a segunda


opo, assumindo que ambas as sobrecargas so vlidas
em ambos os casos.

const int Value = 1000;


static void Main()
{
var a = M(X => (byte)X.Value, null);

Sobrecarga 1 um parmetro simples


Primeiro olhemos para a primeira sobrecarga: aquela onde o
primeiro parmetro do tipo Func<int?, byte>. O que significa a expresso lambda X => (byte)X.Value quando convertida para aquele tipo de delegate? sempre vlida?

unchecked
{
Console.WriteLine(a);
Console.WriteLine(M(X => (byte)
X.Value, null));
}
}

A parte manhosa perceber o que o nome-simples X significa como parte de X.Value dentro da expresso lambda. Aqui
a parte importante da especificao o comeo da seo
7.6.2 (nomes simples):

}
Qual o resultado da sua execuo?

Um nomesimples est na forma I ou na forma


I<A1, , AK>, onde I um nico identificador e <A1, , AK>
uma lista opcional de tipos argumento. Quando no for especificada uma lista de tipos argumento, considera-se que K
zero. O nomesimples avaliado e classificado do seguinte
modo:

Resultado
O resultado da execuo :
1
2

O que se passa aqui? Porque que simplesmente passar a


expresso para um bloco unchecked causa um comportamento diferente?
Explicao
A expresso em que nos devemos concentrar esta:

Trata-se apenas de uma chamada a um mtodo usando uma


expresso lambda, usando resoluo de sobrecarga de mtodo (method overload resolution) para determinar qual a
sobrecarga a chamara e o tipo de inferncia para determinar
o tipo de argumentos para o mtodo.

Sobrecarga 2 um pouco mais de complexidade


E ento a segunda sobrecarga? Nesta o tipo do primeiro
parmetro de M Func<X, byte>, portanto est-se a tentar
converter a mesma expresso lambda para esse tipo. Aqui a
mesma parte da seo 7.6.2 usada, mas tambm a seo
7.6.4.1 envolvida para determinar o significado da expresso de acesso a membro X.Value:

Simplificando a descrio da resoluo de sobrecarga de


mtodo, seguem-se os seguintes passos:

Se K zero e o nomesimples aparece dentro de um


bloco e se o espao de declarao de variveis do
bloco (ou blocos includos) (3.3) contem uma varivel local, parmetro ou constante e classificado como
varivel ou valor.

(A especificao continua com outros casos.) Ento X referese ao parmetro da expresso lambda, que do tipo int?
portanto X.Value refere-se ao valor do parmetro subjacente.

M(X => (byte)X.Value, null)

Se uma sobrecarga melhor que todas as outras,


usar essa

Determina-se que sobrecargas (overloads) ao aplicveis (isto , quais fazem sentido em termos dos
argumentos fornecidos e os correspondentes parmetros)

No acesso a um membro da forma E.I, se E um nico identificador, e o significado de E como nome-simples (7.6.2)
uma constante, campo, propriedade, varivel local ou parmetro com o mesmo tipo que o significado de E como nomedetipo (3.8), ento ambos os significados possveis
de E so permitidos. Os dois significados possveis de E.I
nunca so ambguos, uma vez que I deve necessariamente
ser um membro do tipo E em ambos os casos. Por outras

Compara-se as sobrecargas aplicveis entre si em


termos de qual a melhor

45

C#
C# - RESOLUO DE SOBREARGA DE MTODO
palavras, a regra apenas permite acesso aos membros estticos de E onde, caso contrrio, um erro de compilao teria
ocorrido.

Trata-se
apenas
de uma chamada a um
metodo usando uma
expressao
lambda,
usando resolucao de
sobrecarga de metodo
(method overload resolution) para determinar
qual a sobrecarga a
chamara e o tipo de inferencia para determinar o tipo de argumentos para o metodo.

No bem explcito aqui, mas a razo de que no pode ser


ambguo porque no podem existir dois membros com o
mesmo nome no mesmo tipo (para alm da sobrecarga de
mtodos). Pode existir sobrecarga de mtodos que so ambos estticos e de instncia, mas ento as regras normais de
sobrecarga de mtodos so aplicadas.
Sendo assim, X.Value neste caso, no envolve em nada a
utilizao do parmetro chamado X. Em vez disso, a constante chamada Value dentro da classe X. Note-se que isto
acontece apenas porque o tipo do parmetro o mesmo que
se o tipo a que o nome do parmetro se refere. (no bem o
mesmo que os nome serem os mesmos. Se uma diretiva
using introduzir um alias, como using Y = X; ento a condio pode ser satisfeita com nomes diferentes.)
Mas ento que diferena faz unchecked?
Func<int?, byte> foo = X => (byte)X.Value;
Func<X, byte> bar = X => (byte)X.Value;
De volta a sobreposies

var a = M(X => (byte)X.Value, null);


Recursos

Perfil do Jon Skeet no StackOverflow

Blogue do Jon Skeet

A tale of two puzzles

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

46

Media Partners da Revista PROGRAMAR

Anlises
Gesto de Sistemas e Redes em Linux - 3 Edio
JavaScript (2. Edio Atualizada)

Review
Gesto de Sistemas e Redes em Linux - 3 Edio
servidores distribudos entre duas redes privadas e uma
DMZ. Como sistema operativo para os servidores presentes
nesta topologia de rede, escolhido o CentOS do projeto
open-source derivado dos produtos da empresa RedHat.
Aqui, acrescenta-se que a verso do sistema operativo utilizada nesta edio a 6.4 (verso mais atual do CentOS
data de publicao) e que entretanto, em dezembro de 2013,
foi lanada a verso 6.5. Mesmo assim, pela anlise rpida
s Major Changes desta ltima verso, de presumir os
exemplos de configuraes apresentados no se alterem. Da
mesma forma, se o leitor pretender aplicar os contedos
apresentados a outras distribuies Linux como o Debian,
Ubuntu, Fedora (ou outras), este manual tambm poder til,
uma vez que os conceitos abordados podem ser transpostos
para estas distribuies. Em relao s atividades apresentadas, considera-se que estas abrangem um conjunto alargado de tecnologias, servios e protocolos de rede, sobre as
quais so explicadas as configuraes bsicas e, nalguns
casos, configuraes mais avanadas que se enquadram no
cenrio inicial. Verifica-se tambm que a maior parte destas
atividades so estanques, ou seja, permite que o leitor possa escolher os servios que pretende configurar, sem a obrigatoriedade de seguir uma sequncia predefinida, sendo
que, nos casos em que tal exigido, indicado pelo autor.
Alm disso, para profissionais que j esto nas reas de
administrao de redes/sistemas podem ser necessrias
configuraes mais especficas que podem exigir que se
faa uma leitura adicional. Para isto, consideram-se teis as
referncias apresentadas no final de cada captulo, que
apontam para links onde so encontrados tutoriais que podem servir para extrapolar o caso de estudo apresentado.
de referir igualmente que no captulo onde so referidas as
ferramentas de monitorizao e gesto de problemas, poderse-iam incluir tambm outras plataformas, como exemplo
do Webmin (http://www.webmin.com/) e o Cacti (http://
www.cacti.net/) que permitem integrar, configurar e monitorizar mltiplos servios e podem constituir-se como um auxlio
importante na rea da gesto de sistemas e redes.

Ttulo: Gesto de Sistemas e Redes em


Linux - 3 Edio
Autor: Jorge Granjal
Editora: FCA - Editora de Informtica, Lda.
Pginas: 520
ISBN: 978-972-722-784-6
O livro que me foi apresentado para anlise tem o ttulo
Gesto de Sistemas e Redes em Linux 3 Edio e tem
como pblico-alvo docentes ou estudantes que pretendam
aprofundar conhecimentos na rea de administrao de sistemas e redes, ou profissionais com responsabilidades na
administrao de redes informticas de mdia e grande dimenso. O seu autor, Jorge Granjal, Professor na Faculdade de Cincias e Tecnologia da Universidade de Coimbra,
onde desenvolve tambm atividades de investigao no grupo de Comunicaes e Telemtica do Centro de Informtica
e Sistemas da Universidade de Coimbra. A primeira edio
deste livro foi lanada em fevereiro de 2010, e esta mais
recente, a terceira edio, publicada em setembro de 2013.
Este livro comea por apresentar um cenrio de aplicao e
sobre este, prope um conjunto de atividades no mbito da
gesto de sistemas e da gesto de servios de rede. Alm
disso, dedica alguns captulos rea de segurana e por
ltimo a ferramentas para a monitorizao e gesto de problemas. Na parte da gesto de sistemas, o leitor poder encontrar atividades como a configurao de nveis de execuo e servios, gesto de utilizadores e quotas, configurao
TCP/IP, gesto de logs, escalonamento de tarefas, operaes sobre o Kernel, gesto de mdulos e Boot loaders. Na
parte de gesto de servios de rede inclui-se a configurao
do sistema como router e configurao de firewall (com o
IPTables e o Squid) e a configurao de servios nomeadamente o DNS, o NTP, DHCP, LDAP, Email (POP, IMAP e
SMTP), WWW (HTTP e Webmail) e o NFS. Na parte dedicada segurana, so propostas atividades com sistemas VPN
e um IDS (Snort), e a parte final dedicada monitorizao
e gesto de problemas com ferramentas como o MRTG,
Ngios e o RT.

Em suma, considera-se que este livro constitui um bom manual, com referncias atualizadas e teis para profissionais
na rea de administrao de sistemas e redes, ou para estudantes que pretendam explorar a rea da gesto de sistemas e redes e pretendam no futuro aplicar estes conhecimentos em cenrios reais.

Numa anlise mais detalhada, verifica-se que o cenrio de


aplicao apresentado pode considerar-se equivalente a
uma topologia de rede empresarial de mdia dimenso, com

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 Politcnico de Viana do Castelo (IPVC) onde leciona unidades curriculares na rea das redes de computadores. .

49

Review
JavaScript (2. Edio Atualizada)
caes que requerem grandes interaces com grandes
volumes de dados oriundos de sistemas disponveis na web,
como o caso de alguns sistemas SIG.

Ttulo: JavaScript (2. Edio Atualizada)


Autor: Lus Abreu / Joo Paulo Carreiro
Editora: FCA

Confesso que ao longo do livro me recordei de alguns projectos em que trabalhei e utilizei bastante javascript tanto
mais porque constantemente estava a recorrer a arrays de
JSON como a AJAX, para efectuar transferncias de dados
de algum volume e colocar os dados de forma
compreensvel ao utilizador no lado cliente-side. Recordeime particularmente disso, porque na altura a informao que
encontrava disponvel na lngua de Cames sobre JavaScript
era pouca e de pobre qualidade.

Pginas: 208
ISBN: 978-972-722-785-3

Ao comear a ler este livro a primeira coisa que me saltou


mente foi ok, vou ler sobre JavaScript Vamos ver o que
este titulo singelo e esta capa minimalista me reservam.
Com o ler das primeiras pginas comecei a perceber que me
reservavam algo bem mais amplo do que um texto extremamente tecnicista, apenas acessvel a quem j est familiarizado com a linguagem, a programao para web, os seus
conceitos e o paradigma da programao orientada a objectos.

No final do livro, fiquei com a sensao de que me sabia a


pouco, que gostaria de ter lido um pouco mais, mas compreendi que sairia do mbito essencial deste livro, maiores explicaes sobre paradigmas e tecnologias.
Em suma, posso dizer que sou um leitor satisfeito, que recomenda este livro a quem pretende aprender como autodidacta, como aos bloggers, que pretendam aprender a personalizar mais os templates que usam nos vossos blogs, mas especialmente a quem estuda nos diversos nveis de ensino,
em especial nos cursos com elevada componente tecnolgica, em que este livro poder ser til no apenas como um
farol de referncia, mas como um guia para se aprofundar
o conhecimento, que muitas vezes peca pela falta de profundidade com que transmitido.

Pgina a pgina, capitulo a capitulo, pude constatar que o


livro de uma leitura interessante e pouco maadora, com
exemplos que ilustram o que explicado, no requerendo
grande conhecimento prvio sobre o tema.
Achei particularmente interessante a forma como so apresentados os conceitos de objectos e os objectos, ao longo
do livro, no s no capitulo 2 como mais tarde no capitulo
quarto onde so apresentados aspectos como a herana
entre classes. Pareceu-me acessvel at para quem nunca
lidou com o paradigma da programao orientada a objectos, no entanto perfeitamente explcito para que quem l
entenda como aplicar o paradigma em JavaScript.

Resta-me desejar uma boa leitura a todos os que decidirem


ler este livro e parabenizar os autores, pela qualidade do
texto que alm de aprazvel, se revela desafiante, entusiasmante e cativante, caractersticas no muito comuns neste
tipo de livros e que tanto requerem dos seus autores.

Ao longo de todo o livro o leitor de certa forma levado


numa aprendizagem progressiva e constantemente aprazvel
da linguagem JavaScript, sem constrangimentos, ou
dependncia excessiva de determinadas frameworks.
Pareceu-me um livro de leitura acessvel e grande pertinncia, numa altura em que o JavaScript cresce cada vez mais
em popularidade e utilidade tanto na programao para ambientes web, como na programao para outros ambientes ,
como o caso das aplicaes Windows Store em que a aplicao pode ser toda desenvolvida em linguagens de markup e
programao tradicionalmente usadas para web, at s apli-

AUTOR
Escrito por Sara Freixo
Licenciada na Escola Superior de Educao do Porto, iniciou-se no mundo da programao em 1996, tendo acompanhado a
evoluo da tecnologia desde ento. Participou em alguns projectos de desenvolvimento multimdia, sendo o seu fascnio
pela programao cada vez maior. neste momento WebDeveloper em part-time, estando envolvida em alguns projectos de
software Open-Source, com especial enfoque em projectos de desenvolvimento Web.

50

COMUNIDADES
Comunidade NetPonto Integrar o Facebook numa aplicao Windows
Phone

COMUNIDADE NETPONTO
http://netponto.org

INTEGRAR O FACEBOOK NUMA APLICAO WINDOWS PHONE


Configure o Projeto

Este artigo explica como integrar o Facebook numa


aplicao Windows Phone.

Prepare as pginas

Introduo

Coloque os botes Connect/Disconnect assim como Post


Message on Wall na MainPage.

Facebook neste momento a rede social mais popular no


mundo. Poder obter benefcios da integrao do Facebook
na sua aplicao, por exemplo, ganhar mais utilizadores,
publicar coisas em nome da sua aplicao, etc Este artigo ir
mostrar-lhe como integrar facilmente o Facebook na sua
aplicao do Windows Phone 8.

Para conectar a aplicao ao Facebook, preciso pressionar


o boto "Connect", a aplicao ir navegar para a prxima
pgina "ConnectPage".

Criar aplicao Facebook


Primeiro que tudo, necessrio criar uma aplicao
Facebook no site do Facebook. O "link" de referncia
https://developers.facebook.com/apps.
Clique no boto "Create New App"

Introduza o Nome da aplicao e o "namespace" (opcional)

A pgina ConnectPage apenas uma pgina em XAML com


um "WebBrowser".
ConnectPage.xaml
<phone:WebBrowser x:Name="mWebBrowser"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Height="696"
Width="480"
IsScriptEnabled="True"
Navigated="WebBrowser_Navigated"/>

Anote o "App ID" e o "App Secret" que ser preciso no


desenvolvimento da aplicao Windows Phone.

52

COMUNIDADE NETPONTO
http://netponto.org

INTEGRAR O FACEBOOK NUMA APLICAO WINDOWS PHONE


Adicionar bibliotecas
}

preciso adicionar 4 pequenos ficheiros que encontram


abaixo. Para o primeiro, FacebookClient.cs, preciso
adicionar o App ID e o App Secret s variveis appId e
clientSecret.

public virtual String GetLoginUrl()


{
return "https://m.facebook.com/dialog/
oauth?client_id=" + appId +"&redirect_uri=
https://www.facebook.com/connect/
login_success.html&scope="+ scope
+ "&display=touch";
}

// FacebookUtils/FacebookClient.cs
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Net;
System.Text;
System.Threading.Tasks;
System.IO.IsolatedStorage;

public virtual String


GetAccessTokenRequestUrl(string code)
{
return "https://graph.facebook.com/
oauth/access_token?client_id=" +
appId + "&redirect_uri=
https://www.facebook.com/connect/
login_success.html&client_secret=" +
clientSecret + "&code=" + code;
}

namespace FacebookUtils
{
public class FacebookClient
{
private static FacebookClient instance;
private string accessToken;

public virtual String


GetAccessTokenExchangeUrl(
string accessToken)
{
return "https://graph.facebook.com/
oauth/access_token?client_id=" + appId +
"&client_secret=" + clientSecret +
"&grant_type=fb_exchange_token&
fb_exchange_token="+ accessToken;
}

private static readonly


IsolatedStorageSettings appSettings =
IsolatedStorageSettings.ApplicationSettings;
private String appId = "xxx";
private String clientSecret = "xxx";
private String scope = "publish_stream";
public FacebookClient()
{
try
{
accessToken = (string)appSettings
["accessToken"];
}
catch (KeyNotFoundException e)
{
accessToken = "";
}
}

public void PostMessageOnWall(string


message, UploadStringCompletedEventHandler
handler)
{
WebClient client = new WebClient();
client.UploadStringCompleted +=
handler;
client.UploadStringAsync(new Uri
("https://graph.facebook.com/me/feed"), "POST",
"message=" + HttpUtility.UrlEncode(message) +
"&access_token=" +
FacebookClient.Instance.AccessToken);
}

public static FacebookClient Instance


{
get
{
if (instance == null)
instance = new FacebookClient();
return instance;
}
set
{
instance = value;
}
}

public void ExchangeAccessToken


(UploadStringCompletedEventHandler handler)
{
WebClient client = new WebClient();
client.UploadStringCompleted +=
handler;
client.UploadStringAsync(new Uri
(GetAccessTokenExchangeUrl
(FacebookClient.Instance.AccessToken)), "POST",
"");
}

public string AccessToken


{
get
{
return accessToken;
}
set
{
accessToken = value;
if (accessToken.Equals(""))
appSettings.Remove
("accessToken");
else
appSettings.Add
("accessToken", accessToken);

}
// FacebookUtils/ResponseData.cs
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;

namespace FacebookUtils
{
public class ResponseData
{
public string id { get; set; }

53

COMUNIDADE NETPONTO
http://netponto.org

INTEGRAR O FACEBOOK NUMA APLICAO WINDOWS PHONE


}

Lidando com a janela de login do Facebook

public ErrorData error { get; set; }


public class ErrorData
{
public int code { get; set; }
public int error_subcode { get; set; }
}
// Tools/UriToolKits.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace Tools
{
public static class UriToolKits
{
private static readonly Regex
QueryStringRegex = new Regex(@"[\?&](?
<name>[^&=]+)=(?<value>[^&=]+)");

Uma vez que o boto Connect pressionado, a aplicao ir


navegar para a ConnectPage. Uma vez que a pgina inicializada, preciso atribuir o "source" ao "WebBrowser" usando o url preparado pelo FacebookClient. Por favor note, que
necessrio limpar "cookies" antes de atribuir o "source" para
limpar registos efetuados anteriormente.

public static IEnumerable<KeyValuePair


<string, string>> ParseQueryString(this
string uri)
{
if (uri == null)
throw new ArgumentException
("uri");

public ConnectPage()
{
InitializeComponent();
// Clear Cookie to remove current
//logged in user data
mWebBrowser.ClearCookiesAsync();

var matches =
QueryStringRegex.Matches(uri);
for (var i = 0; i < matches.Count;
i++)
{
var match = matches[i];
yield return new KeyValuePair
<string, string>(match.Groups["name"].Value,
match.Groups["value"].Value);
}
}

// Go to Login url
mWebBrowser.Source = new Uri
(FacebookClient.Instance.GetLoginUrl());
}
Agora o que preciso verificar o url atual do "WebBrowser"
usando o evento "Navigated". Se o processo de "logging" foi
realizado com sucesso o url final ser "http://
www.facebook.com/connect/login_success.html" ou "https://
www.facebook.com/connect/login_success.html". Uma vez
obtido este resultado, necessrio extrair o parmetro "code"
atravs de "query string" para assim procedermos ao prximo
passo.

}
// Tools/KeyValuePairUtils.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

private void WebBrowser_Navigated(object sender,


NavigationEventArgs e)
{
String uri = e.Uri.ToString();

namespace Tools
{
public static class KeyValuePairUtils
{
public static TValue GetValue<TKey,
TValue>(this IEnumerable<KeyValuePair<TKey,
TValue>> pairs, TKey key)
{
foreach (KeyValuePair<TKey, TValue>
pair in pairs)
{
if (key.Equals(pair.Key))
return pair.Value;
}

if (uri.StartsWith("https://www.facebook.com/
connect/login_success.html")
|| uri.StartsWith("
http://www.facebook.com/connect/
login_success.html"))
{
// Remove junk text added by facebook from url
if (uri.EndsWith("#_=_"))
uri = uri.Substring(0, uri.Length - 4);
String queryString = e.Uri.Query.ToString();

throw new Exception("the value is not


found in the dictionary");

// Acquire the code from Query String


IEnumerable<KeyValuePair<string, string>>
pairs = UriToolKits.ParseQueryString
(queryString);
string code = KeyValuePairUtils.GetValue

54

COMUNIDADE NETPONTO
http://netponto.org

INTEGRAR O FACEBOOK NUMA APLICAO WINDOWS PHONE


(pairs, "code");

if (e.Error != null)
{
MessageBox.Show("Error Occurred: " +
e.Error.Message);
return;
}
System.Diagnostics.Debug.WriteLine(e.Result);

// Get access_token from code using


//Asynchronous HTTP Request
WebClient client = new WebClient();
client.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler
(AccessTokenDownloadCompleted);
client.DownloadStringAsync(new Uri
(FacebookClient.Instance.
GetAccessTokenRequestUrl(code)));

string result = e.Result;


byte[] data = Encoding.UTF8.GetBytes(result);
MemoryStream memStream = new MemoryStream
(data);
DataContractJsonSerializer serializer = new
DataContractJsonSerializer(typeof(ResponseData));
ResponseData responseData = (ResponseData)
serializer.ReadObject(memStream);

}
O parmetro "code" necessrio para as trocas do token de
acesso que o parmetro real que preciso quando se pretende usar a conta do Facebook via Facebook App. Para
trocar o cdigo para o token de acesso, necessrio fazer
um "POST request" ao servidor usando o "WebClient" como
mostrado de seguida- Uma vez que os dados esto disponveis, extrai-se o parmetro "access_token" e guarda-se o
valor, regressando novamente MainPage.
void AccessTokenDownloadCompleted(object sender,
DownloadStringCompletedEventArgs e)
{
string data = e.Result;
data = "?" + data;
// Acquire access_token and expires timestamp
IEnumerable<KeyValuePair<string, string>> pairs =
UriToolKits.ParseQueryString(data);
string accessToken = KeyValuePairUtils.GetValue
(pairs, "access_token");
string expires = KeyValuePairUtils.GetValue(pairs,
"expires");
// Save ac1cess_token
FacebookClient.Instance.AccessToken = accessToken;

// Back to MainPage
var rootFrame = Application.Current.RootVisual as
PhoneApplicationFrame;
if (rootFrame != null)
rootFrame.GoBack();
}
Escrever no Wall

if (responseData.id != null && !


responseData.id.Equals(""))
{
// Success
MessageBox.Show("Message Posted!");
}
else if (responseData.error != null &&
responseData.error.code == 190)
{
if (responseData.error.error_subcode ==
463)
{
// Access Token Expired, need to get
//new token
FacebookClient.Instance.
ExchangeAccessToken
(new UploadStringCompletedEventHandler
(ExchangeAccessTokenCompleted));
}
else
{
// Another Error with Access Token,
//need to clear the Access Token
FacebookClient.Instance.AccessToken = "";
SetLoggedInState(false);
}
}
else
{
// Error
}
void ExchangeAccessTokenCompleted(object sender,
UploadStringCompletedEventArgs e)
{
// Acquire access_token and expires timestamp
IEnumerable<KeyValuePair<string, string>> pairs
= UriToolKits.ParseQueryString(e.Result);
string accessToken = KeyValuePairUtils.GetValue
(pairs, "access_token");

Na realidade o access_token a chave para conectar ao


Facebook. Uma vez obtido isto, possvel fazer qualquer
coisa com a API. Por agora, apenas irei mostrar como escrever uma mensagem no "wall". Para o fazer simplesmente
chamo
o
mtodo
FacebookClient.Instance.PostMessageOnWall

if (accessToken != null && !accessToken.Equals


(""))
{
MessageBox.Show("Access Token Exchange
Failed");
return;
}

FacebookClient.Instance.PostMessageOnWall
(TextToPost, new UploadStringCompletedEventHandler
(PostMessageOnWallCompleted));
PostMessageOnWall um mtodo assncrono preciso lidar
com o resultado depois de tudo. De notar que o
"access_token" tem uma data limite. Caso expira, preciso
trocar por um novo "access_token" antes de fazer algo.
void PostMessageOnWallCompleted(object sender,
UploadStringCompletedEventArgs e)
{
if (e.Cancelled)
return;

55

// Save access_token
FacebookClient.Instance.AccessToken =
accessToken;
FacebookClient.Instance.PostMessageOnWall
(TextToPost, new
UploadStringCompletedEventHandler
(PostMessageOnWallCompleted));

COMUNIDADE NETPONTO
http://netponto.org

INTEGRAR O FACEBOOK NUMA APLICAO WINDOWS PHONE


Parabns. A sua aplicao est conectada ao Facebook!
Para ter mais funcionalidade poder modificar o FacebookClient.cs. Para obter mais informaes sobre a API consulte
https://developers.facebook.com/docs/reference/api/
Cdigo Fonte
O cdigo fonte para o exemplo pode ser obtido em FacebookConnect.zip

Podera obter beneficios da integracao


do Facebook na sua
aplicacao, por exemplo, ganhar mais utilizadores, publicar coisas em nome da sua
aplicacao []
Este artigo traduo do artigo Integrate Facebook to Your
Windows Phone Application, escrito por Spaso Lazarevic,
como contributo comunidade portuguesa para a Nokia Developer Wiki.

E isto que iremos obter no "Wall" do Facebook!

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

56

No Code
O Impacto das Novas Tecnologias nas Crianas com Necessidades Educativas Especiais

No Code
O Impacto das Novas Tecnologias
nas Crianas com Necessidades Educativas Especiais
estreitar a interao da criana com os dispositivos
electrnicos.

Numa altura em que o mundo em que vivemos est em


mudana constante, trazendo transformaes positivas e
negativas, a sociedade que nos envolve torna-se assim mais
complexa, devido enorme diversidade de culturas, de
economias e de causas sociais. No basta simplesmente ser
alfabetizado, ou seja, aprender meramente a descodificar,
necessrio que as crianas sejam capazes de exercer as
prticas sociais.

O jogo procura solidificar duas sequncias do nosso dia-adia, que apesar da sua simplicidade, por vezes se tornam
difceis para as crianas com N.E.E. (dependendo da sua
patologia).

A escola portadora desse papel, sendo responsvel por


proporcionar criana a oportunidade de trabalhar, de criar,
de imaginar e de interagir em todas as aprendizagens. Ao
professor cabe o papel de mediador essencial para
consolidar essas aprendizagens. Como sabemos, a criana
aprende melhor aquilo que faz sentido para ela e atravs
de uma cooperao ntima que podemos transformar a
nossa prtica diria num ambiente de verdadeira
aprendizagem, onde tenhamos como base o respeito mtuo.
E nesta base que as novas tecnologias, cada vez mais
desenvolvidas podem ajudar a que a educao pr-escolar
possa contribuir para uma maior igualdade de oportunidades.
A educao para os mdia uma das vertentes da rea da
Formao Pessoal e Social e da rea do Conhecimento do
Mundo, tornando-se indiscutivelmente uma questo de
numerosas possibilidades e novos caminhos para a
educao. possvel que as crianas expandam os seus
horizontes e minimizem as suas diferenas.

Ilustrao 1 - Pgina Inicial do Jogo

Ao longo da construo desta ferramenta foram tomadas


algumas decises tais como as cores a usar, as sequncias,
o porqu do smile triste e contente assim como os aplausos
finais.
O porqu das cores

Na parte prtica que ilustra este artigo, criou-se um jogo


interactivo cujo objectivo geral se centra sobretudo no
desenvolvimento da autonomia. O jogo extremamente
simples, baseado apenas em pginas HTML, opo que
permitiu e garantiu a jogabilidade do jogo mesmo que este
seja acedido por computador, tablet ou por um smartphone.

O conceito de cor um conceito abstracto e, para que uma


criana seja capaz de identificar uma cor, necessrio ter
milhares de referncias para a ajudar a chegar ao conceito.
Atravs dos exemplos, importante que a criana
compreenda que a cor no tem forma, tamanho, no tem
contornos, pode ter diferentes texturas, formatos Quantos
mais exemplos distintos da mesma cor se mostrar a uma
criana, mais facilmente a criana compreender o conceito
da cor.

Foi com base num diagnstico de Sndrome Miastnico


Congnito numa criana do sexo feminino que se baseou e
orientou o presente artigo. Tendo em conta que a criana
apresenta graves dificuldades ao nvel da comunicao, o
objectivo passou por construir um jogo que permita que a
criana alcance um maior nvel de autonomia, comunicando
e interagindo com os outros.

O porqu da sequncia tomada


A sequncia uma das atividades mais importantes para se
trabalhar com crianas do pr-escolar. Nela est a base de
muitos fundamentos da Linguagem e da Matemtica. Neste
caso, demos grande importncia s sequncias temporais.
Quando a criana adquire o conceito de sequncia temporal,
ela j pode compreender pequenas estruturas lingusticas
nas histrias, como comeo, meio e fim.

(Para os leitores que tenham curiosidade, o jogo


desenvolvido est acessvel a todos os educadores e
crianas que o queiram jogar. Para jogar basta apenas
aceder
ao
site:
www.abrincartambemseaprende.webuda.com)
Numa altura em que os avanos tecnolgicos so dirios,
depende da nossa vontade enquanto educadores conseguir

58

No Code
prprias mos para jogar. Quando a mobilidade da criana
est afectada, esta possibilidade pode ser uma mais-valia
pois por vezes torna-se difcil o manuseamento do ponteiro
do rato no ecr de um computador.

Da a escolha estes dois jogos comer e o lavar as mos e


a sua sequncia. de extrema importncia que a criana
saiba o que faz a seguir e o seu porqu.
O porqu do smile triste/ do smile contente / dos
aplausos

, importante ainda referir, que qualquer criana pode jogar


este jogo, pois mesmo sem ter necessidades educativas
especiais, este jogo ajuda compreenso sequencial dos
passos que tem que executar na tarefa da alimentao e na
tarefa da higiene.

A mensagem visual (imagem) mais simples, mais universal


e retracta de uma forma mais real os acontecimentos do que
a mensagem escrita. muito mais entendvel se
visualizarmos imagens de um determinado acontecimento do
que se o relatarmos por escrito. Desta forma escolhemos
uma imagem que a criana conhece. Quando acerta aparece
o Smile contente, sinal que conseguiu realizar a tarefa.
Quando no acerta surge o Smile triste, smbolo que ter
que tentar novamente. As palmas servem como um reforo
positivo. Chegou ao fim, alcanou o objectivo da tarefa de
ensino aprendizagem e aplaudida por isso.

Como breve concluso ou reflexo na fase final deste artigo,


fundamental entender a dificuldade, de modo a promover
no uma educao especfica de pessoas com dificuldades
intelectuais e de desenvolvimento mas gritar bem alto que
no h pedagogias especiais. O que h uma nica
pedagogia com diferentes grupos de aprofundamento.
Este caminho precisa de dilogo, cooperao e articulao
entre todos os agentes intervenientes para que exista xito,
inovao, reabilitao urgente continuar a desenvolver e
neste ponto que as novas tecnologias, assim como todos
os programadores tm uma voz activa pois podero ajudar a
minimizar as diferenas.

O jogo procura solidificar duas sequencias do nosso dia-adia, que apesar da sua
simplicidade, por vezes
se tornam dificeis para
as criancas com N.E.E.
(dependendo da sua
patologia).

Ilustrao 2 - Exemplo Sequncia Alimentao

Como j foi referido caso a criana escolha a imagem


correcta apresentado o Smile Contente incentivando-a a
continuar o jogo. A criana assim encaminhada para uma
nova pgina HTML, que mostra em tamanho mais pequeno a
imagem j escolhida correctamente no passo anterior, e
mostra as imagens que ainda lhe falta ordenar para terminar
o jogo.
Caso a criana erre, ento mostrada a imagem do Smile
Triste e a criana reencaminhada para a pgina HTML em
que se encontrava anteriormente.

Paulo
Freire
um
dia
escreveu:
S
existe saber na inveno, na reinveno, na busca inquieta,
impaciente, permanente, que os homens fazem no mundo,
com o mundo e com os outros.

Neste jogo possvel utilizarmos dispositivos touch,


nomeadamente o tablet, em que a criana pode utilizar as

AUTOR
Escrito por Virgnia Belo Barata
Mestre em Educao de Infncia e Ensino do 1 Ciclo do Ensino Bsico / Ps Graduao e Especializao em Ensino Especial

59

Elege o melhor artigo desta edio


Revista PROGRAMAR
http://bit.do/ProgramarED44_V

Veja tambm as edies anteriores da


Revista PROGRAMAR
41 Edio - Junho 2013

42 Edio - Setembro 2013

43 Edio - Dezembro 2013

38 Edio - Dezembro 2012

39 Edio - Fevereiro 2013

40 Edio - Abril 2013

e muito mais em
www.revista-programar.info

Você também pode gostar