A partir de hoje, as operações deste blog se mudam para: http://www.hervalfreire.com/googletron
Anota aí: http://www.hervalfreire.com/googletron
O último que sair, feche a porta e apague a luz...
24.3.07
Desapontamentos de sábado a noite
Nem tudo são flores, no meu novo casamento. Acabei de descobrir, assim, por acaso, que a noiva costuma entrar em coma profundo sem avisar, algumas vezes por ano. E acorda como se nada tivesse acontecido.
É, o preço do baixo custo. Estava bom demais para ser verdade... :-P
É, o preço do baixo custo. Estava bom demais para ser verdade... :-P
Plugins on Rails
Uma das features mais interessantes do Rails é o mecanismo de Plugins. Até bem pouco tempo, escrever extensões para RoR era uma tarefa confusa, já que o framework suportava plugins, engines e components.
Agora decidiram entender que nem toda flexibilidade é benéfica e unificaram a coisa toda ao redor dos plugins. No Wiki do Rails já existe bastante material sobre como utilizar os milhões de plugins já existentes. Em alguns casos, dá para desenvolver aplicações inteiras apenas juntando plugins e aparando as pontas...
Agora, se o seu negócio é mesmo desenvolver o seu próprio plugin, recomendo começar por aqui. Ao contrário da maioria das coisas no universo Ruby, o processo de desenvolvimento de plugins está bem documentado e cheio de exemplos.
Agora decidiram entender que nem toda flexibilidade é benéfica e unificaram a coisa toda ao redor dos plugins. No Wiki do Rails já existe bastante material sobre como utilizar os milhões de plugins já existentes. Em alguns casos, dá para desenvolver aplicações inteiras apenas juntando plugins e aparando as pontas...
Agora, se o seu negócio é mesmo desenvolver o seu próprio plugin, recomendo começar por aqui. Ao contrário da maioria das coisas no universo Ruby, o processo de desenvolvimento de plugins está bem documentado e cheio de exemplos.
23.3.07
Lua de mel dos sonhos...
Num blog tão cheio de ranting, uma pausa para elogiar uma das poucas ilhas de sanidade da Internet. Depois de anos flertando com os promíscuos serviços de hospedagem brasileiros (onde você merece um prêmio se conseguir botar num site ar!), depois de uma curta e frustrante experiência com o godaddy e finalmente um longo e conturbado casamento com uma conta compartilhada no eapps, resolvi experimentar o serviço do DreamHost, por sugestão de um amigo.
Por algum motivo, nunca tinha parado para analisar. Com um preço 50% inferior ao que atualmente pago para manter sites no eApps, o DreamHost oferece 160gb de espaço (contra 2gb de minha hospedagem anterior), 2 TERA de tráfego (conta ridículos 30gb de meu casamento antigo), e acesso full (via ftp, ssh, telnet, whatever) a uma box Linux compartilhada.
Com jeitão de Web 2.0, o painel de controle do DreamHost é realmente muito funcional. Dá para configurar praticamente tudo sem ter que recorrer ao shell. A conta já vem preparadinha para hospedar repositórios SVN, qualquer número de bancos de dados MySql e domínios. E o suporte, pelo visto, funciona também: até agora, todos os tickets de suporte (3 no total) foram atendidos rapidamente, e sem maiores complicações.
Saldo final da operação: consegui botar dois sites no ar em menos de 2 horas, do jeitinho que eu queria. Ah, ia me esquecendo: eles também oferecem 97 dias de garantia de dinheiro de volta, em caso de desistência. Essa lua de mel promete... :)
Em tempo: caso você, querido leitor, decida experimentar uma conta no DreamHost, registre-se e faça um test drive.
Por algum motivo, nunca tinha parado para analisar. Com um preço 50% inferior ao que atualmente pago para manter sites no eApps, o DreamHost oferece 160gb de espaço (contra 2gb de minha hospedagem anterior), 2 TERA de tráfego (conta ridículos 30gb de meu casamento antigo), e acesso full (via ftp, ssh, telnet, whatever) a uma box Linux compartilhada.
Com jeitão de Web 2.0, o painel de controle do DreamHost é realmente muito funcional. Dá para configurar praticamente tudo sem ter que recorrer ao shell. A conta já vem preparadinha para hospedar repositórios SVN, qualquer número de bancos de dados MySql e domínios. E o suporte, pelo visto, funciona também: até agora, todos os tickets de suporte (3 no total) foram atendidos rapidamente, e sem maiores complicações.
Saldo final da operação: consegui botar dois sites no ar em menos de 2 horas, do jeitinho que eu queria. Ah, ia me esquecendo: eles também oferecem 97 dias de garantia de dinheiro de volta, em caso de desistência. Essa lua de mel promete... :)
Em tempo: caso você, querido leitor, decida experimentar uma conta no DreamHost, registre-se e faça um test drive.
22.3.07
Closures no Java 7
Uma série de exemplos de como deve funcionar a especificação de closures que deve sair no Java 7, de acordo com a especificação de closures para Java. No mínimo, bem esquisito... :)
Pegadinha Rails da semana: stale sessions
O dia hoje começou mal. Minha aplicação Rails fora do ar sem nenhum motivo aparente, e um e-mail do hosting reclamando da cota de disco estourada.
4 horas e muita busca frustrada depois, descobrimos que o /tmp/sessions da aplicação continha 300 MIL arquivos. Um arquivo para cada usuário que acessou o site DESDE O PRIMEIRO DIA. Traduzindo para bom português: descobri da pior maneira possível que o Rails CRIA os arquivos de sessão, mas não apaga.
Problema resolvido, googlei um pouco a respeito e descobri que na verdade este "bug" é uma "feature" documentada. Então fica a sugestão: antes que seu hosting venha dar um esporro em você por sua aplicaçãozinha gulosa, mude a maneira default de gerenciamento de sessões de sua aplicação para usar banco de dados ou sessões em memória. Afinal, no universo BancoDeDados, os hacks são bem mais elegantes.
Como diria o filósofo, "de perto, todas as coisas são feias"...
4 horas e muita busca frustrada depois, descobrimos que o /tmp/sessions da aplicação continha 300 MIL arquivos. Um arquivo para cada usuário que acessou o site DESDE O PRIMEIRO DIA. Traduzindo para bom português: descobri da pior maneira possível que o Rails CRIA os arquivos de sessão, mas não apaga.
Problema resolvido, googlei um pouco a respeito e descobri que na verdade este "bug" é uma "feature" documentada. Então fica a sugestão: antes que seu hosting venha dar um esporro em você por sua aplicaçãozinha gulosa, mude a maneira default de gerenciamento de sessões de sua aplicação para usar banco de dados ou sessões em memória. Afinal, no universo BancoDeDados, os hacks são bem mais elegantes.
Como diria o filósofo, "de perto, todas as coisas são feias"...
Launchy
Um programinha muito interessante que reproduz a única feature legal do Windows Vista: você aperta alt+space, sai digitando o nome do programa ou arquivo que quer abrir e o Launchy faz o matching do nome com as aplicações disponíveis.
Adeus, menu iniciar... :)
Adeus, menu iniciar... :)
20.3.07
PHP no Java 6
Um tutorial rápido sobre o Quercus - um engine para execução de código PHP 5.0 usando a nova especificação de script engine (JSR 223).
19.3.07
Novas Collections no Java 6!
Aqui você encontra um quickstart bem legal sobre as novas interfaces de collections do Java 6: em resumo, uma nova interface de "fila dupla" (double ended queue, ou Deque) e duas novas interfaces para maps/sets que permitem a "filtragem" de elementos (por exemplo, pegar todos os elementos de um set que sejam menores que 10).
O rant do dia vai para a incrivelmente bem bolada interface Deque, que oferece dois métodos para adicionar, dois para remover, dois para pegar o primeiro elemento e dois para pegar o último. A interface Queue havia sido adicionada no Java 5 com um método para adicionar elementos (offer()) e dois para recuperar (peek(), que não remove da fila, e poll(), que retorna e remove). Pois bem, a Deque foi muito mais além oferecendo (além dos já esperados peekFirst, e poolFirst, já que estamos falando de uma fila de mão dupla) mais um monte de novos métodos: addFirst, removeFirst, addLast, removeLast, offerLast, poolLast, peekFirst, peekLast. Pra que tanto método? Para poder oferecer um set de métodos que retorna false quando não foi possível adicionar/remover e outro que lance exceptions quando isto ocorrer.
Simplesmente formidável! Tenho certeza que pelo esta grandiosa interface múltipla vai ter pelo menos um uso: pegadinha em prova de certificação.
O rant do dia vai para a incrivelmente bem bolada interface Deque, que oferece dois métodos para adicionar, dois para remover, dois para pegar o primeiro elemento e dois para pegar o último. A interface Queue havia sido adicionada no Java 5 com um método para adicionar elementos (offer()) e dois para recuperar (peek(), que não remove da fila, e poll(), que retorna e remove). Pois bem, a Deque foi muito mais além oferecendo (além dos já esperados peekFirst, e poolFirst, já que estamos falando de uma fila de mão dupla) mais um monte de novos métodos: addFirst, removeFirst, addLast, removeLast, offerLast, poolLast, peekFirst, peekLast. Pra que tanto método? Para poder oferecer um set de métodos que retorna false quando não foi possível adicionar/remover e outro que lance exceptions quando isto ocorrer.
Simplesmente formidável! Tenho certeza que pelo esta grandiosa interface múltipla vai ter pelo menos um uso: pegadinha em prova de certificação.
17.3.07
Softbras???
Num país economicamente subdesenvolvido onde a principal fonte de receita para o mercado de TI é o governo, esta notícia é realmente excepcional. Depois da idéia estúpida de "software livre" do primeiro mandato, agora essa (que ainda não passa de boato, mas pelo que eu tenho visto tem tudo para ser verdade).
Parabéns ao governo Lula. Se superando a cada dia!
Parabéns ao governo Lula. Se superando a cada dia!
16.3.07
Caindo na Real!
Tá no ar: a tradução do livro Getting Real para português está finalmente disponível, após um longo período de re-revisão graças a alguns acidentes de percurso.
Apesar do extremismo em alguns capítulos, a leitura realmente vale a pena.
Apesar do extremismo em alguns capítulos, a leitura realmente vale a pena.
Vem aí: mais uma API Java para manipulação de datas
Todo programador Java já passou pelo trauma que é manipular datas no Java. Constatar que Janeiro é o mês zero. Perceber que objetos Date são representações absolutas de tempo (milissegundos transcorridos desde 1 de janeiro de 1970), mas as vezes quando você serializa a data de lá pra cá (especialmente através de drivers jdbc), os milissegundos mudam. Descobrir que não existe um jeito conveniente de calcular diferença de dias (ou horas, ou minutos) entre dois períodos. Sem falar nas infindáveis dores de cabeça causadas por bugs na tabela de horário de verão.
Agora a Sun anunciou a cura de todos os problemas: um novo JSR todinho para implementar uma nova API de data/hora para o Java!
Tudo que eu precisava. Mais uma API que faz a mesma coisa, e mais uma vez desenvolvida por um comitê. Mal posso esperar.
Agora a Sun anunciou a cura de todos os problemas: um novo JSR todinho para implementar uma nova API de data/hora para o Java!
Tudo que eu precisava. Mais uma API que faz a mesma coisa, e mais uma vez desenvolvida por um comitê. Mal posso esperar.
14.3.07
Ruby para Javeiros: classForName()
Um dos recursos mais utilizados do pacote de reflection do Java, o classForName permite instanciar uma classe sabendo apenas o seu nome. Praticamente todo programador Java já utilizou este método - mesmo que sem perceber, para localizar drivers JDBC.
No Ruby, classes são símbolos - e a sua carga dinâmica pode ser feita da mesma forma que qualquer outro símbolo: utilizando-se o método const_get(), definido na classe Module.
O fato de basicamente tudo no Ruby "extender" Module de uma forma ou de outra faz com que o const_get() possa ser usado de maneiras bem feias: trata-se basicamente de um método estático de qualquer classe!
Um exemplo básico de como inicializar uma classe a partir de seu nome:
class Bla
def initialize
puts "tada!"
end
end
instancia = Module.const_get("Bla")
puts instancia.class => "Bla"
ou então, quem sabe, de um jeio mais elegante:
instancia = Kernel.const_get(:Bla)
Bonito. Mas ei, e se meu objetivo for escrever código ilegível???
instancia = "yadayada".class.const_get "Bla"
ah... Muito melhor agora. As vezes essa flexibilidade toda do Ruby cai como uma bela feijoada antes de dormir...
No Ruby, classes são símbolos - e a sua carga dinâmica pode ser feita da mesma forma que qualquer outro símbolo: utilizando-se o método const_get(), definido na classe Module.
O fato de basicamente tudo no Ruby "extender" Module de uma forma ou de outra faz com que o const_get() possa ser usado de maneiras bem feias: trata-se basicamente de um método estático de qualquer classe!
Um exemplo básico de como inicializar uma classe a partir de seu nome:
class Bla
def initialize
puts "tada!"
end
end
instancia = Module.const_get("Bla")
puts instancia.class => "Bla"
ou então, quem sabe, de um jeio mais elegante:
instancia = Kernel.const_get(:Bla)
Bonito. Mas ei, e se meu objetivo for escrever código ilegível???
instancia = "yadayada".class.const_get "Bla"
ah... Muito melhor agora. As vezes essa flexibilidade toda do Ruby cai como uma bela feijoada antes de dormir...
13.3.07
Ruby 1.8.6!
11.3.07
Problema rúbico do dia: formatando números
A primeira impressão de quase todo mundo para quem tenho mostrado o Ruby é a mesma: "puxa, como é fácil!", "nossa, como é conciso", "só isso de código?". Só flores, até que surge aquele probleminha bobo que se está acostumado a resolver em outra linguagem, e pronto. Uma das principais falhas da linguagem (sua falta de documentação organizada) salta aos olhos.
O problema do dia é: como formatar um número?
O desenvolvedor Java médio está familiarizado com os NumberFormatters da vida, e vai certamente procurar por algum mecanismo similar no Ruby. Em vão. O negócio, neste caso, funciona como no C: a formatação tem que ser feita em uma representação String do número, ou nada feito:
meu_numero = 1.234465
puts meu_numero # vai sempre imprimir o número sem formatação
puts "%.2f" % meu_numero # => 1.23
Em tempo: a lib facets inclui uma maneira elegante de formatar números:
meu_numero = 1.234465
puts meu_numero.round_at(2) # => 1.23
Muito mais limpo. Aliás, o Facets inclui maneiras elegantes de resolver muitos outros pequenos problemas, para quem não tiver problemas em depender de libs "não core"...
O problema do dia é: como formatar um número?
O desenvolvedor Java médio está familiarizado com os NumberFormatters da vida, e vai certamente procurar por algum mecanismo similar no Ruby. Em vão. O negócio, neste caso, funciona como no C: a formatação tem que ser feita em uma representação String do número, ou nada feito:
meu_numero = 1.234465
puts meu_numero # vai sempre imprimir o número sem formatação
puts "%.2f" % meu_numero # => 1.23
Em tempo: a lib facets inclui uma maneira elegante de formatar números:
meu_numero = 1.234465
puts meu_numero.round_at(2) # => 1.23
Muito mais limpo. Aliás, o Facets inclui maneiras elegantes de resolver muitos outros pequenos problemas, para quem não tiver problemas em depender de libs "não core"...
10.3.07
Trocando a roupa de um Mamute (sem parar a boiada)
Como o Wal-Mart promoveu a migração de seu site (um dos mais visitados do mundo, diga-se de passagem) para o Java 5.0 - sem pânico e sem tiros no escuro.
Dojo Toolkit
Uma biblioteca de Javascript com muita coisa similar ao Scriptaculous - e algo a mais.
Pra os programadores RoR, já existe também um plugin para integrar o Dojo com Rails de forma transparente, do mesmo jeito que funciona a integração scriptaculous/rails na ditribuição padrão. O componente de edição de texto (com suporte a formatação, como o editor do próprio blogger.com) é um dos mais interessantes.
Pra os programadores RoR, já existe também um plugin para integrar o Dojo com Rails de forma transparente, do mesmo jeito que funciona a integração scriptaculous/rails na ditribuição padrão. O componente de edição de texto (com suporte a formatação, como o editor do próprio blogger.com) é um dos mais interessantes.
8.3.07
Ferret
Na verdade um port para código nativo da ferramenta Apache Lucene, o Ferret é uma engine de texto ("full text search") rápida e com suporte a uma sintaxe bastante rica de indexação e busca. O suporte a Rails (através do plugin acts_as_ferret) é tão simples que dá até medo: vamos supor um sistema hipotético de (surpresa!) blogging. Depois de longos 5 minutos de desenvolvimento, eu já tenho meu modelo de Post:
class Post < ActiveRecords::Base
attr_accessor :text, :user, :title, :creation_date
end
Para utilizar o Ferret, é preciso primeiramente instalar o gem da engine:
gem install ferret
Após concluído o processo de instalação, precisamos também do plugin, em nosso projeto:
ruby script/plugin install svn://projects.jkraemer.net/acts_as_ferret/tags/stable/acts_as_ferret
Muito bom, muito bonito. Agora vamos à difícil tarefa de implementar o suporte a busca full text nos meus posts. Que rufem os tambores...
class Post < ActiveRecords::Base
acts_as_ferret
attr_accessor :text, :user, :title, :creation_date
end
E-pronto. Sempre que precisar fazer uma busca utilizando texto em qualquer dos campos do Post, basta utilizar-se o método find_by_contents(), definido pelo acts_as_ferret:
def buscar_comida
comida = Post.find_by_contents("torta OR bolo OR bigmac OR pizza")
end
A sintaxe utilizada para as buscas é a mesma do Lucene, que permite utilizar agrupamentos lógicos de palavras, busca por proximidade, similaridade...
Tão fácil que deu até medo.
class Post < ActiveRecords::Base
attr_accessor :text, :user, :title, :creation_date
end
Para utilizar o Ferret, é preciso primeiramente instalar o gem da engine:
gem install ferret
Após concluído o processo de instalação, precisamos também do plugin, em nosso projeto:
ruby script/plugin install svn://projects.jkraemer.net/acts_as_ferret/tags/stable/acts_as_ferret
Muito bom, muito bonito. Agora vamos à difícil tarefa de implementar o suporte a busca full text nos meus posts. Que rufem os tambores...
class Post < ActiveRecords::Base
acts_as_ferret
attr_accessor :text, :user, :title, :creation_date
end
E-pronto. Sempre que precisar fazer uma busca utilizando texto em qualquer dos campos do Post, basta utilizar-se o método find_by_contents(), definido pelo acts_as_ferret:
def buscar_comida
comida = Post.find_by_contents("torta OR bolo OR bigmac OR pizza")
end
A sintaxe utilizada para as buscas é a mesma do Lucene, que permite utilizar agrupamentos lógicos de palavras, busca por proximidade, similaridade...
Tão fácil que deu até medo.
7.3.07
My Job Went to Brazil
Um dos livros mais interessantes que li nos últimos tempos, My Job Went to India é muito bem escrito e trás lições não só para os americanos com medo de perder seus empregos - mas para qualquer pessoa que planeja no mínimo manter sua "vendabilidade" no mercado de TI.
6.3.07
Coisas que todo desenvolvedor deveria saber...
...mas que a grande maioria só aprende na marra. Um ótimo resumo de muitas atrocidades que costumo ouvir de outros 'ITers' mundo afora que se julgam experientes, mas fazem questão de cometer os mesmos erros primários, um após o outro.
(se um dia faltar argumento para convencê-los da bobagem que estão fazendo, você pode sempre recorrer à minha lista de argumentos imbatíveis. Eu recomendo! ;) )
(se um dia faltar argumento para convencê-los da bobagem que estão fazendo, você pode sempre recorrer à minha lista de argumentos imbatíveis. Eu recomendo! ;) )
JRuby 0.9.8
Saiu! A nova versão do JRuby suporta Rails, ja cobre com sucesso 98% dos test cases da linguagem original e solucionou diversos problemas de performance da versão anterior. E a versão 1.0 já está a caminho...
5.3.07
Orientação a Objetos Compulsiva
"What I sometimes see when I interview people and review code is symptoms of a disease I call Object Happiness. Object Happy people feel the need to apply principles of OO design to small, trivial, throwaway projects. They invest lots of unnecessary time making pure virtual abstract base classes -- writing programs where IFoos talk to IBars but there is only one implementation of each interface! I suspect that early exposure to OO design principles divorced from any practical context that motivates those principles leads to object happiness. People come away as OO True Believers rather than OO pragmatists."
Ponto de vista interessante sobre o abuso desnecessário da Orientação a Objetos. Vale ler o artigo todo (e todos os links associados! :) )
4.3.07
Bons argumentos...
Uma lista de ótimos argumentos técnicos. Para decorar direitinho, e usar sempre que você começar a perder em uma discussão técnica!
Design Web 2.0
Um artigo que sobre o que a "Web 2.0" trouxe de melhor: novos padrões de design e usabilidade.
Yahoo!
Nos últimos anos, o Yahoo! desenvolveu um mecanismo curioso de contratação de novos funcionários. A receita é bem simples: primeiro deixa-se que um punhado de garotos desenvolva e coloque no ar uma aplicação promissora (geralmente desenvolvida nos fins de semana). Depois basta oferecer um "bônus" (em muitos casos, provavelmente, nem isso) e um salário, cobrir os custos de mudança de toda a equipe para a SunnyVile, Califórnia e pronto: mais uma "Yahoo! Company" nasce. Foi assim com o Flickr, há dois anos atrás, e tem sido com praticamente todos os sites legais de lá pra cá - como o GeoBloggers (que neste caso foi comprado para ser fechado, basicamente), Upcoming.org, Konfabulator, del.icio.us...
A lista com algumas das "aquisições" pode ser vista na Wikipedia. O "estilo Yahooligan" se tornou tão conhecido que já surgiram até sites fazendo brincadeira com o modelo "all your base are belong to us".
Em tempo: this blog is ;-)
A lista com algumas das "aquisições" pode ser vista na Wikipedia. O "estilo Yahooligan" se tornou tão conhecido que já surgiram até sites fazendo brincadeira com o modelo "all your base are belong to us".
Em tempo: this blog is ;-)
3.3.07
NetBeans + Ruby
Talvez não seja uma notícia muito nova, mas o NetBeans agora suporta Ruby - com direito a code completion e tudo mais!
A novidade apareceu discretamente, um tempo depois da Sun ter contratado os desenvolvedores do JRuby.
A partir da versão 6.0, a IDE suporta (ainda um tanto "extra-oficial") o Ruby. E (e em breve a PHP, Javascript e Python)
O download do NetBeans pode ser feito aqui.
A novidade apareceu discretamente, um tempo depois da Sun ter contratado os desenvolvedores do JRuby.
A partir da versão 6.0, a IDE suporta (ainda um tanto "extra-oficial") o Ruby. E (e em breve a PHP, Javascript e Python)
O download do NetBeans pode ser feito aqui.
Marcadores:
netbeans,
php,
programaslegais,
python,
ruby
Rake for N00bs
Rake é a "linguagem de build" utilizada pelo Ruby on Rails. Trata-se de uma Domain Specific Language desenvolvida em Ruby - mais ou menos como o famoso Ant (só que sem toda a complexidade desnecessária do XML). Este artigo do Martin Fowler trás uma visão geral do Rake e suas aplicações. E para quem trabalha com Rails, uma relação das tasks incluidas no RoR.
2.3.07
Rede nova, negócios novos...
Uma análise interessante sobre 5 novos modelos de negócio/emprego que surgiram junto com a Web 2.0. Negócios muito mais capilares e pulverizados - uma das características marcantes do "modelo 2.0".
1.3.07
Rails Handbook
Uma coletânea de referências, cheat sheets, screencasts e tutoriais sobre o Rails. Bookmark obrigatório!
27.2.07
What the Web’s most popular sites are running on
Uma avaliação técnica de 7 dos mais visitados sites da Internet. PHP e MySql ainda dominam, e pelo visto vão passar um bom tempo no topo...
26.2.07
Diários de um Captcha!
Recentemente tive o prazer de descobrir que meu sitezinho cresceu, e já é até alvo de ferramentas de spam automatizado! Quanta honra...
Ok, passado o orgulho inicial, vamos ao problema. A solução mais simples (e atualmente mais comum, Internet afora) para combater os spammers é conhecida por CAPTCHA. Em resumo, são aquelas imagens com texto distorcido, as vezes ilegíveis até mesmo por seres humanos convencionais.
Como qualquer solução no mundo Ruby, existe pelo menos uma dezena de bibliotecas de Captcha diferentes. Após testar um punhado, decidi por utilizar o plugin simple_captcha, por ser um dos mais simples de configurar e com menos dependências (somente o RMagick, veja você!). Este post mostra direitinho os passos para instalação e configuração do plugin.
Em 2 minutos estava com o plugin no ar, gerando texto distorcido para validar os posts de meus usuários. Tudo bom, tudo bonito.
Bug da Hora: unable to read font '(null)'
Como nada costuma funcionar logo de cara, o plugin resolveu entrar em greve quando fiz o deployment no servidor de produção (um box Linux):
ActionView::TemplateError (unable to read font `(null)') on line #49 of app/views/xxx/_xxxxx.rhtml:
46: <% end %>
47: <% if @map.captchaValidate %>
48:
49: <%= show_simple_captcha %>
50:
51: <% end %>
Não se trata de um problema com o simple_captcha, mas sim com o RMagick. Phew. Mais um dragão para derrubar...
Ok, passado o orgulho inicial, vamos ao problema. A solução mais simples (e atualmente mais comum, Internet afora) para combater os spammers é conhecida por CAPTCHA. Em resumo, são aquelas imagens com texto distorcido, as vezes ilegíveis até mesmo por seres humanos convencionais.
Como qualquer solução no mundo Ruby, existe pelo menos uma dezena de bibliotecas de Captcha diferentes. Após testar um punhado, decidi por utilizar o plugin simple_captcha, por ser um dos mais simples de configurar e com menos dependências (somente o RMagick, veja você!). Este post mostra direitinho os passos para instalação e configuração do plugin.
Em 2 minutos estava com o plugin no ar, gerando texto distorcido para validar os posts de meus usuários. Tudo bom, tudo bonito.
Bug da Hora: unable to read font '(null)'
Como nada costuma funcionar logo de cara, o plugin resolveu entrar em greve quando fiz o deployment no servidor de produção (um box Linux):
ActionView::TemplateError (unable to read font `(null)') on line #49 of app/views/xxx/_xxxxx.rhtml:
46: <% end %>
47: <% if @map.captchaValidate %>
48:
49: <%= show_simple_captcha %>
50:
51: <% end %>
Não se trata de um problema com o simple_captcha, mas sim com o RMagick. Phew. Mais um dragão para derrubar...
25.2.07
Mephisto e o mistério do cache
Então você começou a brincar de Rails, precisava botar um Blog no ar por algum motivo e resolveu testar o Mephisto. A instalação veio fácil, o blog entrou no ar em minutos...
...e 5 dias depois, ninguém comentou no seu blog ainda - se muito, aparecia um comentário eventual por post - mesmo aquele post polêmico, xingando a mãe dos desenvolvedores Java.
Se você utiliza Apache + cgi/fcgi, é bem provável que seja um problema de configuração do Apache...
...e 5 dias depois, ninguém comentou no seu blog ainda - se muito, aparecia um comentário eventual por post - mesmo aquele post polêmico, xingando a mãe dos desenvolvedores Java.
Se você utiliza Apache + cgi/fcgi, é bem provável que seja um problema de configuração do Apache...
22.2.07
O que acontece quando um gigante soluça?
Esse tipo de evento sempre serve para me lembrar de fazer backup de informações online - como os emails do GMail, ou as fotos do Flickr.
E de preferência, fazer um backup do backup também. Quem sabe em algum outro serviço online de backups...
E de preferência, fazer um backup do backup também. Quem sabe em algum outro serviço online de backups...
18.2.07
A Síndrome das Dobradiças
"Arquitetos" de software são uma espécie de animal interessante. Sua profissão resume-se a resolver problemas de forma elegante (em muitos dos casos, resolver problemas abstratos, sem escrever nenhum tipo de código). Não que isso seja pouco: em qualquer indústria, elegância é uma meta que raramente é atingida. Mas com a exposição prolongada à profissão, alguns desenvolvem uma bizarra doença psicológica: a Síndrome das Dobradiças.
Como um tipo de dependência química, os portadores da SdD precisam desenhar. Eles não passam um dia sem rabiscar bonequinhos de palito e quadradinhos com setas apontando para eles mesmos, para os bonequinhos, e para outros quadradinhos. E como um tipo de aspirante a artista pós moderno, os SdDs buscam desesperadamente o desenho mais complexo, a cada dia. Não conseguem dormir de noite enquanto não transformarem aquele simples componente de envio de e-mails em um conjunto de quadradinhos: uma Abstract Factory pra flebixilizar aquela Factory que vai produzir o agora genérico Componente de Envio de Qualquer Coisa, uma série de interfaces para definir Coisa, Email e EnviadorDeQualquerCoisa, e finalmente um conjunto de arquivos de configuração para unir a coisa toda. Se o cliente precisa de uma porta, não basta projetá-la com duas dobradiças (e eventualmente um olho mágico): a porta tem que ter dobradiças que permitam abri-la em qualquer direção, cadeados de todos os lados e mecanismos de autenticação redundantes.
E claro, quanto mais obscura a tecnologia para unir tudo isso, melhor. Já vi casos de arquitetos em êxtase por descobrirem um modo de integrar 5 novos buzzwords (e suas 5 respectivas implementações de referência) para resolver um problema que a) não necessitava de flexibilidade nenhuma e b) poderia ser resolvido com 20 linhas de código.
Se você apresenta alguns destes sintomas, procure um médico. Você pode ser portador de SdD. Outros sintomas incluem possuir mais de um livro sobre UML em sua mesa, um aumento visível do teor de padrão-de-projetês em seus diálogos, sonhos com bonequinhos de palito contadores de histórias e modelagens que não cabem em uma folha de papel A3.
Cuidado: portadores de SdD costumam ser confundidos com especialistas.
Como um tipo de dependência química, os portadores da SdD precisam desenhar. Eles não passam um dia sem rabiscar bonequinhos de palito e quadradinhos com setas apontando para eles mesmos, para os bonequinhos, e para outros quadradinhos. E como um tipo de aspirante a artista pós moderno, os SdDs buscam desesperadamente o desenho mais complexo, a cada dia. Não conseguem dormir de noite enquanto não transformarem aquele simples componente de envio de e-mails em um conjunto de quadradinhos: uma Abstract Factory pra flebixilizar aquela Factory que vai produzir o agora genérico Componente de Envio de Qualquer Coisa, uma série de interfaces para definir Coisa, Email e EnviadorDeQualquerCoisa, e finalmente um conjunto de arquivos de configuração para unir a coisa toda. Se o cliente precisa de uma porta, não basta projetá-la com duas dobradiças (e eventualmente um olho mágico): a porta tem que ter dobradiças que permitam abri-la em qualquer direção, cadeados de todos os lados e mecanismos de autenticação redundantes.
E claro, quanto mais obscura a tecnologia para unir tudo isso, melhor. Já vi casos de arquitetos em êxtase por descobrirem um modo de integrar 5 novos buzzwords (e suas 5 respectivas implementações de referência) para resolver um problema que a) não necessitava de flexibilidade nenhuma e b) poderia ser resolvido com 20 linhas de código.
Se você apresenta alguns destes sintomas, procure um médico. Você pode ser portador de SdD. Outros sintomas incluem possuir mais de um livro sobre UML em sua mesa, um aumento visível do teor de padrão-de-projetês em seus diálogos, sonhos com bonequinhos de palito contadores de histórias e modelagens que não cabem em uma folha de papel A3.
Cuidado: portadores de SdD costumam ser confundidos com especialistas.
17.2.07
Querido Diário...
Retomei o contato com este blog graças a duas pessoas que o acharam por acaso, navegando pela Internet. A Internet (ou seria a sua interface principal, o Google?) é um bicho interessante. Funciona como uma máquina do tempo que tanto dita tendências quanto revela fósseis de longínquas eras. Como este site que vos fala.
Blogs são fósseis engraçados. Com exceção dos blogs mais populares (ou os blog businesses, moda no já distante ano de 2005), você nunca sabe se tem alguém lendo o que você posta do outro lado. Você escreve, escreve, escreve. O contador de visitas mostra que existem 50 malucos que lêem seu blog quase que diariamente. Mas na maioria dos casos, soa como falar de olhos fechados para uma platéia que você não sabe se existe. Ou então falar para você mesmo.
É isso, caro leitor. Este blog voltou a ser mantido. Para que o interlocutor que vos fala possa, daqui a 5 anos , consultar a máquina do tempo e constatar como conhecia pouco ou quase nada (e no entanto se dava ao luxo de falar como se conhecesse). E como aquela promessa de aprender Ruby on Rails (que foi feita em 2005, segundo esse blog!) demoro quase 2 anos para ser cumprida... :)
Well, let's cut the crap. De volta à ativa... Assim espero :)
Blogs são fósseis engraçados. Com exceção dos blogs mais populares (ou os blog businesses, moda no já distante ano de 2005), você nunca sabe se tem alguém lendo o que você posta do outro lado. Você escreve, escreve, escreve. O contador de visitas mostra que existem 50 malucos que lêem seu blog quase que diariamente. Mas na maioria dos casos, soa como falar de olhos fechados para uma platéia que você não sabe se existe. Ou então falar para você mesmo.
É isso, caro leitor. Este blog voltou a ser mantido. Para que o interlocutor que vos fala possa, daqui a 5 anos , consultar a máquina do tempo e constatar como conhecia pouco ou quase nada (e no entanto se dava ao luxo de falar como se conhecesse). E como aquela promessa de aprender Ruby on Rails (que foi feita em 2005, segundo esse blog!) demoro quase 2 anos para ser cumprida... :)
Well, let's cut the crap. De volta à ativa... Assim espero :)
Assinar:
Postagens (Atom)