Genbuntu

18 12 2006

Introdução

Ao final desse ano serão praticamente 7 anos de experiências, boas e ruins, com linux. Primeiro contanto, foi com o conectiva, que estava em uma das suas primeiras versões, 3.0 se não me engano, fascinado com todo esse mundo novo, novas interfaces, novos softwares migrei para o Slackware, por onde fiquei cerca de 6 ou 5 anos, mas por sua falta de tempo e pelo gosto do Patrick, resolvi, depois de fazer residência no Slack, trocar de distribuição.

Descobrindo novos mundos
(sem flames!)

Como toda crise comecei a testar outras distribuições procurando por alternativas mais práticas. O Debian, foi a primeira distribuição que não consegui me adaptar bem, mas a facilidade de manter o sistema me agradou, e muito. O apt-get (aptitude) é simplesmente fantástico. Ubuntu é ubuntu, mas serve. Finalmente ao final da minha jornada, encontrei o Gentoo, desempenho fantástico, mas a mantenibilidade do sistema é impraticável.

Por mais que eu tentasse manter meu sistema up-to-date não conseguia, sempre novas atualizações, algumas delas travaram toda a atualização do sistema, e por ai vai. Assumo que não me dediquei o suficiente para achar soluções para os updates quebrados. Resolvi então achar outra solução. Precisava de facilidade e, uma vez usuário gentoo, desempenho.

Eis que surge a idéia do Genbuntu! Que seria uma base do sistema compilada, gerada pelo gentoo+emerge e programas menos utilizados, que não necessáriamente precisariam de um desempenho grande, executados no ubuntu mas pelo gentoo. Com certeza existem N outras soluções para esse “problema” mas resolvi abordar dessa forma. Usando o que aprendi na instalação do gentoo, escolhi instalar o Ubuntu e usar o chroot para trazer para o gentoo os softwares instalados no Ubuntu.

Mão na massa

Na primeira tentativa, usei simples e cru:

chroot /mnt/ubuntu /bin/bash

A intenção era conseguir um bash logado no ubuntu. Sucesso, basicamente era exatamente isso que eu precisava, mas várias coisas não estavam funcionando direito. Depois de alguma pesquisa “escrevi” um pequeno script que me dá um terminal funcional do Ubuntu dentro do Gentoo, a partir deste posso rodar qualquer coisa dentro do ubuntu estando no Gentoo.

mount -t proc none /mnt/ubuntu/proc
mount -o bind /dev /mnt/ubuntu/dev
mount -o bind /sys /mnt/ubuntu/sys
mount -o bind /tmp /mnt/ubuntu/tmp
chroot /mnt/ubuntu /bin/bash

Com agora a base do sistema (/dev /proc /sys e /tmp) replicada em ambos os pontos montados “/” e “/mnt/ubuntu”, podia fazer praticamente qualquer coisa no ubuntu que o mesmo funcionava perfeitamente, faltava então conseguir exibir os softwares rodados no ubuntu no Xorg do gentoo. Usando o xhost, liberei o acesso a mim mesmo em meu X, exportando os /dev/pts consegui finalmente fazer um sistema híbrido com ambas as distribuições rodando ao mesmo tempo. A versão final do script ficou:

#!/bin/bash
mount -t proc none /mnt/ubuntu/proc
mount -o bind /dev /mnt/ubuntu/dev
mount -o bind /sys /mnt/ubuntu/sys
mount -o bind /tmp /mnt/ubuntu/tmp
mount -o bind /dev/pts /mnt/ubuntu/dev/pts
cp /home/fcpn/.Xauthority /mnt/ubuntu/root/
cp /home/fcpn/.Xauthority /mnt/ubuntu/home/fcpn/
xhost +local:root
chroot /mnt/ubuntu /bin/bash
xhost -local:root

O único inconveniente é ter que executar tudo no ubuntu como root. Porém dai por diante, só a criatividade é o limite, com o chroot é possível executar qualquer comando chroot /mnt/ubuntu xmms ou qualquer outra coisa que você queira.

emerge + aptitudeSynaptic

Conclusão

Agora posso fácilmente posso manter meu sistema atualizado, mantendo a base do sistema com alto desempenho e sólida, e nesse esquema de sistema híbrido pretendo ficar um bom tempo. Talvez fazer nova residência no gentoo.

Até mais, Fábio.





Estourando Pilhas

4 12 2006

Por mais que isso possa parecer um passatempo, de um programador sem ter muito o que fazer, resolvi fazer mais um comparativo entre linguagens de programação, levando em conta, desta vez, quantas execuções recursivas, cada uma executaria antes de termos o famoso Stack Overflow, ou estouro de pilha.

A justificativa desse comparativo vem do desenvolvimento do Anatro Livre, que entre suas as suas funções deve rotular uma imagem, esta função como foi dito no link, nada mais é que um função recursiva, que percorre a imagem procurando por um pixel preto e a partir deste, vai achando os vizinhos também pretos recursivamente.

Em umas das primeira implementações, usando Java, imagens grandes (2000×2000) não conseguiam ser executadas retornando um estouro de pilha, eis que resolvi, como um projeto a parte, testar quantas execuções são possíveis de se realizar com uma função recursiva simples, em cada linguagem de programação, até gerar um estouro de pilha.

Primeiro com uma algorítmo extremamente simples:

int funcao teste(int n){

escreve(n)
teste(n+1)

}

teste(0)

Consegui alguns resultados parciais:

Linguagem Execuções
Haskell Infinito
Perl 2210218
C++ (gcc) 524073
Pascal (tzim) 199736
C#,J#,VB.Net(VS2003) 43034
Java 10281
Bash 7472
C++(VS2003) 4776
Pascal (tp) 3966
Python 999
C++ (Visual C++) 563

 

Talvez algum dia desses eu perca algum tempo procurando as razões de cada um desses resultados, mas o que me agradou muito foi o Haskell que por mais tempo que eu deixasse rodando o programa, não houve aumento de consumo de memória.

Estou programando para, talvez não todas essa linguagens, fazer testes mais complexos, com estruturas mais complexas. Mas isso fica pra depois das provas!

Uptdate : Troquei a ordem na tabela de resultados para decrescente.
Uptdate2 : Adicionei os resultados que o Daniel Abrunhosa mandou nos comentários.