Month: September 2008

Erro compilando com o gcc: collect2: cannot find ld

Apos uma atualizacao do Ubuntu meu gcc parou de funcionar, ele nao reconhecia mais o linker (ld) e portanto nao compilava mais nenhum programa.

O collect2 tenta encontrar o link como explicado aqui:
http://gcc.gnu.org/onlinedocs/gccint/Collect2.html#Collect2

Usando o parametro -print-search-dirs (gcc -print-search-dirs) podemos visualizar este diretorios.

Entao resolvi o problema simplesmente copiando o arquivo ld para um destes diretorios listados, no meu caso ficou assim:
$ sudo cp /usr/bin/ld /usr/lib/gcc/i486-linux-gnu/4.2.3/real-ld

Esta dica eu encontrei na lista do gcc:
http://gcc.gnu.org/ml/gcc-help/2005-07/msg00050.html

Chat simples com o comando netcat (nc)

Voce sabe que pode usar o comando “write” para mandar mensagens para usuarios *nix na sua rede, mas e se voce quiser permitir que usuarios Windows participem da brincadeira? Simples use o comando netcat (nc para os intimos):

Na maquina que sera’ o servidor execute:

$ nc -l -p 3333

Onde 3333 e’ a porta que voce deseja usar para fazer o bate-papo. Lembre-se para usar portas menores que 1024 voce precisara’ ser root.

Para conectar nesta maquina digite:

$ nc 192.168.0.1 3333

Onde 192.168.0.1 e’ o IP da maquina que esta fazendo o papel de servidor e 3333 e’ a porta que foi escolhida para usar para o bate-papo.

Mas e o pobre coitado que usa o Windows, como ele faz? Ele usa o telnet:

Iniciar -> Executar: cmd

C:\> telnet  192.168.0.1 3333

Apos digitar uma frase pressione a tecla Enter, a frase saira’ no servidor, da mesma forma uma frase digitada no servidor saira’ no cliente.

Linux Hard Real Time (ou quase)

Muita gente ja’ sabe que o Linux esta’ se tornando um kernel com caracteristicas de Tempo Real. Durante muito tempo Linus Torvalds foi contra os patches que adicionam suporte a tempo real no kernel. Ele dizia que os computadores atuais ja’ sao rapidos o suficiente para garantir um bom tempo de resposta (acho que ele nao sabia direito o que e’ um sistema de tempo real ;-), felizmente alguem conseguiu convence-lo da importancia disto.

O patch que da’ suporte a tempo real ao kernel do Linux e’ chamado de PREEMPT-RT, mas este patch depende de outros, que felizmente ja’ foram aplicados ao kernel mainline, e a espectativa e’ que o patch PREEMPT-RT entre no kernel mainline nas proximas versoes.

Entretanto voce nao precisa esperar isto acontecer para poder testar o Linux com suporte a tempo real, basta seguir estes passos abaixo para conseguir fazer isto (simples e indolor):

Baixe o kernel 2.6.26:
$ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2

Descompacte:
$ tar jxvf linux-2.6.26.tar.bz2

Baixe o patch para subir este kernel para a versao 2.6.26.5:
$ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.5.bz2

Baixe o patch PREEMPT-RT para ser aplicado a versao 2.6.26.5:
$ wget -c http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6.26.5-rt9.gz

Entre dentro do diretorio linux-2.6.26 e aplique os patches acima:
$ cd linux-2.6.26
$ bzcat ../patch-2.6.26.5.bz2 | patch -p1
$ zcat ../patch-2.6.26.5-rt9.gz | patch -p1

Configure o kernel:
$ make menuconfig

Ative o suporte a Tempo Real:

 Processor type and features  --->
      Preemption Mode (XXXXXX) --->
            (X) Complete Preemption (Real-Time)

Salve a configuracao do seu kernel, compile e instale de forma usual.

Para verificar se seu kernel funcionou, reinicie o computador e inicie seu Linux com o kernel Realtime que voce acabou de compilar. Entao baixe e compile o rt-tests:

$ wget -c http://kernel.org/pub/linux/kernel/people/tglx/rt-tests/rt-tests-0.27.tar.gz
$ tar zxvf rt-tests-0.27.tar.gz
$ cd rt-tests
$ make

Para verificar a latencia maxima que seu kernel esta’ gerando execute:

# ./cyclictest -p 80 -t5 -n
0.53 0.36 0.14 1/228 4469          

T: 0 ( 4465) P:80 I:1000 C:    857 Min:     13 Act:   38 Avg:   59 Max:     175
T: 1 ( 4466) P:79 I:1500 C:    572 Min:      6 Act:   26 Avg:   69 Max:     236
T: 2 ( 4467) P:78 I:2000 C:    429 Min:      9 Act:   43 Avg:   50 Max:     157
T: 3 ( 4468) P:77 I:2500 C:    343 Min:      8 Act:   24 Avg:   87 Max:     230
T: 4 ( 4469) P:76 I:3000 C:    286 Min:      6 Act:   45 Avg:   56 Max:     223

Onde:
-p 80 = prioridade inicial das 5 threads;
-t5 = informa quantas threads serao criadas, note que nao ha espaco entre t e 5;
-n = instrui o programa a usar nanosleep para gerar o tempo de espera.

No meu notebook a latencia maxima esta’ muito alta (~175 us, microsegundos), o normal seria algo em torno de 50 us. Caso voces consigam fazer o teste, postem comentarios informando qual foi a latencia maxima obtida.

Um tutorial mais completo, e desatualizado, pode ser encontrado neste site:
http://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO

Instalando o Latex no Ubuntu 8.04

Instalei o Kile no Ubuntu, mas ele nao instala todas as dependencias para compilar os arquivos fonte latex, entao obtive muitos erros antes de faze-lo funcionar.

A primeira mensagem de erro foi:
No hyphenation patterns were loaded for(babel) the language `Portuguese'(babel) I will use the patterns loaded for \language=0 instead.

A solucao foi instalar o pacote “texlive-lang-portuguese”.

Depois obtive a seguinte mensagem de erro:
Font T1/ptm/m/n/12=ptmr8t at 12.0pt not loadable: Metric (TFM) file not found. \begin{document}

A solucao foi instalar o pacote “texlive-fonts-recommended”.

Depois obtive a seguinte …, chega ne. Para torna a longa historia curta eu tenho os seguintes pacotes instalados:

texlive-base
texlive-base-bin
texlive-common
texlive-doc-base
texlive-fonts-recommended
texlive-lang-portuguese
texlive-latex-base
texlive-latex-extra
texlive-latex-recommended
texlive-pictures

Com isto consegui compilar corretamente meus arquivos latex.

Recompilando um programa a la Debian

Sou “obrigado” a usar o Evolution como cliente de email, pois na empresa onde trabalho eles usam o Microsoft Exchange como servidor de email. Como eu utilizo o Evolution para enviar patches para clientes e para submete-los ao projeto original sempre tenho que mudar o tipo de formatacao para Preformat.

Como e’ chato ter que ficar mudando o formato para vez que for postar um patch resolvi procurar nas preferencias como deixar o Preformat como padrao, mas nao encontrei. Entao lembrei que talvez no gconf-editor eu poderia encontrar algo, mas infelizmente nao encontrei nada la’. Entao resolvi apelar para a recompilacao do Evolution.

Primeiro instalei todas as dependencias do Evolution:
$ sudo apt-get build-dep evolution

Depois baixei o codigo fonte:
$ apt-get source evolution

Entao compile:
$ cd evolution-2.22.3.1
# dpkg-buildpackage -uc -b

Ao final da compilacao serao criados os arquivos .deb no diretoria pai:
$ cd ..
$ ls *.deb
evolution-common_2.22.3.1-0ubuntu1_all.deb
evolution-dbg_2.22.3.1-0ubuntu1_i386.deb
evolution-dev_2.22.3.1-0ubuntu1_i386.deb
evolution-plugins-experimental_2.22.3.1-0ubuntu1_i386.deb
evolution-plugins_2.22.3.1-0ubuntu1_i386.deb
evolution_2.22.3.1-0ubuntu1_i386.deb

A compilacao ocorreu com sucesso, o problema foi que descobri que a funcao do editor na fica no Evolution e sim num componente chamado GNOME_GtkHTML_Editor, nova compilacao, ai vou eu…

Criando um HelloWorld em FLTK2

Embora eu seja um novato em materia de bibliotecas graficas, ha’ muito tempo eu tenho uma grande admiracao pela FLTK. Ela e’ uma biblioteca pequena, flexivel e muito rapida.

Entao resolvi botar a mao na massa e comecar a brincar um pouco com ela. Para que mais pessoas possam fazer o mesmo resolvi postar um passo-a-passo aqui.

Primero baixe o codigo fonte da FLTK2 mais recente:
http://www.fltk.org/software.php?VERSION=1.3.x-r6176&FILE=fltk/snapshots/fltk-2.0.x-r6176.tar.bz2

Descompacte como de costume:
tar jxvf fltk-2.0.x-r6176.tar.bz2

Compile da forma usual:
cd fltk-2.0.x-r6176/
./configure
make
make install

Crie um arquivo com o nome hello.cxx com o conteudo:

#include <fltk/Window.h>
#include <fltk/Widget.h>
#include <fltk/run.h>

using namespace fltk;

int main(int argc, char **argv){
        Window *window = new Window(400, 200);
        window->begin();
        Widget *box = new Widget(10,10,360,160,"Hello World!");
        box->box(UP_BOX);
        box->labelfont(HELVETICA_BOLD_ITALIC);
        box->labelsize(36);
        box->labeltype(SHADOW_LABEL);
        window->end();
	window->show(argc,argv);
	return run();
}

Compile:

g++ -I/usr/local/include -c hello.cxx
g++ hello.o -o hello -L/usr/local/lib -lfltk2 -lXext -lXinerama -lXft -lXi -lX11 -lm

Execute:

./hello

Voce devera’ ver a seguinte tela:

Hello World
Hello World