Pular para o conteúdo
quinta-feira, novembro 4, 2010 / eltonokada

Gerenciando N versões de Ruby com RVM

Hoje vou falar um pouco para vocês sobre o RVM (Ruby Version Manager) que viabiliza a instalação de N versões do interpretador Ruby com suas respectivas gemsets.

Ou seja você pode desenvolver o projeto “ABC” usando o Ruby 1.8.7, com seu determinado conjunto de gems dentre elas o Rails 2.3.4, e ao mesmo tempo ter o projeto “DEF” usando o Jruby e o Rails 3.0.0, simples assim sem conflitos internos e liberdade total para o desenvolvimento.

Como faço ? Vamos lá, para quem quiser se aprofundar mais dê uma boa estudada em http://rvm.beginrescueend.com/, e para os mais ansiosos vou apresentar a receita de bolo ;-)

Instalando o RVM

<<(curl http://rvm.beginrescueend.com/releases/rvm-install-head)

Habilite o comando RVM, inserindo a linha abaixo no arquivo ~/.bash_profile

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . “$HOME/.rvm/scripts/rvm”

Teste a instalação

rvm

Criando seu primeiro ambiente

Nesse primeiro exemplo vamos criar um ambiente com o Ruby Enterprise Edition, que é uma branch do MRI(Matz Ruby Interpreter, implementação canônica do Ruby) com uma série de patches que priorizam performance, escalabilidade, memória e etc. Para fazer isso faça o seguinte:

rvm install ree

Aguarde, pode demorar um pouco, ao final da instalação para conferir se tudo deu certo:

rvm list

Será apresentado uma lista do rubies instalados a partir do RVM

ree-1.8.7-2010.02 [ x86_64 ]

Para saber mais comandos:

rvm help

Agora que você instalou o Ruby Enterprise Edition, para usá-lo faça o seguinte:

rvm use ree

A partir de agora o Ruby executado será o Enterprise Edition, vamos instalar um gemset para nosso novo ambiente:

rvm gemset create meu-projeto

Foi criado um gemset dentro do ambiente do Ruby Enterprise Edition, e para usar

rvm gemset use meu-projeto

Pronto, instalamos o RVM, criamos um novo ambiente com o Ruby Enterprise Edition, e seu respectivo gemset, teoricamente tudo certo e para usarmos essas configurações em nosso projeto de uma maneira mais simples com um comando só, faça isso:

rvm use ree@meu-projeto

Entendeu ? informei ao RVM que quero usar o ambiente “ree” com o gemset “meu-projeto”

Quer algo mais simples ainda que garanto vai te poupar possíveis dores de cabeça ?

Crie um arquivo .rvmrc coloque na raiz do seu projeto com o seguinte conteúdo

rvm use ree@meu-projeto

BINGO !

domingo, outubro 31, 2010 / eltonokada

Rails Rumble 2010

Há 2 semanas atrás, junto com os amigos @alexanmtz, @pedroputz e @rodvlopes participei do Rails Rumble, onde cada time de no máximo 4 pessoas deve desenvolver um produto web usando Ruby on Rails (ou simplesmente o RACK) em 48 horas.

Foi uma experiência extremamente interessante, não conseguimos ficar entre os 25 finalistas, mas finalizamos o nosso aplicativo, que basicamente é um produto que une dois “atores”:  guias turísticos independentes, ou empresas de turismo e é claro os turistas ! Dê uma olhada no Take a Walk.

Lições que aprendi:

Um planejamento prévio ajuda bastante, principalmente com relação ao escopo do produto.

Faça um protótipo antes (sim, é permitido)

Um pequeno exercício de modelagem também não faz mal a ninguém !

Se você vai usar alguma API faça um pequeno estudo antes (no nosso caso usamos a api do google maps)

O que fizemos bem:

Equipe multidisciplinar : 2 railers @eltonokada e @rodvlopes, 1 cara de criação @pedroputz e 1 desenvolvedor com foco no front-end @alexanmtz.

Deploy da aplicação no git push usando o esquema do post-receive-hook do github, implementamos uma solução bem simples e rápida que nos atendeu muito bem: cadastramos uma url de callback que é invocada após cada git push, essa url aponta para um arquivo .rb que executa os comandos git clone, roda as migrations e restarta o nginx ;-)

Usamos o janrain sem precisar implementar nada relacionado a login em nosso aplicativo, usando os logins de facebook, twitter, e etc. ;-)

Descansamos bem, afinal de contas 1 hora programando depois de 8 horas dormindo vale mais que 5 horas programando virado ;-) fica a dica.

É isso, foi uma experiência excelente que pretendo repetir a dose no próximo ano.

E at last but not least parabéns a galera do BeerCheckin que venceu com um aplicativo MUITO bom, e sim eles são brasileiros e assim como nós uma equipe formada por profissionais da globo.com.

sábado, outubro 9, 2010 / eltonokada

Curso de Ruby on Rails Ilearn

A partir de dezembro, passo a ministrar o curso “Desenvolvimento Web com Ruby on Rails” no Ilearn. O curso terá duração de 24 horas, distribuídas em 3 sábados, antes de cair dentro do Rails, vou dar um apanhado geral na sintaxe do Ruby, histórico da linguagem, metaprogramação, sintax sugar, símbolos, blocos, enfim… confira a ementa

Espero você lá !

quinta-feira, outubro 7, 2010 / eltonokada

Visualizando as queries geradas pelo ActiveRecord

Quer visualizar as queries geradas pelo ActiveRecord em tempo de execução através do console do rails ?

É simples:

>> script/console

>> ActiveRecord::Base.logger = Logger.new(STDOUT)

>> Campanha.find(1)
SQL (0.1ms)   SET NAMES ‘utf8′
SQL (0.1ms)   SET SQL_AUTO_IS_NULL=0
Campanha Columns (1.4ms)   SHOW FIELDS FROM `campanhas`
Campanha Load (0.4ms)   SELECT * FROM `campanhas` WHERE (`campanhas`.`id` = 1)

Existe também uma outra maneira, que creio ser mais eficaz

adicione o método no seu arquivo .irbrc

def log_to
  ActiveRecord::Base.logger = Logger.new($stdout)
  ActiveRecord::Base.connection_pool.clear_reloadable_connections!
end
e no console:
log_to

após executar a consulta através dos models do activerecord

sábado, setembro 18, 2010 / eltonokada

Conflito to_json ActiveSupport

Tenho um json cadastrado em um campo do meu banco de dados, preciso editar o json e em seguida fazer o update no banco, até aí nada demais, o problema veio quando ao atualizar o json no banco, caracteres como ã, é e etc eram convertidos para unicode, isso acontecia quando fazia o seguinte:

class TesteController < ApplicationController

def meu_metodo

meujson = JSON.parse(‘{“teste”:”ÃO”}’)

meujson.to_json

end

end

com esse codigo a variável meujson recebia {“teste”:”\u00c3O”}

Para debugar resolvi executar a mesma operação em um programa ruby que fazia exatamente a mesma coisa, mas a variável meujson recebia {“teste”: “ÃO”}

Isolando o problema observei que existe um conflito do to_json.

O programa ruby que fiz usava o método to_json da gem json, mas o controller rails que extende o ApplicationController, usa o to_json do ActiveSupport, sobreescrevendo o método to_json da gem json que resolve o problema dos caracteres especiais.

Para contornar esse problema faça o seguinte:

salve o codigo abaixo em: config/initializers/patches.rb

module ActiveSupport

module JSON

module Encoding

class << self

def escape(string)

::JSON.generate([string])[1..-2]

end

end

end

end

end

pronto, agora você pode usar o to_json sem problemas !

É isso, caso alguém ache alguma solução mais elegante, comente ! Espero que seja útil ;-)

segunda-feira, julho 26, 2010 / eltonokada

Ruby e os símbolos

Meu primeiro contato com Ruby on Rails, foi em 2008 e confesso que estranhei muito toda a “feitiçaria” do Rails. Para quem está acostumado com Java o mundo de Convention over Configuration soa no mínimo estranho em um primeiro momento. Felizmente depois de algum tempo me familiarizei com a linguagem, com o framework e não quero outra vida ;-)

Como todos, comecei com o scaffold e analisando o código gerado o que me soou mais estranho foi essa sintaxe:

:alguma_coisa_estranha

Que isso ? dois pontos antes ?  que porra é essa ??

Se você também teve essa reação, vamos a explicação

:alguma_coisa_estranha é nada mais nada menos do que um Symbol em Ruby

Tá, blz isso é um Symbol, mas p que usar isso e essa sintaxe esotérica ? vamos lá

:alguma_coisa_estranha é a mesma coisa que “alguma_coisa_estranha”

ambos criam uma nova string alocando um espaço de memória reservado, e é aí que vem o pulo do gato, quando você usa a mesma string diversas vezes em seu código, da forma trivial

“alguma_coisa_estranha”

a cada vez que seu programinha ruby lê essa string ele faz o seguinte: String.new(“alguma_coisa_estranha”)

agora se você cria um símbolo

:alguma_coisa_estranha

e esse símbolo aparece várias vezes em seu programinha ruby ele não vai dar um Symbol.new(“alguma_coisa_estranha”) sempre, isso será feito apenas uma vez, é alocado um espaço de memória e a cada nova chamada ao invés do Symbol.new(“alguma_coisa_estranha”) o interpretador vai ler do mesmo endereço de memória criado no primeiro new do Symbol, economizando esforço do interpretador.

Sacou ? pronto era só isso agora nem ficou tão esquisito ;-)

Abraços!

domingo, julho 12, 2009 / eltonokada

TDD x Filosofia

Numa dessas conversas casuais com minha namorada, que é formada em comunicação social, resolvi me atrever a explicar para ela o que é TDD.

Não foi necessário eu exercitar minha didática, pois assim que eu ia começar a explicar (ensaiando mentalmente algumas analogias), ela meio que definiu muito bem. Como assim ? Bom, em seu dia-dia ela é responsável pelo jornalzinho interno da empresa em que trabalha, no nosso bate bola ela me explicou suas técnicas de redação: Primeiro ela enumera os pontos que deseja alcançar (nossos testes) e depois desenvolve o texto em acordo com os pontos (código).

TDD não se resume simplesmente a fazer testes unitários de código, já vi algumas situações em que se desenvolvia o sistema e depois eram criados os testes unitários, não, isso não é TDD.

Desenvolver orientado a testes é uma filosofia de desenvolvimento, onde primeiro você define o que você quer e depois cria-se a inteligência para se alcançar o resultado.  (Lembra quando a professorinha dizia “e melhor entender do que decorar”, pois então antes de sair fazendo testes unitários em seu sistema procure entender a essência do que esta fazendo, e os reais porques disso tudo, e esse é meu interesse nesse post ;-))

Vamos la, com essa abordagem, sua aplicação fica concisa, pragmática, orientada aos reais objetivos, sem devaneios ou loucuras ou códigos monstro que tentam se aproximar o máximo possivel de uma bala de prata, aqueles em que se fica horas e horas pensando: “… mas e se daqui algum tempo precisarmos de bla bla bla….” , se cria um mecanismo ultra complexo, onde o real objetivo da aplicação se perde, e fatalmente as exceções começam a mandar na inteligência da aplicação

Além de grande interesse por tecnologia, também sou um amante da filosofia, a base do conhecimento da civilização ocidental vem dos gregos, sim, o TDD também, a essência dessa técnica vem do Crivo de Erastótenes que foi um matemático grego que viveu em 285 a.c e criou tal algoritmo para o cálculo de números primos, e na sua técnica, antes de efetuar o cálculo ele definia o que se esperava.

Já que falei um pouquinho de filosofia, caso você esteja lendo esse post certamente você é um aficcionado por tecnologia, desenvolvimento e afins. Minha sugestão é: abra a sua mente, não leia apenas blogs técnicos, livros sobre linguagens de programação a,b ou c, leia também romances, sociologia, psicologia, biografias e quantas “ias” mais você puder. Como assim ? sim, isso vai fazer com que você exercite outras área do cérebro e certamente isso ajudará você a ser um ser humano melhor ;-)

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.