Você está na página 1de 39

<2>

editorial
ndice
3
4
10
14
22

28

34
notcias
tema de capa
- Cloud Computing
a programar
- Interaco Python-MS
Office
- Subversion: Controlo
Total sobre o Software -
2. Parte
- Package Capture em
Java com JPCAP
- Algoritmo de Verhoeff
segurana
- Fundament os de
Segurana em Redes
equipa PROGRAMAR
coordenador
Miguel Pais
coordenador adjunto
Joel Ramos
editor
Pedro Abreu
redaco
Vtor Tomaz
Fernando Martins
Miguel Rentes
Fbio Correia
Ciro Cardoso
colaboradores
Antnio Silva
David Ferreira
Daniel Correira
Joo Matos
Jos Fontainhas
contacto
revistaprogramar
@portugal-a-programar.org
website
www.revista-programar.info
issn
1647-0710
O comeo de uma nova
etapa
Em Julho de 2007, j l to longe no
tempo regular, mas to perto na
escala temporal da revista Programar,
h portanto 9 edies, quase 2 anos,
algo aconteceu na revista Programar.
A sua primeira grande mudana havia
ocorrido e a sua estabilidade seria
posta prova nas futuras edies. Isto
porque uma das principais figuras
deste projecto, o seu primeiro
coordenador Srgio Santos, acabava,
no de abandonar, que projectos destes no se abandonam, mas sim passar o seu cargo
juntamente com todos os seus conhecimentos acumulados ao longo de mais de ano e meio
frente deste projecto... a mim.
Quem era eu? Melhor, quem ramos todos ns quando este projecto comeou? Nada mais que
simples jovens no seu mais puro estado de amadorismo (em que ainda nos encontramos) mas
com uma vontade que os fazia vingar na realizao dos seus projectos. Este foi um deles. Quem
diria que rapazes ainda no na sua maioridade conseguiriam a perseverana, a vontade, ou
simplesmente a carolice que faltou a muita gente grande. Por essa altura referia tambm que a
revista Programar era um projecto composto de mudana. Neste, coordenadores no saem ou
entram por falhas que tenham ocorrido, problemas, ou discusses, a mudana simplesmente
ocorre porque assim que deve ser, e a perpetuao de algum frente de um projecto como
este no apenas ao fim de algum tempo comea a trazer a no inovao que no se quer, como
rapidamente o sndrome do fundador se estabelece e entorpece inevitavelmente em seu
redor a vista s mentes que doutro modo mais longe poderiam ver. Isto tudo tem uma razo,
no que as capacidades de algum que antes traria mudana ao projecto tenham de sbito
desvanecido, apenas o confirmar das exigncias de uma vida que cada vez deixa menos
tempo para todos os hobbies, de modo a prosseguir essa carreira que em hobby comeou.
portanto, no com pena, mas como satisfao que anuncio que chegou altura do Joel
Ramos e do Pedro Caldeira, h praticamente tanto tempo neste projecto como eu, tomarem as
tarefas que lhes sempre estiveram destinadas, e as conduzirem da maneira que estes longos
meses de aprendizagem lhes ensinaram. Tenho a certeza que conduziro este projecto com
saber e dedicao, e que traro todas as inovaes que sabemos serem possveis mas que, tal
como este projecto na sua gestao, precisam de um pequeno salto de f para que se possam
realizar.
H de facto ainda muito a ser possvel. Quem sabe um dia a distribuio de umas quantas
edies em papel seja possvel. Quem sabe se um dia cada estudante no gostaria de ter
escrito pelo menos um artigo para este projecto. Quem sabe se este projecto at no poder
evoluir ou mudar de rumo de modo a se adaptar a outros meios que faam mais sentido nessa
altura que o actualmente adoptado. Mas para tudo isto ser possvel, tero de continuar a haver
pessoas cujos rostos se podem ver nas pginas seguintes, que participam e ajudam estes que
agora coordenam a realizar a rdua tarefa que tm em mos.
Espero que, da minha parte, tenha cumprido as vossas expectativas. J os novos
coordenadores tenho a certeza que cumpriro.
Miguel Pais
Coordenador Adjunto
desde a 4 edio,
a c t u a l me n t e o
Coor denador da
Revista Programar.
Frequenta o 2 ano do
curso de Engenharia
I nf or mt i ca e de
Computadores no IST.
<3>
notcias
Amazon apresenta Kindle 2
A Amazon apresentou esta segunda-feira a nova verso
do seu leitor de livros electrnicos. Oo Kindle 2 mais
fino e leve, apresentando nove milmetros de espessura e
300 gramas de peso. O preo mantm-se igual ao da
verso anterior, 359 dlares.
Nas melhorias ao nvel do design incluem-se o
acabamento de metal na parte de trs, assim como
pequenos botes de navegao, tanto do lado esquerdo
quanto direito. Um joystick substitui o volante scroll da
primeira verso do dispositivo.
Segundo a Amazon, o seu novo leitor de ebooks
apresenta uma autonomia melhorada em 25 por cento,
assim como maior capacidade de armazenamento, que
cresceu para os dois gigas. O Kindle 2 tem igualmente
uma opo para converter texto em voz, lendo livros aos
seus utilizadores.
O ecr mantm-se nas seis polegadas, com uma
resoluo de 600 por 800 pixis.
in Sapo Tek
Sapo Kids pe midos a programar sozinhos - Sistema Scratch apresenta, neste ms,
ferramentas criativas s crianas
Imagine-se que a professora pede um trabalho sobre vulces. Recorrendo ao sistema Scratch, integrado no Sapo Kids, que
ser lanado este ms, a criana pode criar um vdeo animado de forma a ilustrar a deslocao da lava.
Apresentado com mais uma janela do portal Sapo, a rea dos midos oferecer um painel de utenslios inovadores
pensados especialmente para pequenos internautas entre os quatro e os 11 anos. Trata-se de um espao inteiramente
dedicado a contedos pedaggicos e educativos, sublinha fonte da PT. O Sapo Kids permite acesso a mltiplos manuais
escolares com respectivas tarefas, note-se, mas a incluso do sistema Scratch em portugus a sua grande mais-valia.
Para exemplificar a sua utilidade a mesma fonte deu o exemplo do vulco.
Criado pelo Instituto Tecnolgico de Massachusetts (MIT)e inaugurado em Maio, o Scratch fornece gratuitamente o b- a-
b da programao informtica. Apresenta comandos de fcil utilizao, com que se consegue montar imagens, explica
a mesma fonte. A adeso das crianas norte-americanas tem sido de tal ordem que a cada dois minutos tem nascido um
novo projecto.
Pela primeira vez noutra lngua, a sua importao para Portugal prev ainda instalao no computador Magalhes. A
equipa da PT que preparou o modelo nacional preparou, inclusive, alguns ajustes para esse efeito. Por ser o primeiro pas a
adapt-lo, Portugal serve tambm de laboratrio para futuras aplicaes do sistema noutros pases. O contrato com a MIT
contempla ainda os direitos de distribuio para os todos pases de lngua portuguesa.
Outra das suas vantagens a garantia que d aos pais. Tem controlo parental nos acessos aos messenger e e-mail,
definindo estes a lista de nomes para quem os filhos podem contactar.
in Jornal de Notcias
Windows 7 a 3 de Outubro
Os ltimos dias tm sido ricos no que se refere a
novidades acerca do Windows 7. A estratgia de mercado
a utilizar tem sido uma constante no discurso da
Microsoft e, actualmente, j se sabe que o prximo
sistema operativo dever sair a 3 de Outubro deste ano e
em seis verses diferente.
A notcia surge com base na informao colocada no blog
de Lotta Bath, da equipa de parceiros da Microsoft
Sucia, onde o mesmo apresenta o roadmap at ao
lanamento do software. Segundo o texto, que de acordo
com o autor confirmado pelo product manager
Windows Michael Bohlin, o prximo sistema operativo
ter uma Release Candidate a 7 de Abril deste ano,
enquanto que a RTM do Windows 7 tem deadline
marcado para 3 de Outubro. O lanamento de uma RC2
no faz parte dos planos da empresa.
Esta notcia surgiu um dia aps a Microsoft anunciar que
o prximo sistema operativo estar disponvel em seis
verses diferentes: Starter - para netbooks -, Home
Basic, Home Premium, Professional, Enterprise e
Ultimate Edition.
in Sapo Tek
<4>
tema de capa
Cloud Computing
Introduo
O Cloud Computing uma das mais importantes tendncias
tecnolgicas dos prximos tempos. Mas o que afinal cloud
computing? No existe ainda uma definio clara, se quiser
um exemplo disso faa esta pergunta a cinco pessoas
ligadas tecnologia e provavelmente ir obter cinco ou at
mais respostas diferentes.
Existem opinies que dizem que tudo o que est fora da
firewall cloud computing, ou seja, um simples webservice
pode ser considerado cloud computing. Esta resposta at
faz sentido porque na realidade o processamento desse
webservice ocorre fora do nosso computador. No entanto,
cloud computing muito mais do que isso.
Essencialmente trata-se de afastar completamente a
computao e os dados dos computadores de secretria e
portteis, e simplesmente mostrar ao utilizador os
resultados da computao que ocorre numa localizao
centralizada (grandes datacenters) e transmitida via
Internet para o ecr do utilizador. Mais ainda, potenciar a
interaco entre o software, que neste paradigma reside na
nuvem, atravs de servios.
Estaremos ento a voltar poca dos terminais estpidos?
Iremos tentar perceber a resposta a esta pergunta mais
frente neste artigo, mas neste momento torna-se necessrio
perceber as mudanas que ocorreram no passado para
perceber o porqu dessas mudanas no futuro.
Olhando um pouco para a histria dos computadores, no
propriamente a partir do primeiro computador no sentido
do termo (computador humano, pessoa que realizava
clculos numricos), mas sim a partir do primeiro
computador electrnico, vamos tentar perceber as
mudanas nas arquitecturas dos sistemas e as razes que
levaram a essas mudanas.
Histria
Os primeiros computadores eram mquinas enormes, muito
pesadas e de elevado custo. Sempre que algum pretendia
realizar alguma computao tinha que se deslocar a esse
computador, do tamanho de uma sala, para a poder realizar.
O que importante reter que a computao comeou, por
razes econmicas, com uma arquitectura de centralizao
da informao.
Mais tarde surgiram os terminais. O uso de terminais j no
obrigava a que o operador se deslocasse ao computador
para poder realizar operaes e permitia ainda que
estivessem vrias pessoas a usar o computador em regime
de partilha de tempo de computao. A arquitectura
continua centralizada, todas as operaes so realizadas no
computador, sendo o terminal apenas um interface para
aceder ao computador.
medida que a Lei de Moore se vai manifestando, o
tamanho e custo dos computadores desce e torna-se prtica
comum a utilizao de computadores pessoais visto que j
era economicamente vivel ter um computador no
escritrio ou at em casa. Com o uso de computadores
pessoai s passa-se a uti l i zar uma arqui tectura
completamente descentralizada. Neste momento poderia
optar-se pelas duas arquitecturas, a centralizada que ainda
oferecia um custo mais baixo em termos de custo por
utilizador, ou um sistema completamente descentralizado
que oferecia uma maior autonomia e melhor interface aos
utilizadores.
Posteriormente surge a arquitectura cliente-servidor em
que existem computadores em ambos os lados. Algumas
partes do programa correm no computador-servidor e
outras correm no computador-cliente. Isto causa um
aumento da complexidade do software dada a necessidade
de comunicao e sincronizao entre as partes. Estamos
agora numa arquitectura mista.
Entretanto surge o primeiro Web browser que apenas
mostrava texto e praticamente todo o processamento era
realizado no lado do servidor. Voltamos novamente a uma
arquitectura completamente centralizada. As capacidades
deste tipo de aplicaes eram muito limitadas. Os Web
browsers evoluram, sendo j possvel correr cdigo de
aplicaes dentro destes, o que levou e leva a que apaream
cada vez mais aplicaes Web em detrimento de aplicaes
desktop.
Esta arquitectura cliente-servidor oferece algumas
<5>
tema de capa
vantagens tecnolgicas que naturalmente se tornam em
vantagens econmicas. A centralizao de todos os dados
no servidor um exemplo disso, que leva a um aumento da
segurana e reduo nos custos de manuteno.
Como pudemos observar, certa parte destas mudanas
aparecem por razes econmicas. Se uma arquitectura
diferente apresenta as mesmas funcionalidades a um preo
mais reduzido tende a ser cada vez mais adoptada.
Motivao
Chegamos agora parte mais importante. Com o
aparecimento de Web browsers com cada vez mais
capacidades e cada vez mais cumpridores dos standards, e
com as capacidades para acesso Internet que existem,
torna-se cada vez mais possvel a ideia de afastar
compl etamente a computao e os dados dos
computadores pessoais e mov-los para a nuvem.
Na base desta mudana esto, como mencionado
anteriormente, a evoluo tecnolgica que agora existe e
novamente as razes econmicas, nomeadamente com a
reduo de custos que essa mudana pode proporcionar.
Vamos agora dar uma vista de olhos nas prximas
tendncias na rea das tecnologias de informao para
tentar perceber se esta mudana ter ou no condies para
acontecer.
Prev-se que nos prximos anos, trs das principais
tendncias na rea das tecnologias de informao sejam a
mobilidade, o software como servio (SaaS) e o hardware
como servio (HaaS).
A mobilidade significa simplesmente que os notebooks vo
ficar em casa. Ou seja, vamos passar a levar connosco
dispositivos mais leves, mais pequenos e com a mesma
eficincia. Esses dispositivos compactos tero preos
relativamente baixos e sero munidos de aplicaes Web.
Software as a Service
Software como servio significa que muitas das aplicaes
de negcios sero contratadas no modelo servio em vez de
licena de software. No modelo SaaS a empresa paga na
proporo em que usa o software. Essa uma diferena
fundamental em relao ao preo fixo de uma licena. Com
o suporte de empresas como Oracle, SAP e Microsoft e de
lderes da internet, como Google e Amazon, o modelo de
desenvolvimento e distribuio SaaS tende a crescer muito
nos prximos anos.
Em vez de instalar software nos seus prprios servidores, as
empresas contratam o fornecimento desse software como
um servio. E em vez de pagarem uma licena de software,
pagam mensalmente um custo por utilizador ou pelas horas
em que os seus colaboradores estiveram a usar a aplicao.
A interaco com este software realizada da mesma forma
que se realizam as interaces com as aplicaes
empresariais modernas, ou seja, atravs de um Web
browser. As contas de webmail so um bom exemplo de um
software muito utilizado e fornecido como servio. Hoje em
dia, praticamente todas as aplicaes podem ser fornecidas
como servio.
Esta ideia no nova, pois no passado j existiram
Aplication Service Providers. No entanto, esta arquitectura
no teve grande sucesso porque esses fornecedores
dedi caram servi dores e programas a empresas
individualmente. O custo de operao e manuteno
individual de cada um desses servidores impossibilitou o
sucesso desta arquitectura. Os fornecedores de software
como servio trabalham com uma arquitectura diferente:
existe apenas uma instncia do software que serve os vrios
clientes. Apesar de cada cliente ter apenas acesso aos seus
dados e a uma verso personalizada da aplicao, existe
apenas uma instncia desse software a correr no servidor.
Esta arquitectura tem algumas vantagens tais como a
reduo de recursos ocupados no servidor e a reduo dos
custos de manuteno. Cada instncia de um software por
menor que seja requer logo cabea alguma memria e
algum processamento. Essa necessidade multiplicada por
muitos clientes pode tornar considervel esse custo inicial. A
arqui tectura de que vos estou a fal ar reduz
substancialmente essa necessidade dado que apenas existe
uma instncia, embora mais pesada, do software. Como j
foi referido, a manuteno est, neste caso, muito mais
facilitada dado que todas as correces de erros e novas
funcionalidades ficam imediatamente disponveis para
todos os utilizadores.
Os fornecedores disponibilizam ainda formas de os
utilizadores poderem personalizar a sua verso da
aplicao e at a partilha dessas personalizaes com outros
clientes. A maioria dos clientes deste tipo de fornecedores
so pequenas e mdias empresas, mas a constante
complexidade e custo de manuteno de aplicaes
internamente faz com que o nmero de clientes destes
fornecedores tenda a aumentar e a expandir-se a empresas
de maior dimenso.
Hardware as a Service
Hardware como servio significa que a adopo de novas
tecnologias de informao vai deixar de passar por investir
grandes quantias de dinheiro com equipamentos, passando
a adquirir a sua infra-estrutura como servio. A banda larga
de alta velocidade vai permitir colocar a infra-estrutura em
<6>
tema de capa
grandes datacenters com a mesma rapidez de resposta que
teria com uma soluo local.
A possibilidade de adquirir hardware como servio j existe
h muito tempo atravs dos fornecedores de alojamento.
No entanto esta opo enfrenta alguns problemas
complexos tais como a escalabilidade. Normalmente nestes
casos alugado um servidor dedicado o que leva a estarmos
limitados capacidade desse servidor.
Vamos agora pensar do ponto de vista empresarial. Imagine
que tem uma empresa e compra um servidor para dar
resposta s necessidades da sua empresa. Passado algum
tempo a sua empresa est a ter cada vez mais sucesso no
mercado, o seu servidor j no d resposta s necessidades
e tem que adquirir outro e depois mais outro Por alguma
razo o pas entra em recesso e o seu volume de negcios
desce bastante. Ora, para alm dos problemas que a
recesso lhe est a trazer tem ainda que se preocupar em
acabar de pagar os servidores que teve que adquirir e que
agora j no lhe fazem a mnima falta.
Outro exemplo da mais-valia que o hardware como servio
trs s empresas a capacidade de resposta a picos
temporrios. Imagine que a sua empresa tem que processar
um grande volume de dados no final do ms e tal no pode
ser feito de outra forma. Provavelmente ter que adquirir
tecnologia de servidor que estar a dar rendimento apenas
no final de cada ms.
Como j pudemos perceber trata-se de uma arquitectura
altamente escalvel porque permite aumentar ou diminuir a
capacidade do hardware numa questo de minutos. Alm
disso muito flexvel porque d a possibilidade aos
utilizadores de escolher quais as capacidades que cada
instncia ter. A fiabilidade outra grande arma dado que
tira partido de infra-estruturas gigantes, como por exemplo
a infra-estrutura da Amazon ou da Google. Um dos
exemplos mais conhecidos deste tipo de servio o Amazon
EC2 (Amazon Elastic Compute Cloud).
Desvantagens e/ou Preocupaes
At este momento s vimos vantagens neste paradigma,
mas naturalmente tambm existem desvantagens. Algumas
podem parecer desvantagens mas tratam-se apenas, at
prova em contrrio, de preocupaes. O primeiro
inconveniente tem logo a ver com a necessidade de
conectividade, pois sem conectividade no possvel
trabalhar. As ligaes com baixa largura de banda tambm
podero limitar bastante o funcionamento deste tipo de
servio caso a informao a transportar entre as partes seja
de elevada dimenso.
Outra das limitaes a apontar trata-se da privacidade e de
toda a segurana que tem que existir. Existe alguma
desconfiana quanto a deixar a cargo de outra empresa a
tarefa de guardar dados importantes, quer sejam pessoais
ou empresariais. Talvez este tema no se trate de uma
desvantagem mas, apenas e s, de uma preocupao.
Empresas que forneam estes servios vo ter o seu sucesso
ou insucesso muito intimamente ligados sua reputao, e
portanto os mecanismos de segurana sero uma das suas
principais preocupaes.
Outras existiro logo partida mas que tendero a
desaparecer com a evoluo, tais como a menor velocidade,
menor capacidade e menos funcionalidades que este tipo de
software ainda tem em relao ao software desktop.
Existem ainda algumas questes muito importantes por
resolver. Quem o detentor legal da informao e da
propriedade intelectual? quem contrata o servio ou quem
o disponibiliza? possvel que o fornecedor negue ao
utilizador acesso sua prpria informao? Estes e outros
assuntos ainda esto a ser debatido por empresas,
advogados e universidades.
Cloud Platforms
Uma das componentes mais importantes desta tendncia
a chegada das plataformas na nuvem. Este tipo de
plataformas permite aos programadores desenvolver
aplicaes que correm na nuvem, usar servios fornecidos
pela nuvem, ou ambos. Para compreender esta importncia
pense como as aplicaes so desenvolvidas actualmente.
Quando uma equipa de programadores cria uma aplicao, a
maioria das coisas que essa aplicao necessita j existem,
desde um sistema operativo que fornece o suporte bsico
para executar essa aplicao a outros computadores que
oferecem servios como, por exemplo, o armazenamento
em base de dados. Se para desenvolver um software
tivssemos que criar toda esta plataforma base existiriam
muito menos aplicaes nos dias de hoje.
Da mesma forma, se todas as equipas de desenvolvimento
que pretendessem criar uma aplicao para correr na nuvem
tivessem primeiro que criar a sua prpria plataforma
tambm no veramos muitas aplicaes a correr na nuvem.
Felizmente, os fornecedores esto cada vez mais a
responder a este desafio e j existem algumas plataformas
de desenvolvimento na nuvem. Para conseguirmos entender
melhor as plataformas na nuvem vamos tentar perceber
como que funcionam as plataformas locais.
As plataformas locais
Independentemente de uma plataforma ser local ou na
nuvem, pode ser vista como englobando trs componentes:
um software base para interagir com o hardware existente,
<7>
tema de capa
um grupo de servios fornecido pela infra-estrutura e um
conjunto de servios fornecidos por outras aplicaes.
Nos primeiros tempos da computao, a plataforma no era
mais do que um conjunto de software base. Quase todas as
aplicaes utilizam algum software base na mquina onde
correm, o que tipicamente inclui algumas funes de
suporte, tai s como um si stema operati vo base,
armazenamento standard e bibliotecas de tipos.
Nos anos 80 e 90, com a disseminao da computao
distribuda, foram adicionados servios disponibilizados pela
infra-estrutura, com o armazenamento remoto em ficheiros
e bases de dados, a integrao e a identidade a tornarem-se
muito utilizados.
Hoje em dia apesar de as aplicaes existirem acima de tudo
para fornecer servios a utilizadores finais, com a chegada
das aplicaes orientadas para servios, os servios
fornecidos por outras aplicaes locais tornaram-se tambm
parte da plataforma.
No fazendo directamente parte da plataforma, as
ferramentas de desenvolvimento so outra importante
parte desta histria porque ajudam os programadores a
construir aplicaes usando as trs componentes da
plataforma.
tero que lidar com aplicaes de uma escala bem maior,
onde o nmero de utilizadores ser tambm maior.
Vamos agora olhar para a camada base e identificar algumas
diferenas estruturais. Comeando pelo sistema operativo,
sero fornecidas instncias de sistemas operativos a correr
sobre mquinas virtuais. A utilizao de mquinas virtuais
permite que o utilizador possa escolher as capacidades que
quer ter na nuvem e, mais importante ainda, permite
expandir muito rapidamente essas capacidades em caso de
necessidade. No se esperam grandes limitaes quanto ao
sistema operativo a utilizar nas mquinas virtuais, e numa
primeira fase ser Linux o sistema operativo mais utilizado.
No entanto a Microsoft j est a desenvolver a sua
plataforma para a nuvem, a plataforma Azure, sendo difcil
neste momento prever se conseguir recuperar as
desvantagens que parece ter neste momento em relao a
Linux.
As plataformas na nuvem actuais no fornecem as mesmas
opes que uma plataforma local. Os programadores esto
limitados a poucas, ou at apenas a uma, formas de poder
obter suporte local. Relembro que ao estarmos a falar de
suporte local estamos a falar de, por exemplo, acesso a um
servidor de bases de dados a correr na prpria mquina ou
de frameworks sobre as quais as aplicaes correm. Estas
limitaes tambm so, de alguma forma, consequncias da
As plataformas na nuvem
O modelo de plataforma usado na nuvem muito
semelhante ao modelo que acabmos de ver. No entanto, e
dada as suas diferentes caractersticas, ir funcionar de
forma diferente em cada camada. Percebemos facilmente
isso se pensarmos na enorme necessidade de escalabilidade.
Enquanto as plataformas locais lidam, no mximo, com
aplicaes de nvel empresarial, as plataformas na nuvem
necessidade de escalabilidade mas tambm permitem aos
fornecedores focarem-se no desenvolvimento e optimizao
desse tipo de suporte.
Antes de falarmos sobre as caractersticas dos servios
fornecidos pela infra-estrutura na nuvem e por outras
aplicaes na nuvem importante perceber a interaco que
poder existir entre as duas plataformas
<8>
tema de capa
As plataformas locais podero tirar partido dos servios
fornecidos pelas plataformas na nuvem, tal como as
plataformas na nuvem podero tirar partido dos servios
fornecidos pelas plataformas locais. A mudana para
plataformas na nuvem ser em muitos casos uma mudana
progressiva. As aplicaes locais vo cada vez mais inter-
operar com servios e aplicaes que passaro a existir na
nuvem at que um dia todas, ou pelo menos a maioria,
estaro j a funcionar completamente na nuvem.
Quanto a servios fornecidos pela infra-estrutura, muitas
aplicaes locais no tiram partido deste tipo de servios.
Quando falamos de aplicaes na nuvem o mesmo poder
acontecer. Dada a normal existncia de apenas uma
instncia na nuvem poderemos ser levados a pensar que
funcionalidades como o armazenamento em bases de dados
e gesto de identidade passem a ser fornecidos cada vez
menos como servio e passem a fazer parte do prprio
software. Isto porque no existe a necessidade de partilhar
essa informao com outras instncias.
Este pode ser um caminho, mas o caminho contrrio ainda
mais vivel, ou seja, focar o desenvolvimento do software na
lgica de negcio e deixar a resoluo desse tipo de tarefas a
cargo de servios que ligamos ao nosso software e dos quais
tiramos partido. Vamos pensar, por exemplo, no servio de
gesto de identidade. O programador no tem que se
preocupar na forma de guardar e verificar a identidade dos
seus utilizadores, bastando-lhe apenas saber utilizar um
servio que lhe fornece soluo para essa e outras
preocupaes. uma mais-valia importante. As plataformas
que existem hoje em dia na nuvem tm normalmente um
servio de gesto de identidade associado. Trata-se de uma
limitao mas no deixa de ser um servio muito importante
para as aplicaes, at porque a interaco com outros
fornecedores de identidade cada vez mais possvel.
O servio de armazenamento de informao na nuvem um
dos mais atractivos, mas mesmo este tem necessariamente
que ter uma arquitectura diferente devido s caractersticas
da nuvem. Isto poder significar que os programadores
podero tirar partido deste tipo de servio mas poder
implicar mais algum trabalho no desenvolvimento se o
quiserem usar devidamente. Em relao a servios
fornecidos por outras aplicaes no parecem existir
grandes novidades. No entanto, a cada vez maior adopo
de arquitecturas orientadas ao servio vo potenciar ainda
mais a interaco entre as aplicaes, sejam elas locais ou
residentes na nuvem.
<9>
Concluso
Como se pode constatou anteriormente, as plataformas no
mudam muito ao longo do tempo. No entanto, sempre que
aparece uma nova plataforma que apresenta reais
vantagens em relao s existentes ela tende a ter um
impacto muito grande. As plataformas na nuvem ainda no
trazem todas as vantagens que as plataformas locais j
disponibilizam mas apresentam srias vantagens
competitivas. A adopo destas plataformas far parte do
nosso futuro enquanto programadores ou simples
utilizadores de informtica. Fica prometido para uma futura
edio uma anlise mais aprofundada s plataformas
existentes.
Referncias e Bibliografia
Wikipedia - Cloud Computing
HowStuffWorks.com Cloud Computing
GigaOM How cloud and utility computing are different
Cloud Computing Journal -What is Cloud Computing?
Linux Magazine - Computing In The Clouds: Setting
Expectations
Chapell & Associates - A Short Introduction to Cloud
Platforms
InfoWorld - What cloud computing really means
tema de capa
Vitor Tomaz estudante de Engenharia Informtica e
Computadores no ISEL bem como Trabalhador Independente na
rea de Tecnologias de Informao. Tem especial interesse por
Programao Concorrente, Segurana Informtica e Aplicaes
Web.
vitor.tomaz@portugal-a-programar.org
Vtor Tomaz
<10>
Interaco Python-MS
Office
Introduo
Interagir de forma automtica com as aplicaes Excel e
Word da Microsoft algo que permite eliminar tarefas
repetitivas e aborrecidas ao mesmo tempo que aumenta a
produtividade e reduz a possibilidade de erro humano.
Interagir com estas aplicaes atravs de Python bastante
simples, basta algumas linhas de cdigo para ler ou escrever
informao nesses documentos.
Antes de mais, necessrio termos o Office da Microsoft
correctamente instalados no Windows. De seguida, basta
ter o Python 2.6 e a extenso Python Python Win32
Extensions para a verso 2.6. data deste artigo a extenso
est disponvel para vrias verses de Python, at verso
2.6, pelo que se estiver a usar verses mais antigas de
Python provvel que a extenso a suporte. Espera-se uma
verso para Python 3.0 para breve.
Interaco
Uma vez tudo instalado necessrio compreender o modelo
de funcionamento da interaco envolvida. A interaco a
partir de um script de Python efectua-se atravs da
tecnologia COM e do Office Object Model, que permite
simular a utilizao da aplicao por parte de um utilizador
humano. Tal facto implica algumas restries. Dado que a
interaco simula um utilizador, necessrio que haja um
utilizador com sesso aberta no sistema e que o utilizador
no interaja com as aplicaes enquanto o script Python faz
a sua tarefa, dado que as aplicaes sero abertas durante a
operao.
Uma vez compreendido o modelo de interaco, a
codificao da interaco bastante simples. Os exemplos
seguintes seguem uma ordem lgica apenas por motivos de
melhor compreenso do artigo.
Para iniciar a interaco, necessrio recorrer extenso
que foi previamente instalada. Tal obtm-se carregando a
biblioteca win32com.client:
Para invocar a aplicao recorre-se ao objecto Dispatch,
importado no exemplo anterior, tendo como argumento a
aplicao que se pretende manipular e recebe-se um handler
que contm a ligao aplicao.
Para podermos observar a janela, necessrio torn-la
visvel, para tal atribui-se o valor 1 propriedade Visible.
Afectar o valor 0 propriedade torna a janela invisvel.
Para terminar a aplicao recorre-se ao mtodo Quit(),
sendo assim fechada a aplicao.
Por fim, liberta-se o handler que mantinha a ligao
Exemplo
O exemplo seguinte abre o Excel, torna-o visvel e por fim
termina a aplicao. Para executar o exemplo, garante que
no tem o Excel aberto. Provavelmente a execuo do
exemplo ser to rpida que o Excel quase no ser visvel
no ecr.
from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Quit()
del xlApp
from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
xlApp.Quit()
del xlApp
Manipular um Excel
O Excel Object Model indica quais os objectos, propriedades
e mtodos que se encontram disponveis para efectuar a
manipulao de um documento Excel. De forma simles,
Application refere a aplicao, Workbook refere um
documento, Worksheet refere uma pgina, Cell refere uma
a programar
<11>
clula e Range refere um conjunto de clulas.
Assim, para criar um novo documento, basta dizer
aplicao que esta deve adicionar um novo Workbook:
Criar uma nova folha ao documento bastante simples,
recorrendo ao documento activo, referenciado por
ActiveWorkbook, adiciona-se uma nova folha ao mesmo:
Atribuir ou ler valores s clulas de um folha igualmente
simples, basta referir a clula pela sua coordenada e atribuir-
lhe o valor pretendido, ou requisitar o valor actual:
Escrever um Excel
Eis um exemplo completo da criao de um documento
Excel de nome excel-python-pap.xls na raiz do disco C:. O
exemplo encontra-se comentado por forma a ser mais fcil
acompanhar o cdigo.
Antes de mais, necessrio efectuar uma ligao do Python
ao Excel.
Passando s clulas, fcil a atribuio de valores de vrios
tipos, desde texto a datas ou at frmulas do Excel.
As funcionalidades de formatao esto tambm
disponveis, permitindo uma visualizao mais atractiva ao
documento.
Por fim, o documento guardado e a ligao ao Excel
finalizada. Nota: Note-se que a execuo consecutiva deste
script far com que a segunda execuo aparea a janela de
confirmao de sobrescrita do documento, uma vez que
este j existe.
Aps a execuo do script o documento gerado ter o
seguinte aspecto:
xlSheet =
xlApp.ActiveWorkbook.Worksheets.Add()
# Atribuir valor
xlSheet.Cells(1,1).Value = Exemplo
# Ler valor
print xlSheet.Cells(1,1).Value
# Adicionar um novo documento
xlWbook = xlApp.Workbooks.Add()
# Eliminar todas as folhas excepto a
primeira
for i in range(xlWbook.Sheets.Count,
1, -1):
xlWbook.Sheets(i).Delete()
# Seleccionar a primeira folha
xlWbook.Sheets(1).Select()
xlSheet = xlWbook.ActiveSheet
# Alterar o nome da folha para
"Exemplo"
xlSheet.Name = "Exemplo"
# Atribuir strings
xlSheet.Cells(1,1).Value = 'Revista
Portugal-a-Programar'
xlSheet.Cells(2,1).Value = 'Python'
xlSheet.Cells(3,1).Value = 'Criada Em'
xlSheet.Cells(4,1).Value = 'Modificada
Em'
# Atribuir valor numrico
xlSheet.Cells(2,2).Value =
str(sys.version_info[0]) + "." +
str(sys.version_info[1])
# Atribuir uma data
xlSheet.Cells(3,2).Value =
datetime.date.today()
# Atribuir uma frmula
xlSheet.Cells(4,2).Formula = '=Now()'
xlApp.Workbooks.Add()
De seguida trabalhamos com o documento de forma a
ficarmos apenas com uma nica folha, cujo nome
modificado.
# -*- coding: iso-8859-15 -*-
from win32com.client import Dispatch
import datetime
import sys
# Efectuar ligao ao Excel
xlApp = Dispatch("Excel.Application")
xlApp.Visible = 1
a programar
<12>
Ler um Excel
A leitura de um Excel efectua-se com a mesma simplicidade
com que se efectua a escri ta. Para uma mel hor
exemplificao da potencialidade da interaco, este
exemplo contm algumas diferenas em relao ao anterior.
Assim, neste exemplo, o Excel no tornado visvel, ou seja,
a aplicao executa mas a janela nunca visvel para o
utilizador. Mesmo que o utilizador possua um documento
Excel aberto, o documento lido pelo script nunca tornado
visvel. No entanto, o comando de terminar a aplicao
executado e o Excel ser fechado.
Nota: O comando de trmino da aplicao far com que o
Excel termine e feche todos os documentos abertos, mesmo
que sejam documentos abertos pelo utilizador.
O script fica em espera caso a aplicao necessite de
interaco por parte do utilizador, como por exemplo se o
Excel questiona o utilizador se este pretende guardar
alteraes a um documento. Caso se pretenda que a
aplicao no seja terminada, ento o comando de trmino
da aplicao no deve ser executado. Tambm neste
exemplo, as referncias a alguns objectos do documento
Excel sero feitas pelo seu nome, ao contrrio do que
aconteceu no exemplo anterior onde essas referncias eram
efectuadas atravs dos seus indicies. Tal possvel porque o
modelo suporta estas duas formas de referncia para alguns
dos objectos.
Eis o exemplo completo da leitura do documento Excel
criado no exemplo acima. Este exemplo ir ler o documento
e mostrar na shell os valores presentes no documento. De
novo, o exemplo encontra-se comentado por forma a ser
mais fcil acompanhar o cdigo.
De novo, o exemplo comea por efectuar a ligao ao Excel
e de seguida abre o documento.
A folha seleccionada atravs do seu nome, em detrimento
da sua posio.
A leitura dos valores presentes nas clulas faz-se de forma
bastante simples, sendo o seu valor mostrado na consola.
Por fim, o documento fechado sem guardar alteraes e a
ligao ao Excel terminada.
Aps a execuo do script a consola ter o seguinte aspecto:
# Seleccionar a primeira folha de nome
'Exemplo'
xlWbook.Sheets('Exemplo').Select()
xlSheet = xlWbook.ActiveSheet
# Ler o cabealho
print xlSheet.Cells(1,1).Value
# Ler a verso
print xlSheet.Cells(2,1).Value,
xlSheet.Cells(2,2).Value
# Ler as datas
print xlSheet.Cells(3,1).Value,
str(xlSheet.Cells(3,2).Value)[0:8]
print xlSheet.Cells(4,1).Value,
xlSheet.Cells(4,2).Value
# -*- coding: iso-8859-15 -*-
from win32com.client import Dispatch
# Efectuar ligao ao Excel
xlApp = Dispatch("Excel.Application")
# Abre o documento
xlWbook =
xlApp.Workbooks.Open('C:\\excel-
python-pap.xls')
# Fechar sem guardar alteraes
xlApp.ActiveWorkbook.Close(SaveChanges=
0)
# Terminar aplicao
xlApp.Quit()
# Limpar memria
del xlApp
a programar
<13>
Controlo Total
Os exemplos anteriores ilustram a simplicidade com que se
interage com o Excel a partir de Python. Esta simplicidade
est presente mesmo em tarefas menos comuns quando se
automatizam operaes de manipulao de documento
como a leitura e escrita e informao. O exemplo seguinte
ilustra como possvel imprimir informao de forma
automtica e, por brincadeira, interagir com o sintetizador
de fala do sistema.
Nota: Este exemplo requer que o sistema possua o
sintetizador de fala e uma impressora correctamente
instalados. Em certas condies, o Excel questionar se
pretende instalar o sintetizador de fala, pelo que
necessrio responder afirmativamente de forma a ouvir a
frase Python rules!
Como sempre, o exemplo comea por efectuar a ligao ao
Excel e de seguida abre o documento.
A seleco da rea a utilizar na impresso efectuada
atravs das coordenadas da folha, seguindo-se o comando
de impresso do contedo dessa rea.
De seguida dada indicao para usar o motor de fala, uma
funcionalidade um pouco menos comum.
Por fim, a ligao ao Excel finalizada sem que o documento
seja actualizado.
Interaco com Outras Aplicaes
Os exemplos deste artigo centram-se na interaco com o
Excel, mas possvel interagir com outras aplicaes, como
o caso do Word e do Outlook. Essas interaces ficam
como exerccio ldico para o leitor.
A folha seleccionada por nome e no por ndice.
# -*- coding: iso-8859-15 -*-
from win32com.client import Dispatch
# Efectuar ligao ao Excel
xlApp = Dispatch("Excel.Application")
# Abre o documento
xlWbook =
xlApp.Workbooks.Open('C:\\excel-
python-pap.xls')
# Seleccionar a folha de nome
'Exemplo'
xlWbook.Sheets('Exemplo').Select()
xlSheet = xlWbook.ActiveSheet
# Seleccionar a informao a imprimir
xlSheet.PageSetup.PrintArea = "A1:B4"
# Imprimir as clulas seleccionadas
xlSheet.PrintOut()
# Falar
xlApp.Speech.Speak("Python rules!")
# Fechar sem guardar alteraes
xlApp.ActiveWorkbook.Close(SaveChanges=
0)
# Terminar aplicao
xlApp.Quit()
# Limpar memria
del xlApp
Apaixonado pela tecnologia desde cedo, ganhou o gosto pela
programao num ZX Spectrum 48K. Licenciou-se em Engenharia da
Linguagem e do Conhecimento e encontra-se actualmente a trabalhar
na dissertao do Mestrado de Informtica na FCUL. Profissional na rea
das tecnologias e sistemas de informao desde 1999, tem especial
interesse em manipulao de dados (ETL), integrao de sistemas,
limpeza de dados, business intelligence (data mining, data warehouse),
inteligncia artificial e processamento automtico de lngua natural.
fernando.martins@portugal-a-programar.org
Fernando Martins
a programar
<14>
Subversion: Controlo
Total sobre o Software -
2. Parte
Nesta 2. parte do artigo sobre Subversion (a 1. parte
encontra-se na edio n. 17), vamos ver como deveremos
usar o Subversion no dia-a-dia e tambm algumas das
ferramentas que existem actualmente e que se integram
bastante bem com o Subversion. Com estas ferramentas
poderemos tirar mais partido do Subversion, uma vez que
nos vo fornecer um conjunto de funcionalidades acrescidas
(entre as quais: disponibilidade do cdigo online,
autenticao e autorizao no repositrio, gesto das
alteraes feitas a cada reviso, facilidade em aferir as
diferenas entre as modificaes feitas numa cpia local de
trabalho e o repositrio central de cdigo), como veremos
em seguida.
No fim deste artigo apresenta-se bibliografia recomendada
para quem desejar extender os seus conhecimentos sobre
este sistema de controlo de verses de software, cada vez
mais utilizado hoje em dia.
Ciclo Normal de Trabalho com SVN
Checkout Inicial
Na maior parte das vezes, comea-se a usar um repositrio
de Subversion fazendo um checkout ao projecto em
questo. Ao fazer isto, criada na mquina local uma cpia
do projecto. Esta cpia contm a HEAD (ltima reviso) do
repositrio SVN que especificado na linha de comandos:
Apesar do exemplo acima fazer checkout da directoria
/trunk, pode-se igualmente escolher uma subdirectoria do
repositrio ao especificar o subdirectrio no URL:
Uma vez que o Subversion usa o modelo copia-modifica-
unifica em vez do modelo bloqueia-modifica-desbloqueia, o
utilizador pode logo comear a fazer alteraes aos ficheiros
e directorias na sua cpia de trabalho. Esta cpia de trabalho
igual a qualquer outra coleco de ficheiros e directorias no
computador. O utilizador pode editar e alterar os ficheiros,
navegar e mover pastas, ou at mesmo apagar a cpia de
trabalho inteira e trabalhar numa nova. Apesar de realmente
ser uma coleco de ficheiros e directorias como qualquer
outra, preciso sempre avisar o Subversion se se quiser re-
arranjar qualquer ficheiro ou directoria dentro da cpia de
trabalho. Por isso, deve-se sempre usar os comandos svn
copy ou svn move em vez dos comandos normais (Ctrl-C ou
Ctrl-X, por exemplo) para que essas alteraes sejam
reflectidas a todos os utilizadores quando fizerem um svn
update nas suas cpias de trabalho.
Cada directoria na cpia de trabalho local contm uma rea
administrativa, uma sub-directoria chamada .svn.
Normalmente, um comando de listagem de directrios no
mostra esta sub-directoria, mas no entanto uma directoria
muito importante que no se deve nunca apagar ou alterar.
O Subversion depende desta directoria para gerir a cpia de
trabalho de cada utilizador.
Pode-se tambm fazer um checkout especificando uma nova
directoria que vai passar a ser a nova cpia de trabalho
depois do URL do repositrio, nos parmetros do comando
de checkout:
$ svn checkout
http://exemplo.efacec.pt/repositorio/tr
unk/documentacao/pdfs directoriaNova
A directoriaNova/faq.pdf
A directoriaNova/userguide.pdf
A directoriaNova/manual-de-
instalacao.pdf
...
Checked out revision 327.
Isto coloca a cpia de trabalho numa directoria chamada
directoriaNova em vez da directoria trunk como tnhamos
visto previamente.
$ svn checkout
http://svn.exemplo.pt/repositorio/trunk
A trunk/subversion.dsw
A trunk/svn_check.dsp
A trunk/Makefile
A trunk/configure
A trunk/ficheiroA.c
...
Checked out revision 327.
$ svn checkout
http://svn.exemplo.pt/repositorio/trunk
/documentacao/pdfs
A trunk/documentacao/pdfs/faq.pdf
A
trunk/documentacao/pdfs/userguide.pdf
A trunk/documentacao/pdfs/manual-de-
instalacao.pdf
...
Checked out revision 327.
a programar
<15>
Ciclo normal de trabalho
O Subversion tem bastantes funcionalidades, opes,
possibilidades de uso, mas para uma utilizao diria s se
ir usar um sub-conjunto limitado das funcionalidades do
Subversion. O ciclo de trabalho tipicamente o seguinte:
Fazer um update cpia de trabalho
svn update
Fazer as alteraes necessrias aos ficheiros da cpia de
trabalho
svn add
svn delete
svn copy
svn move
Examinar as alteraes feitas
svn status
svn diff
svn revert
Unificar as alteraes feitas por outros utilizadores na
cpia de trabalho local
svn update
svn resolved
E por fim, e s agora, fazer uma submisso das alteraes
feitas na cpia de trabalho local para o repositrio de SVN
svn commit
O diagrama seguinte exemplifica melhor o ciclo normal de
desenvolvimento com o Subversion.
a programar
<16>
Propriedades do Subversion
O Subversion permite criar propriedades com verso nos
ficheiros e directorias (com os nomes que se quiser), bem
como propriedades sem verso nas revises. A nica
restrio encontra-se nas propriedades com o prefixo svn:
que so propriedades reservadas ao Subversion nesse
espao de nomes (namespace). Enquanto que as
propriedades fora deste espao de nomes podem ser usadas
para controlar o comportamento do Subversion, os
utilizadores no podem criar ou alterar propriedades do
espao de nomes svn:. Estas so:
Propriedades com verso
svn:executable - Se est presente num ficheiro, o
cliente de SVN far o ficheiro executvel em cpias de
trabalho em ambiente Unix; Em ambiente Windows, para
ser executvel basta ter a extenso .exe ou .bat.
svn:mime-type - Se est presente num ficheiro, o
valor indica o tipo MIME do ficheiro. Isto permite ao cliente
de SVN decidir se uma fuso (merging) contextual possvel
de ser feita durante um update, e pode tambm afectar
como o ficheiro se comporta quando procurado via web
browser;
svn:ignore - Se est presente numa directoria, o valor
uma lista de padres de ficheiros sem verso a serem
ignorados pelo subcomando svn status ou outros; Por
exemplo, *.log *.dmp core.*;
svn:keywords - Se est presente num ficheiro, o valor
diz ao cliente de SVN como expandir palavras-chave
(keywords) particulares dentro do ficheiro;
svn:eol-style - Se est presente num ficheiro, o valor
diz ao cliente de SVN como manipular o fim de uma linha no
ficheiro na cpia de trabalho; Por exemplo, CRLF (em
Windows) ou CR (em Unix/Linux);
svn:externals - Se est presente numa directoria, o
valor uma lista com vrios caminhos (paths) e URLs a que o
cliente de SVN dever fazer checkout; Esta propriedade
muito til quando se precisa de usar cdigo-fonte de
terceiras fontes mas que no precisamos que estejam
versionadas no repositrio de SVN;
svn:special - Se est presente num ficheiro, indica
que o ficheiro no um ficheiro normal, mas um link
simblico ou outro tipo especial de objecto;
svn:needs-lock - Se est presente num ficheiro, indica
ao cliente de SVN para colocar o ficheiro s para leitura na
cpia de trabalho, como uma nota de que esse ficheiro
dever ser bloqueado (locked) antes da sua edio (para
desta forma ganhar propriedades de escrita e garantir que
s um utilizador pode alterar esse ficheiro).
Propriedades sem verso
svn:author - Se est presente, contm o nome do
utilizador autenticado que criou a reviso (se no estiver
presente, a reviso foi feita anonimamente);
svn:date - contm o tempo UTC em que a reviso foi
criada, no formato ISO. O valor vem do relgio do servidor;
svn:log - contm a mensagem de log que descreve a
reviso; Esta mensagem pode ser alterada aps um commit,
caso hajam enganos na mensagem que se queria ter
colocado no commit;
svn:autoversioned - Se est presente, a reviso foi
criada com a funcionalidade de versionamento automtico.
URLs dos repositrios Subversion
Os repositrios de Subversion podem ser acedidos atravs
de vrios mtodos localmente no disco (directamente) ou
atravs de vrios protocolos de rede (indirectamente). A
localizao de um repositrio, no entanto, sempre um
URL. Em seguida apresenta--se uma tabela que descreve
como os diferentes URLs mapeam os diferentes mtodos de
acesso a um repositrio Subversion.
Mtodo de acesso Esquema
file:// Acesso directo ao repositrio (disco local).
Acesso via protocolo WebDAV para o servidor
Apache do Subversion
http://
https:// O mesmo que para http:, mas com encriptao
SSL (mais seguro)
svn:// Acesso via protocolo svn a um servidor a correr
svnserve
svn+ssh:// O mesmo que svn:, mas atravs de um tnel
SSH
Nota: Se se usar o SVN em DOS, as barras devem ser como
numa directoria em Linux (/) e no da forma nativa
( \ ). Exempl o: fi l e: / / / reposi tori o/ pasta/ e no
file:///repositorio\pasta\
Ajuda do SVN
Um dos mais importantes comandos do SVN o svn help. A
qualquer momento, um
svn help sub-comando
descreve a sintaxe, os switches que podem ser usados e o
comportamento normal desse sub-comando.
a programar
<17>
Instalao do SVN
Instalao em Linux (distribuio Ubuntu)
A instalao do subversion em Ubuntu extremamente
simples e funcional. Basta fazer numa linha de comandos:
Instalao em Windows (TortoiseSVN)
A instalao em Windows pode ser feita de duas maneiras:
instalando os binrios do cliente/servidor de SVN (e passa-se
a usar apenas o subversion numa shell DOS, o que no
muito interessante para os utilizadores do Windows), ou
instala-se um cliente grfico para Windows: um dos
melhores actualmente o TortoiseSVN. Vejamos a seguir
como instalar o TortoiseSVN (apenas para Windows):
1. Descarregar o TortoiseSVN no site oficial de
downloads;
2. Duplo-clique no instalador .msi e resta apenas
seguir as instrues apresentadas;
3. Um reboot ser necessrio para o TortoiseSVN ser
correctamente instalado.
Uma das principais vantagens de uso do TortoiseSVN a
integrao que tem no Windows explorer (clique no boto
direito do rato faz surgir no menu de contexto as opes do
TortoiseSVN) independentemente de outros clientes
grficos que estejamos a usar. Outra grande vantagem a
sobreposio de cones no Windows: nas pastas que sejam
de cpias locais de trabalho SVN, os cones das pastas e dos
ficheiros so alterados para indicar visualmente o estado da
cpia local de trabalho; em suma, o programador v
instantaneamente o estado da sua cpia local de trabalho
sem necessitar de fazer um svn status, o que realmente
muito bom.
Componentes do Subversion
Uma vez instalado o Subversion, temos uma srie de
diferentes componentes deste software ao nosso dispr:
svn: o programa cliente de linha de comandos;
svnversion: o programa para reportar o estado (em
termos das revises do software) de uma cpia de trabalho;
svnlook: a ferramenta para inspeccionar o estado de
um repositrio de Subversion;
svnadmin: a ferramenta para criar, alterar ou reparar
um repositrio de Subversion;
svndumpfilter: o programa para filtrar os dump
streams do Subversion;
mod_dav_svn: um mdulo de plugins para o servidor
HTTP da Apache, usado para colocar o repositrio disponvel
a outros utilizadores atravs de uma rede;
svnserve: um programa servidor, que corre como um
processo (daemon) ou pode ser tambm invocado via SSH;
outra forma de tornar o repositrio disponvel a outros
utilizadores atravs de uma rede, atravs do protocolo svn,
em vez de se usar o servidor HTTP da Apache.
Configurao do servidor de HTTP Apache
Nesta seco vamos ver como configurar o servidor HTTP da
Apache para usar URLs que pertenam a repositrios SVN,
usufruindo deste modo da autenticao e autorizao
fornecidos por este servidor. Os passos que se seguem so
para Linux (distribuio Ubuntu), mas para Windows em
tudo semelhante (os comandos para criar e popular um
repositrio podem ser todos feitos recorrendo ao
TortoiseSVN(http://tortoisesvn.tigris.org/)).
Neste momento temos um repositrio SVN para o ProjX,
mas que est vazio, sem ficheiros. Para popular o repositrio
com ficheiros, teremos que ter outra pasta que tem todos os
ficheiros que queremos adicionar ao projecto SVN:
$ ls -F /tmp/ProjX
trunk/ tags/ branches/
$ ls -F trunk
pasta1/ pasta2/ README.txt CHANGELOG
ficheiro1.c ficheiro1.h
Esta pasta /tmp/ProjX tem todo o cdigo que vamos querer
importar para o repositrio. Depois disso, podemos apagar
esta pasta, pois todo o seu contedo j estar no repositrio
SVN. Resta portanto, importar o contedo desta pasta para
o nosso repositrio SVN:
$ svnadmin create /home/projecto/ProjX
$ ls /home/projecto/ProjX
conf/ dav/ db/ format hooks/
locks/ README.txt
sudo apt-get install subversion
libapache2-svn
a programar
<18>
$ svn import /tmp/ProjX
file:///home/projecto/ProjX -m import
inicial
Notas: No colocar / no fim dos caminhos ( /tmp/ProjX e
no /tmp/ProjX/; o mesmo para o segundo caminho
indicado); O nome para o projecto, neste caso ProjX, dever
ser coincidente nos dois caminhos apresentados.
Em Windows, estes comandos para criar e popular um
repositrio so facilmente reproduzidos com o TortoiseSVN,
carregando com o boto direito do rato para aceder s
opes de criar um repositrio e importar dados.
Depois de importar os dados com sucesso, vamos transferir
o contedo de ProjX para uma cpia local de trabalho:
$ svn checkout
file:///home/projecto/ProjX/trunk
nome-do-projecto


A nome-do-projecto/pasta1
A nome-do-projecto/pasta2
A nome-do-projecto/README.txt

Checked out revision 1.


Nota: No checkout, o nome para a pasta local que vai conter
o ProjX o que o utilizador pretender, no tem de ser igual a
ProjX.
Resta apenas configurar o servidor HTTP da Apache. Aceder
ao ficheiro de configurao, apache2.conf, que fica em
/etc/apache2 e adicionar as entradas:
LoadModule dav_module
modules/mod_dav.so
LoadModule dav_svn_module
modules/mod_dav_svn.so
(na seco inicial de carregamento dos mdulos)
<Location /ProjX>
DAV svn
SVNPath /home/projecto/ProjX
</Location>
(na seco das Locations; Neste caso, URLs do tipo
http://localhost/ProjX vo ser tratados pelo Apache para
carregar com o mdulo dav_svn o contedo do projecto
ProjX.)
Nota: Em verses anteriores 2.2 do servidor HTTP da
Apache, o ficheiro apache2.conf substitudo pelo ficheiro
httpd.conf
Reiniciamos o apache:
sudo /etc/init.d/apache2 restart
E temos neste momento o servidor Apache configurado para
usar o repositrio SVN ProjX! Basta abrir um browser e
apontar para o URL http://localhost/ProjX. Mas, neste
exemplo, no estamos a usufruir da autenticao. Para tal,
alteramos de novo o ficheiro apache2.conf e adicionamos:
<Location /ProjX>
DAV svn
SVNPath /home/projecto/ProjX
AuthType Basic
AuthName Repositorio para o ProjX
AuthUserFile /etc/svn-auth-file
</Location>
Criamos o ficheiro /etc/svn-auth-file e adicionamos
credenciais para os utilizadores que pretendemos que
tenham acesso ao servidor SVN:
$ htpasswd -cm /etc/svn-auth-file
utilizador1
New password: *****
Re-type new password: *****
Adding password for user utilizador1
$ htpasswd -m /etc/svn-auth-file
utilizador2
New password: *******
Re-type new password: *******
Adding password for user utilizador2
Nota: A opo -c usada para criar o ficheiro se ainda no
existir, e a opo -m para usar encriptao MD5 nas
passwords, que mais seguro.
Podemos ainda usufruir da autorizao baseada em
caminhos, em que dizemos ao servidor HTTP que
determinado utilizador s tem acesso a determinada pasta.
Para tal adicionamos ao ficheiro apache2.conf:
LoadModule authz_svn_module
modules/mod_authz_svn.so
(na seco de carregamento dos mdulos)
<Location /ProjX>
DAV svn
SVNPath /home/projecto/ProjX

Require valid-user

AuthType Basic
AuthName Repositorio para o ProjX
AuthUserFile /etc/svn-auth-file
AuthzSVNAccessFile /etc/access-file
</Location>
(na seco das Locations; Neste caso, URLs do tipo
http://localhost/ProjX vo ser tratados pelo Apache para
a programar
<19>
carregar com o mdulo dav_svn o contedo do projecto
ProjX.)
E criamos o ficheiro /etc/access-file indicando que acesso
por pasta cada utilizador tem:
[ProjX:/trunk/pasta1]
utilizador1 = rw
utilizador2 = r
Neste exemplo, indica-se que o utilizador1 tem permisses
de escrita e de leitura pasta1 mas o utilizador2 s pode ler
os contedos desta pasta.
Existem bastante mais goodies e formas de configurar a
autenticao e autorizao do servidor Apache. Ver a
documentao online aqui (http://svnbook.red-
bean.com/en/1.4/svn.serverconfig.httpd.html).
Clientes Grficos/IDEs
SVN no Eclipse (plugin Subclipse)
Nesta seco vamos ver como i nstal ar o pl ugi n
Subclipse(http://subclipse.tigris.org/) para o editor Eclipse.
Existem outros plugins, nomeadamente o Subversive, mas
nesta seco iremos apenas detalhar a instalao do
Subclipse.
Para adicionar suporte ao SVN no editor Eclipse (verso
Ganymede), basta seguir os passos:
1. Aceder ao menu Help Software Updates
2. Aceder tab Available Software e pressionar o boto
Add site
3. No URL escrever:
http://subclipse.tigris.org/update_1.4.
e carregar no boto OK
Uma nova entrada com o nome do URL vai surgir na lista de
software disponvel. Expandir a entrada e seleccionar o
Subclipse e o adaptador JavaHL como se indica a seguir:
Pressionar o boto Install para que o Eclipse calcule as
dependncias deste plugin e outros pacotes que sejam
necessrios descarregar. Na janela que surgir pressionamos
o boto Next >, aceitamos os termos da licena e
pressionamos no boto Finish para dar incio instalao.
Por fim, surgir uma janela para reiniciarmos o Eclipse.
Escolher Yes e temos neste momento o plugin Eclipse
correctamente instalado no ambiente de desenvolvimento
Eclipse.
Podemos ver que temos o plugin Subclipse ao aceder ao
menu File > New > Other e vemos a entrada SVN para
fazermos checkout de um projecto SVN, como se indica na
figura seguinte:
SVN no trabalho colaborativo (Trac)
O Trac(http://trac.edgewall.org/) um sistema de gesto de
projectos e de bug-tracking que integra numa wiki o
contedo de repositrios SVN para uma rpida visualizao
do que se passa nos mesmos. Para alm de possibilitar
aceder a todo o cdigo de um repositrio SVN (com
a programar
<20>
highlight de cdigo), permite introduzir na wiki os objectivos
e os prazos para o projecto, os bugs encontrados, e aferir o
que cada utilizador tem alterado no projecto, entre outras
funcionalidades muito interessantes para uma visualizao
intuitiva e rpida dos projectos. Vale a pena instalar este
sistema, que para alm de ser open source, ajuda no
controlo e na anlise das alteraes de um projecto:
possibilita ver que modificaes foram feitas a dada reviso,
ver diferenas entre diferentes projectos que esto num
mesmo repositrio, descarregar o contedo do projecto
num arquivo .zip, para alm de que uma wiki. Antes de
instalar o trac, preciso ter instalado o Python, Genshi e
uma base de dados com os drivers Python correpondentes.
Depois, em Linux, basta fazer numa linha de comandos:
$ sudo apt-get install trac
Para mais informaes sobre os requisitos de instalao do
Trac, ver a pgi na ofi ci al de i nstal ao do Trac
aqui(http://trac.edgewall.org/wiki/TracInstall).
Em alternativa, em Windows, preciso descarregar o
arquivo .zip ou o instalador .exe do Trac. Se se optar por
descarregar o instalador .exe, apenas necessrio execut-
lo e seguir as indicaes que surgem no ecr. Por outro lado,
se se optar por descarregar o arquivo necessrio extralo e
seguir o passo (debaixo da pasta extrada):
python ./setup.py install
Este passo instala a ferramenta de administrao trac-
admin, usada para se criar e manter ambientes de projectos,
bem como o servidor tracd.
Para se criar um ambiente para um projecto SVN
previamente criado, em Windows ou em Linux, usa-se o
comando trac-admin, como no se indica no exemplo
seguinte para Linux (em Windows semelhante mudando
apenas o caminho para a pasta que vai ter o ambiente Trac):
$ trac-admin /home/projectos-
trac/ProjX initenv
Nota: A pasta /home/projectos-trac/ProjX dever estar
previamente criada e vazia.
Durante este script ser pedido para indicar a pasta onde se
encontra o repositrio SVN, o nome para o Projecto Trac, e
mais informaes (que podem ser deixadas com o valor por
omisso, dando Enter para continuar a instalao do
ambiente). Quando o script terminar, resta iniciar o servidor
tracd e pondo-o a apontar para o projecto Trac j criado em
/home/projectos-trac/ProjX:
Desta forma, o servidor est escuta na porta 8080. Quando
abri rmos um browser e apontamos para o URL
$ tracd port 8080 /home/projectos-
trac/ProjX -d &
Concluses
O controlo de verses de software imprescindvel no
desenvolvimento de software. No s permite agilizar o
mesmo como tambm fornece segurana aos
programadores para avanar com as suas implementaes
sem risco de se perder cdigo. O controlo de todo o
software, desde a ideia inicial at s sucessivas iteraes por
que passa uma ideia, registado pelo VCS. Se houver
necessidade de voltar atrs, rpido, simples e garantido
que se tem a verso anterior pretendida sem perda de
cdigo.
O Subversion na sua globalidade um excelente VCS, que
tem vi sto um aumento de popul ari dade entre
programadores de todo o mundo. Para alm de fornecer
caractersticas importantes para a produtividade do
software, tais como a atomicidade dos commits, a gesto
das fuses de cdigo de diferentes programadores, o
versionamento de directorias e o custo das operaes ser
proporcional ao tamanho das alteraes (e no ao tamanho
dos ficheiros), ainda software livre que pode ser usado com
outras ferramentas (Apache, Trac) para se ter uma soluo
valiosa face a sistemas comerciais (sobre este aspecto, ver
Testemunhos (http://subversion.tigris.org/testimonials
.html) ).
Para alm disto, o Subversion desenvolvido por milhares
de programadores em todo o mundo, que trabalham para o
aumento da qualidade deste VCS, e suportado por uma
extensa comunidade online. Uma forma rpida de ficar a
http://localhost:8080/, obtemos a pgina inicial da nossa
wiki recm-criada, com o cdigo do projecto SVN disponvel
aps se pressionar o boto Browse Source:
Resta apenas comear a editar as pginas da wiki e a usar os
plugins(http://trac.edgewall.org/wiki/PluginList) disponveis
para usufruir de uma maior facilidade de trabalho
colaborativo.
a programar
<21>
saber trabalhar com o Subversion atravs dos exemplos do
livro online SVN Red Book (http://svnbook.red-bean.com/) e
das quest es l evant adas nas mai l i ng l i st s
(http://subversion.tigris.org/mailing-lists.html) do
Subversion.
Como limitaes, o Subversion tem apenas controlo de
acessos dos utilizadores por directoria e no tem ainda uma
maior granularidade, no que toca ao acesso dos ficheiros.
Um exemplo disto quando existe um projecto com pastas
lib, include, bin, que deviam de ter segurana implcita (ou
seja, o nome das pastas j diz implicitamente o que certos
actores podem fazer, como os programadores s acederem
pasta lib e include, e os testers do projecto acederem
exclusivamente pasta bin, onde se encontram os binrios a
serem alvo de testes).
Outro problema actual com o Subversion a administrao
de um repositrio, em que no de todo fcil apagar
revises que so lixo. Por exemplo, se uma reviso no
interessar ou representar um retrocesso para outra que j
existia, no fcil apagar essa reviso do repositrio. Isto
um pouco deselegante, uma vez que o repositrio fica com
revises que no tem interesse de manter. Por fim, outro
dos problemas prende-se com as pastas ocultas .svn, pois se
o programador acidentalmente apagar esta pasta oculta,
perde a forma de indicar ao servidor de SVN que fez
modificaes nessa pasta. Existe um procedimento para
reverter esta situao, mas no simples o suficiente e
poderia estar j integrado partida no Subversion.
Independentemente destas desvantagens, o Subversion
um VCS que representa uma mais-valia, no s para o
ambiente empresarial, mas tambm para o dia-a-dia de um
programador ou ainda aluno de uma faculdade (e por que
no cada aluno ter uma conta SVN e fazer commits dos
trabalhos para um repositrio central SVN da faculdade?).
De notar que o Subversion pode ser usado para qualquer
projecto e no tem necessariamente de ser um projecto de
software; o importante a garantia que o Subversion
fornece em guardar as alteraes que se faam num
projecto e o conjunto rpido de informao que se rene
sobre essas mesmas alteraes. A partir da, o projecto em si
pode ser de qualquer rea de negcio (ver esta lista de
pr oj ec t os que adopt ar am o Subver s i on
(http://subversion.tigris.org/testimonials.html#open-
source-projects-using-svn) ).
Com este artigo espera-se que o utilizador tenha ficado a
conhecer mais sobre a importncia do controlo de verses
do software e da segurana que advm deste controlo, para
alm de ficar a saber como instalar e usar o Subversion, bem
como das ferramentas que so mais usadas actualmente
com este software de controlo de verses.


Recursos e Referncias Electrnicas

Site oficial do Subversion
http://subversion.tigris.org/
Subversion Red Book
http://svnbook.red-bean.com/
TortoiseSVN
http://tortoisesvn.net/
Trac
http://trac.edgewall.org/
Subclipse
http://subclipse.tigris.org/
Comparao entre diferentes VCS
http://en.wikipedia.org/wiki/Comparison_of_revision_c
ontrol_software
Comparao entre clientes de Subversion
http://en.wikipedia.org/wiki/Comparison_of_Subversion
_clients
SVNKit biblioteca Java de Subversion
http://en.wikipedia.org/wiki/SVNKit
The Forrester Wave: Software Change and Configuration
Management, Q2 2007"
http://www.collab.net/forrester_wave_report/index.html
Testemunhos de empresas que usam o Subversion
http://subversion.tigris.org/testimonials.html#testimon
ials
Lista de projectos que adoptaram o Subversion
http://subversion.tigris.org/testimonials.html#open-
source-projects-using-svn
a programar
Miguel Rentes licenciado em Engenharia Informtica e de Computao
pela FEUP desde 2005 e integra actualmente a equipa de
Desenvolvimento da diviso de Inovao e Desenvolvimento/Gesto de
Redes da Efacec Engenharia. Actualmente est a trabalhar na tese Novas
Metodologias de Controlo de Verses de Software do Mestrado
Integrado em Engenharia Informtica e Computao na FEUP. F do
software livre, Matemtica, Teoria da Computao, Protocolos de Redes e
Segurana Informtica. Aficionado da fotografia, livros, e cinema.
miguel.rentes@portugal-a-programar.org
Miguel Rentes
<22>
Packet Capture em Java
com JPCAP
PCAP (Packet Capture) consiste numa API para a captura de
pacotes de rede. Em sistemas baseados em Unix o Pcap
implementado na biblioteca LibPcap, no caso dos sistemas
Windows este encontra-se implementado na biblioteca
WinPcap.
Estas bibliotecas permitem que software consiga capturar e
filtrar pacotes que viagem pela rede, enviar pacotes e at
listar todas as interfaces de rede existentes no sistema bem
como obter informaes sobre os mesmos, tais como o
nome, IP ou MAC.
ainda possvel guardar os pacotes capturados num ficheiro
e mais tarde voltar esses pacotes a partir do ficheiro onde
foram guardados. Tais recursos so muito utilizados em
ferramentas de monitorizao e anlise de rede como por
exemplo packet sniffers, network monitors, network
intrusion detection and traffic-generators.
Jpcap no fundo uma biblioteca intermdia entre o Java e as
bibliotecas LibPcap e WinPcap, permite ao programador
criar aplicaes Java utilizando as funcionalidades destas
bibliotecas. Existem bibliotecas semelhantes para as mais
diversas linguagens tais como Python, Ruby, .NET, Perl.
Ao longo deste artigo iremos abordar alguns dos principais
recursos desta biblioteca tais como:
Interfaces de rede disponveis no sistema.
Preparar a interface de rede para captura.
Capturar pacotes da interface de rede.
Aplicar filtros captura de pacotes de rede.
Gravar pacotes de rede capturados em ficheiros.
Ler pacotes de rede gravados em ficheiros.
Para isso iremos criar pequenas aplicaes, exemplos
simples que demonstram como utilizar cada um dos
recursos mencionados acima.
Mas antes de tudo vamos precisar de preparar o nosso
ambiente, para isso precisar do Jpcap que podemos
encontrar em
http://netresearch.ics.uci.edu/kfujii/jpcap/doc/download.htm
l
Aqui encontramos verses para vrios sistemas operativos,
podemos utilizar uma verso de instalao como o caso do
Windows ou Linux ou podemos utilizar a verso cdigo-
fonte, esta parte deixo ao critrio de cada um, no existem
vantagens ao nvel de desenvolvimento.
Para instalar basta seguir os passos descritos na pgina
http://netresearch.ics.uci.edu/kfujii/jpcap/doc/install.html
Depois da instalao vamos por mo obra!
Interfaces de rede disponveis no sistema
Nesta sesso vamos ver como simples obter a lista de
interfaces de rede que se encontram disponveis no nosso
sistema, para alm disso vamos ver ainda como fcil retirar
alguma informao destas interfaces.
Para isso vamos ver um pequeno programa que demonstra
como, usando o Jpcap, podemos obter todos estes dados de
uma forma bastante simples e rpida.
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
/**
*
* @author magician
*/
public class JpcapInterfaces {
/**
* Dado um array de bytes retorna a String
equivalente.
* @param input - Array de bytes.
* @return String com a representao
textual do array de bytes.
*/
public static String hex2String(byte []
input){
String output = "";
for (int i = 0; i < input.length-1;
i++) {
output +=
Integer.toHexString(input[i] & 0xff) + ":";
}
output +=
Integer.toHexString(input[input.length-1] &
0xff);
a programar
<23>
Com o exemplo acima podemos ver como simples obter as
interfaces de rede disponveis no sistema bem como todos
os seus dados, alguns deles at bastante importantes como
o Nome, IP, MAC e SubNet, dados esses que podem ser
utilizados mais tarde das mais diversas formas. O resultado
obtido aps a execuo desta pequena aplicao ser algo
como:
Destinho P2P: null
IP: fe80:0:0:0:216:36ff:feb0:5cd7
BroadCast: null
SubNet: ffff:ffff:ffff:ffff:0:0:0:0
Destinho P2P: null
-----------------------------------------------
--

-----------------------------------------------
--
Nome: any
Descrio: Pseudo-device that captures on all
interfaces
Nome da DataLink : LINUX_SLL
Descrio da DataLink : Linux cooked
MAC Address: 0:0:0:0:0:0
-----------------------------------------------
--

-----------------------------------------------
--
Nome: lo
Descrio: null
Nome da DataLink : EN10MB
Descrio da DataLink : Ethernet
MAC Address: 0:0:0:0:0:0
IP: 127.0.0.1
BroadCast: null
SubNet: 255.0.0.0
Destinho P2P: null
return output;
}
public static void main(String args[]) {
//Obtm a lista de interfaces de rede
no sistema.
NetworkInterface[] interfaces =
JpcapCaptor.getDeviceList();
for (NetworkInterface ni : interfaces)
{
System.out.println("---------------
------------------");
//Nome da interface.
System.out.println("Nome: " +
ni.name);
//Descrio da interface caso
exista.
System.out.println("Descrio: " +
ni.description);
//DataLink da interface.
System.out.println("Nome da
DataLink : " + ni.datalink_name);
//Descrio do DataLink caso
exista.
System.out.println("Descrio da
DataLink : " + ni.datalink_description);
//MAC Address da interface.
System.out.println("MAC Address: "+
hex2String(ni.mac_address));
for(NetworkInterfaceAddress a :
ni.addresses){
//Endereo de IP da interface.
System.out.println("IP: " +
a.address.getHostAddress());
//Endereo de Broadcast da
interface.
System.out.println("BroadCast:
" + a.broadcast);
//Mascara de SubRede.
System.out.println("SubNet: " +
a.subnet.getHostAddress());
//Em caso de ligaes P2P o
endereo de destino.
System.out.println("Destinho
P2P: " + a.destination);
}
System.out.println("---------------
-------------\n");
}
}
}
Este output corresponde a um sistema Linux, noutros
sistemas podem aparecer diferenas nomeadamente nos
nomes dos dispositivos. Por exemplo, pode aparecer algo
como \Device\NPF_{C3F5996D-FB82-4311-A205-
25B7761897B9} ao invs do simples eth0.
Para que as nossas aplicaes consigam utilizar o jpcap
correctamente estas devem ser executadas com permisses
de admin, caso contrrio possvel que no sejam obtidos
resultados, uma vez que o sistema pcap necessita dessas
permisses para realizar as operaes sobre as interfaces.
Preparar a interface de rede para captura
Para preparar a captura de pacotes de rede basta utilizar o
mtodo static openDevice da classe JpcapCaptor, este
mtodo abre a interface escolhida e prepara a captura de
pacotes. Abaixo podemos ver como usar este mtodo
NetworkInterface[] interfaces =
JpcapCaptor.getDeviceList();
//openDevice(NetworkInterface
interface, int snaplen, boolean promics,
int to_ms)
JpcapCaptor captor =
JpcapCaptor.openDevice(interfaces[0],
65535, false, 20);
a programar
<24>
Como podemos ver so passados quatro argumentos ao
mtodo openDevice, o primeiro argumento a interface a
ser utilizada na captura, neste caso vamos utilizar o primeiro
interface da lista ou seja o eth0. O segundo argumento
corresponde ao numero de mximo bytes a serem
capturados de cada vez, o terceiro argumento ir dizer se a
captura ser em modo promiscuo (true) ou no (false). O
modo promiscuo permite capturar pacotes de rede mesmo
que a sua origem ou destino no seja a da interface aberto
para captura. O modo no promiscuo apenas captura
pacotes cujo destino ou origem se a interface escolhida. O
l ti mo argumento corresponde ao ti meout em
milissegundos dado para a captura de pacotes.
Capturar pacotes da interface de rede
Vamos agora passar captura dos pacotes, o processo pode
ser feito de duas formas diferentes mas que atingem o
mesmo fim. Podemos utilizar a forma callback ou one-by-
one.
A forma callback passa pela utilizao dos mtodos
processPacket ou loopPacket da classe JpcapCaptor e pela
implementao da interface PacketReceiver. De uma forma
resumida o que vamos fazer criar uma classe que
i mpl ementa a i nterface PacketRecei ver onde
implementamos o mtodo receivePacket que ir conter o
que dever ser feito a cada pacote capturado. Depois de
implementada a interface, usamos o mtodo processPacket
ou loopPacket, ambos atingem o mesmo fim com a
diferena que no processPacket compativel com timeout e
modo non blocking.
A forma one-by-one a mais primitiva e a mais flexvel
dado que possvel controlar todas as aces feitas sobre o
pacote. Para isso utilizamos o mtodo getPacket da classe
JpcapCaptor, este mtodo como o nome indica retorna um
pacote capturado, assim apenas temos que criar um
mecanismo que ir repetir o processo quantas vezes
quisermos.
Vamos para isso ver um pequeno exemplo que captura 20
pacotes e imprime na consola o IP de origem/destino bem
como as portas correspondentes e o tamanho do pacote.
//Lista de interfaces de rede no
sistema.
NetworkInterface[] interfaces =
JpcapCaptor.getDeviceList();
try{
//Abre a interface 0 da lista.
JpcapCaptor captor =
JpcapCaptor.openDevice(interfaces[0], 65535,
false, 20);
//Simples contador.
int i = 0;
Packet p = null;
//Cliclo para capturar 20 pacotes.
while(i < 20){
//Captura um pacote.
p = captor.getPacket();
//Verifica se o pacote do
tipo TCPPacket
if(p instanceof TCPPacket){
TCPPacket tcp = (TCPPacket)
p;
System.out.println("SRC: " +
tcp.src_ip.getHostAddress() + ":" +
tcp.src_port +
" \tDST: " +
tcp.dst_ip.getHostAddress() +":" + tcp.dst_port
+
" \tSize = " +
tcp.length + " bytes");
}
//Verifica se o pacote do
tipo UDPPacket
else if(p instanceof
UDPPacket){
UDPPacket udp = (UDPPacket)
p;
System.out.println("SRC: " +
udp.src_ip.getHostAddress() + ":" +
udp.src_port +
" \tDST: " +
udp.dst_ip.getHostAddress() +":" + udp.dst_port
+
" \tSize = " +
udp.length + " bytes");
}
i++;
}
//Fecha a captura de pacotes.
captor.close();
}
catch(IOException io){
System.out.println(io.getMessage());
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
import java.io.IOException;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;
import jpcap.packet.UDPPacket;
/**
* @author magician
*/
public class OpenInterface {
public static void main(String args []){
Como podemos ver apenas foram processados os pacotes
UDP e TCP, mas existem outros como por exemplo
ARPPacket, DatalinkPacket, ICMPPacket entre outros. Este
pequeno exemplo ir gerar um ouput semelhante ao que se
segue a baixo sem os * que foram colocados por motivos
bvios de privacidade e segurana.
a programar
<25>
a programar
Embora neste exemplo apenas tenhamos extrado estes dados possvel extrair ainda mais dados dos pacotes, como por
exemplo os dados (data) enviados no ficheiro, headers, version, etc.. Iremos ver mais frente um exemplo em que retiramos
os dados enviados.
Aplicar filtros captura de pacotes de rede
O Jpcap permite ainda a utilizao de filtros de forma a limitar os pacotes capturados a um crculo restrito de possibilidades e
no tudo o que passa pela interface como vimos at agora. Vamos comear por ver a sintaxe utilizada pelo tcpdump que a
mesma aplicada ao Jpcap.
SRC: 7*.177.*05.30:1670 DST: 19*.16*.*.1*3:49153 Size = 40 bytes
SRC: 19*.16*.*.1*3:49153 DST: 7*.177.*05.30:1670 Size = 1119 bytes
SRC: 19*.16*.*.1*3:1900 DST: 19*.16*.*.176:1536 Size = 247 bytes
SRC: *3.*5*.40.166:51457 DST: 19*.16*.*.1*3:49153 Size = 88 bytes
SRC: *3.30.6.103:*74* DST: 19*.16*.*.1*3:49153 Size = 40 bytes
SRC: 19*.16*.*.1*3:49153 DST: *3.30.6.103:*74* Size = 328 bytes
SRC: 19*.16*.*.1*3:579*5 DST: *1.111.49.15*:33655 Size = 445 bytes
SRC: *4.1*3.19*.**4:60000 DST: 19*.16*.*.1*3:49794 Size = 58 bytes
SRC: 19*.16*.*.1*3:49794 DST: *4.1*3.19*.**4:60000 Size = 160 bytes
SRC: *7.93.3.*55:16*4 DST: 19*.16*.*.1*3:49153 Size = 40 bytes
SRC: 19*.16*.*.1*3:49153 DST: *7.93.3.*55:16*4 Size = 550 bytes
SRC: 91.*1.*50.*11:*7075 DST: 19*.16*.*.1*3:49153 Size = 73 bytes
SRC: 19*.16*.*.1*3:49153 DST: 91.*1.*50.*11:*7075 Size = 93 bytes
SRC: *0*.99.194.194:49*90 DST: 19*.16*.*.1*3:50043 Size = 58 bytes
SRC: 19*.16*.*.1*3:50043 DST: *0*.99.194.194:49*90 Size = 260 bytes
SRC: **.**7.*00.1*:60053 DST: 19*.16*.*.1*3:469** Size = 313 bytes
SRC: 19*.16*.*.1*3:469** DST: **.**7.*00.1*:60053 Size = 58 bytes
SRC: *17.13*.7*.9*:600*0 DST: 19*.16*.*.1*3:504*7 Size = 52 bytes
SRC: 19*.16*.*.1*3:504*7 DST: *17.13*.7*.9*:600*0 Size = 1410 bytes
SRC: 19*.16*.*.1*3:504*7 DST: *17.13*.7*.9*:600*0 Size = 306 bytes
Filtragem por Host
Exemplo Descrio Sintaxe
host <host> Captura todos os pacotes
que entram e saem do host
h o s t
192.168.1.100
s r c h o s t
<host>
Captura todos os pacotes
com origem no host
s r c h o s t
192.168.1.100
d s t h o s t
<host>
Captura todos os pacotes
com o host como destino
d s t h o s t
192.168.1.100
Filtragem por Porta
Exemplo Descrio Sintaxe
port <port> Captura todos os pacotes que
entram ou saem da porta
port 80
s r c p o r t
<port>
Captura todos os pacotes com
origem na porta
src port 80
d s t p o r t
<port>
Captura todos os pacotes com
a porta como destino
dst port 80
Filtragem por Network
Exemplo Descrio Sintaxe
net <net> Captura todos os pacotes da
rede <net>
net 192.168
src net <net> Captura todos os pacotes
que saem da rede <net>
s r c n e t
192.168
dst net <net>

Captura todos os pacotes
que entram na rede <net>
d s t n e t
192.168
Filtragem por Protocolo
ip Captura todos os pacotes de IP
Captura todos os pacotes ARP arp
rarp Captura todos os pacotes ARP inversos
Captura todos os pacotes TCP tcp
Sintaxe Descrio
udp Captura todos os pacotes UDP
icmp Captura todos os pacotes ICPM
<26>
a programar
Acima temos a sintaxe principal que possvel utilizar para
criar filtros, como podemos ver podem ser criados filtros por
host, port, network, tipo de pacote e podemos ainda fazer
combinaes de filtros utilizando operaes lgicas. Vamos
agora ver um exemplo da utilizao de filtros e iremos
tambm ver neste exemplo como possvel ver os dados
que so enviados nos pacotes.
p.src_ip.getHostAddress() + ":" + p.src_port +
" \tDST: " +
p.dst_ip.getHostAddress() +":" + p.dst_port +
" \tSize = " +
p.length + " bytes");
//Caso o pacote contenha dados
este so impressos e o programa para.
if(p.data.length > 0){
System.out.println(new String(p.data));
break;
} i++;
}
//Fecha a captura de pacotes.
captor.close();
} catch(IOException io){
System.out.println(io.getMessage());
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
Combinao de filtros
Exemplo Descrio Sintaxe
not Negao not src net 192.168
and Concatenao tcp and src host 192.168.1.100
or Alternncia port 80 or port 8080
import java.io.IOException;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.TCPPacket;
/**
* @author magician
*/
public class JpcapFilter {
public static void main(String args []){
//Lista de interfaces de rede no
sistema.
NetworkInterface[] interfaces =
JpcapCaptor.getDeviceList();
try{
//Abre a interface 0 da lista.
JpcapCaptor captor =
JpcapCaptor.openDevice(interfaces[0], 65535,
false, 20);
//Captura apenas pacotes TCP com
origem no host 192.168.1.100 e que tem como
destino a porta 80
captor.setFilter("tcp and src host
192.168.1.100 and dst port 80", true);
//Simples contador.
int i = 0;
//Ciclo para capturar 20 pacotes.
while(i < 20){
//Captura um pacote e converte para
TCPPacket dado que apenas a capturar pacotes
TCP.
TCPPacket p = (TCPPacket)
captor.getPacket();
//Gera o output com a informao
sobre o pacote
System.out.println("SRC: " +
O que o programa vai fazer assumindo que o nosso IP
corresponde ao 192.168.1.100 capturar todos os pacotes
TCP que so enviados pelo nosso computador e que tem
como destino a porta 80. De uma forma resumida vai
capturar todos os pedidos HTTP feitos por ns. Na realidade
no ir capturar todos mas apenas alguns, ou seja, ir
capturar at encontrar um pacote que contenha dados e ir
gerar um output semelhante ao que se segue.
SRC: 192.168.1.100:49323 DST:
66.102.9.147:80 Size = 60 bytes
SRC: 192.168.1.100:49323 DST:
66.102.9.147:80 Size = 52 bytes
SRC: 192.168.1.100:49323 DST:
66.102.9.147:80 Size = 715 bytes
GET / HTTP/1.1
Host: www.google.pt
User-Agent: Mozilla/5.0 (X11; U; Linux
i686; en-US; rv:1.8.1.11) Gecko/20071204
<27>
a programar
O exemplo acima mostra o pedido feito pelo Firefox ao
servidor www.google.pt, como podemos ver trata-se de um
pedido HTTP ao servidor.
Assim encerramos este artigo, neste momento estamos
prontos a criar desde grandes aplicaes a pequenos
utilitrios de anlise de pacotes de rede.
Links
JPCAP Home
http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html
JPCAP API
http://netresearch.ics.uci.edu/kfujii/jpcap/doc/javadoc/index.
html
Ubuntu/7.10 (gutsy) Firefox/2.0.0.11
Accept:
text/xml,application/xml,application/xhtml+
xml,text/html;q=0.9,text/plain;q=0.8,image/
png,*/*;q=0.5
Accept-Language: pt-
pt,pt;q=0.8,en;q=0.5,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-
8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie:
NID=17=BNGeDayJAh13ZHF6XFJ2mwo5N3rNTRu6WaFD
UYmbgAC4pyT0kzPnSKN0qKAz_ajH2WjpqDZ92DXTdjh
NyiG_s-Xwd4Mwr;
PREF=ID=8ed9295:TM=197383:LM=213911:IG=8:S=
T7z-r65IhJ
JPCAP Samples
(http://netresearch.ics.uci.edu/kfujii/jpcap/doc/samples.html)
LibPcap/TCPDump
http://www.tcpdump.org/
Winpcap
http://www.winpcap.org/
Fbio Correia estudante de Engenharia Informtica na
Universidade de vora. Partilhando o estudo com a
moderao do frum Portugal-a-Programar e a participao
na Revista Programar, como um dos redactores mais activos,
ainda tem tempo para explorar algumas das suas linguagens
preferidas: Java, PHP e a recente D.
fabio.correia@portugal-a-programar.org
Fbio Correia
<28>
Algoritmo de
Verhoeff
Introduo
Na edio 16 da Revista PROGRAMAR em Outubro de 2008
foi publicado o artigo Algoritmos para o Clculo de Dgito
Verificador que descreveu o clculo de dgito verificador
para cdigos de identificao a partir dos mtodos de
mdulo 10 e 11. Alm dos algoritmos j apresentados
existem outros mecanismos para clculo e obteno de
dgitos verificadores, podendo-se destacar o algoritmo de
Verhoeff, tema deste artigo.
O algoritmo ora apresentado foi desenvolvido por Jacobus
(Koos) Verhoeff, matemtico holands para sua tese de
doutorado em 1969 (GARCIA, et. al., 2007, p. 47). Verhoeff
escreveu um algoritmo capaz de operacionalizar sequncias
de dgitos decimais de qualquer tamanho, evitando desta
forma a ocorrncia de erros de dados (HAMMING, 1986, p.
27) e de transposio de dgitos adjacentes quando
efectuados por utilizadores humanos (WAGNER & PUTTER,
1989), tais como:
- Substituir um dgito por um outro dgito. Por exemplo,
invs de informar os dgitos 5678 acaba-se por informar
4678, onde o dgito que deveria ser 5 foi substitudo pelo
dgito 4. Este tipo de erro ocorre quando se acciona no
teclado uma tecla adjacente a tecla que deveria ter sido
realmente accionada. Ocorre em cerca de 60% a 90% dos
casos.
- Omisses ou adies de dgitos. Este tipo de erro ocorre
normalmente por falta de ateno do utilizador. Ocorre em
cerca de 10% a 20% dos casos.
- Trocar a ordem entre dois dgitos. Por exemplo, invs de
informar os dgitos 5678 acaba-se por informar 6578, onde
os dgitos 56 foram trocados pelos dgitos 65. Este tipo de
erro ocorre quando se escreve muito rpido em um teclado.
Ocorre em cerca de 10% a 20% dos casos.
Alm das formas habituais de deteco de erros que podem
ser equacionadas com o algoritmo de Verhoeff, possvel
tambm descobrir algumas formas menos comuns de erros
(WAGNER & PUTTER, 1989), tais como:
- Erros gmeos contnuos. Por exemplo, invs de informar os
dgitos 1123 acaba-se por informar 7723, onde os dgitos 11
foram trocados pelos dgitos 77. Este tipo de erro pode
ocorrer por distraco do utilizador na entrada da sequncia
de dgitos ou por ilegibilidade na escrita manual do cdigo a
ser verificado. Ocorrem em cerca de 0,5% a 1,5% dos casos.
- Erros gmeos irregulares. Por exemplo, invs de informar
os dgitos 1214 acaba-se por informa a sequncia 7274, onde
os dgitos 121 foram trocados pelos dgitos 727. Este tipo de
erro pode ocorrer pelas mesmas razes apontadas na
ocorrncia de erros gmeos contnuos ou por ilegibilidade na
escrita manual dos dgitos numricos. Ocorrem em menos
de 1% dos casos.
- Transposio irregular. Por exemplo, invs de informar os
dgitos 1234 acaba-se por informar a sequncia 3214, onde
os dgitos 123 foram transpostos de forma irregular pelos
dgitos 321. Este tipo de erro ocorre pode ocorrer por
distraco do utilizador. Ocorre em cerca de 0,5% a 1% dos
casos.
- Erros fonticos. Por exemplo, invs de informar os dgitos
6-123 acaba-se por informar 3-123, onde o dgito 6 foi
trocado pelo dgito 3. Este tipo de erro ocorre normalmente
quando o cdigo numrico transmitido por voz por meio
de um telefone, o interlocutor fala seis e o utilizador do
outro lado entende trs. Ocorre em cerca de 0,5% a 1,5%
dos casos.
Os percentuais de erros apontados por Paul Putter e Neal R.
Wagner basearam-se num estudo de erros com 12.000
ocorrncias de erros humanos quando da utilizao de
cdigos de identificao.
O maior questionamento encontrado a respeito do uso do
algoritmo de Verhoeff sua complexidade de implantao.
Pelo fato de ser baseado em tabelas numricas, essas
tabelas necessitam ser implementadas em memria e de
forma correcta. Normalmente se utiliza tcnicas de uso de
matrizes ou faz-se o armazenamento dos valores em uma
tabela de banco de dados. Neste artigo estar sendo
considerado a primeira forma de implementao.
Mtodo Algortmico
O mtodo algoritmo apresentado por Verhoeff (1969)
baseia-se no uso de trs tabelas de valores fixos, sendo:
tabela de localizao do inversor, tabela do ndice de
inverso e tabela do dgito verificador. H referncia a essas
tabelas, no Wikipdia, como: tabela de permuta, tabela de
multiplicao e tabela de inverso. No entanto, essas
denominaes no representam seu sentido operacional,
dificultando seu entendimento didctico. Por esta razo
neste artigo as referncias as trs tabelas obedecer a
seguinte nomenclatura:
a programar
<29>
A primeira tabela: tabela de localizao do inversor possui
os valores dos ndices que so obtidos a partir do
fornecimento de um cdigo de identificao que ter o
dgito verificador conferido ou mesmo gerado e que sero
usados na tabela do ndice de inverso.
Para que esta tabela seja usada necessrio inverter-se a
disposio (da esquerda para direita) dos valores
constantes do cdigo de identificao, que sero usados
como coordenadas das colunas.
Assim que o cdigo de identificao invertido numera-se a
partir de 0 (zero) at 7 (sete) da esquerda para a direita toda
a sequncia de cdigo de identificao, repetindo-se a
sequncia de zero a sete por toda a extenso do cdigo de
identificao no importando o seu tamanho para que desta
forma tenha-se os valores das coordenadas das linhas.
A segunda tabela: tabela do ndice de inverso possui os
valores de inverso de retorno para auxiliar a obteno do
dgito verificador da tabela do dgito verificador. Para que
esta tabela seja utilizada necessrio ter primeiramente os
valores de localizao da tabela de localizao do inversor.
Para uso da tabela: tabela do ndice de inverso necessrio
obter as coordenadas de linha e coluna. A coordenada de
coluna da tabela do ndice de inverso obtida a partir do
ndice de localizao seleccionado na tabela de localizao
do inversor. J a coordenada de linha obtida por meio da
definio do valor de verificao.
O primeiro valor de verificao por definio 0 (zero), os
demais valores so obtidos a partir da obteno do ndice de
localizao e do ndice verificador localizados na prpria
tabela.
O ndice verificador obtido na tabela do ndice de inverso
de um dos dgitos do cdigo de identificao torna-se o
prximo valor de verificao para o prximo dgito do cdigo
de identificao. O ltimo valor obtido como ndice
verificador ser utilizado como ndice de localizao do
dgito verificador na tabela do dgito verificador.
A terceira tabela: tabela do dgito verificador apresenta os
valores que sero utilizados como dgitos verificadores a
partir da definio do ndice verificador (que o ltimo valor
obtido como ndice verificador) extrado a partir da tabela do
ndice de inverso.
Determinar dgito verificador
No sentido de entender o mecanismo de funcionamento do
algoritmo de Verhoeff considere como cdigo de
identificao 9.234.876-7. O objectivo ser estabelecer as
transposies necessrias no sentido de determinar se o
dgito verificador informado correcto ou no.
Como primeira etapa de trabalho necessrio inverter a
sequncia do nmero do cdigo de identificao excluindo-
se desta inverso o dgito verificador, neste caso 7. Assim
sendo, considere apenas do cdigo de identificao
fornecido o valor 9234876. Aps efectuar a inverso da
esquerda para direita fica o cdigo de identificao
invertido grafado como 6784329. Em seguida acrescente o
valor 0 (zero) a frente do cdigo de identificao invertido de
forma que fique assim definido 06784329.
Distribua a sequncia do cdigo de identificao invertido
linearmente como sendo a informao de definio da
coordenada de coluna na tabela de localizao do inversor.
a programar
<30>
Para a definio da coordenada de linha relacione a partir do
primeiro valor do cdigo de identificao invertido a
sequncia numrica de 0 (zero) at o valor mximo de
tamanho do cdigo de identificao invertido, limitando o
valor mximo da sequncia em 7 (sete). Chegando-se em 7
(sete) reinicia-se a contagem a partir de (zero) se assim for
necessrio.
Observe a definio dos valores da coordenada de coluna
(cdigo de identificao invertido) e da coordena de linha
(sequncia numrica de 0 at 7).
Acompanhe a extraco dos valores de localizao da tabela
de localizao do inversor por meio da definio das cores.
A partir do momento em que se tem definido as
coordenadas de linha e coluna basta obter na tabela de
localizao do inversor o valor de ndice de localizao. A
sequncia a seguir mostra a obteno de cada um dos
valores de localizao da tabela de localizao do inversor.
Valores de linha 0 e 1 com valor de coluna 0 e 6 e ndice de
localizao obtido 0 e 3, respectivamente:
O processo continua de forma idntica para as restantes
linhas.
A partir do momento em que se possui os valores dos ndices
de localizao basta relacionar os valores das coordenadas
de linha e coluna e deixar registado os valores obtidos na
tabela de localizao do inversor como sendo os valores de
ndice de localizao.
A prxima etapa consiste em obter o ndice verificador na
tabela do ndice de inverso a partir da definio das
coordenadas de linha (valor de verificao) e coluna (ndice
de localizao). Para tanto, necessrio obter os valores das
coordenadas de linhas a partir da tabela do ndice de
inverso.
O primeiro valor de verificao a ser utilizado com o
primeiro ndice de verificao por definio 0 (zero). Assim
sendo, fica definido que o valor do ndice verificador por
definio inicial 0 (zero), uma vez que 0 (zero) tambm o
ndice de localizao. Se for feito o posicionamento da linha
0 (zero) com a coluna 0 (zero) na tabela do ndice de inverso
obter-se- o valor 0 (zero).
A partir do valor 0 (zero) do ndice verificador faz-se a
transposio deste valor para a prxima posio livre para o
valor de verificao de forma que se possa buscar na tabela
de inverso o prximo valor de verificao.
a programar
<31>
Neste momento tm-se o valor de verificao 0 e o ndice de
localizao 3 que devero se posicionados na tabela do
ndice de inverso a fim de obter-se o valor do ndice
verificador que neste caso o valor 3, como se apresenta a
seguir:
A partir desta sequncia pega-se o valor de ndice verificador
3 e faz-se a transposio deste valor para a prxima posio
livre para o valor de verificao.
O processo continua da mesma forma, at termos a tabela
completamente preenchida:
As operaes anteriormente efectuadas para a extraco
dos ndices de inverso a ttulo de ilustrao podem ser
representadas da seguinte forma:
O ltimo valor obtido, neste caso 7 o valor de ndice
verificador que ser utilizado para indicar o valor do dgito
verificador. Observe a tabela do dgito verificador seguinte:
Note que o ndice verificador 7 indica o dgito verificador 7
que o dgito verificador do cdigo de identificao
9.234.876-7. Neste caso, o valor obtido de dgito verificador
igual ao valor previamente informado. A obteno de um
valor diferente indica que o cdigo de identificao est
incorrecto.
Obteno de dgito verificador
Por exemplo, o cdigo de identificao 2468019753
necessita ter obtido seu dgito verificador. Assim sendo,
deve este ser representado de forma inversa: 3579108642.
Os valores invertidos sero usados como valores de ndices
de localizao de valores na coluna da tabela ndice de
localizao. Para tanto, acrescente o valor 0 (zero) a partir
da primeira posio do cdigo de identificao invertido de
forma que o cdigo de identificao fique expresso como:
03579108642. Desta forma, cada um dos valores que
compe o cdigo de verificao invertido ser utilizado
como valor de ndice de coluna da tabela de localizao do
inversor.
necessrio estabelecer tambm os valores de ndices de
localizao de linhas da tabela de localizao do inversor.
Assim sendo, basta serializar o cdigo de verificao
invertido com valores de 0 (zero) at 7 (sete), repetindo-se
esta sequncia quantas vezes for necessria at atingir o
tamanho total do cdigo de identificao. Observe a seguir a
definio das coordenadas (linha x coluna) que sero
utilizadas:
a programar
<32>
A identificao da coordenada Linha representa o valor
serial de 0 a 7 do cdigo de identificao invertido que se
encontra definido acima da coordenada Coluna que o valor
do cdigo de identificao invertido. A partir da definio
dos valores de ndices das coordenadas linha e coluna
possvel descobrir os valores de localizao na tabela de
localizao do inversor que sero usados como coordenadas
de coluna na tabela do ndice de inverso Assim sendo,
observe os valores seguintes:
Observe que os valores de ndice de localizao so obtidos
a partir das coordenadas de linha e coluna existentes na
tabela de localizao do inversor.
O processo de obteno de um ndice de localizao deve
ser efectuado um a um para todos os valores da composio
do cdigo de verificao invertido.
O ltimo valor de ndice verificador obtido na tabela o
valor 7. Este valor caracteriza-se em ser o valor de ndice da
tabela do dgito verificador.
A partir do valor do ndice verificador basta localizar o dgito
verificador na tabela do dgito verificador. No caso
apresentado o dgito verificador do ndice verificador 7 o
valor 7. Assim sendo, o cdigo de identificao 2468019753
possui o dgito verificador 7, podendo este cdigo de
identificao ser representado como 2468019753-7.
Funo Verhoeff() em LPP
A ttulo de ilustrao e no sentido de facilitar a
implementao em programao de computadores do
algoritmo de Verhoeff segue o projecto de um cdigo de
funo escrito em LPP (Linguagem de Projecto de
Programao) com a finalidade de retornar o valor de dgito
verificador de um cdigo de identificao fornecido.
O algoritmo a seguir pode ser facilmente implementado em
vrias linguagens de programao, desde que respeitadas as
limitaes e estilos de cada uma das linguagens escolhidas.
funo Verhoeff(CDIGO : cadeia) : inteiro
constante {definio das tabelas de
Verhoeff}
TLOCAL = [ 0, 1, 2, 3, 4, 5, 6, 7, 8,
9], {tabela de localizao do inversor 8 x
10}
[ 1, 5, 7, 6, 2, 8, 3, 0, 9,
4],
[ 5, 8, 0, 3, 7, 9, 6, 1, 4,
2],
[ 8, 9, 1, 6, 0, 4, 3, 5, 2,
7],
[ 9, 4, 5, 3, 1, 2, 6, 8, 7,
0],
[ 4, 2, 8, 6, 5, 7, 3, 9, 0,
1],
[ 2, 7, 9, 3, 8, 0, 6, 4, 1,
5],
[ 7, 0, 4, 6, 9, 1, 3, 2, 5, 8]
TINVER = [ 0, 1, 2, 3, 4, 5, 6, 7, 8,
9], {tabela do ndice de inverso 10 x 10}
[ 1, 2, 3, 4, 0, 6, 7, 8, 9,
5],
[ 2, 3, 4, 0, 1, 7, 8, 9, 5,
6],
[ 3, 4, 0, 1, 2, 8, 9, 5, 6,
7],
[ 4, 0, 1, 2, 3, 9, 5, 6, 7,
8],
[ 5, 9, 8, 7, 6, 0, 4, 3, 2,
1],
[ 6, 5, 9, 8, 7, 1, 0, 4, 3,
2],
[ 7, 6, 5, 9, 8, 2, 1, 0, 4,
3],
[ 8, 7, 6, 5, 9, 3, 2, 1, 0,
4],
a programar
<33>
[ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
TDIVER = [ 0, 4, 3, 2, 1, 5, 6, 7, 8, 9]
{tabela do dgito verificador 1 x 10}
varivel {definio das variveis de
auxilio a obteno do dgito verificador}
I, POSIO : inteiro
NDLOC : inteiro
{ndice de localizao}
NDVER : inteiro
{ndice verificador}
CDINV : conjunto[0..Tamanho(CDIGO)] de
cadeia {cdigo invertido}
incio
{trecho de algoritmo para inverso do
cdigo de identificao}
para I de 1 at Tamanho(CDIGO) passo 1
faa
CDINV[I] CDIGO[Tamanho(CDIGO) + 1
- I]
fim_para
{trecho de algoritmo para obteno de
dgito verificador}
NDVER 0
para I de 0 at Tamanho(CDINV) 1
passo 1 faa
POSIO I + 1
INDLOC TLOCAL[POSIO 8 * (POSIO
div 8), CarParaNum(CDINV[I])]
NDVER TINVER[NDVER, INDLOC]
fim_para
Verhoeff TDIVER[NDVER]
fim
O algoritmo da funo Verhoeff() proposto faz uso de
alguns recursos que depende da disponibilidade destes nas
bibliotecas da linguagem de programao em uso como as
funes Tamanho() e CarParaNum(). A funo Tamanho()
retorna o tamanho de um string e a funo CarParaNum()
converte em dado numrico inteiro um dado numrico do
tipo carcter fornecido.
O trecho POSIO 8 * (POSIO div 8) permite obter-se
o clculo do resto da diviso do dividendo POSIO pelo
divisor 8. Este recurso pode ser definido como: mod na
linguagem Pascal (POSICAO mod 8) e % nas linguagens C,
C++, JavaScript, Java, ActionScript, PHP entre outras
(POSICAO % 8).
Observe alguns cdigos de identificao e seus dgitos
verificadores obtidos a partir do algoritmo de Verhoeff: 123-
3, 321-1, 26041965-3, 1-5 e 1234567890-2.
Referncias Bibliogrficas
GARCIA, A. C. dos S, et. al. A Matemtica dos Cdigos de
Barras. Osasco: Centro Universitrio FIEO, 2007. 58 p.
HAMMING, R. Coding and Information Theory. 2nd ed.
USA: Prentice-Hall, 1986. 272 p. ISBN-13: 978-0131390720.
VERHOEFF, J. Error Detecting Decimal Codes. Amsterdam:
The Mathematical Centre, 1969. 118 p.
WAGNER, N. R. & PUTER, P. Error Detecting Decimal
Digits. CACM Publisher ACM, New York, v. 32, issue 1, p. 106-
110. jan. 1989. ISSN: 0001-0782.
a programar
Natural da Cidade de So Paulo, Augusto Manzano tem 23
anos de experincia em ensino e desenvolvimento de
programao de software. professor da rede federal de
ensino no Brasil, no Centro Federal de Educao
Tecnolgica de So Paulo. tambm autor, possuindo na
sua carreira mais de cinquenta obras publicadas.
augusto.manzano@portugal-a-programar.org
Augusto Manzano
<34>
Fundamentos de
Segurana em Redes
Parte III (IDS)
Na continuao dos dois ltimos artigos sobre alguns
fundamentos de segurana em redes, este ir focalizar-se
em alguns componentes mais comuns de uma rede e assim
como tambm em Sistemas de Deteco.
Mais um pouco de arquitectura
Na arquitectura de uma rede esto presentes diversos
componentes, cada qual com as suas funcionalidades e
tambm responsabilidades. J tocamos um pouco neste
aspecto da importncia da arquitectura da rede no primeiro
artigo, mas nesta parte vamos cingir-nos aos componentes
mais comuns que podemos encontrar numa rede.
Gateways
Podemos comear pel o l ti mo di sposi ti vo que
provavelmente vamos encontrar numa rede. Uma gateway
um ponto da rede que funciona como entrada para uma rede
e faz de intermedirio entre duas redes que falam
protocolos diferentes. Geralmente as gateways trabalham
nas camadas Transporte e Sesso do modelo OSI, mas
dependendo do tipo de protocolo que suportem podem
operar praticamente a qualquer nvel ou camada do modelo
OSI. Exemplos de protocolos e suites normalmente usados
pelas Gateways so o X.25, o SNA ( System Network
Architecture IBM) e o ATM (Asynchronous Transfer Mode).
Dado que uma gateway colocada na fronteira da rede
tambm necessrio que ela desempenhe algumas
funcionalidades importantes tais como Firewall, Proxy, VPN
(Virtual Private Network), onde tambm podem ser
incorporados alguns mecanismos de defesa.
DMZ
De seguida temos uma DMZ (DeMilitarized Zone) ou Zona
Desmilitarizada. Como certamente bvio, este um termo
militar, que teve origem na Guerra das Coreias. Uma DMZ
designa uma rea geralmente entre dois pases, onde
actividades militares no so permitidas. Analogamente
uma DMZ numa rede uma regio segura que designada
na fronteira entre a rede interna e a rede externa que na
maioria dos casos a Internet. Tipicamente usamos o termo
DMZ para nos referirmos a uma pequena rede que contm
servios pblicos tais como servidores de FTP, DNS e E-mail.
segurana
Exemplo de uma rede com o X.25.
<35>
O que assegura que os servios que requerem acesso
externo fiquem separados da rede local. Por estar separada
da rede local, qualquer dano ou ataque que seja feito no ir
afectar a rede local.
possvel tambm a utilizao de uma DMZ e de uma
Screened Subnet. O que ento uma Screened Subnet?
Uma Screened Subnet uma firewall que possui 3 interfaces
de rede. A primeira interface a interface pblica e que liga
Internet. A segunda interface conecta DMZe por fim a
terceira interface conecta intranet e s redes internas.
Qual o objectivo de uma screened subnet?
Bem o propsito da Screened Subnet isolar a DMZ e os
seus recursos da intranet e portanto proteger a rede interna
tornando mais difcil que esta sofra as consequncias de um
ataque.
Routers
Passando para os routers. Apesar de termos abordado
algumas estratgias que podem ser usadas na melhoria da
segurana de uma rede, no podemos deixar de falar num
dos dispositivos mais comuns numa rede mas que tem um
peso considervel. Os routers tm como funo principal
direccionar o trfego que chega e que sai de uma rede, mas
no se resumem apenas a esta funo. Um router pode ser
uma ferramenta bastante poderosa se for bem configurada
e inserida na rede. Com um router podemos concentrar num
nico dispositivo diversas funcionalidades tais como IP
Security, VPN, Stateful Firewall, Intrusion Detection e
Quality of Service (QoS).
Existem diversas funcionalidades que podemos usar ou no
num router convencional. Uma das primeiras coisas que
podemos fazer activar a DMZ e desactivar o UPnp.
Porqu? Porque esta funcionalidade permite que um
dispositivo de rede se auto-configure, apesar de ser
aparentemente uma boa funcionalidade tambm
prejudicial. Por exemplo um vrus pode usar o UPnp para
abrir um buraco na firewall do router. Outro aspecto
tambm importante usarmos o Filtro de endereos MAC.
Assim podemos restringir os dispositivos que podem se ligar
nossa rede. Por exemplo, se apenas temos 10 endereos
MAC na rede, uma boa medida de segurana seria configurar
o router de maneira a que apenas esses 10 endereos
possam conectar rede.
Se usamos wireless podemos modificar o nome SSID
(Service Set Identifier) que vem por defeito, assim como
configurar o WEP\WPA e desactivar o SSID broadcast.
NAT como defesa
Geralmente usado um firewall ou um router para proteger
cada segmento da rede. Estes so dispositivos ideais para
proteger o permetro da rede, mas no so os nicos a ser
usados. Talvez associemos o Network Address Translation
(NAT) a um mtodo de aproveitar ao mximo a falta de
endereos no IPv4, por conectar mltiplos computadores
Internet usando apenas um endereo IP. Mas o NAT tem um
bom potencial no que toca a segurana, podendo ser usado
para complementar o uso dos firewalls e routers. Como?
NAT complementa o uso de routers ao providenciar medidas
extras de segurana para uma rede interna. Usualmente, os
hosts de dentro da rede so capazes de comunicar com o
exterior, mas sistemas de fora necessitam passar pelo NAT
para chegar rede interna o que confunde o atacante
quanto a qual o host que quer atingir. Outra vantagem da
utilizao do NAT diz respeito ao bloqueamento de ataques
como o SYN flood e ping of death.
IDS (Intrusion Detection System)
Existem dois tipos principais de Intrusion Detection System,
temos o NIDS (Network Intrusion Detection System) e o
HDIS (Host Intrusion Detection System). Basicamente tanto
num caso como noutro o objectivo a deteco e o alerta de
eventos prejudiciais ou maliciosos que possam comprometer
a rede ou um computador. O alerta pode ser feito de
diversas formas, desde o enviar um e-mail a apenas indicar a
ocorrncia num log.
Tambm possvel a utilizao de IDS hbridos no sentido
de usarmos diversos tipos de abordagem como soluo para
uma situao especfica.
Alguns dos IDS mais conhecidos e talvez usados so:
Snort Cisco Secure IDS Dragon Sensor E-Trust IDS Audit-
Guard Symantec Snort
Como podemos ver, existem diversos IDS que podem ser
inseridos em diversas categorias dependendo da sua
funcionalidade e arquitectura. J referimos a existncia dos
segurana
<36>
HIDS e dos NIDS, vamos falar um pouco sobre cada um
deles.
Host-based Intrusion Detection Systems
Este tipo de IDS tem como objectivo monitorizar, detectar e
responder correctamente a alguma actividade suspeita ou a
um ataque num computador. Um HIDS permite que um
determinado computador ou computadores possam ser
protegidos no s contra ataques mas tambm contra
falhas de segurana ou vulnerabilidades. Por isso alguns
HIDS trazem incorporado diversas ferramentas de gesto de
polticas, anlise de estatsticas e outras ferramentas
importantes para um bom e eficaz funcionamento do IDS.
Na maior parte dos casos o HIDS incorporado no sistema
operativo do computador em questo. No entanto, este tipo
de IDS apresentam desvantagens, nomeadamente quando o
computador em questo invadido e o IDS fica
comprometido e muitas vezes inutilizado para futuras
aces. Essa situao leva-nos existncia em parte de
outro tipo de IDS.
Exemplos de HIDS:
OSSEC Samhain Osiris Aide ThirdBrigade
Network-based Intrusion Detection System
O funcionamento do NIDS baseia-se na anlise do trfego
da rede e verificar operaes suspeitas. Basicamente
funcionam como Packet Sniffers que lem o trfego e usam
regras ou outros parmetros de maneira a verificar se a rede
est ou no comprometida. Apesar de ser uma boa opo
para analisar protocolos como TCP\IP, XNS e muitos outros,
os NIDS no apresentam to bons resultados face a trfego
encriptado. Outro factor constrangedor a velocidade de
anlise do trfego.
Uma boa utilizao de IDS passa pela utilizao conjunta de
um NIDS e de um HIDS. Ficando o NIDS centralizado e
analisando os dados que sero fornecidos pelos outros IDS
(HIDS).
Portanto, apesar de o NIDS e o HIDS terem o mesmo
objectivo a maneira como actuam diferente, no caso do
NIDS monitorizado o trfego da rede e no caso de
surgirem situaes suspeitas dado o alarme. No HIDS essa
monitorizao aplicada apenas a um host. Existem
tambm IDS que trabalham com base na monitorizao de
protocolos e de aplicaes, sendo estes IDS mais
apropriados para redes com servers e datacenters
IPS (Intrusion Prevention System)
Um Intrusion Prevention System tem como funo a
deteco e impedir ataques contra certos recursos da rede.
A diferena de um IPS para um IDS, que um IPS concentra-
se em automaticamente defender o alvo do ataque sem a
interveno de um administrador.
A preveno conseguida pela incorporao de tecnologias
de firewall com IDS. Dado que um IPS incorpora este gnero
de tecnologias pode praticamente trabalhar a qualquer nvel
do modelo OSI. No entanto, poder no ser uma boa soluo
porque um IPS pode no conseguir apresentar a mesma
rapidez e robustez que um firewall e um IDS convencionais.
IDS - Mtodos Deteco e Aco
Como podemos verificar nas seces anteriores os IDS
funcionam de maneiras diferentes, mas o princpio bsico de
operacionalidade mantm-se ou seja analisar pacotes do
trfego da rede. No entanto existem duas maneiras bsicas
de deteces que se baseiam na deteco de anomalias e
deteco com base em assinaturas.
No caso da deteco por anomalias feita uma anlise
procura de actividades fora do comum e feita uma
comparao com logs de actividades ditas normais ou com
regras definidas pelo administrador. Portanto se existir um
contraste de actividade daquilo que habitual aquele
computador fazer dado o alarme e indicada uma
anomalia que transmitida ao administrador.
As regras por exemplo podem ser definidas de maneira a
verificar se por exemplo certos ficheiros so acedidos, se
certos recursos so usados, etc. So diversos os parmetros
os quais podemos usar para verificar anomalias.
Apesar de ser uma boa soluo apresenta algumas
desvantagens como lgico. Uma desvantagem so os
falsos alarmes que podero ser activados mesmo quando
aces legtimas so efectuadas, mas dado que diferem do
padro habitual despoletam um alarme.
Outra metodologia empregada pelo IDS a deteco com
base em regras ou assinaturas j predefinidas. Essas
assinaturas representam um padro que caracterstico de
um determinado ataque. Portanto esses IDS possuem uma
base de dados dessas assinaturas que so usadas para
comparao com a actividade da rede.
Como que os IDS respondem s deteces de intruso?
O tipo de resposta depende do tipo de ataque que feito e
do tipo de alarme gerado e por isso existe dois tipos de
resposta, modo passivo e activo que podem ser
incorporadas nos IDS.
Alguns desses modos podem passar desde o bloquear o
endereo de IP, bloqueando assim o endereo do atacante o
segurana
<37>
que permite em certa forma travar o SPAM e os ataques de
Denial of Service. Outro modo interessante passa por
analisar o ataque por algum tempo, retirar informao e
usar esses dados para tornar o IDS mais eficaz.
Concluso
Como podemos ver ao longo destes artigos, a segurana
uma parte fundamental numa rede. Para termos relativa
segurana no podemos basear a nossa confiana apenas
num software ou dispositivo pensando que isso basta por si
s. Uma boa soluo de segurana para uma rede pode no
ser o melhor para outra. preciso fazer uma anlise da rede,
daquilo que queremos proteger dos objectivos que
queremos atingir e por isso preciso encarar a segurana de
uma rede como sendo um projecto que baseia a sua
capacidade em diversas camadas, cada qual com o seu
objectivo.
A ver:
Ciscos Virtual LAN Communications white paper -
http://www.cisco.com/warp/public/cc/pd/wr2k/cpbn/tech/vlan
_wp.htm
T o p 5 I n t r u s i o n De t e c t i o n Sy s t e ms
http://sectools.org/ids.html
Linux IDS
http://www.linuxsecurity.com/resources/intrusion_detection-
1.html
Referncias:
Sybex CCNA Cisco Certified Network Associate Study Guide
Imagens:
http://en.wikipedia.org/wiki/File:X25-network-diagram-
0a.svg

http://en.wikipedia.org/wiki/File:DMZ_network_diagram_1_f
irewall.svg
segurana
Residente em Lisboa, Ciro Cardoso um grande amante do
vasto mundo que a informtica em especial a segurana.
Est actualmente a trabalhar na prxima etapa do percurso
Cisco com a certificao CCNP. Gosta bastante da rea de
redes, configurao e implementao de protocolos.
ciro.cardoso@portugal-a-programar.org
Ciro Cardoso
<38>
RoutingPT
O RoutingPT um forum portugus criado recentemente
dedicado, principalmente, a redes e sistemas informticos.
Apesar da sua juventude, j possvel encontrar aqui vrias
informaos relativamente a esta temtica, nomeadamente em
termos de Software, Hardware, Segurana ou, em termos mais
especificos, sobre Protocolos existentes e mesmo VoIP. A curva de evoluo do forum tem sido bastante boa, sendo que
esperado que dentro de em breve comece a tornar-se um bom repositrio de informao sobre este tema.
http://www.routingpt.com/
Para eleger o melhor projecto ir ser efectuada uma pr-seleco pelo jri do concurso, de onde saram 5 projectos,
que sero alvo de votao pblica por todos os membros da comunidade (com mais de 20 mensagens no frum).
O vencedor ter direito a alguns prmios, entre os quais uma T-Shirt do P@P, alojamento para o projecto no servidor
do P@P, entre outros de possveis patrocinadores.
Para informao mais detalhada sobre o concurso podem consultar o regulamento, que se encontra em anexo, e/ou
contactar um moderador da seco de Projecto de Programao por mensagem privada, atravs do frum, ou
atravs do endereo projectos@portugal-a-programar.org.
Calendrio do prximo concurso

Categoria: Cdigo Aberto
Incio do Concurso: 01-01-2009
Prazo de Entrega: 15-02-2009
Anuncio de Finalistas e Votao do Pblico: 22-02-2009
Fim de Votao e Anuncio do Vencedor: 01-03-2009
Concurso de Projectos de Programao P@P
A comunidade Portugal-a-Programar decidiu organizar o Concurso de
Projectos de Programao P@P. Este concurso pretende a dinamizao e
divulgao das diversas linguagens de programao, assim como reconhecer
os programadores pelos seus trabalhos.
Este concurso est aberto a qualquer programador e encontra-se dividido em
duas categorias Projectos de software livre/aberto e Projectos de software
proprietrio. Ir ser realizado de dois em dois meses, alternando entre as
duas categorias acima mencionadas, encontrando-se as datas dos concursos
e prazos de entrega de trabalhos, disponveis no regulamento.
internet
Equipa PROGRAMAR
Um projecto Portugal-a-Programar.org
Queres participar na Revista
PROGRAMAR? Queres integrar este
projecto, escrever artigos e ajudar a
tornar esta revista num marco da
programao nacional?
Vai a
www.revista-programar.info
para mais informaes em como
participar,
ou ento contacta-nos por
revistaprogramar
@portugal-a-programar.org
Precisamos do apoio de todos para
tornar este projecto ainda maior...
contamos com a tua ajuda!

Você também pode gostar