sábado, 29 de septiembre de 2012

Procesos de negocio con Activiti

Activiti
Como suele suceder con muchas tecnologías en la plataforma Java tenemos varios frameworks entre los cuales podemos elegir. En el ámbito de los BPMS los principales son Bonita, jBPM y Activiti.

Después de leer el libro jBPM Developer Guide intente hacer un hola mundo con jbpm 5, sin embargo, la API explicada en el libro (jBPM 4) y la de la versión actual (jBPM 5) ha cambiado bastante con lo que los ejemplos del libro son muy didácticos a nivel teórico pero son poco prácticos aún así la teoría de fondo es perfectamente válida para cualquier BPMS por lo que el libro sigue siendo bastante interesante. Con lo que la documentación sobre jBPM según mi opinión deja que desea para el que empieza desde cero. Hay un libro sobre jBPM 5 en proyecto que aún no ha sido publicado, probablemente las cosas mejoran en ese momento para jBPM 5. Por otra parte, según lo que he leído Bonita está más centrado en las personas de negocio y el desarrollador no tiene tanto control sobre los procesos de negocio.

Comparando la API de jBPM 4 con la de Activi tienen ciertas similitudes de hecho los autores de Activiti fueron desarrolladores de jBPM 4 y posteriormente al marcharse a trabajar en Alfresco desarrollaron Activiti basándose en la experiencia aprendida de jBPM 4, tanto la documentación como la API de Activiti me parece que está mejor que la de jBPM 5. De documentación en Activiti ademas del libro Activiti in Action también es una buena referencia la documentación del proyecto.

Algunas diferencias entre Activi, Bonita y jBPM están relacionados con quienes forman parte de la comunidad de desarrolladores, soporte de spring, soporte de reglas de negocio, herramientas adicionales de desarrollo y el propio proyecto. jBPM está integrado con el proyecto Drools (reglas de negocio) y Bonita está más centrado en las herramientas gráficas proporcionadas que en el propio desarrollador con que no se tiene tanto control como con Activiti.

Entrando ya en Activiti, está formado por varias herramientas:

  • Activiti Engine: es el componente encargado de ejecutar los procesos de negocio en la notación BPMN 2.0.
  • Activiti Modeler: es una herramienta con interfaz web para construir procesos en notación BPMN 2.0 que está orientada a los analistas de negocio.
  • Activiti Designer: es un plugin de eclipse para desarrollar los procesos de negocio BPMN 2.0. También sirve para hacer pruebas unitarias y crear los artefactos de despliegue. Esta herramienta está orientada a los desarrolladores.
  • Activiti Explorer: Es una aplicación web para realizar varias operaciones sobre los procesos de negocio como iniciar instancias de los mismos, obtener una lista de tareas asignadas a un usuario así como la posibilidad de desplegar nuevos procesos de negocio.
  • Activiti REST: es una interfaz REST que puede ser consumida por sistemas externos a Activiti. Esta interfaz REST es independiente del lenguaje de programación por lo que puede ser consumida por aplicaciones PHP o .NET. Activiti también, puede ser ejecutado en modo por separado (standalone) o en modo embebido, en un servidor de aplicaciones como Tomcat o JBoss, en el caso del primero podremos acceder a él mediante esta interfaz REST, en el caso del segundo mediante la propia API de Activiti.
Después de descargar Activiti desde la página de descargas podemos empezar a mancharnos las manos rápidamente descomprimiendo el archivo en una carpeta ejecutando la siguiente linea de comando desde la carpeta de $ACTIVITI_HOME/setup:

Esta demo iniciará todo lo necesario para empezar, arrancará una base de datos H2, creará en ella las tablas con las que trabaja Activiti y lanzará un navegador para que podamos acceder a la herramienta Activiti Explorer en la que podremos iniciar sesión con el usuario kermit y contraseña kermit.


Las tablas de la base de datos de Activiti siguen una nomenclatura según la cual todas las tablas de Activi empiezan por ACT luego tienen un discriminador como HI (de history), RU (de runtime), RE (de repository) e ID (identity, para usuarios y grupos). En estas tablas se guarda la información de las propias definiciones de los procesos, de las variables en su ejecución, datos históricos, etc...


Vamos a ver un ejemplo sencillo de un proceso de negocio con Activi que será el típico Hola Mundo, empezamos por el xml en notación BPMN del proceso:

Todo procesos comienza con startEvent y acaba con endEvent, contiene varias sequenceFlow para dirigir de un nodo a otro y entre startEvent y endEvent hay una serie de nodos que irán realizando las tareas del proceso, en el ejemplo scriptTask contiene un trozo de código en este caso en lenguaje groovy que emite un mensaje a la consola.

Y ahora el caso de prueba con JUnit:

Lo interesante de este test JUnit está en las anotaciones. @Rule permite inicializar Activiti con cierta configuración y nos proporcionará la referencia al objeto, activitiRule, con la que podremos trabajar en el test con Activiti, @Deployment se encarga de desplegar en Activiti el proceso de negocio indicado y con activitiRule.getRuntimeService().startProcessInstanceByKey iniciamos la ejecución una instancia del proceso. La salida de este proceso sería la siguiente, en ella se ve el mensaje emitido dentro de la ejecución del proceso desde el scriptTask y el mensaje del propio test:


Un programa para ejecutar el proceso sería el siguiente aunque probablemente en un entorno real no necesitásemos hacer algunas cosas como iniciar la base de datos donde se persistirán los datos del proceso (Server.createTcpServer().start()):

Este ejemplo es muy sencillo y sirve principalmente para hacerse una idea del código necesario para trabajar con Activiti pero no muestra todas sus posibilidades que aprovechándolas el código de nuestro proyecto se puede simplificar enormemente y nos permitirá eliminar mucho código spaghetti, será más fácilmente mantenible y probablemente sea menos propenso a errores ante los cambios que se produzcan.
En el siguiente repositorio de GitHub está el código fuente completo del ejemplo junto con otros que vaya añadiendo a medida que vaya aprendiendo más cosas de Activiti.

Referencia:
Conceptos sobre procesos de negocio (BP, BPM, BPMS, ...)
Usar variables en un proceso de negocio con Activiti
Tratamiento de errores en procesos de negocio con Activiti
Reglas de negocio con Drools y Activiti
Código fuente del ejemplo Hola mundo con Activiti

viernes, 21 de septiembre de 2012

Conceptos sobre procesos de negocio (BP, BPM, BPMS, ...)

Toda empresa realiza una serie de actividades para lleva a cabo el trabajo o servicio que efectúa. A este conjunto actividades relacionadas se les conoce como bussines process (BP). Dado que los procesos de negocio forman parte de lo más basico de la empresa se entiende que son importantes ya que sin ellos no habría actividad y en la medida en que se lleven a cabo esos procesos de negocio de forma rápida, eficaz y eficientemente dependerá la el buen o mal desarrollo de la misma. La definición formal de BP es:

«Sequencia de tareas que se realizan en cierto orden por sistemas o humanos para conseguir un objetivo de negocio.»

Las partes de esta frase son:

1) «Sequencia de tareas que se realizan en cierto orden»: Las tareas son las actividades que desarrolla la empresa para la consecución de los objetivos de negocio. La palabra secuencia impone cierto orden en las tareas de forma que cuando termina una se pasa a la siguiente hasta llegar a una última en la que se da por terminada el proceso y completado el objetivo de negocio. Algunas definiciones de tareas serían:
  • Comprobar disponibilidad de producto
  • Calcular precio
  • Obtener servicio mensajería
  • Enviar producto
  • Realizar cobro

2) «en cierto orden por sistemas o humanos»: Las tareas pueden realizarse por las personas o por sus sistemas informáticos. Se diferencia entre unos y otros porque los sistemas informáticos son rápidos y realizan las tareas normalmente de forma inmediata. Sin embargo los humanos son lentos (tardan en comprobar datos, tienen que hacer llamadas, ...) y realizan las tareas cuando están disponibles (puede coincidir que están de vacaciones, están ocupados con otras tareas, ...).

3) «para conseguir un objetivo de negocio»: La finalidad es conseguir un objetivo de negocio que es la principal razón por la que la empresa realiza su actividad. Lo difícil será identificar los objetivos de negocio importantes o principales de la empresa.

Este podría ser el esquema de un proceso de negocio (visión de alto nivel cercana al gestor) de una empresa dedicada a reciclar papel.


En este grafo pueden verse las actividades, la secuencia de las mismas en el grafo dirigido y los roles de las personas que involucradas en el proceso.

Los procesos de negocio no son estáticos sino que evolucionan a medida que se identifican mejoras o cambian los objetivos de negocio. Por lo tanto hay que adaptarlos a las necesidades reales del negocio a medida que cambian. A estas actividades se les conoce como Bussines Process Management (BPM) y se realizan de forma iterativa con los siguientes estados:
  • Identificar (encontrar/descubrir) procesos de negocio: identifica los objetivos de negocio y tareas que realiza para su consecución.
  • Diseñar/modelar: transforma la definición del proceso de negocio en un modelo formal por todos y sin ambigüedades posiblemente con una notación BPMN (Bussines Process Management Notation). BPMN usa grafos dirigidos, que se componen de nodos que presentan las tareas a ejecutar y las transiciones que dirigen el proceso de un nodo a otro.
  • Ejecutar los procesos: guía el flujo de trabajo de la compañía de forma que se de una buena comunicación entre sistemas y personas.
  • Mejorar: analizando las ejecuciones de los procesos y con la información recopilada se pueden realizar acciones para mejorar el proceso. Identificar cuellos de botella o identificar nuevas actividades o si pueden ser realizadas de forma paralela.
Los procesos de negocio se pueden definir en papel y en ellos no tienen por que intervenir sistemas informáticos para realizarlos sino que las personas son las encargadas de realizarlos completamente. Sin embargo, dado que en mayor o menor medida ya muchas empresas confian en sistemas informaticos para apoyarse en la realización de sus actividades automatizarlos puede suponer varias ventajas, en ese caso se llevan a cabo con sistemas BPMS (Bussines Process Management Systems) siendo los encargados de dirigir y ejecutar los procesos.

Algunas ventajas que aporta BPM a las empresas son:
  • Los procesos son representados en un lenguaje formal (BPMN) con lo que conocemos exactamente lo que hace, no una idea vaga, sabemos exactamente cual es el objetivo de negocio y que roles participan, esto permite mejorarlos identificando puntos de fallo y buscar soluciones.
  • Se produce una interacción ágil entre sistemas y roles: los empleados son guiados en su trabajo, se les proporciona la información que necesitan y se les pide la información necesaria para avanzar en el proceso. La información fluye y está disponible para todos los que la necesitan evitando ineficiencias.
  • Se pueden realizar acciones automáticas en función de la información recopilada en el proceso tal vez a través de sistemas BRMS (Bussines Rules Management Systems) facilitando el trabajo a las personas.
  • Se dispone de información en tiempo real. Se puede obtener las instancias de los procesos en ejecución, en que actividad están parados o que rol necesita completarla.
  • Visibilidad de los procesos tanto para negocio como para los desarrolladores y para todas las personas implicadas.
  • Se pueden realizar análisis de procesos: Se puede ver si se está pidiendo información innecesaria o si necesita más datos.
  • Proporcionan estadísticas y medidas para identificar cuellos de botella.
Además de las ventajas anteriores para los desarrolladores también tiene otras no menos importantes. Y es que permite eliminar las condiciones, bucles, switchs, timers, tratamiento de errores que serían necesarias para implementar el proceso de negocio con un lenguaje de programación como Java o C# que dan como resultado mucho código que es poco flexible, difícil de mantener, propenso a introducir errores cuando se modifica, esto es, un perfecto código spaghetti. Además de que cuando el proceso de negocio se transforma a código deja de estar visible para la gente de negocio e incluso para los desarrolladores es dificil saber lo que hace pasado el tiempo y tras varias modificaciones.

Hay varios BPMS disponibles incluso con licencias de software libre, entre los más conocidos están jBPM, Bonita y Activiti.

Aunque se trata de un libro algo antiguo y ya su código no refleja los cambios de la versión de jBPM 5 jBPM Developer Guide me ha parecido bastante interesante por su teoría básica y principios que expone de los BPMS, también está la versión para jBPM 5 que tendrá sus ejemplos de código más acorde a las últimas versiones de jBPM. Aún siendo libros de jBPM muchos de sus conceptos son aplicables a cualquier BPMS como Activiti o Bonita.El libro Activiti in Action no se centra tanto en la teoría como los anteriores sino que se restringe y explica perfectamente como se desarrollan los procesos de negocio con el framework Activiti dejando la teoría para otros libros.

jBPM Developer GuidejBPM 5 Developer GuideActiviti in Action

Para otra entrada trataré de hacer el típico hola mundo o algo un poco más complejo con uno de estos frameworks de BPMS y también con Drools, que permite implementar las reglas de negocio, para aplicar todos estos conceptos a nivel de un desarrollador.

Referencia:
Procesos de negocio con Activiti
Usar variables en un proceso de negocio con Activiti 
Tratamiento de errores en procesos de negocio con Activiti
Reglas de negocio con Drools y Activiti
jBPM
Bonita
Activiti

viernes, 14 de septiembre de 2012

Guía para aprender a usar Vim

Vim
Vim es un potente editor de texto con características que ya quisieran para si varios de los editores que los desarrolladores usamos a diario en nuestro trabajo. Todas las operaciones como cortar, pegar, eliminar, buscar, reemplazar, resaltar sintaxis, visalizar lineas de archivos, ir a un número de linea concreto y muchas más pueden realizarse de forma eficiente y rápida. Una de sus principales características es que se basa en modos dependiendo de los cuales las teclas tendrán diferentes funciones. Los dos principales modos son el modo normal, en el que prácticamente cada tecla tiene una función asignada, y el de inserción. A primera vista las teclas asignadas a cada función parecen puestas aleatoriamente, pero no es así, la disposición elegida de las mismas tiene como objetivo que no tengamos que mover ni desplazar las manos del teclado de modo que se consigamos gran rapidez al editar los archivos.

Otro de los motivos que nos puede motivar a usarlo es que al ser un programa que se usa desde el terminal y sin interfaz gráfica consume muy pocos recursos (unos pocos megas) comparado con lo que consume cualquier IDE con interfaz gráfica (varios cientos de megas) y se muestra ágil incluso con archivos grandes de varios megas allí donde editores como gedit o eclipse se atascan al leerlos, Vim es capaz manejarlos sin problemas.

Una de sus desventajas es que es poco intuitivo para el usuario recien llegado y para usarlo de forma corecta, eficiente y rápida requiere aprender a como manejarlo con una curva de aprendizaje alta. Para la tarea de aprender a usarlo lo mejor es leer un manual que nos permita aprender al menos los comandos básicos para empezar a trabajar con él aunque en un principio no lo hagamos de forma eficiente y usando todas las características que vim ofrece, a medida que vayamos leyendo y aprendiendo del manual y usemos los comandos iremos conociendo nuevos que nos permitirán hacer más o mejor las cosas. Un buen manual para empezar a usar vim es el «Vim Book» que se encuentra dispponible en la sección documentación de Vim. Si en algún momento tenemos dudas necesitamos ayuda siempre tendremos a nuestra disposición la ayuda de vim con el comando «:help» y si necesitamos ayuda de una determinada tecla podemos utilizar el comando «:help [tecla]».

Hasta ahora usaba nano y siendo este un editor sencillo que cumple su función permitiendo editar archivos rápidamente sin tener que aprender como usarlo, se queda corto a medida que necesitamos funciones más avanzadas por lo que la evolución será pasar de nano a vim o a otra alternativa como emacs.

Entre las características que posee vim están:
  • Corrector ortográfico integrado
  • Autocompletado de texto
  • Navegación por pestañas
  • Ventanas múltiples, que dividen el área de edición horizontal o verticalmente
  • Resaltado de sintaxis dependiendo del lenguaje de programación o de etiquetas utilizado
  • Órdenes deshacer y rehacer
  • Más de 200 sintaxis diferentes
  • Lenguaje de scripting para programar extensiones
  • Completado de órdenes, palabras y nombres de ficheros
  • Compresión y descompresión de ficheros, que posibilita editar ficheros comprimidos
  • Reconocimiento de formatos de fichero y conversión entre los mismos
  • Historial de órdenes ejecutadas
  • Grabación y reproducción de macros
  • Guardado de la configuración entre sesiones
  • Plegado automático y manual de código
  • Interfaz gráfica opcional
  • Altamente configurable y personalizable
  • Casi 100% compatible con vi, pero sin muchos de sus defectos

En los siguientes enlaces una presentación y varias chuletas con las teclas y combinaciones más básicas de teclas:

https://training.linuxfoundation.org/linux-tutorials/introduction-to-vim
http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html
http://www.tuxfiles.org/linuxhelp/vimcheat.html

Referencia:
http://www.vim.org/
http://es.wikipedia.org/wiki/Vim
http://www.vim.org/6k/features.es.txt

viernes, 7 de septiembre de 2012

systemd, reemplazo de sysvinit

En los sistemas UNIX el primer proceso que se crea y se encarga de inicializar el resto de procesos se le conoce como init. Desde 1980 esta tarea era llevada a cabo por «System V init» (sysvinit). Sin embargo, dado que en sysvinit los servicios se lanzan en un orden determinado y los dispositivos actuales son muy diversos y dinámicos está dejando de ser adecuado para estos tiempos. En el 2006 Canonical desarrollo Upstart con el objetivo de crear un reeemplazo para sysvinit. Upstart es sistema dirigido por eventos de tal forma que cuando ocurre cierta circunstancia se hace alguna acción, como «el dispositivo de red se ha montado», soportando mejor de esta forma la dinamicidad del los sistemas. Upstart parecía el sucesor de sysvinit, sin embargo, la migración de sysvinit a un sistema dirigido por eventos como upstart no es sencilla.

systemd fue lanzado en 2010 por Lennart Poettering, conocido también por desarrollar pulseaudio, también como un reemplazo de sysvinit. systemd está comenzando a reemplazar a sysvinit como el proceso encargado de arrancar el sistema en varias distribuciones como Fedora, openSUSE, Mandriva y Arch Linux por varias de sus características.

systemd activa todos los sockets que utilizan los procesos para comunicarse antes de que ninguno sea arrancado de forma que estén disponibles para cuando lo hagan, una vez inicializados los sockets systemd inicia todos los procesos en paralelo sin ningún orden preestablecido o bajo demanda cuando se envía un mensaje a su socket. Cuando un proceso necesita de otro se comunica a través de los sockets, si el proceso destinatario aún no no está disponible para recibir el mensaje systemd lo encola para que no se pierda y lo despacha cuando el proceso destintario está disponible. De esta forma se consigue un paralelismo total entre los procesos que inician el sistema.

Aqui una comparativa de sysvinit, upstart y systemd:


Si quieres conocer más acerca de systemd te recomiendo leer el siguiente excelente artículo y la documentación incluida en su referencia parte de la cual está en el apartado de referencia, también algunas de las ventajas puestas en un post del los foros de arch linux que independientemente de las mejoras de tiempos (esto igual es lo menos importante de systemd) están que los servicios pueden ser proporcionados por los proyectos originales en vez de ser cada distribución la que los desarrolle y la no necesidad de configurar explícitamente las dependencias.

Si usas Arch Linux y has echo una actualizanción completa hace menos de una semana ya tendrás todo lo necesario para iniciar el sistema con systemd y realizar la migración. Los pasos serán los siguientes:

  • Lo primero será adaptar los archivos de configuración a systemd. Basicamente lo que antes estaba en el archivo /etc/rc.conf ahora está separado en varios archivos.
  • También hay que indicar a systemd los servicios que queremos arrancar con el sistema a través de «systemctl enable [servicio].service», para ello miraremos la lista de DAEMONS del archivo en /etc.rc.conf e iremos habilitando su correspondiente en systemd.
  • Luego iniciaremos el sistema con systemd añadiendo en la linea de comando del kernel init=/bin/systemd y quitando la opción quiet para ver las trazas y si se produce algún error. Esto se puede hacer sin modificar ningún archivo desde grub2 editando la entrada con la tecla «e» y una vez modificada la linea de comando pulsando F10.
  • Finalmente, si todo ha ido correctamente en el inicio con systemd podremos eliminar el paquete initscripts e instalar systemd-sysvcompat con lo que tendremos un sistema puro de systemd.

Pero antes de nada es muy recomendable leer algo de documentación sobre lo que se va a hacer empezando por la wiki de arch linux sobre systemd. Decir que aún hay algunos programas que no tienen su correspondiente .service para iniciarlo desde systemd pero se solucionará con el tiempo.

Después de todo veremos a systemd como el proceso con PID 1:


Referencia:
http://freedesktop.org/wiki/Software/systemd
http://en.wikipedia.org/wiki/Systemd
http://diegocg.blogspot.com.es/2010/05/systemd-otro-reemplazo-de-init.html
http://www.h-online.com/open/features/Control-Centre-The-systemd-Linux-init-system-1565543.html
http://0pointer.de/blog/projects/systemd.html
http://0pointer.de/blog/projects/socket-activation.html
http://0pointer.de/blog/projects/socket-activation2.html
http://0pointer.de/blog/projects/why.html
http://gespadas.com/archlinux-systemd
https://bbs.archlinux.org/viewtopic.php?pid=1149530#p1149530