Capistrano 2.1 Update

by AkitaOnRails on Oct.15.2007 at 12:53am

Esta é a semana dos lançamentos. Depois do Rails 2.0 Preview Release, do 1.2.4 e do 1.2.5 Maintenance Upgrade, é a vez do grande Capistrano ganhar sua atualização 2.1 como reportou o próprio Jamis Buck algumas horas atrás.

Definitivamente eu gosto de Gems:

gem update capistrano -y

Muitas coisas são de infra-estrutura e não devem afetar o usuário comum de Capistrano como tirar a necessidade de um pseudo-TTY, desabilitar o wrapping de sh, melhor suporte a Windows para carregar arquivos binários. Algumas coisas são bem úteis para extender o Capistrano como carregar novas receitas diretamente de plugins em vendor/plugins.

Para mim o mais interessante é o suporte nativo agora ao GIT. Agradecimentos a Geoffrey Grosenbach, Garry Dolley e Scott Chacon. Agora ficou trivial fazer deployments a partir de repositórios GIT. Um bom sinal.

Rails 1.2.5 Maintenance Release

by AkitaOnRails on Oct.12.2007 at 05:38pm

Pessoal, quem recentemente fez a atualização para 1.2.4 deve fazer novamente a atualização 1.2.5 conforme acabou de ser anunciado.

Dentre as manutenções estão correções um bug de cross-site scripting com JSON: se você usar JSON, atualize. Fora isso há outras correções de bugs mas menos prioritárias. Se tudo estiver funcionando e você não usa JSON, pode pular reto.

Não esqueçam de verificar o RAILS_GEM_VERSION no environment.rb.

Rails 1.2.4: Maintenance release

by AkitaOnRails on Oct.05.2007 at 03:13am

David acabou de postar sobre a versão 1.2.4 que eu disse que estava para sair nos posts anteriores.

Esta versão é para corrigir bugs e principalmente para adicionar avisos de deprecação (o que se tornará obsoleto na versão 2.0 final). Quando você ver ‘warnings’ de ‘deprecated’ preste atenção: esses warnings se tornarão mensagens de erro na 2.0.

sudo gem update rails -y

Isso deve bastar.

Markaby and HAML: Markup for Ruby

by AkitaOnRails on Sep.05.2007 at 12:03am

Eu vejo pouca gente comentando por aqui mas para quem gosta de abstrações, deveriam tentar Markaby. Para que serve? Que tal ‘escrever XHTML em Ruby’. Quem acha que templating tradicional é “feio”, existem opções muito simples e atrativas.

FiveRuns: Instalação no-brainer de Rails!

by AkitaOnRails on Sep.04.2007 at 11:55am

Existem várias alternativas para se instalar o pacote completo de Rails (não só o interpretador Ruby como MySQL, Apache, etc). Receitas também existem às dezenas (googlem !).

Mas este pacote é muito interessante, com suporte tanto para Linux quanto Mac: é o FiveRuns RB-Install. Baixe um único pacote e tenha a instalação completa de tudo que você precisa, num único passo. Para quem está começando talvez seja a melhor maneira de começar.

De uma só vez você baixa e instala o seguinte conjunto de ferramentas open source:

  • Ruby 1.8.6
  • Rails 1.2.3
  • MySQL 5.0
  • SQLite 3.3
  • Subversion 1.4
  • Apache HTTP Server 2.2 (Production mode)
  • OpenSSL
  • ImageMagick 6.3
  • Mongrel/Mongrel Cluster
  • Capistrano
  • Gruff
  • Rake
  • RMagick

Acredito que isso deve cobrir as necessidades da maioria dos projetos. O resto é uma questão de rodar ‘gem install’ ou ‘script/plugin install’. O download é da ordem de 130Mb e a instalação precisa de cerca de 430Mb de disco. Vocês precisam preencher um formulário no site deles e receber o link de download via e-mail.

Meu Primeiro Teste com JRuby 1.0

by AkitaOnRails on Jun.10.2007 at 07:08pm

Fim de Domingo, estava lendo os posts de Charles Nutter e os tutoriais da Atlantic sobre JRuby. Resolvi que deveria ver com meus próprios olhos. Seguindo o tutorial, vamos ao que interessa, lembrando que estou rodando sobre OS X 10.4.9.

Primeiro, baixei o novíssimo binário do 1.0 direto do site. Feito isso, descompactei e coloquei onde queria, assim:


tar xvfz jruby-bin-1.0.tar.gz
mv jruby-1.0/ /opt/local/
sudo mv jruby-1.0/ /opt/local/
cd /opt/local/
sudo ln -s jruby-1.0 jruby
sudo chown -R root:admin jruby-1.0/

Lançado!! JRuby 1.0 Final!

by AkitaOnRails on Jun.09.2007 at 07:03am

Enfim, como prometido, a versão 1.0 estável acabou de ser anunciado. Acabei de ler no post de Ola Bini e de fato temos aqui para download o jruby-bin-1.0.tar.gz e o jruby-src-1.0.tar.gz.

O maior objetivo desta versão era ser totalmente compatível com o Ruby 1.8.5. Perfeição é impossível, mas eles chegaram bastante perto. Vocês podem ver no Issue Tracker que ainda existem 189 tickets abertos, mas apenas 7 críticos.

Portanto, eles decidiram que o estágio atual é suficiente para considerar a versão 1.0 como final e liberar para uso.

É hora de testar. Peguem seus aplicativos Rails e façam rodar! Se precisarem de um tutorial para começar, leiam este artigo.

Novidades da Semana: JRuby 0.9.9 e ActiveResource

by AkitaOnRails on Apr.24.2007 at 06:29am

Mal falamos sobre o JRuby 0.9.8 e Thomas Enebo anunciou o lançamento do 0.9.9! Estamos a 0.0.1 da versão final! E esta versão é ainda melhor que a anterior com cerca de 180 correções, estabilizações e uma performance média 40% maior do que a versão 0.9.8. Eles realmente estão evoluindo muito rapidamente.

Finalmente, DHH resolveu tirar o suporte a Active Web Services diretamente do núcleo do Rails. Calma, ele ainda continua disponível mas com um gem. Opcionalmente você pode instalá-lo e ativá-lo no config/environment.rb. Em seu lugar, agora o Active Resource (o suporte REST) passa a ser padrão. Provavelmente quando for lançado um eventual 1.3 ou 2.0, essa mudança estará disponível a todos.

Arquitetura RADAR: Aplicações RESTful, Recebedor Trivial

by AkitaOnRails on Mar.30.2007 at 06:22am

Faz tempo que não faço nenhuma tradução por aqui, mas para não perder o costume esbarrei neste artigo de Dave Thomas. É um texto importante por ajudar a entender o conceito de REST e a sugestão de uma nova arquitetura, uma vez que o novo Rails 1.2 tem tudo a ver com isso. Vamos lá.

A Arquitetura RADAR: Aplicações RESTful, Recebedor Trivial

Ontem, postei uma breve nota sobre as mudanças nas convenções de URL no Rails 2.

Sam Aaron respondeu com o comentário:

Talvez eu ainda não tenha entendido essa coisa toda de REST ainda (situação mais provável), mas o re-casamento entre verbo e sujeito (ou pelo menos a perda da habilidade de facilmente distinguir entre eles) me perturba um pouco. Então (só por perguntar) minha questão é: por que um grande Hurra! foi escutado por todo canto?

Vamos ver como chegamos onde estamos. E então olharemos para uma forma diferente de pensar sobre problemas que pode ajudar a simplificar as coisas.

[continue lendo no link abaixo]

Repescagem do fim de Março

by AkitaOnRails on Mar.26.2007 at 11:00am

Novamente, meu tempo é escasso. Mesmo assim surgiram muitas coisas legais desde meu último pacotão de novidades.

Para mim, o mais legal é off topic: o lançamento do Apple TV. Estou aguardando o meu chegar. E não deixo de acompanhar todos os posts a respeito incluindo as receitas de quem já desmontou o seu e já conseguiu adicionar suporte a XviD, DivX, etc.

Fiquei muito contente com a repercussão do meu último post, Um Desabafo. Existem mais assuntos que me deixam um tanto frustrado ou mesmo em reflexão. Um deles é exatamente tema deste outro post, The death of Agile. Não é tanto céu nem terra mas de fato as práticas Agile deixam um pouco a desejar. Todas as metodologias mainstream, Agile ou não, usam a mesma tática: quando um projeto dá certo e, por acaso, metodologia X ou Y foi usada, o mérito é da metodologia. Se outros projetos que usaram as mesmas metodologias deram errado, a culpa é da equipe que não soube implementar as práticas corretamente. Esse é, de novo, a famosa falácia da causa-e-efeito: ‘ontem eu fiz a dança da chuva, por isso hoje choveu’, ou seja, o efeito não tem, necessariamente, a ver com a causa. Tentarei discorrer sobre isso em outro artigo.

Esse comentário é pouco ortodoxo mas me lembrou do Papa João Paulo II, quando sofreu um atentado em Roma e disse que a bala foi desviada pelas mãos de Nossa Senhora de Fátima. Alguém poderia perguntar então, já que ela se deu ao trabalho de desviar, porque não tirar a bala completamente do caminho?

Voltando ao assunto, um conjunto de ferramentas que eu já mencionei antes e que parece promissor é o Hobo. No fundo me parece uma maneira de começar um projeto Rails de maneira mais rápida e prática. Ele tem alguns geradores que extendem os originais, conjuntos de helpers mais abrangente, infraestrutura de autenticação. Esses screencasts devem ajudar.

O assunto JRuby continua esquentando. Desde o lançamento da última versão 0.9.8 muitas pessoas estão fazendo seus experimentos inclusive sobre deployment de uma aplicação Rails em Tomcat como Dr. Nic descreve neste post.

Falando em Java e Ruby, surgiu uma pequena discussão de Grails vs Rails. O autor do artigo avisa que não é uma medição rigorosa. Várias alternativas de benchmark foram lançadas. Nem Grails nem JRuby on Rails são exatamente estáveis ainda. Há muito chão a ser percorrido e benchmark de performance, na minha opinião, são irrelevantes nesse ponto. O principal para a equipe do JRuby é conseguir rodar Rails sem absolutamente nenhum problema, com todos os drivers JDBC disponíveis e com todos os mecanismos de deployment dos application servers do mercado como JBoss, Glassfish ou Tomcat. Esse campo de integração Java-Rails é muito promissor e eu espero que vá muito mais longe.

Outro campo promissor é o de aplicações Web no desktop. Esse assunto começou a ficar famoso depois que empresas como Stardock, Yahoo!, Apple, Google e Microsoft lançaram produtos como Object Desktop, Konfabulator, Dashboard, Google Desktop, Sidebar. Agora existem milhares de Gadgets, Widgets que as pessoas consomem diariamente a muitos não sabem que esses mini-aplicativos são, na maioria, feitos com HTML e Javascript. Produtos da Web utilizados no Desktop.

Com Rails, alguns querem dar um passo extra. A Joyeur lançou o Joyent Slingshot. Sua proposta é ser um tipo de “máquina virtual Rails” para rodar aplicativos Rails offline, no desktop, como um aplicativo. E com vantagens adicionais, por exemplo, de sincronização do banco de dados local com o do servidor. A maior vantagem disso é levar a facilidade de programação Web para gerar aplicativos que antes demandariam muito mais tempo com toolkits como Java Swing.

Finalmente, tivemos recentemente o lançamento do Typo 4.1. Depois um longo hiato, finalmente surgiu uma versão compatível com o novo Rails 1.2.x. Em cerca de dois meses a versão 4.2 deve ser lançada.

Meu blog roda sobre Typo. Talvez ninguém tenha notado mas eu fiz o upgrade para a versão 4.1 e com isso estamos rodando sobre Rails 1.2. Ainda não investi muito tempo nisso, mas quero melhorar a localização. Eu traduzi o arquivo de linguagens para pt_BR (não sei se já existia) mas mesmo assim muitos strings não foram traduzidos.

Rails 1.2.2: SQLite3, gems e recursos no singular

by AkitaOnRails on Feb.07.2007 at 03:25am

Ontem pela manhã eu vi que o Rails 1.2.2 havia sido disponibilizado via gems e postei aqui. Fiz a atualização e coloquei os changelogs no blog porque procurei pela blogosfera e não achei nada a respeito. Até o Thiago notou que no repositório de desenvolvimento nem havia sido liberada a tag 1.2.2.

À tarde, saiu o post do DHH explicando do que se tratava. Segue a tradução (mais uma …) falando sobre isso. Mais abaixo Chad dá uma dica para quem tiver problemas com o novo RubyGems (que o Rails 1.2.2 precisa a partir de agora).

Upgrade Rails 1.2.2

by AkitaOnRails on Feb.06.2007 at 03:33am

Pessoal, saiu do forno agora: gem update rails

O Core Team lançou mais algumas mudanças de última hora e versionou como 1.2.2

O changelog não explica muita coisa mas dentre o que veio de novo estão:

activesupport 1.4.1:
  • Optimize Class Inheritable Attributes so that unnecessary hashes are not created. [Bruce Perens]
  • Added :instance_writer option to #mattr_writer/accessor, #cattr_writer/accessor, and #class_inheritable_writer to skip the creation of the instance writer. [Rick]
  • Full test coverage for Inflector. #7228 [Dan Kubb]
activerecord-1.15.2
  • Pass a range in :conditions to use the SQL BETWEEN operator. #6974 [dcmanges] Student.find(:all, :conditions => { :grade => 9..12 })
  • Don’t create instance writer methods for class attributes. [Rick]
  • When dealing with SQLite3, use the table_info pragma helper, so that the bindings can do some translation for when sqlite3 breaks incompatibly between point releases. [Jamis Buck]
  • SQLServer: don’t choke on strings containing ‘null’. #7083 [Jakob S]
  • Consistently use LOWER for uniqueness validations (rather than mixing with UPPER) so the database can always use a functional index on the lowercased column. #6495 [Si]
  • MySQL: SET SQL_AUTO_IS_NULL=0 so ‘where id is null’ doesn’t select the last inserted id. #6778 [Jonathan Viney, timc]
  • Fixtures use the table name and connection from set_fixture_class. #7330 [Anthony Eden]
  • SQLServer: quote table name in indexes query. #2928 [keithm@infused.org]
actionpack-1.13.2:
  • Add much-needed html-scanner tests. Fixed CDATA parsing bug. [Rick]
  • improve error message for Routing for named routes. [Rob Sanheim]
  • Added enhanced docs to routing assertions. [Rob Sanheim]
  • fix form_for example in ActionController::Resources documentation. [gnarg]
  • Add singleton resources from trunk [Rick Olson]
  • TestSession supports indifferent access so session[‘foo’] == session[:foo] in your tests. #7372 [julik, jean.helou]
  • select :multiple => true suffixes the attribute name with [] unless already suffixed. #6977 [nik.kakelin, ben, julik]
  • Improve routes documentation. #7095 [zackchandler]
  • Resource member routes require :id, eliminating the ambiguous overlap with collection routes. #7229 [dkubb]
  • Fixed NumberHelper#number_with_delimiter to use ”.” always for splitting the original number, not the delimiter parameter #7389 [ceefour]
  • Autolinking recognizes trailing and embedded . , : ; #7354 [Jarkko Laine]
  • Make TextHelper::auto_link recognize URLs with colons in path correctly, fixes #7268. [imajes]
  • Improved auto_link to match more valid urls correctly [Tobias Luetke]
actionmailer-1.13.2
  • Deprecate server_settings renaming it to smtp_settings, add sendmail_settings to allow you to override the arguments to and location of the sendmail executable. [Koz]
rails-1.2.2:
  • Fix gem deprecation warnings, which also means depending on RubyGems 0.9.0+ [Chad Fowler]
  • Require the dispatcher for Rails::Configuration#to_prepare. [Rick]

Entendendo o processo de Inicialização do Rails: Parte 2

by AkitaOnRails on Jan.25.2007 at 07:54am

Fonte: techno weenie

Configurando seu Ambiente (Environment)

Em cada aplicação Rails existem várias coisas para configurar. Você pode precisar configurar um endereço de e-mail que o plugin exception_notification usa, ou talvez apenas inflexões customizadas. Vamos dar uma olhada nas opções disponíveis atualmente à nossa disposição:

Object#with_options

by AkitaOnRails on Jan.24.2007 at 02:34pm

Fonte :the { buckblogs :here }, por Jamis

Em Named, explicit routes eu mencionei Object#with_options de passagem, somente para descobrir depois que este método super útil não consta na documentação da API do Rails! Desde então corrigi essa situação no trunk, mas o método é útil o suficiente (particularmente em conjunto com routing) que achei que valeria a pena blogar a respeito.

O ponto doloroso que inspirou o método é esse: suponha que você tem um punhado de chamadas de métodos, todos aceitando um hash de opções como último parâmetro, e muitos deles compartilhando um ou mais das mesmas opções. Definições de Routes são o exemplo canônico disso:

1
2
3
4
5
6
7
map.create_message "/msg/create/:id", 
  :controller => "message", :action => "create"
map.delete_message "/msg/delete/:id", 
  :controller => "message", :action => "delete"
map.message "/msg/:id", 
  :controller => "message", :action => "get"
# etc, etc, etc

Feio! E definitivamente não muito DRY também. Uma maneira de resolver isso é definir uma variável separada que contém o hash de opções em comum, e usar Hash#merge para adicionar a diferença em cada chamada:

1
2
3
4
5
6
7
8
common = { :controller => "message" }
map.create_message "/msg/create/:id", 
  common.merge(:action => "create")
map.delete_message "/msg/delete/:id", 
  common.merge(:action => "delete")
map.message "/msg/:id", 
  common.merge(:action => "get")
# etc, etc, etc

Melhor, mas ainda não muito DRY. Object#with_options é a resposta de Rails a esse padrão:

1
2
3
4
5
6
7
8
9
map.with_options :controller => "message" do |msg|
  msg.create_message "/msg/create/:id", 
  :action => "create"
  msg.delete_message "/msg/delete/:id", 
  :action => "delete"
  msg.message "/msg/:id", 
  :action => "get"
  # etc, etc, etc
end

Ah! A duplicação foi embora! Muito melhor.

Embora eu pessoalmente use isso primariamente para definição de routes, isso pode ser usado em qualquer lugar onde aparecem hashes de opções como último parâmetro … o que descreve a maioria das interfaces no Rails. Tem um punhado de associações em um model, todos os quais declarados dependentes de um pai?

1
2
3
4
5
6
7
class Blog < ActiveRecord::Base
  with_options :dependent => :destroy do |parent|
    parent.has_many :authors
    parent.has_many :posts
    parent.has_many :themes
  end
end

Coisa boa! (E mais um exemplo do poder dos blocos no Ruby. Para os curiosos, vocês podem ler a implementação do with_options no projeto ActiveSupport do Rails, aqui e aqui. Tudo dito, isso tem menos de 30 linhas de código, então é fácil de pegar. (Parabéns a Sam Stephenson) pela bela implementação.

Entendendo o processo de Inicialização do Rails: Parte 1

by AkitaOnRails on Jan.24.2007 at 12:21pm

Fonte: techno weenie

O processo de inicialização do Rails mudou de maneiras súbitas para o Rails 1.2 por causa da recodificação de dependências e algumas mudanças em plugins. Se estiver interessado em extender o framework Rails através de plugins, é muito importante entender esse processo. O segredo para tudo isso é mantido no Rails::Initializer#process.

Rails Summit Latin America
Recommend me at Working with Rails
Vote no Rails Podcast Brasil!
Leia a tradução do livro Getting Real
Peepcode Supports AkitaOnRails.com
Compre Repensando a Web com Rails