sábado, 24 de enero de 2009

Cambios en el blog

Estuve haciendo algunos cambios al blog… El más notorio es el cambio de estética en el mismo.

Este cambio, además de renovar el estilo que hacía más de dos años que estaba, tiene varios objetivos:

Resolución de pantalla

El estilo del anterior estaba pensado para que se viera bien en una resolución de 800x600. Viendo las estadístocas en Google Analytics, menos de un 4,5% de las visitas del último mes tenían resolución de 800 pixels de ancho o menor.

Así que el nuevo lo elegí pensando en resoluciones de 1024 pixels de ancho o superior.

De todas formas, para quienes tengan monitor de 800 pixels de ancho, van a ver bien el contenido y la primer columna de la derecha, que es la que tiene la información relevante del blog (suscripción por RSS, acceso a la información de perfil, etiquetas, notas anteriores y últimos comentarios).

Este cambio permite que el área de contenido sea de 540 pixels de ancho en vez de los 420 pixels que tenía antes, una ganancia de más del 28%.

Tres columnas

En la versión anterior tenía dos columnas: una para el contenido y otra para todo lo demás (perfile, etiquetas, archivo, blogs que leo, elementos compartidos en Google Reader, etc.). Esto hacía que la columna para todo lo que es información adicional quedara demasiado grande, y para ver algunos de los elementos había que desplazarse varias páginas hacia abajo.

Ahora el blog tiene tres columnas, la principal sigue siendo la del contenido, y las otras dos son para la información adicional, ambas situadas a la derecha del contenido para que no distraigan la atención.

En la parte superior de estas dos columnas, hay algunos elementos que ocupan el ancho de ambas, como el perfil y los links para suscribirse.

En la columna del centro, se ubica todo lo que está relacionado al blog: etiquetas, archivo y últimos comentarios.

En la columna de más a la derecha se ubica información más personal y que no está tan estrechamente relacionada con el blog en sí: seguidores del blog, elementos compartidos en Google Reader, blogs de amigos y blogs de tecnología que leo.

Búsqueda y barra superior

Por defecto Blogger agrega una barra en la parte superior de la pantalla, que tiene el cuadro de búsqueda y alguna cosa más, que por lo menos a mi no me resultaba muy interesante.

El template que estoy usando (lo saqué del sitio Blogger Templates, tienen unos cuantos más) saca la barra de arriba y deja más visible el cuadro de búsqueda, que era lo único que valía la pena mantener.

Tamaño de letra

Ahora que tengo más espacio, puse un tamaño de letra un poco mayor, para facilitar la lectura.

Comparación

Dejo una foto de como estaba el blog antes y como está ahora, para poder comparar la diferencia.

Antes

Ahora

jueves, 22 de enero de 2009

Crecimiento sostenido

No voy a hablar de ninguna tendencia económica ni na que se le parezca. Lo mío en esta oportunidad es algo mucho más egocéntrico…

Ahora que no está claro (al menos para mí), cual va a ser el futuro de FeedBurner, estuve analizando un poco las estadísticas del blog, viendo como evolucionaron los suscriptores desde que empecé hasta ahora.

Dejo una gráfica de la evolución del promedio de suscriptores. Solo la tendencia…

FeedBurner

El tema con FeedBurner es que están pasando a todas las cuentas a Google AdSense. Todavía no me puse a leer que implica ese cambio, pero si implica poner propaganda en las notas, lo más probable es que me borre. Más información aquí.

sábado, 10 de enero de 2009

Nueva extensión para GeneXus X: abrir objetos cerrados recientemente

Una de las cosas que me pasa cada tanto, es que cierro un objeto y después lo quiero volver a abrir, porque me faltó ver algo.

Si el objeto lo abrí desde el diálogo de abrir objetos, entonces no hay problema. Pero si lo abrí con botón derecho en el código de algún otro programa, entonces no tengo historia, me tengo que acordar del nombre o del camino que seguí para abrirlo.

En otra aplicación que también uso mucho, Firefox 3.0, una de las funcionalidades que más me gusta, es poder abrir páginas web que cerré recientemente.

Ahora con esta extensión también está disponible dicha funcionalidad para GeneXus X.

La versión 0.1 creo que está usable, pero todavía quedan algunas mejoras por hacerle:

  • Los objetos se muestran en una venta aparte. Lo ideal sería que se mostraran mismo dentro del menú.
  • La lista crece indefinidamente mientras que no se cierre la sesión. Con una ventana como está ahora no debería ser un problema, aunque no lo probé con muchos objetos. Cuando sea un menú esto deja de ser práctico.
  • Sería bueno mostrar el ícono del tipo de objeto además o en lugar del nombre.

El proyecto es open source, lo estoy subiendo a Assembla para que quede disponible para quien lo quiera mejorar.

Además lo estoy publicando en la galería de extensiones.

martes, 6 de enero de 2009

Refactoring de código GeneXus

Hace tiempo que vengo pensando en el tema de refactoring en GeneXus. Hay varias cosas que me gustaría tener, que creo que simplificaría el trabajo en algunos casos.

Por "refactoring" me refiero a reorganizar el código sin cambiar la funcionalidad ni introducir errores, para que el código quede más legible, ordenado, conciso y reutilizable.

En la Wikipedia, se define code refactoring como:
Code refactoring is the process of changing a computer program's internal structure without modifying its external behavior or existing functionality. This is usually done to improve code readability, simplify code structure, change code to adhere to a given programming paradigm, improve maintainability, or improve extensibility.
GeneXus ya tiene alguna funcionalidad que podría entrar de esta categoría, como por ejemplo renombrar un objeto, o por qué no incluirlo, cambiar la estructura de una tabla, el tipo de datos de un campo o cualquier cosa que implique una reorganización en la base de datos.

Sin embargo hay cosas que le faltan y que estarían buenas. Paso a detallar.

Indentar el código
Creo que esto ya está bien resuelto en GeneXus X.... Para GeneXus 9, hay un programita que hizo Matías, que también resuelve el problema, aunque por fuera de GeneXus. Se puede bajar de GXOpen, aunque creo que todavía está en construcción.

Extraer una subrutina
Dado una porción de código seleccionado en el editor, poder pasar ese código a una subrutina (tiene que pedir el nombre), y dejar en el lugar del código la llamada a la misma.

Hay algunos temas a tener en cuenta que no son triviales. Los que se me ocurren ahora (seguramente hayan más) son:
  • Si el código que se extrae está dentro de un for each, puede ser que se usen atributos del for each exterior, que no serían válidos en el contexto de la subrutina. De alguna forma (¿viendo la especificación detallada?) se debería identificar estos atributos y cambiarlos por variables, que se inicializarían antes de invocar a la subrutina.
  • En principio el código seleccionado no tiene por que ser "consistente". Por ejemplo, podría seleccionar para extraer un bloque if pero sin seleccionar el endif, por lo que el código quedaría con errores. Otro caso es cuando elijo una sección de código que contenga la definición de un evento o de otra subrutina, o el comando Load si estoy en un web panel, etc.

Extraer un procedimiento
Es muy similar al caso anterior, pero con la dificultad adicional que hay que redefinir las variables en el procedimiento nuevo, e identificar cuales son los parámetros de entrada y de salida y cuales son las variables internas.

Reordenar eventos y subrutinas
Esto es más que nada un gusto personal. Si tengo un web panel que tiene eventos Start, Refresh, Load, Enter, y eventos de usuario, me gusta que queden en ese orden. Además me molesta que los eventos estén mezclados con las subrutinas. Se podría tener una opción que reordene los eventos, no parece demasiado difícil.

Ordenar las subrutinas puede ser un poco más complicado. Por ejemplo, el siguiente código:
do 'Inicializo'
do 'Proceso'
Sub 'Calculo'
Sub 'Proceso'
Sub 'Inicializo'  // llama a la subrutina 'Calculo'
¿Cómo debería ordenar las subrutinas? A mi me gusta: Inicializo, Proceso, Calculo. Creo que las dos primeras no hay mucha discusión, pero cuando empiezan a haber subrutinas que llaman a otras, puede complicarse un poco más. Por ejemplo, la subrutina Calculo que se llama solo desde Inicializo, la podría poner inmediatamente abajo de esta, para que quede lo más próximo posible a su uso.

De todas formas, no debería haber ciclos (sub A llama a sub B que llama a sub C que vuelve a llamara a sub A), por lo que se podría construir un grafo dirigido y ordenarlas según alguna recorrida del mismo.

Extraer data selector o data provider 
Debería ser igual que los casos de extraer subrutina o procedimiento, aunque personalmente me cuesta un poco más visualizarlo porque no he usado demasiado los data selectors ni los data providers. Es algo para pensar...


Reconocer patrones de código y extraer procedimiento/subrutina
Los casos anteriores para extraer subrutinas y procedimientos eran con intervención de un usuario. Este caso, mucho más complejo, sería de forma automática.

Hay varios niveles de dificultad:
  • Identificar código idéntico en la KB. Lo más difícil es saber que buscar, porque después compara para ver si es idéntico es trivial.
  • Me ha pasado encontrarme con bloques de código casi idénticos, pero que en algún lugar usan una variable distinta, o un literal distinto, pero el sentido del código es el mismo. En ese caso se podría extraer un procedimiento que reciba los parámetros que necesite y que quede con el código genérico.
  • La más difícil, es cuando se hacen cosas parecidas en dos lugares, pero en una de ellas se hace algo más, por ejemplo en una tengo un if sin else y en la otra tengo el else. Son firmes candidatos a unificar, pero parece complicado hacerlo de forma automática.
Conclusiones
Creo que hay muchas cosas para hacer en este sentido que nos facilitaría el trabajo.

La mayoría no son fáciles, pero tampoco parecen imposibles. Tal vez se preste para algún proyecto de grado de facultad, o para desarrollar una extensión con fines de lucro.

Si alguien tiene interés en hacer algo de esto, cuenta con todo mi apoyo.

jueves, 1 de enero de 2009

2009: Año Internacional de la Astronomía

Este año que comienza fue declarado como el Año Internacional de la Astronomía por la UNESCO, al cumplirse 400 años de la invención* del telescopio por parte de Galileo Galilei.

Aparentemente durante el año van a haber distintas actividades para celebrar este hecho, comenzando el 15 de enero en París.

* En realidad Galileo no inventó el telescopio, pero le hizo varias mejoras al diseño que ya existía y fue el primero en utilizarlo para la investigación astronómica.