<?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; programación</title>
	<atom:link href="http://bosqueviejo.net/tag/programacion/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>Grafos (I): fundamentos básicos</title>
		<link>http://bosqueviejo.net/2011/10/02/grafos-fundamentos-basicos/</link>
		<comments>http://bosqueviejo.net/2011/10/02/grafos-fundamentos-basicos/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 14:41:43 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[apuntes]]></category>
		<category><![CDATA[estructura de datos]]></category>
		<category><![CDATA[grafos]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[uned]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=912</guid>
		<description><![CDATA[ Comenzamos el curso de nuevo. Ya hace unos nueve años que conozco lo que son las estructuras de datos avanzadas para la programación, pero no obstante, qué le vamos a hacer, hay que sacarse los estudios y me toca profundizar un poco en este tipo de datos. He pensado que, para hacer más llevadero el estudio, voy a comenzar a publicar aquí mis apuntes, así, además de tenerlos siempre disponibles, los comparto.
Definiciones
Los grafos son nodos (o vertices) unidos por líneas (o aristas). Según las aristas podemos encontrarnos grafos no dirigidos o grafos dirigidos, según si las aristas tienen dirección o no.
Un ejemplo de grafo no dirigido:

La forma de representar el gráfo en modo de ecuación es G = (N, A), siendo N(G) el conjunto de nodos (vértices) y A(G) el conjunto de aristas del grafo. La representación del grafo de ejemplo sería el siguiente:

N(G) = { 1, 2, 3, 4, 5, 6 }
A(G) = { (1,2), (1,6), (6,4), (4,5), (2,3), (2,4) }

Una arista que se enlaza un nodo consigo mismo se la denomina bucle o lazo.
Dos nodos son adyacentes si siendo distintos existe una arista que los une.
El grado de un vértice (o nodo) es el número de aristas [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/images-150x150.jpg" alt="" title="grafos" width="150" height="150" class="alignleft size-thumbnail wp-image-913" /> Comenzamos el curso de nuevo. Ya hace unos nueve años que conozco lo que son las estructuras de datos avanzadas para la programación, pero no obstante, qué le vamos a hacer, hay que sacarse los estudios y me toca profundizar un poco en este tipo de datos. He pensado que, para hacer más llevadero el estudio, voy a comenzar a publicar aquí mis apuntes, así, además de tenerlos siempre disponibles, los comparto.</p>
<h3>Definiciones</h3>
<p>Los grafos son nodos (o <strong>vertices</strong>) unidos por líneas (o <strong>aristas</strong>). Según las aristas podemos encontrarnos <strong>grafos no dirigidos</strong> o <strong>grafos dirigidos</strong>, según si las aristas tienen dirección o no.</p>
<p>Un ejemplo de grafo no dirigido:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/grafo_no_dirigido.png" alt="" title="grafo_no_dirigido" width="268" height="154" class="aligncenter size-full wp-image-915" /></p>
<p>La forma de representar el gráfo en modo de ecuación es G = (N, A), siendo N(G) el conjunto de nodos (vértices) y A(G) el conjunto de aristas del grafo. La representación del grafo de ejemplo sería el siguiente:</p>
<pre>
N(G) = { 1, 2, 3, 4, 5, 6 }
A(G) = { (1,2), (1,6), (6,4), (4,5), (2,3), (2,4) }
</pre>
<p>Una arista que se enlaza un nodo consigo mismo se la denomina <strong>bucle</strong> o <strong>lazo</strong>.</p>
<p>Dos nodos son <strong>adyacentes</strong> si siendo distintos existe una arista que los une.</p>
<p>El <strong>grado de un vértice</strong> (o nodo) es el número de aristas que entran o salen de él.</p>
<p>Un <strong>camino</strong> es una secuencia de aristas consecutivas. La <strong>longitud del camino</strong> corresponde al número de aristas que contiene. Hay dos tipos de caminos:</p>
<ul>
<li><strong>camino simple</strong>, es un camino que no emplea más de una vez la misma arista;</li>
<li><strong>camino compuesto</strong>, cuando el camino emplea dos veces la misma arista (aunque no de forma continua).</li>
</ul>
<p>Un <strong>ciclo</strong> (o circuito) es un camino simple que empieza y termina en el mismo vértice.</p>
<p>Un ejemplo de grafo dirigido:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/grafo_dirigido.png" alt="" title="grafo_dirigido" width="268" height="154" class="aligncenter size-full wp-image-916" /></p>
<p>La forma de representar el gráfo en modo de ecuación es G = &lt;N, A&gt;, siendo N&lt;G&gt; el conjunto de nodos (vértices) y A&lt;G&gt; el conjunto de aristas del grafo. La representación del grafo de ejemplo sería el siguiente:</p>
<pre>
N(G) = { 1, 2, 3, 4, 5, 6 }
A(G) = { <2,1>, <1,6>, <6,4>, <4,5>, <3,2>, <2,4>, <4,4> }
</pre>
<p>El <strong>grado de un vértice</strong> (o nodo) en el grafo dirigido, puede ser de:</p>
<ul>
<li><strong>grado de entrada</strong> (o entrante) de un vértice que es el número de aristas que llegan a él (con dirección hacia él); y el</li>
<li><strong>grado de salida</strong> (o saliente) de un vértice que es el número de aristas que salen de él (con dirección hacia otros vértices).</li>
</ul>
<p>Un <strong>camino</strong>, en un grafo dirigido, es una secuencia finita de aristas entre dos vértices, siendo el extremo final de cada arista el extremo inicial de la siguiente.</p>
<p>Un grafo dirigido es <strong>fuertemente conexo</strong> si para cada par de vértices distinos <em>n</em> y <em>m</em> hay un camino de <em>n</em> a <em>m</em> y viceversa. El grafo dirigido expuesto como ejemplo tiene esta propiedad, ya que se puede acceder a cualquier nodo desde cualquier otro.</p>
<p>Dos vértices o nodos están <strong>conectados</strong> si hay un camino que los une.</p>
<p>Las aristas, al igual que los vértices, también pueden contener información, este es el caso de los <strong>grafos etiquetados</strong> (o valorados). Se representan de la siguiente forma:</p>
<pre>
G = (N,A,P)
N(G) = { 1, 2, 3, 4, 5, 6 }
A(G) = { <2,1>, <1,4>, <4,3>, <3,2>, <2,4>, <4,5>, <6,4> }
P(G) = { 5, 8, 1, 10, 2, 6, 7 }
</pre>
<p>La representación gráfica:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/grafo_valuado.png" alt="" title="grafo_valuado" width="305" height="174" class="aligncenter size-full wp-image-919" /></p>
<h3>Tipos de Grafos</h3>
<p>Realizando, según sus propiedades, una categorización de grafos podemos distinguir los siguientes tipos:</p>
<ul>
<li><strong>grafo no dirigido</strong>, es un grafo cuyas aristas no tienen dirección.</li>
<li><strong>grafo dirigido</strong>, es un grafo cuyas aristas tienen dirección;</li>
<li><strong>grafo nulo</strong>, es un grafo sin vérticos (y por ende, sin aristas);</li>
<li><strong>grafo acíclico</strong>, es un grafo que no contiene ciclos (o circuitos), el gráfico presentado como grafo dirigido es acíclico;</li>
<li><strong>grafo etiquetado</strong> (o valorado) es un grafo dirigido con <em>pesos</em> definidos en sus aristas;</li>
<li><strong>grafo conexo</strong>, aquél para el que, tomando cualquier par de vértices que lo forman, existe un camino que los contenga;</li>
<li><strong>grafo simple</strong>, es aquél que entre cada par de vértices existe a lo sumo una arista;</li>
<li><strong>multigrafo</strong>, el caso contrario al grafo simple.</li>
<li><strong>subgrafo</strong>, es el formado por un subconjunto de vértices y aristas contenidos en el grafo del que deriva.</li>
<li><strong>árbol libre</strong>, es un grafo acíclico, conexo y no dirigido. Estos árboles no tienen raíz y los hijos no están ordenados. Para obtener un árbol general hay que seleccionar un nodo como raíz y establecer algún orden entre los hijos de cada nodo.</li>
</ul>
<h3>Subgrafos no dirigidos</h3>
<p>Un subgrafo conexo maximal, es un grafo G&#8217; que deriva de G, que está contenido, de ninguna forma, en otro subconjunto posible de G. Por ejemplo:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/subgrafo_no_dirigido.png" alt="" title="subgrafo_no_dirigido" width="268" height="154" class="aligncenter size-full wp-image-920" /></p>
<p>Este subgrafo (G), puede contener a dos subgrafos:</p>
<pre>
N(G') = { 1, 2, 3 }
A(G') = { <1,2>, <2,3> }

N(G') = { 4, 5, 6 }
A(G') = { <6,4>, <4,5> }
</pre>
<p>Como cada uno de estos subgrafos es máximo, es decir, de forma conexa, no se puede incluir ningún otro nodo del grafo padre que pueda completar más el subgrafo, a cada uno de los subgrafos se les llama <strong>conexo maximal</strong>.</p>
<p>Se denomina <strong>componente conexa</strong> de un grafo, a un subgrafo conexo maximal.</p>
<p>En cambio, si el grafo fuese así:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/subgrafo_sin_maximal.png" alt="" title="subgrafo_sin_maximal" width="268" height="154" class="aligncenter size-full wp-image-923" /></p>
<p>Sería posible, para el primer N(G&#8217;) agregar el nodo 4, e incluso el 5 o el 6, de modo que, este subgrafo, deja de ser conexo maximal.</p>
<p>El máximo número de aristas en un grafo no dirigido de <em>n</em> vértices es <em>n(n-1)/2</em>. Si tiene ese número de aristas se dice que es <strong>completo</strong>. No se cuentan los bucles.</p>
<h3>Subgrafos dirigidos</h3>
<p>El grafo dirigido que no es fuertemente conexo, un subgrafo fuertemente conexo maximal recibe el nombre de <strong>componente fuertemente conexa del grafo</strong>. El ejemplo tiene dos componentes fuertemente conexas:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/subgrafo_dirigido.png" alt="" title="subgrafo_dirigido" width="268" height="154" class="aligncenter size-full wp-image-925" /></p>
<p>Las dos componentes fuertemente conexas serían:</p>
<pre>
N(G') = { 1, 2, 3 }
A(G') = { <1,2>, <2,1>, <2,3>, <3,2> }

N(G') = { 4, 5, 6 }
A(G') = { <6,4>, <4,6>, <4,5>, <5,4> }
</pre>
<p>El máximo número de aristas en un grafo dirigido de <em>n</em> vértices es <em>n(n-1)</em>. No teniendo en cuenta los bucles.</p>
<h3>Representación de los Grafos</h3>
<p>Los grafos se pueden representar de varias formas, pero las dos más comunes son: la matriz de adyacencias y la lista de adyacencias.</p>
<h4>Matriz de adyacencia</h4>
<p>Se crea una matriz (la llamaremos MA por Matriz de Adyacencias) asociada a G, de modo que tenga <em>n x n</em> elementos. Indicaremos sus contenidos con 0 y 1, siendo 1 que en la posición <em>MA[i,j]</em> existe una arista y 0 lo contrario.</p>
<p>Un ejemplo, viendo este grafo dirigido:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/grafo_dirigido.png" alt="" title="grafo_dirigido" width="268" height="154" class="aligncenter size-full wp-image-916" /></p>
<p>Su matriz de adyacencia sería la siguiente (teniendo en cuenta las filas como el origen y las columnas como el destino):</p>
<p><center><br />
<table align="center">
<tr>
<td></td>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
</tr>
<tr>
<th>1</th>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<th>2</th>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<th>3</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<th>4</th>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<th>5</th>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<th>6</th>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
</tr>
</table>
<p></center></p>
<p>En los grafos no dirigidos cada arista es simétrica. En el caso de los grafos valorados, los valores que se representan en la tabla ya no serían 0 y 1, sino el valor del peso de cada arista.</p>
<p>Determinar cuántas aristas hay en un grafo tiene un coste de <em>O(n<sup>2</sup>)</em>, y requiere de un espacio de memoria de <em>&theta;(n<sup>2</sup>)</em>. Por lo que no es aconsejado si hay pocas aristas.</p>
<h4>Listas de adyacencia</h4>
<p>Se representa por un vector de <em>n</em> listas, siendo <em>n</em> el número de nodos, por lo que contiene tantas listas como nodos hay en el grafo. Por lo que el grafo que se muestra a continuación:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/subgrafo_dirigido.png" alt="" title="subgrafo_dirigido" width="268" height="154" class="aligncenter size-full wp-image-925" /></p>
<p>Tendrá esta representación en formato de listas de adyacencia:</p>
<p><img src="http://bosqueviejo.net/wp-content/uploads/lista_adyacencia.png" alt="" title="lista_adyacencia" width="343" height="268" class="aligncenter size-full wp-image-928" /></p>
<p>En el caso de los grafos etiquetados, las listas deberían incluir un campo adicional para almacenar la etiqueta asociada a cada arista.</p>
<p>Determinar si existe una arista entre el nodo <em>i</em> y el nodo <em>j</em> puede llevar un tiempo de <em>O(n)</em>, ya que puede haber <em>n</em> vértices en la lista asociada de ese vértice en concreto. El coste en espacio de esta representación está en <em>&theta;(n+a)</em>, siendo <em>n</em> el número de nodos y <em>a</em> el número de aristas.</p>
<h3>Conclusiones</h3>
<p>Hasta aquí he querido llegar de momento en este tema de los grafos. La parte de algoritmia, costes asociados y demás elementos, lo dejo para el siguiente día de estudio.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/02/grafos-fundamentos-basicos/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>PHP 5.4: ya queda menos</title>
		<link>http://bosqueviejo.net/2011/08/01/php-5-4-ya-queda-menos/</link>
		<comments>http://bosqueviejo.net/2011/08/01/php-5-4-ya-queda-menos/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 15:29:45 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[lenguajes]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>

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

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
 trait ezcReflectionReturnInfo <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">function</span> getReturnType<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/*1*/</span> <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">function</span> getReturnDescription<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/*2*/</span> <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">class</span> ezcReflectionMethod <span style="color: #000000; font-weight: bold;">extends</span> ReflectionMethod <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">use</span> ezcReflectionReturnInfo<span style="color: #339933;">;</span>
   <span style="color: #666666; font-style: italic;">/* ... */</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">class</span> ezcReflectionFunction <span style="color: #000000; font-weight: bold;">extends</span> ReflectionFunction <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">use</span> ezcReflectionReturnInfo<span style="color: #339933;">;</span>
   <span style="color: #666666; font-style: italic;">/* ... */</span>
 <span style="color: #009900;">&#125;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Esto hace que las clases <tt>ezcReflectionMethod</tt> y <tt>ezcReflectionFunction</tt> se puedan beneficiar de las funciones definidas en el <em>trait</em> <tt>ezcReflectionReturnInfo</tt>, heredando cada una de su respectiva clase padre.</p>
<p>Más información <a href="https://wiki.php.net/rfc/traits?s[]=trait">aquí</a>.</p>
<h3>Filtrando cabeceras</h3>
<p>Se ha agregado un nuevo <em>callback</em>, para cuando se envíen las cabeceras, justo antes de este instante, se ejecute un código personalizado que permita, junto con las funciones <em>headers_list</em>, <em>header_remove</em> y <em>header</em>, enviar solo las cabeceras que se quieran enviar:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-Type: text/plain'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'X-Test: foo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">headers_list</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$header</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'X-Powered'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            header_remove<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'X-Powered-By'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    header_remove<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'X-Test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> header_register_callback<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #339933;">;</span></pre></div></div>

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

		<guid isPermaLink="false">http://bosqueviejo.net/?p=592</guid>
		<description><![CDATA[ Hay muchas veces que nos encontramos con el problema de que queremos extender la funcionalidad de nuestro programa por extensiones, plugins, addons o como los queramos llamar. Estas extensiones tienen el problema de que pueden afectar al funcionamiento del resto del programa si lo ejecutamos directamente desde el core del programa que estemos haciendo, quedando el mismo en una situación inestable o nada funcional.
Para ello, desde hace mucho tiempo, se integran soluciones de lenguajes embebidos (como Lua, que ya vimos hace tiempo), que permiten ejecutarse en un entorno o contexto controlado, donde cualquier fallo no afecta directamente al núcleo del programa principal, solo al propio módulo en sí.
Leyendo un artículo bastante extenso de Zend Developer Zone, encontramos el cómo instalar la solución spidermonkey dentro de PHP para poder realizar código en JavaScript que pueda servir para extender el núcleo de la aplicación que hayamos realizado en PHP.
Instalación
La instalación es algo manual, ya que, al menos en Debian Lenny, no están disponibles las librerías necesarias para hacer que funcione. Los requisitos para poder echar a correr son:

PHP 5.3 o superior
Spider Monkey Libraries 1.7 o superior

La instalación de las librerías de Spider Monkey terminan siendo bastante manuales, por lo que las [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/mozilla1.png" alt="" title="mozilla1" width="150" height="135" class="alignleft size-full wp-image-596" /> Hay muchas veces que nos encontramos con el problema de que queremos extender la funcionalidad de nuestro programa por extensiones, plugins, addons o como los queramos llamar. Estas extensiones tienen el problema de que pueden afectar al funcionamiento del resto del programa si lo ejecutamos directamente desde el <em>core</em> del programa que estemos haciendo, quedando el mismo en una situación inestable o nada funcional.</p>
<p>Para ello, desde hace mucho tiempo, se integran soluciones de lenguajes embebidos (como <a href="http://bosqueviejo.net/2010/11/15/lua-el-lenguaje-de-los-videojuegos/">Lua</a>, que ya vimos hace tiempo), que permiten ejecutarse en un entorno o contexto controlado, donde cualquier fallo no afecta directamente al núcleo del programa principal, solo al propio módulo en sí.</p>
<p>Leyendo un artículo bastante extenso de <a href="http://devzone.zend.com/article/4704">Zend Developer Zone</a>, encontramos el cómo instalar la solución <a href="http://www.mozilla.org/js/spidermonkey/">spidermonkey</a> dentro de PHP para poder realizar código en JavaScript que pueda servir para extender el núcleo de la aplicación que hayamos realizado en PHP.</p>
<h3>Instalación</h3>
<p>La instalación es algo manual, ya que, al menos en Debian Lenny, no están disponibles las librerías necesarias para hacer que funcione. Los requisitos para poder echar a correr son:</p>
<ul>
<li><a href="http://www.php.net/">PHP</a> 5.3 o superior</li>
<li><a href="http://www.mozilla.org/js/spidermonkey/">Spider Monkey Libraries</a> 1.7 o superior</li>
</ul>
<p>La instalación de las librerías de Spider Monkey terminan siendo bastante manuales, por lo que las describiré a continuación paso a paso, tal y como viene en el artículo original:</p>

<div class="wp_syntax"><div class="code"><pre class="shellscript" style="font-family:monospace;">tar -xzvf js-1.70.tar-gz
cd js/src
make -f Makefile.ref
&nbsp;
mkdir -p /usr/local/include/js/ 
cp *.{h,tbl} /usr/local/include/js/ 
cd Linux_All_DBG.OBJ
cp *.h /usr/local/include/js/ 
cp js /usr/local/bin/ 
cp libjs.so /usr/local/lib/
ldconfig</pre></div></div>

<p><strong>IMPORTANTE</strong>: se debe de tener en ld.so.conf agregada la ruta de las librerías locales <em>/usr/local/lib</em> antes de hacer el último comando o no tendrá efecto (aunque no dé error).</p>
<p>Por último, instalamos desde PECL la librería:</p>

<div class="wp_syntax"><div class="code"><pre class="shellscript" style="font-family:monospace;">pecl install spidermonkey-0.1.4</pre></div></div>

<p>Con esto ya tendremos compilado e instalado el código, ya solo nos quedaría configurar la extensión <em>spidermonkey.so</em> dentro del <em>php.ini</em> para PHP pueda encontrar las funciones y objetos que le acabamos de instalar.</p>
<h3>Probando, Probando&#8230; uno, dos, tres&#8230;</h3>
<p>Pues nada, una vez tenemos la extensión configurada y funcionando, ya solo nos queda escribir un código para probar que todo funcione como tiene que funcionar. El código más simple que podemos probar es:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// crea un contexto JavaScript</span>
<span style="color: #000088;">$js</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// define variables PHP</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// asigna las variables al contexto JavaScript</span>
<span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'a'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'b'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// define el código a ejecutar</span>
<span style="color: #000088;">$script</span> <span style="color: #339933;">=</span> <span style="color: #0000cc; font-style: italic;">&lt;&lt;&lt;END
  c = a + b;
END</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// evalua el script y muestra el resultado</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;La suma de <span style="color: #006699; font-weight: bold;">$a</span> y <span style="color: #006699; font-weight: bold;">$b</span> es: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">evaluateScript</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$script</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Lo cual nos resulta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">La suma de <span style="color: #cc66cc;">10</span> y <span style="color: #cc66cc;">2</span> es<span style="color: #339933;">:</span> <span style="color: #cc66cc;">12</span></pre></div></div>

<h3>Complicándolo un poco más</h3>
<p>Como todo en la vida, se puede hacer más aún. En principio, tenemos una forma de hacerle llegar al contexto de JavaScript las variables definidas en PHP, pero además, podemos:</p>
<h4>Uso de funciones</h4>
<p>Pasar una función de PHP para poder ejecutarla desde JavaScript:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// define la función en PHP</span>
<span style="color: #000000; font-weight: bold;">function</span> getCircleArea<span style="color: #009900;">&#40;</span><span style="color: #000088;">$radius</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #990000;">pi</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$radius</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$radius</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// crea el contexto JavaScript</span>
<span style="color: #000088;">$js</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// registra la función en el contexto JavaScript (como gca)</span>
<span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">registerFunction</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'getCircleArea'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'gca'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// define el código</span>
<span style="color: #000088;">$script</span> <span style="color: #339933;">=</span> <span style="color: #0000cc; font-style: italic;">&lt;&lt;&lt;END
  ret = 'El área del círculo con radio 5 es: ' + gca(5);
END</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// evalua el código y muestra el resultado</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">evaluateScript</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$script</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Esto muestra:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">El área del círculo con radio <span style="color: #cc66cc;">5</span> es<span style="color: #339933;">:</span> <span style="color:#800080;">78.53981633974483</span></pre></div></div>

<h4>Uso de Clases</h4>
<p>Supongamos que tenemos definida la clase <em>Cow</em> en PHP y queremos poder emplearla desde JavaScript. Lo que supone crear un nuevo objeto y poder emplearlo. La clase <em>Cow</em> la definimos como a continuación:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// definición de la clase</span>
<span style="color: #000000; font-weight: bold;">class</span> Cow <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_name</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_milked</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_milked <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// name setter/getter</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_name <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_name<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// milking status setter/getter</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> milk<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_milked <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getMilked<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_milked<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMilked</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' ha sido ordeñada hoy.'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'Hora de ordeñar a '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Con la definición de la clase, podríamos ejecutar el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// cargamos el fichero de la clase</span>
<span style="color: #b1b100;">include_once</span> <span style="color: #0000ff;">'Cow.class.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// crea el contexto JavaScript</span>
<span style="color: #000088;">$js</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// registra la clase PHP en JavaScript</span>
<span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">registerClass</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Cow'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// define el código</span>
<span style="color: #000088;">$script</span> <span style="color: #339933;">=</span> <span style="color: #0000cc; font-style: italic;">&lt;&lt;&lt;END
  var c = new Cow;
  c.setName('Molly');
  var d = new Date();
  var ch = d.getHours();
  if (ch &gt; 8) {
    c.milk();
  }
  c.output();
END</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// evalua el código y muestra el resultado</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">evaluateScript</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$script</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>En este caso, el resultado sería, dependiendo de la hora del servidor:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Molly ha sido ordeñada hoy<span style="color: #339933;">.</span></pre></div></div>

<p>O bien:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Hora de ordeñar a Molly</pre></div></div>

<h3>Conclusiones</h3>
<p>Considero que, cuando se realizan aplicaciones de servidor que requieran de un nivel de personalización alto, es muy útil poder darle la posibilidad al usuario, o programador en caso de que sea un framework, de extender la funcionalidad propia del entorno, sin afectar con ello al núcleo de la aplicación o servidor.</p>
<p>Spidermonkey, en este aspecto, tiene la ventaja de que cumple con creces las necesidades que puedan surgir en este aspecto, además de ser bastante simple de manejar y, en sí, el lenguaje JavaScript no resulta desconocido para los programadores de PHP, ya que la mayoría son en sí programadores web que, por una causa u otra, han necesitado en algún momento del uso del mismo.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/02/24/spidermonkey-extendiendo-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Propiedad del Código</title>
		<link>http://bosqueviejo.net/2010/08/06/propiedad-del-codigo/</link>
		<comments>http://bosqueviejo.net/2010/08/06/propiedad-del-codigo/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 12:04:01 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[desarrollo ágil]]></category>
		<category><![CDATA[desarrollo profesional]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[xtreme programming]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=490</guid>
		<description><![CDATA[Cuando comencé a leer libros sobre Extreme Programming, me llamó la atención una de las propiedades de esta metodología de desarrollo, que era la propiedad del código.
Por mi parte he sido siempre muy comunista con respecto al código, no tengo el menor reparo en mirar, ampliar y corregir código de otras personas y dejo que los demás vean, opinen y corrijan y/o agreguen cosas a mis códigos&#8230; es la mentalidad del software libre.
Pero en las empresas ocurre lo contrario. Es muy normal, yo diría que incluso enfermizo, llegar a ver cómo cuando entras en una empresa en la que hay más de tres programadores, cómo cuando algo falla, cuando hay que hacer una nueva mejora, ampliación, adaptación, siempre dice uno en voz alta: ese código es de fulanito; indicando que ni lo va a ver, ni lo piensa modificar.
Concepto de Propiedad del Código
Eso es a lo que se refieren muchos de los autores de las metodologías ágiles. El hecho de que un código sea de alguien, es nocivo, perjudicial, para el desarrollo conjunto de aplicaciones.
Si se quiere desarrollar una aplicación, normalmente, llega hasta el programador (o programadores) que comienzan a escribir el código que hará que esa aplicación funcione. Si [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando comencé a leer libros sobre Extreme Programming, me llamó la atención una de las propiedades de esta metodología de desarrollo, que era <em>la propiedad del código</em>.</p>
<p>Por mi parte he sido siempre muy <em>comunista</em> con respecto al código, no tengo el menor reparo en mirar, ampliar y corregir código de otras personas y dejo que los demás vean, opinen y corrijan y/o agreguen cosas a mis códigos&#8230; es la mentalidad del software libre.</p>
<p>Pero en las empresas ocurre lo contrario. Es muy normal, yo diría que incluso enfermizo, llegar a ver cómo cuando entras en una empresa en la que hay más de tres programadores, cómo cuando algo falla, cuando hay que hacer una nueva mejora, ampliación, adaptación, siempre dice uno en voz alta: <em>ese código es de fulanito</em>; indicando que ni lo va a ver, ni lo piensa modificar.</p>
<h3>Concepto de Propiedad del Código</h3>
<p>Eso es a lo que se refieren muchos de los autores de las metodologías ágiles. El hecho de que un código <em>sea de alguien</em>, es nocivo, perjudicial, para el desarrollo conjunto de aplicaciones.</p>
<p>Si se quiere desarrollar una aplicación, normalmente, llega hasta el programador (o programadores) que comienzan a escribir el código que hará que esa aplicación funcione. Si nos ponemos en el caso de una aplicación comercial de gestión de clientes, que se separa en modo MVC, y tenemos tres programadores que, se han segmentado y trabaja cada uno de forma autónoma en cada una de las capas, tendremos que entre ellos se comunicarán para hacer peticiones del tipo: <em>Necesito que el modelo valide este dato</em>; <em>No puedo seguir hasta que la interfaz no la termine mi compañero</em>; &#8230;</p>
<h3>Inconvenientes y Perjuicios</h3>
<p>Como he mencionado antes, crear parcelas en una aplicación en desarrollo, cuando es muy normal que se tengan que hacer modificaciones que influyan en todas las partes, hace que cada cambio esté guiado por conversaciones aisladas con gente del equipo que opina que eso no es suyo, que hables con otra persona que es la que lo ha hecho, etc.</p>
<p>Esta actitud crea incertidumbre de vistas hacia arriba, ya que un arquitecto, analista, jefe de proyecto, o director técnico, puede pensar que su desarrollo está demasiado atado a una persona, que puede irse de vacaciones durante dos semanas quedándose todo el trabajo parado, o incluso irse de la empresa, teniendo que hacer <em>herencia</em> de ese código a otros que tendrán que comenzar a <em>estudiarlo</em>.</p>
<p>Desde el punto de vista del programador, realmente y visto en frío, con esta actitud <em>está solo</em>. Es decir, ante cualquier trabajo que haya que realizar nuevo sobre su área, cada error que se produzca, cada tarea o incidencia que caiga en el trozo de código que <em>tiene en propiedad</em> es responsabilidad suya y solo suya, no pudiendo aprovechar la visión conjunta que puede aportar un equipo multidisciplinar.</p>
<h3>Propiedad Comunitaria del Código</h3>
<p>El hecho de que un código sea de un grupo (no de un individuo) hace que el código sea creado, modificado y ampliado por un equipo, por más de una cabeza pensante, por lo que dará más riqueza al código y se evitarán muchos errores, al ser más ojos los que ven ese código.</p>
<p>En principio, de cara a la alta esfera de la compañía, se ve al equipo de programación como un todo, cada uno puede realizar el trabajo sobre el código que se le diga que debe trabajar (por asignación), ya que es parte del equipo o grupo que lo ha creado. </p>
<p>Puede rotarse la delegación de su tarea (por vacaciones, marcha de la compañía, o baja laboral) en cualquier momento, puesto que sus compañeros saben lo que hacen y sobre qué lo está haciendo.</p>
<p>Ante un error o una incidencia, hay un grupo, un equipo, que puede revisar el código y corregirlo.</p>
<h3>Conclusiones</h3>
<p>Es sentido común el pensar que esto debería de ser así en todas las compañías, pero aún queda bastante en tema de educación el hacer ver a muchas personas que las cosas que hacen <em>no son suyas</em>, sino que son de la compañía para la que trabajan y en esa misma compañía, junto a ellas, han contratado a compañeros para hacer el trabajo más llevadero, más rápido y más profesional. Si esto no se aprovecha, entonces, no se ganará del intercambio de conocimiento  entre personas que sepan más de un campo concreto, ni de la riqueza a la que puede llegar un software cuando se programa por un equipo, no por un individuo.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/08/06/propiedad-del-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolviendo Shikaku</title>
		<link>http://bosqueviejo.net/2010/07/11/resolviendo-shikaku/</link>
		<comments>http://bosqueviejo.net/2010/07/11/resolviendo-shikaku/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 13:01:44 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[algoritmo voraz]]></category>
		<category><![CDATA[algoritmo vuelta atrás]]></category>
		<category><![CDATA[shikaku]]></category>
		<category><![CDATA[uned]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=456</guid>
		<description><![CDATA[Esta es una práctica que realicé (y comenté) en diciembre de 2008 para la asignatura de Programación III de la UNED.
La práctica se basaba en realizar un sistema para resolver tableros de shikaku, mediante el algoritmo de vuelta atrás. Mi solución es óptima pero no del todo correcta desde un punto de vista académico, ya que el uso del algoritmo (de backtracking) es menos usado de lo que debería.
Para poder ver el código, este puede descargarse a través de un cliente de Subversion, en sistemas Unix/Linux es tan fácil como:
svn co http://project.bosqueviejo.net/svn/shikaku/trunk
Explicación del código
Bueno, tengo que reconocer que, después de algo más de un año de haberlo hecho, he tenido que releer y revisar de nuevo todo para acordarme (y reaprender) cómo hace lo que hace.
Por ello, voy a escribir una documentación básica sobre el código en sí, para tenerla como referencia, cuando tenga que volver al mismo otra vez, y para que sirva a todos aquellos que lo necesiten.
En principio, el código se divide en las siguientes clases:

shikaku.tablero.Combinacion: esta clase se encarga de almacenar combinaciones. Una combinación es un rectángulo que se sitúa ocupando un espacio de X*Y=N. La combinación debe de tener en alguna de sus casillas el [...]]]></description>
			<content:encoded><![CDATA[<p>Esta es una práctica que realicé (y <a href="http://bosqueviejo.net/2008/12/13/algoritmos-heuristicos-y-algoritmos-voraces/">comenté</a>) en diciembre de 2008 para la asignatura de Programación III de la UNED.</p>
<p>La práctica se basaba en realizar un sistema para resolver tableros de shikaku, mediante el algoritmo de vuelta atrás. Mi solución es óptima pero no del todo correcta desde un punto de vista académico, ya que el uso del algoritmo (de <em>backtracking</em>) es menos usado de lo que debería.</p>
<p>Para poder ver el código, este puede descargarse a través de un cliente de Subversion, en sistemas Unix/Linux es tan fácil como:</p>
<pre>svn co http://project.bosqueviejo.net/svn/shikaku/trunk</pre>
<h3>Explicación del código</h3>
<p>Bueno, tengo que reconocer que, después de algo más de un año de haberlo hecho, he tenido que releer y revisar de nuevo todo para acordarme (y reaprender) cómo hace lo que hace.</p>
<p>Por ello, voy a escribir una documentación básica sobre el código en sí, para tenerla como referencia, cuando tenga que volver al mismo otra vez, y para que sirva a todos aquellos que lo necesiten.</p>
<p>En principio, el código se divide en las siguientes clases:</p>
<ul>
<li><strong>shikaku.tablero.Combinacion</strong>: esta clase se encarga de almacenar combinaciones. Una combinación es un rectángulo que se sitúa ocupando un espacio de X*Y=N. La combinación debe de tener en alguna de sus casillas el número contenido, por lo que se almacena también la ordenada de N para comprobaciones.</li>
<li><strong>shikaku.tablero.Ordenada</strong>: es cada uno de los números que aparecen en el tablero. Se almacena su posición dentro del tablero y la representación numérica del mismo.</li>
<li><strong>shikaku.tablero.Tablero</strong>: almacena las dimensiones del tablero, la lista de combinaciones fijas (las que solo tienen una combinación válida detectada) y la lista de soluciones posibles para el tablero.</li>
</ul>
<p>Una ejecución de <strong>shikaku</strong> tiene los siguientes pasos:</p>
<ol>
<li>Entra en <em>main</em> de la clase <em>shikaku</em>, donde se detecta el origen de datos, hasta saber de donde se va a cargar el tablero.</li>
<li>En <em>run</em> se crea una instancia del tablero, y se ejecuta, para cada punto del tablero, el <em>generador</em> de la clase <em>Combinacion</em>.</li>
<li>El <em>generador</em> se encarga de buscar combinaciones válidas para el punto dado, dentro del tablero y validando su posición dentro del tablero (es decir, que no haya parte del rectángulo fuera) y con respecto al resto de puntos (que no tenga contenido nada más que el punto del que tiene que hacer la combinación).</li>
<li>El último paso para la resolución, es llamando a <em>buscaSoluciones</em>, de la clase <em>Tablero</em>, que se encarga de realizar el algoritmo de vuelta atrás para buscar las soluciones al tablero.</li>
</ol>
<p>Estos son los pasos más importantes dentro del código para resolver el tablero de shikaku.</p>
<h3>La depuración</h3>
<p>Uno de los motivos por los que el algoritmo no es del todo de tipo vuelta atrás, es precisamente por el uso de tres algoritmos voraces que se ejecutan antes que el último, de vuelta atrás. Estos algoritmos realizan una criba sobre las combinaciones basándose en tres premisas que debe cumplir cada combinación para ser válida:</p>
<ol>
<li><strong>Que no haya nada fuera del tablero</strong>: esto se realiza mediante una simple validación a la hora de generar las combinaciones. Es simple y rápida, y quita mucho procesamiento al algoritmo final.</li>
<li><strong>Combinaciones con un solo número</strong>: esto se refiere a que dentro del rectángulo que conforma la combinación, solo esté contenido el número objeto de la combinación y ningún otro. Esta validación también está incluida a la hora de generar las combinaciones, para lo que se necesita, en el generador, pasar todos los puntos del tablero.</li>
<li><strong>Eliminar combinaciones imposibles</strong>: imposibles, además de las que se descartan en los puntos anteriores, son las que <em>colisionan</em> con todas y cada una de las combinaciones posibles de otro número vecino. Si la combinación de un número colisiona con todas las combinaciones posibles de otro número, como es lógico, no podrá ser posible.</li>
</ol>
<p>Ciertamente, con estos algoritmos se llega a resolver un alto porcentaje de los tableros básicos, sin necesidad de realizar el algoritmo de vuelta atrás. Solo los tableros grandes y con dificultad alta, necesitan, además de estos algoritmos voraces, el de vuelta atrás.</p>
<h3>Mejoras</h3>
<p>En sentido académico, teniendo en cuenta uno de los requisitos que se pide, que es que sea un algoritmo de vuelta atrás, quizás sea más correcto que la depuradora actúe solo a nivel de rama y no en profundidad.</p>
<p>Hay que tener en cuenta que esto penalizaría el rendimiento y empeoraría en lo que a gestión de memoria se refiere, pero prima más cumplir con los requisitos <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/07/11/resolviendo-shikaku/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Programación para Administradores de Sistemas</title>
		<link>http://bosqueviejo.net/2010/04/06/programacion-para-administradores-de-sistemas/</link>
		<comments>http://bosqueviejo.net/2010/04/06/programacion-para-administradores-de-sistemas/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 23:04:24 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Libros]]></category>
		<category><![CDATA[administración de sistemas]]></category>
		<category><![CDATA[jon orwant]]></category>
		<category><![CDATA[larry wall]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tom christiansen]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=383</guid>
		<description><![CDATA[Cuando estuve estudiando el título de Administración de Sistemas Informáticos es cuando me acerqué a los lenguajes de scripting (por el año 2002), y fue cuando comencé a aprender lenguajes como PHP, Python, Ruby y Perl.
El lenguaje Perl me llamó la atención, sobre el resto, porque había sido un lenguaje creado por Larry Wall, un administrador de sistemas&#8230; ¡en un mes!, supongo que lo que creó fue la parte más básica del sistema, pero al mismo tiempo la más importante, ya que, como él mismo comenta, Perl fue la simplificación del uso de herramientas como awk, sed, shell script y C.
En la mayoría de trabajos que he tenido, después de eso, cuando un administrador de sistemas desarrollaba algún proyecto, alguna aplicación o decía que programaba, lo hacía en Perl. No en vano, ha sido considerado por muchas distribuciones, empresas y comunidades, como el lenguaje de facto para las actividades típicas de administración de sistemas, entre las que se encuentran tareas tan vitales como: la instalación del sistema, asistentes de configuración, pasarelas intermedias (como amavis)&#8230;
Uno de los grandes miedos de la gente que programa en este lenguaje, es la mítica frase de que Perl es un lenguaje write-only, es decir, de [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando estuve estudiando el título de Administración de Sistemas Informáticos es cuando me acerqué a los lenguajes de scripting (por el año 2002), y fue cuando comencé a aprender lenguajes como PHP, Python, Ruby y Perl.</p>
<p>El lenguaje Perl me llamó la atención, sobre el resto, porque había sido un lenguaje creado por <a href="http://www.wall.org/~larry/">Larry Wall</a>, un administrador de sistemas&#8230; ¡en un mes!, supongo que lo que creó fue la parte más básica del sistema, pero al mismo tiempo la más importante, ya que, como él mismo comenta, Perl fue la simplificación del uso de herramientas como awk, sed, shell script y C.</p>
<p>En la mayoría de trabajos que he tenido, después de eso, cuando un administrador de sistemas desarrollaba algún proyecto, alguna aplicación o decía que programaba, lo hacía en Perl. No en vano, ha sido considerado por muchas distribuciones, empresas y comunidades, como el lenguaje de facto para las actividades típicas de administración de sistemas, entre las que se encuentran tareas tan vitales como: la instalación del sistema, asistentes de configuración, pasarelas intermedias (como amavis)&#8230;</p>
<p>Uno de los grandes miedos de la gente que programa en este lenguaje, es la mítica frase de que Perl es un lenguaje <em>write-only</em>, es decir, de los que se usan solo para escribir código que no hace falta mantener (o de usar y tirar), aunque proyectos grandes y la comunidad en sí manteniendo y ampliando el lenguaje, han demostrado que Perl es un gran lenguaje de programación en el que se pueden desarrollar grandes cosas y darles mantenimiento sin problema ni riesgo.</p>
<div style="float:left;padding-right:10px;padding-bottom:10px;"><a href='http://openlibrary.org/books/OL7580879M/Programming_Perl_(3rd_Edition)' ><img src='http://covers.openlibrary.org/b/id/388448-M.jpg' alt='Programming Perl (3rd Edition)' title='View this title in Open Library' /></a></div><div style="font-size:18px;font-weight:bold;"><a href='http://openlibrary.org/books/OL7580879M/Programming_Perl_(3rd_Edition)' title='View this title in Open Library' >Programming Perl (3rd Edition)</a></div><div style="font-size:14px;">; O&#039;Reilly Media, Inc. 2000</div><div style="font-size:10px;"><a href="http://worldcat.org/isbn/9780596000271" title="View this title at WorldCat">WorldCat</a>&#8226;<a href="http://www.librarything.com/work/1543247" title="View this title at LibraryThing">LibraryThing</a>&#8226;<a href="http://books.google.com/books?as_isbn=9780596000271" title="View this title at Google Books">Google Books</a>&#8226;<a href="http://www.bookfinder.com/search/?st=xl&ac=qr&isbn=9780596000271" title="Search for the best price at BookFinder">BookFinder</a></div><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fbosqueviejo.net%3AOpenBook&amp;rft.genre=book&amp;rft.btitle=Programming+Perl+%283rd+Edition%29&amp;rft.isbn=9780596000271&amp;rft.au=&amp;rft.pub=O%26%23039%3BReilly+Media%2C+Inc.&amp;rft.date=July+14%2C+2000&amp;rft.tpages=1092"></span><p>
<p>El libro que aconsejo para adentrarse en el mundo de Perl es el que escribió su creador, Larry Wall, aunque a partir de su tercera edición, que está acompañada de mucho más contenido aportado por autores como <a href="http://en.wikipedia.org/wiki/Tom_Christiansen">Tom Christiansen</a>, uno de los primeros que se sumó al mundo y comunidad de Perl; y <a href="http://www.oreillynet.com/pub/au/105">Jon Orwant</a>, el editor de <em>The Perl Journal</em>, cuya publicación cesó hace ya algunos años.</p>
<p>El libro es algo extenso y asusta al primer vistazo, no en vano son 1070 páginas. Pero una vez se ha abierto y visto el índice, se entiende su extensión y deja de asustar. Realmente, el libro se parte en cinco apartados bien diferenciados:</p>
<ul>
<li>Introducción&#8230; bueno, esta la podemos leer a modo informativo, o podemos obviarla. Son unas 50 páginas.</li>
<li>Los detalles <em>desagradables</em>&#8230; un título un poco extraño, pero se entiende, porque son los detalles del lenguaje en sí, lo que permite, lo que se puede hacer con él, la sintaxis, los elementos&#8230; todo. Es la parte más importante del libro, en mi parecer. Unas 350 páginas, más o menos.</li>
<li>Perl como Tecnología, nos adentra en lo que hace el intérprete internamente, cómo se puede optimizar su uso, el depurador, los hilos, interfaz con C&#8230; sería la parte avanzada del lenguaje. Unas 150 páginas.</li>
<li>La Cultura de Perl, es el uso de CPAN, el administrador de paquetes, prácticas comunes, seguridad, haciendo Perl portable entre plataformas, documentación, etc. Un poco de Perl en la comunidad y cómo compartir código en la forma en la que lo hacen muchos. Unas 100 páginas.</li>
<li>Material de Referencia&#8230; como no podía faltar, toda la referencia de los paquetes básicos de las librerías que trae consigo Perl. Esta quizás es la parte más extensa del libro, pero la que más se puede emplear en el día a día, realmente.</li>
</ul>
<p>Una lectura muy recomendable para todos aquellos que quieren adentrarse en la programación de Perl de una forma más íntima, conociendo la comunidad, cómo compartir código, cómo aprovechar el código que ya está disponible para Perl y las mejores prácticas de programación en este lenguaje.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/04/06/programacion-para-administradores-de-sistemas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Los sectores del software</title>
		<link>http://bosqueviejo.net/2010/01/07/los-sectores-del-software/</link>
		<comments>http://bosqueviejo.net/2010/01/07/los-sectores-del-software/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 09:25:22 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ruby]]></category>

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

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=206</guid>
		<description><![CDATA[Hace poco me he encontrado con un problema. Tengo un entramado de servidores y comunicaciones entre cada uno de ellos. Cada servidor puede notificar, ya sea vía SOAP, HTTP, XMPP o mediante cualquier otro protocolo, un evento o una información a otro servidor del entramado, con lo que cada servidor se configura de una forma específica, con una serie de nombres de dominio o IPs.
El problema viene al querer aplicar escalabilidad al proyecto. Cuando no solo hay un equipo implicado, sino que existen dos o tres, los cuales hay que configurar bajo ciertas circunstancias.
Lo primero que pensé, es que, si le puedo notificar a la red de que sucede un evento en concreto, ya sea a una sola máquina o conjunto definido de estas (pero para todos los equipos la misma configuración), facilitaría la puesta en producción. Con lo que me puse a buscar y encontré MQ, message queue.
El encolado de mensajes
La comunicación de los equipos informáticos se basa en mensajes, en eventos, que deben de poder transmitirse de unos a otros cuando sucedan (si es que se quiere tener la máxima fiabilidad en la información que se trata).
Una forma es comunicar directamente al implicado, lo cual resulta un poco [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco me he encontrado con un problema. Tengo un entramado de servidores y comunicaciones entre cada uno de ellos. Cada servidor puede notificar, ya sea vía SOAP, HTTP, XMPP o mediante cualquier otro protocolo, un evento o una información a otro servidor del entramado, con lo que cada servidor se configura de una forma específica, con una serie de nombres de dominio o IPs.</p>
<p>El problema viene al querer aplicar escalabilidad al proyecto. Cuando no solo hay un equipo implicado, sino que existen dos o tres, los cuales hay que configurar bajo ciertas circunstancias.</p>
<p>Lo primero que pensé, es que, si le puedo notificar a la red de que sucede un evento en concreto, ya sea a una sola máquina o conjunto definido de estas (pero para todos los equipos la misma configuración), facilitaría la puesta en producción. Con lo que me puse a buscar y encontré MQ, message queue.</p>
<h3>El encolado de mensajes</h3>
<p>La comunicación de los equipos informáticos se basa en mensajes, en eventos, que deben de poder transmitirse de unos a otros cuando sucedan (si es que se quiere tener la máxima fiabilidad en la información que se trata).</p>
<p>Una forma es comunicar directamente al implicado, lo cual resulta un poco tedioso si los implicados son muchos y muy distintos.</p>
<p>Otra forma es mediante un sistema <a href="http://es.wikipedia.org/wiki/Java_Message_Service">JMS</a> o un <a href="http://en.wikipedia.org/wiki/Message_queue">MQ</a>, como <a href="http://www.rabbitmq.com">RabbitMQ</a>.</p>
<p>El encolado de mensajes es un sistema que permite que un elemento perteneciente a un sistema de información, pueda comunicar un estado, evento o mensaje informativo o imperativo a otro conjunto de elementos dentro del sistema, para que interactúe con él.</p>
<p>Por ejemplo, si tenemos un servidor web, una interfaz, que controla un conjunto de máquinas encargadas realizar llamadas salientes, rastrear páginas de la web para almacenar información para un buscador o similar, y la interfaz quiere enviar parámetros nuevos de configuración a estas, puede hacerlo mediante el envío de un mensaje generalizado a ese conjunto de máquinas, y estas máquinas recibirán el mensaje en el momento que lo soliciten.</p>
<p>Esta utilidad es igualmente buena para cuando una interfaz web, por ejemplo de un estudio fotográfico, carga imágenes desde la web, las retoca con algún tipo de efecto, ajuste, etc. y más adelante permite su descarga. El sistema web puede enviar el evento al sistema de retocado de que hay una imagen disponible, y cuando la imagen ya está disponible, el sistema de retocado puede enviar otro mensaje de vuelta diciendo que ya está.</p>
<p>Quizás esto último podría hacerse mejor con una base de datos, pero con el sistema de mensajería, se eliminan los datos en el momento que ya no se necesitan, mientras que con la base de datos, esos datos podrían permanecer ahí de forma indeterminada.</p>
<h3>Conclusiones</h3>
<p>Los sistemas de encolado de mensajes tienen su utilidad, sobre todo, en sistemas formados por varias máquinas, con roles bien definidos y en las que se quiere afinar lo que son las conexiones y comunicaciones entre las máquinas.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/10/08/sistemas-de-mensajes-encolados-mq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

