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 ;-)

domingo, junho 21, 2009 / eltonokada

playframework + spring

Como disse no post retrasado, estamos usando o playframework em nosso projeto atual. Relatei um pouco sobre a facilidade de uso, mas, como nem tudo são flores, tivemos um pequeno problema.

Precisamos fazer um mock de uma dependência externa para realizarmos os testes unitários adequadamente.

Para isso a solução que encontramos foi utilizar injeção de dependencias, dentre seus plugins, o playframework  possui o spring, que é um framework que tem como funcionalidade fundamental: a injeção de dependências. Até aí tudo bem, desenvolvemos nossos testes como manda o figurino, tudo saiu redondo, até que quando fizemos o deploy para o ambiente de desenvolvimento, as coisas não deram muito certo ;-(

Por alguma razão quando rodávamos os testes explodia no log o seguinte erro: Spring Context not started.  Mas que raios ? se em nosso ambiente local de funcionava (cowboy code total :” na minha maquina funciona !”  ;-) ). Vamos lá a diferença era: no ambiente local funcionava rodando no webserver que o playframework levantava, mas, no jbossweb ja era diferente. Estavamos chegando perto, até que com ajuda do commiter principal do projeto descobrimos que o comando “play war” (empacota a aplicação para que ela rode em um container, no nosso caso o jbossweb) nao estava copiando alguns arquivos de configuração para seus respectivos lugares, dentre eles o play.plugins que era o responsavel por apontar o uso do spring, bingo !

Prontamente eles corrigiram o bug, é por essas e outras que cada vez mais acredito na filosofia open source, que busca sempre a evolução a partir do conhecimento coletivo !

sábado, junho 20, 2009 / eltonokada

Testes unitários com google app engine

Há algum tempo atrás, comecei a fazer alguns testes usando o google appengine, coloquei uma aplicação simples em produção em pouco tempo, apesar de estranhar um pouco algumas coisas, gostei muito da praticidade e da ferramenta de administração que eles disponibilizam.  Mas… minha aplicação estava sem testes unitários. Confesso que fui um daqueles que dizia “se nao der tempo, vamos fazer sem testes mesmo”, mas o TDD é um caminho sem volta, conforme se vai praticando, surge um clarão e tudo começa a fazer sentido, o que senti mais dificuldade foi fazer os testes antes do código. Quanto a isso agradeço ao meu grande parceiro de código Emerson, que me catequisou no TDD.

Nesse final de semana voltei a trabalhar com o google app engine, só que agora em um outro projeto,  lendo os tutoriais do google appengine não tinha encontrado muitos exemplos de TDD, até que encontrei um framework esperto de testes unitarios GAEUnit http://code.google.com/p/gaeunit/

Ainda não fiz muita coisa mas em breve venho com mais impressões =)

sábado, junho 13, 2009 / eltonokada

playframework = pure fun

Eis que nosso time recebe mais uma nova missão:  disponibilizar uma aplicação para que nossos usuários se inscrevam para um processo de seleção de perfis. A primeira vista simples, não ? Mas o buraco é muiiito mais embaixo, pois o nosso querido formulário tem cerca de 70 campos, dentre eles alguns dissertativos, com validações diversificadas,  integração com outros sistemas como o de autenticação e o  de envio de vídeos, além de um fator crítico: precisamos de alta disponibilidade, e sim, essa aplicação será MUITO acessada.

Esse é o cenário, agora a solução. A última aplicação que desenvolvemos era orientada a serviços, onde tínhamos o front-end feito em Flash/ActionScript, e os nossos serviços em python, utilizando o framework django, e posso te dizer que foi bem divertido, principalmente porque aprendemos muito. Nunca tínhamos feito nada expressivo em python e tivemos um grande avanço e satisfação. Tendo isso, pensamos “vamos fazer em python” sim, foi bem divertido a linguagem e pragmática, o django e muiito bom ;-) Mas… devido aos servidores que serão utilizados e o prazo apertado, é mais viável desenvolvermos a aplicação em Java. 

Eis que surge o playframework, um full-stack framework com um propósito bem semelhante do django / rails, só que para java.

Ficamos muito impressionados, e bem felizes com a curva de aprendizado e velocidade de desenvolvimento, com configurações simples e, funcionalidades poderosas, nosso projeto está de vento em popa em apenas 3 dias de sprint. Usamos, spring, hibernate,junit, log4j, selenium e etc.. etc.. tudo isso sem configurações monstruosas,  enfim.. tudo isso de uma maneira bem ágil e sem reinventar nada !! e nos concentrarmos efetivamente no real propósito da aplicação !!! na lógica de negócio.

Em tempo de desenvolvimento ele levanta um webserver muito leve, nao há a necessidade de restarts na aplicação, e como disse com configurações extremamente simples

Vai lá e da uma olhada no play !!

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.