<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
 
  <title>Rubén On Rails</title>
 
 <link href="http://rubenonrails.com/" />
 <updated>2011-08-24T11:00:11-05:00</updated>
 <id>http://rubenonrails.com/</id>
 <author>
   <name>Rubén Dávila Santos</name>
   <email>rdavila84@gmail.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/rubenonrailsblog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="rubenonrailsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Recursos para aprender Ruby y Rails en español</title>
   <link href="http://rubenonrails.com/ruby/rails/2011/08/08/recursos-para-aprender-ruby-y-rails-en-espanol.html" />
   <updated>2011-08-08T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/ruby/rails/2011/08/08/recursos-para-aprender-ruby-y-rails-en-espanol</id>
   <content type="html">&lt;p&gt;Hoy llegó en la &lt;a href="http://groups.google.com/group/rubysur/subscribe" class="external"&gt;lista de usuarios de Ruby de sudamérica&lt;/a&gt; un mensaje anunciando la &lt;a href="http://groups.google.com/group/rubysur/browse_thread/thread/98f3ab285b5c42c9" class="external"&gt;traducción de algunos recursos para aprender Ruby y Rails al español&lt;/a&gt; gracias a Carmen Díaz Echauri. Ojalá que sea de mucha ayuda sobre todo a aquellos que recién se estan poniendo las pilas con el idioma inglés. Mi recomendación es que aprendan el idioma por la buena(en algún centro de idiomas) o por la mala(devorando un libro con el diccionario al lado), de lo contrario sera muy dificil seguir al tanto de todo lo bueno que sale a diario en el mundo del desarrollo.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Una cara nueva para este descuidado blog!</title>
   <link href="http://rubenonrails.com/otros/2011/08/07/rediseno-del-blog.html" />
   <updated>2011-08-07T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/otros/2011/08/07/rediseno-del-blog</id>
   <content type="html">&lt;p&gt;Y luego de un buen tiempo sin escribir nada por aqui debido a que cuento con muy poco tiempo disponible, decidi &lt;a href="http://www.youtube.com/watch?v=SWOz-kIwDuU" class="external"&gt;sacar el &lt;span class="caps"&gt;FUA&lt;/span&gt;&lt;/a&gt; y ponerme manos a la obra con el rediseño de este humilde blog, aunque en el proceso me quedo claro que no soy diseñador ni debo intentarlo hize un pequeño esfuerzo.&lt;/p&gt;
&lt;p&gt;Empezé por leer este &lt;a href="http://www.amazon.com/CSS-Mastery-Advanced-Standards-Solutions/dp/1430223979/ref=sr_1_1?ie=UTF8&amp;amp;qid=1312736069&amp;amp;sr=8-1" class="external"&gt;muy buen libro sobre &lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/a&gt; para reforzar los no muy solidos fundamentos que tenia hasta el momento y de paso también poder pelearme con el diseñador de mi trabajo con fundamento ;).&lt;/p&gt;
&lt;p&gt;En esta ocasión use nuevamente &lt;a href="http://compass-style.org/" class="external"&gt;Compass&lt;/a&gt; pero ahora con &lt;a href="http://www.blueprintcss.org/" class="external"&gt;Blueprint&lt;/a&gt; (en la version anterior use &lt;a href="http://susy.oddbird.net/" class="external"&gt;Sussy&lt;/a&gt;), también aproveche para aprender y pasar el blog a &lt;a href="https://github.com/mojombo/jekyll/wiki" class="external"&gt;Jekyll&lt;/a&gt; y de paso hospedar mi sitio en &lt;a href="https://github.com" class="external"&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;De ahora en adelante hare el esfuerzo de escribir al menos 1 artículo por semana ya que ahora le tengo mucho mas cariño que antes a este blogcito ;).&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Tip: Como aplicar i18n cuando tienes un modelo anidado</title>
   <link href="http://rubenonrails.com/rails/2010/09/09/tip-como-aplicar-i18n-cuando-tienes-un-modelo-anidado.html" />
   <updated>2010-09-09T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/rails/2010/09/09/tip-como-aplicar-i18n-cuando-tienes-un-modelo-anidado</id>
   <content type="html">&lt;p&gt;Supongamos que tenemos un modelo nombrado: MiModulo::MiModelo, si queremos aplicar internacionalización para sus atributos de tal manera que al mostrar los mensajes de error (error_messages_for) estén correctamente traducidos, tenemos que realizar lo siguiente en el archivo &lt;strong&gt;config/locales/es.yml&lt;/strong&gt; para el caso del idioma español:&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;Eso funciona debido a que Rails usa &lt;strong&gt;MiModelo.name.underscore&lt;/strong&gt; internamente para determinar la clave a buscar en el archivo del i18n para determinado modelo.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Usar otro idioma cuando el principal no esta disponible para traducción</title>
   <link href="http://rubenonrails.com/rails/2010/06/18/usar-otro-idioma-cuando-el-principal-no-esta-disponible-para-traduccion.html" />
   <updated>2010-06-18T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/rails/2010/06/18/usar-otro-idioma-cuando-el-principal-no-esta-disponible-para-traduccion</id>
   <content type="html">&lt;p&gt;Cuando estamos realizando una aplicación que estara disponible en multiples idiomas, generalmente existe un idioma principal. Hasta el momento no he tenido oportunidad de realizar una aplicación de este tipo, pero si he estado observando esta caracteristica disponible desde Rails 2.&lt;/p&gt;
&lt;p&gt;En muchas ocasiones me he topado con sitios cuyas páginas no estan traducidas completamente en un solo idioma, sino tienen por ejemplo gran parte de la pagina en español y otra pequeña parte en inglés. Viendo esta situación me preguntaba si esto era posible de hacer en Rails 2 en su momento y por lo que recuerdo no se podia lograr eso al menos no con la libreria que ofrece Rails por defecto para la internacionalización y como estaba empezando a ver algo de codigo fuente de Rails sin miedo, me anime a realizar un plugin que permitiera realizar esto: &lt;a href="http://github.com/rdavila/i18n_fallback"&gt;github.com/rdavila/i18n_fallback&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Actualmente me encuentro explorando Rails 3 beta 4 realizando una pequeña aplicación y me surgio la necesidad de realizar esto, recordé de mi plugin, pero pensé tambien en que ha pasado mucho tiempo y seguramente dicha funcionalidad ya se encuentra disponible en la librería y claro que fue asi: &lt;a href="http://wiki.github.com/svenfuchs/i18n/fallbacks"&gt;wiki.github.com/svenfuchs/i18n/fallbacks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Configurar esto en tu aplicación es realmente sencillo:&lt;/p&gt;
&lt;p&gt;Primero, especificamos el idioma principal de la aplicación:&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;Segundo, configuramos como trabajara el fallback:&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;Con eso estamos indicando de que si no se encuentra disponible una traducción en español use la traducción en inglés.&lt;/p&gt;
&lt;p&gt;Antes de llegar a esta solución estaba probando lo siguiente:&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;Asi es como debe trabajar por defecto, osea tomar el idioma por defecto si no encuentra la traduccion para el idioma actual, pero despues de golpearme la cabeza por buen rato por no encontrar razón para que no funcione, encontre que el metodo I18n#locale usa &lt;strong&gt;Thread#current&lt;/strong&gt; bajo la manga por lo cual eso solo funciona en el contexto del ciclo petición/respuesta osea en el controlador.&lt;/p&gt;
&lt;p&gt;Ahora suponiendo que tenemos lo siguiente:&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;si tenemos configurado nuestro idioma principal como español y probamos en la consola, observaremos lo siguiente:&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;Osea esta vez no obtenemos &amp;#8220;Translation missing&amp;#8221; o un error de aplicación como es lo usual sino obtenemos la traducción en el otro idioma configurado.&lt;/p&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Instalar documentación de ruby desde el codigo fuente</title>
   <link href="http://rubenonrails.com/ruby/2009/08/14/instalar-documentacion-de-ruby-desde-el-codigo-fuente.html" />
   <updated>2009-08-14T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/ruby/2009/08/14/instalar-documentacion-de-ruby-desde-el-codigo-fuente</id>
   <content type="html">&lt;p&gt;Algo que no me funcionaba y que no le preste mucha atención por tenerla disponible en Internet era la documentación de Ruby mediante mi comoda consola a traves del comando &lt;strong&gt;ri&lt;/strong&gt;. Pero esta vez, ya estando un poco ocioso me puse a averiguar el porqué y husmeando entre las opciones de configuracion del instalador encontre la respuesta.&lt;/p&gt;
&lt;p&gt;Siempre que instalo Ruby prefiero hacerlo desde el código fuente, asi que aqui les dejo los pasos:&lt;/p&gt;
&lt;h3&gt;Obtener y descomprimir el codigo fuente:&lt;/h3&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;h3&gt;Buscar alguna opción de configuración relacionada&lt;/h3&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;La salida seria esta:&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;h3&gt;Proceder a la instalacion clasica&lt;/h3&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;h3&gt;Terminada la instalación verificamos su funcionamiento:&lt;/h3&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;Como un adicional, tenemos disponible un &lt;a href="http://www.vim.org/scripts/script.php?script_id=2706"&gt;plugin&lt;/a&gt; para el &lt;a href="http://www.vim.org"&gt;editor&lt;/a&gt;, si aún no lo usas estás a tiempo de &lt;a href="http://diego.chacon.googlepages.com/Manual_VIM.pdf"&gt;pedir perdón&lt;/a&gt; ;)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Modificando archivo existente con Rails</title>
   <link href="http://rubenonrails.com/rails/2009/07/28/modificando-archivo-existente-con-rails.html" />
   <updated>2009-07-28T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/rails/2009/07/28/modificando-archivo-existente-con-rails</id>
   <content type="html">&lt;p&gt;Rails tiene muy buenas utilidades que usa internamente, pero que muchas veces no sabemos como sacarle provecho para nuestros proyectos.&lt;/p&gt;
&lt;p&gt;Esta vez tuve la necesidad de agregar contenido a un archivo, pero el nuevo contenido no iria al final del archivo lo cual es muy facil de hacer con Ruby sino en un lugar que yo necesitaba especificar, para esto recorde que Rails realiza esta tarea al momento que usamos generadores como por ejemplo el &lt;strong&gt;scaffold&lt;/strong&gt; o el &lt;strong&gt;resource&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Asi que decidi echarle un ojo al codigo de estos generadores y observe que define un metodo llamado &lt;strong&gt;gsub_file&lt;/strong&gt; el cual se encuentra accesible y &lt;a href="http://apidock.com/rails/Rails/TemplateRunner/gsub_file"&gt;documentado&lt;/a&gt; para nuestro uso.&lt;/p&gt;
&lt;p&gt;Lo que yo necesitaba era modificar el archivo &lt;strong&gt;test/test_helper.rb&lt;/strong&gt; como parte del trabajo de un &lt;a href="http://m.onkey.org/2008/12/4/rails-templates"&gt;template&lt;/a&gt; que estaba creando, el archivo inicialmente se encuentra asi:&lt;/p&gt;
&lt;/notextile&gt;

Entonces despues de aplicar lo siguiente en mi template:

&lt;notextile&gt;&lt;p&gt;El archivo &lt;strong&gt;test/test_helper.rb&lt;/strong&gt; modificado quedaria asi:&lt;/p&gt;
&lt;p&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;Y asi de sencillo fue modificar un archivo gracias a las utilidades que trae Rails, espero que sea util para alguien.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Creando un pequeño DSL en Ruby</title>
   <link href="http://rubenonrails.com/ruby/2009/04/11/creando-un-pequeno-dsl-en-ruby.html" />
   <updated>2009-04-11T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/ruby/2009/04/11/creando-un-pequeno-dsl-en-ruby</id>
   <content type="html">&lt;p&gt;Estaba aprovechando este fin de semana algo largo debido a la &lt;strong&gt;semana santa&lt;/strong&gt; y recorde que tenia que revisar un &lt;a href="http://github.com/chad/sor-tutorial/tree/master"&gt;tutorial&lt;/a&gt; muy importante que habia dado &lt;a href="http://chadfowler.com/"&gt;Chad Fowler&lt;/a&gt; y &lt;a href="http://marcelmolina.com/"&gt;Marcel Molina Jr&lt;/a&gt; en el evento de &lt;a href="http://scotlandonrails.com/"&gt;Scotland On Rails&lt;/a&gt; sobre algunas cosas basicas y avanzadas que todo desarrollador en Ruby deberia manejar.&lt;/p&gt;
&lt;p&gt;El primer tema que tocaron en el tutorial fueron sobre los &lt;a href="http://is.gd/rVN4"&gt;Blocks y Closures&lt;/a&gt;, este es un punto muy fuerte para mi del lenguaje y junto al famoso &lt;a href="http://apidock.com/ruby/Kernel/method_missing"&gt;method_missing&lt;/a&gt; permite que joyas como Rails salgan a la luz, bien aqui mi primer intento para resolver el ejercicio:&lt;/p&gt;
&lt;p&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;Para esta version inicial decidí manejar las opciones de configuración en un Hash, basicamente lo que hago es crear una manera distinta de acceder a un Hash, de tal manera que pareciera que estamos accediendo a atributos de un objeto y no a los valores de un Hash.&lt;/p&gt;
&lt;p&gt;Lo que uso en la solución es basicamente el poder de method_missing, si recibo un metodo que no existe para el objeto y este no tiene asociado un bloque, entonces sé que tengo que generar un nuevo valor en el Hash, por el contrario si recibo un metodo que no existe pero ademas este tiene asociado un bloque con el, entonces se que tengo que generar un nuevo valor en el Hash, pero este valor tiene que ser una nueva instancia de Configuration y tengo que pasar este objeto al bloque.&lt;/p&gt;
&lt;p&gt;Para un segundo planteamiento del problema me acordé de que Ruby trae una libreria que permite hacer lo que necesito: trabajar con un Hash como si se tratara de atributos de un objeto, esta libreria se llama &lt;a href="http://apidock.com/ruby/OpenStruct"&gt;OpenStruct&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Liquid error: Broken pipe&lt;/p&gt;
&lt;p&gt;Con esto he ahorrado un par de lineas ;), pero lo que era mas importante era que tenia que aprender sobre esa libreria, ahora comprendo porque Ruby es el lenguaje perfecto para crear un &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;&lt;span class="caps"&gt;DSL&lt;/span&gt;&lt;/a&gt;, aqui les dejo también un buen articulo que me ayudo en el tema: &lt;a href="http://www.daniel-azuma.com/blog/view/z3bqa0t01uugg1/implementing_dsl_blocks"&gt;http://www.daniel-azuma.com/blog/view/z3bqa0t01uugg1/implementing_dsl_blocks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mi presentación en el Barcamplima</title>
   <link href="http://rubenonrails.com/otros/2009/03/28/mi-presentacion-en-el-barcamp-lima.html" />
   <updated>2009-03-28T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/otros/2009/03/28/mi-presentacion-en-el-barcamp-lima</id>
   <content type="html">&lt;p&gt;En unos momentos me tocara exponer en el &lt;a href="http://barcamplima.com/"&gt;Barcamplima&lt;/a&gt;, hasta el momento todo va saliendo muy bien, pueden &lt;a href="http://www.slideshare.net/rdavila/tips-para-desarrolladores-web"&gt;ver mi diapositiva&lt;/a&gt; si desean y espero que sigan viniendo mas eventos de este tipo!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Internacionalización en Rails: Gettext o I18n?</title>
   <link href="http://rubenonrails.com/rails/2009/03/28/internacionalizacion-en-rails-gettext-o-i18n.html" />
   <updated>2009-03-28T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/rails/2009/03/28/internacionalizacion-en-rails-gettext-o-i18n</id>
   <content type="html">&lt;p&gt;El dia de ayer, alguien hizo esta &lt;a href="http://www.ruby-forum.com/topic/182733"&gt;consulta&lt;/a&gt; en la &lt;a href="http://lists.simplelogica.net/mailman/listinfo/ror-es"&gt;lista de rails hispana&lt;/a&gt; en la cual participo y me sirvio bastante par tomar la decisión: Gettext.&lt;/p&gt;
&lt;p&gt;Ahora tengo bien en claro que usare Gettext para la traducción de cadenas en mis templates y I18n para para la localización de las fechas y mensajes de error de &lt;strong&gt;ActiveRecord&lt;/strong&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Javascript no intrusivo con Jquery en Rails</title>
   <link href="http://rubenonrails.com/rails/2009/03/13/javascript-no-intrusivo-con-jquery-en-rails.html" />
   <updated>2009-03-13T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/rails/2009/03/13/javascript-no-intrusivo-con-jquery-en-rails</id>
   <content type="html">&lt;p&gt;He estado tratando de mejorar esta semana mi jquery-fu y una de las tareas que me propuse fue hacer que ciertas acciones comunes en mis controladores como el &lt;strong&gt;destroy&lt;/strong&gt; y el &lt;strong&gt;create&lt;/strong&gt; mejoraran la experiencia del usuario aprovechandose de Ajax y a la vez se porten bien con aquellos usuario que tienen Javascript desactivado, pues bien a la marcha, empezaremos con la acción &amp;#8216;destroy&amp;#8217;:&lt;/p&gt;
&lt;h3&gt;Cargando librerias de javascript&lt;/h3&gt;
&lt;p&gt;Lo primero es cargar las librerias javascripts que necesitemos, como estoy usando &lt;a href="http://haml.hamptoncatlin.com/"&gt;&lt;span class="caps"&gt;HAML&lt;/span&gt;&lt;/a&gt;, lo hago de la siguiente manera en mi layout:&lt;/p&gt;
&lt;/notextile&gt;

h3. Creando nueva accion y vista para destroy

He tomado como ejemplo un controlador para el manejo de categorias

&lt;notextile&gt;&lt;p&gt;y la vista quedaria asi:&lt;/p&gt;
&lt;/notextile&gt;

Hasta aqui ya tendremos la accion *destroy* no intrusiva a diferencia de lo que nos genera esto:

&lt;notextile&gt;&lt;p&gt;Lo de arriba genera codigo Javascript intrusivo.&lt;/p&gt;
&lt;h3&gt;Ajaxificando la accion delete&lt;/h3&gt;
&lt;p&gt;Aqui viene la parte buena, pues necesitamos que eliminar una categoria sea una tarea al vuelo y si nos ponemos a pensar bien este puede ser un requerimiento que se repita en muchas partes de nuestra aplicación asi que necesitamos algo que sea reutilizable, pues bien, manos a la obra:&lt;/p&gt;
&lt;p&gt;Suponiendo que tenemos una vista &lt;strong&gt;index&lt;/strong&gt; para las categorias algo asi:&lt;/p&gt;
&lt;/notextile&gt;

Entonces nuestro archivo *public/javascripts/application.js* quedaria algo asi:

&lt;notextile&gt;&lt;p&gt;Como ven en el código de la funcion &lt;strong&gt;delete_link&lt;/strong&gt; me he creado una especie de convención para los enlaces que son para eliminar recursos y la convención es que deben apuntar a la accion &lt;strong&gt;destroy_nojs&lt;/strong&gt; la cual es la versión no intrusiva, de esta manera puedo crearme una función la cual puedo reutilizarla.&lt;/p&gt;
&lt;h3&gt;Ajaxificando el formulario de nueva categoria&lt;/h3&gt;
&lt;p&gt;Esto no podia ser mas sencillo, suponiendo que tenemos en el controlador de categorias lo siguiente:&lt;/p&gt;
&lt;/notextile&gt;

la vista para la acción new quedaria algo asi:

&lt;notextile&gt;&lt;p&gt;y el partial para la categoria quedaria asi:&lt;/p&gt;
&lt;/notextile&gt;

Entonces lo que faltaria seria ajaxificar el formulario y hacer algo despues que se creo la categoria, el archivo *public/javascripts/application.js* ahora quedaria asi:

&lt;notextile&gt;&lt;p&gt;Hasta aqui ya hemos ajaxificado el formulario, ahora falta realizar algo despues que se creo la categoria, lo que haremos es simplementemente agregar un nuevo elemento a la lista con identifciador &lt;strong&gt;#categories&lt;/strong&gt; y agregarle un pequeño efecto, la vista para la acción create quedaria asi:&lt;/p&gt;
&lt;p&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;Y bien eso ha sido todo, no es nada dificil cuando se tiene un conocimiento adecuado de &lt;a href="http://jquery.com/"&gt;Jquery&lt;/a&gt;, el cual he estado obteniendo en estos ultimos dias y lo mas importante es que logras poner cada cosa en su lugar, el &lt;span class="caps"&gt;HTML&lt;/span&gt; donde debe estar, el &lt;span class="caps"&gt;CSS&lt;/span&gt; tambien y el Javascript igual, esto ayuda bastante cuando se termina la aplicación y hay que hacer mejoras o agregar nuevas cosas, espero que este articulo haya sido de utilidad a alguien.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Preguntas para contratar a un desarrollador ideal</title>
   <link href="http://rubenonrails.com/otros/2009/02/22/preguntas-para-contratar-a-un-desarrollador-ideal.html" />
   <updated>2009-02-22T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/otros/2009/02/22/preguntas-para-contratar-a-un-desarrollador-ideal</id>
   <content type="html">&lt;p&gt;&lt;a href="http://blog.kovyrin.net/"&gt;Alexey Kovyrin&lt;/a&gt; uno de los desarrolladores de &lt;a href="http://scribd.com"&gt;Scribd&lt;/a&gt; nos muestra &lt;a href="http://blog.kovyrin.net/2009/02/07/rails-developer-for-a-large-startup-my-vision-of-an-ideal-candidate/"&gt;algunas de las preguntas&lt;/a&gt; que ellos hacen para contratar a un desarrollador para este tipo de aplicaciones, osea aplicaciones que manejan un alto tráfico, esto nos sirve de mucho a los desarrolladores ya que nos permite saber en que estado se encuentran nuestros conocimientos y cuanto camino falta por recorrer para algún dia tomar una de estas posiciones.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Curso de git y github en 1 semana</title>
   <link href="http://rubenonrails.com/otros/2009/02/20/curso-de-git-y-github-en-1-semana.html" />
   <updated>2009-02-20T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/otros/2009/02/20/curso-de-git-y-github-en-1-semana</id>
   <content type="html">&lt;p&gt;Me acabo de enterar algo tarde pero de todas maneras vale, el dia de mañana empezara un &lt;a href="http://rubylearning.com/blog/2009/02/10/git-and-github-a-free-course/"&gt;curso gratuito y muy bueno&lt;/a&gt; donde aprenderas cosas relacionadas a git y github, no dejes pasar esta oportunidad!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Detectando pais del usuario por IP</title>
   <link href="http://rubenonrails.com/rails/2009/02/18/detectando-pais-del-usuario-por-ip.html" />
   <updated>2009-02-18T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/rails/2009/02/18/detectando-pais-del-usuario-por-ip</id>
   <content type="html">&lt;p&gt;Obtener el pais del usuario a traves de su IP es una tarea realmente sencilla gracias a los servicios que proveen terceros para tal fin, pero lo que nos puede tomar tiempo es encontrar un servicio que sea decentemente fiable al momento de la detección del pais.&lt;/p&gt;
&lt;h3&gt;Como trabajan estos servicios?&lt;/h3&gt;
&lt;p&gt;Cada pais tiene un pool de rangos de IPs asignados para el, este pool esta en constante actualización supongo que es debido a que los usuarios de Internet van en aumento.&lt;/p&gt;
&lt;p&gt;El navegador al momento de hacer una petición a un sitio envia ciertas cabeceras que es como un Hash que contiene información al estilo clave-valor, entre una de esas cabeceras se encuentra la ip del usuario quien visita el sitio, entonces al obtener la IP del usuario no queda mas que consultar contra ese pool de direcciones IP que tenemos y ver a que pais pertenece esa IP&lt;/p&gt;
&lt;h3&gt;Servicios que he probado y por tanto puedo recomendar&lt;/h3&gt;
&lt;p&gt;El primer servicio que probe se llama &lt;a href="http://www.find-ip-address.org"&gt;Find IP Address&lt;/a&gt; lo bueno que tiene este servicio es que te &lt;a href="http://www.find-ip-address.org/ip-country"&gt;otorga el rango de IPs&lt;/a&gt; para el pais que tu eligas, pudiendo luego exportarlo a tu base de datos y realizar el trabajo de detección de país. El problema con este servicio es que no es tan fiable como parecia inicialmente, asi es que tuve que seguir &amp;#8220;huaqueando&amp;#8221;.&lt;/p&gt;
&lt;p&gt;El otro servicio que probé y finalmente me convenció fue el de la empresa &lt;a href="http://www.maxmind.com"&gt;Maxmind&lt;/a&gt;, llegue a esta empresa por medio de la página de Mysql, que en algun lugar(en este momento no recuerdo) te da informacióm referente a tu IP y usa el servicio de esta empresa.&lt;/p&gt;
&lt;h3&gt;Ahora si al grano&lt;/h3&gt;
&lt;p&gt;Maxmind tiene un servicio denominado &lt;a href="http://www.maxmind.com/app/country"&gt;GeoIP Country&lt;/a&gt; el cual es de pago, pero tiene otro similar llamado &lt;a href="http://www.maxmind.com/app/geolitecountry"&gt;Geolite&lt;/a&gt; la principal diferencia radica en la precisión 99.8% del servicio de pago contra 99.5% del gratuito, la verdad no se que tanto impacto pueda tener esta diferencia, pero he venido probando el Geolite y hasta ahora todo va de perlas.&lt;/p&gt;
&lt;h3&gt;Integrando el servicio con tu aplicación Rails&lt;/h3&gt;
&lt;p&gt;El servicio tiene disponibles &amp;quot;APIs para varios lenguajes:http://www.maxmind.com/app/api entre el cual esta nuestro favorito, pues bien a proceder con la integración:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 1:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz"&gt;Descargar&lt;/a&gt; la libreria escrita en C para el Geoip.&lt;/p&gt;
&lt;p&gt;Luego procedemos con la instalacióm, lo cual es trivial para aquellos que vienen usando linux un par de meses:&lt;/p&gt;
&lt;/notextile&gt;

*Paso 2:*
"Descargar":http://geolite.maxmind.com/download/geoip/api/ruby/net-geoip-0.06.tar.gz la libreria para Ruby.

Igualmente a lo anterior, en la consola lo descomprimimos y pasamos a la instalación:

&lt;notextile&gt;&lt;p&gt;Si al momento de la instalación te sale algún error, entonces hay que editar el archivo Makefile y reemplazar una cadena que dice &amp;#8220;Wall-g&amp;#8221; por &amp;#8220;Wall -g&amp;#8221;, el error es simplemente por la falta de la separación mediante el espacio en blanco para los parametros.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 3:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Finalmente tenemos que &lt;a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz"&gt;descargarnos la base de datos&lt;/a&gt; con los rangos de IPs en formato binario, igualmente procedemos a descomprimirlo y a copiarlo en algun lugar de nuestra aplicación:&lt;/p&gt;
&lt;/notextile&gt;


En este caso yo lo he copiado dentro del directorio db de mi aplicación, tu puedes copiarlo donde creas conveniente.

*Paso 4:*

Ahora crearemos un initializer donde declararemos una constante la cual servira de referencia para acceder a las funciones de la libreria:

&lt;notextile&gt;&lt;p&gt;&lt;strong&gt;Paso 5:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Finalmente podemos crear un filtro para tener disponible el codigo de pais del usuario en toda nuestra aplicación:&lt;/p&gt;
&lt;p&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;Y bien, eso ha sido todo, como ven no es muy complicado poder saber el pais del visitante de nuestro sitio, espero que haya sido de utilidad este artículo.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Curso excelente y gratuito de Ruby, JRuby y Rails</title>
   <link href="http://rubenonrails.com/ruby/rails/otros/2009/02/18/curso-excelente-y-gratuito-de-ruby-jruby-y-rails.html" />
   <updated>2009-02-18T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/ruby/rails/otros/2009/02/18/curso-excelente-y-gratuito-de-ruby-jruby-y-rails</id>
   <content type="html">&lt;p&gt;En la lista argentina de Ruby enviaron información sobre un excelente sitio donde oferecen varios cursos gratuitos y entre ellos enseñan &lt;a href="http://www.javapassion.com/rubyonrails"&gt;Ruby, JRuby y Rails&lt;/a&gt; creo que esto le será de mucho provecho para aquellos que quieran iniciarse en este marvilloso lenguaje.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Aqui estoy porque no me he ido</title>
   <link href="http://rubenonrails.com/otros/2009/02/16/aqui-estoy-porque-no-me-me-ido.html" />
   <updated>2009-02-16T00:00:00-05:00</updated>
   <id>http://rubenonrails.com/otros/2009/02/16/aqui-estoy-porque-no-me-me-ido</id>
   <content type="html">Asi es amables lectores, me he ausentado demasiado tiempo del blog y motivos he tenido, el principal es el trabajo y el secundario mi vida, creo que me tengo que dar mas tiempo aun para vivir el mundo real, pero bueno eso es tema muy aparte.
Lo importante es que he decidido volver a escribir en mi blog y en esta oportunidad de manera mas activa y con un sistema de blogs muy sencillo y extensible: &lt;a href="http://enkiblog.com/"&gt;Enki&lt;/a&gt;.
Bueno lo mio no es escribir este tipo de posts, me levanto, almuerzo y duermo pensando en Ruby, Rails y demas hierbas asi es que esten atentos que ahora si blogueare mas seguido.</content>
 </entry>
 
 
</feed>

