Você está na página 1de 62

EDITORIAL

EQUIPA PROGRAMAR
Coordenador Antnio Pedro Cunha Santos 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

Try { } catch{ }
"(...)dentro de poucos anos as pessoas tero mais facilidade de comunicar atravs de mquinas do que pessoalmente, cara a cara." Joseph Licklider, 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 12 15 17 21 36 38 41 JSF - Parte 2 - Como Criar um Projeto JSF (Lus Soares) Aplicao de Licenas de Utilizador no SharePoint 2013 (Andr Vala) Funes Annimas (Cristiano Ramos, Joo Silva) Pascal - Operator Overloading (Igor Nunes) Quero fazer uma aplicao simples! E agora? Por onde comeo? (Rita Peres) Desbravando o goto! (Tiago Sousa) Arduino: const vs #define (Nuno Santos) Mitos do jQuery (Lus Soares)

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

ANLISES
49 50 Gesto de Sistemas e Redes em Linux - 3 Edio (Pedro Pinto) 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
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. 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.

AMD anuncia Opteron A1100 octacore ARM de 64 bits para servidores


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 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. Veja o vdeo preparado pela Samsung. Fonte: Exame Informtica 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. 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. Neste artigo que vos trago hoje, vou explicar como podemos desenvolver o nosso prprio plugin para o Google Chrome. { "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"] } ] } ! 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. name - Nome do nosso plugin, o que for definido neste campo ser visvel publicamente na pgina dos plugins do Chrome. description - Breve descrio do plugin, tal como o nome, a descrio ser visvel na pgina dos plugins do Chrome. version - Verso atual do nosso plugin, dever ser definido pelo programador. 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 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. background - Conjunto de pginas ou scripts a serem utilizados em plano de fundo. Mais para a frente irei regressar a este assunto.

Antes de comearmos devers ter como requisitos mnimos, os seguintes conhecimentos: HTML CSS JavaScript 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! Se alguma vez desenvolveste um Website ou aplicao Web, ento vais habituar-te rapidamente ao desenvolvimento de plugins 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. 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:

TEMA DA CAPA
CRIANDO EXTENSES PARA GOOGLE CHROME

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! mostrar-nos quais as medidas do nosso browser, no momento em que damos o clique no nosso plugin. 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: chrome.browserAction.onClicked.addListener (function(tab) { chrome.tabs.getSelected(null, function(tab) { chrome.tabs.sendMessage(tab.id, ""); }); }); 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. Listener 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); }); 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

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. Agora que est tudo terminado, podemos testar o nosso plugin!

Concluses Com este artigo aprendemos a dar os primeiros passos na criao de plugins para o Google Chrome. 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/ 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!

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
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: selecionar os plugins da categoria Java Web and EE e instal-los (em Install). De seguida, deve reiniciar o IDE. 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.

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.

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. 3. Instale a verso que tiver transferido. Abra o NetBeans 5. 6. Descompacte o ficheiro do servidor para uma pasta sua escolha. Agora que tem o JDK, o IDE e o servidor aplicacional instalados, est pronto para criar um projeto JSF.

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.

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. Deve agora dar um nome ao projeto e fazer Next:

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:

8.

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

12.

Poder agora indicar as bibliotecas iniciais (jars) a associar ao projeto. Selecione o JavaServer Faces (JSF) e faa Finish:

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

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

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.

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

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

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

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 consul tor 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. 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. 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 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. 1 Clculo do nmero N da sequncia de Fibonacci, utilizando funes normais. def fib_normal(N): return N if N<2 else fibs(N-1)+fibs(N-2) 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.

15

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

[...] se estamos felizes com as funcoes comuns e parecem funcionar tao bem, porque devemos usar funcoes anonimas? E quando devemos usa -las?

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. Em Pascal, este tipo de polimorfismo tambm se aplica aos operadores, os quais podem de igual forma ser overloaded. 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). 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). 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: operator simbolo (operando1 : tipo1; operando2 : tipo2) resultado : tipo3; 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. 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; 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. No podemos indicar de forma explcita que o tipo de dados array of integer, uma vez que o compilador no o aceita.

Overload de operadores aritmticos

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

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; var list1 : TIntegerArray = nil; list2 : TIntegerArray = nil; i : integer; begin (* Cdigo que adiciona valores a list1 *) 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 2 2 2 2 * * * * * 2 7 5 9 4 = 4 = 14 = 10 = 18 = 8 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. Vamos continuar com o overload do operador de adio +. 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; operator + (list : TIntegerArray; n : integer) res : TIntegerArray; begin res := n + list; 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): 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;

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

A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
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; 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; 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: 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: operator < (list1, list2 : TIntegerArray) res : boolean; begin res := list2 > list1; end; Portanto, para implementar o overload de um operador de comparao com a ordem dos operandos invertidos, recorremos ao overload do operador inverso. O mesmo se aplica aos operadores <= e >=. Por fim, os operadores de igualdade (=) e diferena (<>) tambm podem ser overloaded.

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

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

19

A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
Concluso 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. 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. 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; 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); list2); writeln('list1 <= list2? ':16, list1 <= list2); writeln('-4 in list2? ':16, -4 in list2); end. O output deste programa o seguinte: 2 2 2 2 2 * -2 = * -4 = * -5 = * -7 = * -9 = list1 > list1 <= -4 in -4 -8 -10 -14 -18 list2? TRUE list2? FALSE list2? TRUE writeln('list1 > list2? ':16, list1 >

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

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.

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

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)

Ilustrao 1 - Ecr de Login No-IP

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

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

Ilustrao 9 - Escolher a password de acesso BD

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.

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

Ilustrao 15 - Criar uma nova BD

Ilustrao 13 - Menu SQL Server Configuration Manager

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.

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

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

24

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

Ao irmos criando as diferentes tabelas que compem a BD as alteraes vo-se tornando visveis, como mostra a figura seguinte.

25

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); dataGridView1.DataSource = dataSet2; dataGridView1.DataMember = dataSet2.Tables[0].TableName; } catch { // 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. 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

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. Ento a que nos propormos executar no projecto ilustra este artigo? 1. 2. 3. 4. 5. 6. Inserir um utilizador no sistema Inserir um carro no sistema Actualizar os Kms Mensais feitos pelo carro Saber quais os carros que esto prximos de ir prxima reviso. Gerir as revises feitas pelos carros Gerir os Kms feitos por essas mesmas viaturas

Como foi referido para melhor ilustrar o cdigo de cada parte destes pressupostos, foram criados diversos botes, cada um com a sua funcionalidade especfica.

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

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

Ilustrao 25 - Criao de DataBinding

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

27

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. 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 26 - Inserir Dados da ligao

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

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

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

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

Ilustrao 34 - Novo carro adicionado

29

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(); String sql2 = "INSERT INTO KmsAnuais (Matricula)" + " VALUES('" + matricula + "')"; command = new SqlCommand(sql2, myConnection); command.ExecuteNonQuery(); MessageBox.Show("Carro Introduzido com sucesso."); myConnection.Close(); } catch { MessageBox.Show("ERRO ao Inserir novo carro.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } matriculatextBox.Text = ""; kmstextBox.Text = ""; kmsProximatextBox.Text = ""; mostraCarros(); } 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? }

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. private void colorirRevisaobutton_Click(object sender, EventArgs e) { foreach (DataGridViewRow linha in dataGridView1.Rows) { 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) { linha.DefaultCellStyle .BackColor = Color.DeepSkyBlue; } } 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-

30

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(); 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. 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{ }

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.

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

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); 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();
Ilustrao 39 - Mostra Carros com Valores actualizados

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.

} catch { } } 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

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.

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

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.

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

A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
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(); 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(); 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(); 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(); 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"); for (int i = 0; i < seriesArray.Length; i++) { System.Windows.Forms. DataVisualization.Charting.Series series = this.chart1.Series.Add(seriesArray[i]); series.Points.Add(pointsArray[i]); } 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 });

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

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

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

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!

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 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. 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. goto label: Na programao estruturada no temos qualquer obrigao em utilizador o goto. Opinies Divididas em relao ao goto! 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. 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. 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. char *buf1, *buf2 int err = OK; if ((buf = malloc(20)) == NULL) return err; if((buf2 = malloc(200)) == NULL){ free(buf1); return err; } 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. Um outro exemplo clssico do uso de goto em ciclos encadeados. Como por exemplo: 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; } } } } 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; Sem utilizar os goto: Utilizando os goto: char *buf1, *buf2; int err = OK; if ((buf1 = malloc(100)) == NULL) { err = ERR_MALLOC; goto clean_up; } if (buf2 = malloc(200) == NULL ){ err = ERR_MALLOC; goto clean_up2;

36

A PROGRAMAR
DESBRAVANDO O GOTO!
Como podemos verificar com a utilizao do goto podemos simplificar bastante o nosso cdigo. 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; } 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 */ Concluso! 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. 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

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

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

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. 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 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. Por exemplo: #define Pin 10 void setup() { pinMode(Pin, OUTPUT); } 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 void setup() { pinMode(10, OUTPUT); } 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 #const 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. 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); } O que realmente acontece ao compilar o cdigo acima o seguinte: #const int Pin = 10; void setup() { pinMode(10, OUTPUT); } void loop() { digitalWrite(Pin, HIGH); delay(500); digitalWrite(Pin, LOW); delay(500); } quando comparado com a definio de uma varivel do tipo inteiro para definir o Pin. Compilando o programa usando o #define obtenho:

38

A PROGRAMAR
ARDUINO: CONST VS #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: Usando #define:

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. Para averiguarmos com exactido a quantidade de memria RAM ocupada podemos usar a ferramenta AVR-SIZE disponibilizada pelo IDE do Arduino.~

Usando #const:

AVR-SIZE

A ferramenta avr-size ir dizer-nos realmente a quantidade de memria RAM esttica que o programa est a usar. 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 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:

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 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. 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); } void loop()

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 dec & hex Representa o somatrio da memria RAM e Flash utilizadas pelo programa

39

A PROGRAMAR
ARDUINO: CONST VS #DEFINE
digitalWrite(Pin, HIGH); delay(500); digitalWrite(Pin, LOW); delay(500); } Cdigo com Erro: #define Pin 10 void setup() { pinMode(3;, OUTPUT); } 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. 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.

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

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

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
Mito #1: O jQuery substitui JavaScript

Mitos do jQuery

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

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". Isto tambm se aplica ao jQuery UI (ou de outros plugins) que geralmente assumem que h markup HTML, conferindolhe apenas um look&feel.

[]uma biblioteca apenas junta diversas funcoes e outros elementos reutilizaveis []


Mito #2: O jQuery serve para construir interfaces 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.

programador deve escolher aquela que mais se adequa as necessidades (consoante os browsers e plataformas a suportar, as funcionalidades a desenvolver, etc.)
Mito #3: O jQuery a melhor biblioteca JavaScript 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
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. 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. Mito #5: O jQuery Mobile o jQuery para mobile

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"

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.

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: class X { static int M (Func<int?, byte> x, object y) { return 1; } static int M (Func<X, byte> x, string y) { return 2; } const int Value = 1000; static void Main() { var a = M(X => (byte)X.Value, null); unchecked { Console.WriteLine(a); Console.WriteLine(M(X => (byte) X.Value, null)); } } Qual o resultado da sua execuo? 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: M(X => (byte)X.Value, null) 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. Simplificando a descrio da resoluo de sobrecarga de mtodo, seguem-se os seguintes passos: }

Se uma sobrecarga melhor que todas as outras, usar essa

Se no h sobrecargas aplicveis, ou nenhuma melhor que as outras, ento a chamada invlida e leva a um erro de compilao Pode haver a tentao de saltar diretamente para a segunda opo, assumindo que ambas as sobrecargas so vlidas em ambos os casos. 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? 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): 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:

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

Determina-se que sobrecargas (overloads) ao aplicveis (isto , quais fazem sentido em termos dos argumentos fornecidos e os correspondentes parmetros) 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. 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

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.

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

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)
Ttulo: JavaScript (2. Edio Atualizada) Autor: Lus Abreu / Joo Paulo Carreiro Editora: FCA Pginas: 208 ISBN: 978-972-722-785-3 caes que requerem grandes interaces com grandes volumes de dados oriundos de sistemas disponveis na web, como o caso de alguns sistemas SIG. 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. 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. 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 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. 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. 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


Este artigo explica como integrar o Facebook numa aplicao Windows Phone. Introduo 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. 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" Configure o Projeto Prepare as pginas Coloque os botes Connect/Disconnect assim como Post Message on Wall na MainPage. Para conectar a aplicao ao Facebook, preciso pressionar o boto "Connect", a aplicao ir navegar para a prxima pgina "ConnectPage".

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. // 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 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"; } 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; } 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; } 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 void ExchangeAccessToken (UploadStringCompletedEventHandler handler) { WebClient client = new WebClient(); client.UploadStringCompleted += handler; client.UploadStringAsync(new Uri (GetAccessTokenExchangeUrl (FacebookClient.Instance.AccessToken)), "POST", ""); } } // FacebookUtils/ResponseData.cs using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Threading.Tasks; } }

namespace FacebookUtils { public class FacebookClient { private static FacebookClient instance; private string 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 static FacebookClient Instance { get { if (instance == null) instance = new FacebookClient(); return instance; } set { instance = value; } } public string AccessToken { get { return accessToken; } set { accessToken = value; if (accessToken.Equals("")) appSettings.Remove ("accessToken"); else appSettings.Add ("accessToken", accessToken);

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

53

COMUNIDADE NETPONTO
http://netponto.org

INTEGRAR O FACEBOOK NUMA APLICAO WINDOWS PHONE


} 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>[^&=]+)"); public static IEnumerable<KeyValuePair <string, string>> ParseQueryString(this string uri) { if (uri == null) throw new ArgumentException ("uri"); 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); } } } } // Tools/KeyValuePairUtils.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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; } throw new Exception("the value is not found in the dictionary"); } } } 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 ConnectPage() { InitializeComponent(); // Clear Cookie to remove current //logged in user data mWebBrowser.ClearCookiesAsync(); // 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. private void WebBrowser_Navigated(object sender, NavigationEventArgs e) { String uri = e.Uri.ToString(); 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(); // Acquire the code from Query String IEnumerable<KeyValuePair<string, string>> pairs = UriToolKits.ParseQueryString (queryString); string code = KeyValuePairUtils.GetValue public ErrorData error { get; set; } Lidando com a janela de login do Facebook

54

COMUNIDADE NETPONTO
http://netponto.org

INTEGRAR O FACEBOOK NUMA APLICAO WINDOWS PHONE


(pairs, "code"); // 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))); } } 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 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 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; 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"); if (accessToken != null && !accessToken.Equals ("")) { MessageBox.Show("Access Token Exchange Failed"); return; } // Save access_token FacebookClient.Instance.AccessToken = accessToken; FacebookClient.Instance.PostMessageOnWall (TextToPost, new UploadStringCompletedEventHandler (PostMessageOnWallCompleted)); } if (e.Error != null) { MessageBox.Show("Error Occurred: " + e.Error.Message); return; } System.Diagnostics.Debug.WriteLine(e.Result); 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); 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 }

55

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
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. 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. 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. 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. (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 estreitar a interao da criana com os dispositivos electrnicos. 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).

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

58

No Code
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 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. 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. , 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. 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.

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.

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

38 Edio - Dezembro 2012

42 Edio - Setembro 2013

39 Edio - Fevereiro 2013

43 Edio - Dezembro 2013

40 Edio - Abril 2013

e muito mais em www.revista-programar.info

Você também pode gostar