<?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; erlang</title>
	<atom:link href="http://bosqueviejo.net/tag/erlang/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>Erlang y OTP en acción</title>
		<link>http://bosqueviejo.net/2012/01/22/erlang-y-otp-en-accion/</link>
		<comments>http://bosqueviejo.net/2012/01/22/erlang-y-otp-en-accion/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 01:02:42 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[eric merritt]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[manning]]></category>
		<category><![CDATA[martin logan]]></category>
		<category><![CDATA[otp]]></category>
		<category><![CDATA[richard carlsson]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1215</guid>
		<description><![CDATA[ El pasado lunes estaba camino del dentista cuando, dejando el coche, topé con la librería Cocodrilo Libros. Entré y pregunté por libros de Erlang, y como ya sabía, me mostraron el de O&#8217;Reilly de Francesco Cesarini y el de Pragmatic Programmers de Joe Armstrong&#8230; pero además, una editorial de la que aún no había leído ningún libro, Manning, tenía un libro con el título Erlang and OTP in action, la curiosidad me pudo y lo compré.
Con este título nos encontramos un libro bastante curioso sobre esta tecnología, y digo tecnología, porque no solo cubre el lenguaje de programación funcional Erlang, sino también el framework de desarrollo OTP. El libro se estructura de forma que la introducción al lenguaje es efímera pero clara, y nos plantean, casi desde el principio, la creación de un proyecto de caché, al que van agregando los elementos de OTP, hasta culminar en un proyecto completo, funcional, y que contiene, desde la práctica, todos y cada uno de los elementos que podemos encontrar en el framework OTP.
Da un recorrido por las herramientas de Erlang, de monitorización, de depuración y los profilers, así como Mnesia (la base de datos que trae consigo Erlang) y los mecanismos [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/logan_cover150-150x150.jpg" alt="" title="logan_cover150" width="150" height="150" class="alignleft size-thumbnail wp-image-1216" /> El pasado lunes estaba camino del dentista cuando, dejando el coche, topé con la librería <a href="http://www.cocodrilolibros.com/">Cocodrilo Libros</a>. Entré y pregunté por libros de Erlang, y como ya sabía, me mostraron el de O&#8217;Reilly de Francesco Cesarini y el de Pragmatic Programmers de Joe Armstrong&#8230; pero además, una editorial de la que aún no había leído ningún libro, Manning, tenía un libro con el título <em>Erlang and OTP in action</em>, la curiosidad me pudo y lo compré.</p>
<p>Con este título nos encontramos un libro bastante curioso sobre esta tecnología, y digo tecnología, porque no solo cubre el lenguaje de programación funcional Erlang, sino también el framework de desarrollo OTP. El libro se estructura de forma que la introducción al lenguaje es efímera pero clara, y nos plantean, casi desde el principio, la creación de un proyecto de caché, al que van agregando los elementos de OTP, hasta culminar en un proyecto completo, funcional, y que contiene, desde la práctica, todos y cada uno de los elementos que podemos encontrar en el framework OTP.</p>
<p>Da un recorrido por las herramientas de Erlang, de monitorización, de depuración y los profilers, así como Mnesia (la base de datos que trae consigo Erlang) y los mecanismos para crear, publicar y actualizar en caliente aplicaciones en Erlang.</p>
<p>Sus autores, entusiastas de Erlang, trabajan en el proyecto <a href="http://erlware.com/">Erlware</a>, además de mantener el libro. Estos son Martin Logan, Eric Merritt y Richard Carlsson. El prólogo está escrito por Ulf Wiger, CTO de Erlang Solutions.</p>
<p>Comentar, simplemente, que el libro me ha gustado mucho por su carácter directo. Muestra un proyecto en proceso de creación con código completo y explicando, no solo la historia de cada uno de los elementos y el porqué funcionan y se comportan como se comportan, sino también mostrando la utilidad práctica y para el proyecto de cada elemento, siendo como ejemplo de uso de los elementos de que dispone Erlang/OTP.</p>
<p>Su redacción es amena y para nada pesada y, aún siendo una temática muy densa, se desarrolla con ejemplos, código y gráficos a lo largo de unas 370 páginas, aproximadamente, quedando explicado todo de forma muy concisa y clara. El autor se centra sobretodo en OTP y el desarrollo de soluciones reales más que en la sintaxis y propiedades del lenguaje, con lo que consigue que el texto sea más pragmático y menos académico que el propio libro de Joe Armstrong.</p>
<p>Recomiendo su lectura para todo aquél que desee aprender Erlang/OTP con una curva de aprendizaje más suavizada.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/01/22/erlang-y-otp-en-accion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zotonic: CMS en Erlang</title>
		<link>http://bosqueviejo.net/2011/12/05/zotonic-cms-en-erlang/</link>
		<comments>http://bosqueviejo.net/2011/12/05/zotonic-cms-en-erlang/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 00:25:59 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[dtl]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[zotonic]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=873</guid>
		<description><![CDATA[ En mi búsqueda de material (software sobre todo) realizado en Erlang para poder aprender mucho más sobre este lenguaje, sus virtudes, carencias y potencias, he topado con otra muy buena pieza de software: Zotonic, un CMS hecho en Erlang.
¿Qué es un CMS exactamente?
Un CMS es un sistema de administración de contenido (Content Management System), básicamente. Zotonic se centra en esto mismo, administrar el contenido de la web que está sirviendo. A diferencia de otros CMS realizados en otros lenguajes, Zotonic tiene la ventaja de ejecutarse en una máquina que permite la ejecución de software fuera de la petición.
Por ejemplo, en otros lenguajes como Ruby, Python, Perl o PHP, cuando una petición HTTP llega al sistema establece el contexto de ejecución (sesión, cookies, datos de la solicitud, etc.) y tras su respuesta, el contexto es liberado (o volcado a la memoria secundaria), con lo que, es imposible mantener una ejecución paralela que dispare el sistema.
Es más, hay herramientas como delayed::job (en Ruby) o DJJob (en PHP), precisamente para paliar un poco esto.
Sin embargo, Zotonic, tiene como ventaja el hecho de que puede disparar la ejecución de un proceso no dependiente de la solicitud que almacene su resultado en una cola [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/zotonic-150x150.png" alt="" title="zotonic" width="150" height="150" class="alignleft size-thumbnail wp-image-874" /> En mi búsqueda de material (software sobre todo) realizado en Erlang para poder aprender mucho más sobre este lenguaje, sus virtudes, carencias y potencias, he topado con otra muy buena pieza de software: <a href="http://zotonic.com/">Zotonic</a>, un CMS hecho en Erlang.</p>
<h3>¿Qué es un CMS exactamente?</h3>
<p>Un CMS es un sistema de administración de contenido (Content Management System), básicamente. Zotonic se centra en esto mismo, administrar el contenido de la web que está sirviendo. A diferencia de otros CMS realizados en otros lenguajes, Zotonic tiene la ventaja de ejecutarse en una máquina que permite la ejecución de software fuera de la petición.</p>
<p>Por ejemplo, en otros lenguajes como Ruby, Python, Perl o PHP, cuando una petición HTTP llega al sistema establece el contexto de ejecución (sesión, cookies, datos de la solicitud, etc.) y tras su respuesta, el contexto es liberado (o volcado a la memoria secundaria), con lo que, es imposible mantener una ejecución paralela que dispare el sistema.</p>
<p>Es más, hay herramientas como <a href="/2011/12/01/djjob-trabajos-en-background-para-php/">delayed::job</a> (en Ruby) o <a href="/2011/12/01/djjob-trabajos-en-background-para-php/">DJJob</a> (en PHP), precisamente para paliar un poco esto.</p>
<p>Sin embargo, Zotonic, tiene como ventaja el hecho de que puede disparar la ejecución de un proceso no dependiente de la solicitud que almacene su resultado en una cola de mensajes que sea descargada por el sistema AJAX de la vista para mostrarlos en el momento que sea necesario. Esto le da a Zotonic una sensación de rapidez y paralelismo que pocos entornos web tienen hoy en día.</p>
<h3>¿Qué ofrece Zotonic?</h3>
<p>En principio, Zotonic se puede instalar en una máquina o en varias (en clúster) manteniendo una única interfaz de administración y pudiendo balancear entre todas el acceso, de forma fácil y transparente. Además, cada clúster puede administrar varios dominios:</p>
<p><img alt="Ejemplo de gestión de dominios con Zotonic." src="http://zotonic.com/image/2011/8/19/screen_shot_2010_09_07_at_22_36_42-1.png%28450x%29%28lossless%29%2885760C0FD444E8EC70DB3C1035F5EE44%29.png" title="Gestión de dominios" class="alignnone" width="450" height="272" /></p>
<p>Su interfaz es muy parecida a WordPress, y permite igualmente escribir páginas y entradas de modo que se puedan emplear como páginas del propio sitio web. Su editor se ve así:</p>
<p><img alt="Editor de contenido de Zotonic." src="http://zotonic.com/image/2009/11/16/adminedpage.png%28450x%29%28lossless%29%28B56F26782624E16F3BD5B8F236896BA8%29.png" title="Editor de contenido" class="alignnone" width="450" height="292" /></p>
<p>Como base de datos emplea PostgreSQL, y la forma de programar las plantillas es mediante el estándar de Django Template Library (DTL), lo cual facilita la creación de las vistas enormemente. Se puede revisar <a href="http://zotonic.com/documentation">la documentación</a> que, aunque el tema de las plantillas las trata poco (realmente es porque su simpleza no requiere de mayor información) es una sección de la web bastante extensa conteniendo temas como: SSL, Modelo de Datos, información sobre Erlang, PostgreSQL, conexión Ajax con Zotonic, mensajes Growl, etc.</p>
<p>Una lista bastante extensa y detallada de las características puede verse <a href="http://zotonic.com/features">aquí</a> (en inglés).</p>
<h3>Instalando Zotonic</h3>
<p>Se puede descargar en cualquier ruta de nuestro equipo, realmente, con el comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">git clone git://github.com/zotonic/zotonic.git</pre></div></div>

<p>Esto nos deja un entorno limpio con el que podemos hacer nuestra primera instalación. Por ejemplo, si ponemos en nuestro fichero <tt>/etc/hosts</tt> al lado de <tt>localhost</tt> la palabra <tt>miblog</tt>, podremos escribir lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">make
bin/zotonic -s blog miblog
./start.sh</pre></div></div>

<p>Ahora, solo tendremos que ir a un navegador, si ponemos la URL <a href="http://localhost:8000">http://localhost:8000</a>, veremos la interfaz de los dominios que tenemos en ejecución. Solo dispondremos, en estos momentos de <em>miblog</em>, por lo que, como lo hemos puesto en nuestro fichero de <tt>hosts</tt>, podemos seguir ese enlace y ver la web de nuestro sitio.</p>
<p>Si accedemos por la URL <a href="http://miblog:8000/admin/">http://miblog:8000/admin/</a>, nos preguntará por el login de acceso y contraseña. Este será, en principio (deberemos de cambiarlo): admin / admin; tras esto, se nos presentan todas las opciones disponibles de Zotonic&#8230; ¡y en castellano!</p>
<p>Todo queda bastante claro y muy fácil de manejar, a excepción de las plantillas, las cuales solo se pueden modificar a través de la edición de los ficheros en el directorio donde se haya creado el dominio. En este caso, como hemos creado el dominio <tt>miblog</tt>, la ruta será: <tt>priv/sites/miblog/templates</tt>.</p>
<h3>Conclusiones</h3>
<p>Zotonic se ha convertido en poco tiempo en un CMS con amplias características y muy usado en el mundo del web, aunque no tanto como otros que llevan más tiempo como por ejemplo Zope, Drupal o Joomla, pero poco a poco, gracias a sus características propias de alta disponibilidad, redundancia y escalabilidad, de seguro comenzará a ser cada vez más popular.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/12/05/zotonic-cms-en-erlang/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Demonware: videojuegos y Erlang</title>
		<link>http://bosqueviejo.net/2011/10/07/demonware-videojuegos-y-erlang/</link>
		<comments>http://bosqueviejo.net/2011/10/07/demonware-videojuegos-y-erlang/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 05:00:35 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[demonware]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=954</guid>
		<description><![CDATA[ Demonware es una división de Activision y Blizzard, encargada de desarrollar la parte de cliente-servidor para que los jugadores online puedan echar sus partidas con los amigos.
En su presentación en la Erlang Factory de Londres de 2011, Demonware preparó una presentación de Erlang and First-Person Shooters.
En resumen, ya que el documento es bastante gráfico e interesante de ver, Demonware es una empresa que se dedica a dar soporte de servidor a videojuegos multi-jugador de Activision y Blizzard. No solo la parte en sí del juego, sino también el chat y audio/vídeo que se puede activar en algunos juegos, así como sistemas anti-trampas, etc.
Los juegos que mantienen en sus servidores van desde Call of Duty (todas las entregas), pasando por Guitar Hero (y derivados), hasta otros como Blur y Marvel Ultimate Alliance 2.
Para hacernos una idea de su crecimiento y tecnologías:


Año
Tecnología
Usuarios concurrentes


2005
C++/C++/MySQL
80


2006
C++/Python/MySQL
1,000


2007
Erlang/Python/MySQL
20,000


2007+
2,500,000


Según la empresa, si el cambio no se hubiese realizado, la crisis podría haber sido un desastre, ya que el paso de mil a 20 mil usuarios se realizó con una sola salida al mercado, la de Call Of Duty 4: Modern Warfare.
Terminan la presentación, comentando algunas cosas que han aprendido con la práctica, que son bastante interesante, a [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/DW-Banner-centre.png" alt="" title="demonware logo" width="160" height="160" class="alignleft size-full wp-image-955" /> <a href="http://www.demonware.net/">Demonware</a> es una división de Activision y Blizzard, encargada de desarrollar la parte de cliente-servidor para que los jugadores online puedan <em>echar sus partidas</em> con los amigos.</p>
<p>En su <a href="http://www.erlang-factory.com/upload/presentations/395/ErlangandFirst-PersonShooters.pdf">presentación</a> en la <a href="http://www.erlang-factory.com/conference/London2011">Erlang Factory de Londres de 2011</a>, Demonware preparó una presentación de <em>Erlang and First-Person Shooters</em>.</p>
<p>En resumen, ya que el documento es bastante gráfico e interesante de ver, Demonware es una empresa que se dedica a dar soporte de servidor a videojuegos multi-jugador de Activision y Blizzard. No solo la parte en sí del juego, sino también el chat y audio/vídeo que se puede activar en algunos juegos, así como sistemas anti-trampas, etc.</p>
<p>Los juegos que mantienen en sus servidores van desde <strong>Call of Duty</strong> (todas las entregas), pasando por <strong>Guitar Hero</strong> (y derivados), hasta otros como <strong>Blur</strong> y <strong>Marvel Ultimate Alliance 2</strong>.</p>
<p>Para hacernos una idea de su crecimiento y tecnologías:</p>
<table>
<tr>
<th>Año</th>
<th>Tecnología</th>
<th>Usuarios concurrentes</th>
</tr>
<tr>
<td>2005</td>
<td>C++/C++/MySQL</td>
<td>80</td>
</tr>
<tr>
<td>2006</td>
<td>C++/Python/MySQL</td>
<td>1,000</td>
</tr>
<tr>
<td>2007</td>
<td rowspan="2">Erlang/Python/MySQL</td>
<td>20,000</td>
</tr>
<tr>
<td>2007+</td>
<td>2,500,000</td>
</tr>
</table>
<p>Según la empresa, si el cambio no se hubiese realizado, la crisis podría haber sido un desastre, ya que el paso de mil a 20 mil usuarios se realizó con una sola salida al mercado, la de <strong>Call Of Duty 4: Modern Warfare</strong>.</p>
<p>Terminan la presentación, comentando algunas cosas que han aprendido con la práctica, que son bastante interesante, a la par que útiles. Nada, lo dicho, recomiendo su visualización.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/07/demonware-videojuegos-y-erlang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riak: base de datos sin SPOF</title>
		<link>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/</link>
		<comments>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 11:07:41 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[basho]]></category>
		<category><![CDATA[dynamo]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[gossip protocol]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[riak]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=837</guid>
		<description><![CDATA[ Dando una vuelta por Internet, buscando información sobre base de datos NoSQL, topé con una (u otra) hecha en Erlang/OTP, al igual que CouchDB, pero que se basa en las mismas directrices para lo que fue desarrollado Erlang/OTP. Esta base de datos es Riak.
Actualización 16/09/2011: se me olvidó comentar que SPOF significa, según sus siglas, Single Point Of Failure, algo así como el punto único de fallo. Se refiere a cuando un sistema, aún teniendo bastante redundancia, tiene un punto único, en la red, en el software o en alguna parte del sistema que, fallando, deja sin servicio a todo.
Como la mayoría de software realizado por empresas y que se adentran en el software libre, Riak tiene dos versiones, una Open Source (que es completa y funcional) y otra Enterprise (que agrega commodities -o facilidades- tales como una interfaz de administración).
La base de datos Riak está basada en el documento escrito por Amazon sobre el sistema de almacenamiento Dynamo, el cual se basa en un sistema de alta disponibilidad, con estructura de almacenamiento del par clave-valor y distribuido. Este documento ha sido seguido, además, por Cassandra (la base de datos de Facebook, liberada y acogida en el seno de [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/riaklogo1-150x150.png" alt="" title="riaklogo" width="150" height="150" class="alignleft size-thumbnail wp-image-858" /> Dando una vuelta por Internet, buscando información sobre base de datos <a href="http://bosqueviejo.net/2010/05/04/nosql/">NoSQL</a>, topé con una (u otra) hecha en <a href="http://bosqueviejo.net/2008/10/08/erlang-concurrente-distribuido-y-en-tiempo-real/">Erlang/OTP</a>, al igual que <a href="http://bosqueviejo.net/2009/03/05/couchdb-rest-y-base-de-datos-documental/">CouchDB</a>, pero que se basa en las mismas directrices para lo que fue desarrollado Erlang/OTP. Esta base de datos es <a href="http://wiki.basho.com/Riak.html">Riak</a>.</p>
<p><strong>Actualización 16/09/2011</strong>: se me olvidó comentar que <a href="http://es.wikipedia.org/wiki/Single_point_of_failure">SPOF</a> significa, según sus siglas, <em>Single Point Of Failure</em>, algo así como el punto único de fallo. Se refiere a cuando un sistema, aún teniendo bastante redundancia, tiene un punto único, en la red, en el software o en alguna parte del sistema que, fallando, deja sin servicio a todo.</p>
<p>Como la mayoría de software realizado por empresas y que se adentran en el software libre, Riak tiene dos versiones, una Open Source (que es completa y funcional) y otra Enterprise (que agrega <em>commodities</em> -o facilidades- tales como una interfaz de administración).</p>
<p>La base de datos Riak está basada en el documento escrito por Amazon sobre el sistema de almacenamiento <a href="http://en.wikipedia.org/wiki/Dynamo_(storage_system)">Dynamo</a>, el cual se basa en un sistema de alta disponibilidad, con estructura de almacenamiento del par clave-valor y distribuido. Este documento ha sido seguido, además, por <a href="http://cassandra.apache.org/">Cassandra</a> (la base de datos de Facebook, liberada y acogida en el seno de la Fundación Apache, y que ha sido implementada desde entonces por Digg, Twitter, Reddit, Rackspace, etc.) y por <a href="http://project-voldemort.com/">Voldemort</a> (la base de datos de LinkedIn).</p>
<h3>Características principales</h3>
<p>Riak, además de seguir las bases de Dynamo, ha agregado otras características propias a la lista, quedando (visto en su <a href="http://www.basho.com/products_architecture.php">página web oficial</a>) la siguiente lista de características a destacar:</p>
<ul>
<li><strong>Escalabilidad</strong>: la escalabilidad con Riak es lineal, predecible y de coste efectivo. Agregar nuevas máquinas no significa tener una avalancha de de peticiones que ponga en peligro la efectividad del sistema. Se pueden ir agregando o eliminando máquinas sin mayor problema, y sin que suponga una carga excesiva para el sistema base.</li>
<li><strong>Tolerancia a fallos</strong>: el cluster soporta o admite fallos en nodos aislados, o incluso en partes del cluster, está preparado para no perder datos ante este tipo de fallos. El sistema ha sido diseñado con fallos de máquinas e interrupciones de servicio de red como norma, no como excepción.</li>
<li><strong>Alta disponibilidad</strong>: para alta disponibilidad el sistema debe de estar disponible, no solo para lecturas, sino también para escrituras. La arquitectura de share-nothing (nada compartido) hace que cada nodo en el cluster esté habilitado para realizar lecturas y escrituras, por lo que, la alta disponibilidad está garantizada.</li>
<li><strong>Replicación</strong>: dependiendo de las necesidades, Riak se puede configurar para replicar entre múltiples clusters iguales o diseñar uno o más clusters como solo-lectura o backup. Cada nodo en el cluster puede responder a las peticiones de lecutra/escritura, y el evento de replicación asegura que todos los clusters sean actualizados. Los algoritmos se ejecutan en cada nodo asegurando la consistencia de datos.</li>
</ul>
<p>En base al teorema CAP del Dr. Eric Brewer, las tres propiedades deseadas de un sistema distribuido son: consistencia, disponibilidad y partición (tolerancia a fallos). El teorema establece que puedes solo puedes tener dos de las tres propiedades en cada momento. Riak se enfoca en Disponibilidad y Partición. Esta elección pone a Riak en el campo de la consistencia eventual. Sin embargo, la ventana para <em>consistencia eventual</em> es en términos de milisegundos, lo que es suficiente para la mayoría de aplicaciones.</p>
<h3>¿Cómo funciona?</h3>
<p>No me quiero extender mucho, ya que esta información está disponible (aunque en inglés) en la propia web de Riak, en <a href="http://wiki.basho.com/Concepts.html">Concepts</a>, así que resumiré un poco.</p>
<p>El <strong>almacén de datos</strong> se realiza en base a el par clave-valor, es lo que podríamos llamar una base de datos hash. No obstante, la clave se compone de <em>bucket</em> y <em>key</em>, que son como en Erlang el módulo y la función, o en Java el paquete y la clase. El conjunto bucket/key es la unidad de organización única que puede emplearse.</p>
<p>El sistema admite también el uso de <strong>enlaces</strong> (links). Esto quiere decir que el contenido de un bucket/key, puede ser un contenido o un enlace a otro bucket/key que tenga su propio contenido. Algo así como el enlace simbólico en los sistemas de ficheros de Unix/Linux/BSD/&#8230;</p>
<p>Además, el contenido, puede ir estructurado en forma de <strong>metadatos</strong>, es decir, como las cabeceras de los mensajes HTTP, para disponer de arrays asociativos (hash) dentro del contenido.</p>
<p>Uso de diferentes <em>backends</em>. En la versión 0.12, Bitcask se estableció como backend para Riak, pero hay más, aquí ponemos un listado de los disponibles:</p>
<ul>
<li><strong>Bitcask</strong>: simple pero potente almacenaje de pares clave-valor. Es de baja latencia y alto rendimiento.</li>
<li><strong>DETS / ETS</strong>: tablas incorporadas en Erlang para el almacenamiento de información.</li>
<li><strong>Erlang Balanced Trees (gb_trees)</strong>: sistema de árbol balanceado. Rápido para leer, pero algo lento para escribir.</li>
<li><strong>Innostore</strong>: basado en el engine InnoDB de MySQL. Debido a restricciones de licencia, se proporciona por separado.</li>
</ul>
<p>Cada cluster que se configura de Riak, consta de los siguientes elementos:</p>
<ul>
<li><strong>Nodos</strong>: nodos físicos, o máquinas, de las que se compone el cluster.</li>
<li><strong>Nodos Virtuales</strong>: nodos virtuales (o vnodes) que corren en cada máquina. Cada máquina física puede contener uno o varios nodos virtuales.</li>
<li><strong>Particiones</strong>: cada cluster Riak tiene un entero de 160-bits dividido en particiones ecuánimes. Cada vnode reclamará una partición del anillo.</li>
</ul>
<p>Cada nodo en el cluster es responsable del 1/(número total de nodos físicos) del anillo. Puedes determinar el número de vnodes en cada nodo calculando el (número de particiones)/(número de nodos). Por ejemplo, un anillo con 32 particiones, compuesto por cuatro nodos físicos, tendrá aproximadamente ocho vnodos por nodo. Esta configuración es representada por el siguiente diagrama:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/riak-ring.png"><img src="http://bosqueviejo.net/wp-content/uploads/riak-ring-300x205.png" alt="" title="riak-ring" width="300" height="205" class="aligncenter size-medium wp-image-866" /></a></p>
<p>Riak está diseñado para ser un sistema distribuido, cuantos más nodos haya en el sistema, más rápido funcionará. </p>
<p>No hay <strong>nodo maestro</strong>, todos los nodos en Riak son iguales. Cada nodo es completamente capaz de servir cualquier petición de cliente. Esto es posible debido a la forma en la que Riak usa la consistencia de hash para distribuir datos a través del cluster, que se realiza a través de un <a href="http://en.wikipedia.org/wiki/Gossip_protocol">gossip protocol</a>.</p>
<h3>Sobre la replicación</h3>
<p>Riak controla tantas réplicas como datos son mantenidos a través de una configuración llamada <em>n-valor</em>. Este valor tiene una configuración por defecto en cada nodo pero puede ser sobreescrito por cada bucket. Los objetos de Riak heredan el n-valor de su bucket padre. Todos los nodos en el mismo cluster deben de acordar y usar el mismo n-valor.</p>
<p>Por ejemplo, aquí hay una representación de que sucede cuando n-valor es 3 (esta es la configuración por defecto). Cuando almacenas el dato en el bucket con un n-valor de tres, el dato se replicará a tres particiones separadas del anillo.</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/riak-data-distribution.png"><img src="http://bosqueviejo.net/wp-content/uploads/riak-data-distribution-300x157.png" alt="" title="riak-data-distribution" width="300" height="157" class="aligncenter size-medium wp-image-870" /></a></p>
<h3>Y cuando un nodo falla o se agrega otro nodo, ¿qué sucede?</h3>
<p>Riak usa una técnica llamada <strong>hinted handoff</strong>, para compensar el cluster en el momento que un nodo falla. Los vecinos del nodo fallido tomarán relevo y realizarán el trabajo de ese nodo permitiendo al cluster trabajar de forma normal. Esto puede considerarse una forma de auto-curación.</p>
<p>Si se agrega un nodo nuevo, en cambio, se rebalancean los datos.</p>
<h3>Algunas pegas&#8230; siempre las hay</h3>
<p>Primero, los buckets que usan un conjunto de propiedades no estandar forzarán a Riak a enviar vía gossip más datos a través del cluster. Los datos adicionales pueden ralentizar el proceso. Segundo, algunos backends, como Innostore, almacenan cada bucket como una entidad separada. Esto puede causar que nos quedemos sin recursos tales como manejadores de ficheros. Estas restricciones de recursos pueden no impactar al rendimiento, pero representarán otro límite en el máximo número de buckets a gestionar.</p>
<h3>Conclusiones</h3>
<p>A nivel teórico, todo bien, parece. Habrá que realizar un banco de pruebas y ver qué tal va el sistema. De momento, me he quedado sin tiempo (del que había planificado) para escribir este artículo, por lo que, dejo las pruebas para la siguiente parte&#8230; que entraremos de lleno en la práctica.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang, ¿realmente lo entienden?</title>
		<link>http://bosqueviejo.net/2011/08/11/erlang-realmente-lo-entienden/</link>
		<comments>http://bosqueviejo.net/2011/08/11/erlang-realmente-lo-entienden/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 15:17:50 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[programación concurrente]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=826</guid>
		<description><![CDATA[ Después de leer varios artículos sobre Erlang, algunos defendiéndolo y otros criticándolo, me doy cuenta de que, realmente, no todo el mundo entiende lo que es y significa este lenguaje. En sí, no es el lenguaje, sino la metodología que hay detrás la que está moviendo el hecho de que los lenguajes funcionales sean como son y sirvan, de la forma correcta, a los propósitos para los que fueron creados.
Criticando su estilo
Es curioso que gente como Damien Katz (creador de CouchDB), o Toni Arcieri (creador de Reia) hayan sido de los primeros (o al menos los que he encontrado) que hayan arrojado una piedra en contra del lenguaje que eligieron para desarrollar elementos que han sido bastante respetados, apoyados y usados.
En este aspecto, otros como Yariv Sadan, han defendido y reconocido algunos de estos comentarios y, tras leer a unos y a otros, me queda la pregunta de, ¿realmente han entendido para qué sirve Erlang?, ¿qué hace y cuales son sus potencias?, ¿cómo sacarle el máximo provecho así como programar orientados a la concurrencia?
Crítica a la sintaxis
Lo primero que critican de Erlang es su sintaxis. Recuerdo la primera vez que vi el lenguaje C, después de haber programado en [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/criticar_discernir_2-150x150.png" alt="" title="criticar_discernir_2" width="150" height="150" class="alignleft size-thumbnail wp-image-828" /> Después de leer varios artículos sobre Erlang, algunos defendiéndolo y otros criticándolo, me doy cuenta de que, realmente, no todo el mundo entiende lo que es y significa este lenguaje. En sí, no es el lenguaje, sino la metodología que hay detrás la que está moviendo el hecho de que los lenguajes funcionales sean como son y sirvan, de la forma correcta, a los propósitos para los que fueron creados.</p>
<h3>Criticando su estilo</h3>
<p>Es curioso que gente como <a href="http://damienkatz.net/">Damien Katz</a> (creador de <a href="http://couchdb.apache.org/">CouchDB</a>), o <a href="http://www.unlimitednovelty.com/">Toni Arcieri</a> (creador de <a href="http://reia-lang.org/">Reia</a>) hayan sido de los primeros (o al menos los que he encontrado) que hayan arrojado una piedra en contra del lenguaje que eligieron para desarrollar elementos que han sido bastante respetados, apoyados y usados.</p>
<p>En este aspecto, otros como <a href="http://yarivsblog.blogspot.com/">Yariv Sadan</a>, han defendido y reconocido algunos de estos comentarios y, tras leer a unos y a otros, me queda la pregunta de, <strong>¿realmente han entendido para qué sirve Erlang?, ¿qué hace y cuales son sus potencias?, ¿cómo sacarle el máximo provecho así como programar orientados a la concurrencia?</strong></p>
<h3>Crítica a la sintaxis</h3>
<p>Lo primero que critican de Erlang es su sintaxis. Recuerdo la primera vez que vi el lenguaje C, después de haber programado en Basic, Pascal y Modula-2 que dije&#8230; ¡qué raro! y ya ni digamos de cuando unos años más tarde comencé a ver Perl&#8230; <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>La sintaxis C-like, como dicen muchos, es muy extendida, pero no es nada comprensible para una persona que comienza desde cero. Niklaus Wirth desarrollo por esto mismo lenguajes como Pascal, para que sirviesen de aprendizaje al modo pseudocódigo. Un código que nada más leerlo, se entienda.</p>
<p>Erlang, en cambio, sigue una metodología más como Prolog, está orientado al desarrollo de funciones matemáticas, por ello, la función tiene una <em>conclusión</em> (->) para su comienzo y termina con un <em>punto final</em>. Cada elemento dentro de la función o expresión matemática se separa por comas, y todo es funcional, es decir, todo elemento en Erlang hace algo y DEBE retornar algo, incluso las estructuras condicionales, por eso tiene la forma que tiene.</p>
<h3>Tipos de datos: registros y cadenas de caracteres</h3>
<p>Los registros, son a nivel de preprocesador: tuplas. Esto quiere decir que funciones del tipo <em>record_info</em> no existen realmente, por lo que no se pueden emplear variables para pasarle a esa macro y queda el espectro del uso de los registros algo limitado. No obstante, hay algunos trucos que se pueden emplear y existen para paliar esto, en caso de que se requiera/necesite.</p>
<p>Otro de los problemas, con los tipos de datos, son las cadenas de caracteres, las cuales son listas de enteros. Esto no debe de extrañarnos, ya que en todos los lenguajes son listas (o arrays, o vectores) de bytes. En lenguaje C, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> c<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Esto es una cadena&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> d<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">'E'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'s'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'t'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'o'</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">32</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'e'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'s'</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">32</span><span style="color: #339933;">,</span> ...<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> strcmp<span style="color: #009900;">&#40;</span>c<span style="color: #339933;">,</span> d<span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">?</span> <span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #339933;">:</span> <span style="color: #ff0000;">&quot;false&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Esto nos dará verdadero, ya que ambas son listas de bytes, al igual que en Erlang podemos ver algo parecido con las listas de enteros:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #109ab8;">&#91;</span><span style="color: #ff9600;">100</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">111</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">103</span><span style="color: #109ab8;">&#93;</span> <span style="color: #014ea4;">==</span> <span style="color: #ff7800;">&quot;dog&quot;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Lo cual también retornará verdadero.</p>
<h3>Rendimiento: Churras con Merinas</h3>
<p>Realmente, al leer el artículo de <a href="http://www.unlimitednovelty.com/2011/07/trouble-with-erlang-or-erlang-is-ghetto.html">Toni</a>, cuando llego al punto que dice: <em>Erlang sucks at managing memory</em>; habla de una comparación entre Erlang y <a href="http://www.azulsystems.com/products/vega/processor">Azul Vega</a>, un procesador de 54 cores optimizado para ejecutar la JVM.</p>
<p>Un programa con ese procesador y esa JVM, NO se ejecutaría de forma distribuida, realmente, ya que solo se distribuyen las tareas posibles e internas de la JVM entre los cores, en tanto y en cuanto se puedan distribuir estas tareas. No obstante, no está diseñado para conectarse con otros nodos, por lo que NO es escalable. Además, solo tiene cuatro canales para acceso a memoria, por lo que, 27 máquinas de Pentium IV con HyperThreading podrían hacer ese mismo trabajo con Erlang&#8230; y aún así aún podríamos poner más hierro a bajo coste para seguir escalando y mejorando el rendimiento del software desarrollado.</p>
<h3>¿Es un lenguaje de propósito general?</h3>
<p>Erlang fue creado para entornos en los que hubiese que desarrollar software con alto grado de concurrencia, esto lo hace ideal para entornos servidores de cualquier tipo, y actualmente, para los escritorios modernos, donde los programas se ejecutan de forma concurrente, claro.</p>
<p>¿Elrang puede desarrollar web? Sí, ejemplos como ChicagoBoss, o Erlyweb, o Nitrogen lo atestiguan. ¿Erlang puede desarrollar aplicaciones de escritorio? Sí, ejemplos como Wings3D dan crédito de ello. ¿Erlang sirve para desarrollar aplicaciones de servidor? ¡Claro!, para eso fue creado.</p>
<p>En mi opinión, si PHP tiene esa denominación y es un lenguaje de marcas, Erlang DEBE de tenerla <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<h3>Asignación única&#8230; ¿por qué?</h3>
<p>Para trazar mejor los códigos, claro, y porque bien pensado, un lenguaje funcional no requiere del uso de tantas variables, por ejemplo, tal y como decía Damien Katz en su artículo, tienes este código:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">f</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
  <span style="color: #45b3e6;">X1</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">foo</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
  <span style="color: #45b3e6;">X2</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">bar</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X1</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
  <span style="color: #ff3c00;">baz</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X2</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Este código, bien escrito, sería:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">f</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
  <span style="color: #ff3c00;">baz</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff3c00;">bar</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff3c00;">foo</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>¿Quieres agregar logs para que se vean en el cambio de funciones y no los quieres poner dentro de las propias funciones, sino entre las llamadas&#8230; pues puedes hacerlo con otras funciones:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">log</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Caller</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</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;~s: ~p~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Caller</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #6bb810;">.</span>
<span style="color: #ff3c00;">f</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
  <span style="color: #ff3c00;">log</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;BAZ: &quot;</span><span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">baz</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff3c00;">log</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;BAR: &quot;</span><span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">bar</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff3c00;">log</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;FOO: &quot;</span><span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">foo</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Realmente no es complejo si se escribe y ordena el código de forma adecuada&#8230; en otros lenguajes, como por ejemplo C, se pueden escribir cosas como esta:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Parsea la cadena&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> size<span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> size<span style="color: #339933;">;</span> s<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span> <span style="color: #339933;">&amp;&amp;</span> i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">100</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++,</span> size<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">;</span></pre></div></div>

<p>Otros códigos en Perl dan incluso hasta más miedo&#8230; pero es como siempre se dice&#8230; depende del programador.</p>
<h3>El desarrollo en sí</h3>
<p>Lo que creo que no se entiende, es que el desarrollo en Erlang, como tal, no es ni escalable, ni redundante, ni aprovecha todos los núcleos y procesadores de las máquinas, así como el resto de núcleos que estén conectados. El hecho de que se pueda aprovechar la forma en la que Erlang fue diseñado, es desarrollar el software de forma concurrente. Con los patrones adecuados.</p>
<p>Por ejemplo, Erlang puede, en un solo nodo, ejecutar casi 2 millones de procesos concurrentes. Esto quiere decir que, cada tarea que haya que realizar, debería de correr en su propio proceso, y este proceso es el que se lanza en el núcleo, procesador y nodo que corresponda. Como cuando se desarrollaba en PVM o MPICH.</p>
<p>Emplear los patrones de OTP es esencial para sacar el máximo provecho de la arquitectura de Erlang, y el crear manejadores de eventos, máquinas de estos, memorias compartidas a través de servidores, etc. debe de realizarse, necesariamente a través de los mecanismos que aporta Erlang.</p>
<p>Si se emplease Erlang para hacer llamadas a Mnesia, desde cualquier parte del código con las llamadas <em>dirty</em> y generando un nuevo proceso por cada petición aislada, tendríamos un programa que puede tiene potenciales errores de concurrencia, y que no aprovecha los nodos que tenga configurados y conectados el sistema.</p>
<h3>Conclusión</h3>
<p>Me parece muy poco profesional escribir este tipo de artículos, tanto para Tony como para Damien, en los que ponen una serie de circunstancias poco contrastadas y debidas al bajo conocimiento del lenguaje y, precisamente ellos, que han desarrollado grandes herramientas en este lenguaje.</p>
<p>Java, igualmente, es un gran lenguaje, pero como el mismo Tony comenta, requiere de que la JVM cumpla la especificación RTSJ y, en las comparaciones, por ejemplo, hablan incluso de que habría que adquirir un hardware especial para poder desarrollar algo parecido a lo que Erlang hace en cualquier arquitectura, creo que son muy poco objetivos.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/08/11/erlang-realmente-lo-entienden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FSM: Máquina de Estados en Erlang</title>
		<link>http://bosqueviejo.net/2011/08/03/fsm-maquina-de-estados-en-erlang/</link>
		<comments>http://bosqueviejo.net/2011/08/03/fsm-maquina-de-estados-en-erlang/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 11:40:30 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[gen_fsm]]></category>
		<category><![CDATA[otp]]></category>
		<category><![CDATA[programación concurrente]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=810</guid>
		<description><![CDATA[ FSM o Finite State Machine, lo que podríamos traducir como máquina de estados finitos, es una de las potentes herramientas que nos proporciona OTP para el desarrollo de aplicaciones y soluciones.
Las máquinas de estados finitos se pueden emplear para definir los elementos con los que debe de interactuar una aplicación, y que puede darse el caso de iniciar su existencia (por llamarlo de alguna forma) en un estado definido, y mediante una sucesión ordenada o específica de eventos, ir realizando las transiciones específicas, hasta su finalización.
Una máquina de estados finitos puede ser algo tan simple como un despertador (o sistema de cron), o una transacción bancaria, o una llamada telefónica, &#8230;
En este artículo voy a desarrollar un ejemplo para que se vea lo simple que es realizar este tipo de desarrollos en Erlang, usando OTP.
El generador de máquinas de estados
En el conjunto de funciones OTP de Erlang, hay uno específico que recibe el nombre de gen_fsm. Esta es la acortación de generator: finite state machine. Como su nombre indica es un generador. Los generadores, en Erlang/OTP son comportamientos, código base que se emplea, a modo de framework, para desarrollar un comportamiento específico.
Un módulo en Erlang es tan simple como [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/erlang-150x150.jpg" alt="" title="erlang" width="150" height="150" class="alignleft size-thumbnail wp-image-822" /> FSM o Finite State Machine, lo que podríamos traducir como máquina de estados finitos, es una de las potentes herramientas que nos proporciona OTP para el desarrollo de aplicaciones y soluciones.</p>
<p>Las máquinas de estados finitos se pueden emplear para definir los elementos con los que debe de interactuar una aplicación, y que puede darse el caso de iniciar su existencia (por llamarlo de alguna forma) en un estado definido, y mediante una sucesión ordenada o específica de eventos, ir realizando las transiciones específicas, hasta su finalización.</p>
<p>Una máquina de estados finitos puede ser algo tan simple como un despertador (o sistema de cron), o una transacción bancaria, o una llamada telefónica, &#8230;</p>
<p>En este artículo voy a desarrollar un ejemplo para que se vea lo simple que es realizar este tipo de desarrollos en Erlang, usando OTP.</p>
<h3>El generador de máquinas de estados</h3>
<p>En el conjunto de funciones OTP de Erlang, hay uno específico que recibe el nombre de <em>gen_fsm</em>. Esta es la acortación de <em>generator: finite state machine</em>. Como su nombre indica es un generador. Los generadores, en Erlang/OTP son comportamientos, código base que se emplea, a modo de framework, para desarrollar un comportamiento específico.</p>
<p>Un módulo en Erlang es tan simple como definir la primera línea diciendo el nombre del módulo, especificar la exportación de funciones, y acto seguido definir las funciones. El módulo más pequeño podría constar, sin problemas, de tres líneas de código.</p>
<p>Los generadores son distintos, ya que necesitan de la línea específica que indica de qué comportamiento (<em>behaviour</em>) vamos a tomar el código base, y la definición de todos los <em>callbacks</em> para el código base.</p>
<p>En sí, el <em>gen_fsm</em> es el código base que se mantendrá en ejecución y, ante la llegada de un evento, realizará una llamada a una función específica. Por convención, los <em>callbacks</em> tienen una forma específica, tanto en nombre como en parámetros, y los retornos también están normalizados.</p>
<p>Para facilitar las cosas, nos basaremos en <a href="http://erldev.org/browser/trunk/templates/gen_fsm.erl">esta plantilla</a>, pero suprimiremos los comentarios para que no ocupe mucho.</p>
<h3>Ejemplo del ascensor</h3>
<p>El ejemplo que voy a poner va a ser muy simple. Supongamos que tenemos un ascensor de tres plantas: bajo, primera y segunda. Este ascensor tiene solo dos botones etiquetados como: subir y bajar; para en todas las plantas cada vez. Por tanto, según en la planta que esté, los botones tienen funciones válidas, o no.</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/ascensor_simple-300x150.png" alt="" title="ascensor_simple" width="300" height="150" class="aligncenter size-medium wp-image-816" /></p>
<p>Si estamos dentro del ascensor en la primera planta, pulsemos el botón subir o bajar, el ascensor tendrá un estado al que saltar&#8230; pero si estamos en la planta bajo, por ejemplo, presionar el botón de bajar no tiene sentido.</p>
<h3>Desarrollando la solución</h3>
<p>El código, tomando la plantilla del <em>gen_fsm</em> sería bastante simple. Tenemos tres estados y dos eventos por estado. Esto nos hace tener un total de seis funciones a desarrollar:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>ascensor<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">behaviour</span><span style="color: #109ab8;">&#40;</span>gen_fsm<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">compile</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>export_all<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span> <span style="color: #666666; font-style: italic;">% para simplificar, cambiar por -export().</span>
&nbsp;
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">record</span><span style="color: #109ab8;">&#40;</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
start_<span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff4e18;">gen_fsm</span>:<span style="color: #006600;">start_</span><span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#123;</span>local<span style="color: #6bb810;">,</span> ?<span style="color: #6941fd;">MODULE</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> ?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">init</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> planta_baja<span style="color: #6bb810;">,</span> #<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">planta_baja</span><span style="color: #109ab8;">&#40;</span>bajar<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Beeep!, opcion incorrecta~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_baja<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_baja</span><span style="color: #109ab8;">&#40;</span>subir<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Subiendo a la planta primera~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_primera<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">planta_primera</span><span style="color: #109ab8;">&#40;</span>bajar<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Bajando a la planta baja~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_baja<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_primera</span><span style="color: #109ab8;">&#40;</span>subir<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Subiendo a la planta segunda~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_segunda<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">planta_segunda</span><span style="color: #109ab8;">&#40;</span>bajar<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Bajando a la planta primera~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_primera<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_segunda</span><span style="color: #109ab8;">&#40;</span>subir<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Beeep!, opcion incorrecta~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_segunda<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">% agregamos funciones para facilitar las llamadas</span>
<span style="color: #666666; font-style: italic;">% estas son opcionales:</span>
&nbsp;
<span style="color: #ff3c00;">boton_subir</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff4e18;">gen_fsm</span>:<span style="color: #ff3c00;">send_event</span><span style="color: #109ab8;">&#40;</span>?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> subir<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">boton_bajar</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff4e18;">gen_fsm</span>:<span style="color: #ff3c00;">send_event</span><span style="color: #109ab8;">&#40;</span>?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> bajar<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Si se mira la imagen, y la conversión al código, se verá que hay una relación directa entre el esquema que se dibuja y cómo se programa el módulo en sí. Esto hace que sea muy fácil desarrollar un sistema de estados relativo a temas de los que ya comentábamos antes algunos: transferencia bancaria, pago por internet, subasta con varios participantes, una llamada telefónica, un concurso, un videojuego, etc.</p>
<h3>Cómo funciona</h3>
<p>Las funciones de <em>start_link</em>, y las que se definen abajo, no son realmente del sistema en sí, sino que son facilitadores del trabajo de lanzar la máquina de estados e interactuar con ella.</p>
<p>La máquina de estados, nada más lanzarse, lo primero que hace es ejecutar <em>init</em>. La ejecución de esta función deja un estado marcado como el que está en ejecución, y permite pasar los datos que se mantienen entre llamadas o generación de eventos al FSM.</p>
<p>Una vez está en ejecución, el código base es el que se encarga de llamar a la función con el estado actual en el que se encuentra, cuando se recibe el estado que debe de casar con el que se indica como parámetro.</p>
<h3>Ejecutando el código</h3>
<p>Una vez escrito el código, podemos entrar en la máquina virtual de Erlang y ejecutarlo sin problemas:</p>
<pre>
$ erl
[...]
1> c(ascensor). % compila el código.
{ok,ascensor}
2> ascensor:start_link(). % lanzamos la máquina de estados.
{ok,<0.38.0>}
3> ascensor:boton_bajar().
Beeep!, opcion incorrecta
ok
4> ascensor:boton_subir().
Subiendo a la planta primera
ok
</pre>
<p>La máquina de estados va realizando las llamadas a las funciones, según el estado en el que se encuentre y el evento que se pase.</p>
<h3>Agregamos tiempo</h3>
<p>Una de las cosas buenas que tiene FSM, es que, no solo afectan los eventos provocados por una llamada, sino también por tiempo, por lo que, en el caso de ejemplo, podemos agregar que, no se mantenga en una misma planta más de 5 segundos, yendo de arriba hacia abajo cada vez, a menos que se indique lo contrario.</p>
<p>Aquí también necesitaremos la memoria para saber, en caso de que vengamos de arriba, que siga hacia abajo, cuando llegue a la planta primera, y viceversa.</p>
<p>Agregar memoria es tan simple como modificar el registro del estado para decirle la dirección que se lleva:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">record</span><span style="color: #109ab8;">&#40;</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>direccion<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">init</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> planta_baja<span style="color: #6bb810;">,</span> #<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>direccion<span style="color: #014ea4;">=</span>subir<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>El tiempo se mide en milisegundos, con lo que, este código hará que, el ascensor se inicie y, si no llega ningún evento en 5 segundos, el ascensor subirá solo. En este caso se agrega un nuevo evento:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/ascensor_timeout-300x150.png" alt="" title="ascensor_timeout" width="300" height="150" class="aligncenter size-medium wp-image-820" /></p>
<p>Las nuevas funciones:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">planta_baja</span><span style="color: #109ab8;">&#40;</span>bajar<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_State</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;Beeep!, opcion incorrecta~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_baja<span style="color: #6bb810;">,</span> #<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>direccion<span style="color: #014ea4;">=</span>subir<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_baja</span><span style="color: #109ab8;">&#40;</span>subir<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_State</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;Subiendo a la planta primera~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_primera<span style="color: #6bb810;">,</span> #<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>direccion<span style="color: #014ea4;">=</span>subir<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_baja</span><span style="color: #109ab8;">&#40;</span>timeout<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_State</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;Subiendo automatico a la planta primera~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_primera<span style="color: #6bb810;">,</span> #<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>direccion<span style="color: #014ea4;">=</span>subir<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">planta_primera</span><span style="color: #109ab8;">&#40;</span>bajar<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Bajando a la planta baja~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_baja<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_primera</span><span style="color: #109ab8;">&#40;</span>subir<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Subiendo a la planta segunda~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_segunda<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_primera</span><span style="color: #109ab8;">&#40;</span>timeout<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #45b3e6;">NextState</span> <span style="color: #014ea4;">=</span> <span style="color: #186895;">case</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">.</span>direccion <span style="color: #186895;">of</span>
        subir <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;Subiendo a planta segunda~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
            planta_segunda<span style="color: #6bb810;">;</span>
        bajar <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;Bajando a planta baja~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
            planta_baja
    <span style="color: #186895;">end</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NextState</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">planta_segunda</span><span style="color: #109ab8;">&#40;</span>bajar<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Bajando a la planta primera~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_primera<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_segunda</span><span style="color: #109ab8;">&#40;</span>subir<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</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;Beeep!, opcion incorrecta~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_segunda<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">planta_segunda</span><span style="color: #109ab8;">&#40;</span>timeout<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_State</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;Bajando automatico a la planta primera~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>next_state<span style="color: #6bb810;">,</span> planta_primera<span style="color: #6bb810;">,</span> #<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>direccion<span style="color: #014ea4;">=</span>bajar<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">5000</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Con esto, ya tenemos nuestros tres estados, con los tres eventos posibles, es decir, la programación de las nueve funciones posibles que se pueden dar en ejecución.</p>
<p>En caso de tener muchos más estados, se podría usar el formato <em>handle_event</em>, de modo que el nombre de estado viajaría en modo de parámetro y se podría gestionar mediante código. Los eventos ya lo hacen así, por lo que en este sentido, se pueden unificar u optimizar en caso de ser mucho más numerosos.</p>
<h3>Conclusión</h3>
<p>Los sistemas FSM para Erlang, nos dan una gran potencia al poder realizar, de forma fácil, un elemento que, en caso de ser consultado o que se generen los eventos desde varios puntos concurrentes, su interfaz hace que su comportamiento sea el esperado en cada momento.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/08/03/fsm-maquina-de-estados-en-erlang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Elixir, Reia, Efene, LFE&#8230; Lenguajes imperativos sobre Erlang</title>
		<link>http://bosqueviejo.net/2011/07/31/elixir-reia-efene-lfe-lenguajes-imperativos-sobre-erlang/</link>
		<comments>http://bosqueviejo.net/2011/07/31/elixir-reia-efene-lfe-lenguajes-imperativos-sobre-erlang/#comments</comments>
		<pubDate>Sun, 31 Jul 2011 05:00:57 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[analizador léxico]]></category>
		<category><![CDATA[analizador sintáctico]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[efene]]></category>
		<category><![CDATA[elixir]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[leex]]></category>
		<category><![CDATA[reia]]></category>
		<category><![CDATA[yecc]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=771</guid>
		<description><![CDATA[ Llevo un tiempo interesado en los analizadores léxicos y sintácticos para poder crear ficheros de configuración más amigables o sistemas de interfaces de usuario basados en consola que puedan emplear un formato libre de construcción de instrucciones (algo más complejo que el típico comando y argumentos). Eso sumado a mi afición por Erlang dio como resultado el encontrar: leex y yecc; un analizador léxico y sintáctico respectivamente.
Estas búsquedas, igualmente, dieron con una serie de lenguajes nuevos, que han sido desarrollados usando estos analizadores, sobre Erlang, por lo que aprovechan sus ventajas, y salvan algunos de los inconvenientes que tienen algunas personas al ver Erlang por primera vez, con respecto a la sintaxis del lenguaje y la asignación única de variables.
Reia
Con el primer lenguaje que me topé fue Reia, del cual hablé ya en otra ocasión. Este lenguaje fue desarrollado por una persona a la que le gusta mucho la sintaxis particular de Python y Ruby, pero también es muy aficionado a Erlang. Las primeras versiones de Reia tenían un formato muy parecido a Python con tintes de Ruby, y fue modificándose poco a poco, haciendo que cada vez más, se pareciese a Ruby.
La última noticia que he tenido sobre [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/lenguajes-150x150.jpg" alt="" title="lenguajes" width="150" height="150" class="alignleft size-thumbnail wp-image-774" /> Llevo un tiempo interesado en los analizadores léxicos y sintácticos para poder crear ficheros de configuración más amigables o sistemas de interfaces de usuario basados en consola que puedan emplear un formato libre de construcción de instrucciones (algo más complejo que el típico comando y argumentos). Eso sumado a mi afición por Erlang dio como resultado el encontrar: <a href="http://www.erlang.org/doc/man/leex.html">leex</a> y <a href="http://www.erlang.org/doc/man/yecc.html">yecc</a>; un analizador léxico y sintáctico respectivamente.</p>
<p>Estas búsquedas, igualmente, dieron con una serie de lenguajes nuevos, que han sido desarrollados usando estos analizadores, sobre Erlang, por lo que aprovechan sus ventajas, y salvan algunos de los inconvenientes que tienen algunas personas al ver Erlang por primera vez, con respecto a la sintaxis del lenguaje y la asignación única de variables.</p>
<h3>Reia</h3>
<p>Con el primer lenguaje que me topé fue Reia, del cual <a href="http://bosqueviejo.net/2009/03/18/reia-ruby-sobre-erlang/">hablé ya en otra ocasión</a>. Este lenguaje fue desarrollado por una persona a la que le gusta mucho la sintaxis particular de Python y Ruby, pero también es muy aficionado a Erlang. Las primeras versiones de Reia tenían un formato muy parecido a Python con tintes de Ruby, y fue modificándose poco a poco, haciendo que cada vez más, se pareciese a Ruby.</p>
<p>La última noticia que he tenido sobre Reia, es que su desarrollador ha decidido <a href="http://www.unlimitednovelty.com/2011/06/why-im-stopping-work-on-reia.html">abandonar su desarrollo</a>, debido a que encontró otro lenguaje muy parecido, hecho de la misma forma, y que considera que se desarrolló de una forma mucho más elegante. Este lenguaje es Elixir. Por lo que, junto con el autor del lenguaje, Jose Valim, Tony (creador de Reia), se sumará a la lista de desarrolladores de Elixir.</p>
<p>Un ejemplo del lenguaje (aunque se puede ver en el <a href="http://bosqueviejo.net/2009/03/18/reia-ruby-sobre-erlang/">artículo anterior</a>):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Hello, world!</span>
<span style="color:#996600;">&quot;Hello, world!&quot;</span>.<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<h3>LFE</h3>
<p>Un lenguaje que también me ha llamado la atención, aunque al igual que Erlang, su sintaxis es algo <em>rara</em> para programadores del tipo Java, PHP, Ruby, Python y similares, es LFE (Lisp Flavoured Erlang, algo como Erlang con sabor a Lisp). Este lenguaje, desarrollado por Robert Virding, es una sintaxis de Lisp sobre Erlang.</p>
<p>Se encarga de traducir la sintaxis exacta de lo que se escribe a código Erlang. Un ejemplo de lo que se escribiría en LFE:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defmodule myhello
  <span style="color: #66cc66;">&#40;</span>export <span style="color: #66cc66;">&#40;</span>start <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> start <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span> <span style="color: #555;">io</span> format '<span style="color: #ff0000;">&quot;Hello World!~n&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Se traduciría así en código Erlang:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>myhello<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>start<span style="color: #014ea4;">/</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">start</span><span style="color: #109ab8;">&#40;</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;Hello Wordl!~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>El sistema no tiene una forma fácil de compilar, pero el sistema está bien desarrollado y para los amantes de la sintaxis Lisp o Scheme es una gran oportunidad de poder desarrollar en ese entorno.</p>
<p>La ventaja de LFE, es que mantiene completamente la ideología en sí de Erlang y solo cambia la sintaxis, por lo que la metodología de OTP es completamente válida y se puede emplear al 100% como si de Erlang en sí se tratara.</p>
<h3>Elixir</h3>
<p>Lo descubrí a través de Reia. <a href="https://github.com/josevalim/elixir">Este lenguaje</a>, al igual que Reia, se basa en Ruby, sin tintes de Python. Ofrece una orientación a objetos más fuerte que Ruby y que Reia, ya que ni tan siquiera admite funciones de tipo <em>built-in</em> como <em>puts</em>, todos los métodos deben de pertenecer a un objeto.</p>
<p>La motivación e influencias en la creación de Elixir fueron, precisamente, Reia y LFE, según afirma el propio <a href="http://www.unlimitednovelty.com/2011/06/why-im-stopping-work-on-reia.html#c2707927594896065776">Jose Vallim en su respuesta</a> a la noticia de Tony de parar el desarrollo de Reia.</p>
<p>Este lenguaje, permite además, hacer scripting, por lo que da una mayor versatilidad. El lenguaje es muy parecido (tiene algunas variaciones) que Ruby y tiene acceso a módulos Erlang de forma sencilla.</p>
<p>Un ejemplo del código:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> Hello
  <span style="color:#9966CC; font-weight:bold;">def</span> world
    <span style="color:#CC00FF; font-weight:bold;">IO</span>.<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Hello World&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Elixir respeta un poco, o intenta llevar a su sintaxis, el paradigma de OTP de una forma más o menos asequible. En el ejemplo <a href="https://github.com/josevalim/elixir/blob/master/examples/gen_server_bookshelf.exs">gen_server_bookshelf</a>, se muestra cómo crear un gen_server y las diferencias que agrega al paradigma de OTP, debido a la propia ideología del lenguaje. El uso del <em>pattern matching</em> en los argumentos de las llamadas hace que se vea muy parecido a Erlang por lo que es un buen ejemplo de cambio de sintaxis manteniendo la potencia de Erlang por debajo.</p>
<h3>Efene</h3>
<p>Desarrollado por Marion Guerra y basado en la sintaxis de JavaScript y Python, <a href="http://www.marianoguerra.com.ar/efene/">Efene</a> es otro de los lenguajes que se ejecuta sobre la máquina virtual de Erlang.</p>
<p>Un ejemplo de este lenguaje:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"># classic hello world
&nbsp;
hello <span style="color: #339933;">=</span> fn <span style="color: #009900;">&#40;</span>Who<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    io.<span style="color: #660066;">format</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;hello ~s!~n&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span>Who<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #339933;">@</span><span style="color: #003366; font-weight: bold;">public</span>
run <span style="color: #339933;">=</span> fn <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    hello<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;world&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La sintaxis del lenguaje, para los que prefieran el formato de tipo JavaScript, será más cómoda, y el uso de los módulos se abstrae, permitiendo usar los que ya trae consigo Erlang (ejemplo el io.format, que es una traducción para el io:format de Erlang).</p>
<p>El defecto viene quizás en el hecho de que efene no tiene soporte de procesos, por lo que el lanzamiento de los mismos, junto con la posibilidad de usar el paradigma de OTP encubierto en el propio lenguaje, se anula completamente.</p>
<h3>Conclusiones</h3>
<p>Muchos de los lenguajes tienen la potencia de aportar una nueva sintaxis, que era el gran problema que le veían muchos programadores a Erlang, sobre una potente infraestructura. No obstante, el paradigma de programación que introduce Erlang a través de OTP queda un poco tapado o incluso anulado en algunos de estos lenguajes, afortunadamente, de los vistos, solo efene.</p>
<p>En sí, quien programa en Erlang, y termina usando y viendo el paradigma del lenguaje en sí, la programación funcional, OTP y su sintaxis, es normal que no quiera abstraerse a otro tipo de sintaxis. No obstante, admito que a veces, tener otra sintaxis más amigable se agradece, no solo por ver mejor el lenguaje, sino también para introducir a más gente en él.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/07/31/elixir-reia-efene-lfe-lenguajes-imperativos-sobre-erlang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ChicagoBoss: web y erlang&#8230; cada vez más cerca</title>
		<link>http://bosqueviejo.net/2011/05/16/chicagoboss-web-y-erlang-cada-vez-mas-cerca/</link>
		<comments>http://bosqueviejo.net/2011/05/16/chicagoboss-web-y-erlang-cada-vez-mas-cerca/#comments</comments>
		<pubDate>Mon, 16 May 2011 16:33:28 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[chicagoboss]]></category>
		<category><![CDATA[desarrollo ágil]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[erlydtl]]></category>
		<category><![CDATA[evan miller]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[rails]]></category>

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

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

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://bosqueviejo.net/?p=525</guid>
		<description><![CDATA[Llevo algún tiempo trabajando con Erlang/OTP y con sus facilidades a la hora de realizar prácticamente cualquier cosa. En lo que respecta al desarrollo de servicios concurrentes, de alta disponibilidad y sistemas críticos, es ideal.
Lo único que ha sido una piedra en el camino, es la curva de aprendizaje y la cantidad de código a modo de plantilla que hace falta para poder programar de forma rápida.
Por todo esto, decidí hacer un sistema de scripts (para Mac OS X y GNU/Linux, en principio, aunque en sistemas Solaris, HPUX, AIX, BSD, y demás sabores de Unix pueda funcionar sin cambios, e incluso en Windows a través de Cygwin), que faciliten la creación de proyectos y módulos de tipo OTP dentro del proyecto que se quiera desarrollar.
Trabajando con Erlang/OTP
En principio, cuando se realiza un proyecto de tipo Erlang/OTP, es normal tener un entorno que pueda compilar y ejecutar el código de forma adecuada. Una vez se quiere pasar eso a producción, tal y como funcionan estos elementos que son de tipo servidor, se debe de realizar la ejecución de forma que cargue la aplicación y la lance junto con todas sus dependencias.
En este aspecto, los procedimientos para realizar estas tareas son algo [...]]]></description>
			<content:encoded><![CDATA[<p>Llevo algún tiempo trabajando con Erlang/OTP y con sus facilidades a la hora de realizar prácticamente cualquier cosa. En lo que respecta al desarrollo de servicios concurrentes, de alta disponibilidad y sistemas críticos, es ideal.</p>
<p>Lo único que ha sido una piedra en el camino, es la curva de aprendizaje y la cantidad de código a modo de plantilla que hace falta para poder programar de forma rápida.</p>
<p>Por todo esto, decidí hacer un sistema de scripts (para Mac OS X y GNU/Linux, en principio, aunque en sistemas Solaris, HPUX, AIX, BSD, y demás sabores de Unix pueda funcionar sin cambios, e incluso en Windows a través de Cygwin), que faciliten la creación de proyectos y módulos de tipo OTP dentro del proyecto que se quiera desarrollar.</p>
<h3>Trabajando con Erlang/OTP</h3>
<p>En principio, cuando se realiza un proyecto de tipo Erlang/OTP, es normal tener un entorno que pueda compilar y ejecutar el código de forma adecuada. Una vez se quiere pasar eso a producción, tal y como funcionan estos elementos que son de tipo servidor, se debe de realizar la ejecución de forma que cargue la aplicación y la lance junto con todas sus dependencias.</p>
<p>En este aspecto, los procedimientos para realizar estas tareas son algo tediosos y muy repetitivos, ya que por cada aplicación hay que generar un fichero de tipo <em>app</em> que describa y configure el entorno en el que se va a ejecutar la aplicación, un fichero de tipo <em>rel</em> que especifique las dependencias y el código en sí que se debe de poner en producción, además del código en sí, un módulo que debe obtener el <a href="http://www.erlang.org/doc/design_principles/applications.html">comportamiento específico de la aplicación</a> (behaviour application).</p>
<p>Una vez realizado todo esto, tenemos la base para la instalación. Pero el sistema debe de poder construirse, por lo que hace falta algo como <em>make</em> (<a href="http://www.erlang.org/doc/man/make.html">erlang tiene un sistema make integrado</a> que puede usarse fácilmente), que permita compilar y limpiar el entorno de trabajo, así como instalar el resultado.</p>
<p>La creación de este entorno, ya sabiendo lo que había que ir poniendo y tratando de no olvidar nada, me llevaba mucho tiempo, por lo que me decanté por construir un sistema genérico que pudiese realizar estas tareas de forma automática.</p>
<h3>ErlDev</h3>
<p>El sistema <a href="http://project.bosqueviejo.net/erldev">ErlDev</a> consiste en una serie de <em>scripts</em> que se encargan de realizar las tareas básicas, pero más costosas y propensas a error, que se originan al principio del proyecto.</p>
<p>Este sistema fue desarrollado con la principal idea en mente de: <em>ser sencillo, fácil y flexible</em>. Poco a poco a ido evolucionando la idea hasta llegar a lo que, en su versión 1.0, ha llegado a ser: un sistema completo y robusto para desarrollar aplicaciones Erlang/OTP.</p>
<p>Las herramientas de que dispone el sistema son:</p>
<ul>
<li><strong>elrmk</strong>: es la herramienta que nos creará el proyecto base. Se encarga de crear el esqueleto al que después se puede ir agregando el código, directamente, de la aplicación y los módulos que se requiera/necesiten.</li>
<li><strong>erlmod</strong>: dentro de un proyecto, se encarga de crear un módulo de tipo: gen_server, gen_fsm, gen_event, supervisor o application. Estos son los comportamientos básicos de OTP. Poco a poco se irán incluyendo más plantillas.</li>
<li><strong>erlget</strong>: como la reutilización de código es una realidad innegable, hemos acumulado en un repositorio <a href="http://project.bosqueviejo.net/erldev/wiki/Paquetes">mucho software libre útil para Erlang</a>, dando la posibilidad de instalar dentro del propio proyecto cualquiera de los paquetes y utilizarlo directamente.</li>
</ul>
<h3>¿Más cosas?</h3>
<p>Creo que ya lo mejor es que, si ya sabes algo de Erlang y OTP, te lances a comenzar a usar el sistema. Lee un poco la documentación y si tienes alguna sugerencia o mejora&#8230; ¡me encantaría oirla!</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/10/08/erlang-develop-apoyo-al-desarrollo-en-erlang/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

