<?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>Jorge Iván Meza Martínez &#187; Desarrollo de software</title>
	<atom:link href="http://blog.jorgeivanmeza.com/category/desarrollo-de-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jorgeivanmeza.com</link>
	<description>The Fire Within Me: &#34;knowledge will set you free&#34;</description>
	<lastBuildDate>Thu, 22 Jul 2010 06:31:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=5829</generator>
		<item>
		<title>Degradar PHP 5.3 a 5.2 en GNU/Linux Ubuntu 10.04</title>
		<link>http://blog.jorgeivanmeza.com/2010/07/degradar-php-5-3-a-5-2-en-gnulinux-ubuntu-10-04/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=degradar-php-5-3-a-5-2-en-gnulinux-ubuntu-10-04</link>
		<comments>http://blog.jorgeivanmeza.com/2010/07/degradar-php-5-3-a-5-2-en-gnulinux-ubuntu-10-04/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 02:56:47 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Linux/Solaris/BSD]]></category>
		<category><![CDATA[5.2]]></category>
		<category><![CDATA[5.3]]></category>
		<category><![CDATA[downgrade]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=4951</guid>
		<description><![CDATA[Introducción. La versión mas reciente de Ubuntu, Lucid Lynx (10.04), incluye en sus repositorios por defecto la versión 5.3 de PHP la cual trae consigo una serie de modificaciones considerables que hacen que muchas de las aplicaciones requieran algún tipo de modificaciones para funcionar correctamente. Mientras se realizan estas modificaciones para actualizar las aplicaciones sea [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>La versión mas reciente de Ubuntu, Lucid Lynx (10.04), incluye en sus repositorios por defecto la versión 5.3 de PHP la cual trae consigo una serie de <a href="http://php.net/manual/es/migration53.php" target="_blank">modificaciones considerables</a> que hacen que muchas de las aplicaciones requieran algún tipo de modificaciones para funcionar correctamente.</p>
<p>Mientras se realizan estas modificaciones para actualizar las aplicaciones sea hace necesario continuar utilizando las aplicaciones existentes y para esto se debe reemplazar la versión instalada de PHP por la versión mas reciente de la serie anterior (5.2.x).  La migración no es trivial debido a que los paquetes vienen directamente de los repositorios, sin embargo si se utiliza el <em>script</em> provisto opr <a href="http://mrkandy.wordpress.com/" target="_blank">KAndy</a> el proceso se simplifica enormemente.</p>
<h2>Instalación de PHP.</h2>
<p>Si aún no cuenta con PHP instalado en el equipo puede realizar una instalación básica mediante la ejecución de la siguiente instrucción.  Instale los demás paquetes que considere necesarios.</p>
<p><span style="font-family: courier new,courier;">$ sudo aptitude install apache2 php5 php5-cli php5-mysql</span></p>
<p>En este punto el equipo tendrá instalado PHP 5.3 y es el momento de degradarlo a su versión anterior.</p>
<p><span style="font-family: courier new,courier;">$ php -v</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">PHP <strong>5.3.2-1ubuntu4.2</strong> with Suhosin-Patch (cli) (built: May 13 2010 20:03:45)<br />
Copyright (c) 1997-2009 The PHP Group<br />
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies</span></p>
<h2>Degradar PHP.</h2>
<p>Tomar nota de los paquetes relacionados con PHP que se encuentran actualmente instalados.</p>
<p><span style="font-family: courier new,courier;">$ php_installed=`dpkg -l | grep  php| awk  &#8216;{print $2}&#8217; |tr &#8220;\n&#8221; &#8221; &#8220;`</span></p>
<p>Descargar el <em>script</em> de KAndy de la siguiente ubicación y almacenarlo con el nombre de <a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2010/07/downgradePHP.txt" target="_blank"><span style="font-family: courier new,courier;">downgradePHP.sh</span></a>.</p>
<p style="padding-left: 30px;"><a href="http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/" target="_blank">http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/</a></p>
<p>Ejecute el <em>script</em> en la máquina que se desea degradar.</p>
<p><span style="font-family: courier new,courier;">$ chmod +x downgradePHP.sh</span></p>
<p><span style="font-family: courier new,courier;">$ ./downgradePHP.sh</span></p>
<p>Recuperar los demás paquetes instalados.</p>
<p><span style="font-family: courier new,courier;">$ sudo apt-get install $php_installed</span></p>
<h2>Verificar la nueva versión de PHP.</h2>
<p><span style="font-family: courier new,courier;">$ php -v</span></p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">PHP <strong>5.2.10-2ubuntu6</strong> with Suhosin-Patch 0.9.7 (cli) (built: Oct 23 2009 16:28:03)<br />
Copyright (c) 1997-2009 The PHP Group<br />
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies</span></p>
<h2>Enlaces.</h2>
<ul>
<li>Install (downgrade) php 5.2.x in Ubuntu 10.04 Lucid.<br />
<a href="http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/" target="_blank">http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/</a></li>
<li>Ubuntu 10.04 and Drupal.<br />
<a href="http://civicactions.com/blog/2010/may/26/ubuntu_1004_and_drupal" target="_blank">http://civicactions.com/blog/2010/may/26/ubuntu_1004_and_drupal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/07/degradar-php-5-3-a-5-2-en-gnulinux-ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The falling things: jugando con Processing</title>
		<link>http://blog.jorgeivanmeza.com/2010/06/the-falling-things-jugando-con-processing/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-falling-things-jugando-con-processing</link>
		<comments>http://blog.jorgeivanmeza.com/2010/06/the-falling-things-jugando-con-processing/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 03:57:38 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Linux/Solaris/BSD]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Processing]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2474</guid>
		<description><![CDATA[Introducción. Processing es en muy pocas palabras un lenguaje multiplataforma (Linux, MacOS y Windows) basado en Java muy interesante que permite desarrollar rápida y fácilmente pequeñas aplicaciones (o sketches) que incluso personas con pocos conocimientos en desarrollo de software pueden implementar. Por ahora mi experiencia con el lenguaje es muy limitada, sin embargo después de [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p><a href="http://processing.org/" target="_blank">Processing</a> es en muy pocas palabras un lenguaje multiplataforma (Linux, MacOS y Windows) basado en Java muy interesante que permite desarrollar rápida y fácilmente pequeñas aplicaciones (o <em>sketches</em>) que incluso personas con pocos conocimientos en desarrollo de software pueden implementar.</p>
<p>Por ahora mi experiencia con el lenguaje es muy limitada, sin embargo después de <a href="http://blog.jorgeivanmeza.com/2010/05/instalar-processing-en-linux-ubuntu-10-04/" target="_blank">instalarlo</a> he estado un poco con él.  Para esto decidí hacer un <em>sketch</em> muy sencillo en el que se controla mediante el teclado una base que tiene como misión recoger <em>las cosas que caen</em>.</p>
<h2><em>Sketch</em>.</h2>
<div id="attachment_2475" class="wp-caption aligncenter" style="width: 821px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2010/06/TheFallingThings_Demo1.png"><img class="size-full wp-image-2475" title="TheFallingThings_Demo1" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2010/06/TheFallingThings_Demo1.png" alt="" width="811" height="633" /></a><p class="wp-caption-text">The Falling Things, versión 0.1</p></div>
<h2>Enlaces.</h2>
<ul>
<li>Demostración (Java Applet).<br />
<a href="http://demo.jorgeivanmeza.com/Processing/FallingThings/0.1/applet/" target="_blank">http://demo.jorgeivanmeza.com/Processing/FallingThings/0.1/applet/</a></li>
<li>Código fuente.<br />
<a href="http://demo.jorgeivanmeza.com/Processing/FallingThings/0.1/" target="_blank">http://demo.jorgeivanmeza.com/Processing/FallingThings/0.1/</a></li>
<li>Processing.<br />
<a href="http://processing.org/" target="_blank">http://processing.org/</a></li>
<li>Instalar Processing en Linux Ubuntu 10.04.<br />
<a href="http://blog.jorgeivanmeza.com/2010/05/instalar-processing-en-linux-ubuntu-10-04/" target="_blank">http://blog.jorgeivanmeza.com/2010/05/instalar-processing-en-linux-ubuntu-10-04/</a><a href="http://processing.org/"></a><a href="http://demo.jorgeivanmeza.com/Processing/FallingThings/0.1/"></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/06/the-falling-things-jugando-con-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reemplazar OpenJDK con SunJDK en Ubuntu 10.04 debido a problemas con Processing</title>
		<link>http://blog.jorgeivanmeza.com/2010/05/reemplazar-openjdk-con-sunjdk-en-ubuntu-10-04-debido-a-problemas-con-processing/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=reemplazar-openjdk-con-sunjdk-en-ubuntu-10-04-debido-a-problemas-con-processing</link>
		<comments>http://blog.jorgeivanmeza.com/2010/05/reemplazar-openjdk-con-sunjdk-en-ubuntu-10-04-debido-a-problemas-con-processing/#comments</comments>
		<pubDate>Tue, 18 May 2010 16:44:13 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Linux/Solaris/BSD]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenJDK]]></category>
		<category><![CDATA[Processing]]></category>
		<category><![CDATA[SunJDK]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2443</guid>
		<description><![CDATA[Introducción. Este fin de semana estuve haciendo unas pruebas realmente sencillas en Processing 1.1 en mi portátil que utiliza GNU/Linux Ubuntu 10.04.  Previamente le había instalado OpenJDK sin embargo empecé a obtener comportamientos extraños durante las pruebas como el hecho de reiniciarse el sistema de ventanas frecuentemente. Debido a que mis programas en Processing eran [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>Este fin de semana estuve haciendo unas pruebas realmente sencillas en <a href="http://processing.org/" target="_blank">Processing</a> 1.1 en mi portátil que utiliza GNU/Linux Ubuntu 10.04.  Previamente le había instalado <a href="http://openjdk.java.net/" target="_blank">OpenJDK</a> sin embargo empecé a obtener comportamientos extraños durante las pruebas como el hecho de reiniciarse el sistema de ventanas frecuentemente.</p>
<p>Debido a que mis programas en Processing eran muy sencillos no tenía sentido que fueran estos, mas aún sabiendo que se terminan ejecutando en la Máquina Virtual de Java  y por ende no debería haber motivos para que interfirieran con otros programas externos.  Terminé dudando de la implementación de la máquina virtual que estaba utilizando.</p>
<p>A continuación se detalla el procedimiento para desinstalar OpenJDK e instalar SunJDK (ú Oracle) con el cual se solucionaron los extraños problemas que estaba obteniendo.</p>
<h2>Procedimiento.</h2>
<p>Agregar el repositorio donde están los paquetes del SunJDK.</p>
<p><span style="font-family: &amp;quot;Courier 10 Pitch [bitstream]&amp;quot;, &amp;quot;courier&amp;quot;;"><span style="font-family: &quot;Courier 10 Pitch [bitstream]&quot;, &quot;courier&quot;;">$ sudo add-apt-repository &#8220;deb http://archive.canonical.com/ lucid partner&#8221;</span></span></p>
<p>Actualizar la base de datos del <em>aptitude</em>.</p>
<p><span style="font-family: &amp;quot;Courier 10 Pitch [bitstream]&amp;quot;, &amp;quot;courier&amp;quot;;"><span style="font-family: &quot;Courier 10 Pitch [bitstream]&quot;, &quot;courier&quot;;">$ sudo aptitude update</span></span></p>
<p>Remover los paquetes del OpenJDK.</p>
<p><span style="font-family: &amp;quot;Courier 10 Pitch [bitstream]&amp;quot;, &amp;quot;courier&amp;quot;;"><span style="font-family: &quot;Courier 10 Pitch [bitstream]&quot;, &quot;courier&quot;;">$ sudo aptitude remove --purge openjdk-6-jre</span></span></p>
<p><span style="font-family: &quot;Courier 10 Pitch [bitstream]&quot;, &quot;courier&quot;;"> </span></p>
<p><span style="font-family: &amp;quot;Courier 10 Pitch [bitstream]&amp;quot;, &amp;quot;courier&amp;quot;;"><span style="font-family: &quot;Courier 10 Pitch [bitstream]&quot;, &quot;courier&quot;;">$ sudo aptitude remove openjdk-6-doc openjdk-6-jre-headless openjdk-6-jre-lib</span></span></p>
<p>Instalar los paquetes del SunJDK.</p>
<p><span style="font-family: &amp;quot;Courier 10 Pitch [bitstream]&amp;quot;, &amp;quot;courier&amp;quot;;"><span style="font-family: &quot;Courier 10 Pitch [bitstream]&quot;, &quot;courier&quot;;">$ sudo aptitude install sun-java6-jre sun-java6-plugin sun-java6-fonts</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/05/reemplazar-openjdk-con-sunjdk-en-ubuntu-10-04-debido-a-problemas-con-processing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalar Processing en Linux Ubuntu 10.04</title>
		<link>http://blog.jorgeivanmeza.com/2010/05/instalar-processing-en-linux-ubuntu-10-04/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=instalar-processing-en-linux-ubuntu-10-04</link>
		<comments>http://blog.jorgeivanmeza.com/2010/05/instalar-processing-en-linux-ubuntu-10-04/#comments</comments>
		<pubDate>Fri, 14 May 2010 14:26:51 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Linux/Solaris/BSD]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDK]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Processing]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2437</guid>
		<description><![CDATA[Introducción. Processing es un lenguaje y un ambiente de desarrollo opensource diseñado para quienes trabajan con imágenes, animaciones e interacción.  Es utilizado por estudiantes, artistas, diseñadores, investigadores y entusiastas para aprendizaje, creación de prototipos y producción.  Fue creado inicialmente para la enseñanza de los fundamentos de la programación de computadores en un contexto visual, para [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>Processing es un lenguaje y un ambiente de desarrollo <em>opensource</em> diseñado para quienes trabajan con imágenes, animaciones e interacción.  Es utilizado por estudiantes, artistas, diseñadores, investigadores y entusiastas para aprendizaje, creación de prototipos y producción.  Fue creado inicialmente para la enseñanza de los fundamentos de la programación de computadores en un contexto visual, para servir como software para la creación de gráficos (<em>sketches</em>) y como una herramienta de producción profesional.</p>
<p>Es libre de descargar y se encuentra disponible para GNU/Linux, Mac OS X y Windows.</p>
<p>El proyecto fue iniciado por <a href="http://benfry.com/">Ben Fry</a> y <a href="http://reas.com/">Casey Reas</a> y ha evolucionado a partir de las ideas exploradas en el grupo de Aesthetics &amp; Computation del MIT Media Lab.</p>
<p style="text-align: right;">Tomado de <a href="http://processing.org/" target="_blank">http://processing.org/</a>.</p>
<h2>Instalación.</h2>
<h3>Requisitos previos.</h3>
<p>Processing se fundamenta en Java, tanto su ambiente de desarrollo como su compilador e intérprete (el cual es finalmente la JVM).  A pesar de que incluye su propia distribución del <em>Java Runtime Edition</em> considero ventajoso el tener instalado previamente el <em>Java Development Kit</em>, ya sea el oficial de Oracle o el de OpenJDK.</p>
<p>Las instrucciones para hacer esto se pueden encontrar en el siguiente enlace.</p>
<ul>
<li><a href="http://www.marlonj.com/blog/2010/05/instalacion-java-en-ubuntu-10-04/" target="_blank">Instalación de Java en Ubuntu 10.04</a>.</li>
</ul>
<h3>Instalación estándar.</h3>
<p>Esta instalación es útil en cualquier distribución de Linux ya que se basa en la distribución TGZ de Processing.</p>
<p>El primer paso es descargar la distribución mas reciente del lenguaje, en este caso la versión 1.1.</p>
<p><span style="font-family: courier new,courier;">$ wget http://processing.org/download/processing-1.1.tgz</span></p>
<p>Verifique cual es la última versión disponible en la <a href="http://processing.org/download/" target="_blank">página de descargas</a>.</p>
<p>Se crea un directorio para almacenar el software y se translada allí.</p>
<p><span style="font-family: courier new,courier;">$ sudo mkdir -p /usr/local/processing</span></p>
<p><span style="font-family: courier new,courier;">$ sudo mv processing-1.1.tgz /usr/local/processing</span></p>
<p><span style="font-family: courier new,courier;">$ cd /usr/local/processing</span></p>
<p>Se descomprime el paquete recién descargado con la distribución del lenguaje.</p>
<p><span style="font-family: courier new,courier;">$ sudo tar zxvf processing-1.1.tgz</span></p>
<p>Se renombra apropiadamente para permitir la coexistencia de varias versiones de ser necesario.</p>
<p><span style="font-family: courier new,courier;">$ sudo mv processing-1.1 1.1</span></p>
<p>Se verifican los permisos de ejecución del ambiente de desarrollo.</p>
<p><span style="font-family: courier new,courier;">$ sudo chmod +x /usr/local/processing/1.1/processing</span></p>
<p>Para ejecutar el ambiente de desarrollo y empezar a programar con Processing es necesario invocarlo desde la línea de comando o crear un acceso directo (lanzador) a él.</p>
<p><span style="font-family: courier new,courier;">$ /usr/local/processing/1.1/processing</span></p>
<h3>Instalación para Ubuntu.</h3>
<p>Los sistemas operativos herederos de Debian, como Ubuntu, pueden realizar la instalación del lenguaje de una manera resumida.</p>
<p>Descargar la última versión disponible en formato DEB de la siguiente ubicación.</p>
<ul>
<li><a href="http://demo.jorgeivanmeza.com/Processing/distribuciones/" target="_blank">Processing / Distribuciones.</a></li>
</ul>
<p>Realice la instalación del paquete recién descargado.</p>
<p><span style="font-family: courier new,courier;">$ sudo dpkg -i processing_1.1-1_all.deb</span></p>
<p>Los pasos descritos en la sección anterior serán automáticamente implementados y además se creará un ícono en el menú de GNOME bajo la sección de <em>Programming</em>.</p>
<h2>Enlaces.</h2>
<ul>
<li>Processing.<br />
<a href="http://processing.org/" target="_blank">http://processing.org/</a></li>
<li>Oracle Java SE Downloads.<br />
<a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank">http://java.sun.com/javase/downloads/index.jsp</a></li>
<li>OpenJDK.<br />
<a href="http://openjdk.java.net/" target="_blank">http://openjdk.java.net/</a></li>
<li>Instalación de Java en Ubuntu 10.04.<br />
<a href="http://www.marlonj.com/blog/2010/05/instalacion-java-en-ubuntu-10-04/" target="_blank">http://www.marlonj.com/blog/2010/05/instalacion-java-en-ubuntu-10-04/</a></li>
<li>Paquetes DEB de Processing.<br />
<a href="http://demo.jorgeivanmeza.com/Processing/distribuciones/" target="_blank">http://demo.jorgeivanmeza.com/Processing/distribuciones/</a></li>
</ul>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 190px; width: 1px; height: 1px; overflow: hidden;">tar zxvf processing-1.1.tgz</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/05/instalar-processing-en-linux-ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Te da tu software suficiente libertad ?</title>
		<link>http://blog.jorgeivanmeza.com/2010/03/te-da-tu-software-suficiente-libertad/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=te-da-tu-software-suficiente-libertad</link>
		<comments>http://blog.jorgeivanmeza.com/2010/03/te-da-tu-software-suficiente-libertad/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 22:46:39 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software Libre]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2420</guid>
		<description><![CDATA[Introducción. La libertad del software hace referencia a lo que puedes hacer con él (free speech) y no precisamente al valor económico de este en el mercado (free beer).  La GNU, desarrolladora del sistema operativo GNU/Linux, nos habla de los derechos que deberíamos tener sobre el software (y de manera extensible para otros tipos de [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>La libertad del software hace referencia a lo que puedes hacer con él (<em>free speech</em>) y no precisamente al valor económico de este en el mercado (<em>free beer</em>).  La <a href="http://www.gnu.org/" target="_blank">GNU</a>, desarrolladora del sistema operativo <a href="http://www.gnu.org/gnu/linux-and-gnu.html" target="_blank">GNU/Linux</a>, nos habla de los derechos que <em>deberíamos</em> tener sobre el software (y de manera extensible para otros tipos de contenido) para que estos sean de real provecho y utilidad para la humanidad, facilitando el desarrollo de nuevos contenidos e innovación.</p>
<p>Esto es en pocas palabras lo que diferencia al software propietario o no libre del software libre (<em>free software</em>).  El núcleo de todo se fundamenta en el acceso al código, en lo que coinciden con el movimiento de código abierto (<em>open source</em>), pero adicionan además todo un sustento filosófico que propende por los derechos del usuario y la libertad para utilizar y manipular el software según sus propias necesidades, evitando las restricciones innecesarias y autoimpuestas de otros tipos de licenciamiento que van en detrimento del propio usuario y sólo favorecen al <em>editor</em> que en muchos casos se lucra de manera desmedida al mantener atado al usuario con restricciones poco éticas.</p>
<p>En el contexto en el que nos encontramos, sociedad y época, es muy posible que fácilmente encontremos argumentos para dar soporte a los licenciamientos <em>no libres</em> y encontremos un tanto utópico al software libre y a todo lo que este movimiento ideológico incluye, sin embargo los temas son profundos, tanto de ancho como de altos, así que es importante para todos, especialmente para quienes desarrollamos software -o incluso conocimiento-, estudiar un poco mas del tema para forjarnos una idea real de estas tendencias y apartarnos de las ideas impuestas por otros que recibimos a diario a través del mercadeo en los medios.</p>
<p>Si encuentra <em>sensato</em> que usted no esté en capacidad legal de compartir el software con sus familiares, amigos o colaboradores, lo invito a que considere cual es el orígen real de estas restricciones legales ?  Para proteger a quién fueron diseñadas ?  En la época actual surten realmente ese efecto ?  Las tecnologías digitales -incluyendo a Internet- deben adaptarse a esas normas o deberían las normas adaptarse a la actualidad en la que vivimos ?  En qué medida <em>deberíamos</em> ceder nuestros derechos de utilizar, manipular y adaptar <em>nuestras</em> cosas según <em>nuestras</em> necesidades ?</p>
<p>Es posible que muchos consideren que el licenciamiento actual es el idóneo ya que los <em>desarrolladores</em> deben vivir de algo y el desarrollar aplicaciones es su trabajo, de esta manera el licenciamiento está protegiendo a los <em>desarrolladores</em> de que otros se roben sus logros y se lucren de ellos.  Sería muy interesante investigar si son realmente los <em>desarrolladores</em> (léase las personsa que realizan el análisis, diseño e implementación) del software quienes reciben -al menos la mayor parte- de la remuneración o si hay toda una cadena de intermediarios (realmente necesarios ?) que toman su tajada también.  Esta inquietud puede ser trasladada a otros contextos similares como la composición de música, la elaboración de películas o la escritura de libros.</p>
<p>Considere también la posibilidad de que <em>pasaría</em> si estas normativas de licenciamiento <em>idóneas</em> aumentan su cobertura limitando aún mas sus derechos con el contenido o producto ?  Compraría usted un libro qué sólo pudiera leer en la sala de su casa ?  Qué solo pudiera leer usted y no pudiera compartirlo con sus familiares o vecinos ?  Compraría usted un libro que sólo se pudiera leer una determinada cantidad de veces ?  Qué no pudiera citar o basarse en él para sus propios escritos, para generar nuevo conocimiento ?  Si sus respuestas son negativas, tal vez no quiera saber de las nuevas tecnologías para la gestión de <em>derechos</em> electrónicos que se están intentando desarrollar en este momento.</p>
<p>Este es un tema muy interesante y muy denso que la mayoría conocemos o hemos meditado con una mínima profundidad y vale la pena investigar mas al respecto.  Como mencioné anteriormente probablemente nos sea mas fácil <em>entender</em> el punto de vista que nos han vendido diariamente y el propuesto por GNU nos suene un tanto idealista y utópico.  Puede que así sean las cosas ... o puede que no.  Lo realmente importante es que todos debemos tomar decisiones drásticas al respecto y que estas deben beneficiar a todos -la humanidad- mediante el apoyo para la generación de nuevos contenidos e innovación y no limitarse a beneficiar lucrativamente a pocos que bien pueden estar montando un negocio a costa de la pérdida de nuestras libertades.</p>
<p>Para tomar decisiones inteligentes es necesario conocer mas ambos puntos de vista.  El <em>no libre</em> es bastante mas conocido ya que lo respiramos practicamente a diario en todos los ámbitos de la vida cotidiana, mientras que el <em>libre</em> suena mas esotérico y nebuloso.  A quien esté interesado en aprender un poco mas de la filosofía del software libre lo invito a leer el libro &#8220;Software libre para una sociedad libre&#8221;, escrito por Richard Stallman precursor de este movimiento.  En el libro el autor explica los comienzos y los conceptos que lo llevaron a iniciar esta cruzada en pos de los derechos de los usuarios y desarrolladores de software e incluye varios capítulos en los que se analizan de manera inteligente muchos de los supuestos que hacemos con respecto a las políticas de licenciamiento que estamos acostumbrados.  Tal y como podría suponerse, el libro es de distribución libre y puede descargarse del sitio web de GNU (ver enlaces).</p>
<h2>Entonces, qué es el software libre ?</h2>
<p>Como se mencionó inicialmente al hablar de software libre (<em>free software</em>) se habla de libertad, de lo que se me está permitido hacer con el software mas no necesariamente de precio.  Nosotros no tenemos la confusión semántica que se tiene en el idioma inglés en el cual la misma palabra (<em>free</em>) tiene ambas connotaciones libre y gratis.  De paso es bueno mencionarlo, el software libre no es necesariamente gratis, yo puedo contratar (pagándole obviamente) a un desarrollador para que implemente una aplicación y después publicarla como software libre, quienes la obtengan después recibirán todos los derechos que esto incluye.</p>
<p>Esto lo menciono porque es importante desligar las dos palabras gratis y libre del <em>free software</em>.  También es posible cobrar una <em>módica</em> cuota por distribuír el software libre, por hacerle mejoras específicas que a su vez se convertirán en libres también y por capacitaciones, asesorías y soporte.  Como se dijo anteriormente, los desarrolladores también necesitan de que vivir y esta filosofía no es ajena a eso.</p>
<p>En rigor un software es <em>libre</em> cuando su licenciamiento le garantiza al usuario las siguientes libertades.</p>
<ol></ol>
<ol>
<li>La libertad para ejecutar el programa sea cual sea nuestro propósito.</li>
<li>La libertad para estudiar el funcionamiento del programa y adaptarlo a tus necesidades —el acceso al código fuente es condición indispensable para esto.</li>
<li>La libertad para redistribuir copias y ayudar así a tu vecino.</li>
<li>La libertad para mejorar el programa y luego publicarlo para el bien de toda la comunidad —el acceso al código fuente es condición indispensable para esto.</li>
</ol>
<ol></ol>
<h2>Enlaces.</h2>
<ul>
<li>Definición de software libre de GNU.<br />
<a href="http://www.gnu.org/philosophy/free-sw.es.html" target="_blank">http://www.gnu.org/philosophy/free-sw.es.html</a></li>
<li>Software libre según Wikipedia.<br />
<a href="http://es.wikipedia.org/wiki/Software_libre" target="_blank">http://es.wikipedia.org/wiki/Software_libre</a></li>
<li>Tipos de licencias GNU para el software libre.<br />
<a href="http://www.gnu.org/licenses/licenses.es.html" target="_blank">http://www.gnu.org/licenses/licenses.es.html</a></li>
<li>Software libre para una sociedad libre [libro].<br />
<a href="http://www.gnu.org/philosophy/fsfs/free_software.es.pdf" target="_blank">http://www.gnu.org/philosophy/fsfs/free_software.es.pdf</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/03/te-da-tu-software-suficiente-libertad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los controladores en Yii</title>
		<link>http://blog.jorgeivanmeza.com/2010/01/los-controladores-en-yii-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=los-controladores-en-yii-2</link>
		<comments>http://blog.jorgeivanmeza.com/2010/01/los-controladores-en-yii-2/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 05:45:56 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Yii]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2262</guid>
		<description><![CDATA[Introducción. Estos se ubican entre el usuario y la aplicación.  Su función es la de controlar la comunicación entre los modelos y la vistas según la solicitud (requerimiento) que ha hecho usuario. Su clase base es CController y en ellos se implementan Acciones (definen la lógica de la aplicación) y Filtros (establecen validaciones o controles [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>Estos se ubican entre el usuario y la aplicación.  Su función es la de controlar la comunicación entre los modelos y la vistas según la solicitud (requerimiento) que ha hecho usuario.</p>
<p>Su clase base es <span style="font-family: courier new,courier;">CController</span> y en ellos se implementan <strong>Acciones</strong> (definen la lógica de la aplicación) y <strong>Filtros</strong> (establecen validaciones o controles antes y después de la ejecución de las acciones).</p>
<p>El usuario invoca indirectamente a los controladores especificando un <strong>ruta</strong> a través del controlador frontal o <span style="font-family: courier new,courier;">Application</span>.</p>
<h2>La ruta del requerimiento.</h2>
<p>El URL solicitado determina que controlador y que acción se van a ejecutar para resolver el requerimiento del usuario.</p>
<p>Los URL tienen el siguiente formato.</p>
<p style="padding-left: 30px;">Sin <em>URL limpias</em> (por defecto).</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">http://servidor/index.php?r=ControladorId/AcciónId</span></p>
<p style="padding-left: 30px;">Con <em>URL limpias</em>.</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">http://servidor/ControladorId/AcciónId</span></p>
<p style="padding-left: 30px;">Si se utilizan módulos (y <em>URL limpias</em> para este ejemplo).</p>
<p style="padding-left: 30px;"><span style="font-family: courier new,courier;">http://servidor/MóduloId/ControladorId/AcciónId</span></p>
<ul>
<li>El archivo fuente del controlador se ubica en <span style="font-family: courier new,courier;">protected/controllers/<strong>ControladorId</strong>Controller.php</span>.</li>
<li>El nombre de la clase allí contenida deberá ser <span style="font-family: courier new,courier;"><strong>ControladorId</strong>Controller</span>.</li>
<li>Se invoca a la acción (ver mas adelante) <span style="font-family: courier new,courier;">AcciónId</span>.  En caso de no haberse especificado una se considera la acción por defecto del controlador, comúnmente <span style="font-family: courier new,courier;">index</span>.</li>
</ul>
<h2>Las acciones.</h2>
<p>Pueden implementarse de dos maneras.</p>
<ul>
<li>Como métodos del mismo controlador.</li>
<li>Como clases que heredan de <span style="font-family: courier new,courier;">CAction</span>.</li>
</ul>
<h3>Acciones implementadas como métodos del controlador.</h3>
<ul>
<li>El nombre del método deberá ser <span style="font-family: courier new,courier;">action<strong>AcciónId</strong></span>.</li>
</ul>
<p>En el siguiente ejemplo se muestra al controlador <span style="font-family: courier new,courier;">User</span> que implementa la acción <span style="font-family: courier new,courier;">add</span> como un método suyo.</p>
<pre class="php">class UserController extends CController
{
    public function actionAdd()
    {
        // Implementación ...
    }
}</pre>
<h3>Acciones implementadas como clases independientes.</h3>
<ul>
<li>Los objetos acción heredan de <span style="font-family: courier new,courier;">CAction</span>.</li>
<li>El nombre de la clase es <span style="font-family: courier new,courier;"><strong>AcciónId</strong>Action</span> (por convención, no es obligatorio).</li>
<li>Se almacena en un archivo bajo la ruta <span style="font-family: courier new,courier;">protected/controllers/<strong>controladorId</strong>/<strong>AcciónId</strong>Action.php.</span></li>
<li>Su ubicación puede referenciarse mediante alias de esta manera: <span style="font-family: courier new,courier;">application.controllers.<strong>controladorId</strong>.<strong>AcciónId</strong>Action</span>.</li>
<li>Es obligatorio sobreescribir el método <span style="font-family: courier new,courier;">run()</span> de la acción para definir allí su implementación.</li>
</ul>
<p>En el siguiente código se muestra la acción <span style="font-family: courier new,courier;">remove</span> del controlador <span style="font-family: courier new,courier;">User</span> implementada como una clase independiente.</p>
<pre class="php">class RemoveAction extends CAction
{
    public function run()
    {
        // Implementación ...
    }
}</pre>
<p>Esta clase se almacena entonces en el archivo <span style="font-family: courier new,courier;">protected/controllers/user/RemoveAction.php</span>.</p>
<p>Como paso final de su implementación, es necesario indicarle al controlador de la existencia de la acción.  Para hacer esto es necesario sobreescribir el método <span style="font-family: courier new,courier;">actions</span> del controlador de la siguiente manera.</p>
<pre class="php">class UserController extends CController
{
   public function actions()
   {
       return array(
           'remove' =&gt; 'application.controllers.user.RemoveAction'
       );
   }
}</pre>
<h2>Los filtros.</h2>
<ul>
<li>Permiten realizar verificaciones y validaciones antes y después de la ejecución de las acciones.</li>
<li>Una acción puede tener asociados múltiples filtros.</li>
<li>Los filtros se ejecutan en el orden en que fueron especificados.</li>
<li>Un filtro puede abortar la ejecución de los demás filtros y de la acción misma.</li>
<li>De manera análoga a las acciones, los filtros pueden implementarse de dos maneras también.
<ul>
<li>Como métodos del mismo controlador.</li>
<li>Como clases que heredan de <span style="font-family: courier new,courier;">CFilter</span>.</li>
</ul>
</li>
</ul>
<h3>Filtros implementados como métodos del controlador.</h3>
<ul>
<li>El nombre del método debe empezar por la palabra <span style="font-family: courier new,courier;">filter</span>.</li>
<li>Deberá recibir como parámetro a <span style="font-family: courier new,courier;">$filterChain</span>.</li>
</ul>
<p>En el siguiente ejemplo se muestra al controlador <span style="font-family: courier new,courier;">User</span> que implementa al filtro <span style="font-family: courier new,courier;">checkUser</span> como un método suyo.</p>
<pre class='php'>class UserController extends CController
{
    public function filterCheckUser($filterChain)
    {
        // Implementación ... invocar $filterChain -&gt; run()
        // para continuar con el próximo filtro
    }
}</pre>
<h3>Filtros implementados como clases independientes.</h3>
<ul>
<li>Los objetos acción heredan de <span style="font-family: courier new,courier;">CFilter</span>.</li>
<li>El nombre de la clase es <span style="font-family: courier new,courier;"><strong>FiltroId</strong>Filter</span> (por convención, no es obligatorio).</li>
<li>Se almacena en un archivo bajo la ruta <span style="font-family: courier new,courier;">protected/filters/<strong>FiltroId</strong>Filter.php</span>.</li>
<li>Su ubicación puede referenciarse mediante alias de esta manera: <span style="font-family: courier new,courier;">application.filters.<strong>FiltroId</strong>Filter</span>.</li>
<li>Es obligatorio sobreescribir los métodos <span style="font-family: courier new,courier;">preFilter($filterChain)</span> y <span style="font-family: courier new,courier;">postFilter($filterChain)</span> del filtro para definir que hacer antes y después de ejecutar la acción.</li>
</ul>
<p>En el siguiente código se muestra al filtro <span style="font-family: courier new,courier;">isValid</span> del controlador <span style="font-family: courier new,courier;">User</span> implementado como una clase independiente.</p>
<pre class='php'>class IsValidFilter extends CFilter
{
    public $admin;
    public function preFilter($filterChain)
    {
        // Se aplica antes de ejecutarse la acción.
        // Si retorna true continúa el proceso, false lo
        // aborta y no se ejecuta la acción solicitada.
        return $exito;
    }
    public function postFilter($filterChain)
    {
        // Se aplica después de ejecutarse la acción.
    }
}</pre>
<p>Esta clase se almacena entonces en el archivo <span style="font-family: courier new,courier;">protected/filters/IsValidFilter.php</span>.</p>
<p>Como paso final de su implementación, es necesario indicarle al controlador de la existencia del filtro y determinar su alcance sobre las acciones del mismo.  Para hacer esto es necesario sobreescribir el método <span style="font-family: courier new,courier;">filters</span> del controlador de la siguiente manera.</p>
<pre class='php'>class UserController extends CController
{
   public function filters()
   {
       return array(
           'checkUser + add, remove',
           array(
               'application.filters.IsValidFilter - add, remove',
               'admin' =&gt; false
           )
       );
   }
}</pre>
<ul>
<li><span style="font-family: courier new,courier;">checkUser</span> es un filtro basado en un método del controlador.</li>
<li><span style="font-family: courier new,courier;">isValid</span> es un filtro basado en una clase externa.</li>
<li>Es posible especificar los filtros con una notación de arreglo para determinar valores específicos para los atributos del filtro.</li>
</ul>
<p>Los operadores <span style="font-family: courier new,courier;">+</span> y <span style="font-family: courier new,courier;">-</span> actúan como determinadores del alcance de los filtros sobre las acciones especificadas de la siguiente manera.</p>
<ul>
<li><span style="font-family: courier new,courier;">+</span> determina exactamente a cuales acciones se les debe aplicar el filtro.  De esta manera, el filtro <span style="font-family: courier new,courier;">checkUser</span> se aplicará a las acciones <span style="font-family: courier new,courier;">add</span> y <span style="font-family: courier new,courier;">remove</span> únicamente.</li>
<li><span style="font-family: courier new,courier;">-</span> determina a cuales acciones NO se les debe aplicar el filtro.  Así, el filtro <span style="font-family: courier new,courier;">isValid</span> se aplicará a todas las acciones EXCEPTO a <span style="font-family: courier new,courier;">add</span> y <span style="font-family: courier new,courier;">remove</span>.</li>
<li>Si no se especifica ninguno de los dos modificadores, el filtro aplicará a todas las acciones del controlador.</li>
</ul>
<h2>Enlaces.</h2>
<ul>
<li>Yii Documentation: controllers.<br />
<a href="http://www.yiiframework.com/doc/guide/basics.controller" target="_blank">http://www.yiiframework.com/doc/guide/basics.controller</a></li>
<li>Yii PHP Framwork.<br />
<a href="http://www.yiiframework.com/" target="_blank">http://www.yiiframework.com/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/01/los-controladores-en-yii-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redefinir una función en Javascript</title>
		<link>http://blog.jorgeivanmeza.com/2009/12/redefinir-una-funcion-en-javascript/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=redefinir-una-funcion-en-javascript</link>
		<comments>http://blog.jorgeivanmeza.com/2009/12/redefinir-una-funcion-en-javascript/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 18:14:45 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2190</guid>
		<description><![CDATA[Introducción. Estaba reutilizando un formulario complejo en un nuevo módulo de mi aplicación.  Todo iba bien hasta que descubrí que uno de los códigos Javascript que actualiza parte del formulario a través de AJAX no me era útil ya que debía mostrar una vista diferente a la estándar.   Como el código estaba escrito en funciones [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>Estaba <em>reutilizando</em> un formulario complejo en un nuevo módulo de mi aplicación.  Todo iba bien hasta que descubrí que uno de los códigos Javascript que actualiza parte del formulario a través de AJAX no me era útil ya que debía mostrar una vista diferente a la <em>estándar</em>.   Como el código estaba escrito en funciones procedimentales no podía acceder a la sobreescritura de la orientación a objetos, sin embargo encontré un par de detalles interesantes de Javascript que me permitieron hacer algo similar.</p>
<h2>Determinar existencia de funciones.</h2>
<pre class="javascript">if(typeof miFuncion == 'function')
    // Si existe la función
else
    // No existe la función</pre>
<p>El código anterior determina si la función <span style="font-family: courier new,courier;">miFuncion</span> ha sido definida o no en el espacio de ejecución de la aplicación Javascript.</p>
<h2>Redefinir una función.</h2>
<pre class="javascript">window['miFuncion'] = function()
{
    // Nueva implementación de la función
};</pre>
<p>El código anterior permite redefinir la implementación de la función <span style="font-family: courier new,courier;">miFuncion</span> la cual obviamente fue especificada anteriormente.  Lo interesante de esta sintáxis de Javascript es que esta redefinición puede realizarse de manera dinámica, es decir, en un segundo archivo <span style="font-family: courier new,courier;">*.js</span> que se cargue después del original o inclusive dentro de un condicional.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2009/12/redefinir-una-funcion-en-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hacer algo cuando inicia o termina el evento AJAX con Prototype</title>
		<link>http://blog.jorgeivanmeza.com/2009/11/hacer-algo-cuando-inicia-o-termina-el-evento-ajax-con-prototype/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=hacer-algo-cuando-inicia-o-termina-el-evento-ajax-con-prototype</link>
		<comments>http://blog.jorgeivanmeza.com/2009/11/hacer-algo-cuando-inicia-o-termina-el-evento-ajax-con-prototype/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 13:46:15 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2152</guid>
		<description><![CDATA[Introducción. De manera análoga a como hace poco había mostrado como manejar el evento de inicio y terminación de AJAX con jQuery para realizar algún tipo de acción específica como el mostrar un indicador de carga, ahora experimentaremos como hacerlo con el framework de Prototype el cual nuevamente estaré utilizando en el proyecto de los [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>De manera análoga a como hace poco había mostrado como <a href="http://blog.jorgeivanmeza.com/2009/10/hacer-algo-cuando-inicia-o-termina-el-evento-ajax-con-jquery/" target="_blank">manejar el evento de inicio y terminación de AJAX con jQuery</a> para realizar algún tipo de acción específica como el mostrar un indicador de carga, ahora experimentaremos como hacerlo con el framework de Prototype el cual nuevamente estaré utilizando en el proyecto de los próximos meses.</p>
<h2>Procedimiento.</h2>
<pre class="javascript">Ajax.Responders.register({
    onCreate: function()
    {
        // An AJAX request has been initialized!
    },
    onComplete: function()
    {
        // An AJAX request has been completed!
    }
});</pre>
<p>Adicionalmente hay otros eventos que pueden manejarse de igual manera <span style="font-family: courier new,courier;">onUninitialized</span>, <span style="font-family: courier new,courier;">onLoading</span>, <span style="font-family: courier new,courier;">onLoaded</span>, <span style="font-family: courier new,courier;">onInteractive</span> y <span style="font-family: courier new,courier;">onException</span>, además de los ya mencionados <span style="font-family: courier new,courier;">onCreate</span> y <span style="font-family: courier new,courier;">onComplete</span>.</p>
<h2>Enlaces.</h2>
<ul>
<li>Prototype API - Ajax Responders.<br />
<a href="http://api.prototypejs.org/ajax/ajax/responders.html" target="_blank">http://api.prototypejs.org/ajax/ajax/responders.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2009/11/hacer-algo-cuando-inicia-o-termina-el-evento-ajax-con-prototype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Víncular los Javadocs con Netbeans</title>
		<link>http://blog.jorgeivanmeza.com/2009/10/vincular-los-javadocs-con-netbeans/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=vincular-los-javadocs-con-netbeans</link>
		<comments>http://blog.jorgeivanmeza.com/2009/10/vincular-los-javadocs-con-netbeans/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 15:59:33 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Linux/Solaris/BSD]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[NetBeans]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2104</guid>
		<description><![CDATA[Introducción. El siguiente procedimiento permite relacionar la documentación oficinal de Java SE (Javadocs) con Netbeans permitiéndole al desarrollador tener una mejor información mas allá de la contextual que provee por defecto el IDE. Configuración. Seleccione el menú Tools &#62; Java Platforms. Seleccione la pestaña Javadoc y presione el botón Add ZIP/Folder. Seleccione el archivo ZIP [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>El siguiente procedimiento permite relacionar la documentación oficinal de Java SE (Javadocs) con Netbeans permitiéndole al desarrollador tener una mejor información mas allá de la contextual que provee por defecto el IDE.</p>
<h2>Configuración.</h2>
<p>Seleccione el menú <strong>Tools</strong> &gt; <strong>Java Platforms</strong>.</p>
<p><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p1.png"><img class="aligncenter size-full wp-image-2112" title="p1" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p1.png" alt="p1" width="872" height="373" /></a></p>
<p>Seleccione la pestaña <strong>Javadoc</strong> y presione el botón <strong>Add ZIP/Folder</strong>.</p>
<p><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p2.png"><img class="aligncenter size-full wp-image-2106" title="p2" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p2.png" alt="p2" width="688" height="521" /></a></p>
<p>Seleccione el archivo ZIP o el folder donde se encuentra la documentación de los Javadoc en el equipo.</p>
<p><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p3.png"><img class="aligncenter size-full wp-image-2107" title="p3" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p3.png" alt="p3" width="589" height="354" /></a></p>
<p>Presione el botón <strong>Close</strong> para terminar la configuración.</p>
<h2>Uso.</h2>
<p>En el editor de código fuente seleccione la clase que desea consultar en los Javadocs y presione <strong>ALT+F1</strong> o haga clic derecho y elija la opción <strong>Show Javadoc </strong>del menú contextual.</p>
<p><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p4.png"><img class="aligncenter size-full wp-image-2109" title="p4" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p4.png" alt="p4" width="696" height="381" /></a></p>
<p>Netbeans abrirá la documentación correspondiente a la clase solicitada en el navegador web disponible.</p>
<p><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p5.png"><img class="aligncenter size-large wp-image-2110" title="p5" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/p5-1024x603.png" alt="p5" width="753" height="443" /></a></p>
<h2>Enlaces.</h2>
<ul>
<li>Java SE Downloads.<br />
<a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank">http://java.sun.com/javase/downloads/index.jsp</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2009/10/vincular-los-javadocs-con-netbeans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejemplo de AJAX rápido y simple con PHP y jQuery</title>
		<link>http://blog.jorgeivanmeza.com/2009/10/ejemplo-de-ajax-rapido-y-simple-con-php-y-jquery/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ejemplo-de-ajax-rapido-y-simple-con-php-y-jquery</link>
		<comments>http://blog.jorgeivanmeza.com/2009/10/ejemplo-de-ajax-rapido-y-simple-con-php-y-jquery/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 04:54:32 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=2069</guid>
		<description><![CDATA[Introducción. Muy probablemente usted esté aquí, leyendo este artículo porque desea aprender a utilizar AJAX con PHP de una manera muy simple y rápida.  Yo estoy aquí porque hoy no tengo sueño y que mejor manera de esperarlo que escribir un pequeño tutorial acerca del acceso asíncrono de contenidos web utilizando el framework de jQuery. [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2>
<p>Muy probablemente usted esté aquí, leyendo este artículo porque desea aprender a utilizar AJAX con PHP de una manera muy simple y rápida.  Yo estoy aquí porque hoy no tengo sueño y que mejor manera de esperarlo que escribir un pequeño tutorial acerca del acceso asíncrono de contenidos web utilizando el <em>framework</em> de jQuery.</p>
<p>Para no tener que dividir el artículo en varias entregas vamos a desarrollar un ejemplo muy sencillo y clásico: la calculadora, sólo que a diferencia de la habitual esta realizará sus cálculos del lado del servidor y presentará sus resultados a través de llamados con AJAX.  La implementación Javascript asociada con el objeto AJAX (el objeto <a href="http://es.wikipedia.org/wiki/XMLHttpRequest" target="_blank"><span style="font-family: courier new,courier;">XMLHTTPRequest</span></a>) no la realizaremos directamente sino que utilizaremos el <em>framework</em> de jQuery el cual simplifica y facilita enormemente el desarrollo en Javascript.  El lado del servidor, los cálculos de nuestra calculadora, se implementarán en el viejo y conocido PHP.  Por supuesto para implementar el nivel de presentación (página web) que recibe el cliente tendremos que hablar un poco de HTML y CSS.</p>
<h2>Qué es AJAX ?</h2>
<p>AJAX es el acrónimo de <em>Asynchronous JavaScript and XML</em>, un conjunto de tecnologías web que permiten que las aplicaciones web desde sus clientes se comuniquen y soliciten información al servidor de manera asíncrona sin interferir con el contenido y comportamientos de la página actual, es decir, sin refrescar (<a href="http://en.wikipedia.org/wiki/Postback" target="_blank"><em>postback</em></a>) la página web por completo.</p>
<p>Su implementación se basa en el objeto <a href="http://en.wikipedia.org/wiki/XMLHttpRequest" target="_blank">XMLHttpRequest</a> o XHR el cual fue originalmente desarrollado por Microsoft y apareció por primera vez en 1999 como un control ActiveX de Internet Explorer 5, posteriormente los demás navegadores lo acogieron desarrollando sus propias implementaciones.</p>
<p>En términos generales el uso de AJAX mejora la usabilidad de las páginas permitiendo a los desarrolladores crear aplicaciones que se comportan de manera similar a las aplicaciones de escritorio.  Un ejemplo de esto son los clientes de correo web de última generación (como <a href="http://www.gmail.com/" target="_blank">GMail</a>) y las aplicaciones geográficas (como <a href="http://maps.google.com/" target="_blank">Google Maps</a>).  También tiene sus desventajas como presentar una mayor dificultad para su depuración, control de favoritos e historial y que los buscadores web comúnmente no pueden acceder a sus contenidos para indexarlos.</p>
<p>Consulte mas información acerca de <a href="http://en.wikipedia.org/wiki/AJAX" target="_blank">AJAX en Wikipedia</a>.</p>
<h2>Procedimiento.</h2>
<p>Estos son los pasos generales que realizaremos para implementar nuestra pequeña aplicación.</p>
<ol>
<li>Crear la estructura básica de la página web.</li>
<li>Implementar el formulario de la calculadora.</li>
<li>Mejorar la presentación del formulario.</li>
<li>Implementar la lógica del negocio de la calculadora.</li>
<li>Incluír una referencia a la librería de jQuery en la página web.</li>
<li>Implementar los llamados asíncronos a la lógica del negocio de la calculadora.</li>
</ol>
<h2>La estructura básica de la página.</h2>
<p>El primer paso es crear la estructura básica de la página web que recibirá el usuario.  Esta se puede crear con cualquier editor de texto desde el <em>bloc de notas</em> hasta otro mas elaborado como <em>Dreamweaver</em> o <em>Eclipse PDT</em>.  Lo importante es que sea un editor de archivos planos.  En mi caso estoy probando <a href="http://www.gphpedit.org/" target="_blank">gPHPEdit</a> para Linux el cual se ve hasta ahora simple y conciso.  Para el caso de Windows un editor simple como el <a href="http://notepad-plus.sourceforge.net/" target="_blank">Notepad++</a> servirá.</p>
<p>Creamos entonces el archivo <span style="font-family: courier new,courier;">calculadora.html</span> con el siguiente contenido.</p>
<pre class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
    &lt;head&gt;
       &lt;!-- Documento HTML con carácteres UTF8 --&gt;
       &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" /&gt;
       &lt;title&gt;Calculadora AJAX&lt;/title&gt;
       &lt;!-- Clases CSS internas --&gt;
       &lt;!-- Referencias a Javascripts externos --&gt;
       &lt;!-- Código Javascript interno --&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;!-- Contenido del documento --&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>He incluído algunos <span style="font-family: courier new,courier;">&lt;!--</span> comentarios <span style="font-family: courier new,courier;">--&gt;</span> que nos servirán mas adelante para ubicar donde en el documento se deberán agregar segmentos de código adicionales.  Como se puede apreciar, esperamos ceñirnos al <em>XHTML 1.1 transitional</em>.</p>
<h2>El formulario de la calculadora.</h2>
<p>Este deberá contar con las siguientes partes básicas.</p>
<ol>
<li>Una sección para los mensajes de error (<em>mensaje</em>) de la aplicación.</li>
<li>Un <span style="font-family: courier new,courier;">form</span> (<em>formulario</em>) que representa al formulario en HTML.</li>
<li>Un campo de texto (<em>operando1</em>) para 4 dígitos para que el usuario ingrese al primer operando.</li>
<li>Un campo de selección (<em>operador</em>) para que el usuario elija la operación a efectuarse: suma, resta, multiplicación o división.</li>
<li>Un campo de texto (<em>operando2</em>) para 4 dígitos para que el usuario ingrese al segundo operando.</li>
<li>Un botón (<em>igual</em>) para invocar la operación de los datos.</li>
<li>Una sección (<em>resultado</em>) para mostrar el resultado de la operación.</li>
</ol>
<p>La siguiente es la implementación de esta sección y debe insertarse como el <em>Contenido del documento</em> en la plantilla de la estructura básica de la página web.</p>
<pre class="html">&lt;div id='pagina'&gt;
    &lt;div id='mensaje'&gt;&amp;nbsp;&lt;/div&gt;
    &lt;form id='formulario' action='#' method='post'&gt;
        &lt;input type='text' id='operando1' name='operando1' value='' size='4' maxlength='4' /&gt;
        &lt;select id='operador' name='operador'&gt;
            &lt;option value='SU'&gt;+&lt;/option&gt;
            &lt;option value='RE'&gt;-&lt;/option&gt;
            &lt;option value='MU'&gt;*&lt;/option&gt;
            &lt;option value='DI'&gt;/&lt;/option&gt;
        &lt;/select&gt;
        &lt;input type='text' id='operando2' name='operando2' value='' size='4' maxlength='4' /&gt;
        &lt;input type='button' id='igual' value='=' /&gt;
        &lt;span id='resultado'&gt;&amp;nbsp;&lt;/span&gt;
    &lt;/form&gt;
 &lt;/div&gt;</pre>
<div style="border: 1px dotted #ff0000; margin: auto; padding: 5px; width: 90%;"><span style="color: #ff0000;"><strong>Nota</strong></span>.  El atributo del nombre (<span style="font-family: courier new,courier;">name</span>) es requerido en los campos del formulario que se van a transmitir a través de la invocación asíncrona cuando el formulario es enviado completo como lo vamos a hacer en esta práctica.</div>
<h2>Mejorar la presentación del formulario.</h2>
<p>Este es el producto final de la actualización de la presentación de la página web, es necesario modificar los atributos visuales de cada una de las partes del formulario recién creado.</p>
<div id="attachment_2077" class="wp-caption aligncenter" style="width: 511px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/screenshot_034.png"><img class="size-full wp-image-2077" title="screenshot_034" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2009/10/screenshot_034.png" alt="Interfaz de usuario de la calculadora" width="501" height="136" /></a><p class="wp-caption-text">Interfaz de usuario de la calculadora</p></div>
<p>Las nuevas características se especifican utilizando hojas de estilo (<a href="http://en.wikipedia.org/wiki/CSS" target="_blank">CSS</a>) y se referencian a través de sus identificadores, etiquetas o clases.</p>
<p>El siguiente código CSS realiza las modificaciones propuestas al formulario.  Estas se deben insertar en la sección de <em>Clases CSS Internas</em>.</p>
<pre class="css">&lt;style type="text/css"&gt;
 #pagina                                       /* Envoltura general */
 {
       margin: auto;                           /* Margenes (centrado) */
       width: 600px;                           /* Ancho */
       text-align: center;                     /* Textos internos centrados */
       font-family: "arial, sans-serif";       /* Fuente del texto */
 }
 #mensaje                                      /* Mensaje de error */
 {
       width: 100%;                            /* Ancho */
       margin-top: 20px;                       /* Margen superior */
       margin-bottom: 30px;                    /* Margen inferior */
       color: #ff0e0e;                         /* Color del texto (foreground) */
       font-size: 12px;                        /* Tamaño de la fuente */
 }
 #operando1, #operando2                        /* Campos de texto de los operandos */
 {
       font-size: 25px;                        /* Tamaño de la fuente */
       border-style: groove;                   /* Estilo del borde */
 }
 #operador                                     /* Selector del operador */
 {
       font-size: 25px;                        /* Tamaño de la fuente */
 }
 #igual                                        /* Botón para realizar la operación */
 {
       font-size: 25px;                        /* Tamaño de la fuente */
 }
 #resultado                                    /* Campo de texto donde se despliega el resultado */
 {
       font-size: 25px;                        /* Tamaño de la fuente */
       font-style: italic;                     /* Atributo de fuente itálica o cursiva */
 }
 &lt;/style&gt;</pre>
<h2>La lógica del negocio de la calculadora.</h2>
<p>El hecho de calcular el valor resultante de la operación elegida a partir de los operandos especificados es lo que llamamos la lógica del negocio.  Esta lógica, como se dijo inicialmente, la vamos a implementar en PHP en el archivo <span style="font-family: courier new,courier;">calcular.php</span>.</p>
<p>Los pasos generales que deben realizarse para llevar a cabo exitosamente el cálculo del valor resultante son los siguientes.</p>
<ol>
<li>Obtener la información provista por el usuario: operandos y operador.</li>
<li>Verificar que la información proporcionada por el usuario sea válida.</li>
<li>Realizar la operación indicada con los valores suministrados.</li>
<li>Mostrar el resultado.</li>
</ol>
<p>Como veremos a continuación la implementación de estos pasos es ligeramente mas interesante que su simple mención.</p>
<p>Para iniciar el código PHP, le indicamos al navaegador que la respuesta del <em>script</em> será un texto.  Este paso específico es opcional ya que para PHP este es el tipo de respuesta por defecto.</p>
<pre class="php">&lt;?php
/* Indicar el tipo de contenido que tendrá la respuesta */
header('Content-type: text/html');</pre>
<p>La implementación de las siguientes acciones la vamos a recubrir en un bloque <span style="font-family: courier new,courier;">try</span>/<span style="font-family: courier new,courier;">catch</span> ya que es suceptible de generar errores y consecuentemente, lanzar excepciones.</p>
<p>El siguiente paso es el obtener, intentar sanear y verificar los operandos proporcionados por el usuario desde el formulario HTML.  Los parámetros fueron transmitidos a través del método <em>post</em> y los elementos se diferencian por su identificador.</p>
<pre class="php">try
{
    /* Obtener y sanear los valores de los operadores */
    $operando1 = filter_var($_POST['operando1'], FILTER_SANITIZE_NUMBER_FLOAT);
    $operando2 = filter_var($_POST['operando2'], FILTER_SANITIZE_NUMBER_FLOAT);
    /* Verificar que los valores de los operadores correspondan
       con los tipos esperados */
    if(!filter_var($operando1, FILTER_VALIDATE_FLOAT) ||
       !filter_var($operando1, FILTER_VALIDATE_FLOAT))
           throw new Exception("Operandos inválidos: [{$operando1}] y [{$operando2}]");</pre>
<p>Realizamos una tarea similar con el operador, obtenemos su valor y verificamos que sea válido.</p>
<pre class="php">    /* Obtener el valor del operador */
    $operador = $_POST['operador'];
    /* Verificar que el operador suministrado sea válido */
    if(!in_array($operador, array('SU', 'RE', 'MU', 'DI')))
        throw new Exception ("Operador inválido: [{$operador}]");</pre>
<p>Definimos una variable para almacenar el resultado de la operación solicitada.</p>
<pre class="php">    /* Almacenar resultado, inicialmente desconocido */
    $resultado = 0;</pre>
<p>Realizamos la operacion correspondiente al operador recibido.  Se deben tener en cuenta dos posibles contingencias que pueden suceder: en el caso de la division, el denominador, es decir, el segundo operador no puede ser cero.  El segundo caso que debe tenerse en cuenta es que el operador recibido no corresponda con ninguna de las operaciones conocidas, esto habria sido validado inicialmente al verificar el operador suministrado despues de su recuperacion.</p>
<pre class="php">    /* Realizar la operación solicitada */
    switch($operador)
    {
        case 'SU':    $resultado = $operando1 + $operando2;
        break;
        case 'RE':    $resultado = $operando1 - $operando2;
        break;
        case 'MU':    $resultado = $operando1 * $operando2;
        break;
        case 'DI':    /* Verificar si el denominador es cero,
                         en ese caso, la división no puede realizarse */
                      if ($operando2 == 0)
                          throw new Exception ('División por cero');
                      $resultado = $operando1 / $operando2;
        break;
        default:      /* Si ninguna operación se ejecutó significa
                         que el operador era inválido (segunda verificación) */
                      throw new Exception('Operador desconocido');
        break;
    }
}</pre>
<p>Para terminar la lógica de la calculadora debemos lidiar con los dos posibles resultados.  Si el procesamiento tuvo algún error (se lanzó una excepción durante el proceso) o si su terminación fue exitosa.</p>
<p>En caso de haber sucedido un error este se indica al usuario mediante un mensaje descriptivo y al navegador al enviarle un código 400.</p>
<pre class="php">catch(Exception $e)            /* La operación produjo un error */
{
    /* Indica al navegador la condición de error */
    header("Status: 400 Bad Request", true, 400);
    /* Despliega el mensaje de error para el usuario */
    echo $e -&gt; getMessage();
    exit(1);
}</pre>
<p>En caso de terminar la operación exitosamente, se deberá mostrar al usuario el resultado de la misma e informarle al navegador con un código 200.</p>
<pre class="php">/* La operación se realizó exitosamente */
/* Indica al navegador la condición de éxito */
header("Status: 200 OK", true, 200);
/* Despliega el resultado de la operación para el usuario */
echo number_format($resultado, 4);
exit(0);
?&gt;</pre>
<h2>Incluír la referencia a jQuery.</h2>
<p>En este paso lo que hacemos en incluír a la librería jQuery en nuestro proyecto web para poder utilizarla en nuestros fragmentos de código Javascript.</p>
<p>Para hacer esto se debe agregar la siguiente línea en la sección <em>Referencias de Javascript externos</em>.</p>
<pre class="php">&lt;script src="http://www.google.com/jsapi"&gt;&lt;/script&gt;
&lt;script&gt;google.load("jquery", "1");&lt;/script&gt;</pre>
<p>Este fragmento utiliza <a href="http://code.google.com/apis/ajaxlibs/" target="_blank">Google AJAX Libraries</a> que nos permite incluír los principales <em>frameworks</em> de Javascript en nuestros sitios web sin preocuparnos por su almacenamiento o implementación, en este caso, incluír la distribución estable mas reciente de la rama 1.x.  Obviamente este método requiere que el cliente tenga acceso a Internet además de la aplicación web.</p>
<p>Una forma mas tradicional de hacer lo mismo es el descargar por nuestra propia cuenta la distribución de jQuery desde su <a href="http://docs.jquery.com/Downloading_jQuery#Download_jQuery" target="_blank">sitio web</a>, almacenar el archivo en nuestro servidor y hacer una referencia desde la página web como se muestra a continuación.</p>
<pre class="php">&lt;script src='http://www.servidor.com/ruta/jquery.js' type='text/javascript'&gt;&lt;/script&gt;</pre>
<h2>Implementar las invocaciones asíncronas.</h2>
<p>La implementación de la invocación asíncrona se realiza directamente en Javascript utilizando a la librería jQuery recién referenciada.  Su código se agrega bajo la sección <em>Código Javascript interno</em>.</p>
<p>El primer paso que se debe realizar para su implementación es relacionar el evento de presionar el botón <span style="font-family: courier new,courier;">igual</span> con la invocación del llamado asíncrono.  Para hacer esto vamos a utilizar un método no invasivo, es decir, no vamos a contaminar el HTML con el atributo <span style="font-family: courier new,courier;">onClick</span> para el elemento <span style="font-family: courier new,courier;">INPUT</span> sino que lo haremos desde el código Javascript favoreciendo la separación entre presentación/lógica del negocio y maximizando la flexibilidad de esta última.</p>
<p>Para hacer esto, tan pronto como se carga la página se asocia el evento de clic sobre el botón de <span style="font-family: courier new,courier;">igual </span>para que se invoque la función <span style="font-family: courier new,courier;">procesar</span>.</p>
<pre class="javascript">&lt;script type='text/javascript'&gt;
/* Código a ejecutarse tan pronto como la
   página ha sido cargada por el navegador */
$(document).ready(function ()
{
	/* Asociar el evento de clic del botón 'igual'
	   con la lógica del negocio de la aplicación */
	$('#igual').click(function()
	{
		procesar();
	});
});</pre>
<p>El siguiente paso es la implementación de la función <span style="font-family: courier new,courier;">procesar</span>.  En ella se realiza el llamado asíncrono a través de AJAX a la aplicación web en PHP desarrollada anteriormente para realizar el cálculo solicitado.</p>
<p>Una invocación asíncrona típica incluye la siguiente información básica.</p>
<ol>
<li>El URL de la aplicación web a invocarse.</li>
<li>El tipo del requerimiento a realizarse (<span style="font-family: courier new,courier;">GET</span> o <span style="font-family: courier new,courier;">POST</span> normalmente).</li>
<li>Los datos a enviarse como parámetros desde el formulario web (en formato <a href="http://en.wikipedia.org/wiki/Query_string" target="_blank"><em>QueryString</em></a>).</li>
<li>Definir la implementación de que hacer si la invocación es exitosa.</li>
<li>Definir la implementación de que hacer si la invocación es fallida.</li>
</ol>
<p>En el siguiente fragmento de código se especifican los primeros tres elementos de la lista.  El llamado asíncrono accederá a la aplicación web <span style="font-family: courier new,courier;">calcular.php</span> mediante el método <span style="font-family: courier new,courier;">post</span> y se le enviarán como parámetros los campos del formulario <span style="font-family: courier new,courier;">formulario</span>.</p>
<pre class="javascript">function procesar()
{
	$.ajax ({
		url: 	'calcular.php',                   /* URL a invocar asíncronamente */
		type:   'post',                           /* Método utilizado para el requerimiento */
		data: 	$('#formulario').serialize(),     /* Información local a enviarse con el requerimiento */</pre>
<p>En caso de ser exitoso se deberá mostrará un mensaje verde informándolo y se desplegará el resultado obtenido de la operación en la ubicación definida para este fin.</p>
<pre class="javascript">		/* Que hacer en caso de ser exitoso el requerimiento */
		success: 	function(request, settings)
		{
			/* Cambiar el color del texto a verde */
			$('#mensaje').css('color', '#0ab53a');
			/* Mostrar un mensaje informando el éxito sucedido */
			$('#mensaje').html("Operación realizada exitosamente");
			/* Mostrar el resultado obtenido del cálculo solicitado */
			$('#resultado').html(request);
		},</pre>
<p>En caso de que la invocación sea fallida se deberá mostrar un mensaje rojo informando el error sucedido y se removerá cualquier resultado previo que pueda haber para no confundir al usuario con información anterior.</p>
<pre class="javascript">		/* Que hacer en caso de que sea fallido el requerimiento */
		error: 	function(request, settings)
		{
			/* Cambiar el color del texto a rojo */
			$('#mensaje').css('color', '#ff0e0e');
			/* Mostrar el mensaje de error */
			$('#mensaje').html('Error: ' + request.responseText);
			/* Limpiar cualquier resultado anterior */
			$('#resultado').html('Error');
		}
	});  // Fin de la invocación al método ajax
}  // Fin de la función procesar
&lt;/script&gt;</pre>
<h2>Enlaces.</h2>
<ul>
<li>Demostración &amp; descarga del código fuente.<br />
<a href="http://demo.jorgeivanmeza.com/jQuery/AjaxSimpleRapido-Calc/" target="_blank">http://demo.jorgeivanmeza.com/jQuery/AjaxSimpleRapido-Calc/</a></li>
<li>jQuery.<br />
<a href="http://jquery.com/" target="_blank">http://jquery.com/</a></li>
<li>Simplify Ajax development with jQuery<br />
<a href="http://www.ibm.com/developerworks/library/x-ajaxjquery.html" target="_blank">http://www.ibm.com/developerworks/library/x-ajaxjquery.html</a></li>
</ul>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1096px; width: 1px; height: 1px;">
<pre class="html">id='operador'</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2009/10/ejemplo-de-ajax-rapido-y-simple-con-php-y-jquery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
