En este artículo analizaremos la utilización de Prediction API en GAE (Google App Engine). Para esta actividad de análisis, utilizaremos como base un desarrollo de código fuente abierto llamado tryprediction.


La solución mostrada propone la utilización Prediction API para java, utilizando 4 servlets y un archivo index.jsp que en conjunto permiten la puesta en marcha de la solución de ejemplo. El objetivo del desarrollo propone una manera flexible de declarar modelos predictivos y poder dinámicamente personalizar los elementos en la interfaz de usuario que permitan interactuar con eso modelos, finalmente hacerlos útiles muy rápidamente.
El ejemplo nos propone introducir conceptos de evolución e innovación de soluciones tecnológicas haciendo uso de la potencia de las APIs de Google.
Veamos la estructura básica que propone la solución en la Fig. 1.


Fig. 1 Estructura solución tecnológica

Un detalle un tanto más profundo de la Fig. 1 nos muestra la estructura de la solución tecnológica. La ubicación del código fuente de cada uno de los servlets se encuentra en src/main/java. Tenemos que tener en cuenta la ubicación de la webapp en src/main/webapp. En la webapp tendremos la hojas de estilo necesarias, imágenes, elementos de javascript y algunos elementos personalizados de importancia dentro de la carpeta rc. En esta carpeta están los archivos que permiten la configuración de los modelos que ejecutaremos con Prediction API y su escenario de autenticación. Recuerden que Prediction API requiere este modelo de autenticación, que debemos configurar desde la Google  API console.  

Elementos programáticos principales:
- AuthReturnServlet.java
- IndexServlet.java
- PredictServlet.java
- ResetServlet.java
- index.jsp



Fig. 2 - Clases que forman parte de la solución presentada

En la Fig. 2 se puede observar el diagrama de clases de la solución propuesta. Para la simplicidad del análisis vamos a presentar la arquitectura de la solución y vamos a analizar en detalle el PredictServlet.

También es interesante analizar el nivel de relación que poseen los elementos de la solución que estaremos desarrollando como muestra la Fig. 3. En esta oportunidad vamos a prestar especial atención a los dos servlets que hacen el trabajo con Prediction API.

- IndexServlet.java
- PredictServlet.java

Fig. 3 - Visualización de relaciones entre los elementos de la solución

Análisis detallado de PredictServlet

Vamos a iniciar el análisis detallado de PredictServlet. En primer lugar como muestra el Código 1 obtenemos las credenciales del datastore de Google App Engine. (Este paso es porque en la definición de diseño de determinó almacenar credenciales de esta forma)

   try {
     // Devolver las  credenciales desde el datastore de App Engine.
     DatastoreService datastore = 
     DatastoreServiceFactory.getDatastoreService();
     Key credsKey = KeyFactory.createKey("Credentials", "Credentials");
     credentials = datastore.get(credsKey);
      } catch (EntityNotFoundException ex) {
     // Si no se pueden obtener las credenciales enviamos una exception al cliente javascript.
     response.setContentType("text/html");
     response.getWriter().println("exception: " + ex.getMessage());
   }
Código 1 - Accediendo al datastore para obtener las credenciales

Luego de obtener estos elementos de autenticación el PredictServlet realiza diversas funciones de soporte para acceder a la información de los modelos que deseamos poner al alcance del usuario. Esto se realiza accediendo a model.json. Obtenida esta información no pasamos a interactuar directamente con Prediction API como muestra el Código 2 para iniciar las tareas de autenticación en la integración de la API.




  // Establecer el acceso OAuth 2.0 
GoogleAccessProtectedResource requestInitializer = new GoogleAccessProtectedResource(tokens.accessToken,httpTransport, jsonFactory, clientId, clientSecret, tokens.refreshToken);
Código 2 - Autenticando a Prediction API

Para cerrar nuestro análisis el Código 3 propone la interacción de predicción concreta de nuestra solución.
La clave del Código 3 es la línea que invoca al método trainedmodels().predict.



  // Finalmente completar los datos de predición llamada a la API  and trabajar los resultados en la Javascript AJAX cliente
 Prediction prediction = new Prediction(httpTransport, requestInitializer, jsonFactory);                                Input input = new Input();                                                                                                                InputInput inputInput = new InputInput();                                                           inputInput.setCsvInstance(params);                                                                          input.setInput(inputInput);                                                                                                                    Output output = prediction.trainedmodels().predict(modelId, input).execute(); 
Código 3 - Ejecutando la predicción en Prediction API

Para realizar el despliegue de la solución en la infraestructura de Google App Engine debemos tener configurada nuestra aplicación en la consola de administración de Google App Engine. La Fig. 4 muestra una representación de la actividad en la consola de Google App Engine.

Fig. 4 - Consola de administracion Google App Engine

Com muestra la Fig. 4 tenemos la aplicación “appdemoutn” en donde vamos a realizar una nueva versión en un nuevo despliegue.

Fig. 5 - Aplicación final de ejemplo

La Fig. 5 muestra el resultado de nuestra solución, en donde cada modelo Prediction se puede seleccionar y dependiendo de esta selección, se personalizan los elementos de la interfaz de usuario que requiere el modelo para desempeñar la actividad. (Como ejemplo si nuestro modelo requiere solamente una caja de texto para ingresar la consulta es lo que se propone en la interfaz de usuario, si se requieren otros elementos se personaliza según ese criterio). Además la solución propone la valuación de Prediction API mediante un gráfico utilizando la integración de Google Chart Tools, de esta forma poder visualizar de una forma más flexible la valoración.

Espero que puedan hacer uso de estas herramientas, integrar elementos distintivos y  evolucionar sus aplicaciones utilizando todo el potencial que brinda Google con sus APIs.


Nicolás Bortolotti   Perfil | Twitter | Blog

Nicolás es director de relaciones para desarrolladores en latinoamérica región sur para Google. El ha desarrollado comunidades académicas y de investigación en varios países de Latinoamérica sobre la plataforma de desarrollo web y mobile de Google. Además Nicolas es profesor universitario, donde trabaja fuertemente en arquitecturas de software, ambientes emergentes e innovación en modelos de ingeniería de software

Les dejo el video de implementación con la demostración paso a paso:





Les dejo el análisis del código fuente central de la solución presentada:




Notas del Articulo:
Este articulo corresponde a los contenidos expuestos en la sesión de Developers Live para desarrolladores en español. Innovación en aplicaciones utilizando Prediction API - Parte 2.
Nivel: Intermedio.

Referencias

Google API Java Client
http://code.google.com/p/google-api-java-client/


Simple Logging Facade for Java (SLF4J)
http://www.slf4j.org/


TryPrediction (Python and Java)
http://code.google.com/p/try-prediction/


Google Developers
https://developers.google.com/

Prediction API
https://developers.google.com/prediction/

Google Char Tools
https://developers.google.com/chart/