Escolar Documentos
Profissional Documentos
Cultura Documentos
Revista - PROGRAMAR - 44-Criar Extensões para Google Chrome PDF
Revista - PROGRAMAR - 44-Criar Extensões para Google Chrome PDF
EQUIPA PROGRAMAR
Coordenador
Antnio Pedro Cunha Santos
Try { } catch{ }
"(...)dentro de poucos anos as pessoas tero mais facilidade de comunicar atravs
de mquinas do que pessoalmente, cara a cara."
Joseph Licklider,
Editor
Antnio Pedro Cunha Santos
Design
Srgio Alves
Twitter: @scorpion_blood
Redaco
Andr Vala
Cristiano Ramos
Igor Nunes
Lus Soares
Nuno Santos
Paulo Morgado
Pedro Pinto
Rita Peres
Sara Silva
Virgnia Barata
Staff
Antnio Santos
Antnio Silva
Jorge Paulino
Rita Peres
Rui Gonalves
Contacto
revistaprogramar@portugal-aprogramar.org
Website
http://www.revista-programar.info
ISSN
1 647-071 0
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!
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
A PROGRAMAR
9
12
15
17
21
Quero fazer uma aplicao simples! E agora? Por onde comeo? (Rita Peres)
36
38
41
COLUNAS
45
ANLISES
49
50
COMUNIDADES
52
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
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.
{
"manifest_version": 2,
"name": "Ruller",
"description": "Este plugin diz-nos quais as medidas atuais do nosso browser.",
"version": "1.0",
"icons": { "16": "icons/16x16.png", "48":
"icons/48x48.png", "128": "icons/128x128.png" },
!
"browser_action": {
"default_icon": {
"19": "icons/19x19.png",
"38": "icons/38x38.png"
},
"default_title": "Ruller"
}, !
"background": {
"scripts": ["background.js"]
}, !
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["jquery.min.js","content.js"]
}
]
} !
Neste artigo que vos trago hoje, vou explicar como podemos
desenvolver o nosso prprio plugin para o Google Chrome.
Passando explicao:
manifest_version - a verso do ficheiro manifest.json que
acabamos de criar, est atualmente na verso 2, sendo que
ficheiros na verso 1 no sero aceites pelos Google
Chrome.
CSS
JavaScript
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.
TEMA DA CAPA
CRIANDO EXTENSES PARA GOOGLE CHROME
Utilizao
Agora que temos o nosso plugin feito, vamos colocar o
mesmo em funcionamento, mos obra!
Para isso, basta activarmos o modo de programador do
Google Chrome. Abrimos a pgina dos plugins do Google
Chrome e selecionamos a caixa que diz Modo de
programador.
Background:
O ficheiro que definimos como background no manifesto,
neste caso ir servir como vigia, estando espera que o
utilizador o chame. Neste ficheiro colocamos o seguinte
cdigo:
De
seguida,
clicamos
em
Carregar
extenso
descomprimida e indicamos onde est o directrio criado
anteriormente. Assim que estiver concludo, podemos ver o
nosso recm criado plugin activado e pronto a utilizar.
chrome.browserAction.onClicked.addListener
(function(tab)
{
chrome.tabs.getSelected(null, function(tab)
{
chrome.tabs.sendMessage(tab.id, "");
});
});
Concluses
Com este artigo aprendemos a dar os primeiros passos na
criao de plugins para o Google Chrome.
Listener
A PROGRAMAR
JSFParte 2 Como Criar um Projeto JSF
Aplicao de Licenas de Utilizador no SharePoint 2013
Funes Annimas
PascalOperator Overloading
Quero fazer uma aplicao simples! E agora? Por onde comeo?
Desbravando o goto!
Arduino: const vs #define
Mitos do jQuery
A PROGRAMAR
JSF - parte 2 - Como Criar um Projeto JSF
selecionar os plugins da categoria Java Web and EE e instal-los (em Install). De seguida, deve reiniciar o IDE.
4.
5.
6.
3.
Abra o NetBeans
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.
10.
Neste
ecr
de
configurao:
- indique a pasta base para onde descompactou o
Tomcat
no
passo
5
(Browse);
- insira admin/admin nos campos Username e
Password;
- clique em Finish.
11.
Nesta altura j dever ter o Tomcat presente e selecionado na listagem, pelo que dever pressionar Next:
12.
Nota: Com o tipo de projeto criado, quem ir gerir as bibliotecas (dependncias) associadas aos projeto ser o NetBeans.
O Maven uma alternativa quando as coisas se complicam
(nesse caso deve escolher Maven > Web Application).
Se preferir, pode criar um projeto com base num sample project. Para tal, no ecr de New Project, deve selecionar
Samples e escolher um projeto que lhe agrade, partida dentro
de
HTML5,
Java
EE
ou
Maven.
Em ambos os casos, o resto do tutorial no se aplica.
Clique em Next.
7.
8.
10
A PROGRAMAR
JSF - PARTE 2 - COMO CRIAR UM PROJECTO JSF
13.
Source Packages: o cdigo Java propriamente dito, nomeadamente os managed beans. Os managed beans so o
controller em MVC, ou seja, o backing code (ou seja API)
disponibilizada aos componentes presentes nos Facelets. Por
O prximo artigo ensinar a criar um managed bean e a fazer uso do mesmo num Facelet.
AUTOR
Escrito por Lus Soares
Formado em Engenharia Informtica e de Computadores no Instituto Superior Tcnico (Licenciatura e Mestrado). Sou web
developer, _tendo j colaborado em projetos de telecomunicaes e dos _media. Gosto de linguagens de alto nvel, de reutilizar cdigo, de refactoring para simplificar. Gosto de ensinar. Escrevi um livro sobre jQuery (goo.gl/nw2Zb).
Os meus contactos esto em luissoares.com, para qualquer dvida sobre o artigo ou outra informao.
11
A PROGRAMAR
Aplicao de Licenas de Utilizador no SharePoint 2013
De entre as vrias novas funcionalidades includas no SharePoint 2013, h uma que injustamente me passou despercebida at recentemente: User License Enforcement
(Aplicao de Licenas de Utilizador). Digo injustamente
porque uma funcionalidade que j fazia falta h muito tempo e acho que merece mais ateno do que tem recebido.
Add-SPUserLicenseMapping
Remove-SPUserLicenseMapping
Para o ativar, basta executar o cmdlet EnableSPUserLicensing. Para o desativar, basta executar o cmdlet
Disable-SPUserLicensing. Nenhum dos cmdlets requer
parmetros ou retornar (ver Figura 2).
O SharePoint 2013 resolve esta questo com a nova capacidade de Aplicao de Licenas de Utilizador (ou User License Enforcement) que permite mapear licenas com utilizadores especficos ou com grupos de Active Directory. Quando o
User License Enforcement est ativo, os utilizadores conseguem aceder apenas s funcionalidades includas na sua
licena, as restantes sero bloqueadas. Quando est inativo,
que a opo por omisso, o SharePoint funciona como nas
verses anteriores.
A gesto do User License Enforcement realizada exclusivamente atravs de cmdlets de PowerShell na SharePoint
2013 Management Shell. Existem oito cmdlets que so explicados em detalhe mais abaixo:
Get-SPUserLicensing
Enable-SPUserLicensing
Disable-SPUserLicensing
Get-SPUserLicense
Get-SPUserLicenseMapping
New-SPUserLicenseMapping
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).
Enterprise
Standard
Project
OfficeWebAppsEdit
Duet
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.
13
A PROGRAMAR
APLICAO DE LICENAS DE UTILIZADOR NO SHAREPOINT
Para listar os mapeamentos configurados para uma web application especfica, basta adicionar o parmetro Web Application com o respetivo endereo URL.
Remover Mapeamentos de Licenas de Utilizador
Notas Adicionais
H algumas notas adicionais que me parece importante lembrar:
Quando acedida uma pgina com web parts que requerem uma licena especfica (por exemplo a Excel
Viewer Web Part ou InfoPath Form Viewer);
Um utilizador sem a licena exigida no ver os componentes aos quais no tem acesso (web parts e site templates); ou
AUTOR
Escrito por Andr Vala
Licenciado e Mestre em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico, actualmente consultor snior na |create|it| e co-fundador da Comunidade Portuguesa de SharePoint. Autor do blog http://bit.ly/WxtVLz,
trabalha com SharePoint desde 2006, altura em que surgiu a primeira verso beta do SharePoint 2007. Tem participado
em vrios projectos nacionais e internacionais sobre SharePoint, e participa frequentemente como orador em eventos da
Microsoft relacionados com o mesmo tema.
14
A PROGRAMAR
Funes Annimas
Neste artigo vamos falar de funes annimas, da sua histria,
a sua usabilidade e ainda mostrar dois exemplos de implementao. Um ser em Python, enquanto o segundo ser em JavaScript, ou seja, mais orientado para o contexto Web. Mas
antes de falarmos em funes annimas vamos primeiro refletir
sobre o que uma funo, que algo, ligeiramente, complicado de explicar a um leigo em programao.
outras estruturas semelhantes, tal como o map, filter e reduce. Para tornar mais claro esta informao segue em baixo a
respresentao de duas funes, uma annima e outra no.
A verso utilizada do Python foi a 2.7.
def fib_normal(N):
return N if N<2 else fibs(N-1)+fibs(N-2)
No presente artigo, vamos trat-las por funes annimas, mas so tambm conhecidas por funes lambda, por
terem sido criadas a partir do trabalho de Alonzo Church enquanto desenvolvia o clculo lambda. Elas so tpicas de linguagens funcionais, como o Haskell, Lisp, Ocaml, entre outras.
Com o passar dos anos, outras linguagens arranjaram mecanismos de implementar estas funes como por exemplo C#,
JavaScript, Python ou ainda Ruby.
Coloca-se uma nova questo: se estamos felizes com as funes comuns e parecem funcionar to bem, porque devemos
usar funes annimas? E quando devemos us-las? Dependendo da linguagem com que estamos habituados a programar, j deve ter surgido aquela situao em que o parmetro
de uma funo outra funo. Aqui teriamos de declarar uma
funo no incio ou no fim do bloco de cdigo para ser usada
uma nica vez. Com as funes annimas, e caso a linguagem
suporte closure ganhamos uma maior simplicidade no cdigo,
escrevendo estas funes estrategicamente colocadas onde
so usadas. So tambm muito utilizadas na tcnica de Currying, para transformar funes de mltiplos parmetros numa
cadeia de funes, onde apenas passado um de cada vez.
Posto tudo isto, e como cada caso um caso, vamos meter
mos obra, primeiro com Python e depois com JavaScript,
como j havia sido referido.
Em Python, ao contrrio de JavaScript, o uso de funes annimas assegurado atravs da palavra reservada lambda,
baseando-se no nome original dado a este tipo de funes, tal
como descrito em cima. Este tipo de funes podem ser definidas em qualquer local do cdigo e, como j referido anteriormente, sem um identificador respetivo. So muito utilizadas
como complemento s funes de manuseamento de listas e
15
print fib_normal(10)
2 Clculo do nmero N da sequncia de Fibonacci, utilizando funes annimas.
fib_anonima = lambda N: N if N<2 else fib_anonima
(N-1)+fib_anonima(N-2)
print fib_anonima(10)
No exemplo em cima apresentado podemos ver que em ambos os casos calculado a soma dos N primeiros elementos
da sequncia de Fibonacci. No primeiro caso apresentada
a funo fib_normal(N) que retorna essa soma, enquanto
que no segundo caso o clculo feito recorrendo declarao do lambda, que retorna essa mesma soma na varivel
fib_anonima.
Em JavaScript, no se torna muito diferente do exemplo anterior. Para declararmos uma funo em JavasScript podemos fazer de duas formas:
1 Declarando uma funo com o seu nome, neste
caso myFunction:
function myFunction() {
alert("Hello PaP!");
}
2 Ou ainda, usando o operador de funo, tornando assim
a funo annima:
var myFunction = function () {
alert("Hello PaP!");
}
Repare-se que neste ltimo caso a funo no tem nome.
A grande diferena entre estes dois tipos, em termos de execuo em JavaScript, que as funes declaradas normalmente so movidas para o incio do cdigo e so criadas
desde que o programa comea a execuo. As que so escritas com o operador apenas so geradas quando chega o
momento de as utilizar.
Este mecanismo permite uma diminuio do tempo de compilao, no entanto no permite a avaliao, por parte do
compilador, de potenciais erros de execuo que possam
ocorrer durante a execuo do programa.
A PROGRAMAR
FUNES ANNIMAS
Vamor ver outro exemplo em que as funes annimas so
habitualmente usadas em JavaScript:
var myFunction;
if (x != 0) {
myFunction = function () {
alert("!=0")
}
}
else {
myFunction = function () {
alert("= 0")
}
}
Neste exemplo, podemos ver que as instrues a desempenhar pela funo representada pela varivel myFunction sero
diferentes consoante o valor de x.
Concluso:
As funes annimas devem ser usadas conforme a experincia, a linguagem de desenvolvimento e o objetivo do programador, tendo em conta que, normalmente, as solues
desenvolvidas com recurso a estas so mais elegantes e
fceis de ler. Mais ainda podemos concluir que com o aparecimento do paradigma funcional nas linguagens de programao possvel utilizar todo potencial deste tipo de funes.
Agora
imagine
que tem uma funcao,
mas que esse identifica
- dor nao existia. Esta
seria uma funcao que
nao tinha de estar ligada a qualquer identificador. Aqui temos o
principio basico das
funcoes anonimas.
Esperamos ter agradado os leitores.
AUTOR
Escrito por Cristiano Ramos
AUTOR
Escrito por Joo Silva
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.
Operator uma palavra reservada comummente no reconhecida pela esmagadora maioria dos editores de texto e
IDE's (embora muitos nos permitam definir palavras reservadas adicionais). No entanto, uma palavra reservada que
equivale essencialmente function ou procedure. Neste
caso, indica ao programa que vai haver um overload de um
operador pr-existente, representado por simbolo.
Entre parntesis indicamos os operandos, tal como o fazemos com os argumentos de uma funo (afinal de contas,
um operador uma funo com dois argumentos). De seguida, vem algo que difere da sintaxe comum: aparece um novo
identificador. Em Pascal (Standard e Free Pascal), o resultado de uma funo atribudo a uma varivel local com nome
igual ao da prpria funo; no caso de um operador no
existe um identificador alfanumrico mas sim um smbolo (o
operador), o qual um nome vlido para uma varivel, e ao
qual no pode ser atribudo um valor. Portanto, temos de
criar o identificador que represente o resultado. Especificamos o seu nome, por conseguinte, aps a declarao dos
operandos, seguido do tipo de dados de output.
Dentro destes operadores, muitos deles podem ser overloaded, permitindo ao programador defini-los para novos tipos
de operandos, e com comportamentos diferentes do habitual, aumentando assim a expressividade do cdigo. A isto
chamamos operator overloading, objecto de estudo do
presente artigo.
Todo o cdigo do artigo foi compilado com Free Pascal Compiler, verso 2.6.2, em ambiente GNU/Linux (Ubuntu 12.04
LTS).
17
A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
Deste modo, temos de criar um novo tipo de dados de modo a
que possamos fornecer este tipo na forma de um identificador.
type TIntegerArray = array of integer;
A partir do momento em que temos este overload definido,
podemos utilizar o operador * para multiplicar uma varivel do
tipo integer por outra do tipo TIntegerArray. No entanto, foi
referido que um ficava direita e outro esquerda. Vejamos o
que acontece se tentarmos compilar o seguinte cdigo (o overload do operador est na unit operover (de Operator Overloading) uma unit prpria onde iremos colocar o cdigo).
{$mode objfpc}
program artigo44;
uses operover;
list2 := list1 * 2;
for i := Low(list1) to High(list1) do
writeln('2 * ', list1[i] : 2, ' = ',
list2[i] : 2);
end.
O Free Pascal vai indicar o seguinte:
artigo44.pas(16,20) Error: Operator is not overloaded: "TIntegerArray" * "ShortInt"
Ns definimos que o primeiro operando integer, e ns fornecemos-lhe um TIntegerArray. Isto acontece porque o overloading de operadores sensvel ordem pela qual recebe os
operandos. Vamos, portanto, criar um segundo overload que
define a ordem inversa dos operandos:
operator * (list : TIntegerArray; n : integer)
res : TIntegerArray;
begin
res := n * list;
end;
Desta vez, a varivel do tipo TIntegerArray aparece esquerda
do operador, e a integer direita. Para implementar este overload recorremos ao overload definido anteriormente. A partir
deste momento, podemos multiplicar um integer por um TIntegerArray em qualquer ordem. Vamos testar o cdigo anterior, e
consideremos que list1 tem os valores {2, 7, 5, 9, 4}; este o
output do programa:
2
7
5
9
4
Como se pode verificar, em tudo igual ao overload do operador *. De seguida iremos implementar o overload do operador de subtraco -. No entanto, para aumentar a versatilidade dos operadores e tornar, por ltimo, esta implementao mais compacta, iremos primeiro implementar o menos
unrio (o operador - que indica um valor negativo, como 4):
begin
(* Cdigo que adiciona valores a list1 *)
*
*
*
*
*
2
2
2
2
2
= 4
= 14
= 10
= 18
= 8
Como podemos verificar, list2 possui os valores de list1 multiplicados por 2 e pela ordem original. O nosso operador overloaded funcionou. Podemos fazer o mesmo para a soma. No
entanto, a subtraco e a diviso no tm a propriedade comutativa, ou seja, a-b no o mesmo que b-a, e a/b no o mes-
18
A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
operator < (list1, list2 : TIntegerArray)
res : boolean;
begin
res := list2 > list1;
end;
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:
O tipo de dados set implica que os dados fiquem automaticamente por ordem, independentemente da ordem em que os
declaramos no cdigo. Isto ser visto de seguida.
19
A PROGRAMAR
PASCAL - OPERATOR OVERLOADING
Concluso
Consideremos a implementao de todos estes overloads numa unit denominada operover, tal como foi referido ao longo do
artigo. Vamos test-la com o seguinte programa:
{$mode objfpc}
program artigo44;
uses operover;
var list1 : TIntegerArray = nil;
list2 : TIntegerArray = nil;
i : integer;
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.
begin
list1 := [2,7,5,9,4];
list2 := -list1 * 2;
for i := Low(list1) to High(list1) do
writeln('2 * ', -list1[i]:2, ' = ', list2
[i]:3);
2
2
2
2
2
-4
-8
-10
-14
-18
list2? TRUE
list2? FALSE
list2? TRUE
Com a capacidade
de overloading dos
operadores
torna-se
possivel
reduzir
o
ruido do codigo
AUTOR
Escrito por Igor Nunes
Curioso na rea da tecnologia e em especial da programao, tem uma saudvel relao com o Object Pascal e conhecedor das bases de outras linguagens de programao, como Haskell, C, Python e VB.NET. No P@P, membro da Wiki Team
e Moderador Global.
20
A PROGRAMAR
Quero fazer uma aplicao simples! E agora? Por onde comeo?
No artigo da edio anterior falamos em rvores de vantagem na linguagem C, em que utilizamos como exemplo prtico um stand de automveis. Aproveitando o mote do stand
de automveis, nesta edio trago-vos um programa simples
acerca da gesto dessas viaturas.
Do No-IP, que para este artigo foi utilizado a sua verso Free que pode ser obtido em (http://
www.noip.com/)
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
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
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.
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.
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).
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.
Agora que j temos a base de dados precisamos de lhe adicionar as tabelas correspondentes.
Ilustrao 14 - Menu de entrada SQL Server
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.
Neste exemplo consideramos quatro tabelas, que nos permitiro guardar toda a informao dos nossos veculos.
3 Fase A aplicao
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
1.
2.
3.
4.
5.
6.
// 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.
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.
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
Depois disto efectuada a ligao nossa BD e so-nos mostradas as tabelas que compem a mesma.
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.
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
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();
MessageBox.Show("Carro Introduzido
com sucesso.");
myConnection.Close();
}
catch
{
MessageBox.Show("ERRO ao Inserir
novo carro.", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
try
{
int kms = Convert.ToInt32(linha.Cells
[2].Value.ToString());
int kmsProximaRevisao = Convert.ToInt32
(linha.Cells[3].Value.ToString());
int kmsfalta = kmsProximaRevisao - kms;
if (kmsfalta <= 2000)
{
matriculatextBox.Text = "";
kmstextBox.Text = "";
kmsProximatextBox.Text = "";
mostraCarros();
linha.DefaultCellStyle
.BackColor = Color.DeepSkyBlue;
}
}
Como o leitor pode verificar, o cdigo anlogo ao do boto
Adicionar Utilizador, com a excepo de que a informao do
Carro colocada em duas tabelas. Na tabela Carro e na tabela
KmsAnuais (em que falaremos mais frente no nosso artigo).
Voltemos agora novamente ao nosso Menu Principal. Um dos
outros botes que colocamos neste menu o boto Ver Prximos Reviso, e isto porque? No nosso exemplo para ser mais
simples visualizar neste momento temos apenas 2 carros, mas
poderamos ter muitos mais. Como seria a forma mais simples
de verificar quais os carros que tm que ir reviso num futuro
prximo? Poderamos fazer mais uma chamada BD para que
atravs de instrues SQL nos fossem mostrados os carros
cuja diferena entre os Kms Atuais e os Kms da prxima reviso fossem iguais ou inferiores a 2000 Kms. Ou j que temos
os dados da BD no datagridview podemos tambm facilmente
percorrer todas as linhas presentes nesse elemento e pintar
por exemplo, de azul todas as linhas dos veculos que estejam
dentro dessas condies, correcto?
30
}
catch {
}
}
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();
{
}
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.
31
A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
mos actualizar essa informao:
try
{
SqlConnection myConnection = new
SqlConnection();
myConnection.Open();
//Actualizar Tabela Carro - Actualizacao
SqlCommand c = new SqlCommand("UPDATE Carro
SET Kms = " + kms + " WHERE Matricula = '"
matriculalabel.Text + "'; ",
myConnection);
c.ExecuteNonQuery();
//Actualizar Tabela KmsAnuais - Kms
SqlCommand comma = new SqlCommand("UPDATE
KmsAnuais SET " + mes + " = " + difKms +
" WHERE Matricula = '" +
matriculalabel.Text + "'; ", myConnection);
comma.ExecuteNonQuery();
myConnection.Close();
MessageBox.Show("Actualizado com
sucesso.");
this.Close();
}
catch { }
}
Como o leitor pode verificar, actualizamos os valores da Tabela Carro, e os valores da tabela KmsAnuais na coluna do
ms correspondente.
No exemplo, a diferena de Kms entre os Kms Actuais e os
32
A PROGRAMAR
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
Kms Anteriores 3000 Kms e escolhemos actualizar o ms de
Janeiro, se verificarmos o interior da nossa BD, podemos ver
que o valor foi realmente actualizado com sucesso.
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.
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?
System.Windows.Forms.
DataVisualization.Charting.Series series =
this.chart1.Series.Add(seriesArray[i]);
series.Points.Add(pointsArray[i]);
}
}
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.
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.
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.
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
Utilizando os goto:
goto label:
Na programao estruturada no temos qualquer obrigao em utilizador o 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.
Neste pequeno exemplo observamos que a soluo utilizando os goto permite um codigo mais simples de visualizao.
Este tipo de tcnica esta muito presente no cdigo do kernel
do Linux. Os programadores entendem que esta a melhor
tcnica para solucionar os seus problemas.
Por sua vez Donald E. Knuth escreveu um artigo chamado Structured ProgrammingGoTo em que exemplifica as vantagens de usar goto em linguagens procedurais, como o caso de C.
Um outro exemplo clssico do uso de goto em ciclos encadeados. Como por exemplo:
Usos do Goto!
As linguagens de alto nvel atualmente possuem um
sistema de garbage collection que facilitem a vida ao
programador que no tem que perder tempo a se preocupar em dealocar o espao de memoria que foi usado. O goto muito til neste casos pois simplifica muito
o cdigo na leitura e elimina a necessidade de criao
de funes para esse efeito o que implicaria possveis
problemas com scope. tambm utilizado o goto em
casos de error checking. Em outras linguagens de alto
nvel a prprio linguagem disponibiliza mecanismos
que permite efetuar este tipo de ao como
try...exception(excepo), no caso do python. A titulo
de curiosidade a implementao do return, break e
continue utiliza o goto. Se analisar mos o cdigo gerado pelo compilador veramos que no h diferenas
entre o goto e um if, e sem prejuzos de memoria.
36
A PROGRAMAR
DESBRAVANDO O GOTO!
Concluso!
Como podemos verificar com a utilizao do goto podemos simplificar bastante o nosso cdigo.
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
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.
#const
Por exemplo:
#define Pin 10
void setup()
{
pinMode(Pin, OUTPUT);
}
Pegando do exemplo dado anteriormente e usando o modificador #const o cdigo ficaria assim:
#const int Pin = 10;
void setup()
{
pinMode(Pin, OUTPUT);
}
void loop()
{
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
}
void loop()
{
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
}
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
38
A PROGRAMAR
ARDUINO: CONST VS #DEFINE
Usando #define:
Usando #const:
AVR-SIZE
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
data Representa a memria RAM esttica realmente usada pelas variveis inicializadas pelo programa
void loop()
39
A PROGRAMAR
ARDUINO: CONST VS #DEFINE
que o compilador avr-gcc o suficiente inteligente para manter uma varivel precedida pelo modificador #const fora da
memria RAM esttica do programa a sua utilizao poder
ser uma vantagem. No entanto a substituio da varivel
precedida pelo modificador #define cumpre igualmente a sua
funo mas est mais propcia ocorrncia de erros de codificao.
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
Cdigo com Erro:
#define Pin 10
void setup()
{
pinMode(3;, OUTPUT);
}
void loop()
{
digitalWrite(Pin, HIGH);
delay(500);
digitalWrite(Pin, LOW);
delay(500);
}
Quando tentssemos compilar o pedao de cdigo com erro
obteramos um erro do tipo sketch_feb08a:6: error: expected
`;' before ')' token por parte do compilador.
De
uma
forma
simples podemos dizer
que o #define e uma directiva
do
preprocessador do compilador que [...] torna
mais simples a definicao de uma variavel
estatica [...]
Concluso:
A principal concluso que podemos retirar de que desde
AUTOR
Escrito por Nuno Santos
Curioso e autodidacta com uma grande paixo pela programao e robtica, frequnta o curso de Engenharia Informtica na
UTAD alimentando o sonho de ainda vir a ser um bom Engenheiro Informtico. Estudante, Blogger, e moderador no frum
Lusorobtica so algumas das suas actividades. Os seus projectos podem ser encontrados em: http://
omundodaprogramacao.com/
40
A PROGRAMAR
Mitos do jQuery
programador
deve escolher aquela
que mais se adequa as
necessidades
(consoante
os
browsers e plataformas
a suportar, as funcionalidades a desenvolver, etc.)
[]uma biblioteca
apenas junta diversas
funcoes e outros elementos
reutilizaveis
[]
Mito #2: O jQuery serve para construir interfaces
41
A PROGRAMAR
MITO #1: O JQUERY SUBSTITUI JAVASCRIPT
O mximo que se pode dizer que bibliotecas JavaScript
promovem a escrita de cdigo fcil de ler e modificar, oferecendo capacidades avanadas (ex.: classes), com isso aumentando muito a velocidade de desenvolvimento no geral.
Em concluso, no se deve forar o uso de nenhuma biblioteca. Deve haver argumentos que justifiquem o seu uso.
Bons argumentos so o site/webapp adquirir alguma complexidade ou haver diversos browsers e/ou plataformas a suportar. Nessa altura, o jQuery uma boa aposta, mas h que
considerar outras possibilidades.
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
class X
{
static int M
(Func<int?, byte> x, object y) { return 1; }
static int M
(Func<X, byte> x, string y) { return 2; }
unchecked
{
Console.WriteLine(a);
Console.WriteLine(M(X => (byte)
X.Value, null));
}
}
A parte manhosa perceber o que o nome-simples X significa como parte de X.Value dentro da expresso lambda. Aqui
a parte importante da especificao o comeo da seo
7.6.2 (nomes simples):
}
Qual o resultado da sua execuo?
Resultado
O resultado da execuo :
1
2
(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.
Determina-se que sobrecargas (overloads) ao aplicveis (isto , quais fazem sentido em termos dos
argumentos fornecidos e os correspondentes parmetros)
No acesso a um membro da forma E.I, se E um nico identificador, e o significado de E como nome-simples (7.6.2)
uma constante, campo, propriedade, varivel local ou parmetro com o mesmo tipo que o significado de E como nomedetipo (3.8), ento ambos os significados possveis
de E so permitidos. Os dois significados possveis de E.I
nunca so ambguos, uma vez que I deve necessariamente
ser um membro do tipo E em ambos os casos. Por outras
45
C#
C# - RESOLUO DE SOBREARGA DE MTODO
palavras, a regra apenas permite acesso aos membros estticos de E onde, caso contrrio, um erro de compilao teria
ocorrido.
Trata-se
apenas
de uma chamada a um
metodo usando uma
expressao
lambda,
usando resolucao de
sobrecarga de metodo
(method overload resolution) para determinar
qual a sobrecarga a
chamara e o tipo de inferencia para determinar o tipo de argumentos para o metodo.
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
Anlises
Gesto de Sistemas e Redes em Linux - 3 Edio
JavaScript (2. Edio Atualizada)
Review
Gesto de Sistemas e Redes em Linux - 3 Edio
servidores distribudos entre duas redes privadas e uma
DMZ. Como sistema operativo para os servidores presentes
nesta topologia de rede, escolhido o CentOS do projeto
open-source derivado dos produtos da empresa RedHat.
Aqui, acrescenta-se que a verso do sistema operativo utilizada nesta edio a 6.4 (verso mais atual do CentOS
data de publicao) e que entretanto, em dezembro de 2013,
foi lanada a verso 6.5. Mesmo assim, pela anlise rpida
s Major Changes desta ltima verso, de presumir os
exemplos de configuraes apresentados no se alterem. Da
mesma forma, se o leitor pretender aplicar os contedos
apresentados a outras distribuies Linux como o Debian,
Ubuntu, Fedora (ou outras), este manual tambm poder til,
uma vez que os conceitos abordados podem ser transpostos
para estas distribuies. Em relao s atividades apresentadas, considera-se que estas abrangem um conjunto alargado de tecnologias, servios e protocolos de rede, sobre as
quais so explicadas as configuraes bsicas e, nalguns
casos, configuraes mais avanadas que se enquadram no
cenrio inicial. Verifica-se tambm que a maior parte destas
atividades so estanques, ou seja, permite que o leitor possa escolher os servios que pretende configurar, sem a obrigatoriedade de seguir uma sequncia predefinida, sendo
que, nos casos em que tal exigido, indicado pelo autor.
Alm disso, para profissionais que j esto nas reas de
administrao de redes/sistemas podem ser necessrias
configuraes mais especficas que podem exigir que se
faa uma leitura adicional. Para isto, consideram-se teis as
referncias apresentadas no final de cada captulo, que
apontam para links onde so encontrados tutoriais que podem servir para extrapolar o caso de estudo apresentado.
de referir igualmente que no captulo onde so referidas as
ferramentas de monitorizao e gesto de problemas, poderse-iam incluir tambm outras plataformas, como exemplo
do Webmin (http://www.webmin.com/) e o Cacti (http://
www.cacti.net/) que permitem integrar, configurar e monitorizar mltiplos servios e podem constituir-se como um auxlio
importante na rea da gesto de sistemas e redes.
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)
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.
Pginas: 208
ISBN: 978-972-722-785-3
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
Prepare as pginas
Introduo
52
COMUNIDADE NETPONTO
http://netponto.org
// 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;
namespace FacebookUtils
{
public class FacebookClient
{
private static FacebookClient instance;
private string accessToken;
}
// FacebookUtils/ResponseData.cs
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
namespace FacebookUtils
{
public class ResponseData
{
public string id { get; set; }
53
COMUNIDADE NETPONTO
http://netponto.org
public ConnectPage()
{
InitializeComponent();
// Clear Cookie to remove current
//logged in user data
mWebBrowser.ClearCookiesAsync();
var matches =
QueryStringRegex.Matches(uri);
for (var i = 0; i < matches.Count;
i++)
{
var match = matches[i];
yield return new KeyValuePair
<string, string>(match.Groups["name"].Value,
match.Groups["value"].Value);
}
}
// Go to Login url
mWebBrowser.Source = new Uri
(FacebookClient.Instance.GetLoginUrl());
}
Agora o que preciso verificar o url atual do "WebBrowser"
usando o evento "Navigated". Se o processo de "logging" foi
realizado com sucesso o url final ser "http://
www.facebook.com/connect/login_success.html" ou "https://
www.facebook.com/connect/login_success.html". Uma vez
obtido este resultado, necessrio extrair o parmetro "code"
atravs de "query string" para assim procedermos ao prximo
passo.
}
// Tools/KeyValuePairUtils.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tools
{
public static class KeyValuePairUtils
{
public static TValue GetValue<TKey,
TValue>(this IEnumerable<KeyValuePair<TKey,
TValue>> pairs, TKey key)
{
foreach (KeyValuePair<TKey, TValue>
pair in pairs)
{
if (key.Equals(pair.Key))
return pair.Value;
}
if (uri.StartsWith("https://www.facebook.com/
connect/login_success.html")
|| uri.StartsWith("
http://www.facebook.com/connect/
login_success.html"))
{
// Remove junk text added by facebook from url
if (uri.EndsWith("#_=_"))
uri = uri.Substring(0, uri.Length - 4);
String queryString = e.Uri.Query.ToString();
54
COMUNIDADE NETPONTO
http://netponto.org
if (e.Error != null)
{
MessageBox.Show("Error Occurred: " +
e.Error.Message);
return;
}
System.Diagnostics.Debug.WriteLine(e.Result);
}
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
FacebookClient.Instance.PostMessageOnWall
(TextToPost, new UploadStringCompletedEventHandler
(PostMessageOnWallCompleted));
PostMessageOnWall um mtodo assncrono preciso lidar
com o resultado depois de tudo. De notar que o
"access_token" tem uma data limite. Caso expira, preciso
trocar por um novo "access_token" antes de fazer algo.
void PostMessageOnWallCompleted(object sender,
UploadStringCompletedEventArgs e)
{
if (e.Cancelled)
return;
55
// Save access_token
FacebookClient.Instance.AccessToken =
accessToken;
FacebookClient.Instance.PostMessageOnWall
(TextToPost, new
UploadStringCompletedEventHandler
(PostMessageOnWallCompleted));
COMUNIDADE NETPONTO
http://netponto.org
AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica Especialidade em Computao, pela Universidade de Coimbra e Microsoft Certified Profissional Developer. Atualmente o seu foco de desenvolvimento incide em Windows Phone e Windows 8 Store Apps. O seu Blog
www.saramgsilva.com e o twitter @saramgsilva.
56
No Code
O Impacto das Novas Tecnologias nas Crianas com Necessidades Educativas Especiais
No Code
O Impacto das Novas Tecnologias
nas Crianas com Necessidades Educativas Especiais
estreitar a interao da criana com os dispositivos
electrnicos.
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).
58
No Code
prprias mos para jogar. Quando a mobilidade da criana
est afectada, esta possibilidade pode ser uma mais-valia
pois por vezes torna-se difcil o manuseamento do ponteiro
do rato no ecr de um computador.
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.
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
e muito mais em
www.revista-programar.info