Entradas

Sistema LUCIA: 20 años de una KB en producción.

Imagen
En estos días se cumplen los (primeros) 20 años de la puesta en producción del Sistema LUCIA en la Aduana de Uruguay. Voy a contar un poco su historia.
Comienzo Durante 1998, trabajamos con un conjunto de consultores peruanos para poner en producción un sistema donado por la aduana de Perú a la aduana de Uruguay. El mismo fue realizado en Visual FoxPro y Oracle.

Nosotros nos propusimos lograr convertir toda la aplicacion a GeneXus de forma que nos fuera fácil mantenerla en el futuro, pero teníamos plazos muy estrictos que cumplir para sustituir una aplicación que funcionaba en un mainframe y que tenia problemas con las fechas en el año 2000.

El plan inicial de puesta en producción, fue una mezcla de aplicaciones hechas en Visual FoxPro y otras hechas en GeneXus, por ejemplo todas las consultas web fueron hechas con el generador C/SQL.  Salimos con el modulo de exportación, que era el que tenia menos operaciones y como manejaba menos dinero, era mas fácil para empezar.
Fueron momentos…

Por aplicaciones mas modulares...

Imagen
En el post anterior sobre módulos, nombraba algunas características que serian buenas para mejorar en los módulos y algunas de ellas, no tenían nada que ver con los módulos, sino que era para lograr aplicaciones mas fáciles de modularizar.

Algunas personas me hicieron preguntas, por lo que voy a tratar de explicar mejor lo que quise decir.

Hoy GeneXus genera las transacciones de la forma:


La transacción Deposito, accede a la tabla DEPOSITO (para hacer alta / baja y modificaciones de los datos) y también al tabla CIUDADES, para controlar que exista la ciudad del deposito si estoy agregando o modificando. A su vez, la transacción Ciudad, accede al tabla CIUDADES para el ABM y a DEPOSITOS para chequear si se puede borrar una CIUDAD (y no deja borrar si existe un depósito con esa Ciudad, para controlar que no queden datos inconsistentes.

Con la forma actual de módulos, para no tener errores, hay que definir las transacciones Ciudad y Deposito con Visibility=Public y por lo tanto, las tabl…

Modulos GeneXus: Que les falta para que sean (mas) utiles?

Imagen
La funcionalidad de los módulos en GeneXus es un desarrollo que tuvo un impulso inicial, y luego se estancó un poco, pues han surgido muchas otras cosas que han ocupado la agenda de desarrollo.

Hace mas de un año escribí un articulo sobre el tema, y ahora voy a reforzar un poco la idea, pues sigo necesitando cosas de los módulos.

Como veo estratégicos el tener un buen sistema de módulos, creo que vale la pena retomar y ampliar su funcionalidad para lograr manejar mejor nuestros desarrollos.

El hacer que se extienda mas el uso de módulos, va a lograr mejorar los tiempos de build all y con eso también la productividad de quienes desarrollamos con Genexus.

Si llegamos a tener módulos distribuibles en forma de binarios de forma facil y controlada, vamos tambien a estar mejor parados para arquitecturas interesantes como la de microservicios.

Los puntos que a mi mas me duelen cuando uso módulos son:

1) Tablas publicas o privadas. 
Me gustaria poder tener independencia entre la visibilidad d…

Acceder a los header SOAP en programas GeneXus

Imagen
Un cliente nos pidió que necesitaba un servicio web SOAP, que recibiera un header y realizar con dicha información una validación de seguridad.

Con GeneXus nativo, no tenemos la posibilidad de recuperar los header soap aunque si se pueden setear cuando hago una invocación.

El problema era recibir algo asi (no es con usuario y contraseña, sino con un token, pero lo hago así para el ejemplo).

?xml version ="1.0"?><SOAP-ENV:Envelopexmlns:SOAP-ENV=" http://www.w3.org/2001/12/soap-envelope"SOAP-ENV:encodingStyle=" http://www.w3.org/2001/12/soap-encoding"><SOAP-ENV:Header><s:Securityxmlns:s="http://ealmeida.blogspot.com/security/" user="Usuario" password="Peñarol"></s:Security></SOAP-ENV:Header> ... ... </SOAP-ENV:Envelope>
Teniamos varias opciones:

1) Modificar el programa fuente generado por Genexus, para capturar los header mientras los procesa en un procedure SOAP.
2) Progra…

Herramientas necesarias para desarrollar con GeneXus en tiempos de DevOps.

Imagen
Desde hace un tiempo, es bastante común que los grupos de desarrollo tengan mayor participación en el ciclo de vida de una aplicación. Los desarrolladores que antes "solo hacían programas", ahora pasan a realizar tareas en el build, deploy, monitoreo de aplicaciones.

Esta tendencia es la llamada DevOps, donde se unifican los grupos de Desarrollo y Operaciones para
brindar un mejor servicio y tener mejor productividad. En los proyectos que hemos utilizado este tipo de metodología, efectivamente ha mejorado la productividad brindando mejor servicio a los usuarios de la aplicación. Los cambios le llegan mas rapido y los problemas se solucionan mas rapido también. También los errores de coordinación entre los que desarrollan y los que instalan disminuyen al hacer todos en el mismo grupo las tareas. Es mas fácil automatizar varias tareas que antes se hacían en forma manual.

Estos cambios en la forma de trabajar, trae varias consecuencias. La mas notoria, es que se hace mas notor…

GX28 - un resumen resumido.

Imagen
Pasó el #GX28. La organización estuvo espectacular, como ya nos tiene acostumbrados. Un orgullo que una empresa uruguaya pueda organizar este tipo de eventos en el pais.

Como hay tantas charlas simultáneas, una persona solo puede ver 1/5 de las charlas posibles, por lo que siempre se tiene versiones muy parciales.

Algunos de los temas preponderantes (o que me interesaron a mi) fueron:

* Blockchain - Hay mucho trabajo en el tema, aun no hay aplicaciones concretas. Creo que Blockchain va a terminar siendo un sinónimo de "Base de datos distribuida y no actualizable" y hay muchas aplicaciones que pueden beneficiarse de esto.  Viene madurando en forma muy rápida y hay mucho financiación para proyectos por lo que este un tema mas que interesante para mirarlo con cariño y empezar a hacer prototipos.

* Inteligencia Artificial - Empezamos a tener tecnología a mano como para incorporarlo en nuestras aplicaciones. Para lograr resultados efectivos hay que trabajar bastante, pues el parad…

Panel sobre interoperabilidad e integración: desafíos y experiencias en la era de las APIs #GX28

Imagen
En el #GX28, me invitaron a participar en un panel (junto con Ana Berta, Fernando Panizza, Javier Barreiro y Ignacio Estefanell) donde conversaremos sobre Integración, Interoperabilidad, API First y API Economy. Me parece un tema importante y que en los próximos años nos va a tener ocupados. En 30 minutos no va a ser posible transmitir las diferentes visiones, por lo que hago un breve resumen en el blog.

 Los desarrolladores, o quienes gestionan aplicaciones, van a tener que definir, monitorear y administrar las API internas de la aplicación y aquellas que exponen al público.

Al tener interfaces bien definidas, aparecen nuevos modelos de negocios y oportunidades para aprovechar los datos. Tambien hacen mucho mas fácil empezar a interactuar con otras aplicaciones y a orquestar servicios de terceros.

Para lograr todo este potencial, se van a necesitar nuevas herramientas para ayudar a lograrlo.

Supongo que cada vez mas aplicaciones van a ser de la forma:
Cada vez mas vamos a utili…

Revisión automatizada de código con KBDoctor y Jenkins

Imagen
Dentro de las funcionalidades nuevas de KBDoctor esta la de poder hacer revisión de código automatizado, y poder ejecutar dicha tarea como una tarea MSBUILD.

Nosotros lo usamos para poder revisar los cambios subidos al GXServer, en la KB que arma los build, para revisar los objetos subidos.

Todas las noches se pueden revisar todos los objetos  que tenga un timestamp (modificados o subidos) del dia anterior o el actual.

set KBPath=C:\Models\GX16\KBPrueba
MSBuild.exe KBDoctorCmd.msbuild   /t:ReviewObjects 

Si se quiere revisar desde una fecha determinada, se puede agregar el parametro

/p:DateFrom=01-01-2018 

En el proyecto KBDoctorCmd.msbuild (que se instala con KBdoctor) se tiene
  <Target  Name="ReviewObjects">
    <Message Text="Using GeneXus DIR = $(GX_PROGRAM_DIR)" /> 
    <Message Text="KB DIR = $(KBPath)" /> 
    <OpenKnowledgeBase Directory="$(KBPath)" />
    <ReviewObjectsCmd  DateFrom="$(DateFrom)" />
    …

KBDoctor - Nuevas opciones para mejorar el codigo.

Imagen
Con el fin de tener codigo mas facil de mantener, le estamos agregando a la nueva version de KBDoctor, varias opciones nuevas. Entre ellas, permite detectar:
If vacios.  Es común que por diversos motivos, quede código de la forma

if (CONDICION) 
 //Codigo comentado 
else 
 Codigo bueno 
endif 

 Detecta tanto en el if o en else si quedó vacío por algún motivo. No parece algo muy util, pero en la práctica ha permitido detectar casos en los cuales no se estaba haciendo manejo de errores en forma correcta.

Chequeo estricto de pasaje de parámetros. 
Controla que los parámetros pasados entre objetos, coincidan tanto en tipo de datos (como ya lo hace hoy Genexus) como en largo, posiciones decimales en caso de numericos y en el DOMINIO que tiene definido la variable o atributo.

Permite detectar posibles problemas o inconsistencias en el sistema.

Esta opcion se agrega a la que ya teníamos de hacer un control estricto en las asignaciones del tipo &Var = [ATT/&Var/Procedure() ]. 

FOR EACH …

Error raro en .NET - Multiplica importes por 100 en llamada a SOAP

Imagen
Tenemos una aplicación funcionando en .NET con GeneXus 15 Upgrade 9.

Nos pasamos al Upgrade 11 y todo parecía funciona correctamente. En las pruebas realizadas en las maquinas de desarrollo y testeo, todo funciono bien.

Cuando pusimos en producción, empezamos a notar que luego de llamar a un servicio SOAP, los parámetros que nos volvían en SDT, con decimales, quedaban multiplicados por 100.

Las maquinas en las cuales habíamos probado, tenian Windows en ingles, con formato en ingles.
El servidor de producción, tenia Windows en ingles, pero el formato de fechas e importe, estaban en español.  Esta diferencia, era la que hacia que al ejecutar los mismos assemblies en dos maquinas diferentes, con los mismos archivos de configuración, dieran resultados diferentes.

El problema fue rápidamente diagnosticado por Javier Larrosa y agregando la linea

  <globalization culture="en-US" uiCulture="en-US" /> 

a nivel del system.web del web.config, pudimos solucionar el probl…