<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>LordSarevok</title>
  <id>http://lordsarevok.heroku.com/</id>
  <updated>2010-12-10T00:00:00Z</updated>
  <author>
    <name></name>
  </author>
  <entry>
    <title>Validador para contar el m&#237;nimo n&#250;mero de palabras que puede tener un atributo de ar</title>
    <link href="http://lordsarevok.heroku.com/2011/12/15/validador-para-contar-el-mnimo-nmero-de-palabras-que-puede-tener-un-atributo-de-ar/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2011/12/15/validador-para-contar-el-mnimo-nmero-de-palabras-que-puede-tener-un-atributo-de-ar/</id>
    <published>2011-12-15T00:00:00Z</published>
    <updated>2011-12-15T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;Hoy me ha hecho falta hacer una validaci&#243;n que cuente un m&#237;nimo n&#250;mero de palabras sobre un atributo de un modelo de active record y lo he resuelto as&#237;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Hoy me ha hecho falta hacer una validaci&#243;n que cuente un m&#237;nimo n&#250;mero de palabras sobre un atributo de un modelo de active record y lo he resuelto as&#237;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class WordLimitValidator &amp;lt; ActiveModel::EachValidator  
  include ActionView::Helpers::SanitizeHelper
  def validate_each(object, attribute, value)  
    raise ArgumentError if options[:min].nil?
    if (strip_tags(value.to_s).scan(/\w+/).length &amp;lt;= options[:min].to_i)
      object.errors[attribute] &amp;lt;&amp;lt; (options[:message] || I18n.t('....'))  
    end  
  end  
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Incluyo el SanitizeHelper para quitar los tags htmls que puede incluir el atributo, para el caso que debia resolver era necesario.&lt;/p&gt;

&lt;p&gt;Como veis, en options nos vienen los par&#225;metros que le definimos en el modelo como min: 150, si quisi&#233;ramos a&#241;adir m&#225;ximos, allows, if, unless etc.. no hay m&#225;s que pas&#225;rselo por par&#225;metro y trabajarlo en el c&#243;digo interno del validador.&lt;/p&gt;

&lt;p&gt;Si quereis ejemplos m&#225;s complejos, visitad el rdoc de cualquier validador de los que trae el framework y os puede servir de guia, a mi me vino bien :) (&lt;a href="http://rubydoc.info/docs/rails/3.0.0/ActiveModel/Validations/NumericalityValidator#validate_each-instance_method"&gt;NumericalityValidator&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;El test que le he realizado m&#225;s o menos queda as&#237;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# encoding: UTF-8
require 'spec_helper'

describe WordLimitValidator do
  describe "validate_each" do
    describe "word_limit" do
      it "emtpy should be invalid" do
        event = Event.new
        WordLimitValidator.new({attributes: event.attributes, min: 150}).validate_each(event, :long_description, '')
        event.errors[:long_description].should be_present
      end

      it "with 149 word should be invalid" do
        event = Event.new
        WordLimitValidator.new({attributes: event.attributes, min: 150}).validate_each(event, :long_description, ('word ' * 149))
        event.errors[:long_description].should be_present
      end

      it "with 150 word should be valid" do
        event = Event.new
        WordLimitValidator.new({attributes: event.attributes, min: 150}).validate_each(event, :long_description, ('word ' * 150))
        event.errors[:long_description].should be_blank
      end

      it "with 150 words adn html should be valid" do
        event = Event.new
        WordLimitValidator.new({attributes: event.attributes, min: 150}).validate_each(event, :long_description, long_event_description)
        event.errors[:long_description].should be_blank
      end
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;long_event_description&lt;/em&gt;: no es m&#225;s que un helper que me da un texto largo con tags html&lt;/p&gt;

&lt;p&gt;Y para usarlo desde nuestros modelos&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;validates :long_description, word_limit: {min: 150, message: '...'}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;En el episodio pro os ense&#241;ar&#233; como hacer natillas que no engordan ^^ ( joke!! :) rbates rocks!)&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Autocompletar las bases de datos con mysql</title>
    <link href="http://lordsarevok.heroku.com/2011/04/02/autocompletar-las-bases-de-datos-con-mysql/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2011/04/02/autocompletar-las-bases-de-datos-con-mysql/</id>
    <published>2011-04-02T00:00:00Z</published>
    <updated>2011-04-02T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;Es la primera vez que me hago un script en bash m&#225;s all&#225; de la ejecuci&#243;n secuencial de comandos y hoy hice uno para autocompletar las bases de datos que tenemos en nuestra m&#225;quina, siempre es una molestia entar en mysql, buscar el nombre exacto, hacer el use&amp;hellip; Al leer lo f&#225;cil que es crear un comando que autocomplete en &lt;a href="http://tekrat.com/2008/04/30/bash-autocompletion-git-super-lazy-goodness/" title="git autocompletion"&gt;este post&lt;/a&gt;, no tuve m&#225;s que sustituir un par de comandos y crear el alias para acceder directamente a una base de datos&amp;hellip;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Es la primera vez que me hago un script en bash m&#225;s all&#225; de la ejecuci&#243;n secuencial de comandos y hoy hice uno para autocompletar las bases de datos que tenemos en nuestra m&#225;quina, siempre es una molestia entar en mysql, buscar el nombre exacto, hacer el use&amp;hellip; Al leer lo f&#225;cil que es crear un comando que autocomplete en &lt;a href="http://tekrat.com/2008/04/30/bash-autocompletion-git-super-lazy-goodness/" title="git autocompletion"&gt;este post&lt;/a&gt;, no tuve m&#225;s que sustituir un par de comandos y crear el alias para acceder directamente a una base de datos.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;alias mysql_use="mysql -u root -D"
_complete_db() {
  databases=`mysql -u root -e 'show databases' | cat`
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${databases}" -- ${cur}) )
}
complete -F _complete_db mysql_use
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vale que no compruebo si est&#225; disponible mysql, vale que el acceso lo hago directamente con el usuario root, pero para mi es suficiente ya que es para trabjar en local. Otro apunte, seguro que habr&#225; formas m&#225;s limpias que usar el alias, pero de momento es la que conozco :).&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Mis snipets para textmate</title>
    <link href="http://lordsarevok.heroku.com/2011/03/09/mis-snipets-para-textmate/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2011/03/09/mis-snipets-para-textmate/</id>
    <published>2011-03-09T00:00:00Z</published>
    <updated>2011-03-09T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;Bueno, voy a poner aquellos snippets para textmate que tengo definidos y que me facilitan el trabajo, no son nada complejos, pero me resultan de una grand&#237;sima ayuda, ya sea para no estar escribiendo lo mismo varias veces o para aquellos trocitos de c&#243;digo que son tan pu&#241;eteros de escribir, los voy a agrupar por donde los suelo utilizar, como veis, donde m&#225;s he necesitado ha sido en los test, no son demasiados ya que con los bundles tienes cubiertas muchas de las necesidades&amp;hellip;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Bueno, voy a poner aquellos snippets para textmate que tengo definidos y que me facilitan el trabajo, no son nada complejos, pero me resultan de una grand&#237;sima ayuda, ya sea para no estar escribiendo lo mismo varias veces o para aquellos trocitos de c&#243;digo que son tan pu&#241;eteros de escribir, los voy a agrupar por donde los suelo utilizar, como veis, donde m&#225;s he necesitado ha sido en los test, no son demasiados ya que con los bundles tienes cubiertas muchas de las necesidades.&lt;/p&gt;

&lt;h2&gt;En los test&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$2 = $1(:$2) # tab trigger: fix
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  Para empezar, uno muy simple que uso para cargar fixtures en los test, escribiendo en $1 el nombre de la fixture y pulsando tabulador, me rellena el id y la variable que vamos a usar en nuestra bater&#237;a&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;any_instance.stubs(:valid?).returns(true) # tab trigger: valid
any_instance.stubs(:valid?).returns(false) # tab trigger: invalid
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  Me a&#241;ade esa cadena a continuaci&#243;n de donde lo necesite, un d&#237;a te das cuenta que estas las escribes demasiadas veces xD&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.any_instance.stubs(:$1).returns($2) # tab trigger: .ai
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  Saltando con el tabulador pasamos entre el m&#233;todo a &amp;ldquo;stubear&amp;rdquo; y a lo que queremos que nos devuelva.&lt;/p&gt;

&lt;h2&gt;En las vistas&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;l($1, :format =&amp;gt; ' %A %d de %B a las %H:%M')$0 # tab trigger: date
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  Para humanizar las fechas, a parte de ahorrarme escribir, me ahorro ir a la docu a mirar el strftime :)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;\$('$1').$2; # tab trigger: $
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  Para la librer&#237;a javascript que usemos (en mi caso jQuery), comod&#237;simo, del selector css saltamos a la funci&#243;n que queramos llamar, es al que m&#225;s cari&#241;o le tengo.&lt;/p&gt;

&lt;h2&gt;En los controladores&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;def load_$1
  @$1 = ${1/./\u$0/}.find(params[:id])
end
# tab trigger: lr

def load_post
  @post = Post.find(params[:id])
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  Cuantas veces cargamos un recurso en un controlador? Siempre, con lr (load resource) genero ese pedacito de c&#243;digo que tantas veces escribimos :)&lt;/p&gt;

&lt;p&gt;B&#225;sicamente eso es todo, espero que os sirva para algo&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Espacio libre en disco con applescript y launchbar</title>
    <link href="http://lordsarevok.heroku.com/2011/01/22/espacio-libre-en-disco-con-applescript-y-launchbar/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2011/01/22/espacio-libre-en-disco-con-applescript-y-launchbar/</id>
    <published>2011-01-22T00:00:00Z</published>
    <updated>2011-01-22T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;Me he hecho un script para &lt;a href="http://www.obdev.at/products/launchbar/index.html" title="launchbar"&gt;launchbar&lt;/a&gt; que nos dice el espacio libre en disco.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set grep_result to (do shell script "df -H / | grep %") as text
&lt;/code&gt;&lt;/pre&gt;
</summary>
    <content type="html">&lt;p&gt;Me he hecho un script para &lt;a href="http://www.obdev.at/products/launchbar/index.html" title="launchbar"&gt;launchbar&lt;/a&gt; que nos dice el espacio libre en disco.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set grep_result to (do shell script "df -H / | grep %") as text
set free to word 5 in grep_result
tell application "LaunchBar" to display in large type "Quedan " &amp;amp; result
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As&#237; de simple, no hay m&#225;s que teclear el nombre del script en la aplicaci&#243;n y ya nos muestra cuanto espacio tenemos libre en nuestra m&#225;quina.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Tips sobre devise</title>
    <link href="http://lordsarevok.heroku.com/2011/01/16/tips-sobre-devise/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2011/01/16/tips-sobre-devise/</id>
    <published>2011-01-16T00:00:00Z</published>
    <updated>2011-01-16T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;h2&gt;#1 Modificar la redirecci&#243;n de la edici&#243;n del usuario autenticado en la aplicaci&#243;n&lt;/h2&gt;

&lt;p&gt;Por primera vez me ha hecho falta modificar la forma en la que devise trabaja, voy a explicar un poco lo que hice y como lo resolv&#237;, la mayor&#237;a est&#225; en el &lt;a href="https://github.com/plataformatec/devise/wiki/_pages" title="wiki de devise"&gt;wiki&lt;/a&gt;, pero bueno, me apetec&#237;a compartirlo&amp;hellip;&lt;/p&gt;
</summary>
    <content type="html">&lt;h2&gt;#1 Modificar la redirecci&#243;n de la edici&#243;n del usuario autenticado en la aplicaci&#243;n&lt;/h2&gt;

&lt;p&gt;Por primera vez me ha hecho falta modificar la forma en la que devise trabaja, voy a explicar un poco lo que hice y como lo resolv&#237;, la mayor&#237;a est&#225; en el &lt;a href="https://github.com/plataformatec/devise/wiki/_pages" title="wiki de devise"&gt;wiki&lt;/a&gt;, pero bueno, me apetec&#237;a compartirlo.&lt;/p&gt;

&lt;p&gt;Lo primero que necesit&#233; fue redefinir hacia donde nos lleva la edici&#243;n de un usuario que pasa todas las validaciones que tengamos definidas, muchos de los art&#237;culos recomendaban copiar y pegar el controlador para aplicar el cambio, pero no me gustaba, me gui&#233; por uno que nos explicaba &lt;a href="https://github.com/plataformatec/devise/wiki/How-To:-Change-the-redirect-path-after-destroying-a-session-i.e.-signing-out" title="cambiar la redirecci&#243;n del sign_out"&gt;como redefinir la redirecci&#243;n cuando cerramos sesi&#243;n&lt;/a&gt; pero combin&#225;ndola el &lt;a href="https://github.com/plataformatec/devise/wiki/How-To:-Customize-the-redirect-after-a-user-edits-their-profile" title="cambio en la redirecci&#243;n del edit"&gt;m&#233;todo que nos env&#237;a a donde deseemos tras una edici&#243;n satisfactoria&lt;/a&gt;, quedando algo as&#237; en el ApplicationController. En este caso lo vamos a enviar al show del usuario.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ApplicationController &amp;lt; ActionController::Base
  ....
  private
    # =&amp;gt; M&#233;todo que nos redirige a otra url diferente del root path al actualizar el usuario
    def after_update_path_for(resource)
      my_account_path
    end
  ....
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Me pregunto si ser&#225; una soluci&#243;n m&#225;s limpia que la que recomienda josevalim en este &lt;a href="https://github.com/plataformatec/devise/wiki/How-To:-Customize-the-redirect-after-a-user-edits-their-profile" title="redirecci&#243;n  en la edici&#243;n del perfil"&gt;post&lt;/a&gt;, de esta forma evitamos un controlador ya testado.&lt;/p&gt;

&lt;p&gt;Lo que nos falta es la acci&#243;n donde nos va a llevar el 302, para ello definimos la ruta &amp;ldquo;dentro de devise&amp;rdquo; con los helpers para rutas que nos proporciona este plugin.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;devise_for :users do
  get 'my-account', :to =&amp;gt; 'users#show', :as =&amp;gt; :my_account
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para terminar nos falta la acci&#243;n del controlador a la que llevamos la ruta, he creado uno para seguir con mi encabezonamiento de no tocar el registrations_controller.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class UsersController &amp;lt; ApplicationController
  before_filter :authenticate_user!
  def show
    @user = current_user
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En este caso no es necesario heredar del registrations_controller ya que esta acci&#243;n no est&#225; definida en esa clase.&lt;/p&gt;

&lt;h2&gt;#2 Guardar un usuario que nos env&#237;a el password vacio&lt;/h2&gt;

&lt;p&gt;Otra peque&#241;a modificaci&#243;n que necesit&#233; es la de evitar que salten las validaciones del password una vez el usuario hace el submit del formulario, devise por defecto comprueba que esos dos campos vengan con datos, en caso de envi&#225;rselos vac&#237;os, para &#233;l es un registro no v&#225;lido, esa soluci&#243;n es sencilla, no hay m&#225;s que redefinir un m&#233;todo de instancia en el modelo, es una de las soluciones que nos indican en la &lt;a href="https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password" title="guardar sin cambiar el password"&gt;wiki&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def update_with_password(params = {}) 
  if params[:password].blank? 
    params.delete(:password) 
    params.delete(:password_confirmation) if params[:password_confirmation].blank? 
  end 
  update_attributes(params) 
end
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Jugando con markdown usando ruby y javascript</title>
    <link href="http://lordsarevok.heroku.com/2011/01/06/jugando-con-markdown-usando-ruby-y-javascript/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2011/01/06/jugando-con-markdown-usando-ruby-y-javascript/</id>
    <published>2011-01-06T00:00:00Z</published>
    <updated>2011-01-06T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;Para ello he usado &lt;a href="https://github.com/nex3/maruku" title="maruku"&gt;maruku&lt;/a&gt;, una gema escrita en ruby. Es muy f&#225;cil de manejar, la incluimos en nuestro proyecto y en mi caso, cree un m&#233;todo que pasaba de markdown a html un atributo de una clase&amp;hellip;&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Para ello he usado &lt;a href="https://github.com/nex3/maruku" title="maruku"&gt;maruku&lt;/a&gt;, una gema escrita en ruby. Es muy f&#225;cil de manejar, la incluimos en nuestro proyecto y en mi caso, cree un m&#233;todo que pasaba de markdown a html un atributo de una clase.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def text_to_html
  Maruku.new(self.text).to_html
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As&#237; de simple.&lt;/p&gt;

&lt;p&gt;Disponemos de varios m&#233;todos m&#225;s, pod&#233;is verlos en la &lt;a href="http://maruku.rubyforge.org/usage.html" title="documentacion"&gt;documentaci&#243;n&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para la vista previa us&#233; &lt;a href="http://attacklab.net/showdown/" title="showdown"&gt;showdown&lt;/a&gt;, trasforma el texto plano que le pasemos por par&#225;metro a markdown, tambi&#233;n muy f&#225;cil de utilizar&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function preview(css_selector){
  var converter = new Showdown.converter();
  var markdown = converter.makeHtml(text);
  $(css_selector).html(markdown);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si este m&#233;todo lo combinamos con el evento keyup, tenemos la vista previa en tiempo real :)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$(selector_for_text_area).bind('keyup', function(){preview(css_content_preview);})
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>AppleScript para abrir el terminal con varias pesta&#241;as y ejecutando varios comandos</title>
    <link href="http://lordsarevok.heroku.com/2010/12/25/applescript-para-abrir-el-terminal-con-varias-pestaas-y-ejecutando-varios-comandos/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2010/12/25/applescript-para-abrir-el-terminal-con-varias-pestaas-y-ejecutando-varios-comandos/</id>
    <published>2010-12-25T00:00:00Z</published>
    <updated>2010-12-25T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;h2&gt;Un apple script para lanzar desde &lt;a href="http://www.obdev.at/products/launchbar/index.html" title="launchbar"&gt;launchbar&lt;/a&gt;&lt;/h2&gt;
</summary>
    <content type="html">&lt;h2&gt;Un apple script para lanzar desde &lt;a href="http://www.obdev.at/products/launchbar/index.html" title="launchbar"&gt;launchbar&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Me lo he hecho seg&#250;n mis necesidades, pas&#225;ndole un directorio (o un alias en mi caso) nos levanta un servidor, nos abre una consola, arranca el autotest y el proyecto en textmate.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;on handle_string(dir)
    set commands to {"ss", "sc", "autotest -f", "m"}

    tell application "Terminal"
        activate
    end tell

    repeat with command in commands
        tell application "Terminal"
            do script dir in front window
            do script command in front window
        end tell

        tell application "System Events"
            keystroke "t" using {command down}
        end tell
    end repeat
end handle_string
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para ejecutar el script desde la consola a trav&#233;s de osascript, habr&#237;a que hacer algunos cambios, cambiamos el &amp;lsquo;on handle_string(dir)&amp;rsquo; por &amp;lsquo;on run argv&amp;rsquo;, adem&#225;s de aplicar cambios en el end, tendremos que capturar los par&#225;metros con &amp;lsquo;set dir to (item 1 of argv)&amp;rsquo;, quedando algo as&#237;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;on run argv
    set alias_dir to (item 1 of argv)
    set commands to {"ss", "sc", "autotest", "m"}

    tell application "Terminal"
        activate
    end tell

    repeat with command in commands
        tell application "Terminal"
            do script alias_dir in front window
            do script command in front window
        end tell

        tell application "System Events"
            keystroke "t" using {command down}
        end tell

    end repeat
end run
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>M&#233;todo para hacer un retry de un bloque</title>
    <link href="http://lordsarevok.heroku.com/2010/12/16/mtodo-para-hacer-un-retry-de-un-bloque/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2010/12/16/mtodo-para-hacer-un-retry-de-un-bloque/</id>
    <published>2010-12-16T00:00:00Z</published>
    <updated>2010-12-16T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;Un m&#233;todo que he encontrado en &lt;a href="http://blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/" title="retryable"&gt;este post&lt;/a&gt;, me ha venido de perlas&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;Un m&#233;todo que he encontrado en &lt;a href="http://blog.codefront.net/2008/01/14/retrying-code-blocks-in-ruby-on-exceptions-whatever/" title="retryable"&gt;este post&lt;/a&gt;, me ha venido de perlas&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def retryable(options = {}, &amp;amp;block)
  opts = { :tries =&amp;gt; 3, :on =&amp;gt; Exception }.merge(options)

  retry_exception, retries = opts[:on], opts[:tries]

  begin
    return yield
  rescue retry_exception
    retry if (retries -= 1) &amp;gt; 0
  end

  yield
end
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Patch para rack 0.9.1</title>
    <link href="http://lordsarevok.heroku.com/2010/12/13/patch-para-rack-091/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2010/12/13/patch-para-rack-091/</id>
    <published>2010-12-13T00:00:00Z</published>
    <updated>2010-12-13T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;En caso de problemas del tipo lib/rack/request.rb:116:in `rewind': Illegal seek (Errno::ESPIPE) con &lt;a href="http://rack.rubyforge.org/" title="rack 0.9.1"&gt;rack 0.9.1&lt;/a&gt;, aplicar este patch&lt;/p&gt;
</summary>
    <content type="html">&lt;p&gt;En caso de problemas del tipo lib/rack/request.rb:116:in `rewind': Illegal seek (Errno::ESPIPE) con &lt;a href="http://rack.rubyforge.org/" title="rack 0.9.1"&gt;rack 0.9.1&lt;/a&gt;, aplicar este patch&lt;/p&gt;

&lt;h2&gt;diff&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;cd ~/local/ruby/lib/ruby/gems/1.8/gems/rack-0.9.1/lib/rack/
diff request.rb.orig request.rb

116c116,119
@env["rack.input"].rewind if @env["rack.input"].respond_to?(:rewind)

begin
  @env["rack.input"].rewind if @env["rack.input"].respond_to?(:rewind)
rescue Errno::ESPIPE
end
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Instalar passenger con ree</title>
    <link href="http://lordsarevok.heroku.com/2010/12/10/instalar-passenger-con-ree/" rel="alternate"/>
    <id>http://lordsarevok.heroku.com/2010/12/10/instalar-passenger-con-ree/</id>
    <published>2010-12-10T00:00:00Z</published>
    <updated>2010-12-10T00:00:00Z</updated>
    <author>
      <name></name>
    </author>
    <summary type="html">&lt;p&gt;Lo primero es hacernos un wget con la &#250;ltima versi&#243;n y descomprimirla&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://rubyforge.org/frs/download.php/71096/ruby-enterprise-x.x.x-xxxx.xx.tar.gz
&lt;/code&gt;&lt;/pre&gt;
</summary>
    <content type="html">&lt;p&gt;Lo primero es hacernos un wget con la &#250;ltima versi&#243;n y descomprimirla&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://rubyforge.org/frs/download.php/71096/ruby-enterprise-x.x.x-xxxx.xx.tar.gz
tar xzvf ruby-enterprise-1.8.7-2010.02.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Luego, pasamos a iniciar la instalaci&#243;n&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo ./ruby-enterprise-1.8.7-2010.02/installer --no-dev-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nos va a comprobar si tenemos ciertas librerias en el sistema, nos avisar&#225; y nos mostrar&#225; los paquetes que requiere, en caso de no se capaz de instalar alguno, actulizar los repos con apt-get update
Tras esto, reintentamos la instalaci&#243;n, dejamos el directorio por defecto y esperamos a que termine&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/opt/ruby-enterprise-x-x-x-x
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para usar passenger, debemos reinstalarlo par que tire contra ree&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/opt/ruby-enterprise-1.8.7-2010.02/bin/passenger-install-apache2-module
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En mi caso eran necesarias estas cuatro liber&#237;as, como sudo hacer&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt-get install libcurl4-openssl-dev
apt-get install apache2-prefork-dev
apt-get install libapr1-dev
apt-get install libaprutil1-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Empezamos de nuevo con el comando de isntalaci&#243;n&lt;/p&gt;

&lt;p&gt;Al terminar nos avisa que debemos cargar el m&#243;dulo de passenger para apache, editamos el archivo de configuraci&#243;n y a&#241;adimos las lineas que nos indica&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/etc/apache2/http.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tras esto recargamos apache y listo.&lt;/p&gt;

&lt;p&gt;Ahora pasamos a preparar ruby como ejecutable&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo ln -s /opt/ruby-enterprise-x.x.x.x/bin/ruby /usr/bin/ruby
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A&#241;adimos esto al path  y ya tenemos el entorno configurado&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/etc/apache2/http.conf
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
</feed>

