<?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>Bosque Viejo &#187; rails</title>
	<atom:link href="http://bosqueviejo.net/tag/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://bosqueviejo.net</link>
	<description>Sitio web sobre programación, software libre, redes, servidores, ofimática... y todo lo relacionado con la informática que nos rodea</description>
	<lastBuildDate>Sun, 22 Jan 2012 01:02:42 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>RSS: leyéndolos desde PHP y Rails</title>
		<link>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/</link>
		<comments>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 10:26:04 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1057</guid>
		<description><![CDATA[ Hace un tiempo hice un lector de RSS para poner noticias en una web, en Ruby on Rails, y me gustó la simpleza con la que se parsean los códigos y se pueden presentar las noticias, sin mucho esfuerzo, y apenas líneas de código. Unos días más tarde, me tocó hacerlo también en PHP&#8230; e aquí un ejemplo de simpleza de un framework, frente a un lenguaje.
Versión PHP
Empezaremos con la complicada. Este código se encarga de descargar el código del RSS y deserializar el XML en un array, para poder tratarlo a posteriori. El tratamiento lo haré en plan cutre, ya que me intentaré, sobretodo, basar en el proceso de descarga y deserialización.
Para esto, se requiere de una librería que no suele venir con PHP, pero sí está en PEAR, con lo que, se puede instalar fácilmente ejecutando la siguiente línea de comandos:

pear install XML_Serializer

Con esto, el código, en plan simple, sería el siguiente:

&#60;?php
&#160;
&#160;
include 'XML/Unserializer.php';
&#160;
function xml_to_array&#40; $data &#41; &#123;
    $options = array&#40;
        &#34;addDecl&#34;            =&#62; true,
        &#34;encoding&#34;      [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/rss-150x150.jpg" alt="" title="rss" width="150" height="150" class="alignleft size-thumbnail wp-image-1058" /> Hace un tiempo hice un lector de RSS para poner noticias en una web, en Ruby on Rails, y me gustó la simpleza con la que se parsean los códigos y se pueden presentar las noticias, sin mucho esfuerzo, y apenas líneas de código. Unos días más tarde, me tocó hacerlo también en PHP&#8230; e aquí un ejemplo de simpleza de un framework, frente a un lenguaje.</p>
<h3>Versión PHP</h3>
<p>Empezaremos con la complicada. Este código se encarga de descargar el código del RSS y deserializar el XML en un array, para poder tratarlo a posteriori. El tratamiento lo haré en plan <em>cutre</em>, ya que me intentaré, sobretodo, basar en el proceso de descarga y deserialización.</p>
<p>Para esto, se requiere de una librería que no suele venir con PHP, pero sí está en PEAR, con lo que, se puede instalar fácilmente ejecutando la siguiente línea de comandos:</p>
<pre>
pear install XML_Serializer
</pre>
<p>Con esto, el código, en plan simple, sería el siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'XML/Unserializer.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> xml_to_array<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">&quot;addDecl&quot;</span>            <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;encoding&quot;</span>           <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;mode&quot;</span>               <span style="color: #339933;">=&gt;</span> XML_SERIALIZER_MODE_SIMPLEXML<span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;indent&quot;</span>             <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;    &quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;linebreak&quot;</span>          <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;scalarAsAttributes&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;attributesArray&quot;</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_a'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;contentName&quot;</span>        <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_c'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;rootName&quot;</span>           <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'rss'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$unserializer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XML_Unserializer<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$doc</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUnserializedData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$doc</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> xml_to_array<span style="color: #009900;">&#40;</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://www.debian.org/News/news'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;html&gt;
&lt;body&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;item&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$noticia</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;h1&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;link&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;title&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/a&gt;&lt;/h1&gt;
    &lt;p class=&quot;date&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;d/m/Y H:i&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">strtotime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;dc:date&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;
    &lt;p class=&quot;desc&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'description'</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>No pinta mal, conseguimos lo que nos proponemos sin tener muchas complicaciones.</p>
<h3>Ahora la versión <em>bonita</em></h3>
<p>En Rails las cosas siempre tienden a ser más simples, o al menos mucho más cortas, muestra de ello, es la versión del código anterior en versión Rails. Este sería:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> noticias
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rss/1.0'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rss/2.0'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'open-uri'</span>
&nbsp;
    source = <span style="color:#996600;">&quot;http://www.debian.org/News/news&quot;</span>
    content = <span style="color:#996600;">&quot;&quot;</span>
    <span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>source<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span> content = s.<span style="color:#9900CC;">read</span> <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0066ff; font-weight:bold;">@rss</span> = <span style="color:#6666ff; font-weight:bold;">RSS::Parser</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>content, <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Aunque he puesto los <em>require</em> dentro de la función, realmente podrían ponerse en otro sitio (como en <em>environment.rb</em>) y no requieren de la instalación de ninguna gema extra. En la vista sería tan solo usar el código de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;% @rss.items.each do |i| %&gt;
    &lt;h1&gt;&lt;%= link_to i.title, i.link %&gt;&lt;/h1&gt;
    &lt;p class=&quot;date&quot;&gt;&lt;%=i.date.strftime(&quot;%d/%m/%Y %H:%M&quot;)%&gt;&lt;/p&gt;
    &lt;p class=&quot;desc&quot;&gt;&lt;%=simple_format(i.description)%&gt;&lt;/p&gt;
&lt;% end %&gt;</pre></div></div>

<p>Los <em>helpers</em> ayudan bastante en la creación del código, haciendo que los enlaces se hagan de forma simple, así como el formateado de la fecha, y el parseo del texto para HTML.</p>
<h3>Conclusiones</h3>
<p>He estado revisando el repositorio PEAR, donde he podido ver que había un par de paquetes de RSS, uno de ellos sin mantenimiento ya (<a href="http://pear.php.net/package/XML_RSS/redirected">XML_RSS</a>), y el resto de blogs que he visitado lo hacen como he mencionado, por lo que, obliga a conocer los distintos formatos de los que se van a rescatar noticias, ya sean Atom, RSS (la versión que corresponda), etc. Me parece que en este sentido Rails ha demostrado ser más serio o aplicado.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 3.1: mejorando las vistas</title>
		<link>http://bosqueviejo.net/2011/10/17/rails-3-1-mejorando-las-vistas/</link>
		<comments>http://bosqueviejo.net/2011/10/17/rails-3-1-mejorando-las-vistas/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 20:59:11 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[software libre]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=992</guid>
		<description><![CDATA[ Puf, no sé ni por donde comenzar, han sido tantas cosas las que he visto en el cambio de la versión de Rails 3.0 a esta nueva liberación&#8230; pero no solo por las mejoras que conlleva o tiene esta nueva liberación, sino más bien por esa cantidad de elementos que se anexan y que no conocía&#8230; ya me vale  
En principio, podemos decir que una de las grandes mejoras (para muchos), es que ya no trae por defecto prototype, sino que se han decantado por jQuery. No obstante, como todavía hay gente que considera el uso de prototype para sus desarrollos, pues lo que han hecho es que por defecto se instala jQuery, pero se puede indicar a través de una opción que se instale en su lugar prototype. Esto es gracias a que han extraído estas librerías a gemas independientes: prototype-rails y jquery-rails.
En segundo lugar, y siguiendo con el tema de la parte cliente, han integrado unos asset pipelines, que facilitan la generación de código CSS y JavaScript a través de elementos como CoffeeScript, Sass, Less&#8230; y todos ellos a través de Sprockets.
Con el uso de Ruby 1.9.2 (o Rubinius o JRuby en modo 1.9) y un [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/ruby_on_rails-150x150.jpg" alt="" title="ruby_on_rails" width="150" height="150" class="alignleft size-thumbnail wp-image-1000" /> Puf, no sé ni por donde comenzar, han sido tantas cosas las que he visto en el cambio de la versión de Rails 3.0 a esta nueva liberación&#8230; pero no solo por las mejoras que conlleva o tiene esta nueva liberación, sino más bien por esa cantidad de elementos que se anexan y que no conocía&#8230; ya me vale <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>En principio, podemos decir que una de las grandes mejoras (para muchos), es que ya no trae por defecto <a href="http://www.prototypejs.org/">prototype</a>, sino que se han decantado por <a href="http://jquery.com/">jQuery</a>. No obstante, como todavía hay gente que considera el uso de prototype para sus desarrollos, pues lo que han hecho es que por defecto se instala jQuery, pero se puede indicar a través de una opción que se instale en su lugar prototype. Esto es gracias a que han extraído estas librerías a gemas independientes: <em>prototype-rails</em> y <em>jquery-rails</em>.</p>
<p>En segundo lugar, y siguiendo con el tema de la parte <em>cliente</em>, han integrado unos <strong>asset pipelines</strong>, que facilitan la generación de código CSS y JavaScript a través de elementos como <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>, <a href="http://sass-lang.com/">Sass</a>, <a href="http://lesscss.org/">Less</a>&#8230; y todos ellos a través de <a href="https://github.com/sstephenson/sprockets">Sprockets</a>.</p>
<p>Con el uso de Ruby 1.9.2 (o Rubinius o JRuby en modo 1.9) y un servidor como <a href="https://github.com/blog/517-unicorn">Unicorn</a>, podemos emplear otra de las nuevas características: <strong>HTTP Streaming</strong>. Esta característica permite la descarga de las imágenes, elementos CSS y JS, mientras se genera la vista del HTML.</p>
<p>Otra de las ventajas que sobresale en esta versión es el <strong>Identity Map</strong>. Esta característica de Rails, más en concreto de ActiveRecord, hace que cuando un objeto se rescata de la base de datos, si se solicita de nuevo el mismo objeto, no se solicite de nuevo, sino que se tome el que ya está recogido y en memoria. Esto lo hace solo para los objetos que se instancian en la petición en curso y que son eliminados de la caché cuando la petición finaliza.</p>
<p>El resto ya son mejoras menores, como:</p>
<ul>
<li>El uso de JSON en lugar de XML para el <em>scaffold</em>.</li>
<li>La creación de helpers para la autenticación de HTTP Basic y Digest.</li>
<li>El uso del método change en lugar de <tt>up</tt> y <tt>down</tt> en las migraciones, generando la <em>marcha atrás</em> el sistema de forma automática.</li>
<li>El uso de <tt>up</tt> y <tt>down</tt> como métodos de objeto y no de clase.</li>
<li>La posibilidad de crear serializadores de forma fácil (los de XML y JSON vienen por defecto).</li>
<li>y muchas más&#8230;</li>
</ul>
<p>Para más información, puedes leer <a href="http://guides.rubyonrails.org/3_1_release_notes.html">la ficha de liberación completa (en inglés)</a>.</p>
<p>Realmente, Rails está avanzando mucho y desde que comencé a usarlo, hará ya tres años, lo he visto agregar cada vez más nueva tecnología y elementos que me han ayudado a aprender mucho sobre el desarrollo profesional de entornos web. Así da gusto.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/17/rails-3-1-mejorando-las-vistas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ChicagoBoss: web y erlang&#8230; cada vez más cerca</title>
		<link>http://bosqueviejo.net/2011/05/16/chicagoboss-web-y-erlang-cada-vez-mas-cerca/</link>
		<comments>http://bosqueviejo.net/2011/05/16/chicagoboss-web-y-erlang-cada-vez-mas-cerca/#comments</comments>
		<pubDate>Mon, 16 May 2011 16:33:28 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[chicagoboss]]></category>
		<category><![CDATA[desarrollo ágil]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[erlydtl]]></category>
		<category><![CDATA[evan miller]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=708</guid>
		<description><![CDATA[ Hace un tiempo, Juanse, un compañero de trabajo, me envió un enlace de un framework desarrollado por Evan Miller que se llama ChicagoBoss. Este framework ha sido concebido con Ruby on Rails en mente, no es de extrañar cuando a lo largo de toda la documentación, se hacen referencias a cosas de Ruby on Rails, y las similitudes son tan extraordinariamente grandes, para ser dos lenguajes bastante diferentes.
Los datos y su acceso
En un principio, me resultó curioso, el sistema de ChicagoBoss había resuelto de una forma muy elegante un problema que llevaba tiempo intentando resolver en Erlang&#8230; la definición rápida de los modelos. Para un proyecto de ChicagoBoss, un modelo  puede definirse tal que así:

-module&#40;person, &#91;Id, Firstname, Lastname&#93;&#41;.

Algo bastante impresionante. Agregado con la posibilidad de conectar con base de datos tan variadas como: MySQL, PostgreSQL, MongoDB, Tokyo Tyrant o Mnesia.
Un &#8220;vista&#8221;zo
Otro factor bastante curioso, la forma en la que escribir código mezclado con el código HTML en modo de tags, tal y como hacen lenguajes como Ruby (con el erb de rails), JSP, PHP, ASP&#8230; me parecía muy curioso y potente al mismo tiempo. La solución acogida por ChicagoBoss ha sido la misma que se empleó en Django [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/chicago-boss-150x150.png" alt="" title="chicago-boss" width="150" height="150" class="alignleft size-thumbnail wp-image-709" /> Hace un tiempo, Juanse, un compañero de trabajo, me envió un enlace de un framework desarrollado por <a href="http://www.evanmiller.org/">Evan Miller</a> que se llama <a href="http://www.chicagoboss.org/">ChicagoBoss</a>. Este framework ha sido concebido con Ruby on Rails en mente, no es de extrañar cuando a lo largo de toda la documentación, se hacen referencias a cosas de Ruby on Rails, y las similitudes son tan extraordinariamente grandes, para ser dos lenguajes bastante diferentes.</p>
<h3>Los datos y su acceso</h3>
<p>En un principio, me resultó curioso, el sistema de ChicagoBoss había resuelto de una forma muy elegante un problema que llevaba tiempo intentando resolver en Erlang&#8230; la definición rápida de los modelos. Para un proyecto de ChicagoBoss, un modelo  puede definirse tal que así:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>person<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Id</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Firstname</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Lastname</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Algo bastante impresionante. Agregado con la posibilidad de conectar con base de datos tan variadas como: MySQL, PostgreSQL, MongoDB, Tokyo Tyrant o Mnesia.</p>
<h3>Un &#8220;vista&#8221;zo</h3>
<p>Otro factor bastante curioso, la forma en la que escribir código mezclado con el código HTML en modo de tags, tal y como hacen lenguajes como Ruby (con el erb de rails), JSP, PHP, ASP&#8230; me parecía muy curioso y potente al mismo tiempo. La solución acogida por ChicagoBoss ha sido la misma que se empleó en Django (en Python):</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #109ab8;">&#123;</span><span style="color: #666666; font-style: italic;">% for person in people %}</span>
 <span style="color: #014ea4;">-</span> <span style="color: #109ab8;">&#123;</span><span style="color: #109ab8;">&#123;</span> person<span style="color: #6bb810;">.</span>full_name <span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span>
<span style="color: #109ab8;">&#123;</span><span style="color: #666666; font-style: italic;">% endfor %}</span></pre></div></div>

<p>El código que hace esta magia es el <a href="http://code.google.com/p/erlydtl/">ErlyDTL</a>.</p>
<h3>Por último&#8230; los controladores</h3>
<p>Los controladores son tan simples de generar como lo son los de Rails. Para quien no haya manejado ninguno de estos sistemas, puede que un ejemplo le resulte aclarador:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>book_controller<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Req</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">compile</span><span style="color: #109ab8;">&#40;</span>export_all<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">edit</span><span style="color: #109ab8;">&#40;</span><span style="">'GET'</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
   <span style="color: #006600;">ok</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">edit</span><span style="color: #109ab8;">&#40;</span><span style="">'POST'</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
   <span style="color: #109ab8;">&#123;</span>redirect<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;/somewhere&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Como se puede ver, si el controlador atiende a la ruta <tt>/book/edit</tt>, si lo hace mediante método GET, se ejecutará el primer método retornando simplemente <tt>ok</tt>. Si se tratase de un formulario con método POST, entraría por el segundo método y se redireccionaría la página a la ruta <tt>/somewhere</tt>.</p>
<p>La capacidad de gestión de los datos entre los modelos y el paso de estos a través del controlador hacia la vista, es igual de potente que en rails, django y frameworks similares. El controlador se hace bastante simple y puede contener código más volcado al flujo de las llamadas y la lógica propia del sitio web que se desee desarrollar.</p>
<h3>Las rutas y la administración&#8230; bonus track!</h3>
<p>Como agregados, aunque otros frameworks similares tienen también algunas de estas facilidades, como son los ficheros de rutas, nos encontramos por otro lado con la interfaz de administración. La cual nos brinda información del entorno, la posibilidad de escribir ficheros de idioma (para traducir la web) y visualizar las rutas.</p>
<h3>Conclusiones</h3>
<p>Hace tiempo <a href="http://bosqueviejo.net/2009/08/13/lenguajes-funcionales-para-el-desarrollo-web/">comentaba la potencia que se comenzaba a ver en el desarrollo de proyectos erlang para la web</a>, ahora, cada vez es más una realidad, gracias a trabajos de tanta calidad como <a href="http://nitrogen-erlang.tumblr.com/">Nitrogen</a>, <a href="https://github.com/yariv/erlyweb">Erlyweb</a> o este, ChicagoBoss.</p>
<p>Aún no llevo el suficiente tiempo jugando con la herramienta en sí, pero me ha resultado bastante cómoda la generación del entorno (aunque algo buggy&#8230; se nota que hay que pulir aún por ahí un poco) y la documentación aún es algo escasa&#8230; no obstante, se perfila como un entorno a tener en cuenta por su versatilidad y porque ofrece cosas que en otros entornos son bastante más complejas de conseguir: escalabilidad y redundancia.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/05/16/chicagoboss-web-y-erlang-cada-vez-mas-cerca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bundler: despliega fácilmente rails</title>
		<link>http://bosqueviejo.net/2011/03/07/bundler-despliega-facilmente-rails/</link>
		<comments>http://bosqueviejo.net/2011/03/07/bundler-despliega-facilmente-rails/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 19:10:46 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[bundler]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=615</guid>
		<description><![CDATA[ Después de haber dado una vuelta por la versión estable de rails, he reparado en que, por defecto, se instala bundler y un fichero llamado Gemfile en la raiz de cada proyecto rails que se genera nuevo.
La verdad es que, en el momento que vi el fichero de Gemfile, queda clara la misión de dicho fichero, ya que viene con una colección básica de gemas que se suelen instalar de forma base cuando se trabaja con rails (out of the box) y unos comentarios de gemas que aconsejan para ciertos usos cotidianos (opcionales).
Indagando un poco, topé con su web, en la que viene cantidad de documentación sobre su uso y, ejecutando, simplemente, desde la consola:

bundle install

Me encuentro con que el sistema comienza a instalar rails y todos los paquetes base necesarios para poder tener el proyecto activo y funcionando sin problemas.
Esta es otra de las joyas que hacen que Ruby on Rails sea fácil de usar para el desarrollo rápido de aplicaciones web. Lo recomiendo, merece la pena.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/bundler-small.png" alt="" title="bundler-small" width="220" height="80" class="alignleft size-full wp-image-616" /> Después de haber dado una vuelta por la versión estable de rails, he reparado en que, por defecto, se instala <a href="http://gembundler.com/">bundler</a> y un fichero llamado <em>Gemfile</em> en la raiz de cada proyecto rails que se genera nuevo.</p>
<p>La verdad es que, en el momento que vi el fichero de Gemfile, queda clara la misión de dicho fichero, ya que viene con una colección básica de gemas que se suelen instalar de forma base cuando se trabaja con rails (<em>out of the box</em>) y unos comentarios de gemas que aconsejan para ciertos usos cotidianos (opcionales).</p>
<p>Indagando un poco, topé con su web, en la que viene cantidad de documentación sobre su uso y, ejecutando, simplemente, desde la consola:</p>

<div class="wp_syntax"><div class="code"><pre class="shellscript" style="font-family:monospace;">bundle install</pre></div></div>

<p>Me encuentro con que el sistema comienza a instalar rails y todos los paquetes base necesarios para poder tener el proyecto activo y funcionando sin problemas.</p>
<p>Esta es otra de las joyas que hacen que Ruby on Rails sea fácil de usar para el desarrollo rápido de aplicaciones web. Lo recomiendo, merece la pena.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/03/07/bundler-despliega-facilmente-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Escalado de Ruby on Rails</title>
		<link>http://bosqueviejo.net/2009/05/25/escalado-de-ruby-on-rails/</link>
		<comments>http://bosqueviejo.net/2009/05/25/escalado-de-ruby-on-rails/#comments</comments>
		<pubDate>Mon, 25 May 2009 11:34:41 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[redes]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[servidores]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=142</guid>
		<description><![CDATA[Después de liberar el primer proyecto escrito en Ruby on Rails, cuando lo pasamos a producción, nos dimos cuenta de que el sistema funcionaba realmente lento. En algunos casos, incluso, no respondía, con lo que buscamos información por internet y vimos:
Mongrel y Thin no son multi-hilo
Fue algo que nos sorprendió mucho, una aplicación servidora secuencial, que atiende las peticiones una a una y, en caso de que una petición se tarde un par de segundos (que las teníamos :-S ), el sistema se queda trabado durante todo ese tiempo.
Las soluciones posibles eran dos:

Phusion Passenger, también conocido como mod_rails, es un módulo para Apache que mantiene tantos hilos como peticiones se vayan gestionando, siempre con unos límites máximos y mínimos, tal y como apache suele hacerlo.
Ngnix + Thin, esta solución fue un poco más artesana, por decirlo de alguna forma, ya que consistía en configurar este servidor web como proxy inverso, para hacer el balanceo de peticiones entre todos los hilos de thin que se quieran cargar en el sistema. Descartamos en este punto a mongrel por comentarios que había leído en otros blogs.

Bien, por correr lo más posible, lanzamos tantos hilos como nos fue posible en la máquina que dedicamos [...]]]></description>
			<content:encoded><![CDATA[<p>Después de liberar el primer proyecto escrito en Ruby on Rails, cuando lo pasamos a producción, nos dimos cuenta de que el sistema funcionaba realmente lento. En algunos casos, incluso, no respondía, con lo que buscamos información por internet y vimos:</p>
<p><strong>Mongrel y Thin no son multi-hilo</strong></p>
<p>Fue algo que nos sorprendió mucho, una aplicación servidora secuencial, que atiende las peticiones una a una y, en caso de que una petición se tarde un par de segundos (que las teníamos :-S ), el sistema se queda trabado durante todo ese tiempo.</p>
<p>Las soluciones posibles eran dos:</p>
<ul>
<li><strong><a href="http://www.modrails.com/">Phusion Passenger</a></strong>, también conocido como <strong>mod_rails</strong>, es un módulo para Apache que mantiene tantos hilos como peticiones se vayan gestionando, siempre con unos límites máximos y mínimos, tal y como apache suele hacerlo.</li>
<li><strong>Ngnix + Thin</strong>, esta solución fue un poco más <em>artesana</em>, por decirlo de alguna forma, ya que consistía en configurar este servidor web como proxy inverso, para hacer el balanceo de peticiones entre todos los hilos de thin que se quieran cargar en el sistema. Descartamos en este punto a mongrel por comentarios que había leído en <a href="http://www.juantomas.net/2009/03/02/si-los-mongrels-te-dan-palo-yo-los-voy-thinear/">otros blogs</a>.</li>
</ul>
<p>Bien, por correr lo más posible, lanzamos tantos hilos como nos fue posible en la máquina que dedicamos al proyecto y, nos complació ver que podía aguantar hasta 40 hilos, sin que sus CPUs lo notasen apenas. Con lo que conseguimos un pool de 40 puertos dedicados a atender peticiones HTTP.</p>
<p>En otra máquina se configuró un proxy inverso. En el escenario de pruebas usamos nginx, aunque el tenerlo en la misma máquina y hacer pruebas masivas, nos dio como resultado que una cantidad importante de peticiones se perdían o transformaban en respuestas de tipo 500 por parte de nginx. Optamos entonces por un balanceador que tiene la compañía vía hardware, muy rápido y, a día de hoy el sistema web tira tan rápido y casi mejor que el que tenemos montado en PHP <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>En el próximo artículo comentaré las configuraciones, arquitecturas y demás seguidas, sobre todo a nivel de nginx y thin, que es lo que realmente interesa.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/05/25/escalado-de-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

