<?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; desarrollo software</title>
	<atom:link href="http://bosqueviejo.net/tag/desarrollo-software/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, ¿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>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>Buenas Prácticas en Perl</title>
		<link>http://bosqueviejo.net/2011/07/29/buenas-practicas-en-perl/</link>
		<comments>http://bosqueviejo.net/2011/07/29/buenas-practicas-en-perl/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 08:42:57 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[buenas prácticas]]></category>
		<category><![CDATA[damian conway]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=781</guid>
		<description><![CDATA[ Repasando un poco la bibliografía básica para el lenguaje Perl, topé con este libro, que tienen muchos programadores como base para la escritura de código en este lenguaje. El libro tiene una extensión considerable, pero se hace bastante ameno. Insta a escribir el código de una forma ordenada y que se refactorice todo lo que huele para mejorar el mantenimiento del mismo.
En este sentido, el libro persigue que los programadores tengan en cuenta tres objetivos para la escritura de su código: robustez, eficiencia y fácil mantenimiento.
En general, da un repaso a todos los aspectos de Perl, el uso de las variables y nomenclaturas, definición de procedimientos (o subrutinas) uso de paquetes específicos como strict, documentar apropiadamente el código, etc.
Un libro muy recomendable para todos aquellos que quieran progresar en su conocimiento de este lenguaje haciendo buen código.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/388540-M.jpg" alt="" title="388540-M" width="180" height="238" class="alignleft size-full wp-image-782" /> Repasando un poco la bibliografía básica para el lenguaje Perl, topé con este libro, que tienen muchos programadores como base para la escritura de código en este lenguaje. El libro tiene una extensión considerable, pero se hace bastante ameno. Insta a escribir el código de una forma ordenada y que se refactorice todo lo que <em>huele</em> para mejorar el mantenimiento del mismo.</p>
<div style="font-size:18px;font-weight:bold;"><a href='http://openlibrary.org/books/OL7580925M/Perl_Best_Practices' title='View this title in Open Library' >Perl Best Practices</a></div><div style="font-size:14px;"><a href='http://openlibrary.org/authors/OL2726800A/Damian_Conway' title='View this author in Open Library' >Damian Conway</a>; O&#039;Reilly Media, Inc. 2005</div><div style="font-size:10px;"><a href="http://worldcat.org/isbn/9780596001735" title="View this title at WorldCat">WorldCat</a>&#8226;<a href="http://www.librarything.com/work/1315854" title="View this title at LibraryThing">LibraryThing</a>&#8226;<a href="http://books.google.com/books?as_isbn=9780596001735" title="View this title at Google Books">Google Books</a>&#8226;<a href="http://www.bookfinder.com/search/?st=xl&ac=qr&isbn=9780596001735" title="Search for the best price at BookFinder">BookFinder</a></div><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fbosqueviejo.net%3AOpenBook&amp;rft.genre=book&amp;rft.btitle=Perl+Best+Practices&amp;rft.isbn=9780596001735&amp;rft.au=Damian+Conway&amp;rft.pub=O%26%23039%3BReilly+Media%2C+Inc.&amp;rft.date=July+12%2C+2005&amp;rft.tpages=542"></span><p>
<p>En este sentido, el libro persigue que los programadores tengan en cuenta tres objetivos para la escritura de su código: robustez, eficiencia y fácil mantenimiento.</p>
<p>En general, da un repaso a todos los aspectos de Perl, el uso de las variables y nomenclaturas, definición de procedimientos (o subrutinas) uso de paquetes específicos como <em>strict</em>, documentar apropiadamente el código, etc.</p>
<p>Un libro muy recomendable para todos aquellos que quieran progresar en su conocimiento de este lenguaje haciendo buen código.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/07/29/buenas-practicas-en-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Otro Modelo de Retribución, ¿mejor o peor?</title>
		<link>http://bosqueviejo.net/2011/07/28/otro-modelo-de-retribucion-mas-optimo/</link>
		<comments>http://bosqueviejo.net/2011/07/28/otro-modelo-de-retribucion-mas-optimo/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 05:05:21 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[desarrollo profesional]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[ingeniería de negocio]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=765</guid>
		<description><![CDATA[ Hace tiempo que llevo pensando que quizás, la retribución de un programador por horas, sea tirar el dinero. Esto no quiere decir que sea algo bueno o malo, ya que hay programadores de todo tipo, de los que cada hora que se les paga es muy invertida de forma muy provechosa para la empresa, y otros que es todo lo contrario.
Ejemplo de procrastinación: El Pintor
Pongamos como ejemplo que haya pintores que cobren por horas en lugar de por metros pintados o por trabajo completo a realizar. Si un pintor tiene que pintar una pared de 20 metros cuadrados, para la cual sabe que puede tardar unas 2 horas, puede que trabaje una hora, pare para tomar algo, prepare de forma calmada y lenta su equipo, y trabaje después la segunda hora, habiendo echado, finalmente unas 4 ó 5 horas&#8230; quizás incluso las 8 horas que son el día laboral normal de cualquier persona.
El pintor cobrará entonces por 8 horas, en lugar de 2 horas que ha sido su trabajo real. Es más, si el trabajo fuese de 200 metros cuadrados, sabiendo que son 20 horas, quizás en ese momento, por procrastinación, los primeros días no hace gran cosa, y [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/horas-extras-150x150.jpg" alt="" title="horas-extras" width="150" height="150" class="alignleft size-thumbnail wp-image-766" /> Hace tiempo que llevo pensando que quizás, la retribución de un programador por horas, sea tirar el dinero. Esto no quiere decir que sea algo bueno o malo, ya que hay programadores de todo tipo, de los que cada hora que se les paga es muy invertida de forma muy provechosa para la empresa, y otros que es todo lo contrario.</p>
<h3>Ejemplo de procrastinación: El Pintor</h3>
<p>Pongamos como ejemplo que haya pintores que cobren por horas en lugar de por metros pintados o por trabajo completo a realizar. Si un pintor tiene que pintar una pared de 20 metros cuadrados, para la cual sabe que puede tardar unas 2 horas, puede que trabaje una hora, pare para tomar algo, prepare de forma calmada y lenta su equipo, y trabaje después la segunda hora, habiendo echado, finalmente unas 4 ó 5 horas&#8230; quizás incluso las 8 horas que son el día laboral normal de cualquier persona.</p>
<p>El pintor cobrará entonces por 8 horas, en lugar de 2 horas que ha sido su trabajo real. Es más, si el trabajo fuese de 200 metros cuadrados, sabiendo que son 20 horas, quizás en ese momento, por procrastinación, los primeros días no hace gran cosa, y cuando va viendo que quien lo contrató comienza a estar con la mosca detrás de la oreja, entonces trabaja bien las últimas 10 horas que le queden, habiendo hecho un trabajo de tres días (todos tenemos derecho a nuestros descansos) en cinco días.</p>
<p>Por ello, estos profesionales, por costumbre (que no de mala fe), acostumbrarán a posponer el trabajo en el tiempo (procrastinar) para llegar al punto de parecer, durante un tiempo al menos, malos profesionales, acelerando en el último punto, para que se vea que saben trabajar, y acabando el trabajo justo a tiempo para que no se les eche del trabajo.</p>
<h3>En el mundo del software&#8230;</h3>
<p>Hay muchas veces que, la estimación de un proyecto de software se hace por tiempo. En función del tiempo tardado, se paga a los programadores, y se estima el precio del proyecto. No obstante, esto tiene bastante puntos negativos para los desarrolladores, e incluso para los clientes:</p>
<ol>
<li><strong>La competencia</strong>: competir por el desarrollo de software es decir que tardas menos (y por lo tanto cobras menos)&#8230; pero si el tiempo se recorta y no los requisitos, o pagas menos a los trabajadores (programadores) o les presionas para que hagan más en menos tiempo.</li>
<li><strong>Procrastinación</strong>: si se firma un proyecto de un año, se fija el alcance los requisitos, y se comienza a trabajar. Pasará, y eso se quiera o no es así, que los primeros meses la curva de implicación y desarrollo es muy baja, mientras que el último mes es incluso insana, echando más de ocho horas diarias. La presión no se tiene hasta que la fecha está próxima a cumplirse, y como a los desarrolladores/programadores se les paga por el tiempo que están ahí desarrollando la solución, no les motiva el terminar antes.</li>
<li><strong>Recursos Humanos</strong>: aún usando metodologías ágiles, si la presión es variante en el tiempo y la motivación de <em>hay que entregar</em> se sucede con bastante frecuencia, sin que haya un premio por ello, y sin embargo habiendo broncas o castigos en caso de no llegar, eso hace que la gente se desmotive, comience a trabajar cada vez peor y termine viendo más las páginas de trabajo que el desarrollo en sí.</li>
<li><strong>Retorno de Inversión</strong>: equivocarse en una fecha tras otra, puede ser un punto de pérdida de dinero si se tiene que invertir horas de personas en algo que se supone que debería de estar acabado. Supone no saber exactamente el precio de un desarrollo hasta que no se ha terminado completamente.</li>
</ol>
<h3>¿Otro modelo es posible?</h3>
<p>Pudiera ser posible, sí. Pensemos en el modelo del pintor, ¿cómo le pagaríamos?&#8230; supongo que lo más óptimo sería por pintura gastada y por metros pintados, así como por manos que dé. Es decir, materiales y mano de obra calculando el trabajo realizado, y no las horas invertidas. Esto hace que el trabajador sea el más interesado en ser óptimo en su trabajo, ya que, tanto si tarda una hora, como si tarda tres, cobrará lo mismo.</p>
<p>En el mundo del desarrollo de software, ¿es posible hacer esto?&#8230; muchos dirán inmediatamente que no&#8230; que es complejo, sino imposible, determinar cuánto tiempo se demora en desarrollar un cierto sistema. La pregunta es clara:</p>
<p><strong>Si es posible determinar el tiempo que se va a tardar en un desarrollo, ¿por qué no se puede determinar el precio de ese mismo desarrollo?</strong></p>
<p>Esto es lo que vienen haciendo desde hace mucho tiempo otras doctrinas, como la abogacía, los registradores, los notarios, los arquitectos&#8230; todos los que tienen colegios. En el primer caso, por ejemplo, el Colegio de Abogados de cada provincia establece un precio por trabajo específico a realizar. En nuestro caso, el desarrollo de software, por ejemplo, podríamos determinar conceptos como:</p>
<ul>
<li>Desarrollo de una página web: HTML + CSS + JavaScript; precio mínimo: XXX euros</li>
<li>Desarrollo de una página dinámica web (lenguaje de etiquetas: JSP, ASP, PHP, &#8230;); precio mínimo: XXX euros</li>
<li>Desarrollo de un sistema de gestión de usuarios; precio mínimo: XXX euros</li>
<li>&#8230;</li>
</ul>
<p>Si se desglosa el desarrollo que se pide, hasta el nivel de análisis (e incluso diseño) más básico, toda petición se pueden englosar en uno de estos conceptos, quedando algunos otros como &#8220;as&#8221; en la manga, como la creación de conceptos de <em>investigación</em>, o incluso de <em>riesgo</em>, por tratarse de algo que se sale de la línea base en la que desarrolla la empresa en concreto.</p>
<h3>Estableciendo precios</h3>
<p>Al igual que se debe de realizar un modelo de negocio cuando se levanta una empresa, se deberían de plantear los precios por concepto de lo que la empresa realiza. Está claro que hay conceptos que seguirán quedándose en horas, como la hora de atención al cliente, o la hora de soporte, o la hora de formación.</p>
<p>No obstante, se pueden determinar ciertos desarrollos en los que la empresa se desenvuelve sin problemas, si es web, por ejemplo todo lo que se suele desarrollar de web y cosas que no se han hecho pero se saben hacer, así como si fuese de sistemas, todos los posibles montajes que se pueden realizar en base a tipologías de servidores que se quisieran montar, sistemas de seguridad, de redes, etc.</p>
<h3>Buscando motivación en lugar de procrastinación</h3>
<p>Si se tiene una empresa en la que los desarrollos son para la propia empresa, tipos como se han puesto de moda SaaS (Software as a Service), es decir, vender software como servicio y no como producto, entonces se podría hacer una evaluación de los tipos de desarrollos que se acometen, fijar un esquema de conceptos internos, y pagar a los desarrolladores por trabajo realizado. Tal y como se paga a los equipos comerciales.</p>
<p>En este caso, las empresas pagarían el mínimo fijo a los trabajadores, y una <em>comisión</em>, por trabajo realizado ese mes. Si se han realizado muchas labores imputables por conceptos acordados, el trabajador percibirá la cuantía según su hoja de servicio. Sin embargo, si ha realizado poco trabajo o ninguno, solo percibirá el mínimo.</p>
<h3>Competencia interna e intereses contrapuestos</h3>
<p>Desgraciadamente, no todo es bueno en este modelo. El hecho de ganar más dinero si se hace más, hace que también se busque la forma de hacer menos y seguir ganando más (naturaleza humana), por lo que nos podemos encontrar que haya gente que intente atribuirse el trabajo de otros, o incluso soliciten ayuda del compañero para que le acabe el trabajo.</p>
<p>Esto hace que el trabajador se mueva siempre en beneficio propio, y no en el de la empresa, ya que gana dinero si hace, no si ayuda. Esto puede forzar a que el trabajador genere más trabajo del que requiera la empresa en cierto punto (necesidad de ganar más) o incluso que haga más hora para conseguir más beneficio.</p>
<p>Todo es controlable y todo se puede mejorar. Estos puntos son salvables, ya que se pueden incluir conceptos de soporte entre trabajadores. Si el jefe estima que un trabajador está ayudando a sus compañeros, puede darle un incentivo por compañerismo, que esté reflejado en la tabla de conceptos, con lo que se potencia el trabajo en equipo.</p>
<p>Así mismo, se puede incentivar el que se trabaje a unas horas concretas, asistencia a reuniones o incluso tener un contra-incentivo si se permanece en la oficina pasada una hora concreta, para controlar que un trabajador no llegue a un punto insano de saturación por obsesión de intentar conseguir cada vez más.</p>
<h3>Conclusión</h3>
<p>Considero que, al igual que el incentivo es una buena forma de educar a un niño, es una buena forma de mantener la motivación de una persona en el trabajo, haciendo que la propia persona, con su experiencia y su creatividad, en las horas que determine dedicar al trabajo, consiga el mayor partido, ganando lo que quiera ganar, y con limitaciones para que la obsesión o avaricia se pueda presentar.</p>
<p>Los partes horarios son un ente arcaico que vienen bien en casos de trabajos concretos, que no se pueden medir por un trabajo realizado, sino más bien por un servicio prestado o por una atención dada. Pero este no es el caso del desarrollo de software.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/07/28/otro-modelo-de-retribucion-mas-optimo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Opa: el lenguaje de la nube</title>
		<link>http://bosqueviejo.net/2011/07/27/opa-el-lenguaje-de-la-nube/</link>
		<comments>http://bosqueviejo.net/2011/07/27/opa-el-lenguaje-de-la-nube/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 10:56:18 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[opa]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=756</guid>
		<description><![CDATA[ Tal y como reza su web The Cloud Language (el lenguaje de la nube), este lenguaje sale como una solución a la programación de sitios web cumpliendo con unas necesidades concretas. La empresa MLState ha puesto como su bandera a este lenguaje, sobre el que está orientando toda su actividad comercial.
Un vistazo al lenguaje
En su página web, nada más acceder, se ve un cuadro con un código de algo más de 20 líneas completamente funcional y que resulta en&#8230; ¡un chat! Aquí el código:

type message = { author : string ; text : string }
&#160;
@publish room = Network.cloud(&#34;room&#34;) : Network.network(message)
&#160;
user_update(x : message) =
  line = &#60;div class=&#34;line&#34;&#62;
            &#60;div class=&#34;user&#34;&#62;{x.author}:&#60;/&#62;
            &#60;div class=&#34;message&#34;&#62;{x.text}&#60;/&#62;
         &#60;/&#62;
  do Dom.transform([#conversation +&#60;- line ])
  Dom.scroll_to_bottom(#conversation)
&#160;
broadcast(author) =
   do Network.broadcast({~author text=Dom.get_value(#entry)}, room)
   Dom.clear_value(#entry)
&#160;
start() =
   author = Random.string(8)
   &#60;div id=#header&#62;&#60;div id=#logo&#62;&#60;/&#62;&#60;/&#62;
   &#60;div id=#conversation onready={_ -&#62; Network.add_callback(user_update, room)}&#62;&#60;/&#62;
   &#60;div id=#footer&#62;
      &#60;input id=#entry onnewline={_ -&#62; broadcast(author)} /&#62;
     [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/opa-logo-orange.png" alt="" title="opa-logo-orange" width="100" height="65" class="alignleft size-full wp-image-759" /> Tal y como reza su web <em>The Cloud Language</em> (el lenguaje de la nube), este lenguaje sale como una solución a la programación de sitios web cumpliendo con unas necesidades concretas. La empresa <a href="https://mlstate.com/">MLState</a> ha puesto como su bandera a este lenguaje, sobre el que está orientando toda su actividad comercial.</p>
<h3>Un vistazo al lenguaje</h3>
<p>En su <a href="http://opalang.org/">página web</a>, nada más acceder, se ve un cuadro con un código de algo más de 20 líneas completamente funcional y que resulta en&#8230; <a href="http://chat.opalang.org/">¡un chat!</a> Aquí el código:</p>

<div class="wp_syntax"><div class="code"><pre class="opa" style="font-family:monospace;">type message = { author : string ; text : string }
&nbsp;
@publish room = Network.cloud(&quot;room&quot;) : Network.network(message)
&nbsp;
user_update(x : message) =
  line = &lt;div class=&quot;line&quot;&gt;
            &lt;div class=&quot;user&quot;&gt;{x.author}:&lt;/&gt;
            &lt;div class=&quot;message&quot;&gt;{x.text}&lt;/&gt;
         &lt;/&gt;
  do Dom.transform([#conversation +&lt;- line ])
  Dom.scroll_to_bottom(#conversation)
&nbsp;
broadcast(author) =
   do Network.broadcast({~author text=Dom.get_value(#entry)}, room)
   Dom.clear_value(#entry)
&nbsp;
start() =
   author = Random.string(8)
   &lt;div id=#header&gt;&lt;div id=#logo&gt;&lt;/&gt;&lt;/&gt;
   &lt;div id=#conversation onready={_ -&gt; Network.add_callback(user_update, room)}&gt;&lt;/&gt;
   &lt;div id=#footer&gt;
      &lt;input id=#entry onnewline={_ -&gt; broadcast(author)} /&gt;
      &lt;div class=&quot;button&quot; onclick={_ -&gt; broadcast(author)}&gt;Post&lt;/&gt;
   &lt;/&gt;
&nbsp;
server = Server.one_page_bundle(&quot;Chat&quot;, [@static_resource_directory(&quot;resources&quot;)],
       [&quot;resources/css.css&quot;], start)</pre></div></div>

<p>La sintaxis del lenguaje recuerda bastante a JavaScript, con tintes de programación funcional al estilo Prolog. Esto mezclado a que la sintaxis de XML en que se basa HTML puede incrustarse en el propio código, como si de instrucciones propias del lenguaje se tratasen, haciendo que la salida en este formato sea más limpia que en otros lenguajes de etiquetas como JSP, ASP o PHP.</p>
<p>Sin saber nada del lenguaje, choca ver el ejemplo, donde se instancian algunos objetos de red (en el ejemplo del chat) y se agregan líneas con una sintaxis de operadores que no se ven generalmente en otros lenguajes (como <strong>+&lt;-</strong>).</p>
<p>Se define un tipo de datos que se mantiene por sesión de navegador, y la información entre el navegador y el servidor se va intercambiando entre código JavaScript y AJAX. Así mismo, se hace una comunicación <em>broadcast</em>, esto quiere decir que se envía el mensaje que le llega al sistema a todos los que tengan una sesión abierta de la aplicación.</p>
<p>Este tipo de facilidad hace que realizar un chat en la web, como se muestra en el ejemplo, sea muy sencillo, así como realizar juegos en red, en internet, e incluso aplicaciones de gestión que requieran de notificación de cuando se toca la ficha de un cliente o similar.</p>
<h3>Las potencias del lenguaje</h3>
<p>En los últimos tiempos he ido viendo que se hace más patente la necesidad de los programadores en desarrollar aplicaciones en un modelo de concurrencia óptimo y fácil. En este sentido, lenguajes como Erlang, Scala, Clojure, Haskell, y ahora Opa, se han hecho un hueco y compiten en un sector en el que el desarrollo se complica con el resto de lenguajes, y estos lo resuelven de una forma cómoda y elegante.</p>
<p>Opa no es un lenguaje de propósito general, sino que está orientado 100% a la web. En este entorno se desenvuelve con soltura y se pueden desarrollar entornos complejos de una forma compacta, clara y concisa.</p>
<p>Lo que en otros lenguajes llega a ser un dolor de cabeza, como es la notificación de eventos, compartir memoria entre varios procesos y mantener el flujo entre muchas sesiones diferentes hacia solo una aplicación, Opa lo resuelve con sus elementos base.</p>
<h3>Consiguiendo popularidad</h3>
<p>En su página web, en estos días, anuncian el <a href="http://opalang.org/challenge/home.xmlt">Opa Developer Challange 2011</a>, el cual es un concurso (o desafío) para desarrollar una aplicación en Opa, consiguiendo a cambio, en caso de ser ganador, un premio según el puesto en que se quede (MacBook Air, iPad 2 o Nintendo DS).</p>
<p>Estos concursos son un foco importante para desarrolladores ya que hay dos cosas bastante atrayentes. La primera, el premio en caso de resultar ganador o de las tres primeras posiciones. La segunda&#8230; la palabra &#8220;challange&#8221; (desafío), lo cual resulta muy atrayente a ciertos programadores (hackers), que se interesan por los desafíos y las nuevas tecnologías.</p>
<p>En todo caso, esto será sin duda un empujón para el lenguaje, con lo que, entre las <a href="http://opalang.org/see.xmlt">aplicaciones que ya hay desarrolladas</a> y las que genere el concurso, se generará un buen abanico para dar más y mejor nombre a este lenguaje.</p>
<h3>La parte mala&#8230;</h3>
<p>Una de las partes que Opa hace más hincapié, es que no tiene errores de XSS ni inyección de SQL, es decir, es seguro. El problema, es que no tiene errores de XSS porque no permite reflection, algo que se hace bastante útil a veces, ni el uso de una base de datos SQL.</p>
<p>El tema de tener que emplear el sistema NoSQL de base de datos que integra el sistema Opa, hace que muchos desarrollos sean impracticables en este sistema, ya que dependen de una base de datos que se requiere sea en un SGBD de un tipo específico.</p>
<p>Esto se suma a que no tiene tampoco, al menos aún, soporte de SOAP o XML-RPC, por lo que tampoco podría acceder a un Web Service externo para poder tomar esos datos. No obstante, sí tiene soporte REST como servidor y como cliente, por lo que, desarrollando un sistema externo en otro lenguaje con acceso tipo REST a base de datos, podría hacerse un puente al sistema gestor de base de datos. Aunque, claro, es más trabajo y dependencia de un sistema que esté programado y desarrollado en otro lenguaje.</p>
<p>El hecho de que el lenguaje genere un binario ejecutable, da la seguridad de que no se puede modificar ni inyectar código, ya que no es scripting, pero eso le quita también la versatilidad de poder actualizar el código sin necesidad de parar el sistema. Además de que el hecho de que se distribuya un binario (en caso de Windows, un .EXE) lo hace sensible a ser atacado por virus.</p>
<h3>Conclusiones</h3>
<p>Es un lenguaje interesante, y una arquitectura igualmente curiosa. Para los que somos además administradores de sistemas, esto no es muy atractivo, ya que cierra un poco las puertas ciñendo el crecimiento a montar un solo elemento en los servidores, encapsulado y poco configurable. No obstante, en aras de la sencillez y puesto el foco en el objetivo a conseguir, resulta bastante óptimo y atractivo.</p>
<p>En mi opinión, cuando solucionen el hecho de poder conectarse, aunque sea de forma ActiveRecord, ORM o SQL a una base de datos relacional, sin perder la base en la que se forjó la idea y el sistema de Opa, el sistema comenzará a ser mucho más usado en muchos más ámbitos.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/07/27/opa-el-lenguaje-de-la-nube/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xdebug: depurar y optimizar código PHP</title>
		<link>http://bosqueviejo.net/2011/04/11/xdebug-depurar-y-optimizar-codigo-php/</link>
		<comments>http://bosqueviejo.net/2011/04/11/xdebug-depurar-y-optimizar-codigo-php/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 01:56:50 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=644</guid>
		<description><![CDATA[ Hay momentos en los que vemos que la carga de una página tarda demasiado, o que el uso de un recurso, que en principio habíamos creído que era menor, sube y su tiempo de ejecución hace que nuestro servidor sufra. Trazar estos problemas a simple vista o a través de trazas no es más que complicar el código y hacer que varíe su línea de ejecución y, con ello, el rendimiento en sí del mismo, por lo que, nos hace falta una herramienta a alto nivel, que no implique cambiar el código, que nos permita realizar este tipo de comprobaciones sobre el código. Esta es Xdebug.
¿Qué es y qué hace Xdebug?
Xdebug es un módulo de PHP que se carga únicamente cuando se quiere trazar una ejecución de un código PHP (por ello no conviene, en ningún caso, cargarlo en producción, ya que puede cargar de por sí el sistema).
El módulo se encarga de almacenar información de cada llamada a función de PHP, junto con la marca horaria en la que se sucede para tener la traza exacta del curso de la ejecución del programa.
¿Cómo y dónde se obtiene esta información?
Cada traza es soltada dentro de un fichero llamado cachegrind.out. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/images2-150x92.jpg" alt="" title="images" width="150" height="92" class="alignleft size-thumbnail wp-image-645" /> Hay momentos en los que vemos que la carga de una página tarda demasiado, o que el uso de un recurso, que en principio habíamos creído que era menor, sube y su tiempo de ejecución hace que nuestro servidor <em>sufra</em>. Trazar estos problemas a simple vista o a través de trazas no es más que complicar el código y hacer que varíe su línea de ejecución y, con ello, el rendimiento en sí del mismo, por lo que, nos hace falta una herramienta a alto nivel, que no implique cambiar el código, que nos permita realizar este tipo de comprobaciones sobre el código. Esta es <a href="http://www.xdebug.org/">Xdebug</a>.</p>
<h3>¿Qué es y qué hace Xdebug?</h3>
<p>Xdebug es un módulo de PHP que se carga únicamente cuando se quiere trazar una ejecución de un código PHP (por ello no conviene, en ningún caso, cargarlo en producción, ya que puede cargar de por sí el sistema).</p>
<p>El módulo se encarga de almacenar información de cada llamada a función de PHP, junto con la marca horaria en la que se sucede para tener la traza exacta del curso de la ejecución del programa.</p>
<h3>¿Cómo y dónde se obtiene esta información?</h3>
<p>Cada traza es soltada dentro de un fichero llamado <tt>cachegrind.out.</tt> finalizado con el número del proceso en el que se ejecuta el intérprete de PHP.</p>
<p>Este archivo puede ser abierto desde algún programa como <a href="http://kcachegrind.sf.net/">KCacheGrind</a> (de KDE para GNU/Linux y Windows), así como <a href="http://sourceforge.net/projects/wincachegrind">WinCacheGrind</a>, <a href="http://code.google.com/p/xdebugtoolkit/">xdebugtoolkit</a> y <a href="https://github.com/jokkedk/webgrind">WebGrind</a>. Así se muestra con KCacheGrind:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/images-1.jpg" alt="" title="kcachevalgrind" width="248" height="204" class="alignnone size-full wp-image-648" /></p>
<p>Como puede verse, los procesos se muestran de forma jerárquica en las llamadas a través de un árbol de llamadas, pudiendo poner la base en cualquier función inicial.</p>
<p>Además, permite ver el listado de las llamadas que han sido más usadas, y las que más demoran su ejecución. Lo cual viene muy bien para poder optimizar, no solo las funciones en sí, sino también la forma en la que se llaman.</p>
<h3>Conclusión</h3>
<p>Es una gran herramienta que no debería de faltar en todo programador PHP, ya que nos da información muy valiosa sobre la optimización con la que escribimos nuestro código y nos puede señalar faltas en el rendimiento que solo se verían demasiado tarde, en producción.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/04/11/xdebug-depurar-y-optimizar-codigo-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby: reescritura y yield</title>
		<link>http://bosqueviejo.net/2011/03/24/ruby-reescritura-y-yield/</link>
		<comments>http://bosqueviejo.net/2011/03/24/ruby-reescritura-y-yield/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 12:32:54 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[progrmación orientada a objetos]]></category>
		<category><![CDATA[ruby]]></category>

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

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

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

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

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

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

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

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

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

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

<p>Y en el segundo caso, exactamente igual pero cambiando la comparación para que la ordenación sea en sentido descendente.</p>
<p>La definición del código es in-situ, en el momento de usarse es cuando se especifica qué hace <em>yield</em>.</p>
<p>Se puede hacer algo más complejo, por ejemplo, cambiando el array de enteros por un array de objetos específicos que tengan una comparación algo más complicada. Aún así, el código de <em>ordena</em> no habría que cambiarlo. Solo la llamada, y su bloque adjunto.</p>
<h3>Conclusiones</h3>
<p>Para los que no conozcan bien Ruby, esto les habrá sonado a chino, para los que lo conozcan bien, quizás algo ya más que sabido, pero lo importante, es que se tenga claro el concepto y lo que se puede hacer, ya que, la necesidad, de seguro, surgirá después.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/03/24/ruby-reescritura-y-yield/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Carta de Solicitud de Participación en Definición de Proyectos</title>
		<link>http://bosqueviejo.net/2010/11/16/carta-de-solicitud-de-participacion-en-definicion-de-proyectos/</link>
		<comments>http://bosqueviejo.net/2010/11/16/carta-de-solicitud-de-participacion-en-definicion-de-proyectos/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 13:20:27 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Opinión]]></category>
		<category><![CDATA[desarrollo profesional]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[ingeniería de negocio]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=464</guid>
		<description><![CDATA[En estos últimos días, hablando con colegas del tema de realizar proyectos/productos en los que pudiésemos tener mayor visibilidad, mayor participación, ya que somos la mano de obra que se encarga de su realización, llegamos a la redacción de esta carta:
Hola,
conforme al tema de los proyectos/productos, los desarrollos que se deben de realizar, los que se solicitan, y los que terminan (o no) entrando, es labor de la empresa asegurar un flujo constante de proyectos/productos con mejoras sobre lo que se ofrece en el portfolio de productos ya realizados, pero, queremos que conste que:

Cada proyecto/producto que se solicita, tiene unas implicaciones en tiempo y dinero que debe de amortizarse con los beneficios del mismo, ya que los recursos son finitos, al igual que el tiempo y el dinero de que dispone la compañía para este tipo de peticiones.
Los productos/proyectos tienen un proceso de desarrollo dependiendo de su complejidad, así como de la necesidad de integración dentro de otros productos/proyectos que ya estén desarrollados, por lo que no solo es labor de I+D, sino también de Sistemas y Área de Negocio el desarrollo oportuno del proyecto/producto, su forma de facturación y estructura de costes y la correcta puesta en producción para [...]]]></description>
			<content:encoded><![CDATA[<p>En estos últimos días, hablando con colegas del tema de realizar proyectos/productos en los que pudiésemos tener mayor visibilidad, mayor participación, ya que somos la <em>mano de obra</em> que se encarga de su realización, llegamos a la redacción de esta carta:</p>
<blockquote><p>Hola,</p>
<p>conforme al tema de los proyectos/productos, los desarrollos que se deben de realizar, los que se solicitan, y los que terminan (o no) entrando, es labor de la empresa asegurar un flujo constante de proyectos/productos con mejoras sobre lo que se ofrece en el portfolio de productos ya realizados, pero, queremos que conste que:</p>
<ol>
<li>Cada proyecto/producto que se solicita, tiene unas implicaciones en tiempo y dinero que debe de amortizarse con los beneficios del mismo, ya que los recursos son finitos, al igual que el tiempo y el dinero de que dispone la compañía para este tipo de peticiones.</li>
<li>Los productos/proyectos tienen un proceso de desarrollo dependiendo de su complejidad, así como de la necesidad de integración dentro de otros productos/proyectos que ya estén desarrollados, por lo que no solo es labor de I+D, sino también de Sistemas y Área de Negocio el desarrollo oportuno del proyecto/producto, su forma de facturación y estructura de costes y la correcta puesta en producción para su monitorización y mantenimiento.</li>
<li>El desarrollo tiene varias fases en las que se debe de realizar el proyecto codificando cada parte solicitada o modificando un código ya existente, lo cual puede significar un mal funcionamiento en caso de que se haga con tiempos muy cortos y sin posibilidad de pruebas. La estimación de tiempos deberá de hacerse conforme a lo que se tarde en cada área en realizar su trabajo, y no comenzar a contar el tiempo antes de un inicio real.</li>
<li>Cada cambio que se solicita, pasado el período dispuesto para ello, conlleva <strong>tirar el trabajo</strong> de los días anteriores para comenzar prácticamente de nuevo y con menos tiempo. Por lo que, cada cambio, cuesta tiempo y dinero.</li>
<li>Desarrollar rápido una aplicación y ponerla a disposición del cliente, aún habiendo avisado de que puede generar fallos, es algo que debe de asumir quien lo solicita y sus responsables directos, así como los responsables de la infraestructura a mantener, puesto que en caso de fallo puede que no se vea afectado solo el desarrollo y el cliente para el cual se ha realizado el desarrollo, sino también el resto de clientes.</li>
</ol>
<p>Puesto en conocimiento estos datos, queremos hacer constar y solicitar de vuestra parte que:</p>
<ol>
<li>Se nos tenga en cuenta en cada proyecto/producto que se defina, así como cualquier cambio o indecisión que se tenga, antes de comenzar el desarrollo.</li>
<li>No se introduzcan cambios de última hora en desarrollos que están comenzados y con una fecha de entrega pactada, a menos que se pueda renegociar esta fecha de entrega.</li>
<li>Se defina un modelo de negocio antes del comienzo del desarrollo, para que la integración con área de negocio pueda realizarse desde primera hora.</li>
<li>Se nos dé voz y voto en las decisiones a tomar, en negociaciones con el cliente, y la forma de realizar cada desarrollo, ya que podemos aportar algo de innovación y valor diferencial, así como podemos amoldar su petición para optimizar el desarrollo y que el ciclo pueda, realmente, ser más corto.</li>
<li>Se tenga en cuenta de que I+D es desarrollo, es decir, que las tareas de llevar un proyecto/producto a producción es tarea de un conjunto de personas y de un jefe de proyecto designado para asegurar el éxito del proyecto/producto, por lo que, la responsabilidad es compartida por todas las áreas de entregar cada uno su parte y de realizar cada uno su trabajo.</li>
</ol>
<p>Con todo esto, espero que podamos hacer más comités de desarrollo de productos y se nos dé mayor visibilidad ante la llegada de cualquier proyecto.</p>
<p>Gracias.</p></blockquote>
<p>Espero que ante esta rogativa, se consiga algo bueno y de calado, ya que es asignatura pendiente en el sector de la informática el poder tener voz y voto a la hora de participar en la definición de productos/proyectos dentro del seno de muchas compañías de toda índole.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/11/16/carta-de-solicitud-de-participacion-en-definicion-de-proyectos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patrones de Análisis</title>
		<link>http://bosqueviejo.net/2010/07/22/patrones-de-analisis/</link>
		<comments>http://bosqueviejo.net/2010/07/22/patrones-de-analisis/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 07:02:55 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[martin fowler]]></category>
		<category><![CDATA[patrones de diseño]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=460</guid>
		<description><![CDATA[Una de las personas que más ha aportado al mundo del desarrollo de software es, sin duda, Martin Fowler.
Este autor, en su afán por facilitar dentro de lo posible el desarrollo de software para todo tipo, se ha introducido en las entrañas de lo que es el software de empresa típico y ha definido elementos, objetos, patrones y ayudas específicas que facilitan el análisis, diseño y programación en general de aplicaciones de este tipo. El libro es Analysis Patterns.
La obra nos introduce en el mundo de los patrones, los conceptos y modelos de los negocios e intenta dar una visión general del porqué estos patrones pueden ayudarnos a simplificar la creación de aplicaciones. A través de los capítulos, se van viendo, tema por tema, todos los aspectos que en toda empresa se suelen abordar: contabilidad, plannings, inventario, etc.
Como suele decir Richard Stallman: &#8220;para leer buen código hay que leer buen código&#8220;; y esta obra la considero un buen sistema de análisis para el que se quiera aventurar a realizar análisis de sistemas de información.
]]></description>
			<content:encoded><![CDATA[<p>Una de las personas que más ha aportado al mundo del desarrollo de software es, sin duda, Martin Fowler.</p>
<div style="float:left;padding-right:10px;padding-bottom:10px;"><a href='http://openlibrary.org/books/OL7409173M/Analysis_Patterns' ><img src='http://covers.openlibrary.org/b/id/136590-M.jpg' alt='Analysis Patterns' title='View this title in Open Library' /></a></div><div style="font-size:18px;font-weight:bold;"><a href='http://openlibrary.org/books/OL7409173M/Analysis_Patterns' title='View this title in Open Library' >Analysis Patterns: Reusable Object Models (The Addison-Wesley Object Technology Series)</a></div><div style="font-size:14px;"><a href='http://openlibrary.org/authors/OL27090A/Martin_Fowler' title='View this author in Open Library' >Martin Fowler</a>; Addison-Wesley Professional 1996</div><div style="font-size:10px;"><a href="http://worldcat.org/isbn/9780201895421" title="View this title at WorldCat">WorldCat</a>&#8226;<a href="http://www.librarything.com/work/10491" title="View this title at LibraryThing">LibraryThing</a>&#8226;<a href="http://books.google.com/books?as_isbn=9780201895421" title="View this title at Google Books">Google Books</a>&#8226;<a href="http://www.bookfinder.com/search/?st=xl&ac=qr&isbn=9780201895421" title="Search for the best price at BookFinder">BookFinder</a></div><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fbosqueviejo.net%3AOpenBook&amp;rft.genre=book&amp;rft.btitle=Analysis+Patterns&amp;rft.isbn=9780201895421&amp;rft.au=Martin+Fowler&amp;rft.pub=Addison-Wesley+Professional&amp;rft.date=October+9%2C+1996&amp;rft.tpages=384"></span><p>
<p>Este autor, en su afán por facilitar dentro de lo posible el desarrollo de software para todo tipo, se ha introducido en las entrañas de lo que es el software de empresa típico y ha definido elementos, objetos, patrones y ayudas específicas que facilitan el análisis, diseño y programación en general de aplicaciones de este tipo. El libro es <strong>Analysis Patterns</strong>.</p>
<p>La obra nos introduce en el mundo de los patrones, los conceptos y modelos de los negocios e intenta dar una visión general del porqué estos patrones pueden ayudarnos a simplificar la creación de aplicaciones. A través de los capítulos, se van viendo, tema por tema, todos los aspectos que en toda empresa se suelen abordar: contabilidad, plannings, inventario, etc.</p>
<p>Como suele decir Richard Stallman: &#8220;<em>para leer buen código hay que leer buen código</em>&#8220;; y esta obra la considero un buen sistema de análisis para el que se quiera aventurar a realizar análisis de sistemas de información.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/07/22/patrones-de-analisis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modelo de Dominio: la importancia de los nombres</title>
		<link>http://bosqueviejo.net/2010/04/26/modelo-de-dominio-la-importancia-de-los-nombres/</link>
		<comments>http://bosqueviejo.net/2010/04/26/modelo-de-dominio-la-importancia-de-los-nombres/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 07:30:20 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Empresa]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[ingeniería de negocio]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=47</guid>
		<description><![CDATA[Actulizado: se ha corregido el concepto, ya que se confundía con la definición de glosario, cuando se quería detallar que era algo más que un glosario.
En todas las empresas en las que he trabajado, siempre surge el problema de que, cuando sale algo nuevo o se crea un cierto programa, un sistema o una forma de trabajo, si la persona que la ha motivado no sabe su nombre: se la inventa.
Esto pasa con mucha frecuencia, y no es malo, pero es común que toda la empresa termine usando el vocablo en muy poco tiempo y, toda persona que entre nueva, si ese vocablo le parece desconocido o le sugiere otra cosa distinta, le lleve a confusión hasta que se lo expliquen.
Para esto se suelen hacer glosarios o lo que, en ingeniería del software se conoce como: Modelo de Dominio.
Este documento tiene varias partes, una de ellas se especifica como un glosario, estando ordenado alfabéticamente, y recogiendo todas las palabras que se usan, comúnmente en el entorno profesional en el que se mueve la empresa, y las palabras referentes a productos y servicios específicos que se comercializan o adquieren por parte de la empresa. Otra de las partes es la relación [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Actulizado</strong>: se ha corregido el concepto, ya que se confundía con la definición de glosario, cuando se quería detallar que era algo más que un glosario.</p>
<p>En todas las empresas en las que he trabajado, siempre surge el problema de que, cuando sale algo nuevo o se crea un cierto programa, un sistema o una forma de trabajo, si la persona que la ha motivado no sabe su nombre: se la inventa.</p>
<p>Esto pasa con mucha frecuencia, y no es malo, pero es común que toda la empresa termine usando el <em>vocablo</em> en muy poco tiempo y, toda persona que entre nueva, si ese <em>vocablo</em> le parece desconocido o le sugiere otra cosa distinta, le lleve a confusión hasta que se lo expliquen.</p>
<p>Para esto se suelen hacer glosarios o lo que, en ingeniería del software se conoce como: <strong>Modelo de Dominio</strong>.</p>
<p>Este documento tiene varias partes, una de ellas se especifica como un glosario, estando ordenado alfabéticamente, y recogiendo todas las palabras que se usan, comúnmente en el entorno profesional en el que se mueve la empresa, y las palabras referentes a productos y servicios específicos que se comercializan o adquieren por parte de la empresa. Otra de las partes es la relación que hay entre conceptos que se manejan en la empresa, definición de características de cada uno de los elementos y restricciones de uso de los mismos.</p>
<p>Ceñirse a estándares es una forma de no necesitar un modelo de dominio, pero es complicado no <em>saltarse las normas</em> alguna que otra vez, por lo que, aún tomando precauciones de llamar a todo por su nombre, es conveniente y productivo, sobre todo para las nuevas incorporaciones o subcontratas, tener este documento disponible.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/04/26/modelo-de-dominio-la-importancia-de-los-nombres/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

