31 de dezembro de 2008

Cortar o Tempo

Quem teve a idéia de cortar o tempo em fatias,
a que se deu o nome de ano,
foi um indivíduo genial.

Industrializou a esperança, fazendo-a funcionar no limite da exaustão.

Doze meses dão para qualquer ser humano se cansar e entregar os pontos.
Aí entra o milagre da renovação e tudo começa outra vez, com outro número e outra vontade de acreditar que daqui pra diante vai ser diferente.

-- Carlos Drummond de Andrade


FELIZ ANO NOVO

30 de dezembro de 2008

O Segredo do Churrasco


Coisa de 7 anos para cá parece que todo mundo descobriu o segredo de se assar um bom churrasco: apenas jogar sal grosso e nada mais. E esse segredo-oculto-que-todos-sabem é quase sempre evocado quando se faz um churrasco.

24 de dezembro de 2008

CSV em Storm

Publicado na Storm-List:

Dear Storm community

I am pleased to announce the release of easycsv 0.8.0.

Easycsv is a Python module that implements an abstraction layer that permits insert, delete or update data into a database directly from csv files.

Easycsv is implemented on top of the Storm framework.
Easycsv executes csv statements that are rows with special marks into a csv file.

These marks indicate whether its content is meant to be inserted, deleted or updated in the database.

More information can be found at [1].

[1] http://aboutwilson.net/easycsv

--
Wilson Freitas
http://aboutwilson.net

12 de dezembro de 2008

Coisas Legais de Python 3

>>> # Dictionary Comprehension
>>> dc = {i: "bla" for i in range(5)}
>>> print(dc)
{0: 'bla', 1: 'bla', 2: 'bla', 3: 'bla', 4: 'bla'}

***

>>> # Python mais humano: Divisão de inteiros retorna float.
>>> x = 10/3
>>> print(x)
3.33333333333
>>>

Feliz Natal

11 de dezembro de 2008

21 de novembro de 2008

De Casa Nova

Deus seja louvado, compramos uma casinha financiada pela Caixa. Terra-nova.



14 de novembro de 2008

Storm: Duas Maneiras de "find"

O modo convencional de se encontrar um objeto-dado em Storm é:
>>> eduardo = store.find(Client, Client.name == u"EDUARDO WILLIANS").one()
>>> eduardo.city
u'CAMPO GRANDE'
>>>
Mas esses dias descobri que existe outra maneira:
>>> eduardo = store.find(Client, name=u"EDUARDO WILLIANS").one()
>>> eduardo.city
u'CAMPO GRANDE'
>>>
É isso.

13 de outubro de 2008

É um Problema de Solvência, Não de Liquidez

Tradução do artigo "It's a solvency problem, not a liquidity problem" de Mark Shuttleworth publica em 9/10/08. Acrescentou-se as imagens.

O termo "contração do crédito" é uma maquiagem para a atual crise. Ela sugere que o problema é meramente de confiança, que a calma irá retornar se a liquidez for introduzida no sistema.

Minha visão, entretanto, é que questão real é de solvência. Esta é a falência sistêmica de 2008.

Hipotecas são só o começo
Considerando taxas reais de juros, com expectativas reais de uma taxa de retorno razoável, muitos dos acordos feitos desde 2003 simplesmente não fazem sentido econômico. Até agora o foco tem sido apenas uma peça do problema - empréstimos hipotecários ruins -, mas creio que veremos mais áreas do problema se expandindo rapidamente para incluir contratos de capital privado com base em dinheiro gratuito realizados entre 2003 e 2007. Lembro-me de uma afirmação estapafúrdia de um gênio do capital privado de que "todo mundo está correndo para o primeiro negócio de 100 bilhões". Bem, as galinhas estão voltando pra casa para ficar. Espere um avalanche de anúncios de reveses, reestruturações e falências, empresas que foram compradas com dinheiro emprestado e que não conseguirão adimplir seus débitos.

Taxas de juros mais baixas irão apenas aliviar o sintomas
A drástica redução das taxas de juros irão ajudar a diminuir o ritmo com que teremos que lidar com as falências, mas não mudarão a dura realidade da situação, que correm o risco real de tornar as coisas piores por encorajar outra fase de especulação baseada no dinheiro gratuito. Estamos novamente numa situação em que as taxas de desconto dos EUA são efetivamente uma taxa de juros reais negativos, como um presente aos bancos, mas ficar lá por qualquer período de tempo nos coloca novamente num estado de dependência.

Intervenções devem visar capitalização e alavancagem dos bancos, não liquidez
A última ação do Reino Unido de comprar participações de capital é ainda a melhor resposta, eu acredito. Ela melhora drasticamente a capitalização dessas instituições, e mantém o cimo das ações nas mãos do contribuinte (que estão levando a dor e o financiamento do socorro, ao que parece preservando o direito de controle) e ela dilui os atuais acionistas que permitiram que suas instituições se tornassem insolventes. Pessoalmente, eu estaria inclinado a fazer mais do que diluir os acionistas.
Não vejo os atuais 700 bilhões fazerem alguma diferença real para os bancos americanos. Eu esperava que os EUA anunciassem em breve um acordo semelhante ao do Reino Unido, mas os números teriam de ser maiores, assustadoramente maiores. Muito melhor para os EUA fazerem essa jogada que esperar pelos fundos soberanos asiáticos e do Médio-oriental avançarem para dentro da quebradeira.

Depositantes de bancos sob regulação devem ser protegidos pelos governos executores da regulação. Os acionistas não tanto. Detentores de títulos ... talvez.
Acho que os irlandeses e de outros países que tenham garantidos os depósitos dos utilizadores individuais tenham feito a coisa certa. Governos acionam autoridades reguladoras, e bancos anunciam que sob regulação. As pessoas que nomeiam os reguladores têm de defender a abordagem por eles tomadas - eles devem oferecer uma garantia de que suportarão seu produto, e quando isso falhar, eles irão suportar as pessoas que confiaram neles. Depositantes nos bancos do Reino Unido não deveriam se preocupar que o banco possa faltar - esse tipo de anomalia deve, no máximo, afetar a taxa de juros que recebem, não a segurança de seu capital social. Acionistas nesses bancos, no entanto, deveriam estar muito preocupados, de fato. Há uma questão interessante sobre detentores de títulos e depositantes institucionais. De um lado são investidores sofisticados e devem ser responsáveis por suas obrigações. Por outro, estas são as próprias pessoas que podem causar maciço saques nos fundos dos papeis bancários de T-Bills, e portanto é válido mantê-los tranqüilos. Eu os agruparia com os depositantes também.

Compensação dos executivos deve ser estruturada, não fixada
Tem havido uma enorme discussão sobre a limitação aos salários dos executivos. Isso é apenas um convite para exércitos de consultores e advogados e contadores para contornar qualquer limite salarial posto em prática. E francamente, estou pasmado em entender como políticos, que constantemente votam nos próprios salários e maiores gastos, estão qualificados para definir os salários dos executivos dos bancos. Eles efetivamente ESTAVAM encarregados da compensação salarial executiva da Fannie e da Freddie, e que não eram sucesso estelar.
O que eu diria, porém, é que na instituição financeira os ganhos deveriam ser reconhecidos por sete anos apenas, ao longo de um período, e os bônus baseados em ganhos devem ser conservados em depósito até o prazo de sete anos. Imagine se pudéssemos explorar agora os bônus para o banco de investimento dos trabalhadores ao longo dos últimos sete anos, a fim de fortalecer os balanços desses bancos. Isso incluiria as gratificações pagas ao Sr. Fuld, o sr. Greenberg, e o Sr. Greenspan. Alguém se importaria de mostrar os números? Acho que seria importante.

Estou nervoso
A grande questão que estou me perguntando é quais dos lados não possuem minas terrestres? Minha equipe e eu estamos felizes de ter saído de muitos mercados antes da atual onda de medo. Nós entramos em alguns problemas, mas em grande parte nos esquivamos das bolas de canhão. Até aí, tudo bem. Mas o que é que significa ter dinheiro no banco, quando eles próprios não têm? O que significa ter dólares, quando o dólar se desvalorizou de tal modo que ficaria próximo ao Banco Central do Zimbábue? Estes são tempos muito perigosos, e ninguém poderia pensar de outra forma.

20 de setembro de 2008

Para que tantos números: PIS, Matrículas, CTPS??

Se a pessoa está matriculada em alguma faculdade, ela logo recebe um tal RA (registro do acadêmico). Se ela está inscrita no PIS/PASEP, ela recebe um número de inscrição. Se tem conta num banco, recebe números. Se é eleitora recebe um de número do título de eleitor e etc, etc.

Eis o ponto: todos esses números não são necessários. Basta um único: o CPF. No Brasil, o CPF acabou tomando lugar de uma lacuna que havia, a falta de uma ID (identificação) única e segura que permitisse a individualização de cada brasileiro.

O Registro Geral (RG) é um instrumento quase inútil para isso, porque algumas idiotices estragaram o processo. A primeira é da que além da Secretaria de Segurança Pública, outros órgãos, como as forças armadas, também podem emitir cédulas de identificação com números de inscriçãos próprios. Outro absurdo é que uma única pessoa poderia receber mais de uma inscrição no RG caso tivesse que emitir novamente uma "segunda via" ou sabe-se lá. Com múltiplos RGs foi preciso uma tal "data de expedição" para individualizar o RG. E para piorar as coisas cada estado da federação possuía suas próprias ordens de registro, daí a necessidade de se fazer constar o tal "UF" do órgão expedidor.

Resumindo: para chegar perto da individualização seria necessário RG, órgão emissor, UF e  data de expedição.

Então o país necessitava de um órgão nacional que fornecesse um ID único para cada brasileiro. Eis que o Ministério da Fazenda acaba resolvendo o problema. Com técnicas matemáticas e dois dígitos verifadores, criou o CPF.

Hoje, se a pessoa deseja conta num banco, celebrar contratos, comprar, vender, linha de crédito, mover uma ação judicial, ou qualquer outra coisa que diga respeito ao sistema, terá que apresentar seu número de identificação nacional, o CPF.

Bem, se somente o CPF já é o suficiente para tornar cada brasileiro único, por que então se faz novas individualizações em cada instituição em que a pessoa se inscreve? Boa pergunta.

2 de setembro de 2008

Google Chrome

Primeiro julgamento: Google Chrome é mais rápido, mais leve, possui visual mais limpo e é ligeiramente mais intelignte que o Firefox. Diria que a situação do Firefox neste dia passou a ficar menos favorável. Interessante que os quesitos visual e inteligência podem ser facilmente mudados num browser, mas é difícil entender qual arquitetura permite ao Chrome carregar páginas mais rapidamente.

A despeito dele ser open source, foi um golpe duro num dos símbolos do SL, a Fundação Mozilla.

12 de agosto de 2008

Django e Storm

Já faz alguns dias que o James Henstridge anunciou na mailing-list, mas só hoje é que vou noticiar. Minha aspiração a ver a integração entre Storm e Django ecoou lá fora: Using Storm With Django.

7 de junho de 2008

Python Up


Deu no Tiobe:

Python deu um "up" em maio e subiu 1.74%, o maior crescimento do período, galgando com isso a 7ª posição no ranking. Há cerca de dois meses eu apostava com o Andrews que isso iria acontecer em razão do Google App Engine -- são Google mostra o caminho das pedras.

E o que isso quer dizer? Que a Via-Python é um caminho sem volta, ao menos pelos próximos 10 anos, e que investir em Python hoje é o caminho mais seguro para um futuro de curto e médio prazo. A empresa que o fizer, não vai correr o risco de terminar com um Cobol no mainframe por um bom tempo -- isso se não conseguirem inventar, amadurecer e propagar uma linguagem melhor que Python.

A parte disso, infere-se que a despeito de todo o dinheiro que suporta Visual Basic ou Java (nada de errado nisso), a meritocracia das tecnologias livres assumem posição de destaque no mundo cibernético em transformação. A corporação que não se atenta a mudanças e não se antecipa, começa a definhar.

17 de maio de 2008

A Ortografia da Língua Portuguesa Vai Mudar


Ah-ha! Finalmente alguma coisa acontece na "nossa" língua-arcaica-portuguesa. O acordo ortográfico foi aprovado por Portugal: leia a notícia.


De acordo com Estadão:

As principais mudanças nas regras
O fim do trema: o acento seria totalmente eliminado. A palavra 'freqüente' passa a ser escrita 'frequente'.
Eliminação de acentos em ditongos: acaba o acento nos ditongos 'ei' paroxítonos. Dessa maneira, 'idéia' vira 'ideia'.
Acento circunflexo: quando dois 'os' ficam juntos também some. Logo, 'vôo' vira 'voo'.
Cai o acento diferencial: o acento que diferenciava palavras homônimas de significados diferentes acaba. Conseqüentemente, 'pára' do verbo parar vai ficar apenas 'para'.
Hífens: sai a maioria dos hífens em palavras compostas. Assim, pára-quedas vira paraquedas. Será mantido o hífen em palavras compostas cuja segunda palavra começa com h, como pré-história. Em substantivos compostos cuja última letra da primeira palavra e a primeira letra da palavra são as mesmas, será feita a introdução do hífen. Assim microondas vira micro-ondas.
Inclusão de letras: as letras antes suprimidas do alfabeto português (k, y e w) voltam, mas só valem para manter as grafias de palavras estrangeiras.
Fim das letras mudas: Em Portugal, é comum a grafia de letras que não são pronunciadas como 'facto' para falar 'fato'. Elas sumirão.
Dupla acentuação: foi mantida a diferença de acentuação entre o português brasileiros e o lusitano. É comum quando se fala do acento circunflexo e agudo: assim, nós escrevemos 'econômico' e eles, 'económico'.

13 de maio de 2008

Python e MD5

Eis a query em SQL:

SELECT MD5("text")


Eis a tradução em Python:

>>> import md5
>>> md5.new("text").hexdigest()

Atualização
: De acordo com Andrews Medina:

A biblioteca md5 vai ser removida no Python 3 porque a mesma coisa é feita pela biblioteca hashlib, mas usando vários algorítmos.

O seu exemplo feito com hashlib ficaria:

>>> import hashlib
>>> hashlib.md5('teste').hexdigest()

24 de abril de 2008

Ubuntu de Abril de 2008

Não sei de onde o dinheiro vem. Não sei como conseguem fornecer tudo gratuitamente. Só sei que os caras estão cada vez melhor no que fazem. E fizeram bem. Lançada a versão 8.04. Se estiver com medo, tente dar umas voltas com um boot duplo. Experimente Ubuntu.

22 de abril de 2008

Caso Nardoni: Chocante ou "Morfinante"?


"Pára pai! Pára pai!" talvez tenha sido a frase que levou o ocorrido a tanto clamor público, curiosamente essa frase pareceu mal interpretada pela imprensa, pois o que ficou assentado no inquérito policial foi: "papai... papai... pára! pára!"

De qualquer forma, seja por sobreexposição da mídia ou por afetar os nossos valores mais íntimos, o fato ganhou destaque. E não importa quem é o culpado, o crime foi, de certa maneira, um analgésico. Analgésicos não são bons para dor de cabeça? Então. O Caso Nardoni é ainda mais que um simples lenitivo, é uma boa morfina.

Ele espelha a imagem das pessoas boas que o recriminam. Afinal, eu nunca faria aquilo com meu próprio filho. Homicídios acontecem aos montes todos os dias, mas se tratam de apenas bandidos, diferente de um casal de classe média alta que joga a criança inocente deles pela janela de um edifício -- esse sim revela pessoas realmente más. E como a maioria não faz isso, somos morfinizados pela boa sensação de ter sentimentos nobres e alívio da culpa.

Culpa? Que culpa? Aquela que é intrínseca aos humanos. O mal interno, os ranços, os atos que prejudicam os outros, os segredos inconfessos, o banco dos réus no qual estamos inconscientemente sentados. E com tudo isso, ficamos isentos da responsabilidade de reparar qualquer erro. De fato. Os Nardoni são mais que criminosos, são grandes dopadores.

Mas não me entenda mal, isso não é uma crítica, apenas um fato.

26 de março de 2008

Python no Google

Info Online:
O fato de o Google abrir as portas para esse encontro reforça aquilo que a comunidade tem observado: a importância da linguagem Python vem crescendo dentro das grandes empresas. Grandes nomes da comunidade hoje trabalham no Google, incluindo Guido van Rossum. (Ler notícia)

Atualização: Devido ao fervor com que Marco André implicou com a palavra (fazendo um post só pra isso), resolvi corrigir a grafia do nome da linguagem pra não pegar mal pra mim :) muito embora tenha copiado e colado dessa mesma forma do original. Detalhe: já corrigiram o original.

11 de março de 2008

Storm: Como Buscar 'datetime.datime' Usando 'datetime.date'

Digamos que você tenha um campo tipo "datetime", como faria para manejá-lo para buscar dados usando apenas "date" (data)?

Se fosse em MySQL, usaríamos a função "TO_DAYS":
"SELECT * FROM table WHERE TO_DAYS(coluna) = TO_DAYS(data);"

Em Storm uma solução é a seguinte:

>>> date = datetime.date.today()
>>> start = datetime.datetime.combine(date, datetime.time(0,0))
>>> end = start + datetime.timedelta(days=1)
>>> results = store.find(Tabela, Tabela.data_hora >= start,
Tabela.data_hora < end)

4 de março de 2008

Livro: "A Arte de Fazer Acontecer"

É fabuloso. Fabuloso. Acabei de ler ele. Depois da minha namorada ter sugerido que eu deveria ter uma agenda, admiti: "preciso de ser mais organizado". E David Allen ensina uma excelente fórmula para organizar a vida.

Não é um livro de auto-ajuda, mas me ajudou um bocado. Me sentia como nos precisos termos que descreve, minha memória RAM vivia cheia de tarefas pendentes que consumiam minha energia porque em algum nível subconsciente sabia que havia afazeres incompletos. E enquanto eu não tivesse um sistema confiável para gerenciar meus trabalhos e compromissos, minha mente não descansava.

E para liberar seu cérebro de tanta "tralha" acumulada não serão necessários recursos muito sofisticados como laptops, palms ou coisas do gênero. Se você tiver isso, é muito bom, mas o que Allen sugere inicialmente é algumas folhas de papel e uma agenda.

Para tanto, o método nuclear proposto pelo autor é (em apertada síntese) o seguinte. Cada vez que um novo insumo chega à sua caixa de entrada, seja ele um compromisso, uma idéia ou qualquer trabalho, você deve tomar alternativamente um dos seguintes caminhos:
  • Se for uma ação que demande até dois minutos para ser executada, fazer de imediato;
  • Delegar a outra pessoa;
  • Se for o caso, enviar para o lixo (simplesmente jogar fora para não atravancar sua vida);
  • Inserir no seu sistema de organização pessoal. Nesse particular, é muito importante já deixar decidido qual é a próxima ação a ser tomada para que aquela tarefa se concretize;
  • Se não exigir nenhuma ação, colocar na pasta/gaveta adequada. Um conselho dele é criar um compartimento para o "material de referência", para, p. ex., incluir aquele folder de pizzaria que você quer ter à mão quando quiser uma pizza.
Digamos que, como exemplifica o próprio livro, você tenha assumido consigo próprio o compromisso (há talvez 6 anos atrás) de organizar aquele quartinho de bagunça da sua casa, e você ainda não fez, provavelmente alguma parte do seu cérebro acha que você deveria fazer isso 24h por dia. Esse incômodo está sugando seu tempo, energia e criatividade. E, segundo explica, você deveria ou se desfazer do compromisso, ou fazê-lo de uma vez, ou, inserir ele numa lista de "algum dia/talvez".

Desse modo simples, na esteira de mostrar como se constrói esse sistema de gerenciamento pessoal é que o livro é palavra no assunto. Ele é bastante funcional, sem ser complicado, abordando desde a organização de âmbito doméstico, familiar, passando por emails, reuniões e projetos de trabalho, até projetos de vida. Pessoalmente diria que estou aplicando uns 20% de tudo que ensina, mas já é ótimo. Tenho, de fato, me sentido muito melhor, e pretendo depois reler e aplicar mais dos princípios sugeridos ali.

Então, se você já leu o popular: o menino harry potter que roubava livros do livreiro de cabul :-), recomendo agora: A Arte de Fazer Acontecer.

Por fim, para dar meu toque pessoal aos conselhos de David Allen, recomendo que tente usar o Google Docs e o Google Agenda como sistema de listas e agenda respectivamente. Pela facilidade e amplitude com que se acessa a internet nos dias atuais, nada mais confortável que ter à mão em qualquer lugar sua agenda e listas. Assim, como costumo fazer no trabalho vez por outra checo meu sistema de organização ou insiro nele o que necessário e, se à noite estiver em casa ou na casa da minha namorada ou de um amigo, pela internet também posso acessá-los.

Mais uma dica, o Google Agenda fica muito melhor se a visualização padrão estiver no modo "mês" (em vez de 'dia' ou 'semana'), assim você tem uma visão mais geral dos compromissos de todo o mês, o que permite um controle maior. Para isso, entre em "configurações" (canto direito superior) e depois altere o campo "Exibição padrão" para "mês". Talvez você também tenha que alterar a língua porque ela pode vir por padrão em inglês, mas você pode mudar para português.

Ps.: Vim a descobrir esse livro num post do Osvaldo Santana. Só não deixei um comentário lá porque o blog dele só permite comentários de quem tenha conta no wordpress.

27 de fevereiro de 2008

"Quem voa são os pássaros" -- Justiça


26/02/08, Parque dos Poderes, Campo Grande - MS.

Magia: Adicionando métodos à class por meio da instância

Um pouco de magia. Nada de mais.


>>> class Wakadoo(object): pass

>>> wakadoo = Wakadoo()
>>> # Lets create a function to be add to the 'wakadoo' object.
>>> def __setattr__(self, name, value):
self.__dict__[name] = value
print "Congrats. This method worked."


>>> # Look, the magic...
>>> setattr(wakadoo.__class__, __setattr__.func_name, __setattr__)
>>>
>>> wakadoo.var = "Ah-ha!"
Congrats. This method worked.
>>>
>>> print wakadoo.var
Ah-ha!
>>>

Storm: MAX e LIKE na mesma sentença



Qual a maneira storm de executar a seguinte query:

SELECT MAX(num) FROM operation WHERE num LIKE "8%"

Leve-se em consideração que a coluna 'num' é do tipo inteira (integer), logo o método "find" não aceitaria o parâmetro "%".

Solução 1 (mais stórmica):

store.find(Operation, Operation.num.like(SQL("'8%'"))).max(Operation.num)

Solução 2 -- Transcrito tal qual foi respondido pela storm-list (não testei):

store.execute(Select( Max(Account.id), Like(Account.id,'8%')) ).get_one()

Labirinto


Tradução Livre:
E LÁ TEMOS OS GUARDAS DO LABIRINTO.
UM SEMPRE MENTE, UM SEMPRE DIZ A VERDADE, E
UM SEMPRE BATE EM PESSOAS QUE FAZEM PERGUNTAS CAPICIOSAS

O Golfinho-livre agora capturado

Depois de dar vários sinais de que o golfinho estava desejando sair do mar aberto, finalmente cai nas redes de pescadores mercenários.

Dá para acreditar? É lamentável. Sun irá comprar MySQL. Foi-se o que era bom.

É certo que a Sun manterá o código aberto, mas não será a mesma coisa...

Vamos agora torcer para Postegre. Aliás, já estou até pensando em como vou migrar para ele.

Privado, Protegido? Python: uma "Open Kimono" Language

Quando questionado quanto à possibilidade de Python permitir "verdadeiros" atributos privados e protegidos, Rossum respondeu: """Não, Python continuará a ser uma "open kimono" language."""

"Open kimono"? O que ele quis dizer? Eis uma explicação:

The idea of the open kimono has become a financial cliche the last few years. (...)

To open the kimono means you’re being transparent, that you’re telling us the straight story, that these numbers can be trusted.


Tradução livre:

A idéia do open kimono se tornou um clichê financeiro nos recentes últimos anos. (...)

Abrir o kimono significa você estar sendo transparente, que você está nos dizendo a história franca, que esses números podem ser confiáveis.

Tutorial de Storm em nosso idioma


Finalmente minha primeira contribuição para a comunidade. Depois de uns dias de trabalho no google docs -- ah agora estou usando ele --, pesquisas em dicionários, google e tals finalizei a tradução (versão 'beta') do Tutorial de Storm (CLIQUE AQUI PARA VER).

Como o pessoal da comunidade já apontou, ele ainda carece de algumas correções terminológicas, além disso há alguns pequenos erros de masculino-feminino e plural.

Para quem não conhece, Storm é um promissor ORM lançado pela Canonical para funcionar concretamente no Launchpad e no Landscape.

Pythonista é assunto do Rails Podcast Brasil


A-ha! Tive meus minutos de fama (não tanto, mas foi legal). No último PODCAST (aos 35 minutos) da comunidade Ruby on Rails Brasil figurava entre os assuntos um artigo ("de um novo blogueiro nacional") intitulado Rails alavanca Python.

O artigo em questão foi objeto de um post do Júlio Monteiro (inclusive foi ele quem me avisou) que foi parar no Planeta Ubuntu e no Planeta Ruby on Rails (esse último eu não vi), o Akita então leu o meu artigo e [provavelmente] colocou-o na pauta do podcast.

À comunidade Rails minhas saudações :)

Enquanto isso na sala da justiça

[Acredite, essa conversa realmente aconteceu]

Larissa: "Luiz, você conhece o Carlos?"
Taís: "Você conhece a Noemi?"
Luiz: "Não, mas eu conheço o Wagner."
Larissa: "O Wagner? De Aquidauana*?"
Luiz: "Não, do SESC."


* Aquidauana é uma cidade pequena do interior.

Módulos ou Classes; Funções ou Métodos

"Tudo em classes", era quase sempre o que eu fazia, exceto em módulos de abstração; mas, se eu precisasse de uma única função que nem sequer recebia argumentos, eu a colocava numa classe. E por essa razão eu tinha que freqüentemente importar a classe de dentro do módulo, instanciá-la na classe em que estava usando, e eventualmente passá-la como argumento para outra classe e por aí afora.

Um certo dia eu resolvi dar uma olhada em Django, e qual minha surpresa, ele não coloca tudo em classes (A-ha!). Tanto que até a camada View (controller) consiste em funções. A partir de então percebi que o uso excessivo de classes pode atrapalhar em vez de ajudar, e reformulei as coisas. Por essa razão mudei minha regra de quando der ponha em classe para: primeiro pense em funções e se precisar transforme elas em métodos, e assim se fará uso mais adequado do suporte que Python propicia às funções: objetos de primeira classe.

Dessa forma, pensei em alguns pontos que podem indicar a desnecessidade do uso da classe. Veja-se:

# __init__ não faz nada ou o que ele faz pode ser feito fora.
É um bom indicativo de desnecessidade. É claro que é apenas um indicativo, não é regra, existem outras razões que justificariam a classe, mas pode ser que o __init__ não receba argumentos de modo que o que ele faz pode ser feito no escopo global do módulo.

# A classe não funciona como objeto.
Parece um contradição, mas não é. É sabido que em Python (quase) tudo é um objeto, mas isso quer dizer que tudo é tratado como objeto, mas não significa que tudo funciona como objeto; vezes há que os métodos da classe só te devolvem alguma coisa, mas você não faz alguma coisa com a classe, deveria ser mais um módulo que uma classe -- note que estou usando "módulo" como sinônimo de conjunto de funções, está certo que os módulos podem conter classes e funções ao mesmo tempo).

Ilustrando: imagine uma máquina de café em contrapeso com o próprio café: Na máquina a gente coloca pó de café, água, aperta um botão e ela devolve café. Essa máquina funciona como módulo: a gente alimenta com alguns argumentos e ela retorna café, ao passo que o próprio café é o objeto, porque ele pode ser manipulado como objeto: pode ser bebido, ser vendido, ser jogado fora etc. Além disso ele possui atributos como forte, fraco, doce, amargo.

# Nem sempre a própria instância precisa passar a si mesma como argumento para outra classe.
Considerando que você procura evitar singletons desnecessários, se uma instância está fornecendo "self" como argumento para algum __init__ (que não seja a super-classe), não significa que a primeira instância precisa ser uma classe, podemos usar um terceiro módulo que importará aquele conjunto de funções e passará como argumento para outro componente, assim deixamos as coisas mais simples.

É isso em IMHO.

Achar e mudar

Recentemente surgiu a necessidade de encontrar e alterar determinadas expressões dentro dos arquivos.py de todos os subdiretórios de uma pasta. Segue o código.

#!/usr/bin/env python

# changetool.py


import os, os.path

def run():
 print "At any moment type '@quit@' to quit."
 path = raw_input("Dir path ('enter' for local): ")
 if path.strip() == '@quit@':
     return
 find = raw_input("Find: ")
 if find.strip() == '@quit@':
     return
 replace_for = raw_input("Replace for: ")
 if replace_for.strip() == '@quit@':
     return
 if not path:
     path = "."
 tree = [item[0] for item in os.walk(path)]
 py_files = list_py_files(tree)
 replace(py_files, find, replace_for)
 print ""
 another = raw_input("Replacements done. "
                     "Do you want to do another one (y/n)? ")
 if another.lower().strip() == 'y':
     run()

def list_py_files(dirs):
 files = []
 for path in dirs:
     files += [os.path.join(path, i) for i in os.listdir(path)
               if i.endswith(".py") or i.endswith(".pyw")]
               #or i.endswith(".glade") or i.endswith(".st")]
 return files

def replace(files, find, replace_for):
 print ""
 print "---------------------------------"
 for file in files:
     lines = open(file).readlines()
     new_lines = []
     for index, line in enumerate(lines):
         if find in line:
             print "File:", file
             print "Line number:", (index+1)
             print "Found:", line.strip()
             line = line.replace(find, replace_for)
             print "Replaced for:", line.strip()
             print "---------------------------------"
         new_lines.append(line)
     if lines != new_lines:
         open(file, "w").write("".join(new_lines))

run()


>>> """ Se você tem alguma contribuição, melhoramento ou sugestão para fazer, fique à vontade. """

Rails alavanca Python

Como o pessoal do meio já deve estar sabendo, Python foi a linguagem que mais cresceu em 2007 em popularidade segundo o Tiobe Index (noticiado em português pelo blog do Caio Moritz).

Pois bem, a minha teoria é: A bolha de Rails estourou soprando na embarcação de Python.

É que nesse mundo doutrinado por Java e .Net as pessoas costumam usar o que todo mundo usa, e às vezes deixam de experimentar coisas melhores.

Mas de repente, não mais que de repente, em 2004, provavelmente em razão do Zope, despontou Python -- uma linguagem nova com idéias arrojadas, mas ainda não era comercial o suficiente para causar grandes mudanças.

Mas de repente, não mais que de repente, em 2005 surgiu "Ruby on Rails" cujo o nome já diz a linguagem na qual foi escrito: Ruby. Pela facilidade que o framework proporcionava e um conjunto de circunstâncias favoráveis Rails se tornou rapidamente hype. E 2006 foi o ano de Ruby. Tanto que Rails aparecia em revistas e era constantemente citado nos fóruns de tecnologia por aí afora.

Então vêm os winds of change. Quem nunca tinha se interessado, ficou conhecendo a fama de Rails e dessa maneira descobriu-se que existia um tal Ruby (que quase ninguém conhecia), e um número significativo de programadores, experimentando esse açúcar, migrou para Rails e por conseqüência adotaram Ruby.

Aqui entra o efeito borboleta. Ruby é indissociável de Python, ambas têm muitas vantagens, como a ausência do perlishismo de Perl (Ruby ainda conserva um pouco disso mas isso deve mudar), da bagunça de PHP e da verbose ilegível de Java. E como a febre Rails passou causando mudanças no mundo, as novas tecnologias continuaram a chamar a atenção, e assim, nesse último ano, muitos analisando friamente as duas tecnologias optaram por Python.

Talvez não tenha sido o fator preponderante para impulsionar os números, há que se levar em consideração outros como o próprio crescimento contínuo de Python (que já vinha acontecendo) , além do crescimento do uso de Linux (com foco em Ubuntu) que faz ampla utilização de Python, mas que Rails pareceu ajudar, isso foi.

De uma maneira ou de outra, Ruby e Python vão seguir adiante atraindo olhares atentos e desatentos, e mais uma vez a canção será entoada: listen to the wind of change...

28 de janeiro de 2008

Desgoverno Econômico


Tradução livre do artigo de Mark Shuttleworth intitulado "Economic oversteering", publicado em 23 de Janeiro de 2008.


Ontem, vimos o mais extraordinária fracasso de liderança econômica dos últimos anos, quando a Reserva Federal dos EUA apertou o botão da "morfina de emergência" e cortou os juros da Reserva Federal em 0,75%. Isso não irá ajudar.

Estes são tempos de desafios extremos, e até agora, a Fed dos EUA sob Bernanke, tem se encontrado em falta. Os historiadores podem apontar bem para as portas de Alan Greenspan a verdadeira culpa do atual abalo, foi ele quem iniciou o uso da morfina para dopar a dor econômica. Mas certamente ainda se confiará um certo grau de deferência pela sua prescrição. Afinal, durante o seu mandato na Fed, os líderes econômicos ficaram convencidos de que a solução para abalo de mercado é garantir que o sistema financeiro tenha acesso a dinheiro fácil.Isso se provou eficaz a curto prazo. Quando o LTCM esteve para explodir (investimentos privados impulsionam-se dramaticamente sob o mando de teoristas financeiros ganhadores de nobéis que apostaram numa coisa tida por segura mas que não se saiu exatamente como esperado) Greenspan engenhou uma tranqüilização calculada nos negócios. Quando a bolha ponto-com estourou, Greenspan manteve o sistema financeiro aceso cortando juros a tal ponto que chegaram a estar, por um período significativo, a patamares reais negativos.

Um percentual de juros reais negativos significa que somos efetivamente pagos para fazermos empréstimos. Isso pode soar bom, mas como você se sentiria se eu usasse as palavras "pagos para dar uns tapas numa boa cocaína"? O problema subjacente é que as pessoas ficaram acostumadas a altas taxas de retorno e não quiseram aceitar que as reais taxas de retorno nos EUA estavam baixando. Ficaram acostumadas a dinheiro fácil, e Greenspan garantiu que permaneceria acessível aquele dinheiro fácil num momento em que as pessoas tinham demonstrado pouca habilidade para investi-lo bem.Juros baixos dão às pessoas um incentivo para investir em ações, mesmo que não estejam rendendo muito. O preço das referidas ações se recupera rapidamente, e o efeito foi amplificado pelo fato de que juros baixos aumentam a rentabibilidade corporativa. Isso foi o então chamado "pouso suave" -- desastre evitado. Ele certamente sabia dos riscos, mas o grande sinal de alerta que provavelmente convenceu Greenspan a fazer voltar aos juros normais foi omitido: inflação. Juros baixos, e especialmente juros negativos, historicamente sempre resultaram em inflação; e ele os manteve baixos porque não havia sinais de inflação. Pareceu como se os EUA tivessem entrado numa nova era onde a correlação entre juros e inflação não mais existisse. Explicou-se o fato dizendo que os EUA estavam aumentando sua produção drasticamente (aumentos de produção são como um remédio anti-inflação). Agora, em retrospectiva, parece que a verdadeira razão para a ausência de inflação foi que os chineses aumentaram dramaticamente a produção deles, e que os consumidores americanos estavam gastando tanto em produtos chineses que a produção chinesa se elevou (e não a produção americana) o que manteve baixos os preços nos EUA.Quando a tecnologia saiu da ebulição (e as pessoas deveriam ter usado a pausa para limpar seus negócios), Greenspan facilitou para que as pessoas se colocassem numa posição pior. Dinheiro fácil fez os preços das ações de mercado artificialmente altos, de maneira que os investidores de mercado se sentiram ricos. Pior, dinheiro fácil faz os preços imobiliários artificialmente altos (até cerca de 45%), de modo que todos se sentiram mais ricos do que tinham planejado ou esperado.

Para piorar as coisas, uma série de inovações financeiras criaram toda uma indústria concebida para ajudar as pessoas a voltarem à dívida de seus imóveis. Eu lembro de assistir TV nos EUA e ficar impressionado com o número de propagandas para "remoção de casa própria". Eles faziam isso soar como se o transformar seu principal ativo financeiro pessoal -- sua casa quitada -- em um caixa automático fosse uma coisa boa. Em realidade, foi uma bom meio para gastar toda a sua reserva principal de riqueza. E com preços imobiliários inflados, foi uma maneira de gastar um dinheiro que você de maneira alguma possuía; um modo conveniente de entrar num profundo abismo de dívida familiar. O resultado? A americana média possuía menos de sua casa hoje que ela o fazia há trinta anos atrás -- 55% contra 68%.

Dinheiro fácil torna as pessoas mais pobres. A companhia com os mais irritantes anúncios, Ditech (e eu me sinto envergonhado por contribuir para o ranking do seu website com a menção, talvez isso ajude no feedback de seus consumidores em vez de 'linkar'), tem um slogan que diz "pessoas são espertas" e um modelo de negócios baseado na idéia de que "pessoas são otárias". Seu produto "mais popular" me parece sob medida para facilmente tornar uma casa própria -- um ativo -- em um novo débito.

Por que Greenspan fez isso? Acho que ele acreditou sinceramente que havia alguma coisa diferente no mundo moderno que havia alterado as leis da gravidade econômica. Suspeito que ele não mais pense dessa forma.Mas Greenspan não é mais o presidente da Fed. Ben Bernanke deu o sinal ontem, e como ele vimos o seu naipe.

Greenspan agiu com cautela, logicamente, e essencialmente com prudência. Muitos anos de dados econômicos anômolos são uma base razoável para pensar que as regras têm evoluído. Você teria que ter uma espécie suíça (700 anos de estabilidade) ou chinesa ("nós pensamos que é muito cedo para dizer se Revolução Francesa foi uma boa idéia") para adotar teorias econômicas que contradizem fatos de há tempos. Greenspan cometeu um erro, e por uma geração haverá sérias conseqüências para os EUA, mas ele teve razões para aquele erro. Bernanke apenas deu o sinal e, a despeito de ter mais experiência, entrou em pânico.

Há agora intensos debates econômicos para tudo que está ocorrendo. Temos entendido quase claramente o que está acontecendo no mundo. O vento de deflação oriental tem sido identificado. Sabemos que não há uma produção miraculosa nos EUA, e nenhuma mudança nas leis da física ou da economia. Assim, sabemos que o paciente americano é viciado na morfina do dinheiro fácil, remédio que foi prescrito pelas boas intenções do Dr. Greenspan, e que tem nos 7 últimos anos feito o paciente mais doente (e não menos). Mais morfina hoje constitui uma negligência, não inovação econômica. Temos ciência das conseqüências da morfina -- preços acionários subirão artificialmente (4% ontem, nas manchetes), preços imobiliários continuarão a declinar, as empresas irão demorar mais para adimplir com seus empréstimos.

Bernanke talvez esteja na esperança de fazer o que Greenspan fez -- aposentar-se antes que o vício se torne totalmente patente. Tarde demais. Enquanto a Fed não está claramente disposta a admiti-lo, os mercados já tem evidentemente formado a sua própria opinião de que o prognóstico não é bom. Eles são espertos o suficiente para ver que tudo o que Bernanke tem feito é cobrir os sintomas do mal-estar, e muitos estão usando o alívio temporário da dor para migrar para territórios mais seguros. Espero que qualquer alívio seja breve, as recuperações de mercado irão minguar, o corre-corre tem sido adiado mas não evitado.

Eu iniciei descrevendo as ações da Fed como um fracasso na liderança econômica. Alguns têm sorte suficiente para ir de baixo do ciclo para cima dele -- esses assumem quando as coisas estão miseravelmente ruins e podem simplesmente torná-las melhor. Eles parecem heróis, mesmo se seus vudus não tiverem, por assim dizer, mojo. Outros são menos afortunados, ficam a mercê do ativo de pico, como Bernake que está nessa última categoria. Ele precisa apelar para a melhor da industrialização americana -- uma tradicional vontade de trabalhar duro, ser esperto, e aceitar as conseqüências da recusa a fazê-lo. Ele precisa liderar sob as mais difíceis circunstâncias. Mas isso é que é liderança.

Para a sorte de Bernanke, acredita-se amplamente que a independência do banco central é a única maneira de governar a economia. Tal independência dá a Bernanke o direito de divergir dos líderes políticos se necessário. Dado os recentes anúncios da Casa Branca -- mais morfina, mais endividamento para o país mais endividado -- a administração Bush não tem peito para um verdadeiro programa de reabilitação. Bernanke terá que liderar sem apoio político, uma tarefa realmente difícil. Nossos maiores e mais memoráveis líderes são aqueles que lideram através de tempos de dificuldade; a recíproca é verdadeira quanto a fracassos de liderança. Apaziguamento, ou reabilitação. Chamberlain, ou Churchill. Até agora, Chamberlain.