sábado, 1 de diciembre de 2012

Mi guía para elección de portátil nuevo

Sony
Intel
Después de muchos meses buscando y comparando (no se cuantos meses exactamente pero más de 18 seguro) finalmente me decidí por un ordenador que pasó mi exigente criterio (o puede que me cansase de esperar), ya llevando unos días con él ha sido una buena elección aunque algunos detalles no me gustan del todo pero es lo mejor que he encontrado y no quería esperar mucho más ya. En esta entrada comentaré mi experiencia y consejos que quizá le ayuden a otra gente en su elección de portátil si está buscando uno. En las siguientes entradas haré el desempaquetado y el análisis del equipo funcionando.

Primeros pasos
Antes de empezar ni siquiera a buscar un portátil es tener una idea del presupuesto, que marca/o que no marca se quiere, tamaño, características que consideramos indispensables que tenga, uso que le vamos a dar y necesidades o modelos de lo que buscamos, con esto empieza la selección y discriminación de entre todas las posibilidades que tenemos. En el mundo del PC tantas que pueden llegar a abrumar y dificultar la elección por eso recomendable tener unos parámetros prefijados, luego podremos flexibilizarlos. En Apple y los Mac es más sencillo, hay menos modelos, la mayoría de gama alta para lo que consideraríamos en los PC y también a precios que a parecidas características son notablemente mucho más caros y están inflados, todo sea dicho. Un Mac no quería ya que son caros y además pretendía instalar Arch Linux en él, así que para esto consideraba que mejor un PC.

Búsqueda de opciones y selección
En mi caso estaba buscando un portátil que pudiese configurar ya que todos los modelos que encontraba en las tiendas o no tenían la cantidad de memoria mínima que quería, la pantalla no tenía la resolución mínima que quería o no tenía la tarjeta gráfica que quería o el microprocesador no era el que quería. Mis requisitos me limitaban bastante la búsqueda (esta es una de las razones por las que he tardando tanto tiempo en decidirme por uno), así que prácticamente tenía como opción pedirlo a un fabricante por internet y en la que pudiese configurar los aspectos anteriores según mi criterio. En el trabajo tengo un Sony Vaio C de unos dos años de antiguedad y la verdad es que estoy bastante contento con él así que para mi Sony era una de las primeras opciones ya que además cumplía con mi necesidad de poder pedirlo por internet y poder configurarlo, al menos el microprocesador, la cantidad de memoria, la capacidad del disco duro, la gráfica y la resolución de pantalla, con esto para mi era más que suficiente. Otra remota opción era un Dell pero teniendo la experiencia del anterior Dell XPS 1530M y comparando ambas marcas he de decir que me quedo con los Sony por bastante diferencia y eso que el Dell XPS era de gama alta, el Sony por el que me he decidido me ha salido casi 250€ más barato de lo que me salió el Dell en su momento y los acabados me gustan más.

Características
Resumiendo las características básicas que buscaba eran:
  • Memoria: 8 GiB mínimo (que tiempos aquellos de 1996 cuando Windows 95 funcionaba con 8 MíB, ahora tenemos ordenadores con ¡1000 veces más memoria!, se ha multiplicado por esta cantidad en ¡16 años!), suelo virtualizar y la memoria es una de las cosas más necesarias para ello. La cantidad de memoria suele ser una de las características por la que los equipos se quedan viejos y empiezan a ir lentos al usar más el disco duro, en estos momentos no es cara, así que, caballo grande.
  • Resolución de pantalla: no tengo monitor externo y suelo programar, así que para trabajar de forma cómoda 1600x900 mínimo para un tamaño de 14" o 1366x768 para uno de 13" o 11". Además ya tenía probado con el portátil del trabajo de 14" una resolución 1600x900 y encantado. Este era un punto al que le daba mucha importancia y peso en mi decisión.
  • Tamaño pantalla: mi límite eran las 14", más me parecen muy grandes para ser transportados, ya 14" me parece grande así que no descartaba algún modelo más pequeño de 11" o 13" que para transportarlos cómodamente son mucho mejores.
  • Tarjeta gráfica: ya que pretendo instalar Linux principalmente buscaba que tuviese una Intel, no tendrá las gráficas más potentes pero creo que tiene el mejor soporte para Linux en sus controladores open source y es una empresa que apoya, participa y colabora bastante en el mundo del software libre por ello me cae bien a pesar de su prácticamente monopolio en microprocesadores para portátiles, Nvidia también tiene buen soporte y rendimiento en Linux pero sus controladores son cerrados (lo siento Nvidia pero tu no eras opción, cuando apoyes el código abierto al menos no digo ya el software libre, la siguiente vez tal vez me decida por una de las tuyas). En el portátil de trabajo tengo una AMD/ATI bastante ridícula de la serie 51xx y ningún problema con sus controladores open soure y rendimiento pero en portátiles hay pocos que vengan con una gráfica de esta marca. Tampoco pretendo jugar a juegos y si lo hago el rendimiento de una Intel me es más que suficiente, no hay que desmerecerla tampoco si se quiere para jugar ocasionalmente y si no se es muy exigente con la calidad es más que suficiente. Otra cosa que no quería era un portátil con una gráfica híbrida, ya que una intel me es suficiente y no iba a sacarle partido a la dedicada pero sobre todo porque en Linux esto me da que todavía no tiene buen soporte y pudiera ser una fuente de problemas. Una Intel HD 4000 de los ahora nuevos Ivy Bridge cumple todo lo que pedía.
  • Microprocesador: Intel o AMD me daba igual cualquier cosa me iba a servir en este aspecto pero finalmente la gráfica Intel de los Ivy Bridge y dado que es prácticamente imposible encontrar un portátil con microprocesador AMD en ningún sitio ya sea en tienda o por internet, Intel era casi la única cosa por la que optar. La única opción de encontrar un AMD era en los netbook de algunos modelos que vienen con un AMD E-1800 y no descartaba del todo esta opción pero tenía dudas de si la potencia de estos micros era suficiente para realizar mis tareas.
  • Disco duro: esta opción no me importaba mucho, ni en capacidad ni en rpm, pero la comento porque algunos portátiles denominados ultrabooks vienen con un disco SSD que actúa de cache combinado con disco normal para el almacenamiento. No quería esta opción porque en windows funcionará perfectamente pero en Linux nuevamente puede ser una fuente de problemas, no estaba seguro, así que por ejemplo los portátiles de la gama T de Sony quedaban descartados a pesar de que alguna cosa de ellos me gustaba otras como esta no.
Candidatos
Con estas características que buscaba estos eran los equipos candidatos que he ido seleccionando a lo largo de todos estos meses:
  • Asus 1225B: netbook de 11" de resolución 1366x768 con microprocesador AMD E-450 y 4GiB de memoria. Precio de 350€ en tienda bastante interesante. Quizá con un rendimiento no suficiente para lo que buscaba.
  • Acer Aspire V5-171: también netbook de 11" de resolución 1366x768 con microprocesador mucho más potente que el AMD anterior, i3 2367M a 1,4 GHz, Intel HD 3000 y 4Gib. Precio 500€ en tienda. La gráfica y el procesador Sandy Bridge habiendo salido ya los Ivy Bridge no me decidía por el, pero era una muy buena opción, en la página alemana tiene disponible el modelo que viene con un Ivy Bridge pero no se si finalmente llegará a España. Comentar que en algún análisis no le ponían buena nota a la calidad de pantalla y el calor que desprendía.
  • Asus Zendbook UX31A: De los pocos que he visto en tienda con resolución de 1600x900 en formato de 13". Sin embargo, tiene algunas limitaciones importantes como que la memoria está soldada en la placa base y no puede ser ampliada, vienen con 4GiB y punto. Al venir con SSD es algo caro, sobre los 1000€ para el modelo con SSD de 128GiB (no suficiente para mi) y 1200€ el de 256GiB (se me va de precio).
  • Sony Vaio gama T: al llevar el calificativo de untrabook e incluir un SSD combinado con un disco duro y tener resolución de 1366x768 como máximo lo descartaba. Aunque me gustaba por el microprocesador que se les puede configurar, el Intel® CoreTM i5-3317U, que tiene las instrucciones de virtualización VT-d además de VT-x.
  • Sony Vaio E: la gama que más se ajustaba a lo que andaba buscando, configuración, modelo de 14" con posibilidad de resolución 1600x900, memoria configurable a 8 GiB y (creo) que ampliable hasta 16 GiB, sin tarjeta gráfica híbrida y una Intel HD 4000, con micros Ivy Bridge, sin disco duro híbrido, posibilidad de elegir color negro. No creo que lo vaya a usar mucho pero por si acaso que venga ya con Windows 8 y no me hagan pagar 15€ por actualizarlo a W8 cuando debería venir ya con ello de serie como en algunos otros casos. Precio desde 649€ sin confugurar, con las características que yo buscaba de 839€, precio final y en casa.
Características técnicas proporcionadas por Sony
Ahora empezaré a hacerle el trabajo sucio a Sony y que debería hacer mejor ella misma si quiere vender más, ellos en su página me parece que «venden» muy mal su producto (Apple me parece que lo hace mucho mejor, cuida más su web y la información que da ¿ello contribuirá al éxito que está teniendo estos últimos años? Seguro que en parte) pero esa es asunto para otra historia. Lo siguiente son algunas cosas que me hubiese gustado conocer antes de comprar uno de sus portátiles.

Por todo lo dicho anteriormente la opción que elegí fue el Sony Vaio E 14P (SVE14A25E) con los siguientes elementos:
  • Intel®Core(TM)i5-3210M,2.5GHz
  • Windows 8 (porque no hay posibilidad de no elegirlo >:|)
  • Gris plomo (el portátil es completamente negro, cuerpo y pantalla y los detalles dorados de las teclas no son muy significativos y no se notan mucho)
  • Sin pantalla táctil (aunque ahora se le puede elegir como opción cuando lo pedí no)
  • LED 35,5 cm, 1600x900 + webcam (1,3 megapíxeles)
  • Intel® HD Graphics 4000 (sin memoria dedicada, está compartida con el sistema)
  • 500 GB Serial ATA (5400 rpm) de la marca Hitachi con interfaz Sata 2 a 3 Gb/s, aunque el sistema soporta Sata 3 a 6 Gb/s para un disco duro mecánico Sata 2 es más que suficiente.
  • 8 GiB 1600 MHz DDR3 SDRAM (tengo dudas de la máxima memoria que admite el equipo, en la página de EEUU estos modelos se pueden configurar con 16 GiB así que supongo que será esa)
  • Grabadora de DVD
Detalle de las características ampliadas
En la página de Sony la verdad es que dan bastante poca información adicional de las características técnicas de este modelo por ejemplo entre las cosas que no dicen son:
  • Que viene con una BIOS UEFI AMI Aptio que creo es requisito (lo de que sea UEFI) para todos los portátiles que vengan con Windows 8 preinstalado, es decir, que será norma a partir de ahora. Solo es posible entrar en la BIOS o iniciar el sistema desde una memoria USB o DVD estando el portátil apagado y pulsado el botón ASSIST.
  • Que el disco duro es SATA 3 a 6 Gbps, era de suponer que era esto ya que es lo último en estos momentos, pero no lo dicen por ningún lado solo dicen que es SATA.
  • Creo que los puertos USB 3 son dos y no uno como dicen ellos, es decir tiene dos USB 2 en el lado derecho y otros dos USB 3 en el lado izquierdo.
  • Que el disco duro es de 7mm de altura, no se si se le podrá instalar un disco de 9.5mm, me da que no. Esto hay que tenerlo en cuenta si se tiene intención de sustituir por un SSD por ejemplo. Lo bueno es que muchos SSD ya están viniendo en formato 7mm y parece que va a ser la norma.
  • No tiene botón físico para desconectar la WIFI por lo que siempre estará activa, la única manera de desactivarla será por software.
  • La foto del teclado que muestran en la página española no se corresponde con la realidad del teclado querty español, la tecla return no es igual y es más grande en la realidad.
  • No dicen si la tarjeta SD soporta SDXC, pero según la información de HWINFO lo soporta.
  • No dicen la capacidad de la batería, que es de 5300mAh/59Wh.
  • Sonido y red gigabit ethernet proporcionado por Realtek y tarjeta SD por Ricoh, ref wifi Intel Centrino Wireless-N 2230 BGN.
  • Que tiene un sensor de luz ambiental con el que se regula automáticamente el brillo de la pantalla y se enciende o apaga el teclado retroiluminado
Nota: estas son los detalles del equipo que me han enviado a mi, quizá  a lo largo del tiempo o dependiendo de la serie quizá varíe alguna cosa ligeramente.

Cosas que para el usuario normal no le dicen mucho ni le importa no conocerlo pero que quizá al usuario avanzado le interese conocer como es mi caso.

Recomendaciones al hacer el pago mediante tarjeta de crédito/débito
El equipo lo compre a través de la página de Sony españa, no hay que tenerle miedo ha hacer compras a través de internet, eso si, teniendo en cuenta una serie de precauciones como hacer la compra desde un equipo que estemos seguros que está libre de virus (cuidado los usuarios de Windows que no toman precauciones con lo que instalan y ejecutan en su equipo y navegan con Internet Explorer) ya que vamos a necesitar teclear todo lo necesario para pagar con una tarjeta de crédito: el número de nuestra tarjeta, su código de seguridad y la fecha de caducidad, con eso basta para hacer una compra. Otra cosa recomendable es no pagar con los datos de nuestra tarjeta física sino mediante una tarjeta virtual. Muchas entidades permiten crear tarjetas virtuales a partir de nuestra tarjeta física, los datos que nos proporcionará la entidad bancaria para la tarjeta virtual son únicos para hacer una compra pudiendo limitar la cantidad máxima aceptada como cargo y asignándole una fecha de caducidad menor que la física. Por supuesto, el cargo se hará exactamente igual que si lo hubiésemos hecho con nuestra tarjeta física. Suele ser gratuito hacer una tarjeta virtual y tiene las ventajas anteriores en cuanto a seguridad.

Últimos comentarios
Finalmente, diré que en Europa parece que para Sony somos tratados como clientes de segunda (otras empresas seguro que nos hacen lo mismo) respecto a los estadounidenses ya que en la página norteamericana está más cuidada, se puede configurar los portátiles con más memoria (16 GiB), el portátil viene con mucho mejores discos duros de serie (750 GiB), en algún momento he visto también que se pueden configurar con mejores microprocesadores y todo ello a mejor precio, el mismo equipo que he comprado pero con 16 GiB y 750 GiB de disco duro a 7200 rpm sale mucho más barato, $789.99 frente a 839€ y hay que tener en cuenta que el dólar se cotiza significativamente más bajo (al momento de escribir esto 1 euro son 1,30 dólares). Será por alguna razón logística, técnica o simplemente que nos nos toman tan en consideración pero deberían mejorarlo, la competencia quizá lo haga.

Pues eso va a ser todo por el momento, como esta entrada se me ha alargado mucho dejaré el desempaquetado y el análisis de este modelo de Sony para la siguiente entrada. Como muestra un par de fotos:


Referencia:
Desempaquetado Sony Vaio E 14P (SVE14A2C5E)
Análisis software y BIOS Sony Vaio E 14P
Sony
Acer
Dell
Intel
AMD
Nvidia

viernes, 23 de noviembre de 2012

Como crear y usar sprites en páginas HTML


HTML 5
CSS 3
Reducir el tiempo de carga de una página web es importante ya que un tiempo excesivo puede hacer que parte de los usuarios se vayan antes de que cargue la página completa. Para reducir el tiempo de carga de una página web se pueden hacer varias cosas, entre ellas:
  • Reducir el peso de la página, por ejemplo, reduciendo el tamaño de las imágenes o haciendo el código html más simple.
  • Utilizar versiones minimizadas de frameworks javascript y css.
  • Combinar archivos de javascript y css. Para hacer menos peticiones.
  • Usar CDNs que sirvan los javascript de tal modo que el usuario no tenga que descargarlos si ya los tiene cacheados de otras peticiones o accesos a otras páginas.
  • Y la que es de interés en esta entrada, reducir número de peticiones también en los iconos usados en la página usando la técnica de crear sprites.
Los iconos suelen tener la característica de que suelen ser pequeños (de uno o 2 KiB) de forma que el mayor tiempo empleado para descargarlos no es la transferencia sino el tiempo empleado para realizar la petición y la latencia de la red. Es mejor combinar todos los iconos en una imagen grande y hacer una sola petición (aunque algunos no se usen) que hacer tantas peticiones como iconos diferentes tengamos. Es lo mismo aplicado cuando se combinan varios archivos javascript y css en uno solo para hacer menos peticiones al servidor pero aplicado a las imágenes.

Para hacer la combinación de las imágenes hay herramientas en internet que nos permiten realizalo de forma sencilla y rápida, como este Generador de Sprite CSS. El resultado que obtendremos de esta herramienta será una salida de CSS y una imagen con la combinación de todas las que queremos.

Una biblioteca de iconos muy usados son los iconos silk de la página fam fam fam pero estos iconos vienen separados cada uno en su propio archivo y la mayoría tiene un tamaño de medio KiB asi que usando un sprite podemos beneficiarnos de la ventajas usando esta técnica. Lo primero que haremos es obtener y poner en una carpeta los iconos que queramos tener en un sprite, posteriormente crearemos un archivo zip, luego usaremos la herramienta de sprites que queramos.

Parte del CSS que obtenemos es:

Y un trozo de la imagen del sprite es:
Posteriormente para usar el sprite el html de nuestra página sería, incluyendo el CSS que hemos obtenido y aplicando los estilos a una imagen que en el src tiene una imagen con un pixel transparente:

Si te ha resultado interesante esta entrada quizá te interese también como hacer hojas de estilo css pero con el lenguaje de less, mucho más legible y mantenible que con css directamente.

Referencia:
http://es.spritegen.website-performance.org/
http://www.famfamfam.com/

viernes, 16 de noviembre de 2012

Como enviar un archivo con Apache Tapestry

Apache Tapestry
Si en la entrada anterior explique un ejemplo de como devolver un archivo con Apache Tapestry desde el servidor al cliente en esta vamos a ver la operación contraria, enviar un archivo del cliente al servidor con Apache Tapestry a través de un formulario html.

En una aplicación web el enviar un archivo al servidor se realiza con un campo <input type="file" /> pero en el servidor se trata de forma especial para recibirlo. Dado que no es tan simple recibir un archivo como recibir un dato de un campo file como de otros campos (text, radio, select) que son únicamente una cadena lo habitual será usar alguna librería que nos facilite la tarea o a través de las facilidades que nos proporcione el framework que usemos.

Con Tapestry para subir un archivo al servidor tenemos que modificar el html para el formulario e indicar el atributo enctype="multipart/form-data" de la siguiente forma:

En Tapestry disponemos de un componente que generará el html de un <input type="file" />:

En la parte del servidor en el código java de la página o componente tendremos un atributo para recibir el archivo seleccionado por el usuario (de nombre igual al atributo value del componente t:upload):

Esto será suficiente para recibir el archivo, con la referencia al objeto UploadedFile podremos obtener el nombre del archivo, tamaño y el InputStream para obtener su contenido. Finalmente, para hacer la subida de archivos en Tapestry necesitaremos incluir la siguiente dependencia en la versión específica que usemos:

Si desarrollamos una aplicación para ser ejecutada en el Google App Engine (GAE) deberemos hacer otras modificaciones para que la subida de archivos funcione correctamente. Añadiremos al descriptor del GAE appengine-web.xml la siguiente propiedad y redefiniremos el servicio FileItemFactory de la forma en que se hace en los siguientes enlaces de ejemplo [1], [2]:

En el código fuente de la siguiente aplicación se puede ver un ejemplo completo y fucionando.

Referencia:
http://tapestry.apache.orghttp://tapestry.apache.org/uploading-files.html
Documentación sobre Apache Tapestry

sábado, 10 de noviembre de 2012

Como devolver un archivo con Apache Tapestry

Apache Tapestry
En esta entrada voy a explicar como enviar un archivo al cliente desde el servidor usando el framework Apache Tapestry. Esto es necesario si por ejemplo nuestra aplicación necesita generar un informe ya sea en formato txt, excel, pdf, un archivo comprimido o de cualquier otro tipo.

En tapestry el proceso no es muy complicado, tan solo deberemos devolver un objeto que implemente la interfaz StreamResponse en el manejador de evento («event handler») que procesa la petición.

Aquí el código de parte de un manejador de evento que construye y devuelve un objeto que implementa la interfaz StreamResponse:

Una posible implementación de la clase StreamResponse podría ser la siguiente que podríamos reutilizar siempre que tengamos que devolver un archivo:

Si estuviésemos devolviendo un archivo de texto y si el cliente acepta compresión gzip según las cabeceras que nos ha enviado en la petición (Accept-encoding: gzip) podríamos devolver el resultado comprimido con este formato ahorrado ancho de banda y muy posiblemente reduciendo el tiempo de descarga del archivo. Haciendo uso del servicio ResponseCompressionAnalyzer y del método isGZipSupported podemos averiguarlo de forma muy sencilla.

En la siguiente entrada de documentación sobre Apache Tapestry puedes encontrar más entradas, ejemplos y documentación.

Para finalizar, decir que la forma indicada en este ejemplo para convertir el OutputStream al InputStream que necesita el objeto StreamResponse puede ser mejorado con el uso de un PipedInputStream. La manera indicada en el ejemplo con el ByteArrayOuputStream obliga a mantener en memoria el contenido completo generado antes de ser enviado al cliente además de no empezar a enviarlo hasta que se genera por completo, si se trata de unos pocos MiB puede ser suficiente pero si son varias decenas la aplicación puede presentar algún problema en el uso de memoria.

Referencia:
http://tapestry.apache.org
http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/

sábado, 3 de noviembre de 2012

Convertir imágenes entre formatos y cambiar tamaño con ImageMagick

ImageMagick
Algunas personas que trabajan con muchas imágenes seguramente se han encontrado en la situación de querer convertir imágenes de un formato a otros o cambiarles de tamaño de forma masiva. Hacerlo de forma manual es un trabajo aburrido y repetitivo además de consumir mucho tiempo que será mayor o menor dependiendo de la cantidad de imágenes a tratar. En esta situación ImageMagick y unos pocos comandos en la terminal de Linux nos pueden ahorrar una buena cantidad de tiempo además de evitar posibles errores al hacer las cosas manualmente. Para convertir imágenes de un formato a otro podremos hacerlo con:

Esto convierte todas las imágenes de extensión png del directorio actual a imágenes en formato jpg cambiándoles además a los nombres de los archivos la extensión de «.png» a «*.jpg». También podríamos cambiar el tamaño de las imagenes a una determinada anchura máxima o a una altura máxima de forma masiva con:

El primer comando reescala la anchura de las imagenes a 400 píxeles y el segundo a 300 píxeles de altura en ambos casos manteniendo la proporción de las imágenes originales y en ambos casos sobrescribiendo la imagen original.
También podemos hacer uso del comando específico para realizar escalados:

Para instalar ImageMagick en Arch Linux basta con instalar su correspondiente paquete después de lo cual dispondremos de los comandos convert y mogrify:

Otra cosa que a veces es necesaria es añadir marcas de agua a las imágenes, para esto ImageMagick también es muy útil y se puede automatizar posiblemente ahorrando mucho tiempo, evitando errores al hacerlo manualmente y hacerlo de forma exactamente igual para todas las imágenes.

Referencia:
Documentación comando convert
Añadir marcas de agua a imágenes con ImageMagick

jueves, 25 de octubre de 2012

Crear un archivo comprimido Zip con Java

Java
Comprimir cierto tipo de archivos como los archivos de texto puede suponer un considerable reducción del tamaño del archivo original, un xml del 20 MiB se puede quedar en 1.5 MiB, es decir, una tasa de compresión de 13 o lo que es lo mismo el fichero comprimido ocupa 13 veces menos. Esto es muy interesante en las aplicaciones web ya que puede ayudar a ahorrar ancho de banda y reducir los tiempos de descarga del archivo. La compresión se hace a costa de cargar la CPU con trabajo pero normalmente el tiempo global que se tarda en descargar el archivo suele ser menor comprimiendo ya que el mayor limitante suele ser el ancho de banda de la red y no la carga de la CPU. Otra ventaja para las aplicaciones web es que algunos formatos además de comprimir pueden contener varios archivos y por tanto haciendo uso de ellos se pueden devolver un archivo pero que contiene a varios en una sola petición.

Java proporciona una serie de clases para trabajar con archivos comprimidos en formato zip y su uso no es muy complicado. Aquí el código para generar un archivo zip con la Api de Java y guardando en él dos archivos.

También hay disponibles librerías en Java para trabajar con otros algoritmos de compresión aparte del zip, como gzip, LZMA o XZ que producen archivos más pequeños y con mayor ratio de compresión aunque no de forma más rápida.

Referencia:
http://java.sun.com/developer/technicalArticles/Programming/compression/
http://www.7-zip.org/
http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm

sábado, 20 de octubre de 2012

Reglas de negocio con Drools y Activiti

Drools
Activiti
Los procesos de negocio pueden tener varios caminos de ejecución distintos. En algunos casos la decisión que determina el camino de ejecución del proceso de negocio puede estar determinado por una decisión de negocio. Por ejemplo, si se determina que un cliente es VIP se puede querer dirigir el flujo del proceso de negocio por un camino alternativo para tratarle de forma especial por su condición de cliente VIP, esta decisión se puede realizar mediante una regla de negocio («business rule»). También, el propio hecho de determinar si el cliente es VIP puede ser realizado por otra regla de negocio. Con lo que podemos aplicar las reglas de negocio al menos a dos escenarios:
  • Para dirigir el flujo de un proceso de negocio. A este tipo de reglas de negocio se les denomina reglas con lógica de decisión («Decision logic rules»).
  • Para tratar información en base a definiciones, operaciones y restricciones. A este tipo de reglas se les denomina reglas con lógica de negocio («Business logic rules»).
Una regla de negocio con lógica de decisión que podría dirigir el flujo de un proceso de negocio podría ser:
  • Si el cliente es VIP enviar paquete por transporte urgente.
La regla de negocio que determina si el cliente es VIP y una regla con lógica de negocio podrían ser:
  • Si el cliente ha realizado una compra por importe superior a 100€ el cliente es VIP.
  • Si el cliente es VIP aplicar un descuento de 10€.
Estos son unas pocas reglas de negocio y bastante sencillas, en un sistema real podría haber muchas más y más complicadas. Por ejemplo, se podría querer aplicar descuentos a ciertos tipos de productos como libros o DVDs o descuentos cuando se compren varios productos relacionados a la vez. Esto se puede complicar suficientemente para que si se realizan las reglas de negocio mediante código de un lenguaje de programación tradicional como Java o C#, el código se convierta en poco mantenible y que pondría dificultades para adaptar una aplicación suficientemente rápido a los cambios que se producen en negocio.

Algunas ventajas de las reglas de negocio son:
  • Están documentadas y puede ser gestionadas, no es un conocimiento que posean las personas en sus cabezas.
  • Las reglas de negocio puede estar escritas en un lenguaje entendible por las personas de negocio. La gente de negocio puede verificar la lógica y cambiarla.
  • No se utiliza código de programa en algún lenguaje de programación que probablemente con el tiempo se convierta en código spaghetti y que no es entendible por las personas de negocio.
  • Es más fácil, flexible y rápido modificar las reglas de negocio que el código de programa equivalente en Java o C#. Se pueden modificar independientemente del código ya que las reglas no se encuentran en la aplicación.
En el siguiente enlace puedes encontrar otros motivos y ventajas, ¿Por qué usar reaglas de negocio?. Las reglas en definitiva contienen parte del conocimiento del negocio, los sistemas que se encargan de aplicarlas son denominados BRMS («Business Rule Management Systems»). Un ejemplo de BRMS es Drools y este puede ser usado en combinación con Activiti encargándose de esta forma cada unos de ellos del área especifica para el que están destinados, Drools para las reglas y Activiti para los procesos.

Veamos ahora un ejemplo similar al realizado en Usar variables en un proceso de negocio con Activiti pero usando reglas de negocio. El diagrama del proceso de negocio es el siguiente:


Mediante la tarea «Determinar Tipo Cliente» se determina el tipo de cliente en función del importe de la compra de un cliente valor que se toma de una variable del proceso de negocio del mismo nombre. En la tarea «Determinar Descuento» se determina el descuento a aplicar en función del tipo de cliente asignado en la tarea anterior. Estas dos tareas son ejemplos de reglas con lógica de negocio. Finalmente, el envío se realiza también en función del tipo de cliente dirigiendo el flujo del proceso mediante un gateway exclusivo, «Envío Normal» si el cliente es normal o «Envío Urgente» si el cliente es VIP. Este es un ejemplo de regla de negocio con lógica de decisión.

Veamos ahora el proceso de negocio en notación BPMN:

En esta definición la etiqueta «businessRuleTask» se encarga de ejecutar las reglas de negocio indicadas en el atributo «activiti:rules» con los siguientes hechos (denominados facts en la jerga de los sistemas de reglas) o variables «${cliente},${importe}» indicados en «activiti:ruleVariablesInput». Tambien se ve como es un gateway exclusivo en el xml, de él parten dos «sequenceFlow», se tomará el camino para el que se cumpla su «conditionExpression».

Ahora el código de las reglas de negocio para determinar el tipo de cliente, las reglas para determinar el descuento y el tipo de envío son muy parecidas y pueden verse en el código fuente del ejemplo:

Una regla de negocio es básicamente una condición que se evalúa para los hechos insertados en la base de conocimiento y en caso de cumplirse se ejecuta su parte then. Veamos ahora los teses unitarios para probar este proceso de negocio.

Las reglas de negocio para los teses se añaden a activiti como deployments de la misma forma que se hace para los procesos de negocio. Para que los deployments de las reglas de negocio de drools sean detectados correctamente hay que asignar un «customPostDeployer» al bean «processEngineConfiguration». También hay que añadir las siguientes dependencias al proyecto «org.drools:drools-core:5.4.0.Final», «org.drools:drools-compiler:5.4.0.Final» tal y como se puede ver en el archivo build.gradle del código fuente del proyecto.

Finalmente, el programa para ejecutar este proceso de negocio y su salida:



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