Mostrando las entradas con la etiqueta GX16. Mostrar todas las entradas
Mostrando las entradas con la etiqueta GX16. Mostrar todas las entradas

domingo, abril 12, 2020

Curso GeneXus for mobile

Este lunes comienzo el curso on-line de GeneXus Mobile en GX 16, el cual se esta dando por una iniciativa de GeneXus de poner disponible este curso a la comunidad.
Este curso siempre se encuentra on-line en modalidad auto-estudio pero en esta oportunidad se hizo una publicación en donde los interesados se anotaban para seguir el curso junto al equipo de capacitación de GeneXus.
La verdad que en versiones pasadas había realizado un acercamiento al generador Mobile pero nunca pude avanzar mucho por falta de tiempo, en esta oportunidad voy a sacarle el máximo provecho que pueda.
Lo poco que pude ver hasta el momento veo que se ha mejorado mucho en la ayuda para instalar el ambiente dado que ahora existe "Android Requirements Installer", esto facilita mucho la instalación cosa que antes era todo manual.


Hasta el momento solo configure el ambiente y estoy a la espera de comenzar este curso para poder implementar un proyecto que tengo en mente. Una aclaración es que si se instala la versión trial la parte de Android se instala sola, en mi caso voy a usar la versión que ya tengo por lo que tuve que instalar el ambiente para Android mediante el "Android Requirements Installer".


martes, diciembre 10, 2019

GX 16 U2 "java.lang.NoClassDefFoundError: org/apache/commons/collections4/bidimap/TreeBidiMap"


Me llegó un reporte de error que tenía un cliente a la hora de generar los reportes excel en el servidor.
El equipo de Desarrollo funcionaba bien pero al hacer el deploy en producción le daba error. La verdad que simplemente busque en google y la solución fue actualizar las "Apache Commons Collections"

El sistema fue desarrollado en GeneXus 16 Upgrade2 generando Java, el servidor de aplicaciones es un Tomcat8 java8.


El error que me daba era el siguiente:

Estado HTTP 500 - java.lang.NoClassDefFoundError: org/apache/commons/collections4/bidimap/TreeBidiMap

type Informe de Excepción

mensaje java.lang.NoClassDefFoundError: org/apache/commons/collections4/bidimap/TreeBidiMap

descripción El servidor encontró un error interno que hizo que no pudiera rellenar este requerimiento.

excepción

javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/commons/collections4/bidimap/TreeBidiMap
at org.apache.poi.hpsf.Section.(Section.java:178)
at org.apache.poi.hpsf.MutableSection.(MutableSection.java:41)
at org.apache.poi.hpsf.PropertySet.init(PropertySet.java:494)
at org.apache.poi.hpsf.PropertySet.(PropertySet.java:196)
at org.apache.poi.hpsf.MutablePropertySet.(MutablePropertySet.java:44)
at org.apache.poi.hpsf.SpecialPropertySet.(SpecialPropertySet.java:47)
at org.apache.poi.hpsf.DocumentSummaryInformation.(DocumentSummaryInformation.java:99)
at org.apache.poi.hpsf.PropertySetFactory.create(PropertySetFactory.java:116)
at org.apache.poi.POIDocument.getPropertySet(POIDocument.java:236)
at org.apache.poi.POIDocument.getPropertySet(POIDocument.java:197)
at org.apache.poi.POIDocument.readPropertySet(POIDocument.java:175)
at org.apache.poi.POIDocument.readProperties(POIDocument.java:158)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.updateEncryptionInfo(HSSFWorkbook.java:2295)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1506)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1428)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1414)
at com.genexus.gxoffice.poi.hssf.ExcelDocument.Save(Unknown Source)
at com.genexus.gxoffice.ExcelDoc.Save(Unknown Source)
at listados_reporteaexcel.privateExecute(listados_reporteaexcel.java:254)
at listados_reporteaexcel.execute_int(listados_reporteaexcel.java:76)
at listados_reporteaexcel.execute(listados_reporteaexcel.java:55)
at alistadorevalida_impl.privateExecute(alistadorevalida_impl.java:274)
at alistadorevalida_impl.webExecute(alistadorevalida_impl.java:60)
at com.genexus.webpanels.GXWebObjectBase.doExecute(Unknown Source)
at alistadorevalida.doExecute(alistadorevalida.java:20)
at com.genexus.webpanels.GXWebObjectStub.callDoExecute(Unknown Source)
at com.genexus.webpanels.GXWebObjectStub.callExecute(Unknown Source)
at com.genexus.webpanels.GXWebObjectStub.doGet(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.genexus.filters.ExpiresFilter.doFilter(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections4.bidimap.TreeBidiMap
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1293)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1145)
... 55 more

com.genexus.webpanels.GXWebObjectStub.callExecute(Unknown Source)
com.genexus.webpanels.GXWebObjectStub.doGet(Unknown Source)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.genexus.filters.ExpiresFilter.doFilter(Unknown Source)

nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/8.0.14 (Debian).
Apache Tomcat/8.0.14 (Debian)

domingo, mayo 05, 2019

Mi primer aplicación migrada a GeneXus 16 U2 ya se encuentra en producción

Desde octubre del 2018 me encuentro trabajando con GeneXus 16 pero por distintos motivos recién hace una semana pude pasar a producción mi aplicación. El sistema del que estoy hablando atiende a todo el País y se encontraba en producción desde hacía un año generado en Java con GeneXus 15.

Mi motivación para migrar a GeneXus 16 se basaba en dos puntos:
a) Actualización tecnológica
b) Poder implementar CI/CD

La decisión de cambiar a GeneXus 16 la base en los puntos que puse arriba y también la oportunidad de implementar grandes cambios solicitados por el cliente, estos cambios iban a necesitar volver a probar todo el sistema por lo que aproveche a sumar a todos los cambios la migración de GeneXus.

La migración de GeneXus 15 a GeneXus 16 fue transparente y no tuve problemas mayores, lo único que me complico un poco fue el cambio que hicieron en GeneXus 16 con los wsdl de los servicios web.

Lo que estaba documentado en las Release Notes no impactaba en mi forma de definir los SDT que exponían mis servicios pero había algo que no estaba en la documentación que me impacto y me cambio los wsdl de varios de mis servicios.

Intente pasar a producción mi aplicación y mi plan de testing no incluía revisar que no existieran cambios en los wsdl de mis servicios web por lo que esto llego a producción, básicamente fue un desastre y todas las aplicaciones clientes que consumen mis servicios web dejaron de funcionar.  Tuve que volver a la versión anterior y trabajar en mejorar mi plan de pruebas.

La forma que tuve de arreglar los wsdl fue modificando el código java generado por GeneXus a mano dado que no era viable pedirle a todos los clientes que consumían mis servicios que volvieran a consumir y regenerar sus programas. (En el U3 en teoría existe una propiedad que arreglaría mi problema)

En síntesis el problema que tuve es que mi plan de pruebas no cubría todo lo que debería cubrir y fue un descuido de mi parte pero me sirvió de experiencia ya que dado ese incidente pude mejorar mucho la calidad de mis pruebas.

También a nivel de desarrollo comenzamos a implementar pruebas unitarias y otras mejoras que surgieron a partir de este incidente.

Comparto mi experiencia con el resto de la comunidad para que pierdan el miedo a ir cambiando de versión ya que el problema en sí no es el cambio de versión de GeneXus si no la calidad que tengamos en nuestro plan de pruebas o que tan maduro estemos en QA. Creo que existe la necesidad de integrar mas calidad a nuestros desarrollos para que nos permitan ir migrando de versión y no quedar estancados en el tiempo.

En lo personal estoy aprendiendo mucho y me estoy metiendo en implementar prácticas que permitan hacer grandes cambios en desarrollo sin tener miedo a que se pueda romper algo. La industria del software necesita que estemos actualizados y tenemos que prepararnos para poder hacer esto sin miedo, de lo contrario vamos a estar trabajando en proyectos con GeneXus 9 por varios años.

En síntesis después de algunos meses de sufrir y aprender mucho pude poner en producción mi aplicación desarrollada con GeneXus 16 y comenzar un proceso de cambio mejorando mis procesos de Desarrollo.


















Pruebas Unitarias en GeneXus

Dentro de la comunidad GeneXus no existe mucho apego a las pruebas unitarias o no es una práctica común, por lo menos esa es mi impresión. En realidad si tengo que ser justo veo que las pruebas unitarias no son utilizadas por muchos programadores independientemente del lenguaje que usen.

Dentro de la industria existen muchas empresas que tienen dentro de sus prácticas la utilización de pruebas unitarias pero no lo veo muy adaptado por parte de los programadores o la mayoría de los que pude hablar lo ven como algo que les quita tiempo.

Estudiando el tema dentro de la comunidad no pude encontrar muchas opiniones sobre el tema y lo que pude encontrar esta relacionado a GX-Unit que lo intente comentar en otros artículos de este blog.

En la comunidad la persona que se ha preocupado mas por el tema es Enrique Almeida y podrán encontrar varios artículos en su blog. En GeneXus 16 encontramos la posibilidad de crear "Unit Test" de forma automática la cual pueden encontrar toda la información en el siguiente link.

En síntesis GeneXus cuenta con una herramienta incluida en el IDE la cual nos permite crear pruebas unitarias de forma automática, esta herramienta es gratuita para el desarrollador pero si quiero usar estos "unit test" con mis procesos de Integración Continua (CI/CD) tengo que adquirir una licencia.

En mi experiencia con los años pude entender la importancia de las pruebas unitarias y se han convertido en una necesidad para poder brindar la calidad que los productos en los que trabajo me exigen. Esto me llevo a evaluar las herramientas existentes para GeneXus y las diferentes opiniones de miembros de la comunidad pero mi conclusión final es que las herramientas existentes tienen mucho camino por recorrer para poder cubrir todas nuestras necesidades.

Un problema de las herramientas existentes para GeneXus es que al ser poco utilizadas por la comunidad no le damos la oportunidad de que mejoren para cubrir nuestras necesidades.

En la actualidad me encuentro en un proyecto que necesita hacer refactoring y cambios grandes de arquitectura pero si no logro tener pruebas unitarias se me hace muy difícil garantizar que los cambios que hago no rompan parte de las funcionalidades existentes en el sistema.

Por este motivo estoy implementando pruebas unitarias a medida que voy modificando el código del sistema y voy a compartir mi experiencia en un próximo artículo, de todas maneras adelanto que estoy usando parte de los "unit test" de GeneXus y por otro lado programar mis pruebas unitarias a mano para poder cubrir mis necesidades.

















miércoles, febrero 06, 2019

GeneXus 16 Upgrade 2

El día de ayer se ha liberado el Upgrade 2 de GeneXus 16, toda la información necesaria para descargarla los pueden obtener en la wiki de genexus.

En mi caso me encuentro liberando una versión de mi sistema y aproveche a instalarme el U2 generando todo nuevamente, de esta manera aprovecho el testing que se iba a realizar con la última versión de GeneXus.

Entiendo que para algunos puedo estar loco pero quiero mantenerme en lo último y esta fue una buena oportunidad de testear la versión generando en la última versión.

Espero no tener problemas ya que me la jugue a ciegas. :-)



miércoles, octubre 03, 2018

Usar GeneXus 16 contra GXserver 15

El título es extraño pero es una realidad que intente simular ya que tengo una oportunidad de migrar mis kbs que están en GX15 a GX16 pero no el GXServer.  En el evento tuve la oportunidad de preguntar al equipo de GXServer que pasaba en este caso y obviamente no recomendaban hacer esto.

Dado que quiero arrancar ya mismo con GX16 comence abriendo la kb y haciendo Rebuild-All, no tuve problemas por lo que probé la aplicación y en principio todo funciona bien. Ahora solo me quedaba probar contra GXserver que se encuentra en GX15 u9. Al probar hacer update no tuve problemas por lo que me había puesto contento, el problema lo tuve cuando quise hacer un commit de mi kb (GX16) contra GXServer (GX15) ahí salieron mensajes de error que de alguna manera los estaba esperando.

Error al hacer commit:

error: GeneXus Server: Error reading from export file.
error: GeneXus Server: An error occurred in File 'strbase64tofile_java' : Error reading from export file.
Invalid property 'JavaExtract'.
Invalid property 'NetExtract'.

error: GeneXus Server: Could not commit changes
Commit Failed

Este error me dio con un archivo pero también me da algo parecido con otros tipos de objetos.

En síntesis no voy a poder seguir mi desarrollo con GX16 hasta que no pueda actualizar la versión de GXServer.


martes, octubre 02, 2018

Mi primer error en GeneXus 16 (error: GeneXus Module installation failed)

En el día de ayer instale GX16 en mi equipo y hoy comence por abrir una KB que estaba en GX15, mi equipo tiene Windows 7 con permisos de administrador.

Al abrir la kb e intentar hacer un "Rebuild All" tuve el siguiente mensaje de error:

========== Build All started ==========
warning: Updating 'GeneXus' module version from 1.9.4.120900 to required 2.0.9.127528.
error: GeneXus Module installation failed.
Build All Failed

Revisando un poco el problema me di cuenta que no se estaba copiando el modulo de Genexus pero si creaba la carpeta correspondiente. En mi equipo la carpeta que creaba es la siguiente:
C:\Users\vmwin7\AppData\Roaming\GeneXus\GeneXus\16\Modules_v1.0\GeneXus_4f454e73-7d8f-4a0f-908a-1a355f3634a5\2.0.9.127528

Pero faltaba el archivo: GeneXus_2.0.9.127528.opc

La solución fue copiar el archivo: F:\GeneXus\GX16\Modules\GeneXus_2.0.9.127528.opc a la carpeta:

C:\Users\vmwin7\AppData\Roaming\GeneXus\GeneXus\16\Modules_v1.0\GeneXus_4f454e73-7d8f-4a0f-908a-1a355f3634a5\2.0.9.127528

Luego al abrir la KB y hacer "Rebuild All" el resultado fue el esperado. Seguramente este error es algo de mi instalación y se podría haber solucionado corriendo el /install pero al hacer lo que puse arriba quedo solucionado.

Estoy muy motivado a comenzar a trabajar en esta versión y subir mis resultados para compartirlos con el resto de la comunidad.











  

lunes, octubre 01, 2018

Instalando GX16

A pesar de que estuve probando la versión beta de GX16 en el día de hoy hice la instalación de GX16 la primera versión liberada. En principio no tuve problemas y lo único que me solicito es que instalara .Net Framework 4.7.1, ya que estaba instale el .Net Framework 4.7.2.

Mi equipo tiene Windows 7 y aproveche el .Net Framework 4.7.2 para poder instalar GeneXus Protection Server (9751) para mantener la compatibilidad con las licencias anteriores. 

En cuanto al licenciamiento al instalar GX16 nos pide que actualicemos la licencia, la verdad que esto es un problema ya que me obligan a desinstalar mis licencias y enviarlas a claves para que me las actualicen. Entiendo que esto es un proceso de seguridad pero tengo que admitir que me gustaría que no se hiciera esto para permitirme comenzar a trabajar en GX16 rápidamente y no tener que esperar a actualizar mis licencias.


Ahora me queda pedir las nuevas licencias y comenzar a migrar mis kbs a GX16.