viernes, junio 03, 2016

Ejecutar aplicaciones VFP en UBUNTU

Resulta importante considerar la opcion de utilizar Ubuntu, para poder utilizar aplicaciones de windows con vfp se debe hacer lo siguiente:

1.- Instalar el WINE.
2.- Instalar el winetricks
3.- Ejecutar winetricks seleccione la opcion select default the wineprefix
4.- Seleccionar a Windows DLL or Component.
5.- Seleccionar jet40, mfc42 y mdac28, msvcirt
6.- En una terminal ejecute: sudo apt-get install iodbc
7.- Ejecutar iodbcadm-gtk
8.- Instalar linuxODBCsudo apt-get install unixodbc unixodbc-dev









Genexus consumir servicios web SOAP con VFP.



Event Enter
        &HttpClient.Host     =    "laip"
        &HttpClient.BaseUrl =    "/carpetaapl/servlet/"
        &BaseUrl             =    "servicowebsoap"     
        &EscribeXml.openRequest(&HttpClient)
        &EscribeXml.WriteStartDocument('utf-8')
            &EscribeXml.WriteStartElement("soapenv:Envelope")
                &EscribeXml.WriteAttribute("xmlns:soapenv", "http://schemas.xmlsoap.org/soap/envelope/")
                &EscribeXml.WriteAttribute("xmlns:gxe2", "gxe2_aplicacion")      
                &EscribeXml.WriteElement("soapenv:Header")               
                &EscribeXml.WriteStartElement("soapenv:Body")

                &EscribeXml.WriteStartElement("gxe2:procedimiento.Execute")                            &EscribeXml.WriteElement("gxe2:I_Cliente", "8888")                   
                        &EscribeXml.WriteElement("gxe2:I_NombreCliente", &ClienteNom.ToString())     

                   &EscribeXml.WriteEndElement()                       
                &EscribeXml.WriteEndElement()
            &EscribeXml.WriteEndElement()       
        &EscribeXml.Close()
        &HttpClient.Execute('POST',    &BaseUrl)
        &CodigoError            =    &HttpClient.ErrCode
        If    &CodigoError >    0
            &Mensaje    =    &HttpClient.ErrDescription
        Else
            &Retorno     =     &HttpClient.ToString()
            &LeeXml.openResponse(&HttpClient)       
            &LeeXml.ReadType(1, 'Cliente')
            &ClienteCodigo    = &LeeXml.value
            &LeeXml.ReadType(1, 'NombreCliente')
            &ClienteNombre    = &LeeXml.value
        Endif  
 


Tipo de Variables:
&HttpClient Tipo HttClient
&EscribeXml Tipo XmlWriter
&LeerXml  Tipo XmlReader
&BaseUrl Tipo VarChar
&CodigoError Tipo Numerico de 8 de largo.
&Mensaje Tipo VarChar.
&ClienteCodigo Tipo VarChar.
&ClienteNombre Tipo VarChar.
&Retorno Tipo LongVarChar.

sábado, mayo 07, 2016

Acceso al TOMCAT 7 - desplega el error 403

Se debe configuarar el archivo tomcat-users.xml

De la siguiente manera

<tomcat-users>
    <role rolename="manager"/> #access the HTML interface 
    <role rolename="manager-gui"/>
    <role rolename="admin"/>                                           
    <role rolename="admin-gui"/>
  <user username="admin" password="admin" roles="admin,admin-gui,manager,manager-gui"/>
</tomcat-users>

Otro tema a tomar en cuenta es cuando uno de los parametros es numerico y es mayor o igual a 18 digitos.

Tener en cuenta esta situaciòn.

domingo, marzo 20, 2016

Genexus PushNotificaction con el Generador de Java




Para superar algunos problemas con el proceso de notificar a los usuarios de Telefonos inteligentes, esecialmente en el caso del Generador Java de Genexus Evolution 3 Upgrade 5 o en adelante.


Se comparte la experiencia con breves anotaciones para poder avanzar en ese sentido y no tener los tipicos tropiezos que resulta al momento de utilizar e integrar plataformas diferentes, para el caso tomamos como referencia el SAC #36306, que nos ayuda mucho en resolver el problema, con sus respectivas sugerencias, recuerde que son dos momentos que se tienen que integrar DESDE EL DISPOSITIVO Y DESDE LA APLICACION WEB, ese uno se debe tener claro.


Configurar en Google Cloud Messaging

 SAC #36306: No se está enviando el parámetro Parameters del método CallActions de las Notifications Push
Sorry, no English translation available; Spanish version displayed.


Abstract
El método CallAction del objeto externo Notifications dispone de un parámetro llamado  Parameters, el cual es utiliza para enviar un dato como parámetro en la notificación.
Dicho parámetro configurado desde GeneXus no está siendo enviado al servicio de mensajería (de Google o Apple) que procesa la notificación.
Detailed description
Se tiene una app que recepta notificaciones. Se desea que al momento de recibir la notificación en el DISPOSITIVO, se ejecute un determinado SD Panel, con un o mas parámetros. Citemeos un ejemplo, al enviar la notificación sobre determinada oferta de producto, abrir directamente una VISTA de ese producto.

El método CallActions del objeto Notifications permite configurar el evento que seria ejecutado en el DISPOSITIVO, cuando este se recibe la notificación y uno o mas parámetros.

El problema es que dicho parámetro &Parameters no está siendo considerado al momento de invocar el servicio de mensajería.

Ejemplo:
Supongamos que nuestra app tiene un SD Panel llamado "SDPanel1" , y en el mismo se define el evento "Ver_Cliente" , para invocar al Ver  cliente con el parámetro recibido en la notificación.

Event 'Ver_Cliente'
       Composite
           &ClienteId = &PARAMETRO.Trim().ToNumeric()
           WorkWithDevicesCliente.Cliente.Detail(&ClienteId)
       Endcomposite
Endevent

Siendo este el código del objeto Web que dispara la notificación desde el server:

&NotificationParameters.SetParameter('PARAMETRO', &ClienteId.ToString())
for each //para todos los Dispositivos
       &Notifications.CallAction('SDPanel1',DeviceType,DeviceToken,&message, 'Ver_Cliente', &NotificationParameters)
endfor

Siendo:
- 'SDPanel1' el main SD que recibe la notificación
- &message el mensaje a recibir en la notificación
- 'Ver_Cliente' el evento definido en SDPanel1, que debe ejecutarse al receptar la notificación.

El problema es que el parámetro &NotificationParameters no está siendo considerado en la llamada al servicio.
Por lo tanto la app si bien recibe la notificación y ejecuta el evento correspondiente (Ver_Cliente), no recibe el parámetro en la variable &PARAMETRO.

Work around
Hay dos alternativas :
1. Utilizar el método SEND. El método Add/Send es otra opcion para enviar todos los mensajes a la vez al servicio de mensajeria. El SDT RemoteNotification de dicho método también tiene la posibilidad de configurar parámetros y en ese caso funciona.
Importante: Este método no esta disponible para todos los generadores. Por más info ver URL de Referencia

2. Para el caso de Android , en lugar de utilizar el método CallAction que dispone Genexus, realizar el POST al servicio de Google en forma manual, con HttpClient, de tal manera que resulte el envio del parámetro adicional.

El codigo para invocar al servicio rest, lo describimos a continuacion:

For each
&HttpClient.Host = 'android.googleapis.com'
&HttpClient.BaseUrl = '/gcm/'
&HttpClient.AddHeader(!'Authorization', !'Key=<ANDROID SENDER API KEY>') //Es el valor de la prop con ese nombre en el main SD.
&HttpClient.AddHeader(!'Content-Type', !'application/x-www-form-urlencoded;charset=UTF-8')

&Msg = 'registration_id='+ DeviceToken +'&collapse_key=0&data.payload='+ &message +'&data.action=Ver_Cliente&data.parameters=[{"PARAMETRO":"'+&ClienteId.ToString()+'"}]'


En resumen es una trama JSON.

&HttpClient.AddString(&Msg)
&HttpClient.Execute(!'POST',!'send')
Endfor

________________________________________________________________________________
________________________________________________________________________________

En el siguiente SAC hace referencia a este problema que lo identificamos para dar solución, a continuacion transcribimos el contenido del sac y sus comentarios.
SAC #36306: No se está enviando el parámetro Parameters del método CallActions de las Notifications Push


Abstract
El método CallAction del objeto externo Notifications dispone de un parámetro Parameters, el cual se utiliza para enviar un parámetro en la notificación.
Ese parámetro configurado desde GeneXus no está siendo enviado al servicio de mensajería (de Google o Apple) que procesa la notificación.

Detailed description
Se tiene una app que recibe notificaciones. Se desea que al momento de recibir la notificación en el device, se ejecute un determinado SD Panel, con un cierto parámetro. Por ejemplo, al enviar la notificación sobre determinada oferta de producto, abrir directamente el View de ese producto.

El método CallActions del objeto Notifications permite configurar el evento a ser disparado en el device cuando se recibe la notificación y un parámetro para el mismo.

El problema es que ese parámetro &Parameters no está siendo considerado al momento de invocar el servicio de mensajería.

Ejemplo:
Supongamos que nuestra app tiene un SD Panel llamado "SDPanel1" , y en el mismo se define el evento "Ver_Cliente" , para invocar al View del cliente con el parámetro recibido en la notificación.

Event 'Ver_Cliente'
      Composite
          &ClienteId = &PARAMETRO.Trim().ToNumeric()
          WorkWithDevicesCliente.Cliente.Detail(&ClienteId)
      Endcomposite
Endevent


Y este es el código del objeto Web que dispara la notificación desde el server:

&NotificationParameters.SetParameter('PARAMETRO', &ClienteId.ToString())
for each //para todos los devices
&Notifications.CallAction('SDPanel1',DeviceType,DeviceToken,&message, 'Ver_Cliente', &NotificationParameters)
endfor

Siendo:
- 'SDPanel1' el main SD que recibe la notificación
- &message el mensaje a recibir en la notificación
- 'Ver_Cliente' el evento definido en SDPanel1, que debe ejecutarse al ver la notificación.

El problema es que el parámetro &NotificationParameters no está siendo considerado en la llamada al servicio.
Por lo tanto la app si bien recibe la notificación y ejecuta el evento correspondiente (Ver_Cliente), no recibe el parámetro en la variable &PARAMETRO.

Work around
Hay dos alternativas :
1. Utilizar el método SEND. El método Add/Send es otra opcion para enviar todos los mensajes a la vez al servicio de mensajeria. El SDT RemoteNotification de dicho método también tiene la posibilidad de configurar parámetros y en ese caso funciona.
Importante: Este método no esta disponible para todos los generadores. Por más info ver http://wiki.genexus.com/commwiki/servlet/hwikibypageid?18150

2. Para el caso de Android , en lugar de utilizar el método CallAction que dispone Genexus, realizar el POST al servicio de Google en forma manual, con HttpClient, de forma tal de poder enviar ese parámetro adicional.

El codigo para invocar el servicio rest, siguiendo el ejemplo anterior, sería así:

For each 
    Where DeviceId = &DeviceId
&HttpClient.Host = 'android.googleapis.com'
&HttpClient.BaseUrl = '/gcm/'
&HttpClient.AddHeader(!'Authorization', !'Key=<ANDROID SENDER API KEY>') //Es el valor de la prop con ese nombre en el main SD.
&HttpClient.AddHeader(!'Content-Type', !'application/x-www-form-urlencoded;charset=UTF-8')

&Msg = 'registration_id='+ DeviceToken +'&collapse_key=0&data.payload='+ &message +'&data.action=Ver_Cliente&data.parameters=[{"PARAMETRO":"'+&ClienteId.ToString()+'"}]'

&HttpClient.AddString(&Msg)
&HttpClient.Execute(!'POST',!'send')

    if &HttpClient.ErrCode <> 0
        msg(&HttpClient.ErrDescription)
    else
        msg('Notificación Enviada Exitosamente')
    endif
When none
    msg('No se Encontro Dispositivo !!')
Endfor


Referencias:
Informacion para configurar un Ambiente
PUSH Notificaciones
   Configurando Push Notifications en Android Applications,
    Configuriando Google Cloud Messaging for Android,

viernes, marzo 18, 2016

Generar web.xml desde el mismo Genexus








&Directorio.Source = 'C:\Tomcat7webapps\miaplicacion\WEB-INF\classes'
msg('Directorio '  + &Directorio)
if &Directorio.exists() 
    msg("Este directorio si EXISTE!")
else
    msg("ESTE DIRECTORIO NO EXISTE !")
endif

&i = dfwopen("miweb.xml"," ",'')
&i = dfwptxt("----------------")
&i = dfwnext()

for &auxFile in &directorio.GetFiles('class')
&i = dfwptxt("<servlet>")
&i = dfwnext()
&pos = StrSearch(&auxFile.GetName(),'.class',1)
&pos = &pos - 1
&cadena = Substr(&auxFile.GetName(),1,&pos)
&cadena = "<servlet-name>" + trim(&cadena) + "</servlet-name>"
&i = dfwptxt(&cadena.Trim())
&i = dfwnext()
&cadena = Substr(&auxFile.GetName(),1,&pos)
&cadena = "<servlet-class>" + trim(&cadena ) + "</servlet-class>"
&i = dfwptxt(&cadena.Trim())
&i = dfwnext()
&i = dfwptxt("</servlet>")
&i = dfwnext()
endfor


&i = dfwptxt("----------------")
&i = dfwnext()

for &auxFile in &directorio.GetFiles('class')
&i = dfwptxt("<servlet-mapping>")
&i = dfwnext()
&pos = StrSearch(&auxFile.GetName(),'.class',1)
&pos = &pos - 1
&cadena = Substr(&auxFile.GetName(),1,&pos)

&cadena = "<servlet-name>" + trim(&cadena ) + "</servlet-name>"
&i = dfwptxt(&cadena.Trim() )
&i = dfwnext()
&cadena = Substr(&auxFile.GetName(),1,&pos)
&cadena = "<url-pattern>/servlet/" + trim(&cadena ) + "</url-pattern>"
&i = dfwptxt(&cadena.Trim() )
&i = dfwnext()
&i = dfwptxt("</servlet-mapping>")
&i = dfwnext()
endfor

    &i = dfwclose()           

Return


jueves, enero 28, 2016

Actualizar Certificados del SRI



Sistema operativo LINUX - CENTOS. 

1.- Localizamos el archivo cacerts
      locate cacerts
2.- Eliminar el archivo  cel_sri_gob_ec.cert.
      rm -f cel_sri_gob_ec.cert
3.- Procedemos a descargar el nuevo certificado, pero antes es necesario cerciorarse de la publicacion exacta de dichos archivos.
      wget http://www.sri.gob.ec/certificados/cel_sri_gob_ec.cert

 4.- Seguidamnete se procede a descargar el siguiente archivo:
      http://www.sri.gob.ec/certificados/celcer_sri_gob_ec.cert
5.- Ubicarse en la carpeta donde esta instalado el JDK.
     cd /opt/java/jdk1.8/jre/bin
6.- Ejecutar el siguiente comando, para eliminar el certificado anterior, para ello debemos proporcionar la siguiente clave: changeit
     keytool -delete -alias celsricert -keystore cacerts 
     keytool -delete -alias celcersricert -keystore cacerts
7.- Se procede a la importación del nuevo certificado.
     keytool -import -alias celsricert -keypass changeit -keystore cacerts -file cel_sri_gob_ec.cert 
 
8.- Seguidamente procedemos a importar el siguiente certificado:
     keytool -import -alias celcersricert -keypass changeit -keystore cacerts -file celcer_sri_gob_ec.cert

9. Reiniciar los servicios del servidor de aplicaciones.


A continuation otra forma de realizarlo mas rapidamente.
 

El almacen de claves se llama: cacerts
La clave de acceso es: changeit

Debemos ubicarnos en la carpeta que contiene el almacen de claves.
1.- El primer comando,  revisa si existe el certificado con ese nombre celsricert

keytool -list -v -keystore cacerts | grep  celsricert
2.- Eliminar el certificado anterior llamado celsricert
keytool -delete -alias celsricert -keystore cacerts
3.- Importamos al nuevo almacen de certificados el certificado nuevo: cel_sri_gob_ec.cert
keytool -import -alias celsricert -keypass changeit -keystore cacerts -file cel_sri_gob_ec.cert 

miércoles, enero 27, 2016

Alternativas para IIS

Vamos a citar algunas alternativas a IIS opensource.

1.- Nuestra primera alternativas.


2.- Un conector para Apache 2, el mismo corre en LINUX, se requiere descargar el siguiente PLUGIN .

Conector a APACHE para ejecutar ASP.NET
3.- Es interesante revisar C# WebServer proyecto basado en Codeplex.
4.- Otro proyecto Kayak proyecto basado en Google Code. 
6.- Le puede ser util tambie el proyecto Abyss Web Server.
http://www.aprelium.com/abyssws/


Fuente: Forum stackoverflow.com

viernes, enero 08, 2016

GxFlow puesta en Produccion

 




































Uno de los problemas recurrentes es justamente llevarlo a produccion una aplicación que incluye GxFlow.

Para ello debemos tomar en cuenta las recomendaciones que se detallan en el siguiente link: Configurar GxFlow en Produccion

En el caso de Windows habria que copiar el agxpgetlicinfo.jar en la carpeta c:/tomcat7/lib

Copiar el archivo "Protect.ini"  que se ubica en C:\Program Files\Artech\GXflow\GXflowXEv3\LicMgr or C:\Program Files (x86)\Artech\GXflow\GXflowXEv3\LicMgr a la siguiente ubicación dependiendo del lenguaje que utilices.
  • NET: En la Carpeta bin y reemplazar si existe
  • Java: en la carpeta c:/Tomcat/lib.
  •  

Luego Reiniciar el Tomcat y con eso quedaria listo.

sábado, noviembre 28, 2015

Java como utilizar propiedades

En algun momento es necesario conocer las propiedades del Lenguaje Java, aqui un ejemplo de como conocer dichas propiedades que pueden resultar utiles cuando llevamos a produccion una aplicacion web o win:
System.out.println("javax.net.ssl.trustStoreType--------->:" + System.getProperty("javax.net.ssl.trustStoreType"));
System.out.println("javax.net.ssl.trustStorePassword----->:" + System.getProperty("javax.net.ssl.trustStorePassword"));
System.out.println("javax.net.ssl.trustStore------------->:" + System.getProperty("javax.net.ssl.trustStore"));               
System.out.println("javax.net.ssl.keyStoreType----------->:" + System.getProperty("javax.net.ssl.keyStoreType"));
System.out.println("javax.net.ssl.keyStorePassword------->:" + System.getProperty("javax.net.ssl.keyStorePassword"));
System.out.println("javax.net.ssl.keyStore--------------->:" + System.getProperty("javax.net.ssl.keyStore"));               
System.out.println("path.separator----------------------->:" + System.getProperty("path.separator"));
System.out.println("file.separator----------------------->:" + System.getProperty("file.separator"));
System.out.println("java.class.path---------------------->:" + System.getProperty("java.class.path"));
System.out.println("java.class.version------------------->:" + System.getProperty("java.class.version"));
System.out.println("java.home---------------------------->:" + System.getProperty("java.home"));
System.out.println("java.vendor-------------------------->:" + System.getProperty("java.vendor"));
System.out.println("java.vendor.url---------------------->:" + System.getProperty("java.vendor.url"));
System.out.println("java.version------------------------->:" + System.getProperty("java.version"));
System.out.println("line.separator----------------------->:" + System.getProperty("line.separator"));
System.out.println("os.arch------------------------------>:" + System.getProperty("os.arch"));
System.out.println("os.name------------------------------>:" + System.getProperty("os.name"));
System.out.println("user.dir----------------------------->:" + System.getProperty("user.dir"));
System.out.println("user.home---------------------------->:" + System.getProperty("user.home"));
System.out.println("user.name---------------------------->:" + System.getProperty("user.name"));

System.out.println("Carpeta instalado Tomcat------------>:" + System.getProperty("catalina.base"));

Si utilizan Genexus les puede ser de mucha utilidad el utilizar la siguiente sentencia:
java [!&Ruta!]=httpContext.getDefaultPath(); 

Lo que retorna es:
C:\Tomcat7\webapps\miaplicacion

O tambien:
java [!&Ruta!]=System.getProperty("catalina.base"));

Lo que retorna es:
C:\Tomcat7

viernes, noviembre 27, 2015

Controlar mi ANDROID desde mi PC via USB


En este video explica como hacerlo: 

En muchos de los casos resulta importante tener el control del Telefono o tablet desde la pc, hemos encontrado una herramienta que permite aquello, para poder habilitarlo seguimos los siguientes pasos:

1.- Descargar e instalar el siguiente programa, que contiene los DRIVERS:
Programa para instalar drivers de ANDROID

En dicha pagina dar click en HERE para iniciar la descarga, seguidamente instalamos.


2.- Abrir el navegado CHROME y copiamos la siguiente URL para incoporar el plugin que nos permite controlar desde la PC al Telefono/Tablet.
https://chrome.google.com/webstore/detail/vysor-beta/gidgenkbbabolejbgbpnhbimgjbffefm

3.- Recuerden que debemos tener instalado el Dispositivo con un cable USB a nuestro PC.