<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Gastón Ramos - Ruby, Rails...</title>
	<atom:link href="http://gastonramos.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://gastonramos.wordpress.com</link>
	<description>Blog dedicado al desarrollo web en general pero más que nada en ruby on rails</description>
	<lastBuildDate>Thu, 19 Jan 2012 18:26:32 +0000</lastBuildDate>
	<language>la</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='gastonramos.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Gastón Ramos - Ruby, Rails...</title>
		<link>http://gastonramos.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://gastonramos.wordpress.com/osd.xml" title="Gastón Ramos - Ruby, Rails..." />
	<atom:link rel='hub' href='http://gastonramos.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Remada de Sabado, Destino: primer puente del Leyes</title>
		<link>http://gastonramos.wordpress.com/2011/12/17/remada-de-sabado-destino-primer-puente-del-leyes/</link>
		<comments>http://gastonramos.wordpress.com/2011/12/17/remada-de-sabado-destino-primer-puente-del-leyes/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 16:09:55 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=568</guid>
		<description><![CDATA[* Me levanté: 6:30hs * El Chelo llego a casa: 7:00hs * Agua: 8:00hs * Destino: 11:10hs * Llegamos de vuelta a casa: 12:30hs * Cantidad de horas remadas: 4hs aprox. Bueno, nos retrasamos un poquito por que tuve que pegarle una goma Eva al portaequipaje de mi auto para que no se raye el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=568&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>* Me levanté: 6:30hs<br />
* El Chelo llego a casa: 7:00hs<br />
* Agua: 8:00hs<br />
* Destino: 11:10hs<br />
* Llegamos de vuelta a casa: 12:30hs<br />
* Cantidad de horas remadas: 4hs aprox.</p>
<p>Bueno, nos retrasamos un poquito por que tuve que pegarle una goma Eva al portaequipaje de mi auto para que no se raye el kayak, en el camino 1km antes de llegar al puente del Leyes me crucé a un viejo amigo del barrio, Jorge, conversamos con él unos 15 minutos y seguimos hasta el puente, paramos unos 20 mintos sacamos unas fotos y emprendimos la vuelta, había bastante viento, al llegar la Fryda estaba esperándome, como siempre.</p>
<a href="http://gastonramos.wordpress.com/2011/12/17/remada-de-sabado-destino-primer-puente-del-leyes/#gallery-1-slideshow">Click to view slideshow.</a>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/568/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/568/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=568&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2011/12/17/remada-de-sabado-destino-primer-puente-del-leyes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
		<item>
		<title>Mi nuevo kayak aloha loa II</title>
		<link>http://gastonramos.wordpress.com/2011/12/13/mi-nuevo-kayak-aloha-loa-ii/</link>
		<comments>http://gastonramos.wordpress.com/2011/12/13/mi-nuevo-kayak-aloha-loa-ii/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 11:45:31 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[kayak]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=550</guid>
		<description><![CDATA[Hace unos días me compré este hermoso bote de plasticos tigre  luego de vender mi anterior bote que fué el primero que tuve, un k1 de antlanti kayaks, este kayak tiene la particularidad de que es sit on top es decir que el palista va sentado arriba del bote a diferencia del Aloha. Al navegar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=550&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hace unos días me compré este hermoso <a href="http://www.plasticostigre.com.ar/html/index.php?id=kayaks&amp;id2=aloha" target="_blank">bote de plasticos tigre  </a>luego de vender mi anterior bote que fué el primero que tuve, un <a href="http://www.atlanti-kayaks.com/k1.html" target="_blank">k1 de antlanti kayaks</a>, este kayak tiene la particularidad de que es sit on top es decir que el palista va sentado arriba del bote a diferencia del Aloha. Al navegar el Aloha siento que voy remando de una forma mucho más relajada (obviamente el aloha es mucho más rápido que el k1) se siente a apenas inestable, yo estaba acostumbrado al k1 que es muy estable, la dirección  del kayak es muy buena (todavía no lo he probado con mucho viento) y se lo puede maniobrar bastante bien escorándolo para doblar por ej. La primer vez que salí tuve la mala idea de regular el apoya pies, logré desajustar los tornillos mariposa pero al querer volver a ajustarlos en la nueva posición, me resultó <strong>*muy*</strong> difícil estuve como 30 minutos tratando de hacerlo hasta que lo logré, así que mi recomendación es que regulen el apoya pies con tiempo y paciencia (antes de salir a remar). Las terminaciones del bote son bastante buenas aunque tiene algunos detalles, en la proa tiene como una pequeña cachadura que pareciera reparada, la parte interior del cockpit debería estar mas lisa o más lijada para mi gusto (es un poco áspera). Con respecto a los tambuchos trae 2 bastante amplios, una de las veces que salí a remar me dí vueltas a propósito y en el tambucho trasero me entró más de medio litro de agua, el delantero estaba seco.</p>
<p>En conclusión estoy muy contento con mi bote nuevo es lindo, rápido y cómodo, y las únicas desventajas que el econtré por ahora son la incomodidad para regular el apoya pies (creo que esto debe pasar en la mayoría de los kayaks como este, perdón por mi ignoracia) y el tema del agua en el tambucho que debería ser 100% estanco, ahora estoy contactando al lugar dónde lo compré  (<a href="http://www.saffari-kayaks.es.tl/" target="_blank">http://www.saffari-kayaks.es.tl/</a>) para ver como podemos solucionar el tema del tambucho,  A propósito, el bote me salió $3800 pesos argentinos.</p>
<p><em>Quiero dejar en claro que lo que escribí son mis opiniones personales que soy un novato en lo que es el kayakismo, comencé a remar cuando me compré mi primer bote hace un poco más de 2 años aproximadamente, así que tomen mis opiniones como lo que son, reflexiones de un kayakista inexperto, :).</em></p>
<p><a href="http://gastonramos.files.wordpress.com/2011/12/383725_281441028574933_100001271131254_846775_1277875316_n.jpg"><img class="alignnone size-medium wp-image-551" title="mi kayak aloha loa II" src="http://gastonramos.files.wordpress.com/2011/12/383725_281441028574933_100001271131254_846775_1277875316_n.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a><a href="http://gastonramos.files.wordpress.com/2011/12/388814_281440781908291_100001271131254_846774_239390443_n.jpg"><img class="alignnone size-medium wp-image-552" title="388814_281440781908291_100001271131254_846774_239390443_n" src="http://gastonramos.files.wordpress.com/2011/12/388814_281440781908291_100001271131254_846774_239390443_n.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/550/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/550/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/550/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=550&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2011/12/13/mi-nuevo-kayak-aloha-loa-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>

		<media:content url="http://gastonramos.files.wordpress.com/2011/12/383725_281441028574933_100001271131254_846775_1277875316_n.jpg?w=300" medium="image">
			<media:title type="html">mi kayak aloha loa II</media:title>
		</media:content>

		<media:content url="http://gastonramos.files.wordpress.com/2011/12/388814_281440781908291_100001271131254_846774_239390443_n.jpg?w=300" medium="image">
			<media:title type="html">388814_281440781908291_100001271131254_846774_239390443_n</media:title>
		</media:content>
	</item>
		<item>
		<title>¿Cómo funciona RubyGems?</title>
		<link>http://gastonramos.wordpress.com/2011/02/22/como-funciona-rubygems/</link>
		<comments>http://gastonramos.wordpress.com/2011/02/22/como-funciona-rubygems/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 12:56:50 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubygem]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=507</guid>
		<description><![CDATA[Desde hace un tiempo que estoy interesado en conocer un poco más en detalle como funciona rubygems, así que hoy decidí comenzar a aprender más sobre rubygems y cómo las gemas son cargadas en memoria. Bueno, comencemos: Entro al intérprete interactivo de ruby e intento requerir la bioblioteca activemodel: ruby-1.9.2-p136 :001 &#62; Gem.loaded_specs =&#62; {} [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=507&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Desde hace un tiempo que estoy interesado en conocer un poco más en detalle como funciona rubygems, así que hoy decidí comenzar a aprender más sobre rubygems y cómo las gemas son cargadas en memoria.</p>
<p>Bueno, comencemos:<br />
Entro al intérprete interactivo de ruby e intento requerir la bioblioteca activemodel:</p>
<pre>
<code>
ruby-1.9.2-p136 :001 &gt; Gem.loaded_specs
 =&gt; {}
ruby-1.9.2-p136 :002 &gt; require 'active_model'
 =&gt; true
ruby-1.9.2-p136 :003 &gt; Gem.loaded_specs
 =&gt; {"activemodel"=&gt;#&#060;Gem::Specification name=activemodel version=3.0.4&gt;,
"activesupport"=&gt;#&#060;Gem::Specification name=activesupport version=3.0.4&gt;,
"builder"=&gt;#&#060;Gem::Specification name=builder version=2.1.2&gt;,
"i18n"=&gt;#&#060;Gem::Specification name=i18n version=0.5.0&gt;}
</code>
</pre>
<p>Cómo podemos observar aparecen varias gemas nuevas cargadas, active_model y sus dependencias, pero ¿cómo es que esto se lleva cabo?</p>
<p>Bien si nos fijamos en <a href="https://github.com/rubygems/rubygems/blob/v1.5.2/lib/rubygems.rb">/lib/rubygems.rb</a> en el repo de rubygems al final de todo hace esto:</p>
<pre>
<code>
require 'rubygems/custom_require' unless Gem::GEM_PRELUDE_SUCKAGE
</code>
</pre>
<p>y si vamos al archivo lib/rubygems/custom_require.rb vemos que lo hace es redefinir el método require de Kernel, y activa la gema de esta forma:</p>
<pre>
<code>
Gem.try_activate(path)
</code>
</pre>
<p>podemos probar esto directamente en el intérprete:</p>
<pre>
<code>
ruby-1.9.2-p136 &gt; Gem.try_activate 'active_resource'
=&gt; true
ruby-1.9.2-p136 :007 &gt; Gem.loaded_specs['activeresource']
 =&gt; #&#060;Gem::Specification name=activeresource version=3.0.4&gt; 

</code>
</pre>
<p>Entonces vamos de nuevo al archivo rubygems.rb y miramos como es que funciona Gem.try_activate:</p>
<p>Lo primero que hace es buscar la gema que estamos intentando requerir, y lo hace así:</p>
<pre>
<code>
 spec = Gem.searcher.find path
</code>
</pre>
<p>Gem.searcher es una instancia de Gem::GemPathSearcher entre otras cosas tiene la lista de todas las gemspecs instaldas para después poder hacér búsqueda con  Gem::GemPathSearcher#find. Entonces siguiendo con Gem.try_activate, si encuentra alguna coincidencia ejecuta
<pre>Gem.activate spec.name, "= #{spec.version}"</pre>
<p> como podemos ver saca la versión de la spec encontrada (que es la más alta instalada), entonces ahora vamos a ver
<pre>Gem.activate</pre>
<p>Éste método retorna true si la gema fué activada, false si ya está cargada o una excepción en cualquier otro caso (no se pudo cargar por algún motivo). La manera en que activa la gema es agregando el path de la misma al $LOAD_PATH de ruby.</p>
<pre>
<code>
 def self.activate(gem, *requirements)
   if requirements.last.is_a?(Hash)
      options = requirements.pop
   else
      options = {}
   end

   # Esta línea parsea los requerimientos que vienen como argumento
   # y si no viene ninguno pone los defaults, los requerimientos no son
   # otra cosa que restricciones de la versión de la gema,
   # el requerimiento por defecto es &gt;= 0

   requirements = Gem::Requirement.default if requirements.empty?

   # Básicamente Gem::Dependency es un contenedor de
   # Gem name, requirement

   dep = Gem::Dependency.new(gem, requirements)

   sources = options[:sources] || []

   # creo que esta línea require especial antención
   # (veremos los detalles más adelante) pero por ahora nos
   # alcanza con saber que Gem._unresolved crea una lista
   # de objetos Gem::DependencyList (que primero está vacía)
   # de dependecias sin resolver

   matches = _unresolved.find_all { |spec| spec.satisfies_requirement? dep }

   if matches.empty? then
      matches = Gem.source_index.find_name(dep.name, dep.requirement)

      # Si no ecuentra la gema buscando con el nombre y los
      # requerimientos reporta el error
      report_activate_error(dep) if matches.empty?

      # Si la gema ya está cargada (cualquier versión)
      if @loaded_specs[dep.name] then
        # This gem is already loaded.  If the currently loaded gem is not in the
        # list of candidate gems, then we have a version conflict.
        existing_spec = @loaded_specs[dep.name]

        # Pregunta si la gema que está cargada es la misma versión
        # que la  quiero activar
        unless matches.any? { |spec| spec.version == existing_spec.version } then
          sources_message = sources.map { |spec| spec.full_name }
          stack_message = @loaded_stacks[dep.name].map { |spec| spec.full_name }

          msg = "can't activate #{dep} for #{sources_message.inspect}, "
          msg &lt;&lt; &quot;already activated #{existing_spec.full_name} for &quot;
          msg &lt;&lt; &quot;#{stack_message.inspect}&quot;

          e = Gem::LoadError.new msg
          e.name = dep.name
          e.requirement = dep.requirement

          raise e
        end

        # La gema que quiero cargar ya está cargada
        return false
      end
    end

    # La gema no está cargada entonces activa la última versión
    spec = matches.last

    conf = spec.conflicts
    unless conf.empty? then
      why = conf.map { |k,v| &quot;#{k} depends on #{v.join(&quot;, &quot;)}&quot; }.join &quot;, &quot;

      raise LoadError, &quot;Unable to activate #{spec.full_name}, but #{why}&quot;
    end

    return false if spec.loaded?

    spec.loaded = true
    @loaded_specs[spec.name]  = spec
    @loaded_stacks[spec.name] = sources.dup

    spec.runtime_dependencies.each do |spec_dep|
      next if Gem.loaded_specs.include? spec_dep.name
      specs = Gem.source_index.search spec_dep, true

      _unresolved.add(*specs)
    end

    current = Hash.new { |h, name| h[name] = Gem::Dependency.new name }
    Gem.loaded_specs.each do |n,s|
      s.runtime_dependencies.each do |s_dep|
        current[s_dep.name] = current[s_dep.name].merge s_dep
      end
    end

    _unresolved.remove_specs_unsatisfied_by current

    require_paths = spec.require_paths.map do |path|
      File.join spec.full_gem_path, path
    end

    # gem directories must come after -I and ENV[&#039;RUBYLIB&#039;]
    insert_index = load_path_insert_index

    if insert_index then
      # gem directories must come after -I and ENV[&#039;RUBYLIB&#039;]
      $LOAD_PATH.insert(insert_index, *require_paths)
    else
      # we are probably testing in core, -I and RUBYLIB don&#039;t apply
      $LOAD_PATH.unshift(*require_paths)
    end

    return true
  end

</code>
</pre>
<p>Si alguien encuentra algún en error en mi seguimiento hasta acá le pido que haga un comentario en este post, Continuará&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/507/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/507/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/507/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=507&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2011/02/22/como-funciona-rubygems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
		<item>
		<title>Acts as Rubylit 2010</title>
		<link>http://gastonramos.wordpress.com/2010/11/03/acts-as-rubylit-2010/</link>
		<comments>http://gastonramos.wordpress.com/2010/11/03/acts-as-rubylit-2010/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 20:56:11 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[agil]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[jornadas]]></category>
		<category><![CDATA[santa fe]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=492</guid>
		<description><![CDATA[Este post es para invitarte a las jornadas de este año a realizarse en la Facultad de Ing. y Ciencias Hídricas en Santa Fe, en dónde vamos a tener charlas muy interesantes tanto para principiantes como para los que están en niveles más avanzados, con oradores de reconocimiento nacional e internacional. Una vez más el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=492&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este post es para invitarte a las jornadas de este año a realizarse en<br />
la <strong>Facultad de Ing. y Ciencias Hídricas</strong> en<strong> Santa Fe</strong>,<br />
en dónde vamos a tener charlas muy interesantes tanto para principiantes<br />
como para los que están en niveles más avanzados, con oradores de reconocimiento<br />
nacional e internacional.<br />
Una vez más el evento es gratuito, pero es necesario que estés<br />
registrado para poder participar del mismo, es por esto que te<br />
invitamos a hacerlo desde acá:</p>
<p><a href="https://eventioz.com/events/actsasrubylit-2010/registrations/new">https://eventioz.com/events/actsasrubylit-2010/registrations/new</a></p>
<p>podés ver la agenda acá:</p>
<p><a href="http://eventioz.com/events/actsasrubylit-2010/agenda">http://eventioz.com/events/actsasrubylit-2010/agenda</a></p>
<p>Todos los participantes de las jornadas van a recibir un certificado firmado por las autoridades de La Facultad de Ing. y Ciencias Hídricas.</p>
<p>Contamos con tu presencia!</p>
<p><a href="http://gastonramos.files.wordpress.com/2010/11/acts_2010-b.png"><img src="http://gastonramos.files.wordpress.com/2010/11/acts_2010-b.png?w=300&#038;h=234" alt="" title="acts_2010-b" width="300" height="234" class="alignnone size-medium wp-image-501" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/492/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/492/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/492/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=492&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2010/11/03/acts-as-rubylit-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>

		<media:content url="http://gastonramos.files.wordpress.com/2010/11/acts_2010-b.png?w=300" medium="image">
			<media:title type="html">acts_2010-b</media:title>
		</media:content>
	</item>
		<item>
		<title>Versión de ruby en el prompt</title>
		<link>http://gastonramos.wordpress.com/2010/10/20/version-de-ruby-en-el-prompt/</link>
		<comments>http://gastonramos.wordpress.com/2010/10/20/version-de-ruby-en-el-prompt/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 10:01:48 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[rvm]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=484</guid>
		<description><![CDATA[Hace un tiempito que vengo usando ruby version manager (rvm) para los proyectos en los que estoy trabajando, una de las cosas que uso es .rvmrc en cada proyecto entonces cuando entro a la carpeta de un proyecto en particular la version de ruby se setea automáticamente, pero hay veces que esto no funciona (por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=484&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempito que vengo usando ruby version manager (rvm) para los proyectos en los que estoy trabajando, una de las cosas que uso es .rvmrc en cada proyecto entonces cuando entro a la carpeta de un proyecto en particular la version de ruby se setea automáticamente, pero hay veces que esto no funciona (por ejemplo cuando abro una nueva terminal con ctrl + t estando ya parado en la carpeta en cuestión) o hay veces que creo que estoy usando una determinada versión de ruby cuando en realidad estoy usando otra (por esto del rvm) entonces lo que hice es agregar la version de ruby al prompt.</p>
<p>Primero cree la función que parsea la versión de ruby, para esto editamos el ~/.bash_profile</p>
<pre style="background:black none repeat scroll 0 50%;color:#f2f5a9;font-size:8pt;"><span style="font-size:85%;">
function parse_ruby_version {
  ruby -v | cut -d" " -f2
}
</pre>
<p>Y luego muestro esa función en mi prompt</p>
<pre style="background:black none repeat scroll 0 50%;color:#f2f5a9;font-size:8pt;"><span style="font-size:85%;">
PS1="${TITLEBAR}\

$BLUE[$LIGHT_GREEN\u$WHITE@\h:$LIGHT_GRAY\w$RED \
\$(parse_ruby_version)$LIGHT_GREEN\$(parse_git_branch)$BLUE]\
$GREEN\$ $LIGHT_GRAY"
</pre>
<p>Cómo pueden ver yo además de la versión de ruby, tengo el branch de git del repo con el que estoy trabajando, acá les dejo la versión completa:</p>
<pre style="background:black none repeat scroll 0 50%;color:#f2f5a9;font-size:8pt;"><span style="font-size:85%;">

unction parse_git_branch {
  git branch --no-color 2&gt; /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

function parse_ruby_version {
  ruby -v | cut -d" " -f2
}
function proml {
  local        BLUE="\[33[0;34m\]"
  local         RED="\[33[0;31m\]"
  local   LIGHT_RED="\[33[1;31m\]"
  local       GREEN="\[33[0;32m\]"
  local LIGHT_GREEN="\[33[1;32m\]"
  local       WHITE="\[33[1;37m\]"
  local  LIGHT_GRAY="\[33[0;37m\]"
  case $TERM in
    xterm*)
    TITLEBAR='\[33]0;\u@\h:\w07\]'
    ;;
    *)
    TITLEBAR=""
    ;;
  esac

PS1="${TITLEBAR}\

$BLUE[$LIGHT_GREEN\u$WHITE@\h:$LIGHT_GRAY\w$RED \
\$(parse_ruby_version)$LIGHT_GREEN\$(parse_git_branch)$B\
LUE]\
$GREEN\$ $LIGHT_GRAY"
PS2='&gt; '
PS4='+ '
}
export PROMPT_DIRTRIM=2
proml
</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/484/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/484/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/484/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=484&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2010/10/20/version-de-ruby-en-el-prompt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
		<item>
		<title>Gems mirror local</title>
		<link>http://gastonramos.wordpress.com/2010/09/10/gems-mirror-local/</link>
		<comments>http://gastonramos.wordpress.com/2010/09/10/gems-mirror-local/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 22:14:40 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubygem]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[gemsmirror]]></category>
		<category><![CDATA[mirror]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=478</guid>
		<description><![CDATA[Dado que tengo un enlace a internet que no es lo que uno quisiera tener, cada vez que quiero instalar una gema, me demora varios minutos, lo cual es bastante molesto cuando uno está trabajando, por esto decidí poner mi propio gems mirror local, pasemos a la acción: primero tenemos que editar el archivo de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=478&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dado que tengo un enlace a internet que no es lo que uno quisiera tener, cada vez que quiero instalar una gema, me demora varios minutos, lo cual es bastante molesto cuando uno está trabajando, por esto decidí poner mi propio gems mirror local, pasemos a la acción:</p>
<p>primero tenemos que editar el archivo de configuración para nuestro gem mirror:</p>
<p>emacs -nw ~/.gemmirrorrc y ponemos el siguiente contenido:</p>
<pre>
---
- to: /home/gemsmirror/rubygems.mirro
  from: http://gems.rubyforge.org
</pre>
<p>noten que yo voy a poner mi mirror en la carpeta /home/gemsmirror/rubygems.mirror pero uds la pueden poner en cualquiera que quieran.</p>
<p>luego de esto ejecutamos el comando </p>
<pre>
gem mirror
</pre>
<p>y después un largo pero largo rato (a mí esto me llevó como un mes con interrupciones, son como 16GB de gemas) se baja todas las gemas del mirror remoto. Una vez hecho y terminado esto tenemos que configurar nuestro servidor web para que publique el mirror, yo lo hice con apache, así sería:</p>
<pre>
emacs -nw /etc/apache2/sites-available/gemsmirror
</pre>
<p>y ponemos lo siguiente</p>
<pre>

        ServerName gems.localhost
        ServerAdmin root@gems.localhost
        DocumentRoot /home/gemsmirror/rubygems.mirror/

                Options Indexes FollowSymLinks MultiViews
                AllowOverride None

                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
       #AuthName "Dev Access"
       # AuthType Basic
       # AuthBasicProvider file
        # AuthUserFile /opt/coolstack/apache2/conf/htpasswd.users
       # Require user gems
# user: gems
# pass: password
                Order allow,deny
                allow from all

        ErrorLog /var/log/apache2/error-gemsmirror.log
        LogLevel warn
        #CustomLog /var/log/apache2/access-gemsmirror.log combined
        ServerSignature Off
</pre>
<p>Lo puse sin autenticación por que yo solamente le doy un uso local pero si quieren publicarlo en internet sería razonable ponerle clave.</p>
<p>Ahora habilitamos el site de mirror</p>
<pre>
a2ensite gemsmirror
</pre>
<p>y agregamos el host:</p>
<pre>
emacs -nw /etc/hosts
</pre>
<p>ponemos lo siguiente:</p>
<pre>
....
######################################################################
# Gemsmirror local
127.0.0.1 gems.localhost

.....
</pre>
<p>Ahora recargamos el apache:</p>
<pre>
/etc/init.d/apache2 reload
</pre>
<p>y vamos al navegador y chequeamos que se vean el directorio de nuestro mirror en:</p>
<p>http://gems.localhost/</p>
<p>si todo está bien agregamos nuestro mirror local al gemrc:</p>
<pre> emacs -nw ~/.gemrc</pre>
<pre>
---
:sources:
- http://gems.localhost
#- http://gems.rubyforge.org/
#- http://gems.github.com
#- http://gemcutter.org/
#- http://gems.github.com
:bulk_threshold: 1000
:benchmark: false
:update_sources: true
:backtrace: false
:verbose: true
</pre>
<p>fijensé que yo comenté todos los demás mirrors, de esta manera sólo busca las gemas en el mirror local y al instalar o buscar cualquier cosa la velocidad es increíble :), ahora solo resta pner un cron para que actualice el mirror diariamente (por la noche) y listo.</p>
<p>Eso es todo, enjoy !</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/478/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=478&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2010/09/10/gems-mirror-local/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
		<item>
		<title>Usando filter_parameters en ApplicationController con Rails 2.3</title>
		<link>http://gastonramos.wordpress.com/2010/05/17/usando-filter_parameters-en-applicationcontroller-en-rails-2-3/</link>
		<comments>http://gastonramos.wordpress.com/2010/05/17/usando-filter_parameters-en-applicationcontroller-en-rails-2-3/#comments</comments>
		<pubDate>Mon, 17 May 2010 20:21:38 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[logs]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=466</guid>
		<description><![CDATA[Cómo uds. saben ApplicationController trae un método con el cual podemos ocultar datos sensibles que no queremos que aparezcan en los logs (véase la doc ) pero hay veces que además de ocultar los params en los logs, también necesitamos usar este mismo params ya procesado (con los valores FILTERED) en otro lado, por ejemplo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=466&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Cómo uds. saben ApplicationController trae un método con el cual podemos ocultar datos sensibles que no queremos que aparezcan en los logs (véase la <a href="http://rails.rubyonrails.org/classes/ActionController/Base.html#M000647">doc</a> ) pero hay veces que además de ocultar los params en los logs, también necesitamos usar este mismo params ya procesado (con los valores FILTERED) en otro lado, por ejemplo para una app que loggea en una tabla todo lo que un user hace (incluido action, controler y params en cuestión) para esto podemos usar <strong>filter_parameters(params) </strong> que retorna el hash params filtrado, para entender un poco más cómo funciona podés leer los tests de rails en el archivo vendor/rails/actionpack/test/controller/filter_params_test.rb, cómo llegué a este archivo? fácil primero leí el código del método filter_parameter_logging, ahí me ví que crea un método al vuelo llamado filter_parameters y luego de eso simplemente hice un grep:</p>
<p><code></p>
<pre style="background:black none repeat scroll 0 50%;color:#f2f5a9;font-size:8pt;"><span style="font-size:85%;">
grep -r filter_parameters vendor/rails/ -n
vendor/rails/actionpack/test/controller/filter_params_test.rb:11:
def test_filter_parameters
vendor/rails/actionpack/test/controller/filter_params_test.rb:13:
assert !@controller.respond_to?(:filter_parameters)
vendor/rails/actionpack/test/controller/filter_params_test.rb:16:
assert @controller.respond_to?(:filter_parameters)
vendor/rails/actionpack/test/controller/filter_params_test.rb:33:
assert_equal after_filter, @controller.__send__(:filter_parameters, before_filter)
vendor/rails/actionpack/test/controller/filter_params_test.rb:43:
assert_equal after_filter, @controller.__send__(:filter_parameters, before_filter)
vendor/rails/actionpack/test/controller/filter_params_test.rb:47:
def test_filter_parameters_is_protected
vendor/rails/actionpack/test/controller/filter_params_test.rb:49:
assert !FilterParamController.action_methods.include?('filter_parameters')
vendor/rails/actionpack/test/controller/filter_params_test.rb:50:
 assert_raise(NoMethodError) { @controller.filter_parameters([{'password' =&gt; '[FILTERED]'}]) }
vendor/rails/actionpack/lib/action_controller/base.rb:486:
define_method(:filter_parameters) do |unfiltered_parameters|
vendor/rails/actionpack/lib/action_controller/base.rb:493:
  filtered_parameters[key] = filter_parameters(value)
vendor/rails/actionpack/lib/action_controller/base.rb:498:
 filter_parameters(item)
vendor/rails/actionpack/lib/action_controller/base.rb:515:
protected :filter_parameters
vendor/rails/actionpack/lib/action_controller/base.rb:1319:
  parameters = respond_to?(:filter_parameters) ? filter_parameters(params) : params.dup
</pre>
<p></code></p>
<p>Bueno cortito, pero útil ;)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/466/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/466/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/466/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=466&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2010/05/17/usando-filter_parameters-en-applicationcontroller-en-rails-2-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
		<item>
		<title>MongoId y Rails3</title>
		<link>http://gastonramos.wordpress.com/2010/05/11/mongoid-y-rails3/</link>
		<comments>http://gastonramos.wordpress.com/2010/05/11/mongoid-y-rails3/#comments</comments>
		<pubDate>Wed, 12 May 2010 00:02:32 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[mngoid]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails3]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=436</guid>
		<description><![CDATA[Bueno últimamente vengo posteando con bastante delay (espero que eso cambie), en esta ocasión voy a hacer un pequeño post acerca de mis experiencias migrando una app de rails 2.3.4 y Active record con Mysql a Rails3, MongoId y Ruby 1.9.1, sí, así completita la cosa, la aplicación no es demasiado grande así que viene [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=436&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bueno últimamente vengo posteando con bastante delay (espero que eso cambie),<br />
en esta ocasión voy a hacer un pequeño post acerca de mis experiencias migrando<br />
una app de rails 2.3.4 y Active record con Mysql a Rails3, MongoId y Ruby 1.9.1,<br />
sí, así completita la cosa, la aplicación no es demasiado grande así que viene bien<br />
para probar esta nueva arquitectura.<br />
No voy entrar en los detalles de como instalar rails3 y esas cosas por que ya existen<br />
varios posts acerca del tema y no me quiero repetir, pasemos derecho al tema mongoid<br />
<a href="http://mongoid.org/">Mongoid</a> es un ODM(Object-Document-Mapper) para <a href="http://www.mongodb.org/">mongoDB</a>, tiene varias cosas buenas algunas de las que me llamaron<br />
la atención a mí es que no necesitamos migrations para para modificar nuestros documentos<br />
(en sql diríamos tablas) además los campos (columnas) los podemos ver directamente abriendo<br />
el modelo.</p>
<pre style="background:black none repeat scroll 0 50%;color:#f2f5a9;font-size:8pt;"><span style="font-size:85%;">
class Order
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::XmlBuilder

  field :external_id, :type =&gt; Integer
  field :account_id, :type =&gt; Integer
  field :order_type, :type =&gt; String
  field :posted, :type =&gt; Boolean
  field :send_result_notification, :type =&gt; Boolean
  field :file_duration_ms, :type =&gt; Integer
  field :created_at, :type =&gt; DateTime
  field :updated_at, :type =&gt; DateTime

  embeds_one :result, :class_name =&gt; "OrderResult"

  #  -----------------------------------------------------------------------------------------------
  #  Viejo named_scope reemplazado por mongoid queries
  #
  #  named_scope :pendings, :conditions =&gt; "NOT EXISTS (SELECT * FROM
  #   order_results WHERE
  #    order.id = order_results.transcription_id)
  #    AND posted_id IS NOT NULL AND
  #    orders.posted = 1"
  #
  # ------------------------------------------------------------------------------------------------

  def self.without_results
    result_ids = TranscriptionResult.criteria.only(:id).map{|id| }
    Order.where(:_id.nin =&gt; result_ids)
  end

  def self.pendings
    without_results.where(:posted =&gt; true)
  end
end
</span></pre>
<p>Otra de las ventajas es que<em> los criterios son anidables </em>con lo cual funcionarían<br />
como una especie de scope de Active Record, fijensé como quedó el viejo named_scope<br />
con mongoid, mucho más claro que antes para mi gusto.<br />
Otra de las ventajas de mongoID en particular es que <strong>incluye ActiveModel,</strong> con lo<br />
cual tenemos las mismas validaciones que en Rails, también <strong>podemos definir callbacks</strong> de forma similar que en Active Record.</p>
<p>Pasemos a explicar un poquito:<br />
Lo que yo necesito son los transcriptions que no tengan un transcription_result asociado y dónde posted sea true.</p>
<pre style="background:black none repeat scroll 0 50%;color:#f2f5a9;font-size:8pt;"><span style="font-size:85%;">
result_ids =OrderResult.criteria.only(:id)
﻿﻿﻿= &gt; #[:id]}, @klass=OrderResult, @documents=[]&gt;
﻿﻿﻿</span></pre>
<p>con esto saco la lista de results, sólo me traigo los ids por que no necesito<br />
otra cosa y le aplico un map para obtener una array con la lista de ids (cómo pueden ver eso devuelve un objeto Mongoid::Criteria) con esto ya tengo los transcriptions que no tienen results (el método without_results). Después una vez que tengo esto ya es más fácil<br />
generar los pendings (transcriptions sin results y con posted == true).<br />
<strong>Nota:</strong> :_id.nin quiere decir &#8220;los _id que no estén incluidos en (not included in)&#8221;<br />
para más detalles <a href="http://mongoid.org/docs/querying">pueden ver la doc de queries</a> de mongoid</p>
<p><strong>PD:</strong> MongoId también tiene named_scopes dejo pendiente para el próximo refactoring pasar esto a named_scope de mongoid.</p>
<p>Nos vemos en el próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/436/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/436/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/436/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=436&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2010/05/11/mongoid-y-rails3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
		<item>
		<title>Forrest, un runner para stories con rails</title>
		<link>http://gastonramos.wordpress.com/2010/03/22/forrest-un-runner-para-stories-con-rails/</link>
		<comments>http://gastonramos.wordpress.com/2010/03/22/forrest-un-runner-para-stories-con-rails/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 12:20:50 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=416</guid>
		<description><![CDATA[Estoy trabajando en un proyecto en el cual estamos usando stories como  framework para los tests de aceptación, resulta que me encontré con un pequeño incoveniente: los tests eran un poco lentos y no tenía forma de correr un test para un sólo scenario, si bien como son tests de aceptación o integración sabemos que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=416&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estoy trabajando en un proyecto en el cual estamos usando <a href="http://blog.citrusbyte.com/2009/05/20/stories/">stories</a> como  framework para los tests de aceptación, resulta que me encontré con un pequeño incoveniente: los tests eran un poco lentos y no tenía forma de correr un test para un sólo <strong>scenario, </strong>si bien<strong> </strong>como son tests de aceptación o integración sabemos que hay que correrlos todos juntos, a veces cuando hay un error o failure es útil poder correr sólamente ese test y no todos. Entonces comencé a escribir un pequeño script para poder correr <strong>un sólo scenario de un story en particular, </strong>el script creció un poquito así que decidí crear una pequeña gema que se llama<strong><a href="http://github.com/gramos/forrest"> &#8220;Forrest&#8221; </a></strong>así que les muestro un poquito como funciona, es muy simple:</p>
<pre style="background:black none repeat scroll 0 50%;color:rgb(242,245,169);font-size:8pt;"><span style="font-size:85%;">$ sudo gem install forrest

<span style="font-size:11.6667px;">Successfully installed forrest-0.1.1</span>
<div id="_mcePaste">1 gem installed</div>
<div id="_mcePaste">Installing ri documentation for forrest-0.1.1...</div>
<div id="_mcePaste">Installing RDoc documentation for forrest-0.1.1...</div>

Successfully installed forrest-0.1.11 gem installedInstalling ri
documentation for forrest-0.1.1...Installing RDoc
documentation for forrest-0.1.1...</span></pre>
<pre style="background:black none repeat scroll 0 50%;color:rgb(242,245,169);font-size:8pt;"><span style="font-size:85%;">$ cd /rails/my-project
$ forrest test/stories/auth-stories-test.rb

+ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMy<span style="font-size:11.6667px;">Services</span>
|__ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMyServices#test_Given_bad_params
|__ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMyServices#test_Given_good_params</span></pre>
<p>Para correr un scenario en particular simplemente copiamos y pegamos uno de las lista impresa más arriba y ejecutamos forrest así:</p>
<pre style="background:black none repeat scroll 0 50%;color:rgb(242,245,169);font-size:8pt;"><span style="font-size:85%;">forrest ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoI
CanStartManagingMyServices#test_Given_good_params</span></pre>
<p>o por ejemplo si estamos buscando un storie en particular podemos usar grep:</p>
<pre style="background:black none repeat scroll 0 50%;color:rgb(242,245,169);font-size:8pt;"><span style="font-size:85%;">$ forrest test/stories/client_site_stories_test.rb | grep -y good_params

|__ ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICan
StartManagingMyServices#test_Given_good_params</span></pre>
<p>Otra opción es correr todos los scenarios de un story en particular, para esto tenemos que ejecutar forrest con el nombre del story, que también lo podemos copiar del listado impreso<br />
cuando ejecutamos forrest con un archivo de stories como argumento, asi:</p>
<pre style="background:black none repeat scroll 0 50%;color:rgb(242,245,169);font-size:8pt;"><span style="font-size:85%;">
forrest ClientSiteStoriesTest::TestAsAnAccountIWantToLoginToMyClientSiteSoICanStart
ManagingMyServices
</span></pre>
<p>Otro inconveniente era que cuando había un error se mostraba toda lá página de error de rails lo cual era bastante molesto, con forresto los errores se ven un poquito más lindos:</p>
<pre style="background:black none repeat scroll 0 50%;color:rgb(242,245,169);font-size:8pt;"><span style="font-size:85%;">forrest CustomerStoriesTest::TestAsACustomerIWantToResetMyPasswordIfIForgotItSo
ThatICanRecoverAccessToTheSite#test_Given_an_exisitng_account_email_but_without_
fill_in_the_company
==&gt; Runing scenario...
================================================================================

- As a customer I want to reset my password if I forgot it so that I can recover 
  access to the site 

    Given an exisitng account email but without fill in the company
================================================================================

Finished in 0.061427 seconds.

  1) Error:
NoMethodError: undefined method `closed?' for nil:NilClass...
/usr/lib/ruby/1.8/net/http.rb:1060:in `request'
    /usr/lib/ruby/1.8/net/http.rb:772:in `get'
    lib/active_resource_extensions.rb:77:in `last'
    test/stories/customer_stories_test.rb:9:in `setup'</span></pre>
<p>Cabe destacar que cuando estaba escribiendo forrest me encontré con este bug en rails:<br />
<a href="https://rails.lighthouseapp.com/projects/8994/tickets/3153-actioncontrollerintegrationsession-broken-in-234">https://rails.lighthouseapp.com/projects/8994/tickets/3153-actioncontrollerintegrationsession-broken-in-234</a></p>
<p>que si no lo fixean no van a poder usar forrest, por lo menos yo no pude.</p>
<p><em>Bueno esto fue todo, cualquier sugerencia comenten!</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/416/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=416&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2010/03/22/forrest-un-runner-para-stories-con-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
		<item>
		<title>Colaborando con Ruby</title>
		<link>http://gastonramos.wordpress.com/2009/12/16/colaborando-con-ruby/</link>
		<comments>http://gastonramos.wordpress.com/2009/12/16/colaborando-con-ruby/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 20:47:54 +0000</pubDate>
		<dc:creator>Gastón Ramos</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby-core]]></category>

		<guid isPermaLink="false">http://gastonramos.wordpress.com/?p=393</guid>
		<description><![CDATA[Bueno en este post voy a escribir un ayuda memoria (para mí, no para uds. obvio) de cómo enviar un Patch al core Ruby. Existe un documento que explica los pasos generales para enviar un patch al core de ruby que es el &#8220;Improving Ruby, Patch by Patch&#8221; lo pueden encontrar acá: Improving Ruby, Patch [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=393&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bueno en este post voy a escribir un ayuda memoria (para mí, no para uds. obvio) de cómo enviar un Patch al core Ruby. Existe un documento que explica los pasos generales para enviar un patch al core de ruby que es el &#8220;Improving Ruby, Patch by Patch&#8221; lo pueden encontrar acá:<br />
<a href="http://www.ruby-lang.org/en/community/ruby-core/#patching-ruby">Improving Ruby, Patch by Patch</a></p>
<p>Y después hay un mail que escribió Matz que es una lista de cosas a tener en cuenta para facilitarle a los devs las cosas y que el patch se pueda aplicar fácilmente:</p>
<p><a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/25139">Patch writer&#8217;s guide to submit</a></p>
<p><strong>Bueno al grano, todo comenzó así:</strong> Ayer estaba leyendo la lista de tickets de rails y me encontré con esto:</p>
<p><a href="https://rails.lighthouseapp.com/projects/8994/tickets/3475-activesupportmultibytecharsgsub-fails-while-stringgsub-works">https://rails.lighthouseapp.com/projects/8994/tickets/3475-activesupportmultibytecharsgsub-fails-while-stringgsub-works</a></p>
<p>todo parece indicar que es un bug en activesupport como indica el ticket, pero con un poquito de investigación podemos ver que esto no es así, el problema real está en la lib CGI que viene con la lib Standard de ruby, particularmente el método CGI::escape, veamos:<br />
El archivo en cuestión es ruby_1_8/lib/cgi.rb :</p>
<pre>
  # URL-encode a string.
  #   url_encoded_string = CGI::escape("'Stop!' said Fred")
  #      # =&gt; "%27Stop%21%27+said+Fred"
  def CGI::escape(string)
    string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
      '%' + $1.unpack('H2' * $1.size).join('%').upcase
    end.tr(' ', '+')
  end
</pre>
<p>El error lo tira exactamente cuando intenta hacer $1.size y $1 es nil :</p>
<pre>
NoMethodError: undefined method `size' for nil:NilClass
  from /usr/lib/ruby/1.8/cgi.rb:343:in `escape'
</pre>
<p>Buscando un poco en google encontré que las variables con dolar no funcionan bien en ciertas situaciones<br />
cuando se usan con bloques, acá está la prueba y la explicación:</p>
<p><a href="http://www.justskins.com/forums/bug-when-rerouting-string-gsub-with-a-block-using-1-a-52852.html">http://www.justskins.com/forums/bug-when-rerouting-string-gsub-with-a-block-using-1-a-52852.html</a></p>
<p>Explicado esto, ahora hay que resolver el problema, entonces la idea es reemplazar las variables $1 por un argumento en el bloque del código (al menos esa fué mi idea), pienso en un test que pueda<br />
reproducir el problema, mmmmm&#8230;. dónde creo que archivo de tests para CGI? (dado que no existe ninguno al día de hoy, recuerdo que estoy ruby_1_8), listo creo que tests/cgi/test_cgi.rb es un buen lugar y lo primero que se me ocurre es esto:</p>
<pre>
require "cgi"
require "test/unit"

class String
  alias : old_gsub :gsub
  def gsub(*args, &amp;block)
    old_gsub(*args, &amp;block)
  end
end

class TestCGI &lt; Test::Unit::TestCase

 def test_escape_should_work_inside_a_block
     original_string  = &quot;An Interview with Criteri&#8230;&quot;
     escaped_string   = &quot;An+Interview+with+Criteri%26%238230%3B&quot;
     assert escaped_string, CGI.escape(original_string)
  end

end
</pre>
<p>Corro el test:</p>
<pre>
  make test-all TESTS='-v cgi/test_cgi.rb'
</pre>
<p>Y el resultado es:</p>
<pre>
1) Error:
test_escape_should_work_inside_a_block(TestCGI):
NoMethodError: undefined method `size' for nil:NilClass
    /home/gramos/srcs/ruby_1_8/lib/old_cgi.rb:343:in `escape'
    /home/gramos/srcs/ruby_1_8/test/cgi/test_cgi.rb:9:in `old_gsub'
    /home/gramos/srcs/ruby_1_8/test/cgi/test_cgi.rb:9:in `gsub'
    /home/gramos/srcs/ruby_1_8/lib/old_cgi.rb:342:in `escape'
    /home/gramos/srcs/ruby_1_8/test/cgi/test_cgi.rb:25:in `test_escape_should_work_inside_a_block'
</pre>
<p>Genial, el problema está representado en el test, ahora el Fix:</p>
<pre>
  # URL-encode a string.
  #   url_encoded_string = CGI::escape("'Stop!' said Fred")
  #      # =&gt; "%27Stop%21%27+said+Fred"
  def CGI::escape(string)
    string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do |s|
      '%' + s.unpack('H2' * s.size).join('%').upcase
    end.tr(' ', '+')
  end
</pre>
<p>Sencillo. Bueno después de esto hice lo mismo para CGI::unescape, con el test y todo. Luego de chequear que todo esté Ok, creé el patch de esta forma:</p>
<pre>
svn diff &gt; cgi_escape_work_with_blocks_and_avoid_dollars_variables.patch
</pre>
<p>Y después envié un mail a la lista de ruby-core adjuntando el patch y con una explicación del problema.</p>
<p><a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/27198">http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/27198</a></p>
<p>Ahora hay que esperar para ver si lo aplican&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gastonramos.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gastonramos.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gastonramos.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gastonramos.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gastonramos.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gastonramos.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gastonramos.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gastonramos.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gastonramos.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gastonramos.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gastonramos.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gastonramos.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gastonramos.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gastonramos.wordpress.com/393/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gastonramos.wordpress.com&amp;blog=1034400&amp;post=393&amp;subd=gastonramos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gastonramos.wordpress.com/2009/12/16/colaborando-con-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86112553d9846f4c7b16e8bfee1f28f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Gastón Ramos</media:title>
		</media:content>
	</item>
	</channel>
</rss>
