Configurando o encoding padrão no Python

Dica: ao iniciar o desenvolvimento com Python em uma máquina nova, procure pelo arquivo sitecustomize.py e acrescente:

import sys
sys.setdefaultencoding('utf-8')

O arquivo sitecustomize.py é automaticamente executado toda vez que você executa o Python (sim, você pode fazer o que quiser nele…) Ele fica em lugares diferentes dependendo da plataforma e da sua instalação do Python. No Ubuntu, fica em /usr/lib/python2.7/ (trocando 2.7 pela versão que você estiver usando.) As linhas acima configuram o encoding padrão como Unicode UTF-8. Claro, você pode configurar outro encoding como o padrão, se preferir.

Recomendo muito que, se você não entende nada de charsets ou nem sabe do que estou falando, use UTF-8.

Dica de Python: iPython

A maioria dos programadores Python gasta bastante tempo no shell interativo. É onde fazemos debugging e testamos novos módulos. É também nossa calculadora (piada interna, quem lê, entenda.) Muitos programadores não conhecem o iPython, uma versão “vitaminada” do shell interativo. No site há versões para download para Windows e em formato de Python-EGG. Para instalá-lo no Ubuntu, você pode usar os repositórios do APT. Use:

sudo apt-get install ipython

Depois disso, é só chamar ipython no terminal ao invés de python quando quiser usar o shell interativo. Mesmo que você não conheça os truques do iPython, já deve achar muito útil usá-lo. Vai ter um formato de output mais fácil de ler que o do shell interativo padrão, prompts coloridos e autocompletar (pressione TAB)

Além disso, há alguns recursos fáceis de usar no iPython que realmente vale a pena conhecer. Experimento digitar, por exemplo:

import glob
glob?

Experimente também:

glob??

O iPython tem muito mais, mas o que já descrevemos aqui deve ser suficiente par quem vai usá-lo pela primeira vez.

Meu ambiente de trabalho em 7 itens

O Mike me convidou, então lá vai:

1. Ubuntu

O sistema operacional que simplesmente funciona. Meu notebook tem Ubuntu, o da minha mulher e os dos meus filhos também. Todos tem o Windows OEM em dual-boot. Nem me lembro quando foi a última vez que vi alguém bootar o Windows lá em casa. Aqui na Visie o Ubuntu também parece ser o sistema predileto de todo mundo que não tem um Mac 😉

Sem brincadeira, se você desenvolve para um sistema Unix-like, deveria usar um. Você vai ter o mesmo modelo de permissões, a mesma estrutura de arquivos e as mesmas ferramentas na sua máquina e na hospedagem. Você vai ter shell script. Um dia desses resolvemos um problema em um projeto criando um link simbólico para um arquivo. Essa solução roda em nossos servidores e em nossos desktops.

2. Git

Ainda encontro muitas empresas por aí que não usam controle de versão. Pode parar de rir, estou falando sério. Eu não entendo como alguém pode escrever software sem um bom sistema de controle de versão distribuído.

3. web2py

O framework de desenvolvimento web mais produtivo que eu já achei.

4. Vim

Vim não é fácil, e deve ser mantido fora do alcance de crianças e animais domésticos. Mas é o editor de código mais rápido do planeta. Extremamente poderoso, indispensável para o bom programador.

5. Firefox e Firebug

O desenvolvimento de HTML, CSS e Javascript se divide em duas eras: antes e depois da Firebug.

6. OpenDNS e Dnsmasq

Nós até conseguimos comprar boas conexões aqui no Brasil. Mas os serviços de DNS de todos os provedores que eu conheço são uma piada.

7. Terminator

Com o Terminator posso dividir uma janela em vários terminais, em abas. Para quem usa vim e muito shell, é uma mão na roda.

E eu vou convidar:

Diego Eis, Ederson Peka, Luciano Motta, Mauro Baraldi, Leandro Lima e Pedro Rogério.

Dica de Ubuntu: desktop-webmail

Toda vez que você clica num link de e-mail o Firefox abre o Evolution? Acesse “Editar”, “Preferências”, “Aplicativos” e procure na lista por “mailto:”. Escolha “Gmail” e pronto. Sempre que você clicar num link de e-mails com o Firefox, ele vai abrir o Gmail.

Mas você pode se deparar com links de e-mail fora do Firefox, em outros lugares do sistema operacional. Por exemplo, um ícone mailto: no Desktop. Para fazer o seu Gnome sempre usar o webmail, instale:

apt-get install desktop-webmail

Em seguida acesse, no menu “Sistema” do Gnome, “Preferências”, “Aplicativos preferenciais”. Na primeira aba, abaixo do navegador preferencial, está o programa de e-mails. Deve estar selecionado o Evolution. Escolha o “Desktop Webmail”:

Configurando o Gnome para usar o desktop-webmail

Ao clicar pela primeira vez em um link de e-mail, será exibida a seguinte janela:

desktop-webmail

Você poderá escolher que webmail usar e o link será aberto nele. Se você desmarcar a caixa “Ask again” ele vai abrir diretamente o webmail da próxima vez que você clicar num link de e-mail.

Além disso, você pode abrir a tela de envio de e-mail a partir de um terminal (ou de dentro de um shell script) usando:

xdg-open mailto:email@example.com

notify-send: Notificações do Gnome em seu shell script

Você pode disparar notificações do Gnome a partir de um terminal usando o programa notify-send. No Ubuntu, para instalar, faça:

sudo apt-get install notify-osd

Feito isso, você pode chamar:

notify-send "Hello world"

Gnome notify-send

Cada notificação pode ter um título e um texto. Você passa os dois como parâmetros, assim:

notify-send "Hello again..." "Here goes the message"

Gnome notify-send

Você também pode incluir um ícone em suas notificações, usando o parâmetro -i, assim:

notify-send -i /home/elcio/Imagens/alerta.png "And again..." "Now with an icon."

Gnome notify-send

Além de incluir suas imagens, você pode usar os ícones do Gnome:

notify-send -i important "And again..." "Did I get some importance?"

Gnome notify-send

Para obter uma lista dos ícones disponíveis, dê uma olhada no diretório /usr/share/icons/gnome/48×48.

Palestra Diferente

Muitas vezes eu usei esse espaço para convidá-los a assistir palestras minhas em hotéis, teatros, faculdades e outros auditórios Brasil a fora, falando das mais diversas facetas do desenvolvimento web. Desta vez, quero convidá-lo para me ver numa palestra diferente:

A Presciência da Bíblia no livro de Daniel

Esqueça as baboseiras que você recebeu por e-mail sobre Nostradamus e o 11 de Setembro. Estamos falando de algo concreto aqui, de um livro escrito há 2.500 que prediz, de maneira praticamente inequívoca, séculos de acontecimentos históricos. Vamos analisar as evidências históricas e você vai entender porque eu, que era cético, passei a acreditar na Bíblia.

Onde:
No auditório da Igreja Adventista do Sétimo Dia de Americanópolis.
Rua Austrália, 230, São Paulo
A dez minutos do metrô Jabaquara.
mapa
Quando?
Amanhã, 23/01/2011, às 19h
Quanto?
Grátis

Vou usar como argumentos, ao invés de dogmas e imposições, a lógica e um pouco de matemática aliadas aos fatos históricos. Ao final, me diga o que achou.

.

Dica de Gmail: atalhos de teclado

Dica básica, mas como ainda encontro muita gente que não sabe: o Gmail possui atalhos de teclado que permitem fazer muita coisa sem usar o mouse. Para ligá-los, acesse “Configurações” (ou “Settings” na versão em inglês) no menu superior direito, e na aba “Geral”, que já deve ser a que estará aberta, procure o título “Atalhos de teclado” (“Keyboard shortcuts”).

Uma vez ligado o recurso, o principal atalho que você precisa conhecer é o ponto de interrogação (“?”) que mostra uma tela de ajuda com a lista de atalhos de teclado. Com essa lista você pode ir aprendendo aos poucos, conforme melhora seu uso do Gmail.

Rodando Google Gears no Ubuntu 10.10 (Maverick) 64bits

Se você, como eu, usa Ubuntu 64bits e se viu privado de usar o Gmail Offline ao migrar para a versão 10.10 (Maverick), aqui está a solução: instale o pacote do Google Gears da 10.04 (Lucid).

Baixe aqui: xul-ext-gears_0.5.36.0~svn3423+dfsg-0ubuntu1_amd64.deb.

XML não é a resposta 2: parsing

Em meu último post sobre esse assunto, expliquei porque prefiro, na maioria dos casos, usar um formato de descrição de dados como JSON ao invés de XML. Infelizmente, parece que nem todo mundo concorda comigo, e há uma porção de dados úteis disponíveis apenas em XML. O que não é um problema, certo? Do que eu estou reclamando? Os dados estão lá, disponíveis publicamente, muitos de graça, e eu aqui reclamando do formato?

Vamos dar um jeito e ler XML!

A maneira óbvia parece ser usar um parser de XML, e é o que eu faço na maioria dos casos. Toda linguagem e ambiente de desenvolvimento hoje possuem bons parsers de XML para você escolher. Mas nem sempre o parser de XML é a melhor solução.

Vamos tomar como exemplo o retorno do rssWeather.com:

http://www.rssweather.com/wx/br/sao+paulo+aeropor-to/rss.php

A resposta é um RSS com uma tag content:encoded, contendo uma seção CDATA com um trecho de HTML. Você vai ter que fazer duplo parsing se quiser as informações de dentro desse HTML. Ou pode adotar uma solução assim:

import urllib2,re
url='http://www.rssweather.com/wx/br/sao+paulo+aeropor-to/rss.php'
xml=urllib2.urlopen(url).read()
data=dict(re.findall('<dt.*>(.*)</dt><dd.*> ?(.*)</dd>',
        xml.replace(':','').replace('&#176;','\xc2\xb0')))

Cinco linhas de código. Dê uma olhada no retorno disso:

>>> data
{'Barometer': '1028 mb', 'Wind Speed': '10 KMH', 'Dewpoint': '15\xc2\xb0C', 'Wind Direction': 'SSE (160\xc2\xb0)', 'Visibility': '6 km', 'Humidity': '93%', 'Wind Chill': '15\xc2\xb0C', 'Heat Index': '16\xc2\xb0C'}
>>> for i in data.iteritems(): print '%s => %s' % i
... 
Barometer => 1028 mb
Wind Speed => 10 KMH
Dewpoint => 15°C
Wind Direction => SSE (160°)
Visibility => 6 km
Humidity => 93%
Wind Chill => 15°C
Heat Index => 16°C

É importante entender os riscos que estamos assumindo ao adotar essa solução. Se o formato desse HTML for ligeiramente modificado, nosso código pode parar de funcionar. Neste caso, como os dados estão em HTML dentro do XML, isso não é uma desvantagem, porque você teria o mesmo tipo de problema usando um parser SGML.

Será que conseguimos a mesma simplicidade lendo HTML?

import urllib2
url='http://www.bancocentral.gov.br/'
html=urllib2.urlopen(url).read()
dados=html.replace(',','.').split('')[0].split('\r\n')[-7:]
dados=map(float,(dados[0].strip(),dados[3].strip()))

Veja o retorno:

>>> print 'Compra: %.4f, Venda: %.4f' % tuple(dados)
Compra: 1.7784, Venda: 1.7792

XML não é a resposta

Não me entenda mal, XML é uma idéia interessantíssima, pela qual sou apaixonado. Tenho dado aula de XML, escrito HTML como XML válido, publicado e consumido dados em XML, acompanhado as iniciativas de Open Data e RDF no W3C.

O problema é que, enquanto alguns mercados subutilizam XML, tornando o intercâmbio de dados muito complexo, outros exageram no uso. XML não é a panaceia da troca de dados.

Há, por exemplo, uma porção de sistemas que usam XML como arquivos de configuração. Isso torna complicado o trabalho de editar esses XML, e na maioria dos casos torna complicado o parsing disso para rodar o sistema.

Veja um breve exemplo: a busca do Twitter está disponível em três formatos, HTML, ATOM e JSON. Teste a busca a seguir nesses três formatos (veja a diferença nas URLs):

http://search.twitter.com/search?q=%40elcio (HTML)

http://search.twitter.com/search.atom?q=%40elcio (ATOM)

http://search.twitter.com/search.json?q=%40elcio (JSON)

A maneira como o Twitter publica suas buscas é inspiradoras. O formato ATOM servirá para leitores de feeds e para aqueles programadores que adoram escrever parsers XML. E para o resto do mundo, temos JSON. Veja como consumir a URL JSON e obter dados nativos no Python:

import json,urllib2
url='http://search.twitter.com/search.json?q=%40elcio'
dados=json.load(urllib2.urlopen(url))

A dica então é se perguntar se XML é necessário e, se não tiver um bom motivo para usá-lo, trabalhar com JSON, YAML ou, quem sabe, um arquivo de configuração declarando variáveis em sua própria linguagem.

Servindo vídeos Ogg Teora com o Content Type correto

Semana passada participei de um curso sobre HTML5 ministrado pela w3c Brasil. Nesse curso o Elcio Ferreira foi o instrutor, eu fiquei com uma duvida e fiz uma pergunta para ele sobre a necessidade de incluir a extensão do arquivo na tag <video> para que o mesmo funcione no firefox. Ele me mostrou uma forma utilizando PHP mas infelizmente não consegui obter o codigo.

Os servidores web, quando servem um arquivo, enviam ao navegador a informação de tipo de conteúdo. O header enviado do servidor, para um arquivo Ogg Vorbis, deve ser:

Content-type: application/ogg

Se o servidor não enviar esse header, o vídeo não vai tocar no Firefox. O Apache sabe fazer sozinho, basta que esteja configurado para isso. No Ubuntu, por exemplo, ele já vem configurado para servir ogg.

A saída de scripts PHP é servida com outro tipo de conteúdo. Geralmente “text/html”. Se você serve seu vídeo do PHP, precisa enviar um header no início do script avisando o navegador que esse conteúdo é vídeo. Você pode fazer:

<?php
header('Content-type: application/ogg');
?>

Já se você serve os vídeos como arquivos estáticos, não deve usar PHP para processá-los só para que sejam servidor com o tipo correto. O jeito certo é configurar corretamente o servidor. Se for um hosting compartilhado, eu tentaria um chamado ao suporte pedindo para que configurem isso corretamente antes de fazer com PHP. Ou estudaria mudar de hosting 😉

Amanhã, Café com Browser sobre HTML5

Durante esta semana estive no escritório do W3C Brasil, ministrando um treinamento de HTML5. Para encerrar o treinamento, o W3C organizou uma edição do Café com Browser.

Nós e o pessoal da Agência Click vamos mostrar um pouco do que já estamos fazendo com HTML5, e você pode assistir ao streaming ao vivo, cujo link será disponibilizado na hora.

Para tuitar, use a tag #cafecombrowser.

Codificar vídeo no Linux para iPod, iPhone, Android, PSP, etc? Transmageddon

O vídeo possui duas ferramentas fantásticas para a conversão de vídeo: ffmpeg e mencoder. Mas são ferramentas de linha de comando e nada fáceis de usar. Veja, por exemplo, como ripar DVDs para DivX com mencoder. Se a origem, ao invés de um DVD, for um arquivo mpeg, isso tudo muda bastante. Se a saída, ao invés de DivX, for mp4, muda bastante também.

Conheci recentemente o Transmageddon, ferramenta fantástica. Veja um screenshot:

Transmageddon

Se você clica em “Pré-definições”, por exemplo, veja a lista que aparece:

Transmageddon

Serve para quase tudo o que você pode querer fazer convertendo vídeo. Sem dor. Vale a pena experimentar.

Parallel Python

Embora seu computador possa ter dois, quatro, oito ou até dezesseis núcleos de processamento, o Python só usa um deles de cada vez (mesmo trabalhando com threads). Parallel Python resolve o problema. Um exemplo simples, para você entender como funciona:

ppserver = pp.Server(ppservers=())
job1 = ppserver.submit(funcao_demorada, (), (), ())
job2 = ppserver.submit(funcao_demorada, (), (), ())
print job1()+job2()

Os quatro argumentos do método submit são: a função que será executada, os argumentos passados a ela, as funções que ele pode chamar e os módulos dos quais ela depende. Veja um exemplo de como chamar com esses parâmetros:

ppserver = pp.Server(ppservers=())
job1 = ppserver.submit(funcao_demorada, (44,), 
                        (sub_funcao,), ("sys","math",))
job2 = ppserver.submit(funcao_demorada, (25,),
                        (sub_funcao,), ("sys","math",))
print job1()+job2()

Divirta-se!

Desafio de programação: resolvendo Lights Off

Fiz essa versão do clássico joguinho Lights Off:

O jogo é simples, e o objetivo é apenas apagar todas as luzes. Por curiosidade, fiz também o algoritmo que resolve o jogo:

O desafio está lançado. O primeiro que colocar nos comentários a URL de uma página com um botão “solve” como o meu ganha uma entrada para o Codeshow. Importante:

  1. Vale o primeiro comentário. Mesmo que você comente de madrugada e eu demore a moderar, ganha quem comentar primeiro.
  2. O solucionador tem que ser escrito em Javascript. Você pode copiar minha versão do jogo e desenvolver em cima dela.
  3. Não pode resolver na base da tentativa e erro. Tem que ser uma boa solução, que resolva qualquer estado do tabuleiro em 20 passos ou menos.

Divirtam-se!

(O pessoal da Visie, se quiser participar, pode. Só não vai ganhar nada ;-))