sexta-feira, 27 de abril de 2007

O modo texto

O pessoal que entra no mundo linux logo descobre que as coisas mais animais que dá pra se fazer é através da linha de comando. Porém para a maioria das atividades rotineiras, acaba-se usando ferramentas gráficas para isso.

Usar o OpenOffice.org, navegar com o Firefox, usar o K3B para gravar um CD,.... tarefas comuns, rotineiras e que têm uma solução de interface gráfica, que praticamente dispensa prática ou muitos conhecimentos.

Nos ultimos dias também andei experimentando soluções em modo texto para tarefas comuns. Descobri que o shell por si só é muito mais poderoso do que imaginava. Também experimentei os editores nano e VI Improved (VIM), que são demais.

Têm recusos incomuns à primeira vista, e podem até parecer complicados de se usar, mas depois de mais ou menos uma hora trabalhando com eles já se nota a diferença na velocidade com que se pode realizar as tarefas comuns. E ainda por cima pode-se customizar funcionalidades e recursos de forma a tornar o trabalho mais ágil.

Navegadores de modo texto também são um barato. Experimentei dois: o lynx e o w3m. O Lynx é um clássico, muito bom e com vários recursos. Mas o w3m me surpreendeu. Ele tem suporte a navegação em abas, suporte a várias codificações diferentes, gerenciamento de cookies, recursos de segurança, gerenciador de downloads, 'favoritos' e histórico. Em outras palavras: completo.

Outras coisas que quero experimentar no modo texto são: gravar CD direto pela linha de comando (dizem que é absurdamente mais rápido, e eu não duvido, basta ver a diferença entre o Nero e o K3B); usar o talk para mensagens instantâneas; e o ffmpeg para converter arquivos, como .avi para .mpg.

Talvez esse mundo só fique proibido dos designers, que dependem do GIMP, Inkscape, Blender e Cia, para trabalhar. Mesmo assim, quem sabe realmente usar estes programas afirma que eles são as ferramentas de produção mais eficazes do mercado.

Té+
-----------
keepReading

Uma referência da linguagem C

Eu sempre gostei de referências completas. O problema sempre foi achá-las. E nos últimos dias procurei algo sobre linguagem C.

A idéia surgiu depois de eu ter lido um código-fonte cheio de includes. Me perguntei se era necessário tudo aquilo, e mais importante, quais funções são fornecidas por cada um dos header files.

Ao conferir os próprios arquivos, vi que apesar de bem documentados, eram numerosos e extensos demais. O que eu queria era apenas uma lista. Decidi criar algum algoritmo ou script que criasse essa lista para mim. No entanto, cada arquivo tem um formato interno diferente, o que dificultou (e ainda está dificultando no presente momento) meu trabalho.

Achei algumas referências na internet e gostaria de compartilhá-las, ainda que nenhuma delas me atenda por completo.

Site de Eric Huss

Site da GNU

O site da GNU é mais que um curso completo, porém não aborda todas as bibliotecas, a informação não está organizada da forma que eu queria (como no site de Eric Huss). O site de Eric Huss, por sua vez apresenta-se com uma organização mais agradável, porém a quantidade de informação é muito menor, assim como as bibliotecas abordadas.

Mas, enquanto estudo e crio uma solução (desejo criar um tarball de arquivos html ou xml), as referências acima dão conta da maioria das dúvidas.

PS: Se quiser entender o por quê da linguagem C, leia este texto de Eric S. Raymond.
-----------
keepReading

quinta-feira, 19 de abril de 2007

Conhecendo o linux um pouco mais a fundo

O GNU/Linux tem uma infinidade de comandos e utilitários. Não conheço uma pessoa sequer que conheça todos os comandos. Digitando:
$ echo $PATH;

num console você vê os caminhos onde o sistema busca os programas para executar (geralmente /bin/, /sbin/, /usr/bin/,...). Fui conferir o que existia nestes diretórios e me deparei com uma quantidade muito maior de programas do que eu imaginava.

Digitar man nome_do_comando exibe o conteúdo do manual, mas isso era impensável para milhares de programas. Daí surgiu a idéia de criar um script em shell que fizesse isso por mim. Só que lendo o manual do comando man, vi que ele podia mandar a saída para um navegador. Não conseguia mandar para o firefox, apenas para o w3m, um navegador de modo texto, similar ao lynx.

Após googladas e algumas tentativas frustradas, instalei o pacote groff e o pacote man2html pelo synaptic.

Mais algumas tentativas e voilá. Tinha um script que lia o conteúdo de um diretório e mandava as man pages para um outro diretório, salvando cada uma em um arquivo já no formato html.

Mas como nem tudo são flores, algumas entradas não tinham manual, e resultaram em arquivos vazio.
Dá-lhe outra rodada de shell script para criar uma rotina que verificasse quais arquivos estavam vazio e os deletassem.

Ótimo. Bastou criar um index.php dentro dos diretórios que gerasse os links. Agora posso ler tranquilamente as várias man pages pelo firefox, da mesma forma com a qual eu leio os manuais do PHP, Java, MySQL, PostgreSQL, Python, Ruby, Guia Foca Linux,... com direito a um lugar no favoritos e tudo mais.

Abaixo seguem os códigos de shell script que usei.


exporta_manual
#!/bin/bash
#
#autor: Davis Leandro P. Peixoto
#data: 19-04-2007
#script para exportação de manuais

for i in *;
do {
echo Tentando exportar o manual de $i;
man -Thtml $i > /home/user_dir/manual_folder/$i.html;
echo Manual de $i exportado;
};
done;

///////////////////


limpa_vazios
#!/bin/bash
#
#autor: Davis Leandro P. Peixoto
#data: 19-04-2007
#script limpeza de arquivos vazios

count=0;
for i in *;
do {
a=`head -n 1 $i`;
b='';
if [ "$a" = "$b" ];
then
echo apagando $i;
rm -r $i;
echo arquivo apagado com sucesso!;
count=`expr $count + 1`;
else
echo O arquivo $i está cheio e não será apagado;
fi;
};
done;

echo Foram apagados $count arquivos que estavam vazios;
echo Limpeza finalizada com sucesso;

/////////////////////////////////////////


index.php
/* criando um manipulador de diretórios */
$handle = opendir('.');

/* listando o diretório */
while (false !== ($file = readdir($handle))) {

/* e escrevendo os links */
echo "<a href=\"$file\">$file</a>";
}

/* fechando o diretório */
closedir($handle);
?>

////////////////
Nota: os scripts precisam ser executados de dentro dos diretórios (/bin/, /sbin/, etc...)

Té+
-----------
keepReading