<?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/"
	>

<channel>
	<title>Negonation Blog &#187; Rails</title>
	<atom:link href="http://blog.negonation.com/es/category/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.negonation.com/es</link>
	<description>Justice is ripe for disruption</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:27:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Tractis Identity: Plugin Rails de verificaciones de identidad</title>
		<link>http://blog.negonation.com/es/tratis-identity-plugin-rails-de-verificaciones-de-identidad/</link>
		<comments>http://blog.negonation.com/es/tratis-identity-plugin-rails-de-verificaciones-de-identidad/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 08:00:51 +0000</pubDate>
		<dc:creator>Ernesto Jiménez</dc:creator>
				<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[Clientes]]></category>
		<category><![CDATA[Identidad]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Tractis]]></category>

		<guid isPermaLink="false">http://blog.negonation.com/es/?p=1079</guid>
		<description><![CDATA[Para cerrar la semana queremos presentaros un plugin para usar las verificaciones de identidad en Ruby on Rails. Este plugin permite integrar las verificaciones de identidad de las que hablamos el lunes en cualquier proyecto hecho en Rails. El plugin se puede emplear tanto para ofrecer pasarelas de autenticación con DNI-e (del mismo modo que [...]]]></description>
			<content:encoded><![CDATA[<p>Para cerrar la semana queremos presentaros un plugin para usar las <a href="https://www.tractis.com/identity">verificaciones de identidad</a> en Ruby on Rails. Este plugin permite integrar <a href="http://blog.negonation.com/es/tractis-identity-verifica-la-identidad-real-de-tus-usuarios/">las verificaciones de identidad de las que hablamos el lunes</a> en cualquier proyecto hecho en Rails.</p>
<p>El plugin se puede emplear tanto para ofrecer pasarelas de autenticación con DNI-e (del mismo modo que el <a href="http://xxxx">plugin de Drupal</a>), como para crear perfiles certificados en vuestra página web donde vuestros usuarios puedan mostrar su identidad real.</p>
<h3 id="los_primeros_en_integrarlo">Los primeros en integrarlo</h3>
<p>Estamos muy contentos porque, junto a la presentación del plugin, podemos anunciar el primer proyecto que ya lo ha integrado y una segunda integración que verá la luz dentro de muy poco.</p>
<h3 id="el_primero_todosiniestroscom">El primero! todosiniestros.com</h3>
<p><a href="http://todosiniestros.com"><img class="aligncenter size-full wp-image-1081" title="todosiniestros" src="http://blog.negonation.com/es/wp-content/uploads/2009/07/todosiniestros.png" alt="todosiniestros" width="460" height="450" /></a></p>
<p>En primer lugar está <a href="http://todosiniestros.com/">todosiniestros.com</a>, un proyecto de <a href="http://blog.n2kp3.com/">Felipe Talavera</a>, Jesús Blázquez y Miguel González. <a href="http://todosiniestros.com/">todosiniestros.com</a> tiene como objetivo de dar a conocer y potenciar el mundo del vehículo, tanto de segunda mano como con golpe, y fomentar todo tipo de servicios que les rodean. En su web ofrecen, entre otras cosas, una herramienta para que particulares y empresas puedan vender coches siniestrados, piezas de repuesto y coches de segunda mano.</p>
<p>Desde hoy <a href="http://todosiniestros.com/">todosiniestros.com</a> permite a sus vendedores demostrar quienes son realmente por medio de las verificaciones de identidad de Tractis. De esta forma los vendedores dan más confianza a sus posibles compradores, quienes pueden tener la certeza de saber con quién están hablando.</p>
<p><a href="http://todosiniestros.com"><img class="aligncenter size-full wp-image-1080" title="todosiniestros-v" src="http://blog.negonation.com/es/wp-content/uploads/2009/07/todosiniestros-v.png" alt="todosiniestros-v" width="460" height="342" /></a></p>
<h3 id="prximamente8230_mercadeliacom">Próximamente… mercadelia.com</h3>
<p><a href="http://www.mercadelia.com/"><img class="aligncenter size-full wp-image-1082" title="mercadelia" src="http://blog.negonation.com/es/wp-content/uploads/2009/07/mercadelia.png" alt="mercadelia" width="460" height="450" /></a></p>
<p>El segundo proyecto que ha usado este plugin es <a href="http://www.mercadelia.com/">mercadelia</a>, una web de anuncios clasificados creada y mantenida por <a href="http://www.minid.net/">Diego Lafuente</a> y <a href="http://er.nes.to">Ernesto González</a>.</p>
<p><a href="http://www.mercadelia.com/">Mercadelia</a>, al igual que todosiniestros, permitirá en breve a sus anunciantes demostrar su identidad real para dar más confianza a sus posibles compradores.</p>
<h3 id="s_el_siguiente_en_integrarte">Sé el siguiente en integrarte</h3>
<p>Podéis encontrar las <a href="http://github.com/tractis/tractis_identity_verifications">instrucciones de instalación y uso en github</a>. La integración es muy sencilla y se puede tener funcionando enseguida.</p>
<p>Si decidís integrar en algún proyecto las <a href="https://www.tractis.com/identity">verificaciones de identidad de Tractis</a> (ya sea con <a href="http://github.com/tractis/tractis_identity_verifications">el plugin para Rails</a> o por vuestra cuenta) <a href="mailto:info@tractis.com">no dudéis en contárnoslo</a>. Nos encantará ver cómo os habéis integrado <img src='http://blog.negonation.com/es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.negonation.com/es/tratis-identity-plugin-rails-de-verificaciones-de-identidad/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Gestión de eventos en Rails: Observers</title>
		<link>http://blog.negonation.com/es/gestion-de-eventos-en-rails-observers/</link>
		<comments>http://blog.negonation.com/es/gestion-de-eventos-en-rails-observers/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 23:06:28 +0000</pubDate>
		<dc:creator>Ernesto Jiménez</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.negonation.com/es/gestion-de-eventos-en-rails-observers/</guid>
		<description><![CDATA[Todos los desarrolladores Rails utilizamos los callbacks de ActiveRecord. El uso de estos callbacks da mucho juego a nuestros modelos: validaciones, tratamiento de datos, operaciones sobre modelos relacionados, envío de e-mails automáticos&#8230; Al principio, cuando uno empieza a desarrollar en Rails, todas esas operaciones que comentaba solemos realizarlas en el controllador. Sin embargo, a medida [...]]]></description>
			<content:encoded><![CDATA[<p>Todos los desarrolladores Rails utilizamos los <a href="http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html" title="callbacks en ActiveRecord"><em>callbacks</em> de ActiveRecord</a>. El uso de estos callbacks da mucho juego a nuestros modelos: validaciones, tratamiento de datos, operaciones sobre modelos relacionados, envío de e-mails automáticos&#8230;</p>
<p>Al principio, cuando uno empieza a desarrollar en Rails, todas esas operaciones que comentaba solemos realizarlas en el controllador. Sin embargo, a medida que vamos aligerando nuestros controladores y <a href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model" title="Skinny Controller, Fat Model">engordando nuestros modelos</a> la cantidad de callbacks que empleamos en nuestros modelos va aumentando. Esto es algo bueno, pero en ocasiones acabamos con un montón de callbacks en el modelo que no tienen que ver con el modelo en si.</p>
<p>Para extraer de los modelos todo ese código disparado por callbacks que no tiene que ver directamente con el modelo Rails proporciona <a href="http://api.rubyonrails.org/classes/ActiveRecord/Observer.html" title="Documentación de la clase Observer">los observers</a>.</p>
<h4 id="los_observers_por_dentro">Los observers por dentro</h4>
<p>En este post vamos a ver cómo funcionan los observers de rails por dentro. Para ello es necesario saber cómo se emplean así que, si no los has usado nunca, deberías echarle un vistazo a <a href="http://api.rubyonrails.org/classes/ActiveRecord/Observer.html" title="Documentación de la clase Observer">la documentación</a> <img src='http://blog.negonation.com/es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h5 id="el_mdulo_observable_en_ruby">El módulo <em>Observable</em> en Ruby</h5>
<p>Ruby implementa su librería estándar algunos módulos sobre patrones de diseño habituales. Uno de estos módulos es <em>Observable</em>.</p>
<p>El módulo <em>Observable</em> implementa el <a href="http://en.wikipedia.org/wiki/Observer_pattern" title="Observer pattern">patrón Observer</a> también llamado <em>Publicador-Sucriptor</em>. En este patrón un objeto (el <em>publicador</em> o la fuente) informa a un conjunto de objetos interesados (los <em>suscriptores</em>) cuando su estado cambia. Para ello nos proporciona una serie de métodos para registrar suscriptores y para notificarles los cambios de estado.</p>
<p>Veamos un ejemplo de uso del módulo Observable:</p>
<pre class="ruby"><span class="ident">require</span> <span class="punct">'</span><span class="string">observer</span><span class="punct">'</span>

<span class="keyword">class </span><span class="class">MonitorSistema</span>
  <span class="ident">include</span> <span class="constant">Observable</span>

  <span class="keyword">def </span><span class="method">run</span>
    <span class="ident">ultimo_espacio_libre</span> <span class="punct">=</span> <span class="constant">nil</span>
    <span class="ident">loop</span> <span class="keyword">do</span>
      <span class="ident">espacio_libre</span> <span class="punct">=</span> <span class="constant">Disco</span><span class="punct">.</span><span class="ident">espacio_libre</span>
      <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">Espacio libre en disco: <span class="expr">#{espacio_libre}</span>MB</span><span class="punct">&quot;</span>
      <span class="keyword">if</span> <span class="ident">espacio_libre</span> <span class="punct">!=</span> <span class="ident">ultimo_espacio_libre</span>
        <span class="ident">changed</span>
        <span class="ident">notify_observers</span><span class="punct">(</span><span class="ident">espacio_libre</span><span class="punct">)</span>
        <span class="ident">ultimo_espacio_libre</span> <span class="punct">=</span> <span class="ident">espacio_libre</span>
      <span class="keyword">end</span>
      <span class="ident">sleep</span><span class="punct">(</span><span class="number">60</span><span class="punct">)</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>

<span class="keyword">class </span><span class="class">MantenimientoDisco</span>
  <span class="keyword">def </span><span class="method">initialize</span><span class="punct">(</span><span class="ident">limite</span><span class="punct">)</span>
    <span class="attribute">@limite</span> <span class="punct">=</span> <span class="ident">limite</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">update</span><span class="punct">(</span><span class="ident">espacio_libre</span><span class="punct">)</span>
    <span class="keyword">if</span> <span class="ident">espacio_libre</span> <span class="punct">&lt;</span> <span class="attribute">@limite</span>
      <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">-- Limpiando archivos temporales. <span class="expr">#{espacio_libre}</span>MB de espacio libre</span><span class="punct">&quot;</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>

<span class="keyword">class </span><span class="class">AlertaPocoEspacio</span>
  <span class="keyword">def </span><span class="method">initialize</span><span class="punct">(</span><span class="ident">limite</span><span class="punct">,</span> <span class="ident">email</span><span class="punct">)</span>
    <span class="attribute">@limite</span> <span class="punct">=</span> <span class="ident">limite</span>
    <span class="attribute">@email</span> <span class="punct">=</span> <span class="ident">email</span>
  <span class="keyword">end</span>

  <span class="keyword">def </span><span class="method">update</span><span class="punct">(</span><span class="ident">espacio_libre</span><span class="punct">)</span>
    <span class="keyword">if</span> <span class="ident">espacio_libre</span> <span class="punct">&lt;</span> <span class="attribute">@limite</span>
      <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">-- Notificando a <span class="expr">#{@email}</span>. <span class="expr">#{espacio_libre}</span>MB de espacio libre</span><span class="punct">&quot;</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>
<span class="keyword">end</span>

<span class="ident">monitor</span> <span class="punct">=</span> <span class="constant">MonitorSistema</span><span class="punct">.</span><span class="ident">new</span>
<span class="ident">monitor</span><span class="punct">.</span><span class="ident">add_observer</span><span class="punct">(</span><span class="constant">MantenimientoDisco</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="number">700</span><span class="punct">))</span>
<span class="ident">monitor</span><span class="punct">.</span><span class="ident">add_observer</span><span class="punct">(</span><span class="constant">AlertaPocoEspacio</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="number">700</span><span class="punct">,</span> <span class="punct">'</span><span class="string">pedro@ejemplo.com</span><span class="punct">'))</span>
<span class="ident">monitor</span><span class="punct">.</span><span class="ident">add_observer</span><span class="punct">(</span><span class="constant">AlertaPocoEspacio</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="number">600</span><span class="punct">,</span> <span class="punct">'</span><span class="string">antonio@ejemplo.com</span><span class="punct">'))</span>
<span class="ident">monitor</span><span class="punct">.</span><span class="ident">run</span></pre>
<p>El ejemplo me parece que es bastante ilustrativo, pero mejor aclararlo algunos detalles <img src='http://blog.negonation.com/es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>El módulo <em>Observable</em> define una serie de métodos que podéis consultar en <a href="http://ruby-doc.org/core/classes/Observable.html" title="módulo Observable">la documentación del módulo</a>. En nuestro ejemplo usamos tres de ellos:</p>
<ul>
<li><strong>changed</strong><em>(state=true)</em>: cambia el estado del objeto.</li>
<li><strong>notify_observers</strong><em>(*args)</em>: <strong>si el estado es true</strong>, invoca al método <em>update</em> de cada suscriptor con los mismos argumentos.</li>
<li><strong>add_observer</strong><em>(observer)</em>: registra un nuevo suscriptor.</li>
</ul>
<p>Veamos una ejecución de ejemplo del script anterior:</p>
<pre class="ruby"><span class="comment">Espacio libre en disco: 1011MB</span>
<span class="comment">Espacio libre en disco: 821MB</span>
<span class="comment">Espacio libre en disco: 880MB</span>
<span class="comment">Espacio libre en disco: 625MB</span>
<span class="comment">-- Limpiando archivos temporales. 625MB de espacio libre</span>
<span class="comment">-- Notificando a pedro@ejemplo.com. 625MB de espacio libre</span>
<span class="comment">Espacio libre en disco: 730MB</span>
<span class="comment">Espacio libre en disco: 570MB</span>
<span class="comment">-- Limpiando archivos temporales. 570MB de espacio libre</span>
<span class="comment">-- Notificando a pedro@ejemplo.com. 570MB de espacio libre</span>
<span class="comment">-- Notificando a antonio@ejemplo.com. 570MB de espacio libre</span>
<span class="comment">Espacio libre en disco: 716MB</span>
<span class="comment">Espacio libre en disco: 841MB</span>
<span class="comment">Espacio libre en disco: 1016MB</span></pre>
<h5 id="activerecord_publicador_y_suscriptor">ActiveRecord: Publicador y suscriptor</h5>
<p>ActiveRecord tiene dos clases involucradas en la gestión de eventos:</p>
<ul>
<li><em>ActiveRecord::Base</em>: incluye el módulo <em>Observable</em> de Ruby y notifica a los suscriptores todos los eventos a los que se pueden asociar callbacks.</li>
<li><em>ActiveRecord::Observer</em>: es la clase base para todos los observers y define el método <em>update</em>.</li>
</ul>
<p>Cuando un modelo (como sabemos, subclase de <em>ActiveRecord::Base</em> <img src='http://blog.negonation.com/es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) cambia de estado invoca a, además de los callbacks dentro de la propia clase, el método <em>notify_observers</em> con los siguientes argumentos:</p>
<ul>
<li>El nombre del evento: before_validation, after_save, after_destroy&#8230;</li>
<li>El objeto ActiveRecord.</li>
</ul>
<p>Tal y como hemos visto, al invocar <em>notify_observers</em> en el modelo se invoca <em>update</em> en todos los observers suscritos a dicho modelo. En los observers de rails el método update invocará a su vez, en caso de que exista, al método de la clase que tenga el nombre del evento notificado y le pasará como argumento el objeto que ha cambiado de estado.</p>
<pre class="ruby">    <span class="comment"># Send observed_method(object) if the method exists.</span>
    <span class="keyword">def </span><span class="method">update</span><span class="punct">(</span><span class="ident">observed_method</span><span class="punct">,</span> <span class="ident">object</span><span class="punct">)</span> <span class="comment">#:nodoc:</span>
      <span class="ident">send</span><span class="punct">(</span><span class="ident">observed_method</span><span class="punct">,</span> <span class="ident">object</span><span class="punct">)</span> <span class="keyword">if</span> <span class="ident">respond_to?</span><span class="punct">(</span><span class="ident">observed_method</span><span class="punct">)</span>
    <span class="keyword">end</span></pre>
<h5 id="inicializacin_de_observers_en_rails">Inicialización de observers en Rails</h5>
<p>Ya hemos visto cómo notifica <em>ActiveRecord::Base</em> los eventos a los observers. No obstante, no hemos visto cómo se suscriben los observers (ya sabéis, la llamada al método <em>add_observer</em> del módulo Observable).</p>
<p>En el caso de los observers de rails la llamada a <em>add_observer</em> se realiza en el constructor de <em>ActiveRecord::Observer</em>:</p>
<pre class="ruby">    <span class="comment"># Start observing the declared classes and their subclasses.</span>
    <span class="keyword">def </span><span class="method">initialize</span>
      <span class="constant">Set</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="ident">observed_classes</span> <span class="punct">+</span> <span class="ident">observed_subclasses</span><span class="punct">).</span><span class="ident">each</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">klass</span><span class="punct">|</span> <span class="ident">add_observer!</span> <span class="ident">klass</span> <span class="punct">}</span>
    <span class="keyword">end</span></pre>
<p>Sin embargo, tal y como dice <a href="http://api.rubyonrails.org/classes/ActiveRecord/Observer.html" title="Documentación de la clase Observer">la documentación</a>, para utilizar los observers no instanciamos objetos, sino que los configuramos en el archivo <em>environment.rb</em> (<em>config.active</em>record.observers_). Esto es así para delegar en Rails la responsabilidad sobre cuándo inicializar los observers.</p>
<p>No vamos a entrar en cuándo los inicializa, sin embargo sí que diremos cómo lo hace.</p>
<p>La clase <em>ActiveRecord::Observer</em> sigue un <a href="http://en.wikipedia.org/wiki/Singleton_pattern" title="Singleton pattern">patrón Singleton</a>. Este patrón garantiza que como máximo habrá una instancia de una clase. Para ello se cambia la visibilidad del constructor para que sea privado y se define un método que cree devuelva el único objeto que instancia la clase.</p>
<p>Este patrón también viene en la librería estándar de Ruby con el <a href="http://ruby-doc.org/core/classes/Singleton.html" title="módulo Singleton">módulo Singleton</a>. Este módulo cambia la visibilidad del constructor y define el método <em>instance</em>.</p>
<p>Por lo tanto, Rails emplea el método <em>instance</em> para suscribir los observers a los modelos correspondientes.</p>
<h5 id="sabiendo_esto8230">Sabiendo esto&#8230;</h5>
<p>Sabiendo estos detalles sobre la implementación del patrón Publicador-Suscriptor en ActiveRecord y su inicialización de Rails tenemos los conocimientos técnicos necesarios para desarrollar nuestros propios observers.</p>
<p>Nosotros tuvimos la necesidad de desarrollar nuestros propios observers al querer tener una única clase que se suscribiese varios modelos, pero atendiendo a eventos distintos según el modelo.</p>
<p>En un post próximo, aprovecharemos lo que hemos explicado aquí para ver los detalles de nuestros observers.</p>
<p>Happy Hacking! <img src='http://blog.negonation.com/es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.negonation.com/es/gestion-de-eventos-en-rails-observers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ernesto Jimenez gana el Rails Hackfest de Febrero 2008</title>
		<link>http://blog.negonation.com/es/ernesto-jimenez-gana-el-rails-hackfest-de-febrero-2008/</link>
		<comments>http://blog.negonation.com/es/ernesto-jimenez-gana-el-rails-hackfest-de-febrero-2008/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 12:56:06 +0000</pubDate>
		<dc:creator>David Blanco</dc:creator>
				<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://blog.negonation.com/es/ernesto-jimenez-gana-el-rails-hackfest-de-febrero-2008/</guid>
		<description><![CDATA[Ernesto Jimenez, Software Engineer Leader de Tractis, acaba de ganar el Rails Hackfest de Febrero 2008. Asimismo, Juanjo Bazán, negonator y colaborador habitual, ha conseguido una excelente quinta posición. El Rails Hackfest es un evento mensual que recompensa a desarrolladores que contribuyen a mejorar el código del core de Ruby on Rails, un framework que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lacoctelera.com/ernesto-jimenez">Ernesto Jimenez</a>, Software Engineer Leader de Tractis, acaba de ganar el <a target="_blank" href="http://www.workingwithrails.com/hackfest/22-monthly-february-2-8">Rails Hackfest de Febrero 2008</a>. Asimismo, Juanjo Bazán, <a href="http://blog.negonation.com/es/quiero-colaborar/"><em>negonator </em>y colaborador habitual</a>, ha conseguido una excelente quinta posición.</p>
<p>El <a target="_blank" href="http://www.workingwithrails.com/hackfest">Rails Hackfest</a> es un evento mensual que recompensa a desarrolladores que contribuyen a mejorar el código del core de <a target="_blank" href="http://www.rubyonrails.org/">Ruby on Rails</a>, un framework que utilizamos en el desarrollo de Tractis. El valor de las contribuciones se calcula en función de un <a target="_blank" href="http://www.workingwithrails.com/hackfest/scoring">sistema de puntuación</a> y los primeros en la tabla reciben <a target="_blank" href="http://www.workingwithrails.com/hackfest/22-monthly-february-2-8/prizes">premios</a>. En este caso, Ernesto ha ganado una entrada a la <a target="_blank" href="http://en.oreilly.com/rails2008/public/content/home">RailsConf</a> de este año en Portland, Oregon.</p>
<p><a target="_blank" href="http://www.workingwithrails.com/hackfest/22-monthly-february-2-8"><img id="image291" alt="rails-hackfest-february-2008.gif" src="http://blog.negonation.com/es/wp-content/uploads/2008/03/rails-hackfest-february-2008.gif" /></a></p>
<p>El Rails Hackfest es un concurso a nivel mundial y este reconocimiento es una demostración (más) de que en España y Europa tenemos talento de primer nivel.</p>
<p>Nuestra más sincera enhorabuena a Ernesto y Juanjo. Es un honor trabajar con vosotros.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.negonation.com/es/ernesto-jimenez-gana-el-rails-hackfest-de-febrero-2008/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

