<?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 de Software</title>
	<atom:link href="http://bosqueviejo.net/category/desarrollo-de-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://bosqueviejo.net</link>
	<description>Sitio web sobre programación, software libre, redes, servidores, ofimática... y todo lo relacionado con la informática que nos rodea</description>
	<lastBuildDate>Sun, 22 Jan 2012 01:02:42 +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>Una clase/objeto/proceso, Una responsabilidad</title>
		<link>http://bosqueviejo.net/2012/01/10/una-claseobjetoproceso-una-responsabilidad/</link>
		<comments>http://bosqueviejo.net/2012/01/10/una-claseobjetoproceso-una-responsabilidad/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 14:41:21 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[carlos ble]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[programación orientada a objetos]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1201</guid>
		<description><![CDATA[ Una clase, una responsabilidad, fue uno de los textos que se me quedó grabado tras la lectura del libro Diseño Ágil con TDD de Carlos Blé.
Analizar esa simple expresión nos lleva a una regla importantísima que nos permite diseñar programas orientados a objetos y orientados a concurrencia, que sean muy óptimos y fácilmente trazables. Nos lleva a la vía en la que realizar TDD se hace obvio, y la deuda técnica desaparezca, facilitando refactorizaciones, encontrar fallos y desarrollar software con elementos pequeños, y combinando estos elementos (tal y como reza la filosofía unix) de modo que se pueda construir algo mayor, a alto nivel, sin perder el control granular de la programación a bajo y medio nivel.
Programación Orientada a Objetos
Imaginemos que tenemos que crear un programa en el que se administra un almacén. Este almacén tiene objetos que pertenecen a varias categorías, y se tiene que mantener un peticionario de las tiendas que solicitan una reposición de ciertos productos. Si lo pensamos entorno a base de datos, diagramas de Entidad/Relación (E/R), obtenemos las entidades: productos, categorías, tiendas, solicitudes; con sus respectivas relaciones.
Usando programación orientada a objetos, obtendremos que ese diagrama de clases se puede especificar muy fácilmente a través [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/programacion-orientada-a-objetos-150x150.jpg" alt="" title="programacion-orientada-a-objetos" width="150" height="150" class="alignleft size-thumbnail wp-image-1202" /> <em>Una clase, una responsabilidad</em>, fue uno de los textos que se me quedó grabado tras la lectura del libro <a href="/2010/01/12/tdd-libro-en-castellano/">Diseño Ágil con TDD</a> de <a href="http://www.carlosble.com/">Carlos Blé</a>.<span id="more-1201"></span></p>
<p>Analizar esa simple expresión nos lleva a una regla importantísima que nos permite diseñar programas orientados a objetos y orientados a concurrencia, que sean muy óptimos y fácilmente trazables. Nos lleva a la vía en la que realizar TDD se hace obvio, y la deuda técnica desaparezca, facilitando refactorizaciones, encontrar fallos y desarrollar software con elementos pequeños, y combinando estos elementos (tal y como reza la <a href="/2008/09/22/filosofia-unix/">filosofía unix</a>) de modo que se pueda construir algo mayor, a alto nivel, sin perder el control granular de la programación a bajo y medio nivel.</p>
<h3>Programación Orientada a Objetos</h3>
<p>Imaginemos que tenemos que crear un programa en el que se administra un almacén. Este almacén tiene objetos que pertenecen a varias categorías, y se tiene que mantener un peticionario de las tiendas que solicitan una reposición de ciertos productos. Si lo pensamos entorno a base de datos, diagramas de Entidad/Relación (E/R), obtenemos las entidades: productos, categorías, tiendas, solicitudes; con sus respectivas relaciones.</p>
<p>Usando programación orientada a objetos, obtendremos que ese diagrama de clases se puede especificar muy fácilmente a través de la creación de las diferentes clases. Podemos usar algún método de persistencia, y tendremos nuestros elementos, con funcionalidad agregada dentro de cada uno de las clases, por ejemplo, en solicitudes: solicitaProducto, asociaTienda, &#8230;. ya depende de cómo lo queramos (o podamos) montar.</p>
<p>Ahora, si una clase como <em>productos</em>, de pronto agrega más funcionalidad, como por ejemplo <em>fabricaProducto</em>, <em>compruebaDisponibilidad</em>, &#8230; podemos ver que el producto ya tiene varias responsabilidades, es decir, tendremos la propia responsabilidad de mantener los datos del producto, comprobar su caducidad, etc. a responsabilidades como <em>fabricaProducto</em> que debería de estar en una clase de tipo <em>fábrica</em>, o <em>compruebaDisponibilidad</em>, que debería de estar más bien en una clase de tipo <em>almacén</em>.</p>
<p>Si no respetamos esta norma, el contrato entre objetos se convierte en un auténtico caos, que puede derivar en ejecuciones difíciles de trazar y con resultados inesperados.</p>
<h3>Programación Orientada a Concurrencia</h3>
<p>En este caso, nos encontramos que definimos código que se ejecutará como un proceso aislado, estos códigos pueden ser, al igual que en el ejemplo anterior: productos, categorías, tiendas y solicitudes. La unidad de persistencia igualmente se puede conseguir de cualquier forma que se desee (fichero o base de datos).</p>
<p>En lugar de instanciar objetos, procedemos a crear procesos. Cada proceso al ejecutarse tiene su propio espacio de memoria, y de cada código específico se pueden generar tantos procesos como se necesiten. La llamada a los métodos, tal y como se llama en programación orientada a objetos: paso de mensajes; se consigue así mismo, realizando una petición o enviando un mensaje al proceso. Por lo que, por ejemplo, a un proceso de tipo solicitudes, podemos pedirle <em>solicitarProducto</em>, <em>asociaTienda</em>, &#8230; o cualquier otra función que tenga montada el sistema.</p>
<p>Al igual que el caso anterior, la responsabilidad de un proceso debe de ser única. Si no se cumpliese la norma, podríamos encontrarnos con interbloqueos al intentar llamar o solicitar dos cosas al mismo proceso por bucles (o lazos) generados sin darnos cuenta.</p>
<h3>Conclusiones</h3>
<p>Las metodologías nos ayudan a desarrollar de una forma más organizada nuestros programas. Desarrollar software con ayuda de patrones y normas como esta, hacen que el software sea más claro y fácil de trazar, así como de ampliar y mantener. Además, estos son estándares en la industria del software, con lo que, cualquiera que conozca los patrones y normas específicas, puede entender el código y sumarse al desarrollo y ampliación del mismo sin problemas.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/01/10/una-claseobjetoproceso-una-responsabilidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NodeJS: el servidor JavaScript</title>
		<link>http://bosqueviejo.net/2012/01/03/nodejs-el-servidor-javascript/</link>
		<comments>http://bosqueviejo.net/2012/01/03/nodejs-el-servidor-javascript/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 18:26:14 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[programación orientada a eventos]]></category>
		<category><![CDATA[ryan dahl]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1158</guid>
		<description><![CDATA[ El servidor Node.js vió la luz de manos de Ryan Dahl en 2009, la motivación, según la entrevista que BostInno le realizó en enero de 2011, es la arquitectura de E/S orientada a eventos.
Según Dahl: estuve involucrado, de vez en cuando, escribiendo códigos pequeños orientados a eventos. Me gustó el diseño de los servidores orientados a eventos porque sentía que eran más fáciles de comprender: el estado es mantenido en alguna estructura y puedes girar y girar modificando el estado. No había un bucle infinito haciendo bloqueos de lectura o aceptaciones desde los sockets. Me veía capaz de hacer servidores de muy baja latencia usando solo E/S sin bloqueos.
La estructura
Node.js es un intérprete JavaScript mono-hilo, lo cual indica que, la ejecución de un programa, es individual, no se puede diseccionar y, por lo tanto, no comparte información con otros hilos (ya que no los hay), ni con otros procesos, a menos que sea por paso de mensajes de comunicación entre ellos.
El sistema se basa, por sus librerías creadas a tal efecto, en la programación orientada a eventos. Si se quiere crear un servidor que escuche de un determinado puerto, por ejemplo, un servidor web, podemos emplear el siguiente código:

var [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/nodejs-150x150.jpg" alt="" title="nodejs" width="150" height="150" class="alignleft size-thumbnail wp-image-1182" /> El servidor Node.js vió la luz de manos de Ryan Dahl en 2009, la motivación, según la <a href="http://bostinno.com/2011/01/31/node-js-interview-4-questions-with-creator-ryan-dahl/">entrevista que BostInno</a> le realizó en enero de 2011, es la arquitectura de E/S orientada a eventos.</p>
<p>Según <strong>Dahl</strong>: <em>estuve involucrado, de vez en cuando, escribiendo códigos pequeños orientados a eventos. Me gustó el diseño de los servidores orientados a eventos porque sentía que eran más fáciles de comprender: el estado es mantenido en alguna estructura y puedes girar y girar modificando el estado. No había un bucle infinito haciendo bloqueos de lectura o aceptaciones desde los sockets. Me veía capaz de hacer servidores de muy baja latencia usando solo E/S sin bloqueos.</em></p>
<h3>La estructura</h3>
<p>Node.js es un intérprete JavaScript mono-hilo, lo cual indica que, la ejecución de un programa, es individual, no se puede diseccionar y, por lo tanto, no comparte información con otros hilos (ya que no los hay), ni con otros procesos, a menos que sea por paso de mensajes de comunicación entre ellos.</p>
<p>El sistema se basa, por sus librerías creadas a tal efecto, en la programación orientada a eventos. Si se quiere crear un servidor que escuche de un determinado puerto, por ejemplo, un servidor web, podemos emplear el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> http <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
http.<span style="color: #660066;">createServer</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>req<span style="color: #339933;">,</span> res<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  res.<span style="color: #660066;">writeHead</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'Content-Type'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'text/plain'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">end</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello World<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1337</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;127.0.0.1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Server running at http://127.0.0.1:1337/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Si lo lanzamos con el comando: <tt>node http.js</tt>; veremos que se ejecuta y al lanzar un navegador a la URL que indica el sistema, en el navegador podemos ver el texto <em>Hello World</em>. Podemos ver igualmente que si agregamos una espera al proceso, tal que así:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> http <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
http.<span style="color: #660066;">createServer</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>req<span style="color: #339933;">,</span> res<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> now <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> now <span style="color: #339933;">+</span> <span style="color: #CC0000;">5000</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// nothing</span>
  <span style="color: #009900;">&#125;</span>
  res.<span style="color: #660066;">writeHead</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'Content-Type'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'text/plain'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">end</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello World<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1337</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;127.0.0.1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Server running at http://127.0.0.1:1337/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>El sistema espera 5 segundos antes de dar el mensaje, por lo que si abrimos varias lengüetas, pestañas o ventanas del navegador, nos daremos cuenta de que las peticiones se realizan de forma secuencial, esperando 5 segundos cada petición, cuando la anterior termina.</p>
<h3>Librerías específicas</h3>
<p>Dahl seleccionó ECMAScript (ya que V8 se basa en este y no en JavaScript&#8230; aunque realmente ECMAScript sea una estandarización de JavaScript), porque está poco desarrollado en base a librerías. ECMAScript se ha empleado siempre de forma embebida y sobretodo en navegadores, por lo que las librerías de funciones y objetos siempre han sido portadas por los navegadores y fuera de ese contexto, no tienen gran utilidad.</p>
<p>La librería del sistema <em>http</em> es una de las muchas que podemos encontrar en Node.js, hay otras como File, JSON, LDAP, sql, MD5, &#8230; todas ellas con la capacidad de instalarse de forma muy simple:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">npm install JSON</pre></div></div>

<p>El listado y búsqueda de paquetes se puede realizar a través de la <a href="http://search.npmjs.org/">página oficial de npm</a>. Las librerías que ya vienen instaladas se pueden ver <a href="http://nodejs.org/docs/latest/api/index.html">aquí</a>, junto con su documentación.</p>
<h3>Conclusiones</h3>
<p>Node.js es en sí un intérprete con librerías y una metodología detrás que da que pensar. Como en artículos anteriores, he hablado muchas veces de que JavaScript se ha considerado muchas veces un lenguaje de futuro. Quizás con Node.js, alcanzando un nivel de formalización adecuado, quizás podamos ver ese futuro más férreo y no tan difuso.</p>
<p>Cabe destacar que, entre las extensiones diponibles, se encuentra <em>coffescript</em>, por lo que, también es posible que encontremos diversidad a medida que vaya creciendo el proyecto. De momento, y después de vista la entrevista de hace un año y los progresos que sigue teniendo, se augura un buen futuro a para esta herramienta.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/01/03/nodejs-el-servidor-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>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>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>Inversión de Control, el patrón de los frameworks</title>
		<link>http://bosqueviejo.net/2011/03/08/inversion-de-control-el-patron-de-los-frameworks/</link>
		<comments>http://bosqueviejo.net/2011/03/08/inversion-de-control-el-patron-de-los-frameworks/#comments</comments>
		<pubDate>Tue, 08 Mar 2011 17:48:39 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[desarrollo ágil]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[martin fowler]]></category>
		<category><![CDATA[patrones de diseño]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=571</guid>
		<description><![CDATA[ Leyendo un artículo de Martin Fowler, sobre el tema Inversión de Control (en inglés), comenzando por el final, la etimología de la frase (entendido como el origen del concepto), se comenta que, en un principio (sobre los años 80) la gente se refería a una nueva forma de hacer las cosas como el Principio de Hollywood, teniendo presente la famosa frase de los cineastas: &#8220;no nos llames, nosotros te llamaremos&#8221;.
Si pensamos en las librerías, en cualquier lenguaje, ya sean módulos, paquetes u objetos, siempre alcanzamos una funcionalidad encapsulada dentro de una forma específica a la que se la puede llamar para realizar una acción. Pero esto cambia radicalmente en los frameworks, u entornos de desarrollo, ya que estos entornos, normalmente, realizan un cierto trabajo, y te permiten extender esa funcionalidad base, con ciertas reglas, a través de código que se escribe.
Se podría pensar en los frameworks como piezas de software que permiten agregar una funcionalidad extra desarrollada por el programador que usa el framework, a modo de addon, plugin o extensión. Pero no es eso. Las extensiones (o llámese como se quiera) son trozos de código, que opcionalmente se puede ejecutar en un programa completamente funcional. Como es obvio, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/ioc.jpeg" alt="" title="ioc" width="120" height="120" class="alignleft size-full wp-image-685" /> Leyendo un artículo de Martin Fowler, sobre el tema <a href="http://martinfowler.com/bliki/InversionOfControl.html">Inversión de Control</a> (en inglés), comenzando por el final, la etimología de la frase (entendido como el origen del concepto), se comenta que, en un principio (sobre los años 80) la gente se refería a una nueva forma de hacer las cosas como <em>el Principio de Hollywood</em>, teniendo presente la famosa frase de los cineastas: &#8220;no nos llames, nosotros te llamaremos&#8221;.</p>
<p>Si pensamos en las librerías, en cualquier lenguaje, ya sean módulos, paquetes u objetos, siempre alcanzamos una funcionalidad encapsulada dentro de una forma específica a la que se la puede llamar para realizar una acción. Pero esto cambia radicalmente en los <em>frameworks</em>, u entornos de desarrollo, ya que estos entornos, normalmente, realizan un cierto trabajo, y te permiten extender esa funcionalidad base, con ciertas reglas, a través de código que se escribe.</p>
<p>Se podría pensar en los <em>frameworks</em> como piezas de software que permiten agregar una funcionalidad extra desarrollada por el programador que usa el <em>framework</em>, a modo de <em>addon</em>, <em>plugin</em> o extensión. Pero no es eso. Las extensiones (o llámese como se quiera) son trozos de código, que opcionalmente se puede ejecutar en un programa completamente funcional. Como es obvio, ningún <em>framework</em> es completamente funcional sin agregar ningún código por parte del programador.</p>
<p>Por lo tanto, la inversión de control es más una base sobre la que construir un elemento, es nuestra arquitectura de soporte, mientras que la base sobre la que se programa un plugin es un elemento completo y funcional que se extiende mediante el plugin, pero que no depende de él.</p>
<p>Este es otro de los grandes elementos en los que se basa la Ingeniería del Software al decir que, lo importante, es la lógica de negocio o el sistema en sí que se quiere desarrollar, dejando la parte de arquitectura de soporte y el trasfondo sobre el que se ejecuta la solución al <em>framework</em>.</p>
<p>Si aún se tiene alguna duda, puede que con este ejemplo se disipen (o aumenten <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  ), tomado del artículo de Martin Fowler comentado antes, tenemos un trozo de código en Ruby tal que así:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">'¿Cómo te llamas?'</span>
nombre = <span style="color:#CC0066; font-weight:bold;">gets</span>
procesa_nombre<span style="color:#006600; font-weight:bold;">&#40;</span>nombre<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">'¿Qué buscas?'</span>
busqueda = <span style="color:#CC0066; font-weight:bold;">gets</span>
procesa_busqueda<span style="color:#006600; font-weight:bold;">&#40;</span>busqueda<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>En este trozo de código todo está bajo control, el sistema se ejecuta de forma lineal, pide la información en el momento en el que se le ha escrito y descrito y el código se ejecuta, secuencialmente, de forma predecible.</p>
<p>Ahora veremos otro ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'tk'</span>
&nbsp;
root = TkRoot.<span style="color:#9900CC;">new</span>
nombre_etiqueta = TkLabel.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> text <span style="color:#996600;">&quot;¿Cómo te llamas?&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
nombre_etiqueta.<span style="color:#9900CC;">pack</span>
&nbsp;
nombre = TkEntry.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>root<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">pack</span>
nombre.<span style="color:#9900CC;">bind</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;FocusOut&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> procesa_nombre<span style="color:#006600; font-weight:bold;">&#40;</span>nombre<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
busqueda_etiqueta = TkLabel.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> text <span style="color:#996600;">&quot;¿Qué buscas?&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
busqueda_etiqueta.<span style="color:#9900CC;">pack</span>
&nbsp;
busqueda = TkEntry.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>root<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">pack</span>
busqueda.<span style="color:#9900CC;">bind</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;FocusOut&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> procesa_busqueda<span style="color:#006600; font-weight:bold;">&#40;</span>busqueda<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
Tk.<span style="color:#9900CC;">mainloop</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Aquí hay una gran diferencia en el flujo de ejecución, ya que los mensajes se ejecutan en el orden que el framework los llama, según la interacción del usuario. En este caso, el framework controla la ventana, los eventos que se suceden sobre los elementos gráficos y, en el caso de que haya un evento, si hemos desarrollado código para atender a ese evento, es el framework el que llama a nuestro código. Eso es <em>inversión de control</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/03/08/inversion-de-control-el-patron-de-los-frameworks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bundler: despliega fácilmente rails</title>
		<link>http://bosqueviejo.net/2011/03/07/bundler-despliega-facilmente-rails/</link>
		<comments>http://bosqueviejo.net/2011/03/07/bundler-despliega-facilmente-rails/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 19:10:46 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[bundler]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=615</guid>
		<description><![CDATA[ Después de haber dado una vuelta por la versión estable de rails, he reparado en que, por defecto, se instala bundler y un fichero llamado Gemfile en la raiz de cada proyecto rails que se genera nuevo.
La verdad es que, en el momento que vi el fichero de Gemfile, queda clara la misión de dicho fichero, ya que viene con una colección básica de gemas que se suelen instalar de forma base cuando se trabaja con rails (out of the box) y unos comentarios de gemas que aconsejan para ciertos usos cotidianos (opcionales).
Indagando un poco, topé con su web, en la que viene cantidad de documentación sobre su uso y, ejecutando, simplemente, desde la consola:

bundle install

Me encuentro con que el sistema comienza a instalar rails y todos los paquetes base necesarios para poder tener el proyecto activo y funcionando sin problemas.
Esta es otra de las joyas que hacen que Ruby on Rails sea fácil de usar para el desarrollo rápido de aplicaciones web. Lo recomiendo, merece la pena.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/bundler-small.png" alt="" title="bundler-small" width="220" height="80" class="alignleft size-full wp-image-616" /> Después de haber dado una vuelta por la versión estable de rails, he reparado en que, por defecto, se instala <a href="http://gembundler.com/">bundler</a> y un fichero llamado <em>Gemfile</em> en la raiz de cada proyecto rails que se genera nuevo.</p>
<p>La verdad es que, en el momento que vi el fichero de Gemfile, queda clara la misión de dicho fichero, ya que viene con una colección básica de gemas que se suelen instalar de forma base cuando se trabaja con rails (<em>out of the box</em>) y unos comentarios de gemas que aconsejan para ciertos usos cotidianos (opcionales).</p>
<p>Indagando un poco, topé con su web, en la que viene cantidad de documentación sobre su uso y, ejecutando, simplemente, desde la consola:</p>

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

<p>Me encuentro con que el sistema comienza a instalar rails y todos los paquetes base necesarios para poder tener el proyecto activo y funcionando sin problemas.</p>
<p>Esta es otra de las joyas que hacen que Ruby on Rails sea fácil de usar para el desarrollo rápido de aplicaciones web. Lo recomiendo, merece la pena.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/03/07/bundler-despliega-facilmente-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SpiderMonkey: extendiendo PHP</title>
		<link>http://bosqueviejo.net/2011/02/24/spidermonkey-extendiendo-php/</link>
		<comments>http://bosqueviejo.net/2011/02/24/spidermonkey-extendiendo-php/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 14:54:21 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[spidermonkey]]></category>

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

PHP 5.3 o superior
Spider Monkey Libraries 1.7 o superior

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

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

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

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

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

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

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

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

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

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

<p>Esto muestra:</p>

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

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

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

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

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

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

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

<p>O bien:</p>

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

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

		<guid isPermaLink="false">http://bosqueviejo.net/?p=503</guid>
		<description><![CDATA[Hace ya más de un año que escribí una entrada sobre ETL, donde comentaba los principios que lo fundan y algún que otro software disponible para realizar ETL. Revisando la entrada, me he dado cuenta de que el software que entonces encontré, ha cambiado bastante, incluso uno de ellos ha desaparecido como tal.
Por ello, aprovecho para que, los que sigan interesados en el mundo del bussiness intelligence puedan ver más tipos de software, algunos de ellos mucho más avanzados de lo que cabría esperar:

Pentaho Data Integration: es quizás el que mejor se mantiene de todos los software medio libres que existen en este ámbito. Las versiones más antiguas de Pentaho están abiertas para la comunidad sin necesidad de pagar ninguna licencia, mientras que las nuevas versiones solo son de pago. No obstante, las herramientas propias de Pentaho para realizar las transformaciones han evolucionado de forma que son más flexibles, potentes y simples al mismo tiempo.
Benetl: después de haberlo visto durante bastante tiempo, no sé si llamarlo concretamente ETL, ya que su misión específica consiste en la carga de ficheros de tipo txt, csv o xls, a una base de datos que, tan solo, puede ser PostgreSQL o MySQL. Esto hace [...]]]></description>
			<content:encoded><![CDATA[<p>Hace ya más de un año que escribí una entrada sobre <a href="http://bosqueviejo.net/2009/03/12/etl-extraccion-transformacion-y-carga/">ETL</a>, donde comentaba los principios que lo fundan y algún que otro software disponible para realizar ETL. Revisando la entrada, me he dado cuenta de que el software que entonces encontré, ha cambiado bastante, incluso uno de ellos ha desaparecido como tal.</p>
<p>Por ello, aprovecho para que, los que sigan interesados en el mundo del <em>bussiness intelligence</em> puedan ver más tipos de software, algunos de ellos mucho más avanzados de lo que cabría esperar:</p>
<ul>
<li><strong><a href="http://www.pentaho.com/products/data_integration/">Pentaho Data Integration</a></strong>: es quizás el que mejor se mantiene de todos los software <em>medio libres</em> que existen en este ámbito. Las versiones más antiguas de Pentaho están abiertas para la comunidad sin necesidad de pagar ninguna licencia, mientras que las nuevas versiones solo son de pago. No obstante, las herramientas propias de Pentaho para realizar las transformaciones han evolucionado de forma que son más flexibles, potentes y simples al mismo tiempo.</li>
<li><strong><a href="http://www.benetl.net/">Benetl</a></strong>: después de haberlo visto durante bastante tiempo, no sé si llamarlo concretamente ETL, ya que su misión específica consiste en la carga de ficheros de tipo txt, csv o xls, a una base de datos que, tan solo, puede ser PostgreSQL o MySQL. Esto hace que sea un sistema muy limitado, pero no obstante bueno si tus necesidades se adaptan a la tarea en concreto.</li>
<li><strong><a href="http://es.talend.com/products-data-integration/talend-open-studio.php">Talend Open Studio</a></strong>: es un sistema que me ha convencido realmente, en cómo debe de ser un buen sistema ETL. Aparte de ser un sistema open source, es un sistema visual muy completo que no solo permite generar tareas ETL en Java (como hacen muchos), sino también en Perl. Tiene un vídeo de demostración el cuál aconsejo encarecidamente, ya que muestra ampliamente varios ejemplos de uso de la herramienta.</li>
</ul>
<p>¿Conocéis más herramientas o incluso las profesionales que se usen en entornos <em>bussiness intelligence</em>?, ¿qué opnión os merecen? ¡echad un comentario! <img src='http://bosqueviejo.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/08/25/etl-revisando-el-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Propiedad del Código</title>
		<link>http://bosqueviejo.net/2010/08/06/propiedad-del-codigo/</link>
		<comments>http://bosqueviejo.net/2010/08/06/propiedad-del-codigo/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 12:04:01 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Desarrollo de Software]]></category>
		<category><![CDATA[desarrollo ágil]]></category>
		<category><![CDATA[desarrollo profesional]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[xtreme programming]]></category>

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

