24 March 2009 (Posted in category Java)

Usando Tweener para lograr Scripted Animations

Un gran complemento a los efectos built-in de Adobe Flex, son las Tweener Animations. Si bien los efectos built-in son robustos, consistentes y funcionan con casi todos los componentes de flex, las Tweener permiten un mayor grado de expresividad en las aplicaciones que hacemos.

Antes de seguir les dejo un ejemplo de lo que se puede hacer con ellas. En esta animacion se muestran 25 circulos de colores en posiciones random, que al recibir un click se animan dentro del movie clip. El size, posiciones x e y y las tansiciones alpha/opacity son controladas por la Tweener library.

Click sobre los circulos para posicionarlos de forma random

Leer más »


Franco Breciano

1 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 5 (1 votes, average: 5.00 out of 5, rated)
Loading ... Loading ...


Posted by Franco Breciano    



16 March 2009 (Posted in category Java)

Performance hacking: materialized views con Oracle

El otro día me puse a tratar de bajar los tiempos de la bandeja de entrada del workflow de jurisprudencia que tenemos acá en La Ley. Veníamos arrastrando el tuning de performance hace bastante y además le prometí a Marta [1] que le iba a solucionar sus problemas.

Si bien Hibernate nos da una serie de herramientas para mejorar la performance controlando la manera en que se va a buscar la información, me encontré con que este caso requería algo más. Desde el punto de vista nuestro, apuntamos a bajar la cantidad de queries que ejecutamos en el DBMS y, especialmente, que esa cantidad de queries no sea proporcional a los elementos que vamos a buscar (n+1) sino que se mantenga, en lo posible, en un número fijo.

Okay, el problema venía por lo siguiente. Vean este snippet en la clase AreaGeografica: Leer más »


Juan Isern

1 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 5 (1 votes, average: 5.00 out of 5, rated)
Loading ... Loading ...


Posted by Juan Isern    



13 March 2009 (Posted in category Java)

Compartiendo datos por toda la aplicación

Muchas veces necesitamos acceder a datos desde diferentes lugares de una aplicación, esto incluye diferentes módulos, diferentes paquetes o jars, y sobre todo diferentes métodos. Muchas veces, el costo de pasar algo por parámetro desde un lugar a otro (incluyendo todos los métodos que se invocan en el medio) es demasiado alto y complicado como para elegir esta opción.

El patrón creacional Singleton, parece ser una excelente alternativa para estas situaciones, sin embargo al usarlo en aplicaciones web o multiusuario surgen problemas de concurrencia, y de accesos desde diferentes hilos que modifican la información que en realidad queríamos guardar.

Es en estos casos cuando podemos utilizar el viejo truco del Singleton ThreadLocal.

Leer más »


Sebastian Rosenbolt

1 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 5 (1 votes, average: 5.00 out of 5, rated)
Loading ... Loading ...


Posted by Sebastian Rosenbolt    



12 March 2009 (Posted in category Java)

Websphere con Intellij IDEA – Debugger hangs

Buenas,

Si bien este post está orientado a los usuarios del mejor IDE de desarrollo (je), los que usen Eclipse también pueden leerlo ya que el problema se les puede presentar.

- Entorno:

  1. IBM Websphere 6.1
  2. Intellij IDEA 7/8
  3. IBM J9 VM (build 2.3, J2RE 1.5.0)

- Problemática:

Leer más »


Matias Baldini

2 votes, average: 4.50 out of 52 votes, average: 4.50 out of 52 votes, average: 4.50 out of 52 votes, average: 4.50 out of 52 votes, average: 4.50 out of 5 (2 votes, average: 4.50 out of 5, rated)
Loading ... Loading ...


Posted by Matias Baldini    



8 March 2009 (Posted in category Java)

Hibernate vs. JPA, part one

El otro día Sebi Kaiser tuvo la grosa idea de proponerme que escribiera un post para clarificar el uso de algunas annotations al mapear modelos en una aplicación basada en Hibernate. O sea, cuándo usar annotations definidas en el estándar (JPA) y cuándo usar las propias del ORM.

Como me encontré que la tenía menos clara que el agua del riachuelo, armé una aplicación de juguete para probar qué pasaba en cada uno de los casos que me acordaba que había problemas

1 – @Entity
Quién no perdió un rato de su vida con un error parecido a esto:

Leer más »


Juan Isern

2 votes, average: 5.00 out of 52 votes, average: 5.00 out of 52 votes, average: 5.00 out of 52 votes, average: 5.00 out of 52 votes, average: 5.00 out of 5 (2 votes, average: 5.00 out of 5, rated)
Loading ... Loading ...


Posted by Juan Isern    



3 March 2009 (Posted in category Java)

Levantando un archivo dentro de un Application Server usando una ruta relativa

Quizas alguna vez les paso de querer levantar un xml, un archivo properties o cierta configuración desde dentro de un Web AS y se encontraron con problemas a la hora de especificar bien la ruta del archivo. Dependiendo donde se encuentre deployada la aplicación (en nuestro caso era un SAP Netweaver) la ruta del mismo es un poco mas que poner solo el nombre del archivo o colocar un una barra invertida adelante.

Luego de varios intentos no lograbamos la forma de cargar un XML para ser usado por XStream ni tampoco la forma de que JFig ubicara su archivo de configuración. Pero a todo eso, Hibernate funcionaba correctamente, de alguna forma estaba encontrando su “hibernate.cgf” con solo especificarle el nombre. Eso me llevo a investigar un poco como era que lo lograba y de esta forma encontrar la solución al problema.

Todo el trabajo recae sobre una clase llamada ConfigHelper ( métodos como findAsResource(String) ), la cual posee algunos métodos para obtener la ruta o cargar archivos, independientemente del sitio donde se este corriendo la aplicación. Si observamos el código fuente (que adjunto mas abajo) podemos ver que intenta buscar el archivo utilizando la ruta del class loader, por lo que es bastante dificil que no lo encuentre.

Leer más »


Sebastian Celestino

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5, rated)
Loading ... Loading ...


Posted by Sebastian Celestino    



19 January 2009 (Posted in category Java, Web Services)

XFire: baja performance clientes de webservices

Cuando empezamos a deployar las aplicaciones que utilizan los servicios del motor de workflow a través de webservices, notamos que en producción las aplicaciones se arrastraban y no sabíamos bien por qué. Mirando descubrimos que por cada pedido al webservice había un “read timeout” y que finalmente al segundo o tercer intento respondía.

Por esta cuestión, un pedido al motor de workflow no demoraba menos de 5 segundos y lo peor es que en ese lapso había cero procesamiento.

Sniffeando las conexiones HTTP saltó que el cliente de XFire envía en todos los pedidos un extraño “Expected: HTTP 100″ en el header HTTP de los posts. Lo cual, según pude leer, indica al server que debe entregar la respuesta en un pedido subsiguiente. La solución es eliminar este elemento del encabezado y de esa forma está todo bien.

Leer más »


Juan Isern

1 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 51 vote, average: 5.00 out of 5 (1 votes, average: 5.00 out of 5, rated)
Loading ... Loading ...


Posted by Juan Isern    



19 September 2008 (Posted in category Java, Web Services)

Webservices firmados con fuego equis + WSS4J

Hola amiguillos, les escribo para contarles algo que estuvimos haciendo en la ley que tal vez le pueda a interesar a alguno, especialmente porque la documentacion que hay dando vueltas es bastante pedorra.
Con Canoa estuvimos desarrollando un motor de workflow que alimentara (actualmente es una sola – una aplicacion oportunista que desarrolla khatcha en flexy) a muchas aplicaciones que consumen servicios de workflow.
Algo que habia quedado poco claro de movida es que esquema de seguridad usar, de hecho, mandamos mails preguntando a ver que onda, y por eso les cuento ahora en que quedo eso. La principal traba que estabamos teniendo es que no hay un manejo centralizado de usuarios, sino que cada aplicacion de thomson maneja localmente los suyos.
Por otra parte, pensamos en que no estaba copante que el workflow manejara autenticacion de usuarios. Actualmente las aplicaciones consumidoras le dan (por scripts de db, etc) sus usuarios al engine de workflow, y cada vez que la aplicacion consume servicios debe pasar ese usuario:password de forma tal que autentique la invocacion.
Nos parecio trucho porque:
1) Si confio en mi cliente hay una autenticacion que esta al pedo. El cliente me tira sus user:pass en algun momento y despues vuelvo a validar contra ese mismo user:pass (que, ademas, hay que mantener sincronizado porque la informacion esta duplicada)
2) Como mecanismo de seguridad, de todas formas, es bastante pobre, porque la informacion de autenticacion viaja en texto plano.
Entonces, la posibilidad de garantizar que quien esta del otro lado es alguno de nuestros clientes usando algo mas sofisticado era lo que necesitabamos, de esa forma podemos prescindir de autenticar usuarios. Surgio lo de la firma digital de los webservices, que nos sirve para garantizar que:
1) Quien esta del otro lado realmente es quien dice ser. Por ejemplo: Si SAE (el CMS de la ley, que va a ser nuestro principal cliente) me invoca un webservice y lo firma, puedo operar ciegamente (dentro de la informacion de workflow que corresponde a SAE) porque es una aplicacion en la cual confio.
2) Como bonus, puedo concluir en que el mensaje que recibi no fue alterado por nadie en el camino.
Sobre como funciona la criptografia asimetrica, la firma digital, y el porque de lo anterior, hay un resumen muy bueno:http://en.wikipedia.org/wiki/Public-key_cryptography
Sobre el estandar de seguridad en webservices: http://en.wikipedia.org/wiki/WS-Security

Bueno, el motivo del mail es entonces contarles como hacer con XFire para implementar la firma de webservices. Segun me parece, con CXF deberia cambiar de nada a poquitisimo.
Para empezar, necesitamos generar pares de claves. El cliente va a necesitar conocer solo su par de claves (publica y privada) mientras que el servidor de ws necesita conocer la clave publica de todos sus clientes interesados en consumir webservices.
Para eso, usamos una herramienta que se llama keytool que viene con la jsdk (keytool.exe)

(del lado del cliente)
% keytool -genkey -alias workflowClientAlias -keypass 123456 -keystore client_store.jks -storepass saraza -dname “cn=clienteSAE” -keyalg RSA

Leer más »


Juan Isern

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5, rated)
Loading ... Loading ...


Posted by Juan Isern