viernes 12 de marzo de 2010

Nuevo diseño para el blog

Ahora que Google mejoró notoriamente los temas disponibles para blogger, decidí aplicar un estilo "oficial".

Creo que quedó bastante bien y casi con cero esfuerzo... se aceptan comentarios y sugerencias.

El último cambio de diseño había sido en enero de 2009...

Actualización, 13/3/2010 14:52
Enrique comenta que los links visitados no se ven bien por el esquema de colores, lo cual pude comprobar... Como lo importante es que se pueda leer más que el diseño en sí, volví a cambiar a un diseño mas "tradicional".

Este era el nuevo diseño originalmente:

Parece que tampoco gustó el fondo oscuro, así que este es el nuevo, nuevo diseño... más parecido al original.

jueves 11 de marzo de 2010

Seguimiento de mails en GMail

GMail, como cliente de correo, es muy bueno. Es el que uso tanto para el correo personal como para el del trabajo.

Pero tiene (al menos) un problema... Cuando envío un mail, a veces ese mail es para que alguien más haga algo; y en general quiero asegurarme de que se haga.

El problema con GMail es que no puedo marcar el mail de ninguna forma en el momento que lo estoy escribiendo. Y al no poder marcarlo en el momento, después es altamente probable que se termine perdiendo.

La solución que encontré, que no me convence demasiado, es una vez enviado ir a "Sent items" y marcarlo con una etiqueta "Esperando respuesta". Pero me gustaría poder marcarlo antes de apretar el botón "Send".

¿Alguien tiene el mismo problema? ¿Lo resolvieron de alguna forma? ¿Cómo?

lunes 8 de marzo de 2010

Versión movil del blog

MoFuse es un sitio que permite crear una versión móvil de cualquier sitio web.

En particular, puede crear una versión móvil de cualquier blog sin ningún esfuerzo, y además lo hace de forma gratuita. Lo único es que agrega publicidad, pero creo que es un precio que vale la pena pagar.

A partir de este momento, este blog puede ser accedido desde cualquier teléfono móvil con acceso a internet desde http://marcoscrispino.mofuse.mobi

Si acceden a esa dirección desde una computadora, muestra una página web con un emulador...

Así es como se ve en el iPhone:

domingo 7 de marzo de 2010

Infinidad de galaxias

Esta imagen es increible, no deja de sorprenderme:


Fue tomada por el Hubble, apuntando hacia una zona aparentemente "vacía" del espacio, una región que ocupa aproximadamente el ancho de 1/15 del ancho de la luna llena.

A ver si logro compartir mi asombro... Se necesitan 30 millones de imágenes como esta para cubrir todo el cielo, y esta imagen fue tomada en una zona del espacio que se consideraba prácticamente vacía!

Pero para que lo voy a explicar yo, si Phil Plait lo explica mucho mejor...

También me gustó este articulo que habla del tema, sobre todo la referencia de Carl Sagan al final sobre "the Pale Blue dot".

Nota: tener en cuenta que "one billion" es 109.

miércoles 3 de marzo de 2010

En busca de código repetido

Uno de los problemas que más me quitan el sueño en los últimos tiempos, es el código repetido.

¿Por qué tener código repetido es un problema? La respuesta creo que es conocida por todos. El problema es que eventualmente las distintas versiones que se tienen se terminan desfazando, y empiezan a aparecer errores por tocar solo una. Además después de un cierto tiempo, es muy difícil saber cual de todas las versiones es la correcta, porque en general los cambios no se hacen en todas parejo.

Entonces, ¿cuanto código repetido es aceptable? Esta pregunta indudablemente es más abierta, y pueden haber diferentes criterios. ¿Una línea de código duplicada está bien?

Por ejemplo, si tengo el siguiente código (GeneXus 9.0), ¿está bien?:
if DocImpres = 'S'
    call(WGLLogDe,&msg1, &msg2, 'OC', 'CMANUDOCOC', &GlLogRef, '', &confirmo)
    if &confirmo = 'N'
        Call(PGLog, &msg1, &msg2, 'OC', 'CMANUDOCOC', &GlLogRef, '', &PedirDet)
    endif
else
    Call(PGLog, &msg1, &msg2, 'OC', 'CMANUDOCOC', &GlLogRef, '', &PedirDet)
endif
Nótese que los dos call al procedure GLog son idénticos... Además, los literales 'OC' y 'CMANUDOCOC' se usan varias veces en el código...

Haciendo algunos cambios al programa para eliminar estas repeticiones, llegamos a algo así:
&logGrabado = 'N'
&GLLogSis = 'OC'
&TpoModId = 'CMANUDOCOC'
if DocImpres = 'S'
    &logGrabado = udp(WGLLogDe, &msg1, &msg2, &GLLogSis, &TpoModId, &GlLogRef, '')
endif
if &logGrabado = 'N'
    Call(PGLog, &msg1, &msg2, &GLLogSis, &TpoModId, &GlLogRef, '', '')
endif
¿Es mejor que el código anterior? Yo creo que sí, pero seguramente para un caso tan simple haya discrepancias...

Pienso que cuando se trata de 2 o más líneas de código es más fácil estar de acuerdo que no es bueno tener dicho código repetido.

Ahora, el problema, es como detectar esta situación.

Cuando el código repetido está dentro del mismo objeto, entonces es bastante fácil de detectar. No es trivial cuando se tienen programas grandes (más de 500 líneas por ejemplo), pero es posible.

El mayor problema es cuando el código repetido está en varios objetos. En esos casos no es para nada fácil de detectar.

Pienso que se podría automatizar, aunque no parece ser trivial. Algunas heurísticas que se me ocurre se podrían utilizar:
  • Analizar las navegaciones de los objetos, para ver si hay navegaciones iguales. Esos objetos son candidatos a analizar. No necesariamente quiere decir que se pueda mejorar el código, pero sí vale la pena revisarlo.
  • En general cuando se da que hay código repetido, el mismo está en el entorno de la llamada a un objeto, o en torno al uso de un determinado atributo. Por ejemplo, tengo un procedimiento que me devuelve un valor, y luego hago algo con dicho valor, pero en varios lugares lo que hago es exáctamente lo mismo...
¿Alguien ha tenido la misma inquietud? ¿Existe alguna herramienta que me permita buscar en una KB GeneXus los posibles problemas de código repetido?

miércoles 24 de febrero de 2010

Augmented Reality

La "realidad aumentada" (augmented reality en inglés) parece ser el tema del momento.

Básicamente, consiste en mostrar información obtenida de Internet sobre objetos reales: un edificio, un libro, etc.

Hoy vi una notica (en algún lado que ahora no me acuerdo) sobre un nuevo producto llamado Recognizr, que permite ver información asociada a una persona mediante una foto tomada con el teléfono móvil.



Otro producto que parece estar muy bueno es Google Goggles:



Creo que nadie puede dudar que en los próximos tiempos vamos a ver mucha innovación en esta área. Lo único que me precupa es que parece que todas las aplicaciones interesantes funcionan en Android...

martes 23 de febrero de 2010

Índice de los arrays

Ayer empecé a leer Dreaming in Code, que en una parte dice:
Maybe you noticed that I've called this Chapter 0. I did not mean to make an eccentric joke but, rather, to tip my hat to one small difference between computer programmers and the rest of us: Programmers count from zero, not from one. [...]
Why do programers count from zero? Because computers count from zero! And so programmers train themselves to count that way too, [...]
Si bien no es del todo cierto, yo soy un programador y cuento desde el uno, es verdad que las computadoras cuentan desde el cero...

Cualquiera que haya programado un loop sobre los elementos de un array en C, C++, Java, C#, o cualquier otro lenguaje que tenga sus raíces en C, sabe que los elementos van de 0 a lenght-1. Algo así:
for (int i = 0; i < array.length; i++) { ... }
Lo que nunca me había cuestionado, es por qué es así... Y después de pensarlo un poquito, la respuesta es bien simple: en C, los arrays son punteros a una dirección de memoria, que contiene el primer elemento. El índice es el desplazamiento con respecto al puntero. Así, para acceder al primer elemento del array, el desplazamiento a usar es cero, y por eso se accede con a[0]. Todos los lenguajes que vinieron atrás de C, aunque no manejen punteros directamente, mantienen la misma convención.

Toda una revelación :)