Si quieres salvar a tu hijo del polio puedes rezar o puedes vacunarlo… Aplica la ciencia.Carl Sagan astrónomo estadounidense 1934-1996

Leido en Citas Ateas [via Linklog]

Hoy fué mi último día de universidad, ya estan todos mis proyectos entregados así que intentaré escribir un poco más a menudo :-P

 

Mi hermanita me mandó este enlace de otro producto beta de Google llamado Google Trends.

Simplemente muestra un gráfico de el flujo de noticias y busquedas en Google de determinadas palabras of frases, además permite comparar distintas palabras con comas, ejemplo Madrid, London

Poca utilidad le veo, pero es bastante interesante para los frikis de los gráficos :-P

 

En la firma de un comentario de Slashdot me encontré con una página de mensajes de error bizarros. No se si serán de verdad, pero algunos de estos son buenísimos:

Hit any user to continue
Please enter any 11 digit prime number to continue.
I’m not sure what the hell you just did but it’s baaad
It’s 11:00p.m., do you know where your data is?

 

Caleio empezó más o menos hace un año, durante las vacaciones de semana santa. Yo iba en busca de un programa para tener un calendario online que me sirviese para anotar mis cosas. Probé unos cuantos pero ninguno me convenció, a todos les faltaban cosas que para mi eran necesarias, como feeds RSS, alertas por email y otros elementos tan básicos como repetición de eventos.

La necesidad es la madre de la invención

Asi que me puse manos a la obra. Literalmente. Lo hice sin ponerme a pensar como lo iba a hacer, que quería incluir, que no quería incluir, cuales iban a ser mis prioridades, etc. Ese fué el primer error. No hacer algo tan básico como planear una estructura del código fue la causa de que tuviese que re-escribir el código para la versión tres. Eso y el fallido intento de usar XML para la interfaz como reemplazo del HTML tradicional. Ese fue mi segundo error, no investigar correctamente las técnologias que usé. En la primera version me pasé tres pueblos con el uso de AJAX y en la segunda versión cometí el error de tirarme de cabeza a usar XML y XSLT porque pensaba que me iba a facilitar el uso de AJAX. Mi idea era que con Javascript yo pudiese recibir cachitos de XML con AJAX, añadirlos o quitarlos fácilmente del documento y una vez hecho esto el navegador reflejaría los cambios re-aplicando la transformación XSL. Sin embargo esto no pasó y terminé usando una técnología que no solo no me ayudó sino que además me complicó las cosas.

Muchas veces caigo en la tentación de re-inventar la rueda. Sin ir más lejos, el otro día casi me pongo a escribir una versión muy simple de rsync porque no quería aprenderme los parametros y porque tenía pinta de ser fácil de implementar. Antes mencioné que Caleio nació porque no había otra utilidad que hiciese lo que yo quería, pero eso ya no es verdad. Para mi no tiene sentido continuar con este proyecto por esa misma razón, cuando ví Google Calendar por primera vez me di cuenta de que finalmente había encontrado lo que necesitaba.

Al principio pensé que no podía 'tirar a la basura' todo lo que había conseguido hasta el momento, pero después reflexionando sobre todo el proyecto me dí cuenta de que había mucho más que código. Es decir, toda la experiencia casi vale más que el programa.

A casos prácticos Caleio es el primer proyecto que hago solo, solo al final tuve la suerte de la ayuda de Jorge para diseñar la interfaz. Al ser un proyecto en solitario cometí muchos errores, pero aprendí de ellos todavía más. Al hacer mis investigaciones tuve la oportunidad de conocer muchas aplicaciones, tecnologías y utilidades. Mi nivel de programación mejoró mucho, en parte por el trabajo, pero también en parte por la cantidad de experimentación que hice con Caleio.

De todas maneras mi plan es dejar el proyecto en un estado decente, solucionar todos los bugs mayores, terminar la interfaz y ultimar algunos detalles. Luego licenciarlo todo bajo GPL o alguna licencia similar y dejarlo listo para descargar desde la página de Caleio. Actualmente hay 266 usuarios registrados, de los cuales 239 alguna vez terminaron el proceso de registro, no se cuantos de ellos siguen usando el sistema. Cerraré la inscripción pero dejaré que los que lo usan actualmente puedan seguir y mandaré un correo a todos los usuarios explicando la situación.

En fin, que es hora de pasar la hoja. Para mi es importante terminar esto sabiendo donde cometí mis errores para evitarlos en el futuro. Hay otras ideas y proyectos a los que me quiero dedicar, ya veré si aprendí algo.

 

I need someone to protect me from all the measures they take in order to protect me

Visto en lo de Bansky

 

No creo ser el único que pensó que el inicio de la segunda temporada de Lost fue medio medio.

Sin embargo, acabo de terminar de ver los episodios 15 a 18 y tengo decir que está más interesante que nunca. Especialmente el final del 18 :-P. ¡Eso si que es un giro!

 

Haha, I just wasted 76 bytes of your bandwidth! How does that make you feel?

Visto en la firma de un participante de la lista de desarollo de Roundcube

 

Encontré vía el blog de Martín Varsavsky el buscador de textos cientificos de Google llamado Google Scholar, y buscando mi apellido (Käser) me encontré con dos detalles bastante interesantes.

google-scholar

  1. Google sabe alemán y sabe que la 'ä' a veces se traduce como 'ae' en inglés y por lo tanto busca tanto 'Käser' como 'Kaeser'
  2. Como yo vivo en la residencia de la universidad mi conexión es parte de la universidad que a su vez pertenece a la red academica JANET, algo asi como la REDIRIS española. Haciendo un whois de mi ip externa esta información se puede averiguar fácilmente, y mirando el Reverse DNS sale que soy parte de derby.ac.uk. ¿Y qué tiene esto que ver con Google? Bueno, que los de Google no son tontos y con esta información deducen que soy parte de la universidad e incluyen un enlace debajo de algunos de los resultados con la opción de mirar si dicho artículo esta en los archivos de mi universidad.

Eso es comodidad…

En vez de tener que anotar los resultados en un papel para ver si están en el buscador interno de la universidad puedo consultarlo con un simple click.

¿AJAX, Ruby on Rails, tags, "white space", fuentes grandes, comunidades virtuales? Bah, no hay nada más Web 2.0 que facilitar la experiencia del usuario.

 

Tantos proyectos y tan poco tiempo, entre la universidad y el trabajo me queda muy poco tiempo para trabajar con Caleio. Más si tenemos en cuenta que esta semana pasaba re-escribí mi CMS y rediseñé la página. Y por si esto no fuera poco estoy escribiendo un programa bastante importante en C# (no pregunten porque no voy a responder).

El punto es que quería escribir un artículo sobre Ajax. Ultimamente estuve usandolo mucho en el trabajo y con Caleio y me crucé con un problema interesante. La definición de Ajax en inglés es: Asynchronous JavaScript + XML según quien acuño el termino. Notese el XML del finál. Importante ese XML ya que todo el mundo parece ignorarlo… Investigando un poco más en dicha página aparece esta ‘lista’ de tecnologías que se incluyen en el concepto de Ajax:

  • standards-based presentation using XHTML and CSS;
  • dynamic display and interaction using the Document Object Model;
  • data interchange and manipulation using XML and XSLT;
  • asynchronous data retrieval using XMLHttpRequest;
    and JavaScript binding everything together.

Por alguna extraña razón NADIE que yo haya visto hasta ahora usa XML para pasar la información entre el servidor y el cliente. Es más, este problema surgió porque yo no sabía muy bien como hacerlo y buscaba un framework ya escrito para usarlo en Caleio, pero no encontré ninguno! Absolutamente ninguno, y eso que miré en varios. Esto fue antes de navidades así que capaz que la situación cambió pero en cualquier caso el 90% o más de la gente que usa Ajax no usa XML para pasar la información. El método que usa todo el mundo es el de hacer un REQUEST al servidor incluyendo la información en las variables GET o en el caso de lo más osados en las variables POST, a su vez el servidor responde con cachos de HTML que son mostrados en la página por medio de la propiedad innerHTML.

Esto hace que el código quede muy feo, que sea poco portable y limita el uso de la aplicación. Pero lo más importante es que viola totalmente la regla de separación de contenido y presentación. Tanto XHTML y CSS para después hacer esa guarrería :P

Al final conseguí un ‘framework’ bastante ligerito que recibía XML pero no lo enviaba, así que con un poco de manipulación conseguí lo que necesitaba. Es un script muy básico y en realidad no es un framework, lo único que hace es crear el objecto xmlhttprequest y luego enviar y recibir XML. Lo pueden encontrar en la sección de Code » tw-sack.js.

Así que ahí va un pequeño y corto tutorial de como hacerlo bien usando ese script. El ejemplo que usaré será una página que invierta el texto escrito en un input. El enfásis esta en como funcióna Ajax y no tanto en que se puede hacer en el servidor, es muy fácil modificar este ejemplo para que haga cosas mucho más complejas.

HTML + CSS

En primer lugar creamos una simple página HTML y le añadimos unos estilos con CSS. Para nuestro ejemplo solo necesitamos un input, un boton y un div donde mostrar el texto invertido.

<html>
	<head>
		<title>Ejemplo Ajax</title>
	</head>
	<body>
		<form action="#" method="post" onsubmit="return sendText()">
			<label for="texto">Texto:</label>
			<input type="text" id="texto" name="texto" /><br />

			<label for="submit"> </label>
			<input type="submit" id="submit" name="submit" value="Enviar" />
		</form>
		<p id="areaResultado"> </p>
	</body>
</html>

Falta el CSS y la inclusión de los archivos Javascript, pero se pueden dar una idea, nada complicado. Se podría no usar el form y llamar a la función sendText() desde el onClick() del botón, pero hecho así es más facil hacer la aplicacion compatible con los usuarios que no tengan activado Javascript ya que el formulario se ejecutará y ahí podemos hacer que el servidor se haga cargo como normalmente lo hace.

Javascript de ida

Así que el usuario ha apretado el boton y quiere saber como queda su texto al vesre. Creamos una función que saque el valor del campo, lo meta en el XML y lo mande.

function sendText()
{
	texto = document.getElementById('texto').value;

	xml = xml = '<?xml version="1.0" encoding="UTF-8" ?>'+
"<request>"+
	"<texto>""+texto+"</texto>""+
"</request>";

	ajax.object = document.getElementById('areaResultado');
	ajax.onCompletion = recieveText;
	ajax.runAJAX(xml);
}

Acá es donde hay una parte complicada, en la ante-última linea, donde pone ajax.onCompletion = recieveText. Esta parte es necesaria por la forma en que funcióna xmlhttprequest y Javascript. Cuando el script llega a la parte de enviar el XML no espera el resultado, sino que sigue la ejecución, asi que si fueramos a hacer:

	// crear xml
	ajax.runAjax(xml)
	alert(ajax.reponse);

Esto fallaría, porque el proceso de conseguir el resultado es largo y el Javascript no espera. Así que el truco es decirle al script que función queremos que ejecute después de haber conseguido el resultado, en este caso la función es recieveText(). Lo de ajax.object es para ‘guardar’ el objeto donde queremos luego insertar o modificar algo. Esto sirve más cuando a la función la llamamos con un ‘this‘ y navegamos por los nodos cercanos que posiblemente no se puedan o no querramos agarrar con un getElementById().

Pero primero el PHP

Antes de recibir el resultado hay que leer el texto con PHP y darlo vuelta. Cuando por primera vez llegué a esta parte me quede frito, cómo cuernos leo yo el XML en PHP? Y la solución es mucho más simple de lo que parece, yo ya estaba pensando en que iba a tener usar sockets de alguna manera extraña y seguramente depravada, pero no, resulta que la variable $HTTP_RAW_POST_DATA contiene, como bien indica su nombre, todo el contenido POST de manera ‘cruda’, es decir, sin procesar. Asi que leer el valor de texto es cuestion de parsear la variable como XML así:

<?php
	$xml = $HTTP_RAW_POST_DATA;

	$p = new xmlParser;
	$p->read($xml);
	$texto = $p->getTagValue('texto');

	header('Content-Type: text/xml');

	echo
'<'.'?xml version="1.0" encoding="utf-8" ?'.'>'.
'<response>'.
	'<texto>'.strrev($texto);.'</texto>'.
'</response>';
?>

Las lineas 4,5 y 6 hacen uso de una pequeña clase que escribí para parsear XML, es muy básica y la pueden encontrar acá. En cualquier caso, lo único que tienen que saber es que lee el XML y le saca el texto a la primera etiqueta <texto>. Usa principalmente xml_parse_into_struct que convierte el XML en un array, y de ahí en adelante es tan fácil como hacer un loop para buscar etiquetas, atributos y valores. Luego mandamos el header de text/xml, porque sino después xmlhttprequest no crea reponseXML, con lo cual no obtenemos las ventajas del DOM. Y finalmente escupimos el resultado usando strrev() para invertir la cadena.

Vuelta al Javascript

Antes de enviar el XML con Javascript había especificado que función quería que se ejecutase una vez que hubiese terminado de recibir la respuesta del servidor. Así que llegamos al paso final, leer el XML, sacar el valor de la cadena invertida y meterlo en #areaResultado.

function recieveText()
{
	xml = ajax.responseXML;
	texto = xml.getElementsByTagName('texto')[0].childNodes[0].data;
	
	ajax.object.innerHTML = texto;
}

Otra simple función, si es que esto del Ajax esta tirao. Primero agarramos el XML que nos devolvío el servidor, como ajax esta declarado como global podemos acceder desde cualquier función. Luego navegar por el árbol de XML es igual que hacerlo por el de HTML, solo que hay que añadir algunas cosillas más para llegar a la información, y finalmente asignamos el texto al innerHTML de #areaResultado que se asignó a ajax.object antes de enviar el XML. Era por mostrar esa funciónalidad nada más, tranquilamente podriamos esquivar ese paso y hacer el getElementById() en esta función.

<voz-del-flaco-de-bricolaje>
ya veis chavales, aqui tenemos nuestro propio sistemita Ajax, recordemos los pasos que hemos seguido:
</voz>

  1. Escribimos el HTML y añadimos la acción que llamará al Javascript
  2. Escribimos la primera función Javascript que envía el XML
  3. Escribimos el script PHP que procesa el XML y devuelve más XML
  4. Y finalmente escribimos la segunda función Javascript que nos permite leer el resultado y mostrarlo en el HTML

Es verdaderamente fácil una vez que uno se acostumbrar, pero para ayudar construí una demo con todos los archivos de este ejemplo. Que disfruten, y al próximo que vea que recibe HTML y lo mete asi nomás con innerHTML…

 

Vuelto he de Londres y si tuviese que resumir el viaje en dos palabras estas serían frio y caminar. A quien ose aventurarse a la cápital del ‘Imperio de los Horteras’ en estas fechas le pongo de sobreaviso: llevese abrigo. Mucho abrigo. No porque haga mucho frio, sino que porque al estar caminando y estando afuera mucho tiempo el frio se siente mucho más. Tanto así que no era raro el último día verme viajando en metro el andergraun con gorro, guantes y bufanda.

En Londres me encontré el Viernes a las 2 con mi amigo David y sus dos amigos que también venian, Pablo y Miguel. Muy buena gente, entre discusiones sobre .NET 3.0, el efecto del vagón de metro sobre las corrientes de aire y algorítmos genéticos tuvimos tiempo de ver casi todas las cosas interesantes de Londres en esos 4 días.

Tristemente mi camara murió el segundo día, se me cayó de un segundo piso cuando estaba abierta y correctamente siguiendo las escrituras de un tal Murphy le pego al suelo justo con el lente. Es una camara muy fuerte, si hubiese aterrizado con el costado u otro lado seguro que hubiese sobrevivido con algún golpe minimo, pero no, tenía que caer justo con el lente ¬_¬. Por suerte pude rescatar las fotos de la tarjeta de memoria y los otros chicos también llevaban camaras, así que cuando me manden sus fotos termino de completar los enlaces.

Museos

El segundo día visitamos el Natural History Museum y el Science Museum, el tercer día fuimos a ver el British Musuem y el National Gallery, y el cuarto estuvimos en el Imperial War Museum. A mi me recomendaron también el Victoria and Albert Museum pero ese no tuvimos tiempo de ver. En el Natural History Museum pasamos demasiado tiempo, es un museo de naturaleza normalito, tiene algunos esqueletos de bicharracos bastante interesante, pero nada del otro mundo. ¿Lo más interesante? Los espejos distorsionadores.

El Science Museum es uno de los altamente recomendables, mucho más interesante (al menos para un geek ;-) que el de historia natural. Tiene una zona de aeronautica con modelos (casi?) reales de aviones, un motor Rolls Royce de avión de linea, un Harrier y una ‘tajada’ de un 747. Una zona de la historia de la tecnología que es un pasillo ordenado cronológicamente que incluye cualquier cosa relacionada con la tecnología, aviones, coches, un motor de diferencia, supercomputadores Cray, estructuras de ADN, una computadora para la muerta asistida (eutanasia), modelos de cosas raras y muchísimo más. No es un museo demasiado grande pero es recomendable ir con tiempo :-).

El British Musuem es un clásico, nosotros fuimos porque pensabamos que ahí estaba Tutankhamon (resulta que está en otro museo). Al final nos tuvimos que conformar con la piedra Rosetta. En este pasamos poco tiempo porque teníamos poco tiempo y tampoco nos interesaba tanto. Al contrario que con el museo de historia natural este no estaba lleno de réplicas, los ingleses a falta de historia propia se la robaron al resto del mundo :-D.

El National Gallery al parecer también es un clásico, en frente de Trafalgar Square es uno de los museos de cuadros más famosos. Entramos un rato para pasar el rato pero poco más. Un ‘must see’ para cualquier interesado en el arte ya que tiene bastantes obras importantes de muchos pintores internacionales.

El Imperial War Museum fué el último que visitamos y en mi opinión esta empatado con el Science Museum en cuanto a cálidad. Tristemente como fué el último que visitamos no tuvimos tiempo de verlo todo porque llegamos dos horas antes de que cerrase. Es un museo principalmente dedicado a todas las guerras en las que se ha visto involucrado el ‘British Empire’. En la entrada tiene modelos de verdad de todo tipo de cosas de guerra, cohetes V2, cazas Spitfire, tanques variados, una réplica de la bomba de Hiroshima ‘Little Boy’ y otros objetos miscelaneos. Ahí solo nos tiramos una hora y es una salita chiquita comparada al resto del museo. También tuvimos tiempo de ver mitad del sotano, la sección de la Segunda Guerra Mundial y otros conflictos desde WWII (el de las Malvinas, Vietnam, Suez, etc). Lo increible de este museo es que no hay casi réplicas, tiene cachos del muro de Berlin originales, el aguila que estaba encima del Reichstag durante WWII y casi todos los vehículos y armas son de verdad, muchos de ellos con marcas de bala o projectiles de tanque. En resumén, otro museo obligatorio.

Edificios/lugares emblemáticos

Visitamos el Big Ben, Picadilly Circus, Covent Garden, Buckingham Palace, London Eye, la torre de homenaje al incendio de 1666, Soho, Tower Bridge, Trafalgar Square, Tower of London, Westminster Abbey, catedral de San Pablo, Chelsea y Notting Hill. Nada destacable de lo habitual, lindos lugares que hay que ver al visitar Londres. Mejor ver las fotos cuando estén.

En fin, que lo de caminar fue mortal, a pesar del uso intensivo del underground nos pegamos una paliza de campeonato. El último día la idea de sentarnos en la linea circular y dar vueltas hasta que fuese hora de irnos era muy tentadora. El ‘Avalon Hotel‘ donde nos quedamos no estaba mal, desayuno incluido, duchas unisex, el cuarto estaba un poco frio pero al alquilar un cuarto para cuatro nos salió relativamente barato.

Sobre el dinero: LONDRES ES CARO. Eso tiene que quedar claro, damos gracias que todos los museos eran gratis, que sino nos ibamos a tener que vendernos a la noche para pagar el viaje. Ahí van algunos precios:

1 Libra = 1.45 Euros = 1.74 Dolares

  • El underground cuesta 4,90 un pasaje para todo el día aunque si se compra muy temprano puede salir 6.
  • En un bar me cobraron 3,5 una botella de 33cl de cerveza marca pistola.
  • En otros bares nos quisieron cobrar 8 libras la entrada.
  • Un menu normal en un fastfood sale más o menos 4 libras.
  • Una noche en el hotel con un cuarto de cuatro sale 65 libras (16/persona).
  • El London Dungeon costaba 15 libras (JA! los va a pagar su madre, encima había una cola larguísima para entrar)

El viaje me salió más o menos 120 libras – (50 del hospedaje + 20 del underground (4.90*4)) = 50 libras de gasto para comida y bebida porque como soy un tacaño miserable regalos no compré, 12.5 por día es bastante barato. Eso si, nosotros fuimos en modo ahorro máximo, comprando pan, queso y jamón en los supermercados para hacernos sandwiches en la calle. Con lo cual aunque Londres sea caro se puede ir y hacer mucho por un precio relativamente bajo.

Buen viaje, habrá que repetir y tendré que volver a Londres para terminar de ver el Imperial War Museum.

 
Set your Twitter account name in your settings to use the TwitterBar Section.