miércoles, 25 de marzo de 2015

Documentación, ejemplos y Genexus Server

Una queja generalizada de los usuarios GeneXus es que no es fácil encontrar como se usan determinadas funcionalidades. Si bien la documentación ha mejorado muchísimo en los  últimos años y tenemos un WIKI que tiene mucha documentación, hay muchos usuarios que recién comienzan que no encuentran ejemplos de como usar determinados comandos.

El problema que he visto, es que si bien saben que existe determinada funcionalidad, no tienen ejemplos completos que muestren como usarla.

Cuando me llega este tipo de consulta, trato de refererirlo a KB de ejemplo (People and Organizations, WIKI del servidor público de GXServer.
Para poder extraer el ejemplo que quieren, el usuario deber bajarse toda la KB y empezar a buscar donde esta la funcionalidad buscada, lo cual es bastante engorroso y generalmente no hacen.

Para subsanar esto, se me ocure que seria bueno contar con 3 cosas bastante sencillas.

Poder linkear el fuente u objetos desde un WIKI a GeneXus Server. 
Me gustaría que en el Wiki de la comunidad, se pudiera poner un link a un objeto en particular de una KB GeneXus y que se muestre el contenido del mismo.
Me gustaría poner  (es solo un ejemplo de sintaxis)

[[KBObject:(GXServer)/(webapp)/(KB)/(ObjectType)/(QualifiedName)/(ObjectPart)

y en un ejemplo concreto
[[KBObject:open.genexusserver.com/xev3/KBWiki5/DataProvider/KBToHTML/Source]]
lo que mostraria en el wiki un control como esto


Ademas de esto, tendría un botón para poder hacer un export de solo ese objeto.

Poder hacer un export de un único objeto o un conjunto de objetos desde GXServer. 
Esta es una funcionalidad que ya he pedido en otras oportunidades pero no he logrado convencer a los responsables de GXServer que esto es una funcionalidad que va a ser bastante usada.

Esto sirve para poder bajar un tema que me gusta de una KB, en la cual no estoy trabajando, sin tener que bajarme toda la KB. También me servirá para probar y corregir problemas en KB de colegas, sin tener que pasarme toda la KB o tener que bajarla.

KB de ejemplos 
Cada versión de GeneXus hoy tienen  tener una o mas KB de ejemplos con las funcionalidades de la versión. Deberíamos tener algunas mas que tengan la funcionalidades generales o mas viejas e ir adaptando la documentación existente a que apunte a las KB de ejemplos.

Me parece que con estos cambios (nada revolucionarios) se podría ayudar a los usuarios que comienzan a tener mas a mano ejemplos actualizados y funcionales de los comandos que quiera usar.

Las KB que están en los GXServer públicos tienen muchísimos ejemplos muy útiles, pero no los estamos sacando todo su valor.

viernes, 20 de marzo de 2015

Comparador de Objetos GeneXus

GeneXus provee varias funcionalidades de comparación entre objetos. Se puede comparar diferentes revisiones del mismo objeto, el mismo objeto en dos versiones dentro de la misma KB y también se puede comparar un objeto que voy a importar con el objeto que tengo en la KB.

Sin embargo, hay varios casos de uso que no se pueden resolver aun con estas herramientas, por ejemplo:
  • * Un modulo común, instalado en dos KB diferentes y quiero comparar las diferencias entre los módulos. 
  • * KB en dos versiones de GeneXus diferentes (por ej, Evo2 y Evo3)
  • * Comparar versiones, en KB grande, donde el comparador entre versiones de GeneXus demora tanto que se hace muy poco practico. 

Para esto, programé una nueva opción en el KBDoctor (version 11, que aun no publiqué) que permite seleccionar un conjunto de objetos y generar un archivo de texto con el contenido de cada uno de dichos objetos. Luego utilizo un comparador de archivos, para ver cuales son las diferencias.

Traté de hacerlo lo mas sencillo posible, de forma de que sea bastante rapido y me resultara util para compara dos KB grandes, una en Evo1 y otra en Evo3.

Esto va a generar un directorio con un archivo de texto por objeto seleccionado.

Por ahora, estoy poniendo el contenido de procedures, workpanels, webpanels, transacciones, atributos y tablas.  Me faltan agregar, data providers, data selectors, menu bar y algunos mas.

No pongo aun todo el contenido de los archivos, sino solo reglas, fuentes, eventos.
En el caso de los atributos, pongo el tipo de datos y también la formula en caso que lo sea.
En el caso de las tablas, estoy poniendo únicamente los atributos que la componen.
Esta version no va a comparar WinForms, WebForms, Themes y layout de reportes, porque aun no los estoy necesitando.

Un ejemplo de procedure es:


Luego puedo comparar con DiffDotNet el contenido de los directorios, uno generado en Evo1 y otro en Evo3 y veo las diferencias por archivos.


 También se puede usar cualquier comparador de directorios y de archivos para esta comparación, como pueden ser el Beyond Compare, WinMerge, etc.

Queda aun programar bastante para que quede bien, pero en el estado actual, ya me resulta util.


martes, 17 de marzo de 2015

Como eliminar referencias a objetos "To Be Defined"

Es bastante común que en las KB queden referencias a objetos "To Be Defined".  Esto es una situación normal, cuando se importan objetos que llaman a otros que no existen en la KB en la cual estamos importando. Cuando se crean o se importan estos objetos, las referencias se borran y todos contentos.

También es común, que queden objetos en la categoría/carpeta "To Be Defined", pero que no tienen ningún objeto que lo referencien, por lo que la solución anterior, no puede ser usada.

Un ejemplo de esto:
No es posible borrar estos objetos, por lo que para solucionar esto, lo que hago es crear un procedure con el texto


Call("POrgest")
Call("PRgAcBitácoras")

.....




con todos los objetos que están en To Be Defined, que quiero borrar.


Hay que salvar el objeto y luego, conviene comentar todas las llamadas y volver a salvar dicho objeto.

De esta forma, como la referencia que se esta eliminando es la ultima, se borran dichos objetos fantasma.

sábado, 14 de marzo de 2015

Comprimir una KB GeneXus.

Guscarr proponía utilizar la tarea CheckKnowledgeBase, para desfragmentar los índices y corregir errores internos de la KB.

Viendo la dll de la tarea msbuild, encontré una opción para comprimir la KB en la tarea OpenKnowledgeBase, que no está documentada y creo que puede ser útil para KB que tengan varios años de funcionamiento. 

NOTA: El OpenKnowledgeBase tiene otra opcion EventSuspend que tampoco esta documentada y no se bien para que sirva. Si logro descubrirlo, actualizo este post. 

Para lograrlo hice un archivo "CheckKnowledgeBase.msbuild" cuyo contenido es:

<Project DefaultTargets="UpdateFromServerAndBuildAll" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Import Project="$(GXDir)\Genexus.Tasks.targets" />
 <Target Name="OpenKnowledgeBase">
   <OpenKnowledgeBase Directory="$(KBDir)" CompressData="True"  EventsSuspended="True" />
 </Target>
 <Target Name="CheckKnowledgeBase" DependsOnTargets="OpenKnowledgeBase">
   <CheckKnowledgeBase Fix="true" />
 </Target>
</Project>

 hice un archivo de comandos "CompressKB.CMD" que tiene

Los valores marcados con amarillo, hay que cambiarlos para que tengan los correspodientes a sus instalaciones


@echo off

echo ------------------------------------------
echo ---     %~n0%~x0          ----------
echo ---     Parameters        ----------------
set dirFramework="C:\Windows\Microsoft.NET\Framework\v3.5"
set GXDir="C:\Program Files (x86)\Artech\GeneXus\GeneXusXEv2U6"
echo ---     Ask KB Directory  ----------------
set /p KBDir=Enter Knowledge Base Directory :  
echo ---     Check/Compress KB ----------------

call %dirFramework%\MSBuild /nologo CheckKnowledgeBase.msbuild /p:KBDir=%KBDir%;GXDir=%GxDir% /t:CheckKnowledgeBase

echo ---     End               ----------------
echo ------------------------------------------
pause

Al ejecutarlo, los pasos que hará seran:
  • Abrir la KB
  • Comprimir sus datos
  • Si hay indices fragmentados, defragmentarlos
  • Corregir errores internos de la KB 
La salida sera similar a esta:

------------------------------------------
---     CompressKB.cmd          ----------
---     Parameters        ----------------
---     Ask KB Directory  ----------------
Enter Knowledge Base Directory :  C:\Models\Ev2\KBUnificada
---     Check/Compress KB ----------------
Build started 2015-03-14 23:04:26.
Project "C:\Models\Tools\location\CheckKnowledgeBase.msbuild" on node 0 (CheckK
nowledgeBase target(s)).
  ========== Open Knowledge Base Task started ==========
  Compressing Knowledge Base Data (this may take several minutes!)...
  success.
  > Open Knowledge Base Task Success
  ========== Open Knowledge Base Task finished ==========
CheckKnowledgeBase:
  ========== Check Knowledge Base started ==========
C:\Models\Tools\location\CheckKnowledgeBase.msbuild : warning : "Fix" parameter
 specified. Running checks and fixing issues.

  Step 1: Check KnowledgeBase's database integrity
  Index 'PK__ATTRIBUT__365FF6B17F3DEA93' in table 'ATTRIBUTE' is slightly fragm
  ented. Reorganizing this index may improve fragmentation.
  Index 'ATT_SUBTYPE' in table 'ATTRIBUTE' is highly fragmented and should be r
  ebuilt. Rebuilding this index may take some time but reduces fragmentation an
  d improves index performance.
  Index 'PK__CK__E706FD3D5408F3B7' in table 'CK' is highly fragmented and shoul
  d be rebuilt. Rebuilding this index may take some time but reduces fragmentat
  ion and improves index performance.
  Index 'PK__CK_ATRI__FC12A9AA816CD0FC' in table 'CK_ATRI' is highly fragmented
   and should be rebuilt. Rebuilding this index may take some time but reduces
  fragmentation and improves index performance.
  Index 'CKA_ATTRI' in table 'CK_ATRI' is highly fragmented and should be rebui
  lt. Rebuilding this index may take some time but reduces fragmentation and im
  proves index performance.
......
  Composition versioning fixed.
  Step 1 finished. 00:00:03.0693747 elapsed.
  28 issue(s) found, 28 fixed.

  Step 2: Check Entity Version Composition
  Step 2 finished. 00:00:00.2336572 elapsed.
  0 issue(s) found, 0 fixed.

  Step 3: Check Entity Redundant Information
  Step 3 finished. 00:00:00.6322822 elapsed.
  0 issue(s) found, 0 fixed.

  Step 4: Check Subtype Inheritance
  Step 4 finished. 00:00:01.9499611 elapsed.
  0 issue(s) found, 0 fixed.

  Step 5: Check ModelEntityProperty Redundant Information
  Checking properties redundancies issues in version KBUnificada
  Fixing properties redundancies in all objects in version KBUnificada
  Step 5 finished. 00:00:54.9963817 elapsed.
  0 issue(s) found, 0 fixed.

  Step 6: Check LastObjectId and LastVersionId enumerators
  Step 6 finished. 00:00:00.1020560 elapsed.
  0 issue(s) found, 0 fixed.
  > CheckKnowledgeBase Success
  ========== CheckKnowledgeBase finished ==========
Done Building Project "C:\Models\Tools\location\CheckKnowledgeBase.msbuild" (Ch
eckKnowledgeBase target(s)).


Build succeeded.

"C:\Models\Tools\location\CheckKnowledgeBase.msbuild" (CheckKnowledgeBase targe
t) (1) ->
(CheckKnowledgeBase target) ->
  C:\Models\Tools\location\CheckKnowledgeBase.msbuild : warning : "Fix" paramet
er specified. Running checks and fixing issues.

    1 Warning(s)
    0 Error(s)

Time Elapsed 00:01:45.66
---     End               ----------------
------------------------------------------
Press any key to continue . . .

Luego de ejecutarla la KB estará en mejor estado para hacer los build all en menos tiempo y posiblemente con menos problemas. 


UPDATE: Guscarr me hace notar que hay documentación sobre la opcion CompressData en el siguiente SAC.




martes, 23 de diciembre de 2014

Build & Deploy: Resumen del 2014

Mas o menos a esta altura del 2013, empezaba a trabajar con el tema del Build & Deploy de aplicaciones GeneXus.

En un año logramos avanzar bastante en el tema, logrando tenerlo formalizado, habiendo detectado las dificultades y limitaciones actuales y tenemos desarrolladas varias herramientas para facilitar la tarea de la realización de procesos de build y deploy automatizados. Con dichas herramientas logramos bajar el tiempo necesario para tener una versión ejecutable de nuestra aplicación y también la configuración del ambiente.

Lo que no logré fue que el tema interesara dentro de la comunidad, al menos como yo lo había imaginado.  No tuve ni la fuerza ni el liderezgo suficiente como para interesar a actores claves dentro de la comunidad como para que dedicaran recursos para lograr una solución que funcione para mas de una empresa.

Quedan como tareas pendientes:
* mostrar las ventajas de este tipo de herramientas en el desarrollo agil de aplicaciones
* justificar el esfuerzo con la disminución de la tasa de errores

A pesar de no haber logrado una solución para la comunidad, si logramos tener una solución que soluciona alguno de los problemas planteados.

Lo que tenemos ya implementado (para una aplicación con .NET, con GXServer) hace:

Para el Build, si hay algun commit nuevo en GXServer
* Actualización de GXServer, build all
* División de los ejecutables en BuildUnits
* Salvado y envío de Reorganización
* Generación de archivos de comparación de navegaciones
* Envío de mail a todo el grupo de desarrollo de los resultados.
* Generador de borrador de las Releases Notes (lista de commits)

Para los chequeos, dados dos Builds de la aplicación
* Comparación de navegaciones
* Comparación de los WSDL de los servicios publicados.

Para el Deploy
* Instalación del build en el FileSystem
* Adaptación de web.config a client.exe.config al ambiente de instalación.
* Adaptacion de location.xml al ambiente de instalacion
* Configuración de todos los directorios virtuales
* Emisión y configuración de certificados X.509 para pruebas
* Ejecución de scripts de inicialización básica.

Con estas herramientas estamos en condiciones de generar un ambiente de prueba o producción en pocos minutos, cuando se genera un cambio en el sistema.

Por experiencias anteriores, se que este tipo de cambio lleva varios años dentro de la comunidad Genexus, pues las necesidades de las empresas no se dan todas al mismo tiempo y no todos tenemos la misma madurez en nuestros procesos de desarrollo.  Me quedo contento que en un año logramos avanzar bastante, aunque me hubiese gustado haberlo logrado en mas lugares.

Cambiando de tema, este es le POST número 1000 de "Desarrollando desde la trinchera", por lo que brindo por eso.