IRPF 2011 no Linux: As informações do recibo foram corrompidas após sua gravação, no registro MC

Em 2010, eu havia falado sobre um problema ao tentar imprimir o recibo da declaração do imposto de renda no Linux.

A nova versão do programa continua com o mesmo erro, e desta vez além de corrigir os caracteres inválidos, foi preciso salvar o arquivo usando outra codificação: utf8.

Vou repetir os passos aqui pra facilitar:

  1. abrir o arquivo .REC dentro de ~/ProgramasRFB/irpf2010/transmitidas
  2. trocar caracteres inválidos (geralmente representados por um símbolo com uma interrogação)
  3. garanta que a quebra de linha seja no formato unix (update 1/04/12, dica do Marcelo)
    • no vim: set fileformat=unix
  4. salvar usando codificação (encoding) UTF-8
    • usando o gedit: Arquivo > Salvar Como (ou Shift+Ctrl+S) e selecionar a codificação UTF-8
    • usando o vim: set fileencoding=utf-8 | w

Feito isto tente imprimir novamente.

Publicidade

python-chuck-norris: powerful assertions

If your python project is in trouble, the deadline is close and you are unable to make your tests pass, wait no longer, Chuck Norris will help you out.

Just install python-chuck-norris package on pypi:

sudo pip install python-chuck-norris

Or directly from the Github project:

git clone git://github.com/ricobl/python-chuck-norris.git
cd python-chuck-norris
sudo python setup.py install

Then just use Chuck’s powerful assertions to make your tests pass, like this:

import chuck
def test_chuck_power():
    chuck.assert_true(False) # passes
    chuck.assert_true(True) # passes
    chuck.assert_true(None) # passes
    chuck.fail() # raises RoundHouseKick exception

Formatação de data na língua local no Python

Outro dia um amigo que trabalha com Java e está aprendendo Python perguntou como formatar uma data no Python usando a língua local. Fiz algumas tentativas na hora mas não consegui ajudá-lo.

Mas isso me incomodou, e na tentativa de salvar uma boa alma do Java, tentei novamente e encontrei a solução:

import locale
from datetime import datetime
locale.setlocale(locale.LC_TIME, 'pt_BR.utf8')
print datetime.now().strftime('%A %d de %B de %Y, %H:%M:%S')

É preciso que o locale escolhido esteja instalado no sistema, há um comando para encontrar os locales disponíveis:

locale -a

Links úteis:

Instalando python-lxml e coverage no Ubuntu

Uma referência para mim mesmo (e para quem possa interessar), alguns módulos do python são compilados e para isto precisam das suas extensões em C.

Alguns deles são o lxml e o coverage.

Para instalar o lxml:

sudo apt-get install cython libxml2-dev libxslt1-dev
sudo pip install lxml

Para o coverage:

# Se ainda não instalou o cython
sudo apt-get install cython
sudo pip install coverage

Desativando animações no jQuery (jQuery.fx.off)

Animações em Javascript usando o jQuery podem ser muito interessantes, mas dificultam um pouco ao escrever testes, é preciso usar setTimeouts ou outras artimanhas que normalmente não estão no foco do que se deseja garantir ao escrever um teste.

Em busca de uma solução para este problema, descobri que se pode desabilitar completamente as animações no jQuery usando a propriedade jQuery.fx.off:

jQuery.fx.off = true;

Desta forma, qualquer animação atingirá imediatamente o seu estado final, sem que seja preciso mudar a sua implementação.

Desabilitando as animações e removendo as chamadas de setTimeout em uma suite de 47 testes, reduzi o tempo de execução de 6 segundos para 800 milisegundos e, mais importante ainda, me livrei de resultados intermitentes rodando os testes.

Instalando nodejs e npm no Ubuntu sem sudo

O npm, instalador de pacotes do nodejs, recomenda que não seja instalado usando sudo, pois você acabaria instalando código de terceiros, com livre acesso ao seu sistema de arquivos.

É mais fácil instalar o npm sem sudo se o próprio node também for instalado assim.

Instalando o node sem sudo (fonte):

# Clone do projeto
git clone http://github.com/ry/node.git
cd node
# Cria e configura o prefixo que será usado no script de instalação
mkdir ~/opt
export PREFIX=~/opt
# Instala sem sudo
./configure
make
make install
# Adiciona o novo bin ao path (onde ficará o executável do node)
echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc

Eu estava tomando o erro abaixo ao tentar instalar o npm:

TypeError: Object #<an EventEmitter> has no method 'on

Então encontrei este post sugerindo a instalação de algumas bibliotecas:

sudo apt-get install g++ curl libssl-dev apache2-utils

Feito isto basta instalar o npm:

curl http://npmjs.org/install.sh | sh

Desligar caps-lock automaticamente no Vim

Estou usando o Vim mais a cada dia e existe algo que vem me incomodando há algum tempo.

Para escrever trechos em maiúsculas, gosto de ativar o caps-lock e quando saio do modo de edição para o modo de comando as maiúsculas têm funções diferentes, então, por exemplo, ao invés de descer uma linha com o j eu executo a junção das linhas com o J.

Pensando nisso busquei uma maneira de desativar o caps-lock sempre que sair do modo de edição. Então encontrei este exemplo usando o módulo python virtkey.

Fiz um pequeno script e utilizei no meu vim.

Muita gente prefere desabiltar o caps-lock no sistema, mas este não é o meu caso.

jQuery.dominator – Criação de elementos usando seletores

Sempre achei um pouco chato criar elementos no DOM usando Javascript, não gosto da idéia de escrever HTML no meio de script e o uso de templates também não me agrada muito.

Então tive a idéia de criar elementos usando seletores CSS e assim nasceu o jquery.dominator, um plugin para jQuery. O código com testes usando QUnit está disponível no meu Github.

Foi um projeto legal de se desenvolver, tive alguns problemas para implementar recursos mais complexos mas tomei por base (copiei) o funcionamento do Sizzle e do jQuery e adaptei (roubei) alguns trechos, isso garantiu a compatibilidade entre os browsers.

Segue alguns exemplos de uso:

// Tags simples
$.dominator('p'); // <p></p> $.dominator('div'); // <div></div> $.dominator('div p'); // <div><p></p></div> $.dominator('div p span a'); // <div><p><span><a></a></span></p></div>
// IDs, Classes
$.dominator('div#myid'); // <div id="myid"></div> $.dominator('div p#myid'); // <div><p id="myid"></p></div> $.dominator('div#myid p'); // <div id="myid"><p></p></div> $.dominator('#myid'); // <div id="myid"></div> $.dominator('div.myclass'); // <div class="myclass"></div> $.dominator('div.my-class'); // <div class="my-class"></div> $.dominator('div.my_class'); // <div class="my_class"></div> $.dominator('.myclass'); // <div class="myclass"></div> $.dominator('div.first.second'); // <div class="first second"></div>
// Múltiplos seletores (paralelos)
$.dominator('div, p'); // <div></div><p></p> $.dominator('div#id, p.class a'); // <div id="id"></div><p class="class"><a></a></p>
// Atributos $.dominator('a[title=simpletitle]'); // <a title="simpletitle"></a> $.dominator('a[title=With Space]'); // <a title="With Space"></a> $.dominator('a[title=With,Comma]'); // <a title="With,Comma"></a> $.dominator('a[title=With#Hash]'); // <a title="With#Hash"></a> $.dominator('a[title=With.Dot]'); // <a title="With.Dot"></a>
// Variáveis
$.dominator('a[rel=${myvar}]', {myvar: 'myvariable'}); // '<a rel="myvariable"></a>' $.dominator('a[rel=${myvar}]', {myvar: 'My Variable'}); // '<a rel="My Variable"></a>' $.dominator('a[name=${myvar}]', {myvar: 'myvar'}); // '<a name="myvar"></a>' $.dominator('a[name=${myvar}]', {myvar: 'My Variable'}); // '<a name="My Variable"></a>'

Se for útil pra você deixe um recado. Também gostaria de idéias para melhorar o plugin!

Frix – Framework em PHP

Coloquei no meu Github o Frix, um framework em PHP baseado no Django (em Python).

Sempre vi um pouco de dificuldade em vender projetos com Django, os clientes costumam ter uma hospedagem que não suporta Python e oferecem resistência em trocar, ou têm receio de investir em uma solução que usa uma linguagem “exótica”. Pensando nisso, há algum tempo atrás desenvolvi o Frix, tentando aplicar algumas boas idéias do Django no PHP.

O projeto foi pouco utilizado e ficou encostado por muito tempo, mas como acredito que existem coisas que podem ser aproveitadas, resolvi liberar o código antes que caísse no meu próprio esquecimento.

Algumas das principais features:

  • Admin (scaffolding): criar, listar, editar e remover objetos:
    • suporte a hierarquia (árvores);
    • ordenação manual;
    • edição de objetos relacionados (inline);
  • Mapeador objeto-relacional: modelos de dados, abstração de consultas:
    • com suporte a MySQL;
  • Roteador de URLs com expressões regulares;
  • Sistema de templates em PHP puro:
    • suporte a herança e blocos;
    • aviso: a performance deixa a desejar;
  • Tratamento de Erros;

Para testar:

  1. clonar o projeto:
  2. git clone git://github.com/ricobl/frix.git
  3. criar o arquivo index.php:
  4. <?
    // Replace the path according to your setup
    require_once('path/to/frix/main.php');
    Frix::start();
    ?>
  5. criar o arquivo config.php:
  6. <?
    $config['DB_URL'] = 'mysql://user:pass@localhost/database';
    ?>
  7. criar o banco de dados no mysql, usando os SQLs das apps para criar as tabelas necessárias.

De qualquer forma, não pretendo manter o projeto, faz algum tempo que não trabalho com PHP e já não o acho mais tão divertido. Um dos motivos que me fez deixá-lo de lado foi a fraca orientação à objetos e dificuldade de instrospecção do PHP.

Gostaria de ouvir as opiniões sobre o framework e mais ainda se alguém achar algum uso para ele ou algum de seus módulos.

IRPF: As informações do recibo foram corrompidas após sua gravação, no registro MC

UPDATE 2011: o problema persiste na nova versão.

Tive esta mensagem ao tentar imprimir o recibo de declaração do IRPF e resolvi o problema corrigindo com um editor de texto os caracteres com acento no arquivo do recibo (.REC) que fica em ~/ProgramasRFB/irpf2010/transmitidas.

A dica é de 2009 mas resolveu o problema,  veio de um comentário do Diego Viegas no blog Ubuntu – Minha Vida.

Como achei em poucos lugares resolvi publicar aqui.