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 !
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.
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á !
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
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
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!
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
