miércoles, 27 de diciembre de 2017

Ejemplo 2017-12: Leer datos encriptados.

Resumen: 
Leer datos de una tabla encriptada.

Descripción: 
Sin quererlo, los últimos artículos, se han convertido en una serie de encriptación:
  1. Logging encriptado
  2. Tabla encriptada
El requerimiento era consultar los registros que se grabaron en la tabla encriptada. El programa debía ejecutarse en background (demon) y tomar acción según el estado.

Se hizo con Spring Boot y Spring Data. El mapeo de la entidad es muy parecido a Grails. Para la transformación (desencriptar) de los campos, se debe implementar un listener.


Como adicional, el uso de Spring Boot nos permite empaquetar las clases y librerías (al estilo de Fat-Jar); para tener una aplicación lista para el despliegue.

Bibliografía: 
https://spring.io/guides/gs/accessing-data-mysql/
https://www.concretepage.com/java/jpa/jpa-entitylisteners-example-with-callbacks-prepersist-postpersist-postload-preupdate-postupdate-preremove-postremove
 
Configuración: 
SpringBoot 1.5.8
Gradle 3.5
Java 1.8

martes, 28 de noviembre de 2017

Ejemplo 2017-11: Tabla encriptada.

Resumen: 
Mantenimiento formulario con datos encriptados.

Descripción: 
En el post anterior (https://codigo-programacion-17.blogspot.pe/2017/10/ejemplo-2017-10-logging-encriptado.html), utilicé el método AES para encriptar el texto del log. Entonces, la misma librería fue la que usé para grabar los datos encriptados de una tabla de registros.

Dado que teníamos una fecha límite (30 días) para tener el programa con las especificaciones requeridas, opté por usar Grails para construir el proyecto. En este ejemplo, quiero describir la forma de encriptar los datos. También aclarar, que otras formas de resolver esto era:

  1. Emplear los método de encriptación de MySql, 
  2. Configurar Hibernate para que haga la conversión.
Primero tuve que crear el proyecto, el dominio y el controlador. En el clase de dominio agregar los métodos para transformar los datos necesarios.


Antes de insert o actualizar (beforeInsert, beforeUpdate) se encripta las información. Y cuando se lee de la tabla (afterLoad) se desencripta.

Obviamente, este es un caso muy simple. Pero, si lo hubiera creando procedimiento de base de datos hubiera significado desencriptar en cada consulta. O, encriptar cada campo en cada transacción.

Finalmente, la ventaja que con GORM tenemos los métodos findBy* que son muy útiles.

Configuración: 
Grails 3.3.1
Gradle 3.5
Java 1.8

lunes, 30 de octubre de 2017

Ejemplo 2017-10: Logging encriptado.

Resumen: 
Generar (archivos) log encriptados.

Descripción: 
Como parte del proyecto, se solicitó que las aplicaciones generen log de forma encriptada. Considerando que, luego deben ser descriptados para hacer el seguimiento, se programó una librería para encriptar textos y genere los archivos en formato CSV.


La implementación es sobre Logback. En el ejemplo, se puede apreciar lo cómodo que es trabajar con Groovy.

Necesitamos declarar el regla de conversión (CryptoConverter). También, para generar el encabezado se creó la clase LogFileHeaderPatternLayout. El resto, corresponde a código de la librería: RollingFileAppender, rollingPolicy(SizeAndTimeBasedRollingPolicy), etc.

Este es el resultado:
con,level,thread,msg
2017-10-30 14:43:06.123, INFO,[main],fqNSg3GrkKMcIePoF7kp+IQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.708, INFO,[main],rvYt6ocFGKwfP4NwqBjdvoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.711, INFO,[main],vpQjYtxnBzVozdz6gFi41YQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.711, INFO,[main],9tC9J61SG0VnSggUsoTvNoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.712, INFO,[main],FNxzsBSmSRvE5jsreFpozoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.712, INFO,[main],frK6YUhunjkqKrdqVVJy1oQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.713, INFO,[main],IU2ziwUlZ0SNwMrOc3HYBoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.713, INFO,[main],H/jY5wKj7MowivuD9IhG9YQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.713, INFO,[main],e/DVEVuDH1rhWuT2RkEFL4QiglN9YE2/DxeZD65QlMs=
2017-10-30 14:43:06.714, INFO,[main],BiHncd7iAAm3H2BN+IrHH10C3QWEtrturo3ec+v9j1s=
2017-10-30 14:45:17.643, INFO,[main],fqNSg3GrkKMcIePoF7kp+IQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.227, INFO,[main],rvYt6ocFGKwfP4NwqBjdvoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.228, INFO,[main],vpQjYtxnBzVozdz6gFi41YQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.228, INFO,[main],9tC9J61SG0VnSggUsoTvNoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.229, INFO,[main],FNxzsBSmSRvE5jsreFpozoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.229, INFO,[main],frK6YUhunjkqKrdqVVJy1oQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.230, INFO,[main],IU2ziwUlZ0SNwMrOc3HYBoQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.230, INFO,[main],H/jY5wKj7MowivuD9IhG9YQiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.231, INFO,[main],e/DVEVuDH1rhWuT2RkEFL4QiglN9YE2/DxeZD65QlMs=
2017-10-30 14:45:18.231, INFO,[main],BiHncd7iAAm3H2BN+IrHH10C3QWEtrturo3ec+v9j1s=

Código Fuente.- 
https://github.com/edgargs/util-encrypt.git

Configuración: 
Groovy 2.4.12
Gradle 3.5
Java 1.8

jueves, 28 de septiembre de 2017

Ejemplo 2017-09: Envio de comandos masivo.

Resumen: 
Envio de comandos SMS a dispositivos.

Descripción: 
Este es otro ejemplo de lo bien que resulta emplear el scripting de Groovy, para automatizar las tareas.

Considerar que es necesario tener un servidor de envíos de SMS. Los dispositivos pudieran ser celulares; pero dado que son comandos de ejecución, en este caso corresponden a dispositivos de posicionamiento global (GPS).

La lista de los números y los comandos, se recuperar de un archivo .csv . Para consumir este tipo de archivos, se tiene una muy buena librería: groovycsv (https://github.com/xlson/groovycsv)

@Grab('com.xlson.groovycsv:groovycsv:1.1')

Puesto que el servidor de mensajería, expone una página web; empleamos un cliente http para enviar los comandos.

Todo en un solo archivo.

Código Fuente.- 
https://github.com/edgargs/sendcommanddevice.git

Configuración: 
Groovy 2.4.8
Java 1.8

viernes, 25 de agosto de 2017

Encuesta reunión LimaGUG

A todos los interesados en conocer sobre Groovy, te invito a participar de esta encuesta para tener nuestra primera reunión como comunidad: Aquí


Ejemplo 2017-08: API fácil con Ratpack y Groovy.

Resumen: 
Crear un API de forma rápida y sencilla con Ratpack y Groovy (DSL).

Descripción: 
Ratpack es considerada una toolkit para crear aplicaciones HTTP. Ya había leído al respecto, pero no fue hasta hace poco que revisé algunos ejemplos. El claro uso que yo recomiendo: crear API-REST. Y es una alternativa a SpringBoot.

Este ejemplo, no es productivo. Quiero decir, nadie va a implementar este código para algún proyecto. Pero sí, nos dará un alcance de su facilidad.

Empleando DSL de Groovy; se específica las acciones (GET, POST, PUT, etc), el proceso a realizar y el resultado. También, notarán que podemos agruparlos con prefix.

Para ejecutarlo, basta con escribir:
        groovy easy-api.groovy

Desde la línea de comandos, hice estas pruebas:


Ahora bien, se puede construir aplicaciones más complejas, implementando las clases Handler y Module. Enrutar a otros manejadores o consultar a una base de datos.

Ideal para microservicios.

Bibliografía: 
https://ratpack.io/manual/current/quick-start.html

Configuración: 
Ratpack 1.5.0-rc-2
Groovy 2.4.8
Java 1.8

martes, 18 de julio de 2017

Ejemplo 2017-07: Ultimo registro.

Resumen.- 
Web muestra tiempo desde último registro.

Descripción.- 
Con motivo de tener un contador que mostrara el tiempo transcurrido desde el último registro de incidencia de nuestros servicios, se construyó está simple página en Grails. La meta es acumular el mayor tiempo, como objetivo del área.

Como desubrí, no es necesario descargar todo el sdk. Pueden obtener una skeleton desde start.grails.org . Los cambios que hice son sencillos. Agregar una clase para recuperar la informacion de la base de datos. Para luego enviar este dato, a la vista que inicializará el cronómetro.

El resultado se ve así:
Notarán que el código backend (modificaciones) es muy poco. A parte de los cambios en configuraciones.


Se agregaron dos clases (groovy): controlador y dominio.

Y la página que contiene el javascript. En la cual se recibe el parámetro lastTime.

Como pueden ver, muy simple.

Código Fuente.- 
https://github.com/edgargs/cerocaidas.git

Bibliografía.- 
http://guides.grails.org/creating-your-first-grails-app/guide/index.html
https://codepen.io/Romlonix/pen/Fwsza

Configuración.- 
Grails 3.3.0.RC1
Java 1.8

lunes, 12 de junio de 2017

Ejemplo 2017-06: Cliente Multihilos.

Resumen.- 
Implementar un cliente multihilos para pruebas.

Descripción.- 
Con la finalidad de realizar pruebas de esfuerzo a un servidor de transacciones, me pidieron modificar un programa en Python (2.7). Pero decidí, por cuenta propia, hacerlo en Groovy. De todas formas, el tiempo que me hiba a tomar entender el programa y modificarlo, no podría exceder el tiempo que hacerlo en un script.

Fue la decisión correcta, porque el luego me pidieron que lea y generé información de la BBDD. Pero en este ejemplo, solo mostraré cómo implementar un script para generar multiples hilos que ejecuten un procedimiento en concreto. Intenten hacerlo en Java y notarán la diferencia en líneas de código.

Entonces, el procedimiento lo definimos en myClosure: capturar el tiempo (epoch) y determinar una velocidad entre 0 y 80. Se imprime el resultado y luego espera cinco segundos. El tiempo es definido al principio.

Se van a crear la cantidad de hilos que defina el usuario. Por defecto será diez, en caso no se indique en el comando de ejecución. La variable cantHilos, se debe anotar con @Field para poder hacerlo global en el script.

Para ejecutarlo, nos ubicamos en la carpeta del script y en línea de comandos escribimos:
groovy MultiClient 100

PD: En esta ocasión usé el editor Brackets. Debo mencionar que el "sintaxis highlight" se comporta de forma correcta.

Código Fuente.- 
https://github.com/edgargs/MultiClientScript.git

Bibliografía.- 
http://www.tothenew.com/blog/how-to-use-thread-pooling-using-groovy/
https://stackoverflow.com/questions/6305910/how-do-i-create-and-access-the-global-variables-in-groovy

Configuración.- 
Groovy 2.4.8
Java 1.8
Brackets 1.9

miércoles, 17 de mayo de 2017

Ejemplo 2017-05: Reproducir posiciones.

Resumen.- 
Mostrar el historial de ruta (GMaps) como reproductor.

Descripción.- 
Javascript, es un lenguaje que gusta mucho. Debido a que puedes dar "vida" a una página web. Pero llevaba tiempo programando para entornos de escritorio, que lo dejé de lado. A modo de actualización, este ejemplo tiene uso de algunas de las nuevas características de la versión ES6.

De las que me han sido útiles al momento de escribir el código:
  • Función Arrow 
  • let y const 
  • Template Strings
También, la funcion forEach para iterar arreglos. Aunque, pertenece a otra version (anterior), desconocía su existencia.


La función loadSteps3, tiene el código donde recuperamos las posiciones y lo cargamos a un arreglo. La página web, tiene un botón (start!) para iniciar el recorrido y otro para detenerlo.

El resultado será este:



Otra implementación que he usado, es el componente FileReader (HTML5). Para cargar el archivo de las posiciones.

¿Cómo obtener mis posiciones?

Para ello debemos exportar el historial de posiciones. Desde Google Maps (maps.google.com), en el menú hay que seleccionar la opción "Tus Rutas". Recomiendo seleccionar un rango de tiempo específico, pues la información que se genera será menor.


Luego, en el icono de la tuerca, la opción "Descargar una copia de todos tus datos". Para obtener el archivo en formato JSON, basta con seguir los pasos que se indican. El sistema enviará un email cuando el proceso termine.



Código Fuente.- 
https://github.com/edgargs/ShowGMapsTimeline.git

Bibliografía.- 
https://carlosazaustre.es/blog/ecmascript-6-el-nuevo-estandar-de-javascript/
http://stackoverflow.com/questions/3146483/html5-file-api-read-as-text-and-binary
https://www.html5rocks.com/en/tutorials/file/dndfiles/
http://www.proglogic.com/code/javascript/time/chronometer.php

Configuración.- 
ES6
Google Maps API v3
Chrome 58.0.3029.110 (64-bit)

lunes, 24 de abril de 2017

Ejemplo 2017-04: Hello World Golang con Docker.

Resumen.- 
Prueba de Golang (Hello World) en un contenedor Docker.

Descripción.- 
Golang es un lenguaje que quiero aprender. Como todo lenguaje, lo primero que haremos será crear un ejemplo rápido y básico. Pero si no quieres instalar los binarios, existe la posibilidad de descargar un contenedor Docker oficial de Golang.

En este caso, tengo una máquina virtual con Ubuntu. Anteriormente, ya había instalado Docker. Cuando ejecute el contenedor (docker run -it golang), me di cuenta que no tiene un editor de texto (vi o nano). Este ejemplo no será práctica común, pero útil para conocer los primeros pasos de Golang y Docker.

Hello.go => Saluda el nombre asignado a la variable HELLO_GO_NAME.
Dockerfile => Construye un contenedor con el archivo Hello.go, que se compila y ejecuta. Se crea la variable de entorno HELLO_GO_NAME.
build-image.sh => Copia el archivo Hello.go y ejecuta el contenedor.


Código Fuente.- 
https://github.com/edgargs/MyHelloWorldGolang.git

Bibliografía.- 
https://www.digitalocean.com/community/tutorials/como-instalar-y-usar-docker-en-ubuntu-16-04-es#paso-3-—-uso-del-comando-docker
https://golang.org/doc/code.html#Workspaces


Configuración.- 
Docker 17.04
Golang 1.8.1

lunes, 13 de marzo de 2017

Ejemplo 2017-03: Server Socket con Groovy.

Resumen
Implementación del Server Socket con Groovy.

Descripción
Este ejemplo tiene el propósito de mostrar la ventaja de Groovy, respecto a ahorranos escribir código fuente. Sin perder la potencia de Java en el camino.

Me basé en el ejemplo de Oracle, para trabajar con sockets. Para lo cual implementan el "protocolo" Knock Knock.

Como podrán notar a simple vista, mi servidor está es escucha del puerto que se le indique. Cada nueva conexión es atendido en un hilo diferente (serverSocket.accept(true, { socket ->). En el ejemplo original, se debe crear los hilos y pasarle el socket como parámetro. Considerar el "\n" en la respuesta, para que el programa envíe la respuesta al cliente.


Código Fuente
https://github.com/edgargs/KKMultiServerBoot.git

Bibliografía
https://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html
http://www.marcelustrojahn.com/2015/11/spring-boot-groovy-mvc-hello-world-example/

Configuración
Gradle 3.2.1
Groovy 2.4.7
JDK 8

jueves, 9 de febrero de 2017

Ejemplo 2017-02: Migrar geometry de PostGIS a SQLServer.

Resumen
Migrar información geoespacial desde PostGIS a SQLServer.

Descripción
En uno de los proyectos que estoy involucrado, se requería migrar algunas tablas de una base de datos PostGIS (PostgreSQL) hacia nuestro servidor de SQLServer.

En sí, la complejidad radica al intentar pasar los datos geospaciales (los campos del tipo geometry). En internet encontré sugerencias de exportar en un dump, para luego importarlo. O, emplear herramientas de terceros para realizar dicha migración.

Pero opté por crear un pequeño programa/script en Groovy. En donde se recupera el campo orignal como texto (ST_AsText(the_geom) the_geom_import). Luego, se guarda como cadena en la nueva tabla. Finalmente, se genera el valor correspondiente (the_geom = geometry::STGeomFromText(the_geom_import,4326)).


Bibliografía
http://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html
https://www.simple-talk.com/sql/t-sql-programming/introduction-to-sql-server-spatial-data/

Configuración
Groovy 2.4.8
JDK 8
SQLServer 2012

viernes, 13 de enero de 2017

Ejemplo 2017-01

Resumen
Procesar una transacción remota (en una base de datos relacional), mediante un procedimiento almacenado de TRANSACT-SQL.

Descripción
Este post, es una actualización a Ejemplo 2016-01. Pero he empleado SQLServer, en esta ocasión.

La cadena XML se genera en el servidor de aplicación. No quiero ahondar en ese punto, porque se emplea la configuración de Spring para usar JAXB2. En la bibliografía está el link de referencia. Entonces, lo que hacemos es asignar una lista de detalle (listCollectionSpendReport) a la entidad que vamos a persistir (collection). Nótese que, previamente se grababa la entidad y luego, uno por uno, los detalles.

El procedimiento almacenado, recibe los datos de la entidad principal y una cadena de los detalles. Luego, son casteados en formato XML y recorridos en una sentencia SELECT para ser insertados en la tabla correspondiente.

Bibliografía
http://docs.spring.io/spring-ws/site/reference/html/oxm.html

Configuración
Spring 4
JDK 8
SQLServer 2012

lunes, 2 de enero de 2017

Actualización de mis Redes Sociales

Amigos,

he procedido a actualizar la información de mis redes sociales que a continuación indico:


 E



También, este post me servirá como prueba de las recetas de IFTTT, para la publicacion automática.