<?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>HiperGalaxia &#187; JavaScript</title>
	<atom:link href="http://www.hipergalaxia.org/blog/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hipergalaxia.org/blog</link>
	<description>El conocimiento, la frontera final.</description>
	<lastBuildDate>Thu, 09 Feb 2012 07:23:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Instalación de NodeJS en GNU/Linux Ubuntu/Mint</title>
		<link>http://blog.jorgeivanmeza.com/2012/01/instalacion-de-nodejs-en-gnulinux-ubuntumint/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalacion-de-nodejs-en-gnulinux-ubuntumint</link>
		<comments>http://blog.jorgeivanmeza.com/2012/01/instalacion-de-nodejs-en-gnulinux-ubuntumint/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalacion-de-nodejs-en-gnulinux-ubuntumint#comments</comments>
		<pubDate>Tue, 10 Jan 2012 02:12:12 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[aptitude]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Linux/Solaris/BSD]]></category>
		<category><![CDATA[Mint]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=49841</guid>
		<description><![CDATA[Introducción NodeJS es  una plataforma de desarrollo de alta escalabilidad para aplicaciones en red basada en un único hilo de ejecución, una arquitectura orientada a eventos y un manejo asíncrono de E/S.  Esta plataforma se programa utilizando Javascript del lado &#8230; <a href="http://blog.jorgeivanmeza.com/2012/01/instalacion-de-nodejs-en-gnulinux-ubuntumint/">Continue reading <span>&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Introducción</h2><p><a href="http://nodejs.org/">NodeJS</a> es  una plataforma de desarrollo de alta escalabilidad para aplicaciones en red basada en un único hilo de ejecución, una arquitectura orientada a eventos y un manejo asíncrono de E/S.  Esta plataforma se programa utilizando Javascript del lado del servidor.</p><p>En el presente artículo se describen los pasos realizados para su instalación siguiendo dos estrategias diferentes.</p><h2>Instalación</h2><h3>Utilizando el gestor de paquetes</h3><p>En este caso la instalación es mas rápida y sencilla ya que el gestor de paquetes, apt/aptitude en este caso, se hace cargo de la descarga e instalación del software y sus dependencias.</p><h4>Utilizando los repositorios por defecto</h4><p>Los repositorios incluídos por defecto con el sistema operativo permiten instalar a NodeJS sin embargo no en su versión mas reciente sino un par de números atrasada.</p><p><div id="attachment_49843" class="wp-caption aligncenter" style="width: 760px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2012/01/Terminal_002.png"><img class="size-full wp-image-49843" title="Terminal_002" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2012/01/Terminal_002.png" alt="Versión de NodeJS disponible en los repositorios de Ubuntu" width="750" height="459" /></a><p class="wp-caption-text">Versión de NodeJS disponible en los repositorios de Ubuntu</p></div></p><p>Para realizar su instalación se debe ejeuctar el siguiente comando.</p><p><span style="font-family: courier new,courier;">$ sudo aptitude install nodejs</span></p><h4>Utilizando los repositorios del proyecto</h4><p>Este método permite actualizar los repositorios del sistema operativo con el repositorio oficial del proyecto de donde se podrán descargar versiones mas recientes.  Para hacer esto se deben ejecutar los siguientes comandos.</p><p><span style="font-family: courier new,courier;">$ sudo apt-get install python-software-properties</span><br /><span style="font-family: courier new,courier;">$ sudo add-apt-repository ppa:chris-lea/node.js </span><br /><span style="font-family: courier new,courier;">$ sudo apt-get update</span></p><p><div id="attachment_49844" class="wp-caption aligncenter" style="width: 760px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2012/01/Terminal_0021.png"><img class="size-full wp-image-49844" title="Terminal_002" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2012/01/Terminal_0021.png" alt="Versión de NodeJS disponible en los repositorios del proyecto" width="750" height="427" /></a><p class="wp-caption-text">Versión de NodeJS disponible en los repositorios del proyecto</p></div></p><p>Una vez incluído el nuevo repositorio se procede a instalar el paquete normalmente.</p><p><span style="font-family: courier new,courier;">$ sudo aptitude install nodejs</span></p><h3>Desde el código fuente</h3><p>Este método permite compilar una distribución de NodeJS para la versión específica del sistema operativo que se está utilizando.  Esto requiere que se cuente con el soporte requerido de las herramientas de desarrollo y dependencias necesarias para construír el proyecto.</p><p>Descargar el código fuente de la última versión disponible (la 0.6.7 en este caso) desde la siguiente ubicación.</p><p style="padding-left: 30px;"><a href="http://nodejs.org/#download">http://nodejs.org/#download</a></p><p><code> $ wget http://nodejs.org/dist/v0.6.7/node-v0.6.7.tar.gz </code></p><p><code>$ tar zxvf node-v0.6.7.tar.gz $ cd node-v0.6.7/ </code></p><p><code>$ ./configure --prefix=/home/jimezam/nodejs/0.6.7 </code></p><p><strong>Aviso!</strong>  Si desea instalar NodeJS en una ubicación central haciéndolo disponible para todos los usuarios del sistema operativo, omita el parámetro <span style="font-family: courier new,courier;">&#8211;prefix</span> de la ejecución anterior, de lo contrario ajuste su ruta según la ubicación específica donde desee instalarlo.</p><p style="padding-left: 30px;"><span style="font-family: courier new,courier;">Checking for program g++ or c++          : /usr/bin/g++ </span><br /><span style="font-family: courier new,courier;">Checking for program cpp                 : /usr/bin/cpp </span><br /><span style="font-family: courier new,courier;">Checking for program ar                  : /usr/bin/ar </span><br /><span style="font-family: courier new,courier;">Checking for program ranlib              : /usr/bin/ranlib </span><br /><span style="font-family: courier new,courier;">Checking for g++                         : ok  </span><br /><span style="font-family: courier new,courier;">Checking for program gcc or cc           : /usr/bin/gcc </span><br /><span style="font-family: courier new,courier;">Checking for program ar                  : /usr/bin/ar </span><br /><span style="font-family: courier new,courier;">Checking for program ranlib              : /usr/bin/ranlib </span><br /><span style="font-family: courier new,courier;">Checking for gcc                         : ok  </span><br /><span style="font-family: courier new,courier;">Checking for library dl                  : yes </span><br /><span style="font-family: courier new,courier;">Checking for openssl                     : yes </span><br /><span style="font-family: courier new,courier;">Checking for library util                : yes </span><br /><span style="font-family: courier new,courier;">Checking for library rt                  : yes </span><br /><span style="font-family: courier new,courier;">Checking for fdatasync(2) with c++       : yes </span><br /><span style="font-family: courier new,courier;">'configure' finished successfully (0.776s)</span></p><p>El siguiente paso consiste en construír la distribución compilando su código fuente.</p><p><span style="font-family: courier new,courier;">$ make</span></p><p>Y finalmente se debe instalar la distribución recién construída en la ubicación elegida.</p><p><span style="font-family: courier new,courier;">$ make install</span></p><p><strong>Aviso!</strong>  Si se eligió instalar NodeJS en una ubicación central, la ejecución del comando anterior deberá ser hecha por el usuario <em>root</em> de la siguiente manera: <span style="font-family: courier new,courier;">sudo make install</span>.</p><p>Actualizar el <span style="font-family: courier new,courier;">PATH</span> para que incluya la ubicación de las herramientas de NodeJS recién instaladas.  Realizar esta modificación en el <span style="font-family: courier new,courier;">.bash_profile</span>/<span style="font-family: courier new,courier;">.bashrc</span> del usuario o <span style="font-family: courier new,courier;">/etc/profile</span> para tener un alcance global y garantizar que esta modificación persista cada vez que se inicia la máquina.</p><p style="padding-left: 30px;"><span style="font-family: courier new,courier;">$ PATH=/home/jimezam/nodejs/0.6.7/bin:$PATH</span></p><p>Si el ajuste fue exitoso la aplicación <span style="font-family: courier new,courier;">node</span> ya podrá ser accedida directamente desde la línea de comando.</p><p><span style="font-family: courier new,courier;">$ which node</span></p><p style="padding-left: 30px;"><span style="font-family: courier new,courier;">/home/jimezam/nodejs/0.6.7/bin/node</span></p><h2>Prueba de funcionamiento: Hola Mundo NodeJS!</h2><p>Crear el siguiente archivo de código Javascript para crear un servicio extremadamente simple que responda "Hola Mundo" ante las peticiones web de los clientes a través de navegadores.</p><p><span style="font-family: courier new,courier;">$ vi prueba.js</span></p><pre>var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hola Mundo NodeJS!\n');
}).listen(7777, '127.0.0.1');
console.log('Servidor ejecutándose en http://127.0.0.1:7777');</pre><p>Para iniciar el servicio se debe invocar el comando <span style="font-family: courier new,courier;">node</span> de la siguiente manera.</p><p><span style="font-family: courier new,courier;">$ node prueba.js</span></p><p style="padding-left: 30px;"><span style="font-family: courier new,courier;">Servidor ejecutándose en http://127.0.0.1:7777</span></p><p>Desde un navegador web acceder a la dirección mencionada.</p><p><div id="attachment_49846" class="wp-caption aligncenter" style="width: 394px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2012/01/Mozilla-Firefox_002.png"><img class="size-full wp-image-49846" title="Mozilla Firefox_002" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2012/01/Mozilla-Firefox_002.png" alt="Hola Mundo consultándose desde NodeJS" width="384" height="207" /></a><p class="wp-caption-text">Hola Mundo consultándose desde NodeJS</p></div></p><p>&nbsp;</p><h2>Enlaces</h2><ul><li>Node.JS<br /><a href="http://nodejs.org/">http://nodejs.org/</a></li><li>Installing Node.js via package manager<br /><a href="https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager">https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager</a></li></ul> ]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2012/01/instalacion-de-nodejs-en-gnulinux-ubuntumint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arrastrar y soltar con HTML5</title>
		<link>http://blog.jorgeivanmeza.com/2011/07/arrastrar-y-soltar-con-html5/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arrastrar-y-soltar-con-html5</link>
		<comments>http://blog.jorgeivanmeza.com/2011/07/arrastrar-y-soltar-con-html5/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arrastrar-y-soltar-con-html5#comments</comments>
		<pubDate>Wed, 06 Jul 2011 19:23:32 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[DnD]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=31418</guid>
		<description><![CDATA[Introducción. En este artículo se revisarán los pasos necesarios para implementar la facilidad de arrastrar y soltar (drag and drop) en una página web aprovechando las funcionalidades provistas por HTML5.  Para este desarrollo se utilizará jQuery para facilitar la implementación, sin embargo esto no es estrictamente necesario. Establecer los elementos "arrastrables". El primer paso consiste [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>En este artículo se revisarán los pasos necesarios para implementar la facilidad de arrastrar y soltar (<em>drag and drop</em>) en una página web aprovechando las funcionalidades provistas por HTML5.  Para este desarrollo se utilizará <a href="http://www.jquery.org/" >jQuery</a> para facilitar la implementación, sin embargo esto no es estrictamente necesario.</p><h2>Establecer los elementos "arrastrables".</h2><p>El primer paso consiste en establecer cuales elementos podrán ser arrastrados, para hacer esto se les deberá agregar el atributo <span style="font-family: courier new,courier;">draggable='true'</span>.  En el caso del ejemplo, los elementos <em>arrastrables</em> son imágenes de la siguiente manera.</p><pre class="html">&lt;img id="tool0" draggable="true" title="tool" src="img/tool0.png" alt="tool" /&gt;
&lt;img id="tool1" draggable="true" title="tool" src="img/tool1.png" alt="tool" /&gt;
&lt;img id="tool2" draggable="true" title="tool" src="img/tool2.png" alt="tool" /&gt;</pre><h2>Definir el comportamiento de los elementos "arrastrables".</h2><p>El siguiente paso es establecer que se debe hacer cuando los objetos arrastrables son manipulados, es decir, manejar sus eventos.  Estos eventos corresponden con los siguientes y su implementación se debe definir cuando la estructura de la página se encuentra completamente cargada.</p><table><tbody><tr><td> <span style="font-family: courier new,courier;">dragstart</span></td><td> El elemento se empieza a arrastrar.</td></tr><tr><td> <span style="font-family: courier new,courier;">drag</span></td><td> El elemento está siendo arrastrado.</td></tr><tr><td> <span style="font-family: courier new,courier;">dragend</span></td><td> El elemento ha dejado de ser arrastado.</td></tr></tbody></table><p>Durante el manejo del evento <span style="font-family: courier new,courier;">dragstart</span> se realizan las siguientes tareas.</p><ol><li>Almacenar la información del elemento arrastrable (su <span style="font-family: courier new,courier;">id</span> en este caso) necesaria para ser procesado en caso de ser soltado exitosamente.</li><li>Agregar una nueva clase CSS (<span style="font-family: courier new,courier;">itemSelected</span>) para modificar su apariencia mientras es arrastrado.</li><li>Modificar la imagen del elemento arrastrado la cual por defecto es la del mismo elemento.</li></ol><pre class="javascript">$('.page #main #items .item').bind('dragstart', function(event) {
    // Store information about the item dragged.
    event.originalEvent.dataTransfer.setData("text/plain", event.target.getAttribute('id'));
    // Add a CSS class to highlight the dragged item.
    $(event.target).addClass('itemSelected');
    // Set an image as drag icon.  The image was preloaded.
    var dragIcon = document.createElement('img');
    dragIcon.src = 'img/hand.png';
    event.originalEvent.dataTransfer.setDragImage(dragIcon, 139, 43);
});</pre><p>Durante el manejo del evento <span style="font-family: courier new,courier;">drag</span> no se realizan tareas especiales en este caso.</p><pre class="javascript">$('.page #main #items .item').bind('drag', function(event) {
    // The item is being dragged!
});</pre><p>Durante el manejo del evento <span style="font-family: courier new,courier;">dragend</span> se realiza una única tarea y corresponde con retirar la clase CSS añadida durante <span style="font-family: courier new,courier;">dragstart</span> para indicar que el elemento ya no está siendo arrastrado actualmente.</p><pre class="javascript">$('.page #main #items .item').bind('dragend', function(event) {
    // Remove the CSS class that highlights it while beign dragged.
    $(event.target).removeClass('itemSelected');
});</pre><h2>Definir el comportamiento de las "zonas de descarga".</h2><p>El paso final consiste en establecer que se debe hacer cuando los objetos arrastrables interactúan con las zonas de descarga (<em>drop zones</em>), es decir, manejar sus eventos.  Estos eventos corresponden con los siguientes y su implementación también se debe definir cuando la estructura de la página se encuentra completamente cargada.</p><table><tbody><tr><td> <span style="font-family: courier new,courier;">dragenter</span></td><td> El elemento arrastrable ha entrado a una zona de descarga.</td></tr><tr><td> <span style="font-family: courier new,courier;">dragleave</span></td><td> El elemento arrastrable ha salido de una zona de descarga.</td></tr><tr><td> <span style="font-family: courier new,courier;">dragover</span></td><td> El elemento arrastrable está siendo arrastrado sobre una zona de descarga.</td></tr><tr><td> <span style="font-family: courier new,courier;">drop</span></td><td> El elemento arrastrable ha sido soltado sobre una zona de descarga.</td></tr></tbody></table><p>Durante el manejo del evento <span style="font-family: courier new,courier;">dragenter</span> se agrega una nueva clase CSS (<span style="font-family: courier new,courier;">itemOnDropArea</span>) para modificar la apariencia de la zona de descarga mientras un elemento es arrastrado sobre ella.</p><pre class="javascript">$('.page #main #boxes .box').bind('dragenter', function(event) {
    // Add a CSS class to highlight the drop zone used.
    $(event.target).addClass('itemOnDropArea');
    // Prevents the default event that denies the DnD
    // behaviour.  Acts as "event.preventDefault()" in
    // vanilla Javascript.
    return false;
});</pre><p>Durante el manejo del evento <span style="font-family: courier new,courier;">dragleave</span> se realiza la tarea contraria, se remueve la clase CSS agregada durante el suceso del evento anterior para mostrar que ningún elemento es arrastrado ahora sobre la zona de descarga.</p><pre class="javascript">$('.page #main #boxes .box').bind('dragleave', function(event) {
    // Remove the CSS class that highlights the used drop zone.
    $(event.target).removeClass('itemOnDropArea');
    // Prevents the default event that denies the DnD
    // behaviour.  Acts as "event.preventDefault()" in
    // vanilla Javascript.
    return false;
});</pre><p>Durante el manejo del evento <span style="font-family: courier new,courier;">dragover</span> no se realiza en este caso ninguna tarea interesante además de indicarle al navegador que evite su comportamiento por defecto el cual es impedir que se realice.</p><pre class="javascript">$('.page #main #boxes .box').bind('dragover', function(event) {
    // Prevents the default event that denies the DnD
    // behaviour.  Acts as "event.preventDefault()" in
    // vanilla Javascript.
    return false;
});</pre><p>Durante el manejo del evento drop, que sucede cuando el elemento arrastrable se suelta sobre la zona de descarga, se realizan las siguientes tareas en la aplicación de demostración.</p><ol><li>Obtener la información almacenada en el objeto <span style="font-family: courier new,courier;">dataTransfer</span> definida durante el manejo del evento <span style="font-family: courier new,courier;">dragstart</span>.</li><li>Obtener la información del objeto arrastrable.</li><li>Obtener la información de la zona de descarga.</li><li>Determinar si la descarga del objeto es válida o no en la zona de descarga específica.</li><li>Realizar una acción según se determine en la tarea anterior: remover el elemento o mostrar un mensaje de error.</li><li>Evitar que se efectúe el comportamiento por defecto relacionado con el evento.</li></ol><pre class="javascript">$('.page #main #boxes .box').bind('drop', function(event) {
	// Get the stored information about the draggable item,
	// the element ID in this case.
	var itemId = event.originalEvent.dataTransfer.getData("text/plain");
	// Get the type of the draggable item, stored in the
	// ALT attribute in this case.
	var itemType = $("#" + itemId).attr('alt');
	// Get the drop zone's ID to difference the type of it.
	var dropboxType = $(event.target).attr('id');
	// Check if the draggable item can be or not dropped
	// into the current drop zone.
	if(dropboxType == 'toolbox')
	{
		if(itemType == 'tool')
			$("#" + itemId).remove();
		else
			alert("That is a FRUIT, put it on the Fruit's Basket!");
	}
	if(dropboxType == 'fruitbasket')
	{
		if(itemType == 'fruit')
			$("#" + itemId).remove();
		else
			alert("That is a TOOL, put it on the Toolbox!");
	}
	// Remove the CSS class that highlights the used drop zone.
	$(event.target).removeClass('itemOnDropArea');
	// Prevents the default event that denies the DnD
	// behaviour.  Acts as "event.preventDefault()" in
	// vanilla Javascript.
	return false;
});</pre><h2>El prototipo.</h2><p>En este prototipo se utilizan los fragmentos de código mostrados en este artículo, en él se muestran en la parte inferior dos series de objetos arrastrables (herramientas y frutas) y en la parte superior dos zonas de descarga (una caja de herramientas y una canasta de frutas).  La página web permitirá que el usuario arrastre los elementos a cualquiera de de las zonas de descarga, sin embargo sólo aceptará que se almacenen en la zona correcta.  En caso de intentarse hacer lo contrario se obtendrá un mensaje de error.</p><div id="attachment_31460" class="wp-caption aligncenter" style="width: 792px"><a href="http://demo.jorgeivanmeza.com/JavaScript/HTML5DnD/0.1/"><img class="size-large wp-image-31460 " title="Selection_008" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/07/Selection_008-1024x641.png" alt="Prototipo de demostración de arrastrar y soltar con HTML5" width="782" height="489" /></a><p class="wp-caption-text">Prototipo de demostración de arrastrar y soltar con HTML5</p></div><h2>Enlaces.</h2><ul><li>Prototipo de demostración.<br /> <a href="http://demo.jorgeivanmeza.com/JavaScript/HTML5DnD/0.1/" >http://demo.jorgeivanmeza.com/JavaScript/HTML5DnD/0.1/</a></li><li>Especificación de <em>Drag and Drop</em> en W3.<br /> <a href="http://dev.w3.org/html5/spec/dnd.html" >http://dev.w3.org/html5/spec/dnd.html</a></li><li><em>Drag and Drop</em> en Mozilla Developer Network.<br /> <a href="https://developer.mozilla.org/En/DragDrop/Drag_and_Drop" >https://developer.mozilla.org/En/DragDrop/Drag_and_Drop</a></li><li>Las imágenes para el prototipo fueron tomadas de OpenClipart.<br /> <a href="http://openclipart.org/" >http://openclipart.org/</a></li></ul><p class='fb-like'><iframe src='http://www.facebook.com/plugins/like.php?href=http://blog.jorgeivanmeza.com/2011/07/arrastrar-y-soltar-con-html5/&amp;layout=box_count&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=65&amp;font=lucida+grande' scrolling='no' frameborder='0' allowTransparency='true' style='border:none; overflow:hidden; width:450px; height:65px'></iframe></p><fb:share -button href="http://blog.jorgeivanmeza.com/2011/07/arrastrar-y-soltar-con-html5/" type="box_count"></fb:share>]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2011/07/arrastrar-y-soltar-con-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal (3)</title>
		<link>http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3</link>
		<comments>http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3#comments</comments>
		<pubDate>Mon, 27 Jun 2011 22:35:10 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[coordinates]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software geográfico]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=29416</guid>
		<description><![CDATA[Introducción. Después de encontrar dos métodos (A y B) para la conversión de coordenadas entre formatos decimal y grados, minutos y segundos, encontré en el libro HTML5 Geolocation de Anthony T. Holdener III la implementación de dos funciones en Javascript que realizan con precisión este procedimiento y que me parecieron muy intersantes.  Este corto libro [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>Después de encontrar dos métodos (<a href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal/" >A</a> y <a href="http://blog.jorgeivanmeza.com/2010/10/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-2-version-simple/" >B</a>) para la conversión de coordenadas entre formatos decimal y grados, minutos y segundos, encontré en el libro <a href="http://oreilly.com/catalog/0636920020004" >HTML5 Geolocation</a> de <a href="http://anthonyth3.wordpress.com/" >Anthony T. Holdener III</a> la implementación de dos funciones en Javascript que realizan con precisión este procedimiento y que me parecieron muy intersantes.  Este corto libro es en general muy interesante y recomiendo su lectura.</p><h2>Conversión de coordenadas: formato decimal a grados-minutos-segundos.</h2><pre class="javascript">/**
 * Convierte una coordenada en formato decimal a su correspondiente
 * versión en formato grados-minutos-segundos.
 *
 * @param	Float	Valor real de la coordenada.
 * @param	Int	Tipo de la coordenada {Coordenada.LATITUD, Coordenada.LONGITUD}.
 * @return	Array	['grados', 'minutos', 'segundos', 'direccion', 'valor'].
 */
function dec2gms(valor, tipo)
{
	grados    = Math.abs(parseInt(valor));
	minutos   = (Math.abs(valor) - grados) * 60;
	segundos  = minutos;
	minutos   = Math.abs(parseInt(minutos));
	segundos  = Math.round((segundos - minutos) * 60 * 1000000) / 1000000;
	signo     = (valor &lt; 0) ? -1 : 1; 	direccion = (tipo == Coordenada.LATITUD) ?
                    ((signo &gt; 0) ? 'N' : 'S') :
	            ((signo &gt; 0) ? 'E' : 'W');
	if(isNaN(direccion))
		grados = grados * signo;
	return {
		'grados'   : grados,
		'minutos'  : minutos,
		'segundos' : segundos,
		'direccion': direccion,
		'valor'    : grados + "\u00b0 " + minutos + "' "+ segundos +
		             "\"" + ((isNaN(direccion)) ? (' ' + direccion) : '')
	};
}</pre><p>Por ejemplo.</p><pre class="javascript">var x = 48.853;
r1 = dec2gms(x, Coordenada.LATITUD);
alert('Conversion dec2gms = ' + r1.valor);</pre><h2>Conversión de coordenadas: formato grados-minutos-segundos a decimal.</h2><pre class="javascript">/**
 * Convierte una coordenada en formato grados-minutos-segundos a su
 * correspondiente versión en formato decimal.
 *
 * @param	Float	Grados de la coordenada.
 * @param	Float	Minutos de la coordenada.
 * @param	Float	Segundos de la coordenada.
 * @param	String	Sentido de la coordenada {Coordenada.NORTE,
					Coordenada.SUR, Coordenada.ORIENTE,
					Coordenada.OCCIDENTE}
 * @return	Array	['decimal', 'valor'].
 */
function gms2dec(grados, minutos, segundos, direccion)
{
	if(direccion)
	{
		signo     = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's') ?
		            -1 : 1;
		direccion = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's' ||
		             direccion.toLowerCase() == 'n' ||
		             direccion.toLowerCase() == 'e') ?
		            direccion.toLowerCase() : '';
	}
	else
	{
		signo     = (grados &lt; 0) ? -1 : 1;
		direccion = '';
	}
	dec = Math.round((Math.abs(grados) + ((minutos * 60) + segundos) / 3600) * 1000000) / 1000000;
	if(isNaN(direccion) || direccion == '')
		dec = dec * signo;
	return {
		'decimal': dec,
		'valor'  : dec + "\u00b0" + ((isNaN(direccion) || direccion == '') ? (' ' + direccion) : '')
	};
}</pre><p>Por ejemplo.</p><pre class="javascript">var xg = 48;
var xm = 51;
var xs = 10.8;
r2 = gms2dec(xg, xm, xs, Coordenada.NORTE);
alert('Conversion gms2dec = ' + r2.valor);</pre><h2>Código fuente y demostración.</h2><p>Obtenga el código fuente del artículo junto con la ejecución de la demostración en la siguiente ubicación.</p><p style="padding-left: 30px;"><a href="http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.3/" >http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.3/</a></p><p class='fb-like'><iframe src='http://www.facebook.com/plugins/like.php?href=http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/&amp;layout=box_count&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=65&amp;font=lucida+grande' scrolling='no' frameborder='0' allowTransparency='true' style='border:none; overflow:hidden; width:450px; height:65px'></iframe></p><fb:share -button href="http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/" type="box_count"></fb:share>]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2011/06/convertir-coordenadas-geograficas-grados-minutos-segundos-a-notacional-decimal-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como acceder a la geolocalización desde Javascript</title>
		<link>http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-acceder-a-la-geolocalizacion-desde-javascript</link>
		<comments>http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-acceder-a-la-geolocalizacion-desde-javascript#comments</comments>
		<pubDate>Sun, 26 Jun 2011 16:33:44 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Software geográfico]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=28827</guid>
		<description><![CDATA[Introducción. La geolocalización es la posibilidad de conocer cual es la ubicación física de un dispositivo.  Esta ubicación es geográfica, es decir, se define especialmente mediante sus correspondientes valores de latitud y longitud. Los dispositivos pueden obtener esta información desde diferentes fuentes, las cuales estarán relacionadas a su vez con precisión de estos datos.  Los [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>La geolocalización es la posibilidad de conocer cual es la ubicación física de un dispositivo.  Esta ubicación es geográfica, es decir, se define especialmente mediante sus correspondientes valores de latitud y longitud.</p><p>Los dispositivos pueden obtener esta información desde diferentes fuentes, las cuales estarán relacionadas a su vez con precisión de estos datos.  Los orígenes mas comúnes para la información de geolocalización de un dispositivo son los siguientes.</p><ol><li>Utilizando un GPS (<em>Global Positioning System</em>).</li><li>Mediante su identificación en celdas GSM/CDMA.</li><li>Mediante su dirección IP.</li><li>Mediante la dirección MAC de WiFi y Bluetooth.</li><li>Especificado por el usuario manualmente.</li></ol><p>Estos métodos se encuentran disponibles para las aplicaciones nativas que pueden acceder libremente al hardware del dispositivo, sin embargo ahora también es posible acceder a esta información desde una aplicación web utilizando Javascript gracias a la integración del <a href="http://www.w3.org/2008/geolocation/" >API de geolocalización de la W3C</a> en los navegadores mas recientes (incluyendo los móviles).</p><ul><li>Firefox (3.5+)</li><li>Chrome (5.0+)</li><li>Internet Explorer (9.0+)</li><li>Safari (5.0+)</li><li>Opera (10.6+)</li><li>iPhone (3.1+)</li><li>Android (2.0+)</li><li>BlackBerry (6+)</li></ul><p>Para dar soporte a navegadores antíguos se requiere que se utilice una capa adicional como <a href="http://gears.google.com/" >Google Gears</a> que supla la falencia de esta tecnología.</p><p>En este artículo se explicará el API necesario para acceder al API de geolocalización mediante el uso del lenguaje Javascript utilizando un navegador moderno como los mencionados.</p><h2>Verificar el soporte</h2><p>El primer paso debe ser siempre verificar si el navegador web en el cual se despliega la aplicación tiene o no el soporte para esta tecnología, a partir de este resultado se deberá decidir que hacer.</p><pre class="javascript">if(navigator.geolocation)
{
    // Se cuenta con el soporte para geolocalización, entonces ...
}
else
{
    // No se cuenta con soporte para geolocalización, manejar la situación.
}</pre><h2>Solicitar la ubicación al navegador.</h2><p>El siguiente paso consiste directamente en solicitarle al navegador web cual es la ubicación del dispositivo.  El llamado a esta función es asíncrono, es decir, no retorna inmediatamente un valor sino que invoca a una función específica (<em>callback</em>) cuando este se obtiene.  Así mismo, como el conocer la ubicación de un dispositivo (y por ende su usuario) tiene implicaciones en la privacidad de las personas, la especificación dispone que el usuario esté siempre facultado para aceptar o negar el acceso a esta información.  Por este motivo los navegadores desplegarán barras como la mostrada a continuación solicitando la confirmación final.</p><div id="attachment_28875" class="wp-caption aligncenter" style="width: 581px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/06/Selection_021.png"><img class="size-full wp-image-28875" title="Selection_021" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/06/Selection_021.png" alt="Permitir el acceso a la información de geolocalización en Chrome" width="571" height="38" /></a><p class="wp-caption-text">Permitir el acceso a la información de geolocalización en Chrome</p></div><p>A continuación se muestra la invocación general de la función para obtener la geolocalización del dispositivo.</p><pre class="javascript">navigator.geolocation.getCurrentPosition(onSuccessGeolocating,
                                         onErrorGeolocating,
                                         options);</pre><p>Los dos primeros parámetros corresponden a funciones Javascript que se ejecutarán según se tenga éxito o no durante el proceso de geolocalización (se analizarán a continuación), el tercer parámetro es opcional y corresponde con uno o varios de los modificadores descritos.</p><table border="0" align="center"><tbody><tr style="background-color: #99d0ff;"><td style="text-align: center;"><strong>Opción</strong></td><td style="text-align: center;"><strong>Tipo</strong></td><td style="text-align: center;"><strong>Valor por defecto</strong></td><td style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span style="font-family: 'courier new', courier;">enableHighAccuracy</span></td><td>Booleano</td><td style="text-align: center;"><span style="font-family: 'courier new', courier;">false</span></td><td>Intenta obtener la información mas precisa que sea posible.  Debe tenerse en cuenta que esta opción también toma mas tiempo y probablemente consume una mayor cantidad de batería del dispositivo.</td></tr><tr><td><span style="font-family: 'courier new', courier;">maximumAge</span></td><td>Entero</td><td style="text-align: center;"><span style="font-family: 'courier new', courier;"> 0</span></td><td>Acepta como resultado el último valor histórico siempre y cuando este no sea mas antíguo que el valor especificado en milisegundos.</td></tr><tr><td><span style="font-family: 'courier new', courier;">timeout</span></td><td>Entero</td><td style="text-align: center;"><span style="font-family: 'courier new', courier;"> 0</span></td><td>Espera máximo la cantidad de milisegundos especificada antes de abortar el procedimiento.</td></tr></tbody></table><p>A continuación se muestra un ejemplo de implementación de esta función.  En este se definen las funciones <span style="font-family: 'courier new', courier;">onSuccessGeolocating</span> y <span style="font-family: 'courier new', courier;">onErrorGeolocating</span> para determinar la implementación del manejo de éxito y error respectivamente de la geolocalización, y define además que se intente realizar el procedimiento con la mayor precisión posible, se acepten valores en caché con máximo 5 segundos de antiguedad y se espere máximo 10 segundos para terminar el procedimiento.</p><pre class="javascript">navigator.geolocation.getCurrentPosition(onSuccessGeolocating,
                                         onErrorGeolocating,
                                         {
                                       		enableHighAccuracy: true,
                                       		maximumAge:         5000,
                                       		timeout:            10000
                                         });</pre><h2>Establecer que hacer con la información de geolocalización.</h2><p>Si el procedimiento fue exitoso, se define la función <span style="font-family: 'courier new', courier;">onSuccessGeolocating</span> referenciada en el paso inmediatamente anterior, en ella se establece que se deberá hacer con la información obtenida.</p><pre class="javascript">function onSuccessGeolocating(position)
{
    // ...
}</pre><p>El objeto <span style="font-family: 'courier new', courier;">Position</span> que se recibe a través de los parámetros de la función incluye la siguiente información.</p><table border="0" align="center"><tbody><tr style="background-color: #99d0ff;"><td style="text-align: center;"><strong>Atributo</strong></td><td style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span style="font-family: 'courier new', courier;">coords</span></td><td>Información de la ubicación obtenida</td></tr><tr><td><span style="font-family: 'courier new', courier;">timestamp</span></td><td>Información del momento en que fue obtenida la información</td></tr></tbody></table><p>A su vez, el objeto <span style="font-family: 'courier new', courier;">Coordinates</span> incluye la siguiente información en su interior.</p><table border="0" align="center"><tbody><tr style="background-color: #99d0ff;"><td style="text-align: center;"><strong>Atributo</strong></td><td style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span style="font-family: 'courier new', courier;">latitude</span></td><td>Valor de la latitud de la ubicación del dispositivo medida en grados decimales</td></tr><tr><td><span style="font-family: 'courier new', courier;">longitude</span></td><td>Valor de la longitud de la ubicación del dispositivo medido en grados decimales</td></tr><tr><td><span style="font-family: 'courier new', courier;">altitude</span></td><td>Valor de la altura geográfica de la ubicación del dispositivo medida en metros</td></tr><tr><td><span style="font-family: 'courier new', courier;">accuracy</span></td><td>Precisión de la latitud y longitud medida en metros</td></tr><tr><td><span style="font-family: 'courier new', courier;">altitudeAccuracy</span></td><td>Precisión de la altitud medida en metros</td></tr><tr><td><span style="font-family: 'courier new', courier;">heading</span></td><td>Dirección en la que se mueve el dispositivo.  Medida en grados desde 0 hasta 360. Su valor será NaN cuando el dispositivo se encuentra inmóvil o null si esta característica no es soportada</td></tr><tr><td><span style="font-family: 'courier new', courier;">speed</span></td><td>Valor de la longitud de la ubicación del dispositivo</td></tr></tbody></table><p>Esto significa que la información básica de la ubicación del dispositivo esta finalmente almacenada en <span style="font-family: 'courier new', courier;">position.coords.latitude</span> y <span style="font-family: 'courier new', courier;">position.coords.longitude</span>.</p><p><span style="font-size: 20px; font-weight: bold;">Establecer que hacer en caso de error.</span></p><p>En algunas ocasiones la geolocalización puede fallar, por ejemplo cuando se utiliza el GPS pero no se cuenta con la información de suficientes satélites o cuando el usuario impide el procedimiento.  Para manejar esta conducta se define la función <span style="font-family: 'courier new', courier;">onErrorGeolocating</span> referenciada durante la invocación de <span style="font-family: 'courier new', courier;">navigator.geolocation.getCurrentPosition</span>.</p><pre class="javascript">function onErrorGeolocating(error)
{
    // ...
}</pre><p>La información del error puede obtenerse del objeto <span style="font-family: 'courier new', courier;">PositionError</span> recibido por parámetro el cual cuenta con los siguientes atributos en su interior.</p><table border="0" align="center"><tbody><tr style="background-color: #99d0ff;"><td style="text-align: center;"><strong>Atributo</strong></td><td style="text-align: center;"><strong>Descripción</strong></td></tr><tr><td><span style="font-family: 'courier new', courier;">code</span></td><td>Código numérico que referencia al tipo de error sucedido.  Su valor corresponde con una de las siguientes constantes&nbsp;<p><span style="font-family: 'courier new', courier;">PERMISSION_DENIED</span>: no se permitió o no se tienen suficientes privilegios para acceder al servicio de geolocalización.</p><p><span style="font-family: 'courier new', courier;">POSITION_UNAVAILABLE</span>: el dispositivo no pudo determinar correctamente su ubicación.</p><p><span style="font-family: 'courier new', courier;">TIMEOUT</span>: el intento de geolocalización tomó mas tiempo del permitido (opción <span style="font-family: 'courier new', courier;">timeout</span>).</p></td></tr><tr><td><span style="font-family: 'courier new', courier;">message</span></td><td>Texto que describe el error sucedido.  Este mensaje se utiliza para depuración en desarrollo, no se debe utilizar para mostrarse al usuario final.</td></tr></tbody></table><p>A continuación se muestra un ejemplo básico de implementación de esta función.</p><pre class="javascript">function onErrorGeolocating(error)
{
	switch(error.code)
	{
		case error.PERMISSION_DENIED:
			alert('ERROR: User denied access to track physical position!');
		break;
		case error.POSITION_UNAVAILABLE:
			alert("ERROR: There is a problem getting the position of the device!");
		break;
		case error.TIMEOUT:
			alert("ERROR: The application timed out trying to get the position of the device!");
		break;
		default:
			alert("ERROR: Unknown problem!");
		break;
	}
}</pre><h2>El prototipo.</h2><p>Como demostración de esta API se incluye el siguiente prototipo el cual intenta obtener la ubicación actual del usuario y desplegarla en un mapa de Google Maps.  Se recomienda consultar su código fuente para complementar los contenidos de este artículo.</p><p style="text-align: center;">&nbsp;</p><div id="attachment_28925" class="wp-caption aligncenter" style="width: 829px"><a href="http://demo.jorgeivanmeza.com/JavaScript/GeolocationDemo/0.1/"><img class="size-large wp-image-28925  " title="Selection_020" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/06/Selection_020-1024x648.png" alt="Demostración de geolocalización con Javascript" width="819" height="518" /></a><p class="wp-caption-text">Demostración de geolocalización con Javascript</p></div><h2>Enlaces.</h2><ul><li>Demostración de geolocalización con Javascript.<br /> <a href="http://demo.jorgeivanmeza.com/JavaScript/GeolocationDemo/" >http://demo.jorgeivanmeza.com/JavaScript/GeolocationDemo/</a></li><li>Geolocation Working Group en W3C.<br /> <a href="http://www.w3.org/2008/geolocation/" >http://www.w3.org/2008/geolocation/</a></li></ul><p class='fb-like'><iframe src='http://www.facebook.com/plugins/like.php?href=http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/&amp;layout=box_count&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=65&amp;font=lucida+grande' scrolling='no' frameborder='0' allowTransparency='true' style='border:none; overflow:hidden; width:450px; height:65px'></iframe></p><fb:share -button href="http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/" type="box_count"></fb:share>]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2011/06/como-acceder-a-la-geolocalizacion-desde-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primeros pasos con PhoneGap para Android</title>
		<link>http://blog.jorgeivanmeza.com/2011/05/primeros-pasos-con-phonegap-para-android/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=primeros-pasos-con-phonegap-para-android</link>
		<comments>http://blog.jorgeivanmeza.com/2011/05/primeros-pasos-con-phonegap-para-android/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=primeros-pasos-con-phonegap-para-android#comments</comments>
		<pubDate>Sun, 29 May 2011 06:35:29 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[AVD]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[PhoneGap]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=16695</guid>
		<description><![CDATA[Introducción. PhoneGap en pocas palabras es un framework para el desarrollo de aplicaciones móviles que posibilita a los desarrolladores a que implementen sus proyectos utilizando las tecnologías estándar de web: HTML5, CSS3 y Javascript, y este las convierte a aplicaciones híbridas, es decir, aplicaciones nativas de las diferentes plataformas móviles existentes que tienen acceso a [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p><a href="http://www.phonegap.com/" >PhoneGap</a> en pocas palabras es un <em>framework</em> para el desarrollo de aplicaciones móviles que posibilita a los desarrolladores a que implementen sus proyectos utilizando las tecnologías estándar de web: <strong>HTML5</strong>,<strong> CSS3</strong> y<strong> Javascript</strong>, y este las convierte a aplicaciones híbridas, es decir, aplicaciones nativas de las diferentes plataformas móviles existentes que tienen acceso a gran parte del API nativo.</p><div id="attachment_16703" class="wp-caption aligncenter" style="width: 664px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/build2.png"><img class="size-full wp-image-16703" title="build2" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/build2.png" alt="Tomado de http://www.phonegap.com/" width="654" height="250" /></a><p class="wp-caption-text">Tomado de http://www.phonegap.com/</p></div><p style="text-align: left;">Esto lo logra empaquetando la aplicación web original con un navegador basado en <a href="http://www.webkit.org/" >webkit</a> para desplegarla como si fuera una aplicación verdaderamente nativa.</p><p style="text-align: left;">Actualmente este <em>framework</em> soporta seis de las principales plataformas móviles del mercado: iOS, Android, Blackberry, PalmOS, Windows Mobile y Symbian.  Para mas información acerca del estado actual del soporte en cada una de estas plataformas consultar las <a href="http://www.phonegap.com/features" >características soportadas</a>.</p><p style="text-align: left;">Existen <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Multiple_phone_web_based_application_framework" >otros <em>frameworks</em> similares</a> a este entre los que se destacan <a href="http://www.appcelerator.com/" >Appcelerator Titanium</a>, <a href="http://www.mobl-lang.org/" >Mobl</a> y <a href="http://www.sencha.com/products/touch/" >Sencha Touch</a> de los cuales espero estar escribiendo mas adelante.</p><p style="text-align: left;">En este artículo se describirá el proceso de instalación de PhoneGap, la creación de un proyecto base para el desarrollo con este <em>framework</em> y la elaboración de un ejemplo simple.</p><h2 style="text-align: left;">Instalar PhoneGap.</h2><p style="text-align: left;">Descargar la última versión disponible del <em>framework</em> desde la siguiente ubicación.</p><p style="text-align: left; padding-left: 30px;"><a href="https://code.google.com/p/phonegap/downloads/list" >https://code.google.com/p/phonegap/downloads/list</a></p><p style="text-align: left;">Para efectos de la documentación se utilizará la versión <span style="font-family: courier new,courier;">0.9.5.1</span> que corresponde con las mas reciente para esta fecha.</p><p style="text-align: left;"><span style="font-family: courier new,courier;">$ wget http://phonegap.googlecode.com/files/phonegap-0.9.5.1.zip</span></p><p style="text-align: left;">Se descomprime el paquete recién descargado y se mueve a su ubicación final.</p><p style="text-align: left;"><span style="font-family: courier new,courier;">$ unzip phonegap-0.9.5.1.zip</span></p><p style="text-align: left;"><span style="font-family: courier new,courier;">$ mkdir ~/phonegap</span></p><p style="text-align: left;"><span style="font-family: courier new,courier;">$ mv phonegap-0.9.5.1 ~/phonegap/0.9.5.1</span></p><h2 style="text-align: left;">Crear la plantilla base de un proyecto Android.</h2><p style="text-align: left;">A continuación se relacionan los pasos que se deben realizar para crear un proyecto PhoneGap para Android utilizando <a href="http://blog.jorgeivanmeza.com/2011/05/instalar-eclipse-y-el-plugin-adt-en-gnulinux/" >Eclipse y el <em>plugin</em> ADT</a> instalados anteriormente.</p><p style="text-align: left;">Iniciar Eclipse y crear un nuevo proyecto a través del menú <strong>File</strong> &gt; <strong>New</strong> &gt; <strong>Android Project</strong>.</p><div id="attachment_16712" class="wp-caption aligncenter" style="width: 617px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Menu_007.png"><img class="size-full wp-image-16712" title="Menu_007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Menu_007.png" alt="Crear un nuevo proyecto Android" width="607" height="159" /></a><p class="wp-caption-text">Crear un nuevo proyecto Android</p></div><p style="text-align: left;">En el diálogo de información del proyecto a crearse especificar al menos los siguientes campos y presione el botón <strong>Finish</strong> para continuar.</p><ol><li>Nombre del proyecto (<em>project name</em>).</li><li>API de Android a utilizarse (<em>build target</em>).  En este caso se utilizará el API 2.2.</li><li>Nombre de la aplicación (<em>application name</em>).</li><li>Crear una actividad (<em>create activity</em>).</li></ol><div id="attachment_16713" class="wp-caption aligncenter" style="width: 535px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/New-Android-Project-_007.png"><img class="size-full wp-image-16713" title="New Android Project _007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/New-Android-Project-_007.png" alt="Información básica del proyecto Android" width="525" height="767" /></a><p class="wp-caption-text">Información básica del proyecto Android</p></div><p>En el Explorador de Paquetes (<em>package explorer</em>)  de Eclipse crear bajo el proyecto una carpeta <span style="font-family: courier new,courier;">/assets/www</span> y otra <span style="font-family: courier new,courier;">/libs</span>.</p><p style="text-align: left;">Copiar en la carpeta <span style="font-family: courier new,courier;">/assets/www</span> el archivo <span style="font-family: courier new,courier;">phonegap.0.9.5.1.js</span> y copiar en <span style="font-family: courier new,courier;">/libs</span> el archivo <span style="font-family: courier new,courier;">phonegap.0.9.5.1.jar</span>.  Ambos archivos se encuentran bajo el directorio <span style="font-family: courier new,courier;">~/phonegap/0.9.5.1/Android</span> creado durante el paso de instalación anterior.</p><div id="attachment_16714" class="wp-caption aligncenter" style="width: 255px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0074.png"><img class="size-full wp-image-16714" title="Selection_007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0074.png" alt="Estructura del proyecto Android" width="245" height="305" /></a><p class="wp-caption-text">Estructura del proyecto Android</p></div><p>Hacer clic derecho sobre el directorio <span style="font-family: courier new,courier;">/libs</span> y seleccionar el menú <strong>Build Path</strong> &gt; <strong>Configure Build Path&#8230;</strong> Allí en la pestaña <strong>Libraries</strong> agregue la referencia a <span style="font-family: courier new,courier;">/libs/phonegap.0.9.5.1.jar</span> presionando el botón <strong>Add JARs&#8230;</strong></p><div id="attachment_16715" class="wp-caption aligncenter" style="width: 763px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0075.png"><img class="size-full wp-image-16715" title="Selection_007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0075.png" alt="Agregar al proyecto la referencia al JAR de PhoneGap." width="753" height="232" /></a><p class="wp-caption-text">Agregar al proyecto la referencia al JAR de PhoneGap.</p></div><p>Realizar las siguientes modificaciones al código fuente de la actividad.  Este archivo se ubica bajo la carpeta <span style="font-family: courier new,courier;">/src</span> del proyecto (<span style="font-family: courier new,courier;">/src/com.jimezam.phonegap.demo/App.java</span> en este caso).</p><ol><li>Reemplazar la línea 3 (<span style="font-family: courier new,courier;">import android.app.Activity;</span>) con la siguiente: <span style="font-family: courier new,courier;">import com.phonegap.*;</span></li><li>En la línea 6 cambiar la superclase de <span style="font-family: courier new,courier;">App</span> de <span style="font-family: courier new,courier;">Activity</span> a <span style="font-family: courier new,courier;">DroidGap</span>.</li><li>Reemplazar la línea 11 (<span style="font-family: courier new,courier;">setContentView(R.layout.main);</span>) con la siguiente: <span style="font-family: courier new,courier;">super.loadUrl("file:///android_asset/www/index.html");</span></li></ol><div class="mceTemp mceIEcenter" style="text-align: left;"><dl id="attachment_16716" class="wp-caption aligncenter" style="width: 741px;"><dt class="wp-caption-dt"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0076.png"><img class="size-full wp-image-16716 " title="Selection_007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0076.png" alt="Modificaciones a la actividad inicial." width="731" height="230" /></a></dt><dd class="wp-caption-dd">Modificaciones a la actividad inicial.</dd></dl></div><p>Hacer clic derecho sobre el archivo <span style="font-family: courier new,courier;">AndroidManifest.xml</span> y seleccionar el menú <strong>Open With&#8230;</strong> &gt; <strong>Text Editor</strong>.  A este documento realizar las siguientes modificaciones.</p><p>1. Agregar el siguiente texto entre la apertura de la etiqueta <span style="font-family: courier new,courier;">&lt;manifest&gt;</span> y la apertura de la etiqueta <span style="font-family: courier new,courier;">&lt;application&gt;</span>.</p><p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&lt;supports-screens</span><br /> <span style="font-family: courier new,courier;"> android:largeScreens="true"</span><br /> <span style="font-family: courier new,courier;"> android:normalScreens="true"</span><br /> <span style="font-family: courier new,courier;"> android:smallScreens="true"</span><br /> <span style="font-family: courier new,courier;"> android:resizeable="true"</span><br /> <span style="font-family: courier new,courier;"> android:anyDensity="true"</span><br /> <span style="font-family: courier new,courier;"> /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.CAMERA" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.VIBRATE" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.INTERNET" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.RECEIVE_SMS" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.READ_CONTACTS" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.WRITE_CONTACTS" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;</span></p><p>2. Agregar el siguiente atributo a la etiqueta <span style="font-family: courier new,courier;">&lt;activity&gt;</span>.</p><p style="padding-left: 30px;"><span style="font-family: courier new,courier;">android:configChanges="orientation|keyboardHidden"</span></p><div id="attachment_16717" class="wp-caption aligncenter" style="width: 732px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0077.png"><img class="size-full wp-image-16717 " title="Selection_007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0077.png" alt="Modificaciones al documento AndroidManifest.xml." width="722" height="615" /></a><p class="wp-caption-text">Modificaciones al documento AndroidManifest.xml.</p></div><p>Finalmente crear el archivo <span style="font-family: courier new,courier;">/assets/www/index.html</span> con el código fuente para la demostración.</p><p style="padding-left: 30px;"><span style="font-family: courier new,courier;">&lt;!DOCTYPE HTML&gt;</span><br /> <span style="font-family: courier new,courier;">&lt;html&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;head&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;title&gt;PhoneGap demostration with Android&lt;/title&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;script type="text/javascript" charset="utf-8" src="phonegap.js"&gt;&lt;/script&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;/head&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;body&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;h1&gt;Hello Android's World with PhoneGap&lt;/h1&gt;</span><br /> <span style="font-family: courier new,courier;"> &lt;/body&gt;</span><br /> <span style="font-family: courier new,courier;">&lt;/html&gt;</span></p><h2>Ejecutar el proyecto en el emulador.</h2><p>Seleccionar el menú <strong>Run</strong> &gt; <strong>Run As</strong> &gt; <strong>Android Application</strong>.</p><div id="attachment_16720" class="wp-caption aligncenter" style="width: 708px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Java-Eclipse-_007.png"><img class="size-full wp-image-16720" title="Java - Eclipse _007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Java-Eclipse-_007.png" alt="Ejecutar como aplicación Android." width="698" height="216" /></a><p class="wp-caption-text">Ejecutar como aplicación Android.</p></div><p>Estos son un par de ejemplos de aplicaciones web simples ejecutándose con PhoneGap en el emulador de Android.</p><table style="margin: auto;"><tbody><tr><td><p><div id="attachment_16721" class="wp-caption aligncenter" style="width: 343px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0078.png"><img class="size-full wp-image-16721" title="Selection_007" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0078.png" alt="Hola Mundo web con Android" width="333" height="494" /></a><p class="wp-caption-text">Hola Mundo web con Android</p></div></p></td><td><p><div id="attachment_16722" class="wp-caption aligncenter" style="width: 344px"><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0082.png"><img class="size-full wp-image-16722" title="Selection_008" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_0082.png" alt="The Simple List 0.1" width="334" height="495" /></a><p class="wp-caption-text">The Simple List 0.1</p></div></p></td></tr></tbody></table><h2>Enlaces.</h2><ul><li>PhoneGap.<br /> <a href="http://www.phonegap.com/" >http://www.phonegap.com/</a></li><li>PhoneGap get starter guide.<br /> <a href="http://www.phonegap.com/start#android" >http://www.phonegap.com/start#android</a></li><li>PhoneGap, Android and Eclipse quickstart.<br /> <a href="http://wiki.phonegap.com/w/page/30862722/phonegap-android-eclipse-quickstart" >http://wiki.phonegap.com/w/page/30862722/phonegap-android-eclipse-quickstart</a></li><li>PhoneGap documentation directory.<br /> <a href="http://wiki.phonegap.com/w/page/35502422/Documentation-Directory" >http://wiki.phonegap.com/w/page/35502422/Documentation-Directory</a></li></ul><p class='fb-like'><iframe src='http://www.facebook.com/plugins/like.php?href=http://blog.jorgeivanmeza.com/2011/05/primeros-pasos-con-phonegap-para-android/&amp;layout=box_count&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=65&amp;font=lucida+grande' scrolling='no' frameborder='0' allowTransparency='true' style='border:none; overflow:hidden; width:450px; height:65px'></iframe></p><fb:share -button href="http://blog.jorgeivanmeza.com/2011/05/primeros-pasos-con-phonegap-para-android/" type="box_count"></fb:share>]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2011/05/primeros-pasos-con-phonegap-para-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicación para el 6CCC: cómo llego ? Version web móvil</title>
		<link>http://blog.jorgeivanmeza.com/2011/05/aplicacion-para-el-6ccc-como-llego-version-web-movil/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aplicacion-para-el-6ccc-como-llego-version-web-movil</link>
		<comments>http://blog.jorgeivanmeza.com/2011/05/aplicacion-para-el-6ccc-como-llego-version-web-movil/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aplicacion-para-el-6ccc-como-llego-version-web-movil#comments</comments>
		<pubDate>Sat, 14 May 2011 04:07:30 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[Bing]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQTouch]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Móvil]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=16164</guid>
		<description><![CDATA[Introducción. Otro prototipo que estuve preparando para el sexto Congreso Colombiano de Computación fue una aplicación web móvil basada en jQTouch para facilitarle a los visitantes consultar fácilmente la agenda de las conferencias y obtener la ruta que se deberá recorrer para llegar a los lugares del evento o demás sitios de interés de la [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>Otro prototipo que estuve preparando para el <a href="http://blog.jorgeivanmeza.com/2011/05/aplicacion-para-el-6ccc-nuevo-estilo-para-la-programacion/" >sexto Congreso Colombiano de Computación</a> fue una aplicación web móvil basada en <a href="http://jqtouch.com/" >jQTouch</a> para facilitarle a los visitantes consultar fácilmente la agenda de las conferencias y obtener la ruta que se deberá recorrer para llegar a los lugares del evento o demás sitios de interés de la ciudad.</p><h2>El prototipo.</h2><ul><li>Como se mencionó, se desarrolló utilizando jQTouch el cual es un <em>plugin</em> de jQuery por ende, la mayor parte de la aplicación se encuentra desarrollada en Javascript.</li><li>La estructura de la información se encuentra implementada en HTML5 (sin validar aún).</li><li>Se utilizó el servicio de mapas y rutas de Bing Maps ya que según los requerimientos de esta aplicación Bing cuenta con mejor información de Colombia que los demás proveedores.</li><li>La aplicación realiza la geocodificación de la ubicación del usuario, intentando identificar la dirección en que se encuentra.</li><li>También permite realizar la geocodificación inversa (de dirección a posición geográfica) según solicitud del usuario.  En este caso parece que la calidad del servicio de Bing es inferior a la de Google y valdría la pena cambiar al proveedor de este servicio específico.</li><li>Por restricciones de seguridad de los navegadores web modernos, es necesario que el usuario autorice el acceso al GPS por parte de la aplicación web.  Si esto no se realiza, la aplicación no podrá contar con la posición del usuario en la ciudad.</li><li>Para la demostración se manipuló el código de la aplicación para que en el momento de trazar una ruta siempre se tome una ubicación en Manizales (Caldas) como posición del usuario y permitir así experimentar con esta funcionalidad del prototipo.</li></ul><table><tbody><tr><td><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_009.png"><img class="aligncenter size-medium wp-image-16165" title="Selection_009" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_009-227x300.png" alt="" width="227" height="300" /></a></td><td><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_010.png"><img class="aligncenter size-medium wp-image-16166" title="Selection_010" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_010-228x300.png" alt="" width="228" height="300" /></a></td><td><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_011.png"><img class="aligncenter size-medium wp-image-16167" title="Selection_011" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_011-227x300.png" alt="" width="227" height="300" /></a></td></tr><tr><td><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_012.png"><img class="aligncenter size-medium wp-image-16168" title="Selection_012" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_012-228x300.png" alt="" width="228" height="300" /></a></td><td><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_013.png"><img class="aligncenter size-medium wp-image-16169" title="Selection_013" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_013-228x300.png" alt="" width="228" height="300" /></a></td><td><a href="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_014.png"><img class="aligncenter size-medium wp-image-16170" title="Selection_014" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/05/Selection_014-219x300.png" alt="" width="219" height="300" /></a></td></tr></tbody></table><h2>Conclusiones.</h2><ul><li>Por falta de tiempo no pudo hacerse pública la aplicación web móvil ya que no fue posible realizar suficientes pruebas con dispositivos móviles reales.</li><li>Es necesario investigar mas acerca de jQTouch para utilizarlo en aplicaciones reales en producción.  Hasta el momento me parece una opción muy interesante para el desarrollo fácil de aplicaciones web móviles sin embargo hasta el momento no he encontrado buena documentación al respecto.</li><li>La mayor parte del prototipo se encuentra lista, espero en un futuro cercano realizar mayores pruebas y ajustes para publicarlo como una versión final.</li></ul><h2>Enlaces.</h2><ul><li>Demostración del prototipo, versión 0.1.<br /> <a href="http://demo.jorgeivanmeza.com/jQTouch/6CCCComoLlego/" >http://demo.jorgeivanmeza.com/jQTouch/6CCCComoLlego/</a></li><li>jQTouch.<br /> <a href="http://jqtouch.com/" >http://jqtouch.com/</a></li><li>Bing Maps.<br /> <a href="http://www.bing.com/maps/?showupgrade=1" >http://www.bing.com/maps/</a></li></ul><p class='fb-like'><iframe src='http://www.facebook.com/plugins/like.php?href=http://blog.jorgeivanmeza.com/2011/05/aplicacion-para-el-6ccc-como-llego-version-web-movil/&amp;layout=box_count&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=65&amp;font=lucida+grande' scrolling='no' frameborder='0' allowTransparency='true' style='border:none; overflow:hidden; width:450px; height:65px'></iframe></p><fb:share -button href="http://blog.jorgeivanmeza.com/2011/05/aplicacion-para-el-6ccc-como-llego-version-web-movil/" type="box_count"></fb:share>]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2011/05/aplicacion-para-el-6ccc-como-llego-version-web-movil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En dónde estoy y hacia dónde me dirijo ? (versión Bing)</title>
		<link>http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-donde-estoy-y-hacia-donde-me-dirijo-version-bing</link>
		<comments>http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-donde-estoy-y-hacia-donde-me-dirijo-version-bing#comments</comments>
		<pubDate>Wed, 13 Apr 2011 03:35:36 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[Bing]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[geolocalización]]></category>
		<category><![CDATA[georreferenciación]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[rutas]]></category>
		<category><![CDATA[Software geográfico]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=15287</guid>
		<description><![CDATA[Introducción. Después de implementada una primera versión de este prototipo utilizando el servicio de Google Maps, encontré una seria limitación en la funcionalidad que requería para el experimento: Google Maps no permite trazar rutas entre marcadores en Colombia.  Esta característica es funcional en otros paises y por esto implementé la posibilidad de teletransportarse para probarla, [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>Después de implementada una primera versión de este <a href="http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/" >prototipo utilizando el servicio de Google Maps</a>, encontré una seria limitación en la funcionalidad que requería para el experimento: Google Maps no permite trazar rutas entre marcadores en Colombia.  Esta característica es funcional en otros paises y por esto implementé la posibilidad de <em>teletransportarse</em> para probarla, sin embargo en Colombia no es posible.</p><p>Investigando encontré que Bing Maps, servicio de mapas similar de Microsoft, si permite realizar el trazado de rutas entre marcadores en Colombia.  Así que en la noche de ayer me dí a la tarea de revisar el API de este proveedor y de crear un nuevo prototipo con él.</p><p>Efectivamente el trazado de rutas funciona muy bien.  Con respecto a la comparación de los servicios encontré el API de Bing Maps fácil de entender y con buena documentación en Internet y provee todas las características que se habían utilizado en el prototipo anterior.  Como desventajas aparentes he encontrado que las rutas trazadas parecen no variar (además del tiempo de recorrido) independientemente si se realizan conduciendo o caminando, y el servicio de geocodificación parece ser mucho mas limitado que el de Google.</p><h2>El prototipo.</h2><div id="attachment_15288" class="wp-caption aligncenter" style="width: 670px"><a href="http://demo.jorgeivanmeza.com/BingMaps/WhereAmI/0.1/"><img class="size-full wp-image-15288  " title="Selection_001" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/04/Selection_001.png" alt="Prototipo de aplicación - Where am I and where am I heading to ?" width="660" height="425" /></a><p class="wp-caption-text">Prototipo de aplicación - Where am I and where am I heading to ?</p></div><p class='fb-like'><iframe src='http://www.facebook.com/plugins/like.php?href=http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/&amp;layout=box_count&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=65&amp;font=lucida+grande' scrolling='no' frameborder='0' allowTransparency='true' style='border:none; overflow:hidden; width:450px; height:65px'></iframe></p><fb:share -button href="http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/" type="box_count"></fb:share>]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2011/04/en-donde-estoy-y-hacia-donde-me-dirijo-version-bing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En dónde estoy y hacia dónde me dirijo ? (versión Google)</title>
		<link>http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-donde-estoy-y-hacia-donde-me-dirijo-version-google</link>
		<comments>http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-donde-estoy-y-hacia-donde-me-dirijo-version-google#comments</comments>
		<pubDate>Wed, 16 Mar 2011 18:10:49 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[geolocalización]]></category>
		<category><![CDATA[georreferenciación]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[rutas]]></category>
		<category><![CDATA[Software geográfico]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=14813</guid>
		<description><![CDATA[Introducción. Esta semana decidí experimentar un poco mas con la versión 3 del API de Google Maps que fue liberado hace relativamente poco.  Esta vez, quise hacer un prototipo sencillo pero interesante que integrara las principales funcionalidades que el servicio de Google Maps ofrece en los navegadores web actuales. En este caso utilicé los mapas, [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>Esta semana decidí experimentar un poco mas con la versión 3 del API de Google Maps que fue liberado hace relativamente poco.  Esta vez, quise hacer un prototipo sencillo pero interesante que integrara las principales funcionalidades que el servicio de Google Maps ofrece en los navegadores web actuales.</p><p>En este caso utilicé los mapas, la geocodificación y el trazado de rutas de Google y el servicio de geolocalización basada en el navegador web para obtener la siguiente funcionalidad.</p><ul><li>El servicio de geolocalización del navegador web permite situar al usuario en el espacio sin el uso de un GPS, esto gracias a una aproximación que aparentemente depende de la infraestructura del ISP.  A través de este servicio hace un par de meses lograba una geolocalización casi precisa de mi casa, mientras que recientemente sugiere que vivo en Cali/Valle, una ciudad que queda a unas 3 horas de viaje.</li><li>El servicio de mapas permite situar gráficamente dos puntos: uno el del usuario geolocalizado y otro, un punto de destino que se elige libremente con el botón izquierdo del ratón.</li><li>El servicio de rutas de Google permite trazar el camino necesario para llegar desde el punto de orígen hasta el punto de destino distinguiendo si el recorrido se hace caminando o conduciendo un vehículo.  Este servicio se complementa con el servicio de direcciones que determina las indicaciones que se deben seguir para llegar efectivamente al destino elegido.</li><li>El último servicio utilizado corresponde con el de geocodificación que permite convertir el nombre de una ubicación (una ciudad por ejemplo) a su correspondiente coordenada geográfica (latitud y longitud).  Esto se utiliza para el sistema de <em>teletransportación</em> del usuario que permite ubicarlo en cualquier lugar que se especifique.</li></ul><p>El aprovechamiento de estos APIs desde Javascript fue muy simple de implementar y fácilmente se desarrolló el prototipo.  Desafortunadamente Google no cuenta con el servicio de trazado de rutas en Colombia, motivo por el cual estoy revisando los servicios ofrecidos por BingMaps y OpenStreetMaps para continuar mi experimentación.</p><h2>El prototipo.</h2><div id="attachment_14821" class="wp-caption aligncenter" style="width: 670px"><a href="http://demo.jorgeivanmeza.com/GMaps/WhereAmI/"><img class="size-full wp-image-14821" title="screenshot" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2011/03/screenshot.png" alt="Prototipo de aplicación - Where am I and where am I heading to ?" width="660" height="423" /></a><p class="wp-caption-text">Prototipo de aplicación - Where am I and where am I heading to ?</p></div><h2>Enlaces.</h2><ul><li>Prototipo funcional del proyecto.<br /> <a href="http://demo.jorgeivanmeza.com/GMaps/WhereAmI/" >http://demo.jorgeivanmeza.com/GMaps/WhereAmI/</a></li><li>W3C Geolocation API specification.<br /> <a href="http://dev.w3.org/geo/api/spec-source.html" >http://dev.w3.org/geo/api/spec-source.html</a></li><li>Google Maps API Family.<br /> <a href="http://code.google.com/apis/maps/index.html" >http://code.google.com/apis/maps/index.html</a></li></ul><p class='fb-like'><iframe src='http://www.facebook.com/plugins/like.php?href=http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/&amp;layout=box_count&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=65&amp;font=lucida+grande' scrolling='no' frameborder='0' allowTransparency='true' style='border:none; overflow:hidden; width:450px; height:65px'></iframe></p><fb:share -button href="http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/" type="box_count"></fb:share>]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2011/03/en-donde-estoy-y-hacia-donde-me-dirijo-version-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Georreferenciar inversamente con el API v3 de Google Maps utilizando Javascript</title>
		<link>http://blog.jorgeivanmeza.com/2010/10/georreferenciar-inversamente-con-el-api-v3-de-google-maps-utilizando-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=georreferenciar-inversamente-con-el-api-v3-de-google-maps-utilizando-javascript</link>
		<comments>http://blog.jorgeivanmeza.com/2010/10/georreferenciar-inversamente-con-el-api-v3-de-google-maps-utilizando-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=georreferenciar-inversamente-con-el-api-v3-de-google-maps-utilizando-javascript#comments</comments>
		<pubDate>Wed, 27 Oct 2010 01:54:58 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[georreferenciación]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software geográfico]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=10861</guid>
		<description><![CDATA[Introducción. La georreferenciación inversa es el proceso contrario al descrito anteriormente, corresponde al obtener el nombre de una ubicación (topónimo) a partir de su ubicación geográfica, en términos de latitud y longitud. La aplicación de demostración. En el ejemplo equivale a conocer la ubicación del sitio: latitud = 5.073375 y longitud = -75.495155, y con esta información [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>La georreferenciación inversa es el proceso contrario al descrito anteriormente, corresponde al obtener el nombre de una ubicación (topónimo) a partir de su ubicación geográfica, en términos de latitud y longitud.</p><h2>La aplicación de demostración.</h2><div id="attachment_10862" class="wp-caption aligncenter" style="width: 983px"><a href="http://demo.jorgeivanmeza.com/GMaps/GeocodeAPI3Demo/0.1/reverse.html"><img class="size-full wp-image-10862" title="Selection_002" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2010/10/Selection_002.png" alt="Aplicación de demostración para la georreferenciación inversa con el API 3 de Google Maps" width="973" height="641" /></a><p class="wp-caption-text">Aplicación de demostración para la georreferenciación inversa con el API 3 de Google Maps</p></div><p>En el ejemplo equivale a conocer la ubicación del sitio: <span style="font-family: 'courier new', courier;">latitud = 5.073375</span> y <span style="font-family: 'courier new', courier;">longitud = -75.495155</span>, y con esta información determinar que los siguientes sitios corresponden con esa posición.</p><ul><li>Carrera 12, Manizales, Caldas, Colombia.</li><li>Manizales, Caldas, Colombia.</li><li>Caldas, Colombia.</li><li>Colombia.</li></ul><h2>La implementación.</h2><p>Su implementación es una versión ligeramente mas simple que la <a href="http://blog.jorgeivanmeza.com/2010/10/georreferenciar-con-el-api-v3-de-google-maps-utilizando-javascript/" >georreferenciación directa</a>.</p><p>A continuación se detallan a nivel general las variaciones de esta modalidad de georreferenciación con respecto a la expuesta en un artículo anterior.</p><h3>Del lado de Javascript.</h3><p>Se asocia el evento de clic sobre el mapa con la función que realizará la georreferenciación inversa (<span style="font-family: 'courier new', courier;">processReverseGeocoding</span>).</p><pre class="javascript">google.maps.event.addListener(map, 'click', function(event) {
    processReverseGeocoding(event.latLng, showMarkerInfo);
});</pre><p>En esta función se realiza el proceso de georreferenciación inversa el cual, al igual que su contraparte directa, es asíncrono y por este motivo se utiliza la misma estrategia del <em>callback</em>.</p><pre class="javascript">var request = {
    latLng: location
}
geocoder.geocode(request, function(results, status) {
    // ...
});</pre><p>La función <span style="font-family: 'courier new', courier;">showMarkerInfo</span> es ejecutada cuando se finaliza la georreferenciación inversa y esta ha obtenido resultados válidos.  Su misión es la mostrar la información resultante en el mapa.</p><pre class="javascript">    function showMarkerInfo(locations)
    {
        // Centra el mapa en la ubicación especificada
        map.setCenter(locations[0].geometry.location);
        // Crea el mensaje para mostrar la información georreferenciada
        var infoWindow = new google.maps.InfoWindow();
        infoWindow.setPosition(locations[0].geometry.location);
        // Prepara el mensaje con la información obtenida del proceso
        // de georreferenciación inversa
        var content = 'Latitud:  ' + locations[0].geometry.location.lat() + '&lt;br /&gt;' +
                      'Longitud:  ' + locations[0].geometry.location.lng() + '&lt;br /&gt;' +
                      '&lt;br /&gt;Topónimos:&lt;br /&gt;&lt;ul&gt;';
        for (var i=0; i&lt;locations.length; i++)
        {
            if (locations[i].formatted_address)
                content += '&lt;li&gt;' + locations[i].formatted_address + '&lt;/li&gt;';
            else
                content += '&lt;li&gt;No se encontró información.&lt;/li&gt;';
        }
        content += "&lt;/ul&gt;";
        infoWindow.setContent(content);
        // Muestra el mensaje sobre el mapa
        infoWindow.open(map);
    }</pre><h2>Enlaces.</h2><ul><li>Aplicación de demostración del API v3 de georreferenciación inversa de Google Maps 0.1.<br /> <a href="http://demo.jorgeivanmeza.com/GMaps/GeocodeAPI3Demo/0.1/reverse.html" >http://demo.jorgeivanmeza.com/GMaps/GeocodeAPI3Demo/0.1/reverse.html</a></li><li>The Google Geocoding API.<br /> <a href="http://code.google.com/apis/maps/documentation/geocoding/index.html" >http://code.google.com/apis/maps/documentation/geocoding/index.html</a></li><li>Geocoding service.<br /> <a href="http://code.google.com/apis/maps/documentation/javascript/services.html#Geocoding" >http://code.google.com/apis/maps/documentation/javascript/services.html#Geocoding</a></li></ul><div id="gdsr_thumb_10843_a_up"><a id="gdsrX10843XupXaX31X32XY" rel="nofollow"></a></div><div id="gdsr_thumb_10843_a_dw"><a id="gdsrX10843XdwXaX31X32XY" rel="nofollow"></a></div> ]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/10/georreferenciar-inversamente-con-el-api-v3-de-google-maps-utilizando-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Georreferenciar con el API v3 de Google Maps utilizando Javascript</title>
		<link>http://blog.jorgeivanmeza.com/2010/10/georreferenciar-con-el-api-v3-de-google-maps-utilizando-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=georreferenciar-con-el-api-v3-de-google-maps-utilizando-javascript</link>
		<comments>http://blog.jorgeivanmeza.com/2010/10/georreferenciar-con-el-api-v3-de-google-maps-utilizando-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=georreferenciar-con-el-api-v3-de-google-maps-utilizando-javascript#comments</comments>
		<pubDate>Wed, 27 Oct 2010 00:02:37 +0000</pubDate>
		<dc:creator>jimezam</dc:creator>
				<category><![CDATA[Sindicados]]></category>
		<category><![CDATA[Desarrollo de software]]></category>
		<category><![CDATA[georreferenciación]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[Hipergalaxia]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Software geográfico]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.jorgeivanmeza.com/?p=10843</guid>
		<description><![CDATA[Introducción. La georreferenciación es el proceso de determinar la ubicación (latitud, longitud) de una ubicación en la tierra según su nombre (topónimo). Si estoy en Manizales, Caldas, Colombia estaré realmente en latitud 5.07, longitud -75.52056. Existen varias formas de realizar este proceso dependiendo de los lenguajes de programación, interfaces y fuentes de información utilizados.  Anteriormente expliqué como [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción.</h2><p>La georreferenciación es el proceso de determinar la ubicación (latitud, longitud) de una ubicación en la tierra según su nombre (topónimo).</p><p style="padding-left: 30px;">Si estoy en <strong>Manizales, Caldas, Colombia</strong> estaré realmente en <a href="http://maps.google.com/maps/api/staticmap?&amp;amp;zoom=7&amp;amp;size=300x450&amp;amp;sensor=false&amp;amp;markers=color:blue%7Clabel:X%7C5.07,-75.52056" ><strong>latitud 5.07, longitud -75.52056</strong></a>.</p><p>Existen varias formas de realizar este proceso dependiendo de los lenguajes de programación, interfaces y fuentes de información utilizados.  Anteriormente expliqué como hacerlo <a href="http://blog.jorgeivanmeza.com/2010/10/georreferenciando-de-manera-facil-y-simple-con-geonames-utilizando-cmono/" >utilizando C#/Mono y el servicio web de Geonames</a>, en este caso voy a utilizar el API Javascript versión 3 de Google Maps.</p><h2>La aplicación de demostración.</h2><div id="attachment_10844" class="wp-caption aligncenter" style="width: 775px"><a href="http://demo.jorgeivanmeza.com/GMaps/GeocodeAPI3Demo/0.1/demo.html"><img class="size-full wp-image-10844 " title="Selection_001" src="http://blog.jorgeivanmeza.com/wp-content/uploads/2010/10/Selection_0012.png" alt="Aplicación de demostración para la georreferenciación con el API 3 de Google Maps" width="765" height="579" /></a><p class="wp-caption-text">Aplicación de demostración para la georreferenciación con el API 3 de Google Maps</p></div><p>Como se mencionó anteriormente, la funcionalidad es precisa: convertir el nombre de una ubicación en su correspondiente localización en términos de latitud y longitud, y mostrarla en el mapa.</p><h2>La implementación.</h2><h3>Del lado de Javascript.</h3><p>Incluír la referencia al API de Google Maps.</p><pre class="javascript">&lt;script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&amp;language=es"&gt;&lt;/script&gt;</pre><p>Instanciar el geocodificador.</p><pre class="javascript">var geocoder = new google.maps.Geocoder();</pre><p>Crear el mapa.</p><pre class="javascript">window.onload = function() {
    var options = {
        zoom: 5,
        center: new google.maps.LatLng(4, -72),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById('map'), options);
    // ...</pre><p>Establecer la funcionalidad del botón <strong>Buscar</strong>.</p><pre class="javascript">    document.getElementById('search').onclick = function() {
            // Obtiene la ubicación (string) a georreferenciar
            var location = document.getElementById('location').value;
            // Inicia el proceso de georreferenciación (asíncrono)
            processGeocoding(location, addMarkers);
            // Detiene el procesamiento del evento
            return false;
        }
    } // Fin del método window.onload</pre><p>El proceso de georreferenciación es asíncrono así que es necesario especificar una función (<em>callback</em>) para que se ejecute si la georreferenciación termina exitosamente.</p><p>El núcleo de la georreferenciación se realiza en la invocación al método <span style="font-family: 'courier new', courier;">geocoder.geocode(opciones, implementacion)</span>.  Es necesario determinar el estado final (<span style="font-family: 'courier new', courier;">status</span>) después de la ejecución asíncrona para determinar que acción puede realizarse con los datos resultantes.</p><pre class="javascript">    function processGeocoding(location, callback)
    {
        // Propiedades de la georreferenciación
        var request = {
            address: location
        }
        // Invocación a la georreferenciación (proceso asíncrono)
        geocoder.geocode(request, function(results, status) {
            /*
             * OK
             * ZERO_RESULTS
             * OVER_QUERY_LIMIT
             * REQUEST_DENIED
             * INVALID_REQUEST
             */
            // Notifica al usuario el resultado obtenido
            document.getElementById('message').innerHTML = "Respuesta obtenida: " + status;
            // En caso de terminarse exitosamente el proyecto ...
            if(status == google.maps.GeocoderStatus.OK)
            {
                // Invoca la función de callback
                callback (results);
                // Retorna los resultados obtenidos
                return results;
            }
            // En caso de error retorna el estado
            return status;
        });
    }</pre><p>La función enviada como <em>callback</em> (<span style="font-family: 'courier new', courier;">addMarkers</span>) es la responsable de tomar las ubicaciones retornadas por la georreferenciación, crearles marcadores, ventanas de información, asociarlas al evento de clic y mostrarlas en el mapa.</p><pre class="javascript">   function addMarkers(geocodes)
    {
        for(i=0; i&lt;geocodes.length; i++)
        {
            // Centra el mapa en la nueva ubicación
            map.setCenter(geocodes[i].geometry.location);
            // Valores iniciales del marcador
            var marker = new google.maps.Marker({
                map: map,
                title: geocodes[i].formatted_address
            });
            // Establece la ubicación del marcador
            marker.setPosition(geocodes[i].geometry.location);
            // Establece el contenido de la ventana de información
            var infoWindow = new google.maps.InfoWindow();
            content = "Ubicación: " + geocodes[i].formatted_address + "&lt;br /&gt;" +
                      "Tipo: " + geocodes[i].types + "&lt;br /&gt;" +
                      "Latitud: " + geocodes[i].geometry.location.lat() + "&lt;br /&gt;" +
                      "Longitud: " + geocodes[i].geometry.location.lng();
            infoWindow.setContent(content);
            // Asocia el evento de clic sobre el marcador con el despliegue
            // de la ventana de información
            google.maps.event.addListener(marker, 'click', function(event) {
                infoWindow.open(map, marker);
            });
        }
    }</pre><h3>Del lado de HTML.</h3><p>Se implementa una estructura muy simple para desplegar la información.  Una primera parte permite desplegar el mensaje de información acerca del estado del proceso y le permite al usuario ingresar el nombre de la ubicación a georreferenciar.</p><pre class="html">    &lt;!-- Mensaje de estado --&gt;
    &lt;div id="message"&gt;&lt;/div&gt;
    &lt;!-- Ubicación a georreferenciarse --&gt;
    &lt;label for="location"&gt;Ubicación:&lt;/label&gt;
    &lt;input type="text" id="location" name="location" value="" size="40" /&gt;
    &lt;!-- Botón para inciar la georreferenciación --&gt;
    &lt;input type="button" id="search" name="search" value="Buscar" /&gt;</pre><p>Una segunda parte establece la ubicación para desplegar el mapa.</p><pre class="html">&lt;!-- Lugar de despliegue del mapa --&gt;
&lt;div id="map"&gt;&lt;/div&gt;</pre><h2>Enlaces.</h2><ul><li>Aplicación de demostración del API v3 de georreferenciación de Google Maps 0.1.<br /> <a href="http://demo.jorgeivanmeza.com/GMaps/GeocodeAPI3Demo/0.1/demo.html">http://demo.jorgeivanmeza.com/GMaps/GeocodeAPI3Demo/0.1/demo.html</a></li><li>The Google Geocoding API.<br /> <a href="http://code.google.com/apis/maps/documentation/geocoding/index.html" >http://code.google.com/apis/maps/documentation/geocoding/index.html</a></li><li> Geocoding service.<br /> <a href="http://code.google.com/apis/maps/documentation/javascript/services.html#Geocoding" >http://code.google.com/apis/maps/documentation/javascript/services.html#Geocoding</a></li></ul> ]]></content:encoded>
			<wfw:commentRss>http://blog.jorgeivanmeza.com/2010/10/georreferenciar-con-el-api-v3-de-google-maps-utilizando-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

