NOSQL
2009 foi o ano do NOSQL. Muito se falou sobre as famosas alternativas de bancos de dados não-relacionais. Dentre as mais famosas temos Couch DB, Mongo DB, Redis, Tokyo Cabinet, etc. Aprenda mais sobre alguns deles nestes artigos:
- Key-Value Stores in Ruby: The Wrap Up – esta série de artigos dão uma boa introdução sobre cada uma das alternativas de NOSQL. Se você ainda não conhece muito sobre o assunto, esta é uma boa introdução.
- Introducing Friendly: NoSQL With MySQL in Ruby – alguns não pensam muito sobre isso, mas no fim dos anos 90 eu já usava esta técnica. Agora ela ficou famosa por causa do FriendFeed e o James Golick criou uma implementação para Ruby chamada “Friendly”. A idéia é simples: criar um jeito de ter modelos “schema-less” usando o bom e velho MySQL por baixo. Mas como? Simples, serializando seus objetos em campos “TEXT” em uma tabela genérica no seu banco. Claro, isso elimina muitas das vantagens de um banco “relacional”, mas por outro lado, se você prefere lidar com tecnologia mais conhecida, esta é uma alternativa. Preste atenção às premissas e limitações, a idéia aqui não é criar uma solução “one-size-fits-all”.
- Why I think Mongo is to Databases what Rails was to Frameworks – de todos os NOSQL disponíveis agora, eu também sou da opinião que o mais simples, completo, estável e robusto para se usar agora mesmo é o Mongo DB. Cada NOSQL tem uma característica mais forte, mas o Mongo é um dos mais balanceados. Ele não é nem o mais rápido, nem o que tem mais funcionalidades, mas ele funciona, e bem.
- MongoId – e se você se convenceu que o Mongo é interessante, vale a pena acompanhar o novo projeto MongoId. Antes dele a melhor gem era o MongoWrapper, mas agora são duas excelentes opções.
RubyGems
A primeira grande coisa foi que o Gemcutter se tornou o repositório sancionado pela Ruby Central em vez do bom e velho rubyforge.org. As novas versões do rubygems já trazem o Gemcutter como repositório oficial. Por causa disso o assunto de como criar boas gems voltou à tona o que é muito bom. O processo de criar gems é muito simples, existem diversas ferramentas para ajudar mas é possível criar uma gem rapidamente sem esforço. Para ajudar:
- Gem Packaging: Best Practices – nesse artigo o Josh Peek explica sobre Load Paths e qual a forma correta para lidar com dependências.
- Using the New Gem Bundler Today – o Rails 3 dependerá de uma nova gem chamada Bundler. Ele será o responsável por lidar com dependências de gems em seus aplicativos Rails. Mas ele já está disponível, está robusto e pode ser usado hoje mesmo em qualquer aplicação Ruby incluindo Rails 2.×. A idéia é que ele usa a infra-estrutura inteira do Ruby Gems e cria uma estrutura idêntica de um repositório normal de Gems embutido dentro de sua aplicação. Veja esse artigo do Yehuda Katz para entender como.
- Hacking someone’s gem with github and gemcutter – Aqui o Dr. Nic explica como criar suas próprias gems personalizadas. Antigamente o próprio Github fazia isso mas ele deixou de ser um repositório de gems (mais sobre isso abaixo).
- Como montar um servidor de gems privado – neste artigo o Carlos Brando explica como gerenciar repositórios de gem privados (de forma que você não precisa ir à internet para configurar diversos servidores, por exemplo).
- Ruby, Rubygems e $LOAD_PATH ou Como funciona o require de gems – complementar ao artigo do Josh Peek, o Roger Leite explica em detalhes o comportamento de Load Paths e Ruby gems.
- Importando e exportando suas gems com Rubygems Snapshot – o Roger Leite mostra mais formas de organizar e gerenciar seus repositórios de gems, criando snapshots, facilitando o processo de recriar o repositório em outra máquina, por exemplo.
Github
Outra notícia relevante é a mudança do Github da Engine Yard para a Rackspace. Foi um processo até que razoavelmente estável considerando o tamanho do Github.
- GitHub is Moving to Rackspace! – Este é o post do anúncio explicando a causa da mudança e qual é a infraestrutura na Rackspace. Muito interessante para quem gosta da parte de infra.
- Gem Building is Defunct – Aqui está o anúncio que o Github deixa de compilar e ser repositório de gems. Uma das motivações é que com o Gemcutter não havia necessidade mais de serviços duplicados e cada empresa passou a fazer o que faz melhor.
- Unicorn! – Surpreendentemente, o pessoal do Github achou melhor usar uma solução de deployment de Ruby chamada Unicorn. Esse post explica exatamente porque e como fizeram isso. Uma das razões é que quando você tem dezenas de instâncias de Ruby e precisa fazer um upgrade, não quer ter downtime. Um recurso que o Unicorn tem e que o Passenger (até a versão corrente) não tem é “rolling update”, ou seja, as instâncias vão se atualizando em sequência e processos ainda ativos primeiro terminam antes de atualizar, em vez de derrubar tudo pra subir tudo de uma vez só.
- unicorn.god – este artigo complementa o anterior mostrando como eles usam o serviço God para monitorar o Unicorn. Eu particularmente ainda acho que o Unicorn é bom para situações muito específicas e minha recomendação padrão continua sendo o Passenger. Ou seja, só escolha fora do Passenger se você souber exatamente quais são seus requisitos técnicos e entende perfeitamente como funciona cada engrenagem de ambas as arquiteturas.
- How We Made GitHub Fast – este é o artigo mais legal sobre a infra deles. Ninguém imagina o que acontece a cada requisição que você faz no Github, mas é uma cadeia longa e complexa de ações. Para tornar isso rápido, eles precisaram realmente espremer cada etapa e o resultado é muito bom.
- Introducing BERT and BERT-RPC – mais do que apenas espremer tecnologias já existentes, uma boa equipe de infra/devel sabe quando e como criar novas tecnologias. E o Github criou um novo sistema de Remote Procedure Call chamado BERT, usando Erlang e um protocolo binário de serialização. Vale a pena aprender como isso funciona.
- Introducing Resque – e falando em novas tecnologias, eles também criaram um novo sistema de fila de tarefas chamado Resque, por baixo usando Redis como storage. Ele substitui o bom e velho Delayed Job, tem vantagens e desvantagens mas no geral eu particularmente achei uma excelente solução e posso recomendá-la para uso em produção hoje. É simples de configurar, de usar e de monitorar.
- Optimizing asset bundling and serving with Rails – velocidade de uma aplicação web é muito mais do que ciclos de CPU consumidos no servidor. Do lado do usuário, o tempo de carga e renderização é ordens de grandeza mais importante e a maioria dos desenvolvedores ignora isso. Esse artigo descreve várias estratégias para lidar com isso. Se for ler pelo menos um artigo do Github, comece com este.
Rails 3
O desenvolvimento está intenso no trunk do Rails Edge, não falta muito para o lançamento pelo menos de um Release Candidate. O Yehuda Katz está particularmente acelerado no processo, escrevendo toneladas de código e ao mesmo tempo de artigos explicando pontos chaves da nova arquitetura do Rails. A idéia é: para desenvolvedores que não sabem lidar com as entranhas do framework, tudo deve funcionar mais ou menos igual. Para desenvolvedores mais hard-core, as entranhas do Rails oferecem excelentes surpresas e novas possibilidades.
- How to Build Sinatra on Rails 3 – O Sinatra é um framework ultra-minimalista para aplicações Web. A idéia deste artigo foi demonstrar que o Rails 3 está tão modular que é possível emular as funcionalidades do Sinatra diretamente.
- Unobstrusive JavaScript helpers in Rails 3 – uma das minhas funcionalidades favoritas no Rails 3 é a possibilidade de conectar qualquer framework Javascript além do Prototype e Scriptaculous. Mais do que isso, a parte de Ajax foi toda refatorada e agora é não-obstrusiva por padrão. Vale a pena entender isso neste artigo.
- Generic Actions in Rails 3 – o Django tem um recurso útil quando se precisa chamado “Generic Views”. No Rails 2.x dá para ter o mesmo comportamento mas não é tão direto nem óbvio. Mas no Rails 3 essa funcionalidade agora é quase idêntica e com muitas possibilidades. Esse artigo demonstra como a engine de roteamento foi bastante trabalhada e está muito mais flexível e elegante.
- The Rails 3 Router: Rack it Up – falando na engine de roteamento, aqui o Yehuda fala em detalhes sobre a nova DSL de rotas, a integração com Rack e muito mais. É uma parte bastante importante do novo Rails.
- Rails and Merb Merge: The Anniversary – o Yehuda promete uma série de artigos destinados a detalhar tudo que mudou no Rails 3 desde o anúncio do merge com o Merb. Neste primeiro artigo ele fala sobre a flexibilidade e modularidade dos novos ActiveSupport e ActionController, permitindo customizar o peso do Rails a seu gosto.
Muitos Rubies
Várias novas implementações de Ruby estão atingindo bom grau de maturidade, em particular o Rubinius, MacRuby e Maglev. Acompanhe cada um desses projetos pois, em 2010, alguns deles devem começar a ser usados em produção com mais frequência.
- Improving the Rubinius Bytecode Compiler – depois de muita espera, finalmente o Rubinius está num ponto “usável”. É uma boa hora para entender como ele funciona. Nesse artigo o Brian Ford explora os princípios por trás do projeto, fala sobre o parser e o compilador.
- Rubinius 1.0 Brings MRI 1.8 Compatibility and Near Speed Parity – este artigo do InfoQ dá uma breve introdução ao projeto. Se você nunca explorou o Rubinius, este é um primeiro passo.
- MagLev Alpha Released: A New, Scalable Ruby Implementation – o Maglev quase virou um vaporware. Depois de um longo hiato, finalmente ele também atingiu um estágio onde dá para começar a experimentar com ele. Ainda é bem “alpha” mesmo, mas as possibilidades são muito interessantes. Entenda que no Maglev o que mais interessa é a possibilidade de usar o repositório orientado a objetos, o GemStone propriamente dito, para serializar e persistir quantidades massivas de objetos Ruby diretamente sem precisar de um ORM.
- How Phusion Built A More Efficient Ruby 1.8 Interpreter – os garotos da Phusion estiveram na Califórnia pouco tempo atrás e palestraram ao Google. A implementação alternativa de Ruby mais usada hoje provavelmente é o Ruby Enterprise Edition e nesse vídeo eles explicam em detalhes o que torna o REE tão melhor que o Ruby MRI padrão. Entenda sobre garbage collector e outras otimizações.
- HOW TO BUILD LATEST RUBY ON WINDOWS – o Ruby para Windows, do Luis Lavena, é a implementação de Ruby que menos recebe as devidas graças. Não fosse pelo Luis, o Windows seria órfão de Ruby. Seu trabalho recente no Ruby Installer, criando maneiras de ter gems multi-plataforma, é muito importante não só para Windows, mas se torna mais relevante quando você precisa de gems para Rubinius, JRuby, etc.
- rake-compiler: safe list of Ruby versions that can be cross-compiled – o Ruby nunca foi feito para ser muito multi-plataforma, e aqui o Luis descreve alguns dos desafios em se tentar compilar diferentes versões de Ruby em diferentes ambientes.
Aprendendo Ruby
- Why Ruby is an acceptable LISP – o Eric Kidd dá uma pequena introdução mostrando algumas semelhanças de funcionalidades funcionais entre Ruby e Lisp. Se você programa em Ruby e nunca tinha visto Lisp, talvez seja uma introdução adequada.
- Emulating Smalltalk’s Conditionals in Ruby – existem diversas funcionalidades em outras linguagens que podem ser facilmente emuladas no Ruby – não quer dizer que deva ser – mas artigos como este do Yehuda demonstram a flexibilidade do Ruby, no caso, em criar condicionais orientadas a objetos como no Smalltalk. Ele já tinha escrito algo semelhante ao demonstrar uma implementação em Ruby do equivalente a Decorators de Python.
- Better Ruby Idioms – no seu trabalho de refatorar o Rails, o Yehuda notou um padrão que no fundo todo rubista conhece mas acaba ignorando: a forma “não tão elegante” como o Rails implementa e usa módulos. Por causa disso, muitos desenvolvedores acabam copiando o “jeito Rails” e cometem o mesmo erro. Nesse artigo Yehuda mostra qual é a melhor forma de organizar seu código em módulos. Vale a pena ler isso mesmo se você acha que já sabe tudo de módulos.
- What are Metaclasses – algum tempo atrás surgiu uma discussão no Twitter sobre metaclasses, eigenclass, etc. No fim o Jim Weinrich resumiu o que ele entende sobre Metaclasses nesse artigo. Não é um assunto fácil para iniciantes, por isso continue sempre buscando referências sobre o assunto.
- Ruby Metaprogramming Simplified – e já que estamos falando de metaclass, nada melhor do que recapitular como funciona meta-programação em Ruby. Se quiser ser um bom rubista é fundamental que se conheça essas técnicas.
- What is a ruby object? – o Joe Damato é conhecido por lidar com low level no Ruby. Nesse artigo ele usa o Memprof.dump para explicar a anatomia de um objeto Ruby.
- memprof: A Ruby level memory profiler – e se gostou do memprof usado no artigo anterior, este mostra como instalá-lo e começar a usá-lo.
- No returns – esta é uma pequena discussão sobre maneiras “elegantes” de se inicializar variáveis no construtor de uma classe Ruby. O Josh Susser contexta uma opinião do Chris Wanstrath e acho que a discussão é interessante de acompanhar para quem se importa com código bem escrito.
- Implementing DSL Blocks – quando se fala em Domain Specific Languages (DSL), pode parecer difícil criar uma, mas não se trata de teoria de foguetes aqui. Um dos truques é entender como manipular blocos no Ruby. Boa parte na criação de uma DSL envolve lidar com blocos, portanto leia este artigo com calma.
- Ruby Version Numbers Done Right?_ – versões como “1.8.7” ou “1.9.2” podem parecer coisas simples de lidar. Mas como você faz operações para checar, por exemplo, quem é maior: 1.9 ou 1.10? Neste artigo você vai entender como lidar com operações entre versões.
- Ruby Daemons and Angels – então você quer criar um daemon mas não sabe como? Este artigo lhe dará uma introdução a esse tema e como lidar com sinais do sistema operacional e tudo mais.
Dicas Gerais para Rails
A seguir alguns artigos aleatórios com técnicas e dicas para melhorar mais ainda seu dia-a-dia de desenvolvimento com Rails:
- Five Ridiculously Awesome Cucumber (and Webrat) Features – todos já conhecem o Cucumber a esta altura do campeonato (espero). O básico é simples, mas ele tem diversas funcionalidades que poucos usam ou conhecem, por isso vale a pena ler este artigo, por exemplo, para usar o componente Webrat para dirigir simulações no Selenium.
- 7 coisas que você precisa conhecer no RSpec – e se você usa Cucumber provavelmente também usa RSpec. Neste artigo o Nando Vieira descreve funcionalidades às vezes não tão conhecidas e que você definitivamente vai gostar de conhecer.
- Criando eventos recorrentes com Recurrence – mais um artigo do Nando, mas agora explicando como criar e gerenciar tarefas recorrentes com sua biblioteca “Recurrence”.
- DB Charmer – ActiveRecord Connection Magic Plugin – em alguns cenários, você tem uma aplicação Rails que precisa se conectar a múltiplos bancos de dados. Para isso temos plugins como o DB Charmer, que permite que você configure diretamente em cada model onde ele encontrará a tabela que precisa. Um cenário é quando você tem replicação master-slave e quer que consultas vão para os slaves e escrita para o master. Há muito que esse plugin oferece, portanto leia sua documentação com calma.
- Utilizando Formtastic e Inputs – se você ainda não usa o Formtastic, deveria começar. É a forma mais simples para gerar formulários semanticamente corretos. Este artigo mostra como usar as gems Formtastic e Inputs em conjunto para tornar o desenvolvimento de formulários complexos bem menos trabalhoso.
- Jammit – como falei antes, quando se fala em performance de aplicações Web, a primeira coisa que você deve se preocupar é com assets, com arquivos javascript, stylesheets e tudo mais que torna a experiência do usuário lenta do ponto de vista de carga. O Jammit vai ajudá-lo a otimizar isso, comprimindo tudo o máximo possível.
- Pancake – Como empilhar e acoplar aplicações baseadas em Rack – não é exatamente Rails, mas a comunidade em torno do Rack cresceu muito. O Pancake é uma das formas de “empilhar” diferentes projetos de Rack numa aplicação web. Não sei se é muito útil, mas o conceito é interessante e o conhecimento sobre Rack é importante.
- Rango: A New Modular Ruby Webapp Framework – e aqui temos mais um novo framework web em Ruby para competir com Rails ou Sinatra. A idéia do Rango é usar uma infraestrutura de Rack para criar um framework que implementa muitas das idéias do Django. Novamente, não sei se é prático, mas vale a tentativa e pelo menos é um estudo de caso interessante para quem tem interesse em frameworks.
- Racksh – Um console como o do Rails para aplicações Ruby baseadas em Rack – e com tantos frameworks web feitos com Rack, nada melhor do que um console parecido com o “script/console” do Rails, para que você possa manipular seus objetos interativamente.
- RAILS CMS ALTERNATIVES – infelizmente a comunidade Rails ainda não tem os killer-apps em CMS como Joomla ou Wordpress. Em termos de “volume”, no entanto, até que já temos muitos CMS. Este artigo lista nada menos que 26 alternativas entre projetos ativos e projetos já mortos. Minha recomendação: escolha um que você gosta mais e passe a colaborar para melhorá-lo em vez de criar mais um do zero.
- Apostila de Ruby on Rails RR-71 liberada para download – se você ainda está tentando aprender Rails, boas notícias, a Caelum liberou a apostila que ela usa nos cursos. Deve dar para seguir sem grandes problemas para ter uma boa introdução ao framework. Baixe hoje mesmo!
- RailsTutorial.org: Michael Hartl’s Awesome New Rails Tutorial – e se você quer um bom tutorial de Rails, esta é outra boa alternativa. Ela é bem básica, mas suficientemente detalhada para começar.
- 21 Rack Middlewares To Turbocharge Your Ruby Webapps – então você começou a se interessar por Rack? Veja este agregado de diversos projetos sobre Rack. Lembrem-se que o Rails 2.3 atual suporta middlewares Rack, portanto é importante conhecer esses projetos.
- Community Highlights – em Outubro, o Gregg Pollack fez um apanhado geral de diversos projetos open source da comunidade.
- 9 New Ruby Libraries To Check Out – finalmente um último agregado de bibliotecas aleatórias que podem ser úteis para seus projetos.
Restful de Verdade
Um projeto que eu particularmente gostei de ver surgindo foi o plugin Restfully, criado pelo Guilherme Silveira e Cauê Guerra, da Caelum. Tecnicamente não estamos falando de nenhum grande volume de código, o importante é o conceito explorado de serviços verdadeiramente Restful, segundo Jim Webber, Savas Parastatidis, Ian Robinson. Entenda esse conceito e passe a pensar diferentes sobre serviços Web “Restful”:
- Interview with Guilherme Silveira, creator of Restfulie – nessa entrevista o Guilherme explica aos leitores da InfoQ quais foram as motivações do projeto, porque ele é importante e muito mais do contexto sobre serviços web no mercado.
- Guilherme Silveira on RESTEasy – nesse post curto o próprio Jim Webber dá contexto sobre o projeto do Guilherme, especialmente em relação ao RESTEasy.
Plataforma Tec
O pessoal da Plataforma Tec está à todo vapor e tem soltado diversos artigos técnicos e projetos open source muito interessantes que achei legal agrupar aqui. Para quem não conhece se trata de uma pequena consultoria de projetos, voltada em Rails, e localizada em São Paulo.
- Devise: flexible authentication solution for Rails – o Devise veio para se colocar na dianteira das maneiras mais elegantes de se acrescentar autenticação a uma aplicação Rails, sendo um excelente concorrente ao Authlogic, um dos mais usados hoje.
- Understanding Devise roles – complementando o artigo acima, entenda sobre “roles” no Devise.
- Controllers, mount up! The Plataforma way! – entenda como criar controllers realmente magros, especialmente usando o excelente plugin Inherited Resources, além de técnicas para organizar código reusável entre controllers.
- One in Three: Inherited Resources, Has Scope and Responders – uma das novas funcionalidades do Rails 3 são os responders, que tornarão seus controllers mais magros e mais organizados, evitando muita repetição. O José Valim já tem essa funcionalidade embutida no Inherited Resources e você já pode usá-los agora mesmo em projetos de Rails 2.×. O resultado desse trabalho gerou uma segunda gem separada, chamada apenas de “Responders” e que será compatível tanto com Rails 2.x quanto Rails 3.
- Subdomains and sessions to the rescue! – tirar proveito de subdomínios pode ser um pouco complicado se você não conhece o que acontece por trás, especialmente para lidar com sessions, por isso recomendo ler este artigo para entender como proceder.
Considerações
Um artigo que particulamente eu gostei muito de ter lido foi o Thank you, Rails, escrito por ninguém menos que Jacob Kapan-Moss, um dos mantenedores do framework Django, da comunidade Python.
Ele demonstrou como um desenvolvedor que realmente gosta do ofício pensa. Em vez das picuinhas de sempre como “Django é melhor que Rails” ou “Python é melhor que Ruby”, ele reconheceu a importância que o Rails teve para a comunidade de desenvolvimento em geral, quebrando o paradigma dos frameworks-gigantes e do desenvolvimento web enquanto ofício repetitivo para operários em fábricas de software.
Recomendo que todos leiam esse discurso e pensem melhor sobre o mercado, sobre seu papel e como colaborar mais em vez de perder tempo com discussões destrutivas.