Posts com o tag ‘rubyonrails’

7abr2010

Utilizando debug em aplicações Rails

(0) comentários

Muita gente acha (assim como eu achava há um tempo atrás) que não é possível utilizar debug (ou “depurar”, ou “debugar”) uma aplicação Ruby on Rails. Acredito que isso se deve ao fato de Ruby ser uma linguagem interpretada, diferente de outras linguagens que requerem compilação.

Existe uma forma muito simples de se “debugar” em Rails. Primeiro vamos instalar a gem ruby-debug.

$ sudo gem install ruby-debug

Agora vamos criar uma aplicação Rails de exemplo para utilizar o debug.

$ rails prodis-debug
$ cd prodis-debug
$ rails script/generate scaffold MyModel my_text:string my_value:float
$ rake db:migrate

E ao invés de subir a aplicação com script/server, iniciamos a aplicação em modo debug:

$ rdebug script/server
/Users/Prodis/Blog/code/prodis-debug/script/server:2
require File.expand_path('../../config/boot',  __FILE__)
(rdb:1)

Esse é o momento de adicionarmos o(s) breakpoint(s) desejados, informando o arquivo e a linha do mesmo. Vamos colocar um breakpoint na ação create de MyModelsController:

(rdb:1) break app/controllers/my_models_controller.rb:43
Breakpoint 1 file /Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb, line 43

E usamos o comando cont para prosseguir com o carregamento da aplicação no servidor.

(rdb:1) cont
=> Booting Mongrel
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server

No browser, através do endereço http://localhost:3000/my_models/new, vamos criar um novo registro de MyModel.

Quando clicarmos no botão “Create”, a aplicação irá parar no breakpoint que colocamos na linha 43 de MyModelsController.

Breakpoint 1 at /Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb:43
/Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb:43
@my_model = MyModel.new(params[:my_model])
(rdb:6) 

A partir daqui podemos investigar o código e ter acesso as suas variáveis. Por exemplo, exibindo os valores da variável params:

(rdb:6) p params
{"my_model"=>{"my_text"=>"I am some text", "my_value"=>"50.00"},
"commit"=>"Create", "authenticity_token"=>"qN9mUhJelZD0V/P2CB1fhBkQrIxFvvk+NRkY5m6EFWg=",
"action"=>"create", "controller"=>"my_models"}

Mas a maneira mais fácil de inspecionar variáveis é pelo irb, que irá se manter no contexto atual onde a aplicação está parada.

(rdb:6) irb
irb(#):001:0> params
=> {"my_model"=>{"my_text"=>"I am some text", "my_value"=>"50.00"},
"commit"=>"Create", "authenticity_token"=>"qN9mUhJelZD0V/P2CB1fhBkQrIxFvvk+NRkY5m6EFWg=",
"action"=>"create", "controller"=>"my_models"}
irb(#):002:0>

Saindo do irb (com o comando exit), nós voltamos para o ambiente de debug. Há uma série de comandos úteis para se utilizar. Um deles é o list, que exibe o trecho de código onde a aplicação está parada e indicando sua linha exata através de uma seta:

(rdb:6) list
[38, 47] in /Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb
38    end
39
40    # POST /my_models
41    # POST /my_models.xml
42    def create
=> 43      @my_model = MyModel.new(params[:my_model])
44
45      respond_to do |format|
46        if @my_model.save
47          flash[:notice] = 'MyModel was successfully created.'
(rdb:6)

Para avançar até a próxima linha, usamos o comando next:

(rdb:6) next
/Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb:45
respond_to do |format|
(rdb:6)

Para listar todos os comandos disponíveis, basta entrarmos no help:

(rdb:6) help
ruby-debug help v0.10.3
Type 'help ' for help on a specific command
Available commands:
backtrace  delete   enable  help    next  quit     show    trace
break      disable  eval    info    p     reload   source  undisplay
catch      display  exit    irb     pp    restart  step    up
condition  down     finish  list    ps    save     thread  var
continue   edit     frame   method  putl  set      tmate   where 
(rdb:6)

Também podemos visualizar a ajuda de um comando específico:

(rdb:6) help next
n[ext][+-]?[ nnn]	step over once or nnn times,
'+' forces to move to another line.
'-' is the opposite of '+' and disables the force_stepping setting.
(rdb:6) 

E para continuar a execução da aplicação, usamos o comando continue (ou um dos seus álias c ou cont)

(rdb:6) continue
Processing MyModelsController#create (for 127.0.0.1 at 2010-03-20 12:20:54) [POST]
Parameters: {"my_model"=>{"my_text"=>"I am some text", "my_value"=>"50.00"},
"commit"=>"Create", "authenticity_token"=>"qN9mUhJelZD0V/P2CB1fhBkQrIxFvvk+NRkY5m6EFWg="}
MyModel Create (0.5ms)   INSERT INTO "my_models" ("my_text", "created_at", "updated_at", "my_value")
VALUES('I am some text', '2010-03-20 15:45:19', '2010-03-20 15:45:19', 50.0)
Redirected to http://localhost:3000/my_models/4
Completed in 1464995ms (DB: 1) | 302 Found [http://localhost/my_models]

Existe também uma outra maneira de se “debugar” com a gem ruby-debug. Nós podemos colocar uma instrução debugger (que na verdade é um método) em qualquer lugar do código para marcar como breakpoint. O Railscast #54 Debugging with ruby-debug mostra os passos de como fazer isso.

Eu particularmente gosto de configurar os breakpoints direto no Terminal, evitando assim ter que colocar qualquer informação de debug no código.

Esse esquema de debug não se restringe somente à aplicações Rails. Você pode muito bem utilizá-lo com código Ruby diretamente. Por exemplo, o código abaixo é do arquivo some_class.rb:

#lib/some_class.rb
class SomeClass
  def some_method
    # do something here
  end

  def other_method
    # do another thing here
  end
end

É só utilizar o comando rdebug passando o nome do arquivo:

$ rdebug lib/some_class.rb
/Users/Prodis/Blog/code/prodis-debug/lib/some_class.rb:2
class SomeClass
(rdb:1) 

Para informações mais detalhadas sobre a gem ruby-debug, veja a documentação completa.


Post original:
http://prodis.pro.br/2010/03/20/utilizando-debug-em-aplicacoes-rails

.

3abr2009

Kit de integração do Pagamento Certo em Ruby on Rails

(0) comentários

Para você que quer integrar o Pagamento Certo à sua loja virtual em Ruby on Rails, está disponível o kit de integração com todas as informações necessárias. Você pode baixar esse novo kit clicando aqui.

Para quem ainda não conhece, Ruby on Rails é um framework para desenvolvimento ágil de aplicações Web baseado em Ruby, uma linguagem moderna, dinâmica e orientada a objetos. Ruby on Rails aumenta a velocidade e a produtividade do desenvolvimento de suas aplicações Web sem comprometer a qualidade do código.

A Locaweb oferece suporte a Ruby on Rails nos seus planos de hospedagem Linux.

Mais informações:
Wiki Locaweb – Ruby on Rails
Ruby, o que que é isso?
MVC e Ruby on Rails, uma versão simplificada
Instalando Rails no seu PC (Windows)

6dez2008

Hospedagens Linux: Tudo novo desde Agosto!

(5) comentários

Nossa hospedagem compartilhada funciona atualmente da seguinte forma: cada servidor tem centenas de clientes. Quando a máquina “enche”, cria-se uma nova máquina e assim por diante.

Isso tem diversas consequências, a primeira é que as máquinas cheias vão ficando para trás em termos de atualização. Tudo que se faz de novo tende a aparecer primeiro nas máquinas mais novas (e hoje instalamos servidores novos literalmente toda semana). Dependendo do que estamos fazendo, podemos replicar na maioria das máquinas antigas também. Porém, nem sempre isso é possível pois clientes que já estão com tudo funcionando, de repente podem ter seu site quebrado se atualizamos o PHP de 4 para 5 nas máquinas antigas, por exemplo. É um processo que precisamos sempre tomar muito cuidado.

Desde agosto deste ano, fizemos um grande esforço e colocamos várias novidades, mas fico surpreso que muitas pessoas ainda não notaram essa diferença. Dentre as principais novidades:

  • Suportamos ambos PHP 4 e PHP 5. Mais do que isso, nas máquinas novas os clientes agora podem editar seus próprios arquivos .htaccess e php-cgi.ini. Ou seja, você pode configurar o PHP como quiser na sua conta. Isso permite que praticamente toda aplicação PHP como WordPress, Joomla, Drupal e outros mais rodem sem problemas.
  • Acho que esse é o que mais apareceu, mas suportamos Ruby on Rails e Merb via o módulo Phusion Passenger. Tudo que você precisa para subir seu website em Ruby está disponível. Aliás, sempre estamos atualizando todas as nossas RubyGems, ou seja, neste momento já temos o novíssimo Rails 2.2 instalado em nossas hospedagens.
  • Mais do que isso, a idéia é que você possa rodar tudo que há de mais moderno em termos de open source e nesse caso Python também entrou na lista faz algum tempo. Com a configuração de WSGI você pode colocar suar aplicações em Django, Pylons, etc.
  • Por incrível que pareça, muita gente não sabia, mas faz tempo que nossas hospedagens já suportam SSH (e SFTP, e SCP). Portanto, sempre use SSH para gerenciar sua conta e sempre use SCP para transferir arquivos. Tudo criptografado e seguro.
  • Outra coisa que pouca gente viu é que todas as máquinas novas já vem pré-instaladas com GIT, o mais moderno versionador de código-fonte distribuído. Como GIT pode ser facilmente exposto via SSH, a configuração necessária é basicamente zero. Apenas adicione a chave pública de SSH no arquivo ~/.ssh/authorized_keys de sua conta e pronto.
  • Também já suportamos Subversion. Esse de fato é culpa minha porque ainda não fiz um blog post explicando como usar. Mas sim, já suportamos faz algum tempo.
  • Além disso contamos também com o Instalador de Aplicativos, para instalar de forma trivial aplicativos famosos como WordPress, Drupal, Joomla e muitos outros. Basta acessar pelo seu Painel de Controle e com poucos cliques sua aplicação já estará instalada e pronta para usar.
  • E para o acabamento final, ainda temos ferramentas de SEO para ajudar ainda mais o sucesso da sua aplicação.

Hospedagens compartilhadas funcionam todas mais ou menos da mesma forma. Mas a Locaweb está preparando grandes surpresas ainda para 2009 que vão melhorar ainda mais nossa plataforma e sua experiência de usuário. O objetivo é de criar no ano que vem a melhor hospedagem Linux/Open Source sem nenhuma margem para dúvidas.

Para saber se sua hospedagem já conta com todas essas novidades você pode fazer da seguinte maneira: faça login via SSH e digite “rails -v”. Se a resposta for “Rails 2.2.2″ ou superior, você já está na nova hospedagem. Ou digite o comando “cat /etc/redhat-release” se a versão for “5.2″ ou superior também já está nas máquinas novas.

Quem ainda está em máquinas antigas, pode pedir migração para máquinas novas, mas apenas caso realmente precise de algum dos novos recursos. 

11nov2008

Suporte a Merb 1.0 na Hospedagem Compartilhada Linux

(1) comentário

A Locaweb suporta todos os principais frameworks open source, em especial os de Ruby. Além do Ruby on Rails agora temos também o suporte a Merb.

Na plataforma Ruby existem diversos frameworks web além do Ruby on Rails. Um deles é o Merb, um framework mais simples e mais flexível. Por exemplo, você pode substituir o ActiveRecord – que é parte obrigatória do Rails – por DataMapper, que implementa uma maneira diferente de lidar com mapeamento objeto-tabela. Ela tenta ser um pouco mais leve e rápida colocando menos módulos padrão no framework, deixando que você mesmo escolha os módulos que quer e conectando-os no seu aplicativo. 

A versão 1.0 acabou de sair, agora no dia 8 de novembro. Se você quiser aprender mais sobre Merb, leia este artigo, que lista 44 links para outros sites com tutoriais e mais explicações.

ler mais

22ago2008

Tutorial de Rails Caching – Parte 1

(4) comentários

Em fevereiro deste ano, o Gregg Pollack – do podcast RailsEnvy – publicou uma série em 2 partes sobre o sistema básico de cache do Rails. Resolvi traduzir uma parte porque vi muito pouca gente falando sobre isso e é algo muito importante.

Apesar do tutorial dele ser muito bom, não vou traduzí-lo ao pé-da-letra e sim adaptá-lo um pouco para torná-lo mais simples. Todo o código mostrado nesse artigo está disponível no Github (clique em Download).

Cache é importante e, no Rails, é razoavelmente simples para a maioria dos casos. Continue lendo!

Entendam que existem diversas técnicas para aumentar performance. Uma coisa que não é difícil e todos deveriam implementar de imediato é Page Caching, no mínimo na sua página principal. Meu blog, por exemplo, na primeira requisição, o Rails é chamado para processar os posts mais recentes, listar os comentários, etc.

Da segunda chamada em diante, vocês estão recebendo uma página estática que fica empublic/index.html!! Essa página é servida diretamente pelo Apache, sem sequer tocar no Rails. Para todos os efeitos é um site estático. E ele permanece assim até que eu publique um novo post ou alguém coloque algum comentário. Então a página é apagada e a próxima requisição executa o Rails novamente, gerando um novo index.html estático.

Esse é o padrão mais comum, aumenta sua performance algumas ordens de grandeza, e o mais importante: na maior parte dos casos é quase trivial de se implementar! Não é inteligente fazer o Rails – ou qualquer outra aplicação em qualquer outro framework web – regerar a mesma página o tempo todo, é um desperdício de recursos e sempre será muito mais lento do que servir diretamente uma página estática.

Claro, muitas outras coisas podem tornar seu site lento: muitas imagens pesadas, muitos arquivos de stylesheet e javascript, design cheio de tabelas dentro de tabelas. Estamos falando apenas do HTML básico, mas já é um começo. E vamos lembrar: não se deve aplicar todos os truques possíveis que tenham ‘performance’ no título, porém existem meia-dúzia de boas práticas que podem ajudar sempre. Aliás, coloquem Page Caching apenas em algumas páginas, não em todas!

Alguns critérios para Page Caching são:

  • se a página tem a mesma ‘cara’ independente de quem está olhando
  • se sua página está disponível ao público, sem autenticação (ou seja, ela não é personalizada por usuário)

ler mais