You are on page 1of 44

e ditorial

índice

3 notícias
4 te m a de capa
11 a program ar
24 s e gurança
28 te cnol ogias
31 tutorial
37 gnu/l inux
40 anál is e s
41 inte rne t
42 bl ue s cre e n
43 com unidade

e q u ipa PR O G R A M A R

adm inis tração


Rui M aia
D avid Pintas s il
go

coorde nador
Um ano, s e is e diçõe s
S érg io S antos
Es ta s e xta e dição m arca o finaldo prim e iro ano da Re vis ta
coorde nador adjunto PRO G RAM AR. Para nós trata-s e de um fe ito, para al ém de te rm os
M ig ue lPais cons e guido e ditar s e is e diçõe s , o facto de o proje cto te r
cre s cido de e dição para e dição, com m ais e m e l h ore s artigos ,
re dacção m ais participante s e , principal m e nte , m ais l
e itore s . M uitas ve ze s ,
M igue lW ah non ne s te tipo de proje cto, o m ais difícilnão é re unir um conjunto de
Fábio Corre ia artigos e form ar um a re vis ta, é cons e guir m ante r o proje cto
D iogo Al ve s
João M atos activo e , s e pos s íve l
, e m e vol
ução, na dire cção dos l e itore s .
Fábio Pe dros a
Pe dro Ve rrum e Ne s ta e dição contam os com um te m a de capa m ais e xte ns o q ue
Luís Re nte o norm al , vantage ns de s e r um a re vis ta onl ine , s e m
Tiago Sal gado re s pons abil idade s para com e ditoras . Es pe ram os q ue o te m a s e ja
Joe lRam os
do vos s o agrado e , cas o s e ja de s conh e cido, o q ue de ve rá
col
aboradore s aconte ce r ainda para m uitos , q ue abram a m e nte e
Rui G onçal ve s e xpe rim e nte m um a nova m ane ira de ve r a program ação, ne m
D anie lCorre ia q ue s e ja pe l os frutos q ue de l a pode rão e xtrair futuram e nte . Te m os
Jos é O l
ive ria tam bém um a nova s e cção, "Se gurança", q ue s urge na
continuação do trabal h o e fe ctuado na te rce ira e dição da re vis ta.
contacto
re vis taprog ram ar
Ne s te m om e nto cons e guim os atingir um a varie dade
Sérgio Santos

@ portug al -a-prog ram ar.org


cons ide ráve l e m uito apre ciada de ntro do nos s o grupo de
w e bs ite re dactore s e continuam os à procura de novos te m as para
w w w .re vis ta-prog ram ar.info abordar, novas s e cçõe s para acre s ce ntar e novas ide ias para
apl icar, e todos os novos m e m bros q ue s e juntam a nós traze m
s e m pre novas opiniõe s ao grupo.

<2 >
notícias

O s principiais aconte cim e ntos


ógicos de 2006
te cnol
2006 ch e gou ao fim e a re vis ta Program ar D e pois de m uitas prom e s s as , a Sun
re corda as novidade s m ais im portante s do finalm e nte abriu o código do Java. As
ano q ue agora te rm inou. pl ataform as J2SE e J2M E e ncontram -s e
agora s ob a lice nça G PL, ace s s íve is a todos .
O ano com e çou com um a re vol ução na
Appl e . D e pois de um a década a us ar D e pois de s uce s s ivos adiam e ntos , o Vis ta foi
Pow e rPC, a e m pre s a de Ste ve Jobs re s ol ve u final m e nte lançado. Com um vis ualm uito
m udar para a arq uite ctura da Inte l . Ape s ar atractivo, o novo SO da M icros oft trouxe
do de s e m pe nh o dos novos m acs te r tam bém novidade s a níve l da s ua
mel h orado s ignificativam e nte , e s te prim e iro organização, do s is te m a de fich e iros e da
ano fica m arcado por al guns probl e m as s e gurança. O utra novidade foi a
de s obre aq ue cim e nto do proce s s ador. Em capacidade de s e adaptar ao h ardw are
Abrila Appl e apre s e ntou tam bém o Boot da m áq uina e m q ue é ins tal ado,
Cam p, um s oftw are q ue pe rm itiu aos novos pe rm itindo de s ta form a q ue tam bém pos s a
com putadore s corre re m nativam e nte s e r us ado e m PC's com m e nore s re curs os
W indow s . de h ardw are .

Na áre a dos proce s s adore s foi tam bém um


ano agitado, inicial m e nte com a AM D a
cons e guir am e açar o dom ínio da Inte l ,
s obre tudo nos s e rvidore s com os O pte ron. A
Inte l re s ponde u com o l ançam e nto dos
Core 2 D uo, q ue l h e pe rm itiu re gre s s ar à
lide rança no pode r de proce s s am e nto.
Tive m os tam bém a pas s age m da
te cnol ogia de 9 0 nm para 65, prim e iro por
parte da Inte l , e no fim do ano pe l a AM D . Em 2006 as s is tim os ao l ançam e nto de duas
novas cons ol as , a W ii e a PS3. Talcom o
No q ue diz re s pe ito aos brow s e rs , s urgiram s e ria de e s pe rar, a ve ndas da PS3 s ó não
igual m e nte novidade s , prim e iro com o foram m aiore s por fal ta de cons ol as nas
lançam e nto do IE 7 da M icros oft, de pois lojas . Com um proce s s ador re vol ucionário e
com a Fundação M ozil la a l ançar o Fire fox com e xce l e nte s gráficos , o único problema
2.0. Es tas novas ve rs õe s trouxe ram várias foi m e s m o o e l e vado pre ço. Já a W ii
novidade s , das q uais s e de s taca o fil tro anti- apos tou num a m aior jogabil idade , com o
ph is h ing, de notando a cada ve z m aior s e u com ando inovador, o W ii-m ote . Tal
pre ocupação com a s e gurança por parte facto, juntam e nte com o pre ço ace s s íve l
dos produtore s de s oftw are . da cons ol a contribuiu para o s e u e norm e
s uce s s o.

2006 foi igual m e nte o ano da afirm ação


da w e b, com o e norm e s uce s s o de s ite s
com o o YouTube , o M y Space , a W ik ipe dia,
e tc. e a prol ife ração dos bl ogs . A confirm ar
is to ve io a e s col h a da re vis ta Tim e para a
pe rs onal idade do ano: todos aq ue l e s q ue
contribuiram para e s ta nova s ocie dade do
conh e cim e nto.

<3 >
te m a de capa

Com o e m q ual q ue r linguage m de


program ação, e m Sch e m e e xis te m vários
tipos de dados . Es te s vão de s de e xpre s s õe s
atóm icas , a núm e ros s ím bolos e val ore s
bool e anos , a l
is tas e a ve ctore s . Exe m pl os :

(define a 5)
(define b #t)
(define c ‘(1 2 3))
(define d (+ 1 2 3 a))

Ligado ao prim itivis m o da linguage m , e xis te


o conce ito do cál cul o das funçõe s
lam bda. Q ue não s ão m ais do q ue um

Sch e m e proce dim e nto anónim o. Es te conce ito é


m uito im portante para as s ociar nom e s a
proce dim e ntos . Um e xe m plo:

Sch e m e é um a l inguage m de (lambda (x) (* 2 x))


program ação q ue s uporta o us o de
m últiplos paradigm as , e m particular,
a program ação im pe rativa e Es ta e xpre s s ão l
am bda, s e e xe cutada,
funcional . de vol ve ria um proce dim e nto m as q ue não
fazia nada pois não l h e é pas s ado um
Foi de s e nvol vida, original
m e nte , por G uy L. argum e nto de inputà variáve l‘x’. No
Ste e l
e e por G e ral d Jay Sus s m an por vol ta e ntanto, s e fizés s e m os :
dos anos 70. É um a l inguage m q ue de riva
do Lis p e , portanto, o s e u dial e cto e a > ( (lambda (x) (* 2 x)) 5)
form a s intáctica s ão idênticas . A util ização 10
da program ação funcional , e m ve z da
O bte ríam os o val or 10 q ue é o val or obtido
program ação im pe rativa (de s truição de
ao pas s ar o argum e nto de input 5 ao ‘x’ e
variáve is ), torna a s ua apre ndizage m m ais
de o proce dim e nto anónim o l am bda o
clara, um a ve z q ue nada é m odificado.
ope rar cons oante o s e u corpo, onde , ne s te
Re ce be m -s e obje ctos e re tornam -s e
cas o é m ul tiplicar o ‘x’ por 2. No e ntanto,
obje ctos .
s e ria m ais inte re s s ante pode r ch am ar um
nom e a e s te proce dim e nto para não
Por s e r um a l inguage m bas tante intuitiva e
e s tarm os cons tante m e nte a invocar e s te
de s im ple s com pre e ns ão, é pos s íve l
lam bda anónim o de cada ve z q ue
apre nde r-s e a program ar e m Sch e m e
q ue re m os dupl icar um re al ‘x’. Para is s o
com o prim e ira l inguage m de program ação.
faze m os :
É um a l inguage m m uito m inim al is ta q uanto
às s uas funçõe s de bas e . No e ntanto,
(define duplica
graças à criação de bibl iote cas e (lambda (x) (* 2 x)))
de pe nde ndo do q ue s e q ue r faze r ou
e xpl
orar na l inguage m , é pos s íve lcriare m -
s e program as , apl icaçõe s w e b, jogos , ou E para o e xe cutarm os faze m os :
outro tipo de s oftw are com o e m q ual q ue r
outra l
inguage m de al to níve l > (duplica 5)
nom e adam e nte C, C+ + ou Java. 10

<4 >
te m a de capa

Um a ve z q ue o nom e da função “dupl ica”


e s tá as s ociado a um proce dim e nto
lam bda q ue por s ua ve z e s tá à e s pe ra de
um val or ‘x’ para o ope rar no s e u corpo.

Se be m re pararam , o dial e cto do Sch e m e


pode pare ce r um tanto e s tranh o um a ve z
q ue e s tam os h abituados a e s cre ve r, e m
m ate m ática, os ope radore s no m e io dos
ope randos : (5 + 3).

E portanto, um outro ponto forte do as s ociar às ope raçõe s prim itivas de s om ar


Sch e m e , q ue já ve m do Lis p, é o facto de e m ul tipl
icar re s pe ctivam e nte . Para s e
m inim izar a am biguidade da criação de pe rce be r, pas s e m os aos 2 argum e ntos do
funçõe s e da s ua aval iação. Por e xe m plo, lam bda, dois argum e ntos de input:
e m m ate m ática te m os e num e ras m ane iras
de re pre s e ntar um a função, s e ja e l a um a > ((lambda (+ *) (+ 5 (* 2 3) 4))* +)
função factorialn!, pol inom ialx2+ 3x, ou 100
m e s m o um a função ge nérica f(x,y,z).
Contudo, ainda h á m ais confus ão porq ue Um a ve z q ue trocám os os nom e s das
e xis te m prioridade s de ce rtas ope raçõe s , ope raçõe s q ue vão s e r ch am ados no corpo
com o a prioridade da m ul tipl
icação do l am bda, as ope raçõe s de s om ar
pe rante a s om a. O Sch e m e torna a cois a pas s am a s e r m ul tipl
icaçõe s e as ope raçõe s
bas tante m ais s im ple s e portanto te m a s ua de m ul tiplicar pas s am a s e r s om as . Com o
s intaxe da s e guinte form a (função vêe m , o pode r de as s ociação de nom e s e
argum e ntos *). No início da e xpre s s ão a s e r de pas s age m de argum e ntos no Sch e m e é
aval iada ve m o nom e da função m uito inte re s s ante e ve rs átil
.
(ope rador) e s e guido de s s e nom e ve m um
conjunto de argum e ntos a s e re m ope rados Um a ve z m ais , com o e m q ual q ue r
(ope randos ). linguage m q ue s e pre ze , e m Sch e m e
e xis te m e xpre s s õe s condicionais . A
Exe m pl
os : utilização de val ore s e e xpre s s õe s l ógicas
para condicionarm os al goritm os , util izando
(* 2 x) os e l e m e ntos l
ógicos > , <, =, > =, <=, not,
(+ 5 3) and e or.
(* 2 (+ 5 3) 9)
São cas o dis s o o “if” e o “cond”. A s intaxe
E utilizando a as s ociação de e xpre s s õe s a
do “if” é:
nom e s , pode ríam os as s ociar q ual
q ue r um a
e xpre s s ão das acim a m e ncionadas a um (if (condição)
nom e q ue s e tornava, por as s im dize r, um a (expressão1 se condição é #t)
variáve l . (expressão2 se condição é #f))

D e m ons trando, um pouco m e l


h or, o pode r Exe m pl
o:
da program ação funcional , fica o
e xe m pl
o: (define a 5)
(define b (+ a 1))
(lambda (+ *) (+ 5 (* 2 3) 4))
> (if(> a b)
Es te proce dim e nto anónim o fica à e s pe ra a
da pas s age m de dois argum e ntos cujos b)
nom e s s ão ‘+ ’ e ‘*’ e h á a te ntação de os 6

<5 >
te m a de capa

M uito s im ple s . No e ntanto, e s e q uis és s e m os A aval iação e inte rpre tação de e xpre s s õe s
com pl icar a cois a, pode ríam os pôr com o e m Sch e m e pode pare ce r confus a por não
e xpre s s ão de # t ou de # f, um outro if e s tarm os h abituados à notação no e ntanto
e ncade ado e portanto te ríam os , por ficam aq ui al guns e xe m pl os q ue pe ns o
e xe m pl o: s e re m bas tante e l
ucidativos :

> (if(> a b) > (+ 2 3)


a 5
(if(= b (+ a 1))
a > (- 7 (+ 2 3) 2)
b)) 0
5
>(* (+ (- 7 1) 3) 4)
Já s e q uis és s e m os e ncade ar novo if nas 36
s ub-e xpre s s õe s do s e gundo if, o código
com e çava a tornar-s e um pouco confus o > (> 3 4)
de pe rce be r. Para is s o, utilizam os o acim a #f
m e ncionado “cond” q ue é, portanto,
> (= 5 6)
“açúcar s intáctico” para um conjunto de ifs #f
e ncade ados com o no e xe m pl o e m cim a.
O cond re ce be um conjunto de pare s > (>= 4 3)
condição / e xpre s s ão-if-# t e aval ia-l
as por #t
orde m . Se a prim e ira de r # t, o s e u corpo é
e xe cutado, cas o contrário pas s a para a > (and (> 4 3)
s e guinte e por aí e m diante , até ch e gar a (not (< 4 3)))
um e l s e / e xpre s s ão, cas o ne nh um a das #t
e xpre s s õe s ante riore s s e ja ve rdade ira.
Conve rs ão da e xpre s s ão do e xe m pl o
ante rior dos ifs e ncade dos para o cond: Contudo, para apre nde rm os o q ue é
program ar, te re m os de te r noção de “o q ue
> (cond((> a b)a) é um al goritm o? ”. Um al goritm o é um
((= b (+ a 1))a) conjunto de ope raçõe s finitas , e xe cutadas
(else b)) de form a m e cânica num e s paço de te m po
5 finito de m odo a re al izare m um a
de te rm inada tare fa ou probl e m a.
Com o vêe m é m uito s im pl e s e dá m uito
je ito q uando q ue re m os e ncade ar várias Por e xe m plo, s e q uis és s e m os criar um
s uce s s õe s de condiçõe s . algoritm o para cal cul ar o factorialde um
núm e ro e m m ate m ática tính am os e m m e nte
q ue :

0! = 1
n! = n(n-1)!

Pas s ando is to para Sch e m e , um a form a


s im ple s de o faze r s e ria:

(define (factorial n)
(if (= n 0)
1
(* n (factorial ( - n 1)))))

<6 >
te m a de capa

Is to s e ria um a form a re curs iva de criar um Ao criarm os e s te al goritm o q ue ge ra um


al goritm o q ue cal cula o factorialde um proce s s o ite rativo, e s te te m com o
inte iro natural . caracte rís tica não de ixar ope raçõe s
pe nde nte s e l ogo, de cons um ir m e m ória
Exe m plo de inte racção com a função cons tante , onde por s ua ve z, actual iza um a
us ada: variáve lde e s tado q ue ditará o re s ul tado final .
O u s e ja, a cada ite ração, o val or do
> (factorial 4) acum ul ador é actual izado com o produto do
(* 4 (factorial 3)) ‘n’ actualda ite ração e m q ue s e vai pe l o
(* 4 (* 3 (factorial 2))) val or pas s ado ao acum ul ador na ite ração
(* 4 (* 3 (* 2 (factorial 1)))) ante rior. Se re parare m , a prim e ira ite ração é
(* 4 (* 3 (* 2 (* 1 (factorial
ch am ada com o ‘n’ s upe rior (da função
0))))) => 1
factorialoriginal ) e com o acum ul ador e m 1.
(* 4 (* 3 (* 2 (* 1 1))))
(* 4 (* 3 (* 2 1))) Is to porq ue o 1 é o e l e m e nto ne utro da
(* 4 (* 3 2)) m ul tipl
icação e as s im , não “de s trói” o val or n.
(* 4 6)
24 Pode ríam os , ainda, criar um al goritm o
pare cido com o factorialde um inte iro, m as
Se re parare m , e xis te um a fas e de e xpans ão q ue e m ve z de m ul tiplicar os ‘n’ te rm os até 0,
e de pois um a fas e de contracção. Is to de ve - os s om a. Te m os e ntão:
s e ao facto de e s te al goritm o do factorial
ge rar um proce s s o re curs ivo e s e r criado à (define (soma-ate-zero n)
cus ta de um proce dim e nto re curs ivo. (define (soma-aux n acumulador)
Em bora pare çam a m e s m a cois a, não o (if(= n 0)
s ão. Um proce s s o re curs ivo te m com o acumulador
(soma-aux (- n 1) (+ n
caracte rís tica de ixar ope raçõe s pe nde nte s
acumulador))))
no de corre r do program a e com o re fl e xo (soma-aux n 0))
dis s o, cons um ir m e m ória ao l ongo do
te m po. Um proce dim e nto re curs ivo é o acto E ao invocarm os :
de um a função s e invocar de ntro de s i > (soma-ate-zero 5)
própria “(factorial(- n 1))”. 15

Para re s ol ve rm os o probl
e m a de de ixarm os Um a ve z, m ais , o acum ul ador é actual izado
ope raçõe s pe nde nte s , pode ríam os m e l
h orar de ite ração e m ite ração com a s om a do
e s te al goritm o ge rando um proce s s o acum ul ador pas s ado da ite ração ante rior
ite rativo. com o n da actualite ração.
D e s ta ve z, o val or do acum ul ador pas s ado
(define (factorial n) à função inte rna na prim e ira ite ração é o 0
(define (fact-aux n acumulador)
(ze ro), vis to s e r o e l
e m e nto ne utro da adição.
(if(= n 0)
acumulador
(fact-aux (- n 1) Entrando noutra áre a, pode ríam os abs trair-
(* acumulador n)))) nos do conce ito de factoriale de s om a-ate -
(fact-aux n 1)) ze ro e faze rm os um proce dim e nto q ue
re ce be um a ope ração q ue ope ra inte iros e
À prim e ira vis ta, is to pode ge rar confus ão q ue cal cul
a e s ta ope ração até ao inte iro 0.
m as ve jam os por parte s . Prim e iro, foi
introduzido o conce ito de função inte rna. (define(opera-ate-zero op elem-neutro n)
A função “fact-aux” s ó é vis íve là função (define (opera-aux n acumulador)
q ue a pre ce de h ie rarq uicam e nte , a (if(= n 0)
acumulador
função “factorial ”, ou s e ja, ao níve lgl obal
(opera-aux (- n 1) (op n acumulador))))
do am bie nte , e l
a não e xis te . (opera n elem-neutro))

<7 >
te m a de capa

As s im , pode ríam os de finir o nos s o factorial


da s e guinte m ane ira:

(define (factorial n)
(opera-ate-zero * 1 n))

O u s e ja, factorialn te m o e le m e nto ne utro 1


e a ope ração q ue é re al izada até ch e gar
ao val or 0 é o produto ‘*’. A is to ch am am os
abs tracção de dados e proce dim e ntos de
orde m s upe rior.
> (cons 1 (cons 2 3)) elem
(1 . (2 . 3))
Para de finirm os o s om a-ate -ze ro e m função
do ope ra-ate -ze ro ge ne ral
izado, faríam os :
E is to é o princípio da criação de l is tas . No
(define (soma-ate-zero n)
e ntanto, e xis te m duas funçõe s bás icas
(opera-ate-zero + 0 n)) q uando s e trabal h a com o tipo de dados par.
O “car” e o “cdr”. O car e o cdr re ce be m um
Para a s ubtracção: par com o argum e nto e re tornam o prim e iro
el e m e nto e o s e gundo e l e m e nto do par,
(define (subtrai-ate-zero n) re s pe ctivam e nte . O u s e ja, s e fize rm os :
(opera-ate-zero – 0 n))
> (car (cons 1 2))
E para a divis ão: 1
> (cdr (cons 1 2))
(define (divide-ate-zero n) 2
(opera-ate-zero / 1 n)) > (car (cdr (cons 1 (cons 2 3))))
2
Pe ns o q ue fica aq ui um a s im ple s e xpl
icação e
o conce ito de ope raçõe s e ntre proce dim e ntos O Sch e m e s uporta, ainda, um
de orde m s upe rior e a criação de funçõe s e ncade am e nto de s tas form as s intácticas car
para nos abs trairm os o m áxim o pos s íve lda e cdr, pode ndo faze r o s e guinte :
função ge ral . A criação e util ização de s te s
> (cadr (cons 1 (cons 2 3)))
m étodos de abs tracção torna o código m ais
2
ge rale re util izáve lre fl
e ctindo-s e num código
com m e nos bugs e na não ne ce s s idade de
O Sch e m e ace ita e s ta com binação de “c
cons tante m anute nção.
‘a’s e ‘d’s r” até 5 ve ze s .
O utro tipo de dados q ue ve m no Sch e m e e
Pos to is to pode m os de finir o tipo de dados
q ue é m uito im portante e útil : o par. É o par
lis tas . Um a l is ta não é m ais do q ue um
q ue vai originar as l is tas . Em Sch e m e , um par
conjunto de pare s e ncade ados q ue
cria-s e da s e guinte m ane ira:
te rm ina com o par (cons e l e m _n ()), e m q ue
“()” re pre s e nta a l is ta vazia. D e finam os ,
> (cons elem1 elem2)
e ntão, o tipo de dados l is ta:
(elem1 . elem2)
O s cons trutore s :
Em q ue re ce be dois argum e ntos e s ão
as s ociados com o um par. Se pe ns arm os um
(define nova-lista ()) ;a lista vazia ()
bocadinh o, e m ve z de pas s arm os com o
s e gundo argum e nto, um núm e ro, porq uê não
(define (insere elemento LISTA)
pas s arm os outro par para e ncade ar? Aí
(cons elemento LISTA))
te ríam os , por e xe m pl
o:

<8 >
te m a de capa

Se re parare m , a função “ins e re ” re ce be Pode m os fris ar dois as pe ctos im portante s na


com argum e ntos um e l e m e nto a ins e rir e a m inim ização de s ta função. D a m e s m a
lis ta onde s e vai ins e rir. D e pois , no s e u m ane ira q ue nas funçõe s ante riore s , a
corpo, é fe ito o par (e l e m e nto. (LISTA)). No função “l is ta-vazia?” re ce be um a l is ta com o
e ntanto, o cons já re ce be dois argum e ntos argum e nto e de pois vai aval iar s e e l a é
para faze r o par, por is s o pode ríam os faze r vazia ou não através do ope rador “nul l?

e s ta função s im pl
e s m e nte as s im : q ue ve m no Sch e m e . No e ntanto, o nul l
?já
re ce be com o argum e ntos , um a l is ta, pe l
o
(define insere cons) q ue pode ríam os ape nas e s cre ve r:

O s se l
e ctore s : (define lista-vazia null?)

(define (primeiro-lista lista) O utro as pe cto na função prim e iram e nte


(car lista)) e s crita é o de q ue o ifm ais os s e us e l e m e ntos
de re torno “# t” e “# f”, não pre cis avam de l á
(define (resto-lista lista) e s tar, um a ve z q ue o nul l
?já re torna um val or
(cdr lista)) bool e ano de s te tipo. Criado o nos s o tipo de
dados , de fine -s e a ch am ada “barre ira de
Se re parare m , as funçõe s prim e iro-l is ta e abs tracção de dados ”. O u s e ja, a partir do
re s to-lis ta, re ce be m , am bas , l is tas para m om e nto q ue te m os fe ita a axiom atização
de pois de vol ve re m a re s pe ctiva parte , o do nos s o tipo de dados , util izam os ape nas as
prim e iro e l e m e nto e o re s to re s pe ctivam e nte . funçõe s criadas para originar novos
No e ntanto, o car e o cdr já re ce be m um a el e m e ntos (cons trutore s ), ace de r-l
hes
“l is ta” (um par), por is s o pode m os e s cre vê-l as (s e le ctore s ), re conh e ce -l os (re conh e ce dore s )
s im pl e s m e nte as s im : e aval iadore s (te s te s ).
(define primeiro-lista car)
Após a criação de s ta barre ira de abs tracção,
(define resto-lista cdr)
um a função útilde criar s e ria a q ue nos dá o
tam anh o de um a l
is ta:
Um re conh e ce dor:
(define (tamanho-lista LISTA)
(if(lista-vazia? LISTA)
(define (lista? X)
0
(if(null? X)
(+ 1 (tamanho-lista (resto-lista
#t
LISTA)))))
(if (pair? X)
(lista? (resto-lista X))
#f))) Um a outra m ane ira de criar um a l is ta e m
Sch e m e é us ar a função prim itiva q uote q ue
Se o unive rs al ‘X ’ pas s ado, for um a l is ta é o m e s m o q ue us ar o carácte r “ ‘ “ (plica).
vazia, s e rá, e ntão um a l is ta, de vol ve ndo # t.
> '(1 2 3)
Se não for vazia m as for um par, é m e io
(1 2 3)
cam inh o andado para s e r um a l is ta, ou s e ja, > '((1 2) (2 3) (4 5))
s e s im e l e vai ve r s e é l is ta o re s to do ((1 2) (2 3) (4 5))
unive rs al‘X ’ q ue re ce be u. Se todo o unive rs al
‘X ’ pas s ar nos te s te s , de vol ve # t, de vido ao Por e xe m pl
o, pondo e m prática as funçõe s
pair?já de vol ve r um # t ou # f, cas o contrário já criadas para o tipo de dados l is tas ,
de vol ve # f. Um te s te : ficam aq ui as s e guinte s inte racçõe s :
(define (lista-vazia? LISTA) (define lista-vazia nova-lista)
(if (null? LISTA)
#t (define lista2
#f)) (insere 3 lista-vazia))

<9 >
te m a de capa
O tipo de dados l is ta, é m uito fácilde us ar e o
Sch e m e nativo já incl ui, por de fe ito, todas as
funçõe s aq ui de finidas e m uitas m ais . Em C, a
criação de um a l is ta é m uito m ais com pl e xa,
um a ve z q ue e xige a criação de um a e s trutura
com um e l e m e nto e um ponte iro para a
próxim a e s trutura. Em Sch e m e , is s o já ve m fe ito
para nós . O utro tipo de dados pare cido com
as l is tas é o ve ctor. É m ais re corre nte us ar
ve ctore s em program ação im pe rativa,
(define lista-final ch am ando as pos içõe s com índice s .
(insere 5 lista2))
Virando o as s unto para o paradigm a do
Se m andás s e m os corre r o s e guinte com ando: Sch e m e , a program ação im pe rativa. A
program ação im pe rativa, bas e ia-s e na
> lista-final de s truição de variáve is , ou do s e u conte údo.
(5 3) Noutras l inguage ns com o o C, é m uito us ual
re corre r-s e a e s te tipo de program ação, já o
Es ta e ra a l
is ta re tornada. E pode ríam os , e ntão, Sch e m e te m o s e u ponto forte na program ação
corre r a função q ue nos dá o tam anh o de l a: funcional , com o foi re fe rido no início.

> (tamanho-lista lista-final) No e ntanto, o Sch e m e tam bém s uporta e s te


2 e s til
o de program ação e para is s o us a um a
re pre s e ntação inte rna para al ocar um val or e
O u m e s m o o ve rificador de l
is tas :
de pois as s ocia-o a um nom e q ue por s ua ve z o
as s ocia a um a box. Um a box não é m ais do
> (lista? lista-final)
#t
q ue um a e s trutura com um nom e e com um
val or lá de ntro. Se invocarm os o nom e da box,
Já de finim os um a função q ue ins e re um o Sch e m e inte rpre ta o nom e e faz o ch am ado
el e m e nto à cabe ça da l
is ta. D á je ito m as é unbox de vol ve ndo o val or inte rno da box
bas tante fraca. Se q uis e rm os ins e rir um as s ociado ao nom e .
el e m e nto num a dada pos ição faríam os a
s e guinte função: Pos to is to, é pos s íve l pe rce be r o q ue faz o
ope rador s e t!. Es ta função re ce be um nom e
(define (insere-pos elem pos LISTA)
q ue te m obrigatoriam e nte de já te r s ido
(if(= pos 1)
de finido com a função de fine e um novo val or
(insere elem LISTA)
ou e xpre s s ão q ue re torne al go vál ido para o
(insere-pos elem (- pos 1)
tipo de dados as s ociado ao nom e , e faz e ntão
(resto-lista LISTA)))
a acção de unbox do nom e , ins e re o novo
val or (de pois de aval iar a e xpre s s ão s e guida
As s im , s e q uis és s e m os pôr o e l
e m e nto 4 na do nom e ) e vol ta a faze r box. É óbvio q ue is to é
“lis ta-final”, criada e m cim a, na úl tim a pos ição, o q ue s e s uce de inte rnam e nte e é o q ue diz a
faríam os : te oria do Sch e m e . Na ve rdade , tudo o q ue foi
fe ito até agora re s pe ita as re gras te óricas do
> (insere-pos 4 3 lista-final)
conce ito Sch e m e e nq uanto l inguage m de
(2 3 4)
program ação, porq ue no fundo, cada
inte rpre tador da l inguage m e s e u com pil ador
Aconte ce q ue pode ríam os criar condiçõe s de pode m ge rir todos e s te s proce s s os ,
e rro para o util izador, por e xe m pl
o para o cas o inte rnam e nte , de m ane ira dife re nte . H á q ue
da pos ição dada s e r m aior q ue o tam anh o da pe rce be r a dife re nça e ntre o conce ito de
própria l is ta, m as s ão as pe ctos pouco linguage m e s ua s intaxe , e o q ue na ve rdade o
re le vante s para o cas o. s e u inte rpre tador faz.

<10>
te m a de capa

Al
guns e xe m pl
os da util
ização do ope rador s e t!: com o nada. O u s e ja, é aval iado o s e t!, o
val or de “val or-final ” é de s truído e re novado
(define a 4) (set! a 2) com outro e o factorialé invocado de novo
(define b 2) (set! b 0) re curs ivam e nte . Sim pl e s m e nte , e m ve z de
> a > a pas s arm os variáve is de e s tado actual izadas ,
4 2 criam os um acum ul ador q ue é actual izado
> b > b
us ando o s e t! inte rnam e nte .
2 0
> (+ a b) > (+ a b)
6 2 Pe ns o q ue a m aior parte dos conte údos
acim a e xpl icados e ngl obam e re fle cte m o
pode r do Sch e m e e a facil idade com q ue s e
Volte m os à função factorialq ue pe ns o q ue pode apre nde r a program ar us ando e s ta
elucida be m a dife re nça e ntre linguage m . Foram ape nas e xpos tos e xe m pl os
program ação funcionale a program ação s im pl
e s m as q ue m e s m o as s im m os tram o
im pe rativa: q ue é pos s íve lfaze r e m Sch e m e .

(define(factorial-imp n) Para s abe r m ais s obre e s ta l inguage m


(define valor-final 1) acons e l h o um l
ivro: Program ação e m
; inicialização com 1 Sch e m e – Introdução à program ação
; -> elemento neutro da multiplicação utilizando m úl tiplos paradigm as –IST Pre s s . O u
(define(aux n) outras fonte s com o o do com pil ador e
(if(= n 0) am bie nte de inte rpre tação Sch e m e
valor-final h ttp://w w w .pl t-s ch e m e .org. Es te inte rpre tador
(begin de Sch e m e é bas tante pode ros o e m te rm os
(set! valor-final (* n
de opçõe s e te m um m odo de de bug m uito
valor-final))
(aux (- n 1))))) inte re s s ante , onde pode m os ace de r aos
(aux n)) val ore s de todos os val ore s as s ociados aos
nom e s pre s e nte s no código, s im pl e s m e nte
pas s ando o rato por cim a de l e s . Te m de bug
É um a opção pos s íve lm as um pouco m ais por s te ps , us a bre ak points e ainda te m
trabal h os a e q ue e nvol ve de s truição de dis poníve l , para al ém do m odo gráfico, um
val ore s . Pas s age m de argum e ntos e ntre m odo de cons ol a. O program a e s tá
funçõe s s e m as al te rar é m uito m ais s e guro e dis poníve l para Linux, W indow s , M ac, Sun,
obte m os a m e sm a e ficiência (nota: e tc... É ainda pos s íve lcriar e xe cutáve is dos
com parar com a ve rs ão funcionalacim a). Foi program as criados para corre r nas várias
ins e rido o e l e m e nto be gin. Em Sch e m e , s ó pl ataform as onde s e e s tive r a trabal h ar o
pode m os re al izar um a ope ração por corpo. código.
O pe ração e s s a q ue de vol va al go.
Es pe ro q ue te nh am pe rce bido o pote ncial
No e ntanto, e xis te um a função q ue re ce be do Sch e m e com o l inguage m de al to níve l
várias funçõe s e q ue aval ia todas e s ó m as , tam bém , com o l inguage m de
de vol ve o val or re tornado pe la aval iação da apre ndizage m para s e e vol uir para outras
úl tim a. O u s e ja, no cas o da função “factorial - l
inguage ns .
im p”, de ntro da função auxil iar “aux”,
e nq uanto o “n” não ch e gar a 0 (ze ro), e l e
M igue lW ah non

re al iza o e l s e do if, q ue corre s ponde a


e xe cutar o be gin. Ne s s e be gin s ão aval iadas
as e xpre s s õe s (s e t! val
or-final(* n val or-final
))
e (aux (- n 1))))), e s ó o val or da úl tim a é
re tornada. O acto de faze r s e t! não re torna
nada. M into, re torna void, q ue é inte rpre tado

<11>
a program ar

-> D e s vantage ns :
•É m ais l e nto q ue o m odo orie ntado ao
datagram a.
•O com portam e nto do s e rvidor é
dife re nte do com portam e nto do cl ie nte .

M odo O rie ntado ao D atag ram a


(UD P/IP)

-> Vantag e ns :
•É bas tante m ais rápido q u e o m odo
orie ntado a cone xão.

Sock e ts -> D e s vantag e ns :


•S e rviços não confiáve is , m e ns ag e ns

e m Java pe rdidas na re de e pe rda da orde m


das m e ns ag e ns ;
•C ada m e ns ag e m é u m datag ram a:
Ne s te artigo vam os ficar a conh e ce r o [R e m e te nte , D e s tinatário, C onte údo.]
.
s uporte q ue Java ofe re ce para a util
ização
do m e canis m o de com unicação Sock e t, o D e vido a u m a m aior u til ização e
m e canis m o m ais util
izado para a e s tabilidade ire m os ape nas analis ar e
com unicação e ntre apl icaçõe s . im pl e m e ntar o M odo O rie ntado à
C one xão - TC P/IP.

Java pe rm ite o us o de s ock te s pe los


s e guinte s m odos util
ização: S ock e ts TC P/IP
-> M odo O rie ntado à Cone xão:
Funciona com o protocol o TCP; No proce s s o de com u nicação e ntre
-> M odo O rie ntado ao D atagram a: s ock e ts TC P/IP, de u m a form a s im pl e s, o
Funciona com o protocol o UD P
. s e rvidor e s col h e u m a porta e ag u arda
cone xõe s a e s s a porta, o cl ie nte de ve
Am bos os m odos funcionam s obre o conte r as s e g u inte s inform açõe s :
protocol o IP (Inte rne t Protocol). Cada um •Ende re ço do S e rvidor (H O S T);
de s te s m odos te m a s ua util idade , •A porta u s ada pe l o s e rvidor (PO R T).
vantage ns e de s vantage ns na s ua
util
ização. C om e s s a inform ação o cl ie nte s olicita
u m a cone xão ao s e rvidor (Fig u ra 1).

M odo O rie ntado à Cone xão (TPC/IP) S e após o pe dido de cone xão não
ocorre r ne nh u m probl e m a, o s e rvidor
-> Vantage ns : ace ita a cone xão g e rando u m s ock e t
•Se rviços confiáve is , s e m pe rda de dados nu m a porta do s e rvidor, o q u e vai criar
na re de e orde m dos pacote s ; u m canal de com u nicação e ntre o
•Pos s ibil
idade de us ar D ataStre am s . cl ie nte e o s e rvidor (Fig u ra 2).

Figu ra 1

<12>
a program ar

Figu ra 2
Por norm a o s e rvidor funciona e m cicl o (l
oop) e s pe rando por novas cone xõe s e criando
s ock e ts para s ol
icitaçõe s de cl
ie nte s .

Em s e guida ire m os ve r as acçõe s ne ce s s árias para im pl


e m e ntar com unicaçõe s s obre TCP
através de um s ock e tcl ie nte e um s ock e ts e rvidor.

Sock e tCl
ie nt
1 –Abrir Cone xão.
import java.io.*;
import java.net.*;
//Conectar ao servidor localhost na porta 8080.
Socket client = new Socket("127.0.0.1",8080);

2 –O bte r Stre am s de e ntrada e s aída para com unicação com o s e rvidor.


//Cria um canal para receber dados.
DataInputStream in = new DataInputStream(client.getInputStream());
//Cria um canal para enviar dados.
DataOutputStream out = new DataOutputStream(client.getOutputStream());

3 –Re al
izar a com unicação com o s e rvidor.
//Envia o inteiro 3000.
out.writeInt(3000);
//Envia a String “Olá - Socket Cliente.”.
out.writeUTF("Olá - Socket Cliente.");
//Espera pela recepção de um inteiro.
int valor = in.readInt();
//Espera pela recepção de uma String.
String texto = in.readUTF();

4 –Fe ch ar as Stre am s e a cone xão.


//Fecha o canal de entrada.
in.close();
//Fecha o canal de saída.
out.close();
//Fecha o Socket.
client.close();

<13>
a program ar

Sock e tSe rvidor


1 –Criar Sock e tSe rve r
import java.io.*;
import java.net.*;
//Cria um socket servidor na porta 8080.
ServerSocket serveer = new ServerSocket(8080);

2 – Aguardar Conexões
//O método accept retorna um socket para comunicação com o próximo cliente.
Socket sock = server.accept();

3 – Obter Streams de entrada e saída para comunicação com


o cliente
//Cria um canal para receber dados.
DataInputStream in = new DataInputStream(sock.getInputStream());
//Cria um canal para enviar dados.
DataOutputStream out = new DataOutputStream(sock.getOutputStream());

4 – Realizar a comunicação com o cliente


//Espera pela recepção de um inteiro.
int valor = in.readInt();
//Espera pela recepção de uma String.
String texto = in.readUTF();
//Envia o inteiro 6000.
out.writeInt(6000);
//Envia a String “Olá - Socket Servidor.”.
out.writeUTF("Olá - Socket Servidor.");

5 – Fechar Streams e socket cliente


//Fecha o canal de entrada.
in.close();
//Fecha o canal de saída.
out.close();
//Fecha o Socket que está a atender o cliente.
sock.close();

6 – Fechar o socket Servidor


//Fecha o servidor.
server.close();

<14>
a program ar

Em s e guida pode m os ve r as cl
as s e s Cl
ie nte e Se rvidor com pl
e tam e nte im pl
e m e ntadas .

Cl
as s Cl
ie nte

import java.io.*;
import java.net.*;

public class Cliente{


public Socket client;
public DataInputStream in;
public DataOutputStream out;

public Cliente(){
try{
this.client = new Socket("127.0.0.1",8080);
this.in = new DataInputStream(client.getInputStream());
this.out = new DataOutputStream(client.getOutputStream());
}
catch(IOException e){
System.out.println(e.getMessage());
}
}

public static void main(String args[]){


try{
Cliente cli = new Cliente();
cli.out.writeInt(3000);
cli.out.writeUTF("Olá - Socket Cliente.");
int valor = cli.in.readInt();
String texto = cli.in.readUTF();
System.out.println(valor);
System.out.println(texto);
cli.in.close();
cli.out.close();
cli.client.close();
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
}

<15>
a program ar

Cl
as s Se rvidor

import java.io.*;
import java.net.*;

public class Servidor{


public ServerSocket server;
public Socket sock;
public DataInputStream in;
public DataOutputStream out;

public Servidor(){
try{
this.server = new ServerSocket(8080);
this.sock = this.server.accept();
this.in = new DataInputStream(sock.getInputStream());
this.out = new DataOutputStream(sock.getOutputStream());
}
catch(IOException e){
System.out.println(e.getMessage());
}
}

public static void main(String args[]){


try{
Servidor serv = new Servidor();
int valor = serv.in.readInt();
String texto = serv.in.readUTF();
System.out.println(valor);
System.out.println(texto);
serv.out.writeInt(6000);
serv.out.writeUTF("Olá - Socket Servidor.");
serv.in.close();
serv.out.close();
serv.sock.close();
serv.server.close();
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
}

Aq ui ficam as principais bas e s de s ta m atéria, a partir daq ui é us ar a im aginação. Com o


Fábio Corre ia

s uge s tão para a apl icação dos novos conh e cim e ntos adq uiridos , s ugiro q ue
e xpe rim e nte m a criação de um s im pl e s s oftw are de conve rs ação ('ch at').

<16>
a program ar

1*10^2 + 2*10^1 3*10^0 = 100 + 20 +


3 = 123

E os núm e ros fraccionários ?Sim pl


e s , vam os
ve r o e xe m pl
o 123,456:

1*10^2 + 2*10^1 + 3*10^0 + 4*10^-1 +


5*10^-2 + 6*10^-3

O u s e ja, cada dígito à e s q ue rda da vírgul a


re pre s e nta um valor e ntre 0 e 9
m ultipl icado por um a potência de bas e 10
cujo e xpoe nte aum e nta com a dis tância à
vírgul a. Nos dígitos à dire ita da vírgul a é um
val or de 0 a 9 m ul tiplicado por um a
potência de bas e 10 com um e xpoe nte

Es truturas de
ne gativo q ue cre s ce à m e dida q ue s e
afas ta da vírgul a. Sim , l á ve m a

dados
M ate m ática! M as não s e pre ocupe m m uito
com is s o, trata-s e de M ate m ática s im pl
e s.

Agora vam os pas s ar ao s is te m a binário.

No s is te m a binário s ó pode m os e ncontrar 2


valore s o 0 e o 1, e a partir de s te s 2 dígitos
Ne s ta s érie de artigos vam os de s l
indar um pode m os facil m e nte obte r q ual q ue r val
or
as s unto q ue para m uitos é difícil de de cim al corre s ponde nte . A m ane ira de
e ncaixar, e nq uanto para outros é com o conve rte r um binário num de cim al é
s om ar 1 + 1. No prim e iro capítul o de s ta bas tante s im il ar ao q ue fize m os com os
s érie de artigos vam os abordar os s is te m as núm e ros de cim ais . O s is te m a binário não
num éricos . pe rm ite dígitos dife re nte s de 0 e 1 e a
potência é s e m pre de bas e 2 e m ve z de
Com o a m aioria dos l e itore s s abe m , o bas e 10.
com putador não inte rpre ta os núm e ros Vam os e ntão conve rte r o s e guinte núm e ro
com o nós e te m as s uas l im itaçõe s binário para de cim al : 11001010
aritm éticas . Is to porq ue o proce s s ador
ape nas trabal h a com im pul s os e léctricos e 1*2^7 * 1*2^6 + 0*2^5 + 0*2^4 +
e s te s s ó pode m tom ar 2 val ore s : 0 e 1, 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 =
re pre s e ntando as s im a aus ência e a 128 + 64 + 8 + 2 =
pre s e nça, re s pe ctivam e nte , de s s e s ditos 202
im pul s os . Portanto, e s tam os diante um
s is te m a num érico binário. Sim pl
e s não é?

Natural m e nte , com o nós pe ns am os num Para faze r a ope ração inve rs a é um pouco
núm e ro s e m pre no s is te m a de cim al e pior, te m os de dividir s uce s s ivam e nte um
lim itam os a te r um a im age m m e ntal de núm e ro de cim alpor 2 até o re s ul tado s e r
q uantidade , não nos ape rce be m os q ue de m e nor q ue 2. D e pois te m os de col ocar o
facto um núm e ro, por e xe m pl o o 123, pode últim o re s ul
tado e os re s tos ante riore s na
s e r re pre s e ntado da s e guinte form a: orde m com o o e xe m plo a s e guir. O u s e ja:

<17>
te cnol
ogias

O val
or binário é 1100100. E vam os ao nos s o úl
tim o e xe m pl
o de s te
artigo:
As re pre s e ntaçõe s dos núm e ros binários
pode m variar. Por e xe m pl o o núm e ro 5 no Re pre s e ntação do núm e ro 5 num
s is te m a binário re pre s e nta-s e por 101, m as nibbl e , num by te e num w ord.
pode s e r re pre s e ntado por 0000101 ou
00000101 ou 0000000000000000000101, Nibbl e : 0101 (4 bits )
is to porq ue , talcom o no s is te m a de cim al , By te : 00000101 (8 bits )
os ze ros a e s q ue rda não têm s ignificado W ord: 0000000000000101 (16 bits )
ne nh um . Cada digito binário é conh e cido
por bit(binary digit). No próxim o artigo vam os ve r com o s e
organizam e s tas e s truturas q ue acabám os
Agora q ue s abe m os conve rte r de binário de de s cre ve r.
para de cim ale vice ve rs a, vam os ao q ue
inte re s s a.

M ate m aticam e nte pode m os re pre s e ntar


q ual q ue r val or de cim al e m binário s e m
lim itaçõe s de tam anh o, m as num
proce s s ador as cois as já não s ão be m
as s im , e s te vai agrupar os bits num a
q uantidade e s pe cífica de bits . O u s e ja,
pode agrupar e m 4 bits (conh e cido por
nibbl e ), 8 bits (conh e cido por by te ), 16 bits
ve s
D iogo Al

(conh e cido com o w ord) e m ais adiante .

<18>
a program ar

Caracte rís ticas do Py th on:

•Sintaxe s im pl e s;
•Fácile rápida apre ndizage m ;
•G rátis e de código abe rto;
•Linguage m de al to níve le inte rpre tada;
•Portabil idade ;
•O rie ntação a obje ctos ;
•Exte ns íve l
;
•Exte ns as bibl iote cas ;
•Exce l e nte s uporte e docum e ntação.

Áre as de apl
icação:

•D e s e nvol
vim e nto de apl icaçõe s W e b;
•Ace s s o a bas e s de dados ;
•Inte rface s gráficas ;
•Apl icaçõe s cie ntíficas e num éricas ;
•Educação;
•Program ação de re de s ;
•D e s e nvol
vim e nto de s oftw are ;
Introdução à l inguage m q ue te m •Jogos e gráficos 3D .
m ovim e ntado o m undo
ope n-s ource Ante s de tudo, vam os ins tal ar o inte rpre tador
da l inguage m Py th on q ue pode s e r obtido na
página oficial da l
inguage m
(h ttp://w w w .py th on.org). A ve rs ão q ue vam os
O Py th on é, com o o s e u autor diz, util izar ao l ongo de s te artigo é a 2.5 (a úl tim a
um a l inguage m de program ação ve rs ão e s táve lna al tura da e s crita do artigo).
inte rpre tada, inte ractiva, orie ntada Se e s tive r e m am bie nte W indow s bas ta faze r
a obje ctos e dinâm ica. a trans fe rência do e xe cutáve lde ins tal ação
(h ttp://w w w .py th on.org/ftp/py th on/2.5/py th on-
Ao contrário de m uitas outras l inguage ns de 2.5.m s i), q ue m e s tive r e m am bie nte Linux ou
program ação, a de l im itação dos bl ocos de se m e l h ante te m um a grande probabil idade
ins truçõe s é fe ita pe l o al inh am e nto de já pos s uir o inte rpre tador ins tal ado, cas o
(inde ntação), não h á de l im itadore s com o não te nh am aprove ite m agora para o ins tal ar.
be gin e e nd com o aconte ce no Pas cal , ou
{ e } da l inguage m C. Al ém dis s o ofe re ce Vam os agora ve r com o corre r o prim e iro
tipos de dados de al to níve lcom o s trings , program a e m Py th on, o tradicionalH e l
l
o W orl
d.
dicionários , l is tas , tupl as , cl as s e s , e ntre
outros . Exis te m dois m étodos para o faze r, us ando o
inte rpre tador inte ractivo ou um código fonte
A l inguage m pe rm ite outros paradigm as de e xte rno. A vantage m do inte rpre tador é q ue
program ação al ém da program ação não têm de gravar e vol tar a e xe cutar um
orie ntada a obje ctos , com o a program ação fich e iro s e m pre q ue faze m um a m odificação.
funcional . A s intaxe é fácilde com pre e nde r M ais à fre nte vam os util izar fich e iros com o
e dom ina-s e rapidam e nte , s e ndo e s s as duas código fonte , pois as s im q ue e nce rram o
caracte rís ticas cons ide radas grande s inte rpre tador e s te não grava o q ue
vantage ns da l inguage m . Py th on é, e m e s cre ve ram , s e ndo por is s o útilape nas para
vários as pe ctos , s e m e l h ante a outras pe rce be r com o a l inguage m funciona e não
linguage ns inte rpre tadas com o Pe rle Ruby. para e s cre ve r program as com pl e xos .

<19 >
a program ar

Para iniciar o inte rpre tador pe l a l inh a de >>> print “Hello World”
com andos ou cons ol a bas ta e s cre ve r Hello World
py th on s e guido de <Ente r> . As s im q ue o >>> print "Hello", "World"
fize re m vão s e r apre s e ntados com o Hello World
s e guinte (pode s e r lige iram e nte dife re nte >>> print
<Linha em branco>
de pe nde ndo do vos s o s is te m a ope rativo):
Com o de ve m te r re parado o com ando print
Python 2.5 (r25:51908, Oct 6 2006, 15:22:41)
s e rve para e s cre ve r al go na l inh a de
[GCC 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13 com andos . Ne s te e xe m pl o e s cre ve m os um a
ubuntu4)] on linux2 s tring (cade ia de caracte re s ) m as tam bém
Type "help", "copyright", "credits" or "license" pode m os e s cre ve r l is tas , tupl as e ntre outros
for more information. tipos de dados q ue vam os conh e ce r m ais à
>>> fre nte ...
Se e fe ctuare m o com ando print e não
forne ce re m nada para o inte rpre tador
Para fe ch ar o inte rpre tador bas ta pre s s ionar e s cre ve r, e l
e e fe ctua ape nas um parágrafo,
Ctrl-Z s e guido de Ente r e m W indow s , ou Ctrl - s e ndo e q uival e nte a faze re m print de um a
D e m Linux. s tring vazia (“”). Tam bém é de notar q ue s e
pode faze r print a vários val ore s num a única
Para aq ue l e s q ue não s e s e nte m confiante s ins trução, s e ndo os dados s e parados por
a trabal h ar e m l inh a de com andos , o vírgul as .
Py th on tam bém ve m com um a inte rface
gráfica q ue pode s e r us ada para
program ar tanto no m odo inte ractivo com o Tipos de dados
com fich e iros de código fonte . Es ta
fe rram e nta ch am a-s e ID LE (Inte grate d Em Py th on e xis te um a e norm e varie dade de
D e ve Lopm e nt Environm e nt) e é forne cida tipos de dados q ue dão um a e norm e
com a ins tal ação bas e do Py th on. Se fle xibil
idade ao program ador com o
durante a ins tal ação pe diram ao ins tal ador núm e ros , s trings (s e q uência de caracte re s ),
para criar atal h os no m e nu Iniciar e ntão lis tas (array s /ve ctore s ), tupl
as , dicionários
pode m s e guir por e s s e cam inh o. Cas o não (array s as s ociativos / m atrize s ), obje ctos ,
te nh am ins tal ado atal h os , o ID LE e ncontra- e tc...
se em <pas ta de ins tal
ação do
Py th on> \Lib\idl elib\idle .py w . O s núm e ros s ubdivide m -s e e m q uatro tipos :
os inte iros ou de cim ais (inte ge rs ), os inte iros
Agora q ue te m os o inte rpre tador iniciado grande s (long inte ge rs ), os núm e ros
vam os com e çar a e s cre ve r al guns fraccionários (fl oating point) e os núm e ros
program as . Se m pre q ue o inte pre tador com pl e xos (com pl e x num be rs ). A s e guir
m os trar > > > s ignifica q ue e s tá pronto a apre s e ntam -s e al guns e xe m pl
os de
re ce be r ins truçõe s . ope raçõe s com núm e ros :

Para com e çar vam os introduzir a ins trução >>> 5+5


print “H e l lo W orld”. Com o de ve m te r 10
re parado as s im q ue pre s s ionaram a te cl a
Ente r o Py th on avaliou o q ue introduziram e Ne s te cas o juntam os dois núm e ros inte iros
e fe ctuou a de vida ope ração (e s cre ve u s e ndo o re s ultado outro inte iro. Tam bém de
Hel l
o W orl
d num a l inh a). As s im q ue acabou pode m re al izar outras ope raçõe s :
de o e fe ctuar vol tou a m os trar os > > > ,
s ignificando q ue e s tá pronto a re ce be r >>> 2.5*2
novas ins truçõe s . 5.0

<20>
a program ar

Com o viram m ul tipl


icam os um núm e ro >>> type(5)
fraccionário por um núm e ro inte iro s e ndo o <type 'int'>
re s ul
tado um núm e ro fraccionário. Ate nção >>> type(5.0)
<type 'float'>
q ue para o inte rpre tador 5 não é o m e s m o
>>> type(“Python”)
q ue 5.0. <type 'str'>
>>> 2**3
As s trings com o já foi dito s ão cade ias de
8
>>> pow(2, 3) caracte re s ou s e ja pode m conte r núm e ros ,
8 le tras e s ím bolos , e o s e u conte údo e s tá
s e m pre l
im itado por as pas ou plicas :
Com o já de ve m te r pe rce bido o s ím bol o **
s ignifica e l e var, ne s te cas o e l
e vám os o >>> 'Python'
'Python'
núm e ro 2 ao cubo. Aprove itam os tam bém
>>> "Portugal"
para apre s e ntar o us o de funçõe s , ne s te 'Portugal'
cas o a função pow (x, y ), s e ndo x e y os >>> """Python
ch am ados argum e ntos da função ou s e ja, ... Portugal
os dados q ue forne ce m os à função. Es te ... P@P"""
te m a irá s e r abordado m ais profundam e nte 'Python\nPortugal\nP@P'
q uando criarm os as nos s as próprias
funçõe s . Es ta úl tim a s tring cons truída por três as pas é
cons ide rada um a s tring de várias l inh as ,
>>> 10/3 re pare m q ue q uando iniciam os a s tring e
3 dam os um <Ente r> o inte rpre tador pas s a
>>> 10.0/3 autom aticam e nte para a l inh a s e guinte
3.3333333333333335
m os trando ... e m ve z das h abituais > > > .
O utro porm e nor inte re s s ante é q ue a s tring
Q uando s e divide m dois inte iros o re s ul
tado final de vol vida pe l o inte rpre tador te m
é um inte iro, m as q uando s e m is turam ape nas um a l inh a apare ce ndo o \n (ne w
inte iros com fraccionários , o re s ul
tado é um line ) s e m pre q ue ocorre um a m udança de
fraccionário, convém te r e s te facto e m linh a. Tam bém pode m os m udar de l inh a
ate nção já q ue é um e rro fre q ue nte . m anual m e nte s e m us ar e s te últim o tipo de
s trings :
O utra função a conh e ce r m uito útilq uando
e s tam os a iniciar é a ty pe (), q ue pe rm ite
s abe r o tipo de dados com q ue e s tam os a >>> 'Python\nPortugal'
lidar. 'Python\nPortugal'
>>> 'Triton'Portugal'
File "<stdin>", line 1
'Triton'Portugal'
^
SyntaxError: invalid syntax

Aq ui pode m ve r outro porm e nor inte re s s ante


s obre as s trings q ue ainda não foi re fe rido.
Com o faze m os s e q uis e rm os us ar as pas ou
pl icas de ntro de um a s tring? Se us arm os
as s im s e m m ais ne m m e nos o inte rpre tador
confunde -s e , não s abe ndo onde acaba a
s tring, m as s e us arm os tipos dife re nte s de
as pas /pl icas no conte údo dos q ue us am os
para l im itar a s tring e ntão já é pe rm itido:

<21>
a program ar

>>> "Triton ' Portugal" Para guardar um inte iro e m m e m ória


"Triton ' Portugal" us am os um a variáve l , para is s o te m os de
>>> 'Triton " Portugal' l
h e atribuir um nom e para q ue nos
'Triton " Portugal' pos s am os re fe rir a e s s e valor no futuro:
>>> """Triton '" Portugal"""
'Triton \'" Portugal' >>> numero = 1

É tão s im pl
e s com o is to, bas ta e s cre ve r o
Ne s te úl tim o cas o pode m os ve r com o é
nom e da variáve ls e guido de um igual(=,
q ue o Py th on re pre s e nta a pl ica num a
atribuição) e s e guido do q ue q ue re m os
s tring. Us am os o ch am ado caracte r de
guardar.
e s cape , a barra para a e s q ue rda, para
re pre s e ntar os tais caracte re s não
>>> print numero
pe rm itidos norm al m e nte ou caracte re s 1
e s pe ciais (\n). >>> inteiro = numero + 1
>>> inteiro
>>> print "Triton \" Portugal" 2
Triton " Portugal
>>> print "Uma barra \\" Agora cada ve z q ue nos re fe rirm os à
Uma barra \
variáve lnúm e ro é com o nos e s tivés s e m os a
>>> "abc".upper()
'ABC'
re fe rir ao val or q ue e l
a guarda e m
m e m ória, pois cada ve z q ue o
No prim e iro e xe m pl
o us am os um a as pa no inte rpre tador te m de proce s s ar a variáve l
m e io de um a s tring lim itada pe lo m e sm o ace de à m e m ória e s ubs titui pe lo de vido
tipo de as pa. Para is s o faze m os o e s cape val or guardado.
da as pa, us ando para is s o o \”. Para As variáve is pode m s e r us adas para
faze m os e s cape à barra us am os duas guardar todos os tipos de dados :
barras , com o s e ve rifica no s e gundo
>>> frac = 2.0*2
e xe m pl
o.
>>> print frac
4.0

As s trings apre s e ntam um conjunto de Ne s te cas o ante s de guardar o val or o


m étodos q ue pode m os util izar, com o inte rpre tador aval ia a e xpre s s ão (2.0*2)
fize m os no úl tim o e xe m pl o, ch am ando o s e ndo o re s ul
tado um núm e ro fraccionário.
m étodo .uppe r() q ue faz com q ue a s tring
s e ja conve rtida para l e tras m aiús culas .
Para conh e ce r os m étodos de q ual q ue r G raças á s im pl icidade de Py th on, e s ta
tipo de dados us a-s e a função dir(), por linguage m é m uitas ve ze s acons e l h ada para
e xe m plo, dir('Foo') vai m os trar todos os q ue m e ntrar no m undo da program ação.
m étodos da s tring (ne s te cas o 'Foo'). Tam bém por is s o, é pos s íve le ncontrar m uita
inform ação (docum e ntação, artigos ,
e xe m plos ...) livre s na inte rne t, s obre e l
a. Aq ui
Até agora não te m os guardado os val ore s têm al guns l ink s inte re s s ante s :
das e xpre s s õe s q ue introduzim os , para is s o •h ttp://w w w .dive intopy th on.org
us am os as variáve is . Um a variáve lé ape nas •h ttp://w w w .onl am p.com /py th on
João M atos

um nom e q ue aponta para o e nde re ço de •h ttp://w ik i.py th on.org/m oin


m e m ória onde vam os guardar a •h ttp://pt.w ik ipe dia.org/w ik i/Py th on
inform ação.

<22>
s e gurança

O buffe r ove rfl ow aconte ce q uando um


program a grava dados num a de te rm inada
variáve l pas s ando, porém , um a
Introdução aos q uantidade m aior de dados do q ue e s tava
pre vis to pe lo program a. Es s a s ituação pode
Expl
oits pos s ibilitar a e xe cução de um código
arbitrário, ne ce s s itando ape nas q ue e s te
s e ja de vidam e nte pos icionado na áre a de
m e m ória do proce s s o.

Abaixo te m os um e xe m plo de um
program a vul ne ráve l a um ataq ue de
buffe r ove rfl ow . O probl e m a e s tá na
s e gunda l inh a da função Proce s s arParam ,
q ue não l im ita o tam anh o do argum e nto
re ce bido (arg).
Um e xpl oit não é nada m ais q ue
um código capaz de e xpl orar void ProcessarParam(char *arg);
um a fal h a num s e gm e nto de void main(int argc, char *argv[]) {
código ou s oftw are . D o ingl ês , if (argc > 1){
s ignifica lite ral
m e nte e m português printf("Param: %s\n",argv[1]);
“e xpl orar”. ProcessarParam(argv[1]);
}
No m undo da s e gurança inform ática, }
de nom ina-s e “e xpl oit” um m étodo capaz
de tirar prove ito de um bug (fal h a) de um void ProcessarParam(char *arg) {
s oftw are provocando com portam e ntos não char buffer[10];
strcpy(buffer, arg);
pre te ndidos do s oftw are , fre q ue nte m e nte
/* BUG: se a string contida em
para cons e guir e s cal ar privil
égios , obte r
arg tiver mais que 10 carateres
control o do s is te m a ou ne gar s e rviços (D oS). existirá um Buffer Overflow */
G e ral m e nte util izados e m m il h are s de printf(buffer);
s is te m as diariam e nte , os e xpl oits s ão a }
fonte de grande parte dos ataq ue s
ocorridos l ocal m e nte e re m otam e nte nos
s is te m as e xis te nte s . Es te s pode m ainda O buffe r ove rfl ow , q uando ocorre de form a
tom ar form as e pode re s bas tante s variados . al e atória, norm al m e nte caus a um e rro
Pode s e r um program a e xe cutáve l , um a fatal /cras h na apl icação. No W indow s XP
m e ns age m num de te rm inado protocol o de e s ta s ituação ge ra um a jane l a de e rro, e
re de ou até m e s m o um a m e ns age m no Linux ge ra a conh e cida s e gm e ntation
e s condida num e -m ail . faul t com core dum p (dá-s e um core dum p
q uando o s is te m a cons e gue guardar o
Ne s te artigo vam o-nos focar no tipo de e s tado do program a ante s de s urgir a
falh a “Buffe r O ve rfl
ow ” e util
izare m os a fal h a, s e ndo o core o fich e iro guardado).
linguage m C para de m ons trar. Porém , q uando corre ctam e nte induzido
pe l o atacante , o buffe r ove rfl ow pode
Com o funcionam os e xpl
oits ? pe rm itir q ue s e e xe cute código m al icios o
q ue te rá os m e s m os privil égios de
O s e xpl
oits q uas e s e m pre faze m prove ito e xe cução da apl icação a s e r atacada,
de um a fal h a conh e cida com o buffe r q ue ge ral
m e nte s ão privil
égios de
ove rfl
ow (s obre carga da m e m ória buffe r). adm inis trador.

<24>
s e gurança

Para e nte nde r com pl e tam e nte com o o e xpl


oits a todos . Criticado pe l os e xpe rts da áre a
buffe r ove rfl ow é e xpl orado para s e obte r com o um a fe rram e nta q ue ve m facil itar o
ace s s os inde vidos ao s is te m a, s e ria trabalh o aos s cript-k iddie s e as s im aum e ntar o
ne ce s s ário com pre e nde r com o é q ue os núm e ro de s is te m as s ob ataq ue s .
proce s s os s ão organizados na m e m ória, no
q ual cada arq uite ctura de h ardw are , Com e s ta fe rram e nta, a fas e de procura e
s is te m a ope rativo ou com pil ador pode de s e nvolvim e nto dos e xploits é praticam e nte
organizar de form a dife re nte . elim inada vis to q ue s e torna bas tante fácilde
de s carre gar novos e xpl oits para utilizar na
Buffe r ove rfl ow é ape nas um dos m uitos tipos plataform a.
de vul ne rabilidade s pos s íve is num s oftw are .
Se ndo al guns de l e s : h e ap ove rflow , inte ge r
ove rflow , re turn-to-l ibc attack , form at s tring Program ar e m Se gurança
attack , race condition, code inje ction, SQ L
inje ction, cros s -s ite s cripting e cros s -s ite Exis te m m uitos tipos de vul ne rabilidade s , cada
re q ue s t forge ry. G e ral m e nte um e xpl oit um a de l as ocorre de vido a um e rro do
ape nas tom a vantage m de um a única program ador. G e ral m e nte caus adas pe l a má
vul ne rabil idade de s oftw are , o q ue torna por conce pção, fal ta de conh e cim e nto,
ve ze s norm als e re m util izados vários e xpl oits e nte ndim e nto do funcionam e nto das
e m s im ul tâne o: prim e iro para ganh ar ace s s o funçõe s /bibl iote cas util
izadas de outros
de níve l re duzido, de pois para e s cal ar program adore s ou até m e s m o fal h as
privilégios re pe tidam e nte até obte r aritm éticas ine s pe radas . Com is to pode -s e
privilégios m áxim os , nom e adam e nte facil m e nte concl uir q ue e s tas vul ne rabilidade s
Adm inis trador/root. ape s ar de s e re m bas tante conh e cidas , não
s ão ge ral m e nte e nte ndidas , e is to e xpl icaria o
Norm al m e nte um único e xpl oit pode ape nas porq uê de continuare m a apare ce re m
s e r utilizado para tom ar vantage m num a e norm e s q uantidade s de s tas fal h as nas
única vulne rabil
idade de s oftw are . apl icaçõe s de s oftw are .
H abitual m e nte , q uando um e xpl oit é
publ icado, a vul ne rabil idade é corrigida
através de um a corre cção (patch ) e o
e xpl oit torna-s e obs ol e to para novas ve rs õe s
do s oftw are . Es ta é a razão pe l o q ualal guns
h ack e rs não publ icam os s e us e xpl oits ,
m ante ndo-os privados . Tais e xpl oits s ão
ge ral m e nte re fe re nciados com o e xpl oits
0day e obte r tais e xpl oits é o de s e jo
principal dos atacante s ine xpe rie nte s ,
ge ral m e nte ch am ados ‘s criptk iddie s ’.

Proje cto M e tas pl


oit?
O Proje cto M e tas pl
oit é um a pl ataform a onl
ine
ope n-s ource , dis poníve lpara dow nl oad, q ue
pe rm ite controlar e util izar e xpl
oits publicados
online .

Es crito e m Pe rl, com com pone nte s e m C,


As s e m bl
e r e Py th on, o M e tas ploit tornou-s e
um a fe rram e nta fam os a por facil
itar o us o de

<25>
s e gurança

Ape s ar dis to, te m os de e nte nde r q ue todos Es ta s im pl e s al


te ração, inform a o s trcpy ()
os tipos de vul ne rabil
idade s , nom e adam e nte q ue o buffe r de de s tino s ó te m um tam anh o
as fal adas ante riorm e nte s ão pre vis íve is . de 10 by te s , e q ue de ve de s cartar
Tal ve z num te m po próxim o no futuro, as q uais q ue r dados após e s te com prim e nto.
condiçõe s q ue pe rm ite m e s tas fal
h as
e xis tire m , ve nh am a s e r “corrigidas ” e
elim inadas , ficam aq ui al guns m étodos q ue 3. Im ple m e ntar e cons truir s e gurança
pode m ajudar q ual q ue r program ador a de ntro do código. Pode de m orar m ais
pre ve nir e s tas : te m po, e cons om e m ais e s forço, m as o
s oftw are pode s e r cons truído com a
s e gurança e m m e nte . Se no e xe m pl o
1. Util
izar dife re nte s linguage ns . Linguage ns ante rior, tivés s e m os adicionado um
de program ação q ue forne ce m pas s o e xtra, atingiríam os ainda um
autom aticam e nte ve rificação de l im ite s mel h or níve lde s e gurança:
com o Pe rl , Py th on, Java, Ruby, e tc. É
ve rdade q ue e s tas e xis te m , porém is to por strncpy(buffer, arg, sizeof(buffer));
ve ze s torna-s e im pos s íve l q uando s e
cons ide ra q ue praticam e nte todos os Novam e nte , is to pode re m e te r a
s is te m as ope rativos m ode rnos s ão e s critos ve rdade ira q ue s tão, de com o os
e m C. A m udança de l inguage m torna-s e program adore s s ão e ducados . Se rá a
particul arm e nte crítica q uando é ne ce s s ário s e gurança e ns inada, ou e ncorajada?Se rá
ace s s o de baixo-níve lao h ardw are . A boa dado o te m po e xtra ne ce s s ário para
notícia é q ue as l inguage ns e s tão a e vol uir, im pl e m e ntar a s e gurança ade q uada?
e a s e gurança tornou-s e um as s unto s ério. Tipicam e nte , e infe l izm e nte , a re s pos ta é
Por e xe m pl o, a M icros oft com a s ua não.
iniciativa .NET, re s cre ve u por inte iro o Vis ual
Bas ic e Vis ualC+ + com a s e gurança e m
m e nte . Adicional m e nte , a l inguage m Vis ual 4. Util
izar m ódul os de bibl iote cas s e guras .
C# q ue foi de s e nh ada por com pl e to com a Bibl iote cas de s e gurança e m s trings e s tão
s e gurança e m m e nte . dis poníve is e m l inguage ns com o C+ + . Por
e xe m pl o, a C+ + Standard Te m pl ate Library
(STL) ofe re ce a cl as s e String. Es ta cl as s e
2. Elim inar o us o de funçõe s de bibl iote cas ofe re ce funçõe s inte rnas q ue s ão s e guras
com vul ne rabil
idade s . Linguage ns de no tratam e nto das s trings , e de ve s e r
program ação, s ão tão vul ne ráve is com o o pre fe rida e m re l
ação às funçõe s us uais .
program ador pe rm ite q ue s e jam . No
e xe m pl o dado, no ínicio, util izám os um a
função vul ne ráve lda Standard C Library 5. Util
izar bibl iote cas dis poníve is
(s trcpy ). Es ta é um a, de várias , funçõe s (M iddl e w are ). Exis te m várias bibl iote cas de
e xis te nte s na bibl iote ca q ue fal h am e m “s e gurança” dis poníve is para util ização. Por
ve rificar o com prim e nto/l im ite dos s e us e xe m pl o, a Be l l Labs de s e nvol ve u a
argum e ntos . Por e xe m pl o, pode ríam os te r “l ibs afe ” q ue prote ge a util ização de
corrigido a nos s a apl icação al te rando funçõe s ins e guras . Libs afe funciona na
unicam e nte um a l inh a de código: e s trutura da s tack , e pe rm ite as s e gurar q ue
q uando um a função é e xe cutada, o
// substituindo: e nde re ço de re torno não é al te rado. No
strcpy(buffer, arg); e ntanto, com o m uitas outras bibl iote cas ,
// por: e s ta não é im une a fal h as e de ve s e r
strncpy(buffer, arg, 10); s e m pre util izada a úl tim a ve rs ão.

<26>
s e gurança

6. Utilizar fe rram e ntas de anál is e do código. Final


izando
Foram fe itas várias te ntativas de criar um a
apl icação q ue e xe cutas s e um a anál is e no Educação é a ch ave no pe rcurs o de tornar
código fonte e te ntas s e e ncontrar pote nciais um a apl icação s e gura. G rande parte dos
falh as , incl us ive Buffe r O ve rfl ow ’s . Um a program adore s s abe m da ne ce s s idade de
apl icação e xe m pl ar ch am a-s e Purify Pl
us ve rificar dados introduzidos pe l o utilizador,
criada pe l a Rational ’s (h ttp://w w w .rational .com ) ve rificar os l im ite s nas ope raçõe s de dados ,
q ue e xe cuta anál is e s a código e s crito e m e ntre outros , m as poucos têm a noção das
Java, C ou C+ + e de te cta várias cons e q uências da fal ta de s tas ate nçõe s . É
vul ne rabilidade s . ne ce s s ário conh e ce r e s tas cons e q uências
para pode rm os adoptar as de vidas
práticas . Por ve ze s não s e trata ape nas de
7. Utilizar fe rram e ntas de optim ização do um a pote ncial fal h a ou cras h na
com pil ador. Praticam e nte um conce ito novo, apl icação, m as s im dos ris cos de
várias e xte ns õe s foram re ce nte m e nte fe itas s e gurança q ue pode m caus ar aos s e us
dis poníve is para funcionar dire ctam e nte com utilizadore s .
o com pil ador q ue pe rm ite m m onitorizar o
com portam e nto do RET (e nde re ço de re torno D e ve m e xis tir m étodos e cicl
os no
dum a de te rm inada função) e s al vaguardar de s e nvol vim e nto do s oftw are , e m q ue o
e s te val or de pote nciais al te raçõe s . Stack te s tar do s oftw are te m um pape l
Sh ie l d (h ttp://w w w .ange l fire .com /s k /s tack s h ie l
d) im portante . Um a m aior ate nção de ve s e r
e (h h ttp://w w w .re s e arch .ibm .com /trl /proje cts /s e cu dada a todos os dados obtidos do
rity /s s p). util izador, q ue r s e ja do te clado, fich e iro,
s ock e t, pipe , e tc.

8. Actual izar o s is te m a ope rativo e Site s acons e l


h ados ao l
e itor inte re s s ado:
apl icação. Tal ve z a m e l h or de fe s a é m ante r- •h ttp://e n.w ik ipe dia.org/w ik i/Expl oit_(com pu
se ofe ns ivo e inform ado. Novas te r_s e curity )
vul ne rabil idade s s ão de s cobe rtas e •h ttp://ins e cure .org/s tf/s m as h s tack .h tm l
re portadas todos os dias . Apl icar as de vidas •h ttp://jul ianor.tripod.com /l am agra-bof.txt
al te raçõe s e actual izaçõe s às apl icaçõe s é •h ttp://w w w .m ilw 0rm .com /
fundam e ntal . Por e xe m pl o, re ce nte m e nte foi •h ttp://w w w .m e tas ploit.com /
de s cobe rto um a fal h a na API –M e s s age BoxA
– para q ue m de s e nvol ve apl icaçõe s e m
W indow s e s ta função é bas tante fam il iar, pois
é util izada para m os trar m e ns age ns de
e rro/avis o/inform ação na pl ataform a. Es te
e xpl oit é agora conh e cido com o o prim e iro
e xpl oit do W indow s Vis ta (abrange o W indow s
XP/2003/Vis ta). Um program ador q ue util ize
e s ta API para criar m e ns age ns e m q ue de
al gum a form a é pe rm itido ao util izador
forne ce r o te xto a s e r col ocado na
m e ns age m , têm um a pote ncial fal h a na
Fábio Pe dros a

apl icação q ue pe rm ite um atacante


bl oq ue ar o Sis te m a O pe rativo. M ais
inform açõe s e m h ttp://w w w .s e curite am .com /
w indow s ntfocus /6D 00R0AH PK .h tm l .

<27>
te cnol
ogias

Conce itos Bás icos


O cl us te r parte dum princípio tão s im pl e s q ue
q ualq ue r pe s s oa pode te r um e m cas a. A
partir do m om e nto e m q ue l igam os dois
com putadore s e de algum m odo
cons e guim os te r com unicação e ntre am bos
(via re de l ocal , W ire l
e s s , USB, Fire w ire , e ntre
outros ) é pos s íve ldividir tare fas . Es ta divis ão
de tare fas é o ponto ce ntralda ide ia por trás
de um cl us te r.

Vam os partir de um e xe m pl o s im pl e s:
s upondo q ue te m os um a apl icação q ue

Cl
u s te ring e xe cuta duas s om as inde pe nde nte s . Se s ó
tivés s e m os um com putador o proce dim e nto
norm als e ria a m áq uina faze r prim e iro um a
s om a e de pois a outra, m as vam os s upor q ue
Cl us te ring é o agre gar dois ou m ais te m os dois com putadore s q ue cons e gue m
com putadore s de m odo a q ue e s te s com unicar um com o outro. Pas s am os e ntão
funcione m e m paral elo para um m e s m o ao cl us te ring, um de l e s (o m as te r) as s um e a
fim . D e s te m odo te m os o q ue é ch am ado função de dis tribuir trabal h o e ntre os dois . O
cl us te r, um grupo de m áq uinas inte rl
igadas outro (s l ave ) ape nas re ce be “orde ns ” do q ue
via (por e xe m pl o) re de local q ue te m a faze r. (Es ta divis ão de tare fas é m uitas
cons e gue m com unicar e ntre s i. ve ze s crítica e te m de s e r m uito be m
program ada pe l o program ador.) Ne s te cas o
a divis ão s e ria s im pl e s , o m as te r ficava com
um a das s om as para e xe cutar e daria a
Ne ce s s idade e Im portância outra ao s l ave , q ue a re ce bia pe l o m e io de
com unicação util izado e de vol via o re s ultado
Cada ve z m ais s e util izam com putadore s
pe l o m e s m o canal . No finalo m as te r te ria
para re s ol ve r os m ais dive rs os probl e m as . À
am bos os re s ul tados das contas e pode ria
m e dida q ue e s te s vão apare ce ndo e
s e guir o norm alfl uxo de e xe cução. D e notar
cre s ce ndo e m com pl e xidade é ne ce s s ário
q ue am bas as s om as s e riam fe itas ao m e s m o
ir e ncontrando novos m étodos para s e r
te m po, m as e m m áq uinas dife re nte s ,
be m s uce dido na s ua re s ol ução. Se ndo
de m orando portanto m e tade do te m po
q ue a abordage m inicialm ais com um é a
inicial (s e m contar com as ove rh e ads da
de te ntar ach ar um m e l h or algoritm o e s ta
com unicação).
ne m s e m pre é cons e guida. M uitos
probl e m as q ue s urge m h oje e m dia s ão
Es te é o princípio bás ico do cl us te ring e pode -
s im pl e s m e nte de m as iado grande s e m
s e ve r q ue h á dive rs os factore s a te r e m
com pl e xidade (m e s m o com al goritm os
conta q uando m ontam os um cl us te r: de s de
bas tante trabal h ados e optim izados ) para
ligação e ntre m áq uinas (l atência e l argura
s e re m re s ol vidos por um a m áq uina is ol ada.
de banda), núm e ro de m áq uinas inte rl igadas
É ne s te ponto q ue e ntra o cl us te ring. Se
(tam bém ch am ados nós ), capacidade de
cons e guim os ach ar um a s ol ução m as
paral el is m o da apl icação até ao cus to total
util izando um a s ó m áq uina não a obte m os
de todo o s is te m a e , m uito im portante , a
e m te m po útil , e ntão vam os paral elizar o
função do s is te m a, pois a configuração da
proce s s am e nto de m odo a q ue e s te s e ja
m áq uina varia m uito com a função finalq ue
dis tribuído por m ais q ue um a m áq uina.
o cl us te r irá de s e m pe nh ar.

<28>
te cnol
ogias

M ode l
os de Cl
us te ring Sis te m as Tol
e rante s a Fal
h as
Com o pas s ar dos anos o cl us te ring e vol
uiu Ne s te s s is te m as te m os ge ral m e nte um a
de s de um a ide ia inicialm ais focada e m m áq uina inicialq ue corre as apl icaçõe s
re s olve r grande s probl e m as para outras ne ce s s árias , e um a s e gunda q ue s ubs titui a
áre as , onde o q ue te m m ais im portância é prim e ira no cas o de s ta fal h ar. Es te tipo de
a cone ctividade e ntre m áq uinas , s e gue -s e e s q ue m a te m bas tante apl icação e m bas e
um a l is ta das áre as onde a im portância do de dados , onde um prim e iro s e rvidor é
cl us te ring (de um ou outro m odo) te m dado com o principale corre a apl icação
cre s cido. norm al m e nte , e xis tindo um s e gundo q ue
vai m ante ndo um a cópia da inform ação e
as s um e o pape lprincipalcas o h aja um a
Com putação Paral
ela fal h a de funcionam e nto no prim e iro. Is to
pe rm ite m ante r todo o s is te m a a funcionar
Cons is te na divis ão por várias m áq uinas de s e m pre juízo para util izadore s . Es ta é um a
um m e s m o probl e m a. Todas trabal h am e m configuração s im pl e s e e xis te m num e ros as
conjunto e cada um a re s ol ve um a form as de dividir os dados , pode ndo os
pe q ue na parte de s s e m e s m o probl e m a. com putadore s e s tar e m s al as , e difícios ,
G e ral
m e nte para e s te tipo de trabal ho país e s ou até contine nte s dife re nte s , de
ape nas é ne ce s s ário CPU Tim e por parte de m odo a e vitar catás trofe s naturais e m l arga
cada com putador, s e ndo o ace s s o a e s cal a ou acide nte s fís icos l ocais .
dis cos baixo ou nul o (de pe nde nte , no
e ntanto, do probl e m a e m q ue s tão). Arm aze nam e nto e m Larga Es cal
a
Util izado por m otore s de bus ca com o o
D is tribuição de W ork l
oad G oogl e e s te tipo de cl us te ring é (e m
princípio) s e m e l h ante à com putação
Apl ica-s e o cl us te ring q uando te m os um a paral ela. Em ve z de s e dis tribuir código a
m áq uina a forne ce r de te rm inado s e rviço e , e xe cutar aq ui s ão dis tribuídos dados a
por al gum a razão, e s ta de ixa de cons e guir arm aze nar e m dis co. Com o cada m áq uina
(ou nunca cons e guiu) dar re s pos ta não te m capacidade para s e l igar a
(s atis faze r todos os pe didos ). M ontam -s e ce nte nas de dis cos é ne ce s s ário o us o de
e ntão várias m áq uinas a forne ce r e s s e varias m áq uinas , cada um a com vários
m e s m o s e rviço e divide m -s e os pe didos dis cos . Es te tipo de cl us te ring al ivia o
e ntre e l as . Um e xe m pl o: um a m áq uina a proce s s am e nto q ue cada m áq uina gas ta
corre r um W e b Se rve r (H TTPd) pode não e m ace s s os a dis co e ace l e ra os proce s s os
cons e gui s atis faze r todos os pe didos de de l e itura. Ape s ar de s tas vantage ns a s ua
q ue m vis ita as páginas al ojadas e m dis co. principal função continua a s e r o
Ne s te cas o e xis te a h ipóte s e de m ontar arm aze nam e nto. Se um a dada bas e de
um a outra m áq uina com o m e s m o W e b dados for de tam anh o cons ide ráve le s ta é
Se rve r e um a cópia e xacta do dis co do tam bém um a opção a te r e m conta, e
s e rvidor inicial . (As m áq uinas e ncontram -s e m uitas ve ze s a única. Ate nção q ue ne s te
inte rl igados e um a de l as (s l ave ) irá s is te m a não s e fal a e m dados re pl icados
m odificar o s e u conte údo e m dis co s e m pre (copias de s e gurança), pode ndo tam bém
q ue algo for m udado no m as te r.) s e r al go a te r e m conta q uando s e
Final m e nte pode m os dire ccionar os de s e nh a um cl us te r de s ta nature za.
vis itante s para um ou outro s e rvidor
conform e a afluência de cada M anute nção e M onitorização
com putador, e vitando a s obre carga de
cada um de l e s. Ne s te cas o te m os um núm e ro e l e vado de
m áq uinas q ue q ue re m os m onitorizar.

<29 >
proje cto

É pos s íve l faze -l o “à m ão” m as pode s e r Pe rform ance do Cl


us te r
de m orado. A s ol ução é l igar todas e s s as
m áq uinas a um a nova q ue corra apl icaçõe s de A pe rform ance de um cl us te r de pe nde do
m onitorização, de m odo a avis ar o re s pons áve l núm e ro (e q ual idade ) das m áq uinas q ue
q uando h ouve r fal h as . D e pe ndo da nature za do e s tão inte rl
igadas . Q uando é ne ce s s ário m ais
s is te m a pode m os ainda util izar e s tas ligaçõe s capacidade de arm aze nam e nto ou m ais
para actual izaçõe s de s oftw are e m anute nção pode r com putacionals ão adicionados m ais
das m áq uinas m onitorizadas . Um e xe m pl o de s ta dis cos ou m ais m áq uinas . O cre s cim e nto de
s ituação pode s e r e ncontrado nas e m pre s as de pe rform ance , a níve lcom putacional , não é
W e b H os ting (q ue forne ce m e s paço na Inte rne t line ar m as s e rve os propós itos ne ce s s ários
para criação de páginas ). São e m pre s as q ue , s e m grande s bottl e ne ck s .
ge ral m e nte , contam com grande núm e ro de
s e rvidore s e q ue , de vido à nature za do s oftw are O m aior probl e m a s urge na l igação via re de .
q ue corre m , ne ce s s itam de actual izaçõe s com Exis te m duas grande s q ue s tõe s : l argura de
al gum a fre q uência. Ne s te cas o a m onitorização banda e l atência. O s probl e m as de l argura
é tam bém útilpara de te rm inar s e um a m áq uina de banda s ão facil m e nte re s ol
vidos
e s tá com probl e m as , is to é crítico para um m udando a l igação ou adicionado l inh as
ne gócio q ue te m de e s tar a corre r 24 h oras por e xtra. O s e gundo probl e m a, a l atência, trás
dia. bas tante s m ais dificul dade s . A l atência é o
te m po q ue os dados de m oram a pas s ar por
G rid Com puting todo o h ardw are de um ponto inicial ao
ponto final(inde pe nde nte m e nte do tam anh o
Conce ito e de finição bas tante s e m e l h ante à dos dados , is to é, te m po adicionado ao
com putação paral ela m as com um a dife re nça te m po totalde pas s age m da inform ação).
e m m uitos cas os . É naturalus ar o te rm o G rid Es te factor é im pos s íve lde anul ar m as pode
Com puting para re fe rir um a re de de se r m e l h orado com h ardw are de boa
com putação paral el
a s obre a Inte rne t. É na q ual idade . Es ta q ue s tão traz probl e m as com
m e s m a com putação paral ela m as com os q uais o program ador de ve contar, tais
algum as l im itaçõe s ao níve l da l argura de com o a s incronização. É im portante te r
banda e l atência. Exe m pl os s ão o G IM PS, noção de q uanto te m po s e gas ta e m
SETI@ H om e , Folding@ H om e , e tc. com unicação via re de de m odo a m inim izar
o te m po pe rdido e nq uanto os dados s ão
Es te s proje ctos ne ce s s itam de grande pode r e nviados de nó a nó. Q uando a
com putacional e ao invés de com prare m program ação de cada nó é e ficie nte a
m áq uinas q ue fiq ue m ao s e u s e rviço optaram baixa pe rform ance da re de é um probl ema
por dis tribuir pe l os s e us utilizadore s pe q ue nos de m e nor im portância. Um a boa técnica
program as q ue re ce be m dados de um s e rvidor para e vitar pe rda de te m po e m e nvios de
ce ntral , e fe ctuam os cál cul os e de vol ve m os dados pe l a re de é a e xe cução de duas
re s ultados a e s s e m e s m o s e rvidor. Es te s s ão ins tâncias do m e s m o program a na m e s m a
proje ctos de nature za m uito própria, e m q ue m áq uina. Enq uanto um a com unica e e s pe ra
Pe dro Ve rrum a & Luis Re nte

um a l igação cons tante à Inte rne t não é a re ce pção ou e nvio de dados a outra
ne ce s s ária, ne m tão pouco q ue s e ja rápida ou s e gue o proce s s am e nto norm al .
de baixa l atência (al go im pos s íve lde garantir).
M uitos de l e s ape nas ne ce s s itam de um a
ligação um a ve z por m ês de m odo a pe dir
dados e e nviar re s ul tados . São um tipo de
cl us te ring e m e rge nte pois cada ve z m ais
pe s s oas têm com putadore s e m cas a e ace s s o à
Inte rne t. Es te m ode l o te m , com o é óbvio,
bas tante s l im itaçõe s pe l o q ue a s ua m aior
util ização é junto de proje ctos m e nos críticos e
onde o dinh e iro é um a q ue s tão de pe s o.

<30>
tutorial

O nam e s pace Sy s te m .D ata.Sq lClie nt dá-nos


ace s s o a todas as clas s e s q ue
corre s ponde m ao provide r para o SQ L
Se rve r, pe rm itindo-nos as s im a l igação ao
s e rvidor, e xe cução de com andos , l e itura dos
dados , e tc, tudo is to com as s uas cl as s e s
incl uídas .

Para e xe m pl ificarm os a util ização de s tas


cl as s e s , ire m os cons ide rar um a s ituação não
re al:

“No s ite da Re vis ta Program ar e s tão


Vis ualBas ic .NET lis tadas todas as e diçõe s l ançadas até
ao m om e nto. Um a apl icação foi
5ª Parte de s e nvolvida para pe rm itir a ins e rção,
al te ração e re m oção das e diçõe s por
u m adm inis trador q u e a te nh a ins tal
ada
Com o foi re fe rido no artigo ante rior, o te m a no s e u com pu tador. Todos e s te s dados
de s ta e dição é re l acionado com bas e de e s tão arm aze nados nu m a bas e de
dados , m ais concre tam e nte , ire m os fal ar dados e m M S SQ L Se rve r 2005.”
s obre a m anipul ação de dados e ntre o
VB.NET (h ttp://m s dn2.m icros oft.com /e n-us /
vbas ic/de faul t.as px) e o M S SQ L Se rve r A bas e de dados util izada irá conte r ape nas
2005™ (h ttp://w w w .m icros oft.com /s q l
). 2 tabe las . Um a arm aze na as e diçõe s já
l
ançadas e a outra contém todos os
O AD O .NET é um m ode l o de ace s s o de com e ntários ins e ridos pe l
os vis itante s .
dados (s uce s s or do AD O – Acce s s D ata
O bje ct) q ue nos forne ce o ace s s o a variados Para pode rm os com unicar com a bas e de
“data s ource s ” com o por e xe m pl o ao M S SQ L dados q ue criam os pre cis am os de
Se rve r 2005, q ue é o q ue vam os util izar para e s tabe le ce r um a l igação e ntre a nos s a
os e xe m pl os ne s te artigo. As cl as s e s do apl icação e o SG BD . O obje cto Conne ction
AD O .NET e s tão re fe re nciadas no nam e s pace é us ado e ntão ne s ta s ituação, pe rm itindo-
Sy s te m .D ata m as ne s te artigo vam os util izar o nos com unicar com a bas e de dados
nam e s pace Sy s te m .D ata.Sq l Cl
ie nt. util izando cl as s e s com o a Sq l
Conne ction.

<31>
tutorial

Dim ligacao As SqlConnection = New SqlConnection("Data Source=XPTO;


Initial Catalog=RevistaProgramar;User Id=SA;Password=XPTO;")
Try
ligacao.Open()
Console.WriteLine("A ligação teve sucesso")
Console.ReadLine()
Catch
Console.WriteLine("Erro na ligação")
End Try

Na de claração da Sq l Conne ction pre cis am os tam bém de indicar um a Conne ctionString2,
us ada para e s tabe l
e ce rm os a l
igação à bas e de dados e m q ue s tão.

Data Source=XPTO;Initial Catalog=RevistaProgramar;User Id=SA;Password=XPTO;

Es tabe le cida a ligação à bas e de dados é te m po de com e çar a m anipul ar os nos s os


dados . Para is s o pre cis am os de us ar a cl
as s e Sq l
Com m and para ins e rir, actualizar ou até
m e s m o apagar os nos s os dados da bas e de dados . Com e s ta clas s e pode m os as s ociar
um a e xpre s s ão e m T-SQ L ou e ntão um Store d Proce dure a s e r e xe cutado na bas e de
dados e um a l igação (Sq l Conne ction)

SqlCommand(“Expressão T-SQL ou Stored Procedure”, SqlConnection)

Para e xe cutarm os o Sq l Com m and pode m os us ar os m étodos Exe cute NonQ ue ry (),
Exe cute Re ade r() e Exe cute Scal
ar().

Exe cute NonQ ue ry : Exe cuta a e xpre s s ão e de vol


ve o núm e ro de l
inh as afe ctadas na
bas e de dados Exe cute Re ade r: Exe cuta a e xpre s s ão e cons trói um Sq l
D ataRe ade r com os
dados de vol
vidos

Exe cute Scal


ar: Exe cuta a e xpre s s ão e de vol
ve o val
or da prim e ira col
una na prim e ira
linh a dos re s ultados de vol
vidos . (Es te m étodo é norm al
m e nte util
izado q uando te m os um a
e xpre s s ão q ue de volve valore s agre gados com o por e xe m pl o “SELECT CO UNT(*) FRO M
tabe la”.)

Proce dim e ntos :

•Ins e rir Edição


Private Sub InserirEdicao()
Dim ligacao As SqlConnection
Dim cmdInserir As SqlCommand
Dim NrLinhasAfectadas As Integer = 0
Try
ligacao = New SqlConnection("Data Source=XPTO;InitialCatalog=RevistaProgramar;
User Id=SA;Password=XPTO;")
cmdInserir = New SqlCommand("INSERT INTO Edicoes(Nr_Edicao,Titulo,Data)
VALUES(@nr,@titulo,@data)", ligacao)

<32>
tutorial

cmdInserir.Parameters.Add("@nr", SqlDbType.Int, 4).Value = Convert.ToInt32(


txtNumero.Text)
cmdInserir.Parameters.Add("@titulo", SqlDbType.VarChar, 255).Value =
txtTitulo.Text
cmdInserir.Parameters.Add("@data", SqlDbType.DateTime).Value = Convert.
ToDateTime(txtData.Text)

ligacao.Open()

NrLinhasAfectadas = cmdInserir.ExecuteNonQuery()
If NrLinhasAfectadas > 0 Then
MessageBox.Show("O registo foi inserido com sucesso", "P@P",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
ListarEdicoes()
Else
MessageBox.Show("Não foi possível inserir o registo. Tente novamente.",
"P@P", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If

Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
ligacao.Close()
End Try
End Sub

•Al
te rar Edição
Private Sub AlterarEdicao()
Dim ligacao As SqlConnection
Dim cmdAlterar As SqlCommand
Dim NrLinhasAfectadas As Integer = 0
Try
ligacao = New SqlConnection("Data Source=XPTO;InitialCatalog=RevistaProgramar;
User Id=SA;Password=XPTO;")
cmdAlterar = New SqlCommand("UPDATE Edicoes " & "SET Nr_Edicao =
@nr,Titulo = @titulo, Data = @data " & "WHERE ID = " & Convert.ToInt32(
dgvEdicoes.CurrentRow.Cells("ID").Value), ligacao)

cmdAlterar.Parameters.Add("@nr", SqlDbType.Int, 4).Value = Convert.ToInt32(


txtNumero.Text)
cmdAlterar.Parameters.Add("@titulo", SqlDbType.VarChar, 255).Value =
txtTitulo.Text
cmdAlterar.Parameters.Add("@data", SqlDbType.DateTime).Value =
Convert.ToDateTime(txtData.Text)

ligacao.Open()

NrLinhasAfectadas = cmdAlterar.ExecuteNonQuery()

<33>
tutorial

If NrLinhasAfectadas > 0 Then


MessageBox.Show("O registo foi alterado com sucesso", "P@P",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
ListarEdicoes()
Else
MessageBox.Show("Não foi possível alterar o registo.",
"P@P", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If

Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
ligacao.Close()
End Try
End Sub

•Re m ove r Edição


Private Sub RemoverEdicao()
Dim ligacao As SqlConnection
Dim cmdRemover As SqlCommand
Dim NrLinhasAfectadas As Integer = 0
Try
ligacao = New SqlConnection("Data Source=XPTO;Initial Catalog=RevistaProgramar;
User Id=SA;Password=XPTO;")
cmdRemover = New SqlCommand("DELETE FROM Edicoes " & "SET Nr_Edicao =
@nr,Titulo = @titulo, Data = @data " & "WHERE ID = " & Convert.ToInt32(
dgvEdicoes.CurrentRow.Cells("ID").Value), ligacao)

cmdRemover.Parameters.Add("@nr", SqlDbType.Int, 4).Value =


Convert.ToInt32(txtNumero.Text)
cmdRemover.Parameters.Add("@titulo", SqlDbType.VarChar, 255).Value =
txtTitulo.Text
cmdRemover.Parameters.Add("@data", SqlDbType.DateTime).Value =
Convert.ToDateTime(txtData.Text)

ligacao.Open()

NrLinhasAfectadas = cmdRemover.ExecuteNonQuery()
If NrLinhasAfectadas > 0 Then
MessageBox.Show("O registo foi removido com sucesso", "P@P",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
ListarEdicoes()
Else
MessageBox.Show("Não foi possível remover o registo.", "P@P",
MessageBoxButtons.OK, MessageBoxIcon.Error)
End If

Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
ligacao.Close()
End Try
End Sub

<34>
tutorial

Com o pode m ve r, e s ta é um a m ane ira s im pl


e s de e nviar pe didos à bas e de dados para
e xe cutar al
go.

Um a técnica m uito us ada, é o us o de parâm e tros nos Sq l Com m ands de form a a s im pl ificar e
clarificar o nos s o código. Em ve z de te rm os a tare fa de concate nar s trings , com o por e xe m plo,
“SELECT * FRO M tabe l a W H ERE Id=” & variave l _id & “ Nom e =’” & variave l _nom e & “’”, o q ue
faria com q ue um a e xpre s s ão m ais e xte ns a s e torna-s e bas tante confus a, pode m os as s ociar
ao Sq l Com m and um ou vários parâm e tros (Sq l Param e te r).

cmdInserir.Parameters.Add("@nr", SqlDbType.Int, 4).Value =


Convert.ToInt32(txtNumero.Text)

de : Proce dim e nto “Ins e rir Edição”

Um Sq lParam e te r na s ua de claração m ais s im ple s , pode conte r um nom e (“@ nr”), o tipo de
dados (Sq l
D bTy pe .Int) e um tam anh o (4). O nom e do parâm e tro é de pois us ado na e xpre s s ão T-
SQ L com o val or atribuído na proprie dade Val ue . Ne s ta s ituação, trata-s e de um parâm e tro
com a dire cção de Input.

Após e ntão e xe cutarm os o com ando, te m os de pois q ue nos ce rtificar q ue tudo corre u com o
pre vis to e s e o q ue pre te ndíam os foi re al m e nte e xe cutado. Com o re fe rim os e m cim a, o
m étodo Exe cute NonQ ue ry () de volve o núm e ro de l inh as q ue foram afe ctadas na e xe cução de
um a e xpre s s ão. A variáve l“NrLinh as Afe ctadas ” arm aze na e ntão e s s a inform ação, bas tando
e ntão s e r igual
ada ao m étodo re fe rido.

NrLinhasAfectadas = cmdInserir.ExecuteNonQuery()
If NrLinhasAfectadas > 0 Then
MessageBox.Show("O registo foi inserido com sucesso", "P@P",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

de : Proce dim e nto “Ins e rir Edição”

Para pode rm os al te rar ou re m ove r um a e dição, pre cis am os de indicar à nos s a apl
icação q ual
é o núm e ro do s e u re gis to de form a a e xe cutar am bas as e xpre s s õe s corre ctam e nte . Com o
pude m os ve rificar no proce dim e nto Al te rarEdicao() e Re m ove rEdicao, te m os as s e guinte s
e xpre s s õe s as s ociadas aos com andos :

UPD ATE Edicoe s "& _


"SET Nr_Edicao = @ nr,Titulo = @ titul
o, D ata = @ data "& _
"W H ERE ID = "& Conve rt.ToInt32(dgvEdicoe s .Curre ntRow .Ce l
l
s ("ID ").Val
ue )

D ELETE FRO M Edicoe s "& _


"SET Nr_Edicao = @ nr,Titulo = @ titul
o, D ata = @ data "& _
"W H ERE ID = "& Conve rt.ToInt32(dgvEdicoe s .Curre ntRow .Ce l
l
s ("ID ").Val
ue )

Es te ID é atribuído pe l o valor arm aze nado da col


una com o nom e “ID ” e na l inh a
se l e ccionada do com pone nte D ataG ridVie w (dgvEdicoe s ), com pone nte e s te q ue nos pe rm itir
lis tar todos os re gis tos da tabe l
a Ediçõe s .

<35>
tutorial

Proce dim e nto Lis tarEdicoe s ()


Private Sub ListarEdicoes()
Dim ligacao As SqlConnection
Dim daEdicoes As SqlDataAdapter
Try
ligacao = New SqlConnection("Data Source=XPTO;Initial Catalog=RevistaProgramar;
User Id=SA;Password=XPTO;")
daEdicoes = New SqlDataAdapter("SELECT * " & "FROM Edicoes", ligacao)
Dim dsEdicoes As DataSet = New DataSet
daEdicoes.Fill(dsEdicoes, "Edicoes")
dgvEdicoes.DataSource = dsEdicoes
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
ligacao.Close()
End Try
End Sub

Ne s te proce dim e nto faze m os us o dos obje ctos D ataSe t e D ataAdapte r. Pode m os cons ide rar o
D ataSe t com o um conjunto de dados , talcom o as e s truturas das bas e de dados , pe rm itindo
as s im um a m aior facil idade na m anipul ação dos dados , te ndo tam bém com o vantage ns a
não ne ce s s idade de e s tar com um a l igação activa à bas e de dados , e a não inte racção
dire cta com a nos s a fonte de dados . O D ataAdapte r por s ua ve z, é a ponte de l igação e ntre a
nos s a bas e de dados e o D ataSe t.

Para e s ta s ituação, util izám os o Sq l D ataAdapte r e as s ocíam os um com ando com um a


e xpre s s ão T-SQ Lpara nos de vol ve r a l
is ta das e diçõe s ins e ridas na bas e de dados . Após is s o,
us ám os o m étodo Fil l
, q ue vai pre e nch e r o D ataSe t com os re s ul tados de vol
vidos , pode ndo
as s im de finir o nos s o D ataSe tcom o o D ataSource da D ataG ridVie w q ue vai m os trar as e diçõe s .

Fe ito is to, te m os finalm e nte a nos s a apl icação a funcionar corre ctam e nte , com a l
is tage m das
e diçõe s e a pos s ibil idade de ins e rir, al
te rar e re m ove r e diçõe s .

O proje cto de de m ons tração e ncontra-s e dis poníve le m :


h ttp://w w w .portugal
-a-program ar.org/artigos /vb5.rar gado
Tiago Sal

<36>
gnu/l
inux

Ante riorm e nte à e s crita de s te artigo não


e xis tia um a ve rs ão portugue s a de s te
program a. No e ntanto, os m e m bros de s ta
re vis ta diponibil
izaram -s e , e , e xis te agora
um a tradução dis poníve lq ue facil itará a
utilização do program a e m m odo gráfico.

D e pe ndências
•libas ound2 (> 1.0.10)
•libc6 (> =2.3.2.ds 1-21)
•libice 6
•libogg0 (> =1.1.2)
•libs m 6

G ravação do D e s k top •l
•l
ibth e ora0
ibvorbis 0a (> =1.1.0)
•libvorbis e nc2 (> =1.1.0)
Q uantas ve ze s q uis criar um tutorialcom a •libvorbis file 3 (> =1.1.0)
s ua dis tro de G NU/Linux ou a e s cre ve r um •libx11-6
código q ue q ue ria partil h ar e , e m ve z de o •libxdam age 1
apre s e ntar com im age ns e com e ntários , •libxe xt6
pe ns ou e m gravar um víde o cons igo a •libxfixe s 3
com e ntá-l o? Criar um proje cto para a •zlib1g (> =1:1.2.1)
e s cola ou unive rs idade e m q ue um víde o
s e ria m ais fácile prático de apre s e ntar?
Criar um víde o para um a pl ataform a de Com andos
e Le arning ou bLe arning?O u s im pl e s m e nte ,
para m os trar aos am igos os e fe itos 3D do A form a ge nérica de e xe cutar o program a é:
s e u D e s k top?
$ recordmydesktop
Ne s te artigo irá s e r apre s e ntada um a
Is to irá gravar um fich e iro com o nom e
s olução para tal . O program a us ado é o
out.ogg na s ua pas ta h om e . Para parar a
re cordM y D e s k top.
gravação s im ple s m e nte cl
iq ue Ctrl+ C.
Para de finir o nom e do fich e iro e /ou a
local ização bas ta:
re cordM y D e s k top
$ recordmydesktop /home/user/video.ogg
O re cordM y D e s k top é um program a criado
Joh n Varouh ak is , program ado e m C, O program a tam bém pe rm ite de finir áre as a
lançado e m 12 de Jul h o de 2006 (data da s e r gravadas . As s im pode us ar-s e :
ins crição do proje cto no Source Forge ) e
dis poníve l para dow nload em $ recordmydesktop -x x-pos -y y-pos
h ttp://re cordm y de s k top.s ource forge .ne t. A -width largura -height altura -o
lice nça de s te s oftw are é G PL (G NU Publ ic video.ogg
Lice ns e ). Es tá de m om e nto e m e s tado
al ph a, m ais concre tam e nte na ve rs ão 0.3.1. Tanto a opção x-pos com o a opção y-pos
re fe re m -s e à dis tância e m pixe l
s a partir do
Ape s ar do program a originals e r e m m odo canto s upe rior e s q ue rdo.
te xto e xis te um a ve rs ão gráfica us ando a
pl ataform a G TK .

<37>
gnu/l
inux

As opçõe s l argura e altura re fe re m -s e , com o Para o program a codificar o víde o à


o próprio nom e indica, à al tura e l argura da m e dida q ue vai gravando pode us ar a
jane la a s e r gravada. Se o tam anh o da opção --on-th e -fl y-e ncoding. Is to irá e xigir
jane la ins e rido for m aior q ue o da re s ol ução m ais do proce s s ador, logo us e e s ta opção
actual , s e rá notificado e nada aconte ce rá. ape nas s e tive r um a boa m áq uina q ue
Por e xe m pl o s e fos s e de finido com as ague nte as e xigências no proce s s am e nto
s e guinte s opçõe s : víde o.

$record recordmydesktop -x 348 -y 235 A q ual idade do víde o é de finida pe lo


-width 494 -height 364 -o video.ogg s e guinte com ando e m q ue n é e ntre 0 e
63(de faul t):
G ravaria ape nas e s ta parte de um D e s k top:
$ recordmydesktop -v_bitrate n

Para de finir um atras o a iniciar a gravação


bas ta us ar:

$ recordmydesktop t[h/m]

Com o de faul t t as s um e o val or e m


s e gundos (bas ta pôr um núm e ro). No
e ntanto s e q uis e r us ar um atras o de h ou
m inutos bas ta adicionar a l
e tra
corre s ponde nte a s e guir ao núm e ro.
Exe m pl o: 5m , 1h .

Para gravar o D e s k top com o com piz ou


be ry lé ne ce s s ário tam bém us ar a opção --
full
-s h ots q ue tira um a Scre e nSh ot a cada
Para s e te r um curs or dife re nte pode us ar-s e : fram e .

$ recordmydesktop -dummy-cursor cor


M odo gráfico
O val or cor pode s e r bl ack (pre to) ou w h ite
(branco). Irá s ubs tituir o s e u curs or por um
curs or pe q ue no da cor de finida. Ide alpara
pas s ar de s pe rce bido.

Pode ainda s e r de finido o núm e ro de


fram e s por s e gundo (N) com o s e guinte
com ando:

$ recordmydesktop -fps N

Para não us ar s om na s ua gravação


ape nas te m de adicionar a opção --no-
s ound.

<38>
gnu/l
inux
Pode s e r us ado para criar novas , para e ditar,
D e pe ndências para corrigir ou para s incronizar. Es te
•re cordm y de s k top program a te m um gráfico do e s pe ctro de
•xbas e -clie nts áudio o q ue facil ita e m m uito o trabalh o de
•py th on-gtk 2 s incronizar um a l e ge nda. Com e s te gráfico
•py th on-gnom e 2e xtras do e s pe ctro de áudio pode ve rificar-s e as
•py th on e ntradas do s om , e as s im , faze r um a
le ge ndage m de form a corre cta e fácils e m
Com o m odo gráfico o program a fica ve rificar tantas ve ze s o fil
m e poupando te m po.
bas tante m ais prático e fácilde us ar. Para
se le ccionar um a parte da jane l a bas ta Concl
uindo o s e u víde o
clicar na im age m e arras tar até onde
pre te ndido. Todas as opçõe s e s tão tam bém O form ato .ogg, ape s ar de s e r um form ato
dis poníve is no m e nu "Advance d". No finalda ope n-s ource e tão bom com o outros , não é
gravação, bas ta cl icar no ícone na form a m uito us ado na ge ne ral idade . Por is s o o
de um q uadrado q ue irá e s tar col ocado na mel h or é talve z conve rte r o s e u víde o para
áre a de notificação do s e u D e s k top. avi, q ue é um form ato m ais conh e cido e para
além dis s o torna o víde o um pouco m ais
G ravar com s om pe q ue no. Para talpode us ar o m e ncode r, um
pacote do program a m pl ay e r. Bas ta us ar:
O re cordM y D e s k top te m a pos s ibilidade de
gravar com s om . No e ntanto, ne m todos nós $ mencoder -idx video.ogg -ovc lavc -
gos tam os de fal ar e nq uanto criam os o oac mp3lame -o video-saida.avi
tutorial. Por is s o, m uitas ve ze s o m e l h or é
faze r o víde o s ile ncios am e nte , e m ais tarde Para adicionar o s om pode s e r us ado o
adicionar o s om . Para tale xis te m variados m e ncode r com o com ando -audiofil
e , com o
program as com o por e xe m pl o o G ravador por e xe m pl
o:
de Som do G NO M E e o Audacity.
$ mencoder -idx out.ogg -ovc lavc -
Le ge ndando o tutorial oac mp3lame -audiofile som.mp3 -o
video-saida.avi
Por ve ze s , por um a q ue s tão de ace s s ibilidade
Bas ta te r o fich e iro m p3 (ou outro form ato de
a todas as pe s s oas , o m e l h or é le ge ndar o
s om ) q ue o m e ncode r faz o trabalh o.
tutorial . Exis te m várias opçõe s , por e xe m ploo
Jubl e r, o Sabbu e o Subtitl e Editor. Ve jam os
No fim de e xe cutar todos e s te s pas s os te rá o
al guns as pe ctos do Subtitl e Editor. O Subtitl e
s e u víde o pronto a s e r partil
h ado, pode ndo
Editor é um program a grátis prote gido pe l a
s e r vis to, ouvido e l ido por todos s e m
lice nça G PLpara e ditar facil m e nte le ge ndas .
re s triçõe s al
gum as .
Joe lRam os

<39 >
anál
is e s

D e s e nvol
vim e nto O rie ntado por
O bje ctos

João H ug o M iranda
Jos é A ntonio A l
m e ida
Editora: Ce ntroAtl
antico.pt
e cção: Te cnol
Col ogias
Páginas : 232
1ª e dição: O utubro de 2005
ISBN: 9 89 -615-013-3

Se o l e itor não s oube r o q ue é Para além de e xpore m factos e


de s e nvol vim e nto orie ntado a obje ctos , abordage ns , os autore s contam h is tórias ,
dom ain-drive n de s ign ou re factoring e tive r apre s e ntam e xe m pl os práticos , re fl e cte m e
curios idade e m apre nde r s obre e s te s te m as , dis cute m os factos . A obra re l aciona ainda
e ntão e s te l ivro é para s i. Se , incl
us ivé, for um o paradigm a dos obje ctos com as práticas
program ador q ue não s aiba e xactam e nte de program ação m ais re ce nte s e
com o pl ane ar um proje cto q ue pre te nda de m ons tra q ue a anál is e , de s e nh o e a
com e çar, e ntão vai e ncontrar m uitas codificação de um s is te m a de inform ação
re s pos tas ne s te l
ivro. não de ve m s e r actividade s s e paradas ,
com o é m uito us ualaconte ce r. O l ivro faz
"D e s e nvol
vim e nto orie ntado por obje ctos - com q ue o l e itor s e s inta inte re s s ado com
D om ain-D rive n D e s ign, Te s te s Unitários e e s te s te m as , já q ue apre s e nta e xe m pl os do
Re factoring", de João H ugo M iranda e Jos é dia-a-dia de um program ador, e xce rtos de
António Alm e ida, e ditado pe l o código de vidam e nte com e ntados ,
Ce ntroAtl ântico.pt, é um l ivro q ue foca te m as diagram as e e s q ue m as fe itos por
e conce itos e m voga na áre a da e nge nh aria profis s ionais . O s e xe m pl os s ão e m C# , m as
de s oftw are , com o o conce ito de obje ctos , q ual q ue r pe s s oa com conh e cim e ntos
dom ain-drive n de s ign, de s e nvol vim e nto te s t- m ínim os de program ação de ve rá s e gui-l os
drive n, de s e nvol vim e nto de inte rface s de s e m dificul dade .
utilização e re factoring.
É re com e ndado a e s tudante s de
Q ue m q uis e s s e e s tudar e s tas te m áticas te ria program ação e program adore s
de re corre r a l ivros e s critos e m ingl ês , vis to profis s ionais , obviam e nte . Pode ainda s e r
q ue não e xis tiam praticam e nte re fe rências re com e ndado a ge s tore s de proje ctos ,
ne nh um as e m l íngua nacional . O l ivro anal is tas ou re s pons áve is técnicos já q ue
aborda, portanto, te m as cons ide rados de parte do te xto, e s pe cial m e nte os prim e iros
níve linte rm édio-avançado de form a s im pl e s, capítul os , e s tabe l
e ce o e nq uadram e nto
pragm ática e e s tim ul ante até para os conce ptual das te m áticas de batidas ao
longo dos re s tante s capítul os .
Rui M aia

iniciante s , al
argando as s im o públ ico al vo da
obra. Se gue um e s til o re fl e xivo e por ve ze s
tam bém didáctico.

<40>
inte rne t

G oog l
e apre s e nta os 10 te rm os m ais procu rados de 2006
O m ais fam os o m otor de bu s ca da inte rne t continu a a tradição anu al 1. Be bo
de pu bl icar os de z te rm os m ais pe s q u is ados no s e u s ite . 2. M y S pace
A s du as pal avras m ais pe s q u is adas foram Be bo e M y S pace , dois portais 3. W orl d Cup
de com u nidade s a criação de pág inas pe s s oais e afins , s e g u idas pe l os 4. M e tacafe
fanáticos do fu te bolcom "W orl d C u p". O víde o onl ine tam bém m arca 5. R adiobl og
pre s e nça nas pe s q u is as dos inte rnau tas , no 4º l u g ar com o s ite 6. W ik ipe dia
M e tacafe e e m 7º com a pal avra Vide o. 7. Vide o
8. R e be lde
Para m ais inform açõe s : 9 . M ininova
h ttp://w w w .g oog l
e .com /intl
/e n/pre s s /ze itg e is t2006.h tm l 10. W ik i

Re gis to de m arcas onl


ine
Foi dis ponibil izado dia 22 de D e ze m bro do pre s e nte ano
um a nova áre a no portal do Ins tituto Nacional da
Proprie dade Indus trial (INPI), e ntidade re s pons áve l pe l o
re gis to de m arcas , pate nte s e afins , q ue pe rm ite o re gis to
M arcas , D e s igns e Inve nçõe s . Es te s is te m a pas s a a s e r
m ais cóm odo para o util izador, vis to não pre cis ar de s air
de cas a ne m de tratar de pape l ada e s im ul tane am e nte
m ais barato.

h ttp://w w w .inpi.pt

Th e CSS Pow e r
H á al gum te m po atrás , foi apre s e ntado no fórum do Portugal -a-Program ar um
s ite bas tante inte re s s ante para todos os program adore s w e b q ue q ue re m
apre nde r CSS e /ou trabal h am com e l e re gul
arm e nte , falo do s ite M aujor
(h ttp://w w w .m aujor.com /). Es pantos o. Is to é o pe ns am e nto q ue m uitos pode rão
te r ao abrir e s te s ite , e e xpl ico o porq uê: grande q uantidade de inform ação,
fiáve le , principal m e nte , e m Português . É ce rto q ue é português do Bras il , m as
ainda h á e s pe rança q ue s e de s e nvol va um a pl ataform a as s im e m Portugal .
Ficam os à e s pe ra...

<41>
bl
ue s cre e n

Nova am e aça aos M acs

D ificul
dade s e m l
argar
o com putador nas férias ...
Novo gadge tpara
a fam íl
ia iPod

Te cl
ado l
33t

<42>
com unidade

Es tam os a iniciar um novo ano e e s ta O m e u col e ga afirm ou q ue e s te s dois


cos tum a s e r um a época propícia às re fl e xõe s "sonh os "s ó pode riam avançar s e re al m e nte
e à intros pe cção: ol h am os para o q ue cons e guis s e re al
izar o prim e iro, o s onh o de
fize m os ante riorm e nte e anal is am os de criar condiçõe s para por os program adore s
acordo com o q ue pre te nde m os faze r no do P@ P a trabal h ar e m pl ataform as da
futuro. É um a al tura do ano e m q ue , pe l o com unidade . M ais um a ve z, não pude
facto de e s tarm os no início, nos s e ntim os dis cordar.
re novados , prontos a e nfre ntar tudo outra ve z
s e re alm e nte tive r de s e r. D e pois das fe s tas Final m e nte , dis s e q ue outro grande
de Natale do Ano Novo, Jane iro ch e ga e m obje ctivo m e u e nq uanto adm inis trador da
força e re faze m -s e os pl anos , re novam -s e os com unidade e ra faze r com q ue os
obje ctivos . Is to aconte ce principal m e nte proje ctos agora e m arranq ue ficas s e m a
com as (grande s ) com unidade s . trabal h ar a todo o gás até ao fim do
prim e iro s e m e s tre de 2007. Se ria um
O ra, num a conve rs a com um m e m bro do avanço fabul os o e daria ânim o e m uita
s taffdo P@ P e m finais de D e ze m bro, nos dias vontade ao s taff e m ais pos s ibil idade s aos
após o Natale ante s de ch e gar o Ano Novo, util izadore s q ue q uis e s s e m participar. O
re fl
e cti s obre um as s unto e m q ue já tinh a col e ga com q ue m m antinh a a conve rs a
pe ns ado ante riorm e nte , m as não do ponto pe rguntou e ntão s e não ia fal ar do
de vis ta pe s s oal com o aconte ce u ne s ta cre s cim e nto de util izadore s do fórum , s e
dis cus s ão. O m e u col e ga pe rguntou-m e q ue não ia m ais um a ve z apontar dados
obje ctivos , q ue m e tas pre te ndia e u atingir e s tatís ticos . Eu re s pondi q ue , no cas o de
e nq uanto adm inis trador do P@ P. D e facto, cons e guir re al izar e s te s m e us s onh os
ponde re i bas tante na q ue s tão e ach e i q ue e nq uanto adm inis trador da com unidade ,
podia re s ponde r e xactam e nte com o q ue todas as e s tatís ticas "fal ariam "de s uce s s o e
tinh a col ocado nos tópicos q ue apre s e nte i de pros pe ridade e e ntão podíam os
ao s taff, m as q uando ia com e çar a e s cre ve r com parar com o ano 2006 e pre ve r 2008.
note i q ue a pe rgunta s e dirigia m ais ao q ue
e u ach ava e m e nos ao q ue a com unidade Aconte ce q ue e s te s m e us de s e jos não s ão
re alm e nte ne ce s s itava. de m odo al gum a prioridade do s taff do
P@ P . Aponto, m ais um a ve z, a dife re nça
Com e ce i e ntão por re s ponde r q ue q ue ro e ntre obje ctivos da com unidade de
faze r com q ue os program adore s do P@ P obje ctivos pe s s oais e nq uanto adm inis trador
pas s e m o m áxim o te m po pos s íve la trabal h ar da com unidade . No e ntanto, s onh ar é o
no fórum , is to é, pre te ndo criar condiçõe s prim e iro pas s o para a s atis fação pe s s oale
para q ue daq ui com e ce m a s urgir trabal h os e s pe ro q ue não s e ja o úl tim o, no nos s o
s érios e be m organizados . O m e u col e ga cas o. Es pe ro q ue e m 2007 pos s am os todos
com e ntou q ue e ra um a tare fa difícil , q ue ia s onh ar uns com os outros , m as m ais do q ue
e nvol ve r m ais ge nte a trabal h ar de pe rto is s o, trabal h ar no s e ntido de re al izar os
com igo ou e ntão m ais trabal h o para os nos s os de s e jos . Es pe ro ainda q ue daq ui a
actuais m e m bros do s taff. Eu não pude s e ns ive l
m e nte um ano, te nh am os todos um
dis cordar, pe l o q ue continue i a s onh ar al to: grande s orris o na cara e e s te jam os prontos
dis s e q ue e m 2007 gos tava q ue s urgis s e o a e ncarar outros voos , outros s e ntidos
prim e iro concurs o de program ação do P@ P, s e m pre na dire cção da re al ização pe s s oal
patrocinado com prém ios de um a e m pre s a e com unitária. Até l á, e s pe ro q ue te nh am
a de s ignar (um a das e m pre s as das parce rias ) um 2007 ch e io de bons m om e ntos e q ue
Rui M aia

e q ue gos tava de criar um e ve nto no Ve rão traga pros pe ridade a 2008. Um grande
do géne ro G oogl e Sum m e r of Code , m as abraço, e m nom e do s taffdo P@ P .
e xcl us ivo para m e m bros do P@ P.

<43>
Q ue re s participar na re vis ta
PRO G RAM AR?Q ue re s inte grar e s te
proje cto, e s cre ve r artigos e ajudar
a tornar e s ta re vis ta num m arco
da program ação nacional ?
Vai a

w w w .re vis ta-program ar.info

para m ais inform ação com o


participar
ou e ntão contacta-nos por

re vis taprogram ar
@ portugal
-a-program ar.org

Pre cis am os do apoio de todos


para tornar e s te proje cto ainda
m aior...
contam os com a tua ajuda

A Re vis ta PRO G RAM AR é um proje cto


da com unidade Portugal -a-Program ar
w w w .portugal -a-program ar.org
w w w .re vis ta-program ar.info

You might also like