terça-feira, 30 de dezembro de 2008

Instalação do Yum no Red Hat Enterprise Linux 4

Utilizando o RHEL4, necessitei de instalar e remover alguns pacotes. Para quem está habituado no ambiente Debian, essa tarefa costuma ser trivial quando se utiliza o utilitário apt-get. Já no RHEL 4, tive que utilizar o utilitário rpm.

O problema, é que o rmp não atualiza/remove certos pacotes que dependem de outros pacotes, ou seja, todos os pacotes devem ser instalados manualmente,o que consome um certo tempo. Lembrei-me do projeto YUM, que veio para simplificar a instalação dos pacotes nesse tipo de distribuição.

O YUM (Yellow dog Updater, Modified) é um software desenvolvido pela Duke University projetado para ser um instalador, atualizador e removedor de pacotes RPM, semelhante ao apt-get do Debian.

Ele trata automaticamente as dependências de arquivos não sendo necessário ficar buscando e instalando as dependências manualmente, lógico que para ele fazer tudo sozinho todas as dependências tem que estar nos repositórios configurados na maquina.

Por padrão o Red Hat não vem com o YUM e sim o Up2date, que só baixa os arquivos dos repositórios oficiais da Red Hat, mediante ao pagamento é claro. Já com YUM não, você pode colocar diversas bases de pesquisa, ficando assim livre do up2date.

==================================
1º Passo - Instalação:
==================================

Baixe e instale a versão do YUM para Red Hat 4. É fácil de ser encontrado na web, basta procurar por: yum-2.4.2-0.4.el4.rf.noarch.rpm

Para fazer a instalação basta rodar no console o comando:


# rpm -ivh yum-2.4.2-0.4.el4.rf.noarch.rpm



Bem, pode acontecer alguns problemas de dependências, como:

Error: Failed dependencies:
python-elementtree is needed by yum-2.4.2-0.4.el4.rf.noarch
python-sqlite is needed by yum-2.4.2-0.4.el4.rf.noarch
urlgrabber is needed by yum-2.4.2-0.4.el4.rf.noarch

Então será necessário instalar estes outros pacotes (que também é fácil achar pela web). Vou colocar aqui uns links da onde eu baixei, mas quando você for fazer, pode não estar ativos, ai você pode localizar pelo google o nome do pacote:

Pacote: python-elementtree-1.2.6-7.el4.rf.i386.rpm


wget ftp://194.199.20.114/linux/dag/redhat/el4/en/i386/dag/RPMS/python-elementtree-1.2.6-7.el4.rf.i386.rpm
# rpm -ivh python-elementtree-1.2.6-7.el4.rf.i386.rpm



Pacote: python-sqlite-1.0.1-1.2.el4.rf.i386.rpm


wget ftp://194.199.20.114/linux/dag/redhat/el4/en/i386/dag/RPMS/python-sqlite-1.0.1-1.2.el4.rf.i386.rpm
# rpm -ivh python-sqlite-1.0.1-1.2.el4.rf.i386.rpm



Dependências relacionadas ao pacote python-sqlite-1.0.1-1.2.el4.rf.i386.rpm:

Pacote sqlite-2.8.17-1.el4.rf.i386.rpm:

wget ftp://fr2.rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/sqlite-2.8.17-1.el4.rf.i386.rpm
# rpm -ivh sqlite-2.8.17-1.el4.rf.i386.rpm



Pacote: python-urlgrabber-2.9.7-1.2.el4.rf.noarch.rpm

wget ftp://194.199.20.114/linux/dag/redhat/el4/en/i386/dag/RPMS/python-urlgrabber-2.9.7-1.2.el4.rf.noarch.rpm
# rpm -ivh python-urlgrabber-2.9.7-1.2.el4.rf.noarch.rpm



Pronto, já está instalado, porém sem repositórios para fazer as buscas.

==================================
2º Passo - Configuração:
==================================

Vamos criar os arquivos a seguir, lembrando que todos dentro do /etc/yum.repo.d
Arquivo com nome dag.repo:


[dag]
name = Dag
enabled = 1
baseurl = http://dag.freshrpms.net/redhat/el4/en/$basearch/dag/
http = //ftp.heanet.ie/pub/freshrpms/pub/dag/redhat/el4/en/$basearch/dag/
gpgcheck = True



Arquivo com nome dries.repo:

[dries]
name=Extra RedHat EL 4 rpms dries - $releasever - $basearch
baseurl=http://apt.sw.be/dries/redhat/el4/en/$basearch/dries/RPMS
gpgcheck=1
enabled=1
gpgkey=http://dries.ulyssis.org/ayo/RPM-GPG-KEY.dries.txt



Arquivo com nome livna.repo:

[livna]
name=Fedora Core 4 - i386 - livna
baseurl=http://rpm.livna.org/fedora/4/i386/RPMS.lvn
failovermethod=priority



E por último o arquivo jpackage.repo:

[jpackage-generic]
name=JPackage (free), generic
mirrorlist=http://www.jpackage.org/jpackage_generic.txt
failovermethod=priority
gpgcheck=1
gpgkey=http://www.jpackage.org/jpackage.asc
enabled=1



Seguindo a mesma linha iremos montar o repositório dos arquivos liberados pela Red Hat e reunidos no projeto CentOS.

Criar um arquivo dentro do /etc/yum.repo.d com o nome de centos.repo:


[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/4/os/i386/
gpgcheck=1

[updates]
name=Red Hat Linux $releasever - Updates
baseurl=http://mirror.centos.org/centos/4/os/i386/
gpgcheck=1


Vamos rodar:

# yum clean all



Ele irá limpar todas as entradas do "banco de dados" do yum.

# yum check-update



Nesse ponto, o yum irá efetuar o download dos repositórios indicados nos arquivos criados previamente. A atualização dos repositórios pode levar alguns minutos.

==================================
3º Passo - Utilização:
==================================

Para instalar um pacote, use o comando "yum install", como em:

# yum install wpa_supplicant



Para removê-lo posteriormente, use:

# yum remove wpa_supplicant


O yum possui também um recurso de busca, que é bastante útil quando você está procurando por um pacote, mas não sabe o nome exato, ou em casos de pacotes que possuem nomes diferentes em relação a outras distribuições. Use o comando "yum search", seguido por alguma palavra ou expressão, que faça parte do nome do pacote ou descrição, como em:


# yum search apache


Ele retorna um relatório contendo todos os pacotes relacionados, incluindo o texto de descrição de cada um.

Para atualizar um pacote, use o comando "yum update", como em:

# yum update wpa_supplicant



Tutorial adaptado de:
http://jf.eti.br/howto-yum-no-red-hat-enterprise-linux-4/

Fontes:
http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=6581
http://www.lupaworld.com/24527/viewspace_3008.html
http://www.sk360.info/wiki/articles/7/1/Install-yum-on-RHEL4/Page1.html
http://maimon-it.blogspot.com/2005/06/install-yum-on-redhat-enterprise-linux.html
http://www.guiadohardware.net/artigos/revisao-pacotes-servicos/

quarta-feira, 24 de dezembro de 2008

C++ Poema de Natal



Para comemorar esse dia especial que é o Natal, mostro aqui um código interessante em C/C++ chamado xmas2005.c. Esse programa quando compilado mostra na tela um poema de natal (em inglês).

Faça o download do arquivo diretamente em: http://www.inf.bme.hu/~pts/xmas2005.c

Vale a pena compilar e conferir muito interessante!
Código fonte:


(clique na imagem para ampliar)


Para compilar o arquivo, utilizei o g++ no linux:

g++ xmas2005.c -o xmas2005



O resultado da execução do programa pode ser observado abaixo. É um poema de natal, há rumores que esse programa existe desde 1988.

Um ótimo Natal à todos!
Happy Christmas! Enjoy ;)

Vejam o resultado:

On the first day of Christmas my only love gave to me
a partridge in a pear tree.

On the second day of Christmas my only love gave to me
two turtle doves
and a partridge in a pear tree.

On the third day of Christmas my only love gave to me
three french hens, two turtle doves
and a partridge in a pear tree.

On the fourth day of Christmas my only love gave to me
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the fifth day of Christmas my only love gave to me
five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the sixth day of Christmas my only love gave to me
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the seventh day of Christmas my only love gave to me
seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the eighth day of Christmas my only love gave to me
eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the ninth day of Christmas my only love gave to me
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the tenth day of Christmas my only love gave to me
ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the eleventh day of Christmas my only love gave to me
eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the twelfth day of Christmas my only love gave to me
twelve drummers drumming, eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

sexta-feira, 12 de dezembro de 2008

Redimensionar/Rotacionar imagens em massa


Recentemente descobrir como redimensionar, de maneira simples e eficiente, diversas imagens quando utilizando o Nautilus (gerenciador de arquivos do GNOME) no Ubuntu Hardy 8.04.


Trata-se do nautilus-image-converter, que pode ser instalado no gerenciador de pacotes ou executando-se no terminal:

sudo apt-get install nautilus-image-converter



Após instalar o pacote, mate o processo do nautilus (Sistema > Administração > Monitor do Sistema, clique no Nautilus e clique em finalizar) para que o nautilus carregue o plugin. Ou então execute no terminal:

sudo killall nautilus

Feito isso, é s ó clicar com o botão direito do mouse na(s) imagem(ns) e escolher as opções (resoluções pré-definidas, por escala de porcentagem ou personalizado) .
Imagem das opçõ es no menu:


O arquivo resultante será um novo com a palavra “resized” (ou outra personalizável); outra opção tamb ém é de sobrescrever o arquivo original.

Juntamente o redimensionador, é instalado um plugin pra rotacionar imagens. Entretanto o “Eye of Gnome” (programa que roda por padrão ao clicar duas vezes em uma imagem), já faz o rotacionamento das imagens, através das teclas CTRL + R (sentido horário) ou SHIFT+CTRL+R (sentido anti-horário), e depois pressionando CTRL+S (pra salvar).

Esse plugin usa o Image-magick como motor.

terça-feira, 2 de dezembro de 2008

JAVA: Arrays Primitivos e a classe java.util.Arrays

A classe java.util.Arrays do Java versão 1.5 (Tiger), possui uma série de métodos estáticos para trabalhar com vetores unidimensionais e matrizes.

Nesse caso, mostrarei operações básicas sobre vetores unidimensionais, tais como exibir um vetor em tela, ordenar, comparar e buscar dados em um vetor utilizando a java.util.Arrays.

Nesse exemplo mostra como utilizar as funcionalidades da classe java.util.Arrays:

ArrayExamples.java

import java.util.Arrays;

public class ArrayExamples {

public static void main(String[] args) {

int arr1[] = {23,2,89,123,21,12,17,13,56,90,218,0};
int arr2[] = {23,2,89,123,21,12,17,13,56,90,218,0};
int arr3[] = {0,3,9,23,1,45,10,21,56,90,218,33};

String arrFrutas[] = {"maça", "banana", "abacate", "laranja", "manga"};

//converter array para string e exibir no console
System.out.println("array1: " + Arrays.toString(arr1));
System.out.println("array2: " + Arrays.toString(arr2));
System.out.println("array3: " + Arrays.toString(arr3));

//comparação entre arrays
System.out.println("arrays arr1 e arr2 são iguais? " +Arrays.equals(arr1, arr2));
System.out.println("arrays arr2 arr3 são iguais? " +Arrays.equals(arr3, arr2));

//ordenar array primitivo
Arrays.sort(arrFrutas);
System.out.println("arrFrutas ordenado:" + Arrays.toString(arrFrutas));

//busca binária em array primitivo
System.out.println("lanranja encontrada no índice: " + Arrays.binarySearch(arrFrutas, "laranja"));

}
}

Na classe ArrayExamples.java primeiramente, foram declarados 4 vetores, sendo 3 de valores primitivos do tipo inteiro (int) e 1 do tipo cadeia de caracteres (String).

Para exibir o array no console sem a necessidade de fazer um laço de repetição para isso foi utilizado o método Arrays.toString(). Para comparar 2 arrays foi utlizado o método Arrays.equals(). Na ordenação do array o método Arrays.sort() foi utilizado. Já para efetuar uma busca binária no array em questão, utilizou-se o método Arrays.binarySearch() que retorna o índice do valor procurado no vetor.

Resultado da execução do programa:

array1: [23, 2, 89, 123, 21, 12, 17, 13, 56, 90, 218, 0]
array2: [23, 2, 89, 123, 21, 12, 17, 13, 56, 90, 218, 0]
array3: [0, 3, 9, 23, 1, 45, 10, 21, 56, 90, 218, 33]
arrays arr1 e arr2 são iguais? true
arrays arr2 arr3 são iguais? false
arrFrutas ordenado:[abacate, banana, laranja, manga, maça]
lanranja encontrada no índice: 2



Muitos códigos podem ser optimizados utilizando essa classe uma vez que algoritmos de busca, ordenação e comparação já estão implementados.

quarta-feira, 26 de novembro de 2008

Visualizar Arquivos .CHM no GNOME

Os arquivos de extensão .chm são do tipo help do windows. São constituídos geralmente de um conjunto de páginas em formato HTML e compilado em um único arquivo chm.

O Gnome versão 2.22 não tem suporte nativo para abrir arquivos chm. Para conseguir acessar o conteúdo desses arquivos no gnome, existe um software chamando gnochm para abrir arquivos desse tipo.

O gnochm é baseado em linguagem python. Para instalá-lo basta digitar no terminal:

sudo apt-get install gnochm

Após a instalação será criado um novo ícone: Aplicações->Acessórios->Visualizador CHM. Basta agora dar dois cliques sobre o arquivo chm para abrí-lo com o gnochm. A figura abaixo mostra uma tela com o gnochm em execução:



O gnochm é uma solução livre para ler esse tipo de arquivo em sistemas linux, em especial no gnome.

Para mais detalhes sobre o software acesse a página do desenvolvedor: http://gnochm.sourceforge.net/index.html

quarta-feira, 19 de novembro de 2008

JAVA: Copiar Arquivo

Esse pequeno trecho de código mostra como fazer cópias de arquivos em Java.

A classe FileCopy possui o método copy que tem como parâmetros o caminho do arquivo de origem (à ser copiado), e o caminho do arquivo de destino.


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileCopy {

public boolean copy(String infile, String outfile) {

try {

//abre as streams
InputStream in = new FileInputStream(infile);
OutputStream out = new FileOutputStream(outfile);

byte[] buf = new byte[1024];
int len;

//transfere os bytes da stream in para a out
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}

//fecha os arquivos
in.close();
out.close();
return true;

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return false;
}


public static void main(String[] args) {
FileCopy file = new FileCopy();
boolean res = file.copy("/tmp/tux-ubuntu.jpg", "/tmp/tux-ubuntu-copia.jpg");

System.out.println("File copied? " + res);
}
}


O método copy abre o arquivo de origem e transfere seus bytes para o arquivo de destino, criando assim uma cópia do arquivo. No código de exemplo, o arquivo tux-ubuntu.jpg será copiado para o arquivo tux-ubuntu-copia.jpg.

Resultado após executar o programa:










Download do código fonte: FileCopy.java

quinta-feira, 6 de novembro de 2008

Linux Embarcado

O Linux a Bordo é um site dedicado à divulgação do Linux embarcado, com artigos, tutoriais e diversos materias úteis para a comunidade de Linux embarcado do Brasil. Todo o site está disponibilizado de forma colaborativa através de uma Wiki.

Esta é sem dúvida a pergunta que a maioria das pessoas fazem, primeiro deve-se entender o que vem a ser um sistema embarcado. A apresentação "Criando sistemas embarcados com Linux - da teoria à prática" tenta responder esta pergunta e introduzir conceitos gerais

Acesse o site sobre linux embarcado e saiba mais:
http://www.linuxabordo.com.br/wiki/index.php

Agradecimento ao meu amigo Arnaldo Imamura por enviar essa dica!

quinta-feira, 30 de outubro de 2008

Codecs de Audio/Vídeo para Ubuntu 8.04

Para que o ubuntu reproduza alguns formatos de audio/video, é necessário instalar uma série de codecs para que os players nativos do ubuntu, como o Totem por exemplo, consiga reproduzir as mídias.

Pesquisando na rede encontrei uma linha de comando que instala uma série de codecs e players para que seja possível executar arquivos como: mp3, mp4, 3gp, wmv, avi, rmvb entre outros. Execute o bloco de comandos no terminal/console:


echo 'deb http://packages.medibuntu.org/ hardy free non-free' | \
sudo tee -a /etc/apt/sources.list && \
wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | \
sudo apt-key add - && sudo aptitude update && \
sudo aptitude -y install \
a52dec cdda2wav easytag faad ffmpeg ffmpeg2theora flac \
gsfonts gsfonts-x11 gstreamer-dbus-media-service gstreamer-tools \
gxine id3tool id3v2 lame lame-extras libflac++6 libjpeg-progs \
libmad0 libmjpegtools0c2a libmp4v2-0 libmpcdec3 libmpeg2-4 \
libmpeg3-1 libquicktime1 libsnack2 libxine1-ffmpeg libxine1-gnome \
libxine1-plugins mencoder mozilla-mplayer mpeg2dec mpeg3-utils \
mpegdemux mpg123 mpg321 mplayer mplayer-fonts mplayer-skins \
nautilus-script-audio-convert sox tagtool toolame totem-plugins \
totem-plugins-extra uudeview vlc vlc-nox vlc-plugin-alsa \
vlc-plugin-sdl vlc-plugin-svgalib vorbis-tools xine-ui



Executando esses comandos de instalação, não tive mais problemas para visualizar mídias de audio/vídeo.

sexta-feira, 24 de outubro de 2008

Informações sobre Mídias

Um utilitário interessante e que ajuda quando se necessita de informações de uma determinada media de vídeo, como frame rate, codecs de audio, vídeo, bitrate e etc, é o mediainfo.

O pacote debian do mediainfo pode ser baixado do sourceforge:
http://sourceforge.net/project/showfiles.php?group_id=86862&package_id=90612&release_id=621340

No meu caso eu baixei o pacote deb:

sudo dpkg -i mediainfo.cli_0.7.7.5-2_i386.deb


Ou se estiver usando o gnome no ubuntu hardy, basta dar dois cliques sobre o pacote depois de baixado que o gerenciador de pacotes do gnome instala automaticamente o software.

Segue um exemplo de utilização do media info, digite no console:


mediainfo meuvideo.3gp


o resultado do media info:


General
Complete name : meuvideo.3gp
Format : MPEG-4
Format profile : 3GPP Media Release 5
Codec ID : 3gp5
File size : 490 KiB
Duration : 1mn 5s
Overall bit rate : 61.0 Kbps
Encoded date : UTC 2008-07-07 12:48:30
Tagged date : UTC 2008-07-07 12:48:30

Video
Format : H.263
Codec ID : s263
Duration : 1mn 5s
Bit rate mode : Variable
Bit rate : 38.9 Kbps
Width : 176 pixels
Height : 144 pixels
Display aspect ratio : 1.222
Frame rate mode : Variable
Frame rate : 9.878 fps
Minimum frame rate : 3.333 fps
Maximum frame rate : 10.000 fps
Bits/(Pixel*Frame) : 0.155
Stream size : 312 KiB (64%)
Encoded date : UTC 2008-07-07 12:48:30
Tagged date : UTC 2008-07-07 12:48:30

Audio
Format : AMR
Format/Info : Adaptive Multi-Rate
Format profile : Narrow band
Codec ID : samr
Duration : 1mn 5s
Bit rate mode : Constant
Bit rate : 8400 bps
Channel(s) : 2 channels
Sampling rate : 8000 Hz
Resolution : 16 bits
Stream size : 67.5 KiB (14%)
Encoded date : UTC 2008-07-07 12:48:30
Tagged date : UTC 2008-07-07 12:48:30




Se eu quiser obter a informação de um campo específico, como por exemplo a altura do vídeo em pixels e também o codec utilizado, poderia fazer:


mediainfo --Inform="Video;%Height%" meuvideo.3gp
mediainfo --Inform="Video;%Format%" meuvideo.3gp



resultado:

144
H.263


Ou então, queira saber o codec de audio utilizado no vídeo:


mediainfo --inform="Audio;%Codec%" meuvideo.3gp



resultado:

AMR


Essa ferramenta é muito util quando se deseja obter informações mais detalhadas de um determinado tipo de media.

domingo, 19 de outubro de 2008

Download de Web Site com wget

Uma dica interessante para quem precisa baixar um determinado site, ou uma seção do mesmo para visualização off-line, usar o wget pode ser uma boa alternativa. Por exemplo:


$ wget \
--recursive \
--no-clobber \
--page-requisites \
--html-extension \
--convert-links \
--restrict-file-names=windows \
--domains website.org \
--no-parent \
www.website.org/tutorials/html/


Esse comando baixa o Web Site:
www.website.org/tutorials/html

As opções são:
  • --recursive: download do site inteiro recursivamente
  • --domains website.org: não segue os links fora do domínio website.org
  • --no-parent: não segue os links fora do diretório: tutorials/html/
  • --page-requisites: copia todos os elementos que compõe a página (imagens, CSS e etc)
  • --html-extension: salva arquivos com extensão .html
  • --convert-links: converte os links para que funcionem localmente, off-line
  • --restrict-file-names=windows: modifica os nomes dos aquivos de modo que funcione no windows também.
  • --no-clobber: não sobreescreve os arquivos já existentes

Dica modificada da publicação origianal de DASHAMIR HOXHA, no Linux Jornal (OUT/2008).

quarta-feira, 15 de outubro de 2008

Full Circle Magazine - Revista livre sobre Ubuntu Linux

A Full Circle Magazine é uma revista mensal sobre a distribuição Ubuntu linux.

Nela é possível encontrar estudos de caso de utilização do linux, formas de configurar o Ubuntu para tarefas específicas e até testes de instalação e compatibilidade em diversos tipos de hardware e possíveis soluções de problemas..

A edição atual de aniversário e também as anteriores podem ser obtidas pelo site:

http://fullcirclemagazine.org/

É uma boa opção tanto para os novatos como para os mais experientes.

segunda-feira, 13 de outubro de 2008

Editor Visual de HTML para Linux

Quem utiliza editores visuais de código HTML em outros sistemas, deve ter sentido falta de um software com recurso parecido no linux.

O KompoZer pode resolver o problema, edita arquivos html, css, cria tabelas e formulários de forma intuitiva e visual. Esse software é uma atualização do já descontinuado NVU. Certamente ainda apresenta muitas limitações quando comparado com seus concorrentes comerciais, entretando para tarefas básicas ele é bastante eficiente.

Os pacotes de instalação já estão nos repositórios do ubuntu linux, para instalá-los basta digitar no console a linha de comando:

sudo apt-get install nvu


Screenshot do KompoZer:

sábado, 11 de outubro de 2008

Adicionar Núvem de Tags no Blogger

Para adicionar uma Nuvem de Tags no Blogger, é necessário efetuar uma série de modificações no layout HTML do blog. Não é uma tarefa das mais triviais. Entretanto, nesse endereço o autor fez um tutorial de como configurar uma nuvem de tags para seu blog, passo-a-passo.

http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html


Fiz o teste usando essas instruções no meu blog, funcionou perfeitamente sem necessidade de muitas alterações.

terça-feira, 7 de outubro de 2008

Configurar suporte ao Java no Firefox 3

Ao atualizar o Firefox da versão 3 beta para a final no ubuntu 8.04, notei que o suporte a java não estava mais configurado corretamente, eu não podia mais executar applets java no browser.

Para confgurar novamente o browser para suporte ao java, é necessário já ter o java instalado e configurado no sistema. Dessa forma é necessário:

Entrar no diretório de plugins do firefox:

$ cd /usr/lib/firefox-addons/plugins



Criar um link pra a lib do jre. No meu caso o diretório que eu instalei o java é: /opt/java

$ sudo ln -sf /opt/java/jre/plugin/i386/ns7/libjavaplugin_oji.so libjavaplugin.so



Reinicie o firefox para que as alterações entrem em vigor. Para verificar se a instalação do plugin foi efetuada com sucesso, vá até o menu Ferramentas->Complementos e clique na aba Plugins, lá você deve ver o plugin do java listado.

Para baixar a versão 3 do firefox, visite o endereço:
http://pt-br.www.mozilla.com/pt-BR/firefox/

quarta-feira, 1 de outubro de 2008

Utilizando o Comando diff

Com o comando diff do linux é possível verificar as diferenças entre dois arquivos.

Se for necessário controlar as alterações entre dois arquivos. Você desenvolve um código, outra pessoa modifica, como saber o que foi alterado para atualizar o seu código? o comando diff pode nos ajudar nessa tarefa.

Imaginemos a situação onde é necessário encontrar a diferença entre 2 programas: programa1.java e programa2.java

programa1.java


1 public class programa1 {
2
3 public static void main(String[] args) {
4 float valor1 = 20;
5 float valor2 = 50;
6
7 float resultado = valor1 * valor2;
8 System.out.println("Resposta: " + resultado);
9 }
10 }



programa2.java


1 public class programa2 {
2
3 public static void main(String[] args) {
4 float valor1 = 500;
5 float valor2 = 50;
6
7 float resultado = valor1 / valor2;
8 System.out.println("Resposta: " + resultado);
9 }
10 }



O comando diff pode ser usado da seguinte forma:

diff programa1.java programa2.java


Resultado:

1c1
< public class programa1 {
---
> public class programa2 {
4c4
< float valor1 = 20;
---
> float valor1 = 500;
7c7
< float resultado = valor1 * valor2;
---
> float resultado = valor1 / valor2;


O resultado mostra o número da linha e o texto que difere nos arquivos, observamos também símbolos como < > ---. O sinal <> indica o valor modificado encontrado no segundo arquivo (programa2.java) e o --- é utilizado como separador.

Veja que pelo resultado é possível perceber uma diferença na linha 1 do arquivo (nome do programa), na linha 4 o valor da variável valor1 no primeiro programa tem valor 20, já no segundo tem valor 50, e por fim, na linha 7 foi modificado o operador * pelo /.

Este recurso é uma ótima ferramenta para desenvolvedores, principalmente se você vai trabalhar com diferentes versões de seus projetos.

domingo, 28 de setembro de 2008

Conversão de Caracteres para HTML Entities

Recentemente recebi um layout em HTML com os textos usando acentuação: á é í ó ç e etc. Quando colocado no browser tive problemas para exibir esses caracteres corretamente, eles apareciam de forma ilegível.

Como eu estou no linux, não tenho como usar os recursos de softwares proprietários dreamweaver, editplus e etc que já fazem a conversão dos caracteres especiais para os chamados HTML Entities. Procurando na rede, descobri um projeto open-source no sourceforge chamado HTMLEntities que consiste em um conjunto de classes em java para fazer esse tipo de conversão.

Para baixar os códigos fontes e o jar já compilado do projeto, visite o endereço: http://sourceforge.net/projects/htmlentities/

Depois de adicionar o jar do HTMLEntities no seu projeto Java, é possível acessar os recursos de conversão de caracters por meio de uma classe estática. Veja um exemplo simples de conversão de caracteres acentuados para HTML Entities (SimpleConvert.java):

package com.htmlentity;
import com.tecnick.htmlutils.htmlentities.HTMLEntities;

public class SimpleConvert {

public static void main(String[] args) {
String text = "substituição de caracteres: á é í ó ú ç";

String html = HTMLEntities.htmlentities(text);

System.out.println("Caracteres convertidos: " + html);
}
}

O método htmlentities(String) da classe HTMLEntities é chamado estaticamente, reliza a corversão do texto passado como parâmetro e retorna o novo resultado (Linha 8 do código).

Essa conversão é util para desenvolvedores que necessitam colocar esse tipo de funcionalidade dentro de seus projetos java, ou mesmo webdesigners que precisam codificar seus textos em forma de HTML Entities.

segunda-feira, 22 de setembro de 2008

Java: Medir tempo de execução de tarefas

Com a necessidade de medir o desempenho de uma determinada classe, criei um cronômetro simples. Acredito que seja um código facilmente encontrado na rede, mas esse é bem optimizado e de fácil utilização.

O cronômetro é uma classe estática chamada Chronometer.java:


/**
* @author J.P. Eiti Kimura Classe para cronometrar
* operações em Java
*/
public final class Chronometer {

private static long startValue;
private static long stopValue;
private static long timeDiff;

/**
* Inicia a contagem temporal
*/
public static void start() {
startValue = System.currentTimeMillis();
stopValue = 0;
timeDiff = 0;
}

/**
* Calcula a diferença temporal
*/
public static void stop() {
stopValue = System.currentTimeMillis();
timeDiff = stopValue - startValue;
}

/**
* Retorna o diferença de tempo medida
* @return tempo em milisegundos
*/
public static long elapsedTime() {
return timeDiff;
}
}


A classe é basicamente formada por métodos estáticos de inicio de contagem de tempo (linha 14), de termino da contagem e cálculo do tempo (linha 23), e por fim, um método que retorna o valor do tempo medido (linha 32).

Para exemplificar a utilização da classe Chronometer, vamos medir o tempo gasto para efetuar duas tarefas usando recursos diferentes.

Imagine uma situação onde se deseja concatenar uma cadeia de caracteres qualquer um número definido de vezes. Qual objeto java seria mais rápido para fazer essa tarefa, um simples String, ou um StringBuffer? Para responder essa questão vamos medir o desempenho com nossa classe de cronômetro.

ChonoTest.java


public class ChronoTest {

public static void main(String[] args) {

StringBuffer sb = new StringBuffer();
String sValue = "";

long time1 = 0;
long time2 = 0;

// mede tempo da primeira operação
Chronometer.start();
for (int i = 0; i < 5000; i++) {
sb.append("It's measure time!");
}
Chronometer.stop();
time1 = Chronometer.elapsedTime();

// mede tempo da segunda operação
Chronometer.start();
for (int i = 0; i < 5000; i++) {
sValue += "It's measure time!";
}
Chronometer.stop();
time2 = Chronometer.elapsedTime();

System.out.println("StringBuffer result:" + time1 + "ms");
System.out.println("String result:" + time2 + "ms");

}
}


Note que inicialmente, utilizou-se a classe de cronômetro para a marcar o tempo gasto para concatenar 5000 vezes a frase "It's measure time!" (linha 12). Após a concatenação, o cronômetro é parado (linha 16) e o tempo é calculado (linha 17).

Executando a classe ChronoTest.java em um computador com processador Core2 Quad, com 2GB de memória RAM obtive o seguinte resultado:

StringBuffer result:16ms
String result:7586ms


Esse pequeno exemplo mostra como é possível calcular o tempo gasto em determinadas operações, pode ser aplicado para verificar o tempo gasto do retorno de um conjunto de dados de um banco de dados por exemplo, e mesmo para identificar qual parte do processamento de uma tarefa é a mais custosa em tempo.

quinta-feira, 18 de setembro de 2008

Programas para Compactação/Descompactação de Arquivos

Após instalar o Ubuntu Linux 8.04, verifiquei a necessidade de instalar alguns softwares para compactar/descompactar arquivos em formatos diversos, zip, rar, tar, gz, 7zip e etc.

A linha de comando abaixo instala uma série de pacotes para resolver esse problema:

sudo aptitude -y install unace rar unrar zip unzip \
p7zip-full p7zip-rar sharutils aish uudeview mpack \
lha arj cabextract file-roller

segunda-feira, 15 de setembro de 2008

Recompilar FFMPEG com suporte para MP3, AAC e AMR

O FFmpeg

O FFmpeg é uma ferramenta completa para gravar, converter e efetuar streaming de audio e vídeo. Inclui a libavcodec, uma poderosa biblioteca de codecs para audio e vídeo. O FFmpeg é desenvolvido no linux, mas pode ser compilado na maioria dos sistemas operacionais, incluindo o Windows.

Na última compilação do FFmpeg, não estava habilitado o suporte à medias em formato mp3, aac e amr. Esse tutorial mostra como recompilar o FFmpeg habilitando o surporte à esses formatos de mídia. O tutorial foi testado no ubuntu linux versão 8.04.1, no entando com algumas modificações pode facilmente ser adaptado para compilar o software em outros sistemas.

Para copiar os códigos fonte diretamente do site do cvs, utilizei o subversion. Para instalar o subversion digite no terminal:


sudo apt-get install subversion



Para organizar nosso processo, sugiro criar o diretório /proj em /tmp que conterá o código fonte do ffmpeg e dos codecs para compilação:

cd /tmp
mkdir proj



O próximo passo é fazer o download do código fonte do ffmpeg:

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg


ou

wget http://ffmpeg.mplayerhq.hu/ffmpeg-export-snapshot.tar.bz2



Vamos descompactar o arquivo com os fontes e renomear a pasta original para ffmpeg:

sudo tar -jxvf ffmpeg-export-snapshot.tar.bz2
mv ffmpeg-export-snapshot ffmpeg




Bibliotecas e Dependências

Antes de compilar o ffmpeg, verifiquei a necessidade de softwares adicionais para que a compilação possa se dar corretamente. Para compilar, é necessário ter um compilador C/C++ instalado e algumas outras bibliotecas para auxiliar na compilação. Lembrando que no meu caso, estou executando os procedimentos no ubuntu linux, verifique a necessidade de instalar essas bibliotecas no seu sistema.

Instalando o g++ (~32MB) 4.2.3:

sudo apt-get install g++



Instalando o comando patch (2.5.9.4):

sudo apt-get install patch



Instalando pacotes autotools:

sudo apt-get install automake (autoconf automake m4)
sudo apt-get install libtool ( autotools-dev libtool )
sudo apt-get install yasm ( autotools-dev libtool )



Demais pacotes:

sudo apt-get install build-essential


Feita a instalação das ferramentas, vamos iniciar a compilação do ffmpeg propriamente dito. Antes de instalar as bibliotecas auxiliares, vamos compilar o código fonte original do ffmpeg para garantir que a configuração das bibliotecas e mesmo a integridade do código fonte esteja ok:

cd /tmp/proj/ffmpeg
sudo ./configure
make
make install


Se tudo correu bem até aqui, um arquivo binário chamado ffmpeg deve ter sido gerado. É o nosso programa já compilado no formato original.


Bibliotecas Externas (codecs)

Sugiro que seja criada uma pastas codecs em /tmp/proj para que os códigos fonte das bibliotecas externas sejam armazenados, em seguida criar uma pasta chamada lib em /tmp/proj para que sejam armazenadas as bibliotecas compiladas.

- mp3lame:
-----------------

Download do código fonte para a pasta /tmp/proj/codecs:
http://prdownloads.sourceforge.net/lame/lame-3.97.tar.gz?download

Descompactar e mover para a pasta dos fontes do ffmpeg:

cd /tmp/proj/codecs
tar xvfz lame-3.97.tar.gz
mv lame-3.97 ../ffmpeg



baixar o patch de correção para o diretório /tmp/proj/codecs e mover para a pasta /tmp/proj/ffmpeg/lame-3.97:

wget http://arrozcru.no-ip.org/ffmpeg_patches/lame.diff



no diretório /tmp/proj/ffmpeg/lame-3.97, aplique o patch de correção:

patch -p0 < ../lame.diff


Para compilar o mp3lame, gerando as libs no diretório /tmp/proj/lib:

./configure --prefix=/tmp/proj/lib --disable-shared --enable-static --disable-frontend --enable-yasm
make
make install




- faad2
----------

Download do código fonte para a pasta /tmp/proj/codecs:
http://prdownloads.sourceforge.net/faac/faad2-2.6.1.tar.gz?download

baixar o patch de correção para o diretório /tmp/proj/codecs e mover para a pasta /tmp/proj/ffmpeg:

wget http://arrozcru.no-ip.org/ffmpeg_patches/faad2-2.6.1.patch



Descompactar e mover para a pasta ffmpeg:

tar xvfz faad2-2.6.1.tar.gz
mv faad2 ../ffmpeg



no diretório /tmp/proj/ffmpeg, aplique o patch de correção:

patch -p0 < faad2-2.6.1.patch



Compilar o faad2, gerando as libs no diretório /tmp/proj/lib:

cd faad2
sh bootstrap
./configure --prefix=/tmp/proj/lib --enable-static --disable-shared
make LDFLAGS="-no-undefined"
make install



- faac
-----------

Download do código fonte para a pasta /tmp/proj/codecs:
http://prdownloads.sourceforge.net/faac/faac-1.26.tar.gz?download

Descompactar e mover para a pasta ffmpeg:

tar xvfz faac-1.26.tar.gz
mv faac ../ffmpeg



baixar o patch de correção para o diretório /tmp/proj/codecs e mover para a pasta /tmp/proj/ffmpeg:
wget http://arrozcru.no-ip.org/ffmpeg_patches/faac-1.26.patch

no diretório /tmp/proj/ffmpeg, aplique o patch de correção:

patch -p0 < faac-1.26.patch



Compilar o faac, gerando as libs no diretório /tmp/proj/lib

cd faac
sh bootstrap
./configure --prefix=/tmp/proj/lib --enable-static --disable-shared
make LDFLAGS="-no-undefined"
make install



- amr_nb
-----------

É necessário o unzip e o wget para instalação desse codec, assim como acesso a Internet.

Download do código fonte para a pasta /tmp/proj/codecs:
http://ftp.penguin.cz/pub/users/utx/amr/amrnb-7.0.0.0.tar.bz2

Descompactar e mover para a pasta ffmpeg:

tar -jxvf amrnb-7.0.0.0.tar.bz2
mv amrnb-7.0.0.0 ../ffmpeg



Compilar o amr_nb, gerando as libs no diretório /tmp/proj/lib

cd amrnb-7.0.0.0
./configure --prefix=/tmp/proj/lib --enable-static --disable-shared
make
make install



- amr_wb
-----------

É necessário o unzip e o wget para instalação desse codec, assim como acesso a Internet.

Download do código fonte para a pasta /tmp/proj/codecs:

wget http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.2.tar.bz2



Descompactar e mover para a pasta ffmpeg:

tar -jxvf amrwb-7.0.0.2.tar.bz2
mv amrwb-7.0.0.2 ../ffmpeg



Compilar o amr_wb, gerando as libs no diretório /tmp/proj/lib

cd amrwb-7.0.0.2
./configure --prefix=/tmp/proj/lib --enable-static --disable-shared
make
make install



Recompilar FFmpeg usando codecs já compilados

Para recompilar o ffmpeg, deve-se indicar os codecs que serão adicionados no ./configure e também o caminho dos includes e libs dos codecs:

./configure --enable-libmp3lame --enable-libfaad --enable-gpl --enable-libfaac --enable-gpl --enable-libamr-nb --enable-nonfree --enable-libamr-wb --enable-nonfree -extra-ldflags=-L/tmp/proj/lib/lib --extra-cflags=-I/tmp/proj/lib/include
make
make install



Desse forma geramos uma nova versão do ffmpeg com suporte a audio mp3, aac e amr.

Para maiores detalhes consulte:
http://arrozcru.no-ip.org/ffmpeg_wiki/tiki-index.php?page=HomePage

Para detalhes de como recompilar o ffmpeg especificamente para o ubuntu linux, esse endereço oferece uma descrição detalhada:
https://wiki.ubuntu.com/ffmpeg

quinta-feira, 11 de setembro de 2008

Sistema de Busca Off-line

Meu amigo me pediu uma ajuda para fazer um sistema de busca off-line. Entende-se off-line como um sistema de busca que pode ser executado de dentro de um cd/pen-drive sem que fosse necessário ter um servidor e/ou banco de dados para isso. O sistema deveria ser multiplataforma também.

Para ilustrar, vamos imaginar um sistema que busque dados de artigos acadêmicos em uma mídia qualquer e os dados são obtidos a partir de um arquivo de dados.

Para resolver esse problema, utilizei um sitema feito em javascript que roda a partir do navegador web. A estrutura dos arquivos deve ser conforme a figura ao lado. Uma pasta raiz chamei de busca_offline com um diretório de scripts, um arquivo de dados (base.dat) e um index.html para apresentação do resultado.

O sistema se baseia em uma chamada via HttpRequest, carregando o arquivo com os dados base.dat; a partir de então a busca é feita sobre o arquivo carregado utilizando-se expressões regulares.

O arquivo de dados base.dat é do tipo texto (codificado em UTF-8), com os campos de interesse separados pelo caracter #:

base.dat

João Paulo Eiti Kimura#Programas para busca OFF-LINE
Alcides Ribeiro Jr.#Testes e experimentações com algebra
Zulaide Ribeiro da Silva#Ultra-som de potência para Terapia
José da Silvã# AJAX e suas maravilhas com Javascript
Márcia Kímura# Técnica Marcação de orgãos em Radioterapia
Paulo Antônio Machado# Java EE Segunda Edição
Roberto Pereira de Melo# Programação Orientada a Eventos
Flavia Renata de Souza# Medidor de Fluxo sanguíneo
Roberto Murari# Recursos Humanos e marketing


O Javascript responsável por carregar o arquivo de dados e efetuar as buscas é mostrado a seguir.

engine.js

1 var objArray;
2 var respText;
3
4 /* carrega o arquivo de dados*/
5 function loadResources()
6
{
7 AJAXRequest();
8 }
9
10 /* faz o parser do arquivo lido separando por linhas */
11 function parseResponse(responseText)
12
{
13 objArray = responseText.split("\n");
14 data = "";
15
16 for(i = 0; i < objArray.length; i++){
17 data+= i + " = " + objArray[i].split("#") + "\n";
18 }
19
20 document.getElementById("sresult").value = data;
21
22 }
23
24 /* ajusta os parâmetros adicionando acentuação nas buscas */
25 function adjustParam(param)
26
{
27 param = param.replace(/[aãâáà]/gi, "[aãâáà]");
28 param = param.replace(/[eêéè]/gi, "[eêéè]");
29 param = param.replace(/[iíì]/gi, "[iíì]");
30 param = param.replace(/[oôóò]/gi, "[oôóò]");
31 param = param.replace(/[uúùü]/gi, "[uúùü]");
32
33 param = param.replace(/[cç]/gi, "[cç]");
34
35 return param;
36 }
37
38 /* efetua uma busca em todos os elementos do vetor */
39 function doSearch(param)
40
{
41 param = adjustParam(param);
42 var found = false;
43 var links = "";
44
45 //percorre todos os registros
46 for(i = 0; i < objArray.length; i++){
47
48 var pattern = new RegExp(param,"gi");
49
50 var str = objArray[i];
51 found = pattern.exec(str);
52
53 if (found)
54 {
55 links += "<div > <a href='#'>" + str.split("#") + "</a></div>";
56 }
57
58 }
59
60 document.getElementById("resultArea").innerHTML = links;
61 }
62
63 /* Esse método instancia o objeto XMLHttpRequest*/
64 function GET_XMLHTTPRequest()
65
{
66 var request;
67
68 // Lets try using ActiveX to instantiate the XMLHttpRequest object
69 try{
70 request = new ActiveXObject("Microsoft.XMLHTTP");
71 }catch(ex1){
72 try{
73 request = new ActiveXObject("Msxml2.XMLHTTP");
74 }catch(ex2){
75 request = null;
76 }
77 }
78
79 // check if it supports httprequest
80 if(!request && typeof XMLHttpRequest != "undefined"){
81 //The browser does, so lets instantiate the object
82 request = new XMLHttpRequest();
83 }
84
85 return request;
86 }
87
88
89 function AJAXRequest()
90
{
91 //instancia objeto
92 var myXMLHttpRequest = GET_XMLHTTPRequest();
93
94 //Make sure the XMLHttpRequest object was instantiated
95 if (myXMLHttpRequest)
96 {
97 //carrega o arquivo de dados
98 myXMLHttpRequest.open("GET", "base.dat", true);
99
100 //função que trata a requisição quando o request termina
101 myXMLHttpRequest.onreadystatechange = function (aEvt) {
102
103 if(myXMLHttpRequest.readyState == 4){
104 parseResponse(myXMLHttpRequest.responseText);
105 }
106 };
107 myXMLHttpRequest.send(null);
108 }
109 else
110 {
111 //Oh no, the XMLHttpRequest object couldn't be instantiated.
112 alert("A problem occurred instantiating the XMLHttpRequest object.");
113 }
114 }



O método doSearch(linha 39) faz a busca de um determinado texto no campos do arquivo de dados carregado. O método adjustParam(linha 25), utiliza expressões regulares para ajustar os parâmetros da busca de forma que sejam ignorados os caracteres acentuados.

O código do arquivo index.html de apresentação dos dados é mostrado abaixo.

index.html


1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
4 <title>Busca offline</title>
5 <script src="script/engine.js" type="text/javascript"></script>
6 </head>
7 <body onload="javascript:loadResources();">
8
9 <h1>Busca Off-line</h1>
10 <br />
11
12 <input type="text" id="fsearch"> &nbsp;
13 <button name="btnsearch" value="Search"
14 onclick=
"javascript:doSearch(document.getElementById('fsearch').value);">

15 Search </button>
16 <br/><br/>
17
18 <div>
19 <textarea rows="10" cols="70" id="sresult"></textarea>
20 </div>
21 <br/><br/>
22
23 <h1> Resultado </h1>
24 <div id="resultArea">
25 </div>
26 </body>
27 </html>



Quando a página html é carregada, o arquivo de dados também é carregado na memória (linha 7). Nessa página, temos um campo para busca, um botão search (linhas 13,14 e 15) que irá chamar a engine de busca.

Por conveniência criei um textarea para exibir os dados que foram carregados do arquivo (linha 19). E, por fim, uma div que irá exibir os resultados da nossa busca (linha 24).
A figura abaixo mostra como fica a apresentação da engine de busca off-line:


No caso da imagem de exemplo, foi efetuada uma busca pela palavra terapia. Note que o os resultados que retornara foram referentes as palavras: Terapia e Radioterapia.

Para alterar os links do resultado, basta alterar a linha 55 do arquivo engine.js. Essa micro-engine de busca pode ser utilizada totalmente off-line, colocada dentro de um pen-drive, CD ou DVD. Tem a vangatem de ser multiplataforma e usa ferramentas livres de licença.

Download do código fonte: busca_offline.zip

segunda-feira, 8 de setembro de 2008

Instalando o AWN no Ubuntu Hardy Haron 8.04

Link para este post no Dicas-L: http://www.dicas-l.com.br/dicas-l/20080506.php

O Avant Window Navigator, conhecido como AWN, é uma barra do tipo dock que após ser ativada fica localizada no canto inferior da tela. O AWN suporta atalhos, lista de tarefas e applets de terceiros, tem aparência configurável que lembra as barras de menus dos sistemas da Apple. É uma boa opção para deixar o GNOME com um aspecto diferente quanto a interação com usuario. ;)

Para instalar o AWN na nova versão do Ubuntu Hardy Haron: devemos primeiro adicionar os repositórios nas listas de source, para fazer isso vai interface gráfica acesse menu: System -> Administration -> Software Source

Em seguida clique sobre a guia "Third-Party Software" e adicione os seguintes repositórios (adicione uma linha por vez):

deb http://ppa.launchpad.net/awn-testing/ubuntu hardy main
deb-src http://ppa.launchpad.net/awn-testing/ubuntu hardy main

Clique em "Close" para fechar a janela principal e confirme a opção para recarregar os repositórios clicando em "Reload" e guarde até que a janela fechar.

Acesse o terminal: Applications -> Accessories -> Terminal e digite a seguinte linha de comando para iniciar a instalação do AWN:

sudo apt-get install awn-manager-trunk awn-extras-applets-trunk

Após a instalação, o AWN pode ser iniciado através do menu:

Applications -> Accessories -> Avant Window Navigator

Para adicionar mais links ao dock, basta arrastar os links dos menus do GNOME sobre o dock do AWN que os links são criados automaticamente. Além dos links é possível adicionar applets de leitura de RSS, previsão do tempo, recursos de hardware, menus do sistema e etc.

Vejam um exemplo do dock configurado:

Post de Inauguração

Olá Pessoal,

Está aberto o blog onde vou registrar pequenos códigos, dicas e notas de desenvolvimento utilizando sistemas open-source, em especial tecnologia JAVA usando sistemas linux.

Grande Abraço,