May 11, 2008

Nerd test

Eu acabei de fazer a nova versão do nerd test. Esse foi o resultado:

NerdTests.com says I'm a Nerd King.  What are you?  Click here!

Posted at 22:13

May 10, 2008

Paranóia nunca é demais

Depois que li o livro Unix Backup and Recovery eu fiquei extremamente paranóico com backups. Eu faço cópias de segurança periodicamente para DVDs de boa qualidade além de fazer uma cópia de todo meu $HOME para um disco rígido externo.

Essas medidas, além de me fazerm dormir melhor a noite, protegem meus dados contra possíveis problemas no meu computador. Contudo elas são ineficientes se um desastre maior acontecer onde guardo as mídias (incêndio, inundação, mofo, roubo, queda de meteoro, [coloque aqui sua catastrofe preferida]). E isso pertuba o meu sono :-)

Uma solução prática para isso é enviar as mídias de backup para um lugar seguro. Como eu ainda não achei um lugar para isso na cidade onde moro, resolvi experimentar um serviço de backup online. Para a minha surpresa, a maioria dos serviços que vi é nerd-unfriendly. Esses serviços necessitam de programas gráficos e propietários instalados na maquina do cliente. Esqueça.

O rsync.net é a solução perfeita para os meus problemas. Ele é bem nerd-friendly, tem um suporte ótimo, aceita backups com rsync em um linha encriptada. Além disso os backups podem ser armazenados encriptados.

Posted at 07:51

Mar 03, 2007

Como baixar o seu currículo lattes em XML (nerd edition)

Se você tem seu currículo na plataforma lattes do Cnpq vai ficar contente em saber que agora é possível baixar a versão XML do seu currículo usando a versão on-line da plataforma. A versão off-line foi descontinuada recentemente e a versão para linux ficou muito tempo sem atualizações e correções de bugs (eu enviei vários relatórios de bugs mas nunca recebi uma resposta). A versão em XML do currículo pode ser baixada clicando no icone apropriado na barra de ícones da plataforma lattes:

A vantagem de ter o currículo em XML é que ele pode ser usado como entrada para outro programa, ou você pode criar seus proprios filtros e estilos e fazer uma versão personalizada do currículo para impressão.

Naturalmente é um saco ter que usar o navegador e clicar diversas vezes para fazer uma coisa tão simples como baixar um arquivo XML. Nesse post eu vou mostrar como baixar seu currículo em XML usando o fantástico curl.

Curl pode ser definido como um navegador internet de linha de comando. Não confunda com navegadores de texto, como Lynx, o curl está para o Lynx assim como o sed está para o vi. Além da ferramenta de linha de comando, existe o libcurl, uma biblioteca com bindings para diversas linguagens como Lisp, Python, PHP, Ruby, C, etc. Nesse post vamos usar a ferramenta de linha de comando e criar um scrip simples em bash. Uma descrição detalhada do curl não cabe nesse post, mas um lugar bom para começar é o tutorial Using cURL to automate HTTP jobs no próprio site do curl. Com o curl é possivel criar scrips para fazer coisas como se logar na amazon e baixar sua lista de desejos, enviar (postar) figuras para wikis, etc.

Para poder baixar o currículo em XML é necessário se logar na plataforma lattes e preencher um formulário com cpf e senha. O código abaixo cuida dessa tarefa:

function site_login {
    curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" \
        -d "sub=Confirma&opcao=lattes&cpf=${cpf}&senha=${senha}" \
        -k -e ";auto" \
        -b "imp=cnpqrestritos ; path=/; domain=.cnpq.br" \
        -c $tmpdir/cookie.txt\
        -o $tmpdir/login.html \
        "https://wwws.cnpq.br/sigef_imp/owa/pservicos.entrada"
}

Algumas páginas não funcionam direito em certos navegadores, ou funcionam diferentemente para programas que baixam páginas, como o spider do google. A flag -A diz para o servidor que quem está acessando a página é o Mozilla. A opção -d tem as opções para o formulário de login , com duas variáveis para cpf e senha, respectivamente. A opção -k aceita os certificados de segurança do site. A página de login tem uma complicação, ela gera cookies via javascript. O curl tem como lidar com cookies automaticamente com a opção -c, mas nesse caso tivemos que criar o cookie na mão com -b. A página de login será armazenada no arquivo login.html (flag -o). Finalmente, o último argumento indica a página de login.

O código para baixar o XML pode ser visto abaixo. As opções -c e -b lidam com os cookies e a opção -e envia a informação de "página de referência" (Referer Page) para o servidor, já que essa página torna isso obrigatório. Ou seja, se você copiar a (última) url diretamente no seu navegador não vai funcionar porque teria que ter acessado a url logo depois de -e primeiro. Felizmente o curl cuida disso automaticamente. Finalmente, observe que as páginas usam uma variável id.

function baixa_pagina {
    curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" \
        -e "http://plsql1.cnpq.br/curriculo/pkg_menu.menu?f_cod=${id}" \
        -c $tmpdir/cookie.txt -b $tmpdir/cookie.txt \
        -o lattes.zip \
        "http://plsql1.cnpq.br/curriculo/pkg_xml.recupera_xml_cv?f_cod=${id}"
}

Para obter o id você precisará se logar na página do cnpq usando um navegador comum. Quando você se loga, a url mostrada é http://plsql1.cnpq.br/curriculo/gn_seg.inicio. Essa página usa frames, então se você clicar com o botão direito no meio da página e escolher "this frame", e "show only this frame" vai ver que a url muda para algo como http://plsql1.cnpq.br/curriculo/pkg_menu.menu?f_cod=K3912383Z3. O código K3912383Z3 é o seu id (é claro que esse não é o meu id ;-) Naturalmente existem diversas maneiras de achar o seu id, essa é uma delas.

Eu sugiro colocar as informações de senha e cpf em um arquivo separado (como ~/.lattesrc) com permissão 600. O arquivo deve ter o seguinte formato (sem espaço antes e depois do =):

id=K3912383Z3
senha=foobar
cpf=75687344611
Então é só criar uma função para ler essas informações (pase_init). O script completo pode ser visto abaixo:
#!/bin/sh

initfile=~/.lattesrc
tmpdir=/tmp

function parse_init {
    if [ -f $initfile ]
    then
        source $initfile
    else
        echo "Arquivo ~/.genos não existe, por favor crie um arquivo com os dados:"
        echo "usuario="
        echo "senha="
        exit
    fi
}

function site_login {
    curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" \
        -d "sub=Confirma&opcao=lattes&cpf=${cpf}&senha=${senha}" \
        -k -e ";auto" \
        -b "imp=cnpqrestritos ; path=/; domain=.cnpq.br" \
        -c $tmpdir/cookie.txt\
        -o $tmpdir/login.html \
        "https://wwws.cnpq.br/sigef_imp/owa/pservicos.entrada"
}

function baixa_pagina {
    curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" \
        -e "http://plsql1.cnpq.br/curriculo/pkg_menu.menu?f_cod=${id}" \
        -c $tmpdir/cookie.txt -b $tmpdir/cookie.txt \
        -o lattes.zip \
        "http://plsql1.cnpq.br/curriculo/pkg_xml.recupera_xml_cv?f_cod=${id}"
}

parse_init && site_login && baixa_pagina

Uma vantagem dessa abordagem é a separação das informações sensíveis (senhas, etc) e o script em si. Eu não achei um jeito simples de fazer o script achar o id automaticamente. Isso é desejável já que o script não está plug and play, ou seja, se você executá-lo agora ele não vai rodar porque não tem o seu id. Você terá que descobrir o id primeiro. Não é impossível fazer com que o script faça isso automaticamente, mas fica para depois. De qualquer forma, tendo visto qual o seu id você pode baixar seu currículo lattes em XML diversas vezes. Agora só falta eles implementarem a possibilidade do sistema on-line poder importar o currículo no formato XML.

Posted at 12:10

Feb 26, 2007

Pretty lambdas

Um recurso interessante do emacs é a capacidade de mostrar um texto de maneira diferente do que foi escrito. Um exemplo óbvio disso é para mostrar versões WYSIWYG de documentos de marcação como o LaTeX. Outro uso interessante é para mostrar o caractere lambda no lugar do nome "lambda". Por exemplo, se eu digitar a função abaixo:
lambda1

no momento que eu terminar de digitar "lambda", o emacs vai mostrar o caractere lambda no lugar. Isso é útil para deixar o código mais limpo e ocupar menos espaço.
lambda1

Tudo o que é preciso fazer é usar a função pretty-lambdas abaixo:

(defun pretty-lambdas ()
  (font-lock-add-keywords
   nil `(("(\\(lambda\\>\\)"
          (0 (progn (compose-region (match-beginning 1) (match-end 1)
                                    ,(make-char 'greek-iso8859-7 107))
                    nil))))))

E "conectar" essa função com os modos desejados:

  (add-hook 'emacs-lisp-mode-hook 'pretty-lambdas)
  (add-hook 'lisp-mode-hook 'pretty-lambdas)

Posted at 16:13

Jan 31, 2007

Emacs e Rails

E agora para algo completamente diferente, dois vídeos mostrando recursos do emacs para Ruby on Rails. Vale a pena ver mesmo se você não usa emacs ;-)

O primeiro é um vídeo com áudio e mostra alguns recursos gerais. O segundo é um screencast (sem áudio) mostrando alguns recursos interessantes para navegar pelo código do Rails.

Posted at 18:15