Friday, November 09, 2012

Consumiendo R desde SAP Mobile Platform

En inicios de este anho, en Marzo, estaba visitando a mi amigos de equipo en SAP Labs Palo Alto, y mi bien amigo y colega Rui Nogueira me pidio que participe en su mas que excelente Technology Innovation Podcast donde hablamos sobre R y SAP HANA. Al final de la entrevista le dije a Rui que iba a tratar de conectar R con SUP (Al cual llamamos ahora SMP)...pero en realidad...nunca lo hice por mi falta de tiempo y especificamente y mas importante...porque no tenia ni la menor idea de como hacerlo...

Asi que...ayer, mientras leia el libro de Steve Jobs en mi Kindle, escuche una voz en mi cabeza que decia..."Dude! What the SAP? Where's R and SMP?" (Creanme, no va sonar tan bien si lo traduzco)...es ese momento...supe que tenia que hacer algo al respecto...

De nuevo...no tenia idea de como hacerlo ni de como comenzar a trabajar en esto...pero ya habia usado Rook (Servidor Web de R) en mi blog RSAP, Rook y ERP y tambien Sinatra (Ruby WebServer) en mi  blog PowerBuilder y Gateway - Al estilo de Sinatra Supe entonces, que esa era la manera de hacerlo.

Sabia que tenia que desarrollar una aplicacion Rook para exponer la data como JSON y pasarsela a SMP. Bueno...eso fallo rapidamente, porque hasta donde yo se y tambien mis pruebas fallaron, SMP aun no soporta JSON.

Mi proximo pensamiento fue hacer que la aplicacion Rook expusiera los datos como XML, lo cual por supuesto funciono bien, pero sin usar la libreria standard de R XML porque la respuesta es un objecto en C que se ve bastante mal cuando se convierte a texto.

Lo primero, fue pensar en un buen ejemplo para este blog...pero como dicen, tienes que ensenarle al hombre como pescar...asi que termine con un ejemplo bastante simple. Digamos que eres un profesory mi esposa Milly, mi hija Kiara y yo, somos estudiantes. Tienes un archivo Excel donde pones los nombres y las notas y quieres una aplicacion mobil que lea el archivo, calcule la media y provea la nota final, simplemente pasando la nota del alumno. Ya lo se...Excel? Porque no SAP HANA? Bueno...eres un profesor chapado a la antigua...SAP HANA es tan veloz, que ni siquiera puedes verlo...asi que te aferras a las herramientas mas basicas...


Por supuesto, en R, preferimos trabajar con archivos .CSV files, asi que siendo un buen profesor, creas el archivo y nos lo das, para que podamos jugar con el.

Para hacerme las cosas mas sencillas, use mi cuenta de CloudShare.com para empezar a trabajar...Cree mi aplicacion SMP, llame a la pagina web de Rook y lo probe en mi emulador de BlackBerry...todo funciono como una maravilla...pero...siempre hay uno...el problema real vino cuando decidi mover todo a AWS...

La cosa es...y no me di cuenta a su debido tiempo...en CloudShare.com todo funciono porque ambos, el Servidor SMP y el Servidor Rook estan en el mismo lugar...el mismo entorno localhost...en AWS, las cosas cambian porque el Servidor SMP esta en el cloud mientras que mi Servidor Rook esta en mi localhost (laptop)...gran problema...

Ayer estuve trabajando hasta las 10:00 pm tratando de descubrir como solucionar este gran problema...quizas es por eso que termine con una idea realmente tonta...dije...Ok...vamos a mover el Servidor Rook al cloud tambien! Asi que me logee en mi Servidor SMP Server, instale R y todo lo demas y ejecute el Servidor R...de regreso en mi laptop...por supuesto que fallo miserablemente...el nuevo Servidor Rook era localhost pero para mi Servidor AWS...asi que de ninguna manera mi emulador de Android iba a poder verlo...

Me dije...Ok...no hay que entrar en panico...tengo un Servidor de R en AWS...vamos a hacerlo ahi...otro fallo (ya me estoy acostumbrando)...el Servidor de R en AWS no tiene cabeza, asi que ningun browser tiene permitido trabajar...ademas...Rook siempre es localhost, asi que no habia manera de hacer la llamada...

Comence a entrar en panico...asi que me fui a dormir...aunque sea por un momento...

Hoy dia, me levante a las 5:30 am y comence a navegar esperando ver la luz al final del tunel...y lo hice...gracias a Dios...lo hice...

Un azombroso desarrollador llamado Noah Lorang logro hacer que Rook funciones en Heroku...to explicado en su Github account...asi que mi vida estaba salvada (no por mucho tiempo, tristemente)...




Nunca antes habia usado Heroku...y debo admitirlo...no es para novatos...realmente me tomo mucho tiempo hacerlo funcionar...pero finalmente lo hice (Obviamente...de otra manera, no estaria aburriendolos con toda mi charla sin sentido)...

Asi que...aqui esta lo que hice...

  • Me cree una cuenta en Heroku e instale el Heroku Tool Belt.
  • Me cree una public key.
  • Dentro de la aplicacion Git Bash instalada por el Heroku Tool Belt me loguee.


Clonar y crear una aplicacion en Heroku
git clone git://github.com/noahhl/rookonheroku.git blagcodes 
#(Esto va a clonar el Github de Noahy crear una carpeta llamada blagcodes 
#para guardar los codigos)
heroku create blagrook 
#(Cree una aplicacion para mi script de Rook)
git push heroku master 
#(Esto me permite pasar todo de mi carpeta folder 
#a mi cuenta de Github)

Con esto, estaba casi listo para rockear...pero necesitaba hacer algo primero...pasar mi propio script de Rook...

Summarize.R
library(Rook)
 
newapp<-function(env){
  req<-Rook::Request$new(env)
  res<-Rook::Response$new()
 
  name_param = req$params()$name
 
  Grades_Source = read.csv(file="Grades.csv",header=TRUE)
  Name<-Grades_Source$Name
  Grades<-Grades_Source$Grades
  Mean<-aggregate(Grades~Name,data=Grades_Source,FUN=mean)
  Mean_Result<-c(subset(Mean,Name == name_param))
 
  res$write("<root>")
  res$write("<Name>")
  res$write(Mean_Result$Name)
  res$write("</Name>")
  res$write("<Final_Grade>")
  res$write(as.character(Mean_Result$Grade))
  res$write("</Final_Grade>")
  res$write("</root>")
 
  res$finish()
}
 
 
server = Rhttpd$new()
server$add(app = newapp, name = "summarize")
server$start(listen="0.0.0.0", port=as.numeric(Sys.getenv("PORT")))
 
 
while(T) {
  Sys.sleep(10000)
}


A pesar del nombre, en realidad hice algo mas sencillo, simplemente tome el archivo demo.R y lo reemplace con mi propio codigo fuente. Tambien, copie el archivo Grades.csv a mi carpeta blagcodes (que esta localizada en mi laptop).

El codigo es simple, creamos una aplicacion Rook llamada "summarize" que va a leer el archivo Grades.csv, lo sumarizamos utilizando la funcion mean e imprimimos una estructura basica de XML pasando el Nombre y Nota de la persona que pasamos como parametro. Necesitamos pasar el listen="0.0.0.0" y el port=as.numeric(Sys.getenv("PORT")) para que Heroku sepa como llamar a la pagina.

De vuelta en el Git Bash, hice lo siguiente para pasar los cambios de vuelta a Heroku...

Passing back to Heroku
git add .
git commit -am "message"
git push heroku

Con esto, todo estaba listo y preparado...asi que veamos como se ve...


(Estoy usando IE solo porque queria mostrar que la respuesta de la aplicacion Rook se puede ver un poco diferente a una respuesta XML, pero viendo el codigo fuente, en realidad pueden ver que es un XML...ademas, porque IE no trata de unir las pestanas cuando se les pone juntas como si lo hace Chrome).

Cuando comence a desarrollar la aplicacion SMP me di cuenta de que llamar a un WebService no era una opcion...puesto que por supuesto, este no es un WebService...asi que opte por usar un REST Web Service...pero me estaba pidiendo utilizar estructuras XSD...asi que luego de otro largo tiempo...encontre una simpatica herramienta online para hacer eso...

Simplemente pase una estructura XML y deje que la herramienta trabajara por mi...



Por supuesto...nunca antes habia trabajado con XSD...asi que no sabia que esperar...la cosa es...si utilizas esta estructura...va a fallar...primero por el Final_Grade que es xs:byte y segundo porque cuando estaba cargando los parametros, Final_Grade se estaba mostrando tambien...y yo no queria que pase eso...asi que hice una copia del archivo, cambie un poco aqui y alla y termine con Request.txt y Response.txt como pueden ver aqui...



Asi que...como le iba diciendo...cree un REST WebService...


Luego de esto...vino otra parte complicada puesto que no sabia como hacer que el parametro funcione...afortunadamente...logre hacerlo funcionar...


Cargue mi Request.txt y obtuve el elemento Root...


Luego, repeti lo mismo para Response.txt y termine con esto...


Luego de crear mi Mobile Application, cree un Personalization Key para poder controlar el parametro.


Este es el Look & Feel de la aplicacion. Algo bastante simple, se te pide un nombre, presionas Get Grades y el resultado se te sera devuelto en una lista.


Ahora...estamos listos para probar la aplicacion...



Me parece...que no me fue muy bien en los examenes...veamos como le fue a mi hija...



Como me lo esperaba! Mi hija es mas inteligente y hermosa que yo...

Bueno...eso es todo amigos...me tomo cerca de 24 horas (sumando ayer y hoy dia) para poder tener esto funcionando...pero puedo asegurarle a Mr. Nogueira que Blag siempre cumple sus promesas...le prometi tener a R funcionando con SMP...y aqui esta...

Saludos,

Blag.

No comments: