• 20:16 Depois de 9 meses de buscas, finalmente encontrei para vender a melhor cerveja do mundo – Guinness! Por R$ 8.90!! Life is good again! :) #
  • 22:35 @lordspy em botucatu.. tinha visto também em outros lugares, mas não por esse preço. Deu até vontade de levar o estoque inteiro :) . #
  • 23:17 …there is life after glibc 2.9 upgrade… #

Automatically shipped by LoudTwitter

  • 09:46 @lordspy tem Mashina Vremeni e Akvarium.. outras bandas começaram em 1980 ou 1981 (alisa, ddt, kino, piknik, chizh, aria, krematorii..). #
  • 23:39 (sabedoria antiga) programar com alcool no sangue é bom.. mas tem que fazer commits periódicos, senão depois de ver o código.. ai ai.. :) #

Automatically shipped by LoudTwitter

Atualizei o wordpress para 2.7. A interface de administração melhorou MUITO. Vamos ver se tudo continua funcionando.. hehe

Ultimamente eu uso bastante programação funcional em python para tudo. Entretanto, fiquei brincando hoje e descobri que nem sempre ela oferece os melhores resultados.

Por exemplo, vamos imaginar a função que vai fazer todas as combinações entre os elementos de uma lista. Ela pode ser escrita de forma funcional:

# permutate-func
def permutate(l):
    '''Returns all possible combinations of list values'''
    return reduce(lambda x, y: y + x, [ [(x, y) for y in l if x != y] for x in l ])

ou de forma iterativa:

# permutate-iter
def permutate(l):
    '''Returns all possible combinations of list values'''
    res = []
    for x in l:
        for y in l:
            if x != y:
                res.append((x, y))
    return res

Para listas pequenas não temos muita diferença de desempenho. Agora para listas maiores (por exemplo, com 1000 strings):

dups=['string%d' % x for x in range(1000)]
permutate(dups)

temos os seguintes resultados para programação funcional:

# time permutate-func
real    0m24.494s
user    0m20.763s
sys 0m1.698s

e os seguintes para o algoritmo iterativo:

# time permutate-iter
real    0m1.191s
user    0m1.150s
sys 0m0.036s

O tempo de 24 segundos caiu para apenas 1 segundo!

Qual conclusão tiramos disso? Embora programação funcional é extremamente poderosa, em alguns casos é melhor usar outras soluções para o problema :) .

Descobri mais uma utilidade para os decorators em python:

import threading

class Thread(threading.Thread):
    def __init__(self, f):
        threading.Thread.__init__(self)
        self.run = f

@Thread
def func():
    print "Hello world!"

func.start()

Jeito simples e eficientes para criar funções threadizadas.

Update: É possível otimizar esse código para não precisar escrever .start() na mão, e deixar as funções compatíveis com a sua versão não-threadizada:

class Thread(threading.Thread):
    def __init__(self, f):
        threading.Thread.__init__(self)
        self.run = f

    def __call__(self):
        return self.start()

@Thread
def func():
    print "Hello world!"

func()

Realmente, não tem jeito de habilitar cairo-lcd no firefox-nightly. O firefox (na sua versão atual) está usando funcionalidades de cairo que não foram integradas ao repositório oficial ainda.

Embora o 3.1 (e o 3.2a1) são MUITO mais rápidos que o firefox 3 comum, a aparence do firefox3 usando system-cairo dá de 10×0 neles.

Ahh que dúvida difícil.. Será que fico com o firefox lento+bonitinho, ou rápido+pouco legível??

Descobriremos nos próximos capítulos de Eugeni vs Firefox! :)

No dia 15 de março de 2009 (que já está chegando!) Iron Maiden estará em São Paulo novamente, em Interlagos.

A venda de ingressos começou ontem a meia-noite, e as 00:02 mais ou menos o meu já estava comprado.

E (obviamente) ele não foi o primeiro, mais ou menos umas 100 pessoas tinham comprado antes de mim já (pelo menos, o número de série no ingresso diz isso).

Agora só esperar…

Up the irons! :)

© 2012 Eugeni's blog Suffusion theme by Sayontan Sinha