Páginas

Wednesday, August 31, 2011

Entrevista com r0ml na OSCON 2011

O David Mertz gravou uma conversa com o Robert Lefkowitz, também conhecido como r0ml, e está no YouTube. Eles falam sobre os pensamentos de Lefkowitz sobre Computer Programming Literacy.



Pena que os vídeos estão muito editados/cortados, em algumas partes a conversa se torna pouco natural. Mas de qualquer forma é um papo bem bacana.

E os meus amigos Caike Souza e Henrique Bastos tiraram uma foto com o Robert na OSCON em minha homenagem! Muito obrigado!

@201 this is for you, my friend! #oscon /cc @caike @r0ml  on Twitpic

Dark Networks

Resumo do artigo “The Topology of Dark Networks
Jennifer Xu, Hsinchun Chen, The topology of Dark Networks. Communications of the ACM, Vol. 51, 2008.

Introdução

Darks Networks são as redes de organizações terroristas, tráfico de drogas, tráfico de armas, gangues, etc.
Uma rede complexa de grande porte pode ser classificada em três tipos: aleatória, mundo pequeno, e livre de escala. A categorização é feita com base na topologia da rede, e esta é estudada através de estatísticas como comprimento médio de caminhos, coeficiente de clusterização médio, e distribuição de graus.
O artigo faz referência aos trabalhos de Réka Albert e Albert-László Barabási quando afirma que a maioria dos sistemas complexos não são aleatórios, e apresentam propriedades de redes de mundo pequeno e livres de escala. Em seguida, quatro “redes do mal” são estudadas a fim de discutir que propriedades elas apresentam, tentando justificar cada uma delas. São elas: GSJ (rede de terroristas, alguns da Al Qaeda), Meth World (traficantes de metanfetaminas), Gang Network (criminosos de gangues de Tucson, EUA), Dark Web (rede de sites de grupos terroristas).

Tuesday, August 30, 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!