<?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; Infinitos monos aporreando infinitos teclados</title>
	<atom:link href="http://adrian.navarro.at/blog/category/infinitos-monos-aporreando-infinitos-teclados/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>Objetos maestros en PHP</title>
		<link>http://adrian.navarro.at/blog/2009/08/16/objetos-maestros-en-php/</link>
		<comments>http://adrian.navarro.at/blog/2009/08/16/objetos-maestros-en-php/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 17:00:20 +0000</pubDate>
		<dc:creator>Adrián</dc:creator>
				<category><![CDATA[Enredando]]></category>
		<category><![CDATA[Infinitos monos aporreando infinitos teclados]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://adrian.navarro.at/blog/?p=194</guid>
		<description><![CDATA[Ya comenté el tema de usar clases &#8220;principales&#8221; para un proyecto&#8230; y ahora vuelvo con el mismo tema. Muy creativo, sí&#8230;
La idea es la de tener un objeto principal (maestro) con un constructor que crea dentro del propio objeto tantos objetos &#8220;internos&#8221; como hagan falta, pasándole por referencia su propio objeto al constuctor de los [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adrian.navarro.at/blog/2009/02/07/php-estirar-el-objeto/">Ya comenté el tema</a> de usar clases &#8220;principales&#8221; para un proyecto&#8230; y ahora vuelvo con el mismo tema. Muy creativo, sí&#8230;</p>
<p>La idea es la de tener un objeto principal (<em>maestro</em>) con un constructor que crea dentro del propio objeto tantos objetos &#8220;internos&#8221; como hagan falta, pasándole por referencia su propio objeto al constuctor de los &#8220;objetos internos&#8221;.</p>
<p>Los &#8220;objetos internos&#8221; extienden a una plantilla de objeto, y esa plantilla contiene un constructor que a su vez &#8220;guarda&#8221; como referencia el parámetro pasado por el objeto principal.</p>
<p>Sí, es un lío, así que mejor verlo en código:<br />
<blockquote><code>class AppObjectSkel {<br />
&nbsp;&nbsp;function __construct(&#038;$parent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this->_parent = $parent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(is_callable(array($this, 'init'))) $this->init();<br />
&nbsp;&nbsp;}<br />
}</p>
<p>class AppDatabase extends AppObjectSkel {<br />
&nbsp;&nbsp;function init() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* Aquí se inicializa la DB */<br />
&nbsp;&nbsp;}<br />
}</p>
<p>class AppCache extends AppObjectSkel {<br />
&nbsp;&nbsp;/* Elemento de cache, no lo inicializamos en este ejemplo */<br />
}</p>
<p>class Application {<br />
&nbsp;&nbsp;function __construct() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this->database = new AppDatabase($this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this->cache = new AppCache($this);<br />
&nbsp;&nbsp;}<br />
}</code></p></blockquote>
<p>De esta manera se puede acceder de un elemento a otro. Por ejemplo, desde <code>AppCache</code> se puede acceder a <code>AppDatabase</code> pasando por <code>Application</code>, simplemente usando <code>$this->_parent->database</code>. Al tratarse de un valor pasado por referencia, se puede acceder desde <code>AppDatabase</code> a <code>AppCache</code> y reflejar cambios en tiempo real.</p>
<p>Pero hay que tener en cuenta un pequeño detalle: los constructores. Debido a que se hereda de una clase maestra (<code>AppObjectSkel</code>), no se puede poner constructor de ningún tipo (ya sea <code>__constructor</code> o una función con el nombre de la clase), ya que PHP ejecutará únicamente el del objeto creado (<code>AppCache</code>, por ejemplo) y no el de <code>AppObjectSkel</code> (y mucho menos va a ejecutar dos constructores). Se puede evitar esto de varias formas: evitando <code>AppObjectSkel</code> en todos los casos y copiando el construct a cada vez, copiando el construct sólo cuando lo necesitamos (por que pisamos el construct de <code>AppObjectSkel</code>) o simplemente usar una función opcional (llamada init), como pongo en el ejemplo, que sólo se ejecuta si existe y se llama desde <code>AppObjectSkel</code>, a modo de constructor (un constructor invoca a otro).</p>
<p>Desde la propia aplicación simplemente hay que crear una nueva instancia del objeto <code>Application</code> (<code>$app = new Application</code>) y acceder a los diferentes objetos a partir del maestro (<code>$app->db, $app->cache</code>).</p>
<p>Esto llega a ser muy útil cuando la aplicación entera está divida en objetos (<code>AppUsers, AppForums, AppProfiles...</code>) y es necesario hacer transacciones entre los objetos. En lugar de crear una instancia para cada objeto cada vez que se necesitan (por ejemplo, instanciar <code>AppCache</code> desde <code>AppUsers</code> cuando hace falta usar memcache), se pueden instanciar una sola vez y acceder en un <em>entorno protegido</em> (<code>Application</code>, que vendría a ser un &#8220;contenedor&#8221; relativamente protegido de variables pisadas y globales erradas), a todos los objetos o variables que haga falta.</p>
<p>Con esto después se pueden hacer montones de cambios (instanciar una clase poco usada sólo cuando se necesita, hacer una especie de <em>namespace</em> para tener un cache durante la ejecución del programa&#8230;). Y es que ahí, la imaginación es el límite.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.navarro.at/blog/2009/08/16/objetos-maestros-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YQL o la gran base de datos que es Internet</title>
		<link>http://adrian.navarro.at/blog/2009/05/16/yql-o-la-gran-base-de-datos-que-es-internet/</link>
		<comments>http://adrian.navarro.at/blog/2009/05/16/yql-o-la-gran-base-de-datos-que-es-internet/#comments</comments>
		<pubDate>Sat, 16 May 2009 20:25:49 +0000</pubDate>
		<dc:creator>Adrián</dc:creator>
				<category><![CDATA[Infinitos monos aporreando infinitos teclados]]></category>

		<guid isPermaLink="false">http://adrian.navarro.at/blog/2009/05/16/yql-o-la-gran-base-de-datos-que-es-internet/</guid>
		<description><![CDATA[Leyendo korben.info (un blog en francés) me he encontrado un post la mar de interesante sobre YQL.
YQL es &#34;Yahoo! Query Language&#34; y es básicamente un sistema de &#34;queries&#34;estructuradas que permite lanzar &#34;consultas&#34; contra Interner entero.
Esto se hace usando una estructura XML pura que es consultada mediante consultas YQL (pseudo-SQL) que pasan antes por Yahoo!, por [...]]]></description>
			<content:encoded><![CDATA[<p>Leyendo <a href="http://www.korben.info/">korben.info</a> (un blog en francés) me he encontrado un post la mar de interesante sobre YQL.</p>
<p>YQL es &quot;Yahoo! Query Language&quot; y es básicamente un sistema de &quot;queries&quot;estructuradas que permite lanzar &quot;consultas&quot; contra Interner entero.</p>
<p>Esto se hace usando una estructura XML pura que es consultada mediante consultas YQL (pseudo-SQL) que pasan antes por Yahoo!, por ejemplo: (hay mejores ejemplos por ahí, merece la pena echar un vistazo)</p>
<blockquote>
<p>SELECT * FROM twitter.user.status WHERE id=&#8217;adrinavarro&#8217;</p>
<p>SELECT * FROM search.web WHERE query=&#8217;vacaciones&#8217;</p>
<p>SELECT * FROM lastfm.tag WHERE tag=&#8217;beck&#8217; AND api_key=&#8217;?&#8217;</p>
</blockquote>
<p>La idea es muy sencilla y a más de uno le va a gustar. Hay una recopilación de las tablas en <a href="http://datatables.org/">datatables.org</a>. Para quién le interese probar, existe una <a href="http://developer.yahoo.com/yql/console/?env=http://datatables.org/alltables.env">consola de pruebas</a> para ejecutar consultas y analizar el resultado.</p>
<p>Para más información, <a href="http://developer.yahoo.com/yql/">docs sobre YQL</a> y <a href="http://www.korben.info/initiation-au-yql-open-hack-day.html">ejemplos (en francés).</a></p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.navarro.at/blog/2009/05/16/yql-o-la-gran-base-de-datos-que-es-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A muerte con el mapa</title>
		<link>http://adrian.navarro.at/blog/2009/02/28/a-muerte-con-el-mapa/</link>
		<comments>http://adrian.navarro.at/blog/2009/02/28/a-muerte-con-el-mapa/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 00:32:36 +0000</pubDate>
		<dc:creator>Adrián</dc:creator>
				<category><![CDATA[Infinitos monos aporreando infinitos teclados]]></category>

		<guid isPermaLink="false">http://adrian.navarro.at/blog/?p=96</guid>
		<description><![CDATA[Soy una leyenda. Me refiero a que posiblemente sea la persona más torpe a la hora de desplazarse que puede haber a este lado de tierra. Ni con el GPS del iPhone (sí, tengo un iPhone desde hace poco), ni con las indicaciones de Google Maps. Ni siquiera con las indicaciones por las que voy [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Soy una leyenda. Me refiero a que posiblemente sea la persona más torpe a la hora de desplazarse que puede haber a este lado de tierra. Ni con el GPS del iPhone (sí, tengo un iPhone desde hace poco), ni con las indicaciones de Google Maps. Ni siquiera con las indicaciones por las que voy mendigando&#8230;</p>
<p style="text-align: left;">Vale, odio los mapas. Y soy una verdadera mierda a la hora de situarme, tengo el don de <em>liarla</em> siempre. Mi madre me lo dice, &#8217;sólo tú puedes hacerlo hijo&#8217;. No se equivoca. ¿Debería sentirme orgulloso o preocuparme por ello, <em>doctor</em>?</p>
<p style="text-align: left;">Pero no es mi vida de lo que vengo a hablar, por quién me habéis tomado&#8230; Es que he vuelto a enfadarme con <a href="http://maps.google.com/">Google Maps</a>. Bueno, ahora mismo no, pero sí hace unos meses y ahora que he retomado un poco el jugueteo con el <a href="http://code.google.com/intl/es/apis/maps/documentation/">API de Google Maps</a>, es como tomarse mal una CocaCola. Vuelve y jode mucho.</p>
<p style="text-align: left;">Al turrón. Desde hace relativamente poco (bueno, ya hace bastante que está implementado) se puede usar el <a href="http://code.google.com/intl/es-ES/apis/maps/documentation/reference.html#GClientGeocoder">API de reverse geocoding</a> desde JavaScript. Es sencillo: creas un nuevo objeto en plan <code>geocoder = new GClientGeocoder();</code> y llamas a la función getLocations del mismo objeto.</p>
<p style="text-align: left;">Por dar un ejemplo:</p>
<p style="text-align: left;"><code style="overflow: scroll; width: 400px;">geocoder = new GClientGeocoder();<br />
geocoder.getLocations(latlng, function(addresses) {<br />
if(addresses.Status.code != 200) {<br />
alert("Ubicación no reconocida");<br />
} else {<br />
if(typeof(addresses.Placemark[0].AddressDetails.Country.</code><code style="overflow: scroll; width: 400px;"> <strong>\</strong><br />
AdministrativeArea.SubAdministrativeArea.Locality.PostalCode) == "undefined") {<br />
alert("No hemos podido obtener el código postal de este área, con lo que es posible que los resultados de tus búsquedas sean inexactos");<br />
} else {<br />
cp = addresses.Placemark[0].AddressDetails.Country. <strong>\</strong></code><code style="overflow: scroll; width: 400px;"><br />
AdministrativeArea.SubAdministrativeArea.Locality.PostalCode. <strong>\</strong><br />
PostalCodeNumber;<br />
};<br />
};<br />
);</code></p>
<p style="text-align: left;"><em>(Nota mental: vaya pesadilla poner código en WordPress&#8230; Donde hay un \ hay que volver a juntar el código (quitando espacios, claro))</em></p>
<p style="text-align: left;">Todo este código asume que ya tienes un objeto llamado &#8220;latlng&#8221; que contiene las coordenadas de Latitud y Longitud que quieres convertir a código postal en este caso. Crear el objeto LatLng es muy fácil: <code>latlng = new GLatLng(latitud, longitud);</code>.</p>
<p style="text-align: left;">Aunque así parezca fácil, obtener la información reversa no es nada fácil, entre otras por que cambia el resultado si estás haciendo un reverse de un lugar en España, Alemania, Francia o Estados Unidos (jerarquía e informaciones algo diferentes). <a href="http://code.google.com/intl/es/apis/maps/documentation/services.html#Geocoding_Direct">Por aquí</a> hay un ejemplo básico de qué resultados da el Reverse Geocoding en XML.</p>
<p style="text-align: left;">Desde JavaScript, es algo así: del objeto se saca un <em>array, matriz, tupla, quillostoquéeh </em>de &#8216;PlaceMark&#8217;. Aquí asumimos el primero que es teóricamente el más preciso si no es el único. Dentro tenemos &#8220;AddressDetails&#8221;. Dentro de esto, &#8220;Country&#8221;. Dentro de &#8220;Country&#8221;, llega &#8220;AdministrativeArea&#8221;. Dentro &#8220;SubAdministrativeArea&#8221;. Dentro, &#8220;PostalCode&#8221;. Y ahí, finalmente, &#8220;PostalCodeNumber&#8221;.</p>
<p style="text-align: left;">Pese a que todo esto es y parece una pesadilla, obtener la dirección sin más se puede conseguir de una forma un poco más sencilla:<code> addresses.Placemark[0].address;</code></p>
<p style="text-align: left;">Y repitiéndome de otras veces, esto no deja de ser una chuleta. Tamaño XL, pero sí&#8230; lo es.</p>
<p style="text-align: left;">Voy a ver si me pongo a hacer una aplicación sencillita para el iPhone, con el <a href="http://11870.com/api">API</a> de <a href="http://11870.com/">11870</a>. Mi idea era simplemente rellenar una &#8220;posición actual&#8221; con texto libre, pasarlo a coordenadas y pasarlo a reverso para confirmar en limpio (por código postal y dirección) la inserción realizada. Una vez ahí, un formulario de búsqueda libre que simplemente deje buscar a una distancia de nuestra posición actual (el API de <a href="http://11870.com/">11870</a> permite búsquedas geográficas, la verdad es que mola un montón).</p>
<p style="text-align: left;">Voy a ver si no me pierdo demasiado (y de nuevo) con el GeoCoding. <em>No es lugar para desorientados.</em></p>
<p style="text-align: left;">(Nota de pie: Sí, estoy copiando un poco –mucho– a <a href="http://viciao2k3.net/">Gafeman</a> y su <a href="http://comil.us/">Comil.us</a>, que por cierto, funciona genial y está muy bien –si no lo has hecho, échale un ojo–&#8230; pero le tengo ganas al API de Google Maps y a la de 11870, sólo sea por programar un poco para la plataforma webapp-móvil y exprimir al máximo el API JavaScript de Google Maps sin usar los propios mapas).</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.navarro.at/blog/2009/02/28/a-muerte-con-el-mapa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

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