Entradas

Mostrando las entradas de 2018

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…

Atributos basados en dominios y variables basadas en atributos (2da. Parte)

Imagen
En el post anterior, comentaba la importancia de usar dominios con significado, para facilitar la propagación de cambios desde el modelo de datos a los programas.

Otra ventaja de tener bien definidos los dominios, es el de poder agrupar todas las cosas que son de la misma categoría, facilitando la identificación de los objetos que tengo que cambiar.

Por otro lado, al tener tanto variables como atributos con dominios, podemos hacer validaciones mas estrictas de lo que hoy permite Genexus.

Supongamos que tenemos los atributos (*)

MovimientoPeso - Domino PesoKG N(10,2)

CamionPeso - Dominio PesoToneladas N(10,2)

Si en un programa tenemos una operacion que haga una asignacion de

MovimientoPeso = CamionPeso + &Carga

muy posiblemente estemos introduciendo un error, al sumar pesos en diferentes unidades, aunque los ambos sean numéricos.

Lo mismo sucede si pasamos de variables que tienen mas decimales a otra que tenga menos decimales, podemos estar perdiendo precisión cuando guardamos los res…

Atributos basados en dominios y variables basadas en atributos

Imagen
Hace unos dias, me preguntaron el motivo por el cual KBDoctor chequeaba que los todos los atributos estuvieran basados en dominios y también sugiere que todas las variables estén basadas en atributos (o dominios)

El motivo es bastante sencillo, para hacer que la KB sea mas fácil de mantener en el futuro. 

Pongo un ejemplo bien sencillo, con el cual, puede quedar un poco mas claro.


Tengo tres atributos, que son N(8) y guardo en ellos números telefónicos.  Ninguno de estos atributos tiene dominio. Luego tengo 4 programas que usan estos atributos y tienen variables que tambien contienen numeros telefonicos, tambien definidas como N(8).

Por el aumento de la cantidad de teléfonos, las compañías telefónicas se ponen de acuerdo y deciden pasar sus números de 8 a 10 dígitos. 
Para adaptar mi aplicacion, tengo que cambiar, 3 atributos, mas 4 programas los cuales tengo que detectar  y cambiar manualmente. Estas tareas (sobre todo la de encontrar donde se tienen atributos y variables Telefono) p…

Las aplicaciones del futuro y las herramientas necesarias.

Imagen
Como serán las aplicaciones del futuro? Me encantaría poder contestar esa preguntas sin dudar, pero hacer futurología no es algo que me salga bien.  Lo que si puedo contestar, es como son las aplicaciones que tendremos que hacer en los próximos meses, porque son las que estamos programando ahora. Si bien no todas las aplicaciones son iguales, muchas de estas características se repiten en varias, por lo que es fácil detectar patrones repetidos.
Opino hoy de las aplicaciones hechas con Genexus.

Distribuidas Las aplicaciones tienen que estar distribuidas en varios nodos. Esta división sera por performance, escalabilidad, modularidad, seguridad, ejecutar en dispositivos específicos o algún otro criterio pero es algo con lo cual vamos a tener que lidiar. Nuestra aplicación va a tener que ejecutar en diferentes computadoras (por ej. microservicios).
Múltiples fuentes de datos o bases de datos.  Cada vez es mas común que las aplicaciones necesiten leer/grabar de diversas fuentes de datos y …

Como afectara la inteligencia artificial al desarrollo de software

Imagen
En este  informe de Forrester  (es del 2016, pero creo que tiene vigencia)  explican cómo puede afectar el uso de herramientas con algoritmos de  inteligencia artificial el desarrollo de software y aplicaciones.

Conviene leerlo todo, pues está interesante.  En la comunidad Genexus, tenemos avances en varios frentes.

Identifican que el area de test es una de la que primero se va a favorecer del uso de inteligencia artificial.





Nueva version de KBDoctor (v10.18)

Imagen
Publiqué en el GeneXus Marketplace una versión nueva de KBDoctor. Es la primera en la que cuento con ayuda de Nicolas para programar y hay muchas cosas que mejoraron.

Tiene varios arreglos, y nuevas opciones, para el manejo de módulos y también una opción para revision de objetos.

Esta disponible para Evo3, GX15 y GX16.

También se pueden empezar a ejecutar las opciones de limpieza de la KB como tareas MSBUILD.

Si alguien lo usa y tiene algun comentario, es bienvenido.



Se viene "Object Review" en KBDoctor

Imagen
Estamos programando una opción en KBDoctor, que va a hacer un Object Review, de forma de hacer una analisis y revision del objeto y detectar posibles errores, antes de subir dicho objeto a GXServer.

La idea es que aparezca en el dialogo del Commit, permitiendo revisar todos los objetos que van a ser subidos al server.

Es una herramienta que ayuda a realizar una revision del objeto, para liberar al revisor de los controles rutinarios y que pueden automatizarse. Ademas unifica algunos criterios en todo el grupo de desarrollo, de forma de hacer mas predecible como seran los objetos.

Que hace el Object Review?

Hace algo mas que un review, pues por ejemplo, borra todas las variables no usadas y si el objeto es una transaccion y no esta siendo referenciada por nadie, le borra las reglas, los eventos, le saca la masterpage y vuelve los forms a default.

Tambien avisa cuando:

Hay parametros tenga IN/OUT/INOUTTiene mas de N1 parametrosTiene mas de un parametro de salidaTiene bloque de codigo ma…

GXFlow con Oracle

Para poder usar GXflow con Oracle, es necesario poder usar el driver de Oracle, en 32bits o en 64bits, dependiendo de como este compilada tu solucion. 
Los programas que vienen con Workflow que hacen las reorganizacion desde versiones anteriores de GXFlow y tambien los programas que procesan los diagramas y cargan la metadata en las tablas de workflow, vienen pre-compilados. 
Esto siempre nos trae problemas con las diversas versiones de la dll de Oracle.DataAccess.dll, pues algunas veces no puede cargarla correctamente. 
Lo que hay que hacer es forzar el uso de (en nuestro caso) 32bits para los programas de GXflow: 
corflags "C:\Program Files (x86)\GeneXus\GeneXus15\Packages\Gxpm\Platforms\NetOracle12c\apwfwinloaddataxml.exe" /32BIT+ corflags "C:\Program Files (x86)\GeneXus\GeneXus15\Packages\Gxpm\Platforms\NetOracle12c\apwfexportgamroles.exe" /32BIT+ corflags "C:\Program Files (x86)\GeneXus\GeneXus15\Packages\Gxpm\Platforms\NetOracle12c\apwfgenuserdataxml.exe&qu…

Poner comentarios en ReorganizationScript.txt en reorg GeneXus

Imagen
Esta es una sugerencia que hice en el Slack de la TERO (próxima version de GeneXus, que sera la 16).

Nadie respondió nada y hace tiempo que tiene poquisimo movimiento, por lo que me quedan dudas, si alguien lo esta leyendo en forma activa.

Voy a reportarlo por aca, para darle un poco mas de visibilidad, pues es una sugerencia que puede servirle a todos aquellos que necesitan hacer reoganizaciones de la base de datos únicamente por script.



REORGANIZACION:  En algunas instalaciones, la unica forma autorizada de hacer reorganizaciones es a traves de scripts SQL.

Con la generación de ReorganizationScript.txt se simplificó muchísimo la tarea, de generar un script que haga la reorganización de la base de datos.

Lo que quería pedir era si se podía agregar algún comentario adicional, en el caso que se necesita crear una tabla temporaria y correr el programa de conversión.

Los DBA's generalmente evitan la creación de tablas temporarias y deben traducir esa secuencia de sentencias por otras…

Cambiar de version de GeneXus en KB conectada a GXServer

Imagen
Cuando tenemos una KB conectada a GXServer, surge la dificultad, que hay que migrar "simultaneamente" la KB local y la KB remota a la nueva version de GeneXus.

El proceso de pasar de una version a otra en KB grandes, puede ser mas o menos trabajoso, dependiendo de muchos factores, pero puede demorar varios meses entre migracion, pruebas, ajustes, arreglos e instalacion de la nueva version. 
Algunos factores que influyen en esta migracion son: 
* External Objects utilizados * User Controls Utilizados * Versiones de sistema operativo, base de datos, servidor de aplicaciones web, etc. 
Durante el periodo que se realiza la migracion, si bien tratamos de minimizar los cambios que se realicen al sistema, siempre hay cambios obligatorios que hay que realizar. 
El escenario planteado es el siguiente: 
KBEvo3 - hace ajustes a la aplicación.  KBGX15 - hace cambios debidos a la migración  Hay que mantener la historia de todos los cambios y la historia de los Commits en el server. 
La m…

Run sobre un objeto, compila muchos objetos no relacionados en mi KB GeneXus

Imagen
Me plateaban este problema:

"Sobre un objeto main, hago click derecho y RUN. Demora muchisimo, porque compila casi todos los objetos del sistema".



Es una KB mediana (1000 objetos) y no había motivos para ese comportamiento.

En la documentacion del Build/Rebuild/Run dice:
Specify only objects that have changed (Build) or force the specification of all objects (Rebuild) belonging to the "Selected" main call tree (*).   Consider also objects references in the properties of KB Version (except Startup Object), Environment and Generator, with their call tree.
(*)The call tree of a main is "cut" on every other main found unless the Call tree for build option is set to full Entonces lo que hicimos fue revisar cuales son los objetos referenciados en las propiedades, de la Version, Environment y Generador. 
Habia  Objetos del GAM, Login y NoAutorizado Objeto de AfterConnect  MasterPage
Lo único sospechoso, era la masterpage, pues tenia un menu, que llamaba a muchos…

Nos va a ayudar la inteligencia artificial en el desarrollo de software?

Imagen
La inteligencia artificial está permitiendo resolver con computadoras en problemas que antes solo eran resolubles por seres humanos.

Como pueden afectar al ciclo de desarrollo de software?
Quienes desarrollamos con GeneXus, ya estamos usando algunos de estos algoritmos por ejemplo para la normalización de la base de conocimiento, el uso de reglas y la generación de código.  Todos estas cosas son aplicadas a la etapa de programación, pero puede aplicarse a alguna otra etapa del desarrollo?.

Análisis estático de código.  Supongamos que podemos alimentar a un sistema de inteligencia artificial con caso de código que dio problemas en otros sistemas y código que no dio problemas. Con suficientes ejemplos, podria detectar el patron que siguen determinados patrones de codificación y permitir solucionarlos.

Sin ser bugs, podrían detectar cuando un codigo no cumple con determinada regla. Si bien esto puede hacerse hoy en dia con algoritmos tradicionales el poder aprender de los nuevos casos, l…

De cuantas formas se puede modularizar un sistema?

Imagen
Este es un problema interesante, con unas cuantas consecuencias practicas.

Tengo una KB con n objetos y la quiero modularizar. Para simplificar, defino que quiero dividirla en K modulos, con  1<= k <= n.

De cuantas formas diferentes puedo modularizarla?

Sea S(n,k) la función que cuenta la cantidad de formas de modularizar, con n objetos y k modulos.

 Dividimos el problema en 2 casos excluyentes:

Caso 1: Hago un modulo solo con el elemento n. Me quedan n-1 elementos, para agrupar en k-1 módulos, que puedo escribir de la forma S(n-1,k.-1). 

Caso 2: n esta en un modulo con otros objetos. Esto es lo mismo que poner el objeto n en los k modulos que tienen los n-1 elementos restantes.



y puede escribirse como k * S(n-1,k) 

La cantidad de forma de modularziar entonces, seria la suma de ambos casos y puede escribirse de la forma:


      S(n,k) =  S(n-1,k-1) + k* S(n-1,k)

a estos numeros se los conoce como  números de Stirling de segunda especie.

La cantidad de formas de modularizar con n=7 y…

Manejo de Errores y claridad de codigo

Imagen
Supongamos que tenemos un procedure que recibe dos parámetros y devuelve otro.

Para hacerlo facil, recibe una moneda y una fecha y devuelve la cotización.

Procedure Cotizacion
(IN:&Moneda, IN:&Fecha, OUT:&Cotizacion)

Puede usarse de la forma:

&CotizacionHoy = Cotizacion('USD',&Today)

Hasta ahi, el codigo es bien entendible. 
Supongamos ahora, que se quiere hacer algun manejo de errores y para lograrlo, se le agrega un parámetro adicional de salida
Procedure Cotizacion (IN:&Moneda, IN:&Fecha, OUT:&Cotizacion, OUT:&CodigoError)
El procedure ahora ya tiene mas de parámetro de salida, lo cual  hace mas dificil su uso
Cotizacion.call('USD',&Today,&CotizacionHoy,&CodigoError) If &CodigoError='404'     Msg('No existe la cotizacion para la moneda en ese dia') Endif.  Si comparo
&CotizacionHoy = Cotizacion('USD',&Today)
con
Cotizacion.call('USD',&Today,&CotizacionHoy,&CodigoError)

Cambio un objeto, especifico y genero y no veo los cambios al ejecutar.

Imagen
Me han plateado varias veces este problema:

No veo los cambios cuando ejecuto. Hago cambios en los objetos, especifico y genero y cuando ejecuto sigo viendo la version vieja del programa. 
GeneXus usa el concepto de "main object".  Esto era mas facil de comprender en los ambientes WIN, pero en ambientes WEB es un poco mas difícil de entender. 

Voy a hablar de ejecutable como sinónimo de assembly (en .net) o de class (en java).

Los Transacciones y Webpanels generan un ejecutable (sean main o no sean main). 

Un Procedure, Data Provider, BC genera un ejecutable si es main, y se incluye en los ejecutables de los objetos que lo llaman.

Cuando se compila un objeto no main?.  Se compila cuando se hace Run/Build del objeto main que lo invoque.

Que pasa cuando hago RUN de un main? Cuando se hace el RUN de un objeto, primero se hace un BUILD del arbol de invocaciones de dicho main, con lo que se especifica todos los objetos cambiados en el arbol de llamadas y luego se compila y se ej…

Funcionalidades que me gustaria tener en proximas versiones de GeneXus

Imagen
Esta es una lista de pequeñas funcionalidades que pienso que podrian hacer la vida un poco mas facil a los que desarrollamos con GeneXus, sobre todo en KB de tamaño mediano o grande. La mayoria son para tratar de aclerar el desarrollo y evita los grandes tiempos de espera que se producen en los build all.

1) Working Set mas flexible. 
En la Working Set que se tiene en el trabajar con objetos, seria bueno generarilzarla un poco.
Me gustaria tener en el dialogo contextual de los objetos una opcion Add to Working Set, de forma de poder agregar objetos en esa lista, desde cualquier dialogo de GeneXus. Por ejemplo, si hago un cambio a un objeto y quiero especificarlo, puedo agregarlo desde el tab al Working Set y especificarlo mas tarde. 


2) Especificar y generar los objetos que hacen referencia a otro objeto. 
En incontables oportunidades, tenemos que regenerar todos los objetos que usan un SDT o un External Object y no hay formas facil para hacerlo.  Estaria bueno poder hacerlo desde el m…

Integracion Continua - GeneXus - GUG Barsil.

Me invitaron a participar en una charla en el GUG de Brasil sobre integración continua, manejo de ambientes y versiones.
Lo mas interesante, estuvo en las preguntas y respuestas. Por si a alguien le sirve, dejo aca la presentacion.

Eliminando dependencias o Cambiando dependencias para tener un diseño modular.

Imagen
Una de las tareas mas importantes cuando se está modularizando una base de conocimiento (o cualquier sistema) es diseñar nuestros componentes de software de forma que cada uno de ellos pueda ser lo mas independiente de los demas (bajo acoplamiento).

En mi experiencia de modularizar bases de conocimiento, he visto muchas veces que se definen Dynamic Combo Box con una definción de atributos.

Esto trae como consecuencia, que el objeto que tiene ese Dynamic Combo Box, hace una referencia explicita a la tabla que contiene los atributos CountryID y CountryName.

Si este objeto no esta en el mismo modulo que la tabla Countries, dicha tabla va a tener que quedar publica.

Una forma muy sencilla de evitar esta dependencia, es basar el Dynamic Combo Box, en un Data Provider en vez de usar directamente los atributos.

De esta forma, el programa, en vez de hacer una sentencia "Select CountryID, CountryName from Countries", hara una llamada a el Data Provider.

Que ventajas y desventajas tie…

Mejorar la calidad de nuestro software ayudando a otros

Imagen
En Concepto desde hace un tiempo estamos haciendo cosas para colaborar con la incorporación de jóvenes al mercado de tecnologías de la información. Es un área que permite crecer a las empresas y a las personas, hay trabajo y todos salen beneficiados.

Fuimos con una borrador de una idea a hablar con los amigos de Abstracta y ellos elaboraron (supongo que ya lo tenían medio elaborado) un plan para armar centros de pruebas de software (o Centros de Excelencia?) en el interior del pais, para probar aplicaciones y detectar oportunidades de mejora.

La idea es crear la infraestructura  y capacitar a personas, para que las empresas del medio (y podria ser en el futuro del exterior) puedan contratar personal para realizar pruebas (de performance, funcionales, exploratorias, revision de codigo, de documentación, etc) con supervision de ellos, trabajando en forma remota desde dicho centro.

La idea es tratar de capacitar y contratar a gente joven con poca experiencia laboral , de forma de introd…