lunes, 17 de febrero de 2014

¿Cómo cargar un Dynamic Combo/List Box a partir de los datos de un Web Service ?

En algunos casos se ha presentado la necesidad de cargar un  Combo o List Box con los datos que retorna un servicio externo (Web Service Soap o Rest).

En la versión X Evolution 2 de GX, los Dynamic Combo Box y List Box incluyen una nueva propiedad llamada Data Source From. En el link pueden tener más información, pero básicamente dicha propiedad permite que un Combo/List Box pueda ser cargado dinámicamente, ya no solo a partir de una determinada "tabla", sino desde un Data Provider.

Entonces ahora el problema se traduce en la siguiente pregunta: 

¿Cómo lograr que un Data Provider retorne los datos de un Web Service?

La respuesta está en la cláusula Input del Data Provider. 

Con dicha cláusula podemos cargar un Data Provider a patir de los datos de otra fuente, que puede ser otro Data Provider, un Procedure o directamente un Web Service.

Veamos con un ejemplo como podríamos cargar esos datos a partir de un Web Service.

Ejemplo
Supongamos que tenemos un servicio SOAP que retorna una lista de Paises. Una vez importado en nuestra KB via WSDL Inspector tendremos básicamente estos objetos:

  • Un External Object, llamésmosle CountryService, con el método GetCountries.
  • Un SDT llamado CountryServiceResponse, con los elementos CountryId y CountrName.
    El método CountryService retorna una colección de este tipo:

Para definir el Data Provider que retorna esa lista de países, realizamos estos pasos: 
  1. Creamos un nuevo Data Provider (DPCountries)
  2. Arrastramos el SDT definido por el WS al Source del Data Provider. Es decir, podemos aprovechar ese mismo SDT para la salida de nuestro Data Provider, pero podría ser un nuevo SDT.
  3. Agregamos el Input Clause, para invocar el webservice y cargar los paises. 
  4. Cambiamos la propiedad Collection del Data Provider a True (esto depende de la estructura del SDT, si e mismo ya es una colección, esto no será necesario).

Donde: 
&ws es de tipo CountryService
&Country es de tipo CountryServiceResponse

Finalmente vamos al panel donde tenemos la variable de tipo Dynamic Combo/List Box y le asociamos el Data Provider anterior en la propiedad 'Data Source From'.


jueves, 6 de febrero de 2014

Google Translate desde las aplicaciones Genexus

El servicio de Google translate es gratis desde la página translate.google.com , pero para usarlo en tu aplicación debes integrarte a traves de su API, como detalla en https://developers.google.com/translate/v2/getting_started?hl=es
Esto significa que desde el Api V2 se integra a traves de servicios REST , pasando una Key y registrandose (dar una tarjeta de crédito). Luego desde una aplicación con Gx no seria difícil integrarte a través del servicio REST usando el tipo de datos HTTPCLIENT.
El código programado en Genexus , desde un procedimiento por ejemplo, seria algo como (**) o se pueden bajar el Xpz de ejemplo
Solo faltaria, para que funcione
    1. Obtener la Key se puede ver
en http://stackoverflow.com/questions/4854388/google-api-key-for-translation o hay un video de yotube http://www.youtube.com/watch?v=-KHq094SeWU que si bien no esta actualizado , esta bien claro 
    2. Hay que aceptar las condiciones del pricing que se detalla en https://developers.google.com/translate/v2/pricing
Anteriormente , con el API v1 existia un External Object, para realizar la integración http://wiki.gxtechnical.com/commwiki/servlet/hwiki?External+Object%3A+Google+Translator, pero ahora esta deprecated.
(**)
//https://www.googleapis.com/language/translate/v2?
//key=[Insert your key]
//&source=en
//&target=es
//&q=Hello%20world
//&trace=token:ACwti_c...

&lang_or = 'en'
&lang_dest = 'es'
&texto = 'Hello%20world'

&httpclient.Host = 'www.googleapis.com'
&httpclient.BaseUrl = '/language/translate/'
&query = 'key=' + &key.Trim()
&query = &query + '&source=' + &lang_or + '&target=' + &lang_dest
&query = &query + '&q=' + &texto
&query = &query + '&trace=token:ACwti_c...'

&http client.Execute('GET',&query)

&result = &httpclient.ToString()
msg(&result,status)

miércoles, 22 de enero de 2014

¿Cómo enviar mensajes de Whatsapp a través de una aplicación SD GeneXus?

Hoy en día, gracias a la masificación de los dispositivos inteligentes (Smart Devices) y a la adaptación de los usuarios al uso de estas nuevas tecnologías, se han creado muchísimas aplicaciones y servicios nuevos que, en ciertos casos, ofician de productos sustitutos de tecnologías y servicios de uso común como ser redes sociales, mensajería y llamadas. Tal es el caso de Whatsapp, que en los últimos años ha ganado campo en el terreno de la mensajería con un crecimiento de más de 200% en 2013.

Fuente: http://www.emol.com/noticias/tecnologia/2014/01/15/639815/uso-de-aplicaciones-moviles-aumento-un-115-durante-el-ano-pasado.html



Debido a estos cambios de tecnología y a la aparición de estos productos sustitutos, es necesario que nuestras aplicaciones desarrolladas en GeneXus puedan interactuar con las aplicaciones de vanguardia. En este caso explicaremos brevemente cómo interactuar con Whatsapp desde una aplicación GeneXus.

Veamos cómo se hace...
Es posible enviar mensajes de Whatsapp desde una aplicación SD (Smart Device) desarrollada en GeneXus utilizando Custom URL Schemes.
Esto significa, utilizar la API Interop para hacer una llamada a una URL específica. Si la aplicación llamada está instalada en el dispositivo, se abrirá y permitirá realizar acciones.

¿Cómo se programa?
En un evento de un objeto SD programar lo siguiente:

Interop.Open("whatsapp://app") --> Esto permite abrir la aplicación Whatsapp para interactuar.

Interop.Open("whatsapp://send?text=hola!!!") --> Esto permite enviar el mensaje "hola" a través de Whatsapp. Es necesario seleccionar el contacto al que se desea enviar el mensaje luego que se hace el redirect a la aplicación.

De esta forma logramos tener dos tipos de interacciones con Whatsapp en una simple línea de código.

Más info:
http://www.whatsapp.com/faq/en/iphone/23559013
Interop.Open method

miércoles, 27 de noviembre de 2013

Mejores tiempos de "build" en Genexus Tilo utilizando el "multi-core"

El proceso de especificación y generación de una base de conocimientos, en resumen, implica que se ejecuten tareas MSbuild que especifican o generan dicha KB.

En Genexus Evolution 1 se incluyó la posibilidad de tener especificación y generación concurrente.
Es decir, comenzar a generar antes de que terminen de especificarse todos los objetos, de este modo en PCs "multi-core" podía estar un "core" especificando y otro "generando" a la vez. Se paralelizó el proceso lo cual produce una ganancia importante de performance.

En Genexus Tilo se introdujo un avance importante en este sentido puesto que se pueden levantar múltiples instancias de especificadores y generadores a la vez. De este modo se paraleliza aun más el proceso de "build" y se aprovecha más aun la potencia de los procesadores "multi-core".

En la opción Tools/Options/Build se puede elegir hasta cuantos especificadores y generadores concurrentes se podrán ejecutar. Así podríamos ver en el task manager algo como:


Donde se ven 4 procesos de MSBuild ejecutando a la vez.
Esto redunda en un mejor aprovechamiento de los "cores" pudiendo reducir el tiempo necesario para el "build" de una KB.

¿Cuánto mejora?

Aun no se han realizado mediciones pero la ganancia es importante, dependiendo de la potencia de la máquina (al usar mas "cores" el cuello de botella puede estar en memoria o el disco), la base de conocimientos, etc.

En la medida que se realicen las pruebas se publicará más información al respecto.

Se están desarrollando otros cambios importantes en el proceso de build que también redundarán en una mejor performance en el mismo.

¿Cuantos especificadores y generadores realmente se ejecutan?

Lo que se configura en las opciones del IDE son "hasta cuantos se ejecutan a la vez", luego depende de la cantidad de cores, de la cantidad de objetos y otros parámetros, la cantidad de instancias que efectivamente se ejecutan.

¿Afecta la performance del IDE?

En principio no porque el IDE ejecuta en su propio "core", aunque obviamente además del "core" estos procesos consumen memoria y disco, con lo cual puede darse "competencia" con el IDE en ese sentido.


¿Qué proceso MSBuild corresponde a generación y qué proceso a especificación?

Eso se puede ver en la command line del propio "task manager", para verlo hay que ir al tab "details" y poner visible esa columna:



 Luego se puede ver que uno de los parámetros del MSBuild es el "SpecifierDaemon" o "GeneratorDaemon" de acuerdo al proceso que esté ejecutando el mismo:



lunes, 18 de noviembre de 2013

Emulador de Android más rápido con procesadores Intel

Lo primero que precisamos es tener el AVD creado a partir una imagen de una API de Android mayor o igual a 17, y que además esa imagen esté hecha para procesadores Intel x86 Atom. Si usamos las imágenes hechas para procesadores ARM va a andar más lento porque el procesador tiene que convertir los procesos, mientras que usando Intel x86 se ejecutan más directamente.

Para saber si tenemos disponibles ese tipo de imágenes ir al SDK Manager de Android (C:\<Directorio del AndroidSDK>\SDK Manager.exe)
Si no las tenemos bajar la imagen de la API que uno quiera para los procesadores Intel:



Luego crear un AVD que use esa imagen, para eso vamos al AVD Manager (C:\<Directorio del AndroidSDK>\AVD Manager.exe) y creamos un nuevo AVD:


Configurar la Memoria RAM a 768 y el VM heap en 64.


Con eso ya tendría que andar más rápido. 
Pero si nuestro procesador también permite la tecnología VT-x se puede mejorar el rendimiento del emulador. Entonces nos bajamos el "Intel x86 emulator Accelerator (HAXM)" del SDK Manager:


Luego de bajarlo hay que instalarlo ( no se instala automáticamente )
Para eso hay que ir a "C:\<Directorio del AndroidSDK>\extras\intel\Hardware_Accelerated_Execution_Manager" y ejecutar el instalador.

Luego al darle Start al AVD desde el AVD Manager y tendría que salir un mensaje como este:


Por último es recomendable si se quiere usar el emulador solo para probar, no utilizar dispositivos con pantallas de alta resolución (xhdpi o hdpi), sino que es mejor usar dispositivos con densidad de pantalla "mdpi", si se usa "ldpi" va a andar más rápido pero es muy chica la pantalla.

Y a partir de todo esto se podría decir que se puede trabajar con el emulador de Android!

Extra:
Si se tiene una buena tarjeta de video, habilitando la opción "User Host GPU" debería andar aún más rápido. Yo tengo una NVidea 7600 y se muere, así que se precisaría algo mucho mejor.




jueves, 14 de noviembre de 2013

Services URL en aplicaciones Smart Devices

Cuando se desarrolla una aplicación Web muchas de las propiedades configuradas en el environment son grabadas en un archivo de configuración (ejemplo: web.config en el caso de .NET - WEB) para que puedan ser modificadas editando directamente el archivo (sin necesidad del IDE) cuando, por ejemplo, se instala la aplicación en un cliente o en otro ambiente.

Por ejemplo, se configuró el nombre del usuario de la DB en las propiedades del Environment en el IDE de Genexus, si se quiere que la aplicación acceda con otro usuario basta editar el archivo de configuración,

Luego la aplicación Web lee ese archivo de configuración para saber cómo comportarse (en el ejemplo: con qué usuario establece la conexión).

¿Qué pasa en el caso de aplicaciones para Smart Devices?
En las aplicaciones Smart Devices hay un componente del cliente (Java-Android, XCode-iOS, etc) que, en la mayoría de los casos, consume servicios del App Server (.NET, Java, etc). Puede leer más sobre dicha aquí.

¿De dónde se obtienen los servicios?
La capa que ejecuta en el device (APK, IPA, JAD) lo único que precisa saber es ¿dónde están los servicios a consumir?

Eso se configura en el IDE en la propiedad "Services URL" del generador Smart Devices:


Una vez configurada se incluye en la compilación del APK/IPA/JAD correspondiente el cual luego será distribuido directamente o vía las stores.

¿Es modificable la URL de los servicios?
El valor por defecto es el de la propiedad "Web root", sin embargo es modificable independientemente de esta.
Hay que considerar que luego de modificada hay que compilar nuevamente la aplicación para que en el APK/IPA/JAD se incluya esa información.

¿Qué sucede si no sé la URL en la cual quedarán definitivamente esos servicios?
Por ejemplo: soy una empresa de desarrollo que entrego al cliente el WAR y la APK correspondientes pero no sé dónde (servidor, URLs, etc) la instalará el cliente.

En este caso las posibilidades son dos:
1. Definir la URL como dinámica - se puede configurar la propiedad "Dynamic Services URL" en "True" con lo cual, una vez instalada la aplicación, el usuario puede configurar cual es la URL donde están los servicios.
Tiene la contra que agrega complejidad al usuario (cada usuario que la instale tendrá que configurar ese valor).

2. Definir una URL, por ejemplo: http://www.genexus.com/SalesApp, configurar esa como "Service URL" en la propiedad del Environmente, compilar la aplicación y configurar a nivel de App server que esa URL se resuelva en la Aplicación Web donde están los servicios instalados.
De este modo se puede resolver el dinamismo del lado del servidor sin necesidad de re-compilar la aplicación sin requerir que el usuario configure ese valor.


viernes, 1 de noviembre de 2013

¿Cómo instalar y ejecutar la aplicaciones directamente en un dispositivo Android?

Aporte de Matias Hernández (@matiash)

GeneXus es capaz de instalar y ejecutar una aplicación en un dispositvo Android conectado a la máquina de desarrollo mediante USB. Para eso sólo es necesario:
  1. En el dispositivo, tener habilitada la opción de “USB Debugging”.
  2. En la PC, tener instalados los drivers USB del dispositivo.
  3. Que la URL de servicios del generador SD sea accesible desde el dispositivo.

La opción de USB Debugging se puede encontrar bajo Settings -> Applications en Android 2.x y bajo Settings -> Developer Options en Android 4.x. A partir de Android Jelly Bean 4.2 esta opción está oculta por defecto, y la forma de habilitarla es haciendo tap 7 veces en Settings -> About -> Build number.

Los drivers USB pueden descargarse desde la página del fabricante (en forma separada o junto con alguna herramienta). En los devices Nexus de Google se pueden instalar como una opción del SDK. En los Samsung se pueden instalar junto con el Kies, u obtenerlos separadamente (por ejemplo desde http://forum.xda-developers.com/showthread.php?t=2038555).

A diferencia del emulador, un dispositivo Android conectado a un PC mediante USB no puede “ver” al mismo por esa conexión. Por lo tanto, no es posible ejecutar en el dispositivo si la propiedad “Services URL” del generador SD apunta a localhost. Como alternativa, es posible modificar esta propiedad colocando la dirección IP de la máquina local (en caso que ésta sea accesible a través de la red WiFi o de datos que el dispositivo use) o utilizar deploy to cloud en su lugar.



¿Qué pasa si todas estas reglas se cumplen y el Run de GeneXus sigue utilizando el emulador en vez del dispositivo conectado?

Lo más probable es que el SDK de Android no esté detectando el dispositivo. La forma de verificarlo es ejecutando el comando “adb devices” en el directorio <SDK>\platform-tools. El resultado (para un dispositivo funcionando) debería ser de la forma:

List of devices attached
05e9b1eb     device

Si el dispositivo no aparece (o se ve como “offline”) entonces no está accesible para su uso desde GeneXus. Algunas posibles causas (en orden de probabilidad decreciente):
  1. Los drivers USB no están correctamente instalados. Esto se puede revisar accediendo al device manager; el dispositivo debería aparecer como “Android Composite ADB Interface” (y posiblemente también bajo “Portable Devices”). En este caso debería usarse la opción de “Update Driver Software” para seleccionar e instalar los drivers correctos.
  2. Si el dispositivo posee Android 4.2.2 (o superior) entonces se requiere adb 1.0.31 o superior para usarlo (porque esta versión agrega una confirmación antes de ser usada mediante USB por primera vez). Se puede ver la versión instalada con el comando “adb version”. La nueva versión está disponible a partir de las Platform Tools r16.0.1. Ver https://developer.android.com/tools/help/adb.html
  3. En algunos dispositivos es necesario cambiar el método de conexión USB de “Media Device” (MTP) a “Camera” (PTP). Esto se puede configurar haciendo tap en la notificación que aparece en el dispositivo al conectarlo (Touch for other USB options).