You are on page 1of 27

editorial

ndice
3 4 11 14 notcias tema de capa
- GWT

Novos Horizontes
Esta a nossa primeira edio como coordenadores, depois da sada do Miguel Pais anunciada na ltima revista. Parece-nos estranho, mas o diferente cargo que agora ocupamos no tornou o ciclo de preparao desta edio diferente de qualquer outro em que j estivemos envolvidos. Mas, no final de contas, bastante natural que no sintamos grande diferena - coordenar, articular, preparar cada edio da revista apenas a partir da vossa colaborao voluntria foi o que sempre fizemos, e o que pretendemos continuar a fazer agora, da mesma forma, embora agora com uma diferente responsabilidade. Por outro lado, claro que o novo cargo no exactamente igual queles que desempenhmos durante todo este tempo. Acresce-nos agora a responsabilidade de darmos a cara pelo projecto, de conseguirmos mant-lo sem o suporte do Miguel Pais da maneira a que nos habitumos e nessa frente que apostamos para tornar a mudana na equipa o menos brusca possvel. Desta forma, e no seguimento de algumas sugestes do antigo coordenador, tencionamos mudar vrios aspectos relativos equipa. Em primeiro lugar, e uma vez que nenhum de ns tem muita experincia na gesto de uma equipa e de um projecto destas dimenses, vamos procurar expr todos os assuntos internos da revista a toda a equipa, envolvendo mais os restantes colaboradores na gesto desta. Assim, vamos tambm recolher opinies da equipa antes de tomar quaisquer decises, porque vinte cabeas pensam sempre melhor que duas. Em segundo lugar, tambm numa tentativa de procurar suporte adicional nossa coordenao e de colmatar algumas falhas que nos tm sido apontadas, crimos dois grupos responsveis, respectivamente, pela reviso lingustica dos artigos e pela divulgao da revista. Esperamos que a diferena se faa notar j a partir desta edio, com menos erros lingusticos e um discurso mais apropriado a uma publicao como a nossa, se possvel culminando num maior nmero de downloads. Finalmente, fruto dos resultados do recente inqurito do Portugal-aProgramar, confirmmos que a mudana da imagem, quer da prpria revista, quer da sua presena na web, uma das nossas maiores prioridades. Este um dos aspectos em que nos vamos concentrar ao longo das prximas edies, embora os resultados visveis ainda possam tardar. Destaque ainda para o novo editor, Antnio Silva, colaborador frequente do projecto h j algum tempo. Resta-nos apenas esperar que a nova equipa consiga manter o seu trabalho ao nvel do que tem sido este projecto, cada vez mais uma referncia para os programadores em Portugal e alm fronteiras. Joel Ramos e Pedro Abreu

a programar

20 GNU/Linux 26 internet

- Processamento de texto em AWK - Microsoft Windows Powershell - Linux Graphics Stack

equipa PROGRAMAR coordenadores


Joel Ramos Pedro Abreu

editor capa

Antnio Silva

Daniel Correia

redaco

Cristian Gonalves Fbio Ferreira Joo Matos Paulo Cabral

equipa de reviso
Bruno Oliveira Fernando Martins Miguel Rentes Nuno Joo Srgio Lopes

equipa de divulgao
David Ferreira

contacto

revistaprogramar @portugal-a-programar.org

website issn

www.revista-programar.info

1647-0710

<2>

notcias

Lanamento do Debian 5.0

Lanamento do Internet Explorer 8


http://www.microsoft.com/windows/Internet-explorer/

http://www.debian.org/News/2009/20090214

Mozilla lana o Bespin

http://labs.mozilla.com/2009/02/introducing-bespin/

Lanamento do GNOME 2.6


h t t p : / / l i b r a r y . g n o m e . o r g / m i s c / r e l e a s enotes/2.26/

Lanamento do LLVM 2.5


http://llvm.org/releases/2.5/docs/ReleaseNotes.html

Lanamento do Google Code Labs

Lanamento do Parrot 1.0


http://www.parrot.org/news/2009/Parrot-1.0.0

http://google-codeupdates.blogspot.com/2009/03/ introducing-labs-for-google-code.html

Prximos eventos
2 Edio do Concurso de Projectos de Programao P@P
No mbito do Concurso de Projectos de Programao P@P, cujo objectivo a dinamizao e divulgao das diversas linguagens de programao, assim como reconhecer os programadores pelos seus trabalhos, est a decorrer a sua segunda edio. Esta segunda edio decorre na categoria Software Proprietrio, na qual podem participar todos os projectos que no possuam uma licena de software livre. A entrega do cdigo fonte no obrigatria e no ser avaliada. O calendrio desta edio o seguinte: Incio do Concurso: 01-03-2009 Prazo de Entrega: 17-04-2009 Anncio de Finalistas e Votao do Pblico: 24-04-2009 Fim de Votao e Anncio do Vencedor: 01-05-2009 Para mais informaes h t t p : / / w w w . p o r t u g a l - a programar.org/forum/index.php/topic,32312.0.html

Olimpadas Nacionais de Informtica 2009


http://www.dcc.fc.up.pt/oni/2009/

Take Off 2009 25 de Abril, no Departamento de Engenharia


Informtica da Universidade de Coimbra http://takeoff.ideias3.com/2009/

CPAS - Concurso de Programao para Alunos do Secundrio


29 de Abril, no Colgio Internato dos Carvalhos Inscries at ao dia 24 de Abril http://e-escola.cic.pt/cpas/

<3>

tema de capa

Google Web Toolkit

Introduo
Certamente muitos de vocs j tiveram necessidade de desenvolver algum tipo de aplicao para a Web e, como tal, devem ter investigado sobre plataformas que j dessem algum suporte ao desenvolvimento deste tipo de aplicaes. Com uma rpida pesquisa no Google encontrmos um grande nmero de plataformas Web sobre as mais diversas tecnologias e, a quantidade e diversidade tal, que se torna difcil saber qual plataforma escolher. Mas, este artigo no ir focar as plataformas Web existentes, mas sim sobre uma plataforma em particular, o Google Web Toolkit. O Google Web Toolkit foi desenvolvida pela Google (tal como o nome sugere), inicialmente com o objectivo de dar suporte aos seus engenheiros no desenvolvimento de aplicaes Web. Posteriormente a Google teve a amabilidade e a brilhante ideia de disponibilizar a plataforma para a comunidade em geral

Simplesmente porque o JavaScript precisa de ser refinado de forma a ser bem interpretado por cada um deles claro que qualquer bom programador quer que sua aplicao seja executada de uma forma correcta e completa, independentemente do browser, e como tal comea a procurar os potenciais problemas, investigar sobre incompatibilidades e entra no terrvel ciclo de procurar, modificar, testar, procurar, modificar, testar. realmente muito incmodo andar a programar mdulos para que a mesma aplicao corra correctamente em todos, ou pelo menos, na maioria dos browsers. Isso implica que o programador tenha conhecimentos dos problemas de incompatibilidades e tempo para que possa corrigi-los (e tempo no mundo do desenvolvimento de software preciosssimo). Foi ento que os engenheiros da Google, pessoas experientes no desenvolvimento de aplicaes com tecnologia AJAX como o GMail, Google Calendar, Google Maps, cansados de incompatibilidades, correces e testes, sentiam necessidade de usufruir de uma plataforma que desse suporte correco de tais incompatibilidades, e que torna-se o processo de desenvolvimento das aplicaes mais produtivo, mais flexvel e consequentemente mais rpido. Como resultado surgiu o Google Web Toolkit.

A vida Pr-GWT... Javascript vs Browser


Javascript, uma linguagem muito utilizada na Web, pela tecnologia AJAX (Asynchronous JavaScript and XML) criada para a construo de pginas dinmicas sendo directamente interpretada pelo browser. O nome Javascript chega a ser enganador pois, numa primeira abordagem, pensamos logo ser uma derivao do Java o que no de todo verdade, pois esta linguagem possui este nome simplesmente por questes de marketing, j que na data em que o nome lhe foi atribudo o Java era linguagem sensao. Um dos problemas do JavaScript o facto de esta possuir uma relao estreita com os diferentes browsers, na medida em que cada um tem a sua prpria interpretao do cdigo, ou seja, no existe um padro que permita a correcta interpretao da linguagem, em todos os browsers. Trocando por midos significa que, ao programar em JavaScript, corre-se risco de as funes criadas no terem comportamento semelhante em todos os browsers. Imagine-se o programador, confortvel na sua secretria, a desenvolver uma aplicao Web, fazendo umas coisas engraadas com JavaScript e, na altura de testar, todo entusiasmado, repara que a aplicao no funciona correctamente em todos os browsers. E porqu???

Google Web Toolkit A caixinha mgica


Esta plataforma revelou-se bastante poderosa na medida em que quem a utiliza pode desenvolver as suas aplicaes Web puramente em Java verdade, Java. O GWT, como j foi dito, uma plataforma Web, e como tal consiste num conjunto de APIs e componentes visuais que facilitam o processo de desenvolvimento das aplicaes, sendo que este feito utilizando a linguagem Java, uma linguagem madura, robusta, orientada a objectos, utilizada por muitos programadores e cuja documentao na Web vasta. Para alm disso, o GWT permite a escolha de um IDE Java onde ser desenvolvida a aplicao. Assim sendo, para utilizar a plataforma basta apenas fazer o download da mesma, escolher um IDE Java e comear a trabalhar, to simples quanto isto. Mais adiante, no tpico GWT Primeiros Passos, este processo inicial ser explicado com mais pormenor. Mas o que torna o GWT mesmo interessante o facto de que, depois de desenvolvida a aplicao, o que o

<4>

tema de capa
este faz compilar todo o cdigo Java para cdigo Javascript, para que possa ento ser correctamente interpretado pelo browser, corrigindo automaticamente todas as incompatibilidades.

JAVA[script]?
Java para Javascript dizem vocs Vamos, como se costuma dizer, take a look inside the Box. O que acontece que o GWT possui um compilador Java-to-JavaScript responsvel por traduzir todo o vosso cdigo Java para o respectivo cdigo JavaScript tendo em conta factores importantes como optimizao de espao, ou seja, o cdigo JavaScript gerado, percorrido e analisado de forma a determinar se todo o cdigo utilizado, pelo que se houver alguma seco que nunca utilizada, esta simplesmente descartada. Por outro lado, so apenas includas as bibliotecas que so realmente utilizadas. Espao e optimizao foram factores considerados fundamentais pela equipa que desenvolveu o GWT.

Ao abrir a respectiva pasta podemos reparar em dois aplicativos: o applicationCreator e o projectCreator, que j permitem, atravs da linha de comandos, criar a estrutura da aplicao e do projecto respectivamente, para que este possa ser ento importado no Eclipse.

Java-to-JavaScript Mas

No meio de todo este processo engraado existe um Mas, ao qual precisamos de ter muita ateno. que, como muitos sabem a linguagem Java mais madura e mais evoluda que a linguagem JavaScript e, como tal, existem classes e bibliotecas da primeira que no so suportadas por esta ltima. Falando concretamente no GWT 1.5 (ltima verso disponibilizada para a comunidade) que j compatvel com Java 1.5, e onde por exemplo, genricos j so suportados. Mas para uma viso geral e completa, o melhor mesmo consultar a documentao disponibilizada pela Google (http://code.google.com/docreader/#p=googleweb-toolkit-doc-1-5&s=google-web-toolkit-doc-15&t=RefJreEmulation).

Passo 2: Variveis de Ambiente - Adicionar o GWT ao PATH

Uma vez que os aplicativos anteriores so invocados por linha de comandos e para evitar colocar todo o endereo sempre que estes so invocados, o melhor a fazer adicionar a aplicao GWT ao PATH do sistema, ou seja, s Variveis de Ambiente. Para isso v at ao menu Iniciar, clique com o boto direito do rato sobre O meu computador e escolha Propriedades.

GWT Primeiros Passos

Agora que j tm noo do que e para que serve a plataforma GWT vamos meter mos na massa De seguida, sero explicados os passos de demonstrao de como comear a utilizar o GWT. Ir ser criada a estrutura da aplicao e do projecto para ser importado no Eclipse. Note que neste caso utilizado o Eclipse mas, como j foi referido anteriormente, as aplicaes GWT podem ser desenvolvidas utilizando qualquer IDE Java da sua preferncia.

Passo 1 Descarregando o Google Web Toolkit para o nosso computador

Antes de mais necessrio descarregar o GWT. Para tal, vamos http://code.google.com/intl/ptPT/webtoolkit/download.html e fazemos o download da ltima verso da plataforma (GWT 1.5). Depois de descarregado o GWT, extraia a pasta, copie-a para a localizao C:\ e renomeie-a com o nome gwt.

De seguida ir surgir uma nova janela, como mostra a figura seguinte, que d acesso as Variveis de Ambiente. Selecione o separador avanadas e posteriormente: Variveis de Ambiente.

<5>

tema de capa

Finalmente surge a janela das Variveis de Ambiente. Clique sobre a varivel PATH e de seguida clique em Editar.

Passo 3: Gerar a estrutura do Projecto

Uma vez que o GWT j foi adicionado ao PATH do sistema agora mais fcil invocar os aplicativos applicationCreator e projectCreator na linha de comandos. As linhas executadas para os aplicativos tm a seguinte sintaxe, para o applicationCreator: applicationCreator -eclipse NOMEDOPROJECTO -out LOCALIZAO gwt.myfirst.sample.NOMEDOPROJECTO.clien t.NOMEDOPROJECTO Como podem ver, existem trs seces importantes que definem respectivamente, o nome e localizao do projecto e (a terceira linha) o local onde os ficheiros java sero guardados (sempre dentro da LOCALIZAO). Pode especificar esta terceira linha como quiser, no entanto, convm que seja do tipo *.client.* ou *.server.* apelando assim organizao do cdigo (cdigo do lado cliente, cdigo do lado servidor). Para o projectCreator: projectCreator -eclipse NOMEDOPROJECTO -out LOCALIZAO Para gerar a estrutura do Projecto basta especificar o nome do Projecto e a sua localizao. Este gera um conjunto de pastas e ficheiros que iro consistir na estrutura do projecto a importar no Eclipse. Voltando ao trabalho, crie uma nova pasta em C:\ com o nome GWT_Projects. Esta ser a pasta onde ficar guardada a sua primeira aplicao GWT. Agora abra a linha de comandos e v para a pasta GWT_Projects.

J dentro da varivel PATH, digite C:\gwt (note que tem de separar todos os endereos por ponto e vrgula, tal como mostra a figura). Depois s clicar em OK e est feito O GWT est adicionado a varivel PATH.

<6>

tema de capa
A partir deste momento j possvel executar a aplicao, embora esta ainda no tenha sido importada para o Eclipse. Pode se observar pela imagem acima que foram criados dois novos aplicativos, o HelloWorld-compile e o HelloWorldshell. O primeiro permite compilar todo o cdigo Java para cdigo JavaScript para que a aplicao possa ento ser colocada e executada na Web enquanto que o segundo permite executar a aplicao em Hosted-Mode.

Para criar a estrutura da sua primeira aplicao GWT, designada HelloWorld digite a seguinte linha: applicationCreator -eclipse HelloWorld -out HelloWorld gwt.myfirst.sample.helloworld.client.Hel loWorld Como pode ser observado, foram criados um conjunto de pastas e ficheiros que constituem a estrutura da aplicao.

Mas e o que significa Hosted-Mode?

Criada a estrutura da aplicao, agora ser criada a estrutura do projecto. Para tal, digite agora a seguinte linha: projectCreator -eclipse HelloWorld -out HelloWorld Mais uma vez, foram gerados um conjunto de ficheiros e pastas que iro constituir a estrutura do projecto da aplicao. Agora, dentro da pasta GWT_Projects pode-se observar que existe uma nova pasta designada HelloWorld que contm todas as pastas e ficheiros gerados nos passos anteriores. Esta pasta consiste na sua nova aplicao GWT.

Esta outra das particularidades do GWT, que permite que as aplicaes sobre ele desenvolvidas sejam executadas em dois modos: Web-Mode e Hosted-Mode. Web-Mode consiste na execuo da aplicao sobre a Web, onde todo o cdigo Java j foi convertido para Javascript, ou seja, a aplicao j corre sobre a plataforma para a qual foi criada, a Web. Hosted-Mode consiste num browser interno do GWT, usado durante a fase de desenvolvimento da aplicao e que permite o debbuging das aplicaes em cdigo Java. Ou seja, sempre que for preciso testar a aplicao no necessrio compilar todo o cdigo Java para Javascript e executar a respectiva sobre a Web. Desta forma, toda a aplicao desenvolvida e testada em Java, facilitando muito a tarefa do programador, ficando-se com a certeza de que quando esta for migrada para a Web, estar em pleno funcionamento.

Passo 4: Importar e executar a aplicao no Eclipse

Agora que a estrutura da aplicao est criada, basta import-la para o Eclipse. Para importar o projecto, siga os seguintes passos: 1. Abra o Eclipse e v ao menu File Import (Ir surgir uma janela com o item Existing Projects into Workspace j seleccionado).

<7>

tema de capa

2. Clique Next. 3. Surge novamente uma janela, onde dever seleccionar a pasta onde se encontra o projecto que pretende importar. V pasta GWT_Projects e seleccione a pasta HelloWorld.

A classe HelloWorld implementa a interface designada EntryPoint que basicamente consiste no main de uma aplicao Java normal, ou seja, este o ponto de entrada de execuo da aplicao. Para correr a aplicao em Hosted-Mode basta clicar no boto Run. Ir surgir uma nova janela onde devem seleccionar o item esquerda correspondente ao projecto, neste caso HelloWorld.

4. Para concluir o processo clique em Finish e pronto, j est, a aplicao Hello World foi importada no Eclipse com sucesso.

Cliquem em Run e a aplicao ser ento executada atravs do Browser interno do GWT.

<8>

tema de capa
que esta utiliza uma linguagem muito popular, o Java. Embora alguns dos seus componentes ainda tenham alguns bugs, est constantemente a ser corrigida e aperfeioada, tornando-se cada vez melhor a cada verso disponibilizada. O objectivo deste artigo foi dar a conhecer o Google Web Toolkit e os primeiros passos com esta plataforma Web. Ficaram a conhecer de uma forma geral o que , para que serve e como funciona. No prximo artigo ir ser elaborada uma aplicao GWT mais complexa de forma a abordar mais aspectos desta plataforma, como por exemplo, comunicao cliente/servidor, desenho de interfaces, etc At l poder investigar mais sobre o GWT pois existem j muitos e bons livros que descrevem e ensinam de forma exaustiva todos os seus detalhes. At a prxima edio da Revista Programar.

Esta a aplicao por defeito. A partir daqui podem comear a desenvolver a vossa aplicao Web. Foi aqui demonstrado o modo manual para trabalhar com a plataforma para que pudessem entender um pouco a estrutura e o processo de criao de um projecto GWT. No entanto, j existem plugins como o GWTDesigner, que infelizmente no freeware mas na qual disponibilizado um trial, e que d suporte ao desenvolvimento de aplicaes GWT sobre o Eclipse. O IntelliJ Idea (outro IDE Java) j permite tambm criar projectos GWT dando tambm muito e bom suporte ao desenvolvimento deste tipo de aplicaes.

Bibliografia
[DevGuide Java Compatibility] http://code.google.com/p/google-web-toolkit-doc-14/wiki/DevGuideJavaCompatibility [GWT Brasil] http://www.gwt.com.br/ [GWT Tutorial - Introduction to GWT] http://developerlife.com/tutorials/?p=80 [Google Documentation Reader Google Web Toolkit] http://code.google.com/docreader/#p=google-web-toolkitdoc-1-5&s=google-web-toolkit-doc-1-5&t=GettingStarted [GWT Designer] http://www.instantiations.com/gwtdesigner/ [IntelliJ Idea - GWT] http://www.jetbrains.com/idea/features/gwt.html

Concluindo

O Google Web Toolkit uma plataforma muito interessante e sem dvida ser cada vez mais requisitada na medida em

Licenciado em Engenharia de Informtica pela Universidade da Madeira, est agora a concluir o Mestrado no respectivo curso na mesma universidade. Gosta de linguagens como Java e C#, mas no futuro profissional gostaria de enveredar pelo desenvolvimento de aplicaes Web, dando foco a um tema ou aspecto que tem ganho cada vez mais relevncia no Mundo do Software - a Usabilidade - neste caso concreto, a Usabilidade na Web. cristian.goncalves@portugal-a-programar.org

Cristian Gonalves

<9>

<10>

a programar
cuja aco executada no fim do input). Este programa pode ser executado atravs de uma linha de comandos da seguinte forma: Ou, sendo hello.awk um ficheiro contendo o cdigo a executar: awk 'BEGIN { print "Hello World" }' Neste caso no existe input, mas caso exista ele pode ser enviado atravs do standard input.

Processamento de texto em AWK

O que ?
O AWK uma linguagem de programao criada nos anos 70 com o objectivo de processar dados baseados em texto. Esta linguagem baseia-se fortemente na manipulao de strings e no uso de expresses regulares.

awk -f hello.awk

Campos e variveis
Como j foi dito, quando um registo lido a partir do input, ele dividido em campos (separados por espaos, por omisso). Cada um desses campos pode ser acedido atrvs de uma varivel de campo da forma $N, em que N o nmero do campo ($1 representa o primeiro campo, $2 o segundo e assim sucessivamente). Existe o caso particular de $0 que contm todo o registo. Por exemplo, a seguinte aco escreve apenas o segundo campo de cada registo: print $2

Porqu usar AWK


O AWK tem a vantagem de permitir executar tarefas simples sobre texto utilizando programas mais compactos os que equivalentes escritos em linguagens imperativas como a linguagem C. Isto acontece devido inexistncia de uma funo main e de declarao de variveis.

Estrutura de um programa em AWK


Os programas em AWK so constitudos por uma srie de pares condio-aco, com a seguinte sintaxe: O programa vai ler o input sob a forma de registos condio { aco } (geralmente cada registo corresponde a uma linha) e dividir cada registo em campos (geralmente separados por espaos). Aps isto, a condio vai ser testada para cada registo e nos casos em que seja verdadeira executada a aco.

Para alm das variveis de campo possvel definir e manipular variveis (geralmente para guardar valores intermdios). Estas variveis no tm associado um tipo e so automaticamente inicializadas com 0 ou (string vazia), dependendo da forma como forem utilizadas. Existem ainda, definidas por omisso as seguintes variveis especiais: NF: Nmero de campos do registo actual; NR: Nmero do registo actual; FS: Separador de campos (por omisso, espao); RS: Separador de registos (por omisso, newline). Por exemplo, a seguinte aco escreve o ltimo e o primeiro campo de cada registo: print $NF,$1

Exemplo simples: Hello World


Um programa hello World em AWK tem o seguinte aspecto: BEGIN { print "Hello World" } Em que print uma palavra reservada que escreve na sada os seus argumentos e BEGIN uma condio que indica que a aco correspondente que deve ser executada antes de percorrer o input (da mesma forma, existe um condio END

Condies e expresses regulares


As condies podem ser de diversos tipos, como expresses lgicas e aritmticas (envolvendo variveis de campo ou variveis especiais). No entanto, o mais frequente utilizar uma expresso regular como condio.

<11>

a programar
As expresses regulares permitem descrever de uma forma flexvel padres em strings, sendo teis para filtrar apenas as linhas que contenham uma determinada palavra. Por exemplo, a seguinte condio define as linhas do input contendo a string programar: /programar/ Neste caso a expresso regular equivale a uma string, mas podem ser usadas expresses regulares mais complexas: /programar/: Registos que comeam com programar; /programar$/: Registos que terminam com programar; /programar$/: Registos que sejam iguais a programar; /[Pp]rogramar/: Registos que contm Programar ou programar; /p@p|programar/: Registos contendo p@p ou programar; /[a-z]/: Registos contendo uma letra minscula; /[a-z]/: Registos no contendo uma letra minscula; /[a-zA-Z]/: Registos contendo uma letra maiscula ou minscula. Estas condies procuram a expreso regular em todo o registo. Para a procurar apenas num campo utiliza-se o operador . Por exemplo, a seguinte condio verifica se o segundo campo do registo contm uma letra maiscula: $2[A-Z] tambm possvel definir duas condies para delimitar um bloco de texto. Por exemplo, a seguinte condio define o bloco entre duas linhas que comeam com programar: /programar/,/programar/ O mesmo que a anterior, mas case-insensitive: /[Pp][Rr][Oo][Gg][Rr][Aa][Mm][Aa][Rr]/ { print NR } Seleco das linhas mpares: NR%2==1 { print } Seleco apenas das linhas entre INCIO e FIM: /INCIO$/,/FIM$/ { print } BEGIN { lines = 0 } NF>0 { lines++ } END { print lines } Soma de uma lista de nmeros (um nmero por linha): BEGIN { sum = 0 } { sum += $1 } END { print sum } O mesmo que a anterior, mas somando apenas os nmeros menores que 20: BEGIN { sum = 0 } $1<20 { sum += $1 } END { print sum } Mdia de uma lista de nmeros: BEGIN { sum = 0 } { sum += $1 } END { print sum/NR } Nmeros das linhas que contm a palavra programar (case-sensitive): /programar/ { print NR }

Exemplos de programas em AWK


Em seguida esto alguns exemplos simples de programas escritos em AWK: Contagem de palavras: BEGIN { words = 0 } { words += NF # Cada palavra um campo. } END { print words }

Contagem de linhas no-vazias:

<12>

a programar
Estes so apenas exemplos simples com o objectivo de indicar como as capacidades do AWK. no entanto possvel construir programas mais complexos contendo vrios pares condio-aco, utilizando variveis para guardar parte de registos ou alterando os separadores de campo e registo. Estes tpicos mais avanados no so abrangidos neste artigo e podem ser consultados no guia do utilizador, disponvel em http://www.gnu.org/software/gawk/manual.

Fbio Ferreira frequenta desde 2005 o curso de Engenharia Informtica e de Computadores no Instituo Superior Tcnico, estando actualmente na rea de especializao de Sistemas Inteligentes. Para alm disto, tem interesse por algoritmia, Python e sistemas Unix. fabio.ferreira@portugal-a-programar.org

Fbio Ferreira

<13>

a programar
Set-Executionpolicy Unrestricted Com este comando vo retirar todas as restries de execuo de scripts PowerShell na vossa mquina. O Powershell possui um mecanismo de segurana que assenta em assinaturas de scripts e permisses de execuo. Fica aqui um apanhado dos possveis perfis: Restricted No podem ser executadas scripts. O Windows PowerShell s pode ser usado atravs do powershell command mode. AllSigned Apenas scripts assinadas podem ser executadas RemoteSigned Downloaded Scripts tm que ser assinados para poderem ser executados. Unrestricted Sem qualquer restrio de execuo.

Microsoft Windows Powershell

Introduo
O Powershell basicamente uma linguagem de scripting criada pela Microsoft para administradores de sistemas, a sua syntax um misto de perl,c++ e c#. O Powershell distrbuido livremente e tem como grande objectivo a substituio de vbscript e batch scripting. Windows Powershell um ambiente para cmdlets, funes, filtros, executveis e aliases. O PowerShell baseado na Framework .NET. Assim, tem como principal vantagem a integrao quase directa de componentes .NET.

Breve Introduo
Faamos uma breve introduo syntaxe da linguagem

Variveis
Tm que comear pelo simbolo $ $a=32 Pode ser escrito da seguinte forma para forar o tipo de dados. [int]$a=32

Enquadramento
Este pequeno artigo tem como principal objectivo ilustrar as potencialidades desta linguagem. Pessoalmente, j desde 2007 que tento influenciar todos aqueles administradores de sistemas ou helpdesks para usarem esta ferramenta, pois acho que extremamente poderosa e de enorme valia. Historicamente, o cmd da Microsoft sempre foi bastante limitado, isto deve-se ao facto da Microsoft definir como target do seu sistema operativo, o utilizador comum que acaba por no ser muito dotado tecnicamente. Grande parte dos esforos no desenvolvimento do Windows foram apontados para o interface e a sua usabilidade, em detrimento da criao de um ambiente mais orientado para profissionais. Em suma, o PowerShell veio culmatar a falha que existia na gesto do sistema operativo Windows por linha de comandos.

Arrays, hashs
# Isto um comentrio $a= 1,2,3,4,5 # Array $a= @(1,2,3,4,5) # Array $loc = @{"Braga" = "Portugal"; "Madrid" = "Espanha"} #Hash

Instalao
Para instalar o PowerShell, necessitam da Framework 2.0 da Microsoft, e de fazer download do respectivo pacote PowerShell http://www.microsoft.com/windowsserver2003/technologies /management/powershell/download.mspx. Aps a instalao do PowerShell, devem aceder consola do Windows PowerShell e executar o seguinte comando.

Comandos Essenciais
Get-Help Get-Service Get-Command

<14>

a programar
Criao de Instncias
$d = New-Object -Type System.DateTime 2006,12,25 $d.get_DayOfWeek()

Programming, Programming ...

Output para a consola


Write-Host $a -foregroundcolor green $a

Capturar input
$a = Read-Host Nome ? Write-Host "Ol " $a Nota: O conceito de pipe | est muito enraizado no uso do Powershell ! Imprimir todos os processos da minha mquina. get-process | ForEach-Object { writehost $_.ProcessName $_.CPU} # Ordenando-os por tempo de CPU get-process |Sort-Object CPU #Guardando o resultado dos primeiros 10 numa variavel $P = get-process | Sort-Object CPU descending | select-object -first 10 #fazendo DUMP ficheiro $P > c:\A4.txt da variavel para um

Quebra de linha
Get-Process | ` Select-Object ` name, ID Comments

Ciclos, Loops
$a=1 Do {$a; $a++} While ($a -lt 10) $a=1 Do {$a; $a++} Until ($a -gt 10) For ($a=1; $a -le 10; $a++) {$a} Foreach ($i in Get-Childitem c:\windows) {$i.name; $i.creationtime}

O cmdlet get-process retorna todos uma lista de processos em execuo. No exemplo anterior, bastou redireccionar a sada(output) do comando para um loop foreach para ser possvel trabalhar o resultado. A varivel interna $_ armazena a sada do |.

Controle If-Then-Else
$a = "white" if ($a -eq "red") {"Vermelho"} elseif ($a -eq "white") {"Branco"} else {"nao sei"} $a = "red" switch ($a) { "red" {"vermelho"} "white"{"branco"} default{"nao sei"} }

Como que se sabe quais as propriedades que o objecto $_ possui? simples, usa-se o cmdlet get-member . Este cmdlet permite retornar todas as propriedades e mtodos de um dado objecto. Experimentem o seguinte : get-process | select-object -first 1 | get-member

<15>

a programar
Se desejarem apenas saber quais as propriedades, basta filtrarem pelo -MemberType get-process | select-object -first 1 | get-member -MemberType property Eis o dump do ltimo comando Name BasePriority Container Id MachineName MainModule . . Threads TotalProcessorTime UserProcessorTime VirtualMemorySize VirtualMemorySize64 WorkingSet WorkingSet64 MemberType Property Property Property Property Property Property Property Property Property Property Property Property Property Property # Todos os ficheiros, recursivamente, cujo tamanho seja maior que 20MB get-childitem -recurse c:\temp | where-object {$_.length -gt 2000000} # Todos os ficheiros *.Doc que no sejam readonly get-childitem *.doc | foreach-object {$_.Isreadonly = 0} # Ler um ficheiro $a = Get-Content "c:\servers.txt" foreach ($i in $a) {$i} # Criar um ficheiro excel (2003) com os dados de um servio. $a = new-object -comobject excel.application $a.Visible = $True $b = $a.Workbooks.Add() $c = $b.Worksheets.Item(1) $c.Cells.Item(1,1) = "Nome Servio" $c.Cells.Item(1,2) = "Estado" $i = 2 get-service | foreach-object{ $c.cells.item($i,1) = $_.name; $c.cells.item($i,2) = $_.status; $i=$i+1} $b.SaveAs("c:\Test.xls") $a.Quit() # Who Am I [System.Security.Principal.WindowsIdent ity]::GetCurrent().Name Com estes pequenos exemplos verificamos as enormes potencialidades desta linguagem. Agora um exemplo maior: Algo mais elaborado Listar todos os meus servios, export-los para HTML, separando por cores os que esto a correr dos que esto parados. get-service | ConvertTo-Html -Property Name,Status | ` foreach { if($_ -like "*<td>Running</td>*") {$_ -replace "<td>", "<tr bgcolor=green>"} ` else {$_ -replace "<tr>", "<tr bgcolor=red>"}} >.\get-service.html

Ver o tamanho do meu event log System get-eventlog -list | where-object {$_.logdisplayname -eq "System"} Listar os ltimos 3 eventos System, formatando-os get-eventlog system -newest 3 | format-list Listar todos os ficheiros excepto os temporrios, imprimindo o nome e o tamanho Get-childitem c:\* -exclude *.tmp | select-object name, length Listar todos os servios e export-los para HTML get-service | convertto-html #export-los para um ficheiro get-service | convertto-html .\a10.html

>

<16>

a programar
Juntemo-nos ao lado negro da fora...
$objItem.CSName write-host "Descrio: " $objItem.Description write-host "Comentrios: " $objItem.FixComments write-host "HotFix ID: " $objItem.HotFixID write-host "Data Instalao: " $objItem.InstallDate write-host "Nome: " $objItem.Name write-host "Service Pack : " $objItem.ServicePackInEffect write-host "Estado: " $objItem.Status write-host } Neste ltimo exemplo foi usado o cmdlet get-wmiobject. Este cmdlet faz o interface com o WMI (Windows Management Instrumentation) do Windows. O WMI uma API do Sistema Operativo Windows que permite a obteno da mais variada informao sobre a mquina em si. O WMI funciona por perguntas diversas classes. Para mais informaes sobre esta API usem o url h t t p : / / m s d n . m i c r o s o f t . c o m / e n us/library/aa384642(VS.85).aspx Listar as partilhas de rede

Construamos alguns scripts mais vocacionados para administrao da mquina propriamente dita. Firewall $profile = (new-object -com HNetCfg.FwMgr).LocalPolicy.CurrentProfi le # Lista portas abertas $profile.Services | ? {$_.Enabled} | select -expand GloballyOpenPorts # Lista aplicaes Autorizadas $profile.AuthorizedApplications | ? {$_.Enabled} | ft name # Lista servios $profile.Services | ? {$_.Enabled} | ft name HotFixes instalados no sistema

$strComputer = "." $colItems = get-wmiobject -class "Win32_Share" -namespace "root\CIMV2" -computername $strComputer foreach ($objItem in $colItems) { write-host "Mscara Acesso: " $objItem.AccessMask write-host "Maximo Permitido: " $objItem.AllowMaximum write-host "Descrio: " $objItem.Description write-host "Nome: " $objItem.Name write-host "Path: " $objItem.Path write-host "Estado: " $objItem.Status write-host "Tipo: " $objItem.Type write-host }

$strComputer = "." $colItems = get-wmiobject -class "Win32_QuickFixEngineering" -namespace "root\CIMV2" -computername $strComputer foreach ($objItem in $colItems) { write-host "Origem: " $objItem.Caption write-host "CS: "

<17>

a programar
LoggOff ShutDown, Reboot # Fazer Logoff na prpria mquina $strComputer = "." (Get-WmiObject -Class Win32_OperatingSystem -ComputerName $strComputer).InvokeMethod("Win32Shutdo wn",0) # Outra forma de fazer loggOff (gwmi Win32_OperatingSystem).Win32Shutdown(0) $Args $Error $foreach $HOME $input $Match $MyInvocation $Host $LastExitCode $true $false $null $OFS $ShellID $StackTrace Usado na criao de funes ao qual exigida uma passagem de parmetros Contm o ltimo erro gerado Refere-se ao enumerador do ciclo forA directoria do utilizador Input pipe para uma funo ou bloco de cdigo Tabela de Hash com os elementos encontrados pelo operador -match Informao sobre o script actual Host actual O codigo de sada da ltima aplicao nativa que foi executada TRUE FALSE NULL Campo Separador de Output O Identificador da SHELL Contm o StackTrace do ltimo erro

# Fazer Logoff a uma mquina remota $strComputer = "Servidor-Blade" (gwmi win32_operatingsystem ComputerName $strComputer ).Win32Shutdown(0) # Fazer Logoff a uma mquina remota pedindo credencias (gwmi win32_operatingsystem ComputerName $strComputer -cred (getcredential)).Win32Shutdown(0) # Fazer Shutdown (gwmi win32_operatingsystem).Win32Shutdown(8)

# Forar Shutdown (gwmi win32_operatingsystem).Win32Shutdown(12 ) # Fazer Reboot (gwmi win32_operatingsystem).Win32Shutdown(2)

Ajudas
Caso necessitemos de aceder ajuda de algum cmdlet, basta invocar o comando get-Help

#ajuda sobre o cmdlet export-csv get-Help export-Csv -full #listar todos os comandos disponiveis que contenham a string "A" get-Command | Where {$_.name -match "A"}

# Forar Reboot (gwmi win32_operatingsystem).Win32Shutdown(6)

Variveis especiais
Varivel $_ Descrio Resultado do Pipeline; Usado em blocos de scripts,filtros, funes, where-object for-each, etc Contm o ltimo token do ltimo input Contm o estado de sucesso/falha da ltima operao

Alguns Providers
Normalmente para pesquisar todos os Aliases basta usarmos o seguinte comando:

$$ $?

Get-Alias

<18>

a programar
Nome Get-Location Set-Location Copy-Item Remove-Item Move-Item Rename-Item New-Item Clear-Item Set-Item Mkdir Get-Content Set-Content Aliases gl sl cpi ri mi rni ni cli si n/a gc sc Descrio Directoria corrent Muda de directoria Copia ficheiros Remove um ficheiro/directoria Move um ficheiro Muda o nome a um ficheiro Cria uma nova directoria Limpa o conteudo de um ficheiro Define o conteudo de um ficheiro Cria uma directoria Envia o conteudo de um ficheiro para o output Define o conteudo de um ficheiro

Concluso
Os benefcios desta linguagem so bvios. Tendo sido desenvolvida da robustez e extensibilidade da framework .NET , o PowerShell permite-nos desenvolver poderosos componentes, de uma forma eficaz e rpida. Pessoalmente penso que um enorme upgrade em diversos nveis. Espero que vos seja til.

Referncias
Windows PowerShell http://blogs.msdn.com/PowerShell/ blog

Po w e r S h e l l Ne w s G r o u p http://www.microsoft.com/communities/newsgroups/list/enus/default.aspx?dg=microsoft.public.windows.powershell Windows PowerShell us/library/aa830112.aspx http://msdn.microsoft.com/en-

PowerGui http://www.powergui.org/

Paulo Cabral Engenheiro de Sistemas e Informtica. Tem 10 anos de experincia na rea, estando actualmente inserido num projecto de I&D numa instituio de ensino superior.

paulo.cabral@portugal-a-programar.org

Paulo Cabral

<19>

gnu/linux
mudana de licena (para uma incompatvel com a mais utilizada do Software Livre, a GPL), os membros do Xfree86 criaram um novo ramo do projecto. Esse novo ramo hoje conhecido como X.Org, e em relativamente poucos anos, conseguiu destronar o Xfree86 como implementao de referncia do X, e como implementao mais usada nas distribuies de sistemas operativos Unix. Uma das grandes novidades do X.Org foi a modularizao do cdigo, isto , a separao dos componentes em mdulos com interfaces bem definidas. Embora esta funcionalidade por si s no traga vantagens concretas para os utilizadores, a longo prazo permitiu uma evoluo do servidor sem causar grande instabilidade. Tambm permitiu lanar assincronamente novas verses dos componentes. Apesar de, at hoje, ter ocorrido uma grande evoluo desde os dias do Xfree86, a arquitectura da camada de grficos do Linux continua obsoleta em comparao com outros sistemas operativos. Vamos analisar as suas componentes.

Linux Graphics Stack

Este artigo tenta explicar a arquitectura da camada de grficos do Linux e fornecer algum contexto sobre a sua evoluo, os seus problemas e futuras solues em desenvolvimento pela comunidade de Software Livre.

No incio...
A camada de grficos do Linux assenta principalmente sobre o servidor grfico X. Este servidor grfico comeou o seu desenvolvimento em 1984 e quando apareceu tinha algumas capacidades tcnicas inovadoras. Uma delas a sua arquitectura baseada no conceito de comunicao clienteservidor. Atravs desta arquitectura, consegue caractersticas como transparncia de rede, isto , a mquina onde a aplicao corre no precisa de ser a mesma onde a aplicao est a ser apresentada. Outra caracterstica interessante que o servidor grfico est separado do sistema de janelas, o que permite a criao de diferentes gestores de janelas conforme as necessidades dos utilizadores do sistema. Permite tambm a criao de vrios servidores numa mesma mquina, podendo assim servir vrios utilizadores. At h uns anos atrs, a implementao mais conhecida e utilizada do X era o Xfree86. Esta era mesmo reconhecida como a implementao de-facto e praticamente todos os sistemas baseados em Linux ou mesmo outros ncleos de sistemas operativos baseados em Unix (como a famlia BSD) utilizavam esta implementao. Um servidor grfico como o X um projecto composto por muitos sub-projectos diferentes (gestores de dispositivos drivers, sistemas de janelas - window managers, entre outros). Ao longo dos anos tambm se foi acumulando muito cdigo (milhes de linhas de cdigo!). Entre outros factores, isto tornou o projecto bastante complicado de gerir e entender.

Arquitectura actual do sistema


Numa viso geral simplista, o servidor grfico comunica com o ncleo do sistema operativo (Linux kernel) para aceder e comunicar com o hardware grfico (placa grfica), enviando comandos para serem processados pela placa. Esta interaco envolve tecnologias do kernel e do X. No kernel, o mdulo responsvel pela comunicao com o mundo exterior conhecido como DRM (no, no aquela tecnologia que restringe os direitos dos ficheiros multimdia, mas sim o Direct Rendering Manager). Este mdulo tem vrias responsabilidades, como a sincronizao dos pedidos para a placa grfica por diferentes programas e um controlo rigoroso de acesso dos recursos disponibilizados pela mesma. Este mdulo necessita de algum cdigo especfico para cada famlia de placas grficas. Do lado do servidor as coisas so um pouco mais complexas. Existem mais componentes e a sua interaco por vezes no muito clara. O mdulo que efectua a comunicao com o DRM conhecido como DRI (Direct Rendering Infrastructure) e comunica com a placa, enviando os pedidos dos clientes do servidor X. Os gestores de dispositivos (drivers) tm de comunicar com esta componente para fornecer acelerao grfica 3D. Os drivers e a camada DRI tambm esto dependentes de outra componente, Mesa 3D. Esta componente uma implementao completamente em software (sem recurso da placa grfica) da biblioteca grfica OpenGL. Assim, possvel ter suporte para grficos 3D mesmo sem uma placa grfica, embora obviamente seja bastante mais lento. Cada driver implementa uma pequena camada da sua funcionalidade no Mesa, que transforma os pedidos dos programas no formato da biblioteca OpenGL em instrues

Revolcion, Revolcion!
Em 2004, devido a problemas na organizao, problemas de estagnao e incapacidade de de inovao, aliados a uma

<20>

gnu/linux
especficas para cada placa grfica, atingindo assim acelerao grfica 3D. As funcionalidades no suportadas pela placa grfica podem ser emuladas no processador, utilizando a implementao do OpenGL via software, como previamente referido. Hoje em dia as placas grficas so bem diferentes do que eram h uns anos atrs, quando grande parte da arquitectura do sistema grfico X foi desenhada. Enquanto antigamente a placa grfica dedicava grande parte da rea de silcio a funcionalidades relacionadas com grficos 2D, hoje em dia essas funcionalidades so menos exploradas. Grande parte da placa grfica dedicada para a apresentao de grficos 3D e processamento de shaders. As placas grficas modernas tambm apresentam capacidades considerveis de memria de vdeo (chamada VRAM) que precisa de ser gerida, tal como a memria principal do sistema RAM. As novas verses do OpenGL tambm fazem uso de funcionalidades como FBOs (Framebuffer objects) que permitem fazer render directamente para uma zona de memria da placa grfica. Estas funcionalidades no so bem suportadas pela arquitectura actual, pois no existe um gestor de memria global para a placa grfica. por isso que grande parte dos drivers existentes no X no suportam verses recente do OpenGL, excepo dos drivers da NVIDIA, que no utilizam grande parte da plataforma do X. A arquitectura do X no foi desenhada com nenhum destes factores em conta, o que leva a que ao longo dos anos tenham sido aplicados muitos remendos e solues pouco eficientes para conseguir adicionar as novas funcionalidades suportadas pelos novos modelos de placas grficas constantemente lanados no mercado. Vamos analisar mais profundamente a interaco do hardware grfico com o kernel e com o sistema grfico.

<21>

gnu/linux
Arranque do computador
Quando o computador arranca (depois da BIOS), o kernel comea por inicializar o hardware. Em computadores com placa grfica, esta tambm inicializada. Como cada placa tem uma constituio interna diferente (registos de hardware, por exemplo) cada uma precisa de um cdigo de inicializao diferente (at mesmo em famlias de hardware, este cdigo tem ligeiras alteraes). Esta fase de inicializao do hardware chamada de modesetting, e at h pouco tempo, era feito completamente no servidor X. Ento, perguntam vocs, como que quando ligam o computador, obtm imagem no monitor antes de iniciar o servidor X? Ou at mesmo antes de arrancar o kernel, na BIOS? Isto possvel devido ao standard VGA definido pela IBM em 1987, que consiste numa interface para mostrar texto e grficos no ecr. Esta interface implementada por todos os fabricantes de chipsets grficos, o que permite ao kernel comunicar directamente com o hardware, sem ter de escrever cdigo para cada modelo diferente. Quando o computador arranca, a placa inicializada em VGA (modo texto), com uma resoluo de 640x480 (existem outras disponveis). O problema do VGA que como j se devem ter apercebido, tem limitaes nos modos grficos disponveis e as resolues que suporta so impensveis nos dias de hoje. Para contornar estas limitaes, foi criado outro standard, chamado VBE, ou VESA BIOS Extensions (http:/ /en.wikipedia.org/wiki/VESA_BIOS_Extensions ), que fornece mais modos grficos. O cdigo para mudar de modos continua a ser implementado por cada placa grfica (na Video BIOS). Um dos problemas deste standard, que a comunicao com a placa grfica tem de ser feito em modo real (16-bits) e na altura em que foi definido, os sistemas operativos estavam todos a transitar para modo protegido (32-bits), o que dificulta a utilizao deste standard e sofre de problemas de performance devido transio entre modos. Em termos do kernel do Linux, isto implementado nos drivers de framebuffer (framebuffer drivers). Para perceber o que isto do framebuffer, vamos olhar para a documentao do kernel (http://git.kernel.org/?p=linux/kernel/git/torvalds/linux2.6.git;a=blob_plain;f=Documentation/fb/framebuffer.txt ): The frame buffer device provides an abstraction for the graphics hardware. It represents the frame buffer of some video hardware and allows application software to access the graphics hardware through a well-defined interface, so the software doesnt need to know anything about the low-level (hardware register) stuff. Existem diferentes drivers de framebuffer para cada placa grfica, alguns utilizando os standards que j referi, como o VGA e VESA. E outros para cada famlia de chipsets grficos (da NVIDIA, Intel, ATI, etc). Mais concretamente, no cdigo fonte do kernel, facilmente se encontram: vga16fb (VGA 16 cores) vesafb (VBE 2.0) uvesafb (VBE 2.0+) intelfb (chipsets da Intel) entre outros... Ento, como j vimos, o kernel quando arranca, carrega um destes mdulos que vo ser responsveis pela inicializao da placa grfica e output de imagem para o ecr. Enquanto se trabalha sem o servidor grfico X, tudo funciona relativamente bem. Quando se inicializa o X, este vai reinicializar a placa grfica, utilizando o cdigo de modesetting que existe em cada driver do X. O mesmo acontece quando se muda do X para um terminal em modo texto (o chamado VT switching). O kernel vai reinicializar a placa utilizando o cdigo do driver de framebuffer. por esta razo que a mudana de terminais virtuais (VTs) quando envolve o X to lenta e cheia de tremeliques. Nos portveis e outros dispositivos mveis, quando se suspende ou hiberna, acontece o mesmo problema, estando a placa constantemente a ser reinicializada. Isto leva a que existam conflitos de acesso entre o kernel e o X e que muitas vezes o resumo do computador no seja efectuado correctamente, pois a placa fica num estado de inicializao incorrecto.

Remodelao de arquitectura de grficos


Os responsveis pelo desenvolvimento dos grficos no servidor X e no Linux tm vindo a desenvolver novas solues para cada um dos problemas anteriormente referidos. Esta transio tem sido gradual, at porque no podia ser feita doutra maneira num universo de Software Livre, e as grandes novidades esto quase a chegar nas novas verses do kernel e do X. Um dos primeiros componentes que foi desenvolvido foi um gestor de memria para as necessidades das placas grficas modernas. Um primeiro gestor de memria, chamado TTM (Translation Table Maps) foi arquitectado e desenvolvido pela Tungsten Graphics (http://www.tungstengraphics.com/wiki/index.php/TTM_Mem ory_Manager ). A Intel, por achar a interface do TTM demasiado complexa, desenvolveu outro gestor de memria, chamado GEM (Graphics Execution Manager, http://en.wikipedia.org/wiki/Graphics_Execution_Manager). Podem encontrar uma comparao entre os dois gestores de memria aqui: http://lwn.net/Articles/283793/. O GEM foi

<22>

gnu/linux
incorporado na verso 2.26.28 do kernel (http://wiki.kernelnewbies.org/Linux_2_6_28) e j foi adoptado no driver da Intel e na verso em desenvolvimento do driver radeon (driver de cdigo aberto para chipsets ATI). Ainda no kernel, todo o cdigo relacionado com a inicializao e mudana de modos da placa grfica (modesetting) foi transferido para o kernel, em vez da misturada que existe agora, em que o X e o kernel esto constantemente a re-inicializar os modos da placa grfica. Esta funcionalidade foi integrada no kernel do Linux na verso 2.6.29, cuja verso final est prestes a sair. Por agora, ainda s existe suporte para chipts Intel, mas j se encontram em desenvolvimento solues para NVIDIA e ATI. Com este kernel modesetting vai ser possvel efectuar mudanas entre VTs instantneamente, arranque sem tremeliques e sem mudanas entre modo texto e modo grfico, suporte para Fast-user switching e melhor capacidade de suspenso. Relacionado ainda com esta componente, a Red Hat encontra-se a desenvolver um novo gestor grfico de arranque (no um boot loader, como o GRUB!) para tirar partido destes novos desenvolvimentos. Chama-se Plymouth, e tudo indica que ser adoptado pelas distribuies Fedora e Ubuntu nas suas prximas verses. Outro projecto de remodelao na camada de grficos em Linux, a re-arquitectura do componente DRI, responsvel pela comunicao com o DRM no kernel e com o driver especfico para a placa no Mesa. Foi remodelado para suportar acelerao OpenGL indirecta. Isto permite que jogos ou aplicaes 3D funcionem bem com um gestor de janelas compsito, como o Compiz. O sistema de drivers do X e Mesa tambm est a sofrer uma remodelao, para suportar funcionalidades existentes em verses recentes do OpenGL, facilitar o desenvolvimento de novos drivers, remoo de cdigo duplicado, maior optimizao e suporte para vrias APIs grficas. Esta nova framework chama-se Gallium3D, e est a ser desenvolvida principalmente pela Tungsten Graphics.

<23>

gnu/linux
Esta biblioteca abstrai as diferentes APIs grficas do modelo de programao do driver do ch ipset da placa grfica,permitindo futuras adies de APIs aos drivers sem esforo adicional de programao. Um exemplo seria criar um state tracker para a API grfica da Microsoft, Direct3D. Isto seria til para executar jogos atravs do Wine, que tem de converter chamadas dos jogos para a API em chamadas equivalentes em OpenGL. Ou at mesmo para facilitar o porte de jogos de Windows para Linux sem necessidade de re-escrever o cdigo do motor de jogo. Outro aspecto interessante e inovador do Gallium3D, que utiliza outra biblioteca de cdigo fonte livre chamada LLVM (Low-level Virtual Machine) para optimizar o cdigo dos programas (shaders) que correm nas placas grficas. O LLVM suporta muitos passos de optimizao, e est a usar financiado e usado pela Apple para este efeito no sistema operativo Mac OS X e tambm como optimizador de cdigo nos seus compiladores (o cdigo gerado para o iPhone, por exemplo, optimizado por esta biblioteca). Outros desenvolvimentos a que se tm assistido in the graphics land so o aparecimento de novas APIs para acelerao de decoding de vdeos utilizando a capacidade de processamento da placa grfica para libertar o processador dessa carga. Por parte da NVIDIA, houve o lanamento da API VDPAU (Video Decode and Presentation API for Unix) que suporta vrios formatos modernos (H.264, VC-1). Por parte da Intel tambm apareceu o VA-API (Video Acceleration API), outra API semelhante. A AMD (ATI) tambm se encontra a desenvolver uma API para o mesmo efeito, chamada XvBA (X-Video Bitstream Acceleration). O tempo dir qual ir prevalecer. E ainda h quem esteja a desenvolver outro servidor grfico, livre do X, para tirar partido de todas estas novas para corrigir bugs e melhorar a performance. A Tugsten Graphics tambm tem um driver desenvolvido para a nova arquitectura de drivers, Gallium3D, que suporta os chipsets da Intel. Os chipsets da ATI tambm tm vindo a ser cada vez melhorsuportados em Linux e no X. A AMD (que comprou a ATI no ano passado) recentemente lanou guias de programao para os chipsets grficos, o que permitiu comunidade de Software Livre melhorar consideravelmente os drivers de cdigo aberto. Alm disso, em parceria com a Novell, ajuda no desenvolvimento de um novo driver de cdigo aberto para chipsets mais recentes (o driver chamase RadeonHD). Este driver tem evoluido bastante nos ltimos meses. Com esta documentao, ser possvel no futuro construir drivers Gallium3D para os chips da AMD/ATI. Por parte da NVIDIA, no existe qualquer envolvimento com a comunidade de Software Livre nesta re-arquitectura da camada de grficos. Existe um driver estvel e com suporte componente DRI2. Tal como o prprio autor diz, o objectivo no substituir o X, mas sim tentar novas abordagens e ideias que mais tarde possam ser utilizadas no X.

Estado actual da remodelao


Actualmente, diferentes famlias de placas grficas suportam diferentes funcionalidades. Algumas esto bem encaminhadas nesta remodelao, outras nem por isso, principalmente por falta de investimento das empresas. A comunidade muitas vezes tambm no pode ajudar porque as empresas no lanam os manuais de programao dos ch ips das placas, pelo que se torna uma tarefa exageradamente difcil criar um driver de raiz. A Intel tem contribudo bastante para toda esta remodelao, com o seu gestor de memria GEM e cdigo para kernel modesetting nos seus chips, ambos j integrados na prxima verso do kernel do Linux (2.26.29). Alm disso, continuam a lanar novas verses de drivers

tecnologias. O X j maduro, e tem sido remodelado constantemente ao longo dos ltimos anos, mas nada como tentar uma nova abordagem de raiz. Este novo servidor chama-se Wayland e est a ser desenvolvido pelo mesmo programador que fez grande parte do trabalho no

<24>

gnu/linux

para verses recentes do OpenGL (3.1!) de cdigo fechado (proprietrio) e tambm um driver 2D bastante obfuscado de cdigo aberto, ambos mantidos pela NVIDIA. O driver proprietrio considerado dos melhores drivers para o X e um dos nicos que suportam funcionalidades disponveis em verses recentes do OpenGL. Ainda falando dos chips da NVIDIA, existe um projecto da comunidade para desenvolver um driver completamente livre e cdigo aberto. Chama-se nouveau e tem tido um progresso fantstico, tendo em conta que no existe qualquer documentao disponvel dos chips (a NVIDIA no lana os guias de programao!) e o desenvolvimento tem de ser feito com ajuda de reverse-engeneering do driver proprietrio. Para mais informaes visitem o site do projecto (http://nouveau.freedesktop.org).

Concluso
Podem continuar a seguir todos os desenvolvimentos no site Phoronix (http://www.phoronix.com) que nos ltimos tempos se tem tornado uma excelente fonte de notcias para todos os assuntos relacionados com grficos em Linux.

Espero que tenham gostado tanto deste artigo, como eu gostei de o escrever. Como devem ter percebido, a arquitectura dos grficos em Linux (e em qualquer outro sistema operativo!) complexa e em constante desenvolvimento, logo normal que tenha digo algum disparate. Agradeo que me contactem com todas as vossas correces, sugestes e crticas.

Joo Matos, tambm conhecido por triton, frequenta o segundo ano do curso de Engenharia Informtica e Computadores no IST. Tem como principais interesses as reas de Sistemas Operativos, Computao Grfica e Arquitectura de Computadores. joao.matos@portugal-a-programar.org

Joo Matos

<25>

internet
Smashing Magazine
Blog dedicado a oferecer aos seus leitores dicas e a inform-los das ltimas tendncias e tcnicas em todos os assuntos relacionados com o webdevelopment. Um ptimo repositrio de ideias grficas, assim como de imagens grtis e tcnicas para a criao e manuteno de websites.

http://www.smashingmagazine.com/

ThemeForest
ThemeForest um site de compra e vendas de templates. Aqui possvel encontrar, a baixos preos, templates para um website - desde templates exclusivas para Wordpress a simples templates (x)HTML. Existe uma enorme variedade de temas, onde se destacam as templates para painis de administrao, to difceis de encontrar na internet. Possibilita tambm a venda de templates, recebendo o seu autor uma percentagem do lucro, aumentando a mesma caso a template seja um sucesso de vendas.

http://www.themeforest.net/

Wiki P@P
A Wiki P@P plataforma Wiki da comunidade portuguesa de programadores, Portugal-aProgramar. Nesta podero ser encontrados todo o tipo de recursos de teor informativo, tutoriais ou snippets, fruto do contributo dos utilizadores. Qualquer um pode contribuir para o projecto, pois s assim este vive e subsiste, isto porque uma plataforma Wiki uma plataforma de trabalho cooperativo.

http://wiki.portugal-a-programar.org/

Joel on Software
Joel on Software um blog que fala sobre o desenvolvimento de software, gesto de negcios, e da Internet desde 2000, sem aquela teoria maadora, mostrando o lado mais prtico das situaes. O seu autor j escreveu quatro livros, sobre temas falados no seu blog, e d vrias palestras por ano, para os interessados na rea.

http://www.joelonsoftware.com/

<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