jueves, 21 de julio de 2016

StackOverflow Documentation

En StackOverflow pusieron en BETA Documentation. 


Es un lugar donde se pueden subir ejemplos de código de diferentes lenguajes.
La gente puede votarlos por utilidad y también clasificarlos por version para la que sirve, etc.

Me parece buen lugar donde empezar a generar ejemplos de GeneXus para darle mas visibilidad y mostrar como se pueden hacer cosas sofisticadas con poco código.
Tiene de malo, que no todo lo que modelamos con GeneXus se traduce a código, por ejemplo, las estructuras de transacciones y SDT, la definición de variables, el editor abstracto, los patrones, etc, pero para procedures y eventos y reglas, puede funcionar muy bien.

Al menos, pondría ahí un ejemplo de cada una de las palabras claves de Genexus, de sus tipos de datos y external objects standard.

Si logran hacer con la documentación, lo mismo que hicieron con las preguntas y respuestas de programacion el resultado puede ser bueno.

UPDATE
Marcos me comentó que el tag #GeneXus aun no tiene movimiento suficiente como para ingresar documentación. Ser pocos tiene estos problemas. Hay que hacer un poco mas de ruido para que nos escuchen.

martes, 19 de julio de 2016

Migrando de GeneXus Evolution 2 a GeneXus Evolution 3.

Estamos realizando una migración de version de GeneXus, a la última liberada.



Algunas de las tareas involucradas fueron las siguientes

Comparación de Navegaciones. 

Use el KBDoctor para comparar las navegaciones de la Evolution 2 con la Evolution 3.
Unos cuantos objetos cambiaron su navegación, pues ahora cambia el ORDER de algunas sentencias.
En general, el criterio que vi es que toma en cuenta las condiciones del WHERE para considerar el orden. Parece mejor en casi todos los casos, pero igual hay que chequear contra la base de datos para ver si alguna sentencia que estaba optimizada no tiene problemas de performance.


Comparación de WSDL de servicios publicados. 

Tuvimos diferencias en algunos pocos WSDL publicado, pero era por habíamos dejado el Namespace de la KB en su valor por default y como la KB toma el nombre de la KB como Namespace, al cambiar de KB cambiaba la definición del WSDL. Detectamos el problema y lo solucionamos rapido.

Objetos con  código nativo.

Tenemos algunos programas externos, que tuvieron que cambiar porque usabamos el metodo cleanup() que paso de ser private a public override.

Shell, SQL, Stored Procedure

Las llamadas al Shell, SQL y Stored Procedures, funcionaron sin problemas.

Excel, PDF, XMLWriter, XMLReader, Envio de Mail

No tuvimos diferencias en el funcionamiento.

GXFlow

Tuvimos inconvenientes en la creación de tablas de Workflow y en la ejecución de la actualización de la base de datos. Con el cliente Oracle de 32 bits, los programas daban error, diciendo que el cliente oracle no era compatible con el data provider.
Tuvimos que cambiar los exes que están bajo Packages/gxpm/platfom y ejecutarlo con el comando

corflags  /32BITREQ+

y marcarlos para forzar la ejecución de 32bits.

Cliente Oracle. 

En versiones anteriores  de aplicaciones GeneXus teníamos restricciones con cual version del dataprovider teniamos que usar, pues tenia que ser la misma con la que había sido compilado.
Ahora no tuvimos problemas en usar el dataprovider que estábamos usando.

Scripts de Build y Deploy. 

Hicimos varios cambios, porque estamos aprovechando la migración para dejar únicamente el generador WEB. Tenemos muchos procesos batch que se generan con el generador WIN en Evolucion 2 y ahora pasan a generarse todo con el generador WEB.
Hice un programa que cambia los generadores y eso facilito la tarea.


Cosas que nos falta probar

  • Data Type.WebSession, Data Type.WebWrapper, Data Type.Cookie, Data Type.Directory, Data Type.File
  • Data Type.HttpClient, Data Type.HttpRequest, Data Type.HttpResponse, Data Type.Location
  • Data Type.Queue, Data Type.QueueMessage, Data Type.RegExMatch, Data Type.Window
  • Todos los User Controls. (son 17!!)
Vamos bien, ya estamos haciendo pruebas manuales y vamos a seguir con las pruebas automatizadas. 


sábado, 16 de julio de 2016

Codigo simple

Terminé de leer el libro Code Simplicity.



Trata el tema de desarrollo de software desde un angulo poco tecnico, pero tiene algunas cosas que me resultaron interesantes.

Enumera varias "leyes" que rigen el desarrollo de software.

A la que llama ecuación del diseño de software  que intenta medir como debo diseñar algo para hacer un cambio a un sistema.




Donde

  • D es lo deseable que puede ser un desarrollo, 
  • Vn es el valor actual de desarrollar una nueva feature
  • Ei es el esfuerzo actual al desarrollar esa feature 
  • Vf es el valor que va a tener dicha feature en el futuro
  • Em es el valor de mantener dicha feature. 


Si dicha característica (feature) va a ser usada durante mucho tiempo, la ecuación va a tender a


La conclusion que puede sacarse, es lo que los desarrolladores sabemos por experiencia, que conviene dedicarle tiempo al diseño, para lograr simplificar el software de forma que sea mas fácil de mantener en el futuro.

O dicho de otra forma, es mas conveniente reducir el esfuerzo de mantenimiento futuro, que el esfuerzo de implementación.

Por eso, creo que trabajar en lograr código mas simple y fácil de entender, es vital para aquellas empresas que pretendan mantenerse en el mercado por largo tiempo, con un sistema.




martes, 12 de julio de 2016

PIENSOPIENSO: Cual es la salida de este programa?

Temgo una tabla de Paises que esta vacia, en una KB GeneXus, generando con C#

*PaisID           C(2)
PaisNombre    C(100)

y un procedimiento Command line

//Doy de alta un registro en la tabla. 
&PaisNombre='Uruguay'
New
   PaisID='UY'
   PaisNombre=&PaisNombre
EndNew

//Consulto 1 Con Trim()
for each
    where PaisNombre=&PaisNombre.Trim()
    Msg(PaisID,status)
when none
    Msg('No existe 1',status)
endfor

//Consulto 2 Sin Trim()
for each
    where PaisNombre=&PaisNombre
    Msg(PaisID,status)
when none
    Msg('No existe 2',status)
endfor

//Consulto con Trim() en variable
&PaisNombre=&PaisNombre.Trim()
for each
    where PaisNombre=&PaisNombre
    Msg(PaisID,status)
when none
    Msg('No existe 3',status)
endfor

!) Cual es la salida de este programa en SQL Server. 

2) Cual es la salida de este programa en Oracle

Justifique su respuesta. 


UPDATE:
David ya dio las respuesta correcta en los comentarios, pero lo dejo aqui

En SQL Server, la salida es 

UY
UY
UY

y en ORACLE, la salida es
No existe 1
UY
UY

O sea, el mismo codigo GeneXus, hace cosas diferentes con diferentes bases de datos. La culpa de esto es que las funciones de trim en la base de datos, devuelven tipos de datos diferentes, en SQL Server y Oracle, por lo que hay que tener mucho cuidado. 
Cuando el trim lo hace GeneXus, funcionan en forma equivalente, pero si la condicion se evalua en el DBMS hay que tener cuidado. 




&PaisNombre.Trim()
for each
   where PaisNombre=&PaisNombre

NO ES EQUIVALENTE A


for each
    where PaisNombre=&PaisNombre.Trim()


aunque parezca lo mismo.

En este caso, PaisNombre es C(100) y &PaisNombre tambien, pero el Trim() devuelve un varchar, por lo que la comparacion no devuelve nada, si PaisNombre tiene blancos al final.


viernes, 8 de julio de 2016

Reflexiones sobre Machine Learning y los ingenieros de software.

Me pareció interesante el articulo  Machine Learning Driven Programming: A New Programming For A New World.

Uno de sus párrafos dice:

The software engineer is out of the loop. Instead, data flows into a machine learning component and a representation flows out.


lo cual me hizo presta mas atención aun.

Para algunos problemas, ya las computadoras pueden realizar un mejor aproximación a las soluciones uqe podemos lograr con programas tradicionales. La mayoría de estos problemas tienen muchos datos, salidas conocidas y no varían mucho a través del tiempo. 

Por ejemplo, reconocer rostros, reconocer imágenes, clasificar huellas, detección de patrones, clasificación de textos libres son buenos candidatos para hacer un modelo matemático (redes neuronales o algún otro) y sustituir parte de los programas que hasta ahora hacemos en forma manual y ya incorporarlos a nuestros sistemas. 

Tal como dice el articulo, se va a necesitar menos ingenieros de software y mas especialistas en los datos  Ofertas como Tensorflow o Watson hacen cada vez mas fácil incorporar esto a nuestras aplicaciones. 

Ejemplo
Supongamos que quiero sustituir un programa hecho a mano de Liquidación de Sueldos por un algoritmo generado por una maquina. 
 
Debería conseguir un conjunto suficientemente grande de datos del tipo

(Variables de Entrada, Variables de Salida)

donde la variable de entrada serian todas las que hoy necesitan para realizar la liquidación de sueldos por ejemplo horas trabajadas, días trabajados, días de licencia, salario mensual, jornal, edad, antigüedad, retenciones judiciales, etc

Las salidas serian lo que sale en un recibo de sueldos, Salario, impuestos, retenciones, etc. 

Divido los datos en datos de entrenamiento y datos de prueba. 

Entrenaría al modelo  hasta que los resultados tengan diferencias menores a un limite preestablecido. y después hay que chequear con los datos de prueba, para comprobar que con datos diferentes a los del entrenamiento, sigue dando resultados correctos. 

La duda es si siempre puedo conseguir un modelo que aproxime bien los datos, en tiempos aceptables. 

Este ya es un punto interesante, el modelo se acepta cuando es "suficientemente exacto". 
En programas hechos por humanos, se tiene la sensación que son correctos y calculan bien los sueldos para el 100% de los casos, cosa que los informáticos sabemos que s muy difícil de aceptar. 

Sustituyendo programas por modelos, se hace mas visible que la solución es un buena aproximación a la solución, pero nunca 100% exacta, lo cual es algo bueno. 

Mantenimiento. Que pasa cuando cambia la realidad?
Para seguir con el ejemplo, que pasa si el gobierno define un cambio en la forma en que se liquidan los sueldos?.  Por ejemplo, define que hay que pagar 1000 $ adicionales por cada persona que tenga mas de 5 años de antigüedad.

El especialista de los datos, debería modificar los datos de entrenamiento y para cada persona que tenga mas de 5 años de antigüedad, debería modificar la salida en 1000$ y calcular los impuestos y demás. Una vez terminado esto, debería volver a entrenar al  modelo y repetir el proceso. 

Pruebas
Otro articulo, (Is artificial intelligence in software testing coming to you?)  habla sobre como puede usarse la inteligencia artificial para probar nuestros sistemas. 

Otras tareas de la construcción de software (deploy, seguridad, requerimientos, documentación, mesa de ayuda) también pueden verse afectadas con uso de Machine Learning en el proceso.  

Conclusiones
Por ahora no tengo conclusiones para sacar, pero si es claro, es que todos los ingenieros en sistemas y programadores tenemos que prestar atención a estas tecnologías, pues van a afectar nuestro futuro (y nuestro presente) en forma muy significativa. Hay mucho para aprender y muchos problemas nuevos por resolver.