miércoles, 22 de diciembre de 2010

Tutorial de GMF

El desarrollo guiado por modelos, o Model Driven Development, o MDD, es una forma de desarrollar software basada en la idea de que podemos obtener el código fuente directamente a partir de la definición de modelos, sin necesidad de codificar (o reduciendo lo más posible esta fase). En otras palabras, lo que pretendemos es centrarnos en la definición a alto nivel de la solución, y obtener su implementación concreta por medio de sistemas automáticos.

Un concepto inexorablemente relacionado es el de lenguaje especifico del dominio (DSL, Domain Specific Language). Es difícil explicar qué es un DSL siguiendo la norma de que lo definido no puede ser utilizado en la definición, dado que en este caso el término tiene un nivel de autodescripción más que suficiente. Pero bueno, podríamos decir que un DSL sería una especificación o técnica de representación pensada para un contexto o problema concreto.

En cualquier caso, para profundizar en estas ideas y ver en qué se traducen a nivel práctico, adjunto a este post ofrezco un tutorial en el que se muestra un ejemplo de uso de la herramienta GMF (Graphical Modeling Framework). Este plugin permite crear editores gráficos para Eclipse y, en conjunción con Mofscript, generar código a partir de lo modelado con ellas.

Aquí el tutorial, en el que estreno además mi nueva identidad corporativa.

Identidad corporativa

Una manzana mordida.



Una taza de café humeante.



Un caballo encabritado.



Una bandera de cuatro colores.



¿¿Te dicen algo??








¿¿Y ahora??

Seguro que has tardado poco en identificar cada uno de estos objetos con la marca a la que representan, claro.

Esto se debe a que todas las grandes empresas, y buena parte de las pequeñas, tienen bien definida su identidad corporativa. Básicamente la identidad corporativa es el conjunto de imágenes, tipos de letras, colores, etc., que una empresa utiliza y la hace reconocible frente a cualquier otra.

El elemento central suele ser el logotipo, pero no se reduce unicamente a eso. Un manual de identidad corporativa incluye también los tipos de letra, tamaños, colores, distribución de información, y todo lo que se te pueda ocurrir, que se debe utilizar para cualquier comunicación que provenga de la empresa.

¿Y todo esto para qué? Pues para obtener reconocimiento. Lo que consigue la empresa es que se le identifique rápidamente; que cuando veas un deportivo rojo pasar a 200 por hora y atisbes un caballo en su frontal digas: pedazo de ferrari. O que cuando estés trabajando con un programa y veas una tacita de café sepas: basado en tecnología Java. O, por qué no, que cuando veas una pantalla de ordenador con fondo azul y letras blancas pienses: estos de Windows...

Porque lograr una identidad corporativa es lo que tiene. Que te puede reportar beneficios o pérdidas, pero eso ya depende de lo bien que hagas las cosas. El primer paso está dado, y es que todo el que vea tu producto sepa que es tuyo.

El único beneficio que se obtiene de la identidad corporativa en sí misma tiene que ver lógicamente con la imagen. Orden, coherencia, pulcritud, son algunos de los mensajes que se envían. Y es por eso que he decidido implantar poco a poco mi propio manual de identidad, en este caso personal.

El primer paso lo doy en el campo que considero más importante y sobre el que tengo mayor control, que es la documentación que genero, principalmente tutoriales. Así que he creado una plantilla y he definido unas líneas a seguir que espero le den un toque personal (y profesional) a mis documentos.

Si el tiempo lo permite, y supero mis limitaciones en lo que se refiere al diseño, puede que los próximos pasos sean el logo y el formato del propio blog.

sábado, 18 de diciembre de 2010

Opera: give it a try!

En un mundo en el que Internet se ha impuesto, la guerra de los navegadores Web por la hegemonía del mercado ha adquirido un enorme interés. Internet Explorer y Firefox siguen siendo los dos grandes destacados, pero a la cola vienen otros tres siguiendo su estela (en cuanto a cifras de uso, que no en cuanto a innovación y propuestas).

Esto de los navegadores es, como decía aquél, una cuestión de feeling. Resulta difícil ofrecer datos objetivos que indiquen que un navegador es mejor que otro, porque acaban ofreciendo básicamente lo mismo. Cada vez que uno saca una funcionalidad interesante, los otros la copian e incluso mejoran. Donde quizá sí pueda haber más diferencias es en la ligereza de cada uno, y es precisamente por eso que digo que, para mí, todo se reduce a una cuestión de feeling: al final me quedo con el que me da una mejor y más regular respuesta a mis necesidades.

De ahí que sea usuario, por este orden, de Google Chrome, Internet Explorer y Firefox. Desde que apareció el navegador de Google, se ha convertido en mi preferido; principalmente porque se abre más rápido, no me da problemas al visualizar ninguna de las páginas en las que me suelo mover, y tiene todas las funciones que utilizo. Explorer lo uso en segundo lugar, porque siguen quedando sitios, y sobre todo aplicaciones, que lo tienen como requisito. Y a Firefox recurro muy de vez en cuando, si me levanto con ganas de cambiar un poco.

Pero, ¿y qué hay del resto? Pues por ahí quedan Safari y Opera. El primero parece tener la estigma de ser un navegador para MAC, aunque tenga versión para PC. Y con el segundo llegamos a Opera.

Cosas de la vida, ayer se apoderó de mí la curiosidad, y me dio por descargármelo. Tenemos reciente la versión 11, y era una buena excusa para darle un oportunidad. La primera impresión ha sido buena: tiene un diseño atractivo y personalizable, ofrece marcadores, búsqueda en la barra de direcciones, pestañas... vamos, como todos. Pero también tiene algunos detalles que no he encontrado en Chrome.

Por un lado, permite la agrupación de pestañas. Es algo que personalmente no veo muy útil, pero ahí está por si acaso. Por otro, tiene una papelera de reciclaje en la que guarda las páginas que se van cerrando durante la sesión. Esto sí que me parece interesante, por si algo se cierra por accidente, o para volver atrás cuando se está buscando información (me parece mucho más cómodo que el historial). Y por último, tiene una página de acceso rápido de verdad. Para mí esta fue una de las aportaciones más interesantes de Chrome (fue el primer navegador donde lo vi, no sé si fue el primero que lo propuso), pero estaba muy limitada. Sólo mostraba las 8 página más visitadas. Sin embargo Opera permite definir cuántas y qué página quieres mostrar, y hasta poner una imagen de fondo para presentarla.


Así que en las próximas semanas le voy a dar cancha a Opera, y a ver qué sensaciones me llevo. No sé si desbancará a Chrome en mi ranking particular, pero tras la primer impresión todo apunta a que tiene garantizada la tercera posición.

jueves, 16 de diciembre de 2010

Tutorial de Pentaho: definición de un proceso ETL con Spoon

Hace ya varios meses publiqué una pequeña introducción teórica al concepto de Business Intelligence. Al final de esa entrada adelantaba mi intención de publicar algunos tutoriales en los que se mostrase cómo trabajar con herramientas de BI. Y hoy, por fin, ha llegado el primero.

Durante este tiempo he trabajado especialmente con algunas de las herramientas de la suite Pentaho, ya que las he necesitado para mi trabajo final de Máster. De esta forma he podido ver que pueden ser interesantes para algunas de las tareas que realizo habitualmente.

Un ejemplo claro son las cargas de datos. La integración de aplicaciones es algo que consume mucho más tiempo y recursos de lo que puede parecer. Por ejemplo, seguro que la mayoría de informáticos ha participado alguna vez en un proyecto en el que se tenía que hacer una migración de datos entre sistemas.

En este tutorial se desarrolla un pequeño ejemplo en el que se puede ver cómo trabajar con Spoon para obtener información de ficheros de texto, realizar un procesamiento sencillo, y después almacenarla en una base de datos. A partir de ahí, las posibilidades son enormes.

En este enlace podéis descargar el tutorial.

domingo, 12 de diciembre de 2010

¿Dónde están mis mensajes de error?

En estos días, trabajando en el que espero que sea mi segundo tutorial publicado en JavaHispano, he pasado de utilizar la versión 11.1.1.2 de jDeveloper, a la 11.1.1.3. En principio todo fue muy bien; de hecho, no se aprecian cambias sustanciales al trabajar con las tecnologías que estaba utilizando. Sin embargo, he tenido unos días de complicaciones por un mensaje de error desaparecido. ¿Quién me lo iba a decir?

Resulta que tenía una aplicación casi completamente desarrollada, que mostraba un popup cada vez que se producía un error. Por ejemplo, si al ejecutar una consulta sobre la base de datos obtenía una excepción ORA-XXXXX, ésta iba recorriendo las distintas capas hasta aparecer delante del usuario.

Sin embargo, al empezar a trabajar con la versión 11.1.1.3 del IDE, los mensajes de error dejaron de mostrarse. Seguían recogiéndose como siempre en el log de jDeveloper, pero nada más. No había forma de presentarlos al usuario.

Al final, preguntando en el foro de Oracle, se confirmaron las sospechas de que era un cambio de comportamiento de la nueva versión. Por el momento no conozco ninguna forma para conseguir que los mensajes lleguen a la interfaz, así que la única opción si los queremos es volver atrás, y esperar.

martes, 30 de noviembre de 2010

Error adquiriendo fuentes de datos en jDeveloper 11

En los últimos días he estado lidiando con un problema trabajando con jDeveloper 11.1.1.3.0. Estaba desarrollando una aplicación utilizando ADF y EJB, que venía funcionando correctamente. Sin embargo, un buen día, al arrancar el servidor, sin haber realizado cambios desde la última vez, me encuentro que mi aplicación lanza la siguiente excepción:


Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [java:/app/jdbc/jdbc/TareasDS].
Internal Exception: javax.naming.NameNotFoundException: While trying to look up /app/jdbc/jdbc/TareasDS in /app/ejb/ModelEJB.jar#TareasSessionEJB.; remaining name '/app/jdbc/jdbc/TareasDS'
at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:451)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:116)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
...
...
...
Caused by: javax.naming.NameNotFoundException: While trying to look up /app/jdbc/jdbc/TareasDS in /app/ejb/ModelEJB.jar#TareasSessionEJB.; remaining name '/app/jdbc/jdbc/TareasDS'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:144)
at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:254)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:393)
at weblogic.jndi.factories.java.ReadOnlyContextWrapper.lookup(ReadOnlyContextWrapper.java:45)
at weblogic.jndi.internal.AbstractURLContext.lookup(AbstractURLContext.java:135)
at javax.naming.InitialContext.lookup(InitialContext.java:396)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:110)
... 204 more


Este error indica que la aplicación está tratando de acceder al DataSource indicado en el fichero persistence.xml, pero no lo consigue. Por tanto lo primero que uno puede pensar es que el fallo tiene que venir de algún problema de configuración de ese fichero, y empezar a editarlo: quitando el doble /jdbc, añadiendo y eliminando propiedades... Sin embargo no van por ahí los tiros.

A la hora de desplegar una aplicación en el servidor de aplicaciones WebLogic embebido de jDeveloper, éste crea fuentes de datos basándose en las conexiones configuradas por el usuario, que se pueden ver en la pestaña Database Navigator (si no la veis junto al Application Navigator podéis mostrarla mediante el menú View - Database - Database Navigator).

Pues bien, en mi caso el problema se debía a que, por algún motivo, la contraseña había desaparecido de las propiedades de la conexión que había configurado para mi aplicación. Bastó volver a introducirla y redesplegar la aplicación para que todo volviese a funcionar como siempre.

Sólo queda averiguar qué fue de la contraseña.

Tutorial de Swing Application Framework publicado en JavaHispano

La Asociación JavaHispano ha tenido el detalle de publicar un tutorial que he realizado en el que se desarrolla una pequeña aplicación utilizando el Swing Application Framework.

Este framework, desarrollado en la JSR-296, proporciona la infraestructura necesaria para la construcción de aplicaciones de escritorio con Java, incluyendo:

- Ciclo de vida
- Gestión de recursos (mensajes, imágenes, fuentes de texto...)
- Acciones
- Sesión (permite guardar el estado de la aplicación entre ejecuciones)

Actualmente la JSR se encuentra inactiva, por lo que el framework tal cual está condenado a morir. Sin embargo, creo que en su última versión ofrece suficientes cosas como para ser una buena opción a la hora de empezar a trabajar con Swing; y, por otro lado, la idea de crear un framework para esta tecnología sí sigue viva, y seguirá desarrollándose, seguro, en nuevos proyectos que partirán de SAF. Como muestra, Better SAF o guts-gui.

En esta página de JavaHispano podéis descargar el tutorial.

Muchas gracias a JavaHispano, y en concreto a Peyrona, Leonardo, Isaac, y revisor1 por su colaboración, y por haber mejorado sustancialmente el resultado final.

viernes, 19 de noviembre de 2010

¡Viva España!

No es que me haya dado un arranque patriótico ni nada por el estilo. Lo que pasa es que hoy toca un terrorífico capítulo protagonizado por nuestra querida amiga la eñe (ñ).

El mundo de las letras no es muy distinto del nuestro: hay letras grandes y pequeñas, que están hasta en la sopa y que no encuentras si no es en kilómetros, que se alían para sus chanchullos, y hasta las hay mudas. Por tanto no hay que extrañarse si decimos que también hay letras marginadas, exluídas e ignoradas.

En este grupo se encuentran, mayormente, todas las letras que no son utilizadas por el rey de los lenguajes, el de iu es ei, el inglish. Por tanto, para nosotros los españoles, tenemos la á, é, í, ó, ú y, sobre todo, la ñ. De España.

Y si hay un contexto en el que se maximiza la discriminación hacia estas letras, ese es el informático. Todos hemos sufrido alguna vez las consecuencias de ser fieles a nuestra rica lengua incluyendo en algún código acentos y eñes. Sería interesante cuantificar la cantidad de horas que se han empleado en este mundo en estudiar errores que finalmente eran causados por los denominados caracteres extraños, y daría para hablar de lo importante que es pararse a pensar antes de hacer las cosas (lo digo por los que crearon las primeras codificaciones), pero vamos a centrarnos.

En este post simplemente voy a exponer un nuevo caso, que además puede afectar incluso a aquellos pobres hombres que, como yo, ya han renunciado a utilizar su idioma en todo su esplendor y hace anyos que abdicaron.

Ubiquémonos. Estamos trabajando con la suite de BI Pentaho. Accedemos a la consola de usuario, y de ahí a la creación de un nuevo informe. Entre las fuentes de datos podemos ver las que la herramienta trae, pero nosotros queremos crear una nueva, así que pulsamos el botón Add. En el diálogo, damos un nombre, escribimos una consulta, previsualizamos, añadimos, damos un nombre a mostrar, y aceptamos como si nada. Y entonces...

¡Aparece el mensaje!


(There are either no Data Source(s) defined in the metadata, or you do not have permission to access any of the Data Source(s). Please create one or more Data Source(s) using the Metadata Editor and then publish them to the Pentaho Server. Or, use the Metadata Editor to give the appropiate user permission to access to the Data Source(s).)

Que en la lengua de Cervantes, y con la capacidad de síntesis de Pocholo, significa que no hay fuentes de datos. Tras ello, un nuevo mensaje.



(pentaho-ajax.js.pentahoResponse():TypeError:'null' is null or not an object)

Que no se puede traducir a ninguna lengua seria.

Y ahora nos encontramos con que en la lista de fuentes de datos no hay niente. Pourquoi??

Cerramos el reporte, volvemos a acceder para crear otro desde cero... y la misma historia. ¿¿¿Qué ha pasado con las fuentes de datos???

Pues realmente no ha pasado nada. Están ahí. El problema es que Pentaho sigue un curioso comportamiento. No tiene problema en escribir una eñe, pero le da la risa cuando tiene que leerla, y se queda tonto.

Cuando creamos una fuente de datos, Pentaho crea un fichero de dominio en la ruta %Pentaho_Base%/server/bi-server/pentaho-solutions/system/metadata/domains, con el nombre que le hayamos dado. En ese fichero, con formato xml, se define la fuente de datos: conexión, consulta, etc, etc, etc. Si accedemos a esa ruta, veremos que, efectivamente, hay un fichero de definición con el nombre que le dimos a nuestra fuente de datos. Pero si lo abrimos... ¡ahí está! ¡La repudiada eñe!. En la descripción del locale Pentaho ha puesto Español (España), con todas las letras. Y ahora no es capaz de procesar el fichero.

Así que la solución inmediata es tan simple como editar el fichero .domain y quitarle el tupé a la eñe. Sólo con eso podremos crear de nuevo un informe y tendremos tanto las fuentes de datos de Pentaho como la que nosotros hemos creado, y podremos seguir con el proceso.

Otra posible solución es mudarnos a Estados Unidos, o instalarnos un Sistema Operativo en inglés.

Este problema no es exclusivo de la creación de informes; se da exactamente igual al crear dashboards.

Pero bueno, no nos quejemos. Peor lo deben tener los chinos...

martes, 9 de noviembre de 2010

4F530E43505002EF

Ese críptico código es el que nos encontramos hace unos meses, junto con un mensaje de error no mucho más elocuente en el log de nuestro servidor de aplicaciones OAS 10.1.2.0.2.

Unexpected Signal : 11 occurred at PC=0xB7D49B2D 
Function=(null) 
Library=[...]/jdk/jre/lib/i386/server/libjvm.so 

NOTE: We are unable to locate the function name symbol for the error just occurred. Please refer to release documentation for possible reason and solutions. 

Heap at VM Abort: 
Heap 
def new generation total 3392K, used 1221K 
eden space 3072K, 33% used 
from space 320K, 63% used 
to space 320K, 0% used 
tenured generation total 29264K, used 18790K 
the space 29264K, 64% used 
compacting perm gen total 29184K, used 29050K 
the space 29184K, 99% used 

Elapsed Time = 1602 
# HotSpot Virtual Machine Error : 11 
# Error ID : 4F530E43505002EF 
# Please report this error at 
# http://java.sun.com/cgi-bin/bugreport.cgi 
# Java VM: Java HotSpot(TM) Server VM (1.4.2_06-b03 mixed mode) 
# An error report file has been saved as hs_err_pid20003.log. 
# Please refer to the file for further information. 
#

Cuando uno se encuentra con este tipo de errores sufre un repentino estado de ansiedad y se acuerda de aquel lejano día en que se decantó definitivamente por la informática como profesión.

Aunque en realidad el tema parece claro: ha habido un error de la máquina virutal de Java, ésta ha cascado irremediablemente, y tu aplicación se ha quedado tostada con el consiguiente cabreo del sufrido usuario.

Y en este caso, ¿podemos hacer algo aparte de largarle el problema a nuestro amigo Larry? (es lo que tiene comprar empresas, que te las llevas con lo bueno y lo malo).

Pues sí, podemos.

Lo que tenemos ante nosotros es la consecuencia de uno de los habituales bugs informáticos, que se resuelve con una actualización de versión de la JVM. Para este error concreto era necesario pasar de la 1.4.2_06-b03 a la 1.4.2_26_b07 (por contextualizar, se trata de una aplicación basada en ADF-UIX)

Para actualizar la JVM de una instancia de OAS ya instalada, lo que tenemos que hacer es seguir estos sencillos pasos.

- Instalar la nueva versión en la ruta .../oracle/product/10.1.2.0.2/midtier_1/j2ee/nombreInstancia/jdk.
- Modificar, a través del Enterprise Manager, la propiedad Ejecutable java de la instancia en cuestión, apuntando a la ruta 
.../oracle/product/10.1.2.0.2/midtier_1/j2ee/nombreInstancia/jdk/j2sdk1.4.2_26/bin/java, y aplicar los cambios.
- Ejecutar el comando opmnctl reload.
- Reiniciar la instancia desde el Enterprise Manager.

Y podemos seguir respirando tranquilos.

jueves, 28 de octubre de 2010

Este año termino la carrera

Esta es una frase que todo universitario pronuncia al menos una vez en su vida. Lo malo es que algunos se acostumbran a ella, le toman cariño, y dejan que le acompañe durante lustros. Algo que no tiene mucho sentido.

Está claro que uno no puede darle máxima validez a una frase como esa cuando viene de una persona con la edad habitual de los universitarios (entiéndase entre 18 y 23, aunque quizá lo habitual sea entre 20 y 30). En esa época de nuestra vida todos tenemos un ego super-desarrollado que nos impedirá asumir con modestia que al final necesitaremos una pequeña prórroga para terminar nuestros estudios.

En cualquier caso, una persona que emite esta frase durante un periodo superior a 9 meses demuestra una serie de cosas.

1 - Que tiene un escaso conocimiento de sus capacidades.
2 - Que no es consciente de sus circunstancias, y de como éstas afectan a su desempeño.
3 - Que no tiene la menor capacidad para "planificar".

Porque un tío que tras 5 años de carrera tiene por aprobar el 20% de los créditos, correspondientes precisamente a las asignaturas más duras, que afirma que va a terminar en un año más, no tiene ni idea de lo que está diciendo. Y más si resulta que esa misma persona ha decidido que, como ya le queda "poco" para terminar, puede asumir un trabajo a tiempo parcial para ir sacándose unos ahorrillos.

En estas circunstancias, cualquier persona que no cumpla los 3 puntos anteriores dirá que, en condiciones normales, este individuo necesitará al menos dos años más para terminar sus estudios.

Pero bueno, ¿¿y esto no es un pedazo de off-topic??

Pues no. Resulta que esos individuos de los que estoy hablando, transcurrido ese "último año", pasarán a formar parte de la plantilla de alguna empresa, y asumirán determinadas responsabilidades. Y entonces es cuando llegarán, como hemos hecho todos, como becarios en sus primeros días de trabajo, y ante la pregunta de su jefe, ¿cuánto crees que tardarás en hacer esto?, responderán sin cortarse un pelo: "dame un par de días". Y seis meses después, cuando su contrato-basura esté a punto de expirar, irán ilusionados a comunicar: "ya lo tengo!".

Es algo lógico, dado el ímpetu y la ilusión con que todos empezamos nuestra vida laboral; y sobre todo dado el desconocimiento que tenemos de la realidad de ese mundo. Dicho de otra forma, dada nuestra nula capacidad para Planificar.

Porque la tarea de planificar es ciertamente compleja. Casi me atrevería a decir que está al límite de lo imposible. Y es que cuando uno se enfrenta a la necesidad de predecir cuánto tiempo va a requerir para hacer algo tiene que controlar innumerables variables:

- ¿Qué es lo que tengo que hacer?
- No, en serio, ¿qué es lo que tengo que hacer? Quiero decir, ¿soy realmente consciente de ello? No basta con decir: tengo que hacer una aplicación Web para la gestión de usuarios de mi empresa. Hay que saber qué implica eso. ¿Montar un entorno de trabajo? ¿Seleccionar herramientas y frameworks de desarrollo? ¿Instalarlas? ¿Definir la funcionalidad? ¿Diseñar una base de datos? ¿Comunicar sistemas? ¿Hacer pruebas? ¿Documentar? ¿Reunirse con los usuarios? ¿Corregir errores?... y así hasta el infinito.
- ¿De qué recursos dispongo?
- ¿Cuáles son sus capacidades?
- ¿Coincidira mi desarrollo con la redacción de alguna oferta que entretenga al equipo?
- ¿Se irá la luz durante los trabajos? ¿cuántas veces? ¿qué cantidad del trabajo perderemos?
- ...

Y, en función de todo ello, la gran pregunta, ¿cuánto tardaré en hacerlo?.

No, en serio, ¿cuánto tardaré en hacerlo? Porque uno puede decir que en instalar un IDE se tardan 5 minutos. Pero se puede encontrar que la versión que necesita no es compatible con el driver del sistema, y necesitar una semana para enterarse de que tenía que cambiar una coma en un fichero de configuración para que todo funcione.

Al final la solución estándar es simple. Se coge el tiempo que se necesitó la última vez para hacer la tarea, t (si nunca se ha hecho, se estima con una función de relación directa al tamaño del nombre de la tarea), se multiplica por dos, y se le suman un par de semanas para documentar, d. Resultado: P = 2t + d.

¿Y qué pasa? Pues que nos encontramos con que al final g (el tiempo efectivamente empleado en el proyecto) se va acercando peligrosamente a P, hasta rebasarlo sin remedio y acabar doblándolo.

Menos mal que somos gente preparada para planificar, y conocemos las técnicas heurísticas. La próxima vez modificaremos el factor de corrección a 4, y todo resuelto.

miércoles, 27 de octubre de 2010

Taskbar Shuffle

Hoy he descubierto otra utilidad muy interesante, al menos para maniáticos incorregibles como yo.

La aplicación en cuestión es Taskbar Shuffle, y básicamente sirve para añadir a Windows XP la posibilidad de reordenar los elementos de la barra de tareas.

Para mí es un tema muy interesante, porque ya me he acostumbrado a tener un orden determinado en las aplicaciones con las que trabajo. Por ejemplo, lo primero que abro siempre es el correo, por lo que cuando quiero consultarlo me voy mecánicamente a la primera posición de la barra.

El problema lo tengo cuando al navegador de turno le da por ponerse gracioso y cerrar todas sus instancias (en lo que Explorer es especialista). Al volver a abrirlo el correo habrá perdido su lugar, y para que lo recuperase tendría que cerrar tooooodos los programas, y volver a abrirlos. Medida un tanto drástica para satisfacer una simple manía.

Pero ahora con este programita tengo la posibilidad de reordenar siempre que quiero los elementos, simplemente arrastrándolos. Además, también te permite cerrar un programa con el botón central del ratón, como se suele hacer con las pestañas de los navegadores, por ejemplo.

Así que ahí queda la recomendación para los que trabajen con muchos programas, y quieran tenerlos ordenaditos.

domingo, 3 de octubre de 2010

Lanzadores

Siempre he pensado que la analogía del escritorio está muy bien conseguida en los ordenadores. Todos tenemos en nuestro escritorio físico una serie de objetos: documentos, carpetas, el teléfono, un lapicero, el ordenador, un calendario, alguna planta... Y en mi opinión el estado del escritorio dice mucho de su dueño. Los hay perfectamente ordenados, con los documentos alineados y cada cosa en su sitio, y los hay que el simple hecho de verlos produce verdadero agobio.

Con el escritorio del ordenador sucede exactamente lo mismo. Siempre he sido partidario de tener el escritorio lo más libre posible. Encender el PC y encontrarse con 7 Words, 4 Excels, 6 carpetas, 3 PDFs, 25 txts... disgregados por la pantalla, es estresante. Y a este punto se llega porque no vemos el escritorio como lo que posiblemente debería ser: un lugar de paso para los elementos con los que se está trabajando.

En nuestro día a día pasan por nuestras manos decenas de folios; los sacamos de una carpeta, escribimos en ellos, los apilamos, los echamos a un lado, los recuperamos al rato... pero si somos medianamente organizados, al final del día los cogemos, y los devolvemos a su carpeta, archivador, armario, expediente, o lo que corresponda.

En el ordenador deberíamos trabajar de forma similar. El escritorio debería ser un espacio impoluto al comenzar nuestra jornada. Si tenemos que descargar un fichero de Internet para revisarlo, ver si nos interesa, usarlo sólo por un rato..., está bien ponerlo en el escritorio, pero lo que no es normal es que dos meses después siga ahí el instalador del Winrar, lleno de polvo.

Otro habitante habitual del escritorio es el acceso directo. Estamos acostumbrados a acceder a los programas que utilizamos con mayor frecuencia desde él, para evitar tener que navegar perdidos entre carpetas hasta encontrar sus ejecutables. Pero siguiendo la misma norma, el escritorio no es el lugar apropiado para ello.

Por eso recomiendo el uso de programas lanzadores. Estos programas permiten arrancar una aplicación en cualquier momento, utilizando únicamente el teclado. Suelen funcionar activándose mediante una pulsación de teclas como puede ser doble-ctrl, y ofrecen una entrada en la que podemos especificar el nombre del programa que queremos ejecutar. Así, sin necesidad si quiera de utilizar el ratón, podemos ir accediendo a las aplicaciones que nos interese.

Como ejemplos recomiendo Launchy y Google Desktop. El primero es específicamente una aplicación para lanzar programas, mientras que el segundo ofrece esta posibilidad entre muchas otras opciones.

Personalmente prefiero el Google Desktop porque no requiere ningún tipo de configuración, y te permite lanzar cualquier cosa de tu ordenador: programas, documentos, vídeos, páginas Web... aunque también utilicé Launchy durante un tiempo, y me fue muy bien.

martes, 28 de septiembre de 2010

Fijar una vista para todas las carpetas en Windows XP

En Windows XP tenemos la posibilidad de elegir entre varias vistas distintas cuando estamos utilizando el explorador de archivos: vistas en miniatura, mosaicos, iconos, lista y detalles (se seleccionan en el menú Ver, o en el botón Vistas de la barra de botones estándar).

Cada una de ellas tiene sus particularidades, y el decantarse por una u otra es algo que depende exclusivamente de preferencias personales. En general cada cuál es más interesante en función del contenido de la carpeta que se está explorando. Por ejemplo, la vista en miniatura está muy bien para trabajar con carpetas de imágenes o vídeos.

Por defecto Windows utiliza un tipo de vista concreto (creo que mosaicos) para todas las carpetas del sistema. Si queremos utilizar otra para explorar una capeta no hay más que cambiarla, pero, ¿cómo hacemos que una vista se utilice en todas las carpetas? ¿cómo cambiamos la vista de una carpeta concreta?

En mi caso me gusta trabajar siempre con la vista detalles, que muestra información como el tamaño y la fecha demodificación de los elementos, salvo para la carpeta Mis Imágenes, en la que prefiero la vista en miniaturas.

Para obtener esta configuración no hay más que abrir un explorador y seleccionar la vista que queramos utilizar de forma general. Accedemos después al menú Herramientas - Opciones de carpeta..., y dentro a la pestaña Ver. Lo primero que nos muestra es un cuadro Vistas de carpeta, con un botón Aplicar a todas las carpetas. Si lo pulsamos, la vista seleccionada para la carpeta actual se tomará como vista para todas las carpetas del sistema.

Antes de aceptar los cambios, revisamos las opciones del cuadro Configuración avanzada, en la misma pestaña, y nos aseguramos de que la opción Recordar la configuración de vistas de todas las carpetas está seleccionada. Esto hace que si cambiamos la vista de una carpeta, se vuelva a utilizar cuando volvamos a abrirla. Así podemos aplicar a cada carpeta una vista diferente sin problemas.

Una ayudita adicional: cuando utilizamos la vista detalles, es posible configurar los campos mostrados pulsando con el botón derecho sobre la cabecera; así podemos ver por ejemplo cosas interesantes como la fecha de creación o el propietario.

jueves, 23 de septiembre de 2010

Getting things done!!

Hoy he tenido la ocasión de asistir a una interesantísima charla sobre Getting things done (GTD) dada por D. Joaquín Peña en la ETSII de Sevilla.

GTD es una de tantas alternativas para organizar el trabajo personal (como por ejemplo la técnica pomodoro). Llevo bastante tiempo pensando en aplicar alguna de ellas, y creo que la charla de hoy será el punto de partida definitivo para lanzarme a ello.

Destacando lo que más me han calado, diría que GTD se basa en la idea de que una persona no puede retener en la cabeza todas las tareas pendientes que tiene en su quehacer diario. Este número está limitado a entre 5 y 9 tareas, cuando normalmente tendremos alrededor de 50, si no estamos demasiado ocupados.

Esto hace que caigamos en un estado de estrés, ya que nunca podremos quitarnos la sensación de tener cosas que hacer.

Por tanto, la base del método es el mantener una lista de tareas, en la que recoger todo lo que tenemos pendiente. La lista no tiene que restringirse únicamente al mundo laboral; muy al contrario, debería incluir tareas de cualquier ámbito de nuestra vida: redactar un informe para el jefe, limpiar el coche, pedir cita al médico, comprar un lámpara nueva... eso sí, cada una de esas tareas se encuadra en un determinado contexto. Generalmente todos tendremos al menos dos contextos, el laboral y el personal.

A partir de ahí, el trabajo se realiza siguiendo el ciclo Recopilar - Revisar - Hacer.
  • Recopilar - poner al día la lista de tareas, metiendo las que hayan surgido, y eliminando las que hayan perdido sentido.
  • Revisar - leer tu lista de tareas, y seleccionar aquellas que vayas a hacer.
  • Hacer - ejecutar las tareas seleccionadas.
Esta forma de trabajo te permite concentrarte al máximo en las tareas que has elegido hacer, olvidándote hasta el próximo ciclo de todo lo demás.

Este es el punto de partida. Hay muchas ideas y recomendaciones adicionales, pero de momento mi lista sólo tiene una tarea: hacer mi lista de tareas.

miércoles, 22 de septiembre de 2010

Experiencias con ITIL - El CAU

Tras la introducción que hice con mi punto de visto sobre la implantación de ITIL en los departamentos de informática, voy a contar algunas experiencias relacionadas que he tenido en mi vida laboral.

Uno de los elementos que suelen ponerse en funcionamiento en primer lugar es el Centro de Atención a Usuarios, o CAU. Teóricamente, la función de éste es servir como "interfaz" entre los usuarios y el servicio, de forma que todas las peticiones deberían ser recibidas por el CAU, de acuerdo a los medios establecidos.

Ante una petición de servicio, el CAU llevará a cabo una evaluación, tratará de ofrecer una solución definitiva o, si no está capacitado para ello, un workarround (magnífico palabrejo para referirse a una solución temporal, o apaño, en lenguaje coloquial). Posteriormente, si no ha podido dejar fino el tema, escalará la petición a segunda línea, donde los técnicos se pelearán a fondo con el problema, pero eso ya es otro tema.

Cuando se trabaja con un CAU, lo ideal es establecer unas líneas de comunicación entre este y los usuarios. Por ejemplo, un Sistema de Gestión de Incidentes (una aplicación a través de la que los usuarios pueden registrar peticiones, y esperar a que les contacten), un número de teléfono, etc.

Sin embargo, comentábamos el otro día que lo correcto es estudiar las circunstancias de cada servicio, y adaptar ITIL a nuestras necesidades. Si estamos prestando servicio en una macro-empresa con miles de trabajadores repartidos por el mundo, es lógico y necesario implantar ese mecanismo de comunicación. Sin embargo, si nuestro grupo de usuarios se reduce a unas decenas de compañeros, lo más probable es que el CAU pierda en gran parte su sentido. Cualquier usuario preferirá presentarse directamente en el puesto del técnico de turno, y comentarle en persona su problema para que se lo resuelva sobre la marcha.

La pregunta es, ¿hay que ser estrictos con este tema, y obligar a los usuarios a seguir los cauces de comunicación establecidos? Pues ni tanto ni tan poco. Es normal que los usuarios tiendan a hacer las peticiones directamente, pero lo que no se debe dejar de lado es que el servicio debe prestarse de forma ordenada. Eso implica que todas las peticiones deben ser registradas en el sistema de Gestión de Incidentes implantado, y que deben ser atendidas de acuerdo a las pautas establecidas (prioridades, colas, etc.). En ningún caso se debería permitir que un usuario recibiese una atención más rápida por el hecho de haber ido a hacer la petición en persona. En este caso sí hay que ponerse firmes y decirle a quien toque que se toma nota de la solicitud, y que se le informará cuando corresponda.

Claro que sin exagerar, o acabaremos llegando al conocido extremo de meter al departamento de informática en un sótano apartado del mundo y pasarle la comida a través de un tubito para que no puedan comunicarse con el resto del universo.

lunes, 20 de septiembre de 2010

rownum mayor que...

Cuando trabajamos con consultas en Oracle, disponemos de la pseudo-columna rownum. Se le llama pseudo-columna porque aunque no sea una columna de nuestra tabla, Oracle la añade al resultado de la consulta, poniéndola a nuestra disposición, si la queremos.

El valor obtenido es un número que indica el orden en el que Oracle selecciona la fila de la tabla. Generalmente esta pseudo-columna se utiliza en consultas con una cláusula de ordenación, para obtener los N primeros registros según el criterio de ordenación indicado. Por ejemplo:

select * from (select * from empleados order by salario) where rownum < 10

Es lo que en otros SGBD se consigue con TOP.

Y en este punto es donde uno se ve tentado de ir más allá, y utilizar el rownum para paginar nuestras consultas. Es decir, para obtener, por ejemplo, del décimo al vigésimo empleado con mayor salario.

select * from (select * from empleados order by salario) where rownum <20 and rownum > 10

Sin embargo, nos llevamos la sorpresa de que esta consulta no devuelve datos. Explicar por qué es ligeramente complicado, pero lo intento.

Cuando ejecutas esa consulta Oracle obtiene la ristra de filas, y asigna a la primera el valor rownum=1. Entonces, evalúa la condición para esa fila, y como 1 no está entre 10 y 20, la elimina del resultado. Entonces, vuelve a comenzar el proceso, asignando de nuevo el valor rownum=1, a la que realmente era la segunda fila obtenida. Lógicamente, la condición vuelve a no cumplirse, la segunda fila es eliminada, y el valor rownum=1 es asignado a la tercera fila. Así hasta que nos hemos quedado sin nada.

¿Significa eso que no podemos utilizar una condición de tipo rownum mayor o igual que... en una consulta? Pues no, existe una forma de realizar esta comprobación. Para ello necesitamos que la pseudo-columna evolucione y se convierta en una columna con todas las de la ley. Si realizamos la siguiente consulta

select rownum rnum, empleados.* from (select * from empleados order by salario) empleados

obtenemos la tabla empleados ordenada por salario, con una columna (ya no pseudo-columna) rnum añadida, que asigna un número secuencial a cada una de las filas ordenadas. Por tanto, si sobre esta consulta obtenemos sólo los registros con rnum entre 10 y 20, tenemos lo que queríamos.

select * from (
select rownum rnum, empleados.* from (select * from empleados order by salario) empleados
) where rnum < 20 and rnum > 10

Es importante fijarse en que la consulta original, en la que se obtienen todas las filas de la tabla ordenadas, debe ser siempre la primera en ejecutarse, sin añadir nada. Si por ejemplo intentásemos hacer:

select * from (
select rownum rnum, empleados.* from empleados order by salario empleados
) where rnum < 20 and rnum > 10

Estaríamos obteniendo rnum y ordenando en la misma sentencia. Lo que pasaría entonces es que la ordenación se haría después de asignar los rnum, por lo que estaríamos asignando los secuenciales a las filas sin seguir el criterio de ordenación. La consulta devolvería registros, pero no los que nos interesan.

Para los políglotas, pongo un enlace bibliográfico y todo:

martes, 14 de septiembre de 2010

Google Chrome: Session Manager

Una de las cosas que más me gusta de Google Chrome es la cantidad de plugins que se le pueden añadir para hacer su uso más cómodo. El último que he descubierto es el Session Manager.

Este plugin tiene un funcionamiento muy simple, ya que lo único que hace es almacenar las páginas que tienes abiertas en tu navegador, para que puedas restaurarlas posteriormente. Puede que en un principio no parezca una función demasiado práctica, pero tiene bastantes utilidades.

Por ejemplo, lo primero que hago todas las mañanas al llegar al trabajo es abrir varias ventanas del navegador: el correo de mi empresa, el del Organismo en el que trabajo, y el sistema de gestión de incidentes, como mínimo. Pues con esta herramienta no tengo más que abrir una ventana de Chrome, y seleccionar mi sesión "A currar un poco". Automáticamente se me abrirán las ventanas (o pestañas) con las páginas que necesito.

De la misma forma se podrían tener configuraciones para tareas cotidianas: abrir las cientos de miles de redes sociales a las que estamos suscritos para ver nuestros mensajitos, los periódicos que te gusta consultar, foros técnicos, etc. etc.

Otra situación habitual en mi caso es la que me hace dejar el ordenador encendido de un día para otro, simplemente porque tengo decenas de páginas abiertas que estoy consultando durante mi trabajo, a las que he accedido tras varias búsquedas, y no quiero perderlas para continuar con ellas. Pues ahora no tengo más que guardar mi sesión, y podré continuar exactamente por donde iba cuando quiera. Además así ahorraremos un poco de energía, que siempre es recomendable.


lunes, 13 de septiembre de 2010

Conectar a SQL Server desde SQLDeveloper

SQLDeveloper es una herramienta bastante apañada que ofrece Oracle para realizar los trabajos más habituales de los desarrolladores sobre bases de datos: ejecución de scripts, generación de DDL y DML, navegación sobre los objetos de los esquemas, depuración de bloques PL/SQL, generación de diagramas de bases de datos (ERD)...

Aunque viene preparada principalmente para trabajar con bases de datos Oracle, sirve también para Access, MySQL y SQLServer. Vamos a ver cómo configurarla para este último SGBD. El proceso debería ser equivalente para MySQL, pero a mí no me miren, que no lo he probado.

Como siempre que vamos a trabajar con conexiones a bases de datos, lo primero que tenemos que hacer es localizar el driver adecuado. En nuestro caso necesitamos el fichero jtds-1.2.5.jar; no hay más que pedírselo a Google. Una vez que lo tengamos en nuestro equipo, lo ubicaremos en la ruta jdbc/lib, dentro del directorio de instalación de SQLDeveloper (por ejemplo, C:\Archivos de programa\SqlDeveloper). Para referenciarlo desde la herramienta, accederemos a la opción del menú Herramientas - Preferencias, y dentro, a la sección Base de Datos - Controladores JDBC de Terceros. Ahí añadimos una entrada, y seleccionamos el jar.

Una vez aceptado, podemos acceder al wizard de creación de una nueva conexión. Tras introducir el nombre que queramos darle a la conexión y el usuario/password, tenemos una serie de pestañas que se corresponden con los distintos SGDB. Seleccionamos SQLServer, e indicamos el host y puerto, que normalmente será el 1433. Pulsamos entonces el botón Recuperar Base de Datos. Si la configuración es correcta, nos aparecerán las distintas bases de datos accesibles por el usuario. No tenemos más que seleccionar la que corresponda, y guardar los cambios.


En la lista de conexiones veremos una que destacará sobre el resto por tener el logotipo de Windows, lo que nos indica que es una conexión a SQLServer. No tenemos más que desplegarla y podremos comenzar a trabajar con la base de datos.

jueves, 9 de septiembre de 2010

Rotación de la pantalla

Me he dado cuenta de que últimamente me estoy dedicando demasiado a publicar divagaciones, dejando de lado el objeto tecnológico del blog, así que a ver si me enmiendo un poquito.

En cualquier caso, hoy toco un tema liviano e intrascendente que me ayude a ir retomando la senda correcta. Esta funcionalidad puede seros útil en dos situaciones:

1. De repente os encontráis que a vuestra pantalla se le ha ido la pinza y se ha dado la vuelta, y eso os ha descuadrado.
2. Estáis aburridos en el trabajo, y tenéis ganas de gastarle una broma a un compañero (no tecnólogo, para tener mayor posibilidad de éxito).

Ante todo, por favor, si os encontráis en el primer caso, no giréis vuestro monitor. Vale que sería una solución, pero no podemos darla por válida.

Existe una combinación de teclas, alt gr + cursor, que permite girar la pantalla de nuestro ordenador, orientándola en la dirección del cursor pulsado. Así, si pulsamos alt gr + abajo, nuestra pantalla se dará la vuelta.

Si estás leyendo esto porque 1, no tienes más que pulsar alt gr + arriba, y tu pantalla volverá a la normalidad.

Si no estás aquí por 1, y además 2, ya sabes lo que tienes que hacer. Recomiendo grabar en vídeo la reacción del afectado, porque puede ser bastante interesante.

Por cierto, si la combinación de teclas no surte efecto en tu PC, seguramente sea por tu tarjeta gráfica o drivers; en mi caso es una opción del Intel(R) Graphics Media Acclerator Driver. Si tú también lo tienes en la barra de tareas, puedes acceder a Propiedades de gráficos... En configuraciones de pantalla activas y desactivas la rotación, y en teclas de acceso rápido puedes indicar (y consultar) la combinación de teclas a utilizar.

lunes, 6 de septiembre de 2010

Gmail Labs

Ellos mismos se refieren a este apartado de su correo como experimientos disparatados, y mayormente la definición encaja perfectamente con lo que hacen.

Gmail Labs ofrece una serie de herramientas, opciones... cosas en general, como añadidos al gestor de correo, que desarrollan los cracks de Google y son candidatos a formar parte de la versión final del producto. De antemano advierten que al estar en fase experimental pueden desaparecer sin dejar rastro en cualquier momento.


Yo clasificaría las propuestas de labs en 3 grupos: imprescindibles, interesantes, y simples frikadas.

Entre los imprescindibles destaco Avance de contenido del mensaje, que permite tener una vista previa de los mensajes sin necesidad de abrirlos, y por tanto sin marcarlos como leídos. Esta función es habitual en todos los gestores de correo (la típica vista previa), y Gamil no podía quedarse atrás.

Pero lo que realmente hace interesante a Gmail Labs son los servicios novedosos, "made in Google", que personalmente no había visto nunca antes, y pueden ser muy útiles.

¿Ejemplos? Pues los que más me han gustado son los que analizan los destinatarios de tus correos y te avisan tanto si creen que te estás olvidando de alguien como si creen que te estás confundiendo de persona. Llevo un tiempo con esta función habilitada, y su funcionamiento es magnífico. Por ejemplo, cuando voy a enviar un correo a mi grupo de trabajo, en cuanto escribo las dos primeras direcciones, él me muestra al resto del grupo y me propone agregarlos con un simple clic.

De forma similar, si en mi grupo hay un Enrique, y yo escribo el correo de otro, Gmail me pegará un toque para que me espabile; no sería la primera vez que alguien le envía a su jefe el correo que debería ser para su coleguilla homónimo.

Por si esto no fuese suficiente, otra posibilidad que ofrece Labs es la de concederte un margen de tiempo cada vez que envías un correo para arrepentirte. Otra que también puede salvarte la vida en algunas situaciones.

Y para termianar están las frikadas. Opciones cuya utilidad es cuestionable, pero que tienen sin duda su punto de interés, como poder jugar a la serpiente, utilizar superestrellas para destacar tus mensajes con mayor colorido, o hacer que Gmail vuelva a mostrar la etiqueta beta. En mi opinión la palma se la lleva el test de facultades mentales intactas, que te someterá a una prueba matemática cuando intentes enviar un email a horas intempestivas, para comprobar que te encuentras en un estado aceptable para comunicarte con alguien.

Así que animo a todos a que echéis un vistazo a Gmail Labs, porque ofrece algunos servicios que mejoran mucho la herramienta, y además te pueden hacer pasar un buen rato.

miércoles, 1 de septiembre de 2010

Decompilador de Jasper

A la vuelta de vacaciones me he encontrado con un pequeño problema laboral. Necesitábamos hacer cambios en los informes de una aplicación que fueron desarrollados hace unos añitos, y como en esa época no teníamos repositorio de código, los fuentes no aparecían por ningún lado.

Así que nuestra única opción, descartando rehacer desde cero los informes, claro, era buscar el modo de obtener los ficheros jrxml a partir de los jasper. Esto se puede hacer con un código tan simple como el siguiente.

JasperReport report = (JasperReport) JRLoader.loadObject(jasper.getAbsolutePath());
JRXmlWriter.writeReport(report, jrxml.getName(), "UTF-8");

Donde jasper es un File que apunta al fichero jasper que queremos decompilar, y jrxml es un File que apunta al fichero de destino.

Para evitar tener que montar un proyecto cada vez que necesite conseguir el código fuente de jasper, he creado un programa que permite decompilar un fichero completo de forma rápida. No hay más que arrancarlo, indicar el directorio en que se encuentran los jasper, y el directorio en que se quieren crear los jrxml.


La aplicación se puede descargar aquí.