Entradas

Cuantos commits a GeneXus Server va a tener este objeto?

Imagen
Decidimos hacer un primer experimento de algoritmos de inteligencia artificial para predecir la cantidad de commits que va a tener un objeto, teniendo algunas características del mismo. 
Hicimos un programa para leer una KB y sacar para los objetos ejecutables: 

//Información del objeto"Object",  "Description",  "Type",  "Module", //Información sobre los parámetros "#ParmIN", Cantidad de Parámetros IN "#ParamOUT",  Cantidad de Parámetros OUT "#ParamINOUT", Cantidad de Parámetros INOUT "#Parameters",  Cantidad total de parámetros. (suma de los anteriores) //Información sobre código "#Comments", Cantidad de lineas de código "#Lines",  Cantidad de lineas del codigo "Max Nest", Cantidad de anidaciones que tiene el código "Longest Code Block",   Bloque de código mas grande "Cyclomatic Complexity",  Complejidad ciclomática del código "#Rules", Cantidad de lineas en la…

PiensoPienso: Atributo formula : Conviene usar procedure o count?

Imagen
Tengo una Transacción con la estructura

*CabezalClave
 CabezalDescripcion
 CantidadDeLineas = Formula que cuenta la cantidad de líneas
  (
    *LineaClave
     LineaDescripcion
   )  

Se tiene un procedure CuentoLineas que hace
parm(in:&CabezalClave,out:&CantidadDeLineas);

&CantidadDeLineas=0
for each
   where CabezalClave=&CabezalClave
     &CantidadDeLineas += 1
endfor

Debo hacer un programa que liste todos los cabezales que tengan mas de 3 lineas y poner cuantas lineas tiene.

CabezalClave , #LineasDelCabezal.

Cual de estas opciones utilizaría ? Justifique la respuesta.

Opcion 1) VARIABLE LLAMANDO A PROCEDURE

for each
     &CantidadDeLineas = CuentoLineas(CabezalClave)
     if &CantidadDeLineas > 3 
          Msg(CabezalClave + "," + &CantidadDeLineas)
     endif
endfor

Opcion 2)  ATRIBUTO FORMULA CON PROCEDURE

Defino un atributo fórmula

*CabezalClave
 CabezalDescripcion
CantidadDeLineas = CuentoLineas(CabezalClave)
  (
    *LineaClave
     LineaDescripcion
   )  

y…

Lectura de verano

Imagen
Estas vacaciones han estado buenas, pues me han permitido leer mas que lo habitual (digamos que el 50% de los dias llovió :(  )

Los libros que he leído: 
Brief Answers to the Big Questions Es el ultimo libro de , esta bueno, pero no tiene nada que no hubiera leído en los libros anteriores de el.  Lindo para pasar el rato. 
Source Code Modularization.  Un excelente resumen de diferentes formas de modularizar sistemas, en forma automática.  Muestra métodos de agrupar por afinidad, por distancia, resolviendo en forma algebraica, con algoritmos genéticos y otras heurísticas. Muy bueno. 
Graph Databases: New Opportunities for Connected Data
Da explicaciones generales sobre las bases de datos orientadas a grafos y da ejemplos en la base de datos Neo4j. Esta bueno para ver lenguajes de consulta para consultar grafos.  En muchas aplicaciones aparecen grafos y guardar estos datos en una base de datos relacional, es sumamente ineficiente. En los próximos años, es muy probable que teng…

Aplicaciones GeneXus Multi-KB

Imagen
Cada vez mas a menudo me encuentro con aplicaciones GeneXus que son generadas en múltiples bases de conocimiento.  Para clarificarlo un poco, se tienen diferentes KB que generan programas que están pensandos para ser usados como si fueran una única aplicación. 
Estudie un poco los motivos que llevan a esto y vi que son por demás diversos. Los principales motivos son: 
Seguridad.  Se necesita tener una parte de de la aplicación con determinada seguridad y se prefiere dividir la KB en la parte "mas segura" y "la no tan segura". 
Tecnología. Se necesita una funcionalidad extra que viene en la nueva versión de GeneXus, pero no se esta en condiciones de migrar toda la KB, por lo que se decide hacer el nuevo desarrollo en una nueva KB con la nueva versión y lograr que ambas aplicaciones conversen. Esto pasa a veces con aplicaciones mobile, sobre una aplicación WEB que ya existe.
También puede pasar que se tenga una aplicaciones que aun genera aplicaciones con winforms (por…

Bajar el tiempo de build all en una KB GeneXus

Imagen
Desde hace un par de días, estamos trabajando con Nicolás, para lograr bajar el tiempo de build all de una KB.

Baseline.  Partimos de una KB que tiene 1557 objetos main. (muchos reportes y web services).

Tomamos como ejemplo a mejorar, el caso en que la KB no tenga ningún objeto modificado, ni tenga nada para compilar, pues ese caso nos permite ver donde estamos haciendo tareas que realmente no agregan valor al proceso.  En este caso (que no había nada para compilar) todo el proceso demora unos 65 minutos.

El proceso hace:

* Actualiza la KB desde GXServer
* Especifica y Genera los fuentes
* Compila todo los main.

Todas estas tareas están automatizadas con tareas MSBuild y Jenkins.

Estudiando los tiempos que llevan estas etapas, vimos que tenían un tiempo en promedio, en caso de no tener nada para actualizar ni generar:

* Arranque y seteos iniciales (2 minutos)
* Actualización desde el server (5 minutos)
* Especificación y Generación (8 minutos)
* Compilación de main (50 minutos).

Por…

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…