Páginas

Wednesday, August 31, 2011

Auto-completar Bash usando chaves { }

Bem, se você usa o terminal mesmo que pouco deve saber que a tecla TAB é usada para auto-completar nomes de arquivos e alguns comandos.

Mas o que você não deve saber é do uso das chaves como forma de construir strings arbitrárias. E mais, se você é como o meu amigo Flávio Amieiro e já sabia disso, aposto que você não sabia que pode usar auto-completar e as chaves {} {} {} {}!!!!

Digamos que estou num diretório assim:


rodolfo@lisa:/tmp/bash-tricks$ ls
foo_ball.egg  foobaz         foo_spam2.egg  foo_spam.egg  hello.c
foo-bar       foo_spam1.egg  foo_spam3.egg  foo.txt

Podemos auto-completar nomes com TAB. Por exemplo, digitar "h" seguido de TAB vai resultar em "hello.c".

Digamos que quero fazer um diff entre foo_spam2.egg e foo_spam3.egg. Uma forma de fazer isso seria digitar o comando completo:

diff foo_spam2.egg foo_spam3.egg


Depois de ler isto aqui, espero que sua forma de fazer seja assim:

diff foo_spam{2,3}.egg

O Bash expande automaticamente tudo que estiver dentro das chaves. Itens são separados por vírgula, sem espaços. Se quiser colocar um espaço ou vírgula na string gerada, escape com uma contra-barra \.

Exemplo:

rodolfo@lisa:/tmp/bash-tricks$ echo O Bash é {legal\,,muito\ poderoso,e\ divertido.}
O Bash é legal, muito poderoso e divertido.

Agora a cereja no topo do bolo! Como gerar uma string como a do exemplo acima a partir dos arquivos num diretório?

Digamos que queremos remover todos os arquivos que começam com "foo".
Começamos digitando:

rodolfo@lisa:/tmp/bash-tricks$ rm f

Agora tecle alt + { e você verá o Bash auto-completar usando a notação de {}:

rodolfo@lisa:/tmp/bash-tricks$ rm foo{-bar,.txt,_{ball.egg,spam{.egg,1.egg,2.egg,3.egg}},baz} 

Fantástico não? Note que você pode apontar para outros diretórios, e fazer combinações arbitrariamente complexas.
Não sei em que parte da documentação isto está, descobri por acaso!

Quer aprender mais? man bash

Decaimento exponencial e lei de potência

Numa aula de Redes Complexas estávamos observando numericamente o que quer dizer que uma função (no caso, uma função densidade de probabilidade) decai exponencialmente ou segundo uma lei de potência.

No caso exponencial temos: E lei de potência:
P(x) ~ e-x P(x) ~ x

Fiz uns gráficos de algumas funções que ajudam a entender um pouco do que está acontecendo. Compare as funções azul e vermelha com a violeta. As duas primeiras são leis de potência com expoente 2,5 e 1,4, respectivamente, que poderiam representar a distribuição de graus de nós em redes livres de escala. A última é uma curva gaussiana, que poderia representar a distribuição de graus de nós em uma rede aleatória.

Num artigo de Barabási e Bonabeau, Scale-free networks, eles dizem que o γ das redes livres de escala está geralmente entre 2 e 3. Já Xu e Chen em The topology of Dark Networks encontram redes com γ entre 1 e 2.

Se olharmos para as funções 1, 2, 3 e 4, notamos que a lei de potência com γ = 5.9 decai mais rápido que a exponencial 4, para as constantes envolvidas. Isto traz à tona o sentimento de que o efeito da cauda longa, ou cauda pesada, fica melhor caracterizado quando γ é pequeno.

Permalink para o gráfico


Update [31/08/2011]
Cometi um erro absurdo acima. A exponencial decai mais rápido. É claro! Se olharmos com um zoom de 10000x no eixo vertical, veremos que as curvas se cruzam e a exponencial se aproxima de zero muito mais rápido que a lei de potência.

Permalink para o gráfico
Apesar do deslize, o sentimento é o mesmo. Ter γ grande implica numa menor probabilidade de coisas "fora do normal" acontecerem, e o fato é que nas redes livres de escala as coisas acontecem.

Tuesday, August 16, 2011

Rede livre de escala

O desafio

Imagine-se como o imperador de um planeta de outra galáxia.



Conseguiu visualizar? Agora, sendo um imperador de um lugar tecnologicamente avançado, você tem uma tarefa pela frente: implantar uma rede de rotas de voo de naves espaciais no espaço aéreo de seu planeta.

Monday, August 1, 2011

Racket com readline


Para quem estava acostumado ao IPython, usar o interpretador do Racket no terminal pode ser um bocado decepcionante.

Isto porque por padrão o REPL é bem rudimentar, sem suporte a auto-completar, sem histórico, sem nada...

O que existe entretanto é um problema com licenças. O readline é distribuído em GPL, e o Racket em LGPL, e para não haver conflitos o suporte a readline vem desativado por padrão. Mas ele está lá.

A documentação em inglês dá os detalhes completos: Readline: Terminal Interaction.
Este módulo vai tornar sua experiência no REPL muito mais agradável, naqueles momentos em que você está no terminal e não quer abrir o DrRacket ou o Emacs.

Para usar basta iniciar o racket assim:

  racket -il readline

E se você não quiser ter que fazer isto toda vez, basta instalar permanentemente o suporte ao readline chamando uma função :D


Pronto. Agora toda vez que executar racket você entratá num REPL com histórico (que lembra inclusive as sessões anteriores), auto-completar usando tab, seta pra cima e pra baixo pra navegar nos comandos, etc.

Para ficar melhor ainda, adicione uma linha no arquivo ~/.inputrc:

set blink-matching-paren on

Esta sugestão do Eli Barzilay faz com que seu terminal indique qual "(" está relacionado com qual ")" quando você digita, e funciona tanto dentro do racket quanto em qualquer outro canto, inclusive no IPython. Também funciona com [] e {}.

E não pára por aí... o REPL vai ficar melhor ainda com o XREPL que vem aí na próxima release.
Com ele será possível fazer coisas já corriqueiras no IPython, agora em Racket.

Happy hacking!