CLOUD COMPUTING.
DESARROLLO DE APLICACIONESY
MINERÍA WEB
Programa de extensión universitariaUniversidad de Oviedo
Miguel Fernández Fernández
miguel@ThirdWay.es
Google App Engine
http://code.google.com/intl/en/appengine/
Google App Engine
http://code.google.com/intl/en/appengine/
Una introducción a
¿Qué es Google App Engine?
La solución PaaS de Google
Webapps Python y Java
Altamente escalable
Pago por uso
SDK completo
Administración sencilla
¿Qué es Google App Engine?
y Javascript (Rhino),JRuby,Scala...
La solución PaaS de Google
Webapps Python y Java
Altamente escalable
Pago por uso
SDK completo
Administración sencilla
¿Qué es Google App Engine?
y Javascript (Rhino),JRuby,Scala...
La solución PaaS de Google
Webapps Python y Java
Altamente escalable
Pago por uso
SDK completo
Administración sencilla
Inicio gratuito
< 5M visitas/mes
¿Qué aporta Google App Engine?
Escalabilidad
Ahorro en el coste de propiedad
Amplio conjunto de APIs
Facilidad de desarrollo
Sencillez en el mantenimiento
¿Qué ofrece GAE a nivel funcional?
Memcache, manipulación imágenes, extracción URLs...
Sistema automático de escalado y balanceo de carga
Integración con cuentas de GoogleTM
Almacén de datos transaccional
Planificación de tareas programadas
À-la Unix CronAutenticación y envío de mail
SDK
Consola
De
Administración
Ciclo de desarrollo
Despliegue
Prueba
Construcción
Gestión
Arquitectura física
Balanceadordecarga
Navegador
RPCdeGoogle
Nodo1
Nodo 2
Nodo N
Datastore
Cluster 1
Nodo1
Nodo 2
Nodo N
Cluster 1
Nodo1
Nodo 2
Nodo N
Cluster N
Nodo1
Nodo 2
Nodo N
Datastore
Cluster M
request
response
HTTP(S)
Servidor FCGI / Motor Servlets
Persistencia
Data Nucleus sobre BigTableTM
Desarrollo de aplicaciones GAE
El runtime Java
El SDK de Java
appengine-java-sdk-1.3.6*
API JARs
Servidor de pruebas
App Engine Uploader
Documentación
Ejemplos
Google Plugin for eclipse
GWT 2.0.4
El SDK de Java
appengine-java-sdk-1.3.6*
API JARs
Servidor de pruebas
App Engine Uploader
Documentación
Ejemplos
Google Plugin for eclipse
GWT 2.0.4
El SDK de Java
appengine-java-sdk-1.3.6*
API JARs
Servidor de pruebas
App Engine Uploader
Documentación
Ejemplos
eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.3.6_1.3.6.v201006301254*
Hola App Engine! desde Java
Hola App Engine! desde Java
Acceder a appengine.google.com y crear la app
Hola App Engine! desde Java
Acceder a appengine.google.com y crear la app
Hola App Engine! desde Java
Acceder a appengine.google.com y crear la app
Crear un ‘web application project’ desde eclipse
Hola App Engine! desde Java
Acceder a appengine.google.com y crear la app
Crear un ‘web application project’ desde eclipse
Configurar applicationId y versión del proyecto
Hola App Engine! desde Java
Acceder a appengine.google.com y crear la app
Crear un ‘web application project’ desde eclipse
Configurar applicationId y versión del proyecto
Probar en el servidor de pruebas
Hola App Engine! desde Java
Acceder a appengine.google.com y crear la app
Crear un ‘web application project’ desde eclipse
Configurar applicationId y versión del proyecto
Desplegar sobre App Engine
Probar en el servidor de pruebas
http://code.google.com/appengine/docs/java/tools/uploadinganapp.htmlAlternativamente...
Hola App Engine! desde Java
Acceder a appengine.google.com y crear la app
Crear un ‘web application project’ desde eclipse
Configurar applicationId y versión del proyecto
Desplegar sobre App Engine
Acceder a http://applicationId.appspot.com
Probar en el servidor de pruebas
http://code.google.com/appengine/docs/java/tools/uploadinganapp.htmlAlternativamente...
Anatomía de una App Java
Anatomía de una App Java
Anatomía de una App Java
Limitaciones: El Sandbox
No se pueden escribir ficheros
No se pueden crear sockets
Las aplicaciones no pueden crear hilos ni procesos
Procesos que duran más de 10’’ son finalizados
Llamadas al sistema están deshabilitadas
JNI y extensiones nativas de Python deshabilitadas
Limitaciones: El Sandbox
No se pueden escribir ficheros
No se pueden crear sockets
Las aplicaciones no pueden crear hilos ni procesos
Procesos que duran más de 10’’ son finalizados
Llamadas al sistema están deshabilitadas
JNI y extensiones nativas de Python deshabilitadas
el datastoreAlmacenamiento en
Limitaciones: El Sandbox
No se pueden escribir ficheros
No se pueden crear sockets
Las aplicaciones no pueden crear hilos ni procesos
Procesos que duran más de 10’’ son finalizados
Llamadas al sistema están deshabilitadas
JNI y extensiones nativas de Python deshabilitadas
el datastoreAlmacenamiento en
batch? (Crawling, etc.)Y si necesitamos
Limitaciones: El Sandbox
No se pueden escribir ficheros
No se pueden crear sockets
Las aplicaciones no pueden crear hilos ni procesos
Procesos que duran más de 10’’ son finalizados
Llamadas al sistema están deshabilitadas
JNI y extensiones nativas de Python deshabilitadas
el datastoreAlmacenamiento en
batch? (Crawling, etc.)Y si necesitamos
http://bit.ly/k5jiUcrawlers y GAE @ stackoverflow:
Users Service
Cuentas de google apps
Open Id
3 tipos de autenticación
Usuario en sesión?
Usuario es administrador?
Redirección a login
Servicios para
Redirección a sign-up
Users Service API package summary: http://bit.ly/9xDdCK
Users Service en la práctica
Users Service en la práctica
Autenticación usando el entorno local (stubs)
Users Service en la práctica
Autenticación en App Engine
Datastore (el almacén de datos)
Persistencia de entidades
Distribuido, replicado y balanceado
BigTable y GFS
http://code.google.com/appengine/docs/java/datastore/
No relacional
No hay esquema(à-la Sorted Set)Transaccional
Datastore standard APIs: JPA y JDO
Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL
Datastore standard APIs: JPA y JDO
Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL
¿Cuál usar?
Datastore standard APIs: JPA y JDO
Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL
¿Cuál usar?
http://db.apache.org/jdo/jdo_v_jpa.html
Datastore standard APIs: JPA y JDO
Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL
¿Cuál usar?
http://db.apache.org/jdo/jdo_v_jpa.html
Data Nucleus Class enhancement
Datastore en la práctica
Datastore en la práctica
Datastore en la práctica
Datastore en la práctica
Muestran el tablón y dirigen al usuario al login
Datastore en la práctica
Modela la entidad a persistir @PersistentCapable
Datastore en la práctica
Tramita la persistencia del mensaje publicado
Datastore en la práctica
Singleton para las operaciones de gestión de persistencia
Mail Service
Mail Service API: http://bit.ly/aig7Sf
Basado en JSR919 (javax.mail)
Recepción mapeada a HTTP/POST
http://appid.appspot.com/_ah/mail/<address>
Mail Service en la práctica
Mail Service en la práctica
Mail Service en la práctica
Procesa el mensaje de correo
Mail Service en la práctica
Mapea el servlet en la url /_ah/mail/*
Mail Service en la práctica
Declara que la app puede recibir mail
Mail Service en la práctica
XMPP (A.K.A. Jabber) Service
Mensajería instantánea
http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5)
XMPP Service API http://bit.ly/clIjJ8
XMPP (A.K.A. Jabber) Service
Mensajería instantánea
Chat bots
Notificaciones
Interfacesa servicios
http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5)
XMPP Service API http://bit.ly/clIjJ8
XMPP (A.K.A. Jabber) Service
Mensajería instantánea
Servidor
Envío y recepción de mensajes*
http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5)
XMPP Service API http://bit.ly/clIjJ8
XMPP (A.K.A. Jabber) Service
Mensajería instantánea
Servidor
Envío y recepción de mensajes*
Consulta de estado cliente (disponible...)
http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5)
XMPP Service API http://bit.ly/clIjJ8
XMPP (A.K.A. Jabber) Service
Mensajería instantánea
Servidor
Envío y recepción de mensajes*
Consulta de estado cliente (disponible...)
http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5)
XMPP Service API http://bit.ly/clIjJ8
Recepción mapeada a HTTP/POST
http://appid.appspot.com/_ah/xmpp/message/chat
XMPP (A.K.A. Jabber) Service
Mensajería instantánea
Servidor
Envío y recepción de mensajes*
Consulta de estado cliente (disponible...)
http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5)
XMPP Service API http://bit.ly/clIjJ8
Recepción mapeada a HTTP/POST
XMPP (A.K.A. Jabber) Service
Varios aliases (JIDs) para la misma app
XMPP Service API http://bit.ly/clIjJ8
app-id@appspot.com
anything@app-id.appspotchat.com
XMPP Service en la práctica
XMPP Service en la práctica
URL Fetch Service
Envuelve a java.net.URL
A bajo nivel: fetching (obtiene HTTPResponse)
Hay que parsearla
URL Fetch en la práctica
URL Fetch en la práctica
URL Fetch en la práctica
http://code.google.com/intl/en/apis/ajaxlanguage/documentation/
URL Fetch en la práctica
http://code.google.com/intl/en/apis/ajaxlanguage/documentation/
public String translate(String message){
! ! String translatedContent=null;
! ! try {
! ! ! //..composición de la url
! ! ! URL googleTranslate=new URL(parametrizedURL);
! ! ! BufferedReader reader=new BufferedReader(new InputStreamReader
(googleTranslate.openStream()));
! ! ! StringBuilder sb=new StringBuilder();
! ! ! while(reader.ready()){
! ! ! ! sb.append(reader.readLine());
! ! ! }
! ! translatedContent=sb.toString();
! ! //parseado de la respuesta (JSON)
! ! } catch (Throwable e) {
! ! ! //...
! ! }
! ! return translatedContent;
! }
URL Fetch en la práctica
http://code.google.com/intl/en/apis/ajaxlanguage/documentation/
public String translate(String message){
! ! String translatedContent=null;
! ! try {
! ! ! //..composición de la url
! ! ! URL googleTranslate=new URL(parametrizedURL);
! ! ! BufferedReader reader=new BufferedReader(new InputStreamReader
(googleTranslate.openStream()));
! ! ! StringBuilder sb=new StringBuilder();
! ! ! while(reader.ready()){
! ! ! ! sb.append(reader.readLine());
! ! ! }
! ! translatedContent=sb.toString();
! ! //parseado de la respuesta (JSON)
! ! } catch (Throwable e) {
! ! ! //...
! ! }
! ! return translatedContent;
! }
http://code.google.com/p/json-simple/
URL Fetch en la práctica
Otros servicios
Memcache
Tratamiento imágenes
Cron
La consola de administración
Google app engine y python
Bibliografía
Otros recursos
• Using Django with App Engine
http://www.42topics.com/dumps/django/docs.html
• Google app engine Cookbook
http://appengine-cookbook.appspot.com/
• AppScale: Despliegue de la infraestructura AppEngine sobre Amazon
EC2, Eucalyptus, Xen ...
http://code.google.com/p/appscale/
• JRuby on Rails en GAE
*http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/
Gracias
CLOUD COMPUTING.
DESARROLLO DE APLICACIONESY
MINERÍA WEB
Programa de extensión universitariaUniversidad de Oviedo
Miguel Fernández Fernández
miguel@ThirdWay.es

App engine

  • 1.
    CLOUD COMPUTING. DESARROLLO DEAPLICACIONESY MINERÍA WEB Programa de extensión universitariaUniversidad de Oviedo Miguel Fernández Fernández miguel@ThirdWay.es
  • 2.
  • 3.
  • 4.
    ¿Qué es GoogleApp Engine? La solución PaaS de Google Webapps Python y Java Altamente escalable Pago por uso SDK completo Administración sencilla
  • 5.
    ¿Qué es GoogleApp Engine? y Javascript (Rhino),JRuby,Scala... La solución PaaS de Google Webapps Python y Java Altamente escalable Pago por uso SDK completo Administración sencilla
  • 6.
    ¿Qué es GoogleApp Engine? y Javascript (Rhino),JRuby,Scala... La solución PaaS de Google Webapps Python y Java Altamente escalable Pago por uso SDK completo Administración sencilla Inicio gratuito < 5M visitas/mes
  • 7.
    ¿Qué aporta GoogleApp Engine? Escalabilidad Ahorro en el coste de propiedad Amplio conjunto de APIs Facilidad de desarrollo Sencillez en el mantenimiento
  • 8.
    ¿Qué ofrece GAEa nivel funcional? Memcache, manipulación imágenes, extracción URLs... Sistema automático de escalado y balanceo de carga Integración con cuentas de GoogleTM Almacén de datos transaccional Planificación de tareas programadas À-la Unix CronAutenticación y envío de mail
  • 9.
  • 10.
    Arquitectura física Balanceadordecarga Navegador RPCdeGoogle Nodo1 Nodo 2 NodoN Datastore Cluster 1 Nodo1 Nodo 2 Nodo N Cluster 1 Nodo1 Nodo 2 Nodo N Cluster N Nodo1 Nodo 2 Nodo N Datastore Cluster M request response HTTP(S) Servidor FCGI / Motor Servlets Persistencia Data Nucleus sobre BigTableTM
  • 11.
    Desarrollo de aplicacionesGAE El runtime Java
  • 12.
    El SDK deJava appengine-java-sdk-1.3.6* API JARs Servidor de pruebas App Engine Uploader Documentación Ejemplos
  • 13.
    Google Plugin foreclipse GWT 2.0.4 El SDK de Java appengine-java-sdk-1.3.6* API JARs Servidor de pruebas App Engine Uploader Documentación Ejemplos
  • 14.
    Google Plugin foreclipse GWT 2.0.4 El SDK de Java appengine-java-sdk-1.3.6* API JARs Servidor de pruebas App Engine Uploader Documentación Ejemplos eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.3.6_1.3.6.v201006301254*
  • 15.
    Hola App Engine!desde Java
  • 16.
    Hola App Engine!desde Java Acceder a appengine.google.com y crear la app
  • 17.
    Hola App Engine!desde Java Acceder a appengine.google.com y crear la app
  • 18.
    Hola App Engine!desde Java Acceder a appengine.google.com y crear la app Crear un ‘web application project’ desde eclipse
  • 19.
    Hola App Engine!desde Java Acceder a appengine.google.com y crear la app Crear un ‘web application project’ desde eclipse Configurar applicationId y versión del proyecto
  • 20.
    Hola App Engine!desde Java Acceder a appengine.google.com y crear la app Crear un ‘web application project’ desde eclipse Configurar applicationId y versión del proyecto Probar en el servidor de pruebas
  • 21.
    Hola App Engine!desde Java Acceder a appengine.google.com y crear la app Crear un ‘web application project’ desde eclipse Configurar applicationId y versión del proyecto Desplegar sobre App Engine Probar en el servidor de pruebas http://code.google.com/appengine/docs/java/tools/uploadinganapp.htmlAlternativamente...
  • 22.
    Hola App Engine!desde Java Acceder a appengine.google.com y crear la app Crear un ‘web application project’ desde eclipse Configurar applicationId y versión del proyecto Desplegar sobre App Engine Acceder a http://applicationId.appspot.com Probar en el servidor de pruebas http://code.google.com/appengine/docs/java/tools/uploadinganapp.htmlAlternativamente...
  • 23.
  • 24.
  • 25.
  • 26.
    Limitaciones: El Sandbox Nose pueden escribir ficheros No se pueden crear sockets Las aplicaciones no pueden crear hilos ni procesos Procesos que duran más de 10’’ son finalizados Llamadas al sistema están deshabilitadas JNI y extensiones nativas de Python deshabilitadas
  • 27.
    Limitaciones: El Sandbox Nose pueden escribir ficheros No se pueden crear sockets Las aplicaciones no pueden crear hilos ni procesos Procesos que duran más de 10’’ son finalizados Llamadas al sistema están deshabilitadas JNI y extensiones nativas de Python deshabilitadas el datastoreAlmacenamiento en
  • 28.
    Limitaciones: El Sandbox Nose pueden escribir ficheros No se pueden crear sockets Las aplicaciones no pueden crear hilos ni procesos Procesos que duran más de 10’’ son finalizados Llamadas al sistema están deshabilitadas JNI y extensiones nativas de Python deshabilitadas el datastoreAlmacenamiento en batch? (Crawling, etc.)Y si necesitamos
  • 29.
    Limitaciones: El Sandbox Nose pueden escribir ficheros No se pueden crear sockets Las aplicaciones no pueden crear hilos ni procesos Procesos que duran más de 10’’ son finalizados Llamadas al sistema están deshabilitadas JNI y extensiones nativas de Python deshabilitadas el datastoreAlmacenamiento en batch? (Crawling, etc.)Y si necesitamos http://bit.ly/k5jiUcrawlers y GAE @ stackoverflow:
  • 30.
    Users Service Cuentas degoogle apps Open Id 3 tipos de autenticación Usuario en sesión? Usuario es administrador? Redirección a login Servicios para Redirección a sign-up Users Service API package summary: http://bit.ly/9xDdCK
  • 31.
    Users Service enla práctica
  • 32.
    Users Service enla práctica Autenticación usando el entorno local (stubs)
  • 33.
    Users Service enla práctica Autenticación en App Engine
  • 34.
    Datastore (el almacénde datos) Persistencia de entidades Distribuido, replicado y balanceado BigTable y GFS http://code.google.com/appengine/docs/java/datastore/ No relacional No hay esquema(à-la Sorted Set)Transaccional
  • 35.
    Datastore standard APIs:JPA y JDO Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL
  • 36.
    Datastore standard APIs:JPA y JDO Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL ¿Cuál usar?
  • 37.
    Datastore standard APIs:JPA y JDO Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL ¿Cuál usar? http://db.apache.org/jdo/jdo_v_jpa.html
  • 38.
    Datastore standard APIs:JPA y JDO Garantizan portabilidad A diferencia del A P Ide bajo nivel(à-la SQL) JPQL y JDOQL ¿Cuál usar? http://db.apache.org/jdo/jdo_v_jpa.html Data Nucleus Class enhancement
  • 39.
    Datastore en lapráctica
  • 40.
    Datastore en lapráctica
  • 41.
    Datastore en lapráctica
  • 42.
    Datastore en lapráctica Muestran el tablón y dirigen al usuario al login
  • 43.
    Datastore en lapráctica Modela la entidad a persistir @PersistentCapable
  • 44.
    Datastore en lapráctica Tramita la persistencia del mensaje publicado
  • 45.
    Datastore en lapráctica Singleton para las operaciones de gestión de persistencia
  • 46.
    Mail Service Mail ServiceAPI: http://bit.ly/aig7Sf Basado en JSR919 (javax.mail) Recepción mapeada a HTTP/POST http://appid.appspot.com/_ah/mail/<address>
  • 47.
    Mail Service enla práctica
  • 48.
    Mail Service enla práctica
  • 49.
    Mail Service enla práctica Procesa el mensaje de correo
  • 50.
    Mail Service enla práctica Mapea el servlet en la url /_ah/mail/*
  • 51.
    Mail Service enla práctica Declara que la app puede recibir mail
  • 52.
    Mail Service enla práctica
  • 53.
    XMPP (A.K.A. Jabber)Service Mensajería instantánea http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5) XMPP Service API http://bit.ly/clIjJ8
  • 54.
    XMPP (A.K.A. Jabber)Service Mensajería instantánea Chat bots Notificaciones Interfacesa servicios http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5) XMPP Service API http://bit.ly/clIjJ8
  • 55.
    XMPP (A.K.A. Jabber)Service Mensajería instantánea Servidor Envío y recepción de mensajes* http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5) XMPP Service API http://bit.ly/clIjJ8
  • 56.
    XMPP (A.K.A. Jabber)Service Mensajería instantánea Servidor Envío y recepción de mensajes* Consulta de estado cliente (disponible...) http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5) XMPP Service API http://bit.ly/clIjJ8
  • 57.
    XMPP (A.K.A. Jabber)Service Mensajería instantánea Servidor Envío y recepción de mensajes* Consulta de estado cliente (disponible...) http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5) XMPP Service API http://bit.ly/clIjJ8 Recepción mapeada a HTTP/POST http://appid.appspot.com/_ah/xmpp/message/chat
  • 58.
    XMPP (A.K.A. Jabber)Service Mensajería instantánea Servidor Envío y recepción de mensajes* Consulta de estado cliente (disponible...) http://www.ietf.org/rfc/rfc3921.txt*XMPP IM standard (pp 4 y 5) XMPP Service API http://bit.ly/clIjJ8 Recepción mapeada a HTTP/POST
  • 59.
    XMPP (A.K.A. Jabber)Service Varios aliases (JIDs) para la misma app XMPP Service API http://bit.ly/clIjJ8 app-id@appspot.com anything@app-id.appspotchat.com
  • 60.
    XMPP Service enla práctica
  • 61.
    XMPP Service enla práctica
  • 62.
    URL Fetch Service Envuelvea java.net.URL A bajo nivel: fetching (obtiene HTTPResponse) Hay que parsearla
  • 63.
    URL Fetch enla práctica
  • 64.
    URL Fetch enla práctica
  • 65.
    URL Fetch enla práctica http://code.google.com/intl/en/apis/ajaxlanguage/documentation/
  • 66.
    URL Fetch enla práctica http://code.google.com/intl/en/apis/ajaxlanguage/documentation/ public String translate(String message){ ! ! String translatedContent=null; ! ! try { ! ! ! //..composición de la url ! ! ! URL googleTranslate=new URL(parametrizedURL); ! ! ! BufferedReader reader=new BufferedReader(new InputStreamReader (googleTranslate.openStream())); ! ! ! StringBuilder sb=new StringBuilder(); ! ! ! while(reader.ready()){ ! ! ! ! sb.append(reader.readLine()); ! ! ! } ! ! translatedContent=sb.toString(); ! ! //parseado de la respuesta (JSON) ! ! } catch (Throwable e) { ! ! ! //... ! ! } ! ! return translatedContent; ! }
  • 67.
    URL Fetch enla práctica http://code.google.com/intl/en/apis/ajaxlanguage/documentation/ public String translate(String message){ ! ! String translatedContent=null; ! ! try { ! ! ! //..composición de la url ! ! ! URL googleTranslate=new URL(parametrizedURL); ! ! ! BufferedReader reader=new BufferedReader(new InputStreamReader (googleTranslate.openStream())); ! ! ! StringBuilder sb=new StringBuilder(); ! ! ! while(reader.ready()){ ! ! ! ! sb.append(reader.readLine()); ! ! ! } ! ! translatedContent=sb.toString(); ! ! //parseado de la respuesta (JSON) ! ! } catch (Throwable e) { ! ! ! //... ! ! } ! ! return translatedContent; ! } http://code.google.com/p/json-simple/
  • 68.
    URL Fetch enla práctica
  • 69.
  • 70.
    La consola deadministración
  • 71.
  • 72.
  • 73.
    Otros recursos • UsingDjango with App Engine http://www.42topics.com/dumps/django/docs.html • Google app engine Cookbook http://appengine-cookbook.appspot.com/ • AppScale: Despliegue de la infraestructura AppEngine sobre Amazon EC2, Eucalyptus, Xen ... http://code.google.com/p/appscale/ • JRuby on Rails en GAE *http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/
  • 74.
  • 75.
    CLOUD COMPUTING. DESARROLLO DEAPLICACIONESY MINERÍA WEB Programa de extensión universitariaUniversidad de Oviedo Miguel Fernández Fernández miguel@ThirdWay.es