Shell Script engraçadinho e (quase) inútil
Se você não tiver o comando beep, no debian e derivados: aptitude install beep.

beep -f 288 -l 800 -r 3 -d 50
beep -f 230 -l 800 -r 1 -d 50
beep -f 341,3 -l 300 -r 1 -d 50
beep -f 288 -l 1000 -r 1 -d 50
beep -f 230 -l 800 -r 1 -d 50
beep -f 341,3 -l 300 -r 1 -d 50
beep -f 288 -l 1300 -r 1 -d 50
Strace na prática
Algumas ferramentas de 'baixo' nível são bem úteis de vez em quando. Um exemplo de uma delas é o strace.
Mas o que o strace faz? Da documentação:
In the simplest case strace runs the specified command until it exits. It intercepts and records the system calls which are called by a process and the signals which are received by a process. The name of each system call, its arguments and its return value are printed on standard error or to the file specified with the -o option.
Ou seja, ele intercepta e imprime as chamadas de sistema sendo feitas em um comando. Para mais sobre chamadas de sistema, consulte a wikipédia e leia o excelente artigo do Hugo Augusto. Um exemplo de como isso me foi útil:
Ano passado (segundo, o timestamp do arquivo, dia 03 de janeiro do ano passado), após a atualização no debian unstable do Ricardo (eu e ele usamos o unstable nos nossos desktop, herança do tempo do sarge, que eu considerava muito desatualizado), o computador do Ricardo ficou estranho. O Opera conseguia acessar sites, mas o Firefox não. Após alguns testes, constatamos que o problema era na resolução de nomes. O meu computador não apresentava nenhum desses problemas.
Partimos então pro mínimo caso possível: um simples wge t google.com (Sim, sempre ele...)
Pra encurtar a história, apenas a parte relevante:
O resultado do meu strace:
open("/usr/lib/libnss_mdns4_minimal.so.2", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\v\0\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=8676, ...}) = 0
mmap2(NULL, 11688, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7efb000
mmap2(0xb7efd000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0xb7efd000
close(3) = 0
Basicamente, isso significa ler a biblioteca libnss_mdns4_minimal.so.2 e jogá-la em memória.
No computador do Ricardo:
open("/lib/tls/i686/sse2/cmov/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686/sse2/cmov", 0xbfeedb6c) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/sse2/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686/sse2", 0xbfeedb6c) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686/cmov", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/lib/tls/i686/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/lib/tls/sse2/cmov/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/sse2/cmov", 0xbfeedb6c) = -1 ENOENT (No such file or directory)
open("/lib/tls/sse2/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/sse2", 0xbfeedb6c) = -1 ENOENT (No such file or directory)
open("/lib/tls/cmov/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/cmov", 0xbfeedb6c) = -1 ENOENT (No such file or directory)
open("/lib/tls/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/lib/i686/sse2/cmov/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686/sse2/cmov", 0xbfeedb6c) = -1 ENOENT (No such file or directory)
open("/lib/i686/sse2/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686/sse2", 0xbfeedb6c) = -1 ENOENT (No such file or directory)
(uma parte da saída foi omitida, já que é semelhante o trecho apresentado)
Ou seja, ele procurou a danada em todo lugar e não achou. Logo depois disso, eu copiei a minha biblioteca por ssh pra ele. (O ssh estava funcionando).
# apt-file search libnss_mdns4_minimal libnss-mdns: lib/libnss_mdns4_minimal.so.2
Bastou eu ver em qual pacote estava o arquivo faltoso e instalar no computador do Ricardo. Sobre o Opera, provavelmente usava outra forma ou outra biblioteca par resolução de nomes
Por curiosidade, hoje eu testei o wget.
Ele vai direto em
open("/lib/i686/cmov/libnss_files.so.2", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340\30"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=38412, ...}) = 0
mmap2(NULL, 41624, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7a3d000
mmap2(0xb7a46000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8) = 0xb7a46000
close(3) = 0
munmap(0xb7a48000, 96386) = 0
Resultado: removi o libnss-mdns. Não deu quebra de dependência nenhuma. Está tudo OK.
LinuxChix Brasília 2007
No feriado de Sete de Setembro e no dia 8, aconteceu o 5º Encontro LinuxChix Brasil, aqui em Brasília. O evento foi bem tranqüilo: recebi o meu kit com Linux Magazine, bloco de anotações, caneta e outras coisas mais, logo na entrada. Encontrei o meu camarada Gabriel logo no início, a turma mineira que veio com ele e batemos papos bem bacanas.
Palestras
Assisti a duas palestras sobre geoprocessamento, a "Software livre de Geoprocessamento - I3Geo" (com Ana Gabriela da Silva Ortiz) e "Sistema de Webmapping em plataforma livre: o georreferenciamento como ferramenta de tomada de decisão"( com Marcelo Felipe Moreira Persegona). O I3Geo é um software livre recentemente liberado pelo Ministério do Meio Ambiente e tem um enorme potencial.
Já na trilha banco de dados, teve a palestra do João Cosme sobre replicação de banco de dados PostgreSQL usando o Slony. Mais à tarde, ainda no primeiro dia do evento, teve a palestra do Fernando Ike, com o tema: "HA em PostgreSQL, o Elefante disponível para além do infinito".
Uma das palestras mais interessantes que eu vi no segundo dia foi a do Rubens dicas-l Queiroz, sobre a "Filosofia do Unix". Muitas citações, relatos de histórias engraçadas, uma palestra leve e descontraída. E olha que eu praticamente a assisti sem querer: queria ter visto a palestra "Do minix ao ext4: a evolução de um sistema de arquivos", do 'GNU' Cascardo. Mas fica pra próxima essa 
Em se tratando de programação propriamente dita, assisti à palestra do Kov, sobre TurboGears no primeiro dia do evento, onde ele demonstrou as facilidades do desenvolvimento web com esse framework. Uma palestra que realmente me surpreendeu foi a "JavaScript everywhere: o tesouro escondido e a nova especificação", do Thiago Silva. Apesar de todos as declarações de ódio contra JavaScript que aconteceram nas 'discussões de mesa de bar', eu sou um fã da linguagem, que une uma expressividade muito alta, e vários paradigmas, numa combinação que, a meu ver, é muito interessante e original. Porém, descobri que o Thiago é muito mais fã do que eu. O seu JSTalk é de cair o queixo de qualquer um: uma implementação de um ambiente semelhante ao smalltalk, porém onde a linguagem é JavaScript. Precisa falar mais? Conversamos um pouco ainda sobre a nova especificação, que apesar de ter algumas coisas de que eu não gostei muito, deixará a linguagem ainda mais poderosa. Talvez a palestra mais fraca sobre programação tenha sido a que tratou de Caching em PHP. Mas nem tudo é perfeito, não é?
Embora segurança não seja um tema do meu maior interesse, acabei assistindo a algumas palestras sobre segurança. A primeira, "Aumentando a segurança da autenticação do squid com o LDAP", tratou de mostrar como configurar uma autenticação digest usando o squid, foi bem interessante. Muito boa também foi a palestra "Anti-Spam em um provedor: você vs clientes". Assisti a uma palestra sobre antispam no CONISLI no ano passado, e lembro que foi bem bacana também.
Apesar da falta de tradução da palestra "System Hardening" (o serviço de tradução estava disponível apenas no primeiro dia, mas por causa de problemas de atrasos com o vôo Georgy Berdyshev ele só pôde apresentar sua palestra no segundo dia), foi uma palestra muito boa mesmo. Quando alguém começa a sua palestra dizendo "eu tenho 20 anos e trabalho com software livre há 10", acho que isso deixa o cérebro um pouco desconcertado. Mas o cara demonstrou ser experiente. Pra ser sincero, ante a profusão de temas e lugares para se aumentar a segurança, eu diria que a palestra dele continha apenas os tópicos para um livro ou treinamento de segurança. Foi a última palestra que a assisti.
Conversas e mais conversas
Num evento desses, muita coisa legal acontece que não entra na programação oficial. Nas mesas de discussão, Django, a idéia de fazer um blog em shell script, histórias de novos e brilhantes algoritmos como o reverse() -> append() reverse(), insatisfação com a vida de desenvolvedor web, incluindo a possibilidade de uma nova e inusitada profissão para um deles, muita discussão sobre plone e zope, codificação de um sei lá o que com o gnu barcode e o Cairo, conversas diversas sobre tunning, um vegetariano que não gosta de alface e todo o tipo de piada nerd que apenas um outro nerd consegue rir
. Tenho de dar um pouco de razão ao César Cardoso: as conversas que acontecem nos bastidores são mesmo muito boas!
Quais são os comandos que você mais utiliza no seu Linux?
Link: http://www.chichaplanet.org/
Que tal descobrir isso com uma linha e mandar pra cá?
O comando é:
history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -10
e os meus resultados são:
em casa
142 ls
137 cd
30 scite
30 python2.4
28 python
20 less
16 su
12 grep
7 chmod
6 ssh
No trabalho:
82 python
72 cd
61 ls
45 ruby
36 php5
21 scite
18 time
15 su
15 ssh
15 irb
Quais são os seus?
[update]
Acabou virando um meme mesmo
Como nem todo mundo mandou o trackback pra cá, lá vai a lista:
O post do Dorneles é bem bacana. Além do código orginal, ele mostra uma alternativa em sed, uma em python e algumas dicas de como configurar o histórico e o inputrc
[/update]
