viernes, 25 de junio de 2010

Recorriendo una secuencia de entrada con OpenESB

Como continuación al artículo en que comenzaba a hablar de los ESBs, y puente hacia un futuro tutorial más elaborado, explico hoy un caso que me ha resultado particularmente difícil de resolver, dado que no he encontrado muchos ejemplos.

Este mismo ejemplo lo he publicado en la Web DebugModeOn.

Poniéndonos en situación, tenemos un fichero xml que será la entrada a nuestro proceso Bpel, que contiene un elemento complejo, compuesto por una secuencia de elementos simples. Sirva como ejemplo el siguiente xsd.




        
            
                
                    
                        
                        
                  

Generamos un Bpel que lee esta información, y lo que queremos es que realice el mismo procesamiento para cada una de las temperaturas que se encuentre en la entrada. ¿Cómo lo hacemos? Tendremos que usar la actividad estructurada forEach, y configurarla como se muestra en la imagen.


Como comienzo para el contador utilizamos el valor 1, y como final la expresión count($PollIn.part1/ns0:Temperatura), donde PollIn es la variable de entrada al Bpel, leída del fichero xml, y que se evaluará como el número de temperaturas obtenidas.

A continuación tenemos que añadir al bloque forEach una actividad Assign, en la que cogeremos cada una de las temperaturas y haremos con ellas lo que corresponda. Si accedemos a la vista de mapeo de la asignación, veremos que dentro del mensaje PollIn, desplegando el árbol, hay un único elemento Temperatura, con sus atributos por debajo. Pues bien, si clicamos con el botón derecho sobre Temperatura, y seleccionamos la opción addPredicate() se abrirá otra ventana muy similar al propio mapeador. En ella asignaremos el contador del bloque forEach (que en nuestro caso se llama forEach1, ya que no lo hemos renombrado), al predicate que se muestra en el lado derecho.


Una vez hecho esto, en la vista de mapeo veremos que se ha creado un nuevo nodo por debajo de PollIn, con nombre Temperatura[$forEach1Counter]. Este elemento será el que contenga en cada iteración del forEach el valor actual, por lo que de él ya podemos obtener la información que nos interesa para continuar con el procesamiento.

Próximamente, un tutorial con un ejemplo de OpenESB que incluirá esta solución en un contexto más amplio.

jueves, 24 de junio de 2010

Capturando pantallas - SnagIt!

Supongo que una gran mayoría de la gente supondrá que no queda nadie que no conozca este tipo de herramientas. Pero apostaría a que sí.

Todos nos hemos enfrentado alguna vez a la necesidad de obtener una captura de nuestra pantalla, por ejemplo para poner una bonita imagen en nuestro blog, que ilustre lo que estamos explicando. O bien, en el caso extremo, porque estemos realizando algún documento en el que describimos un proceso realizado con el ordenador, y queremos ilustrarlo; por ejemplo, un manual de usuario.

Como para casi todo, existe una alternativa rudimentaria. En este caso, utilizar el botoncito Impr Pant, que significa imprimir pantalla, pero que realmente no la imprime, sino que la envía al portapapeles para que podamos pegarla donde queramos. Ahí entra en juego el maravilloso Paint, en el que podemos poner la imagen, recortarla, volverla a pegar, redimensionarla, guardarla... y quedarnos tan felices.

Pero existen opciones más recomendables si queremos agilizar nuestro trabajo, y son las herramientas como SnagIt!.



Esta aplicación te permite realizar capturas de toda la pantalla, de una ventana concreta... incluso cuando ésta tiene una barra de desplazamiento y no cabe entera en la pantalla. Por lo que podemos concluir que aporta ciertas ventajas respecto a nuestro querido amigo "el Paint".

Eso sí, esta herramienta en concreto tiene un importante inconveniente que es requerir de licencia para su uso. Así que si no queréis gastaros los cuartos, podéis tirar de alternativas libres como MWSnap y Free Screen Capturer.

miércoles, 16 de junio de 2010

¿Que no me dejas borrarlo? -> Unlocker

Los sistemas Windows tienen una innegable pasión por bloquear archivos, algo que en determinados momentos puede acabar resultando enervante para sus usuarios. Especialmente cuando les da por bloquear archivos que quieres eliminar, y que por más que él insista, nadie está utilizando.

Es en estos casos cuando aparece el clásico mensaje: 

No se puede eliminar X porque está siendo usado por otra persona o programa. Cierre todos los programas que puedan estar utilizando este archivo e inténtelo de nuevo.

Vale que hay casos en que la situación no es problemática, porque rápidamente ves que efectivamente tenías abierto el archivo; un despiste que puede tener cualquiera, así que cierras el programa que lo acaparaba, repites la operación, y ya está.

O no... Porque, como he dicho, a Windows parece que le entusiasma el mensajito, y ahí que te lo suelto una y otra vez, pese a que, por más que revisas, no encuentras ninguna aplicación utilizando tu fichero objetivo. Cuando tu barra de tareas es completamente gris, y tu cabeza se va poniendo roja, todavía te queda el recurso de acceder al administrador de tareas y empezar a cargarte procesos a ver qué pasa, pero la realidad es que ese arreón destructivo no te aportará mucho.

Por suerte tenemos una utilidad maravillosa, con un logo que no puede estar mejor elegido, que hará que esos procesos invisibles que se están cachondeando de ti desaparezcan por arte de magia: Unlocker.


Esta pequeña aplicación se puede configurar para arrancar con el equipo, y aguardará agazapada a que Windows se ponga chulo para saltar y cargarse de un plumazo tus problemas. Te dirá qué procesos son los que están bloqueando tus archivos, permitiéndote liberarlos; e incluso, si no encuentra ninguno, te dará la opción de hacerte el trabajo sucio, demostrándote que cargarse un fichero no es tan difícil por mucho que tú no seas capaz de hacerlo.

Así que nada, os lo recomiendo enormemente, puesto que seguro que más de una vez os echará un buen cable.

viernes, 11 de junio de 2010

¿SringTokenizer deprecated?


Hoy, con muchos años de retraso, me he enterado de que la clase StringTokenizer ha sido deprecada. Bueno, técnicamente no, porque en el API no aparece como tal, pero desde Java 1.4 se incluye este claro mensaje en la descripción de la clase.

"StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead."

Que viene a decir que no se recomienda el uso de la clase porque hay un alternativa mejor: el método split de la clase String. En la propia descripción de la clase hay un ejemplo de uso de este nuevo método, que no tiene mayor complejidad.

Lo que no entiendo realmente es por qué razón no se marca la clase como Deprecated si, atendiendo a ese texto, lo está a todos los efectos. Llevo años utilizando la clase sin saber que su uso no está recomendado, dado que en ningún momento ha habido un compilador capaz de avisarme de ello. Además, es lógico pensar que la mayoría de la gente que entra a consultar el API no se pare a leer todo el rollo que nos suelta la gente de Sun, y se vaya directamente a ver la definición de los métodos, que es lo que normalmente uno necesita.

Lógicamente me surgen dudas, ¿cuántas clases habrá en el vasto API de Java con advertencias similares a esta? ¿Por qué no las hieren de muerte? ¿Debería existir otro estado para clases "no recomendadas"? ¿En qué se diferencian de las deprecadas?

Seguiremos investigando...

jueves, 10 de junio de 2010

Enterprise Service Bus

A raíz de un trabajo del Máster que estoy realizando surge el artículo de hoy, que sirve como introducción a otro término que se ha abierto hueco en el vocabulario informático. Lo que ocurre con este y muchos otros términos (como framework, componente, etc.), es que se ponen de moda y empiezan a usarse para prácticamente todo, y a colarse en todas las presentaciones de marketing, sin que quede claro cuál es su significado real.

Comenzando por lo más básico: ESB = Enterprise Service Bus = Bus de Servicio Empresarial.

....

Efectivamente, el nombre no es que diga mucho, pero el concepto hace referencia a un paso más en las tecnologías de integración de aplicaciones. En este ámbito se partió del punto a punto, en el que era necesario que las aplicaciones a conectar utilizasen la misma tecnología y que su ubicación fuese conocida. De ahí se evolucionó hacia los middlewares, que ofrecían un registro centralizado, pero mantenían una alta dependencia tecnológica. Un paso más se dio con los Hubs de Integración, que sí ofrecían esta independencia, y la posibilidad de definir procesos de integración, pero que no dejaban de ser un middleware mejorado...

Y ahí aparecen los maravillosos ESBs. Se establecen estándares W3C, se proveen conversores de protocolos, lenguajes de orquestación, abstracción de la tecnología... Y un montón más de ideas súper interesantes.

Pero... ¿qué significa todo esto? Pues resumiendo, que un ESB es una herramienta que nos ofrece la posibilidad de comunicar elementos de software de distintas tecnologías (conocidos como assets, o activos). Dentro de una compañía es normal tener bases de datos, un servidor de correo, servicios Web, ficheros xml, y un sinfín de unidades cuya interacción es deseable.

El ESB pretende evitarnos el trabajo de tener que realizar los desarrollos para esta integración, aportando básicamente tres elementos.
  • Bindings Componentes - que nos abstraen de las diferentes tecnologías (bases de datos, ficheros, servicios Web...), permitiéndonos acceder a ellas.
  • Orquestador de servicios - que nos permite definir la forma en que se llevará a cabo la interacción entre nuestros assets.
  • Service Engines - que nos abstraen del servidor de aplicaciones en el que están desplegados los distintos elementos.
Todo esto ha sido recogido en una especificación de la JCP, bajo el nombre de JBI (Java Business Integration). Actualmente existen dos versiones, en las JSR 208 y 312, respectivamente.

Como conclusión habría que decir que la idea detrás de los ESB es realmente interesante, pero que en realidad hay demasiada palabrería alrededor de ella, y que queda mucho por hacer para llevarla a cabo.

En cualquier caso, para ver la idea, en los próximos días intentaré publicar un pequeño tutorial para realizar un proceso de integración. Esa es la mejor forma de comprender qué son y para qué sirven los ESBs.

viernes, 4 de junio de 2010

Comillas en cadenas en Oracle - Operador q

Cuando trabajamos con bases de datos Oracle, el carácter comilla simple ( ' ) es utilizado como delimitador de cadenas de texto. No es raro encontrarnos con la necesidad de utilizar una cadena que contenga este carácter, y para estos casos podemos utilizar una solución muy simple, que consiste en duplicar la comilla para que sea interpretada como parte de la cadena, y no como delimitador:

'El carácter ' delimita las cadenas', sería interpretado como una cadena 'El carácter ', y el resto se tomaría como comandos, por lo que tendríamos un error.
'El carácter '' delimita las cadenas', al duplicar la comilla, Oracle la interpretará como un carácter, e interpretaría la cadena: 'El carácter ' delimita las cadenas'.

Esta es la solución más conocida, pero existe una alternativa, que es la utilización del operador q (como siempre del inglés, quote). Este operador permite indicar que las comillas de la cadena a la que se aplica son texto, y no delimitadores. Su utilización sigue el formato: q'd cadena d', donde d es un delimitador, para el que se pueden usar cualquier carácter (he probado con números, letras y signos de puntuación, y todos son válidos), aunque lo normal es utilizar #, [] o {}, para mayor legibilidad.

Dos formas equivalentes de obtener una cadena con el nombre entre comillas:


select 'La persona ''' || nombre || ''' seleccionada' from persona;
select q'{La persona '}' || nombre || q'{' seleccionada}' from persona;

¡A cual más clara!