<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Jose.gr</title>
  <id>http://jose.gr</id>
  <updated>2010-09-28T00:00:00Z</updated>
  <author>
    <name>Jos&#233; Galisteo Ruiz</name>
  </author>
  <entry>
    <title>Table-less model, validations, rails 3 and formtastic</title>
    <link href="http://jose.gr/2011/12/06/table-less-model-validations-rails-3-and-formtastic/" rel="alternate"/>
    <id>http://jose.gr/2011/12/06/table-less-model-validations-rails-3-and-formtastic/</id>
    <published>2011-12-06T00:00:00Z</published>
    <updated>2011-12-06T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;Antes de &lt;em&gt;Rails 3&lt;/em&gt; y sacar las validaciones a un modulo a aparte hab&#237;a que montar un peque&#241;o pollo para esto, pero ahora es bastante f&#225;cil.&lt;/p&gt;

&lt;p&gt;Imaginemos que tenemos queremos un formulario de contacto con los campos &lt;em&gt;email&lt;/em&gt; y &lt;em&gt;comment&lt;/em&gt;, adem&#225;s lo hacemos en &lt;a href="https://github.com/justinfrench/formtastic"&gt;formtastic&lt;/a&gt; y &lt;a href="http://haml-lang.com/"&gt;haml&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
# new.html.haml
= semantic_form_for(@contact, url: contacts_path, html: { method: :post}) do |f|
  = f.inputs do
    = f.input :email
    = f.input :comment, as: :text
  = f.buttons do
    = f.commit_button
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el controlador obviamente tendremos que cargar el &lt;em&gt;@contact&lt;/em&gt; y procesar el formulario:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
contacts_controller.rb
....
def new
  @contact = Contact.new
end

def create
  @contact = Contact.new(params[:contact])
  # En vez de guard enviamos el email si va todo bien
  if @contact.send_mail
    redirect_to new_contacts_path, notice: "Thansk for your comment"
&lt;/code&gt;&lt;/pre&gt;
</summary>
    <content type="html">&lt;p&gt;Antes de &lt;em&gt;Rails 3&lt;/em&gt; y sacar las validaciones a un modulo a aparte hab&#237;a que montar un peque&#241;o pollo para esto, pero ahora es bastante f&#225;cil.&lt;/p&gt;

&lt;p&gt;Imaginemos que tenemos queremos un formulario de contacto con los campos &lt;em&gt;email&lt;/em&gt; y &lt;em&gt;comment&lt;/em&gt;, adem&#225;s lo hacemos en &lt;a href="https://github.com/justinfrench/formtastic"&gt;formtastic&lt;/a&gt; y &lt;a href="http://haml-lang.com/"&gt;haml&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
# new.html.haml
= semantic_form_for(@contact, url: contacts_path, html: { method: :post}) do |f|
  = f.inputs do
    = f.input :email
    = f.input :comment, as: :text
  = f.buttons do
    = f.commit_button
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el controlador obviamente tendremos que cargar el &lt;em&gt;@contact&lt;/em&gt; y procesar el formulario:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
contacts_controller.rb
....
def new
  @contact = Contact.new
end

def create
  @contact = Contact.new(params[:contact])
  # En vez de guard enviamos el email si va todo bien
  if @contact.send_mail
    redirect_to new_contacts_path, notice: "Thansk for your comment"
  else
    flash[:error] = "Error"
    render 'new'
  end
end
....
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La gracia viene en el modelo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
class Contact

  # Incluimos el modulo de validaciones
  include ActiveModel::Validations

  # Usamos las validaciones como normalmente
  validates :email, presence: true
  validates :comment, presence: true


  # Hacemos que los attributes puedan ser leido
  attr_reader :email, :comment

  # Creamos un metodo para poder incializar el objeto
  def initialize(options = {})
    @email = options[:email]
    @comment = options[:comment]
  end

  # En vez de guardar el formulario lo enviamos por email
  # adem&#225;s devolver si true o false para saber saber en el
  # controlador si ha ido todo bien
  def send_mail
    if self.valid?
      ContactMailer.send_contact(self).deliver
      true
    else
      false
    end
  end


  # Los siguientes dos m&#233;todos me los pide formtastic,
  # realmente no se si el form_for tambi&#233;n los pide
  def keys
     nil
  end

  # Este m&#233;todo lo usar&#225; para el id en el html del formulario
  # es suficiente con que lo dejeis a nil
  def to_key
    nil
  end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para rematar y validar el formato del email me gusta mucho la gema &lt;a href="https://github.com/hallelujah/valid_email"&gt;valid_email&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
...
validates :email, presence: true, email: true
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como veis el c&#243;digo no es nada complicado, pero me gusta como ha quedado y creo que es bastante rails.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Liquid y will_paginate</title>
    <link href="http://jose.gr/2011/08/17/liquid-y-willpaginate/" rel="alternate"/>
    <id>http://jose.gr/2011/08/17/liquid-y-willpaginate/</id>
    <published>2011-08-17T00:00:00Z</published>
    <updated>2011-08-17T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;Las &#250;ltimas &#250;ltimas semanas he estado trabajando con &lt;a href="Liquid"&gt;https://github.com/Shopify/liquid/&lt;/a&gt; y llego la hora de preparar la paginaci&#243;n.&lt;/p&gt;

&lt;p&gt;Estaba usando &lt;a href="Kaminari"&gt;https://github.com/amatsuda/kaminari&lt;/a&gt; pero no hab&#237;a nada hecho con &lt;strong&gt;Liquid&lt;/strong&gt; as&#237; que tuve que volver a &lt;strong&gt;will_paginate&lt;/strong&gt; que si que ten&#237;a un plugin, adem&#225;s la nueva versi&#243;n de este tiene la sintaxis como la de Active Record 3.&lt;/p&gt;

&lt;p&gt;El problema es que ninguno de los forks disponible en GitHub de &lt;a href="will_paginate-liquidized"&gt;https://github.com/ceritium/will_paginate-liquidized&lt;/a&gt; funcionaban bien con mi entorno, &lt;strong&gt;rails 3.1.0&lt;/strong&gt; y &lt;strong&gt;will_paginate 3.0&lt;/strong&gt; as&#237; que hice otro fork para solucionarlo.&lt;/p&gt;

&lt;p&gt;No puedo garantizar que funcione con otras configuraciones.&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Las &#250;ltimas &#250;ltimas semanas he estado trabajando con &lt;a href="Liquid"&gt;https://github.com/Shopify/liquid/&lt;/a&gt; y llego la hora de preparar la paginaci&#243;n.&lt;/p&gt;

&lt;p&gt;Estaba usando &lt;a href="Kaminari"&gt;https://github.com/amatsuda/kaminari&lt;/a&gt; pero no hab&#237;a nada hecho con &lt;strong&gt;Liquid&lt;/strong&gt; as&#237; que tuve que volver a &lt;strong&gt;will_paginate&lt;/strong&gt; que si que ten&#237;a un plugin, adem&#225;s la nueva versi&#243;n de este tiene la sintaxis como la de Active Record 3.&lt;/p&gt;

&lt;p&gt;El problema es que ninguno de los forks disponible en GitHub de &lt;a href="will_paginate-liquidized"&gt;https://github.com/ceritium/will_paginate-liquidized&lt;/a&gt; funcionaban bien con mi entorno, &lt;strong&gt;rails 3.1.0&lt;/strong&gt; y &lt;strong&gt;will_paginate 3.0&lt;/strong&gt; as&#237; que hice otro fork para solucionarlo.&lt;/p&gt;

&lt;p&gt;No puedo garantizar que funcione con otras configuraciones.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Cambiar el mensaje de un commit</title>
    <link href="http://jose.gr/2011/08/17/cambiar-el-mensaje-de-un-commit/" rel="alternate"/>
    <id>http://jose.gr/2011/08/17/cambiar-el-mensaje-de-un-commit/</id>
    <published>2011-08-17T00:00:00Z</published>
    <updated>2011-08-17T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;La forma mas sencilla es con un:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git commit --amend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pero solo sirve si a&#250;n no has hecho push.&lt;/p&gt;

&lt;p&gt;Mas cosas de git en [Git Magic](http://www-cs-students.stanford.edu/&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;La forma mas sencilla es con un:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git commit --amend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pero solo sirve si a&#250;n no has hecho push.&lt;/p&gt;

&lt;p&gt;Mas cosas de git en &lt;a href="http://www-cs-students.stanford.edu/blynn/gitmagic/intl/es/"&gt;Git Magic&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Recipient address rejected: User unknown in local recipient table</title>
    <link href="http://jose.gr/2011/05/22/recipient-address-rejected-user-unknown-in-local-recipient-table/" rel="alternate"/>
    <id>http://jose.gr/2011/05/22/recipient-address-rejected-user-unknown-in-local-recipient-table/</id>
    <published>2011-05-22T00:00:00Z</published>
    <updated>2011-05-22T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;El otro d&#237;a ten&#237;a un problema con un proyecto que acab&#225;bamos de poner en producci&#243;n y que solo daba problemas al enviar emails a su propio dominio.&lt;/p&gt;

&lt;p&gt;Al final era muy sencillo solucionarlo, el problema es que estaba el dominio a&#241;adido en la opci&#243;n &lt;strong&gt;mydestination&lt;/strong&gt; del fichero &lt;em&gt;/etc/postfix/main.cf&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Borrando el dominio y reiniciando &lt;strong&gt;postfix&lt;/strong&gt; ya no tendr&#237;as que seguir tendiendo problemas.&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;El otro d&#237;a ten&#237;a un problema con un proyecto que acab&#225;bamos de poner en producci&#243;n y que solo daba problemas al enviar emails a su propio dominio.&lt;/p&gt;

&lt;p&gt;Al final era muy sencillo solucionarlo, el problema es que estaba el dominio a&#241;adido en la opci&#243;n &lt;strong&gt;mydestination&lt;/strong&gt; del fichero &lt;em&gt;/etc/postfix/main.cf&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Borrando el dominio y reiniciando &lt;strong&gt;postfix&lt;/strong&gt; ya no tendr&#237;as que seguir tendiendo problemas.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Instalar RMagick en Ubuntu</title>
    <link href="http://jose.gr/2011/05/22/instalar-rmagick-en-ubuntu/" rel="alternate"/>
    <id>http://jose.gr/2011/05/22/instalar-rmagick-en-ubuntu/</id>
    <published>2011-05-22T00:00:00Z</published>
    <updated>2011-05-22T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;A mi por lo menos siempre me da problemas esto cuando pongo una aplicaci&#243;n y producci&#243;n en un servidor nuevo y he de tirar de la chuleta, en Google aparecen otras formas, pero esta me parece la m&#225;s sencilla y nunca me ha dado problemas a diferencia de otras (como instalar desde el c&#243;digo fuente).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::bash
$ apt-get install imagemagick libmagick9-dev
$ gem install rmagick
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esto ya podr&#225;s usar &lt;strong&gt;RMagick&lt;/strong&gt; directamente o gemas como &lt;a href="paperclip"&gt;https://github.com/thoughtbot/paperclip&lt;/a&gt; en Ubuntu.&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;A mi por lo menos siempre me da problemas esto cuando pongo una aplicaci&#243;n y producci&#243;n en un servidor nuevo y he de tirar de la chuleta, en Google aparecen otras formas, pero esta me parece la m&#225;s sencilla y nunca me ha dado problemas a diferencia de otras (como instalar desde el c&#243;digo fuente).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::bash
$ apt-get install imagemagick libmagick9-dev
$ gem install rmagick
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esto ya podr&#225;s usar &lt;strong&gt;RMagick&lt;/strong&gt; directamente o gemas como &lt;a href="paperclip"&gt;https://github.com/thoughtbot/paperclip&lt;/a&gt; en Ubuntu.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Capistrano y bundler</title>
    <link href="http://jose.gr/2011/05/22/capistrano-y-bundler/" rel="alternate"/>
    <id>http://jose.gr/2011/05/22/capistrano-y-bundler/</id>
    <published>2011-05-22T00:00:00Z</published>
    <updated>2011-05-22T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;Para hacer que &lt;strong&gt;Capistrano&lt;/strong&gt; instale gemas con bundler autom&#225;ticamente solo a&#241;ade el siguente codigo a tu &lt;strong&gt;deploy.rb&lt;/strong&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
namespace :bundler do
  task :create_symlink, :roles =&amp;gt; :app do
    shared_dir = File.join(shared_path, 'bundle')
    release_dir = File.join(current_release, '.bundle')
    run("mkdir -p #{shared_dir} &amp;amp;&amp;amp; ln -s #{shared_dir} #{release_dir}")
  end

  task :bundle_new_release, :roles =&amp;gt; :app do
    bundler.create_symlink
    run "cd #{release_path} &amp;amp;&amp;amp; bundle install --without test"
  end
end

after 'deploy:update_code', 'bundler:bundle_new_release'
&lt;/code&gt;&lt;/pre&gt;
</summary>
    <content type="html">&lt;p&gt;Para hacer que &lt;strong&gt;Capistrano&lt;/strong&gt; instale gemas con bundler autom&#225;ticamente solo a&#241;ade el siguente codigo a tu &lt;strong&gt;deploy.rb&lt;/strong&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
namespace :bundler do
  task :create_symlink, :roles =&amp;gt; :app do
    shared_dir = File.join(shared_path, 'bundle')
    release_dir = File.join(current_release, '.bundle')
    run("mkdir -p #{shared_dir} &amp;amp;&amp;amp; ln -s #{shared_dir} #{release_dir}")
  end

  task :bundle_new_release, :roles =&amp;gt; :app do
    bundler.create_symlink
    run "cd #{release_path} &amp;amp;&amp;amp; bundle install --without test"
  end
end

after 'deploy:update_code', 'bundler:bundle_new_release'
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Testear una vista de Devise</title>
    <link href="http://jose.gr/2011/01/10/testear-una-vista-de-devise/" rel="alternate"/>
    <id>http://jose.gr/2011/01/10/testear-una-vista-de-devise/</id>
    <published>2011-01-10T00:00:00Z</published>
    <updated>2011-01-10T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;&lt;a href="https://github.com/plataformatec/devise"&gt;Devise&lt;/a&gt; es un sistema completo de autenticaci&#243;n de usuarios, y a diferencia de otras gemas esta se encarga de todo, modelo, vista y controlador.&lt;/p&gt;

&lt;p&gt;Si queremos modificar las vistas para adaptarlas a nuestro dise&#241;o o funcionalidad podr&#225;s generarlas con la siguiente tarea rake:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
rake devise:views
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Luego para asegurarnos de que no rompemos nada lo mejor es testear las acciones que &lt;strong&gt;Devise&lt;/strong&gt; pone a nuestra disposici&#243;n.&lt;/p&gt;

&lt;p&gt;Al test_helper.rb a&#241;adimos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
class ActionController::TestCase
  include Devise::TestHelpers
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Los test funcionales que tendremos que crear ser&#225;n del estilo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functional/devise/registrations_controller_test.rb&lt;/li&gt;
&lt;li&gt;functional/devise/sessions_controller_test.rb&lt;/li&gt;
&lt;li&gt;functional/devise/passwords_controller_test.rb&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Y en cada test metemos de estos ficheros o en un setup las siguientes lineas de c&#243;digo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
setup_controller_for_warden
request.env["devise.mapping"] = Devise.mappings[:user]
&lt;/code&gt;&lt;/pre&gt;
</summary>
    <content type="html">&lt;p&gt;&lt;a href="https://github.com/plataformatec/devise"&gt;Devise&lt;/a&gt; es un sistema completo de autenticaci&#243;n de usuarios, y a diferencia de otras gemas esta se encarga de todo, modelo, vista y controlador.&lt;/p&gt;

&lt;p&gt;Si queremos modificar las vistas para adaptarlas a nuestro dise&#241;o o funcionalidad podr&#225;s generarlas con la siguiente tarea rake:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
rake devise:views
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Luego para asegurarnos de que no rompemos nada lo mejor es testear las acciones que &lt;strong&gt;Devise&lt;/strong&gt; pone a nuestra disposici&#243;n.&lt;/p&gt;

&lt;p&gt;Al test_helper.rb a&#241;adimos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
class ActionController::TestCase
  include Devise::TestHelpers
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Los test funcionales que tendremos que crear ser&#225;n del estilo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functional/devise/registrations_controller_test.rb&lt;/li&gt;
&lt;li&gt;functional/devise/sessions_controller_test.rb&lt;/li&gt;
&lt;li&gt;functional/devise/passwords_controller_test.rb&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Y en cada test metemos de estos ficheros o en un setup las siguientes lineas de c&#243;digo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
setup_controller_for_warden
request.env["devise.mapping"] = Devise.mappings[:user]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como ejemplo dejo lo que ser&#237;a un test muy sencillo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:::ruby
require 'test_helper'

class Devise::PasswordsControllerTest &amp;lt; ActionController::TestCase

  def setup
    setup_controller_for_warden
    request.env["devise.mapping"] = Devise.mappings[:user]
  end

  test "process :new" do
    process :new
    assert_response :success, @response.body
  end

end
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>BigTuna, integraci&#243;n continua en Rails 3</title>
    <link href="http://jose.gr/2010/12/15/bigtuna-integracin-continua-en-rails-3/" rel="alternate"/>
    <id>http://jose.gr/2010/12/15/bigtuna-integracin-continua-en-rails-3/</id>
    <published>2010-12-15T00:00:00Z</published>
    <updated>2010-12-15T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;&lt;strong&gt;BigTuna&lt;/strong&gt; es un sistema de &lt;a href="http://bigtuna.appelier.com/"&gt;integraci&#243;n continua basado en Rails 3&lt;/a&gt; bastante reciente. He probado otros pero este es el que m&#225;s me ha gustado, las razones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hecho en &lt;strong&gt;Ruby y RoR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Se pone en producci&#243;n como una aplicaci&#243;n normal.&lt;/li&gt;
&lt;li&gt;Es multiproyecto.&lt;/li&gt;
&lt;li&gt;No est&#225; sobrecargado de opciones, a los pocos minutos entend&#237; bastante bien como funcionaba.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Me ha gustado tanto que lo montado en un peque&#241;o servidor de 512 mb de RAM en donde lo primero que he montado ha sido mi &lt;a href="https://github.com/FlowersInSpace/bigtuna"&gt;fork de BigTuna&lt;/a&gt; para que autotestee mis cambios.&lt;/p&gt;

&lt;p&gt;Desde luego a&#250;n le faltan algunas algunas cosas, pero que se pueden implementar f&#225;cilmente y eso es precisamente en lo que estoy invirtiendo algo de mi tiempo por las tardes.&lt;/p&gt;

&lt;p&gt;Cosas que me gustar&#237;a mejorar o estoy mejorando ya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Que me d&#233; un mejor feedback del estado de los procesos que se est&#225;n ejecutando en &lt;em&gt;background&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cada vez que creo un nuevo &lt;em&gt;build&lt;/em&gt; se clona todo el repositorio, podr&#237;a usar una especie de cach&#233; como &lt;a href="https://github.com/capistrano/capistrano/wiki"&gt;Capistrano&lt;/a&gt; en los despliegues&amp;hellip;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;BigTuna&lt;/strong&gt; es un sistema de &lt;a href="http://bigtuna.appelier.com/"&gt;integraci&#243;n continua basado en Rails 3&lt;/a&gt; bastante reciente. He probado otros pero este es el que m&#225;s me ha gustado, las razones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hecho en &lt;strong&gt;Ruby y RoR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Se pone en producci&#243;n como una aplicaci&#243;n normal.&lt;/li&gt;
&lt;li&gt;Es multiproyecto.&lt;/li&gt;
&lt;li&gt;No est&#225; sobrecargado de opciones, a los pocos minutos entend&#237; bastante bien como funcionaba.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Me ha gustado tanto que lo montado en un peque&#241;o servidor de 512 mb de RAM en donde lo primero que he montado ha sido mi &lt;a href="https://github.com/FlowersInSpace/bigtuna"&gt;fork de BigTuna&lt;/a&gt; para que autotestee mis cambios.&lt;/p&gt;

&lt;p&gt;Desde luego a&#250;n le faltan algunas algunas cosas, pero que se pueden implementar f&#225;cilmente y eso es precisamente en lo que estoy invirtiendo algo de mi tiempo por las tardes.&lt;/p&gt;

&lt;p&gt;Cosas que me gustar&#237;a mejorar o estoy mejorando ya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Que me d&#233; un mejor feedback del estado de los procesos que se est&#225;n ejecutando en &lt;em&gt;background&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cada vez que creo un nuevo &lt;em&gt;build&lt;/em&gt; se clona todo el repositorio, podr&#237;a usar una especie de cach&#233; como &lt;a href="https://github.com/capistrano/capistrano/wiki"&gt;Capistrano&lt;/a&gt; en los despliegues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Que autocompruebe si un repositorio tiene un nuevo &lt;em&gt;commit&lt;/em&gt; sin necesidad de hacer un &lt;em&gt;hook&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consultas a la base de datos, no son muchas, pero no me gusta un &lt;em&gt;log&lt;/em&gt; que muestra consultas a la base de datos desde las vista, es una man&#237;a y se puede solucionar con un poco de &lt;em&gt;eager loading&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  <entry>
    <title>Oferta trabajo para desarrollador Ruby On Rails</title>
    <link href="http://jose.gr/2010/11/30/oferta-trabajo-para-desarrollador-ruby-on-rails/" rel="alternate"/>
    <id>http://jose.gr/2010/11/30/oferta-trabajo-para-desarrollador-ruby-on-rails/</id>
    <published>2010-11-30T00:00:00Z</published>
    <updated>2010-11-30T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;En &lt;a href="http://flowersinspace.com/"&gt;Flowers In Space&lt;/a&gt; buscamos un nuevo compa&#241;ero para unirse a nuestro equipo.&lt;/p&gt;

&lt;p&gt;El perfil que estamos buscando es de un desarrollador &lt;strong&gt;Ruby On Rails&lt;/strong&gt; que quiera formar parte de un equipo de desarrollo &#225;gil ya maduro.&lt;/p&gt;

&lt;p&gt;Nos hace falta gente con experiencia en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desarrollo web.&lt;/li&gt;
&lt;li&gt;Ruby On Rails.&lt;/li&gt;
&lt;li&gt;Bases de datos&lt;/li&gt;
&lt;li&gt;Sistemas UNIX.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Utilizamos una metodolog&#237;a basada en SCRUM y centrada en las personas. Si quieres divertirte mientras trabajas, ponte en contacto con nosotros. Hemos incluido un &lt;a href="http://bit.ly/hF09bN"&gt;trocito de c&#243;digo&lt;/a&gt; que te puede decir a qu&#233; direcci&#243;n enviar tu curr&#237;culum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; El puesto es presencial en Sevilla, con jornada de 9:00 a 15:00.&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;En &lt;a href="http://flowersinspace.com/"&gt;Flowers In Space&lt;/a&gt; buscamos un nuevo compa&#241;ero para unirse a nuestro equipo.&lt;/p&gt;

&lt;p&gt;El perfil que estamos buscando es de un desarrollador &lt;strong&gt;Ruby On Rails&lt;/strong&gt; que quiera formar parte de un equipo de desarrollo &#225;gil ya maduro.&lt;/p&gt;

&lt;p&gt;Nos hace falta gente con experiencia en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desarrollo web.&lt;/li&gt;
&lt;li&gt;Ruby On Rails.&lt;/li&gt;
&lt;li&gt;Bases de datos&lt;/li&gt;
&lt;li&gt;Sistemas UNIX.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Utilizamos una metodolog&#237;a basada en SCRUM y centrada en las personas. Si quieres divertirte mientras trabajas, ponte en contacto con nosotros. Hemos incluido un &lt;a href="http://bit.ly/hF09bN"&gt;trocito de c&#243;digo&lt;/a&gt; que te puede decir a qu&#233; direcci&#243;n enviar tu curr&#237;culum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; El puesto es presencial en Sevilla, con jornada de 9:00 a 15:00.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>MongoDB en Heroku</title>
    <link href="http://jose.gr/2010/11/29/mongodb-en-heroku/" rel="alternate"/>
    <id>http://jose.gr/2010/11/29/mongodb-en-heroku/</id>
    <published>2010-11-29T00:00:00Z</published>
    <updated>2010-11-29T00:00:00Z</updated>
    <author>
      <name>Jos&#233; Galisteo Ruiz</name>
    </author>
    <summary type="html">&lt;p&gt;Estos d&#237;as estoy haciendo unas pruebas con &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;, como ya es costumbre estoy usando &lt;strong&gt;Heroku&lt;/strong&gt; para alojar los proyectos y poniendo la aplicaci&#243;n en producci&#243;n r&#225;pidamente.&lt;/p&gt;

&lt;p&gt;En esta ocasi&#243;n estoy usando Rails 3 y &lt;a href="http://mongoid.org/"&gt;Mongoid&lt;/a&gt;. En Heroku solo tuve que activar el addon &lt;strong&gt;MongoHQ Free&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para ver los datos de conexi&#243;n solo tienes que hacer un &amp;ldquo;heroku config &amp;mdash;long&amp;rdquo; que te devolver&#225; las variables de entorno de tu aplicaci&#243;n.&lt;/p&gt;

&lt;p&gt;Una de estas variables deber&#237;a ser &amp;ldquo;MONGOHQ_URL&amp;rdquo;, si no la encuentras aseg&#250;rate de que tienes el addon instalado.&lt;/p&gt;

&lt;p&gt;Si la gema que usas solo te pide la url pega eso directamente, si te pide los datos sueltos te vendr&#225; bien saber que la variable se lee as&#237;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mongodb://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;db&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</summary>
    <content type="html">&lt;p&gt;Estos d&#237;as estoy haciendo unas pruebas con &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;, como ya es costumbre estoy usando &lt;strong&gt;Heroku&lt;/strong&gt; para alojar los proyectos y poniendo la aplicaci&#243;n en producci&#243;n r&#225;pidamente.&lt;/p&gt;

&lt;p&gt;En esta ocasi&#243;n estoy usando Rails 3 y &lt;a href="http://mongoid.org/"&gt;Mongoid&lt;/a&gt;. En Heroku solo tuve que activar el addon &lt;strong&gt;MongoHQ Free&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para ver los datos de conexi&#243;n solo tienes que hacer un &amp;ldquo;heroku config &amp;mdash;long&amp;rdquo; que te devolver&#225; las variables de entorno de tu aplicaci&#243;n.&lt;/p&gt;

&lt;p&gt;Una de estas variables deber&#237;a ser &amp;ldquo;MONGOHQ_URL&amp;rdquo;, si no la encuentras aseg&#250;rate de que tienes el addon instalado.&lt;/p&gt;

&lt;p&gt;Si la gema que usas solo te pide la url pega eso directamente, si te pide los datos sueltos te vendr&#225; bien saber que la variable se lee as&#237;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mongodb://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;db&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
</feed>

