<?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"
	>

<channel>
	<title>Memory Dump</title>
	<atom:link href="http://www.lorenzogil.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lorenzogil.com/blog</link>
	<description>a brain backup</description>
	<pubDate>Sat, 13 Sep 2008 08:32:44 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>Viajes y cambios</title>
		<link>http://www.lorenzogil.com/blog/2008/09/13/viajes-y-cambios/</link>
		<comments>http://www.lorenzogil.com/blog/2008/09/13/viajes-y-cambios/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 08:32:44 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Amigos]]></category>

		<category><![CDATA[Viajes]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/?p=57</guid>
		<description><![CDATA[Este mes de Agosto Ana y yo fuimos a Londres. Ana nunca había estado antes y aunque yo había estado en algunas ocasiones, Londres es de esas ciudades en las que es totalmente imposible aburrirse o decir &#8220;es que ya he visto todo lo que había que ver&#8221;. Así que nos metimos en EasyJet un [...]]]></description>
			<content:encoded><![CDATA[<p>Este mes de Agosto <a href="http://anita.moralesdelcastillo.com/blog/" target="_self">Ana</a> y yo fuimos a Londres. Ana nunca había estado antes y aunque yo había estado en algunas ocasiones, Londres es de esas ciudades en las que es totalmente imposible aburrirse o decir &#8220;es que ya he visto todo lo que había que ver&#8221;. Así que nos metimos en EasyJet un Lunes por la mañana y aparecimos en Gatwick poco rato después. Vaya tela el Gatwick Express: sesenta y tantas libras por dos billetes ida y vuelta.</p>
<p><img src="http://farm4.static.flickr.com/3168/2847952737_03c6fb58c0.jpg" alt="Loren delante de las Casas del Parlamento" width="500" height="375" /></p>
<p>Nota para posibles visitantes a Londres: im-pres-cin-di-ble la Oyster card para viajar por el metro. Sale muchísimo más barata que ir a pagando a pelo y luego está el efecto molón de ir pasando la cartera por los lectores de tarjetas sin necesidad de sacar la tarjeta. Al final le cogimos el truco y parecíamos londinenses, bueno eso de cuello para abajo, de cuello para arriba era muy difícil ocultar que en realidad somos de londonelzaidin ya que la cara de empanaos y turistas la llevamos a todas partes. Igual que Dos Flores.</p>
<p><img src="http://farm4.static.flickr.com/3164/2848712234_37894838b5.jpg" alt="Anita en el momento británico" width="500" height="375" /></p>
<p>De las cosas que vimos, que no fueron pocas (a Ana incluso se le rompieron los zapatos de tanto andar) nos quedamos sin duda con el museo de Historia Natural. Impresionante tanto el continente como el contenido. No tan popular como la Tate o el Museo Británico pero para flipaos de los bichos como nosotros igual o más interesante.</p>
<p><img src="http://farm4.static.flickr.com/3066/2848712208_fd0b5ae94c.jpg" alt="Tripu y Loren" width="500" height="375" /></p>
<p>Mención especial de nuestro viaje fue el encuentro con nuestro más querido <a href="http://blog.tripu.info/" target="_self">Tripulante</a>, que hizo de anfitrión excepcional y nos enseño todo el Soho (el barrio) mostrándonos tanto los sitios más típicos como algunos restaurantes con las tres bes. Un día toco italiano y otro día griego. Muy mediterráneo, sí, pero mejor no preguntéis por la comida inglesa: es casi inexistente si la buscas en restaurantes y por algo será.</p>
<p><img src="http://farm4.static.flickr.com/3003/2848712224_a6bdf1af48.jpg" alt="Se acaba la diversión" width="375" height="500" /></p>
<p>En fín, un viaje muy típico pero también muy recomendable. Si aún no has estado en Londres, no tienes excusa ahora que está a tiro de piedra con compañias low cost. Más fotos en el <a href="http://www.flickr.com/photos/14508827@N00/2847952749/" target="_self">Flickr de Ana</a>.</p>
<p>También han sido mis vacaciones más largas desde que empecé en <a href="http://www.sicem.biz" target="_self">Sicem</a> haya por el 2003. Quince días de vacaciones y quince en paro. El lunes empiezo en <a href="http://www.yaco.es" target="_self">Yaco</a> y la verdad, tengo bastantes ganas de empezar y cambiar un poco de aires.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2008/09/13/viajes-y-cambios/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Uploading files to wordpress and SELinux problems</title>
		<link>http://www.lorenzogil.com/blog/2008/07/24/uploading-files-to-wordpress-and-selinux-problems/</link>
		<comments>http://www.lorenzogil.com/blog/2008/07/24/uploading-files-to-wordpress-and-selinux-problems/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 16:36:54 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/?p=56</guid>
		<description><![CDATA[If you use Fedora and Wordpress and you get this error while trying to upload an image to your post:

The uploaded file could not be moved to /usr/share/wordpress/wp-content

All you need to do is labeling your uploads directory with the httpd_sys_content_t type:
[root@nyarlathotep wp-content]# pwd
/usr/share/wordpress/wp-content
[root@nyarlathotep wp-content]# chcon -t httpd_sys_content_t uploads/ -R
I hope this is useful for somebody [...]]]></description>
			<content:encoded><![CDATA[<p>If you use Fedora and Wordpress and you get this error while trying to upload an image to your post:</p>
<blockquote>
<pre>The uploaded file could not be moved to /usr/share/wordpress/wp-content</pre>
</blockquote>
<p>All you need to do is labeling your uploads directory with the httpd_sys_content_t type:</p>
<blockquote><p>[root@nyarlathotep wp-content]# pwd<br />
/usr/share/wordpress/wp-content</p></blockquote>
<blockquote><p>[root@nyarlathotep wp-content]# chcon -t httpd_sys_content_t uploads/ -R</p></blockquote>
<p>I hope this is useful for somebody else.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2008/07/24/uploading-files-to-wordpress-and-selinux-problems/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google Maps a pie</title>
		<link>http://www.lorenzogil.com/blog/2008/07/23/google-maps-a-pie/</link>
		<comments>http://www.lorenzogil.com/blog/2008/07/23/google-maps-a-pie/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 18:45:41 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Viajes]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/?p=53</guid>
		<description><![CDATA[Desde hace poco Google Maps permite calcular recorridos a pie. Siempre lo ha hecho en coche pero lo nuevo es que ahora calcula los recorridos a pie si así se lo decimos. De esta forma no tiene en cuenta el sentido de circulación de las calles y simplemente calcula el camino más corto entre dos [...]]]></description>
			<content:encoded><![CDATA[<p>Desde hace poco <a href="http://google.dirson.com/post/4062-recorridos-pie-google-maps/">Google Maps permite calcular recorridos a pie</a>. Siempre lo ha hecho en coche pero lo nuevo es que ahora calcula los recorridos a pie si así se lo decimos. De esta forma no tiene en cuenta el sentido de circulación de las calles y simplemente calcula el camino más corto entre dos puntos. ¿O no?</p>
<p>Además, también te calcula el tiempo estimado a pie, algo bastante útil para ciudades que no son la tuya y en la que no te haces una idea de la escala del mapa.</p>
<p>He hecho la prueba en el recorrido que hago desde mi casa a la <a href="http://www.alhambra-patronato.es">Alhambra</a> todos los martes y los jueves para ir a trabajar y me he quedado un poco sorprendido de los resultados obtenidos:</p>
<p>Este es el camino que me calcula Google:</p>
<p><a href="http://www.lorenzogil.com/blog/wp-content/uploads/2008/07/camino-alhambra-1.png"><img class="alignnone size-full wp-image-54" title="camino-alhambra-1" src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/07/camino-alhambra-1.png" alt="Ruta de Google" width="500" height="463" /></a></p>
<p>Y este el que hago yo:</p>
<p><a href="http://www.lorenzogil.com/blog/wp-content/uploads/2008/07/camino-alhambra-2.png"><img class="alignnone size-full wp-image-55" title="camino-alhambra-2" src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/07/camino-alhambra-2.png" alt="Ruta que hago yo" width="500" height="463" /></a></p>
<p>Como podeis ver en la ruta de Google se tardan 42 minutos, mientras que en la mía, se tardan 41 minutos. Algunos detalles curiosos:</p>
<ul>
<li>La ruta es de desde A (mi casa) a B (el trabajo). Si la calculamos desde B a A, el tiempo es de 37 minutos ya que el camino es cuesta abajo en este último caso.</li>
<li>Realmente yo tardo unos 30 minutos cuesta arriba y unos 25 cuesta abajo, pero como me pica la curiosidad, mañana me pienso cronometrar.</li>
<li>El único motivo que se me ocurre por el que Google no me haya dado mi ruta (se tarda menos) es porque mi ruta tiene más recorrido con una cuesta más pronunciada. Si esto fuera así es para fliparlo. El difunto <a href="http://en.wikipedia.org/wiki/Edsger_Dijkstra">Dijkstra</a> estaría orgulloso.</li>
</ul>
<p><strong>Actualización</strong>: Hoy me he cronometrado en el trayecto A-&gt;B y he tardado 28 minutos. Parece que ando más rápido de lo que estima Google Maps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2008/07/23/google-maps-a-pie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Y ya van 5</title>
		<link>http://www.lorenzogil.com/blog/2008/07/04/y-ya-van-5/</link>
		<comments>http://www.lorenzogil.com/blog/2008/07/04/y-ya-van-5/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 14:05:05 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Amigos]]></category>

		<category><![CDATA[Ordenadores]]></category>

		<category><![CDATA[Viajes]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/?p=51</guid>
		<description><![CDATA[Escribo este post desde la última charla de la quinta Guadec Hispana. Quién lo diría desde aquel primer encuentro en Almendralejo, pero lo cierto es que hemos pasado ya por La Coruña, Vilanova, Granada y Fuenlabrada. Afortunadamente yo he tenido la suerte de asistir a todas ellas y ya es casi una cita obligada para [...]]]></description>
			<content:encoded><![CDATA[<p>Escribo este post desde la última charla de la quinta Guadec Hispana. Quién lo diría desde aquel primer encuentro en Almendralejo, pero lo cierto es que hemos pasado ya por La Coruña, Vilanova, Granada y Fuenlabrada. Afortunadamente yo he tenido la suerte de asistir a todas ellas y ya es casi una cita obligada para mí. Más aún cuando sólo he podido ir a la Guadec internacional una vez.</p>
<p>Han sido dos días muy agradables viendo a viejos conocidos como Germán, los Carlos, Álvaro, Palomo, Daniel, Claudio, Roberto, Domingo y muchos otros que posiblemente olvide.</p>
<p>Al igual que GCubo, el grupo de personas de GNOME-Hispano es ya un grupo de amigos primero y de desarrolladores/usuarios de GNOME después. Tristemente, y al igual que GCubo otra vez, cada vez se ven menos caras nuevas. Aquí en la Guadec se ha hablado de esto y se han intentado buscar causas y soluciones sin llegar a un acuerdo concreto.</p>
<p>Al final, para mí no deja de ser un par de días muy agradables en un ambiente distendido y divertido en los que siempre aprendes cosas nuevas pero sobre todo mantienes el contacto con un puñado de personas que vienen todos los años porque les apasiona esto del software libre. Como a mí.</p>
<p><a href="http://www.lorenzogil.com/blog/wp-content/uploads/2008/07/caras-guadec-es-2008.gif"><img class="alignnone size-full wp-image-52" title="caras-guadec-es-2008" src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/07/caras-guadec-es-2008.gif" alt="Algunas caras de esta Guadec-es" width="500" height="500" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2008/07/04/y-ya-van-5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Libros que leí en el 2007</title>
		<link>http://www.lorenzogil.com/blog/2008/01/17/libros-que-lei-en-el-2007/</link>
		<comments>http://www.lorenzogil.com/blog/2008/01/17/libros-que-lei-en-el-2007/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 12:17:37 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Ordenadores]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/2008/01/17/libros-que-lei-en-el-2007/</guid>
		<description><![CDATA[Siguiendo un poco el ejemplo de Malglam, aunque con un poco más de retraso, aquí os dejo la lista de libros que leí el año pasado:
Conan de Cimmeria. Volumen 1. 1932 - 1933
Conan siempre ha sido uno de mis héroes desde pequeño y aunque no tuviera muchos comics de él, tras ver la película Conan [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo un poco el ejemplo de <a href="http://malglam.livejournal.com/">Malglam</a>, aunque con un poco más de retraso, aquí os dejo la lista de libros que leí el año pasado:</p>
<h3>Conan de Cimmeria. Volumen 1. 1932 - 1933</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/conan-1.jpg" alt="conan-1.jpg" align="left" hspace="10" />Conan siempre ha sido uno de mis héroes desde pequeño y aunque no tuviera muchos comics de él, tras ver la película Conan el Bárbaro, siempre que podía imitaba sus mandobles con una fregona. Ahora tengo la edición de coleccionista de la película y estos dos tomos que Ana me ha regalado este año. Lo que no sabía de pequeño es que Robert E. Howard, el autor del personaje, era coetáneo de H. P. Lovecraft, uno de mis autores preferidos. Eso se nota en algunas descripciones y sensaciones que transmiten los relatos de Conan, quién puede matar a un gorila de un puñetazo pero cuando se enfrenta a hechiceros y a lo desconocido en general tiene miedo y prefiere evitarlo. A través de los relatos cortos que componen el libro te haces una idea de la personalizad de Conan: bruto y primitivo pero al mismo tiempo inteligente y justo. Un libro muy recomandable si tienes los 60 eurazos que cuesta esta edición de super lujo <img src='http://www.lorenzogil.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Conan de Cimmeria. Volumen 2. 1933 - 1934</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/conan-2.jpg" alt="conan-2.jpg" align="left" hspace="10" />Más de lo mismo, es decir, genial. Esta vez hay menos relatos pero son más largos. El último, &#8220;La Hora del Dragón&#8221;, me ha parecido el mejor relato de Howard de los que he leido. Es casi una novela por su extensión y habla de los días en los que Conan ya era rey de Aquilonia, de cómo le arrebatan el trono y de cómo consigue recuperarlo. Ojalá alguién haga un día <a href="http://www.blogdecine.com/2007/11/01-teaser-poster-de-conan">una película</a> de este relato.</p>
<h3>Añoranzas y Pesares</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/anoranzas-y-pesares.jpg" alt="anoranzas-y-pesares.jpg" align="left" hspace="10" /> Añoranzas y pesares es una trilogía compuesta de 4 libros. Es trilogía porque el tercer y cuarto libro originariamente eran uno solo pero por su tamaño las editoriales decidieron dividirlo en dos. Me lo he leido porque Ana me lo ha recomendado y porque en general soy muy aficionado a los libros de fantasía. El libro engancha mucho porque la historia es rápida y dinámica (me leí los 4 libros en dos meses) pero creo que eso es todo lo bueno que puede decir sobre él. Es bastante predecible y algunas cosas parecen copias literales de El Señor de los Anillos pero bueno, junto con Ken Follet o Stephen King, creo que el autor es uno de esos que hacen libros como churros y libros que enganchan mucho.</p>
<h3>Paper Prototyping</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/paper-prototyping.gif" alt="paper-prototyping.gif" align="left" hspace="10" />Este libro trata de una técnica que me llamaba la atención desde hace algún tiempo: hacer prototipos en papel de programas informáticos. Básicamente viene a decir que es tan poco lo que cuesta hacer un prototipo en papel y tanto lo que se aprende de él que todos los proyectos de software deberían hacerlos en sus fases iniciales. El libro hace especial hincapié en los tests de usabilidad usando prototipos de papel pero yo creo que hacer prototipos de papel es también de enorme utilidad para etapas de análisis y posterior implementación.</p>
<p>Es un buen libro pero quizá excesivamente largo para las 4 o 5 ideas claves que explica. La verdad es que al final se me hizo algo pesado.</p>
<h3>User Interface Design for Programmers</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/ui_for_programmers.jpg" alt="ui_for_programmers.jpg" align="left" hspace="10" />Este libro lo leí durante mi estancia en Brasil en la magnifica biblioteca de <a href="http://async.com.br/">Async</a>. Me gustó tanto que he decidido comprarlo y releerlo en este año pasado. Como la mayoría de los libros que me gustan, es un libro corto y escrito en un lenguaje informal y muy atractivo, como casi todo lo que escribe Joel. Se basa en la premisa de que los programadores y los usuarios tienen modelos distintos de los programas informáticos y que un programa será tanto más usable cuanto más se acerque su modelo al modelo del usuario. Este concepto tan difuso es explicado con suma claridad en los capítulos del libro, que en total, no me llevaron más de 3 tardes en leerlo.</p>
<h3>Don&#8217;t make me think</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/dont-make-me-think.jpg" alt="dont-make-me-think.jpg" align="left" hspace="10" />Al igual que el User Interface Design for Programmers, este libro también lo leí en Brasil y también me fascinó. Se lee en el mismo tiempo que se lee un Mortadelo, uno se rie casi igual y se aprende un montón sobre usabilidad de páginas web. Como el anterior, el libro gira en torno a una premisa: cualquier elemento de una página web (o cualquier interfaz de usuario) que haga pensar al usuario y le obligue a tomar una decisión, sobra. En los siguientes capítulos desarrolla esta idea y pone numerosos ejemplos con webs existentes de cosas que se deben hacer y cosas que no se deben hacer. Especial mención merece un apéndice al final del libro donde encontramos una carta modelo para tu jefe o tu cliente explicándo por qué no se deben hacer páginas web con gifs animados, introducciones en flash y demás aberraciones que sólo podemos perdonarle a Homer Simpson.</p>
<h3>The C Programming Language</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/the-c-programming-language.jpg" alt="the-c-programming-language.jpg" align="left" hspace="10" />He de confesar que a estas alturas de la vida no había leído este libro y tenía una mezcla de curiosidad y mala conciencia por ello. Afortunadamente ha sido fácil de remediar y he de decir que el libro no me ha decepcionado lo más mínimo, cosa que suele pasarme por ejemplo con ciertas películas, que todo el mundo recomienda y luego la ves y dices &#8220;no es para tanto&#8221;. Pienso que este libro debería ser de obligada lectura en la carrera de informática ya que explica de forma clara y cristalina conceptos difíciles de coger la primera vez que empiezas a programar como los arrays, las cadenas de caractéres, los punteros, etc. Lo único que me falta para completar esta lectura es desarrollar un programilla sencillo pero útil donde pueda poner en práctica lo que he aprendido y/o recordado con este libro.</p>
<h3>The  Mythical Man Month</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/the-mythical-man-month.jpg" alt="the-mythical-man-month.jpg" align="left" hspace="10" />Este es el tercer y último libro de este post de los que leí en Brasil. Es considerado un clásico en la ingeniería del software y comprende un montón de artículos sobre el desarrollo de aplicaciones software de complejidad y tamaño considerables. En él viene a decir que la tarea más compleja de hacer una aplicación es la comunicación entre las distintas partes involucradas: el cliente, el arquitecto de software, los analistas, los programadores, etc. A consecuencia de esto añadir más mano de obra a un proyecto de software que lleva retraso según la planificación original no sólo no resuelve el problema sino que lo agrava. Otro artículo interesante incluido en el libro es &#8220;No silver bullet&#8221; en el que viene decir que en la informática no hay una herramienta/tecnología/metodología mágica que mejore sustancialmente la creación de software tal y como han ido vendiendola distintos fabricantes desde finales de los años 60. Es curioso (o aterrador si se quiere) comprobar que casi 40 años después, este paper sigue siendo tan verídico como en la fecha en la que se publicó. Lo de silver bullet (bala de plata) es porque compara el proceso de creación de software con un hombre lobo por los peligros que ello conlleva y la bala de plata es lo único que mata al hombre lobo. En informática no hay balas de plata.</p>
<h3>El tío Petros y la conjetura de Goldbach</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/tio_petros.jpg" alt="tio_petros.jpg" align="left" hspace="10" />Esta novela la ví comentada en <a href="http://www.barrapunto.com">barrapunto</a> y un día que estaba en Alcampo, estaba en la sección de novedades y me hice con ella. Es un libro fácil de leer y bastante realista. La verdad es que me costaba creer que fuera una novela en lugar de una biografía y estoy seguro de que está inspirada/basada en la vida de un célebre matemático. La historía trata la vida de un matemático griego con una capacidad extraordinaria que dedica su vida a resolver la <a href="http://es.wikipedia.org/wiki/Conjetura_de_Goldbach">conjetura de Goldbach</a> todo contado desde la perspectiva de su sobrino, el verdadero protagonista del libro. No cuento más detalles para no fastidiarle el libro a nadie. En definitiva, es un libro ameno y muy interesante.</p>
<h3>Snow Crash</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/snow-crash.jpg" alt="snow-crash.jpg" align="left" hspace="10" />Snow Crash se considera uno de los libros que iniciaron el género de Ciber Punk. Tiene un estilo ágil y rápido con las descripciones justas y diálogos llenos de dobles sentidos y argot. Esto hace que se lea muy rápido pero al mismo tiempo requiere concentración por parte del lector para que no se le pase ningún detalle de la enrevesada trama. Su visión del futuro no es muy tentadora pero su gran dosis de humor negro y cinismo hace que al final sea una experiencia divertida, por lo menos al leerla. Vivir en ese mundo me imagino que y no es tán divertido. La portada de mi edición es la de la foto y es bastante más cutre: una chica en 3D encima de una patineta voladora. Es bastante dificil que te tomen en serio cuando te ven en el autobus leyendo un libro con dicha portada&#8230;.</p>
<h3>Hegemonía o Supervivencia. La estrategia imperialista de Estados Unidos</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/hegemonia-o-supervivencia.jpg" alt="hegemonia-o-supervivencia.jpg" align="left" hspace="10" />Este libro me lo regalaron Mario y Montero el año pasado y es un poco denso de lee, lleno de referencias a otros libros, de cifras y estadísticas. Todo para poner a Estados Unidos en su lugar. Después de leer el libro lo único que se te queda es una sensación de mala leche e impotencia enorme tras ver que todas tus sospechas sobre este país eran ciertas y Chomsky simplemente las ha investigado y plasmado aquí. No apto para personas sensibles a las injusticias mundiales.</p>
<h3>El ecologista escéptico</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/el-ecologista-esceptico.jpg" alt="el-ecologista-esceptico.jpg" align="left" hspace="10" />Este libro me lo recomendó mi buen amigo <a href="http://kluge.wordpress.com/">Jaime</a>, el escéptico por excelencia <img src='http://www.lorenzogil.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> He decir que aún no lo he terminado porque si bien el de Chomsky era denso esté es más compacto que un mantecao de maritoñis. Lo bueno es que esta dividido en distintas partes y puedes leerlas en el orden que quieras porque son más o menos independientes excepto la primera que es la introducción y que es la que deberías leer primero. El libro viene a decir básicamente que los medios de comunicación tienden a darnos malas noticias sobre el mundo y que las buenas casi nunca nos llegan. Así es normal que siempre estemos en estado de alerta y paranoia esperando que llegue el siguiente cataclismo. El autor insiste en que es necesario hacer un análisis detallado de los problemas que asolan el mundo (porque haberlos haylos, eso está claro) para poder decidir en qué emplear nuestros (escasos) recursos de la mejor forma posible. No creo que nadie pueda estar en contra de está idea tan racional.</p>
<h3>The Alphabet of Manliness</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/alphabet-manliness.jpg" alt="alphabet-manliness.jpg" align="left" />El alfabeto de la masculinidad es un libro escrito por el autor de <a href="http://www.thebestpageintheuniverse.net/">la mejor página del universo</a> y que no te decepcionará. Por favor, abstenganse las mujeres en general y las feministas en particular porque el libro es muy politicamente incorrecto. Cada letra del alfabeto la asocia con un sígno claro de la masculinidad. Algunos ejemplos son la H de Heavy Metal, la C de Costillas de Cerdo, la T de tetas o la P de patada en el culo. Como se puede ver, todos ellos claros símbolos de masculinidad. Si te gustaron las frases de Chuck Norris, este libro te encatará. El que quiera saber más, el libro tiene hasta <a href="http://www.alphabetofmanliness.com/">su propia web</a>.</p>
<h3>Los Hijos de Húrin</h3>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2008/01/hijos-hurin.jpg" alt="hijos-hurin.jpg" align="left" />Por último, este año pasado me leí los Hijos de Hurín, de Tolkien padre aunque editado y juntado por Tolkien hijo. He de decir que he leido más de un libro de los que ha publicado Tolkien hijo y sólo este me ha parecido bueno. El Libro de los Cuentos Perdidos, el Retorno de la Sombra y otros como estos me parecieron un mero trabajo de corta y pega. Pero en esta ocasión parece que se ha esmerado. La historia que cuenta no es nueva si has leido el Silmarilion, eso sí esta mucho más desarrollada y se puede leer sin tener que memorizar 50 nombres para no perderte. La gente que lee el Silmarilion y no les gusta porque esperan que sea otro Señor de los Anillos se sentirán un poco menos decepcionados con este libro. Aunque la verdad, a mí el Silmarilion me encantó. Este libro me ha gustado tanto que lo he comprado 3 veces este año: uno para mí y dos para hacer regalos, a Ana y a Daniel, las otras dos personas en el mundo que conozco que están casi tan flipadas con Tolkien como yo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2008/01/17/libros-que-lei-en-el-2007/feed/</wfw:commentRss>
		</item>
		<item>
		<title>¿Genialidades o aberraciones?</title>
		<link>http://www.lorenzogil.com/blog/2007/12/15/%c2%bfgenialidades-o-aberraciones/</link>
		<comments>http://www.lorenzogil.com/blog/2007/12/15/%c2%bfgenialidades-o-aberraciones/#comments</comments>
		<pubDate>Sat, 15 Dec 2007 10:29:15 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Tiendas]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/2007/12/15/%c2%bfgenialidades-o-aberraciones/</guid>
		<description><![CDATA[Ayer paseaba con Ana por la zona de juguetes de Carrefour con la excusa barata de mirar algo para los sobrinos de Ana (imagina si es mala excusa que los regalos de dichos sobrinos ya están comprados) y es que nos encanta ver los juguetes de los niños de hoy en día.
Cuál fue nuestra sorpresa [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer paseaba con Ana por la zona de juguetes de Carrefour con la excusa barata de mirar algo para los sobrinos de Ana (imagina si es mala excusa que los regalos de dichos sobrinos ya están comprados) y es que nos encanta ver los juguetes de los niños de hoy en día.</p>
<p>Cuál fue nuestra sorpresa al ver, escondido entre cajas fosforitas y muñecos cabezones, esta auténtica joya del mashup jugueteril:</p>
<p><a href="http://www.lorenzogil.com/blog/wp-content/uploads/2007/12/transformers-starwars-1.jpg" title="transformers-starwars-1.jpg"><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2007/12/transformers-starwars-1.jpg" alt="transformers-starwars-1.jpg" /></a></p>
<p>Sí, estais en lo cierto, se trata de un X-Wing que se transforma en Luke Skywalker. No diréis que el creativo de turno no tuvo un sueño chungo ese día.</p>
<p><a href="http://www.lorenzogil.com/blog/wp-content/uploads/2007/12/transformers-starwars-2.jpg" title="transformers-starwars-2.jpg"><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2007/12/transformers-starwars-2.jpg" alt="transformers-starwars-2.jpg" /></a></p>
<p>Por cierto, es impresionante como 8 de cada 10 juguetes giran en torno a una de estas pocas temáticas: Spiderman, Piratas del Caribe, Harry Potter, Transformers o la Guerra de las Galaxias. Así no es extraño ver pistas de coches de Piratas del Caribe o patines de Spiderman.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2007/12/15/%c2%bfgenialidades-o-aberraciones/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cena de Navidad</title>
		<link>http://www.lorenzogil.com/blog/2007/12/13/cena-de-navidad/</link>
		<comments>http://www.lorenzogil.com/blog/2007/12/13/cena-de-navidad/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 18:04:03 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Amigos]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/2007/12/13/cena-de-navidad/</guid>
		<description><![CDATA[Lo primero, el comunicado oficial:

Ahora que lo veis más claro os detallo el menú que me ha pasado el dueño:
Una ensalada para cada cuatro personas a elegir entre:

Ensalada alemana
Ensalada de la casa
Ensalada hortelana

Entrante para cada cuatro personas:

Albóndigas en salsa de tomate

Un plato para cada persona a elegir entre:

Seitan al ajillo con arroz
Patatas al estilo del [...]]]></description>
			<content:encoded><![CDATA[<p>Lo primero, el comunicado oficial:</p>
<p><embed src="http://www.dylanmessaging.com/assets/flash/message-embedded.swf" type="application/x-shockwave-flash" width="528" height="400" bgcolor="#AD1A22" flashvars="messageID=J7U5-149O-ZAAM-9RQR-IA5O&#038;embedID=6828"></embed></p>
<p>Ahora que lo veis más claro os detallo el menú que me ha pasado el dueño:</p>
<p>Una ensalada para cada cuatro personas a elegir entre:</p>
<ul>
<li>Ensalada alemana</li>
<li>Ensalada de la casa</li>
<li>Ensalada hortelana</li>
</ul>
<p>Entrante para cada cuatro personas:</p>
<ul>
<li>Albóndigas en salsa de tomate</li>
</ul>
<p>Un plato para cada persona a elegir entre:</p>
<ul>
<li>Seitan al ajillo con arroz</li>
<li>Patatas al estilo del Chef</li>
<li>Taquitos de soja en salsa de almendras</li>
<li>Arroz integral, setas y gluten</li>
<li>Cuscus con verduritas al curry</li>
<li>Cuscus al estilo tunecino</li>
<li>Espaguettis integrales con salsa de champiñon</li>
<li>Lasagna vegetal</li>
</ul>
<p>Pan</p>
<p>Bebida: refresco, cerveza o vino de la casa</p>
<p>Postre: pastel de queso o tarta de chocolate y avellanas</p>
<p>Infusión digestiva</p>
<p>Todo esto cuesta 18 euros. También me ha dicho que, por supuesto, podemos pedir a la carta. En este caso el único inconveniente es que tardarán más en servirnos. Bueno eso, y que supongo que nos saldrá algo más caro, pero tampoco creo que mucho más.</p>
<p>Ya sabéis, id confirmandome en los comentarios los que vayais a venir ya que el martes le tengo que decir un número bastante cercano a los que vayamos a ser. También es importante que digais si os va mejor la opción menú o la carta.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2007/12/13/cena-de-navidad/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I like Unix</title>
		<link>http://www.lorenzogil.com/blog/2007/12/03/i-like-unix/</link>
		<comments>http://www.lorenzogil.com/blog/2007/12/03/i-like-unix/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 19:57:51 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/2007/12/03/i-like-unix/</guid>
		<description><![CDATA[Last friday started as any other friday. I went to the office, plugged in my laptop and logged into my Fedora 7 system. Open a shell, setup a couple of environment variables, launch postgresql and start programming in Django. What a wonderful job, isn&#8217;t it?
Well, it is until you get errors like this:
[lgs@portatil-lgs saludinnova]$ python [...]]]></description>
			<content:encoded><![CDATA[<p>Last friday started as any other friday. I went to the office, plugged in my laptop and logged into my Fedora 7 system. Open a shell, setup a couple of environment variables, launch postgresql and start programming in Django. What a wonderful job, isn&#8217;t it?</p>
<p>Well, it is until you get errors like this:</p>
<p><code>[lgs@portatil-lgs saludinnova]$ python manage.py runserver<br />
Validating models&#8230;<br />
0 errors found<br />
Django version 0.97-pre-SVN-6670, using settings &#8217;saludinnova.settings&#8217;<br />
Development server is running at http://127.0.0.1:8000/<br />
Quit the server with CONTROL-C.<br />
Error: That port is already in use.</code></p>
<p>Wait, I run the exact same command yesterday at the end of my job day and it actually worked! I immediately thought about a virus since I swear I didn&#8217;t change the system in any way. Or maybe I did&#8230;</p>
<p>So first, I needed to know which program was using the Django sacred port: 8000. Of course I can run Django development server in another port. But that&#8217;s not the point. And it&#8217;s not fun!</p>
<p>But first let&#8217;s make sure something is listening in port 8000:</p>
<p><code>[root@portatil-lgs ~]# nmap -sT -O localhost</code></p>
<p>Starting Nmap 4.20 ( http://insecure.org ) at 2007-11-30 10:39 CET<br />
Interesting ports on portatil-lgs (127.0.0.1):<br />
Not shown: 1691 closed ports<br />
PORT     STATE SERVICE<br />
22/tcp   open  ssh<br />
25/tcp   open  smtp<br />
111/tcp  open  rpcbind<br />
631/tcp  open  ipp<br />
5432/tcp open  postgres<br />
8000/tcp open  http-alt<br />
Device type: general purpose<br />
Running: Linux 2.6.X<br />
OS details: Linux 2.6.17.8 SMP (x86)<br />
Uptime: 0.080 days (since Fri Nov 30 08:43:31 2007)<br />
Network Distance: 0 hops</p>
<p>Right, http-alt, what&#8217;s that?</p>
<p><code>[root@portatil-lgs ~]# ps aux | grep http-alt<br />
root      6045  0.0  0.0   4032   752 pts/0    S+   10:40   0:00 grep http-alt<br />
</code><br />
No process is called http-alt. No big surprise since it looks like a standard name not binded to a real application. Let&#8217;s check the well known services:</p>
<p><code>[root@portatil-lgs ~]# cat /etc/services | grep 8000<br />
irdmi           8000/tcp                        # iRDMI<br />
irdmi           8000/udp                        # iRDMI<br />
mtl8000-matrix  8115/tcp                        # MTL8000 Matrix<br />
mtl8000-matrix  8115/udp                        # MTL8000 Matrix<br />
biimenu         18000/tcp                       # Beckman Instruments, Inc.<br />
biimenu         18000/udp                       # Beckman Instruments, Inc.<br />
nxlmd           28000/tcp                       # NX License Manager<br />
nxlmd           28000/udp                       # NX License Manager<br />
nimcontroller   48000/tcp                       # Nimbus Controller<br />
nimcontroller   48000/udp                       # Nimbus Controller<br />
</code></p>
<p>Still no clue of what&#8217;s going on. Let&#8217;s try netstat:</p>
<p><code>[root@portatil-lgs ~]# netstat -anp | grep 8000<br />
tcp        0      0 127.0.0.1:8000              0.0.0.0:*                   LISTEN      2333/nasd<br />
</code><br />
Aha! I got you nasd daemon! Whatever you are.</p>
<p><code>[root@portatil-lgs ~]# which nasd<br />
/usr/bin/nasd<br />
[root@portatil-lgs ~]# rpm -qf /usr/bin/nasd<br />
nas-1.9.1-2.fc7<br />
[root@portatil-lgs ~]# yum remove nas<br />
Dependencies Resolved<br />
=============================================================================<br />
Package                 Arch       Version          Repository        Size<br />
=============================================================================<br />
Removing:<br />
nas                     i386       1.9.1-2.fc7      installed         1.3 M<br />
Removing for dependencies:<br />
qt4-x11                 i386       4.3.2-4.fc7      installed          16 M<br />
skype                   i586       1.4.0.118-fc5    installed          15 M</code></p>
<p>Finally I see the guilty program: it was Skype (well, one of its dependencies, a sound server), which I installed on thursday night to speak with my sister, who lives in Slovaquia. So it looks like I actually changed my system but I really couldn&#8217;t think about this kind of side effects. Fortunately my box is full of tools to help my damaged brain repair this tiny little problems <img src='http://www.lorenzogil.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2007/12/03/i-like-unix/feed/</wfw:commentRss>
		</item>
		<item>
		<title>An address form</title>
		<link>http://www.lorenzogil.com/blog/2007/11/20/an-address-form/</link>
		<comments>http://www.lorenzogil.com/blog/2007/11/20/an-address-form/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 21:36:40 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Ordenadores]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/2007/11/20/an-address-form/</guid>
		<description><![CDATA[In the Zope 3 app I&#8217;m working at we have person objects that can have a list of addresses associated to them. No rocket science so far. So I needed to create an add and an edit forms for this. Something with url like these:

http://yourhost/app/people/john/addresses/+/@@addAddress.html
http://yourhost/app/people/john/addresses/3/@@editAddress.html

Now you wonder how an address looks like. Quite simple, let&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>In the Zope 3 app I&#8217;m working at we have person objects that can have a list of addresses associated to them. No rocket science so far. So I needed to create an add and an edit forms for this. Something with url like these:</p>
<ul>
<li>http://yourhost/app/people/john/addresses/+/@@addAddress.html</li>
<li>http://yourhost/app/people/john/addresses/3/@@editAddress.html</li>
</ul>
<p>Now you wonder how an address looks like. Quite simple, let&#8217;s look at its interface:</p>
<pre>
class IAddress(IContained):

    line = zope.schema.Text(

        title=u'Line',

        description=u'Street type and number information',

        required=True

    )</pre>
<pre>    country = zope.schema.Choice(

        title=u'Country',

        description=u'Country',

        vocabulary='CountriesVocabulary',

        required=True,

    )

    state = zope.schema.Choice(

        title=u'State',

        description=u'State',

        vocabulary='StatesVocabulary',

        required=False,

    )

    postalCode = zope.schema.Choice(

        title=u'Postal Code',

        description=u'Postal Code and City',

        vocabulary=u'PostalCodesVocabulary',

        required=False,

    )

    contact = zope.schema.TextLine(

        title=u'Contact',

        description=u'Contact information',

        required=False

    )

    notes = zope.schema.Text(

        title=u'Notes',

        description=u'Other notes',

        required=False

    )</pre>
<p>As you can see the country, state and postal code are choices taken from different vocabularies. I have models for those objects and the structure is hierarchical: A country contains state and a state contains postal codes.</p>
<p>I could just store the postal code inside the address since I can retrieve its state and its country just from the postal code. We decided not to do so to because of two reasons:</p>
<ul>
<li>To keep our queries and business logic simpler. For example, consider you want a report of all your customer living in Spain&#8230;</li>
<li>So we could use the hierarchical relationships to aid our users in the addresses forms.</li>
</ul>
<p>I&#8217;ll explain the second reason in more detail in this post. What I wanted to accomplish was something like what you see in this small screencast:</p>
<p><img src="http://www.lorenzogil.com/blog/wp-content/uploads/2007/11/addres-form-screncast.gif" alt="addres-form-screncast.gif" /></p>
<p>As you see, the user first select the country in the first dropdown list, this will fill the state dropdown list with all the states belonging to that country. Similarily, when the user chooses a state the postal codes<br />
dropdown list will be filtered.</p>
<p>I started implementing this with the wrong approach which I will also describe here for the record.</p>
<h3>Wrong approach</h3>
<p>In Zope 3 a choice field gets it list of possible values from something called a vocabulary (or more recently, a source). This can be anything that returns a list of terms. In our case the country vocabulary will<br />
get the list of country objects from the database. I have a countries folder registered with an ICountries interface so the task of getting the list of country objects is quite easy:</p>
<pre>
class CountriesVocabulary(SimpleVocabulary):
    zope.interface.classProvides(IVocabularyFactory)

    def __init__(self, context):
        terms = []
        for name, countries in zope.component.getUtilitiesFor(ICountries):
            terms += [SimpleTerm(country, country.__name__, country.name)
                      for country in countries.values()]
        super(CountriesVocabulary, self).__init__(terms)</pre>
<p>Building the states and postal codes vocabularies is a little more difficult since they depend on a context. This mean that the states vocabulary will depend on a specific country and the postal codes vocabulary will depend on a specific state. But the context won&#8217;t be the country neither the state in this two cases but the address object since the vocabularies are used in fields of the IAddress interface. Using this idea I coded these vocabularies:</p>
<pre>
class StatesVocabulary(SimpleVocabulary):
    zope.interface.classProvides(IVocabularyFactory)

    def __init__(self, context):
        terms = []
        if IAddress.providedBy(context):
            country = IAddress(context).country
            if country:
                terms = [SimpleTerm(state, state.__name__, state.name)
                         for state in country.values()]

        super(StatesVocabulary, self).__init__(terms)

class PostalCodesVocabulary(SimpleVocabulary):
    zope.interface.classProvides(IVocabularyFactory)

    def __init__(self, context):
        terms = []
        if IAddress.providedBy(context):
            state = IAddress(context).state
            if state:
                terms = [SimpleTerm(pc,
                                    pc.__name__,
                                    u'%s - %s' % (pc.code, pc.city))
                         for pc in state.values()]
        super(PostalCodesVocabulary, self).__init__(terms)</pre>
<p>So far so good but here is my problem: when you create or edit an address object you need to hit the save button three times to store the country, state and postal code. Why is this? Let&#8217;s try to reproduce these three steps:</p>
<ol>
<li>Step 1: You select a country and save the address</li>
<li>Step 2: Now the states vocabulary will be filled with the list of states for the country you choosed in step 1</li>
<li>Step 3: Finally you can choose a postal code from the postal codes of the state you choosed in step 2.</li>
</ol>
<p>Note that until you saved the country the vocabulary for states won&#8217;t have that information and thus, will return an empty term list. Same thing happens with the postal codes.</p>
<p>Even if you can get the proper information using AJAX in the form and fill the dropdown lists with the right information you won&#8217;t be able to save the address object since the vocabularies are also used for validation<br />
purposes.</p>
<p>No need to say this was a pain in the ass and kepts my brain busy for a few days until I found the right solution.</p>
<h3>Right approach</h3>
<p>The lesson learned from the previous approach was that something was wrong with dictionaries which depended on a context in such a strict way. In the IAddress interface I should keep the fields simple enough to let the form set <em>any</em> state on the state field and <em>any</em> postal code in the postal code<br />
field. As I still want some integrity in my data it&#8217;s time to delegate that to an invariant. In other words, I will any value of the right type into the state and postal code attributes and after that I will validate these<br />
fields with an invariant that will make sure the state is inside the country and the postal code is inside the state. An invariant like this:</p>
<pre>
def postalCodeInsideStateInsideCountry(address):
    country = address.country
    state = address.state
    postalCode = address.postalCode
    if country is not None and state is not None:
        if state not in country.values():
            st = state.name or state.__name__
            co = country.name or country.__name__
            raise zope.schema.ValidationError(
                u"The state %s does not belongs to country %s" % (st, co)
                )

        if postalCode is not None:
            if postalCode not in state.values():
                pc = postalCode.code or postalCode.__name__
                st = state.name or state.__name__
                raise zope.schema.ValidationError(
                    u"The postal code %s does not belongs to state %s" % (pc, st)
                    )</pre>
<p>Then I just add this declaration inside the IAddress interface:</p>
<pre>
class IAddress(IContained):
    ...

    zope.interface.invariant(postalCodeInsideStateInsideCountry)</pre>
<p>Next I&#8217;ll have to rewrite my vocabularies to be context-free and return the full list of objects in each case:</p>
<pre>
class PostalCodesVocabulary(SimpleVocabulary):
    zope.interface.classProvides(IVocabularyFactory)

    def __init__(self, context):
        terms = []
        for name, countries in zope.component.getUtilitiesFor(ICountries):
            for country in countries.values():
                for state in country.values():
                    prefix = country.__name__ + '/' + state.__name__ + '/'
                    terms += [SimpleTerm(RSP(pc),
                                         prefix + pc.__name__,
                                         u'%s - %s' % (pc.code, pc.city))
                              for pc in state.values()]

        super(PostalCodesVocabulary, self).__init__(terms)

class StatesVocabulary(SimpleVocabulary):
    zope.interface.classProvides(IVocabularyFactory)

    def __init__(self, context):
        terms = []
        for name, countries in zope.component.getUtilitiesFor(ICountries):
            for country in countries.values():
                terms += [SimpleTerm(RSP(state),
                                     country.__name__ + '/' + state.__name__,
                                     state.name)
                          for state in country.values()]

        super(StatesVocabulary, self).__init__(terms)</pre>
<p>You may note that the token of each term has a prefix now. This is because the token should be unique inside that vocabulary. I&#8217;m using the country code and the state code with a slash separating them because I will use<br />
this token later in javascript.</p>
<p>This fixed my problem as now I&#8217;m able to create an address object with just a save button hit without losing data integrity but I still have one more problem: my forms list all states and postal codes no matter which<br />
country is selected in the case of states and what state is selected in the case of postal codes. Seems like all these efforts didn&#8217;t help me to accomplish what I initially wanted.</p>
<p>It&#8217;s time for some javascript to make things truly dynamic.</p>
<h3>Adding javascript for a richer user experience</h3>
<p>My solution was to add a small jQuery script and a couple of related views to fill the dropdown lists every time the user changes them. This mean that if the user selects a country, an ajax request will be made to retrieve the list of states for that country and will populate the state select tag with those options. Similar behaviour happens when the user changes the state.</p>
<p>Let&#8217;s see the jQuery code:</p>
<pre>
(function($){

$(document).ready(function () {

    function fillSelect(data) {
        var options = $.map(data, function (obj, index) {
            return '&lt;option value="' + obj.id + '"&gt;' + obj.name + '&lt;/option&gt;';
        });
        return '&lt;option value=""&gt;(no value)&lt;/option&gt;n' + options.join("n");
    }

    $("select#form.country").change(function () {
        var value = $(this).val();
        if (value) {
            var currentState = $("select#form.state").val();
            var url = '../../Countries/' + value + '/@@states.json';
            $.getJSON(url, function (data) {
                $("select#form.state")
                  .html(fillSelect(data))
                  .val(currentState)
                  .change();
            });
        } else {
            $("select#form.state").html(fillSelect([])).change();
        }
    });

    $("select#form.state").change(function () {
        var value = $(this).val();
        if (value) {
            var currentPostalCode = $("select#form.postalCode").val();
            var url = '../../Countries/' + value + '/@@postalCodes.json';
            $.getJSON(url, function (data) {
                $("select#form.postalCode")
                  .html(fillSelect(data))
                  .val(currentPostalCode);
            });
        } else {
            $("select#form.postalCode").html(fillSelect([]));
        }
    });

    /* initialize combos */
    $("select#form.country").change();
});

})(jQuery);</pre>
<h3>Final thoughts</h3>
<p>The last bit of love that this form need is some support for adding countries/states/postalCodes when the user is filling an address and that information is not yet in the database. It shouldn&#8217;t be too hard to add some javascript buttons that ask the user for that and post it to the server. Then update the selects and let the user choose the new created object.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2007/11/20/an-address-form/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pycha 0.1.0 released. Just another pet project</title>
		<link>http://www.lorenzogil.com/blog/2007/10/17/pycha-010-released-just-another-pet-project/</link>
		<comments>http://www.lorenzogil.com/blog/2007/10/17/pycha-010-released-just-another-pet-project/#comments</comments>
		<pubDate>Wed, 17 Oct 2007 19:55:24 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
		
		<category><![CDATA[Ordenadores]]></category>

		<guid isPermaLink="false">http://www.lorenzogil.com/blog/2007/10/17/pycha-010-released-just-another-pet-project/</guid>
		<description><![CDATA[I&#8217;ve been writing Pycha in the last days. It is a Python library for drawing Charts as its name suggests  You can learn more about it at http://www.lorenzogil.com/projects/pycha/

What I&#8217;d like to comment here is the amount of work needed for releasing a piece of free software. We usually think that&#8217;s not too much but [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been writing Pycha in the last days. It is a Python library for drawing Charts as its name suggests <img src='http://www.lorenzogil.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> You can learn more about it at <a href="http://www.lorenzogil.com/projects/pycha/">http://www.lorenzogil.com/projects/pycha/</a></p>
<p><img src="http://www.lorenzogil.com/projects/pycha/browser/trunk/examples/piechart.png?format=raw" title="Sample pycha chart" alt="Sample pycha chart" height="400" width="400" /></p>
<p>What I&#8217;d like to comment here is the amount of work needed for releasing a piece of free software. We usually think that&#8217;s not too much but I always get surprised about how many things you need to do <strong>besides</strong> writing the code.</p>
<p>You need to choose a license, this will probably means reading for a while about the options out there and try to make a balance between a license that will make your software easy to distribute and a license that won&#8217;t make you (or your users) lose freedom.</p>
<p>You need to package the software. I chosed <a href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a> for this task as I like the idea of Python Eggs. As this is my first egg, I needed to read the manual, do some tests, try again and so on.</p>
<p>You need to write some decent docs. This means installation instruction, examples, general overview, etc. I did it in English and Spanish as some times I think I do too many things in that foreign language forgetting about my own language. Writing this blog is one of them <img src='http://www.lorenzogil.com/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':|' class='wp-smiley' /> </p>
<p>You need to setup a website with the docs, some instructions for downloading and getting the software, a bug tracking system and probably a wiki. Fortunately we have <a href="http://trac.edgewall.com">Trac</a> which makes this pretty easy. I got a problem with Trac in Fedora 7 but reading Trac&#8217;s Wiki solved it (tip: you need the python-sqlite2 package).</p>
<p>You need to write some tests, otherwise nobody with a sane brain will want to use your risky library. This is something I still need to do but hopefully I&#8217;ll be able to do it before the weekend.</p>
<p>You need to do the actual release. This involve writing an entry in the CHANGES.txt file, updating the version, tagging the repository, uploading to PyPi, etc. I used <a href="http://svn.zope.org/Sandbox/philikon/foundation/releasing-software.txt?rev=80625&amp;view=auto">this document</a> as a release guide.</p>
<p>Nothing is really mandatory but if you want to get some value from releasing a project with a free software license you pretty much need to do all of the above. In other words, no docs, no tests, no bug tracking system means no people interested, no community, no feedback, no bug reports, no patches, nothing.</p>
<p>So go and play with pycha and tell me what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lorenzogil.com/blog/2007/10/17/pycha-010-released-just-another-pet-project/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
