<?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>Nokrosis &#187; XML</title>
	<atom:link href="http://nokrosis.com/tag/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://nokrosis.com</link>
	<description>Tecnología, programación, entretenimiento, conocimiento.</description>
	<lastBuildDate>Fri, 07 May 2010 13:11:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Extensiones Firefox: Estableciendo nuestro entorno de desarrollo</title>
		<link>http://nokrosis.com/2009/04/extensiones-firefox-estableciendo-nuestro-entorno-de-desarrollo/</link>
		<comments>http://nokrosis.com/2009/04/extensiones-firefox-estableciendo-nuestro-entorno-de-desarrollo/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 08:57:14 +0000</pubDate>
		<dc:creator>Nokrosis</dc:creator>
				<category><![CDATA[Extensiones para Firefox]]></category>
		<category><![CDATA[Extensiones Firefox]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://nokrosis.com/?p=121</guid>
		<description><![CDATA[Este es el primero de una serie de posts con los que aprenderé y compartiré mis avances en la creación de Extensiones para Firefox, espero que sea de ayuda para quienes comienzan iniciándose con su desarrollo. Este tutorial lo realizaré usando Ubuntu 8.10 y Firefox 3.0.8. Para comandos específicos de tu sistema operativo puedes revisar [...]]]></description>
			<content:encoded><![CDATA[<p>Este es el primero de una serie de posts con los que aprenderé y compartiré mis avances en la creación de Extensiones para Firefox, espero que sea de ayuda para quienes comienzan iniciándose con su desarrollo.</p>
<p class="warning">Este tutorial lo realizaré usando Ubuntu 8.10 y Firefox 3.0.8. Para comandos específicos de tu sistema operativo puedes revisar la <a href="https://developer.mozilla.org/en/Setting_up_extension_development_environment" target="_blank">documentación de Mozilla</a></p>
<h2>¿Qué necesito saber?</h2>
<ul>
<li>Javascript</li>
<li>Nociones de XML</li>
<li>Estar familiarizado con la línea de comando</li>
<li>Conocimiento básico de inglés (sobre todo para leer información externa a esta guia)</li>
<li>Sed de aprendizaje</li>
</ul>
<p>En este primer post, realizaremos lo siguiente:</p>
<ul>
<li>Estableceremos un entorno de desarrollo sencillo</li>
<li>Crearemos una pequeña extension de prueba que nos permitirá probar nuestro entorno.</li>
</ul>
<p><span id="more-121"></span></p>
<h2>Estableciendo el entorno de desarrollo sencillo</h2>
<p>Lo primero que debemos hacer es crear un perfil distinto al que usamos en Firefox con la finalidad de que, en caso de ocurrir algún error grave, no dañemos los datos que tenemos guardados en nuestro firefox como Marcadores, Extensiones,Preferencias, etc.</p>
<p>Esto lo conseguimos corriendo Firefox desde la línea de comandos con los siguientes parámetros:</p>
<pre>firefox -no-remote -P dev</pre>
<p>Con esto estamos corriendo Firefox usando el Perfil &#8220;dev&#8221;. Al correrlo por primera vez, se lanzará el Administrador de perfiles de firefox. Pulsaremos el botón &#8220;Create Profile..&#8221; y estableceremos el nombre de nuestro perfil de desarrollo &#8220;dev&#8221;, de esta forma tendremos dos perfiles distintos: default, que es el predeterminado y dev, que será nuestro perfil de desarrollo.</p>
<p><img class="aligncenter size-medium wp-image-124" title="Profile Manager" src="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo-firefox-choose-user-profile-300x193.png" alt="Profile Manager" width="300" height="193" /></p>
<p class="info">Para correr Firefox con este perfil sin usar la línea de comandos, podemos crear un acceso directo o un launcher dependiendo de nuestro sistema operativo.</p>
<p>Una vez iniciado nuestro navegador con el perfil de desarrollo, procedemos a modificar la configuración que nos será útil en el momento del desarrollo. Esto lo realizamos ingresando &#8216;about:config&#8217; en la barra de direcciones. Obtendremos una advertencia. Ya que somos desarrolladores y sabemos lo que hacemos (ajá), aceptamos y prometemos con la mano en el pecho que serémos cuidadosos.</p>
<p style="text-align: center;"><a href="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo-aboutconfig-mozilla-firefox.png"><img class="aligncenter size-medium wp-image-126" title="about:config Advertencia" src="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo-aboutconfig-mozilla-firefox-300x260.png" alt="about:config Advertencia" width="300" height="260" /></a></p>
<p style="text-align: left;">Utilizaremos el Filtro para buscar las variables de configuración. En caso de no existir las crearemos con <strong>Click derecho -&gt; Nuevo -&gt; Lógico. </strong>Estas son las variables que modificaremos y el valor que debemos establecerle.</p>
<ul>
<li><strong>javascript.options.showInConsole</strong> = <strong>true</strong>. Guarda los errores en los archivos del chrome en la <a rel="internal" href="https://developer.mozilla.org/en/Error_Console">Consola de errores</a>.</li>
<li><strong>nglayout.debug.disable_xul_cache</strong> = <strong>true</strong>. Deshabilita el cache de XUL de tal forma que los cambios a las ventanas y diálogos no requieren reiniciar.</li>
<li><strong>browser.dom.window.dump.enabled</strong> = <strong>true</strong>. Nos permite usar la sentencia dump() para imprimir en la consola standard. Ver <span class="lang lang-en"><code><a rel="internal" href="https://developer.mozilla.org/en/DOM/window.dump">window.dump</a></code> </span>para mas información.</li>
<li><strong>javascript.options.strict</strong> = <strong>true</strong>. Habilita las advertencias estrictas de JavaScript en la consola de errores.</li>
<li><strong>extensions.logging.enabled</strong> = <strong>true</strong>. Enviará información más detallada acerca de problemas con la instalación y actualización en la Consola de errores.</li>
</ul>
<p>Posteriormente instalaremos alguna extensión que nos ayude en la creación y pruebas de nuestra nueva extensión. Para este tutorial usaré la extensión <a href="https://addons.mozilla.org/en-US/firefox/addon/7434/">Extension Developer&#8217;s Extension</a> que es específica para nuestra tarea y es un todo en uno para el desarrollo de extensiones. Si encuentras más útil alguna otra, puedes usarla y si crees que es mejor que ésta, coméntalo y comparte.</p>
<p>Descargamos e instalamos la extensión de la forma clásica presionando el botón verde que dice &#8220;Add to Firefox&#8221; y reiniciamos el navegador. (Automáticamente reiniciará en el perfil de desarrollo). Encontraremos los comandos de la extensión en el menú Herramientas.</p>
<p><img class="aligncenter size-full wp-image-130" title="Extension Developer's Extension" src="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo-extension-developer.png" alt="Extension Developer's Extension" width="557" height="347" /></p>
<p style="text-align: left;">Ahora creamos una carpeta en donde comenzaremos a desarrollar nuestra extensión. Puede ser en cualquier lugar, ya que la extensión que acabamos de instalar nos permite indicarle en qué directorio trabajaremos. Yo específicamente hice una carpeta &#8216;extensiones&#8217; dentro de la que trabajaré todas las extensiones que voy a hacer.</p>
<p style="text-align: left;">Dentro de esta carpeta crearemos nuestra primera extensión que nos servirá de prueba para comenzar nuestro desarrollo. Esta carpeta será llamada &#8216;hola_mundo&#8217;.</p>
<p style="text-align: left;">Una vez creada la carpeta vamos al menú Herramientas -&gt; Extension Developer -&gt; Extension Builder.  En esta ventana comenzaremos a crear nuestra nueva extensión. El primer dato solicitado es &#8220;Working Directory&#8221; que será específicamente la carpeta de nuestra nueva extensión. Notaremos que al seleccionar la carpeta de nuestra extensión (hola_mundo). Se le asignará automáticamente el nombre de la carpeta a nuestra extensión (aunque podremos cambiarlo manualmente).</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-131" title="Extension Builder" src="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo-extension-builder.png" alt="Extension Builder" width="500" height="400" /></p>
<p style="text-align: left;">Una extensión es un archivo empaquetado en un formato zip con una extensión xpi (pronunciada zippy). Dentro de él tendremos la siguiente estructura básica de archivos (extisten más carpetas y compontentes, pero éstos son los mínimos requeridos).</p>
<pre style="text-align: left;">install.rdf
chrome.manifest
chrome\
   content\</pre>
<p>El archivo install.rdf es un archivo xml con una estructura definida que contendrá información acerca de nuestra extensión como el nombre del creador (osea nosotros), la versión de la extensión, las versiones de firefox en donde funciona, etc. Dado que de momento estamos estableciendo el entorno y la extensión de desarrollo nos genera el archivo de una forma más sencilla, aún no ahondaremos en las opciones completas del <a href="https://developer.mozilla.org/en/Install_Manifests" target="_blank">manifiesto de instalación</a>.</p>
<p>El archivo chrome.manifest es otro archivo clave para la extensión, en él registraremos nuestros archivos de la extensión. Así que creamos nuestro archivo de texto chrome.manifest y guardamos lo siguiente en él.</p>
<pre>content hola_mundo chrome/content/
overlay chrome://browser/content/browser.xul chrome://hola_mundo/content/hola_mundo.xul</pre>
<p>De esta manera estamos diciendo a Firefox que registre el contenido &#8220;hola_mundo&#8221; que se encuentra en la ruta (relativa a chrome.manifest), &#8216;chrome/content/&#8217;. No olvides la diagonal al final, ya que de no ser así, el contenido no será registrado. En la línea siguiente registramos una superposición al chrome original del navegador mediante un archivo XUL que crearemos en un momento.</p>
<p>Luego creamos la carpeta &#8216;chrome&#8217; y dentro de ella la carpeta &#8216;content&#8217;. Dentro de ésta última es donde crearemos nuestro archivo XUL.</p>
<p class="info">XUL es una estructura XML que utiliza Firefox para definir y presentar sus elementos en la ventana, e incluso la ventana misma (esto se denomina Chrome). Con un archivo XUL podemos extender y manipular la estructura y disposición de los elementos en la ventana del navegador.</p>
<p class="info">CHROME es el nombre que se le da precisamente a los elementos del navegador que no forman parte del sitio que estamos visitando, como la barra de estado, botones de navegación, etc. No se debe confundir con Google Chrome, ya que precisamente se le dio ese nombre al navegador de manera sarcástica ya que éste carece de CHROME.</p>
<p style="text-align: left;">Creamos un archivo llamado hola_mundo.xul dentro de nuestra carpeta content y le agregamos el siguiente texto:</p>
<pre style="text-align: left; padding-left: 30px;">&lt;?xml version="1.0"?&gt;
&lt;overlay id="hola_mundo"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"&gt;
&lt;statusbar id="<strong>status-bar</strong>"&gt;
    &lt;statusbarpanel id="mi-panel" label="Hola Mundo !"  /&gt;
&lt;/statusbar&gt;
&lt;/overlay&gt;</pre>
<p>Con este último archivo estamos modificando la estructura básica del navegador. Estamos superponiendo un panel al elemento<strong> status-bar</strong> con el identificador &#8216;mi-panel&#8217; y una etiqueta &#8220;Hola Mundo!&#8221;.</p>
<p>Ahora volvemos a la Herramienta Extension Builder y volvemos a cargar nuestra carpeta &#8220;Hola Mundo&#8221;. Ahora editaremos la información básica de nuestra extensión, presionamos el botón &#8220;Edit install.rdf&#8221; y nos presentará un formulario que llenaremos con la información de nuestra primera extensión.</p>
<p style="text-align: center;"><a href="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo-edit-installrdf.png"><img class="aligncenter size-medium wp-image-133" title="Install.rdf" src="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo-edit-installrdf-174x300.png" alt="Install.rdf" width="174" height="300" /></a></p>
<p>Presionamos &#8220;Save&#8221; (No hay algun aviso explícito de que se haya guardado, así que confiemos en que lo hizo) y presionamos Close para cerrar la ventana.</p>
<p>Ahora, podemos notar que ya está activo el botón &#8220;Build Extension&#8221;, lo presionamos para que nos genere el archivo XPI. Vemos en la barra de estado que aparece la leyenda: Built hola_mundo.xpi</p>
<p>Ahora vamos a nuestra carpeta de la extensión y encontraremos nuestra extensión empaquetada y lista para probar. La abrimos con nuestro Firefox de desarrollo. y la instalamos como cualquier extensión normal. Nos pedirá reiniciar Firefox.</p>
<p>Al reiniciarse veremos que nuestra extensión ¡ya está corriendo en Firefox !. En la barra de estado en la esquina inferior derecha observaremos nuestra superposición &#8220;Hola Mundo!&#8221;. Felicidades !! acabamos de dar el primer paso en la creación de extensiones.</p>
<p><img class="aligncenter size-full wp-image-134" title="Hola Mundo" src="http://nokrosis.com/wp-content/uploads/2009/04/pantallazo.png" alt="Hola Mundo" width="342" height="255" /></p>
<p>Más adelante veremos tareas más avanzadas y cómo podemos ayudarnos con la extensión para desarrolladores de extensiones que instalamos en nuestro Firefox de desarrollo.</p>
<p>Espero tus comentarios, trackbacks, dudas y sugerencias.</p>
]]></content:encoded>
			<wfw:commentRss>http://nokrosis.com/2009/04/extensiones-firefox-estableciendo-nuestro-entorno-de-desarrollo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Conociendo las APIs (Parte 2)</title>
		<link>http://nokrosis.com/2008/07/conociendo-las-apis-parte-2/</link>
		<comments>http://nokrosis.com/2008/07/conociendo-las-apis-parte-2/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 03:20:45 +0000</pubDate>
		<dc:creator>Nokrosis</dc:creator>
				<category><![CDATA[Conociendo las APIs]]></category>
		<category><![CDATA[API's]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://nokrosis.com/?p=13</guid>
		<description><![CDATA[En el post anterior vimos los formularios web y observamos lo que sucedia &#8220;tras bambalinas&#8221; en términos de solicitudes y datos transferidos; como ejemplo, intentamos emular un formulario web específico por medio de un script PHP que enviaba una solicitud al servidor web e interpretaba el resultado para obtener información relevante. La conclusión fue: es [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nokrosis.com/2008/07/conociendo-las-apis-parte-1">En el post anterior</a> vimos los formularios web y observamos lo que sucedia &#8220;tras bambalinas&#8221; en términos de solicitudes y datos transferidos; como ejemplo, intentamos emular un formulario web específico por medio de un script PHP que enviaba una solicitud al servidor web e interpretaba el resultado para obtener información relevante. La conclusión fue: <strong>es posible, pero no es limpio.</strong> En esta entrada veremos qué tan transparente puede ser la automatización.</p>
<h2>Parte 2: El XML rocks!</h2>
<p>Una <strong>Interfaz de Programación de Aplicaciones (API en inglés)</strong> es una colección de procedimientos predefinidos para que un programa pueda usar a otro. En la Internet, una API hará posible que una <strong>computadora</strong> use a otra. Contrariamente al método del hacker explicado previamente, las APIs están destinadas a ser soportadas oficialmente por los propietarios de la aplicación web a través de documentación y soporte extensos. Tu script ya no intentará imitar de forma humana los nombres de variables y la URL del action, sino que más bien tomará <strong>su propia ruta para obtener datos del servidor.</strong><span id="more-13"></span></p>
<p>Las mayoría de las APIs se basan en <strong>XML</strong>, que hace posible transferir datos estructurados a través de la web. Básicamente, en lugar de enviar variables POST simples al servidor y recibir HTML, tu petición enviará y recibirá datos XML <strong>limpios e inmutables.</strong></p>
<p>Al inicio, no hay límite para imaginar y diseñar una API. Basándonos en los ejemplos de la <a href="http://nokrosis.com/2008/07/conociendo-las-apis-parte-1">parte 1</a>, podemos imaginar la siguiente forma de solicitud y respuesta:</p>
<pre>POST /submit HTTP/1.1
Host: api.community.com
Content-Length: 125
Content-Type: application/text-xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
 &lt;datos&gt;
	&lt;nombre&gt;Juan&lt;/nombre&gt;
	&lt;ciudad&gt;Guadalajara&lt;/ciudad&gt;
	&lt;edad&gt;23&lt;/edad&gt;
 &lt;/datos&gt;</pre>
<p><em>Nota: es muy comun diseñar la API de tal forma que las solicitudes se envíen a un subdominio como api.comunidad.com. De esta forma, las solicitudes al subdominio <strong>www</strong> se supone que son enviadas por seres humanos y devuelven respuestas HTML mientras que las solicitudes en el subdominio <strong>api</strong> se supone que son enviadas por computadoras y devuelven respuestas XML. También notemos que quité la extensión .php de la página de <strong>submit </strong>(envío): a través de la API, no estamos accesando a una <strong>página</strong> sino a un <strong>recurso</strong>.<br />
</em></p>
<pre>HTTP/1.1 200 OK
Date: Tue, 17 Jun 2008 20:24:00 GMT
Content-Length: 111
Content-Type: application/text-xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;datos&gt;
    &lt;nombre&gt;Anna&lt;/nombre&gt;
    &lt;nombre&gt;Lisa&lt;/nombre&gt;
  &lt;/datos&gt;</pre>
<p>Programáticamente hablando, codificar la solicitud en PHP es posible usando <a href="http://php.net/curl">cURL</a> e interpretar la respuesta certamente sería más fácil usando <a href="http://php.net/simplexml">SimpleXML</a> (incluida en PHP5). Por lo tanto, implementar la llamada API anterior en PHP se vería así:</p>
<pre>&lt;?php

   // PASO 1: ENVIAR LA SOLICITUD
   $url = 'http://api.comunidad.com/submit';
   $header = array('Content-type: application/text-xml');
   $xml = '&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;data&gt;&lt;name&gt;Joe&lt;/name&gt;
           &lt;city&gt;Indianapolis&lt;/city&gt;&lt;age&gt;23&lt;/age&lt;/data&gt;';
   $handle = curl_init();
   curl_setopt($handle, CURLOPT_URL, $url);
   curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
   curl_setopt($handle, CURLOPT_POSTFIELDS, $xml);
   curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
   $response = curl_exec($handle);
   curl_close($handle);

   // PASO 2: INTERPRETAR EL RESULTADO E IMPRIMIR LOS NOMBRES
   $result = new SimpleXMLElement($response);
   $val = array();
   foreach ($result-&gt;nombre as $nombre) {
      $val[] = (string) $nombre;
   }
   print_r($values);

?&gt;</pre>
<p><em>Nots: en este script cURL tuve que especificar el encabezado <strong>Content-type</strong> para que nuestra solicitud fuera interpretada correctamente por el servidor. Pude haber usado algunas opciones más como CURLOPT_TIMEOUT, por ejemplo.<br />
</em></p>
<p>Usar una API es mejor que forzar un formulario web por 3 razones:</p>
<ul>
<li>La solicitud pasa por una ruta especial diseñada para computadoras que está claramente definida en el subdominio api.comunidad.com</li>
<li>Los datos de la respuesta están estructurados de mejor forma y son más fáciles de interpretar que una página plana en HTML.</li>
<li>Los desarrolladores de comunidad.com, deben comprometerse en mantener un <strong>formato XML constante</strong> para las respuestas XML que son entregadas a las máquinas<strong></strong>: esto significa, por ejemplo, que no pueden drásticamente dejar de aceptar las etiquetas &lt;ciudad&gt; en las solicitudes, o cambiar &lt;nombre&gt; por &lt;persona&gt; en las etiquetas de la respuesta (o de lo contrario, podrían generar un terrible desastre en las aplicaciones de terceras partes que aprovechan su API).</li>
</ul>
<p>Esta última razón se resume bien en la <a href="http://www.slideshare.net/guestbe92f4/how-to-design-a-good-a-p-i-and-why-it-matters-g-o-o-g-l-e/">famosa nota</a> de Joshua Bloch de Google sobre el diseño de APIs:</p>
<blockquote><p>Las APIs públicas son para siempre &#8211; una oportunidad para hacerla bien.</p></blockquote>
<p>En el ejemplo anterior, asumimos que los desarrolladores de comunidad.com crearon una API desde cero, inventando una estructura XML personalizada para solicitudes y respuestas. Cuando se trata de diseñar una API, la realidad es que los desarrolladores tienden a respetar algunas <strong>estructuras API existentes</strong> diseñadas específicamente para APIs de tal forma que la API sea más fácil de aprender y ser usada para desarrolladores de terceras partes.</p>
<p>Hoy en día, 3 estándares API son usados ampliamente en la web:</p>
<ul>
<li><strong>REST</strong> (REpresentational State Transfer)</li>
<li><strong>XML-RPC </strong>(XML Remote Procedure Call)</li>
<li><strong>SOAP</strong> (Simple Object Access Protocol)</li>
</ul>
<p>En los siguientes posts echaremos un ojo a estos tres estándares XML con ejemplos detallados de cómo enviar y recibir datos.</p>
<p><em>(Traducción realizada por Nokrosis, del post original de Nemetral)</em></p>
<p>Continuará&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://nokrosis.com/2008/07/conociendo-las-apis-parte-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
