<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">

	<channel>
		<title>Magazine - ruby</title>
		<link>http://www.genbetadev.com</link>
		<description>
Información sobre el sector de los desarrolladores, el desarrollo de aplicaciones, para móviles, desarrollo web, bases de datos, frameworks y lenguajes de programación		</description>
		<pubDate>2013-06-19 15:10:26</pubDate>

		<generator>http://www.genbetadev.com</generator>
                    <item>
      <title><![CDATA[A los ricos vídeos de la Baruco 2012 para desarrolladores Ruby]]></title>
      <link>http://www.genbetadev.com/actualidad/a-los-ricos-videos-la-baruco-2012-para-desarrolladores-ruby</link>
      <guid>http://www.genbetadev.com/actualidad/a-los-ricos-videos-la-baruco-2012-para-desarrolladores-ruby</guid>
      <pubDate>Tue, 08 Jan 2013 09:32:54 +0000</pubDate>

      <author>Fernando Siles</author>
      <description><![CDATA[
      <p><iframe width="650" height="405" src="http://www.youtube.com/embed/iUe6tacW3JE" frameborder="0" allowfullscreen></iframe></p>

	<p>Una de las mejores maneras para progresar como desarrollador es asistir a conferencias, congresos y eventos varios. No siempre es posible debido a múltiples razones (falta de tiempo, falta de dinero, demasiada lejanía espacial&#8230;) por lo que <strong>es bueno que los congresos y conferencias ofrezcan streaming o, por lo menos, los vídeos de las charlas</strong> a posteriori. Esto es lo que ha hecho la gente de la <strong>Barcelona Ruby Conference</strong> celebrada en la capital catalana este pasado otoño y que ya desde hace unas semanas ofrecen en su web todas las charlas del evento, <strong>tanto para ver desde Youtube como para descarga</strong> para visionar cuando no haya conexión a Internet (sólo de pensar en esto, la falta de conexión a Internet, me entran escalofríos, por cierto).<!--more--></p>

	<p>En total <strong>más de 15 vídeos de ponentes nacionales e internacionales</strong> de prestigio dentro del mundo de Ruby (todos en inglés, como debe de ser) por lo que seguro hay más de uno y más de dos que resultan ciertamente interesantes a los profesionales para saber del estado del arte de Ruby o incluso a aquellos que se estén adentrando ahora mismo en este lenguaje y su bastante amplio ecosistema.</p>

	<p>Una buena manera de <strong>estar al día sobre Ruby</strong> desde la comodidad de tu sofá.</p>

	<p>Vía y vídeo | <a href="http://2012.baruco.org/speakers">baruco.org</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[LaTeX rápido, colaborativo y en la nube con writeLaTeX ]]></title>
      <link>http://www.genbetadev.com/herramientas/latex-rapido-colaborativo-y-en-la-nube-con-writelatex</link>
      <guid>http://www.genbetadev.com/herramientas/latex-rapido-colaborativo-y-en-la-nube-con-writelatex</guid>
      <pubDate>Thu, 16 Aug 2012 05:00:00 +0000</pubDate>

      <author>Fernando Siles</author>
      <description><![CDATA[
      <p><img alt="writeLaTeX" src="http://img.genbetadev.com/2012/08/650_1000_Captura de pantalla 2012-08-16 a las 00.19.05.png" class="centro" /></p>

	<p>Si alguna vez has tenido que escribir un paper, seguramente te habrás tenido que pelear con <strong>LaTeX</strong>, ese sistema de composición de textos a base de macros creado por Leslie Lamport en 1984 y casi se ha convertido en un estándar para <strong>documentos académicos o técnicos que contengan fórmulas matemáticas</strong>. No nos engañemos, LaTeX es un engorro&#8230; pero un engorro que a veces es inevitable, por eso hoy te traemos en <a href="http://www.genbetadev.com">Genbeta Dev</a> <strong>writeLaTeX</strong>, una aplicación web que te puede facilitar bastante la vida.<!--more--></p>

	<p>writeLaTeX es ni más ni menos que un <strong>editor web colaborativo y en la nube de LaTeX</strong>. Vamos, basicamente un Google Docs para LaTeX y, ojo, tiene bastante buena pinta: puedes <strong>compartir tus documentos y ver los cambios</strong> que en ellos se producen en tiempo real, puedes exportarlos a pdf o zip, subir imágenes y demás contenido de manera sencilla, preview automática&#8230; vamos, no te escribe las macros ni las fórmulas pero para todo lo demás que el escribir un paper o un informe tiene a su alrededor, te puede resultar bastante útil.   </p>

	<p>Pd: writeLaTeX está realizado en <strong>RoR con mucho jQuery</strong> sobre el editor <a href="http://codemirror.net/">CodeMirror</a> y utilizando <a href="http://www.tug.org/texlive/">Tex Live</a> para ejecutar el código LaTeX, <em>for your information</em>.</p>

	<p>Vía e imagen | <a href="http://writelatex.com/">writeLaTeX</a><br />
En Genbeta Dev | <a href="http://www.genbetadev.com/herramientas/como-disenar-un-informe-estetico-y-elegante">Como diseñar un informe estético y elegante</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Aprende Ruby en 15 minutos con TryRuby ]]></title>
      <link>http://www.genbetadev.com/ruby/aprende-ruby-en-15-minutos-con-tryruby</link>
      <guid>http://www.genbetadev.com/ruby/aprende-ruby-en-15-minutos-con-tryruby</guid>
      <pubDate>Sun, 22 Apr 2012 15:15:00 +0000</pubDate>

      <author>Johnbo</author>
      <description><![CDATA[
      <p><img alt="Aprende Ruby en 15 minutos" src="http://img.genbetadev.com/2012/04/Try Ruby-1.png" class="centro" /><br />
<strong>Ruby</strong>, el lenguaje de origen japonés que desde hace tiempo <a href="http://www.genbetadev.com/cc/y-c-culmina-la-remontada-y-supera-a-java-como-lenguaje-mas-utilizado">se mantiene como el undécimo lenguaje más popular</a>, es sin embargo uno de los menos enseñados en las facultades. Si vosotros también sois de los que nunca lo habéis probado y queréis saber a qué se debe su fama, este sencillo <a href="http://tryruby.org/levels/1/challenges/0">tutorial interactivo de 15 minutos</a> os puede ayudar a entrar en el mundo de Ruby.</p>

	<p>Dividido en <strong>8 niveles</strong>, con varios retos en cada uno de ellos, nos lleva desde los pasos más sencillos, como darle la vuelta a nuestro nombre con un <code>&quot;Johnbo&quot;.reverse</code>, hasta la creación de 3 clases simples para generar automáticamente un blog. ¡Y todo eso en apenas 15 minutos! </p>

	<p>Una forma amena de llenar el tiempo libre de la tarde del domingo, aprendiendo un nuevo lenguaje y entendiendo por qué Yukihiro Matsumoto, creador del lenguaje, dijo que el objetivo era:</p>

<blockquote>Tratar de hacer que Ruby sea natural, no simple.</blockquote>

	<p>Y así es, si hacéis el tutorial veréis que para alguien con conocimientos básicos de inglés, la sintaxis de este lenguaje interpretado es muy intuitiva y bastante cercana al lenguaje natural, pero no por ello poco potente.</p>

	<p>Tutorial | <a href="http://tryruby.org/levels/1/challenges/0">TryRuby</a><br />
Página oficial | <a href="http://www.ruby-lang.org/es">ruby-lang.org</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Se busca financiación para crear un rails.app para OS X ]]></title>
      <link>http://www.genbetadev.com/actualidad/se-busca-financiacion-para-crear-un-rails-app-para-os-x</link>
      <guid>http://www.genbetadev.com/actualidad/se-busca-financiacion-para-crear-un-rails-app-para-os-x</guid>
      <pubDate>Fri, 30 Mar 2012 05:51:06 +0000</pubDate>

      <author>Fernando Siles</author>
      <description><![CDATA[
      <p><img alt="rails" src="http://img.genbetadev.com/2012/03/rails.jpg" class="centro_sinmarco" /></p>

	<p>Tengo que reconocer que soy bastante ignorante en todo lo relacionado tanto con <strong>Ruby</strong> como con el popular framework <strong>Ruby on Rails</strong> (RoR para los amigos y los fans de los acrónimos). Por lo tanto no tenía ni idea que instalar y utilizar Rails en ordenadores Mac fuera una tarea poco menos que homérica. Pero parece que es así ya que uno de los miembros del equipo del core de Rails ha iniciado <strong>una petición en Kickstarter</strong> para recaudar dinero para poder <strong>desarrollar una app de fácil instalación en máquinas con OS X</strong>&#8230; si, de esas que arrastras a la carpeta /applications y <em>et voilà</em>, todo listo.<!--more--></p>

	<p>El desarrollador en cuestión se llama <strong>Yehuda Katz</strong> y la suma de dinero que pide para poder meterse en faena es de <strong>25000 dólares</strong>. El plazo para conseguir el parné es hasta el <strong>12 de Mayo</strong> pero lo cierto es que le va a sobrar tiempo (y seguramente recaude mucho más) ya que a día de hoy ya van más de <strong>20000 dólares recaudados</strong>. Por lo tanto parece que dentro de poco la vida para los <em>railseros maqueros</em> va a ser un poco más sencilla.</p>

	<p>Como siempre en <strong>Kickstarter</strong> las donaciones tienen su correspondiente contraprestación, que en este caso van desde una carta de agradecimiento y una pegatina para las aportaciones más pequeñas hasta un logo bien grande de sponsor para aquellos que aporten <em>10 de los grandes</em> (siempre he querido utilizar esta expresión) o más.</p>

	<p>Amigos, el <strong>crowdfunding es el futúro</strong>, hacedme caso, almas cándidas&#8230;</p>

	<p>Vía | <a href="http://www.kickstarter.com/projects/1397300529/railsapp">Kickstarter</a><br />
En Genbeta Dev | <a href="http://www.genbetadev.com/desarrolladores/si-el-crowfunding-le-sirve-a-tim-schafer-lo-mismo-te-puede-servir-a-ti">Si el crowdfunding le sirve a Tim Schafer, lo mismo te puede servir a tí</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Tiemblan Garcilaso y Lorca, ahora con Ruby tú puedes ser poeta ]]></title>
      <link>http://www.genbetadev.com/ruby/tiemblan-garcilaso-y-lorca-ahora-con-ruby-tu-puedes-ser-poeta</link>
      <guid>http://www.genbetadev.com/ruby/tiemblan-garcilaso-y-lorca-ahora-con-ruby-tu-puedes-ser-poeta</guid>
      <pubDate>Sun, 11 Mar 2012 10:30:00 +0000</pubDate>

      <author>Fernando Siles</author>
      <description><![CDATA[
      <div class="caption-img"> <img alt="asurancetorix" src="http://img.genbetadev.com/2012/03/Asuranceturix.jpg" /> <span>Los hermanos pinzones eran unos&#8230; desarrolladores</span> </div>

	<p>Ya sabéis que los domingos nos gusta dejar un poco de lado la seriedad y el encortesamiento y compartir contigo, estimado lector, <strong>alguna curiosidad</strong> que nos encontramos en nuestro navegar por el proceloso y bravío mar de Internet (y que tenga relación con el mundo del desarrollo, claro, que lo de <a href="http://www.vayatele.com/ficcion-internacional/impresionante-homenaje-a-la-cabecera-de-juego-de-tronos-en-los-simpson">la intro de &#8216;Los Simpson&#8217; homenajeando la de &#8216;Juego de Tronos&#8217;</a> aquí pinta poco&#8230; oh, wait). La que te traemos hoy es toda una frikada: <strong>un snippet en Ruby que te compone poesías con los titulares de la prensa</strong>.<!--more--></p>

	<p>A un tal <strong>Andrew McDonough</strong>, desarrollador de Ruby, le suelen invitar a fiestas donde la gente lee poemas (apuesto a que el 90% de los asistentes a estas fiestas lleva gafas de pasta, rebecas de punto y tienen gato) y al buen hombre la lírica no le tira demasiado así que, para integrarse, decidió crear un pequeño programa en su lenguaje favorito llamado <strong>Ruby Poetry</strong> que creara las poesías por él a partir de los titulares de la prensa del día.</p>

	<p>La verdad es que el resultado no es tan nefasto como pudiera parecer y las rimas resultantes son hasta mejores que las de muchos raperos de medio pelo. Y lo mejor que el bueno de McDonough ha <strong>liberado el código</strong> por lo que servidor está pensando en desempolvar el libro de literatura de 3º de <span class="caps">BUP</span> para adaptar las métricas al español y enchufarle el rss de La Razón. Voy a ser el alma de todas las fiestas gafapastosas de Malasaña&#8230; o el nuevo Leonardo Dantés, vete tu a saber.</p>

	<p>Desde luego una simpática curiosidad y un <strong>claro ejemplo de la capacidad de solucionar problemas imaginativamente</strong> que tenemos (o deberíamos tener) los desarrolladores. <em>¡Semos unos cracks!</em> </p>

	<p>Vía | <a href="http://blog.andrewmcdonough.com/blog/2012/02/23/ruby-poetry/">Andrew McDonough</a><br />
Código | <a href="https://github.com/spier/ruby-poetry">Github</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Exhaustiva comparativa entre los principales lenguajes interpretados ]]></title>
      <link>http://www.genbetadev.com/desarrolladores/exhaustiva-comparativa-entre-los-principales-lenguajes-de-interpretados</link>
      <guid>http://www.genbetadev.com/desarrolladores/exhaustiva-comparativa-entre-los-principales-lenguajes-de-interpretados</guid>
      <pubDate>Wed, 22 Feb 2012 17:10:37 +0000</pubDate>

      <author>Fernando Siles</author>
      <description><![CDATA[
      <p><img alt="hyperplyglot" src="http://img.genbetadev.com/2012/02/650_1000_hyperpolyglot.jpg" class="centro_sinmarco" /></p>

	<p>A veces hay que quitarse el sombrero y aplaudir cuando se descubre algo bien hecho y con cierta utilidad, como es el caso de la <strong>comparativa</strong> (y a su vez guía de referencia) entre lenguajes interpretados que se han marcado en <a href="http://hyperpolyglot.org/">Hyperpolyglot</a>. <strong><span class="caps">PHP</span>, Python, Perl y Ruby</strong> al detalle y comparados de una manera muy visual y efectiva.</p>

	<p>Características generales, aritmética y lógica, strings, expresiones regulares, fechas, arrays, funciones, control de ejecución, sistema de ficheros, entornos, librerías, módulos, objetos, testing, debugging y más <strong>características diseccionadas y comparadas</strong> entre los cuatro lenguajes. Además de una multitud de notas al pie para resolver cualquier duda que te pueda surgir.</p>

	<p>Una chulada que te puede servir como <strong>guía de referencia si tienes que pasar de un lenguaje a otro</strong> de manera rápida o si quieres comparar los lenguajes en algún aspecto. En definitiva, muy útil.</p>

	<p>Pd: y tienen otras muchas comparativas, la de los <a href="http://hyperpolyglot.org/cpp">lenguajes inspirados en C++</a> también es muy buena.</p>

	<p>Vía | <a href="http://mmoroca.es/post/18065807680/php-python-perl-y-ruby-cara-a-cara">mmoroca.es</a><br />
Más info | <a href="http://hyperpolyglot.org/scripting">Hyperpolyglot</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Extendiendo la funcionalidad de las librerías básicas de Ruby con Facets]]></title>
      <link>http://www.genbetadev.com/ruby/extendiendo-la-funcionalidad-de-las-librerias-basicas-de-ruby-con-facets</link>
      <guid>http://www.genbetadev.com/ruby/extendiendo-la-funcionalidad-de-las-librerias-basicas-de-ruby-con-facets</guid>
      <pubDate>Wed, 13 Jul 2011 14:00:59 +0000</pubDate>

      <author>Carlos Paramio</author>
      <description><![CDATA[
      <p><img id="image77090" src="http://img.genbetadev.com/2011/07/rubyfacets.jpg" class="centro_sinmarco" alt="Ruby Facets" /></p>

<p>Si bien las librerías que forman parte del <strong>core de Ruby</strong> son bastante completas, a menudo se echan en falta métodos para <strong>realizar operaciones con los objetos</strong> que no han sido tenidas en cuenta, y para las que deberemos bien recurrir a una gem externa, bien pasar a implementarlo nosotros mismos.</p>

<p>Una de las gems más conocidas en lo que a <strong>extensión de funcionalidad en las clases principales de Ruby</strong> se refiere es <strong>ActiveSupport</strong>, que nació como un componente más del framework <strong>Ruby on Rails</strong>, pero que hoy en día es utilizada ampliamente en multitud de gems y proyectos independientes de éste.</p>

<p>Sin embargo, también existe una colección mucho más amplia de extensiones a la librería de Ruby, y que es más desconocida. Su nombre es <strong>Ruby Facets</strong>, y aunque se trata de una gem bastante grande, no debe preocuparnos incorporarla a nuestro proyecto, pues está perfectamente modularizada, y podemos incluir únicamente las extensiones deseadas a nuestro software en Ruby, sin engordar inútilmente el espacio en memoria que ocupará nuestro proceso. De hecho, <strong>se pueden cargar las extensiones incluso método a método</strong>, o todas las extensiones disponibles para una clase determinada, con lo que podemos hilar tan fino como deseemos.</p>

<p>Para haceros una idea, en Facets nos encontraremos con métodos para realizar operaciones adicionales con un objeto de la clase Array, tales como hacer <em>merges</em> destructivos, calcular la entropía del mismo, calcular todas las permutaciones posibles de sus elementos, dividirlo en grupos de elementos según una expresión regular, y muchas más.</p>

<p>Dedicad unos minutos a navegar por su extensa documentación. Os garantizo que os encontraréis con muy gratas sorpresas.</p>

<p>
  Documentación | <a href="http://rubyworks.github.com/facets/doc/api/core/index.html">Facets Core</a>, <a href="http://rubyworks.github.com/facets/doc/api/more/index.html">Facets More</a><br />

  Más información | <a href="http://rubyworks.github.com/facets/">Ruby Facets</a><br />
</p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Conferencia Rails en Madrid, mucho nivel a priori]]></title>
      <link>http://www.genbetadev.com/desarrolladores/conferencia-rails-en-madrid-mucho-nivel-a-priori</link>
      <guid>http://www.genbetadev.com/desarrolladores/conferencia-rails-en-madrid-mucho-nivel-a-priori</guid>
      <pubDate>Thu, 07 Jul 2011 14:24:51 +0000</pubDate>

      <author>Fernando Siles</author>
      <description><![CDATA[
      <p><img id="image77046" src="http://img.genbetadev.com/2011/07/conferencia_rails.PNG" class="centro_sinmarco" alt="Conferencia Rails" /></p>

	<p>El verano en Madrid es para la piscina, las terrazas y, si eres desarrollador rails, para la <strong>Conferencia Rails</strong>. Del <strong>13 al 15 de Julio</strong> (es decir, la semana que viene) se celebrará en el <strong>Florida Park</strong> del Parque del Retiro (un sitio muy flamenco) la susodicha Conferencia Rails, una cita ineludible para los desarrolladores rails y en el que habrá gran número de charlas y talleres a cargo de <strong>ponentes nacionales e internacionales</strong>, auténticas estrellas del medio, desde la gente de The Cocktail o Aentos hasta figuras como Sven Fuchs o Julian Fischer.</p>

	<p>Programación funcional con ruby,<strong> Node.js</strong>, aplicaciones móviles, migraciones a ruby, Ruby in Rails,<strong> MongoDB</strong> o <a href="http://jashkenas.github.com/coffee-script/">Coffeescript</a> son solamente algunos de los temas que se tocarán durante estos tres días y lo mejor de todo es que <a href="https://autofiscal.com/aprodeweb/campaigns/conf2011/sales/new">todavía puedes registrarte</a> y asistir&#8230; aunque si de verdad te interesara, deberías estar inscrito desde hace semanas, claro.</p>

	<p>Un evento desde luego muy interesante y que <strong>viene a potenciar la escasa oferta para desarrolladores</strong> que propone la capital española cuando el solano empieza a pegar con justicia en los meses estivales.</p>

	<p>Fuente |<a href="http://conferenciarails.org/"> Conferencia Rails</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Ruby Version Manager, o cómo tener múltiples intérpretes de Ruby en tu máquina al mismo tiempo]]></title>
      <link>http://www.genbetadev.com/herramientas/ruby-version-manager-o-como-tener-multiples-interpretes-de-ruby-en-tu-maquina-al-mismo-tiempo</link>
      <guid>http://www.genbetadev.com/herramientas/ruby-version-manager-o-como-tener-multiples-interpretes-de-ruby-en-tu-maquina-al-mismo-tiempo</guid>
      <pubDate>Thu, 16 Jun 2011 15:11:22 +0000</pubDate>

      <author>Carlos Paramio</author>
      <description><![CDATA[
      <p><img id="image76828" src="http://img.genbetadev.com/2011/06/rvm.png" class="centro_sinmarco" alt="RVM" /><p></p></p>

<p><strong>Ruby</strong> es un lenguaje que ha madurado muchísimo en los últimos años. Al principio sólo existía un intérprete, el de <strong>Matz</strong>, y su rendimiento no era lo que se dice espectacular (el propio Matz ha admitido en varias ocasiones que él no es un experto en la construcción de este tipo de software, y que buena parte del código debería ser revisado y optimizado).</p>

<p>Hoy en día hay un buen <strong>puñado de intérpretes diferentes</strong> para este maravilloso lenguaje: Ruby 1.8, Ruby 1.9, JRuby, Rubinius, MacRuby, Maglev, Ruby Enterprise Edition, IronRuby&#8230; Algunos de ellos llevan usándose en <strong>entornos de producción</strong> desde hace algún tiempo.</p>

	<p><!--more--></p>

<h2>¿Por qué es útil RVM?</h2>

<p>Siempre es más que recomendable que utilices el <strong>mismo intérprete que estés usando en producción</strong>, para evitar sorpresas. El problema viene cuando trabajas en varios proyectos escritos en Ruby al mismo tiempo, y <strong>cada uno de ellos utiliza un intérprete diferente</strong>. O también, utilizan versiones de gems diferentes, y parece que la única solución sea andar desinstalando e instalando versiones de dichas gems cada vez que cambias de uno a otro, lo cual es evidentemente poco práctico y nada razonable.</p>

<p>Imagina la situación: Empiezas la jornada trabajando en el Proyecto 1, el cual lleva en desarrollo bastante tiempo y aún se basa en la versión 2.3 de Rails. Dado que esta versión aún tenía <strong>problemas de compatibilidad con la serie 1.9</strong> de Ruby (esta versión del intérprete aún no era muy popular por aquel entonces, pues se encontraba en un estado poco maduro), el proyecto utiliza Ruby Enterprise Edition, una variante del intérprete 1.8 con varias mejoras de rendimiento (en especial, en el plano de la gestión de memoria). De modo que en tu máquina local instalas <strong>Ruby Enterprise Edition</strong>, <strong>Rails 2.3</strong> y todas las gems de las que depende el proyecto.</p>

<p>Más tarde, te pones a trabajar en el Proyecto 2, que acaba de comenzar, y con el que os habéis decidido a usar <strong>Rails 3.1</strong> (que para cuando finalice el proyecto ya estará maduro) y <strong>Ruby 1.9.2</strong>. Necesitas poder instalar este segundo intérprete sin que pise los ejecutables del primero, y cambiar tu <span class="caps">PATH</span> si es necesario para que localice los nuevos binarios. Cada vez que cambies del primer proyecto al segundo, has de actualizar tu <span class="caps">PATH</span> para asegurarte que estás usando los binarios correctos. Si has de actualizar a una versión menor del intérprete, tendrás que repetir estas operaciones, y reinstalar todas las gems.</p>

<p>Por último, llama un cliente al que le desarrollásteis una aplicación en <strong>Rails 2.2</strong> con <strong>Ruby Enterprise Edition</strong>, y que necesita un pequeño cambio urgente. Como vuestro <span class="caps">REE</span> lo tenéis configurado para el Proyecto 1, tenéis instaladas las gemas de Rails 2.3, así como las versiones de otras gemas que funcionan bien para esa aplicación. Cuando os ponéis a instalar las dependencias de esta vieja aplicación, e intentáis arrancarla, <strong>empiezan a llover errores de dependencias</strong> entre versiones (se intenta cargar una versión específica de una gem, pero alguna otra librería la ha cargado ya en otra versión, de modo que cuando intenta leer la más vieja devuelve un error). Dado que Rails 2.x aún no utilizaba bundler para la gestión de dependencias, tenéis que arremangaros y empezar a <strong>desinstalar las versiones de gems conflictivas</strong>, a sabiendas que cuando volváis a volcar vuestra atención en el Proyecto 1 tendréis que deshacer estos pasos.</p>

<p>¿Te suenan algunas de estas situaciones? Si te dedicas a programar aplicaciones en Ruby desde hace tiempo, seguro que sí. Y por eso Ruby Version Manager viene a nuestro rescate. Gracias a esta herramienta, podemos tener tantos intérpretes de Ruby como queramos, <strong>incluso diferentes versiones menores de un mismo intérprete</strong>, y cambiar de uno a otro tan sólo ejecutando un comando. Además, podemos definir un gemset (un conjunto de gemas) para cada proyecto, de modo que cuando nos cambiemos a un gemset en particular, éste contenga exclusivamente las <strong>gemas que hacen falta para correr la aplicación</strong>, en sus versiones apropiadas, sin que afecten a las otras aplicaciones que podamos tener.</p>

<h2>Vale, me has convencido. ¿Cómo lo instalo?</h2>

<p>En primer lugar, has de tener un sistema que ejecute alguna variante de <strong>Unix</strong>. <span class="caps">RVM</span> <strong>no funciona en máquinas Windows</strong>, aunque sí que se comporta perfectamente bajo Linux o Mac OS X. La instalación es sencillísima, tan sólo has de tener instalada la herramienta curl (en Mac OS X viene instalada por defecto), así como Git, y ejecutar el siguiente comando:</p>

<pre class="prettyprint lang-bash">
  $ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
</pre>

<p>Una vez instalado y actualizado tu <span class="caps">PATH</span> para incluir la ruta a los binarios de <span class="caps">RVM</span>, tal y como te recomienda el proceso final de instalación, sólo has de instalarte los intérpretes de Ruby que consideres oportunos. En Mac OS X, necesitarás tener instalado el paquete de <strong>Xcode SDK</strong>, que es donde viene el compilador de C. En Linux, deberás instalar estas dependencias usando el administrador de paquetes de tu distribución. Si utilizas Debian o derivados (como Ubuntu), bastará normalmente con que instales el <strong>metapaquete build-essentials</strong>. Si algún intérprete requiere que se cumplan dependencias adicionales, se te informará sobre ello.</p>

<p>Por ejemplo, podemos instalar el intérprete <span class="caps">REE</span> y el 1.9.2, requisitos de los ejemplos que mencioné antes:</p>

	<p></pre><pre class="prettyprint lang-bash">
  $ rvm install ree
  $ rvm install 1.9.2<br />
</pre></p>

<p>Para cambiar de uno a otro una vez instalados, tan sólo hay que hacer:</p>

<pre class="prettyprint lang-bash">
  $ rvm ree
</pre>

<h2>Cómo crear un gemset</h2>

<p>Como mencionaba anteriormente, podemos crear <strong>conjuntos de gemas separadas para cada proyecto</strong>. Tan sólo hay que especificar un nombre para ese gemset, y utilizar las herramientas que rvm proporciona (puedes escribir &#8220;rvm gemset&#8221; para ver todos los comandos disponibles). Por ejemplo, podemos crearnos un gemset para el proyecto 1, y cambiarnos a él:</p>

<pre class="prettyprint lang-bash">
  $ rvm gemset create proyecto1
  $ rvm gemset use proyecto1
</pre>

<p>Es importante entender que el gemset <strong>se crea para el intérprete que estemos usando en ese momento</strong>. De modo que antes de crear un gemset, selecciona el intérprete adecuado.</p>

<h2>Cómo automatizar el cambio de intérprete y gemset</h2>

<p>No quisiera finalizar el artículo sin mencionaros una vía rápida para que, al cambiar a la carpeta de un proyecto, <span class="caps">RVM</span> os seleccione el intérprete y gemset adecuados de forma automática. Para ello, sólo tenéis que crear un fichero de nombre &#8220;.rvmrc&#8221; en la carpeta en cuestión, y éste contendrá la serie de comandos necesarios para realizar estas operaciones. Cuando entréis en dicha carpeta desde línea de comandos, <span class="caps">RVM</span> ejecutará dichas acciones, y todo estará listo para empezar a trabajar. Por ejemplo, podéis tener algo como esto (que no es más que un atajo a la selección del intérprete y del gemset, creando este último en el camino en caso de que no exista, todo en un único comando):</p>

<pre class="prettyprint lang-bash">
  rvm &#8212;create 1.9.2@proyecto2
</pre>

<h2>Conclusiones</h2>

<p>Espero haber esclarecido las ventajas principales de usar una herramienta como <span class="caps">RVM</span> en tu entorno de trabajo. Por supuesto, <span class="caps">RVM</span> posee muchas más funcionalidades, que te invito a que conozcas visitando la web oficial.</p>

<p>¿Usas ya RVM? ¿Qué otros trucos similares conoces para llevar un control de los requisitos de tus proyectos?</p>

<p>Más información | <a href="http://beginrescueend.com/">Ruby Version Manager</a></p>      ]]></description>
      </item>
                    <item>
      <title><![CDATA[Novedades en la próxima versión de Ruby on Rails: 3.1 (II)]]></title>
      <link>http://www.genbetadev.com/ruby/novedades-en-la-proxima-version-de-ruby-on-rails-31-ii</link>
      <guid>http://www.genbetadev.com/ruby/novedades-en-la-proxima-version-de-ruby-on-rails-31-ii</guid>
      <pubDate>Mon, 06 Jun 2011 16:17:46 +0000</pubDate>

      <author>Carlos Paramio</author>
      <description><![CDATA[
      <p><img id="image76551" src="http://img.genbetadev.com/2011/05/rails31.jpg" class="centro_sinmarco" alt="Rails 3.1" /></p>

<p>Ahora que <strong>Rails 3.1</strong> ha alcanzado ya la <strong>Release Candidate</strong>, y que la publicación de la versión final es inminente, qué mejor momento para retomar aquella lista de nuevas características que nos trae esta nueva edición del famoso framework para desarrollar aplicaciones web en Ruby.</p>

<p>No te pierdas tampoco <a href="http://www.genbetadev.com/ruby/novedades-en-la-proxima-version-de-ruby-on-rails-31-i">la primera parte de este especial</a>.</p>

	<p><!--more--></p>

<h2>Migraciones reversibles más sencillas</h2>

<p>Siguiendo la metodología <strong>DRY</strong> (&#8220;Don&#8217;t Repeat Yourself&#8221;), la definición de ciertas migraciones para cambiar el esquema de nuestra base de datos pasa a ser más sencilla, de modo que <strong>no sea necesario repetir instrucciones</strong> en los dos bloques de la migración (el de ejecución de la misma y el de deshacer los cambios) cuando éstas puedan ser fácilmente deducidas.</p>

<p>Esto significa que podremos especificar los cambios deseados en una tabla en un nuevo método <code>change</code>, y Rails se encargará de crear los métodos <code>up</code> y <code>down</code> por nosotros. Por cierto, estos últimos pasan a ser métodos de instancia, en lugar de métodos de clase. Si Rails encuentra ciertos comandos en el método <code>change</code> que no puede deshacer (por ejemplo, si se ejecuta un <code>remove_column</code> que elimina una columna de la tabla, y añadirla al deshacer no sería suficiente dado que se habría perdido la información que ésta contenía al ejecutar la migración), entonces se lanza una excepción <strong>ActiveRecord::IrreversibleMigration</strong>.</p>

<p>Por ejemplo, donde antes escribíamos algo como:</p>

	<p><pre class="prettyprint lang-ruby">
  class CreateTasks < ActiveRecord::Migration
    def self.up
      create_table :tasks do |t|
        t.string :title
        t.boolean :completed
        t.text :description
        t.timestamps
      end
    end</p>

    def self.down
      drop_table :tasks
    end
</pre>

<p>Ahora escribiríamos simplemente:</p>

	<p></pre><pre class="prettyprint lang-ruby">
  class CreateTasks < ActiveRecord::Migration
    def change
      create_table :tasks do |t|
        t.string :title
        t.boolean :completed
        t.text :description
        t.timestamps
      end
    end<br />
</pre></p>

<h2>Identity Map en ActiveRecord</h2>

<p>Una de las características que más me gusta de <strong>DataMapper</strong> (un <span class="caps">ORM</span> bastante chulo y, hasta la introducción de Arel en Rails, con mejor sintaxis que ActiveRecord a mi parecer) es precisamente <strong>Identity Map</strong>. Esta característica sencillamente mantiene un hash con todas las instancias que se han hecho de una determinada clase que hereda de ActiveRecord, de modo que <strong>sólo exista en memoria una representación en forma de objeto</strong> en Ruby de un registro de la tabla en particular.</p>

<p>¿Por qué esto es importante? Porque hasta ahora, si instancias un objeto ActiveRecord, y llamas por ejemplo a un método que nuevamente instancia otro objeto el cual representa al mismo registro de la base de datos, y este último realiza un cambio en alguno de sus atributos, dicho cambio <strong>no se ve reflejado en el primero</strong>, porque ocupan espacios en memoria diferentes (a todos los efectos, son dos instancias distintas que representan a un mismo registro).</p>

<p>Para verlo más claro con código. En ActiveRecord sin Identity Map, se cumple que:</p>

	<p></pre><pre class="prettyprint lang-ruby">
  post1_instance_1 = Post.find(1) # => #&lt;Post id: 1, title: &#8220;Rails 3.1&#8221;&gt;
  post1_instance_2 = Post.find(1) # => #&lt;Post id: 1, title: &#8220;Rails 3.1&#8221;&gt;</p>

  # Parece que son la misma instancia, porque ActiveRecord redefine el método de comparación
  # y lo que hace es comprobar que los valores de los atributos sean iguales.
  post1_instance_1 == post1_instance_2 # => true

  # Pero verdaderamente, son instancias diferentes
  post1_instance_1.object_id == post1_instance_2.object_id # => false
</pre>

<p>Esto tiene una segunda consecuencia, y es que aunque dos consultas devuelvan instancias de registros repetidos para los que ya teníamos objetos en memoria, <strong>éstos se volvían a instanciar</strong> ocupando su propio espacio, devorando de forma aún mayor los recursos de memoria de la máquina, y obligando a la aplicación a consultar siempre los valores de la base de datos cuando se quiere instanciar un objeto.</p>

<p>Gracias a Identity Map, ActiveRecord <strong>consume menos memoria</strong>, es <strong>más rápido</strong>, y cada registro tiene una <strong>representación única</strong> en forma de objeto Ruby, de modo que cualquier cambio en el mismo sea consistente. No obstante, esta característica no estará habilitada por defecto debido a algunos <a href="https://github.com/rails/rails/blob/master/activerecord/lib/active_record/identity_map.rb">problemas aún existentes con la instanciación de objetos a través de asociaciones</a>.</p>

<h2>Engines que pueden ser montados en una ruta determinada</h2>

<p>Rails::Engine ha sido mejorado aún más, y ahora es posible <strong>montar una aplicación</strong> organizada en forma de engine en una ruta de una aplicación Rails. Estoy seguro de que esto mejorará aún más las posibilidades de reutilización de código y funcionalidades entre aplicaciones.</p>

<p>Por ejemplo, ahora podemos tener un engine que proporciona la funcionalidad de un blog, y montarlo en nuestra aplicación bajo la ruta &#8220;/blog&#8221; añadiendo en nuestro fichero routes.rb:</p>

<pre class="prettyprint lang-ruby">
  Rails.application.routes.draw do
    mount Blog::Engine => &#8220;/blog&#8221;
  end
</pre>

<h2>Mejoras en la utilización de las cabeceras <span class="caps">HTTP</span> para caché</h2>

<p>A partir de esta release, <strong>Rack::Cache</strong> será parte del core del framework, y se espera que sustituya a la caché de páginas en un futuro (la cual podría quedar relegada a un plugin). Las ventajas de Rack::Cache para la obtención condicional del contenido de una página son evidentes: Con la utilización de las cabeceras <span class="caps">HTTP</span> <code>Expires</code>, <code>Cache-Control</code>, <code>Last-Modified</code> y <code>ETag</code>, es posible indicar de diferentes formas la validez de un determinado contenido, y <strong>evitar tener que enviar de nuevo toda la página</strong> cuando ésta es la misma que el navegador tiene en su caché, incluso aunque la misma se encuentre cacheada en forma de <span class="caps">HTML</span> y sólo haya que enviar su contenido sin tener que regenerarlo.</p>

<p>Evidentemente, esto permite ahorrar un mayor ancho de banda, y atender así más peticiones por segundo desde nuestra instancia de la aplicación.</p>

<h2>Serializers personalizados</h2>

<p>Si antes querías convertir un Hash, un Array, o cualquier otra instancia de un objeto Ruby en un objeto <span class="caps">YAML</span>, para poder serializarlo y guardarlo en un atributo de tipo <code>text</code> en la base de datos, sólo tenías que usar el método <code>serialize</code> de ActiveRecord::Base. Pero, ¿y si preferías guardar el valor en algún otro formato, uno que te permitiese guardar su valor en una forma que te facilitase futuras consultas en la base de datos, o que sencillamente ofusque un poco los datos? Tenías que construir una serie de métodos en tu modelo para asignar y leer los valores cada vez.</p>

<p>Ahora puedes dejar la mayor parte del trabajo a ActiveRecord, utilizando el mismo método <code>serialize</code>, pero especificando como parámetro un objeto que responda a los métodos <code>load</code> y <code>dump</code>, donde definir el algoritmo a utilizar para convertir el objeto en cuestión a texto y para generarlo de nuevo a partir del valor serializado. Por ejemplo:</p>

	<p><pre class="prettyprint lang-ruby">
  class Post < ActiveRecord::Base
    class CommaSeparatedList
      def load(text)
        return unless text
        text.split(&#8221;,&#8221;)
      end</p>

      def dump(text)
        text.join(&#8221;,&#8221;)
      end
    end

    serialize :tags, CommaSeparatedList.new
  end

  post = Post.create(:tags => [&#8220;rails&#8221;, &#8220;ruby&#8221;])
  # <span class="caps">INSERT</span> <span class="caps">INTO</span> &#8220;posts&#8221; (&#8220;tags&#8221;, &#8220;created_at&#8221;) <span class="caps">VALUES</span> (&#8216;rails,ruby&#8217;)
</pre>

<p>Más información | <a href="http://weblog.rubyonrails.org/2011/5/22/rails-3-1-release-candidate">Rails 3.1 Release Candidate</a></p>      ]]></description>
      </item>
        	  <atom:link href="http://www.genbetadev.com/categoria/ruby/rss2.xml" rel="self" type="application/rss+xml" />
	</channel>

</rss>


