martes, 30 de marzo de 2010

Herencia en GeneXus

Cuando hablamos de herencia, en GeneXus, en general nos referimos a la herencia entre las distintas entidades. Por ejemplo, Estudiante es una Persona, y los defino con subtipos.

En este caso en realidad quiero hablar sobre la herencia entre objetos... que en GeneXus es prácticamente inexistente.

Lo único que existe (hasta donde yo se), son los objetos de tipo Style, donde se pueden definir propieades, componentes del form y eventos, que luego son heredados al crear un objeto basado en dicho style. El problema con esta herencia (para el código) es que es solo al momento de crear el objeto, pero luego no se mantiene. Además el código heredado queda en el objeto "hijo" como una copia del código del objeto "padre".

Sería bueno poder tener herencia de verdad. Es decir, tener un objeto que tenga el código común, y que los demás puedan heredar de este, sin copiar el código a cada uno de los objetos "hijos".

Un claro ejemplo de esto es en el pattern WorkWith, donde todos los objetos quedan con el código de paginado, es decir, los eventos First.Click, Next.Click, etc.

Obviamente esta herencia se debe poder sobreescribir en un objeto dado si así se desea. Por ejemplo podría tener un objeto que agrege código en el evento First.Click, o incluso que haga algo totalmente distinto.

Probablemente este tema no sea sencillo de solucionar, y hay cosas que hay que definir bien (herencia simple o múltiple, interfases, sintaxis para la funcionalidad nueva, etc.), pero me parece que es algo sumamente necesario.

jueves, 18 de marzo de 2010

Joel on Software

Hace unos dias Joel Spolsky escribía en su blog, Joel on Software, lo siguiente:
Some of you may have seen my final column in Inc., in which I announce my retirement from blogging effective March 18th, the 10-year anniversary of Joel on Software.
Hoy (18 de marzo) escribe una nota sobre Distributed version control, en la que se despide diciendo:
I seem to have run out the clock on this site. It has been an extreme honor to have you reading my essays over the last ten years. I couldn’t ask for a greater group of readers. Whether you’re one of the hundreds of people who volunteered their time to translate articles into over 40 languages, or the 22,894 people who has taken the time to send me an email, or the 50,838 people who subscribed to the email newsletter, or the 2,262,348 people per year who visited the website and read some of the 1067 articles I’ve written, I sincerely thank you for your attention.
Una verdadera lástima, ya que era uno de mis blogs de cabecera, con excelentes artículos sobre desarrollo de software.

Para los que no lo hayan leído, dejo uno de los artículos que más me gustaron: Can your programming language do this?

martes, 16 de marzo de 2010

Seguimiento de mails con GMail, la respuesta (?)

Como comentaba hace unos días, estoy buscando una forma más efectiva de administrar los mails por los que estoy esperando una respuesta.

En la nota anterior hubieron varios comentarios sugiriendo poner algo en el texto, y crear un filtro para procesar esos mensajes y marcarlos automáticamente. Si bien es efectivo, no me convence demasiado porque le llega a quien recibe el correo un texto que no tiene por que recibir, ya que es para que yo lo pueda administrar.

Creo que ahora encontré una forma mejor. Por lo menos, una forma que a mi me convence más...

A cualquier dirección de GMail (o de Google Apps dado el caso), se le puede agregar un signo de más (+) seguido de un texto. Google ignora este texto, pero puede servir para procesar los mensajes.

Ejemplo: si mi dirección de correo es usuario@dominio, la dirección usuario+texto@dominio también es válida y GMail la asigna al mismo usuario.

Entonces la metodolgía es la siguiente:
  1. Crear un contacto en la lista de contactos de GMail que sea usuario+esperando_respuesta@dominio. A ese contacto le puse de nombre "tag:seguir", pero cualquier nombre está bien.
  2. Crear un filtro que le aplique la etiqueta "Esperando respuesta" a cualquier correo dirigido a usuario+esperando_respuesta@dominio.
  3. Al mandar un correo que quiero seguir, en el campo Bcc le agrego el contacto "tag:seguir". 
Los pasos 1 y 2 solo se hacen una vez. El paso 3, cada vez que quiero mandar un mail que quede con la etiqueta.

Con este procedimiento me queda con la etiqueta que quiero y quien recibe el mail no recibe un texto críptico al final que no le sirve para nada.

Igual me gustaría poder aplicar una etiqueta antes de mandarlo como se hace con los que están en la bandeja de entrada, pero creo que este procedimiento es bastante práctico.

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?