<?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; ruby</title>
	<atom:link href="http://bosqueviejo.net/tag/ruby/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>Tue, 08 May 2012 14:40:56 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Juggernaut: invirtiendo el paradigma cliente/servidor</title>
		<link>http://bosqueviejo.net/2012/05/08/juggernaut-invirtiendo-el-paradigma-clienteservidor/</link>
		<comments>http://bosqueviejo.net/2012/05/08/juggernaut-invirtiendo-el-paradigma-clienteservidor/#comments</comments>
		<pubDate>Tue, 08 May 2012 14:40:56 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[juggernaut]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1371</guid>
		<description><![CDATA[ Juggernaut, además de ser un personaje del universo Marvel, es un servidor escrito en Node.JS, que permite su integración con Ruby on Rails para realizar el intercambio de mensajes en dirección del servidor hacia el navegador.
Este esquema permite al servidor poder enviar mensajes al navegador en cualquier momento, de modo que se mantiene una actualización mucho más precisa que con refrescos esporádicos del navegador web hacia el servidor.
¿Cómo funciona?
Juggernaut, para conseguir esto se basa en el uso de un código en Flash que le permite abrir un socket y mantener la comunicación con el servidor de forma constante. En la parte del cliente, por lo tanto, está el navegador que realiza las peticiones al código de Rails como siempre y, además, el código Flash que abre la comunicación con el servidor de Juggernaut, que le va enviando código en JavaScript que ejecuta para realizar acciones concretas.
En la parte del servidor tenemos también dos elementos bien diferenciados, por un lado tenemos al servidor de Juggernaut ejecutándose en el puerto 5001 (por defecto) y el servidor de Rails ejecutándose en otro puerto (por defecto en desarrollo suele ser el 3000). La comunicación con el servidor de Rails es como siempre en [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/The_Juggernaut-150x150.jpg" alt="" title="The_Juggernaut" width="150" height="150" class="alignleft size-thumbnail wp-image-1372" /> <a href="http://juggernaut.rubyforge.org/">Juggernaut</a>, además de ser un <a href="http://es.wikipedia.org/wiki/Juggernaut_(Marvel_Comics)">personaje del universo Marvel</a>, es un servidor escrito en <a href="/2012/01/03/nodejs-el-servidor-javascript/">Node.JS</a>, que permite su integración con <a href="/2011/10/17/rails-3-1-mejorando-las-vistas/">Ruby on Rails</a> para realizar el intercambio de mensajes en dirección del servidor hacia el navegador.</p>
<p>Este esquema permite al servidor poder enviar mensajes al navegador en cualquier momento, de modo que se mantiene una actualización mucho más precisa que con refrescos esporádicos del navegador web hacia el servidor.</p>
<h3>¿Cómo funciona?</h3>
<p>Juggernaut, para conseguir esto se basa en el uso de un código en Flash que le permite abrir un socket y mantener la comunicación con el servidor de forma constante. En la parte del cliente, por lo tanto, está el navegador que realiza las peticiones al código de Rails como siempre y, además, el código Flash que abre la comunicación con el servidor de Juggernaut, que le va enviando código en JavaScript que ejecuta para realizar acciones concretas.</p>
<p>En la parte del servidor tenemos también dos elementos bien diferenciados, por un lado tenemos al servidor de Juggernaut ejecutándose en el puerto 5001 (por defecto) y el servidor de Rails ejecutándose en otro puerto (por defecto en desarrollo suele ser el 3000). La comunicación con el servidor de Rails es como siempre en protocolo HTTP, mientras que el intercambio de información a través del interfaz de Juggernaut se sucede en formato JSON, enviando información específica a ejecutar en el navegador.</p>
<h3>Instalación</h3>
<p>La verdad es que la instalación no queda nada clara, por lo que voy a explicar el cómo se instala el sistema para tenerlo funcionando en poco tiempo. En principio, necesitamos ejecutar lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">gem install json
gem install eventmachine
gem install juggernaut
gem install maccman-juggernaut -s http://gems.github.com</pre></div></div>

<p>Tenemos que crear un proyecto Rails. En principio, tendrá que ser una versión anterior a la 3.2, ya que en esa versión se ha eliminado el uso de plugins en favor de las gemas, por lo que, creamos nuestro proyecto Rails y ejecutamos:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">ruby script/plugin install git://github.com/maccman/juggernaut_plugin.git</pre></div></div>

<p>Ahora toca lanzar la parte servidora de Juggernaut, para eso, vamos a generar un fichero de configuración, el sistema nos puede generar uno automáticamente de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">juggernaut -g juggernaut.yml</pre></div></div>

<p>Con esto ya tenemos instalado todo el sistema de Juggernaut, y lo básico para poder integrarlo dentro de nuestro proyecto Rails.</p>
<h3>Implementando Juggernaut en Rails</h3>
<p>Introducir Juggernaut en Rails es tan sencillo como crear un nuevo controlador, por ejemplo uno llamado <em>Chat</em>, y escribir el siguiente código en el fichero <tt>chat_controller.rb</tt>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ChatController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  <span style="color:#9966CC; font-weight:bold;">def</span> index
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> send_data
    render <span style="color:#ff3333; font-weight:bold;">:juggernaut</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>page<span style="color:#006600; font-weight:bold;">|</span>
        page.<span style="color:#9900CC;">insert_html</span> <span style="color:#ff3333; font-weight:bold;">:top</span>, <span style="color:#996600;">'chat_data'</span>, <span style="color:#996600;">&quot;&lt;li&gt;&lt;strong&gt;#{params['id']}&lt;/strong&gt;: #{h params['chat_input']}&lt;/li&gt;&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    render <span style="color:#ff3333; font-weight:bold;">:nothing</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>En este código tenemos dos entradas, una es el <em>index</em> que lo emplearemos para entrar en la página inicial, y otra es la parte de envío de datos, a la que llamaremos mediante AJAX. El formulario lo montamos de la siguiente forma en el fichero <tt>index.html.erb</tt>:</p>
<pre style="color:#000000;background-color:#f9f9f9; border: #c0c0c0 solid 1px; font-size:12px;">
<b>&lt;html&gt;</b>
<b>&lt;head&gt;</b>
    <b>&lt;title&gt;</b>Chat<b>&lt;/title&gt;</b>
    <b>&lt;%=</b> <span style='color:#000080;'>javascript_include_tag</span> <span style='color:#d40000;'>:defaults</span>, <span style='color:#d40000;'>:juggernaut</span> <b>%&gt;</b>
    <b>&lt;%=</b> juggernaut(<span style='color:#d40000;'>:client_id</span> <span style='color:#ff00ff;'>=&gt;</span> params<span style='color:#ff00ff;'>[</span><span style='color:#d40000;'>:id</span><span style='color:#ff00ff;'>]</span>) <b>%&gt;</b>
<b>&lt;/head&gt;</b>
<b>&lt;body&gt;</b>
    <b>&lt;%=</b> <span style='color:#000080;'>form_remote_tag</span>(
          <span style='color:#d40000;'>:url</span> <span style='color:#ff00ff;'>=&gt;</span> <span style='color:#ff00ff;'>{</span> <span style='color:#d40000;'>:action</span> <span style='color:#ff00ff;'>=&gt;</span> <span style='color:#d40000;'>:send_data</span> <span style='color:#ff00ff;'>}</span>,
          <span style='color:#d40000;'>:complete</span> <span style='color:#ff00ff;'>=&gt;</span> <span style='color:#dd0000;'>&quot;$('chat_input').value = ''&quot;</span> ) <b>%&gt;</b>
    <b>&lt;%=</b> <span style='color:#000080;'>text_field_tag</span>( <span style='color:#dd4a4a;'>'chat_input'</span>, <span style='color:#dd4a4a;'>''</span>, <span style='color:#ff00ff;'>{</span> <span style='color:#d40000;'>:size</span> <span style='color:#ff00ff;'>=&gt;</span> <span style='color:#0000ff;'>20</span>, <span style='color:#d40000;'>:id</span> <span style='color:#ff00ff;'>=&gt;</span> <span style='color:#dd4a4a;'>'chat_input'</span><span style='color:#ff00ff;'>}</span> ) <b>%&gt;</b>
    <b>&lt;%=</b> <span style='color:#000080;'>hidden_field_tag</span>( <span style='color:#dd4a4a;'>'id'</span>, params<span style='color:#ff00ff;'>[</span><span style='color:#d40000;'>:id</span><span style='color:#ff00ff;'>]</span> ) <b>%&gt;</b>
    <b>&lt;%=</b> <span style='color:#000080;'>submit_tag</span> <span style='color:#dd0000;'>&quot;Add&quot;</span> <b>%&gt;</b>
    <b>&lt;/form&gt;</b>
    <b>&lt;ul</b><span style='color:#008000;'> id=</span><span style='color:#aa0000;'>&quot;chat_data&quot;</span><span style='color:#008000;'> style=</span><span style='color:#aa0000;'>&quot;list-style:none&quot;</span><b>&gt;</b>
    <b>&lt;/ul&gt;</b>
<b>&lt;/body&gt;</b>
<b>&lt;/html&gt;</b></pre>
<h3>Lanzando la aplicación</h3>
<p>Lanzamos Rails (ya sea con mongrel, thin o cualquier otro servidor) y Juggernaut. El lanzamiento de Juggernaut lo podemos hacer de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">juggernaut -c juggernaut.yml</pre></div></div>

<p>Ahora vamos al navegador, abrimos dos navegadores:</p>
<ul>
<li><a href="http://localhost:3000/chat/index/yo">http://localhost:3000/chat/index/yo</a></li>
<li><a href="http://localhost:3000/chat/index/tu">http://localhost:3000/chat/index/tu</a></li>
</ul>
<p>Si vamos escribiendo en una ventana, veremos como van apareciendo los textos en ambas, algo como esto:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/chat_juggernaut.png" alt="" title="chat_juggernaut" width="709" height="283" class="aligncenter size-full wp-image-1392" /></p>
<p>Con lo que comprobamos que el sistema funciona correctamente.</p>
<h3>Algunas pegas</h3>
<p>Como hemos visto desde el principio, la comunicación del navegador se realiza a través de un puerto que no es el 80, típico del protocolo HTTP, y que tampoco es protocolo HTTP lo que transita por ese puerto, por lo que, en instalaciones con acceso a Internet restringido, es posible que este sistema no funcione correctamente.</p>
<p>Además, se suma el problema de que el puerto 5001 debe de mantenerse abierto hacia Internet, si no configuramos con suficiente seguridad, a través del fichero <tt>juggernaut.yml</tt> el sistema, podemos encontrarnos un verdadero agujero de seguridad&#8230; ya depende de para qué usemos Juggernaut, pero teniendo en cuenta de que ejecuta código JavaScript en el cliente, podría ser algo nocivo.</p>
<h3>Conclusiones</h3>
<p>Esta aproximación al sistema de Juggernaut ha sido bastante interesante para descubrir una forma de realizar este tipo de comunicaciones entre cliente y servidor de forma inversa, es decir, que el servidor pueda enviar información al cliente sin que el cliente la solicite. No obstante, los navegadores actuales implementan un sistema denominado <em>websocket</em> que tenderá a sustituir estos mecanismos artesanos de una forma más estándar y frameworks como ChicagoBoss ya lo implementan de forma nativa. El futuro nos mostrará los caminos que se van tomando, de momento, Juggernaut es una muy buena solución para todos los navegadores web actuales.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/05/08/juggernaut-invirtiendo-el-paradigma-clienteservidor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Las gemas de Ruby</title>
		<link>http://bosqueviejo.net/2012/01/02/las-gemas-de-ruby/</link>
		<comments>http://bosqueviejo.net/2012/01/02/las-gemas-de-ruby/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 17:03:31 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1165</guid>
		<description><![CDATA[ Tengo a Ruby un poco abandonado, por lo que me he decidido a escribir un poco acerca de él, al igual que hice con Python, para detallar un poco cómo son los paquetes de código (o librerías) de Ruby: las gemas.
Las gemas de Ruby son paquetes de librerías para Ruby que se instalan en el sistema y quedan listas para ser usadas, con un simple require o con mecanismos que aporta el propio sistema de gemas para Ruby.
El gestor de gemas: rubygems
En distribuciones de GNU/Linux, e instalaciones automáticas para Windows, se nos habilita un comando, generalmente, que nos permite agregar librerías y código de un repositorio muy extenso de código listo para usar. Esto es conocido como el gestor de gemas, rubygems, o simplemente gem.
El gestor de gemas es un comando que nos permite listar las gemas instaladas, buscar gemas remotas o localmente (de las instaladas), instalar, actualizar y eliminar gemas. Se puede saber si está instalado simplemente ejecutando:

gem --version

La última versión a día de hoy es la 1.8.12, actualizar el sistema de gemas es tan simple como ejecutar:

gem update --system

Instalar una gema
Por ejemplo, si queremos usar el código siguiente:

require &#34;rubygems&#34;;
require &#34;json&#34;;
&#160;
puts &#91; &#34;hola a todos&#34;, 12, &#34;C/Sin nombre, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/rubygems-150x150.jpg" alt="" title="rubygems" width="150" height="150" class="alignleft size-thumbnail wp-image-1166" /> Tengo a Ruby un poco abandonado, por lo que me he decidido a escribir un poco acerca de él, al igual que hice con Python, para detallar un poco cómo son los paquetes de código (o librerías) de Ruby: las gemas.<span id="more-1165"></span></p>
<p>Las gemas de Ruby son paquetes de librerías para Ruby que se instalan en el sistema y quedan listas para ser usadas, con un simple <em>require</em> o con mecanismos que aporta el propio sistema de gemas para Ruby.</p>
<h3>El gestor de gemas: rubygems</h3>
<p>En distribuciones de GNU/Linux, e instalaciones automáticas para Windows, se nos habilita un comando, generalmente, que nos permite agregar librerías y código de un repositorio muy extenso de código listo para usar. Esto es conocido como el gestor de gemas, <em>rubygems</em>, o simplemente <em>gem</em>.</p>
<p>El gestor de gemas es un comando que nos permite listar las gemas instaladas, buscar gemas remotas o localmente (de las instaladas), instalar, actualizar y eliminar gemas. Se puede saber si está instalado simplemente ejecutando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">gem --version</pre></div></div>

<p>La última versión a día de hoy es la 1.8.12, actualizar el sistema de gemas es tan simple como ejecutar:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">gem update --system</pre></div></div>

<h3>Instalar una gema</h3>
<p>Por ejemplo, si queremos usar el código siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rubygems&quot;</span>;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;json&quot;</span>;
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#006600; font-weight:bold;">&#91;</span> <span style="color:#996600;">&quot;hola a todos&quot;</span>, <span style="color:#006666;">12</span>, <span style="color:#996600;">&quot;C/Sin nombre, 25&quot;</span> <span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_json</span></pre></div></div>

<p>Tendremos que instalar previamente la gema <em>json</em>. Para instalarla, solo tenemos que ejecutar el siguiente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo gem install json
[sudo] password for marubio: 
Building native extensions.  This could take a while...
Successfully installed json-1.6.4
1 gem installed
Installing ri documentation for json-1.6.4...
Installing RDoc documentation for json-1.6.4...</pre></div></div>

<p>Como se puede apreciar, se instala la gema y se genera la documentación para <em>ri</em> y <em>rdoc</em>. La generación de la documentación es bastante lenta y si tenemos que instalar muchas gemas, puede ser algo tedioso. Se puede eliminar esta tarea agregando al comando de instalación: <tt>--no-ri --no-rdoc</tt></p>
<p>Ahora, cuando listemos los paquetes instalados podremos ver:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo gem list
&nbsp;
*** LOCAL GEMS ***
&nbsp;
json (1.6.4)</pre></div></div>

<p>Nos indica la versión, ya que podríamos tener varias versiones instaladas y conviviendo, y desde el código emplear la que requiramos específicamente. Si queremos instalar una versión específica de un paquete, podemos hacerlo agregando la opción, por ejemplo: <tt>--v=1.6.1</tt></p>
<h3>Buscando una gema</h3>
<p>Si queremos buscar una gema específica del directorio de gemas, podemos hacerlo a través de la propia página web: <a href="http://rubygems.org">RubyGems</a>; o a través del comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ gem search -r jsonn
&nbsp;
*** REMOTE GEMS ***
&nbsp;
active_record_serialize_json (0.1.2)
activejson (0.1.2)
activeresource_json_patch (0.0.1)
assert_json (0.1.1)
capcode-render-json (0.2.0)
capybara-json (0.1.1)
colorful_json (0.9.1)
csv2json (0.2.0)
cucumber-json (0.0.2)
dm-json-search (0.0.3)
[...]</pre></div></div>

<p>La base de datos de gemas tiene la friolera de más de 32 mil gemas, por lo que, no es de extrañar que ante algo trivial (como JSON) puedan aparecer cientos de gemas. A la hora de buscar deberemos de ser más precisos con los términos a elegir.</p>
<h3>Conclusiones</h3>
<p>Ha sido una introducción muy ligera a este entorno de gestión de paquetes de Ruby, lo sé, pero al menos complementa un poco la entrada de hace algunos meses sobre <a href="/2011/03/07/bundler-despliega-facilmente-rails/">Bundler</a> y da un poco de información sobre los comandos más usuales a la hora de instalar una librería en Ruby, ya sea para código scripting o para Rails.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/01/02/las-gemas-de-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Celluloid: Concurrencia en Ruby</title>
		<link>http://bosqueviejo.net/2011/10/06/celluloid-concurrencia-en-ruby/</link>
		<comments>http://bosqueviejo.net/2011/10/06/celluloid-concurrencia-en-ruby/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 09:34:59 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[celluloid]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=947</guid>
		<description><![CDATA[ Profundizando un poco en el Modelo Actor, en el que se basan lenguajes como Scala, Erlang o Reia, pero que también está disponible a través de frameworks para otros muchos lenguajes, como .NET, Java, Ruby, Python, etc.
Antes de comenzar, conviene que definamos un poco lo que es el modelo Actor. Según la wikipedia (versión inglesa) el modelo Actor es: un modelo matemático de computación concurrente que trata a los &#8220;actores&#8221; como las primitivas universales de la computación concurrente digital: en respuesta a mensajes que recibe, un actor puede tomar decisiones locales, crear más actores, enviar más mensajes y determinar cuando responder al siguiente mensaje recibido.
En este artículo me gustaría centrarme en Celluloid, un framework del modelo Actor para Ruby. Este framework nos permite tratar las instancias de los objetos como procesos autónomos, concurrentes, que atienden peticiones y mantienen su memoria, sin posibilidad de que pueda ser corrompida por dos mensajes simultáneos.
Un ejemplo de código de la propia página web, haciendo alusión al actor&#8230; vamos a castellanizarlo un poco:

class Bardem
  include Celluloid::Actor
&#160;
  def initialize&#40;nombre&#41;
    @nombre = nombre
  end
&#160;
  def pon_estado&#40;estado&#41;
    @estado = estado
  end
&#160;
  def informa
   [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/Celluloid_Cine-film1.jpg" alt="" title="Celluloid_Cine-film" width="150" height="150" class="alignleft size-full wp-image-952" /> Profundizando un poco en el <a href="http://en.wikipedia.org/wiki/Actor_model">Modelo Actor</a>, en el que se basan lenguajes como Scala, Erlang o Reia, pero que también está disponible a través de frameworks para otros muchos lenguajes, como .NET, Java, Ruby, Python, etc.</p>
<p>Antes de comenzar, conviene que definamos un poco lo que es el modelo Actor. Según la wikipedia (versión inglesa) el modelo Actor es: un modelo matemático de computación concurrente que trata a los &#8220;actores&#8221; como las primitivas universales de la computación concurrente digital: en respuesta a mensajes que recibe, un actor puede tomar decisiones locales, crear más actores, enviar más mensajes y determinar cuando responder al siguiente mensaje recibido.</p>
<p>En este artículo me gustaría centrarme en <a href="http://celluloid.github.com/">Celluloid</a>, un framework del modelo Actor para Ruby. Este framework nos permite tratar las instancias de los objetos como procesos autónomos, concurrentes, que atienden peticiones y mantienen su memoria, sin posibilidad de que pueda ser corrompida por dos mensajes simultáneos.</p>
<p>Un ejemplo de código de la propia página web, haciendo alusión al <em>actor</em>&#8230; vamos a castellanizarlo un poco:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Bardem
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Celluloid::Actor</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>nombre<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@nombre</span> = nombre
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> pon_estado<span style="color:#006600; font-weight:bold;">&#40;</span>estado<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@estado</span> = estado
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> informa
    <span style="color:#996600;">&quot;#{@nombre} está #{@estado}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Para poder probarlo necesitamos de un entorno de pruebas que nos permita la ejecución de este código. Yo suelo usar <em>rvm</em> para poder instalar entornos de ruby de forma cómoda y poder probarlos, por lo que, solo hay que poner en consola:</p>
<pre>
rvm install 1.9.2-celluloid
rvm use 1.9.2-celluloid
gem install celluloid
</pre>
<p><strong>IMPORTANTE</strong>: tener presente que Celluloid solo funciona en JRuby en modo 1.9, en Rubinius y en Ruby a partir de la versión 1.9.2, ya que las anteriores no tienen hilos de estado concurrente real.</p>
<p>En una consola de <em>irb</em>, se podría ejecutar lo siguiente:</p>
<pre>
ruby-1.9.2-p180 :001 > require "celluloid"
 => true
ruby-1.9.2-p180 :002 > require "./bardem.rb"
 => true
ruby-1.9.2-p180 :003 > javier = Bardem.spawn "Javier Bardem"
 => #<Celluloid::Actor(Bardem:0x7959dc) @nombre="Javier Bardem">
ruby-1.9.2-p180 :004 > javier.pon_estado "ha ganado!"
 => "ha ganado!"
ruby-1.9.2-p180 :005 > javier.informa
 => "Javier Bardem ha ganado!"
ruby-1.9.2-p180 :006 > javier.pon_estado! "gana asincronamente!"
 => nil
ruby-1.9.2-p180 :007 > javier.informa
 => "Javier Bardem gana asincronamente!"
</pre>
<p>Cuando se llama a <em>spawn</em> se crea el objeto dentro de su propio hilo. El paso de mensajes se realiza usando el manejador del actor específico (<em>javier</em> en este caso) y se puede pasar un mensaje de forma síncrona (esperando su resultado) o de forma asíncrona (con la exclamación) sin esperar a que retorne nada.</p>
<h3>Supervisores</h3>
<p>Los supervisores, son procesos que se encargan de supervisar que un proceso está levantado y funcionando (como los monitores), pudiendo reiniciarlos cada vez que se caen. Por ejemplo, podemos crear un supervisor del ejemplo anterior de la siguiente forma:</p>
<pre>
ruby-1.9.2-p180 :008 > penelope = Bardem.supervise "Javier Bardem"
 => #<Celluloid::Supervisor(Bardem) "Javier Bardem">
ruby-1.9.2-p180 :009 > javier = penelope.actor
 => #<Celluloid::Actor(Bardem:0x73bc20) @nombre="Javier Bardem">
</pre>
<p>Así, creamos un supervisor (<em>penelope</em>) que supervisa al actor <em>Javier Bardem</em>. También podemos asignar un nombre al actor, de modo que:</p>
<pre>
ruby-1.9.2-p180 :011 > Bardem.supervise_as :javier, "Javier Bardem"
 => #<Celluloid::Supervisor(Bardem) "Javier Bardem">
ruby-1.9.2-p180 :012 > javier = Celluloid::Actor[:javier]
 => #<Celluloid::Actor(Bardem:0x726118) @nombre="Javier Bardem">
</pre>
<p>De modo que el símbolo <em>:javier</em> se relacione con el proceso y pueda emplearse en lugar de <em>Javier Bardem</em>, cuando se realice una llamada.</p>
<h3>Enlazado</h3>
<p>Si se sucediese una excepción no manejada en cualquiera de los métodos del actor, ese actor se caería y moriría. Vamos a poner un ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> JamesDean
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Celluloid::Actor</span>
  <span style="color:#9966CC; font-weight:bold;">class</span> CarInMyLaneError <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#CC00FF; font-weight:bold;">StandardError</span>; <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> drive_little_bastard
    <span style="color:#CC0066; font-weight:bold;">raise</span> CarInMyLaneError, <span style="color:#996600;">&quot;that guy's gotta stop. he'll see us&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ahora, vamos a poner a James en el coche Little Bastard conduciendo y veamos que sucede:</p>
<pre>

ruby-1.9.2-p180 :001 > require "celluloid"
 => true
ruby-1.9.2-p180 :002 > require "./james_dean.rb"
 => true
ruby-1.9.2-p180 :003 > james = JamesDean.spawn
 => #<Celluloid::Actor(JamesDean:0x8ec024)>
ruby-1.9.2-p180 :004 > james.drive_little_bastard!
 => nil
E, [2011-10-05T17:54:33.582990 #3929] ERROR -- : JamesDean crashed!
JamesDean::CarInMyLaneError: that guy's gotta stop. he'll see us
/home/marubio/tmp/james_dean.rb:6:in `drive_little_bastard'
[...]
ruby-1.9.2-p180 :005 > james
 => #<Celluloid::Actor(JamesDean:0x8ec024) dead>
</pre>
<p>Cuando le dijimos a <em>james</em> de forma asíncrona que condujese Little Bastard, ¡lo mató! Si fuésemos Elizabeth Taylor, co-protagonista de la última película al tiempo de su muerte, querríamos saber cuando murió. ¿Cómo podemos hacer eso? Enlazando a los actores que estén interesados en las caídas de otros actores. Para recibir estos eventos, necesitamos usar el método <em>trap_exit</em>. Un ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ElizabethTaylor
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Celluloid::Actor</span>
  trap_exit <span style="color:#ff3333; font-weight:bold;">:actor_died</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> actor_died<span style="color:#006600; font-weight:bold;">&#40;</span>actor, reason<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Oh no! #{actor.inspect} ha muerto por #{reason.class}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Por lo que al ejecutar lo siguiente, obtenemos:</p>
<pre>

ruby-1.9.2-p180 :001 > require "celluloid"
 => true
ruby-1.9.2-p180 :002 > require "./james_dean.rb"
 => true
ruby-1.9.2-p180 :003 > require "./elizabeth_taylor.rb"
 => true
ruby-1.9.2-p180 :004 > james = JamesDean.spawn
 => #<Celluloid::Actor(JamesDean:0xcaa38c)>
ruby-1.9.2-p180 :005 > elizabeth = ElizabethTaylor.spawn
 => #<Celluloid::Actor(ElizabethTaylor:0xca43b0)>
ruby-1.9.2-p180 :006 > elizabeth.link james
 => #<Celluloid::Actor(JamesDean:0xcaa38c)>
ruby-1.9.2-p180 :007 > james.drive_little_bastard!
 => nil
E, [2011-10-06T11:26:31.659461 #8552] ERROR -- : JamesDean crashed!
JamesDean::CarInMyLaneError: that guy's gotta stop. he'll see us
ruby-1.9.2-p180 :008 > Oh no! #<Celluloid::Actor(JamesDean:0xcaa38c) dead> ha muerto por JamesDean::CarInMyLaneError
</pre>
<p>Como vemos, Elizabeth es notificada inmediatamente a través del <em>trap</em>, permitiéndole reaccionar ante la caída de James. Pero también podríamos querer lanzar un objeto y enlazarlo al mismo tiempo.</p>
<h3>Conclusiones</h3>
<p>El resto del tutorial (en inglés) se encuentra en la página oficial de <a href="http://celluloid.github.com/">Celluloid</a>, donde se mencionan otras formas de enlazado, registro y logs. Yo me quedo en este punto, porque creo que ha sido suficiente para adentar la programación de Modelo Actor al lenguaje Ruby. Espero que os sirva para resolver algún que otro problema de programación en el que usualmente se empleen semáforos, monitores o memoria compartida.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/06/celluloid-concurrencia-en-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby: reescritura y yield</title>
		<link>http://bosqueviejo.net/2011/03/24/ruby-reescritura-y-yield/</link>
		<comments>http://bosqueviejo.net/2011/03/24/ruby-reescritura-y-yield/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 12:32:54 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[progrmación orientada a objetos]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=625</guid>
		<description><![CDATA[ Durante unas pruebas en el trabajo, enseñando a mi mujer (Marga), cómo funciona Ruby con su mayor potencia, la reescritura de código y los yield, pensé&#8230; con lo que me ha costado&#8230; mejor lo guardo en el blog&#8230; y esto es  
Orientación a Objetos, no a Clases
Teniendo en cuenta de que Ruby es un lenguaje orientado a objetos (y no a clases), huelga decir que, no solo se puede redefinir una clase (es decir, el objeto plantilla del que se generan otros objetos), sino que también se puede redefinir un objeto instanciado sin que afecte al resto de objetos del mismo tipo.
Sobre la orientación a objetos de Ruby, vamos a hacer este simple ejercicio desde irb para que se pueda ver algo más claro:

class A
end
&#160;
a = A.new
&#160;
a.class   # A
A.class  # Class
Class.class # Class

Como se puede ver, el objeto a es de tipo A, el objeto (que no clase) A es de tipo Class, y el objeto (que tampoco clase) Class es recursivo en sí mismo, ya que Class es el tipo raíz del que parten todos los objetos&#8230; como en Java lo es Object.
Reescribiendo Clases
Una de las mayores potencias de Ruby, es que una clase [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/images1-150x150.jpg" alt="" title="ruby" width="150" height="150" class="alignleft size-thumbnail wp-image-626" /> Durante unas pruebas en el trabajo, enseñando a mi mujer (Marga), cómo funciona Ruby con su mayor potencia, la reescritura de código y los <em>yield</em>, pensé&#8230; <em>con lo que me ha costado&#8230; mejor lo guardo en el blog</em>&#8230; y esto es <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Orientación a Objetos, no a Clases</h3>
<p>Teniendo en cuenta de que Ruby es un lenguaje orientado a objetos (y no a clases), huelga decir que, no solo se puede redefinir una clase (es decir, el objeto plantilla del que se generan otros objetos), sino que también se puede redefinir un objeto instanciado sin que afecte al resto de objetos del mismo tipo.</p>
<p>Sobre la orientación a objetos de Ruby, vamos a hacer este simple ejercicio desde <em>irb</em> para que se pueda ver algo más claro:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> A
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
a = A.<span style="color:#9900CC;">new</span>
&nbsp;
a.<span style="color:#9966CC; font-weight:bold;">class</span>   <span style="color:#008000; font-style:italic;"># A</span>
A.<span style="color:#9966CC; font-weight:bold;">class</span>  <span style="color:#008000; font-style:italic;"># Class</span>
<span style="color:#9966CC; font-weight:bold;">Class</span>.<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#008000; font-style:italic;"># Class</span></pre></div></div>

<p>Como se puede ver, el objeto <em>a</em> es de tipo <em>A</em>, el objeto (que no clase) A es de tipo <em>Class</em>, y el objeto (que tampoco clase) Class es recursivo en sí mismo, ya que <em>Class</em> es el tipo raíz del que parten todos los objetos&#8230; como en Java lo es Object.</p>
<h3>Reescribiendo Clases</h3>
<p>Una de las mayores potencias de Ruby, es que una clase definida, se puede redefinir, ya sea para cambiar un comportamiento específico, o para agregarle mayor funcionalidad. Esto de cara a la programación orientada a objetos, es una aberración, realmente, porque rompe la encapsulación&#8230; peeeero, de cara al pragmatismo, es muy útil poder modificar un comportamiento general para adaptarlo a uno específico sin necesidad de tener que reescribir de qué clase se hereda.</p>
<p>Haciendo una prueba:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> A
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
a = A.<span style="color:#9900CC;">new</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> a    <span style="color:#008000; font-style:italic;"># #&lt;A:0x000000000000&gt;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> A
  <span style="color:#9966CC; font-weight:bold;">def</span> to_s
    <span style="color:#996600;">&quot;Clase A&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> a    <span style="color:#008000; font-style:italic;"># Clase A</span>
&nbsp;
b = A.<span style="color:#9900CC;">new</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> b
  <span style="color:#9966CC; font-weight:bold;">def</span> to_s
    <span style="color:#996600;">&quot;objeto b&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> b    <span style="color:#008000; font-style:italic;"># objeto b</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> a    <span style="color:#008000; font-style:italic;"># Clase A</span></pre></div></div>

<p>Con esto se puede comprobar, que la redefinición de métodos se puede conseguir, tanto para objetos como para clases.</p>
<h3>Y ahora&#8230; el yield</h3>
<p>Otra de las potencias de Ruby es que, podemos definir un código, dejando una definición <em>a medias</em> para poder ampliarla en el momento el que sea llamada, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> ordena<span style="color:#006600; font-weight:bold;">&#40;</span> vector <span style="color:#006600; font-weight:bold;">&#41;</span>
     <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span>..<span style="color:#006600; font-weight:bold;">&#40;</span>vector.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
         k = i
         <span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span>..<span style="color:#006600; font-weight:bold;">&#40;</span>vector.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>j<span style="color:#006600; font-weight:bold;">|</span>
             k=j <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#9966CC; font-weight:bold;">yield</span><span style="color:#006600; font-weight:bold;">&#40;</span>vector<span style="color:#006600; font-weight:bold;">&#91;</span>k<span style="color:#006600; font-weight:bold;">&#93;</span>, vector<span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
         <span style="color:#9966CC; font-weight:bold;">end</span>
         <span style="color:#9966CC; font-weight:bold;">if</span> k!=i
             tmp = vector<span style="color:#006600; font-weight:bold;">&#91;</span>k<span style="color:#006600; font-weight:bold;">&#93;</span>
             vector<span style="color:#006600; font-weight:bold;">&#91;</span>k<span style="color:#006600; font-weight:bold;">&#93;</span> = vector<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>
             vector<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> = tmp
         <span style="color:#9966CC; font-weight:bold;">end</span>
     <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
vector = <span style="color:#006600; font-weight:bold;">&#91;</span> <span style="color:#006666;">5</span>, <span style="color:#006666;">3</span>, <span style="color:#006666;">2</span>, <span style="color:#006666;">4</span>, <span style="color:#006666;">6</span>, <span style="color:#006666;">1</span> <span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
ordena<span style="color:#006600; font-weight:bold;">&#40;</span>vector<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>e1, e2<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#006600; font-weight:bold;">&#40;</span>e1 <span style="color:#006600; font-weight:bold;">&gt;</span> e2<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> vector  <span style="color:#008000; font-style:italic;"># [1, 2, 3, 4, 5, 6]</span>
&nbsp;
ordena<span style="color:#006600; font-weight:bold;">&#40;</span>vector<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>e1, e2<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#006600; font-weight:bold;">&#40;</span>e1 <span style="color:#006600; font-weight:bold;">&lt;</span> e2<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> vector  <span style="color:#008000; font-style:italic;"># [6, 5, 4, 3, 2, 1]</span></pre></div></div>

<p>En este ejemplo de código, la función <em>yield</em> no está definida, sino que equivale al bloque de código que se especifica más tarde, cuando se llama a la función ordena, en el caso mostrado, es como si las funciones <em>yield</em> fuesen en el primer caso:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#9966CC; font-weight:bold;">yield</span><span style="color:#006600; font-weight:bold;">&#40;</span>e1, e2<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#006600; font-weight:bold;">&#40;</span>e1 <span style="color:#006600; font-weight:bold;">&gt;</span> e2<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Y en el segundo caso, exactamente igual pero cambiando la comparación para que la ordenación sea en sentido descendente.</p>
<p>La definición del código es in-situ, en el momento de usarse es cuando se especifica qué hace <em>yield</em>.</p>
<p>Se puede hacer algo más complejo, por ejemplo, cambiando el array de enteros por un array de objetos específicos que tengan una comparación algo más complicada. Aún así, el código de <em>ordena</em> no habría que cambiarlo. Solo la llamada, y su bloque adjunto.</p>
<h3>Conclusiones</h3>
<p>Para los que no conozcan bien Ruby, esto les habrá sonado a chino, para los que lo conozcan bien, quizás algo ya más que sabido, pero lo importante, es que se tenga claro el concepto y lo que se puede hacer, ya que, la necesidad, de seguro, surgirá después.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/03/24/ruby-reescritura-y-yield/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>Banco de Pruebas (I): velocidad</title>
		<link>http://bosqueviejo.net/2010/11/15/banco-de-pruebas-i-velocidad/</link>
		<comments>http://bosqueviejo.net/2010/11/15/banco-de-pruebas-i-velocidad/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 15:33:20 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lenguaje c]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shell script]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=536</guid>
		<description><![CDATA[Hace tiempo hice algo parecido con los lenguajes de programación que entonces conocía, probando aquellos que eran de scripting, compilados y probando sobretodo, lo que tardan en levantar y hacer una operación tan simple como enumerar 100.000 números sacando por pantalla el número con un elevado a 2 de la posición en el que sale la impresión. Por ejemplo:

Hola 1
Hola 4
Hola 9
Hola 16
...

He realizado las pruebas en los lenguajes: C, Perl, Ruby, Python, PHP, Lua, Shell script, Erlang script y Java.
C
En lenguaje C se ha realizado el siguiente código:

#include &#60;stdio.h&#62;
&#160;
main&#40;&#41; &#123;
        int i;
&#160;
        for &#40;i=0; i&#60;100000; i++&#41; &#123;
                printf&#40;&#34;Hola %d\n&#34;, i*i&#41;;
        &#125;
&#125;

Perl
En el lenguaje Perl, se ha implementado el código siguiente:

#!/usr/bin/perl
&#160;
for &#40;$i=0; $i&#60;100000; $i++&#41; &#123;
        print &#34;Hola &#34; . &#40;$i*$i&#41; . &#34;\n&#34;;
&#125;

Ruby
En Ruby, el código escrito ha sido:

#!/usr/bin/ruby
&#160;
&#40;1..100000&#41;.each do &#124;i&#124;
        puts &#34;hola &#34; + &#40;i*i&#41;.to_s
end

Python
En Python, el código ha sido:

#!/usr/bin/python
&#160;
for i in range&#40;1,1000000&#41;:
        [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo hice algo parecido con los lenguajes de programación que entonces conocía, probando aquellos que eran de scripting, compilados y probando sobretodo, lo que tardan en levantar y hacer una operación tan simple como enumerar 100.000 números sacando por pantalla el número con un elevado a 2 de la posición en el que sale la impresión. Por ejemplo:</p>
<pre>
Hola 1
Hola 4
Hola 9
Hola 16
...
</pre>
<p>He realizado las pruebas en los lenguajes: C, Perl, Ruby, Python, PHP, Lua, Shell script, Erlang script y Java.</p>
<h3>C</h3>
<p>En lenguaje C se ha realizado el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">100000</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hola %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">*</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Perl</h3>
<p>En el lenguaje Perl, se ha implementado el código siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Hola &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$i</span><span style="color: #0000ff;">*$i</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Ruby</h3>
<p>En Ruby, el código escrito ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/ruby</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span>..<span style="color:#006666;">100000</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;hola &quot;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">*</span>i<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_s</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3>Python</h3>
<p>En Python, el código ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">1000000</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Hola &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: #66cc66;">*</span>i<span style="color: black;">&#41;</span></pre></div></div>

<h3>PHP</h3>
<p>En PHP el código escrito ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">#!/usr/bin/php -q
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Hola &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">*</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</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: #009900;">&#125;</span></pre></div></div>

<h3>Lua</h3>
<p>El código de Lua escrito ha sido:</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="lua" style="font-family:monospace;">#<span style="color: #66cc66;">!/</span>usr<span style="color: #66cc66;">/</span>bin<span style="color: #66cc66;">/</span>lua
&nbsp;
<span style="color: #b1b100;">for</span> i<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">100000</span> <span style="color: #b1b100;">do</span>
        <span style="color: #b1b100;">print</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Hola &quot;</span> .. <span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">*</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span></pre></div></div>

<h3>Shell script</h3>
<p>En shell script (en bash) se ha implementado lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">1</span> <span style="color: #000000;">100000</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>; <span style="color: #000000; font-weight: bold;">do</span>
        <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">RESULT</span>=<span style="color: #007800;">$i</span><span style="color: #000000; font-weight: bold;">*</span><span style="color: #007800;">$i</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Hola <span style="color: #007800;">$RESULT</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h3>Erlang (Script)</h3>
<p>Erlang también puede emplearse como lenguaje de scripting usando el intérprete <em>escript</em>. El código escrito para este intérprete ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;">#<span style="color: #014ea4;">!/</span>usr<span style="color: #014ea4;">/</span>bin<span style="color: #014ea4;">/</span>escript
&nbsp;
<span style="color: #ff3c00;">main</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">_Args</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
        <span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">100000</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">I</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
        <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;Hola ~p~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">I</span><span style="color: #014ea4;">*</span><span style="color: #45b3e6;">I</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
        <span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">I</span><span style="color: #014ea4;">-</span><span style="color: #ff9600;">1</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<h3>Java</h3>
<p>El código que se ha usado para la prueba de Java ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> loop <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Hola &quot;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">*</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Resultado de las pruebas</h3>
<p>Tras ejecutar 5 veces cada script, controlando el tiempo que toma cada uno hemos obtenido, según el equipo en el que se ha ejecutado. El equipo 1 es un Intel vPro con Debian GNU/Linux Lenny:</p>
<table>
<tr>
<th rowspan="2">Lenguaje</th>
<th colspan="5">Ejecuciones (en segundos) (Equipo 1)</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
<tr>
<th>C (4.1.3)</th>
<td> 0,02</td>
<td> 0,02</td>
<td> 0,02</td>
<td> 0,02</td>
<td> 0,02</td>
</tr>
<tr>
<th>Perl (5.10.0)</th>
<td> 0,04</td>
<td> 0,03</td>
<td> 0,03</td>
<td> 0,03</td>
<td> 0,03</td>
</tr>
<tr>
<th>Ruby (1.8.7-p72)</th>
<td> 0,16</td>
<td> 0,15</td>
<td> 0,16</td>
<td> 0,16</td>
<td> 0,15</td>
</tr>
<tr>
<th>Lua (5.1.3)</th>
<td> 0,21</td>
<td> 0,22</td>
<td> 0,21</td>
<td> 0,21</td>
<td> 0,21</td>
</tr>
<tr>
<th>PHP (5.3.1)</th>
<td> 0,41</td>
<td> 0,47</td>
<td> 0,43</td>
<td> 0,33</td>
<td> 0,29</td>
</tr>
<tr>
<th>Python (2.6.5)</th>
<td> 1,13</td>
<td> 1,11</td>
<td> 1,15</td>
<td> 1,16</td>
<td> 1,14</td>
</tr>
<tr>
<th>Java (1.6.0_20-b02)</th>
<td> 1,37</td>
<td> 1,39</td>
<td> 1,40</td>
<td> 1,36</td>
<td> 1,34</td>
</tr>
<tr>
<th>Erlang (R13B04, 5.7.5)</th>
<td> 3,65</td>
<td> 3,62</td>
<td> 3,65</td>
<td> 3,65</td>
<td> 3,56</td>
</tr>
<tr>
<th>Bash (3.2.39)</th>
<td> 7,27</td>
<td> 7,26</td>
<td> 7,46</td>
<td> 7,40</td>
<td> 7,25</td>
</tr>
</table>
<p>En el equipo 2, un Apple iBook G4 (PowerPC):</p>
<table>
<tr>
<th rowspan="2">Lenguaje</th>
<th colspan="5">Ejecuciones (en segundos) (Equipo 2)</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
<tr>
<th>C (4.0.1)</th>
<td>0,22</td>
<td>0,34</td>
<td>0,55</td>
<td>0,32</td>
<td>0,35</td>
</tr>
<tr>
<th>Perl (5.8.9)</th>
<td>0,67</td>
<td>0,83</td>
<td>0,68</td>
<td>0,68</td>
<td>0,78</td>
</tr>
<tr>
<th>Ruby (1.8.6-p386)</th>
<td>2,91</td>
<td>3,21</td>
<td>3,20</td>
<td>3,13</td>
<td>3,52</td>
</tr>
<tr>
<th>Lua (5.1.4)</th>
<td>1,51</td>
<td>1,64</td>
<td>1,64</td>
<td>1,65</td>
<td>2,43</td>
</tr>
<tr>
<th>PHP (5.2.14)</th>
<td>2,51</td>
<td>2,48</td>
<td>2,55</td>
<td>2,37</td>
<td>2,77</td>
</tr>
<tr>
<th>Python (2.5.1)</th>
<td>17,49</td>
<td>16,91</td>
<td>17,41</td>
<td>17,40</td>
<td>16,92
<td></tr>
<tr>
<th>Java (1.5.0_26-156)</th>
<td>7,60</td>
<td>5,92</td>
<td>5,72</td>
<td>5,90</td>
<td>6,02
<td></tr>
<tr>
<th>Erlang (R14A, 5.8)</th>
<td>22,10</td>
<td>23,13</td>
<td>22,76</td>
<td>21,94</td>
<td>21,80
<td></tr>
<tr>
<th>Bash (4.1.9)</th>
<td>135,19</td>
<td>223,56</td>
<td>181,40</td>
<td>136,19</td>
<td>133,46
<td></tr>
</table>
<p>Ordenados por velocidad, se ve que el lenguaje C, como cabía esperar, es el más rápido, seguido de Perl, como el lenguaje de scripting más rápido.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/11/15/banco-de-pruebas-i-velocidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¡Shoes vive!</title>
		<link>http://bosqueviejo.net/2010/04/14/shoes-vive/</link>
		<comments>http://bosqueviejo.net/2010/04/14/shoes-vive/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 08:36:24 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shoes]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=392</guid>
		<description><![CDATA[ Hace tiempo escribí una entrada sobre este entorno de programación para GUI de Ruby, desde ahí a unos meses después, el creador del entorno, denominado why en la red, cerró todo su material en la red, eliminó su twitter, sus webs y dominios, eliminó sus códigos de github, etc.
Después de esta acción, shoes murió&#8230; era muy complicado encontrar un sistema shoes que funcionase y se compilase con las nuevas versiones de ruby, así como un tutorial tan completo como el que tenía why en su propia página web.
No obstante, en este mismo año, mental y más gente en la red, ha ido recopilando de las cachés y de lo que guardaban entre unos y otros y, amparándose en las licencias con las que fueron publicadas cada cosa, han vuelto a poner, eso sí, en otros enlaces distintos, cada una de las cosas que why dió de baja de Internet (salvo su twitter, claro).
La nueva web: http://hacketyhack.heroku.com
El código fuente se puede descargar de aquí.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/shoes-icon.png" alt="" title="shoes-icon" width="128" height="128" class="alignleft size-full wp-image-419" /> Hace tiempo <a href="http://bosqueviejo.net/2009/05/18/shoes-programacion-facil-de-gui-en-ruby/">escribí una entrada</a> sobre este entorno de programación para GUI de Ruby, desde ahí a unos meses después, el creador del entorno, denominado <em>why</em> en la red, cerró todo su material en la red, eliminó su twitter, sus webs y dominios, eliminó sus códigos de github, etc.</p>
<p>Después de esta acción, shoes <em>murió</em>&#8230; era muy complicado encontrar un sistema shoes que funcionase y se compilase con las nuevas versiones de ruby, así como un tutorial tan completo como el que tenía <em>why</em> en su propia página web.</p>
<p>No obstante, en este mismo año, <em>mental</em> y más gente en la red, ha ido recopilando de las cachés y de lo que guardaban entre unos y otros y, amparándose en las licencias con las que fueron publicadas cada cosa, han vuelto a poner, eso sí, en otros enlaces distintos, cada una de las cosas que <em>why</em> dió de baja de Internet (salvo su twitter, claro).</p>
<p>La nueva web: <a href="http://hacketyhack.heroku.com">http://hacketyhack.heroku.com</a></p>
<p>El código fuente se puede descargar de <a href="http://github.com/shoes/shoes">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/04/14/shoes-vive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programando en Ruby</title>
		<link>http://bosqueviejo.net/2010/03/11/programando-en-ruby/</link>
		<comments>http://bosqueviejo.net/2010/03/11/programando-en-ruby/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 09:40:06 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=358</guid>
		<description><![CDATA[Llevo tiempo escribiendo sobre este lenguaje de programación, como una joya redescubierta, ahora me gustaría centrarme en un libro que leí hace tiempo, pero que me resultó muy útil para comprender y adentrarme mejor en este lenguaje.
Este libro, escrito por uno de los firmantes del manifiesto ágil (Dave Thomas) y otro de ellos como co-autor (Andy Hunt), es un libro que tiene en su interior, no solo el aprendizaje del lenguaje en sí, sino de una metodología de programación, una suma de buenas prácticas de programación que se orientan a sacar el mejor partido del lenguaje potenciando sus fortalezas y aprovechándolas con patrones de desarrollo ágiles que mejoran y potencian su uso.
Recomiendo el libro a todos aquellos que quieran adentrarse en la programación en ruby de la mano de personas que desarrollan día a día con él desde hace mucho tiempo, y no se han quedado estancadas (prueba de ello es que este libro es segunda edición y en 2008 salió la tercera edición, el cual no he podido leer aún, pero promete mayor y mejor contenido).
]]></description>
			<content:encoded><![CDATA[<p>Llevo tiempo escribiendo sobre este lenguaje de programación, como una <a href="http://bosqueviejo.net/2009/01/13/ruby-esa-pequena-joya/">joya</a> redescubierta, ahora me gustaría centrarme en un libro que leí hace tiempo, pero que me resultó muy útil para comprender y adentrarme mejor en este lenguaje.</p>
<div style="float:left;padding-right:10px;padding-bottom:10px;"><a href='http://openlibrary.org/books/OL12341394M/Programming_Ruby' ><img src='http://covers.openlibrary.org/b/id/3064517-M.jpg' alt='Programming Ruby' title='View this title in Open Library' /></a></div><div style="font-size:18px;font-weight:bold;"><a href='http://openlibrary.org/books/OL12341394M/Programming_Ruby' title='View this title in Open Library' >Programming Ruby: The Pragmatic Programmers&#039; Guide</a></div><div style="font-size:14px;">; Pragmatic Bookshelf 2008</div><div style="font-size:10px;"><a href="http://worldcat.org/isbn/9781934356081" title="View this title at WorldCat">WorldCat</a>&#8226;<a href="http://www.librarything.com/work/1044275" title="View this title at LibraryThing">LibraryThing</a>&#8226;<a href="http://books.google.com/books?as_isbn=9781934356081" title="View this title at Google Books">Google Books</a>&#8226;<a href="http://www.bookfinder.com/search/?st=xl&ac=qr&isbn=9781934356081" title="Search for the best price at BookFinder">BookFinder</a></div><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fbosqueviejo.net%3AOpenBook&amp;rft.genre=book&amp;rft.btitle=Programming+Ruby&amp;rft.isbn=9781934356081&amp;rft.au=&amp;rft.pub=Pragmatic+Bookshelf&amp;rft.date=May+15%2C+2008&amp;rft.tpages=900">&nbsp;</span><p>
<p>Este libro, escrito por uno de los firmantes del manifiesto ágil (<a href="http://en.wikipedia.org/wiki/Dave_Thomas_(programmer)">Dave Thomas</a>) y otro de ellos como co-autor (<a href="http://en.wikipedia.org/wiki/Andy_Hunt_(author)">Andy Hunt</a>), es un libro que tiene en su interior, no solo el aprendizaje del lenguaje en sí, sino de una metodología de programación, una suma de buenas prácticas de programación que se orientan a sacar el mejor partido del lenguaje potenciando sus fortalezas y aprovechándolas con patrones de desarrollo ágiles que mejoran y potencian su uso.</p>
<p>Recomiendo el libro a todos aquellos que quieran adentrarse en la programación en ruby de la mano de personas que desarrollan día a día con él desde hace mucho tiempo, y no se han quedado estancadas (prueba de ello es que este libro es segunda edición y en 2008 salió la tercera edición, el cual no he podido leer aún, pero promete mayor y mejor contenido).</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/03/11/programando-en-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

