<?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/category/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>Thu, 22 Jul 2010 07:02:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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, [...]


Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2008/12/13/algoritmos-heuristicos-y-algoritmos-voraces/' rel='bookmark' title='Permanent Link: Algoritmos heurísticos y algoritmos voraces'>Algoritmos heurísticos y algoritmos voraces</a></li>
</ol>]]></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>


<p>Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2008/12/13/algoritmos-heuristicos-y-algoritmos-voraces/' rel='bookmark' title='Permanent Link: Algoritmos heurísticos y algoritmos voraces'>Algoritmos heurísticos y algoritmos voraces</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/07/11/resolviendo-shikaku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clojure: más sobre concurrencia.</title>
		<link>http://bosqueviejo.net/2010/07/07/clojure-mas-sobre-concurrencia/</link>
		<comments>http://bosqueviejo.net/2010/07/07/clojure-mas-sobre-concurrencia/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 20:45:03 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[programación funcional]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=454</guid>
		<description><![CDATA[El término closure (clojure en francés y cláusula en castellano) se emplea en informática (según la wikipedia) como: una función que es evaluada en un entorno conteniendo una o más variables dependientes de otro entorno.; o dicho de otra forma, lo que se conoce como un código evaluado, es decir, procesado y/o compilado en caliente [...]


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[<p>El término closure (<em>clojure</em> en francés y <em>cláusula</em> en castellano) se emplea en informática (<a href="http://es.wikipedia.org/wiki/Clausura_(informática)">según la wikipedia</a>) como: <em>una función que es evaluada en un entorno conteniendo una o más variables dependientes de otro entorno.</em>; o dicho de otra forma, lo que se conoce como un código evaluado, es decir, procesado y/o compilado <em>en caliente</em> o tiempo de ejecución.</p>
<p>¿Por qué una introducción acerca de closure?, pues porque uno de los lenguajes que comienza a ser muy usado, es precisamente este: clo<em>j</em>ure.</p>
<h3>¿Qué es clo<em>j</em>ure?</h3>
<p>Es un lenguaje concurrente, en definición corta, según su <a href="http://clojure.org/">web oficial</a>, es un lenguaje de propósito general, que se compila y ejecuta sobre la JVM, dando la versatilidad de un lenguaje scripting, pero al mismo tiempo la robustez que requieren los programas multihilo.</p>
<p>Además, permite el acceso a frameworks Java, con lo que su integración con los entornos Java hace que sea un lenguaje que compita directamente con Scala, en este campo.</p>
<p>Para los que programan en Java, PHP, Perl, Python, Ruby&#8230; ver lenguajes como Haskell, Erlang, Lisp, Prolog o Clo<em>j</em>ure puede resultar en principio algo chocante, ya que la sintaxis es muy diferente. Es normal, su forma de actuación, lo que se puede hacer con ellos y no con los otros, es también distinto. El cambio de sintaxis, fuera de ser un impedimento, yo lo considero una forma de <em>obligarte a cambiar el chip</em>, antes de comenzar a programar.</p>
<h3>¿Y para qué sirve?</h3>
<p>Bueno, tanto hablar, tanto hablar&#8230; pero, ¿y qué hace este lenguaje?, ¿para qué es bueno? En un primer vistazo, los desarrolladores del mismo te pueden responder de forma rápida: <strong>para concurrencia</strong>.</p>
<p>Después, más detenidamente, te puedes dar cuenta de que es un tipo lenguaje tipo Lisp, con lo que, no solo es bueno con la concurrencia, sino también con la organización de datos e identificación de forma inteligente&#8230; o lo que se suele llamar la <em>inteligencia artificial</em>.</p>
<h3>Conclusiones</h3>
<p>Lisp es un lenguaje que tengo en la lista de tareas por aprender. A través de clo<em>j</em>ure, ahora, puedo darle una visión un poco más enfocada a los entornos que se usan actualmente para la programación, de modo que pueda ser más útil que simplemente aprender Lisp.</p>
<p>Por mi parte, recomiendo la elección de este lenguaje a todo aquél que tenga problemas a resolver en entornos que requieran de un procesamiento deductivo y con alta concurrencia, por ejemplo: videojuegos, elementos de telecomunicaciones, etc.</p>


<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/07/07/clojure-mas-sobre-concurrencia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El futuro de la web: HTML 5</title>
		<link>http://bosqueviejo.net/2010/04/22/el-futuro-de-la-web-html-5/</link>
		<comments>http://bosqueviejo.net/2010/04/22/el-futuro-de-la-web-html-5/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 09:47:53 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=422</guid>
		<description><![CDATA[Con este título he encontrado una presentación de Derek Bender, gracias a un artículo en la web del IES Gran Capitán de Córdoba (España), en el que se presentan datos significativos de cómo será la programación web a partir del año que viene, que es cuando ya todos los navegadores más importantes, tendrán soporte para [...]


Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2009/02/08/javascript-y-css-no-intruso-en-html/' rel='bookmark' title='Permanent Link: JavaScript y CSS no intruso en HTML'>JavaScript y CSS no intruso en HTML</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Con este título he encontrado <a href="http://www.slideshare.net/derekbender/the-future-of-the-web-html5">una presentación de Derek Bender</a>, gracias <a href="http://www.iesgrancapitan.org/blog04/?p=1314">a un artículo en la web del IES Gran Capitán de Córdoba (España)</a>, en el que se presentan datos significativos de cómo será la programación web a partir del año que viene, que es cuando ya todos los navegadores más importantes, tendrán soporte para HMTL 5.</p>
<p>No obstante, los equipos antiguos que aún manejan navegadores antiguos, no podrán visualizar estas mejoras, pero al menos, ya se habrá iniciado una mejor forma de realizar páginas web.</p>
<p>En principio, Derek, nos introduce en la historia de esta nueva liberación. Los grupos de trabajo principales: Apple, Mozilla y Opera (y muchos otros menos conocidos); se reunen para trabajar en una nueva liberación de este lenguaje de etiquetas basado en el uso cotidiano que se le da en estos momentos.</p>
<h3>Cambios o Puntos fuertes</h3>
<ul>
<li>Se agregan <strong>etiquetas para marcar correctamente</strong> o de forma más concreta y correcta los elementos que se visualizan en la web: header, nav, section, article, aside, footer, figure&#8230;; con lo que, en lugar de usar la etiqueta <em>div</em> en todos los casos, se puede usar cualquiera de las anteriores para indicar que son cuadros de navegación (<em>nav</em>), cabeceras (<em>head</em>), etc.</li>
<li>Añaden <strong>etiquetas con características nuevas</strong>: hgroup, details, summary, mark, output, progress, menu, video, audio&#8230;; con lo que se puede incluir de forma más fácil un reproductor de vídeos o audio, modificando su visualización fácilmente a través de CSS, así como barras de progreso, menús, etc.</li>
<li>Se dispone de <strong>lienzo para poder dibujar</strong>: canvas. Este se puede usar para hacer cosas como una visualización personalizada con ampliaciones y cambios en línea (por parte del navegador) como: <a href="http://www.bdebloggers.com/2010/04/10/wadda-lupa-imagenes-usando-html5-canvas.html">una lupa o ampliador</a>, o <a href="http://joncom.be/experiments/thrust/play/">juegos</a>.</li>
<li>Se incluyen <strong>nuevas APIs</strong>: drag&#8217;n drop, edición de documentos, caché offline, almacenamiento simple en cliente, almacenamiento estructurado en cliente, mensajería entre documentos&#8230;</li>
<li><strong>Formularios potenciados</strong>, con la agregación de los tipos de entradas: color, number, time, month, date, datetime, datetime-local, url, range, email, search, tel y week. Con esto se permite hacer formularios mucho más simples que den posibilidad de entrada de datos para un selector de colores, fechas y horas, URLs, rango de números, emails, etc. Además de agregar atributos, que los completan: required, autocomplete, autofocus, pattern (para formateado) y más&#8230;</li>
<li>Se <strong>eliminan elementos</strong> como: center, font, frameset y strike.</li>
</ul>
<h3>Soporte</h3>
<p>Los navegadores que lo soportan, de momento, son Firefox, Opera y Chrome. En 2011, Microsoft, planea sacar IE 9, el cual tendrá también soporte de HTML 5.</p>
<h3>Beneficios y Desventajas</h3>
<p>Derek señala los siguientes beneficios de HTML 5:</p>
<ul>
<li>Tiene una sintaxis más clara.</li>
<li>Elementos semánticos más concretos.</li>
<li>Nuevos elementos de formulario que facilitan la programación de los mismos.</li>
</ul>
<p>Por mi parte agregaría:</p>
<ul>
<li>Hace que se dependa menos de Flas, Silverlight y ciertas librerías de JavaScript.</li>
<li>Hace que el navegador dibuje y <em>ejecute</em> de forma más rápida la web.</li>
</ul>
<p>Las desventajas, que las hay, son:</p>
<ul>
<li>La especificación de HTML 5 no ha finalizado, aún pueden sucederse cambios.</li>
<li>No todo funciona en todos los navegadores.</li>
</ul>
<h3>Conclusiones</h3>
<p>Como dice la presentación: <em>Evolution, not Revolution</em>; por lo que, como mejora que constituye HTML 5, habrá que tenerla presente, ya que dentro de unos años, la mayoría de los navegadores soportarán estas características y, emplearlas, constituirá una ventaja con respecto al rendimiento, tanto por parte del navegador, como por parte del desarrollador.</p>
<p>La presentación:</p>
<div style="width:425px" id="__ss_3635819"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/derekbender/the-future-of-the-web-html5" title="The Future of the Web: HTML5">The Future of the Web: HTML5</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=html5-100404164316-phpapp01&#038;stripped_title=the-future-of-the-web-html5" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=html5-100404164316-phpapp01&#038;stripped_title=the-future-of-the-web-html5" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">Ver más <a href="http://www.slideshare.net/">presentaciones</a> de <a href="http://www.slideshare.net/derekbender">Derek Bender</a>.</div>
</div>


<p>Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2009/02/08/javascript-y-css-no-intruso-en-html/' rel='bookmark' title='Permanent Link: JavaScript y CSS no intruso en HTML'>JavaScript y CSS no intruso en HTML</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/04/22/el-futuro-de-la-web-html-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>¡Shoes vive!</title>
		<link>http://bosqueviejo.net/2010/04/14/shoes-vive/</link>
		<comments>http://bosqueviejo.net/2010/04/14/shoes-vive/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 08:36:24 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shoes]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=392</guid>
		<description><![CDATA[Hace tiempo escribí una entrada sobre este entorno de programación para GUI de Ruby, desde ahí a unos meses después, el creador del entorno, denominado why en la red, cerró todo su material en la red, eliminó su twitter, sus webs y dominios, eliminó sus códigos de github, etc. Después de esta acción, shoes murió&#8230; [...]


Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2009/05/18/shoes-programacion-facil-de-gui-en-ruby/' rel='bookmark' title='Permanent Link: Shoes: programación fácil de GUI en Ruby'>Shoes: programación fácil de GUI en Ruby</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/shoes-icon.png" alt="" title="shoes-icon" width="128" height="128" class="alignleft size-full wp-image-419" /> Hace tiempo <a href="http://bosqueviejo.net/2009/05/18/shoes-programacion-facil-de-gui-en-ruby/">escribí una entrada</a> sobre este entorno de programación para GUI de Ruby, desde ahí a unos meses después, el creador del entorno, denominado <em>why</em> en la red, cerró todo su material en la red, eliminó su twitter, sus webs y dominios, eliminó sus códigos de github, etc.</p>
<p>Después de esta acción, shoes <em>murió</em>&#8230; era muy complicado encontrar un sistema shoes que funcionase y se compilase con las nuevas versiones de ruby, así como un tutorial tan completo como el que tenía <em>why</em> en su propia página web.</p>
<p>No obstante, en este mismo año, <em>mental</em> y más gente en la red, ha ido recopilando de las cachés y de lo que guardaban entre unos y otros y, amparándose en las licencias con las que fueron publicadas cada cosa, han vuelto a poner, eso sí, en otros enlaces distintos, cada una de las cosas que <em>why</em> dió de baja de Internet (salvo su twitter, claro).</p>
<p>La nueva web: <a href="http://hacketyhack.heroku.com">http://hacketyhack.heroku.com</a></p>
<p>El código fuente se puede descargar de <a href="http://github.com/shoes/shoes">aquí</a>.</p>


<p>Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2009/05/18/shoes-programacion-facil-de-gui-en-ruby/' rel='bookmark' title='Permanent Link: Shoes: programación fácil de GUI en Ruby'>Shoes: programación fácil de GUI en Ruby</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/04/14/shoes-vive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comet ha muerto, ¡larga vida a websockets!</title>
		<link>http://bosqueviejo.net/2009/12/29/comet-ha-muerto-larga-vida-a-websockets/</link>
		<comments>http://bosqueviejo.net/2009/12/29/comet-ha-muerto-larga-vida-a-websockets/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 00:10:24 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[erlang]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=215</guid>
		<description><![CDATA[Leyendo el artículo de Joe Armstrong, sobre este mismo título, comenta que con la aparición de websockets (una nueva característica que ha aparecido en HTML5), el sistema comet y otros derivados, están abocados a la extinción. Desde siempre, el sistema HTTP, llamado también web, ha sido un sistema cliente-servidor, donde el cliente siempre ha sido [...]


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[<p>Leyendo <a ref="http://armstrongonsoftware.blogspot.com/2009/12/comet-is-dead-long-live-websockets.html">el artículo de Joe Armstrong</a>, sobre este mismo título, comenta que con la aparición de <a href="http://www.w3.org/TR/2009/WD-websockets-20091222/">websockets</a> (una nueva característica que ha aparecido en HTML5), el sistema <a href="http://en.wikipedia.org/wiki/Comet_(programming)">comet</a> y otros derivados, están abocados a la extinción.</p>
<p>Desde siempre, el sistema HTTP, llamado también web, ha sido un sistema cliente-servidor, donde el cliente siempre ha sido el navegador web, o cualquier herramienta que pudiese hacer una petición HTTP hacia un servidor, y el servidor, un ente pasivo, se encargaba de procesar la petición y retornar una respuesta. Nada más.</p>
<p>Una de las implementaciones más usadas por este sistema se produce gracias a la característica de HTTP 1.1 de mantener viva la conexión (<em>keep alive</em>) permitiendo al navegador realizar más peticiones y al servidor encauzar una respuesta progresiva, como una lluvia de estrellas (cometas) es el <em>streaming</em>, ya que el sistema puede enviar datos de vídeo progresivamente.</p>
<p>El problema viene dado, también, por la propia especificación de HTTP 1.1, donde se indica que sólo puede haber dos conexiones simultáneas con entre navegador y servidor, con lo que, el uso en una página web con hoja de estilos y bastantes imágenes puede no ser muy aconsejable.</p>
<p>¿Qué aporta de nuevo o de mejorado websockets? a través de HTML y JavaScript de forma simple, se establece una conexión con el servidor dada una URL y un sub-protocolo en el que deben de <em>hablar</em>. Una vez conectado, los elementos html pueden tener eventos del tipo: onopen, onmessage, onclose; indicando los tres eventos que pueden darse en la conexión y el diálogo abierto con el servidor. </p>
<p>Hay que recordar que la interacción vendrá dada por el servidor, esto es que, un programa ejecutándose en el servidor (que no tiene porqué ser de tipo web) puede enviar un evento al puerto especificado por el cliente y el mensaje ser recogido por el navegador y <em>dárselo</em> al elemento al que haga referencia el propio mensaje.</p>
<p>De momento, en Google Chrome se encuentra operativo y se puede probar. En <a href="http://armstrongonsoftware.blogspot.com/2009/12/comet-is-dead-long-live-websockets.html">el artículo de Joe Armstrong</a> se puede descargar un código en Erlang para el servidor y un código HTML para el navegador.</p>
<p>Realizaré pruebas y ya comentaré la impresión que me cause el sistema.</p>


<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/12/29/comet-ha-muerto-larga-vida-a-websockets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La Historia de Erlang</title>
		<link>http://bosqueviejo.net/2009/09/02/la-historia-de-erlang/</link>
		<comments>http://bosqueviejo.net/2009/09/02/la-historia-de-erlang/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 10:54:24 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[erlang]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=197</guid>
		<description><![CDATA[He encontrado un documento (en inglés) que redacta la historia de Erlang contada por su desarrollador principal, en los laboratorios de Ericsson: Erlang fue diseñado para escribir programas concurrentes que se ejecutasen eternamente. Erlang usa procesos concurrentes para estructurar el programa. Estos procesos no tienen memoria compartida y se comunican por paso de mensajes asíncronos. [...]


Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2008/10/08/erlang-concurrente-distribuido-y-en-tiempo-real/' rel='bookmark' title='Permanent Link: Erlang: concurrente, distribuido y en tiempo real'>Erlang: concurrente, distribuido y en tiempo real</a></li>
<li><a href='http://bosqueviejo.net/2009/03/18/reia-ruby-sobre-erlang/' rel='bookmark' title='Permanent Link: Reia: Ruby sobre Erlang'>Reia: Ruby sobre Erlang</a></li>
<li><a href='http://bosqueviejo.net/2008/11/20/erlang-y-asterisk-erlast/' rel='bookmark' title='Permanent Link: Erlang y Asterisk&#8230; ErlAst'>Erlang y Asterisk&#8230; ErlAst</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>He encontrado un <a href="http://www.cs.chalmers.se/Cs/Grundutb/Kurser/ppxt/HT2007/general/languages/armstrong-erlang_history.pdf">documento</a> (en inglés) que redacta la historia de Erlang contada por su desarrollador principal, en los laboratorios de Ericsson:</p>
<blockquote><p>
Erlang fue diseñado para escribir programas concurrentes que se <em>ejecutasen eternamente</em>. Erlang usa procesos concurrentes para estructurar el programa. Estos procesos no tienen memoria compartida y se comunican por paso de mensajes asíncronos. Los procesos de erlang son ligeros y pertenecen al lenguaje, no al sistema operativo. Erlang tiene mecanismos que permiten que los programas cambien <em>on-the-fly</em> (en vivo) así, esos programas pueden evolucionar y cambiar sin detener su ejecución. Estos mecanismos simplifican la construcción de software implementando sistemas <em>non-stop</em> (que no se detienen).</p>
<p>El desarrollo inicial de Erlang tuvo lugar en 1986 en el Laboratorio de Computación de Ericsson. Erlang fue diseñado con un objetivo específico en mente: <em>proporcionar una mejor forma de programar aplicaciones de telefonía</em>. En ese momento, las aplicaciones de telefonía eran atípicas del tipo de problemas que podían resolver los lenguajes de programación convencionales. Las aplicaciones de telefonía son, por su naturaleza, altamente concurrentes: un simple <em>switch</em> debe manejar decenas o cientos de miles de transacciones simultáneas. Tales transacciones son intrínsecamente distribuidas y el software se espera que sea altamente tolerante a fallos. Cuando el software que controla los teléfonos falla, sale en los periódicos, algo que no ocurre cuando fallan las aplicaciones de escritorio. El software de telefonía debe también cambiar <em>on-the-fly</em>, esto es, sin perder el servicio mientras se realiza una actualización del código. El software de telefonía debe también operar en <em>tiempo real</em>, con ajustados requisitos de tiempo para algunas operaciones, y más relajado tiempo en otras clases de operaciones.
</p></blockquote>
<p>Como puede leerse en el extracto, Joe Armstrong, fijó los requisitos de Erlang en solucionar los problemas de un entorno altamente concurrente, que no puede permitirse caer y que debe de actualizarse sin pérdida de servicio.</p>
<p>Actualmente, esta definición casa con casi la mayor parte de servicios en Internet.</p>


<p>Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2008/10/08/erlang-concurrente-distribuido-y-en-tiempo-real/' rel='bookmark' title='Permanent Link: Erlang: concurrente, distribuido y en tiempo real'>Erlang: concurrente, distribuido y en tiempo real</a></li>
<li><a href='http://bosqueviejo.net/2009/03/18/reia-ruby-sobre-erlang/' rel='bookmark' title='Permanent Link: Reia: Ruby sobre Erlang'>Reia: Ruby sobre Erlang</a></li>
<li><a href='http://bosqueviejo.net/2008/11/20/erlang-y-asterisk-erlast/' rel='bookmark' title='Permanent Link: Erlang y Asterisk&#8230; ErlAst'>Erlang y Asterisk&#8230; ErlAst</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/09/02/la-historia-de-erlang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.3</title>
		<link>http://bosqueviejo.net/2009/08/19/php-5-3/</link>
		<comments>http://bosqueviejo.net/2009/08/19/php-5-3/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 13:02:57 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[noticia]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=181</guid>
		<description><![CDATA[Llego algo tarde, cosas del verano, pero voy a comentar algunas de las mejoras que vienen incluidas en la nueva liberación de PHP, la 5.3. Para mi, esta versión, además de corregir fallos de la anterior, aporta características que le hacen acercarse aún más a la forma de programación profesional que viene dada con otros [...]


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[<p>Llego algo tarde, cosas del verano, pero voy a comentar algunas de las mejoras que vienen incluidas en la nueva liberación de PHP, la 5.3.</p>
<p>Para mi, esta versión, además de corregir fallos de la anterior, aporta características que le hacen acercarse aún más a la forma de programación profesional que viene dada con otros lenguajes como Java, C#, C++, Python, Ruby&#8230;</p>
<p><!--TOC--></p>
<h3>Espacios de nombres (namespaces)</h3>
<p>Los <a href="http://es.php.net/namespaces">espacios de nombres</a>, llamados en otros lenguajes: paquetes, módulos, &#8230;; con esto, podemos tener organizado nuestro código, no solo en directorios, sino también bien delimitado su espacio de nombres mediante el uso del <em>namespace</em>.</p>
<p>Por ejemplo, si tenemos dos directorios: <em>File</em> y <em>BD</em>; que pertenecen a un programa y cada uno de ellos tiene un archivo para contener la clase <em>Output</em>, en las versiones anteriores de PHP habría que incluir uno u otro, o modificar el nombre para que fuese <em>FileOutput</em> y <em>DBOutput</em>, redundando la ruta con el nombre de la clase.</p>
<p>Ahora, con el uso de namespaces, se puede delimitar con solo agregar una sección de código como esta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">namespace</span> <span style="color: #990000;">File</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">class</span> Output <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">/* ... */</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">namespace</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$f</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #990000;">File</span>\Output<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Static&#8230; ahora sí</h3>
<p>En las versiones anteriores de PHP, los valores <em>static</em> no eran tratados del todo bien, no permitiéndose algunos usos que parecían lógicos y no produciéndose, sobre todo en la herencia, los resultados que se esperaban.</p>
<p>Ahora, <a href="http://es.php.net/manual/en/language.oop5.static.php">ya se permite el uso de variables</a> para contener el nombre de la clase a la que llamar de forma estática, es decir, ya se permite este uso:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> say<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hola<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$clase</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;A&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$clase</span><span style="color: #339933;">::</span><span style="color: #004000;">say</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Así mismo, el uso del <a href="http://es.php.net/lsb"><em>late state binding</em></a>, es posible mediante la palabra clave <em>static</em>, de modo que, si se llama a un método estático como <em>static::metodo()</em> en lugar de como <em>self::metodo()</em>, se llama al método de la clase hija que haya sobrecargado al método que se llama. Un ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> who<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #009900; font-weight: bold;">__CLASS__</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        static<span style="color: #339933;">::</span><span style="color: #004000;">who</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Here comes Late Static Bindings</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #000000; font-weight: bold;">extends</span> A <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> who<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #b1b100;">echo</span> <span style="color: #009900; font-weight: bold;">__CLASS__</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
B<span style="color: #339933;">::</span><span style="color: #004000;">test</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// output: B</span></pre></div></div>

<p>Por último, la función especial <em>__call</em> no se llama cuando no hay un método de clase que no exista, en su lugar se llamará a <a href="http://es.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods"><em>__callStatic</em></a>, de modo que se pueda hacer diferencia de cuando se está llamando a un método de objeto y cuando se llama a un método de clase.</p>
<h3>Más de Late State Binding</h3>
<p>Hasta ahora, cuando se quería hacer una clase abstracta que llamase a funciones de sus clases hijas, que aún no han sido declaradas, éstas debían ser abstractas. Pero si la clase no era abstracta y el método a llamar no constaba como abstracto, la llamada no se realizaba a esa función, sino a la del padre.</p>
<p>El sistema de <em>late state binding</em>, asegura que la llamada a métodos se hará siempre de abajo a arriba, es decir, si existe un método en la clase hija que se instanció, aunque el método en ejecución sea el del padre, el método que se llama es el de la clase hija. Más o menos lo que se vió con los métodos estáticos, pero esta vez con métodos.</p>
<h3>Funciones anónimas</h3>
<p>El uso de <a href="http://es.php.net/manual/en/functions.anonymous.php">funciones anónimas</a> (<em>closures</em> o lambda) es una técnica de programación que permite completar código escrito, mediante el desarrollo parcial de algún algoritmo. Imagina que quieres hacer un código en el que tengas que hacer algo, un paso inicial, un paso intermedio y, en cada iteración una ejecución específica, para terminar con un último paso tras esa iteración.</p>
<p>El código concreto dentro de la iteración puede variar&#8230; y de hecho variará en cada implementación, pero el resto no, el resto se mantiene de forma fija. Pues, se puede implementar el esqueleto del programa, y aceptar como parámetro de la función que se haga, una variable que contenga el código a ejecutar. La función que completaría nuestro código se puede hacer así:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$dato1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dato2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$dato1</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;--&quot;</span> <span style="color: #000088;">$dato2</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
algoritmo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> algoritmo<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$func</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$func</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">,</span> <span style="color: #000088;">$i</span><span style="color: #339933;">*</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>También se pueden emplear funciones como <em>array_walk</em>, <em>preg_replace_callback</em>, <em>uasort</em>, etc.</p>
<p>Esto permite realizar códigos como los que se realizan en Ruby o en los lenguajes funcionales y declarativos.</p>
<h3>Recolector de Basura de Referencias Circulares opcional</h3>
<p>Se deja al programador la decisión de si quiere activar el recolector de referencias circulares del <em>garbage collector</em>, o no. Por defecto viene activado y actúa de la siguiente forma, con este código:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</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><span style="color: #004000;">b</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> __construct <span style="color: #009900;">&#40;</span><span style="color: #000088;">$parent</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</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><span style="color: #004000;">parent</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$parent</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1000000</span> <span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> A<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">number_format</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">memory_get_usage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Si se ejecuta desde consola, con una versión de PHP anterior a la 5.3, se verá en pantalla un error fatal, de que el límite de memoria se ha superado.</p>
<p>Esto es debido a que la liberación de memoria, cuando se va a proceder a liberar la clase B, ve que tiene una referencia a A, que ya va a ser liberada y crea un ciclo, con lo que, para evitarlo, no libera B. En las versiones de PHP 5.3 en adelante, se detecta este ciclo como tal y se liberan ambas.</p>
<p>También existe la posibilidad de desactivar este comportamiento o ver si está activo, con las funciones <em>gc_enable</em>, <em>gc_enabled</em> y <em>gc_disable</em>.</p>
<h3>Nowdoc y Heredoc</h3>
<p>Hasta ahora, los bloques de tipo <em>heredoc</em> eran los únicos que permitían escribir de forma libre un texto para después usarlo como variable. Ahora también disponemos de los <em>nowdoc</em>, que son iguales, salvo que no se hace <em>parseo</em> de variables. Un ejemplo:
</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$hola</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Hi, &quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$hd</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&lt;</span> <span style="color: #339933;">&lt;&lt;</span>END
texto <span style="color: #000088;">$hola</span>
<span style="color: #990000;">END</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$nd</span> <span style="color: #339933;">=</span> <span style="color: #0000cc; font-style: italic;">&lt;&lt;&lt;'END'
texto $hola
END</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$hd</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// output: texto Hi,</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$nd</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// output: texto $hola</span></pre></div></div>

<h3>Constantes</h3>
<p>Ahora, la palabra clave <em>const</em> puede ser empleada fuera del alcance de una clase, con lo que, en lugar de usar <em>define</em> se puede emplear esta forma:</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// antes</span>
<span style="color: #666666; font-style: italic;">// define(&quot;CONSTANTE&quot;, &quot;Hola mundo!&quot;);</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// ahora</span>
<span style="color: #000000; font-weight: bold;">const</span> CONSTANTE <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Hola mundo!&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Operador Ternario simplificado</h3>
<p>El operador ternario <em>(expr1)?(expr2):(expr3)</em> ahora permite dejar vacío el espacio correspondiente a <em>(expr2)</em> de modo que si <em>(expr1)</em> es verdadero, se retorna <em>(expr1)</em> y si es falso, se retorna <em>(expr3)</em>.</p>
<h3>Nuevos Módulos</h3>
<h4>PHPar</h4>
<p>Al igual que JAR, <a href="http://es2.php.net/manual/en/intro.phar.php">PHPar</a> sirve para empaquetar los PHP en un solo fichero, con lo que se mejora el despliegue de las aplicaciones, la organización del código, etc.</p>
<h4>Intl</h4>
<p>Mejores funciones de <a href="http://es2.php.net/intl">internacionalización para PHP</a>. Hasta ahora, en PHP el único soporte de internacionalización que había disponible era <em>gettext</em>, ahora, con el uso de Intl y sus clases, se facilita internacionalizar una aplicación web, ya que tiene soporte para numeración, fecha, etc.</p>
<h4>FileInfo</h4>
<p>Da <a href="http://es.php.net/manual/en/function.finfo-file.php">información sobre ficheros</a>, usando la cabecera <em>magic</em> del propio fichero, intenta localizar de forma heurística su tipo, pudiendo retornarlo en formato MIME.</p>
<h3>Etiquetas de Salto</h3>
<p>Bueno, como en todo, hay avances y <em>retrocesos</em>, esto de proporcionar a PHP un elemento de código <em>spaguetti</em> como es el <a href="http://es.php.net/manual/en/control-structures.goto.php">goto</a>, no hace sino potenciar los malos usos, por lo que yo descartaría su uso.</p>
<h3>Migración</h3>
<p>Como cualquier liberación de lenguaje, PHP viene con mejoras, agregados y, además, cambios que implican que códigos anteriores puedan dejar de funciona, con lo que es aconsejable leerse bien la <a href="http://es.php.net/migration53">guía de migración</a>, para ver los cambios que se introducen, lo que llega a ser <em>deprecated</em>, etc.</p>
<h3>Conclusiones</h3>
<p>Con esta liberación, PHP da varios matices que le hacen acercarse más a lenguajes como C++ y Java, agregando cosas como PHPar y los namespaces, así como mejorando su implementación de POO.</p>
<p>Considero que el cambiar a esta versión y desarrollar con las nuevas implementaciones hará que los códigos desarrollados sean más claros y, sobre todo, más organizados, por lo que es una buena baza para realizar el cambio.</p>
<p>Además, viendo la guía de migración, se deja entrever que los cambios de la versión anterior, 5.2.x, a esta nueva rama, son mínimos, con lo que, si se ha desarrollado código acorde a la versión anterior, realizar los cambios para adecuarse a esta versión, no es nada complicado.</p>


<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/08/19/php-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shoes: programación fácil de GUI en Ruby</title>
		<link>http://bosqueviejo.net/2009/05/18/shoes-programacion-facil-de-gui-en-ruby/</link>
		<comments>http://bosqueviejo.net/2009/05/18/shoes-programacion-facil-de-gui-en-ruby/#comments</comments>
		<pubDate>Mon, 18 May 2009 14:42:45 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shoes]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=140</guid>
		<description><![CDATA[Actualización: ver nueva entrada. Cuando se realizan scripts para ciertas tareas para automatizarlas, pero que tienen que tomar datos del usuario, así como los datos que se presentan son útiles, tanto para rápida consulta, como para dar dicha información por teléfono o usarla en el código, otra interfaz, etc. surge el problema de que la [...]


Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2010/04/14/shoes-vive/' rel='bookmark' title='Permanent Link: ¡Shoes vive!'>¡Shoes vive!</a></li>
<li><a href='http://bosqueviejo.net/2009/01/13/ruby-esa-pequena-joya/' rel='bookmark' title='Permanent Link: Ruby&#8230; esa pequeña joya'>Ruby&#8230; esa pequeña joya</a></li>
<li><a href='http://bosqueviejo.net/2009/02/02/lenguajes-de-programacion/' rel='bookmark' title='Permanent Link: Lenguajes de Programación'>Lenguajes de Programación</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><strong>Actualización</strong>: ver nueva <a href="http://bosqueviejo.net/2010/04/14/shoes-vive">entrada</a>.</p>
<p>Cuando se realizan scripts para ciertas tareas para automatizarlas, pero que tienen que tomar datos del usuario, así como los datos que se presentan son útiles, tanto para rápida consulta, como para dar dicha información por teléfono o usarla en el código, otra interfaz, etc. surge el problema de que la consola se hace un paso como <em>a otro mundo</em> y resulta incómodo.</p>
<p>Una forma de ahorrar la pulsación de teclas, diseñando una interfaz que nos sea útil y presente la información, así como la toma de datos, de forma organizada y práctica, son las aplicaciones basadas en GUI, que se han comenzado a introducir en lo lenguajes de scripting&#8230; solo que, el uso de los mismos, se hace tan tedioso, que resulta incómodo realizar una interfaz para usuario en esos sistemas.</p>
<p>Hace poco, en un curso de Ruby on Rails que estaba dando Dani, un colega muy versado en Ruby y su mundo, nos enseñó un <em>juguetito</em> bastante gracioso para hacer GUI desde Ruby: <a href="http://shoooes.net/">Shoes</a>.</p>
<p>Lo instalé para GNU/Linux y lo comencé a probar&#8230; en cuestión de una hora tenía una pequeña aplicación que tomaba información de un ActiveRecord, hacía una consulta según los datos de entrada que le introducía y rellenaba el resto del formulario con los datos de salida&#8230; muy útil en esos momentos para la resolución de incidencias, ya que suelen venir con datos incompletos y la resolución debe de ser rápida (y ya estaba cansado de ir a golpe de consulta SQL&#8230; mucho que teclear para obtener solo un par de datos <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  )</p>
<p>En la misma página hay un <a href="http://www.google.com/url?q=http://shoooes.net/tutorial/&#038;ei=mnMRSrnbA4HU-Aaf693WAw&#038;sa=X&#038;oi=smap&#038;resnum=1&#038;ct=result&#038;cd=1&#038;usg=AFQjCNELCp4SfoWr4INZ0LQSXOJWqt4UCg">tutorial</a> y, bajando el código, se pueden ver ejemplos donde hay desde programitas simples de reloj, hasta videojuegos en 3D <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  &#8230; lo recomiendo, a mi me ha ayudado mucho.</p>


<p>Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2010/04/14/shoes-vive/' rel='bookmark' title='Permanent Link: ¡Shoes vive!'>¡Shoes vive!</a></li>
<li><a href='http://bosqueviejo.net/2009/01/13/ruby-esa-pequena-joya/' rel='bookmark' title='Permanent Link: Ruby&#8230; esa pequeña joya'>Ruby&#8230; esa pequeña joya</a></li>
<li><a href='http://bosqueviejo.net/2009/02/02/lenguajes-de-programacion/' rel='bookmark' title='Permanent Link: Lenguajes de Programación'>Lenguajes de Programación</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/05/18/shoes-programacion-facil-de-gui-en-ruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScript y CSS no intruso en HTML</title>
		<link>http://bosqueviejo.net/2009/02/08/javascript-y-css-no-intruso-en-html/</link>
		<comments>http://bosqueviejo.net/2009/02/08/javascript-y-css-no-intruso-en-html/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 13:02:31 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=73</guid>
		<description><![CDATA[Cuando se pensaba en MVC, la capacidad para dividir las tareas obvias de tratamiento de datos, en lógica de negocio (el modelo), control de flujo de ejecución (el controlador) y la presentación de datos (la vista), aún quedaban en el aire muchos problemas en lo que respecta a las interaces, propiamente dichas, entre estas tres [...]


Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2010/04/22/el-futuro-de-la-web-html-5/' rel='bookmark' title='Permanent Link: El futuro de la web: HTML 5'>El futuro de la web: HTML 5</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Cuando se pensaba en MVC, la capacidad para dividir las tareas obvias de tratamiento de datos, en lógica de negocio (el modelo), control de flujo de ejecución (el controlador) y la presentación de datos (la vista), aún quedaban en el aire muchos problemas en lo que respecta a las interaces, propiamente dichas, entre estas tres capas.</p>
<p>Centrándonos en la vista, existen miles de soluciones, para alejar al diseñador del código y al programador del diseño, pero aún así, cuando se habla de AJAX y desarrollos específicos&#8230; el programador tiene que tocar diseño y el diseñador preocuparse de lo que hará el código de servidor.</p>
<p>Este <em>dolor de cabeza</em> puede paliarse mediante el uso de códigos <em>no intrusivos</em>, lo que facilita la especificación de una interfaz basada en identificadores para el tratamiento del HTML.</p>
<p>El código <em>no intrusivo</em> de servidor lo trataré en otro artículo para que no resulte este muy extenso.</p>
<h3>CSS no intrusivo</h3>
<p>En principio, desde el punto de vista del navegador, todo es HTML. Pero, al igual que en los procesadores de texto, para facilitar la estructura de estos ficheros y no plagarlos de contenido referente a tipos de letra, colores, fondos&#8230; se crearon las hojas de estilos.</p>
<p>Las hojas de estilos en cascada (CSS) ayudan, junto con la especificación de identidades y clases, a dar estilos (colores, fuentes y forma de presentación en general) a las etiquetas escritas en HTML.</p>
<p>El CSS se pude <em>incrustar</em> en las etiquetas HTML mediante el uso de las etiquetas <em>style</em>, o incluso a través de los atributos <em>style</em> dentro de cada una de las etiquetas típicas de HMTL.</p>
<p>La mejor forma de hacer que no sea intrusivo, es colocar esos estilos en un fichero separado, y agregarlo mediante el uso de la etiqueta <em>link</em> en la sección <em>head</em>.</p>
<h3>JavaScript no intrusivo</h3>
<p>El código JavaScript es algo que se ha ido haciendo cada vez más con el HTML. En principio, se usaba la etiqueta <em>script</em> dentro de la sección <em>head</em> para agruptar todas las funciones de javascript, a las que se iban llamando desde etiquetas como <em>onclick</em>, <em>onmouseover</em>, <em>onchange</em>&#8230;, es decir, las etiquetas de eventos de HTML, que se destinan para JavaScript.</p>
<p>Después su uso se fue masificando y mezclando cada vez más con el HTML, haciendo que la etiqueta <em>script</em>, en muchas páginas, se encuentre repetida y segregada a lo largo de todo el texto HTML y, además de eso, en atributos como <em>href</em>, donde se indica explíticitamente que se ejecutará un código javascript.</p>
<p>Esto hizo que el código javascript se convirtiese en parte simbiótica de HTML y, en muchos desarrollos, que no se pudiese separar fácilmente.</p>
<p>Con ciertas técnicas, como las usadas en CSS, la separación de JavaScript se puede llevar a cabo sin problemas, pero requiere de ciertas pautas y costumbres a la hora de realizar el HTML:</p>
<ul>
<li>Asignar ID a las etiquetas con las que se vaya a trabajar dinámicamente.</li>
<li>Asignar una clase a todo tipo de etiquetas que se usen para un fin similar.</li>
<li>Intentar no realizar anidamientos muy profundos.</li>
<li>En caso de tenerlos, intentar diferenciar los niveles de profundidad con IDs claros.</li>
<li>No abusar de tablas.</li>
<li>Tener especial cuidado con las etiquetas <em>div</em>, sobre todo por su uso con varios navegadores.</li>
</ul>
<p>Con esto, solo tener claro que, el fichero de tipo javascript que se asocie al HTML, debe tener un código <em>lanzador</em>, que se encargue de asociar las funciones javascript oportunas a los eventos y las modificaciones pertinentes.</p>
<p>Es importante también recordar que, para mejorar la depuración, es mejor generar cuanto menos código por javascript, mejor. Es decir, que si hay que modificar las propiedades de una tabla por dar la posibilidad de varios tipos de ordenación, hacer las funciones específicas para ese cambio en JavaScript, pero no caer en la tentación de pasar los datos a array de javascript para hacerlo todo desde ahí.</p>
<h3>Conclusiones</h3>
<p>Lo que se trata, en base, es llegar a lo que W3C considera que debería ser la web semántica, pero con el uso de HTML. Intentar organizar los datos con las etiquetas existentes, sin usar estilos de presentación, solo los datos, y agregar a esas etiquetas el estilo de presentación deseado, mediante CSS externo y el dinamismo de cliente que se requiera, mediante JS externo.</p>
<p>Las ventajas que agrega, es que el cambio de una presentación a otra, se puede hacer con tan solo variar el CSS, y agregar nuevas funcionalidades, es solo modificar el JS.</p>


<p>Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2010/04/22/el-futuro-de-la-web-html-5/' rel='bookmark' title='Permanent Link: El futuro de la web: HTML 5'>El futuro de la web: HTML 5</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/02/08/javascript-y-css-no-intruso-en-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lenguajes: nuevas versiones</title>
		<link>http://bosqueviejo.net/2009/02/04/lenguajes-nuevas-versiones/</link>
		<comments>http://bosqueviejo.net/2009/02/04/lenguajes-nuevas-versiones/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 03:14:02 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[noticia]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/wordpress/?p=67</guid>
		<description><![CDATA[En estos últimos días he visto los nuevos lanzamientos, o lo que se espera lanzar en varios &#8220;mundos&#8221; del desarrollo del software. Por un lado, hay varios puntos donde la interfaz pasado-futuro corre bastante peligro. Los desarrolladores de ciertos lenguajes han creído conveniente romper con el pasado de uso de dichos lenguajes para acogerse a [...]


Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2009/02/02/lenguajes-de-programacion/' rel='bookmark' title='Permanent Link: Lenguajes de Programación'>Lenguajes de Programación</a></li>
<li><a href='http://bosqueviejo.net/2009/01/12/sistemas-de-control-de-versiones-%c2%bfcentralizados-o-distribuidos/' rel='bookmark' title='Permanent Link: Sistemas de Control de Versiones: ¿centralizados o distribuidos?'>Sistemas de Control de Versiones: ¿centralizados o distribuidos?</a></li>
<li><a href='http://bosqueviejo.net/2009/08/13/lenguajes-funcionales-para-el-desarrollo-web/' rel='bookmark' title='Permanent Link: Lenguajes Funcionales para el Desarrollo Web'>Lenguajes Funcionales para el Desarrollo Web</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>En estos últimos días he visto los nuevos lanzamientos, o lo que se espera lanzar en varios &#8220;mundos&#8221; del desarrollo del software. Por un lado, hay varios puntos donde la interfaz pasado-futuro corre bastante peligro. </p>
<p>Los desarrolladores de ciertos lenguajes han creído conveniente romper con el pasado de uso de dichos lenguajes para acogerse a los progresos y prácticas más usadas actualmente. Haremos repaso.</p>
<h3>Perl 6</h3>
<p>El lanzamiento de esta versión de Perl ha traído de cabeza a varios programadores, en algunos sitios ya existen guías de <a href="http://www.programmersheaven.com/2/Perl6-FAQ-Migration">migración de Perl 5 a Perl 6</a> a modo de poder ayudar a los programadores a pasar a esta nueva versión y aprovechar sus nuevas características. Entre ellas, cabe destacar:</p>
<ul>
<li>Tipificación</li>
<li>Parámetros en subrutinas</li>
<li>Orientación a Objetos</li>
<li>Comparaciones encadenadas</li>
<li>Evaluación perezosa</li>
<li>Macros</li>
</ul>
<p>Larry Wall mencionó que la versión 5 era su reescritura de Perl, su visión de cómo debía de ser y que, la versión 6, debía de ser la reescritura de Perl para lo que quiera que sea la comunidad.</p>
<h3>PHP 6</h3>
<p>La versión de PHP 5, trajo consigo una orientación a objetos muy mejorada. Pero aún hoy, con la versión 5.2 estable y la 5.3 en inestable, se echa en falta una versión más completa del lenguaje, características avanzadas como las que se encuentran en otros lenguajes como Ruby, Java, Python o C++. </p>
<p>Por ello, la <a href="http://www.programania.net/category/php/php-6/">versión de PHP 6</a>, nos aportará mejoras considerables como:</p>
<ul>
<li>Closures y lambda</li>
<li>Traits</li>
<li>Namespaces</li>
<li>Más mejoras en la orientación a objetos</li>
</ul>
<p>Por otro lado, hay que mencionar que esta versión ya no asegura la compatibilidad hacia atrás, es decir, con scripts programados para versiones de PHP 3.x, 4.x o incluso algunas del 5.x.</p>
<h3>Python 2.6 y 3.0</h3>
<p>El último lanzamiento de la versión 2.x se hizo con la versión 2.6, la cual incluye características y corrección de fallos, además herramientas para migrar a la versión 3, e incluso comenzar a usar elementos específicos de la versión 3 incluídos en la 2.6, a través del comando <tt>future</tt>.</p>
<p>La versión 3.0 de Python rompe también la interfaz pasado-futuro al no ser compatible con la rama anterior a nivel de scripts. No obstante, se han incluido herramientas para facilitar su transición.</p>
<p>Las <a href="http://docs.python.org/3.0/whatsnew/3.0.html">mejoras incluidas</a>:</p>
<ul>
<li>Print es una función</li>
<li>Views e Iterators en lugar de Lists</li>
<li>Nueva sintaxis de anotaciones, argumentos y literales</li>
<li>Cambios en las librerías estándares (reorganización)</li>
<li>&#8230;</li>
</ul>
<p>Conviene realizar una migración y estudiar un poco los cambios, si se desea realizar el salto a esta nueva versión.</p>
<h3>Ruby 1.9.1</h3>
<p>El comentario más sonado sobre esta versión es: el más rápido que la 1.8; y es que, parece que, aún no habiendo cambiado mucho la forma del lenguaje, sí han cambiado los procedimientos internos para hacerlos más óptimos.</p>
<p>Lea las <a href="http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_rc2/NEWS">características</a> para más información.</p>
<h3>Conclusiones</h3>
<p>Aprender un lenguaje no es una seguridad en cuanto a dejar de aprender se refiere. Dentro de cada uno de los lenguajes de programación existentes, se han observado cambios patentes que se realizan con una periodicidad de pocos años, con lo que es bueno mantenerse al tanto de las nuevas versiones, otros lenguajes y, sobre todo, las necesidades y entornos, sus progresos y cómo se adaptan los lenguajes a ellos, puesto que determinarán si estamos eligiendo adecuadamente nuestra herramienta de trabajo o no.</p>


<p>Entradas relacionadas:<ol><li><a href='http://bosqueviejo.net/2009/02/02/lenguajes-de-programacion/' rel='bookmark' title='Permanent Link: Lenguajes de Programación'>Lenguajes de Programación</a></li>
<li><a href='http://bosqueviejo.net/2009/01/12/sistemas-de-control-de-versiones-%c2%bfcentralizados-o-distribuidos/' rel='bookmark' title='Permanent Link: Sistemas de Control de Versiones: ¿centralizados o distribuidos?'>Sistemas de Control de Versiones: ¿centralizados o distribuidos?</a></li>
<li><a href='http://bosqueviejo.net/2009/08/13/lenguajes-funcionales-para-el-desarrollo-web/' rel='bookmark' title='Permanent Link: Lenguajes Funcionales para el Desarrollo Web'>Lenguajes Funcionales para el Desarrollo Web</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2009/02/04/lenguajes-nuevas-versiones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
