Este vídeo do CollegeHumor faz uma paródia do Matrix, mostrando o que aconteceria se rodasse num Windows. Excelente. Destaque para os segundos finais… ;-)


Muitos tutoriais de Rails para iniciantes, para demonstrarem na prática como é rápido e simples criar aplicações web com ele, explicam como criar um blog em 15 minutos, baseados no screencast do David Heinemeier Hansson, criador do Rails, para o FISL 6.0. Apesar de ser uma aplicação funcional de blog, com opção para criar posts e adicionar comentários, é bastante limitado.

O Typo é uma aplicação desenvolvida em Rails para criação de blogs bastante completa (inclusive encontrei este blog criado com ele). Ele lembra muito o Wordpress, acredito que tenha sido inspirado nele. A interface de administração é muito semelhante à do Wordpress, apresentando basicamente as mesmas opções: criar posts e páginas, ver/aprovar/rejeitar comentários, criar usuários, customizar a barra lateral, etc. Há também uma opção para seleção de temas (outros temas podem ser encontrados aqui) e plugins com diversas funcionalidades, como APIs para Delicious, Flickr, Twitter e outros. Só senti falta das opções de estatísticas de acesso que o WordPress oferece.

A instalação pode ser feita através do comando gem (gem install typo), porém, tentei e não consegui instalar desta forma. Instalei a ferramenta pela versão tgz. Neste caso, basta descompactar a aplicação, copiar o arquivo database.yml.example, no diretório config, para database.yml, editá-lo conforme a configuração do banco de dados, e em seguida executar rake db:create para criar a estrutura do banco de dados. Caso você queira ser avisado por email quando receber comentários nos posts, copie também o arquivo config/mail.yml.example para mail.yml no mesmo diretório, e edite as configurações de SMTP.

O Typo também possui um servidor de feeds RSS/Atom. Porém, na versão atual (5.1.3), recebi uma mensagem de erro ao tentar acessar os feeds. Encontrei o erro no arquivo app/models/article.rb e corrigi substituindo o método link_to_author? (linhas 384 a 386) pelo seguinte:

def link_to_author?
  begin
    !user.email.blank? && blog.link_to_author
  rescue NoMethodError
    return false
  end
end

Um recurso interessante do Google Talk, mas pouco divulgado, são os bots de tradução de textos para diversas línguas. O Google Translate também faz isso, de uma forma mais limitada, mas para a tradução rápida de um texto pequeno, esse recurso pode ser bem útil.

Para traduzir de português para inglês, adicione o seguinte contato ao seu Google Talk: [email protected] . Tudo o que você escrever para este bot, ele responderá traduzido para inglês. Para a tradução inversa, adicione [email protected] . Para outras traduções, veja este link.

PS: O Google Translator tem um famoso bug onde, ao digitar “USA é o pior país do mundo” e selecionar a tradução de português para inglês, a tradução fica “Brazil is the worst country in the world”. Resolvi fazer esse teste no Google Talk, e descobri que o resultado é o mesmo…


Ontem foi lançada a versão final do Firefox 3.0. Porém, como esta versão ainda não está disponível nos respositórios oficiais do Ubuntu, resolvi fazer o download e a instalação manualmente. Por segurança, optei por manter instalada a versão 2, para o caso de encontrar algum problema, ou alguma extensão que considero essencial não funcionar.

Primeiramente, fiz o download do Firefox 3.0. Em seguida, movi o diretório da versão anterior para outro nome:

cd /usr/lib
sudo mv firefox firefox-2.0

Descompactei o Firefox 3.0 neste mesmo local, e movi o diretório para firefox-3.0, criando em seguida um link simbólico para firefox. Desta forma, fica mais fácil voltar a utilizar o Firefox 2 caso eu necessite:

sudo tar xvfj firefox-3.0.tar.bz2
sudo mv firefox firefox-3.0
sudo ln -s firefox-3.0 firefox

Em seguida, você deve habilitar os plugins. Verifique no diretório plugins do Firefox 2 os plugins que estão habilitados:

ls -l /usr/lib/firefox-2.0/plugins/
total 12
lrwxrwxrwx 1 root root   37 2008-05-26 10:03 flashplugin-alternative.so -> /etc/alternatives/firefox-flashplugin
lrwxrwxrwx 1 root root   39 2008-02-28 14:19 libjavaplugin.so -> /etc/alternatives/firefox-javaplugin.so
lrwxrwxrwx 1 root root   36 2008-02-28 14:10 libtotem-basic-plugin.so -> ../../totem/libtotem-basic-plugin.so
lrwxrwxrwx 1 root root   37 2008-02-28 14:10 libtotem-basic-plugin.xpt -> ../../totem/libtotem-basic-plugin.xpt
lrwxrwxrwx 1 root root   34 2008-02-28 14:10 libtotem-gmp-plugin.so -> ../../totem/libtotem-gmp-plugin.so
lrwxrwxrwx 1 root root   35 2008-02-28 14:10 libtotem-gmp-plugin.xpt -> ../../totem/libtotem-gmp-plugin.xpt
lrwxrwxrwx 1 root root   36 2008-02-28 14:10 libtotem-mully-plugin.so -> ../../totem/libtotem-mully-plugin.so
lrwxrwxrwx 1 root root   37 2008-02-28 14:10 libtotem-mully-plugin.xpt -> ../../totem/libtotem-mully-plugin.xpt
lrwxrwxrwx 1 root root   42 2008-02-28 14:10 libtotem-narrowspace-plugin.so -> ../../totem/libtotem-narrowspace-plugin.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:10 libtotem-narrowspace-plugin.xpt -> ../../totem/libtotem-narrowspace-plugin.xpt
-rw-r--r-- 1 root root 9104 2008-04-18 13:43 libunixprintplugin.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-dvx.so -> ../../mozilla/plugins/mplayerplug-in-dvx.so
lrwxrwxrwx 1 root root   44 2008-02-28 14:15 mplayerplug-in-dvx.xpt -> ../../mozilla/plugins/mplayerplug-in-dvx.xpt
lrwxrwxrwx 1 root root   42 2008-02-28 14:15 mplayerplug-in-qt.so -> ../../mozilla/plugins/mplayerplug-in-qt.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-qt.xpt -> ../../mozilla/plugins/mplayerplug-in-qt.xpt
lrwxrwxrwx 1 root root   42 2008-02-28 14:15 mplayerplug-in-rm.so -> ../../mozilla/plugins/mplayerplug-in-rm.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-rm.xpt -> ../../mozilla/plugins/mplayerplug-in-rm.xpt
lrwxrwxrwx 1 root root   39 2008-02-28 14:15 mplayerplug-in.so -> ../../mozilla/plugins/mplayerplug-in.so
lrwxrwxrwx 1 root root   43 2008-02-28 14:15 mplayerplug-in-wmp.so -> ../../mozilla/plugins/mplayerplug-in-wmp.so
lrwxrwxrwx 1 root root   44 2008-02-28 14:15 mplayerplug-in-wmp.xpt -> ../../mozilla/plugins/mplayerplug-in-wmp.xpt
lrwxrwxrwx 1 root root   40 2008-02-28 14:15 mplayerplug-in.xpt -> ../../mozilla/plugins/mplayerplug-in.xpt

Você deve criar esses mesmos links simbólicos no diretório plugins do Firefox 3:

cd /usr/lib/firefox-3.0/plugins/
sudo ln -s /etc/alternatives/firefox-flashplugin .
sudo ln -s /etc/alternatives/firefox-javaplugin.so .
sudo ln -s ../../totem/libtotem-* .
sudo ln -s ../../mozilla/plugins/mplayerplug-in* .

Finalmente, fiz um backup do diretório de configurações que fica no meu home:

cd ~
cp -r .mozilla FIREFOX-2.0_BACKUP

Pronto, o Firefox 3.0 já está instalado. Para retornar à versão 2, basta remover o link /usr/lib/firefox e criar outro apontando para firefox2.0:

cd /usr/lib
sudo rm firefox
sudo ln -s firefox-2.0 firefox

Ao executar a nova versão pela primeira vez, como em qualquer atualização, o Firefox verifica a compatibilidade das extensões que estão instaladas. Algumas extensões apareceram como não compatíveis com o Firefox 3. O Autocomplete Manager, por exemplo, é incompatível, mas foi incorporado ao Firefox 3 e não é mais necessário. Já o Firebug, ferramenta essencial para qualquer desenvolvedor web, tem duas versões: 1.05 para Firefox 2 e 1.2 para Firefox 3. Ao iniciar o Firefox 3 pela primeira vez, você receberá uma mensagem informando que o Firebug é incompatível, e que não foram encontradas versões mais recentes da extensão. Você deve procurá-lo na página de add-ons e clicar em “add to Firefox” para instalar a versão mais recente.

Referência: Instalando Firefox 3 no Centos/RHEL e Fedora


O Active Record é um dos principais componentes do Rails, pois é exatamente o model do MVC. Ele mapeia automaticamente uma classe numa tabela do banco de dados, criando métodos para acesso a cada atributo. Porém, e se quisermos desenvolver uma aplicação sem banco de dados?

Passei por esta situação recentemente: a aplicação acessa um servidor diretamente, via Atom, e, portanto, não precisa armazenar dados localmente. Porém, não basta comentar todas as linhas do arquivo config/database.yml, pois o Rails mostrará uma mensagem de erro informando que não encontrou o banco de dados correspondente.

Para resolver este problema, resolvi, inicialmente, tentar não utilizar o Active Record. Para isso, primeiramente precisei modificar o model que eu tinha na aplicação, retirando a herança de ActiveRecord::Base. Porém, ao tentar executar o servidor, recebi mensagens de erro informando que o banco de dados não foi encontrado. Isso ocorre porque, apesar de não haver qualquer classe herdando de ActiveRecord::Base no projeto, este módulo estava sendo carregado. Consequentemente, o Rails tentava ler o arquivo config/database.yml, que não estava configurado, resultando na mensagem de erro. Para evitar este problema, foi necessário evitar o carregamento do Active Record explicitamente, acrescentando a linha abaixo ao arquivo config/environment.rb:

config.frameworks -= [ :active_record ]

Feito isto, o Rails passa a funcionar sem banco de dados e sem Active Record. Porém, surgiu um outro problema: os testes unitários do Rails pararam de funcionar, pois a classe ActiveSupport::TestCase, que é a classe base para os testes unitários, não funciona sem Active Record. Para resolver, troquei a herança desta classe para Test::Unit::TestCase, que era utilizada como padrão antes da versão 2 do Rails. Não sei exatamente quais são as diferenças entre as duas, mas só consegui resolver este problema desta forma - se alguém descobrir alguma outra solução, me avise!

Também precisei carregar explicitamente o model no arquivo de teste, pois o Rails deixou de fazer a referência automática a esta classe. Feitas as alterações, o arquivo de teste (ex: test/unit/usuario_test.rb) ficou assim:

require 'test/test_helper'
require 'test/unit'
require 'app/models/usuario'

class UsuarioTest < Test::Unit::TestCase
  # Replace this with your real tests.
  def test_truth
    assert true
  end
end