<?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; php</title>
	<atom:link href="http://bosqueviejo.net/tag/php/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>Tue, 08 May 2012 14:40:56 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>V8: Extendiendo PHP</title>
		<link>http://bosqueviejo.net/2012/02/28/v8-extendiendo-php/</link>
		<comments>http://bosqueviejo.net/2012/02/28/v8-extendiendo-php/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 17:39:16 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[v8]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1243</guid>
		<description><![CDATA[ Hace prácticamente un año escribí un artículo denominado Spidermonkey: extendiendo PHP, donde comentaba como emplear Spidermonkey para poder emplearlo como lenguaje de extensión a un núcleo sencillo hecho en PHP.
Incluso lo emplee como elemento principal en el desarrollo de PHAS-JS, realizando un servidor de aplicaciones en PHP, con la potencia que brindan muchas de sus librerías, pero escribiendo código de forma segura en JavaScript (o ECMAScript).
Hoy voy a tratar otra máquina que permite ejecutar código JavaScript dentro de PHP, de la misma forma que cuando vimos Spidermonkey, pero variando la forma en la que interactúa con PHP. En esta ocasión tenemos entre nosotros la máquina: el V8 de Google. Va a estar un poco inspirado en lo que he ido comentando con Sergio, que he visto que ha escrito también al respecto en su blog: PHP y JavaScript se entienden.
Instalando
Lo primero, es que si tenemos como paquete el libv8-dev, todo será más fácil ya que se resume en estos sencillos pasos (esto es válido para Debian y Ubuntu):

apt-get install libv8-dev
pecl install v8js

Esta es una de las implementaciones de V8 que hay para PHP, también está disponible V8 (a secas) que es un módulo que intenta imitar la implementación de [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/V8-150x150.png" alt="" title="V8" width="150" height="150" class="alignleft size-thumbnail wp-image-1244" /> Hace prácticamente un año escribí un artículo denominado <a href="/2011/02/24/spidermonkey-extendiendo-php/">Spidermonkey: extendiendo PHP</a>, donde comentaba como emplear Spidermonkey para poder emplearlo como lenguaje de extensión a un núcleo sencillo hecho en PHP.</p>
<p>Incluso lo emplee como elemento principal en el desarrollo de <a href="http://phas-js.org">PHAS-JS</a>, realizando un servidor de aplicaciones en PHP, con la potencia que brindan muchas de sus librerías, pero escribiendo código de forma segura en JavaScript (o ECMAScript).</p>
<p>Hoy voy a tratar otra máquina que permite ejecutar código JavaScript dentro de PHP, de la misma forma que cuando vimos Spidermonkey, pero variando la forma en la que interactúa con PHP. En esta ocasión tenemos entre nosotros la máquina: el V8 de Google. Va a estar un poco inspirado en lo que he ido comentando con Sergio, que he visto que ha escrito también al respecto en su blog: <a href="https://sergio.am/leer/php-y-javascript-se-entienden">PHP y JavaScript se entienden</a>.</p>
<h3>Instalando</h3>
<p>Lo primero, es que si tenemos como paquete el <em>libv8-dev</em>, todo será más fácil ya que se resume en estos sencillos pasos (esto es válido para Debian y Ubuntu):</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">apt-get install libv8-dev
pecl install v8js</pre></div></div>

<p>Esta es una de las implementaciones de V8 que hay para PHP, también está disponible V8 (a secas) que es un módulo que intenta imitar la implementación de Spidermonkey, con lo que, si tienes un código que emplee el sistema de spidermonkey, pasar a v8 debe de ser cambiar muy poquitas cosas. <em>No obstante este código está marcado como <strong>experimental</strong> y hay cosas que no funcionan del todo</em>. La instanación sería:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">apt-get install libv8-dev
git clone https://github.com/metagoto/v8.git
cd v8 &amp;&amp; phpize &amp;&amp; ./configure &amp;&amp; make &amp;&amp; make install</pre></div></div>

<p>La configuración es compatible si instalamos los dos, ya que es:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">extension=v8js.so
extension=v8.so</pre></div></div>

<p><strong>Actualización</strong>: escribí un email a <em>metagoto</em> sobre el mantenimiento y mejora del módulo v8 para PHP. La respuesta fue que esa implementación la realizó para poder jugar y ver cómo se comportaba el sistema v8, y que no le pudo dedicar mucho tiempo, es más, abandonó el desarrollo y no tiene pensado retomarlo. Sobre el problema que observé del paso de objetos y que no pasaba sus métodos, parece que el problema no es trivial, por lo que, desecho la idea de tomarlo como una solución práctica y la dejo únicamente para pruebas y ensayos.</p>
<h3>Probando&#8230;</h3>
<p>En principio, podemos repetir la misma prueba que hicimos en el artículo de spidermonkey, a modo de poder enseñarlo de ambas formas. El código, por tanto sería así:</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 la máquina para JavaScript</span>
<span style="color: #000088;">$js</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> V8Js<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 valores para el entorno JS</span>
<span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$js</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">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;">// 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 = PHP.a + PHP.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;">executeScript</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>La pega que tiene este, en comparación con spidermonkey, es que las funciones solo se pueden pasar si son anónimas (como variables) y que la ejecución restringe o separa lo que se pasa desde PHP en un objeto específico, por lo que queda un poco engorroso (desde mi punto de vista).</p>
<p>Con el tema de los objetos pasa igual, se pueden pasar objetos, pero no clases, con lo que no se pueden realizar instancias nuevas, a menos que se emplee una función anónima que haga las veces de factory o singleton.</p>
<p>El código de <em>v8</em>, que intenta emular a <em>spidermonkey</em> facilita esto agregando registro de funciones, clases y variables en la parte global. No obstante, este código no es completamente funcional, ya que, en las pruebas realizadas, por ejemplo, no se tiene acceso a los métodos de las clases registradas cuando se crea un nuevo objeto dentro de V8.</p>
<h3>Conclusiones</h3>
<p>La máquina V8 ha demostrado ser un gran intérprete de JavaScript, ya que es la que emplea Google en el navegador Chorme, no obstante, su integración con PHP falta que madure un poco y se ajuste en usabilidad a algo similar a lo que se puede conseguir con Spidermonkey.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/02/28/v8-extendiendo-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DJJob: trabajos en background para PHP</title>
		<link>http://bosqueviejo.net/2011/12/01/djjob-trabajos-en-background-para-php/</link>
		<comments>http://bosqueviejo.net/2011/12/01/djjob-trabajos-en-background-para-php/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 16:22:49 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[delayed job]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1109</guid>
		<description><![CDATA[ Hace tiempo que vamos encontrándonos de forma recurrente con este problema&#8230; ¿cómo conseguir que PHP realice un trabajo en background e ir consultando cuánto le falta o cuando ha terminado dicho trabajo?
La pista ya la puso sobre la mesa Delayed::Job, una gema de Ruby on Rails, que crea una tabla en la base de datos, y se encarga de ir actualizando dicha tabla de modo que, en el momento que se lanza el proceso (a través de un cron, por ejemplo), ejecuta todas las tareas que estén esperando en la cola. Realmente es una tabla en la que se inserta cada tarea, y después una ejecución aparte que se encarga de lanzarla.
En PHP, con DJJob, se consigue el mismo resultado. Se crea la tabla para la gestión de los trabajos, y el sistema tiene mecanismos que permiten encolar trabajos y sacarlos para su ejecución, así como preguntar si está en ejecución o terminado. Si adaptamos un poco la tabla, podríamos incluso agregar un campo que nos diese el porcentaje de compleción de la tarea.
Probamos la teoría
Vamos a hacer un simple ejemplo, descargamos el fichero DJJob.php y creamos otros dos ficheros, el example.php:

&#160;
&#60;?php
&#160;
include&#40;__DIR__ . &#34;/DJJob.php&#34;&#41;;
&#160;
DJJob::configure&#40;&#34;mysql:host=localhost;dbname=jobs&#34;, array &#40; 'mysql_user' =&#62; 'root', [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/delayed-150x150.jpg" alt="" title="delayed" width="150" height="150" class="alignleft size-thumbnail wp-image-1110" /> Hace tiempo que vamos encontrándonos de forma recurrente con este problema&#8230; ¿cómo conseguir que PHP realice un trabajo en background e ir consultando cuánto le falta o cuando ha terminado dicho trabajo?<span id="more-1109"></span></p>
<p>La pista ya la puso sobre la mesa <a href="https://github.com/tobi/delayed_job">Delayed::Job</a>, una gema de Ruby on Rails, que crea una tabla en la base de datos, y se encarga de ir actualizando dicha tabla de modo que, en el momento que se lanza el proceso (a través de un cron, por ejemplo), ejecuta todas las tareas que estén esperando en la cola. Realmente es una tabla en la que se inserta cada tarea, y después una ejecución aparte que se encarga de lanzarla.</p>
<p>En PHP, con <a href="https://github.com/seatgeek/djjob">DJJob</a>, se consigue el mismo resultado. Se crea la tabla para la gestión de los trabajos, y el sistema tiene mecanismos que permiten encolar trabajos y sacarlos para su ejecución, así como preguntar si está en ejecución o terminado. Si adaptamos un poco la tabla, podríamos incluso agregar un campo que nos diese el porcentaje de compleción de la tarea.</p>
<h3>Probamos la teoría</h3>
<p>Vamos a hacer un simple ejemplo, descargamos el fichero <a href="https://raw.github.com/seatgeek/djjob/master/DJJob.php">DJJob.php</a> y creamos otros dos ficheros, el example.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span>__DIR__ <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;/DJJob.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
DJJob<span style="color: #339933;">::</span><span style="color: #004000;">configure</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mysql:host=localhost;dbname=jobs&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'mysql_user'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'mysql_pass'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'root'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> HelloWorldJob <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> perform<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;Hello world!<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;
DJJob<span style="color: #339933;">::</span><span style="color: #004000;">enqueue</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> HelloWorldJob<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>Y el worker.php, que será el que se encargue de sacar el trabajo y ejecutarlo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span>__DIR__ <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;/DJJob.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
DJJob<span style="color: #339933;">::</span><span style="color: #004000;">configure</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mysql:host=localhost;dbname=jobs&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'mysql_user'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'mysql_pass'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'root'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> HelloWorldJob <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> perform<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;Hello world!<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;">$worker</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DJWorker<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;count&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;sleep&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$worker</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Antes de ejecutarlo, necesitaremos tener en la máquina local una base de datos MySQL con este script cargado: <a href="https://raw.github.com/seatgeek/djjob/master/jobs.sql">jobs.sql</a>; y con acceso <tt>root</tt> y clave <tt>root</tt> (se puede cambiar, modificando el código de ambos códigos PHP).</p>
<p>Una vez lo tengamos, solo nos quedará ejecutarlo:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ php example.php
$ php worker.php
* [JOB] Starting worker host::bosqueviejo pid::18835 on queue::default
* [JOB] attempting to acquire lock for job::1 on host::bosqueviejo pid::18835
Hello world!
* [JOB] completed job::1
* [JOB] worker shutting down after running 1 jobs, over 1 polling iterations</pre></div></div>

<p>Las opciones del <em>worker</em>, hacen que la ejecución sea solo una, por lo que se puede agregar la ejecución a un cron. No obstante, si no se pasan opciones, la ejecución se hace recurrentemente cada 5 segundos, lo cual es más óptimo si se emplea desde la web. Además, el sistema lanza varios hijos (en caso de tener <em>pcntl_fork</em>) con lo que, trabajará de forma paralela en caso de que haya varias tareas en la cola.</p>
<p>Una buena idea a tener en cuenta si queremos desarrollar cargas de ficheros que tengan un procesamiento bastante extenso, o trabajos de conexión y comunicación con otros servidores (como por ejemplo pagos) que requieran de mucho tiempo y puedan terminar en una desconexión por tiempo de espera agotado, o paciencia del usuario agotada.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/12/01/djjob-trabajos-en-background-para-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHAS-JS: servidor de aplicaciones</title>
		<link>http://bosqueviejo.net/2011/11/16/phas-js-servidor-de-aplicaciones/</link>
		<comments>http://bosqueviejo.net/2011/11/16/phas-js-servidor-de-aplicaciones/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 12:05:03 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[phas-js]]></category>
		<category><![CDATA[php]]></category>

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

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1049</guid>
		<description><![CDATA[ Hace tiempo que vi este lenguaje de pasada y no le presté mucha atención, pero hoy, revisando algunas cosas, he vuelto a él y he visto algo que, antes quizás me habría parecido ridículo, pero ahora, después de ciertos acontecimientos, comienzo a verle mucho sentido.
El lenguaje haXe, se presenta como un meta-lenguaje, un lenguaje que se compila resultando en otro diferente, como pueda ser JavaScript, PHP, Java o Neko, por lo que puede emplear cualquier entorno de ejecución conocido por el programador. Dicho de otra forma, este es un lenguaje para dominarlos a todos&#8230;
El lenguaje
Echándole un vistazo a la sintaxis del lenguaje, podríamos decir que el lenguaje es muy parecido a JavaScript, pero con definición de tipos. La declaración es parecida a Pascal o Modula-2, usando dos puntos, pero sin embargo, la forma de los arrays es más como las plantillas de Java.
Las estructuras condicionales son las que están disponibles en lenguajes como PHP, C, Java y demás, con algunos matices, por ejemplo, con el uso de iteradores, con lo que el for es más parecido a Python o Java, por ejemplo. Tiene una forma tal que así:

import php.Lib;
&#160;
class Index &#123;
    static function main&#40;&#41; &#123;
  [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/haXe.jpg" alt="" title="haXe" width="150" height="150" class="alignleft size-full wp-image-1050" /> Hace tiempo que vi este lenguaje de pasada y no le presté mucha atención, pero hoy, revisando algunas cosas, he vuelto a él y he visto algo que, antes quizás me habría parecido ridículo, pero ahora, después de ciertos acontecimientos, comienzo a verle mucho sentido.</p>
<p>El <a href="http://haxe.org">lenguaje haXe</a>, se presenta como un meta-lenguaje, un lenguaje que se compila resultando en otro diferente, como pueda ser JavaScript, PHP, Java o Neko, por lo que puede emplear cualquier entorno de ejecución conocido por el programador. Dicho de otra forma, este es <em>un lenguaje para dominarlos a todos</em>&#8230;</p>
<h3>El lenguaje</h3>
<p>Echándole un vistazo a <a href="http://haxe.org/ref/syntax">la sintaxis del lenguaje</a>, podríamos decir que el lenguaje es muy parecido a JavaScript, pero con definición de tipos. La declaración es parecida a Pascal o Modula-2, usando dos puntos, pero sin embargo, la forma de los arrays es más como las plantillas de Java.</p>
<p>Las estructuras condicionales son las que están disponibles en lenguajes como PHP, C, Java y demás, con algunos matices, por ejemplo, con el uso de iteradores, con lo que el <em>for</em> es más parecido a Python o Java, por ejemplo. Tiene una forma tal que así:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">import</span> php.<span style="color: #660066;">Lib</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">class</span> Index <span style="color: #009900;">&#123;</span>
    static <span style="color: #003366; font-weight: bold;">function</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> p <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Point<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">65</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        trace<span style="color: #009900;">&#40;</span>p<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: #003366; font-weight: bold;">class</span> Point <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">:</span> Int<span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> y <span style="color: #339933;">:</span> Int<span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #003366; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">,</span>y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> x<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> y<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #003366; font-weight: bold;">public</span> <span style="color: #003366; font-weight: bold;">function</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Point(&quot;</span><span style="color: #339933;">+</span>x<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;,&quot;</span><span style="color: #339933;">+</span>y<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;)&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Este código (tomado de su <a href="http://haxe.org/manual/2_types">web, sección de tipos</a>) se encarga de definir una clase Point, con un constructor que inicializa los atributos internos (x e y) y una función especial para representar el dato en modo texto (como en Java).</p>
<p>Lo suyo sería que se particionase como clases independientes, e incluso se creasen paquetes, una vez se programe en serio con el lenguaje.</p>
<h3>La compilación</h3>
<p>En Debian, el compilador viene en el repositorio. Llama la atención el hecho de que se instala de la mano de <a href="">Neko</a> (que es otro lenguaje similar, que se puede compilar en otros, pero que además tiene una VM propio e integración con Apache).</p>
<p>Generar el código visto anteriormente en PHP, es tan simple como ejecutar esto:</p>
<pre>
haxe -main Index -php www
</pre>
<p>Nos creará un directorio <em>www</em> en la ruta en la que estemos que tendrá un directorio <em>lib</em> y un <em>index.php</em> en la base con los comandos básicos para ejecutar el código programado. Lo podemos ejecutar desde consola (si tenemos el php-cli), así:</p>
<pre>
$ php www/index.php
Index.hx:6: Point(-1,65)
</pre>
<h3>Conclusiones</h3>
<p>Últimamente se van escuchando cada vez más lenguajes nuevos que salen, buenos lenguajes con muchas nuevas características que facilitan mucho la vida a los programadores, pero que, por el simple hecho de ser más completos, tienen una curva de aprendizaje más alta.</p>
<p>Lo que propone HaXe, en sí, es un solo lenguaje, un lenguaje muy completo, con todas las características de alto nivel que tienen todos los lenguajes, fácil y muy parecido a los lenguajes más usados de hoy en día, por lo que su entrada a él sea rápida, pero además, muy versátil, como los lenguajes <em>scriptting</em>, y ajustable a las necesidades de producción, gracias a que se puede compilar en C++, Java, C#, PHP, JavaScript, Flash y Neko.</p>
<p>En mi opinión, es una muy buena propuesta, ya que se podría emplear para generar el código necesario para realizar la web a nivel de servidor, cliente, e incluso algunos códigos a nivel de aplicación de escritorio, todo en un solo lenguaje.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/15/haxe-metalenguaje-para-todos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSS: leyéndolos desde PHP y Rails</title>
		<link>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/</link>
		<comments>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 10:26:04 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1057</guid>
		<description><![CDATA[ Hace un tiempo hice un lector de RSS para poner noticias en una web, en Ruby on Rails, y me gustó la simpleza con la que se parsean los códigos y se pueden presentar las noticias, sin mucho esfuerzo, y apenas líneas de código. Unos días más tarde, me tocó hacerlo también en PHP&#8230; e aquí un ejemplo de simpleza de un framework, frente a un lenguaje.
Versión PHP
Empezaremos con la complicada. Este código se encarga de descargar el código del RSS y deserializar el XML en un array, para poder tratarlo a posteriori. El tratamiento lo haré en plan cutre, ya que me intentaré, sobretodo, basar en el proceso de descarga y deserialización.
Para esto, se requiere de una librería que no suele venir con PHP, pero sí está en PEAR, con lo que, se puede instalar fácilmente ejecutando la siguiente línea de comandos:

pear install XML_Serializer

Con esto, el código, en plan simple, sería el siguiente:

&#60;?php
&#160;
&#160;
include 'XML/Unserializer.php';
&#160;
function xml_to_array&#40; $data &#41; &#123;
    $options = array&#40;
        &#34;addDecl&#34;            =&#62; true,
        &#34;encoding&#34;      [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/rss-150x150.jpg" alt="" title="rss" width="150" height="150" class="alignleft size-thumbnail wp-image-1058" /> Hace un tiempo hice un lector de RSS para poner noticias en una web, en Ruby on Rails, y me gustó la simpleza con la que se parsean los códigos y se pueden presentar las noticias, sin mucho esfuerzo, y apenas líneas de código. Unos días más tarde, me tocó hacerlo también en PHP&#8230; e aquí un ejemplo de simpleza de un framework, frente a un lenguaje.</p>
<h3>Versión PHP</h3>
<p>Empezaremos con la complicada. Este código se encarga de descargar el código del RSS y deserializar el XML en un array, para poder tratarlo a posteriori. El tratamiento lo haré en plan <em>cutre</em>, ya que me intentaré, sobretodo, basar en el proceso de descarga y deserialización.</p>
<p>Para esto, se requiere de una librería que no suele venir con PHP, pero sí está en PEAR, con lo que, se puede instalar fácilmente ejecutando la siguiente línea de comandos:</p>
<pre>
pear install XML_Serializer
</pre>
<p>Con esto, el código, en plan simple, sería el siguiente:</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;
&nbsp;
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'XML/Unserializer.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> xml_to_array<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">&quot;addDecl&quot;</span>            <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;encoding&quot;</span>           <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;mode&quot;</span>               <span style="color: #339933;">=&gt;</span> XML_SERIALIZER_MODE_SIMPLEXML<span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;indent&quot;</span>             <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;    &quot;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;linebreak&quot;</span>          <span style="color: #339933;">=&gt;</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: #0000ff;">&quot;scalarAsAttributes&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;attributesArray&quot;</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_a'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;contentName&quot;</span>        <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'_c'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">&quot;rootName&quot;</span>           <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'rss'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$unserializer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XML_Unserializer<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$doc</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUnserializedData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$doc</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> xml_to_array<span style="color: #009900;">&#40;</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://www.debian.org/News/news'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;html&gt;
&lt;body&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;item&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$noticia</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;h1&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;link&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;title&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/a&gt;&lt;/h1&gt;
    &lt;p class=&quot;date&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;d/m/Y H:i&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">strtotime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;dc:date&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;
    &lt;p class=&quot;desc&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'description'</span><span style="color: #009900;">&#93;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/p&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/body&gt;
&lt;/html&gt;</pre></div></div>

<p>No pinta mal, conseguimos lo que nos proponemos sin tener muchas complicaciones.</p>
<h3>Ahora la versión <em>bonita</em></h3>
<p>En Rails las cosas siempre tienden a ser más simples, o al menos mucho más cortas, muestra de ello, es la versión del código anterior en versión Rails. Este sería:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> noticias
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rss/1.0'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rss/2.0'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'open-uri'</span>
&nbsp;
    source = <span style="color:#996600;">&quot;http://www.debian.org/News/news&quot;</span>
    content = <span style="color:#996600;">&quot;&quot;</span>
    <span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>source<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span> content = s.<span style="color:#9900CC;">read</span> <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0066ff; font-weight:bold;">@rss</span> = <span style="color:#6666ff; font-weight:bold;">RSS::Parser</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>content, <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Aunque he puesto los <em>require</em> dentro de la función, realmente podrían ponerse en otro sitio (como en <em>environment.rb</em>) y no requieren de la instalación de ninguna gema extra. En la vista sería tan solo usar el código de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;% @rss.items.each do |i| %&gt;
    &lt;h1&gt;&lt;%= link_to i.title, i.link %&gt;&lt;/h1&gt;
    &lt;p class=&quot;date&quot;&gt;&lt;%=i.date.strftime(&quot;%d/%m/%Y %H:%M&quot;)%&gt;&lt;/p&gt;
    &lt;p class=&quot;desc&quot;&gt;&lt;%=simple_format(i.description)%&gt;&lt;/p&gt;
&lt;% end %&gt;</pre></div></div>

<p>Los <em>helpers</em> ayudan bastante en la creación del código, haciendo que los enlaces se hagan de forma simple, así como el formateado de la fecha, y el parseo del texto para HTML.</p>
<h3>Conclusiones</h3>
<p>He estado revisando el repositorio PEAR, donde he podido ver que había un par de paquetes de RSS, uno de ellos sin mantenimiento ya (<a href="http://pear.php.net/package/XML_RSS/redirected">XML_RSS</a>), y el resto de blogs que he visitado lo hacen como he mencionado, por lo que, obliga a conocer los distintos formatos de los que se van a rescatar noticias, ya sean Atom, RSS (la versión que corresponda), etc. Me parece que en este sentido Rails ha demostrado ser más serio o aplicado.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/14/rss-leyendolos-desde-php-y-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: convirtiendo Fatal Errors en Excepciones</title>
		<link>http://bosqueviejo.net/2011/10/24/php-convirtiendo-fatal-errors-en-excepciones/</link>
		<comments>http://bosqueviejo.net/2011/10/24/php-convirtiendo-fatal-errors-en-excepciones/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 13:26:52 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[control de errores]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1020</guid>
		<description><![CDATA[ Uno de los problemas que surge cuando se usa PHP, es que muchas veces, se programa pensando en orientación a objetos y, de repente&#8230; un Fatal Error, algo tan ligado a la programación estructurada o incluso spaguetti nos ronda en un esquema que intentamos que sea lo más POO (u OOP) posible.
Después de realizar una pequeña búsqueda por Internet, he visto que, en la propia página de PHP, ya tienen medio resuelto el problema y, funciona bastante bien&#8230; según leo en un ejemplo de :

&#60;?php
function exception_error_handler&#40;$errno, $errstr, $errfile, $errline &#41; &#123;
    throw new ErrorException&#40;$errstr, 0, $errno, $errfile, $errline&#41;;
&#125;
set_error_handler&#40;&#34;exception_error_handler&#34;, E_USER_ERROR&#41;;
&#160;
/* Trigger exception */
strpos&#40;&#41;;
?&#62;

Si lanzamos la ejecución del código, veremos que ya no se sucede el típico Fatal Error, sino una excepción no capturada, con lo que, si envolviésemos el código strpos con try ... catch, obtendríamos que el programa ya no deja de funcionar.
Hay que tener en cuenta de que PHP no tiene solo errores, sino también noticas (NOTICE), avisos de elementos en desuso (DEPRECATED) y avisos (WARNING), que podría capturarse si no indicamos el parámetro E_USER_ERROR como segundo parámetro de set_error_handler.
¿Para cuándo lo incluirán este cómo como por defecto en la distribución estándar de PHP?
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/bugs-150x150.jpg" alt="" title="bugs" width="150" height="150" class="alignleft size-thumbnail wp-image-1021" /> Uno de los problemas que surge cuando se usa PHP, es que muchas veces, se programa pensando en orientación a objetos y, de repente&#8230; un <em>Fatal Error</em>, algo tan ligado a la programación estructurada o incluso <em>spaguetti</em> nos ronda en un esquema que intentamos que sea lo más POO (u OOP) posible.</p>
<p>Después de realizar una pequeña búsqueda por Internet, he visto que, en la propia página de PHP, ya tienen medio resuelto el problema y, funciona bastante bien&#8230; según leo en un ejemplo de <a href=""></a>:</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: #000000; font-weight: bold;">function</span> exception_error_handler<span style="color: #009900;">&#40;</span><span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errfile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errline</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> ErrorException<span style="color: #009900;">&#40;</span><span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errfile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errline</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">set_error_handler</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;exception_error_handler&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Trigger exception */</span>
<span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Si lanzamos la ejecución del código, veremos que ya no se sucede el típico <em>Fatal Error</em>, sino una excepción no capturada, con lo que, si envolviésemos el código <tt>strpos</tt> con <tt>try ... catch</tt>, obtendríamos que el programa ya no deja de funcionar.</p>
<p>Hay que tener en cuenta de que PHP no tiene solo errores, sino también noticas (NOTICE), avisos de elementos en desuso (DEPRECATED) y avisos (WARNING), que podría capturarse si no indicamos el parámetro E_USER_ERROR como segundo parámetro de <tt>set_error_handler</tt>.</p>
<p>¿Para cuándo lo incluirán este cómo como <em>por defecto</em> en la distribución estándar de PHP?</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/24/php-convirtiendo-fatal-errors-en-excepciones/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>Xdebug: depurar y optimizar código PHP</title>
		<link>http://bosqueviejo.net/2011/04/11/xdebug-depurar-y-optimizar-codigo-php/</link>
		<comments>http://bosqueviejo.net/2011/04/11/xdebug-depurar-y-optimizar-codigo-php/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 01:56:50 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[xdebug]]></category>

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

		<guid isPermaLink="false">http://bosqueviejo.net/?p=536</guid>
		<description><![CDATA[Hace tiempo hice algo parecido con los lenguajes de programación que entonces conocía, probando aquellos que eran de scripting, compilados y probando sobretodo, lo que tardan en levantar y hacer una operación tan simple como enumerar 100.000 números sacando por pantalla el número con un elevado a 2 de la posición en el que sale la impresión. Por ejemplo:

Hola 1
Hola 4
Hola 9
Hola 16
...

He realizado las pruebas en los lenguajes: C, Perl, Ruby, Python, PHP, Lua, Shell script, Erlang script y Java.
C
En lenguaje C se ha realizado el siguiente código:

#include &#60;stdio.h&#62;
&#160;
main&#40;&#41; &#123;
        int i;
&#160;
        for &#40;i=0; i&#60;100000; i++&#41; &#123;
                printf&#40;&#34;Hola %d\n&#34;, i*i&#41;;
        &#125;
&#125;

Perl
En el lenguaje Perl, se ha implementado el código siguiente:

#!/usr/bin/perl
&#160;
for &#40;$i=0; $i&#60;100000; $i++&#41; &#123;
        print &#34;Hola &#34; . &#40;$i*$i&#41; . &#34;\n&#34;;
&#125;

Ruby
En Ruby, el código escrito ha sido:

#!/usr/bin/ruby
&#160;
&#40;1..100000&#41;.each do &#124;i&#124;
        puts &#34;hola &#34; + &#40;i*i&#41;.to_s
end

Python
En Python, el código ha sido:

#!/usr/bin/python
&#160;
for i in range&#40;1,1000000&#41;:
        [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo hice algo parecido con los lenguajes de programación que entonces conocía, probando aquellos que eran de scripting, compilados y probando sobretodo, lo que tardan en levantar y hacer una operación tan simple como enumerar 100.000 números sacando por pantalla el número con un elevado a 2 de la posición en el que sale la impresión. Por ejemplo:</p>
<pre>
Hola 1
Hola 4
Hola 9
Hola 16
...
</pre>
<p>He realizado las pruebas en los lenguajes: C, Perl, Ruby, Python, PHP, Lua, Shell script, Erlang script y Java.</p>
<h3>C</h3>
<p>En lenguaje C se ha realizado el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">100000</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hola %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">*</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Perl</h3>
<p>En el lenguaje Perl, se ha implementado el código siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Hola &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$i</span><span style="color: #0000ff;">*$i</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Ruby</h3>
<p>En Ruby, el código escrito ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/ruby</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span>..<span style="color:#006666;">100000</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;hola &quot;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">*</span>i<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_s</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3>Python</h3>
<p>En Python, el código ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">1000000</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Hola &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: #66cc66;">*</span>i<span style="color: black;">&#41;</span></pre></div></div>

<h3>PHP</h3>
<p>En PHP el código escrito ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">#!/usr/bin/php -q
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Hola &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">*</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Lua</h3>
<p>El código de Lua escrito ha sido:</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="lua" style="font-family:monospace;">#<span style="color: #66cc66;">!/</span>usr<span style="color: #66cc66;">/</span>bin<span style="color: #66cc66;">/</span>lua
&nbsp;
<span style="color: #b1b100;">for</span> i<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">100000</span> <span style="color: #b1b100;">do</span>
        <span style="color: #b1b100;">print</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Hola &quot;</span> .. <span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">*</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span></pre></div></div>

<h3>Shell script</h3>
<p>En shell script (en bash) se ha implementado lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">1</span> <span style="color: #000000;">100000</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>; <span style="color: #000000; font-weight: bold;">do</span>
        <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">RESULT</span>=<span style="color: #007800;">$i</span><span style="color: #000000; font-weight: bold;">*</span><span style="color: #007800;">$i</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Hola <span style="color: #007800;">$RESULT</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h3>Erlang (Script)</h3>
<p>Erlang también puede emplearse como lenguaje de scripting usando el intérprete <em>escript</em>. El código escrito para este intérprete ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;">#<span style="color: #014ea4;">!/</span>usr<span style="color: #014ea4;">/</span>bin<span style="color: #014ea4;">/</span>escript
&nbsp;
<span style="color: #ff3c00;">main</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">_Args</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
        <span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">100000</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">I</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
        <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;Hola ~p~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">I</span><span style="color: #014ea4;">*</span><span style="color: #45b3e6;">I</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
        <span style="color: #ff3c00;">loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">I</span><span style="color: #014ea4;">-</span><span style="color: #ff9600;">1</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>

<h3>Java</h3>
<p>El código que se ha usado para la prueba de Java ha sido:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> loop <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Hola &quot;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">*</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Resultado de las pruebas</h3>
<p>Tras ejecutar 5 veces cada script, controlando el tiempo que toma cada uno hemos obtenido, según el equipo en el que se ha ejecutado. El equipo 1 es un Intel vPro con Debian GNU/Linux Lenny:</p>
<table>
<tr>
<th rowspan="2">Lenguaje</th>
<th colspan="5">Ejecuciones (en segundos) (Equipo 1)</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
<tr>
<th>C (4.1.3)</th>
<td> 0,02</td>
<td> 0,02</td>
<td> 0,02</td>
<td> 0,02</td>
<td> 0,02</td>
</tr>
<tr>
<th>Perl (5.10.0)</th>
<td> 0,04</td>
<td> 0,03</td>
<td> 0,03</td>
<td> 0,03</td>
<td> 0,03</td>
</tr>
<tr>
<th>Ruby (1.8.7-p72)</th>
<td> 0,16</td>
<td> 0,15</td>
<td> 0,16</td>
<td> 0,16</td>
<td> 0,15</td>
</tr>
<tr>
<th>Lua (5.1.3)</th>
<td> 0,21</td>
<td> 0,22</td>
<td> 0,21</td>
<td> 0,21</td>
<td> 0,21</td>
</tr>
<tr>
<th>PHP (5.3.1)</th>
<td> 0,41</td>
<td> 0,47</td>
<td> 0,43</td>
<td> 0,33</td>
<td> 0,29</td>
</tr>
<tr>
<th>Python (2.6.5)</th>
<td> 1,13</td>
<td> 1,11</td>
<td> 1,15</td>
<td> 1,16</td>
<td> 1,14</td>
</tr>
<tr>
<th>Java (1.6.0_20-b02)</th>
<td> 1,37</td>
<td> 1,39</td>
<td> 1,40</td>
<td> 1,36</td>
<td> 1,34</td>
</tr>
<tr>
<th>Erlang (R13B04, 5.7.5)</th>
<td> 3,65</td>
<td> 3,62</td>
<td> 3,65</td>
<td> 3,65</td>
<td> 3,56</td>
</tr>
<tr>
<th>Bash (3.2.39)</th>
<td> 7,27</td>
<td> 7,26</td>
<td> 7,46</td>
<td> 7,40</td>
<td> 7,25</td>
</tr>
</table>
<p>En el equipo 2, un Apple iBook G4 (PowerPC):</p>
<table>
<tr>
<th rowspan="2">Lenguaje</th>
<th colspan="5">Ejecuciones (en segundos) (Equipo 2)</th>
</tr>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
<tr>
<th>C (4.0.1)</th>
<td>0,22</td>
<td>0,34</td>
<td>0,55</td>
<td>0,32</td>
<td>0,35</td>
</tr>
<tr>
<th>Perl (5.8.9)</th>
<td>0,67</td>
<td>0,83</td>
<td>0,68</td>
<td>0,68</td>
<td>0,78</td>
</tr>
<tr>
<th>Ruby (1.8.6-p386)</th>
<td>2,91</td>
<td>3,21</td>
<td>3,20</td>
<td>3,13</td>
<td>3,52</td>
</tr>
<tr>
<th>Lua (5.1.4)</th>
<td>1,51</td>
<td>1,64</td>
<td>1,64</td>
<td>1,65</td>
<td>2,43</td>
</tr>
<tr>
<th>PHP (5.2.14)</th>
<td>2,51</td>
<td>2,48</td>
<td>2,55</td>
<td>2,37</td>
<td>2,77</td>
</tr>
<tr>
<th>Python (2.5.1)</th>
<td>17,49</td>
<td>16,91</td>
<td>17,41</td>
<td>17,40</td>
<td>16,92
<td></tr>
<tr>
<th>Java (1.5.0_26-156)</th>
<td>7,60</td>
<td>5,92</td>
<td>5,72</td>
<td>5,90</td>
<td>6,02
<td></tr>
<tr>
<th>Erlang (R14A, 5.8)</th>
<td>22,10</td>
<td>23,13</td>
<td>22,76</td>
<td>21,94</td>
<td>21,80
<td></tr>
<tr>
<th>Bash (4.1.9)</th>
<td>135,19</td>
<td>223,56</td>
<td>181,40</td>
<td>136,19</td>
<td>133,46
<td></tr>
</table>
<p>Ordenados por velocidad, se ve que el lenguaje C, como cabía esperar, es el más rápido, seguido de Perl, como el lenguaje de scripting más rápido.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/11/15/banco-de-pruebas-i-velocidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

