Shell Script engraçadinho e (quase) inútil

23/06/2008

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
 

Email por Walter Cruz em Programação, Geek life
Tags: linux, shell script

Strace na prática

18/02/2008

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.


Email por Walter Cruz em Linux, Debian
Tags: debug, linux, strace

LinuxChix Brasília 2007

11/09/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 :D

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 :D . Tenho de dar um pouco de razão ao César Cardoso: as conversas que acontecem nos bastidores são mesmo muito boas!


Email por Walter Cruz em Bancos de Dados, Eventos
Tags: debian, django, eventos, javascript, linux, php, programação, python

Quais são os comandos que você mais utiliza no seu Linux?

24/05/2007

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]


Email por Walter Cruz em PHP, Python, Linux, Ruby, Meme
Tags: geek, humor, linux

1 2 >>