<?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; Noticias</title>
	<atom:link href="http://bosqueviejo.net/category/noticias/feed/" rel="self" type="application/rss+xml" />
	<link>http://bosqueviejo.net</link>
	<description>Sitio web sobre programación, software libre, redes, servidores, ofimática... y todo lo relacionado con la informática que nos rodea</description>
	<lastBuildDate>Sun, 22 Jan 2012 01:02:42 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>DynHost: nombres DNS para todos</title>
		<link>http://bosqueviejo.net/2011/11/26/dynhost-nombres-dns-para-todos/</link>
		<comments>http://bosqueviejo.net/2011/11/26/dynhost-nombres-dns-para-todos/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 00:40:46 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[bosqueviejo]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[dynhost]]></category>
		<category><![CDATA[phas-js]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1086</guid>
		<description><![CDATA[ Después de un par de semanas de trabajo, ya está disponible el sistema de DynHost, aún falta retocar algunas cosas, pero la base funciona.
El sistema se ha realizado empleando PHAS-JS como base para el actualizador automático, así como Django para la interfaz web.
Se ha copiado el protocolo de actualización de DynDNS, por lo que es compatible con scripts del tipo ddclient en linux, y otros que permitan cambiar el dominio base por el de dynhost.es.
Espero que os sea de utilidad.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/dynhost_logo-150x150.png" alt="" title="dynhost_logo" width="150" height="150" class="alignleft size-thumbnail wp-image-1087" /> Después de un par de semanas de trabajo, ya está disponible el sistema de <a href="http://dynhost.es"><em>DynHost</em></a>, aún falta retocar algunas cosas, pero la base funciona.<span id="more-1086"></span></p>
<p>El sistema se ha realizado empleando <a href="http://phas-js.org">PHAS-JS</a> como base para el actualizador automático, así como <a href="https://www.djangoproject.com/">Django</a> para la interfaz web.</p>
<p>Se ha copiado el protocolo de actualización de DynDNS, por lo que es compatible con scripts del tipo <em>ddclient</em> en linux, y otros que permitan cambiar el dominio base por el de <em>dynhost.es</em>.</p>
<p>Espero que os sea de utilidad.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/26/dynhost-nombres-dns-para-todos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHAS-JS: servidor de aplicaciones</title>
		<link>http://bosqueviejo.net/2011/11/16/phas-js-servidor-de-aplicaciones/</link>
		<comments>http://bosqueviejo.net/2011/11/16/phas-js-servidor-de-aplicaciones/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 12:05:03 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[phas-js]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1073</guid>
		<description><![CDATA[ Ayer, después de bastante tiempo de trabajo, al fin, conseguí liberar la primera versión estable de PHAS-JS, un servidor de aplicaciones JavaScript con base en PHP e interfaz de administración en Django.
¿Por qué tanta variedad?, en principio, he empleado PHP porque tiene todos los elementos básicos y necesarios para construir en poco tiempo la infraestructura que quería montar&#8230; pero igualmente, no quería que se mezclase el núcleo del programa con la interfaz de usuario, ya que sino, se tiende a confundir y enrarecer. En este caso, el único nexo de unión entre sistema e interfaz sería la base de datos.
Spidermonkey es un sistema probado desde hace mucho tiempo en navegadores como Firefox, donde se emplea JavaScript de forma segura, sin que interfiera ni dañe al resto de ejecuciones ni al propio núcleo del sistema, y por ende, tampoco al servidor ni elementos asociados a él. Por ello, el despliegue de aplicaciones es completamente seguro.
La interfaz, igualmente, se encarga de la gestión de la base de datos, tanto para la creación de la misma a través de las herramientas que incorpora Django.
Características
PHAS-JS se compone de cinco partes: entrada de datos, proceso, sesión, acceso a datos y salida de datos. Con [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/phas-js.jpeg" alt="" title="phas-js" width="150" height="150" class="alignleft size-full wp-image-1074" /> Ayer, después de bastante tiempo de trabajo, al fin, conseguí liberar la primera versión estable de PHAS-JS, un servidor de aplicaciones JavaScript con base en PHP e interfaz de administración en Django.<span id="more-1073"></span></p>
<p>¿Por qué tanta variedad?, en principio, he empleado PHP porque tiene todos los elementos básicos y necesarios para construir en poco tiempo la infraestructura que quería montar&#8230; pero igualmente, no quería que se mezclase el núcleo del programa con la interfaz de usuario, ya que sino, se tiende a confundir y enrarecer. En este caso, el único nexo de unión entre sistema e interfaz sería la base de datos.</p>
<p>Spidermonkey es un sistema probado desde hace mucho tiempo en navegadores como Firefox, donde se emplea JavaScript de forma segura, sin que interfiera ni dañe al resto de ejecuciones ni al propio núcleo del sistema, y por ende, tampoco al servidor ni elementos asociados a él. Por ello, el despliegue de aplicaciones es <strong>completamente seguro</strong>.</p>
<p>La interfaz, igualmente, se encarga de la gestión de la base de datos, tanto para la creación de la misma a través de las herramientas que incorpora Django.</p>
<h3>Características</h3>
<p>PHAS-JS se compone de cinco partes: entrada de datos, proceso, sesión, acceso a datos y salida de datos. Con respecto a estos elementos, se aportan las siguientes características:</p>
<ul>
<li><strong>Entrada de Datos</strong>: la entrada de datos, normalmente, se realizará mediante la parte de <em>query</em> de la URL, pero también puede incluirse en el cuerpo de la petición a modo POST. Igualmente, se puede realizar una entrada de datos de tipo SOAP.</li>
<li><strong>Proceso</strong>: el proceso se realiza a través de la ejecución de un código JavaScript almacenado en la base de datos interna del sistema.</li>
<li><strong>Sesión</strong>: la sesión es un espacio de información que se mantiene activo entre llamadas. Este espacio se puede almacenar en sesiones normales y corrientes de PHP, con lo que se pueden configurar con los mecanismos que soporta PHP para distribuir las sesiones en varias máquinas en caso de que se quiera, o el uso de la implementación específica de Memcache o MongoDB que se ha realizado y probado para ello.</li>
<li><strong>Acceso a Datos</strong>: a través de la interfaz, se puede habilitar, para los procesos, el uso de conexiones a base de datos específicas. Estos procesos accederán referenciando el nombre, nunca la forma de conexión completa.</li>
<li><strong>Salida de Datos</strong>: una vez se ha realizado el procesado, la ejecución del código, se retornan los datos ya sea mediante respuesta SOAP (únicamente si la entrada ha sido SOAP) o algún tipo de serialización que puede indicarse explícitamente, como: YAML, JSON, serialización de PHP, XML o en texto plano (salida print_r de PHP).</li>
</ul>
<p>Además, el sistema tiene caché a varios niveles:</p>
<ul>
<li>Caché explícita a nivel de petición: en caso de indicar entre los parámetros de entrada <em>cache</em>, el sistema activa la caché con el tiempo que se haya configurado. Con lo que las siguientes peticiones ya no saturarían al sistema o serían mucho más rápidas, en caso de que la petición en sí fuese costosa.</li>
<li>Caché a nivel de consulta: a través de una consulta en la función <em>dql</em> de DataAccess, se puede activar la caché por consulta, que hace que el propio proceso pueda emplear caché para las consultas individuales que realiza a la base de datos.</li>
</ul>
<h3>Futuro&#8230;</h3>
<p>Mientras desarrollaba esta versión iban surgiendo las ideas y las fui anotando en tickets que fueron a parar en lo que se ha convertido en el roadmap como la versión 1.1. Por lo que, en el futuro, el sistema tendrá una mejor integración con MongoDB, prubas unitarias en interfaz de administración y marcado de cuales son buenas para producción y cuales no, entornos de desarrollo, producción y test, además de otros que se quieran crear&#8230;</p>
<p>Espero que sea útil&#8230; aquí la web: <a href="http://phas-js.org">http://phas-js.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/16/phas-js-servidor-de-aplicaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: la elegancia</title>
		<link>http://bosqueviejo.net/2011/11/04/python-la-elegancia/</link>
		<comments>http://bosqueviejo.net/2011/11/04/python-la-elegancia/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 18:18:07 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1043</guid>
		<description><![CDATA[ Siempre he dicho que cada lenguaje tiene su potencia, si PHP son sus estructuras de datos (arrays) que permiten formas heterogéneas y de fácil administración y presentación, Perl es la versatilidad y potencia que proporciona su sintaxis escueta y orientada al resultado, Ruby es la reescritura en tiempo de ejecución&#8230; Python, sin duda, es la elegancia.
Como elegancia me refiero a la forma en la que se resuelven los problemas de codificación. Obviamente, en cada lenguaje hay soluciones para cada elemento de codificación, pero muchas veces, nos da la sensación de no haberlo resuelto de la forma más elegante&#8230; eso es lo que hace Python, nos da las herramientas necesarias para que no nos quede esa sensación, y el código resultante sea fácil y directo a la hora de leerlo.
Orígenes de Python
Python fue desarrollado por Guido van Rossum, a finales de los ochenta como un lenguaje académico, en el Centro de Matemáticas y la Informática de los Países Bajos, como un sucesor de ABC, capaz de manejar excepciones y trabajar con el sistema operativo Amoeba.
No obstante, no fue hasta 1991 cuando se liberó la primera versión de Python, la 0.9.0. En 1994 nació el grupo de usuarios de Python en [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/python-logo-150x150.jpg" alt="" title="python-logo" width="150" height="150" class="alignleft size-thumbnail wp-image-1044" /> Siempre he dicho que cada lenguaje tiene su potencia, si PHP son sus estructuras de datos (arrays) que permiten formas heterogéneas y de fácil administración y presentación, Perl es la versatilidad y potencia que proporciona su sintaxis escueta y orientada al resultado, Ruby es la reescritura en tiempo de ejecución&#8230; Python, sin duda, es la elegancia.</p>
<p>Como elegancia me refiero a la forma en la que se resuelven los problemas de codificación. Obviamente, en cada lenguaje hay soluciones para cada elemento de codificación, pero muchas veces, nos da la sensación de no haberlo resuelto de la forma más <em>elegante</em>&#8230; eso es lo que hace Python, nos da las herramientas necesarias para que no nos quede esa sensación, y el código resultante sea fácil y directo a la hora de leerlo.</p>
<h3>Orígenes de Python</h3>
<p>Python fue desarrollado por <a href="http://es.wikipedia.org/wiki/Guido_van_Rossum">Guido van Rossum</a>, a finales de los ochenta como un lenguaje académico, en el Centro de Matemáticas y la Informática de los Países Bajos, como un sucesor de ABC, capaz de manejar excepciones y trabajar con el sistema operativo Amoeba.</p>
<p>No obstante, no fue hasta 1991 cuando se liberó la primera versión de Python, la 0.9.0. En 1994 nació el grupo de usuarios de Python en <tt>comp.lang.python</tt> y fue liberada la versión 1.0. La sintaxis de módulos es copiada de Modula-3, al igual que el sistema de captura de excepciones, y los detalles funcionales (lambda, map, reduce y filter) son aportación de un hacker que adoraba Lisp y que echaba de menos esas funciones en Python.</p>
<p>En sí, desde su nacimiento, Python ha estado ligado a la enseñanza y se ha dejado influenciar por otros lenguajes académicos, como Modula-3, Lisp y Haskell, por lo que es bastante sorprendente que este haya conseguido trascender y ser usado en entornos profesionales.</p>
<p>Como curiosidad, comentar que el nombre de Python, pese a que se podría considerar que es por la serpiente (de la que forma parte su logo), es realmente en honor al grupo cómico Monty Python.</p>
<h3>La elegancia</h3>
<p>En principio, podemos considerar que su <em>rico vocabulario</em>, le otorga la capacidad de poder resolver multitud de problemas con <em>pocas palabras</em>. Esto hace que la curva de aprendizaje sea un poco más elevada, pero realmente, no lo es.</p>
<p>Realmente, lenguajes como Ruby, ya integran la mayoría de cosas por las que es conocido Python, solo que, el estilo de Ruby es más basado en símbolos (signos y enlace de funciones y operadores) y Python se basa más en la palabra, por lo que, a razón de vista, al igual que pasa con SQL, es bastante más comprensible con solamente leerlo.</p>
<p>Por ejemplo, en otros lenguajes como PHP:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$d</span> <span style="color: #339933;">&gt;=</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$d</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> ? <span style="color: #cc66cc;">10</span> <span style="color: #339933;">:</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span></pre></div></div>

<p>En muy poco código, ya hay símobolos como el dólar ($), las comparaciones, el ampersand (&#038;&#038;), la interrogación (?) y los dos puntos (:) para separar una síntaxis que sería algo más extensa en un bloque condicional <em>if</em>. En Python, como se aboga por la sintaxis basada en la palabra, no existe este uso tal cual, sino que es:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">a = <span style="color: #ff4500;">10</span> <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>d <span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">and</span> d <span style="color: #66cc66;">&lt;</span>= <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">else</span> <span style="color: #ff4500;">20</span></pre></div></div>

<p>La gran ventaja (aunque algunos no lo consideren así) de Python es que la anidación se realiza por indentación, lo cual obliga al programador a escribir bien e indentar correctamente el código. Esto sumado a las recomendaciones del <a href="http://www.python.org/dev/peps/pep-0008">PEP 8</a>, hacen que el código sea, además de elegante, legible.</p>
<h3>Conclusiones</h3>
<p>Realmente no existe ninguna bala de plata (o panacea) a la hora de elegir un lenguaje de programación. Conozco a personas que prefieren lenguajes como PHP o Python por su sintaxis de palabra, y sin embargo otros prefieren lenguajes como Perl o Ruby por su uso de símbolos. Todo esto tiene que ver con las costumbres de cada programador, manías, y experiencia en cada uno de los campos. A mi, Python, me parece un gran lenguaje gracias a su sintaxis, su formato y recomendaciones. Ideal para entornos educativos y formar nuevos programadores, sin duda.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/04/python-la-elegancia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Muere el padre de Lisp</title>
		<link>http://bosqueviejo.net/2011/10/27/muere-el-padre-de-lisp/</link>
		<comments>http://bosqueviejo.net/2011/10/27/muere-el-padre-de-lisp/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 14:23:58 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[inteligencia artificial]]></category>
		<category><![CDATA[john mccarthy]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[premio turing]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1033</guid>
		<description><![CDATA[ No nos recuperamos de una y llega otra. Ahora le ha tocado el turno al mundo de la inteligencia artificial, nada más y nada menos que John McCarthy, el padre del lenguaje de programación Lisp y del término Inteligencia Artificial, murió el pasado martes, 25 de octubre de 2011.
Para más información, se puede visitar su página en la Wikipedia, donde se puede encontrar mucha información acerca de este gran hombre, propulsor del término Inteligencia Artificial en la Conferencia de Dartmouth de 1956, creador de Lisp en 1960 y premio Turing en 1971 por sus aportes a la Inteligencia Artificial.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/john_mccarthy-150x150.jpg" alt="" title="john_mccarthy" width="150" height="150" class="alignleft size-thumbnail wp-image-1034" /> No nos recuperamos de una y llega otra. Ahora le ha tocado el turno al mundo de la inteligencia artificial, nada más y nada menos que John McCarthy, el padre del lenguaje de programación Lisp y del término Inteligencia Artificial, murió el pasado martes, 25 de octubre de 2011.</p>
<p>Para más información, se puede visitar <a href="http://es.wikipedia.org/wiki/John_McCarthy">su página en la Wikipedia</a>, donde se puede encontrar mucha información acerca de este gran hombre, propulsor del término Inteligencia Artificial en la Conferencia de Dartmouth de 1956, creador de Lisp en 1960 y premio Turing en 1971 por sus aportes a la Inteligencia Artificial.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/27/muere-el-padre-de-lisp/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>Adiós a Dennis Ritchie</title>
		<link>http://bosqueviejo.net/2011/10/13/adios-a-dennis-ritchie/</link>
		<comments>http://bosqueviejo.net/2011/10/13/adios-a-dennis-ritchie/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 09:11:08 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[dennis ritchie]]></category>
		<category><![CDATA[lenguaje c]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=975</guid>
		<description><![CDATA[ ¿Qué podemos decir?, en poco tiempo, hemos perdido a dos figuras bastante importantes dentro del mundo de la informática. Si hace unos días nos encontrábamos de lleno, sobretodo al entrar en la web de Apple, con la muerte de Steve Jobbs, ahora nos llega la noticia de la defunción de otro de los grandes de la informática, Dennis Ritchie.
Dennis Ritchie ha sido una persona muy influyente dentro del mundo de la informática, ya que trabajó en el cenit de la misma, en una de las empresas que comenzó a cambiarlo todo, gracias a su potencial humano (Ritchie, Kernighan y Thompson en un principio y otros como Stroustrup después), con desarrollos como el lenguaje C y el sistema operativo Unix.
Recordando una entrada de Genbeta del verano, podemos decir que, Si no fuera por Dennis Ritchie y por Ken Thompson, UNIX jamás hubiera existido, tampoco hubiera existido por tanto BSD, o Solaris o Minix y mucho menos Linux, tampoco existiría Mac OS X. Y si no fuera especialmente por Dennis Ritchie, no existiría C, no existirían muchos conceptos que en su día rompieron esquemas a través de su innovadora visión y se convirtieron en al ABC de la teoría de los [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/dennis_ritchie-150x150.jpg" alt="" title="Dennis Ritchie" width="150" height="150" class="alignleft size-thumbnail wp-image-980" /> ¿Qué podemos decir?, en poco tiempo, hemos perdido a dos figuras bastante importantes dentro del mundo de la informática. Si hace unos días nos encontrábamos de lleno, sobretodo al entrar en la web de Apple, con la <a href="http://es.wikipedia.org/wiki/Steve_Jobs">muerte de Steve Jobbs</a>, ahora nos llega la noticia de la defunción de otro de los grandes de la informática, <a href="http://es.wikipedia.org/wiki/Dennis_Ritchie">Dennis Ritchie</a>.</p>
<p>Dennis Ritchie ha sido una persona muy influyente dentro del mundo de la informática, ya que trabajó en el cenit de la misma, en una de las empresas que comenzó a cambiarlo todo, gracias a su potencial humano (Ritchie, Kernighan y Thompson en un principio y otros como Stroustrup después), con desarrollos como el lenguaje C y el sistema operativo Unix.</p>
<p>Recordando una entrada de <a href="http://www.genbetadev.com/desarrolladores/dennis-ritchie-creador-de-c-y-unix">Genbeta</a> del verano, podemos decir que, <em>Si no fuera por Dennis Ritchie y por Ken Thompson, UNIX jamás hubiera existido, tampoco hubiera existido por tanto BSD, o Solaris o Minix y mucho menos Linux, tampoco existiría Mac OS X. Y si no fuera especialmente por Dennis Ritchie, no existiría C, no existirían muchos conceptos que en su día rompieron esquemas a través de su innovadora visión y se convirtieron en al ABC de la teoría de los sistemas operativos por lo que sería complicado que hubieran existido hoy sistemas como Windows, PlayStation, o PCs.</em> Por lo que le debemos mucho a este hombre. ¡Adiós, maestro!</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/13/adios-a-dennis-ritchie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 7, ¿qué nos trae?</title>
		<link>http://bosqueviejo.net/2011/10/03/lo-que-nos-trae-java-7/</link>
		<comments>http://bosqueviejo.net/2011/10/03/lo-que-nos-trae-java-7/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 12:27:40 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[jvm]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=900</guid>
		<description><![CDATA[ Vale, lo sé, algo tarde porque salió en julio de este año&#8230; pero más vale tarde que nunca, ¿no?
El hecho, es que se ha lanzado una nueva versión de este tan afamado lenguaje. Oracle ha preparado su SDK y, según Mark Reinhold (Arquitecto Jefe de Java en Oracle), se han corregido 9494 errores, se han incluido 1966 mejoras, 9018 cambios, 4 JSRs y 147 builds hasta llegar a esta versión, que ha tardado unos 4 años en ver la luz.
Las mejoras que implementa Java 7 son las siguientes.
Máquina Virtual
Se agrega el requisito señalado en el JSR 292, que da mejor soporte a nivel de JVM para la implementación mejorada de lenguajes scripting sobre la JVM.
Un mejor recolector de basura (Garbage Collector), G1. El recolector de basura es ese sistema que se encarga de liberar la memoria de los objetos que ya no se están usando. El hecho, es que para llevar a cabo esta tarea, la JVM dejaba pausada toda su actividad para poder realizar la tarea sin problemas de concurrencia.
Con la puesta en producción de G1, los tiempos de pausa son más cortos. Se basa en la teoría de que, ordenar el espacio en memoria mientras los niños [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/java-150x150.png" alt="" title="java" width="150" height="150" class="alignleft size-thumbnail wp-image-903" /> Vale, lo sé, algo tarde porque salió en julio de este año&#8230; pero más vale tarde que nunca, ¿no?</p>
<p>El hecho, es que se ha lanzado una nueva versión de este tan afamado lenguaje. Oracle ha preparado su SDK y, según <a href="http://mreinhold.org/blog/jdk7-ga">Mark Reinhold</a> (Arquitecto Jefe de Java en Oracle), se han corregido 9494 errores, se han incluido 1966 mejoras, 9018 cambios, 4 JSRs y 147 builds hasta llegar a esta versión, que ha tardado unos 4 años en ver la luz.</p>
<p>Las mejoras que implementa Java 7 son las siguientes.</p>
<h3>Máquina Virtual</h3>
<p>Se agrega el requisito señalado en el <a href="http://jcp.org/en/jsr/detail?id=292">JSR 292</a>, que da mejor soporte a nivel de JVM para la <strong>implementación mejorada de lenguajes scripting sobre la JVM</strong>.</p>
<p>Un mejor recolector de basura (Garbage Collector), G1. El recolector de basura es ese sistema que se encarga de liberar la memoria de los objetos que ya no se están usando. El hecho, es que para llevar a cabo esta tarea, la JVM dejaba pausada toda su actividad para poder realizar la tarea sin problemas de concurrencia.</p>
<p>Con la puesta en producción de G1, los tiempos de pausa son más cortos. Se basa en la teoría de que, ordenar el espacio en memoria <em>mientras los niños juegan</em>, como un reemplazo a la marca de recolección de basura paralela y concurrente. Se divide la sala de estar en cuadrados, y se van turnando para cada juego, muchos de los cuadros contienen juguetes que ya no se usan y pueden ser quitados sin peligro. El nuevo colector, por tanto, puede trabajar de forma más predictiva.</p>
<p>Otra de las mejoras, es que se <strong>comprimen los punteros a memoria de 64 bits</strong> en 32 bits con lo que se gana mayor rendimiento.</p>
<h3>Lenguaje</h3>
<p>Se agregan características del lenguaje como el uso de <strong>String en switch</strong>, con lo que ya sería posible hacer códigos como este:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">String</span> hola <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Hola&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>hola<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #0000ff;">&quot;hola&quot;</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// no coincide</span>
        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #0000ff;">&quot;Hola&quot;</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// si coincide</span>
        <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">default</span><span style="color: #339933;">:</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Mejorado el tipo de inferencia</strong> para la instanciación genérica. Hasta ahora cuando se creaba un objeto, había que dar todos los tipos con los que se había creado el objeto. Ahora, esto no es necesario. Un ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Java 6</span>
Map<span style="color: #339933;">&lt;</span>String, List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;&gt;</span> anagrama <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;</span>String, List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Java 7</span>
Map<span style="color: #339933;">&lt;</span>String, List<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;&gt;</span> anagrama <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Gestión automática de recursos</strong>. Es posible ahora definir recursos dentro de la cláusula <em>try</em> para que el alcance de estos recursos se quede limitado a esta cláusula. La forma sería:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">FileOutputStream</span> fos <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileOutputStream</span><span style="color: #009900;">&#40;</span>path<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// código para procesar fos</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<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>ex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Se amplian los <strong>formatos numéricos</strong>, haciéndose posible escribir cosas como:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> n <span style="color: #339933;">=</span> 0b10000000<span style="color: #339933;">;</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>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// imprime 128</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">int</span> n2 <span style="color: #339933;">=</span>  <span style="color: #cc66cc;">121</span>_31_23_232<span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// literal entero con subrayados</span>
<span style="color: #000066; font-weight: bold;">int</span> n3 <span style="color: #339933;">=</span>  0xff_dd<span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// liberal hexadecimal con subrayados</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>n2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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>n3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Se agrega también un sistema <strong>multi-catch</strong>, que permite definir varios tipos de objetos en una sola cláusula <em>catch</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">int</span> v <span style="color: #339933;">=</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>num<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">int</span> result <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span> <span style="color: #339933;">/</span> v<span style="color: #339933;">;</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>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">NumberFormatException</span> <span style="color: #339933;">|</span> <span style="color: #003399;">ArithmeticException</span> ex <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;Not a valid number or zero&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Además, se hacen posibles códigos de lanzamiento de excepciones como este:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Ex1 <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Ex2 <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RethrowException <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> m1<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> v<span style="color: #009900;">&#41;</span>  <span style="color: #000000; font-weight: bold;">throws</span> Ex1 , Ex2 <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Ex1<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> 
            <span style="color: #000000; font-weight: bold;">else</span>
               <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> v <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                   <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Ex2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #009900;">&#125;</span>
            <span style="color: #666666; font-style: italic;">// process </span>
        <span style="color: #009900;">&#125;</span> 
        <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">throw</span> ex<span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// excepción no reportada java.lang.Exception</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Por último, en esta sección, cabe destacar que, cuando un programador intenta invocar un método con parámetros variable, el compilador genera una aviso de <em>operación insegura</em>, este aviso, en JDK 7 ha sido movido del sitio de la llamada a la declaración del método.</p>
<h3>Núcleo</h3>
<p>Se actualiza la arquitectura del <strong>class-loader</strong> (cargador de clases). Elimina interbloqueos en topologías no jerárquicas. <a href="http://openjdk.java.net/groups/core-libs/ClassLoaderProposal.html">Ver más (en inglés)</a>.</p>
<p>Se agrega un método en <strong>URL ClassLoader</strong>, que permite cerrar recursos subyacentes, tales como archivos abiertos, mantenidos por URL ClassLoader. <a href="http://blogs.oracle.com/michaelmcm/entry/closing_a_urlclassloader">Ver más (en inglés)</a>.</p>
<p>También se agregan actualizaciones en las colecciones (Collections) y concurrencia. Un ligero marco de trabajo (framework) para fork/join, barreras de sincronización más flexibles y reutilizables, colas de transferencia, colas de listas doblemente enlazadas concurrentes y generadores de números pseudo-aleatorios en hilos locales. <a href="http://gee.cs.oswego.edu/dl/concurrency-interest/index.html">Ver más (en inglés)</a>.</p>
<h3>Internacionalización</h3>
<p>Actualización a la versión de Unicode 6.0, que:</p>
<ul>
<li>agrega 2088 caracteres incluyendo 1000 símbolos adicionales, el símbolo de la moneda india oficial, 222 ideogramas de China, Taiwan y Japón y 630 caracteres adicionales de soporte para lengua africana, incluyendo extensiones de Tifinagh, Etiopía y Bamum.</li>
<li>agrega nuevas propiedades y ficheros de datos, como el fichero EmojiSources.txt, que mapea los símbolos emoji a su japonés original, dos propiedades provisionales de scripts del índico: IndicMatraCategory y IndicSylabicCategory; y scripts provisionales para uso en segmentación, expresiones regulares y detección de spoof.</li>
<li>corrige propiedades de caracteres para caracteres existentes.</li>
<li>etc.</li>
</ul>
<p>Mejoras en <strong>Locale</strong> (<tt>java.util.Locale</tt>) para soportar el <a href="http://tools.ietf.org/rfc/bcp/bcp47.txt">IETF BCP 47</a> (etiquetas para detectar idiomas) y el <a href="http://unicode.org/reports/tr35/">UTR 35</a> (lenguaje de marcado para datos localizados).</p>
<p>Separación de la localización del usuario, de la localización de la interfaz de usuario. Actualiza el manejador de <em>locales</em> para separar el formateado de locales de la interfaz del usuario de las locales de idioma.</p>
<h3>Entrada/Salida y Red</h3>
<p>Nueva API para E/S que permite acceso al sistema de ficheros, operaciones E/S asíncronas escalables, enlace con canal de socket y configuración, y datagramas multicast. <a href="http://openjdk.java.net/projects/nio">Ver más</a>. Además, esta API tendrá acceso para ficheros zip/jar.</p>
<p>Soporte para el protocolo <strong>SCTP</strong> (Stream Control Transmission Protocol, Protocolo de Transmisión de Control de Flujo) en Solaris, así como el <strong>SDP</strong> (Sockets Direct Protocol, Protocolo Directo a Sockets) para Solaris y Linux, y la posibilidad de usar la pila <strong>IPv6</strong> nativa de Windows Vista.</p>
<p>Agregado soporte para TLS 1.2, según el <a href="http://www.ietf.org/rfc/rfc5246.txt">RFC 5246</a>.</p>
<h3>Seguridad y Criptografía</h3>
<p>Se agrega los algoritmos de Criptografía de Curva-Elíptica (ECC, Eliptic-curve criptography), así que todas las aplicaciones Java podrán usar <a href="http://es.wikipedia.org/wiki/Criptograf%C3%ADa_de_curva_el%C3%ADptica">ECC</a> con la JVM estándar (out-of-the-box).</p>
<h3>Base de Datos</h3>
<p>Actualización de JDBC a la versión 4.1, y Rowset a la versión 1.1. Básicamente, incluye las nuevas características del lenguaje para hacer más óptimo y manejable el sistema JDBC.</p>
<h3>Cliente</h3>
<p>Un nuevo sistema de acceso a gráficos basado en la extensión <strong>XRender</strong> de X11, el cual proporciona acceso a mucha más funcionalidad de los GPUs, para <strong>Java2D</strong>.</p>
<p>Creada unas nuevas funcionalidades para API gráfica, que permitan el uso de <strong>Shapes</strong> (curvas) y <strong>Opacity</strong> (opacidad), en <em>java.awt</em>.</p>
<p>Nuevo <em>look-and-feel</em> para Swing llamado <strong>Nimbus</strong>. Se proclama como la siguiente generación en <em>look-and-feel</em> multi-plataforma para Swing. Una imagen de cómo es:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/nimbus-300x183.gif" alt="" title="nimbus-300x183" width="300" height="183" class="aligncenter size-full wp-image-934" /></p>
<p>Nueva componente JLayer. Se agrega por defecto la componente decoradora JXLayer de SwingLabs. <a href="http://download.oracle.com/javase/tutorial/uiswing/misc/jlayer.html">Aquí</a> un ejemplo de cómo implementarla. El ejemplo permite cosas como esta:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/jlayer.png" alt="" title="jlayer" width="300" height="200" class="aligncenter size-full wp-image-936" /></p>
<p>Se elimina el antiguo (y propietario) sintetizador, en favor de <a href="http://java.net/projects/gervill/pages/Home/revisions/7">Gervill</a>, un sintetizador creado como propuesta del <a href="http://openjdk.java.net/projects/audio-engine/">Audio Synthesis Engine Project</a>.</p>
<h3>Web</h3>
<p>Actualizada la pila XML a las versiones más recientes de <a href="http://jcp.org/en/jsr/detail?id=206">JAXP 1.4</a>, <a href="http://jcp.org/en/jsr/detail?id=222">JAXB 2.2a</a> y <a href="http://jcp.org/en/jsr/detail?id=224">JAX-WS 2.2</a>.</p>
<h3>Administración</h3>
<p>Mejorado <a href="">MBeans</a> para informar la carga reciente de la CPU en general (del sistema completo), la carga CPU de los procesos de la JVM y enviar notificaciones JMX cuando ocurran eventos del recolector de basura (GC), esta característica fue incluída como mejora del Agente JMX, pero ha sido eliminada debido a la falta de tiempo.</p>
<h3>Otras cosas por venir&#8230; JDK 8</h3>
<p>Hay otras muchas cosas que se dejan para la siguiente versión, cosas como la modularización, el uso de anotaciones en los tipos, soporte del lenguaje para colecciones, closures&#8230; y otras muchas cosas que se piensen a partir de este momento, hasta que se plantee la liberación del JDK 8.</p>
<h3>Conclusiones</h3>
<p>Veo que el lenguaje Java, con estas propuestas y las que están por venir, se va acoplando cada vez más a la moda que van imponiendo sistemas como Groovy, Ruby, Python y otros lenguajes de scripting, agregando más elementos nativos, ganando en rendimiento y disminuyendo la necesidad de escribir tanto código. No obstante, <a href="http://www.carballude.es/blog/2010/07/15/java-7-hacia-donde-va-y-por-que-no-me-gusta/">no a todo el mundo le gusta esta línea</a>, ya que deja al lenguaje demasiado dependiente de las APIs de cara al uso de elementos nativos como las estructuras de control&#8230; habrá que ver cómo sigue evolucionando.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/03/lo-que-nos-trae-java-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP 5.4: ya queda menos</title>
		<link>http://bosqueviejo.net/2011/08/01/php-5-4-ya-queda-menos/</link>
		<comments>http://bosqueviejo.net/2011/08/01/php-5-4-ya-queda-menos/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 15:29:45 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[lenguajes]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=800</guid>
		<description><![CDATA[ Hoy me ha llegado una noticia sobre la liberación de las alpha de PHP 5.4 y, buscando en Internet y en la propia página de PHP, veo que ya se tiene un plan para lanzar esta nueva versión de PHP.
Como cuando hablé sobre la liberación de PHP 5.3, esta nueva versión de PHP se va acercando un poco más al ideal de Programación Orientada a Objetos que ya se tiene en otros lenguajes como Python, Ruby, Java, C#, etc.
En esta nueva entrega, como en otras, hay cambios o mejoras sobre algunos elementos, cosas que se agregan al lenguaje y a la biblioteca de funciones (y objetos) y cosas que definitivamente se eliminan.
Deprecated&#8230;
Las cosas que se eliminan en esta versión son cosas tan poco usadas como los parámetros de break y continue, que supongo que tendrían su sentido&#8230; pero a mi nunca me hicieron falta, realmente.
Las funciones para almacenar datos en la sesión también han sido eliminadas, ya que con el array $_SESSION, se hacían poco útiles. Por lo que los códigos con funciones: session_register, session_unregister y session_is_registered&#8230; dejaran de funcionar en esta versión.
También se eliminan definitivamente cosas como y2k_compliance, register_globals, y otras cosas que en la versión antigua ya [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/php_logo1-150x150.jpg" alt="" title="php_logo" width="150" height="150" class="alignleft size-thumbnail wp-image-804" /> Hoy me ha llegado una noticia sobre la liberación de las alpha de PHP 5.4 y, buscando en Internet y en la propia página de PHP, veo que ya se tiene un plan para lanzar esta <a href="https://wiki.php.net/todo/php54">nueva versión de PHP</a>.</p>
<p>Como cuando hablé sobre la liberación de <a href="http://bosqueviejo.net/2009/08/19/php-5-3/">PHP 5.3</a>, esta nueva versión de PHP se va acercando un poco más al ideal de Programación Orientada a Objetos que ya se tiene en otros lenguajes como Python, Ruby, Java, C#, etc.</p>
<p>En esta nueva entrega, como en otras, hay cambios o mejoras sobre algunos elementos, cosas que se agregan al lenguaje y a la biblioteca de funciones (y objetos) y cosas que definitivamente se eliminan.</p>
<h3>Deprecated&#8230;</h3>
<p>Las cosas que se eliminan en esta versión son cosas tan poco usadas como los parámetros de <em>break</em> y <em>continue</em>, que supongo que tendrían su sentido&#8230; pero a mi nunca me hicieron falta, realmente.</p>
<p>Las funciones para almacenar datos en la sesión también han sido eliminadas, ya que con el array <em>$_SESSION</em>, se hacían poco útiles. Por lo que los códigos con funciones: session_register, session_unregister y session_is_registered&#8230; dejaran de funcionar en esta versión.</p>
<p>También se eliminan definitivamente cosas como <em>y2k_compliance</em>, <em>register_globals</em>, y otras cosas que en la versión antigua ya se marcaron como que se eliminarían a futuro.</p>
<h3>Traits</h3>
<p>Una de las grandes agregaciones en esta versión son los <em>traits</em>. Esta es una herramienta muy potente en entornos donde la herencia es simple, posibilitando la reutilización de código&#8230; más específicamente de los métodos que se desean portar entre clases de distinta índole.</p>
<p>Por ejemplo:</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>
 trait ezcReflectionReturnInfo <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">function</span> getReturnType<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/*1*/</span> <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">function</span> getReturnDescription<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/*2*/</span> <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">class</span> ezcReflectionMethod <span style="color: #000000; font-weight: bold;">extends</span> ReflectionMethod <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">use</span> ezcReflectionReturnInfo<span style="color: #339933;">;</span>
   <span style="color: #666666; font-style: italic;">/* ... */</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">class</span> ezcReflectionFunction <span style="color: #000000; font-weight: bold;">extends</span> ReflectionFunction <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">use</span> ezcReflectionReturnInfo<span style="color: #339933;">;</span>
   <span style="color: #666666; font-style: italic;">/* ... */</span>
 <span style="color: #009900;">&#125;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Esto hace que las clases <tt>ezcReflectionMethod</tt> y <tt>ezcReflectionFunction</tt> se puedan beneficiar de las funciones definidas en el <em>trait</em> <tt>ezcReflectionReturnInfo</tt>, heredando cada una de su respectiva clase padre.</p>
<p>Más información <a href="https://wiki.php.net/rfc/traits?s[]=trait">aquí</a>.</p>
<h3>Filtrando cabeceras</h3>
<p>Se ha agregado un nuevo <em>callback</em>, para cuando se envíen las cabeceras, justo antes de este instante, se ejecute un código personalizado que permita, junto con las funciones <em>headers_list</em>, <em>header_remove</em> y <em>header</em>, enviar solo las cabeceras que se quieran enviar:</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;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-Type: text/plain'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'X-Test: foo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">headers_list</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$header</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'X-Powered'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            header_remove<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'X-Powered-By'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    header_remove<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'X-Test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> header_register_callback<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ejemplo del blog de <a href="http://blog.cballesterosvelasco.es">Carlos Ballesteros</a>, <a href="http://blog.cballesterosvelasco.es/2011/02/headerregistercallback-en-php-54.html">header_register_callback en PHP 5.4</a>.</p>
<h3>Por defecto&#8230; UTF-8</h3>
<p>Así es, hasta ahora, el uso interno de cadenas y textos se hacía en ISO-8859-1 o Latin-1. Al igual que en distribuciones como Debian o Red-Hat este valor se modificó a UTF-8, ahora PHP, en esta versión ha modificado su conjunto de caracteres para que por defecto esté a UTF-8. No obstante, esto puede modificarse desde <tt>php.ini</tt>.</p>
<h3>Rendimiento</h3>
<p>Parece que se han modificado muchos de los aspectos internos que tienen que ver con la gestión de memoria, arrays y serializaciones. En principio, según se puede ver en <a href="http://www.slideshare.net/paulgao/come-on-php-54/3">esta presentación</a>, PHP en esta versión ha duplicado su velocidad, mientras que ha dividido por la mitad su consumo de memoria. ¡Eso es optimización!</p>
<h3>Conclusiones</h3>
<p>Hace bastante tiempo, escribí un artículo acerca de las <a href="http://bosqueviejo.net/2009/02/04/lenguajes-nuevas-versiones/">Nuevas Versiones de los Lenguajes</a> de programación. En este artículo, reseñaba cosas de las que a PHP 5.4 ya no le falta nada&#8230; o muy poco, pero apenas perceptible.</p>
<p>Realmente, PHP es un lenguaje al que odias o amas&#8230; o ambas cosas, ya que tiene cosas que lo hacen un poco insufrible, y sin embargo, son esas cosas las que le dan flexibilidad y gracias a las que se pueden hacer las cosas que se hacen. Con PHP 5.4, las diferencias que mostraban otros lenguajes con respecto a integración de POO se van acortando. Ahora solo falta que todos se actualicen a estas últimas versiones.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/08/01/php-5-4-ya-queda-menos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache: módulo status server</title>
		<link>http://bosqueviejo.net/2011/02/23/apache-modulo-status-server/</link>
		<comments>http://bosqueviejo.net/2011/02/23/apache-modulo-status-server/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 23:14:13 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=582</guid>
		<description><![CDATA[El otro día me acerqué a ver qué hacía un compañero de trabajo (Fermín), ya que estábamos teniendo algún que otro problema con los servidores web, y veo que en su pantalla tiene una ventana abierta con los procesos internos que está gestionando Apache, así como información de memoria, el uso de los hilos disponibles, etc.
Le pregunté inmediatamente qué era esa pantalla, ya que me impresionó de sobremanera que una pantalla así pudiese estar disponible para los servidores web (hay mucho que indagar y descubrir aún en Apache y otros grandes servidores   ).
El módulo que cargó se denomina mod_status, en Debian, al menos, viene por defecto al instalar un servidor apache, solo habría que cargarlo, ya sea mediante la orden y configuración siguiente (en httpd.conf o apache2.conf):

LoadModule status_module /usr/lib/apache2/modules/mod_status.so
ExtendedStatus On
&#160;
&#60;Location /server-status&#62;
    SetHandler server-status
&#160;
    Order Deny,Allow
    Deny from all
    Allow from localhost
&#60;/Location&#62;

Esto activa el módulo para que solo sea visible desde localhost (la propia máquina), se puede agregar visibilidad por autenticación (valid user) o la red local, en caso de tener el servidor en el mismo tramo que el equipo de sobremesa que manejemos.
La pantalla que se [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día me acerqué a ver qué hacía un compañero de trabajo (Fermín), ya que estábamos teniendo algún que otro problema con los servidores web, y veo que en su pantalla tiene una ventana abierta con los procesos internos que está gestionando Apache, así como información de memoria, el uso de los hilos disponibles, etc.</p>
<p>Le pregunté inmediatamente qué era esa pantalla, ya que me impresionó de sobremanera que una pantalla así pudiese estar disponible para los servidores web (hay mucho que indagar y descubrir aún en Apache y otros grandes servidores <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
<p>El módulo que cargó se denomina <a href="http://httpd.apache.org/docs/2.0/mod/mod_status.html">mod_status</a>, en Debian, al menos, viene por defecto al instalar un servidor apache, solo habría que cargarlo, ya sea mediante la orden y configuración siguiente (en httpd.conf o apache2.conf):</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">LoadModule</span> status_module /usr/lib/apache2/modules/mod_status.so
<span style="color: #00007f;">ExtendedStatus</span> <span style="color: #0000ff;">On</span>
&nbsp;
&lt;<span style="color: #000000; font-weight:bold;">Location</span> /server-status&gt;
    <span style="color: #00007f;">SetHandler</span> server-status
&nbsp;
    <span style="color: #00007f;">Order</span> <span style="color: #00007f;">Deny</span>,<span style="color: #00007f;">Allow</span>
    <span style="color: #00007f;">Deny</span> from <span style="color: #0000ff;">all</span>
    <span style="color: #00007f;">Allow</span> from localhost
&lt;/<span style="color: #000000; font-weight:bold;">Location</span>&gt;</pre></div></div>

<p>Esto activa el módulo para que solo sea visible desde <em>localhost</em> (la propia máquina), se puede agregar visibilidad por autenticación (<em>valid user</em>) o la red local, en caso de tener el servidor en el mismo tramo que el equipo de sobremesa que manejemos.</p>
<p>La pantalla que se puede visualizar es como la siguiente:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/apachemaint.gif" alt="" title="mod_status" width="500" height="463" class="aligncenter size-full wp-image-589" /></p>
<p>Espero que os resulte tan interesante y útil como a mi <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/02/23/apache-modulo-status-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La duplicación en Ruby</title>
		<link>http://bosqueviejo.net/2010/04/16/la-duplicacion-en-ruby/</link>
		<comments>http://bosqueviejo.net/2010/04/16/la-duplicacion-en-ruby/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 23:36:23 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=397</guid>
		<description><![CDATA[Durante el día de hoy, hemos estado dando vueltas, tanto Daniel como yo, para ver si encontrábamos alguna forma de solucionar este problema que se nos había cruzado:

irb&#62; a = &#91;&#91;1,2,3&#93;, &#91;1,2,3&#93;&#93;
&#91;&#91;1,2,3&#93;, &#91;1,2,3&#93;&#93;
irb&#62; a = b
&#91;&#91;1,2,3&#93;, &#91;1,2,3&#93;&#93;
irb&#62; b&#91;0&#93;&#91;0&#93; = 0
0
irb&#62; b
&#91;&#91;0,2,3&#93;, &#91;1,2,3&#93;&#93;
irb&#62; a
&#91;&#91;0,2,3&#93;, &#91;1,2,3&#93;&#93;

Con este código se entiende que al igualar dos objetos, en Ruby, no se hace una copia del objeto, sino una referencia al mismo.
Si intentamos hacer algo como:

irb&#62; b = a.clone
irb&#62; c = a.dup

Nos encontramos, al realizar la prueba de modificación sobre b y c el mismo resultado. Esto es porque los comandos de duplicación de objetos (y clonación) no trabajan con recursividad, sino que hacen solo la duplicidad de los objetos inmediatos, por tanto, si se trata de un Array, se duplica como nuevo objeto el Array, pero cada elemento dentro del Array, si es a su vez otro Array o Hash, los elementos que este puede contener se dejan sin duplicar (o clonar).
Esto está así pensado para que cada cual agregue sus propias funciones de clonación (en caso de clone)&#8230; solo que en ese caso, para los objetos de tipo Array y Hash se les olvidó hacerlo, claro.
Solución cutre
Buscando un poco por internet, en varios [...]]]></description>
			<content:encoded><![CDATA[<p>Durante el día de hoy, hemos estado dando vueltas, tanto <a href="http://sirius06.es/">Daniel</a> como yo, para ver si encontrábamos alguna forma de solucionar este problema que se nos había cruzado:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">irb<span style="color:#006600; font-weight:bold;">&gt;</span> a = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
irb<span style="color:#006600; font-weight:bold;">&gt;</span> a = b
<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
irb<span style="color:#006600; font-weight:bold;">&gt;</span> b<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#006666;">0</span>
<span style="color:#006666;">0</span>
irb<span style="color:#006600; font-weight:bold;">&gt;</span> b
<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
irb<span style="color:#006600; font-weight:bold;">&gt;</span> a
<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Con este código se entiende que al igualar dos objetos, en Ruby, no se hace una copia del objeto, sino una referencia al mismo.</p>
<p>Si intentamos hacer algo como:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">irb<span style="color:#006600; font-weight:bold;">&gt;</span> b = a.<span style="color:#9900CC;">clone</span>
irb<span style="color:#006600; font-weight:bold;">&gt;</span> c = a.<span style="color:#9900CC;">dup</span></pre></div></div>

<p>Nos encontramos, al realizar la prueba de modificación sobre <em>b</em> y <em>c</em> el mismo resultado. Esto es porque los comandos de duplicación de objetos (y clonación) no trabajan con recursividad, sino que hacen solo la duplicidad de los objetos inmediatos, por tanto, si se trata de un Array, se duplica como nuevo objeto el Array, pero cada elemento dentro del Array, si es a su vez otro Array o Hash, los elementos que este puede contener se dejan sin duplicar (o clonar).</p>
<p>Esto está así pensado para que cada cual agregue sus propias funciones de clonación (en caso de clone)&#8230; solo que en ese caso, para los objetos de tipo Array y Hash se les olvidó hacerlo, claro.</p>
<h3>Solución <em>cutre</em></h3>
<p>Buscando un poco por internet, en varios foros se puede encontrar esta solución, la cual es algo chapuza en muchos aspectos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">irb<span style="color:#006600; font-weight:bold;">&gt;</span> b = <span style="color:#CC00FF; font-weight:bold;">Marshal</span>.<span style="color:#CC0066; font-weight:bold;">load</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Marshal</span>.<span style="color:#9900CC;">dump</span><span style="color:#006600; font-weight:bold;">&#40;</span>a<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Esto lo que hace es realizar una serialización de los objetos y después una deserialización. Funciona, pero no con todos los tipos de objetos, hay que tener especial cuidado con esto.</p>
<h3>Solución algo más elegante</h3>
<p>Lo ideal sería sobrecargar la función de <em>clone</em> para los objetos de Array y Hash, ya que se ve que se les olvidó hacerlo a los programadores o, realmente, no se preocuparon de hacer esa tarea en profundidad, es decir, a través de todos los objetos.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">Array</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> clone
    a = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span>
    <span style="color:#9966CC; font-weight:bold;">for</span> i <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#006666;">0</span>..<span style="color:#006600; font-weight:bold;">&#40;</span>size <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:#9966CC; font-weight:bold;">do</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">respond_to</span>? <span style="color:#ff3333; font-weight:bold;">:clone</span>
        a<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">clone</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        a<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    a
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Si se ejecuta con el ejemplo, se verá que se suceden algunos errores. Esto es debido a que los objetos como Fixnum, tienen implementado el objeto clone, pero como un error, ya que lógicamente se considera que el objeto Fixnum no se puede clonar.</p>
<p>Esto se puede resolver de dos formas. Agregar tantas excepciones como se encuentren en la función clone escrita antes, o escribir algo como esto:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Fixnum</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> clone
      <span style="color:#0000FF; font-weight:bold;">self</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3>Conclusión</h3>
<p>Cada lenguaje tiene ciertas características o lagunas que, cuando se choca con ellas, se convierten en verdaderos escollos en el camino. No obstante, siempre se puede salir de ellos de alguna forma, aunque haya que poner momentáneamente FIXME en los comentarios de nuestro código a fin de revisarlo cuando se tenga una solución algo mejor.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/04/16/la-duplicacion-en-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

