<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>2E5E</title>
	<atom:link href="http://2e5e.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://2e5e.wordpress.com</link>
	<description></description>
	<lastBuildDate>Fri, 13 Feb 2009 12:56:10 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='2e5e.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/11612515e275b7407390f46f40d0e2a4?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>2E5E</title>
		<link>http://2e5e.wordpress.com</link>
	</image>
			<item>
		<title>nos mudamos</title>
		<link>http://2e5e.wordpress.com/2009/02/13/nos-mudamos/</link>
		<comments>http://2e5e.wordpress.com/2009/02/13/nos-mudamos/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 12:56:10 +0000</pubDate>
		<dc:creator>arctarus</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=83</guid>
		<description><![CDATA[Después de ver que el blog iba tirando para delante (poco a poco&#8230;) pensamos darle un poco más de oficialidad al asunto, y de paso hacer algunas mejoras tanto visuales como técnicas al blog, por lo que finalmente nos mudarnos a otro blog alojado en nuestros propios servidores.
Para todos aquellos que nos sigan, a partir [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=83&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Después de ver que el blog iba tirando para delante (poco a poco&#8230;) pensamos darle un poco más de oficialidad al asunto, y de paso hacer algunas mejoras tanto visuales como técnicas al blog, por lo que finalmente nos mudarnos a otro blog alojado en nuestros propios servidores.</p>
<p>Para todos aquellos que nos sigan, a partir de ahora os esperamos en el <a href="http://11870.com/2e5e">nuevo blog técnico de 11870.com</a> por lo que será necesario actualizar los feeds, <a href="http://delicious.com">delicious</a> o lo que usemos.</p>
<p>Saludos y os esperamos en el nuevo blog.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=83&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2009/02/13/nos-mudamos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">arctarus</media:title>
		</media:content>
	</item>
		<item>
		<title>Temporary tables y replicación a esclavos</title>
		<link>http://2e5e.wordpress.com/2009/01/31/temporary-tables-replicacion-a-esclavos/</link>
		<comments>http://2e5e.wordpress.com/2009/01/31/temporary-tables-replicacion-a-esclavos/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 11:37:49 +0000</pubDate>
		<dc:creator>peralta</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[maestro esclavo]]></category>
		<category><![CDATA[myisam]]></category>
		<category><![CDATA[replicación]]></category>
		<category><![CDATA[temporary tables]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=80</guid>
		<description><![CDATA[El título de esta entrada debería ser más bien «Cómo perder tus servidores esclavos haciendo el tonto» y ahora veremos porqué.
Supongamos que estamos haciendo tareas de mantenimiento en la base de datos, supongamos que tenemos que hacer un UPDATE sobre algunas filas de determinada tabla (area mismo). Con la particularidad de que determinar sobre qué [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=80&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El título de esta entrada debería ser más bien <em>«Cómo perder tus servidores esclavos haciendo el tonto»</em> y ahora veremos porqué.</p>
<p>Supongamos que estamos haciendo tareas de mantenimiento en la base de datos, supongamos que tenemos que hacer un <em>UPDATE</em> sobre algunas filas de determinada tabla (<tt>area</tt> mismo). Con la particularidad de que determinar sobre qué filas tenemos que hacer el UPDATE no lo podemos hacer con una única <em>query</em> y decidimos hacer uso de las <em>temporary tables</em> o tablas temporales de MySQL. Las tablas temporales son tablas MyISAM que sólo perduran durante sesión en la que estamos conectados (si nos desconectamos y conectamos de nuevo, hemos perdido la tabla), lo que las hace especialmente útiles para estas tareas de mantenimiento.</p>
<p>Así que creamos la tabla:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
mysql&gt; CREATE TEMPORARY TABLE idsChungos (id integer primary key);<br />
Query OK, 0 rows affected (0.00 sec)<br />
mysql&gt;
</div>
<p>Y ahora vamos insertando los ids de las filas que queremos tocar:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
mysql&gt; INSERT INTO idsChungos VALUES (SELECT id FROM area WHERE &#8230;);<br />
&#8230;<br />
mysql&gt; INSERT INTO idsChungos VALUES (SELECT id FROM area WHERE &#8230;);<br />
&#8230;<br />
mysql&gt; INSERT INTO idsChungos VALUES (SELECT id FROM area WHERE &#8230;);<br />
&#8230;
</div>
<p>Justo en este ejemplo no se ve la necesidad de utilizar una tabla para almacenar los ids, pero no podemos usar una subquery sobre la misma tabla sobre la que vamos a hacer el UPDATE (aplica también para <em>DELETEs</em>).</p>
<p>Y ahora que ya tenemos los ids:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
mysql&gt; UPDATE area SET boundaries = NULL WHERE id IN (SELECT id FROM idsChungos);<br />
Query OK, 7263475 rows affected (0.00 sec)<br />
mysql&gt;
</div>
<p>Y nos ha ido todo a la perfección, salvo porque 30 segundos después empiezan a saltar las alarmas de servidores MySQL esclavos perdidos. En ese momento es cuando dices: <em>aaaahhhhh</em> y te pegas una palmadita en la frente: las tablas temporales NO se replican a los servidores esclavos. Cuando el esclavo intenta hacer el último UPDATE dice: <em>«la tabla area no sé ni lo que es»</em> y se para la replicación. Pensándolo dos minutos, tiene todo el sentido del mundo.</p>
<p>Un diez oye, pero había que aprenderlo de alguna manera. Menos mal que <a href="http://2e5e.wordpress.com/2008/10/07/recuperando-servidor-esclavo-mysql-caliente/">podemos recuperar los esclavos en caliente</a>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/80/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=80&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2009/01/31/temporary-tables-replicacion-a-esclavos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">peralta</media:title>
		</media:content>
	</item>
		<item>
		<title>Cómo crear un comando para ubiquity</title>
		<link>http://2e5e.wordpress.com/2009/01/18/como-crear-un-comando-para-ubiquity/</link>
		<comments>http://2e5e.wordpress.com/2009/01/18/como-crear-un-comando-para-ubiquity/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 12:53:51 +0000</pubDate>
		<dc:creator>arctarus</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[addons]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[ubiquity]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=51</guid>
		<description><![CDATA[Ubiquity es una extensión de Firefox desarrollada por Mozilla que permite ejecutar verbos o comandos al estilo de un lanzador de aplicaciones de escritorio como QuickSilver o Gnome-Do. Estos comandos son los que añaden funcionalidad a Ubiquity, y los que deben especificarse para realizar alguna acción. Se pueden programar sin necesidad de reiniciar el navegador [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=51&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="https://wiki.mozilla.org/Labs/Ubiquity">Ubiquity</a> es una extensión de <a title="Mozilla Firefox" href="http://www.mozilla-europe.org/es/firefox/">Firefox</a> desarrollada por <a href="http://www.mozilla.org/">Mozilla</a> que permite ejecutar verbos o comandos al estilo de un lanzador de aplicaciones de escritorio como <a href="http://www.blacktree.com/">QuickSilver</a> o <a href="http://do.davebsd.com/">Gnome-Do</a>. Estos comandos son los que añaden funcionalidad a Ubiquity, y los que deben especificarse para realizar alguna acción. Se pueden programar sin necesidad de reiniciar el navegador en ningún momento, a diferencia de lo que ocurre cuando se programan extensiones para firefox, pudiendo probar los cambios inmediatamente. No hay más que utilizar el <em>Command Editor</em> que proporciona Ubiquity al que se puede acceder a través del comando help.</p>
<p>El esqueleto básico de un comando el el siguiente:</p>
<pre style="border:1px solid #000;background:#999;color:#000;padding:1em;">CmdUtils.CreateCommand({
     name: "11870",
     icon: "http://11870.com/favicon.ico",
     takes: {"search term": noun_arb_text},
     preview: function(pblock, search_term) {
          ...
     },
     execute: function(search_term) {
          ...
     }
})</pre>
<p><em>CmdUtils</em> es un espacio de nombres que proporciona Ubiquity y contiene todas las herramientas disponibles para crear un comando. Para ello deberemos ejecutar el método<em> CreateCommand</em> pasándole un hash que deberá contener los siguientes elementos:</p>
<ul>
<li><strong>name:</strong> Nombre del comando, se usará cuando se quiera ejecutar.</li>
<li><strong>icon:</strong> <em>Favicon</em> del comando, aparecerá al lado del nombre cuando se ejecuta.</li>
<li><strong>takes:</strong> Parámetros del comando. Es un hash parámetro, tipo de datos. Esto lo explicaremos más abajo.</li>
<li><strong>preview:</strong> Método que se ejecutan mientras se están escribiendo los parámetros a el comando. Esta función recibe 2 parámetros. El primero es el nodo <acronym title="Document Object Model">DOM</acronym> donde debe insertarse el resultado, y el segundo es el parámetro que ha introducido el usuario, en nuestro caso un término de búsqueda.</li>
<li><strong>execute:</strong> Método que se ejecuta cuando pulsamos <em>enter</em> sobre el comando. Sólo recibe el parámetro.</li>
</ul>
<p>Otro punto interesante son los modificadores o <em>modifiers</em> que nos permiten recibir más parámetros en el comando especificando una palabra clave a partir de la cual vendrá el modificador. Por ejemplo, cuando un usuario escriba:</p>
<pre style="border:1px solid #000;background:#999;color:#000;padding:1em;">11870 restaurante en madrid</pre>
<p>la palabra clave &#8220;en&#8221; identificará a madrid como un modificador y se recibirá en las funciones <em>preview</em> y <em>execute</em> como un nuevo parámetro. Para especificar un modificador en nuestro comando deberemos añadir la siguiente linea:</p>
<pre style="border:1px solid #000;background:#999;color:#000;padding:1em;">modifiers: {"en": noun_type_ooslocality},</pre>
<p>donde &#8220;en&#8221; es la palabra clave y <em>noun_type_ooslocality</em> es el tipo de dato que se va a recibir. También deberemos añadir un nuevo parámetro a preview y execute donde recibir los modificadores. Este parámetro es un <em>hash</em> donde la clave es el modificador.</p>
<p>Estos tipos de datos también son personalizables y se pueden crear fácilmente siguiendo la siguiente estructura:</p>
<pre style="border:1px solid #000;background:#999;color:#000;padding:1em;">var noun_type_ooslocality = {
     _name: "localidad",
     suggest: function(text, html){
          ...
          return return [ CmdUtils.makeSugg(text, null, date) ];
     }
}</pre>
<p>Cuándo el comando recibe como parámetro un tipo de datos lo primero que hace es ejecutar el método suggest, el cual devuelve una lista con todos los posibles valores para esa entrada. En nuestro caso hemos creado un <em>noun_type </em>llamado <em>noun_type_ooslocality</em> que, a través de la <a href="http://11870.com/api">API de 11870</a>, comprobará las localidades que disponemos que se corresponden con la entrada y se mostrará al usuario una lista para que pueda concretar su búsqueda.</p>
<p>Ubiquity también proporciona:</p>
<ul>
<li><strong>Geolocalización</strong>: Podemos obtener nuestra localización actual usando <code>CmdUtils.getGeoLocation()</code> para lo cual actualmente usa la API de <a href="http://www.maxmind.com/app/api">MaxMind</a>.</li>
<li><strong>JavascriptTemplates</strong>: Que nos facilita la tarea de generar los preview, para lo cual usan <a href="http://code.google.com/p/trimpath/wiki/JavaScriptTemplates">TrimPath&#8217;s JavascriptTemplates</a>.</li>
<li><strong><a href="http://jquery.com/">JQuery</a></strong>: especialmente para las llamadas <acronym title="Asynchronous JavaScript And XML">AJAX</acronym>.</li>
</ul>
<p>Y para acabar, os dejo aquí el <a href="http://gist.github.com/34649">comando 11870 para Ubiquity</a> a modo de ejemplo, para que jueguéis con él todo lo que queráis <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=51&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2009/01/18/como-crear-un-comando-para-ubiquity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">arctarus</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalación desatendida de Java JRE/JDK en Ubuntu/Debian</title>
		<link>http://2e5e.wordpress.com/2008/12/11/instalacion-desatendida-de-java-jrejdk-en-ubuntudebian/</link>
		<comments>http://2e5e.wordpress.com/2008/12/11/instalacion-desatendida-de-java-jrejdk-en-ubuntudebian/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 16:41:01 +0000</pubDate>
		<dc:creator>fresus</dc:creator>
				<category><![CDATA[hacking]]></category>
		<category><![CDATA[sistemas]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=37</guid>
		<description><![CDATA[¿Necesitas instalar java en 40 servidores? ¿Has creado un script y al lanzarlo has caído en que es inútil ya que debes aceptar la licencia de Sun para completar la instalación?
Tenemos la solución a tus problemas. Ejecuta el siguiente script antes de la instalación y se saltará el diálogo de conformidad con la licencia:

#!/bin/bash
. /usr/share/debconf/confmodule
db_version [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=37&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>¿Necesitas instalar java en 40 servidores? ¿Has creado un script y al lanzarlo has caído en que es inútil ya que debes aceptar la licencia de Sun para completar la instalación?</p>
<p>Tenemos la solución a tus problemas. Ejecuta el siguiente script antes de la instalación y se saltará el diálogo de conformidad con la licencia:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
#!/bin/bash<br />
. /usr/share/debconf/confmodule<br />
db_version 2.0<br />
db_capb backup<br />
license=sun-dlj-v1-1<br />
db_get shared/accepted-$license<br />
if [ "$RET" = "true" ]; then<br />
echo &#8220;$license license has already been accepted&#8221; &gt;&amp;2<br />
exit 0<br />
fi<br />
db_set shared/accepted-$license true<br />
exit 0</div>
<p>De nada.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=37&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2008/12/11/instalacion-desatendida-de-java-jrejdk-en-ubuntudebian/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">fresus</media:title>
		</media:content>
	</item>
		<item>
		<title>pybuddy: hacking ambient devices (for fun &amp; profit)</title>
		<link>http://2e5e.wordpress.com/2008/11/21/pybuddy-hacking-ambient-devices/</link>
		<comments>http://2e5e.wordpress.com/2008/11/21/pybuddy-hacking-ambient-devices/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 11:22:06 +0000</pubDate>
		<dc:creator>peralta</dc:creator>
				<category><![CDATA[hacking]]></category>
		<category><![CDATA[ambient devices]]></category>
		<category><![CDATA[ibuddy]]></category>
		<category><![CDATA[pybuddy]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=34</guid>
		<description><![CDATA[Aquellos que sigáis nuestro blog corporativo ya habréis visto a nuestro i-buddy tuneado. Ese post no tenía mucho detalle técnico, así que aquí vamos a dar alguna pista más.
En realidad todo empezó en El corte inglés. Sí, en serio. Un buen amigo y geek, luna, y un servidor estaban echando un vistazo a la sección [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=34&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Aquellos que sigáis nuestro <a href="http://11870.com/blog/">blog corporativo</a> ya habréis visto a nuestro <a href="http://www.i-buddy.com/">i-buddy</a> <em>tuneado</em>. <a href="http://11870.com/blog/i-buddy-en-11870com/">Ese post</a> no tenía mucho detalle técnico, así que aquí vamos a dar alguna pista más.</p>
<p>En realidad todo empezó en El corte inglés. Sí, en serio. Un buen amigo y <em>geek</em>, <a href="http://socios.aditel.org/~luna/">luna</a>, y un servidor estaban echando un vistazo a la sección de informática cuando nos encontramos con el i-buddy. Y nos dijimos: seguro que se puede hacer algo, si alguien no lo ha hecho ya. Una semana más tarde, teníamos un juguete nuevo cada uno y un <a href="http://cuntography.com/blog/?p=17">código del que partir</a>. El fruto del cacharreo se llama <a href="http://code.google.com/p/pybuddy">pybuddy</a>: un demonio escrito en python que atiende a comandos enviados vía UDP por red.</p>
<p>Esto significa que una vez lanzado el demonio podemos controlar el buddy con comandos tal que así:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
echo &#8220;DEMO&#8221; | nc -q0 -u localhost 8888
</div>
<p>En principio, <a href="http://code.google.com/p/pybuddy/wiki/Commands">todos los comandos</a> se han implementado con lo que el juego ahora viene de hacer combinaciones con ellos. Por ejemplo, en el <a href="http://www.vimeo.com/2178841">vídeo explicativo</a> usamos este archivo de comandos y lo lanzamos así:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
cat commands | nc -q0 -u localhost 8888
</div>
<p>Como se puede ver, el <em>timing</em> fue perfecto <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>En la oficina, de vez en cuando a alguien le dar por juguetear con el bicho que está enchufado a mi ordenador y recibe peticiones de cualquier ordenador de la red local, con lo que suele estar bastante agitado. Pero también lo tenemos recibiendo información importante de lo que ocurre en nuestras máquinas en producción, con el <em>script</em> que se curró Pablo en un momento: <a href="http://code.google.com/p/pybuddy/source/browse/trunk/contrib/access-log-client">access-log-client</a>.</p>
<p>El procedimiento de instalación no está documentado por ahora, pero es bastante sencillo:</p>
<ol>
<li>Hacemos un <a href="http://code.google.com/p/pybuddy/source/checkout">checkout del proyecto</a>: <tt>svn checkout http://pybuddy.googlecode.com/svn/trunk/ pybuddy-read-only</tt></li>
<li>Editamos el fichero de configuración <tt>pybuddy.cfg</tt>, si queremos cambiar alguno de los parámetros por defecto (tipo de buddy, usuario con el que correr, logging, etc).</li>
<li>Lanzamos el demonio, como <tt>root</tt> (luego cambiará de usuario según lo configurado): <tt>sudo src/pybuddy-daemon.py pybuddy.cfg</tt></li>
</ol>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
$ sudo src/pybuddy-daemon.py<br />
2008-11-21 12:15:07,662 INFO     Read config file: /usr/local/etc/pybuddy.cfg<br />
2008-11-21 12:15:07,662 INFO     Starting search&#8230;<br />
2008-11-21 12:15:07,808 INFO     ibuddy found! vend: 4400   prod: 1<br />
2008-11-21 12:15:07,808 INFO     endpoint<br />
2008-11-21 12:15:08,424 INFO     Starting daemon&#8230;<br />
$
</div>
<p>A partir de este momento, el buddy está listo para recibir comandos. A ver quién es el primero que se curra un plugin para <a href="http://www.pidgin.im">Pidgin</a>, <a href="http://www.gajim.org">gajim</a> o similar.</p>
<p>Happy hacking. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=34&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2008/11/21/pybuddy-hacking-ambient-devices/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">peralta</media:title>
		</media:content>
	</item>
		<item>
		<title>Manteniendo el orden de resultados SQL según un &#8216;in&#8217;</title>
		<link>http://2e5e.wordpress.com/2008/10/16/manteniendo-orden-resultados-sql-in/</link>
		<comments>http://2e5e.wordpress.com/2008/10/16/manteniendo-orden-resultados-sql-in/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 14:44:03 +0000</pubDate>
		<dc:creator>peralta</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[order by]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=30</guid>
		<description><![CDATA[Si queremos obtener resultados ordenados con una query SQL y la condición del where es un IN, tenemos un problema. Pongamos que tenemos una query como la siguiente:

mysql&#62; select * from category where status in (&#8216;inactive&#8217;, &#8216;active&#8217;, &#8216;mutant&#8217;);

Con esto pretendemos obtener todos los campos de todas las filas de category, estando éstas agrupadas y ordenadas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=30&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Si queremos obtener resultados ordenados con una query SQL y la condición del <em>where</em> es un <tt>IN</tt>, tenemos un problema. Pongamos que tenemos una <em>query</em> como la siguiente:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
mysql&gt; select * from category where status in (&#8216;inactive&#8217;, &#8216;active&#8217;, &#8216;mutant&#8217;);
</div>
<p>Con esto pretendemos obtener todos los campos de todas las filas de <tt>category</tt>, estando éstas agrupadas y ordenadas en el mismo orden en el que las hemos puesto en el <tt>IN</tt>. Si añadimos un <tt>GROUP BY</tt> nos aseguramos de que se agrupan, pero no de que se respete el orden que hemos puesto en la condición.</p>
<p>El orden del resultado será indeterminado (yo pensaba que iba a ser por <tt>id</tt> en un principio, pero no). La cosa tenía pinta de que íbamos a tener que realizar la ordenación a posteriori en la aplicación, aunque ha resultado ser que no. En MySQL podemos hacer lo siguiente:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">
mysql&gt; select * from category where status in (&#8216;inactive&#8217;, &#8216;active&#8217;, &#8216;mutant&#8217;) order by field(status,&#8217;inactive&#8217;, &#8216;active&#8217;, &#8216;mutant&#8217;) ;
</div>
<p>Que funciona gracias a la <a href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field">función field de MySQL</a>. Y problema resuelto.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=30&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2008/10/16/manteniendo-orden-resultados-sql-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">peralta</media:title>
		</media:content>
	</item>
		<item>
		<title>Recuperando un servidor esclavo de MySQL en caliente</title>
		<link>http://2e5e.wordpress.com/2008/10/07/recuperando-servidor-esclavo-mysql-caliente/</link>
		<comments>http://2e5e.wordpress.com/2008/10/07/recuperando-servidor-esclavo-mysql-caliente/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 16:01:48 +0000</pubDate>
		<dc:creator>peralta</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[maestro esclavo]]></category>
		<category><![CDATA[replicación]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=20</guid>
		<description><![CDATA[A veces, shit happens&#8230; lo sabemos todos. Y pasa en todos los lados y en el momento más inoportuno. Hoy he descubierto que podía recuperar un esclavo de MySQL en caliente porque utilizamos un engine transaccional (InnoDB).
maestro$ mysqldump &#45;&#45;single-transaction &#45;&#45;databases db1 db2 &#45;&#45;master-data=1 -u root -R -p &#62; /tmp/dump.sql
scp de rigor a la máquina destino, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=20&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A veces, <em>shit happens</em>&#8230; lo sabemos todos. Y pasa en todos los lados y en el momento más inoportuno. Hoy he descubierto que podía recuperar un esclavo de MySQL en caliente porque utilizamos un engine transaccional (InnoDB).</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">maestro$ mysqldump &#45;&#45;single-transaction &#45;&#45;databases db1 db2 &#45;&#45;master-data=1 -u root -R -p &gt; /tmp/dump.sql</div>
<p><tt>scp</tt> de rigor a la máquina destino, <tt>stop slave</tt>, carga, <tt>start slave</tt>:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">maestro$ scp /tmp/dump.sql esclavo:/tmp<br />
esclavo$ echo &#8220;stop slave;&#8221; | mysql -u root -p<br />
Enter password:<br />
esclavo$ mysql -u root -p &lt; /tmp/dump<br />
esclavo$ echo &#8220;start slave;&#8221; | mysql -u root -p</div>
<p>La iluminación ha venido por parte de <a href="http://www.amazon.com/gp/product/0596101716?ie=UTF8&amp;tag=ziritione-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0596101716">High Performance MySQL: Optimization, Backups, Replication, and More</a><img style="border:none!important;margin:0!important;" src="http://www.assoc-amazon.com/e/ir?t=ziritione-20&amp;l=as2&amp;o=1&amp;a=0596101716" border="0" alt="" width="1" height="1" />, un <em>hayquetener</em> donde los haya y libro que recomiendo prácticamente a cualquiera que se tenga que pelear con este servidor de base de datos.</p>
<p>En el libro, además, usan <em>pipes</em>:</p>
<div style="border:1px solid #000;background:#999;color:#000;padding:1em;">maestro$ mysqldump &#45;&#45;single-transaction &#45;&#45;databases db1 db2 &#45;&#45;master-data=1 -u root -R -p | mysql -u root -h esclavo -p</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=20&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2008/10/07/recuperando-servidor-esclavo-mysql-caliente/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">peralta</media:title>
		</media:content>

		<media:content url="http://www.assoc-amazon.com/e/ir?t=ziritione-20&#38;l=as2&#38;o=1&#38;a=0596101716" medium="image" />
	</item>
		<item>
		<title>versión móvil</title>
		<link>http://2e5e.wordpress.com/2008/06/26/version-movil/</link>
		<comments>http://2e5e.wordpress.com/2008/06/26/version-movil/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 16:17:52 +0000</pubDate>
		<dc:creator>jorge</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[groovy grails iphone]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=16</guid>
		<description><![CDATA[Acabamos de hacer pública nuestra versión para móviles. Son tres vistas, la caja de búsqueda, los resultados de la búsqueda y la página de servicio.
Para hacer las páginas más ligeras hemos eliminado todas las imágenes y opiniones. De cada servicio dejamos sólo nombre, dirección, teléfono y el mapa descargado como una imagen.
La aplicación está hecha [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=16&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Acabamos de hacer pública nuestra <a href="http://m.11870.com">versión para móviles</a>. Son tres vistas, la caja de búsqueda, los resultados de la búsqueda y la página de servicio.</p>
<p>Para hacer las páginas más ligeras hemos eliminado todas las imágenes y opiniones. De cada servicio dejamos sólo nombre, dirección, teléfono y el <a href="http://code.google.com/apis/maps/documentation/staticmaps/">mapa descargado como una imagen</a>.</p>
<p>La aplicación está hecha en <a href="http://grails.org/">grails</a>. Queríamos probar grails porque se integra muy bien con librerías y otros desarrollos que tenemos hechos en java. De hecho seguro que cuando esta aplicación crezca usaremos esas magníficas capacidades, pero ahora mismo esta aplicación sólo se comunica con el buscador por HTTP y con la base de datos por JDBC. Así que seguramente la única excusa que se nos ocurre para haber usado grails es porque nos apetecía probarlo <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>La experiencia ha sido buena aunque hemos echado de menos una buena integración con IDEs, en concreto con Eclipse. No obstante tendremos que programar más para fundamentar mejor nuestra evaluación.</p>
<p>Implementamos un Device Filter para filtrar a los Iphones por el User-Agent, a estos se les ofrecen las mismas vistas que al resto de los dispositivos excepto por las hojas de estilo y los scripts de Javascript que son especiales para aprovechar las capacidades de los navegadores Safari (WebKit):</p>
<ul>
<li>Propiedades CSS como &#8220;border-radius&#8221; que forma parte del <a href="http://www.w3.org/TR/2005/WD-css3-background-20050216/#the-border-radius">CSS3 Backgrounds and Borders Module</a>.</li>
</ul>
<ul>
<li>Manejo de eventos especiales generados por webkit como el <a href="http://developer.apple.com/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/chapter_8_section_6.html#//apple_ref/doc/uid/TP40006511-SW16">Orientation Event</a>, para modificar la interfaz según la orientación del aparato.</li>
</ul>
<p>Para el resto de dispositivos las vistas se sirven con XHTML Mobile Profile 1.0; usamos atributos <em>acceskeys</em> en algunos enlaces para habilitar la navegación a través del teclado del dispositivo y la función de <em>hacer llamada</em> de la especificación <a href="http://mobile.yqie.com/service/wap/source/wap/download/spec-wtai-19991108.pdf">WTAI (Wireless Telephony Application Interface)</a> para que los dispositivos reconozcan números de teléfono en el contenido de las páginas y permitan hacer llamadas directamente.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/2e5e.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/2e5e.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=16&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2008/06/26/version-movil/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jorge</media:title>
		</media:content>
	</item>
		<item>
		<title>Simplificación de polígonos con el algoritmo Douglas-Peucker</title>
		<link>http://2e5e.wordpress.com/2008/05/20/simplificacion-de-poligonos-con-el-algoritmo-douglas-peucker/</link>
		<comments>http://2e5e.wordpress.com/2008/05/20/simplificacion-de-poligonos-con-el-algoritmo-douglas-peucker/#comments</comments>
		<pubDate>Tue, 20 May 2008 17:28:10 +0000</pubDate>
		<dc:creator>peralta</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[geo python maps]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=14</guid>
		<description><![CDATA[Hace bastante tiempo ya nos encontramos con un problema del que no teníamos ni idea: nuestra fuente de datos nos pasaba datos de áreas geográficas (más concreto, los contornos) como listas de miles de puntos. En aquel entonces, la API de Google Maps dejaba frito el navegador cuando se intentaba dibujar un polígono con tal [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=14&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hace bastante tiempo ya nos encontramos con un problema del que no teníamos ni idea: nuestra fuente de datos nos pasaba datos de áreas geográficas (más concreto, los contornos) como listas de miles de puntos. En aquel entonces, la <a href="http://code.google.com/apis/maps/">API de Google Maps</a> dejaba frito el navegador cuando se intentaba dibujar un polígono con tal número de vértices (hoy ha mejorado y en vez de pintar un polígono vía Javascript, la API te tira una imagen a partir de la segunda petición).</p>
<p>¿Qué tuvimos que hacer? Reducir el número de puntos que definían cada uno de los polígonos intentando ser lo más fieles posible a la forma original porque pintar una provincia cualquiera como un cuadrado no es solución. No sólo teníamos datos de provincias: también teníamos de distritos y barrios. Y eso hacía que esta simplificación de polígonos fuera algo bastante intratable de hacer a mano. Fue así como descubrimos que existía una forma de hacerlo automáticamente y cuyo algoritmo fue desarrollado por David Douglas &amp; Thomas Peucker y es conocido como <em><a href="http://geometryalgorithms.com/Archive/algorithm_0205/algorithm_0205.htm">Douglas-Peucker polyline simplification algorythm</a></em>.</p>
<p>Partimos de un trozo de código en Pascal que encontramos en algún lugar y lo portamos a <a href="http://www.python.org">Python</a>, que era el lenguaje con el que hicimos todo el script de importación de datos. Se quedó pendiente de publicación el asunto, ya que en su día nadie había portado dicho código a Python (ni <a href="http://ruby.org">Ruby</a> ni <a href="http://perl.org">Perl</a> ni ningún lenguaje de script medianamente actual). El caso es que eso ha sido hasta hace un par de semanas Schuyler Erle publicó <a href="http://mappinghacks.com/2008/05/05/douglas-peucker-line-simplification-in-python/">su versión</a> en <a href="http://mappinghacks.com/">Mapping Hacks</a>. Su código es mucho más bonito que el nuestro, así que nos ahorraremos el <em>attachment</em> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/2e5e.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/2e5e.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=14&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2008/05/20/simplificacion-de-poligonos-con-el-algoritmo-douglas-peucker/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">peralta</media:title>
		</media:content>
	</item>
		<item>
		<title>Spring 2.5 y los filtros de contexto</title>
		<link>http://2e5e.wordpress.com/2008/04/30/spring-25-y-los-filtros-de-contexto/</link>
		<comments>http://2e5e.wordpress.com/2008/04/30/spring-25-y-los-filtros-de-contexto/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 11:10:12 +0000</pubDate>
		<dc:creator>David Calavera</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring 2.5]]></category>
		<category><![CDATA[spring context]]></category>
		<category><![CDATA[spring context filters]]></category>

		<guid isPermaLink="false">http://2e5e.wordpress.com/?p=13</guid>
		<description><![CDATA[El cambio a spring 2.5 conlleva una nueva forma de cargar tus clases como beans, lo que ellos llaman contexto. Este contexto es el responsable de añadir como beans las clases que tengas marcadas con las anotaciones que spring te da de serie(@Component, @Controller, @Service, @Repository). Si buceamos un poco en el código de spring [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=13&subd=2e5e&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El cambio a spring 2.5 conlleva una nueva forma de cargar tus clases como beans, lo que ellos llaman <em>contexto</em>. Este contexto es el responsable de añadir como beans las clases que tengas marcadas con las anotaciones que spring te da de serie(@Component, @Controller, @Service, @Repository). Si buceamos un poco en el código de spring podemos ver que la clase encargada de hacer esto es <em><strong>ClassPathBeanDefinitionScanner.java</strong></em>. Esta clase tiene implementada una pequeña jerarquía de filtros para añadir o quitar clases del contexto cuando arranca nuestra aplicación. Por defecto, añade todas las clases que estén marcadas con las anotaciones que hemos visto anteriormente:</p>
<pre><code>
  this.includeFilters.add(new AnnotationTypeFilter(Component.class));
</code></pre>
<p>Ahora vamos a ver las opciones que nos da el framework para añadir clases a ese contexto. En su documentación podemos ver un claro ejemplo de como añadir una nueva anotación:</p>
<pre><code>
  &lt;context:component-scan&gt;
    &lt;context:include-filter type="<strong>annotation</strong>"
      expression="CustomAnnotation"/&gt;
  &lt;/context:component-scan&gt;
</code></pre>
<p>Lo que viene a decir el xml es que al contexto le vamos a añadir un filtro de tipo anotación y para todas las clases que estén marcadas con la anotación que va dentro del atributo <em>expression</em>.</p>
<p>Con lo que él internamente hará algo tal que así:</p>
<pre><code>
  this.includeFilters.add(new AnnotationTypeFilter(CustomAnnotation.class));
</code></pre>
<p>Lo que no se explica en la documentación es que por defecto, la clase que se encarga de parsear el contexto,<em><strong> ComponentScanBeanDefinitionParser.java</strong></em>, también soporta otros tipos de filtros además del de anotaciones.</p>
<p>El más sencillo sería el filtro de asignación, que simplemente añadiría una clase o un grupo de clases que extiendan o implementen algo común:</p>
<pre><code>
  &lt;context:component-scan&gt;
    &lt;context:include-filter type="<strong>assignable</strong>"
      expression="org.myapp.IService"/&gt;
  &lt;/context:component-scan&gt;
</code></pre>
<p>Con este código se añadirían todas las clases que extendieran de la interfaz <em>org.myapp.IService</em>.</p>
<p>Otro de los filtros que soporta es por expresiones regulares, con este filtro spring cargará en el contexto las clases que coincidan con una expresión regular determinada:</p>
<pre><code>
  &lt;context:component-scan&gt;
    &lt;context:include-filter type="<strong>regex</strong>"
      expression="(Service|Controller)\w+"/&gt;
  &lt;/context:component-scan&gt;
</code></pre>
<p>Con este código se cargarán todas clases que empiecen por <em>Service</em> o <em>Coltroller</em>.</p>
<p>Por último, tenemos un filtro un poco más complejo que se encarga de evaluar expresiones propias de <a href="http://en.wikipedia.org/wiki/Aspect_Oriented_Programming">Aspect Oriented Programming(AOP)</a>:</p>
<pre><code>
  &lt;context:component-scan&gt;
    &lt;context:include-filter type="<strong>aspectj</strong>"
      expression="Service || Controller"/&gt;
  &lt;/context:component-scan&gt;
</code></pre>
<p>Con lo que cargaremos todas las clases que extiendan o implementen la clase <em>Service</em> o <em>Controller</em>.</p>
<p>La verdad es que con el grupo de anotaciones que spring trae de serie es más que suficiente para resolver la mayoría de los problemas pero nos podemos encontrar en escenarios donde no queremos tener como dependencia spring en una clase que puede ser utilizada tanto por spring como por otra aplicación o módulo que no use spring, con lo que acceder a los filtros del contexto nos vendrá muy bien.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/2e5e.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/2e5e.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/2e5e.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/2e5e.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/2e5e.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/2e5e.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/2e5e.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/2e5e.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/2e5e.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/2e5e.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/2e5e.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/2e5e.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=2e5e.wordpress.com&blog=2598172&post=13&subd=2e5e&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://2e5e.wordpress.com/2008/04/30/spring-25-y-los-filtros-de-contexto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">calavera</media:title>
		</media:content>
	</item>
	</channel>
</rss>