You are on page 1of 27

editorial

ndice
3 4 8 19 21 23 24 25 notcias tema de capa a programar tecnologias gnu/linux internet bluescreen projectos

Programadores que no sabem programar?


Enquanto lia alguns dos tpicos mais populares do ano no que toca programao na popular comunidade Digg (www.digg.com), depareime com um artigo intitulado Why Cant Programmers... program!, em que se referia que na maior parte das entrevistas de emprego a programadores precedidas de recolha de currculos, a maior parte dos entrevistados no superava algumas das mais bsicas tarefas solvidas com recurso a uma linguagem de programao, da ordem das que algum que comeou a programar h dias tenta fazer. Coordenador Adjunto desde a 4 edio, actualmente o Coordenador da Revista Programar. Entrou em 2007 no curso de Engenharia Informtica e de Computadores no IST.

Miguel Pais

equipa PROGRAMAR administrao


Rui Maia David Pintassilgo

coordenador
Miguel Pais

coordenador adjunto
Joel Ramos

editor

Pedro Abreu

Pode-se argumentar que bons programadores so desde logo assediados pelas empresas enquanto tiram os seus cursos, no precisando deste gnero de entrevistas, mas mesmo os que no conseguem tal sorte, no me parece, pelo menos em Portugal, que falhassem em questes bsicas sobre programao, como no exemplo dado no artigo original: pedir ao programador que faa um output de todos os nmeros de 1 a 100, excepto os mltiplos de 3, que seriam imprimidos como Fizz e os de 5 que seriam Buzz (os mltiplos de ambos como FizzBuzz). Ou h algo de errado no mundo, ou h algo de errado nesta profisso. Ser que com a divulgao dos mais diversos tutoriais e snippets na web com a caracterstica comum de quererem dar a soluo em vez de explicar como se chega a tal, a profisso de programador comea a ter, dentro de si, uma larga percentagem de indivduos que, na mais fiel das denominaes, seriam intitulados programadores do desenrasque? Mas mais surpreendente do que haver tal percentagem de facto ter programadores dessa ordem empregados. Ter a programao j se especializado assim tanto que nem a reprovao na concepo do mais bsico algoritmo seja indicador de mau programador? Ser preocupante se sim, pois teremos muitos dos nossos servios do dia a dia mantidos e assegurados por programadores que numa possvel situao inesperada no sabero tomar as medidas adequadas para resolver o problema. No entanto, o mundo emprega-os...

redaco

David Ferreira Fbio Correia Joo Rodrigues Joo Alves Miguel Arajo Pedro Teixeira

colaboradores
Jos Fontainhas Daniel Correira Jos Oliveira Srgio Santos

contacto

revistaprogramar @portugal-a-programar.org

website

www.revista-programar.info

Queres ajudar a Revista PROGRAMAR? V como na ltima pgina.

<2>

notcias

Novo MacBook Air


A Apple conseguiu fazer um porttil incrivelmente fino e ainda usar um ecr de 13.3 polegadas e um teclado no seu tamanho normal. Tem apenas menos de 2 cm de espessura na parte superior e 0.4 cm na parte inferior. Pesa 1,36 kg. O ecr de 13.3' em vidro, 1200 por 800 widescreen e com backlit LED. Este ecr do mesmo tamanho do do Macbook. As teclas do teclado do Air so como as do Macbook, na cor preta. A diferena est em que este um teclado retro-iluminado que se acende quando o sensor detecta a diminuio de luz. O trackpad tambm especial integra vrios movimentos multi-touch tambm utilizados no iPhone como o scroll, o pinch para o zoom, ou o rotate.

Os nicos 3 conectores do Macbook Air esto escondidos. Basta deslizar uma espcie de tampinha e eles surgem: o buraco dos headphones, do usb e micro-DVI. A sada micro-DVI suporta DVI, VGA, vdeo composto e S-video. At o carregador MagSafe teve que ser redesenhado e sofrer uma dieta para o Air. Est tambm equipado com 2Gb de RAM incorporados, 80Gb de hard drive ou, por opo, uma drive de 64Gb solid-state drive sem partes movveis. O processador agora uma verso mais pequena do Intel Core 2 Duo a 1.6GHz ou, opcionalmente, a 1.8GHz. Como todos os outros Macbook tem cmera iSight que agora circular. A bateria no removvel e tem uma durabilidade de at 5 horas. O Macbook Air est previsto para entrega dentro de uma a duas semanas com o preo a rondar os 1800 na verso standard.

Oracle compra BEA Systems


Depois de uma primeira oferta sem sucesso, a Oracle conseguiu agora ir ao encontro dos desejos da administrao da BEA Systems e chegar a um preo que permitir concretizar o negcio de aquisio da empresa. O novo preo, de 8,5 mil milhes de dlares, representa um prmio de 14 por cento face primeira oferta apresentada em Outubro passado e resulta numa proposta de 19,3 dlares por aco, contra os anteriores 17 dlares. A BEA Systems opera no mercado de middleware, rea onde a Oracle tem vindo a reforar competncias, nomeadamente pela via das aquisies e que pretende liderar a nvel mundial. O middleware alis o foco do projecto Fusion em que a Oracle tem vindo a trabalhar para integrar o seu software com o das empresas que tem vindo a adquirir nos ltimos anos, nomeadamente a PeopleSoft.

Sun adquire MySQL AB


A Sun adquiriu a MySQL AB o que pode ter um impacto grande no mercado de bases de dados. A empresa referiu que est apostar milhares de milhes com o MySQL. Referiu tambm que vai oferecer um novo suporte ao mercado do MySQL, mas tambm vai dar suporte comunidade com o objectivo de acelerar o processo das empresas sarem do software proprietrio. Segundo a Sun: As pessoas do MySQL, desde os empregados, utilizadores e patrocinadores - bem-vindos, estamos contentes por nos juntar-mos convosco. Esta aquisio significa o comeo duma nova era na Internet. Apesar de ser um mercado onde a Oracle lidera indiscutivelmente, o facto de ter a Sun por trs e ter um modelo diferente pode chegar para comear a assustar a Oracle. Quanto utilizao hoje feita do MySQL em plataformas Web, o impacto no ser to grande, j que o MySQL hoje o lder. Curiosamente, tanto nos grandes (Flickr, Sapo, Google...) como nos pequenos.

<3>

tema de capa

Programao Orientada a Objectos em C#

exemplo, num programa em C todas as operaes tm acesso a todos os dados, e uma mudana num dos mdulos pode ter implicaes em todo o programa. A programao orientada a objectos alivia alguns desses problemas, encapsulando cada uma das estruturas de dados num objecto. O objecto tambm possui funes, chamadas em POO de mtodos, que permitem interagir com o objecto.

POO Caractersticas
C# uma linguagem de programao relativamente recente, criada pela Microsoft, desenvolvida juntamente com a arquitectura .NET. C# pronuncia-se c sharp e no c cardinal, foi criada praticamente do zero para funcionar na nova plataforma, sem preocupaes de compatibilidade com cdigo de legado. Ultimamente, as empresas de software tm apostado cada vez mais na plataforma .NET e consequentemente no C#. Isto deriva do facto de ser uma linguagem simples, orientada a objectos (como se ir ver mais frente), que tira partido dos servios de segurana, da gesto automtica de memria e do vasto conjunto de bibliotecas da plataforma .NET. A linguagem foi baseada em Java e C++, tirando partido das melhores caractersticas das duas, pelo que qualquer programador que esteja vontade nestas duas linguagens no vai sentir muitas dificuldades em aprender C#. portanto, uma linguagem que permite desenvolver software com grande robustez, respondendo aos exigentes requisitos das empresas. No objectivo deste artigo ensinar e descrever as caractersticas aprofundadas da linguagem C#, no entanto pode-se dizer que tem uma sintaxe bastante parecida do Java. Tem as mesmas expresses de controlo de fluxo que as linguagens derivadas do C, como por exemplo o if-else, o while, o for, entre outros. Tambm possui bastantes estruturas prprias da linguagem, mas esse um assunto que o leitor dever aprofundar se no estiver vontade. Esta pequena descrio da linguagem C# serviu de introduo para o apoio ao tema central deste artigo, que a Programao Orientada a Objectos. Para que o leitor fique a perceber melhor como funciona este paradigma vo ser mostrados alguns exemplos de cdigo C#. A POO assenta em trs conceitos base: - Encapsulamento de informao; - Herana; - Polimorfismo.

- Encapsulamento de informao
Um dos pontos fulcrais do POO esconder as estruturas de dados em objectos, aos quais so associados mtodos que manipulam essas estruturas. Para este processo o programador tem de definir classes, que so um tipo abstracto de dados ou uma famlia de dados. Cada classe costuma ter as variveis, mtodo(s) construtor(es), mtodos que modificam ou devolvem o valor das variveis. Antes de entrar em detalhes sobre o que cada um, melhor tomar em ateno o seguinte cdigo:

class Aluno { private int Numero; //Nmero do aluno private string Nome; //Nome do aluno private string NomeEscola; //Nome da escola public Aluno(int numeroAluno, string nomeAluno, string nomeEscola) { Numero = numeroAluno; Nome = nomeAluno; NomeEscola = nomeEscola; } public void MostraAluno() { Console.WriteLine("O aluno nmero {0} chama-se {1} e estuda na escola {2}.", Numero, Nome, NomeEscola); }

Programao Estruturada vs Programao Orientada a Objectos


Hoje em dia, praticamente todo o software est a ser escrito em linguagens de programao orientadas a objectos (POO). Linguagens de programao estruturada como o C e o Pascal esto a ser deixadas para trs, pois funcionam bem para pequenos programas mas quando a complexidade comea a aumentar podem surgir vrios problemas. Por

<4>

tema de capa

public int DevolveNumero() { return Numero; } public void ModificaNumero(int Numero) { this.Numero = Numero; } } A classe Aluno possui trs variveis declaradas como private: Numero, Nome e NomeEscola. Isto significa que s podem ser acedidas a partir da prpria classe, ou seja, a informao escondida dentro da classe. Se estivesse declarada como public podia ser acedida a partir de uma classe externa. Pode-se observar a existncia de um construtor: public Aluno(). A sua funo a de criar uma nova instncia de uma classe, ou seja, cria um objecto dessa classe. Tambm ir guardar a informao dos atributos que so passados no construtor no interior da classe, tal como visto no cdigo, j que as variveis da classe tomam o valor das passadas no construtor. Para criar o objecto do tipo Aluno basta fazer:

Numero est declarada como private e necessrio este

mtodo que para entidades exteriores classe possam modificar o seu contedo. Desta forma, a seguinte sequncia:

aluno1.ModificaNumero(20); aluno1.MostraAluno();

imprime a frase: O aluno nmero 20 chama-se Filipe e estuda na escola Escola XPTO. De notar que no mtodo que modifica a idade do aluno foi usado a clusula this, que significa o prprio objecto. Como a varivel da classe e a passada por referncia no mtodo tinham o mesmo nome foi necessrio indicar que quem tomava o novo valor era a varivel do objecto. de notar que as outras classes podem chamar estes mtodos porque esto declarados como public; caso estivessem declarados como private os mtodos s podiam ser acedidos a partir da prpria classe.

- Herana
Esta uma das caractersticas mais visveis e com mais uso quando se desenvolve uma aplicao usando POO. Para compreender melhor o conceito de Herana, vai-se tomar em conta a classe Aluno anteriormente descrita. Imagine-se, agora, que necessrio criar mais uma classe para os alunos que so trabalhadores estudantes e que essa classe apenas vai ter mais um campo (o nome da empresa onde trabalha) que a classe Aluno. Ser que faz sentido estar a criar uma classe AlunoTE que repita os mesmos atributos que a classe Aluno? Afinal de contas, um trabalhador estudante um aluno, e como tal possui todas as caractersticas de um aluno normal. Assim surge o conceito de herana, ou seja, possvel criar uma nova classe que derive de outra. Contudo nem sempre o conceito de herana bem utilizado. Apenas se deve usar quando uma classe uma especializao da outra, isto , quando possui todos os elementos que a outra possui mais alguns, sejam estes mtodos ou dados. usual chamar classe geral de superclasse ou de classe base, enquanto as que derivam destas so chamadas de subclasses.

Aluno aluno1 = new Aluno(10, Filipe, Escola XPTO);

Depois existem trs mtodos. O primeiro, MostraAluno(), quando chamado imprime a frase com os dados do aluno, ou seja, ao invocar aluno1.MostraAluno() vai imprimir a seguinte frase: O aluno nmero 10 chama-se Filipe e estuda na escola Escola XPTO. O mtodo DevolveNumero() chamado sempre que seja necessrio saber o nmero do aluno. Como a varivel Numero da classe Aluno est declarada como private, necessrio criar esse mtodo para saber o seu valor. A seguinte invocao:

Console.WriteLine(O aluno tem o nmero {0}., aluno1.DevolveNumero())

resulta na frase: O aluno tem o nmero 10. O ltimo mtodo, ModificaNumero(int Numero), usado para modificar o nmero do aluno, j que a varivel

<5>

tema de capa

Para perceber melhor o conceito de herana, em seguida est exemplificado o cdigo da classe AlunoTE que deriva da classe Aluno: class AlunoTE : Aluno { private string NomeEmpresa; //Nome da empresa public AlunoTE(int numeroAluno, string nomeAluno, string nomeEscola, string NomeEmpresa) : base(numeroAluno, nomeAluno, nomeEscola) { this.NomeEmpresa = NomeEmpresa; } public void MostraAlunoTE() { Console.WriteLine("O aluno trabalha na empresa {0}.", NomeEmpresa); } } Como se pode observar, a classe AlunoTE definida como sendo subclasse de Aluno logo no incio: class AlunoTE : Aluno. Desta forma herdou todas as variveis e mtodos presentes na classe Aluno . Em seguida definido um atributo, que o nome da empresa em que o aluno trabalha. Depois vem o mtodo construtor, que recebe como argumentos todos os atributos da classe Aluno mais o atributo NomeEmpresa. Nota-se uma novidade que o uso do : base(). O que isto faz inicializar as variveis na classe base antes de fazer o mesmo na prpria classe. Depois disso feita a inicializao da varivel NomeEmpresa no corpo do construtor da prpria classe. Tambm foi criado um mtodo local que imprime o nome da empresa onde o aluno trabalha. Por fim, j se podem criar objectos da classe AlunoTE, e fazer uso das funcionalidades que a herana permite, como por exemplo, o seguinte cdigo:

- Polimorfismo
Por polimorfismo entende-se a capacidade de objectos diferentes se comportarem de modos distintos quando lhes chamado o mesmo mtodo. Por exemplo, a classe AlunoTE possui um mtodo que imprime o nome da empresa, para imprimir o nmero, o nome e o nome da escola tem de chamar o mtodo da classe base. Mas pode ser feita a redefinio do mtodo MostraAluno() e fazer com que se imprimam todos os dados, tanto da classe base como da derivada. Em C# basta criar um mtodo com o mesmo nome na classe derivada (declarado como override), declarando ao mesmo tempo o mtodo da classe base como virtual. Na classe Aluno o mtodo ficaria assim:

public virtual void MostraAluno() { Console.WriteLine("O aluno nmero {0} chama-se {1} e estuda na escola {2}", Numero, Nome, NomeEscola); }

Na classe AlunoTE seria criado o novo mtodo da seguinte forma:

public override void MostraAluno() { Console.WriteLine("O aluno nmero {0} chama-se {1}, estuda na escola {2} e trabalha na empresa {3}." , Numero, Nome, NomeEscola, NomeEmpresa); }

Desta forma quando for criado um aluno do tipo AlunoTE e invocar esse mtodo:

AlunoTE aluno2 = new AlunoTE(15, Joel, Escola XPTO, SoftRevistaPROGRAMAR); aluno2.MostraAluno(); aluno2.MostraAlunoTE(); vai imprimir: O aluno nmero 15 chama-se Joel e estuda na escola Escola XPTO. O aluno trabalha na empresa SoftRevistaPROGRAMAR.

AlunoTE aluno3 = new AlunoTE(5, Pedro, Escola XPTO, SoftRevistaPROGRAMAR); aluno3.MostraAluno();

vai obter a mensagem: O aluno nmero 5 chama-se Pedro, estuda na escola Escola XPTO e trabalha na empresa SoftRevistaPROGRAMAR.

<6>

tema de capa

Nveis de acesso a membros


Ao longo deste artigo tm sido dados exemplos de atributos, mtodos e classes declarados como public e private. No entanto existem outros nveis de acesso a membros, como o caso do protected , internal e protected internal (os dois ltimos so caractersticas do C# - em Java, por exemplo, no existem).

public static void ModificaEscola(string novoNome) { this.NomeEscola = novoNome; } Se houver dois objectos e o mtodo for chamado apenas num, o outro objecto tambm vai alterar o nome da escola.

Nvel de acesso
Private Protected Public Internal

Visibilidade
Dentro da prpria classe Dentro da prpria classe e em classes derivadas Dentro e fora da prpria classe Como os membros public, mas apenas dentro do mdulo corrente

Construtores estticos
Tal como foi dito anteriormente, um membro esttico no est associado a nenhum objecto em concreto, por isso faz todo o sentido o membro esttico ser inicializado dentro de um construtor esttico. Um construtor esttico apenas difere dos apresentados anteriormente pelo facto de ser declarado como static. private static string Atributo; static ClasseXPTO() { Atributo = AtributoX; }

Protected Internal Como os membros protected, mas apenas dentro do mdulo corrente

Concluso
Com este artigo pretendeu-se que o leitor fique a perceber, de uma forma superficial, o paradigma de programao orientado a objectos. Partiu-se do princpio que o leitor j possui alguns conhecimentos em C#, ou ento em linguagens cuja sintaxe parecida, podendo desta forma dar alguns exemplos prticos. Nem todos os aspectos foram tratados neste artigo, pelo que se aconselha a pesquisar sobre este assunto, nomeadamente no que diz respeito a classes seladas, classes abstractas e interfaces.

Membros estticos
Por vezes surge a necessidade que determinadas classes partilhem informao. Por exemplo, imaginando que todos os alunos andam na mesma escola, no caso da classe Aluno existe um campo que comum a todos os alunos da mesma escola, que o nome da escola (NomeEscola). Sempre que haja uma alterao no nome da escola, deve ser visvel em todas as instncias da classe. Surge ento o conceito de static. No exemplo da classe Aluno, imagine-se que o nome da escola era declarado como static: private static string NomeEscola; Este atributo vai ser partilhado por todas as instncias da classe Aluno. Para alterar o seu contedo, declara-se tambm um mtodo esttico:

Bibliografia
MARQUES, Paulo; PEDROSO, Hernni - C# 2.0 . Lisboa: FCA, 2005. ISBN 978-972-722 208-8 http://pt.wikipedia.org/wiki/C_Sharp http://msdn.microsoft.com/vcsharp/ http://en.wikipedia.org/wiki/Object-oriented_programming

Residente em Amarante, Pedro Teixeira actualmente finalista do curso de Engenharia Informtica. Colaborador da revista PROGRAMAR quase desde o incio, este o 4 artigo que produz para todos os que desejam saber mais sobre programao e afins. Gosta bastante da rea de redes de computadores, seja na vertente programao, seja na de segurana.

Pedro Teixeira
<7>

a programar

Shell Script

Shell a linha de comandos de Linux e Unix, ela que interpreta todos os comandos inseridos pelo utilizador. Para alm de executar comandos do sistema esta tambm tem comandos de programao tais como IF, FOR, WHILE, variveis e tambm funes, permitindo desta forma criar chamadas de comandos mais flexveis. Shell Script basicamente um ficheiro com uma determinada sequncia de comandos Shell, estes scripts podem ser executados de diversas formas podemos criar o nosso script e execut-lo usando os comandos sh ou bash. sh Script.sh ou bash Script.sh Ambos executam o script, com uma diferena, o sh o interpretador standard de comandos Shell, por sua vez o bash o interpretador de comandos Shell tal como o sh, mas com mais algumas funcionalidades, nomeadamente o suporte de variveis do tipo Array, Select, Read, etc Por esse motivo vamos usar o bash. Uma outra forma de executar o nosso script tornando-o executvel. Para isso na primeira linha do nosso script colocamos o caminho para o interpretador, por exemplo: #!/bin/bash printf Hello World Em seguida executamos o comando chmod +x Script.sh para tornar o nosso script executvel e depois basta corr-lo. Vamos agora passar prtica, comeando por ver como definir variveis para o nosso Shell Script. A declarao de variveis bastante simples, basta colocar o nome=valor sem espaos. Vamos ver vrios exemplos de declarao de variveis.

#!/bin/bash Nome=White Magician; NUMERO=70101; _ID1=1; _id2=ABFISOEEQS; echo echo echo echo $Nome $NUMERO $_ID1; $_id2;

Como podemos ver as variveis podem ter nomes com letras de a..z e A..Z, nmeros e _. Embora possam conter nmeros estes no podem ser colocados no incio, pois variveis iniciadas com um nmero esto reservadas para a Shell. O uso de ; no obrigatrio como podemos ver, mas existem casos em que o seu uso faz parte da sintaxe. Veremos esses casos mais frente. No exemplo para aceder ao valor guardado numa varivel usamos o prefixo $. As variveis podem a ser de valor constante, ou seja, o seu valor no pode ser alterado, para isso usamos o comando readonly como podemos ver em seguida. #!/bin/bash var=1000; readonly var; readonly var2=12; var=9; Ao executar este script ele ir retornar um erro dizendo que a varivel var apenas de leitura. Podemos declarar a varivel e em seguida declar-la como readonly ou ento fazer os dois passos de uma vez como podemos ver. As variveis podem a ser eliminadas, ou seja apagadas da lista de variveis da Shell. Para isso basta usar comando unset, mas este comando apenas funciona em variveis no declaradas como readonly.

<8>

a programar

#!/bin/bash var1=100; readonly var2=10; unset var1; unset var2; echo $var1; echo $var2; Ao executar este script podemos ver duas operaes importantes. Primeira, ao fazer echo $var1 no ser impresso nenhum valor, visto esta varivel j no existir. Segunda, o retorno de um erro devido tentativa de eliminar uma varivel readonly e que ao ser impresso o seu valor foi mantido. Uma estrutura muito til para a criao de scripts dinmicos e mais flexveis o array, tambm disponvel na nossa Shell, mas apenas no bash e no no sh. Os arrays podem ser facilmente usados com a seguinte sintaxe nome[ndice]=valor. Vamos agora ver o seu funcionamento. #!/bin/bash lista[0]=9999; lista[1]=1111; lista[10]=333; echo echo echo echo ${lista[0]}; ${lista[1]}; ${lista[10]}; ${lista[@]};

#!/bin/bash echo $PWD #Caminho para a directoria actual. echo $UID #ID do utilizador que iniciou a Shell echo $SHLVL #Nmero de sesses Shell abertas. echo $REPLY #Contm o ltimo input recebido pela funo read no suportado pelo SH echo $RANDOM #Cria um nmero aleatrio entre 0 e 32767 no suportado pelo SH echo $PATH #Caminhos de pesquisa para comandos das Shell. echo $HOME #Caminho para a HOME do utilizador actual. Ainda no mbito das variveis -nos possvel aceder a variveis especiais. Podemos ver uma pequeno exemplo do uso dessas variveis: #!/bin/bash echo $0 echo $1 do Script. echo $2 do Script. echo $# Script. echo $@ Script. echo $$ Script. echo $! background. #Nome do Script. #Valor do primeiro argumento #Valor do segundo argumento #Nmero de argumentos do #Todos os valores dado ao #Nmero do processo do #Nmero do ltimo comando em

Aqui podemos ver um pequeno exemplo da utilizao de Array em Shell Script. O ndice @ selecciona todos os ndices, ou seja, retorna todos os valores guardados no Array. O prximo exemplo mostra algumas das mais usadas variveis de ambiente da Shell.

Vamos agora ver uma alternativa ao comando echo para imprimir dados. O comando printf permite, semelhana do comando echo, imprimir dados com a vantagem de que consegue faz-lo de forma formatada, sendo o seu funcionamento praticamente igual ao printf da linguagem C/C++. Vamos ver ento alguns exemplo do nosso printf. #!/bin/bash printf Ol %s bem vindo a %s\n$USER $HOME printf "Basta colocar o texto entre \"\" \n" printf "E em seguida as variveis separadas por um espaco!\n" Como podemos ver bastante simples usar o comando printf. de referir que a ordem pela qual as variveis so

<9>

a programar

colocadas ser a mesma na altura da impresso ou seja colocar $USER $HOME tem um resultado diferente de colocar $HOME $USER. Algo muito importante para o nosso cdigo so os comentrios em Shell Script, que podem ser feitos com o smbolo #.Este caracter indica que o restante da linha, a partir do caracter, deve ser ignorada pelo bash. Mas como j devem ter reparado os nossos scripts comeam com #!/bin/bash, que um caso especial - esse comentrio usado para indicar qual a shell que deve ser usada para interpretar o script, no nosso caso a bash. Esta linha deve ser a primeira do nosso script, caso contrrio ser ignorada pelo interpretador. Vamos agora ver alguns exemplos. #!/bin/bash #Todo o texto aqui escrito no ser impresso. printf "Podemos ainda comentar ..."# apenas parte da linha Infelizmente os comentrios de Shell Script no permitem o comentrio em bloco por isso apenas podemos comentar um linha na totalidade ou parte dela, indicando o incio do comentrio mas no o seu fim na linha. J sabemos como imprimir dados - vamos agora ver como pedir dados ao utilizador. Para isso, temos o comando read, que permite ler o input do utilizador: #!/bin/bash printf "Utilizador : "; read usr; printf "Password : "; read pass; printf "%s a sua password %s\n"$usr $pass; Passemos agora a estruturas condicionais. Shell Script dispe de estruturas como IF e ELSE, existentes em praticamente todas as linguagens de programao, bem como o CASE (tambm conhecido por SWITCH noutras linguagens). Vamos ver um exemplo da sua utilizao: #!/bin/bash read USER; case "$USER" in magician) printf "Magician seja bem vindo.\n";; root) printf "Bem vindo ao painel de Admin.\n";;

*) printf reconhecido\n";; esac;

"Utilizador

no

Como podemos ver a utilizao do CASE bastante simples. Damos uma varivel e vrias opes, dependendo do valor da varivel o resultado ser diferente. A opo * serve como um default para quando todas as outras falham. Na estrutura IF ELSE iremos usar um outro comando, o TEST. Este comando permite fazer testes booleanos em ficheiros, strings e nmeros. Mas vamos ver este comando aps o IF: #!/bin/bash read usr; if test $usr = "magician"; then printf "Bem Magician\n"; else p r i n t f " % s reconhecido!\n"$usr; fi

vindo

n o

O comando TEST realiza testes entre dois valores e tem vrias opes. Vamos ver todas as opes que temos, comecemos ento pelas opes em ficheiros. Opes em Ficheiros: -b FILE True se o ficheiro existe e um ficheiro bloco especial. -c FILE True se o ficheiro existe e um ficheiro de caracteres especiais. -d FILE True se o ficheiro existe e um directrio. -e FILE True se o ficheiro existe. -f FILE True se o ficheiro existe e um ficheiro regular. -g FILE True se o ficheiro existe e contm o seu SGID. -h FILE True se o ficheiro existe e um link simblico. -k FILE True se o ficheiro existe e contm sticky bit set. -p FILE True se o ficheiro existe e um named pipe. -r FILE True se o ficheiro existe e permite a sua leitura. -s FILE True se o ficheiro existe e o seu tamanho maior que zero. -u FILE True se o ficheiro existe e contm o seu SUID. -w FILE True se o ficheiro existe e permite ser escrito. -x FILE True se o ficheiro existe e executvel. -O FILE True se o ficheiro existe e o seu dono o utilizador corrente. Opes em Strings: -z string True se a String tem tamanho igual a zero. -n string True se a String tem tamanho diferente de zero. string1 = string2 True se as duas Strings so iguais. string1 != string2 True se as duas Strings so diferentes.

<10>

a programar

Opes em Nmeros: int1 -eq int2 True se int1 igual a int2. int1 -ne int2 True se int1 no igual a int2. int1 -lt int2 True se int1 menor que int2. int1 -le int2 True se int1 menor ou igual a int2. int1 -gt int2 True se int1 maior que int2. int1 -ge int2 True se int1 maior ou igual a int2. Opes em Expresses: ! expr True se expr false. expr1 -a expr2 True se expr1 e expr2 so ambas true. expr1 -o expr2 True se expr1 ou expr2 true. Passemos agora aos ciclos existentes em Shell Script, nomeadamente FOR e WHILE. Comecemos pelo WHILE: #!/bin/bash x=0; while [$x -lt 10] do echo $x; x=`expr $x + 1` done A linha x=`expr $x + 1` pode parecer estranha, mas o que esta linha faz incrementar um valor varivel x e enviar a expresso $x+1 para o comando expr, que processa a expresso matemtica e retorna um valor numrico. O comando colocado entre `` para dizer ao interpretador que deve executar a expresso e aguardar o valor retornado. Temos agora o FOR. Este ciclo bastante simples e menos dinmico que o WHILE - basicamente o FOR percorre uma sequncia de valores e coloca cada um dos valores numa varivel temporria que muda de valor a cada iterao. #!/bin/bash for i in 1 9 2 4 3 5 7 do echo $i done

Vamos agora ver como criar funes em Shell Script. A declarao de funes bastante simples, basta colocar o nome da funo seguido de () e um bloco limitado por {}: #!/bin/bash mg="Magician"; imprime(){ printf "Ol %s\n"$mg; } imprime; As funes, ao contrrio da maioria das linguagens de programao, no so chamadas sob a forma imprime(), mas apenas com o nome da funo sem o par de parntesis. Para terminar o nosso artigo irei mostrar como redireccionar o Input/Ouput dos nossos scripts. possvel passar prints para ficheiros e o contedo de ficheiros para outros ficheiros ou at mesmo para variveis do nosso script. #!/bin/bash Text1="Este texto ser gravado dentro do ficheiro texto1.txt"; echo $Text1 > texto1.txt; Text2="Este texto ser concatenado ao texto j existente no ficheiro texto1.txt"; echo $Text2 >> texto1.txt Como podemos ver, possvel redireccionar o output de variveis do nosso script para ficheiro usando um smbolo >, que apaga todo o contedo do ficheiro e insere o valor enviado. Tambm se podem usar os smbolos , que adicionam o valor enviado ao j existente no ficheiro. Em ambos os casos se o ficheiro no existir ele criado. Espero que tenham gostado do artigo. A partir deste momento tm o conhecimento bsico sobre Shell Script que permite a criao de scripts para as mais diversas tarefas.

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.

Fbio Correia
<11>

a programar

Grafos 2 Parte

Parte da seguinte importante e simples propriedade: - Se de todos os arcos que saem do n A, o arco A-B o mais curto, ento a ligao mais curta entre estes dois ns atravs desse arco. Bastante bvio, uma vez que qualquer outro caminho usando um outro arco seria obrigatoriamente maior, partindo do princpio que todos os arcos tm um peso positivo, claro.

Pseudocdigo:
# distancia(j) distncia do n de origem ao n j # pai(j) n anterior ao j, do caminho mais curto (para podermos reconstruir o caminho) 1 Para todos os ns i 2 distancia(i) = infinito # no alcancvel 3 visitado(i) = Falso 4 pai(i) = nil # ainda nenhum caminho at ao n 5 distancia(origem) = 0 # origem -> a origem do percurso 6 enquanto(nos_visitados < tamanho_do_grafo) # encontrar o vrtice no visitado com a distncia mnima origem; chamemos-lhe i 7 assert (distancia(i) != infinito, Grafo no conexo) 8 visitado(i) = Verdadeiro # marcamos o vrtice i como visitado # actualizamos as distncia para todos os vizinhos de i 9 Para todos os vizinhos j do vrtice i 10 se distancia(i) + peso(i,j) < distancia(j) ento 11 distancia(j) = distancia(i) + peso(i,j) 12 pai(j) = i

Depois de na primeira parte (ver Edio 10) termos feito uma introduo ao mundo dos grafos e de termos lanado as primeiras bases para uma melhor compreenso destas estruturas, chegou a altura de perceber, realmente, que problemas podem ser resolvidos. Pode ficar j claro que o nmero de algoritmos que resolvem problemas baseados em grafos enorme, demasiado extenso para ficar completo um artigo, portanto nada melhor do que comear pelos mais simples (e importantes). Preferi manter o nome dos algoritmos e dos problemas em ingls para ser mais fcil encontr-los numa pesquisa.

Shortest Path (o caminho mais curto)


Este certamente um dos problemas mais simples de enunciar. Por exemplo: Dado um conjunto de cidades, ligadas por estradas, e o respectivo comprimento de cada uma, calcular a distncia mnima a ser percorrida entre duas dadas cidades. Podemos modelar isto com recurso a um grafo pesado, demais evidente. Cada cidade representa um n e cada estrada que liga dois ns representa um arco. Primeiro que tudo, importante reparar: o facto de existir uma estrada directa entre a cidade A e a cidade B, no significa que o caminho mais curto entre as duas cidades seja essa estrada. Pode existir uma cidade C, intermdia, cujo caminho mais curto passe por ela. Vamos ento ver os principais algoritmos:

Anlise de complexidade
Compreender esta seco implica ter conhecimentos de anlise de complexidade que no vou explicar neste artigo. Como podem ter constatado, o pseudo-cdigo est incompleto por no explicar como encontrar o vrtice no visitado de distncia mnima. Foi propositado por existirem duas possibilidades: - uma pesquisa linear, percorrendo todos os vrtices (a mais normal), originando numa complexidade O(V) - utilizar uma heap para encontrar o mnimo, tendo uma complexidade O(V log E), significativamente mais rpido se o grafo for esparso (tiver uma relao arcos/vrtices baixa)

- Algoritmo de Dijkstra
Descrio
O algoritmo de Dijkstra muito provavelmente o algoritmo mais conhecido no tratamento de grafos. Este algoritmo no encontra s o caminho mais curto entre duas cidades, mas sim o caminho mais curto entre uma cidade (chamada origem) e todas as outras.

<12>

a programar

Extenses
- Grafos direccionados no so um problema para este algoritmo. - Como possvel concluir partindo da descrio, grafos com arcos com pesos negativos produzem respostas incorrectas, de modo que este algoritmo no pode ser usado nessa situao, devendo-se recorrer ao algoritmo de Bellman-Ford. - Apesar de mais rpido (principalmente se utilizarmos uma heap), encontrar o caminho mais curto entre todos os vrtices mais simples recorrendo ao algoritmo de FloydWarshall.

- Algoritmo de Floyd-Warshall
Descrio
E se em vez do caminho mais curto entre duas cidades, pretendemos construir uma matriz de adjacncia m onde m[i][j] representa o caminho mais curto da cidade i cidade j? Nesse caso, esta a soluo mais simples. A ideia a seguinte: pegando num outro vrtice, K, caso a distncia m[i][j] seja maior do que a distncia m[i][k]+m[k][j], podemos afirmar que encontrmos um novo caminho melhor que o anterior, e portanto podemos actualizar m[i][j]. Provar que esta formulao produz a resposta ptima j mais complicado, e no vai ser abordado.

Problemas Modelo
Movimentos a cavalo (Knight Moves)

Pseudo-cdigo

Problema

Dadas duas posies num tabuleiro de xadrez, determinar o nmero mnimo de movimentos que um cavalo deve fazer para chegar de uma casa outra.

# dist(i,j) a melhor distncia at agora do vrtice i ao vrtice j # Comecemos com todas as ligaes passando por um nico caminho 1 Para i = 1 at n fazer 2 Para j = 1 at n fazer 3 dist(i,j) = peso(i,j) 4 Para k = 1 at n fazer # k o vrtice intermdio 5 Para i = 1 at n fazer 6 Para j = 1 at n fazer 7 se (dist(i,k) + dist(k,j) < dist(i,j)) ento # caminho mais curto 8 dist(i,j) = dist(i,k) + dist(k,j)

Anlise

O tabuleiro pode ser modelado como um grafo, sabendo que existe ligao entre duas casas se um cavalo se puder deslocar entre elas (e no se forem adjacentes, como acontece por exemplo num floodfill bfs). Repare-se que dada uma posio sabemos imediatamente para quais se pode deslocar o cavalo, de modo que no precisamos de o representar em memria do modo clssico, mas usar uma representao implcita. Percursos do caminho de ferro (Railroad Routing - USACO Training Camp 1997, Contest 1 - simplificado)

Problema

nos dado um mapa (matriz) onde m[i][j] representa uma dada elevao nesse quilmetro quadrado. Pretendemos construir um caminho de ferro que conecte 2 pontos. O custo normal por quilmetro de 100. Carris que necessitem de ganhar ou perder elevao entre quadrculas, so cobrados 100 + 3x variao_na_elevao. Uma mudana de direco de 90 dentro de uma quadrcula implica um custo de 40. Qual o custo mnimo para construir o percurso?

Anlise de complexidade
Este algoritmo claramente O(V), muito provavelmente o algoritmo com anlise mais simples que existe.

Extenses
- Para este algoritmo pesos negativos no so to devastadores como para o algoritmo de Dijkstra. Desde que no existam ciclos negativos, o algoritmo funciona como pretendemos (caso exista um ciclo negativo ele pode ser percorrido tantas vezes quantas quisermos para ter sempre caminhos mais curtos).

Anlise

Este um problema standard de shortest path. Contudo, em vez de criarmos um n por quadrcula, devemos criar 4, representando as 4 possveis direces de entrar numa dada quadrcula. Agora podemos criar as ligaes correspondentes, e resolv-lo.

<13>

a programar

Problemas Modelo
Dimetro de um grafo

Pseudo-cdigo
# dist(j) a distncia do n j rvore # pai(j) representa o n at agora conectado MST mais prximo do n J 1 Para todos os ns i 2 dist(i) = infinito # sem ligaes 3 intree(i) = Falso # sem ns na rvore 4 pai(i) = nil 5 tamanho_da_rvore = 1 # adicionar um n rvore 6 custo_da_rvore = 0 7 intree(1) = Verdadeiro 8 Para todos os vizinhos j do n i actualizar as distncias 9 dist(j) = peso(1,j) 10 pai(j) = 1

Problema

Dado um grafo conexo, no direccionado e pesado, encontrar os dois vrtices que esto mais afastados.

Anlise

Calcula-se o caminho mais curto entre todos os vrtices e acha-se o mximo da matriz.

Minimal Spanning Tree (rvore de extenso mnima)


Numa Minimal Spanning Tree ns procuramos o conjunto mnimo de arcos necessrios para conectar todos os ns. Suponham que trabalham numa companhia que gere uma rede de auto-estradas. Recentemente, saiu uma lei que obriga a que os camionistas percorram os seus trajectos em estradas iluminadas com postes de 10m. Como os vossos postes s tm 7m, esto numa boa alhada. Pretendem ento substituir os postes em algumas das vossas auto-estradas, aquelas necessrias para que todas as cidades possam ser abastecidas convenientemente. Qual a distncia mnima de autoestrada em que tero que substituir os postes? Existem dois algoritmos muito usados na procura da rvore de extenso mnima, neste artigo decidi no abordar o algoritmo de Kruskal.

11 enquanto (tamanho_da_rvore < tamanho_do_grafo) # encontrar o n com a menor distncia rvore; chamar-lhe n i # obviamente um n que no esteja intree 12 assert (distance(i) != infinity, Grafo no conexo) # adicionar arco pai(i),i MST 13 tamanho_da_rvore = tamanho_da_rvore + 1 14 custo_da_rvore = custo_da_rvore + dist(i) 15 intree(i) = Verdadeiro # marcar o n i como estando na rvore # actualizar todas as distncias depois do n i ter sido adicionado 16 para todos os vizinhos j de i 17 se (dist(j) > peso(i,j)) 18 dist(j) = peso(i,j) 19 pai(j) = i

- Algoritmo de Prim
Descrio
As semelhanas entre o algoritmo de Prim e o algoritmo de Dijkstra so tantas que eu quando os aprendi facilmente os trocava. Para tal no acontecer, efectuava sempre o seguinte raciocnio, que no fundo a sua explicao: Suponhamos que tenho todos os ns conectados, excepto um. Saber qual o arco a usar de modo a conectar este n aos restantes fcil - posso escolher o de tamanho menor. Vamos ento partir de um ponto. Este ponto vai ficar unido ao resto da rvore atravs da ligao ao arco mais prximo. Temos agora dois pontos. Qual o prximo ponto a unir? Fcil. O ponto mais prximo dos dois que ainda no foi unido. Esta metodologia obviamente leva-nos soluo ptima. (e por ser to simples preferi explic-la a abordar o algoritmo de Kruskal).

Anlise de complexidade
Tal como para o algoritmo de Dijkstra, tempo de execuo O(V). Podemos obter O(V log E) se recorrermos a uma heap.

Extenses
- Funciona bem com grafos no pesados. - No h problema com mltiplos arcos entre dois ns (ignoramos todos menos o menor, obviamente)

<14>

a programar

- Se sofrer outras restries (como 2 ns no poderem estar mais afastados do que X) ento fica muito difcil de alterar. - No funciona com grafos direccionados (em que pretendemos que sejam fortemente conexos - seja possvel aceder de um vrtice a todos os outros).

Problemas modelo
Highway Building (construindo uma autoestrada)

Problema

Pretende-se construir uma rede de autoestradas que ligue as K maiores cidades de um pas. Sendo um pas pobre, eles pretendem reduzir ao mximo o custo da obra. Sabendo que o custo de uma autoestrada proporcional ao seu comprimento, e dadas as coordenadas das cidades, quais as cidades que devemos ligar para formar a requerida via rpida? (Nota: no se podem usar outros pontos como ns)

Anlise

Um problema simples de MST, usamos as cidades como ns e consideramos todas as ligaes possveis como arcos.

Referncias

USACO training pages - http://train.usaco.org

O especial interesse pela algoritmia nasceu enquanto frequentava no secundrio o curso Cientfico-Tecnolgico de Informtica, que terminou recentemente com mdia de 19,5 valores. Tambm recentemente representou Portugal nas Olimpadas Internacionais de Informtica, na Crocia, em 2007, aps vencer as Olimpadas Nacionais, e em Mrida, no Mxico, em 2006.

Miguel Arajo

<15>

a programar

Uso da class

Abstraco de SGDBs em PHP - AdoDB

Para utilizarmos esta classe, a primeira coisa que temos que fazer o download da mesma, seguidamente descomprimi-la e guard-la num directrio acessvel pelo servidor HTTP. Aps a execuo dos passos acima referidos devemos proceder incluso da class na nossa aplicao, da seguinte forma:

Nos dias que correm, so muitos os que j se aventuraram no desenvolvimento de aplicaes web-based. Quando essas aplicaes comeam a ganhar notoriedade, h uma grande possibilidade de serem usadas noutro ambiente diferente daquele em que sempre desenvolvemos. Um dos problemas comuns o facto de termos de usar um software de gesto de base de dados (SGDB) diferente e, como escrevemos a aplicao para usar um determinado SGDB, somos obrigados a modific-la para podermos utilizar outro. Para evitar estes incmodos, existem bibliotecas que servem de camada de abstrao de SGDBs.

include "pasta/adodb.inc.php" ; include "pasta/adodbexceptions.inc.php"; Depois, devemos criar a nova instncia do objecto ADO (ActiveX Data Object) e fazer a conexo Base de Dados pretendida, por exemplo (neste exemplo vou usar o conector de MySQL, mas poderia usar outro qualquer): // Criao da nova instncia do objecto $BD = NewADOConnection('mysql'); // Dados do servidor de MySQL $servidor="localhost"; $utilizador="root"; $password="123456"; $nomebd="adodb_pap"; // Conexo base de dados $BD->Connect ($servidor, $utilizador, $password, $nomebd) or die("Erro ao ligar Base de dados!" ); Aps aberta a ligao j podemos inserir, alterar e remover dados. Para esse efeito vamos criar um recordset, que um array com os dados consultados. Para cri-lo utilizamos o seguinte bloco de cdigo:

O que uma camada de abstraco?


Uma camada de abstraco simplesmente um elo de ligao entre uma aplicao e dados externos (sejam bases de dados, documentos de texto, etc). Ou seja, a aplicao no liga directamente aos dados externos, mas faz um pedido camada de abstraco e esta, por sua vez, faz o pedido aos dados, independentemente do seu tipo. A classe ADOdb tem precisamente essa funo, precisamente igual escrevermos uma aplicao que use um determinado SGBD ou outro, o resultado ser sempre igual e, as alteraes mnimas.

$rs = $BD->Execute("select * from alunos where codaluno=?" ,1); // ou $rs = $BD->Execute("select * from alunos where nome='Jos' " )

Na primeira consulta, vamos ter todos os dados do aluno cujo cdigo 1, j na segunda vamos obter todos os dados de todos os alunos que se chamam Jos. Para imprimir todos os registos da consulta realizada temos que percorrla do incio ao fim, com uma das seguintes formas:

<16>

a programar

//1 Forma while (!$rs->EOF) { print_r ($rs->fields); $rs->MoveNext(); } //2 Forma while ($array = $rs->FetchRow()) { print_r ($array); }

consulta!"; //2 Forma if($rs->EOF) echo "No existem registos nesta consulta!"; else echo "Existem ".$rs>RecordCount()." registos que correspondem consulta!" ; No fim de realizarmos todas as tarefas na base de dados, um bom hbito fechar a ligao, para no sobrecarregarmos o servidor: $BD->Close();

A diferena entre os mtodos que o primeiro custuma ser usado nas linguagens criadas pela Microsoft (ASP) e o segundo mtodo pelo php . Esta classe permite-nos tambm o tratamento de excepes quando, por exemplo, fazemos uma consulta sobre uma tabela que no existe:

Segurana
Quando estamos a programar para web, cada vez mais temos de ter em ateno a segurana. Para tal, convm evitar falhas de SQL Injection (ver edio anterior) e, mais uma vez, esta classe s facilita essa tarefa, tendo o mtodo Quote($string) para fazer o escape de caracteres potencialmente perigosos. Suponhamos que temos uma pgina de consulta por Cdigo de Aluno:

try { $rs=$BD->Execute("select * from alunox where codaluno=5" ); } catch (exception $e) { print_r ("<b>Erro</b>:".$e->msg); } O bloco de cdigo supracitado tenta executar a consulta mas, se no o conseguir, vai dar o seguinte output: Erro: Mensagem de Erro . Para verificar se o recordset contm algum registo existem vrias formas, podemos utilizar: $rs= $BD->Execute("Select * from alunos where nota>20" ); //1 Forma if($rs->RecordCount()>0) echo "Existem ".$rs>RecordCount()." registos que correspondem consulta!" ; else echo "No existem registos nesta

if($_POST['injeccao']) { echo "Dados recebidos por POST:" . $_POST['injeccao'] is_numeric ($_POST['injeccao']) ? $codaluno = $_POST['injeccao'] : $codaluno = $BD>Quote($_POST['injeccao']) echo "Dados tratados para a consulta:". $codaluno; $rs = $BD->Execute("Select * from alunos where codaluno=?" , $codaluno); if($rs->EOF) echo "Erro: no foram encontrados registos que correspondessem consulta realizada" ; while(!$rs->EOF) {

<17>

a programar

print_r($rs->fields("Nome")); $rs->MoveNext(); } echo "Caso permitissemos SQL injection, obteriamos este resultado:"; $rs = $BD->Execute("Select * from alunos where codaluno=?", $codaluno); while(!$rs->EOF) { print_r($rs->fields("Nome")); $rs->MoveNext(); } }

Bibliografia

http://phplens.com/adodb/ http://adodb.sourceforge.org

Concluso
O objectivo deste artigo dar a conhecer esta classe ainda pouco explorada. Devido sua facilidade de uso e segurana torna-se indispensvel conhec-la minimamente. No entanto, no foram abordados todos os aspectos neste artigo e, por isso, recomenda-se que o leitor leia a documentao da classe nos links acima referidos.

Joo Alves um jovem que dedica o seu tempo livre ao andebol e s novas tecnologias. Comeou a programar com 12 anos e, hoje em dia, frequenta o Curso Tecnolgico de Informtica na Ancorensis, uma escola no Norte do pas e, futuramente, tenciona ingressar em Engenharia Informtica e de Computao na FEUP.

Joo Alves

<18>

tecnologias

Programao Saudvel

No dia-a-dia de um programador, so demasiadas as horas passadas frente de um ecr, a cansar os pulsos e os dedos, enquanto se est sentado, muitas vezes desconfortavelmente, numa cadeira pouco ergonmica. Da, surgem primeiro as dores nas costas, que associamos posio torta que assumimos durante as longas horas frente do monitor. Depois, o ardor nos olhos de quem esteve 3, 4 ou 5 horas sem tirar os olhos das linhas de cdigo s porque tinha uma coisa para acabar. Por fim, desenvolvem-se vrias patologias associadas intimamente profisso e que vo destruir a carreira de qualquer programador caso no sejam prevenidas. Como se pode observar, programar uma actividade de risco. No de risco directo como um bombeiro ou um militar, mas no menos grave e com consequncias menos dolorosas. Porm, h esperana! Apesar de, mais tarde ou mais cedo, o programador vir a sofrer de uma ou outra leso tpica, h rotinas que se podem adoptar para diminuir a probabilidade das mesmas acontecerem. Ao contrrio do que pode parecer, pausas frequentes tornam mais produtiva a actividade do programador. Contudo, no saudvel profissionalmente ser-se hipocondraco e abusar destas pausas em prol da sade! Mas adiante, passemos a assuntos concretos. RSI, ou Leso por Esforo Repetitivo, a denominao geral dada a todas as doenas que advm de uma actividade regular e repetitiva, nomeadamente leses do tnel carpal, do tnel ulnar e tendinites, e que so caracterizadas clinicamente pelo afectar de msculos, tendes e nervos das mos, braos e costas por uma tenso excessivamente longa devido quer a uma m postura, quer a movimentos repetitivos. Exemplos de actividades que levam ao seu aparecimento so: uso do computador (profissionalmente claro), tocar guitarra e escrever (intensamente, como bvio). Porm, nem todas estas doenas so exclusivamente causadas por actividades como programar. A gentica pessoal tem um papel importante na determinao da probabilidade de eu, ou o leitor vir a desenvolver uma destas maleitas. Contudo, o passo mais importante a tomar quanto a estas doenas a preveno, uma vez que, quando desenvolvidas, torna-se complicado o tratamento, sendo por vezes ineficaz de todo.

O que se pode ento fazer para prevenir o aparecimento da RSI? Primeiro, h que olhar para a secretria e para a cadeira e pensar no que vamos precisar de comprar. Cadeiras de madeira ou cadeiras rijas so catalisadores de dores de costas. Uma cadeira ergonmica, de altura e inclinao regulveis, de preferncia almofadada, um ptimo investimento. A ttulo de exemplo, quando comecei o meu estgio, sentei-me numa cadeira e andei semanas com dores nas costas. Passado uns tempos, troquei fortuitamente de cadeira e em menos de trs dias recuperei das dores. Quanto secretria, h que olhar para ver alguns parmetros que, partida, parecem insignificantes: 1. Altura do monitor: o monitor no deve estar abaixo nem acima do nvel dos olhos. Devemos olhar directamente em frente. O facto de estarmos horas a fio de pescoo baixo ou esticado para cima a mirar o ecr leva a dolorosos torcicolos. Colocar um livro que no usamos regularmente, ou mesmo at a caixa da motherboard ou da grfica a servir de suporte ao monitor, poupa-nos o pescoo a esforos desnecessrios. 2. Luminosade e contraste do monitor: quantas vezes no temos a luminosidade do monitor nos 100 ou nos 90, e o contraste alto, porque assim v-se melhor? Claro que se v, mas tambm somos bombardeados com muito mais intensidade pelo monitor. o mesmo que estar a ler com uma lmpada incandescente normal, ou com um holofote. H que encontrar um equilbrio entre o no estar muito claro e o no ver nada! 3. Rato e teclado: A altura e a distncia a que estes perifricos se devem encontrar so fulcrais para o bem-estar dos nossos pulsos e braos. No ter o teclado demasiado longe, evitando esticar os braos, boa jogada. Quanto a altura, deve estar de modo aos msculos dos braos estarem relaxados, caso contrrio, chegam ao fim do dia

<20>

tecnologias

como quem teve a levantar pesos de 20Kg, e no, no ganham mais msculo por isso. Para o rato, as recomendaes so as mesmas. No estar nem muito longe, nem muito perto, de modo a que possamos movimentar a setinha no ecr sem andar a fazer malabarismos com o pulso. Um tapete com almofada pode tambm ajudar a quem depende do rato como da gua, uma vez que o esforo causado aos tendes do pulso pode ser excessivo. Agora, alguns conselhos mais gerais. Faa pausas. Beba gua. Venha entrada do edifcio regularmente apanhar ar.

pausa de 10. Virtualmente, podemos instalar algum software no computador que nos avisa de quando devemos fazer a pausa (exemplo disso o Workrave). Alguns softwares levam at ao bloqueio do rato e do teclado enquanto no passar o tempo da pausa, por isso, em vez de ref ilar com o rato no dar, mais vale levantar-se e ir arejar. Porm, o que fazer durante as pausas? Olhar para o tecto no parece boa opo. Comece por arranjar um stio onde haja gua disponvel. Caso no haja, leve uma garrafa para o escritrio. Beber gua durante o dia de trabalho, no mnimo um litro e meio, serve de muito para ajudar a limpar o organismo de todos os detritos resultantes do metabolismo. Caso no aprecie gua, um ch serve igualmente. Agora, refrigerantes no ajudam em nada! Outra opo andar. V dar um passeio at entrada do edifcio, apanhe ar, espreguice-se. Agora repita isso pelo menos cinco vezes em cada pausa. No secundrio aprendeu que as veias funcionam por vlvulas e que preciso a contraco muscular para que essas vlvulas funcionem na perfeio. Ora, a contraco muscular deve-se ao movimento (ou vice-versa) e por isso, sem movimento, acumulam-se fluidos nas pernas que levam, por exemplo, a tromboses (porque acha que no avio deve andar de um lado para o outro quando faz uma viagem longa?). Por f im, apanhar ar fresco e arejar a cabea ajuda sempre concentrao. Contudo, como tudo na vida, todas estas recomendaes so genricas e dependem de cada um para serem adoptadas e, como cada um como e h pessoas mais propensas a determinadas doenas que outras, o melhor cuidado que se pode ter fazer um check-up regular no mdico de famlia. Pea-lhe tambm conselhos para melhorar a sua postura no emprego e ver que, seguindo-os, tal como seguindo alguns destes, ter um aumento na produtividade, que, apesar de contraditrio, visto dispender mais tempo fora do computador, tirar melhor proveito do que frente dele passa. Em ltima anlise, se se sentir cptico em relao a todo este texto, s lhe resta uma opo: experimente. Mal no far. Depois tire as suas prprias concluses e partilhe com os seus colegas os resultados. Ver que mais tarde ou mais cedo, ir benef iciar de ter experimentado esta tolice.

Poder perder um pouco da sua performance, mas o ganho em sade vai compensar as vezes em que se senta ao monitor e j lhe di tudo, esvaindo-se a vontade de trabalhar. E como que se vai lembrar de fazer uma pausa quando est entusiasmado a teclar as ltimas 100 linhas de cdigo do programa, ou a fazer os ltimos ajustes imagem no Photoshop para o tal site? Fcil. H a opo fsica e a virtual. A fsica passa por comprar um relgio com alarme ou ento uma ma-contador, como as usadas na cozinha. Regular o tempo para 30-45 min e quando tocar, fazer uma

Estranhamente, Joo Rodrigues no vem das hostes dos informticos tendo tido o primeiro contacto com a programao no 3 ano do curso. Um descontrado finalista da Licenciatura em Bioqumica em Coimbra, com particular interesse pelas reas da Bioinformtica e da Protemica, entrou para a Revista PROGRAMAR e com o objectivo de mostrar que h mais na informtica para alm de bits e bytes.

Joo Rodrigues
<21>

gnu/linux

Faa o seu media center com o GeexBox

GeexBox
O Geexbox suporta placas de captura de TV/rdio e comandos por infravermelhos, que usa o MPlayer para reproduzir lmes e msica. Esta distribuio bastante personalizvel, sendo possvel faz-lo usando um gerador de ISOs bastante simples de usar, tanto em Windows, Linux ou Mac. Usando o GeexBox, podemos ver DVDs e HD-DVDs, filmes em vrios formatos como DivX, XviD, H.264, MPEG ou WMV, com ou sem legendas em .srt, ouvir msica em AAC, FLAC, MP3 ou WMA, assistir TV ou ouvir rdio pela Internet ou usando uma placa de captura de TV/rdio. Com o teclado ou um comando, podemos tambm definir delays entre o vdeo, o som e as legendas, controlar a velocidade de reproduo, entre outras coisas.

Na 7 edio desta revista, em Maro de 2007, trouxemos at si um artigo que possivelmente adiou a compra de um novo computador: Ambientes grficos em sistemas de fraco desempenho. No entanto, esse artigo apenas adiou o momento em que arrumou num canto da casa o seu fiel companheiro de tantos anos. Passado quase 1 ano, queremos lev-lo a procurar esse seu companheiro e lev-lo para a sua sala, usando-o como um media center. De certeza que j ouviu falar de media centers e j os viu em lojas de electrodomsticos. Um media center nada mais nada menos que um computador adaptado para ouvir msica, ver filmes, TV, imagens e algumas coisas mais. Ou seja, um media center na sua essncia igual ao seu computador de secretria ou porttil, sendo possvel usar qualquer computador dos referidos como media center. Por isso, vamos pr as mos obra e tornar o PC do sculo passado num media center de meter inveja! Para tal, vamos recorrer a uma distribuio GNU/Linux, chamada GeexBox.

Gerar um ISO personalizado


Um dos grandes trunfos do GeexBox o seu gerador de ISOs personalizados. Usando-o podemos configurar as caractersticas da rede a que nos vamos ligar no GeexBox, seja por Ethernet ou por WiFi, que pacotes ou drivers queremos incluir, se queremos correr um servidor de FTP para acedermos ao disco da mquina remotamente ou instalar a interface web. O download do gerador est

Ecr inicial do GeexBox

<22>

gnu/linux

Gerador de ISOs
disponvel na seguinte pgina: http://geexbox.org/en/generator.html No gerador, poder configurar o seu sistema de som (se 5.1, 2.0, ...) na aba Audio. Se tiver telecomando dever escolher o modelo apropriado na aba Remote Control. Na aba Network, poder configurar manualmente a sua ligao rede, seja por Ethernet ou WiFi. Uma coisa que me chamou bastante ateno pela primeira vez que usei este configurador, foi o facto de podermos activar um web server na aba Services que nos permite controlar a nossa mquina com o GeexBox a partir de um browser. Embora esta interface web esteja pouco desenvolvida, a ns, programadores, abre-nos as portas para expandirmos o seu potencial Sobre o gerador, pouco mais tenho a dizer para alm de que aconselho seleccionar o codec Windows Media 9 na aba Packages, que o Keyboard map o QWERTY, que o charset das legendas , regra geral, ISO-8859-15 e que em relao s Windows Shares, nada dever ser necessrio mudar. o LiveCD bootar, ter um media center pronto a testar! Na opo Controls, apresentada uma pequena lista com as teclas de controlo do GeexBox. Sabendo isto, tudo o que tem de fazer ir opo Open e abrir um dos seus filmes. Deixo aqui uma imagem de um filme com legendas externas num ficheiro .srt a ser reproduzido no GeexBox.

Adorei o GeexBox, mas chato estar sempre a pr e a tirar o CD...


No se preocupe, aquando do boot do GeexBox, h um ecr onde pode especificar as opes de boot. Nesse ecr, tudo o que tem de fazer escrever install e seguir o instalador. A nica parte menos bvia da instalao o particionamento do disco, onde basta criar uma partio a ocupar todo o disco rgido e format-la como ext2 ou ext3. Para instrues mais detalhadas, veja a documentao oficial aqui: http://www.geexbox.org/wiki/index.php/ Installation Ler mais: http://geexbox.org/ http://geexbox.org/en/generator.html http://geexbox.org/wiki/index.php http://www.portugal-a-proogramar.org/forum/index.php/ topic,4600.0.html

O que fazer depois de gerar o ISO


Depois de gerar o ISO, tudo o que tem de fazer grav-lo para um CD para bootar o GeexBox como LiveCD. Depois de

David Ferreira um jovem apaixonado pelo mundo da informtica. Deu os seus primeiros passos na programao aos 12 anos atravs da linguagem PHP, tendo hoje conhecimentos de XHTML, JavaScript, Python, redes, e outros. um entusiasmado pelo mundo do hardware e software open-source, que o levou a explorar os sistemas GNU/Linux, com a distribuio Kurumin e depois Ubuntu.

David Ferreira
<23>

internet

Hi5 Developer Center


O Hi5 nunca disponibilizou quaisquer meios para 3rd party developers desenvolverem aplicaes que usassem o hi5, obrigando-os a manobras mais feias para o poder fazer. No entanto, isso est a mudar com o uso de microformats e disponibilizao de uma API SOAP completa, alguns feeds e REST end-points.

http://www.hi5networks.com/developer/

Google Code
O Google Code nada mais nada menos que a homepage indicada para qualquer developer. Tem um repositrio de projectos desenvolvidos pelo Google e oferece alojamento a projectos open-source. Para alm disso o developer que pretender alojar o seu projecto no Google Code tem tambm direito a um wiki para o mesmo, assim como uma ferramenta de Bug Reports e um sistema de controle de verses, tudo ferramentas que podem sempre fazer falta a qualquer projecto.

http://code.google.com/

Twitter
O twitter uma rede social, assim como um servidor para microblogging. possvel enviar actualizaes atravs de SMS, email ou IM. Estas mensagens ficaro disponveis na pgina do nosso perfil, assim como na pgina de quem tem o nosso perfil assinado. Depois do envio de um SMS (pago) para confirmao de nmero, possvel receber actualizaes dos per s que temos assinados atravs de SMS a custo zero..

http://www.twitter.com/

CodePlex
O CodePlex um site da Microsoft que oferece alojamento grtis a projectos open-source. Uma atitude de louvar, e mais um site a concorrer com o Google Code e com a SourceForge.net

http://www.codeplex.com/

<24>

bluescreen

A vantagem dos programas de IM

At o compilador se queixa...

Perigos da blogosfera

<25>

Cartoon por xkcd (www.xkcd.com)

projectos

Mini Radio Player


O Mini Radio Player um programa que rene numa base de dados vrias Web streams de televiso e de rdio com uma interface agradvel e com variadas opes de visualizao e personalizao. O programa encontra-se neste momento na verso 2, que introduziu uma nova organizao e nova informao para os canais (RTDB2), um novo visual, possibilidade de usar as Media Keys do teclado, suporte para outros Idiomas e pesquisa de canais simples. As funes principais so as seguintes:

RTDB2
Para alm do nome do canal e do endereo de streaming, esta funo pode englobar o site oficial do canal, o logtipo, o pas de origem, uma descrio do canal e a funo de Canal QPassa! (este permite ver que programao est a decorrer neste momento)

Favoritos

Permite guardar os seus canais favoritos numa seco parte.

Contedo

Permite bloquear qualquer canal ou categoria ou pas por uma palavra-chave ou por uma mensagem de aviso.

RapidChan!

Uma funo prtica que permite escolher o canal quando o programa se encontra minimizado no system tray, sem ter de o maximizar.

Media Player Systray Controls

Permite colocar os controlos play, stop, sem som, mais som, menos som no system tray quando o programa se encontra minimizado. Para alm destas destacam-se ainda: Mini TV, Detached Screen, Auto Updates, pesquisa simples, janela de Informao Extra e opo O que estou a ouvir/ver para o Windows Live Messenger. No futuro sero (re)adicionadas as funes de temas, MultiChannel, AutoTasks e Fullscreen Mode.

http://miniradioplayer.no.sapo.pt/

<26>

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

@portugal-a-programar.org
Precisamos do apoio de todos para tornar este projecto ainda maior... contamos com a tua ajuda!

revistaprogramar

Equipa PROGRAMAR
Um projecto Portugal-a-Programar.org

You might also like