Os 8 macacos

July 17, 2009 by lucasuyezu

Tradução desse artigo aqui:

(Essas são informações baseadas em uma experiência real, conduzida no Reino Unido)

Oito macacos foram postos em uma sala. No centro da sala há uma escada, que leva a uma penca de bananas penduradas em um gancho no teto.

Cada vez que um macaco tenta subir a escada, todos são atingidos por um jato de água gelada, o que os humilha. Não demora muito, sempre que um dos macacos tenta subir a escada, os demais o derrubam e o espancam, com medo do jato de água. Logo nenhum dos oito macacos tenta mais subir a escada.

Um dos macacos é substituído. Vendo a escada e as bananas, ele se pergunta porque nenhum dos demais está fazendo o óbvio. Eis que, destemido, ele começa de imediato a subir a escada.

Todos os outros macacos caem de pau em cima dele e o espancam. E ele não faz idéia do porque.

Entretanto, ele para de tentar subir a escada.

Um segundo macaco do grupo inicial é substituído. Novamente, o recém-chegado tenta subir a escada, mas todos os outros macacos enchem ele de porrada.

Isso inclui o macaco anterior, o qual grato por não ser o alvo da surra, participa do espancamento porque todos os outros macacos estão participando também. Entretanto, ele não faz idéia do porque está batendo no macaco novo.

Um a um, todos os macacos que estavam no começo da experiência são substituídos. Oito macacos novos estão na sala. Nenhum deles foi atingido pelo jato de água uma vez sequer. Nenhum deles tenta subir a escada. E todos vão prontamente espancar qualquer um que o tente, sem ter a menor idéia de saber o porque.

E é assim que a grande maioria das políticas corporativas são criadas.

Freud, ou melhor, Jung, explica

July 11, 2009 by lucasuyezu

Uma coisa que sempre me encacucou a mente foi o fato de muitas pessoas, em todas as áreas profissionais, mudarem de personalidade quando ingressam em uma profissão, ou quando atingem (ou pensam que atingem) proficiência na mesma. Boa parte dessa gente faz pior que isso, indo e voltando entre as aparências conforme bem lhes interessa.

E eis que esbarro nesse texto escrito por C. G. Jung, discípulo de Freud, que diz o seguinte:

… .Um exemplo comum é o da identidade destituída de humor, que muitos homens estabelecem com sua ocupação ou seus títulos. O cargo que ocupo certamente representa minha atividade particular; mas é também um fator coletivo, historicamente condicionado pela cooperação de muitos e cuja dignidade depende da aprovação coletiva. Portanto, se identificar-me com meu cargo ou título, comportar-me-ei como se fosse o conjunto complexo de fatores sociais que tal cargo representa, ou como se eu não fosse apenas o detentor do cargo, mas também, simultaneamente, a aprovação da sociedade. Dessa forma me expando exageradamente, usurpando qualidades que não são minhas, mas estão fora de mim. “L’état, c’est moi”, é o lema de tais pessoas.

Recentemente meu chefe disse que todo mundo devia fazer terapia. Cada dia que passa concordo mais com ele.

Django Dash ‘09

June 2, 2009 by lucasuyezu

Participamos!

Sobre o Dash: É um campeonato de Django, onde o seu time tem que construir uma aplicação Django funcional em 48 horas. Ele aconteceu das 2 da manhã de sábado 30/maio até as 2 da manhã de segunda 1/junho.

Porque entrei nessa? Simplesmente por que venho estudando Python desde algum tempo atrás. Não pretendo abandonar o Ruby e o Rails, só acho perfeitamente possível trabalhar com as duas linguagens e os dois frameworks. Chamei o povo pelo Twitter e o @lpirola me procurou uns dias depois. Alguns minutos de conversa depois, eu, ele, o @wilerson e o @ottohenrique estávamos cadastrados.

Resolvemos fazer uma aplicação similar ao orangotag. Resolvemos homenageá-lo, chamando de gorillatag. Diferente do orangotag, o gorilla é um tracker de filmes. O esquema é bem simples: você se cadastra, adiciona seus amigos, e marca os filmes como assistidos. Daí, nos feeds rss dos seus amigos aparece um item avisando que você viu o filme em questão. Você também pode comentar filmes e deixar mensagens para os usuários.

Pra deixar as coisas mais interessantes, eu nunca tinha usado Django. Ninguém tinha. E acho que alguns deles nunca tinham usado Python também. Mas tudo isso acabou sendo um fator positivo.

Nós entregamos a aplicação. O que já é um ponto positivo. Mas perto da concorrência, fomos mal. Muito mal. Agora temos o que olhar e comparar.

Depois de 48 horas usando Django, posso fazer uma comparação simplista de alguns pontos bons e não tão bons, em comparação ao Rails:

  • Schema: O Django não mantém histórico das mudanças no banco. Tirando operações básicas como criar tabelas, ele não faz muita coisa. Se você adiciona um atributo a um model, tem rodar um comando do django que imprime o schema na tela. Daí você pega esse esquema e atualiza no seu banco de dados. Bem diferente das migrations do Rails.
  • Models: No Django os atributos reconhecidos por ele tem que ser declarados no model. Isso é bom em relação aos models do Rails porque você tem tudo num lugar só, não depende de plugins que olham o schema e colocam os campos em comentário, por exemplo.
  • Performance: Sejamos sinceros: Python está num nível de maturidade bem maior do que o Ruby. A performance dele chega a assustar depois que você passa um ano e alguns meses usando Ruby. Ele “compila” os seus scripts em arquivos .pyc. Os arquivos “compilados” são carregados mais rapidamente pela virtual machine, mas não alteram a velocidade de execução. Mesmo assim é uma ajuda tremenda.
  • Django “environment”: Uma das coisas que difere bastante o Django do Rails é a forma como eles tratam o “ambiente”. No Rails, pondo as coisas nos lugares certos, você sempre tem tudo à disposição, carregados certinho. No Django você precisa importar tudo. Vai usar um model numa view? Precisa importar. Vai usar coisas simples como datetime? import. Posso estar falando besteira, mas não carregar as coisas pode ser um motivo para a velocidade do shell do django e outras coisas ser tão mais rápido do que o equivalente no Rails.
  • Plugins: O Django vem com uma engine de autenticação out-of-the-box, que te deixa plugar um model de “profile” nela. Vem também com um models de comentários, sendo que as instâncias desse model podem ser associadas a qualquer outro model do Django. E ainda tem mais: implementar feeds rss é simples ao ponto de criar uma classe, implementar os métodos de título, link, descrição e items e pronto. Creio que isso tudo aconteceu pelo fato do Django ter nascido dentro de um jornal.

Vamos esperar umas duas semanas até sair os resultados do campeonato. Estamos pensando em continuar com o projeto e lançar um beta. Aguardem.

(T|B)DD e a síndrome do Yes Man!

March 23, 2009 by lucasuyezu
Paranóia. Você não está livre dela.

Paranóia. Você não está livre dela.

Eu sou um cara paranóico. Só a idéia de ter que cuidar de servidores em um final de semana me deixa meio apavorado. Embora isso faça com que eu fique apavorado um final de semana sim, um não, há um motivo para isso.

Existe a possibilidade de que eu não tenha feito algo direito. De que eu não tenha coberto todas as possibilidades. De que o meu código não é perfeito.

A gente sabe que não é necessário (nem possível) fazer código perfeito. Apenas código que funciona. Mas aí que a coisa fica engraçada. Eu, como desenvolvedor nunca tive certeza de que o que eu fiz não iria parar de funcionar de uma hora para outra. Isso até eu descobrir TDD, BDD e afins.

A entrada dos testes na minha vida foi (assim como tudo que entra pra ficar) dramática. De repente, lá estava eu escrevendo código pra ter certeza de que um puts “Hello World” imprimiria “Hello World” na tela. Lá estava eu falando (e/ou achando) pra todo mundo que não fazia que a vida deles era miserável, que eles eram desenvolvedores inferiores. Lá estava eu evangelizando. Justo eu que critico evangelizadores bem mais do que devo.

O meu site, que está em pré-alpha (e vai sair do alpha em breve) está sendo feito com TDD bunitinhu. RSpec e o caraio a quatro. Daí eu resolvi fazer uma tela sem o maledeto. Consegui! E foi mais rápido, porque eu não precisei escrever os testes e specs! E nisso eu fiz mais uma, e outra, e outra. Nisso se passou uma semana, e tinha uma meia dúzia de 9 specs falhando. Ah, 9 de mais de 100? Depois eu arrumo.

Até que eu faço um commit fatal. Alguma merda fez com que, no lugar do browser interpretar a página e mostrar o site, te entregasse as páginas como se fossem downloads. Erro bobo, arrumado em segundos e atualizado pro site em minutos.

Me senti como o Jim Carrey no filme “Yes Man!”. O tempo todo, desde a hora que virei um evangelizador/publicitário gratuíto, até a hora que imaginei estar magicamente preso à filosofia.

No man! No man! No man!

No man! No man! No man!

Na verdade, a ansiedade e a felicidade por isso ter resolvido boa parte dos meus problemas, fez com que eu achasse que todo mundo também precisaria dessa solução. Assim como penicilina. Só que ninguém precisa nem tem saco pra saber que isso mudou a minha vida de desenvolvedor.

Quem sabe passem a querer depois que o site ficar famoso. Ou depois que fique menos chato.

Cache, módulos do apache e uma otimização absurda

February 11, 2009 by lucasuyezu

No site que eu estou fazendo agora, que está em pré-alpha (se é que isso existe) , uma requisição simples, sem nada no cache demorava horrores. E isso porque só tem uma imagem no leiaute até agora.

Eu tinha que fazer alguma coisa. E uma regra importante sobre otimização é medir a performance antes de sequer relar no código, para ver o que (e se) você precisa fazer.

Resolvi dar um pouco de atenção para o YSlow, e ao rodar ele, ele me mostrou algo um tanto quanto vergonhoso:

- 12 http requests (9 JavaScript files, 3 StyleSheets)
- Load time: 13.23s (server in other country)
- 262KB to load

E uma bela de uma nota F no YSlow.

Se, por um lado, o Rails vem com tudo pronto e fácil para você, por outro ele pode ser um tanto quanto lerdo se você não souber tunar a aplicação. Prototype, script.aculo.us e afins estão a um include de distância, mas eles vem preparados para você desenvolvedor, e não para você usuário.

Ganha-se muito tempo, tanto de desenvolvimento quanto em performance, resolvendo primeiro os problemas de carregamento da página, e depois a sua lógica. Isso significa que: quanto menos arquivos externos, e quanto mais comprimidos eles estiverem, melhor.

O legal é que o Rails tem uma solução simples para isso: passar o parâmetro :cache => true para os métodos javascript_include_tag e stylesheet_include_tag. Ele faz com que todos os arquivos sejam fundidos em um só, all.js, ou all.css. Isso deu o seguinte resultado:

- 3 http requests (2 Javascript files (um é o widget do uservoice), 1 StyleSheet)
- Load time: 4.04ms (server in other country)
- 143KB to load

Bem melhor! Mas ainda dá pra melhorar. Se você configurar o seu servidor da maneira certa, ele usa gzip para mandar uma versão compactada da página e dos arquivos externos. Eu já tinha instalado o módulo no Nginx, mas mudei o servidor para Apache 2, e acabei esquecendo.

A dica aqui é que se você procurar na internet sobre como configurar o Apache para usar gzip, você vai dar de cara com um monte de links para o mod_gzip, módulo externo ao Apache. Mas você não precisa dele: basta ativar o mod_deflate, que é nativo e vem instalado em praticamente todo Apache. É só procurar por ele em /etc/apache2/mods-available/. Edite o arquivo /etc/apache2/apache2.conf, adicionando:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    DeflateCompressionLevel 9
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</IfModule>

Rode:

sudo a2enmod deflate
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 start

e pronto! Os resultados para mim foram:

- 3 http requests (não mudou em relação ao teste anterior)
- Load time: 2.99s (server in other country)
- 42.2KB to load

E ainda tem mais! Se você for um dos 20 primeiros a comentar, receberá… Você pode ativar outro módulo do Apache, o mod_expires, e configurar imagens e arquivos externos para expirarem daqui a muito tempo. Assim o browser nem tenta pegar os arquivos que já tem. Abra novamente o arquivo /etc/apache2/apache2.conf,e coloque:

<IfModule mod_expires.c>
    <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
        ExpiresActive On
        ExpiresDefault "access plus 1 year"
    </FilesMatch>
</IfModule>

Rode:

sudo a2enmod deflate
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 start

Isso fez com que as requisições seguintes carreguem em 0,7 segundos, ou até menos! E agora a aplicação recebe nota B no YSlow!

A lição de tudo isso: Otimização prematura é a raiz de todo mal. Ainda há espaço para mais: Colocar as versões minimizadas do Prototype & afins, mas para um único post já está de bom tamanho.

Leiaute Dvorak com suporte à dead keys

January 12, 2009 by lucasuyezu

Eu comecei a usar Dvorak. 30% por preocupações com a saúde e 70% por originalidade :)

O único problema ao usar o leiaute ¨Dvorak¨ nativo do Mac OS é com os acentos, ou Dead keys. Para se fazer a letra ´a´ com acento agudo, por exemplo, você precisa digitar alt+e, depois ¨a¨.

O Tarmann me indicou o Ukelele, que te ajuda a fazer o seu leiaute, daí eu arregacei as mangas e fiz um leiaute Dvorak com as Dead keys iguais às do U.S. International.

O arquivo está aqui. Só recapitulando: Salvem como arquivo no diretório (HOME)/Library/Keyboard Layouts

Aproveitem!

Quick tip for BackgrounDRb users

January 9, 2009 by lucasuyezu

Earlier today I was configuring BackgrounDRb, and I started to receive this error:

 

 

lucas@work:~$ script/backgroundrb start

        Starting BackgrounDRb …. 

/app/trunk/vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_start_stop.rb:42:in `initialize’: No such file or directory – /app/current/tmp/pids/backgroundrb_11006.pid (Errno::ENOENT)

        from /app/trunk/vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_start_stop.rb:42:in `open’

        from /app/trunk/vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_start_stop.rb:42:in `start’

        from /app/current/script/backgroundrb:35

After a little bit of hacking, I found that it tries to create the pid file, but fails if the directories are not created. Something I don’t understand is why the plugin doesn’t create it, since it is so simple.

So, if this problem ever happens to you, a simple mkdir RAILS_HOME/tmp/pids will save your life.

Dica rápida para quem usa BackgrounDRb

January 9, 2009 by lucasuyezu

Hoje, ao tentar configurar o BackgrounDRb, comecei a tomar esse erro na cara ao tentar subir o servidor de processos:

lucas@work:~$ script/backgroundrb start

        Starting BackgrounDRb …. 

/app/trunk/vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_start_stop.rb:42:in `initialize’: No such file or directory – /app/current/tmp/pids/backgroundrb_11006.pid (Errno::ENOENT)

        from /app/trunk/vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_start_stop.rb:42:in `open’

        from /app/trunk/vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_start_stop.rb:42:in `start’

        from /app/current/script/backgroundrb:35

Depois de fuçar um pouco, o problema é que se o arquivo não existe, ele tenta criar, mas falha se o diretório pids não existir. O que eu não entendi é porque ele não cria os diretórios que faltam no meio do caminho.
Enfim, se esse problema acontecer com você, um simples mkdir RAILS_HOME/tmp/pids salvará a sua vida.

config.gem, unite!

December 4, 2008 by lucasuyezu

I got tired of letting config.gem kick my behind, so I created a little github project to unite all config.gem in one place, with its options like :lib, :version, making it easy to find.

So, if you want to colaborate just clone the repo and add the config.gem to the gems you use.

http://github.com/lucasuyezu/config.gem–unite-/tree/master
The project is public, I hope google index it soon so people can find the config.gem for their gems in the web quickly.

config.gem, unite!

December 4, 2008 by lucasuyezu

Cansei de apanhar dos config.gem e criei um projetinho no github pra ver se consigo reunir no mesmo lugar os config.gems como devem ser feitos, com as opções, libs e tudo certinho.

Então, quem quiser colaborar, é só clonar o repo e adicionar as gems que vcs utilizam.

http://github.com/lucasuyezu/config.gem–unite-/tree/master

O projeto tá público, espero que o google indexe logo e fique fácil de achar os config.gems na web depois.