Archivos Mensuales: junio 2007

Pipe and Filter, simple y útil.

Para un proyecto necesitamos hacer un Middleware. Este Middleware consume servicios del BackOffice del cliente, pero no es solo un catalogo de servicios sino que debe actuar como intermediario entre el cliente y los servicios.

Para implementar esta maravilla se me ocurrió mirar el patrón de diseño Pipe And Filter, después de leer con atención me dije que esto podía hacerse extremadamente simple y quedar muy útil.

Entonces en unas 2,5 horas hice el ejemplo que incluyo en este POST. Este es un ejemplo para mostrarlo a los otros Developer del equipo por lo que deben perdonarme algunas barbaridades en la escritura del código, no es un ejemplo de buenas prácticas de codificación.

Aclarado eso, vamos al grano!!

Descripción del Patrón

Lo primero es entender el patrón Pipe and Filter. Este patrón se refiere a una cadena de filtros por los cuales pasa un mensaje (Contexto), desde el inicio al final. Cada uno de los filtros tiene acceso al contexto tanto de lectura como de escritura. Quien controla el armado y ejecución del Pipe es un Controlador. Este controlador lee de la configuración cuales son los filtros y su orden, los carga y le pasa el contexto al primero. Cuando el primero ejecuta le regresa el control al Controlador para que tome el Contexto y se lo pase al siguiente filtro.

 

Diagrama 1: Pipe And Filter

Contexto

El contexto es lo que se comparte entre los filtros. Los filtros tienen que compartir un método de ejecución, es este método el que ejecuta el Controlador para que el filtro se active. La siguiente clase es un ejemplo de una implementación de una clase Contexto.

 

Diagrama 2: Clase Contextooperaciones

 

EL siguiente código muestra la implementación de de la clase contexto. Este contexto es el que se irá traspasando de filtro en filtro para ser usado en la lógica que implementa cada filtro. Aparte de los dos operadores, que se usaran como argumentos en cada filtro, tiene una lista de respuestas dónde almacenará la respuesta de cada uno de los filtros. Así al terminar la ejecución del Pipe se contará con los resultados de cada filtro en la lista.

 

Código 1: Clase Contextooperaciones

 

Filtro

Los filtros componen el Pipe. La idea de los filtros es que expongan un método que los acciones (los ponga a trabajar) y que cuando terminen de ejecutar ese método regresen el Contexto al Controlador del Pipe. En el siguiente diagrama se muestran cuatro filtros los cuales exponen el método interceptar como iniciador del trabajo del filtro.

Diagrama 3: Clases que implementan filtros

El método que los acciona es Interceptar (muy creativo el nombre) el cual recibe el contexto, ejecuta la lógica programada en el filtro y deja el contexto en la propiedad miNuevoContexto para que el controlador del Pipe pueda tomarlo.

El siguiente código muestra la implementación del filtro. Este filtro lo que hace es sumar dos números que lee del contexto y guardar el resultado en una lista de resultados. Esa lista contendrá el resultado de todas las operaciones realizadas en el Pipe, esto es posible porque la lista de resultados está en el contexto y no el filtro.

Código 2: Clase FiltroSuma

Controlador

El controlador es el director de orquesta de este patrón, toma desde la configuración cuales son los filtros que debe cargar y en qué orden. Cuando inicia la ejecución utiliza el contexto y se lo entrega al primer filtro ejecutando su método para gatillar la lógica del filtro. En el ejemplo anterior el método Interceptar.

Diagrama 4: Controlador

 

En el siguiente código se muestra la clase PipeManager, que es el controlador del Pipe. LA instanciarse la clase, se le pasa la configuración XML que contiene los filtros a ser cargados. Una Vez cargados los filtros, el Pipe está listo para ser ejecutado.

Para poner en acción el Pipe es necesario llamar al método Ejecutar pasándolo el contexto inicial como argumento. Opcionalmente hay un parámetro de la ejecución que se llama ExceptionForward. Este segundo parámetro especifica cómo se comporta el Pipe si hay una excepción en alguno de los filtros. Puede comportarse de dos maneras ante una excepción: detenerse o guardar en el log y avanzar.

Código 3: Clase PipeManager

Programa para probar el código

Para probar la implementación hice una aplicación de consola que instancia el controlador pasándole la ruta del archivo XML que contiene la configuración de los filtros. Paso dos, crea el contexto inicial. Luego comienza un loop en el que pide ingresar los dos operadores, los carga en el contexto y ejecuta el Pipe.

Código 4: Clase Program

Configuracion XML

La configuración XML se muestra en el siguiente archivo XML.

Código 5: Xml configuración

 

Los códigos de este ejemplo los pueden descargar aquí.

 

Salu2  

Anuncios

Proyecto Mini ESB DotNet Código Abierto

Hace un tiempo propuse en este espacio una idea que hace tiempo le doy vuelta. Hacer un proyecto de ESB en DotNet que sea Open Source. Ese post pueden verlo Aquí.

He conversado con unas 4 personas y me han dicho que Sí a la idea, lo cual me ha puesto muy contento. Además de las personas que he contactado directamente, hay otro par que leyendo el Blog me han mandado mensajes para participar.

Motivado por la recepción de la propuesta ahora propongo las siguientes etapas para el proyecto.

Etapa Inicial

  • Armar equipo
  • Definir Objetivos
  • Formalizar Alcances y visión.

Etapa Elaboración

  • Identificar referencias técnicas
  • Diseñar el ESB
  • Publicar Diseño.
  • Presentar el proyecto a la comunidad y recibir feedback.

Etapa de Construcción

  • Construcción del ESB
  • Construcción del caso de uso de Ejemplo.
  • Documentar el proyecto.

Etapa de publicación

  • Publicar el Proyecto en Codeplex
  • Presentación del resultado a la comunidad.
  • Celebrar el fin del proyecto. (Esta es la parte que más me gusta)

     

Hoy 27 de junio, dos días antes de irme de vacaciones partimos con esta iniciativa. Esto quiere decir que vamos a "Armar el equipo".

¿Quiénes puedes participar?

En rigor cualquier persona que tenga interés. Esto es un proyecto voluntario / Social, es decir no hay retribución económica por esto y el resultado del trabajo será un Software de uso libre y código abierto a la comunidad. La idea es hacer una contribución desde nuestra realidad a la problemática técnica de las empresas pequeñas y medianas.

¿Cuál es el beneficio de participar?

La respuesta para mí es muy simple, aquí todos aprendemos.

¿Qué requisitos necesito para participar?

Como vamos a desarrollar software es necesario que los miembros del equipo sepan programar, ojalá en DotNet. No hay que ser un genio de la NASA para participar, porque entre los diferentes miembros del equipo nos vamos apoyando para llegar al objetivo del proyecto.

¿A qué me comprometo si me inscribo en el proyecto?

El único compromiso que podemos pedirle a los voluntarios como proyecto es el de "cumplir con los compromisos que asuman". Es decir, si usted se compromete a asistir a una reunión o a escribir un paper, etc, simplemente hágalo. Nadie en el equipo impondrá tareas, los miembros del equipo nos repartiremos las tareas de común acuerdo, es decir cada uno tomará los compromisos que esté dispuesto a cumplir.

¿Cómo se organiza este proyecto?

Esto no es un proyecto de software comercial, por lo que no hay jefe. La idea es que los miembros del equipo se organicen entre pares y avancemos en dirección de cumplir con el objetivo del proyecto.

Ahora, la pregunta del millón de dólares…….

¿Cómo me inscribo?

La inscripción es muy simple. En este mismo POST ponga como comentario los siguientes datos:

  • Nombre ó Nick.

    Ejemplo: Juan Pablo – Liarjo.

  • De que parte de universo es.

    Ejemplo: Santiago de Chile, trabajo en una empresa de tecnología, en el departamento de Desarrollo de Software.

  • BackGround

    Ejemplo: He trabajado en desarrollo de sistemas 10 años. No soy informático sino que estudie Ingeniería Civil Electrónica, Tengo experiencia en DotNEt.

  • Enviar un mensaje privado con sus datos de Contacto

    Ejemplo: Hola Soy Juan Pablo, quiero participar, puse mis datos en el Blog y me correo es XXXX@lala.cl

    Los mensajes privados se pueden mandar usando la funcionalidad del Blog "Enviar Mensaje". Esto aparece al final del post, como Link/opción.

 

Bueno, la invitación hecha el 3 de junio ahora ya está formalizada.

Espero sinceramente que este proyecto sea exitoso, no sólo porque es una idea que se me ocurrió a mí, sino porque sería la primera iniciativa que conozco de la comunidad DotNEt en Chile que enfrenta un tema tan "sofisticado" como un ESB. Por otra parte con el producto que se generará aquí, muchas empresas pequeñas que no tienen acceso a este tipo de tecnologías podrán usarlo, lo que ayudará a acortar la Brecha Digital.

Por último pero no por eso menos importante es que aquí aprendemos todos.

Salu2

PD: Espero que alguien se anote por lo menos 😉

 

¿Cómo hacer un gráfico con Barras y líneas en Reporting Services?

Hoy me preguntaron si se podía hacer en SSRS un gráfico que mostrara dos series de datos en barras y el promedio de las dos en una línea.

La respuesta es Sí.

¿Cómo se hace?

Es súper fácil, primero agregamos las dos series que estarán en el gráfico de barras. Por ejemplo costos y ventas, como muestra la ilustración 1.

Ilustración 1

Luego la idea es agregar una serie que saque el promedio de las dos series de barra y lo muestre como una línea. Para ello en las propiedades del gráfico, vamos a la pestaña Data y agregamos una serie de valores. Esto se muestra en la ilustración 2.

 

Ilustración 2

En el dialogo de creación de la serie se debe agregar el valor de la etiqueta a mostrar, por ejemplo "promedio" y el valor. En el valor usamos las capacidades de SSRS para calcular valores con la siguiente fórmula:

=Avg(Fields!HOras.Costo+Fields!Prom.Precio)

Por último para que esta serie se muestre como una línea y no una barra, como las otras dos, debemos seleccionar la opción Plot data as line como muestra la ilustración 3.

Ilustración 3

El resultado se muestra en la ilustración 4.

Eso es todo.

 

Salu2

Llamar un web servicies programado en java desde un Visual basic 6.0

Me llegó el siguiente mail:

 

Hola Juan Pablo:

Tienes alguna idea de cómo llamar un web servicies programado en java desde un Visual basic 6.0?
Si puedes ayudarme, te lo agradecería.
Que te tengas un buen día.

 

Por supuesto que se puede llamar un Servicio Web desde Visual Basic 6.0. No es tan fácil como se hace en dotNEt pero es posible.

Ahora que el servicio Web este hecho en Java, PHP, Piton, etc..etc… no tiene importancia ya que el propósito de los servicios Web es independencia de la tecnología que los implementa.

Puedes ver los siguientes links con ejemplos:

α.- Calling Web Services from Visual Basic 6, the Easy Way

β.- Microsoft Office XP Web Services Toolkit 2.0

γ.- HOW TO: Integrate a SOAP Toolkit Client with an Apache SOAP 2.2 XML Web Service

δ.- Sending SOAP Requests by Using the SOAP Toolkit 2.0 Client

 

Salu2

Entendiendo la administración de SOA

He aquí un excelente artículo sobre administración de SOA (SOA Management) escrito por Dain Hansen para BEA.

El aspecto de administración es crítico para el éxito de las iniciativas de SOA. Para lograr cumplir con la promesa de lograr agilidad usando SOA no solo es necesario una solida tecnología de servicios sino administrarla de manera efectiva.

En el siguiente link pueden ver una buena introducción al tema de administración.

Understanding SOA Management: What’s in your SOA?

Salu2