<?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>Adrián Navarro &#187; Dedos de acero</title>
	<atom:link href="http://adrian.navarro.at/blog/category/dedos-de-acero/feed/" rel="self" type="application/rss+xml" />
	<link>http://adrian.navarro.at/blog</link>
	<description>Esperando a que alguien me parta las piernas desde 1994</description>
	<lastBuildDate>Sat, 03 Apr 2010 10:48:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cambios de página sin actualizar usando hashes</title>
		<link>http://adrian.navarro.at/blog/2009/06/13/boton-atras-y-hashes-de-direccion-con-ajax/</link>
		<comments>http://adrian.navarro.at/blog/2009/06/13/boton-atras-y-hashes-de-direccion-con-ajax/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 11:49:19 +0000</pubDate>
		<dc:creator>Adrián</dc:creator>
				<category><![CDATA[Dedos de acero]]></category>

		<guid isPermaLink="false">http://adrian.navarro.at/blog/?p=167</guid>
		<description><![CDATA[Páginas como Gmail, Facebook o Tuenti usan el modelo &#8216;hash&#8217; en las URL. Por ejemplo, la siguiente URL:
http://www.tuenti.com/#m=Search&#38;func=view_friends_page&#38;job=243354
Lleva a una búsqueda en Tuenti. Sin embargo, el contenido después de # en la URL no se envía al servidor, puesto que se trata de un &#8216;hash&#8217; de URL. Este contenido sí que es accesible mediante JavaScript, [...]]]></description>
			<content:encoded><![CDATA[<p>Páginas como Gmail, Facebook o Tuenti usan el modelo &#8216;hash&#8217; en las URL. Por ejemplo, la siguiente URL:</p>
<blockquote><p>http://www.tuenti.com/#m=Search&amp;func=view_friends_page&amp;job=243354</p></blockquote>
<p>Lleva a una búsqueda en Tuenti. Sin embargo, el contenido después de # en la URL no se envía al servidor, puesto que se trata de un &#8216;hash&#8217; de URL. Este contenido sí que es accesible mediante JavaScript, usando la variable <code>window.location.hash</code>.</p>
<p>Tiene dos grandes ventajas al usarlo junto con AJAX: por una parte, funciona el botón de retroceso (&#8220;atrás&#8221;) aunque la aplicación esté basada en AJAX (esto depende la implementación, claro). Por otra parte, se puede &#8216;compartir&#8217; el enlace, de tal forma que aunque sea una consulta inicialmente lanzada por AJAX, se pueda reproducir al entrar en el mismo enlace (con el mismo hash).</p>
<p>He programado un pequeño ejemplo, <a href="http://adrian.navarro.at/demo/hash/demo.html">disponible aquí</a>. Es muy sencillo, aunque todo está bien explicado en el propio código (sólo que en inglés). El archivo de funciones JavaScript (igual de importante que el la serie de capas que contiene la página) <a href="http://adrian.navarro.at/demo/hash/scripts.js">está aquí</a>.</p>
<p>El principio &#8220;simplificado es el siguiente&#8221;:</p>
<ol>
<li>El usuario accede a la página</li>
<li>Se incluye la función &#8216;launch()&#8217; mediante jQuery a los eventos a ejecutar una vez se haya cargado el DOM</li>
<li>Esta función simplemente &#8216;lanza&#8217; la carga de la primera página, según tenga o no hash.</li>
<li>La función &#8216;load_page()&#8217; se ejecuta y carga el contenido. Al mismo tiempo crea un &#8216;timeout&#8217; con la función &#8216;verify_hash()&#8217;, que &#8216;vigila&#8217; el hash para detectar cambios.</li>
<li>La función &#8216;verify_hash()&#8217; crea a su vez otro timeout que llama a la misma función. En caso de que el hash haya cambiado, lanza &#8216;load_page()&#8217;, de la misma forma que hace &#8216;launch()&#8217;.</li>
</ol>
<p>El ejemplo dado también incluye un timer de &#8216;timeout&#8217; (en caso de que se &#8216;cuelgue&#8217; la petición AJAX), una serie de capas de &#8216;Loading&#8217; y comprueba que el usuario tenga JavaScript activado (en el caso contrario, sólo ve un mensaje alertando de la necesidad de tener JavaScript activado, sin dejar trazas de la aplicación).</p>
<p>Si se carga el hash #m=1&amp;abc=2, la consulta AJAX (siempre GET) será a <code>./pageloader?m=1&amp;abc=2</code>, incluyendo siempre como GET el contenido del hash. De la misma forma, se pueden incluir enlaces con hashes (se lanza la consulta AJAX al clickearlos) y el botón de retroceso funciona sin problemas.</p>
<p>Intenté poner una función que lanzase automáticamente el cambio de página sin esperar al intervalo de comprobación (al hacer click en un enlace), sin embargo generaba conflictos con los timers. De cualquier manera, la diferencia de tiempo entre el click y la petición AJAX no es muy grande.</p>
<p>El <a href="http://adrian.navarro.at/demo/hash/demo.html">ejemplo aquí</a> y <a href="http://adrian.navarro.at/demo/hash/scripts.js">el script aquí</a>. No olvidarse de mirar los comentarios del código <img src='http://adrian.navarro.at/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.navarro.at/blog/2009/06/13/boton-atras-y-hashes-de-direccion-con-ajax/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP: estirar el objeto</title>
		<link>http://adrian.navarro.at/blog/2009/02/07/php-estirar-el-objeto/</link>
		<comments>http://adrian.navarro.at/blog/2009/02/07/php-estirar-el-objeto/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 17:54:19 +0000</pubDate>
		<dc:creator>Adrián</dc:creator>
				<category><![CDATA[Dedos de acero]]></category>
		<category><![CDATA[Programadores desamparados]]></category>

		<guid isPermaLink="false">http://adrian.navarro.at/blog/?p=63</guid>
		<description><![CDATA[No, nada. Es un maldito título no-creativo. En realidad yo venía a hablar de mi libro a hablar del tema de extensión infinita de objetos clases. En algunos lenguajes de programación se pueden crear objetos e ir extendiéndolos hasta el infinito y más allá, no es el caso de PHP.
Por poner un ejemplo: si tenemos [...]]]></description>
			<content:encoded><![CDATA[<p>No, nada. Es un maldito título no-creativo. En realidad yo venía a <span style="text-decoration: line-through;">hablar de mi libro</span> a hablar del tema de extensión infinita de <span style="text-decoration: line-through;">objetos</span> clases. En algunos lenguajes de programación se pueden crear objetos e ir extendiéndolos <em>hasta el infinito y más allá</em>, no es el caso de PHP.</p>
<p>Por poner un ejemplo: si tenemos una clase que es AllTheApplication, es posible que queramos que herede las clases ApplicationRenderPage y ApplicationDatabase, algo como:</p>
<blockquote>
<p style="text-align: left;"><code>class ApplicationRenderPage {}<br />
class ApplicationDatabase {}<br />
class AllTheApplication extends ApplicationRenderPage, ApplicationDatabase {}</code></p></blockquote>
<p>Sin embargo, esto no está (todavía) disponible en PHP por lo que nos dará un error. Eso no significa que no se puedan hereder cualidades de un objeto en tercer grado:</p>
<blockquote>
<p style="text-align: left;"><code>class ApplicationRenderPage {}<br />
class ApplicationDatabase extends ApplicationRenderPage {}<br />
class AllTheApplication extends ApplicationDatabase {}</code></p></blockquote>
<p>En este último caso, AllTheAplication podría manejar también funciones y variables no protegidas tanto de ApplicationRenderPage como de ApplicationDatabase. Voilà!</p>
<p style="text-align: left;">Y una pequeña nota: aunque esto sea de cierta forma una solución posible, estoy casi seguro de que hay formas más consistentes de hacerlo, puesto que en este caso las clases se van extendiendo una a otra, de cierta forma &#8216;en anillo&#8217; con lo que conlleva al hacer cambios en la estructura. Recomendaría algo parecido a:</p>
<blockquote style="text-align: left;">
<p style="text-align: left;"><code>class ApplicationRenderPage {}<br />
class ApplicationDatabase {}<br />
class AllTheApplication { function __construct() { $this-&gt;ApplicationDatabase = new ApplicationDatabase; $this-&gt;ApplicationRenderPage = new ApplicationRenderPage; } }</code></p></blockquote>
<p style="text-align: left;">Así, basta con inicializar el objeto (<code>$Application = new AllTheApplication</code>) y de ahí acceder a los subobjetos (<code>echo $Application-&gt;ApplicationDatabase-&gt;QueryCount</code> si tenemos una variable que se llame QueryCount dentro del objeto ApplicationDatabase inicializado desde el construct de AllTheApplication). <strong>Ojo</strong>, no es oro todo lo que reluce y en este caso no se pueden acceder a las variables entre los distintos objetos (quizás usando parent::ApplicationDatabase, aunque no sé demasiado como se comportaría).</p>
<p style="text-align: left;">Y esto, señores, es una chuleta.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.navarro.at/blog/2009/02/07/php-estirar-el-objeto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Light Framework</title>
		<link>http://adrian.navarro.at/blog/2008/08/24/light-framework/</link>
		<comments>http://adrian.navarro.at/blog/2008/08/24/light-framework/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 17:02:40 +0000</pubDate>
		<dc:creator>Adrián</dc:creator>
				<category><![CDATA[Dedos de acero]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://adrinavarro.wordpress.com/?p=861</guid>
		<description><![CDATA[Con Linkloo empecé un desarrollo de una &#8220;plataforma&#8221; sobre la cual desarrollar. Es necesario, puesto que es una aplicación muy grande y compleja, y la desorganización del código me llevó a reprogramarlo desde cero. Cuando re-hice Fileclick también le hice una &#8220;plataforma&#8221; y junto con Rubén en Jisko hicimos lo mismo &#8211; adaptado al proyecto, [...]]]></description>
			<content:encoded><![CDATA[<p>Con Linkloo empecé un desarrollo de una &#8220;plataforma&#8221; sobre la cual desarrollar. Es necesario, puesto que es una aplicación muy grande y compleja, y la desorganización del código me llevó a reprogramarlo desde cero. Cuando re-hice Fileclick también le hice una &#8220;plataforma&#8221; y junto con Rubén en Jisko hicimos lo mismo &#8211; adaptado al proyecto, claro.</p>
<p>Esta estructura de la que hablo se basa sobre varios ejes de necesidades (al desarrollar):</p>
<ul>
<li>URLs limpias, &#8220;tipo Rails&#8221;</li>
<li>MySQL sencillo y extendido</li>
<li>Templating sencillo: además se introduce al final del renderizado, en Jisko fue muy útil para establecer el titulo de la página desde cualquier parte del código.</li>
<li>Organización (por librerías, que puedan ser propias e importarlas al vuelo)</li>
</ul>
<p>Obviamente hay más detalles, pero eso es lo básico y que toca desarrollar a cada nuevo proyecto (y la experiencia hace que cada vez sea algo más refinado).</p>
<p>He escrito un PDF (en un Inglés muy cutre, por cierto) en el cual resumo esto. <a href="http://adrian.navarro.at/blog/wp-content/uploads/2008/08/lightframework-paper.pdf">Podéis descargarlo aquí</a>.</p>
<p>El código está completamente desarrollado, queda escribir toda la documentación (y seguramente retocar algo).</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.navarro.at/blog/2008/08/24/light-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.312 seconds -->
