<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bosque Viejo &#187; desarrollo web</title>
	<atom:link href="http://bosqueviejo.net/tag/desarrollo-web/feed/" rel="self" type="application/rss+xml" />
	<link>http://bosqueviejo.net</link>
	<description>Sitio web sobre programación, software libre, redes, servidores, ofimática... y todo lo relacionado con la informática que nos rodea</description>
	<lastBuildDate>Wed, 08 Feb 2012 10:14:54 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Selenium: probando aplicaciones web</title>
		<link>http://bosqueviejo.net/2011/12/15/selenium-probando-aplicaciones-web/</link>
		<comments>http://bosqueviejo.net/2011/12/15/selenium-probando-aplicaciones-web/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 18:22:06 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[pruebas]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[webdriver]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1138</guid>
		<description><![CDATA[ Bueno, ya tocaba, después de dedicar varios apartados al desarrollo web, toca dedicarle un pequeño, aunque importante apartado a una herramienta de comprobación (tests) como es Selenium.
Esta herramienta es para poder realizar pruebas de sistema, a nivel completo y desde la propia interfaz de usuario&#8230; o incluso de forma automatizada, desde scripts de tipo JUnit, Rspec, y otros entornos de pruebas unitarias o de sistema automatizados.
La URL para descargar Selenium es: Selenium Downloads; ahí podremos descargar los entornos, entre ellos el mencionado Plugin para Firefox.
El resto del artículo irá dirigido, sobre todo, a revisar Selenium IDE, que es el que se maneja desde el propio plugin de Firefox, y es la parte más visual y rápida para adentrarse en este entorno de pruebas.
Lanzando el IDE
Una vez se tiene instalado el plugin (no lo comento, puesto que es una instalación básica y guiada, por lo que considero no debe de surgir mayor problema), pasaremos a lanzar el IDE. Este se encuentra en el menú Herramientas (o Tools), bajo la opción Selenium IDE, tal y como se ve a continuación:

Tras esto, se abre una ventana, la del IDE de Selenium, y si os fijáis en la parte derecha de la barra [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/selenium-150x150.jpg" alt="" title="selenium" width="150" height="150" class="alignleft size-thumbnail wp-image-1140" /> Bueno, ya tocaba, después de dedicar varios apartados al desarrollo web, toca dedicarle un pequeño, aunque importante apartado a una herramienta de comprobación (tests) como es <a href="http://seleniumhq.org/">Selenium</a>.<span id="more-1138"></span></p>
<p>Esta herramienta es para poder realizar pruebas de sistema, a nivel completo y desde la propia interfaz de usuario&#8230; o incluso de forma automatizada, desde scripts de tipo JUnit, Rspec, y otros entornos de pruebas unitarias o de sistema automatizados.</p>
<p>La URL para descargar Selenium es: <a href="http://seleniumhq.org/download/">Selenium Downloads</a>; ahí podremos descargar los entornos, entre ellos el mencionado <a href="http://release.seleniumhq.org/selenium-ide/1.4.1/selenium-ide-1.4.1.xpi">Plugin para Firefox</a>.</p>
<p>El resto del artículo irá dirigido, sobre todo, a revisar Selenium IDE, que es el que se maneja desde el propio plugin de Firefox, y es la parte más visual y rápida para adentrarse en este entorno de pruebas.</p>
<h3>Lanzando el IDE</h3>
<p>Una vez se tiene instalado el plugin (no lo comento, puesto que es una instalación básica y guiada, por lo que considero no debe de surgir mayor problema), pasaremos a lanzar el IDE. Este se encuentra en el menú <em>Herramientas</em> (o <em>Tools</em>), bajo la opción <em>Selenium IDE</em>, tal y como se ve a continuación:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/selenium_ide_firefox_opcion.png"><img src="http://bosqueviejo.net/wp-content/uploads/selenium_ide_firefox_opcion-300x228.png" alt="" title="selenium_ide_firefox_opcion" width="300" height="228" class="aligncenter size-medium wp-image-1148" /></a></p>
<p>Tras esto, se abre una ventana, la del IDE de Selenium, y si os fijáis en la parte derecha de la barra de herramientas, el botón de grabación, ya está presionado, con lo que, si hacéis algún clic, escribís algo en algún formulario de cualquier página que esté abierta en el navegador, se almacenará a modo de comando en el IDE de Selenium dicha opción:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/selenium_ide_ventana.png"><img src="http://bosqueviejo.net/wp-content/uploads/selenium_ide_ventana-300x205.png" alt="" title="selenium_ide_ventana" width="300" height="205" class="aligncenter size-medium wp-image-1149" /></a></p>
<p>En el momento que volvamos a presionar el botón de grabación, o se seleccione la opción <em>Actions</em> &#8211;> <em>Record</em>, se detendrá la grabación y con las opciones de ejecución: <em>Play entire test suite</em>, o <em>Play current test case</em>; se puede reproducir lo grabado, ya sea de forma completa o solamente la línea seleccionada, respectivamente.</p>
<h3>Automatizando</h3>
<p>Está claro que, podríamos tener Chrome, Firefox, Internet Explorer, Opera, &#8230; todos los navegadores posibles para comprobar que el funcionamiento de nuestra aplicación es el que debe de ser&#8230; pero resultaría bastante tedioso el tener que lanzar cada navegador (e incluso en cada infraestructura: Windows, Linux, MacOS X, Android, &#8230;), por lo que Selenium también nos da otras herramientas.</p>
<p>En principio, desde el entorno, cada <em>test suite</em> puede ser exportada como prueba a: C#, Ruby con Test::Unit o Rspec, JUnit o Python; existiendo también otros exportadores aparte para otros lenguajes, como <a href=https://addons.mozilla.org/es-ES/firefox/addon/selenium-ide-php-formatters/"">PHP</a> u otras librerías que permiten escribir el código de tipo Selenium en lenguajes como <a href="https://github.com/charpi/erl_selenium/wiki">Erlang</a>.</p>
<h3>Webdriver</h3>
<p>Nada más entrar en la web, además del entorno IDE del que ya he comentado algo, encontramos que hay dos opciones elementos más disponibles: Remote Control y Webdriver; actualmente, Remote Control ha sido desestimado y en su lugar se emplea Webdriver, por lo que nos centraremos en Webdriver.</p>
<p>A través de la <a href="http://seleniumhq.org/docs/03_webdriver.html">documentación oficial</a>, podemos ver que WebDriver es un framework que se puede emplear en nuestros proyectos de Java, C#, Python, Ruby, PHP o Perl (que son los oficialmente soportados, también está disponible en <a href="https://github.com/charpi/erl_selenium/wiki">este enlace Erlang</a>, y hay otros desarrollados por la comunidad.</p>
<h3>Grid</h3>
<p>Grid es la parte servidora, es decir, un <em>hub</em> o <em>rejilla</em> donde se pueden agrupar servidores de este mismo tipo, de modo que las pruebas se les puedan encargar a ellos. La propia web dedicada a ello de <a href="http://selenium-grid.seleniumhq.org/how_it_works.html">Selenium Grid, How it works</a>, nos muestra como funciona la idea:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/selenium_grid.png"><img src="http://bosqueviejo.net/wp-content/uploads/selenium_grid-300x212.png" alt="" title="selenium_grid" width="300" height="212" class="aligncenter size-medium wp-image-1154" /></a></p>
<p>Básicamente, consta de que, cada WebDriver pueda ser manejado de forma remota a través de un Grid. De este modo podemos tener varias arquitecturas como Windows, Linux, MacOS X, &#8230; y varios navegadores como Firefox, IE, Chrome, Safari, &#8230; en nuestra rejilla, y encargar las pruebas para que se realicen en general a todas las plataformas, al mismo tiempo.</p>
<h3>Conclusiones</h3>
<p>Es un buen entorno para pruebas, y realmente no resulta nada tedioso el desarrollar las pruebas directamente en el IDE, modificarlas y ajustarlas, verificarlas y exportarlas finalmente para la rejilla de pruebas.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/12/15/selenium-probando-aplicaciones-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zotonic: CMS en Erlang</title>
		<link>http://bosqueviejo.net/2011/12/05/zotonic-cms-en-erlang/</link>
		<comments>http://bosqueviejo.net/2011/12/05/zotonic-cms-en-erlang/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 00:25:59 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[dtl]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[zotonic]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://bosqueviejo.net/?p=777</guid>
		<description><![CDATA[ Justo cuando colgaba la encuesta sobre: Si tuvieses que hacer un sitio web dinámico, ¿en qué tecnología lo harías?; busqué un framework en los lenguajes más populares de desarrollo web y, topé con Catalyst, un framework en Perl para el desarrollo de aplicaciones web.
Después de un recorrido por Symfony (PHP), Rails (Ruby) y Django (Python), he decidido echarle un vistazo a Catalyst (Perl) para ver qué novedades integra y en qué mejora, tanto a nivel de rendimiento, como a nivel de desarrollo, la generación de sitios web dinámicos.
Perspectiva MVC
Cada entorno integra MVC de una forma diferente, incluso lo que se entiende por MVC, desde los primeros libros a finales de los 70 y principios de los 80, es un esquema en el que la Vista puede interactuar con el modelo, al igual que el controlador con la vista y con el modelo.
En Rails, se presenta el fat model, donde la codificación referente a base de datos se realiza en estos, y el flujo de la aplicación recae en los controladores, que deciden qué tipo de vista o presentación de la información emplear, dando facilidades para la presentación en HTML, JSON, XML&#8230; e incluso vía email.
En cambio, Django, no dispone [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/perl_catalyst.png" alt="" title="perl_catalyst" width="105" height="105" class="alignleft size-full wp-image-1093" /> Justo cuando colgaba la encuesta sobre: <em>Si tuvieses que hacer un sitio web dinámico, ¿en qué tecnología lo harías?</em>; busqué un framework en los lenguajes más populares de desarrollo web y, topé con <a href="http://www.catalystframework.org/">Catalyst</a>, un framework en Perl para el desarrollo de aplicaciones web.<span id="more-777"></span></p>
<p>Después de un recorrido por Symfony (PHP), Rails (Ruby) y Django (Python), he decidido echarle un vistazo a Catalyst (Perl) para ver qué novedades integra y en qué mejora, tanto a nivel de rendimiento, como a nivel de desarrollo, la generación de sitios web dinámicos.</p>
<h3>Perspectiva MVC</h3>
<p>Cada entorno integra MVC de una forma diferente, incluso lo que se entiende por MVC, desde los primeros libros a finales de los 70 y principios de los 80, es un esquema en el que la Vista puede interactuar con el modelo, al igual que el controlador con la vista y con el modelo.</p>
<p>En Rails, se presenta el <em>fat model</em>, donde la codificación referente a base de datos se realiza en estos, y el flujo de la aplicación recae en los controladores, que deciden qué tipo de vista o presentación de la información emplear, dando facilidades para la presentación en HTML, JSON, XML&#8230; e incluso vía email.</p>
<p>En cambio, Django, no dispone de controlador como tal, ya que lo nombran por defecto como <em>views</em>, siendo esta la entidad que controla el flujo y la presentación, ayudada de la plantillas usando DTL. En este caso, la parte de MVC queda más difusa y ellos mismos explican en su web, que se podría decir más bien que Django es MTV (Model-Template-View).</p>
<p>Catalyst, sin embargo, tiene más semejanza a Rails en este sentido. Tiene un parte para los controladores, una parte para los modelos y otra parte para las vistas. Así mismo, las vistas se desarrollan, al igual que Django y Rails, con un sistema de plantillas (templates).</p>
<p>Al crear un proyecto, tan solo ejecutando el siguiente comando, se genera la estructura de ficheros que podemos ver a continuación:</p>
<pre>
$ catalyst.pl miproject
created "miproject"
created "miproject/script"
created "miproject/lib"
created "miproject/root"
created "miproject/root/static"
created "miproject/root/static/images"
[...]
$ tree
.
├── Changes
├── lib
│   ├── miproject
│   │   ├── Controller
│   │   │   └── Root.pm
│   │   ├── Model
│   │   └── View
│   └── miproject.pm
├── Makefile.PL
├── miproject.conf
├── miproject.psgi
├── README
├── root
│   ├── favicon.ico
│   └── static
│       └── images
│           ├── btn_120x50_built.png
│           ├── btn_120x50_built_shadow.png
│           ├── btn_120x50_powered.png
│           ├── btn_120x50_powered_shadow.png
│           ├── btn_88x31_built.png
│           ├── btn_88x31_built_shadow.png
│           ├── btn_88x31_powered.png
│           ├── btn_88x31_powered_shadow.png
│           └── catalyst_logo.png
├── script
│   ├── miproject_cgi.pl
│   ├── miproject_create.pl
│   ├── miproject_fastcgi.pl
│   ├── miproject_server.pl
│   └── miproject_test.pl
└── t
    ├── 01app.t
    ├── 02pod.t
    └── 03podcoverage.t

10 directories, 25 files
</pre>
<p>En el directorio <strong>lib/miproject</strong> es donde está el código principal.</p>
<h3>Los controladores</h3>
<p>A diferencia de otros entornos, las URLs o rutas para acceso a los métodos de Catalyst son implícitas a las subrutinas de cada paquete que está en el directorio (o paquete) de controladores. Por ejemplo, si editamos el fichero <tt>lib/miproject/Controller/Root.pm</tt> y agregamos el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> libros <span style="color: #339933;">:</span>Global <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$self</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$c</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">body</span> <span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;listado de libros!&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Al ejecutar el servidor de pruebas: <tt>script/miproject_server.pl</tt>; podremos ver la siguiente tabla:</p>
<pre>
[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private              | Class                                | Method       |
+----------------------+--------------------------------------+--------------+
| /default             | miproject::Controller::Root          | default      |
| /end                 | miproject::Controller::Root          | end          |
| /libros              | miproject::Controller::Root          | libros       |
| /index               | miproject::Controller::Root          | index        |
'----------------------+--------------------------------------+--------------'
</pre>
<p>Al cargar la página <a href="http://localhost:3000/libros">http://localhost:3000/libros</a> podemos ver el resultado de la ejecución de la subrutina escrita.</p>
<h3>La vista</h3>
<p>Hemos realizado antes una salida directa desde el controlador, pero lo suyo es crear una vista. El sistema de plantillas de Perl se denomina TT. Es parecido al que se usa en JSP e incluso al que usa la DTL (Django Template Library), pero difiere bastante. Vamos a generar una vista primero:</p>
<pre>
$ script/miproject_create.pl view HTML TT
</pre>
<p>Con esto nuestro directorio de <tt>View</tt> se completa con la generación de un módulo de Perl <tt>HTML.pm</tt>. Ahora creamos una vista con la siguiente información en la ruta <tt>root</tt> con el nombre <tt>listado.tt</tt>:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;h1&gt;Hola mundo!&lt;/h1&gt;
&nbsp;
&lt;p&gt;[% libros %]&lt;/p&gt;</pre></div></div>

<p>Para lo que habrá que cambiar la subrutina escrita anteriormente a la siguiente (también se puede cambiar el nombre y agregar como una completamente nueva):</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> libros <span style="color: #339933;">:</span>Global <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$self</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$c</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>template <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;listado.tt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>libros <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;no hay libros&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Los modelos</h3>
<p>Tanto Django como Rails, e incluso Doctrine, tienen sistemas de migraciones o sincronización con base de datos. Catalyst no dispone de estos mecanismos. Puede generar sus modelos de una conexión de base de datos con tablas ya creadas, pero no al contrario.</p>
<p>No obstante, su ORM es bastante potente. Por ejemplo, pongamos que creamos una base de datos SQLite (supongamos que en <tt>/tmp/libros.db</tt>):</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">PRAGMA foreign_keys <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">ON</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> libros <span style="color: #66cc66;">&#40;</span>
     id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
     titulo TEXT
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> autores <span style="color: #66cc66;">&#40;</span>
     id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
     nombre TEXT<span style="color: #66cc66;">,</span>
     apellidos TEXT
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> libros_autores <span style="color: #66cc66;">&#40;</span>
     libro_id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> libros<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> CASCADE<span style="color: #66cc66;">,</span>
     autor_id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> autores<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> CASCADE<span style="color: #66cc66;">,</span>
     <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>libro_id<span style="color: #66cc66;">,</span> autor_id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Diseño Ágil con TDD'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'No me hagas pensar'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Hacking Etico'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Perl Best Practices'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Carlos'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Ble'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Steve'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Krug'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Carlos'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Tori'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Damian'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Conway'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> libros_autores <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Generamos nuestros modelos con el siguiente comando:</p>
<pre>
$ script/miproject_create.pl model  DB DBIC::Schema \
     MiProject::Schema create=static \
     dbi:SQLite:/tmp/libros.sqlite \
     on_connect_do="PRAGMA foreign_keys = ON"
</pre>
<p>Con esto nos genera un fichero de esquema en el directorio <tt>Model</tt>, con lo que tendremos el acceso a la base de datos configurada. Si quisieramos probar, tan solo necesitaríamos ejecutar lo siguiente. Modificamos la subrutina de nuevo:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> libros <span style="color: #339933;">:</span>Global <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$self</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$c</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>template <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;listado.tt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stash</span><span style="color: #009900;">&#40;</span>libros <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">model</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'DB::Libro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">all</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y también el fichero de plantilla por lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;h1&gt;Hola mundo!&lt;/h1&gt;
&nbsp;
[% FOREACH libro IN libros -%]
[% tt_autores = []; tt_autores.push(autor.apellidos) FOREACH autor = libro.autores %]
&lt;p&gt;[% libro.titulo %] - [% tt_autores.join(', ') | html %]&lt;/p&gt;
[% END -%]</pre></div></div>

<p>Por último, agregamos las referencias necesarias en <tt>Libro.pm</tt> y <tt>Autore.pm</tt> (es lo malo del pluralize del inglés cuando se usan palabras castellanas):</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">many_to_many</span><span style="color: #009900;">&#40;</span>libros <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'libros_autores'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'libro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Y esto para <tt>Autore.pm</tt>:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">many_to_many</span><span style="color: #009900;">&#40;</span>autores <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'libros_autores'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'autor'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Con esto ya tendríamos un listado muy simple en funcionamiento. Puedes ver el tutorial completo (con un CRUD de ejemplo y más cosas aún) en la siguiente dirección (en inglés): <a href="http://search.cpan.org/~hkclark/Catalyst-Manual-5.9002/lib/Catalyst/Manual/Tutorial.pod">Tutorial</a>.</p>
<h3>Conclusiones</h3>
<p>El entorno proporciona las bases que proporcionan el resto de frameworks, su simpleza en las rutas y su formato de ORM hace que la programación de elementos sea bastante simple y rápida, no obstante, hay ciertos elementos con los que hay que tratar y revisarlos bien, leer bien la documentación y tratar de entenderlos, si no queremos toparnos con ningún problema a la hora de realizar cualquier entorno.</p>
<p>Personalmente, me ha gustado la experiencia y el entorno en sí, la programación con los módulos de Perl, lo documentado que queda todo si se siguen las líneas y el hecho de que no hace falta escribir mucho código para conseguir que el sistema funcione bien, hacen que sea un framework muy cómodo de utilizar.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/11/29/catalyst-framework-web-para-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CoffeeScript: haciendo fácil JavaScript</title>
		<link>http://bosqueviejo.net/2011/10/21/coffeescript-haciendo-facil-javascript/</link>
		<comments>http://bosqueviejo.net/2011/10/21/coffeescript-haciendo-facil-javascript/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 16:54:56 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=996</guid>
		<description><![CDATA[ Después de leer la liberación de Rails 3.1, me topé con que trae por defecto este sistema para facilitar la escritura de código JavaScript. Es curioso que lo traiga activo por defecto, ya que hay muchos a los que les gusta el lenguaje JavaScript y pueden haberse tomado mal esta decisión&#8230; no obstante yo lo veo bastante acertado, más que nada porque el código de CoffeeScript me resulta muy claro y limpio, en comparación con JavaScript y, lo mejor de todo, es que resulta incluso hasta más fácil de portar entre navegadores.
En principio, si consideramos algo tan simple como el famoso heredoc, que en JavaScript no está soportado, en CoffeeScript es posible de la siguiente forma:

datos = '''
     Estimado lector,
&#160;
     esta es una carta....
     '''

O algo típico como:

potencia = (x, y) -&#62;
    a = 1
    for i in [1..y]
        a *= x
    a
&#160;
alert potencia(5, 2)

Pero no es un nuevo lenguaje que vayan a soportar los navegadores, realmente es una abstracción que finalmente se traduce a JavaScript (ya sea por parte del [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/coffeescript_logo.png" alt="" title="coffeescript_logo" width="128" height="128" class="alignleft size-full wp-image-1012" /> Después de leer la liberación de Rails 3.1, me topé con que trae por defecto este sistema para facilitar la escritura de código JavaScript. Es curioso que lo traiga activo por defecto, ya que hay muchos a los que les gusta el lenguaje JavaScript y pueden haberse tomado mal esta decisión&#8230; no obstante yo lo veo bastante acertado, más que nada porque el código de <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a> me resulta muy claro y limpio, en comparación con JavaScript y, lo mejor de todo, es que resulta incluso hasta más fácil de portar entre navegadores.</p>
<p>En principio, si consideramos algo tan simple como el famoso <em>heredoc</em>, que en JavaScript no está soportado, en CoffeeScript es posible de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">datos = '''
     Estimado lector,
&nbsp;
     esta es una carta....
     '''</pre></div></div>

<p>O algo típico como:</p>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">potencia = (x, y) -&gt;
    a = 1
    for i in [1..y]
        a *= x
    a
&nbsp;
alert potencia(5, 2)</pre></div></div>

<p>Pero no es un nuevo lenguaje que vayan a soportar los navegadores, realmente es una abstracción que finalmente se traduce a JavaScript (ya sea por parte del servidor o del cliente a través de las librerías de javascript correspondientes) y se usa en el navegador. Eso sí, el lenguaje es más completo, ya que incluye cosas que JavaScript no tiene por defecto, y más claro, ya que usa la sintaxis de palabra sobre símbolo (equivalente al <em>use english</em> de Perl).</p>
<p>En la página web oficial de CoffeeScript podemos encontrar un manual extenso y lleno de ejemplos del lenguaje, con su equivalencia en JavaScript. La mayoría de trozos se notan más claros y escuetos en CoffeeScript. No obstante, es lógico que una persona que esté más habituada a leer y escribir código en JavaScript, lo que le costará es ver el acercamiento que intenta realizar este lenguaje.</p>
<p>La sintaxis recuerda un poco a YAML, y por ende a Python, ya que requiere de una indentación para identificar de que pende cada instrucción. Así mismo, en su carencia de la palabra clave <em>return</em>, se parece también un poco Ruby. El uso de las funciones se ha asemejado a las <em>lambda</em> que integran ahora muchos lenguajes (Java se espera que lo tenga para su versión 8 ) y que emplea la flecha o símbolo de conclusión lógica (que es también usado para la definición de funciones en Erlang).</p>
<p>Como buen lenguaje de scripting no requiere que se declare ninguna variable, a diferencia de algunas implementaciones de JavaScript, donde es requerido, sobretodo para fijar el alcance de la misma, y hace uso de las post-condiciones, tal y como se puede ver en Perl y Ruby, en trozos como:</p>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">dato = 5 if valor &gt; 5 and valor &lt; 10</pre></div></div>

<p>Es una de las mejoras que se integran en Ruby 3.1, por lo que, se puede probar en ese mismo entorno, o instalándolo directamente o a través del sistema de NodeJS. El sistema contiene un compilador o traductor que toma el código fuente y lo transforma en las librerías JavaScript necesarias para la página web, por lo que no penaliza el rendimiento de la propia página en sí.</p>
<p>Decir que, en mi parecer, el hecho de que sea un lenguaje que se compila a otro da la buena fe y esperanza de que el código generado sea estándar para todos los navegadores, así como la facilidad de que la implementación del mismo parte de un solo sitio, de una sola definición muy trabajada por el autor. Seguiremos de cerca su evolución.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/21/coffeescript-haciendo-facil-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 3.1: mejorando las vistas</title>
		<link>http://bosqueviejo.net/2011/10/17/rails-3-1-mejorando-las-vistas/</link>
		<comments>http://bosqueviejo.net/2011/10/17/rails-3-1-mejorando-las-vistas/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 20:59:11 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[software libre]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=992</guid>
		<description><![CDATA[ Puf, no sé ni por donde comenzar, han sido tantas cosas las que he visto en el cambio de la versión de Rails 3.0 a esta nueva liberación&#8230; pero no solo por las mejoras que conlleva o tiene esta nueva liberación, sino más bien por esa cantidad de elementos que se anexan y que no conocía&#8230; ya me vale  
En principio, podemos decir que una de las grandes mejoras (para muchos), es que ya no trae por defecto prototype, sino que se han decantado por jQuery. No obstante, como todavía hay gente que considera el uso de prototype para sus desarrollos, pues lo que han hecho es que por defecto se instala jQuery, pero se puede indicar a través de una opción que se instale en su lugar prototype. Esto es gracias a que han extraído estas librerías a gemas independientes: prototype-rails y jquery-rails.
En segundo lugar, y siguiendo con el tema de la parte cliente, han integrado unos asset pipelines, que facilitan la generación de código CSS y JavaScript a través de elementos como CoffeeScript, Sass, Less&#8230; y todos ellos a través de Sprockets.
Con el uso de Ruby 1.9.2 (o Rubinius o JRuby en modo 1.9) y un [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/ruby_on_rails-150x150.jpg" alt="" title="ruby_on_rails" width="150" height="150" class="alignleft size-thumbnail wp-image-1000" /> Puf, no sé ni por donde comenzar, han sido tantas cosas las que he visto en el cambio de la versión de Rails 3.0 a esta nueva liberación&#8230; pero no solo por las mejoras que conlleva o tiene esta nueva liberación, sino más bien por esa cantidad de elementos que se anexan y que no conocía&#8230; ya me vale <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>En principio, podemos decir que una de las grandes mejoras (para muchos), es que ya no trae por defecto <a href="http://www.prototypejs.org/">prototype</a>, sino que se han decantado por <a href="http://jquery.com/">jQuery</a>. No obstante, como todavía hay gente que considera el uso de prototype para sus desarrollos, pues lo que han hecho es que por defecto se instala jQuery, pero se puede indicar a través de una opción que se instale en su lugar prototype. Esto es gracias a que han extraído estas librerías a gemas independientes: <em>prototype-rails</em> y <em>jquery-rails</em>.</p>
<p>En segundo lugar, y siguiendo con el tema de la parte <em>cliente</em>, han integrado unos <strong>asset pipelines</strong>, que facilitan la generación de código CSS y JavaScript a través de elementos como <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>, <a href="http://sass-lang.com/">Sass</a>, <a href="http://lesscss.org/">Less</a>&#8230; y todos ellos a través de <a href="https://github.com/sstephenson/sprockets">Sprockets</a>.</p>
<p>Con el uso de Ruby 1.9.2 (o Rubinius o JRuby en modo 1.9) y un servidor como <a href="https://github.com/blog/517-unicorn">Unicorn</a>, podemos emplear otra de las nuevas características: <strong>HTTP Streaming</strong>. Esta característica permite la descarga de las imágenes, elementos CSS y JS, mientras se genera la vista del HTML.</p>
<p>Otra de las ventajas que sobresale en esta versión es el <strong>Identity Map</strong>. Esta característica de Rails, más en concreto de ActiveRecord, hace que cuando un objeto se rescata de la base de datos, si se solicita de nuevo el mismo objeto, no se solicite de nuevo, sino que se tome el que ya está recogido y en memoria. Esto lo hace solo para los objetos que se instancian en la petición en curso y que son eliminados de la caché cuando la petición finaliza.</p>
<p>El resto ya son mejoras menores, como:</p>
<ul>
<li>El uso de JSON en lugar de XML para el <em>scaffold</em>.</li>
<li>La creación de helpers para la autenticación de HTTP Basic y Digest.</li>
<li>El uso del método change en lugar de <tt>up</tt> y <tt>down</tt> en las migraciones, generando la <em>marcha atrás</em> el sistema de forma automática.</li>
<li>El uso de <tt>up</tt> y <tt>down</tt> como métodos de objeto y no de clase.</li>
<li>La posibilidad de crear serializadores de forma fácil (los de XML y JSON vienen por defecto).</li>
<li>y muchas más&#8230;</li>
</ul>
<p>Para más información, puedes leer <a href="http://guides.rubyonrails.org/3_1_release_notes.html">la ficha de liberación completa (en inglés)</a>.</p>
<p>Realmente, Rails está avanzando mucho y desde que comencé a usarlo, hará ya tres años, lo he visto agregar cada vez más nueva tecnología y elementos que me han ayudado a aprender mucho sobre el desarrollo profesional de entornos web. Así da gusto.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/17/rails-3-1-mejorando-las-vistas/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>Opa: el lenguaje de la nube</title>
		<link>http://bosqueviejo.net/2011/07/27/opa-el-lenguaje-de-la-nube/</link>
		<comments>http://bosqueviejo.net/2011/07/27/opa-el-lenguaje-de-la-nube/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 10:56:18 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[desarrollo software]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[opa]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

