<?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>Wed, 08 Feb 2012 10:14:54 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>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"></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>
		<item>
		<title>Los sectores del software</title>
		<link>http://bosqueviejo.net/2010/01/07/los-sectores-del-software/</link>
		<comments>http://bosqueviejo.net/2010/01/07/los-sectores-del-software/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 09:25:22 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=217</guid>
		<description><![CDATA[ De siempre, se va viendo que las empresas de software se decantan por una forma de hacer las cosas, mientras que otras eligen otro camino distinto y, muy pocas, mezclan elementos de doctrinas tan establecidas y dogmáticas como son: el mundo del software libre, el mundo java o el mundo .net.
El mundo .NET
Como todo lo que tiene que ver con Microsoft, el mundo .NET se mueve, casi exclusivamente, con productos y herramientas desarrolladas por esta misma compañía. Funciona sobre Windows, con base de datos de Microsoft y se diseña con herramientas de Microsoft.
Lo bueno de Microsoft es que desarrollan los productos para un público general y sin conocimientos extensos. Los lenguajes suelen ser o muy fáciles (Visual Basic) o muy complejos (C++, C#), pero cumplen con todas las necesidades de los programadores a los que van dirigidas las herramientas. Así mismo, tienen un alto nivel de operatibilidad entre los diferentes productos, es decir, escribir código ASP con SQL Server es simple, gracias a ese nivel de compactación y simplificación.
Lo bueno de la simplificación lleva a lo malo de la complejidad también. Un programa que se hace de forma simple y fácil, siguiendo los pasos que Microsoft ha pensado para [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://bosqueviejo.net/wp-content/uploads/sectores.png"><img src="http://bosqueviejo.net/wp-content/uploads/sectores.png" alt="" title="sectores" width="180" class="alignleft size-full wp-image-218" /></a> De siempre, se va viendo que las empresas de software se decantan por una forma de hacer las cosas, mientras que otras eligen otro camino distinto y, muy pocas, mezclan elementos de doctrinas tan establecidas y dogmáticas como son: el mundo del software libre, el mundo java o el mundo .net.</p>
<h3>El mundo .NET</h3>
<p>Como todo lo que tiene que ver con Microsoft, el mundo .NET se mueve, casi exclusivamente, con productos y herramientas desarrolladas por esta misma compañía. Funciona sobre Windows, con base de datos de Microsoft y se diseña con herramientas de Microsoft.</p>
<p>Lo bueno de Microsoft es que desarrollan los productos para un público general y sin conocimientos extensos. Los lenguajes suelen ser o muy fáciles (Visual Basic) o muy complejos (C++, C#), pero cumplen con todas las necesidades de los programadores a los que van dirigidas las herramientas. Así mismo, tienen un alto nivel de operatibilidad entre los diferentes productos, es decir, escribir código ASP con SQL Server es simple, gracias a ese nivel de compactación y simplificación.</p>
<p>Lo bueno de la simplificación lleva a lo malo de la complejidad también. Un programa que se hace de forma simple y fácil, siguiendo los pasos que Microsoft ha pensado para dar es simple, sencillo y rápido. Pero cuando la aplicación debe tener una forma específica o salirse un poco del camino típico, comienzan a surgir problemas solo saldables con código complejo.</p>
<p>Ximian, absorbida por Novell, ha realizado muchas aproximaciones a este mundo para portarlo al mundo del software libre a través de su escritorio Gnome y su proyecto Mono. No obstante, es un tema un poco espinoso, ya que quien usa software libre, por lo general, se aleja de las tecnologías propuestas por esta gran multinacional, por lo que, aunque es usada y tiene su cuota de mercado, Mono no llega a ser usado tanto como podría esperarse.</p>
<h3>El mundo Java</h3>
<p>El mundo de Java ha estado siempre en una lucha constante y abriéndose camino en el desarrollo de software, sin mucho éxito al principio, sobre todo en lo que respecta a las aplicaciones de escritorio. Esto fue debido a su naturaleza de pseudo-compilación y pseudo-interpretación, ya que es un lenguaje compilado e interpretado que se ejecuta sobre una máquina virtual, y las labores de interpretación de los bytecodes son algo costosos, en relación a código que se ejecuta de forma nativa.</p>
<p>No obstante, en la parte web, de interfaces, desde que comenzó, ha tenido una gran aceptación, puesto que permite el desarrollo de las aplicaciones en cualquier infraestructura (windows, linux, solaris, &#8230;) y se han desarrollado grandes herramientas para el desarrollo en este sentido.</p>
<p>Java siempre es el favorito y preferido de las consultoras (a menos en España), donde es empleado para el desarrollo de aplicaciones, tanto de escritorio como web en todos los sectores donde son contratados.</p>
<p>La mayoría de empresas que han tenido relación con Microsoft y han salido <em>de malas</em> con la grande, han terminado montándose al carro de Java y aportando a esta comunidad en modo de open source herramientas, conocimiento, etc. Además de Sun Microsystems (su fundadora), hay otras como IBM, RedHat, Oracle, etc. que se han sumado al carro de Java para el desarrollo y ampliación de esta comunidad.</p>
<p>Hay comunidades de software libre que se han sumado a la aportación de código para el mundo Java. Esto supongo que será erróneamente aportado como el <em>voto útil</em>, sin saber que en nada se beneficia al software libre en sí, sino solo al mundo Java que, aunque pueda parecer atractiva la idea de <em>luchar contra el tirano</em>, no es más que ayudar a una empresa a derrocar a otra. Esto puede ser muy discutible, sobre todo por los defensores de Java <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<h3>El mundo del software libre</h3>
<p>Al margen de la guerra entre .Net y Java, surgen los entornos, sistemas y elementos de software libre. Pensar que todo el mundo tiene que ser Java o .Net es un craso error, ya que hay muchos elementos que se pueden combinar a gusto propio del desarrollador y emplearlos como mejor convenga para obtener los mejores resultados para una tarea concreta.</p>
<p>A este respecto, una de las comunidades con más auge es la de desarrolladores de PHP, por ejemplo, que es el lenguaje que más proyectos de software libre tiene desarrollados, y es el más usado para el desarrollo de sitios como Facebook, Menéame, WordPress, etc.</p>
<p>Otra de las comunidades más activa en los entornos web es la de Ruby, Ruby on Rails más específicamente, que tiene un entorno fácil y profesional para el desarrollo rápido de sitios web. También Python, con su framework Django. Ambos presentes en el mundo Java a través de JRuby y Jython, respectivamente.</p>
<p>Entornos también desarrollados en lenguajes más específicos como Perl, Erlang, Tcl, etc. hacen que se complete el abanico de posibilidades para el desarrollo de software a través de las soluciones que aporta el software libre.</p>
<p>La nota negativa, es que los elementos no son altamente cooperativos, es decir, aunque se basan en estándares, normas y todos son abiertos, hay que realizar desarrollos para poder tener funcionando cosas entre unos y otros, debido a que en el software libre, no todo está hecho o viene dado fácilmente. Pero la nota positiva sobre esto, es que la dificultad que eso entraña es mucho menor que la que entrañaría el desarrollar algo no hecho o no pensado para hacerse, en Java o .Net.</p>
<h3>Conclusión</h3>
<p>En principio, no te quedes solo con uno, esto no son tres equipos a los que haya que <em>apoyar a muerte</em>, estas son tres formas de ver la tecnología y puede convenir cualquiera de las tres según el contexto en el que haya que ponerse.</p>
<p>Por ejemplo, en una empresa que se haya invertido en infraestructura y software Microsoft, se tenga todo montado en SQL Server, con ASP e interfaces desarrolladas en Visual Basic, desarrollar cualquier nueva ampliación o una nueva herramienta, cabe pensar que será siempre más fácil si nos ceñimos a lo ya establecido que si comenzamos a cambiar lo que hay.</p>
<p>Igualmente, en otra empresa en la que se haya realizado una inversión para Java, incluso con servidores Solaris, y bases de datos Oracle, no conviene pensar en desarrollar nada con Visual Basic, ni PHP, sino pensar en agregar más aplicaciones de tipo J2EE, que será lo más fácil de implementar.</p>
<p>Por último, en una empresa pequeña, con aspiraciones a crecer, que tengan todo desarrollado en PHP y MySQL, se podría cambiar a un framework de desarrollo para PHP, así como agregar elementos más complejos en caso de ser necesarios (como memcached).</p>
<p>En definitiva, no intentar cambiar lo que ya hay si funciona. Otro caso es que no funcione o que haya que realizar adaptaciones y se pueda aprovechar para agregar elementos más generales o estándares.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/01/07/los-sectores-del-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

