jueves, enero 29, 2009

El misterioso señor Brown

El misterioso señor Brown (The Secret Adversary) es la primera novela de Agatha Christie en la que aparecen los dos jovenes aventureros Tommy y Tuppence.

La novela se desarrolla en 1918, acabada la Primera Guerra Mundial, cuando la joven pareja en paro deciden montar una agencia de aventureros. Nada más tomar esa decisión se encuentran involucrados en su primera aventura: una joven norteamericana, Jane Finn, debe ser encontrada. Se supone que ella posee unos importantes documentos que se habían dado por desaparecidos con el naufragio del Lusitania y que desestabilizarían al gobierno y sembrarían la anarquía.
Estos documentos, además de por el gobierno que es quien ha encargado la misión a los jovenes aventureros, también son buscados por una sociedad criminal secreta internacional dirigida por el Sr. Brown al cual nadie conoce. Un primo multimillonario de la desaparecida y un importante abogado inglés (futurible a primer mininstro) son otros dos importantes personajes en la obra.

Esta es la primera novela que leo de la autora que tiene como protagonistas a Tommy y Tuppence y he de reconocer que es muy diferente al resto. Este libro tiene mucha más acción y aventuras que los típicos libros protagonizados por Hercules Poirot donde éste no pone su vida en peligro sino que se limita a investigar y descubrir al culpable. Aquí, además del misterio, los aventureros se verán envueltos en situaciones en las que estarán a punto de perder la vida.

Un buen y entretenido libro que os recomiendo.

miércoles, enero 28, 2009

Euri tanta bakoitzean

Hoy venía al trabajo escuchando música en el iPhone con el modo aleatorio. De pronto a empezado a sonar Euri tanta bakoitzean de los Betagarri y no he podido evitar escribiros este comentario y poneros el video de la canción.



Hace ya muchos años que descubrí a este grupo. Fue en unos Pilares en los que montaron una carpa junto a La Chimenea. Recuerdo que actuaban cuatro grupos: unos teloneros, los M.C.D., Betagarri y Banda Bassotti. Y allí fuimos cuatro amiguetes con muchas ganas de ver a M.C.D. y a la Banda Bassotti.
El concierto lo abrieron los teloneros y eran malos, muy malos, de los peores que he visto así que no quedó más remedio que pedir unos litros y sentarnos en el suelo a esperar. Después ya empezó un grupo que en conciertos anteriores nos había gustado mucho: M.C.D. pero no se si por lo mal que lo habían hecho los teloneros o por el tamaño del escenario (ellos mismos reconocieron que era más grande de lo que les gustaba) pero no consiguieron animar la cosa. Fue raro, el grupo que dos años antes nos había hecho saltar y gozarla no estaba respondiendo a las espectativas así que sólo hubo una solución: conseguir hueco en la barra y seguir bebiendo.
El segundo grupo terminó de tocar y una marabunta de gente con camisa negra y gafas de sol subieron al escenario. No se si fue producto del alcohol que nos habíamos metido o de los instrumentos de viento-metal que sonaban pero los pies se movían solos. Nunca había escuchado a Betagarri, no entendía lo que estaban cantando pero me gustaba.
Aquello fue un grato descubrimiento.
Después ya subieron al escenario los italianos pero tenían todo hecho, el público estaba entregado y con muy poco ya ibamos a pasárnoslo bien. Aun así tambiés se salieron... quizá también por el alcohol :)

Por si no entendeis la canción, aquí os dejo la traducción (me ha salido un pareado):

"Amo las primeras flores que salen en primavera,
cuando los cielos se vuelven azules
Acostarse las noches de verano
cuando se apagan las estrellas,
cuando se empieza a sentir la luz, a lo lejos
Mirar como caen las hojas,
los domingos lluviosos de otoño,
Asomados a la ventana dentro del cuarto
Me gustan las nieves en invierno,
la tranquilidad que traen con ellas,
como si se hubiera parado el tiempo.

Y tu, siempre pienso en ti,
al caer las hojas, en las flores, en todo...
cuando se apagan las estrellas,
en cada gota de agua, en todo...

Pasar las horas mirando hacia arriba
intentando entender las formas de las nubes
Todas tienen un sentido
si se les busca
con los ojos cerrados tumbados en cualquier lado
pasaria los dias asi
hasta que cante el viento

Y tu, siempre pienso en ti,
al caer las hojas, en las flores, en todo...
cuando se apagan las estrellas,
en cada gota de agua, en todo...de verdad...

En cada copo de nieve,
en la nube mas dificil,en las flores, en todo...
en la caida de las hojas,
en cada gota de lluvia, en todo..."

domingo, enero 25, 2009

La mejor cita de Donnie Darko


"- ¿Por qué llevas ese estúpido disfraz de conejo?
- ¿Por qué llevas ese estúpido disfraz de humano?"

sábado, enero 24, 2009

Distancia Léxica

Hace no mucho un compañero y yo tuvimos que enfrentarnos a una ardua tarea. Teniamos un fichero de texto (.properties) y una tabla en la base de datos que debíamos "enlazar", es decir, buscar en la base de datos las cadenas de texto del fichero y ver cuales casaban. Las que tenían una correspondencia exacta era muy sencillo pero en caso contrario... pufff, la cosa parecia imposible (hablamos de más de 2000 lineas en el fichero y de 10.000 filas en la tabla). Tuvimos que implementar un programa que nos hiciera la tarea más asequible: "el programa Pepe". Una de las heurísticas que implementamos fue la distancia léxica, más concretamente la Distancia de Levenshtein. Esta distancia es el número de carácteres a sustituir para que las dos cadenas a comparar sean iguales. Usándolo de forma proporcional a la longitud media de las cadenas a comparar pudimos descartar las ocasiones en las que, por ejemplo, superaban el 30%. Esto no fué suficiente ya que el orden de las palabras influye muy negativamente en esta heurística, por ejemplo: "Coche rojo" y "rojo coche" tiene una distancia muy grande y sin embargo son la misma frase (semánticamente hablando). Para esto implementamos otra heurística, "made in nosotros", que comparaba, también de forma proporcional, el número de palabras que coincidían, es decir, las palabras que estaba en una y otra frase sin importar la posición. Mezclando estas heurísticas y afinando los porcentajes conseguimos una alta coincidencia que nos ahorró muchas horas de trabajo. A continuación os pongo la implementación para java de la Distancia de Levenshtein:


public class LevenshteinDistance {
private static int minimum(int a, int b, int c) {
if(a<=b && a<=c)
return a;
if(b<=a && b<=c)
return b;
return c;
}

public static int computeLevenshteinDistance(String str1, String str2) {
return computeLevenshteinDistance(str1.toCharArray(), str2.toCharArray());
}

private static int computeLevenshteinDistance(char [] str1, char [] str2) {
int [][]distance = new int[str1.length+1][str2.length+1];

for(int i=0;i<=str1.length;i++)
distance[i][0]=i;

for(int j=0;j<=str2.length;j++)
distance[0][j]=j;

for(int i=1;i<=str1.length;i++)
for(int j=1;j<=str2.length;j++)
distance[i][j]= minimum(distance[i-1][j]+1, distance[i][j-1]+1, distance[i-1][j-1]+((str1[i-1]==str2[j-1])?0:1));

return distance[str1.length][str2.length];
}
}

jueves, enero 22, 2009

Labordeta - Somos

Acabo de probar a subir una canción al Goear y no podía elegir otra mejor...

miércoles, enero 21, 2009

El Palo y la Zanahoria

Descubrí esta expresión jugando al juego de rol "Paranoia" hace ya muchos años y pronto me llamo la atención. El origen está claro, puedes premiar a un asno con una zanahoria cuando hace bien su trabajo y/o puedes golpearle cuando no lo hace.
Pero la expresión en sí no se usa para los burros, sino para los seres humanos y viene a significar: premiar por hacer las cosas bien y/o castigar por hacerlas mal.
Hoy en día, con la crisis que estamos viviendo, los empresarios se olvidan de las zanahorias y sólo hacen uso de los palos: o trabajas a destajo o declaro un ERE y todos a la calle. Hay empresas que no sólo es en estos días cuando siguen esa política sino que es su norma de facto.
Otras sin embargo prefieren las zanahorias: si haces tu trabajo en menos tiempo del asignado te daremos una bonificación económica a final de año.
En mi opinión no caben más posibilidades que estas dos, por ejemplo, si mañana tu jefe te pide que hagas un "sobreesfuerzo" tu puedes hacerlo porque esperas una zanahoria o porque tienes miedo a los palos. La zanahoria puede ser un ascenso, un regalo, etc... y los palos no tienen porqué ser un despido, puede ser simplemente evitar el que dirán tus compañeros si los dejas enmarronados y tu te marchas a casa. Es decir, si no esperas una zanahoria es porque temes a los palos, quizá subconscientemente pero es así.
Es curioso porque España es más un país de palos que de zanahorias... y así nos va. Y esto es así porque a los palos te acostumbras y acaban por no tener efecto. Es como el cuento del pastor y el lobo: las primeras veces actuas pero al final ya no haces caso al aviso del peligro.
Lo que también esta claro es que en España si no hay ni palos ni zanahorias la gente hace lo mínimo... sólo hay que ver a los funcionarios (ni los pueden despedir, ni les suben el sueldo); supongo que esto va con el carácter, con la gente que trabaja para vivir y los que viven para trabajar.
En conclusión, para que una empresa funcione se necesitan zanahorias y la empresa que no las aplique tiene los días contados.

martes, enero 20, 2009

Mot

Hace unos días os preguntaba por un comic que leía cuando era pequeño en El Pequeño País, un suplemento que acompañaba al periódico El Pais (en aquel entonces no llevaba tilde) y que estaba enfocado a los pequeños de la casa. Pues hoy he conseguido descubrir como se llamaba aquel comic: MOT y estaba dibujado por Alfonso Azpiri.

Otra forma de clonar objetos en Java

Como todos los programadores sabreis las variables en Java, a excepción de los tipos básicos, son referencias a objetos. Por ellos cuando asignamos una variable a otra no estamos duplicando el objeto sino que tendremos dos referencias al mismo objeto. En ocasiones podemos necesitar duplicar un objeto y para esto la API nos provee de la interfaz Cloneable. Cada objeto implicado en la clonación deberá implementar Cloneable e implementar el método clone(). Si es un objeto simple compuesto de tipos básicos esto es fácil pero imaginemos que después de seis meses de desarrollo necesitamos clonar un objetos que referencia de forma directa o indirecta a otros treinta objetos. Es una paliza ponerte a implementar Cloneable y además avisar al resto del proyecto que si crean un nuevo DTO que va a ser referenciado por uno de esos treinta objetos pues que el nuevo DTO también debe implementar Cloneable. Una solución rápida, sencilla y nada intrusiva es la que os propongo:


public Object deepCopy(){
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
// serialize and pass the object
oos.writeObject(this);
oos.flush();
ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bin);
// return the new object
return ois.readObject();
} catch (Exception ex) {
throw new RuntimeException("Error while making a deep copy of object: {0}", ex);
}
}

Desconozco cual puede ser el rendimiento de esta función en comparación al estándar. Por supuesto es necesario que las clases implicadas implementen Serializable y los atributos anotados como Transient no serán copiados.
¿Que opinión os merece? ¿le veis alguna pega más?

Actualizado (24/02/2009)
He hecho algunas pruebas de rendimiento, las podeis ver aquí.

domingo, enero 18, 2009

Una canción navideña

Vale, reconozco que voy con un retraso de casi un mes pero estoy seguro de que alguno no conoce esta canción y eso es imperdonable:

sábado, enero 17, 2009

Vacas, cerdos, guerras y brujas

Vacas, cerdos, guerras y brujas (Cows, Pigs, Wars, and Witches) es un libro de antropología escrito por el americano Marvin Harris. No debe engañarnos, es muy fácil de leer, muy entretenido y didactico y no está escrito en lenguaje cientifico, el autor los escribió "para todos los públicos". El título ya nos introduce a cuatro de los temas que se van a tratar en el libro: porqué los hindúes consideran a sus vacas sagradas, el curioso comportamiento de algunas sociedades respecto al cerdo (ya sea aborreciendolo o "adorándolo"), el porqué del comportamiento humano en algunas guerras y la explicación de la caza de brujas. También se tratan otros temas como el de Jesucristo por ejemplo.
Todos estos extraños comportamientos humanos que en ocasiones algunas personas explican como creencias religiosas y/o espirituales son explicadas mediantes un materialismo puro por el autor. Por ejemplo explica porque en la India con millones de personas muriendose de hambre no se comen las vacas. A esto mucha gente responde diciendo que es por religión, pues bien, el autor explica claramente como los hindúes dependen de las vacas, por ejemplo hacen sus casa y/o utilizan de combustible los excrementos de estas. Matar las vacas sería pan para hoy y hambre para mañana. Algo similar ocurre con los cerdos en el Islam, una religión proveniente del desierto donde el alimento es escaso y, no debemos olvidar que los cerdos son omnivoros, donde la competición por el alimento enfrenta a cerdos y humanos. El hecho de prohibir el comer cerdo evita el crecimiento de la especie y la competición con los humanos por el alimento.
Leyendo el libro nos daremos cuenta que la mayoría de las normas de las religiones tienen o tenían mucho sentido común y que en su día se utilizó la religión con buenos propositos, para conseguir el correcto funcionamiento de la sociedad.
Un libro muy recomendable, corto, entretenido y que cambiará tu forma de ver esos comportamientos que te parecen ilógicos. Cuidado si eres un católico radical, quizá no te guste lo que pone sobre Cristo.

jueves, enero 15, 2009

Obtener el multiidioma desde la base de datos con Apache Struts

Lo habitual a la hora de trabajar con Struts es tener uno o más ficheros .properties donde almacenamos las parejas "key" y "texto" en cada idioma que queremos que la aplicación soporte. Estos ficheros se definen en el fichero struts-config.xml de una forma parecida a esta:


<message-resources parameter="com.abel.presentation.resources.ApplicationResources" null="false"/>

En el package com/abel/presentation/resources pondremos un fichero para cada idioma como por ejemplo: ApplicationResources_en_EN.properties, ApplicationResources_fr_FR.properties o ApplicationResources.properties (este último será el por defecto). Pero en algunas ocasiones podemos tener estos textos a mostrar en la aplicación almacenados en tablas de la base de datos.
Para casos como este, en lo que nos salimos de lo "por defecto", Struts también nos facilita las cosas pudiendo cambiar la fuente de datos.
Nos definiremos una nueva clase Factoría que extenderá de MessageResourcesFactory:


package com.abel.strutsextensions;

public class FoxResourcesFactory extends MessageResourcesFactory {

public MessageResources createResources(String config) {
return new FoxMessageResources(this, config, this.returnNull);
}

}

Modificaremos el struts-config.xml para informar a Struts de la nueva fuente de los mensajes:


<message-resources parameter="database.ApplicationResources" factory="com.abel.strutsextensions.FoxResourcesFactory" null="false"/>

Y para terminar, la miga del asunto, la clase que devolverá la información. Voy a omitir el explicar como el DAO devuelve el Map donde se almacenan la información; este Map se guardará en una caché, que podremos configurar si nos interesa que se refresque o dejarla sin caducidad. El código tiene comentarios por lo que es autoexplicativo:


public final class FoxMessageResources extends MessageResources {

public static final String FOX_DEFAULT_LOCALE = "en_EN";
private static Map<String,String> _applicationLocales;

protected FoxMessageResources(MessageResourcesFactory factory, String config, boolean returnNull) {
super(factory, config, returnNull);
if (_applicationLocales == null) {
// consigo las diferentes locales con las que vamos a trabajar
_applicationLocales = PropertyGeneratorDAO.getApplicationLocales();
}
}

private String getLocaleString(Locale locale) {
String localeString;
if (locale == null) {
// si no nos pasan una locale usamos la por defecto
localeString = FOX_DEFAULT_LOCALE;
} else {
localeString = locale.toString();
if (_applicationLocales.get(localeString) == null) {
// si la locale que nos llega no está entre las válidas usamos la por defecto
localeString = FOX_DEFAULT_LOCALE;
}
}
return localeString;
}

private Map<String,String> getLocaleMessages(String localeString) {
// cargamos desde la caché
Map<String,String> messages = (Map<String,String>) FoxCacheManager.getInstance().getFromCache(localeString);
if (messages == null) {
// si la caché no contiene los datos se cargan desde la base de datos
messages = PropertyGeneratorDAO.loadPropertyFile(localeString);
FoxCacheManager.getInstance().addToCache(localeString, messages);
}
return messages;
}

@Override
public String getMessage(final Locale locale, final String key) {
String localeString = getLocaleString(locale);
Map<String,String> messagesForALocale = getLocaleMessages(localeString);
String txt = (messagesForALocale != null) ? messagesForALocale.get(key) : null;
if (txt == null) {
// ¡Esta linea es muy importante, Struts usa de forma interna llamadas a este método y si no existe la key se debe retornar con este formato!
return ("???" + key + "???");
} else {
return txt;
}
}

}

Ahora ya podemos usar igual que siempre la tag-lib de Struts <bean:message> y tendremos la aplicación traducida desde la base de datos

Un poco de humor gráfico

miércoles, enero 14, 2009

Ricos y pobres todos acabamos igual

Ya lo comenté hace unos meses, Steve Jobs tenía muy mal aspecto.
Hace apenas media hora todos los medios informativos en internet se hacían eco de la noticia: Steve Jobs delega hasta junio sus funciones como CEO de Apple en Tim Cooks.

Vía engadget.com podemos leer el email que ha enviado a los trabajadores:

Team,

I am sure all of you saw my letter last week sharing something very personal with the Apple community. Unfortunately, the curiosity over my personal health continues to be a distraction not only for me and my family, but everyone else at Apple as well. In addition, during the past week I have learned that my health-related issues are more complex than I originally thought.

In order to take myself out of the limelight and focus on my health, and to allow everyone at Apple to focus on delivering extraordinary products, I have decided to take a medical leave of absence until the end of June.

I have asked Tim Cook to be responsible for Apple's day to day operations, and I know he and the rest of the executive management team will do a great job. As CEO, I plan to remain involved in major strategic decisions while I am out. Our board of directors fully supports this plan.

I look forward to seeing all of you this summer.

Steve


WallStreet por su parte suspende la cotización de Apple hasta nuevo aviso por la influencía que esta noticia pueda tener en los valores. Y no es de extrañar ya que este hombre ha revolucionado muchas veces el mundo de la electrónica de consumo. Primero fue el ordenador personal, después el iPod y hace no mucho tiempo el iPhone. Pero no sólo eso, también supo apostar por la animación digital frente a la clásica fundando Pixar y un largo etcétera de razones por las que se demuestra que Jobs sabe ver el futuro mucho mejor que muchos videntes de las lineas 906.

Pero retomando el tema que iniciaba este comentario, Jobs tenía muy mal aspecto debido a un cáncer de pancreas y hoy en día hablar de ese tipo de enfermedad ya es saber donde se acaba. Da igual el dinero que tengas, quien hayas sido o lo proyectos que tengas por hacer, al final todos acabamos igual. No hace mucho fue Rocio Jurado la que lo padeció y ni los innumerables viajes a Houston lograron salvarla. Han sido mucho famosos más los que lo padecieron pero me parece macabro hacer una lista.

Creo que Apple tendrá que ir acostumbrandose a no depender de Jobs para innovar y elegir el camino correcto... y mucho tienen por aprender vista la última keynote.

Otras fuentes:

domingo, enero 11, 2009

Por qué no me gusta la extención Adblock Plus

Hace tiempo leí en Abadía DIGITAL un artículo sobre si era ético usar Adblock. Ayer hablando con un amiguete por el Messenger me acordé de él (sí, tanto del artículo como de mi amiguete). Lo que ocurrió fue que le pasé un link a un post en este blog que le podía interesar y hablando de todo un poco también le mencione una cosa curiosa sobre la publicidad a lo que él me respondió: ¿dónde está la publicidad?. Después de mucho insistirle en que estaba en la parte de arriba y el seguir diciendo que no la veía le pregunté: "¿no estarás usando Firefox con Adblock?" y me contestó que sí.
En mi opinión éste es un addon que nadie debería usar. Lo primero porque es injusto para el webmaster, que aunque no sea mucho lo que pueda ganar por publicidad es un dinero que se merece. Y lo segundo por el tipo de publicidad en sí mismo. La publicidad de Adsense no tiene nada que ver con la publicidad en la televisión. Es un publicidad que está mucho más enfocada a lo que te puede interesar, por lo que puede resultarte hasta útil, es una publicidad que no te evita hacer lo que estabas haciendo (en la tele se corta la pelicula y no te queda más remedio que ver los anuncios, aquí la publicidad sale al lado de lo que estes leyendo, sí no quieres, no la mires).
Otra cosa es la publicidad que abre un pop-up que te impide ver la web pero eso no se evita con Adblock. Esa publicidad sí que es molesta pero no estamos hablando hoy de ella.
En resumen, hacer lo que querais, pero hoy en día internet sobrevive por la publicidad o ¿acaso sois de los que habeis donado dinero a Wikipedia? pues no le quiteis a los webmaster/bloggers la alegría de llevarse unos eurillos a final de año.

sábado, enero 10, 2009

Nexus ha abierto sus puertas

Aviso, este comentario es completamente subjetivo y publicitario:

Hoy quiero hacerles un favor a unos amiguetes y hacerles un poco de propaganda. Y es que Nexus (www.nexuscomite.com) vuestra tienda de videojuegos, merchandising, etc... en el barrio de las Delicias (Zaragoza) abrío sus puertas con el nuevo año. Ya podeis pasaros todos por la C/ Unceta 70. Además nos esperan grandes sorpresas: sólo os digo que tienen una pantalla de 140".

A continuación unas fotos del lugar:


viernes, enero 09, 2009

Turnedo

Una gran canción (como casi todas las de Ferreiro), un video muy malo (como casi todos los de Ferreiro).

miércoles, enero 07, 2009

Resultados de la encuesta

El pasado día 31 a la vez que acababa el año acabó el tiempo para votar en la encuesta que había propuesto. Sólo diez personas votaron y los resultados han sido los siguientes:
  • De lo que me pasa en el día a día: 5 (50%)
  • De mi opinión sobre la actualidad: 6 (60%)
  • Temás infórmaticos, gadgets, etc...: 3 (30%)
  • Sobre programación: 4 (40%)
  • Economía, bolsa, etc...: 5 (50%)
  • Sobre deportes: 2 (20%)
Está claro que hay dos temas que la gente no quiere que trate: el deporte y el hardware/gadgets; así que desde ahora me comprometo a sólo hablar de deportes cuando la noticia sea realmente importante, y sólo hablaré sobre hardware/gadgets cuando haya adquirido algún producto y os lo cuente a la vez que doy mi opinión sobre él (ya os adelanto que pronto habrá un post sobre un regalo que me ha caido por ser bueno el año pasado).
Otra cosa que me ha sorprendido es que la mayoría de la gente (6/10) quieren que comente mi opinión sobre la actualidad, algo que no hago desde hace mucho en este blog. Bueno, como me debo a mi audiencia trataré de opinar más; la verdad que llevo tiempo tratando de escribir sobre el conflicto de Israel con Palestina pero siempre lo borro en el último momento por si vienen los del Mossad a por mí.
Veo que hay gente que quiere que hable de economía y de bolsa. La verdad que no está el horno para bollos ahora mismo, y como ya dije el mejor sitio ahora mismo para tener los ahorros es en los depósitos bienvenida que dan muchos bancos. Estos depósitos suelen ser a 1 año y como yo no quiero tener todo mi dinero atado por tanto tiempo tengo una de esas libretas de ahorros que casi todos los bancos/cajas tienen y que os recomiendo. Ahora mismo en Caixa Penedès hay una "libreta jubilación" (que no os engañe el nombre) que da, si mal no recuerdo, un 4% anual, con los intereses mensuales (o sea, interés compuesto) y con completa disponibilidad para realizar disposiciones o reintegros. Esto es más de lo que da ING. Seguiré escribiendo sobre economía no os preocupeis.
Sobre programación: de esto se que hay gente que no quiere que escriba, como mi novia que dice que le aburren esos post, pero es que realmente es de lo único que puedo hablar con cierto conocimiento ¡como no voy a hablar entonces de esto!. Nada, no os librareis, seguireis viendo trozos de código por el blog.
Y para terminar, de lo que me pasa en el día a día, pues esto es un blog personal y como tal voy contando también mis cosas, aventuras, movidas, etc así que sobre esto seguirá habiendo posts en 2009 seguro.

martes, enero 06, 2009

Testigo de cargo

Testigo de cargo (The Witness for the prosecution) es un libro escrito por Agatha Christie y compuesto por varios relatos cortos. En la contraportada del libro podemos leer: "Pequeña, pero magistral colección de nueve relatos que abarcan desde lo cotidiano a lo sobrenatural. Destaca Testigo de cargo, que da título al libro y que Agatha Christie conviertió en un obra de teatro que, más tarde, pasaría al celuloide, con Billy Wilder como director y Marlene Dietrich, Tyrone Power y Charles Laughton como geniales intérpretes. Cabe señalar también El segundo gong, en el que el peculiar y sagaz Poirot resuelve una intrincada trama con su provervial astucia. Completan el libro una serie de narraciones, cuyo leitmotiv es el amor y la muerte."
A decir verdad este libro, todas sus historias, se ven empequeñecidas por la fama que consiguió la película del mismo título. Ciertamente la contraportada del libro no nos engaña pues los dos relatos mencionados son los dos mejores. Al igual que Tres ratones ciegos, este libro es muy fácil de leer. Cada relato no consta de más de 20 páginas por lo que lo lees en una sentada y te pica a leer el siguiente relato de forma que te acabas leyendo el libro en un santiamén.
También decir que excepto el último relato (el que tiene a Poirot entre los personajes) los demás tienen un estilo diferente a lo típico en Agatha Christie, no son el típico asesinato nada más comenzar y tratar de adivinar quién lo hizo...
Un libro recomendable si te gustan los libros de misterio y/o policiacos y si has leído ya los clásicos: Diez negritos, Asesinato en el Orient Express... si no, comienza por estos antes de ponerte con Testigo de Cargo.

domingo, enero 04, 2009

Reflexión sobre las factorías de software

Vía Javahispano he visto una cita que he querido poner aquí:

"Mucho del software hoy en día se parece a una pirámide egipcia: con millones de ladrillos apilados uno encima del otro, sin integridad estructural y hecho por pura fuerza bruta y miles de esclavos."

Alan Kay


En los comentarios se puede encontrar otra cita muy interesante y que hace reflexionar:

"Los clientes no están dispuestos a pagar por lo que valen las cosas bien hechas. Y las empresas no las harían bien ni aunque les pagaran para ello."

sábado, enero 03, 2009

Lo que quiero leer

Hace poco descubrí en LinkedIn un "extra" de Amazon para hacer una Reading List, más o menos una lista de lectura. Allí puedes apuntar los libros que has leido, los que estás leyendo y los que pretendes leer. Me entretuve un rato metiendo unos cuantos libros y ahora se me ha ocurrido compartir con vosotros los libros que estoy leyendo y que pretendo leer en este año:
  • Un mundo sin fin: Novela de ficción histórica que estoy leyendo y espero tener terminada en enero. Es la segunda parte de Los pilares de la Tierra.
  • Spring in Action (2nd edition): Lo tengo desde hace algún tiempo y me lo voy leyendo en los ratos libres, para el primer semestre del 2009 tiene que estar leído.
  • Testigo de cargo: Compuesto por varias historias policiacas; en un par de días lo tendré leído.
  • The Pragmatic Programmer: A raiz de verlo recomendado en debugmodeon me he propuesto leerlo, ya lo tengo en mis manos. En un par de semanas os diré que tal está.
  • Head First Servlets and JSP (2nd edition): Este año me quiero sacar otra certificación y posiblemente sea esta. Tendré que imprimirme el .pdf (aunque no se que tal se verá porque no encontré ninguna versión buena, buena del eMule)... si la empresa me pagase la certificación igual me compraba yo el libro en Amazon... o si alguien me lo dejara... :)
  • Freakonomics: Un libro sobre economía que me quiero leer (la versión en castellano).
  • 1 Ladies' Detective Agency: Libro en inglés que tengo que leerme y hacer un resumen para la Escuela de idiomas. Ya lo tengo comprado.
  • La catedral del mar: Lo tengo pendiente desde hace tiempo; un best-seller español. Lo tiene mi novia.
  • El fuego: Otra segunda parte de un best-seller, en este caso la continuación de El ocho.
  • Cinco cerditos y/o Muerte en el Nilo: Más libros de Agatha Christie que cogeré en la biblioteca. Novelas de misterio que siempre me han gustado.
  • El inversor inteligente: Como ya comenté, es la biblia de la inversión en valor. Me está resultando denso y me cuesta leerlo.
De estos libros todavía me falta por conseguir la edición en castellano de Freakonomics (mi cumpleaños es el 6 de febrero, por si alguien quiere ser generoso) y El fuego.

Otro libro que tengo ya en .pdf y tengo que echarle un ojo es al Wicket in Action.

Estoy seguro de que tengo más libros pendientes pero ahora mismo no me acuerdo; iré actualizando el post si me acuerdo de más.

viernes, enero 02, 2009

Tres ratones ciegos

Tres ratones ciegos (Three blind mice o The Mousetrap) es una novela policiaca o de misterio escrita por Agatha Christie en 1950.
Según dice el resumen en la contraportada del libro: "en una casa de huéspedes de estilo victoriano aislada por la nieve, se desarrolla una inquietante trama claustrofóbica que desemboca en un inesperado final. Otros pequeños relatos completan la obra y, en ellos, compiten los dos famosos detectives creados por la autora: Hercule Poirot con La tarta de moras, El apartamento del tercer piso y La aventura de Johnnie Waverly, y Miss Jane Marple con Una broma extraña, El caso de la doncella perfecta y El caso de la guardesa."

En mi opinión se trata de un libro fácil de leer, entretenido pero que dista mucho de otras obras como Diez Negritos o El Asesinato de Rogelio Ackroyd. Creo que esto es debido a mi forma de leer este tipo de libros, me gusta que haya muchos personajes y que la historia vaya dando giros de forma que cuando crees que sabes quien es el asesino algo hace que tus teorias fallen, dándote cuenta de que en todo momento la autora es quien te ha hecho sospechar de ese personaje. En este libro al ser historias más cortas y con menos personajes (5 o 6) a la vez que se hace más fácil de leer también te da menos sorpresas.
En resumen, un libro muy recomendable si os gusta el género y que leereis en una tarde de esas luviosas que últimamente tenemos y que quitan las ganas de salir a la calle.

jueves, enero 01, 2009

Alertas Javascript

Cuando desarrollamos una aplicación web siempre necesitamos mostrar determinados mensajes al usuario, ya sea un pop-up con un mensaje de aviso o con uno pidiéndole confirmación para realizar una determinada acción. Todos los navegadores, que soportan javascript, implementan unas funciones básicas para hacer esto (alert, confirm...) pero tienen un problema: nunca tienen el estilo de nuestra aplicación; es decir, quedan feos. Si queremos que los pop-ups tengan el mismo estilo que la aplicación tendremos que usar otra solución. Internet Explorer tiene una función showModalDialog que muestra un .html como un pop-up modal, pero como he dicho sólo iExplorer lo soporta (no es un estándar). Para solucionar esto no nos quedaba más remedio que buscarnos la vida con Javascript y el DOM pero gracias a las nuevas librerías Javascript que tenemos hoy en día (Dojo, jQuery...) este trabajo nos lo dan ya hecho, o casi.
Hoy os presento un posible solución: jQuery Alert Dialogs.
Este plug-in de jQuery nos provee un reemplazo para tres funciones (Alert, Confirm y Prompt) con la ventanja de que podremos editar sus estilos (que es lo que estamos buscando).
Unos ejemplos de uso serían:

// alert
jAlert('This is a custom alert box', 'Alert Dialog');

// confirm
jConfirm('Can you confirm this?', 'Confirmation Dialog', function(r) {
jAlert('Confirmed: ' + r, 'Confirmation Results');
});

//Promt
jPrompt('Type something:', 'Prefilled value', 'Prompt Dialog', function(r) {
if( r ) alert('You entered ' + r);
});
En $.alerts.dialogClass se puede cambiar la class aplicada a la ventana emergente.

Además Andrés Nieto nos propone un forma de trabajar con estas funciones (o con otras similares):

//alert()
var oAlert = alert;
function alert(txt, title) {
try {
jAlert(txt, title);
} catch (e) {
oAlert(txt);
}
}
alert("Hola", "Prueba");

//confirm()
var oConfirm = confirm;
function confirm(txt, title, func) {
try {
jConfirm(txt, title, func);
} catch (e) {
if (oConfirm (txt, title)) func();
}
}
confirm("Hola", "Prueba", function(){
alert("Prueba", "Superada");
});

//prompt()
var oPrompt = prompt;
function prompt(txt, input, title, func){
try {
jPrompt(txt, input, title, func);
} catch(e) {
func(prompt(txt, input, title));
}
}
prompt("Hola", "Valor", "Prueba", function(r) {
if (r) alert(r);
});
Con esta forma de trabajar nos garantizamos que el pop-up va a funcionar y además como sobreescribimos las funciones por defecto es mucho más cómodo de trabajar.

Feliz Año Nuevo!

Desde aquí quiero desearos a todos mis pocos pero buenos y fieles lectores un Feliz Año 2009.