August, 2005


29
Aug 05

Gremlins

Hoy me pasé la mañana arreglando ‘pequeños’ desperfectos en Caleio. No lo entiendo, cuando subí la última versión todo funcionaba bien y ayer habían cosas rotas. Yo le echo la culpa a los gremlins.

En otro orden de cosas, el martes borré accidentalmente mi disco duro mientras estaba intentando convertir un disco duro externo a NTFS. En algún lugar del proceso fdisk decidió que el disco duro externo no le gustaba y eligió el de la laptop. O capaz que fueron los gremlins. Por suerte tenía algunos backups y los cambios que había hecho recientemente a Caleio estaban en el servidor de pruebas, con lo cual lo único que sinfperdí fue tiempo. Además aproveché para probar Gentoo (hola pablito!) ya que con Slackware no conseguí que me quedará como estaba antes y me frustré. Muy buena impresión con Gentoo, incluso teniendo en cuenta que me hice la instalación desde el Stage 1.

También querría aprovechar la ocasión para avisar que el bajo ritmo de posteo acá es por pura vaguería. Al menos yo soy honesto y no digo que estoy muy ocupado como otros…

Los dejo con un bichito de esos que son como palitos camuflados que encontré en el techo de la cocina:

Bichito palito


25
Aug 05

Simpatizando con las palomas

El sabado volviendo de el supermercado con un amigo ibamos discutiendo el origen alienígena de las palomas. El argumento a favor era que nunca habíamos visto una paloma muerta por causas naturales, siempre espachurradas por autos, y que tampoco se veían crías de paloma. El argumento en contra era que como raza alienígena no eran demasiado cool, a menos que todo fuese un experimento onda 'The Hitchhikers Guide To The Galaxy'.

Y voy yo el martes y piso una con la bicicleta. Nunca antes en mi vida había pisado un bichito y mucho menos una paloma. Lo mas curioso es que mi argumento en contra de que fuesen alienigenas es que eran muy tontas. Tienen una tendencia suicida de adivinar en que dirección uno va a desviar la trayectoria de la bicicleta para no llevarsela puesta y salir volando en dicha dirección. El evidente encontronazo era cuestion de tiempo.

Así que iba yo tranquilamente en mi aparatejo de dos ruedas cuando divise a la distancia tres palomas. Iba por una calle peatonal bastante transitada con lo cual me vi obligado a pasar por al lado de dichas palomas. Yo estaba apuntando para pasarles por un costado y había dejado atrás a dos cuando la tercera decidio caminar debajo de mi rueda. No sono a roto ni a espachurrado, solo se escuchó su aleteo.

Al final no se que le pasó, no miré para atrás porque sabía que si lo hacía iba a terminar dandome la vuelta para inspeccionar el desastre o tragandome un poste de luz. Y ahora me siento mal por la estupidez de una paloma. Hay gente que va por ahi robando, estafando, matando, rompiendo, etc y todos duermen bien, por qué yo me tengo que sentir mal por pisar una miserable paloma? ¿Seré demasiado bueno para mi propio bien?


17
Aug 05

HTML, XML y XSL: Guia de convivencia

A pedido popular

He aquí un pequeño resumen de como hice para meter HTML dentro de XML y que saliese bien. Notese que dije 'pequeño resumen', voy a explicar como se hace para meter HTML en XML y que en la transformación XSL lo trate como HTML y no XML. Usaré como ejemplo el código que escribí para Caleio.

Como saben HTML y XML son derivados de SGML, ambos usan etiquetas y funcionan de manera similar, y ahí esta el problema. Al meter HTML en el XML el transformador XSL no sabe que es HTML y lo trata como XML normal. El problema salió cuando quise meter enlaces (o cualquier otro elemento HTML como imágenes o saltos de linea) en las descripciones de elementos. Simplemente no los mostraba porque intepretaba que eran etiquetas XML.

La solución es muy simple, pero me costó mucho encontrarla porque todo el mundo tiene un método distinto. Este consiste en indicar en el archivo XML cuales etiquetas son especiales, en este caso de HTML. Por ejemplo:

<?xml version="1.0" standalone="yes"?>
<event>
	<item>
		<id>325</id>
		<startDate>2005-08-16</startDate>
		<endDate>2005-08-16</endDate>
		<startTime>21:00:00</startTime>
		<endTime>22:00:00</endTime>
		<eventType>1</eventType>
		<scheduled>0</scheduled>
		<repetition>0</repetition>
		<title>testing</title>
		<description xmlns:html="http://www.w3.org/1999/xhtml">something with a <html:br />
<html:a href="http://www.google.com">link</html:a></description>
	</item>
</event>

La etiqueta description es la que lleva el HTML, el atributo xmlns lo reconocerán de la etiqueta html que se usa en XHTML. xmlns (http://www.w3.org/TR/REC-xml-names/) sirve para definir Namespaces en XML, los namespaces son definiciones específicas de etiquetas, como en XML una etiqueta no tiene significado alguno con namespaces se puede definir mas correctamente. Que es justo lo que hace xmlns en la etiqueta html en XHTML:

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">

XHTML es XML, pero con el atributo xmlns le decimos al navegador que todo lo que hay dentro de la etiqueta html debe ser tratado como tal. Esto no es estrictamente necesario porque los navegadores lo detectan automaticamente, pero el validador de HTML tira error si se omite.

Aquí es donde entramos en terreno desconocido, algunas de las páginas que leí decian que con tal de poner el xmlns en la etiqueta que tuviese el HTML dentro ya bastaba, pero a mi se me hizo necesario poner :html para indicarle a XSL exactamente cuales etiquetas eran HTML. También sugerian poner la definición xmlns:html en la etiqueta raiz, lo cual es lógico porque al especificar con :html cuales son debería reconocerlas, pero a mi no me funcionó. Así que hay que declarar xmlns:html y luego todas las etiquetas van de la forma html:nombre_de_etiqueta. Esto es un problema porque hay que usar expresiones regulares para meter el html: en todas las etiquetas, y para colmo cuando se usa xmlhttprequest hay que sacarlas en el Javascript antes de mostrarlas porque las estás metiendo despues de la conversión XSL. Para ello escribí una función que parsea el XML y lo transforma en HTML:

function xml2html(xml)
{
	var i=0;
	var j=0;
	var html= "";
	var tagName = "";

	for (i=0;i<xml.childNodes.length;i++)
	{
		/* If it's not a text node then we need to continue searching within it */
		if (xml.childNodes[i].nodeType != 3)
		{
			/* Test for single tag elements */
			if (xml.childNodes[i].childNodes.length!=0)
			{
				/* Converts html:b into <b></b> with the stuff inside */
				tagName = xml.childNodes[i].nodeName.split(':')[1];
				fullTag = tagName;
				for(j=0;j<xml.childNodes[i].attributes.length;j++)
				{
					fullTag = fullTag + ' '+xml.childNodes[i].attributes[j].name+'='+xml.childNodes[i].attributes[j].value;
				}
				html = html + '<'+fullTag+'>' + xml2html(xml.childNodes[i]) + '</'+tagName+'>';
			} else {
				/* This is for single tag elements i.e.: <br /> and <img /> */
				fullTag = xml.childNodes[i].nodeName.split(':')[1];
				for(j=0;j<xml.childNodes[i].attributes.length;j++)
				{
					fullTag = fullTag + ' '+xml.childNodes[i].attributes[j].name+'='+xml.childNodes[i].attributes[j].value;
				}
				html = html + '<'+fullTag+' />';
			}
		} else {
			/* If it is a text node, just get the data and append to previous html */
			html = html + xml.childNodes[i].data;
		}
	}
	return html;
}

Un último detalle: para usarlo en una conversión XSL hay que usar la etiqueta <xsl:copy-of select="event//description" /> y no <xsl:value-of select="event//description" />. No me acuerdo que cosa mágica hace copy que no hace value pero sé que sino no funciona.


13
Aug 05

Turismo extremo

Ir a Birmingham a las 6:30 de la tarde. Llegar al bar a las 8:00. Encontrarnos con la gente y verlos tocar a ellos y otras dos bandas más hasta las 11:30. Taxi hasta "The Academy" y llegar a las 12:00. Boludear hasta la 2:30. Acompañar al último de los irreductibles para que nos muestre el camino hasta la estación de tren. Acompañar a dicho irreductible hasta su parada de autobús. Se va el autobús a las 3:00. Nuestro tren es a las 6:00.

¿Que hacemos?

Ya que estamos acá… turismo.

Cuando se despierte el fotógrafo oficial pongo fotos de las tres calles que visitamos antes de que nos entrase frio y nos fuesemos a dormir a la estación de tren.

En resumen: una noche interesante. Un poco cara, pero interesante.


11
Aug 05

Breve

Bueno llevaba, y llevo bastante tiempo desconectado. Demasiadas cosas para hacer y tan poco tiempo. Asi que la hago corta.

Hoy me topé con un curioso problema en PHP 4, a ver si alguien me aclara si es un bug o que.

Esto no funciona:

function dbQuery($sql)
{
	return mysql_query($sql) or die(mysql_error().'<br />'.$sql);
}

Esto sí:

function dbQuery($sql)
{
	$res = mysql_query($sql) or die(mysql_error().'<br />'.$sql);
	return $res;
}

Lo bueno y breve dos veces bueno, o algo asi. Nos vemos