Hoy nos complace presentarte las mejoras que hemos realizado en Gmail para móviles en español, para su uso en el navegador web de los dispositivos iPhone y Android. Hace un año y medio, iniciamos el proceso de con mejores tecnologías de navegador. La combinación de , y el almacenamiento temporal dinámico nos ha permitido crear nuevas funciones: acceso en modo sin conexión, aplicaciones más rápidas, interfaces mejoradas y un proceso de actualización más sencillo para las nuevas funciones.

Hoy nos complace presentarte las mejoras que hemos realizado en Gmail para móviles en español, para su uso en el navegador web de los dispositivos iPhone y Android. Hace un año y medio, iniciamos el proceso de con mejores tecnologías de navegador. La combinación de , y el almacenamiento temporal dinámico nos ha permitido crear nuevas funciones: acceso en modo sin conexión, aplicaciones más rápidas, interfaces mejoradas y un proceso de actualización más sencillo para las nuevas funciones.


En primer lugar, creamos un breve contenedor JavaScript para las funciones de base de datos en HTML5 y Gears a fin de obtener compatibilidad con el mayor número posible de navegadores. El almacenamiento temporal sencillo de respuestas en la base de datos para su reutilización resultó útil, pero también fue necesario mantener una cola de acciones de usuario en la base de datos, por si el usuario se queda sin batería o debe apagar el teléfono durante un vuelo. Posteriormente, cuando el dispositivo vuelve a estar conectado a Internet, puede ejecutar la cola de correos y enviarlos, archivarlos, eliminarlos, etc.


Para lograr iniciar la aplicación en modo sin conexión, fue necesario ir más allá del API de base de datos. La especificación HTML5 resultó de gran ayuda, con una caché de aplicaciones capaz de almacenar todos los recursos en la aplicación web, lo cual permite al navegador cargarlos durante el modo sin conexión. Existe un pequeño inconveniente con esta API: una vez que decidas anular el modo de funcionamiento de las solicitudes GET de HTTP para obtener recursos de la caché de la aplicación, no puedes enviar una solicitud GET para un recurso que la caché desconozca. La especificación contiene métodos para ampliar las URI que la caché sabe que existen, pero estos puntos de entrada no están muy extendidos en los navegadores de producción. En lugar de esto, es importante utilizar solicitudes POST de HTTP para todos los datos dinámicos, ya que este tipo de solicitudes nunca se almacenan en caché y, por lo tanto, llegan a la red.


El resultado final es una aplicación web que se carga en modo sin conexión y te permite leer los mensajes de Gmail si los datos se han almacenado en caché previamente. También hemos añadido propiedades y para crear una interfaz de usuario elegante que se cargue rápidamente.


Si quieres probar la nueva aplicación web de Gmail para móviles, accede a gmail.com desde un dispositivo con tecnología de Android o un iPhone (SO 2.2.1 o superior). Para obtener más información acerca de HTML5, consulta el blog de Google Code.


Inês Gonçalves, Marketing de España

En el desarrollo para móvil es muy común requerir datos e interactuar con servicios. Como desarrolladores móvil seguramente habrán requisitos o necesidades en donde tengamos que obtener un listado de comercios alojado en un servicio web de nuestro departamento, o bien acceder a un listado de solicitudes que se actualiza periódicamente que brinda la oficina de solicitudes de una entidad guvernamental, o bien sólo simples servicios como el del tiempo, cotizaciones, finanzas, etc.

Si bien sabemos que podemos hacerlo de diferentes formas en Android, como mediante REST, en este caso particular lo haremos mediante SOAP y el servicio estará construido en Dotnet.
Con esto agregamos contenido extra y no sólo construiremos una solución Android sinó que mostramos la interoperabilidad que podemos lograr utilizando Android.

¿Lindo desafío no?

Introducción

En primer lugar, para interactuar con SOAP utilizaremos una librería llamada ksoap2 for android.
http://code.google.com/p/ksoap2-android/
De esta forma gran parte de la complejidad del desarrollo descansa en este componente. Luego generaremos una aplicación Android y un servicio Web Dotnet.

Servicio Web Dotnet

El servicio desarrollado en dotnet, es un web service tradicional sobre el framework 2.0 sin hacer uso de WCF.

Fig.1 - Servicio Web - Dotnet C# - framework 2.0

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class Service : System.Web.Services.WebService
{
public Service ()
{

}

[WebMethod]
public string SaludoAndroid() {
return "Servicio de Nicolás!";
}

}

Code 1 - Código del Servicio Web en C#

Como podemos observar en el Code 1, el servicio web sólo posee un método de nombre “SaludoAndroid” y que su operación es devolver una cadena “Servicio de Nicolás!”

Aplicación Android

Vamos a generar una aplicación Android para la versión 2.2.

Fig.2 - Proyecto Android General para la solución de llamada a un web Service


En primer lugar deberemos descargarnos la librería ksoap2 for android y luego referenciarla en nuestro proyecto android.

Fig.3 - Sitio de desacarga de ksoap2-android


Para el ‘layout’ de la aplicación no invertiremos tiempo ya que solo utilizaremos un textview para mostrar contenido de texto extraído del servicio Web.

Fig. 4 - Layout de la solución Android


En el manifiesto de la aplicación debemos tener en cuenta el agregar permisos al acceso a Internet como muestra la Fig. 5.

Fig. 5 - Manifiesto de la solución Android desarrollada


Finalmente realizaremos la codificación de la actividad que acceda al servicio web de la tecnología Dotnet y pueda mostrar los resultados en Android.

La clase “GetServicio” posee algunas variables necesarias para interactuar con la librería ksoap2:
private static final String accionSoap = "http://tempuri.org/HelloWorld";
private static final String Metodo = "HelloWorld";
private static final String namespace = "http://tempuri.org/";
private static final String url = "http://nicolasdotar/ServicioAndroid/Service.asmx";

Code 2 - Declaración de variables en la clase GetServicio

Luego todo el desarrollo se encuentra en el ‘onCreate’:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tv = (TextView) findViewById(R.id.text1);

try {

//Modelo el request
SoapObject request = new SoapObject(namespace, Metodo);

//Modelo el Sobre
SoapSerializationEnvelope sobre = new SoapSerializationEnvelope(SoapEnvelope.VER12);
sobre.dotNet = true;
sobre.setOutputSoapObject(request);

//Modelo el transporte
HttpTransportSE transporte = new HttpTransportSE(url);

//Llamada
transporte.call(accionSoap, sobre);

//Resultado
SoapPrimitive resultado = (SoapPrimitive) sobre.getResponse();


tv.setText("" + resultado.toString());

}
catch (Exception e)
{
tv.setText(e.getMessage());
}

}

Code 3 - Evento Oncreate

Veamos el servicio web funcionando solo:

Fig. 6 - Servicio Web en funcionamiento local


Veamos la solución Android funcionando en el emulador consumiendo el servicio web:

Fig. 7 - Solución desplegada en el Emulador de Android


Finalmente, veamos como se construye paso a paso en el siguiente Vídeo:

Ver vídeo implementación



Nicolas Bortolotti, Ingeniero U.T.N. Regional San Francisco - Comunidad Xcloud

El próximo 3 de diciembre celebraremos el Google Developer Workshop en colaboración con la la Facultad de Informática y el Máster MIMO en la Universidad Pontificia de Salamanca.

Se trata de una jornada para desarrolladores en la que ponentes que trabajan día a día con los productos para programadores de Google nos contarán su experiencia y las mejores prácticas a la hora de programar aplicaciones para las plataformas de Android y Chrome. Es además una excelente oportunidad para conocer a otros desarrolladores que también están trabajando con estos productos.

Hablaremos sobre tecnologías móviles y web: Android, HTML5 y Chrome. La inscripción es gratuita, sin embargo, las plazas son limitadas por lo tanto es importante hacer la inscripción lo antes posible a través de este formulario.




La jornada empezará con una sesión de Google Chrome y HTML5 a cargo de nuestros amigos de Madpixel. Esta compañía española, creada en 1999, está especializada en soluciones innovadoras para Internet y cuenta con una amplia experiencia en productos de Google y web apps.

A continuación habrá una pausa para el café y después presentará Unkasoft sus aplicaciones para campañas de marketing móvil, videojuegos y advergaming en Android que están teniendo una gran aceptación en el mercado.

Finalizaremos la jornada de la mano de Aescolapius quienes nos presentarán un proyecto que nació en el club de innovación de la Universidad Pontificia de Salamanca. Su proyecto consiste en una silla de ruedas motorizada controlada por un móvil con programación Android. El control de la silla motorizada se puede realizar mediante voz, pantalla táctil, inclinación y reconocimiento facial.

¡Te esperamos en Salamanca para que celebres con nosotros el Google Developer Workshop!

Bosco Zubiaga, departamento de Marketing de Google Spain
El próximo 3 de diciembre celebraremos el Google Developer Workshop en colaboración con la la Facultad de Informática y el Máster MIMO en la Universidad Pontificia de Salamanca.

Se trata de una jornada para desarrolladores en la que ponentes que trabajan día a día con los productos para programadores de Google nos contarán su experiencia y las mejores prácticas a la hora de programar aplicaciones para las plataformas de Android y Chrome. Es además una excelente oportunidad para conocer a otros desarrolladores que también están trabajando con estos productos.

Hablaremos sobre tecnologías móviles y web: Android, HTML5 y Chrome. La inscripción es gratuita, sin embargo, las plazas son limitadas por lo tanto es importante hacer la inscripción lo antes posible a través de este formulario.




La jornada empezará con una sesión de Google Chrome y HTML5 a cargo de nuestros amigos de Madpixel. Esta compañía española, creada en 1999, está especializada en soluciones innovadoras para Internet y cuenta con una amplia experiencia en productos de Google y web apps.

A continuación habrá una pausa para el café y después presentará Unkasoft sus aplicaciones para campañas de marketing móvil, videojuegos y advergaming en Android que están teniendo una gran aceptación en el mercado.

Finalizaremos la jornada de la mano de Aescolapius quienes nos presentarán un proyecto que nació en el club de innovación de la Universidad Pontificia de Salamanca. Su proyecto consiste en una silla de ruedas motorizada controlada por un móvil con programación Android. El control de la silla motorizada se puede realizar mediante voz, pantalla táctil, inclinación y reconocimiento facial.

¡Te esperamos en Salamanca para que celebres con nosotros el Google Developer Workshop!

Bosco Zubiaga, departamento de Marketing de Google Spain

En este artículo vamos a profundizar algunos conceptos sobre AppEngine en donde utilizaremos una aplicación que procese solicitudes desde el envío de un mail para realizar de forma simulada una solicitud de artículos a determinada organización.
Generalmente nos encontramos con diversos problemas a resolver y automatizar en el desarrollo de aplicaciones, y sinceramente es muy probable que se desencadenen requerimientos que necesiten interacción de un servicio de mail para por ejemplo recibir peticiones de clientes en solicitudes de pedidos.En el artículo se plantea una simulación para mostrar la solución desarrollada con Google AppEngine. Con esta solución estoy pensando en un modelo de cloud computing, gozando de todos los privilegios que propone el concepto y además facilitando escalar rápidamente y a demanda de requerirlo en mi aplicación.
Para esta solución se utiliza el servicio de mail de appengine pero no para enviar mails sino para recibir peticiones y procesarlas y con ello mostrar en un listado muy simple los resultados del pedido.

Tecnología utilizada:
  • Eclipse Helios Release
  • SDK AppEngine 1.2.6


Vamos al desarrollo!. En primer lugar generaremos una solución en Eclipse para AppEngine y en esta oportunidad voy utilizar simples JSP para mostrar los resultados como presentación.
En primer lugar voy a generar las entidades del modelo que se requieren para resolver la problemática, en esta oportunidad solo requiero de una entidad Articulo.

Fig. 1 – Modelo de Articulo


La Fig.1 muestra el modelo de código implementado para la generación de la entidad Articulo.
package xcloudPackage.shared;

public class Articulo
{
private String nombre;
private String descripcion;
private int precio;

public Articulo(String pNombre, String pDescripcion, int pPrecio)
{
this.nombre = pNombre;
this.descripcion = pDescripcion;
this.precio = pPrecio;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public String getDescripcion() {
return descripcion;
}
public void setPrecio(int precio) {
this.precio = precio;
}
public int getPrecio() {
return precio;
}

}

Code. 1 – Código Fuente de la Entidad Articulo

Una vez generada la entidad de mi modelo que de hecho es muy simple, tengo que definir la estrategia de persistencia, en esta oportunidad voy a utilizar una clase bien simple que almacena en un arraylist.

Fig.2 – Modelo de persistencia propuesta en la clase dataArticulo


La Fig.2 muestra el escenario de persistencia de la entidad Articulo, para este ejemplo se han definido dos métodos, uno que agrega Artículos y otro que lista la cantidad de artículos.
package xcloudPackage.shared;

import java.util.ArrayList;
import java.util.List;

public enum dataArticulo
{
INSTANCE;
private static long number=1;

private final List articulos = new ArrayList();

private dataArticulo()
{
//Sin implementar
}

public void Agregar(String nombre, String descripcion, int precio)
{
synchronized (this) {
number ++;
articulos.add(new Articulo(nombre, descripcion, precio));
}
}
public List getArticulos()
{

return articulos;
}

}

Code. 2 – Código Fuente de la solución de persistencia

Bien en el siguiente paso se requiere generar el servlet que de soporte a la inserción del articulo, para ello generaremos el “servletCrearArticulo”.

Fig. 3 – ServletCrearArticulo


La Fig.3 muestra el servletCrearArticulo que me permite como ustedes puede visualizar obtener parámetros como el nombre, descripción y precio de un artículo y persistirlos utilizando la instancia de “data Articulo”
package xcloudPackage.shared;

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@SuppressWarnings("serial")
public class servletCrearArticulo extends HttpServlet
{
public void doPost(HttpServletRequest a, HttpServletResponse resp)
throws IOException
{
String nombre = checkNull(a.getParameter("nombre"));
String descripcion = checkNull(a.getParameter("descripcion"));
int precio = Integer.parseInt(a.getParameter("precio"));


dataArticulo.INSTANCE.Agregar(nombre, descripcion, precio);

resp.sendRedirect("/Articulos.jsp");
}

private String checkNull(String s) {
if (s == null)
{
return "";
}
return s;
}
}

Code. 3 – Código Fuente del servletCrearArticulo

Como pueden observar en el Code 3, se realiza un “sendRedirect” a Articulos.jsp, vamos a generar esta página para poder completar los componentes necesarios para la visualización y solo quedará colocar la lógica de interacción con el servicio de mail.

Fig.4 – Representación de Articulos.jsp


La Fig.4 muestra el mecanismo de presentación para poder visualizar el listado de artículos que generaremos con cada envío de mail al servicio de appengine. Como podemos observar se mostrará en una tabla que posee como columnas, nombre, descripción y precio. Además no está detallado en el articulo pero a esta solución se le propone interactuar con la autenticación de Google para dar formalidad en ambientes más avanzados.
Finalmente vamos a construir el código fuente que permita procesar el email y persistir el mismo para poder visualizarlo en el listado anteriormente detallado de mi JSP.

Fig. 5 – EmailServlet para la insteracción con el servicio de mail.


Como se puede observar en la Fig. 5 se procesa el mail recibido y se realizar mediante la instancia de “dataArticulo” el agregado al escenario de persistencia, de esta forma podremos acceder al listado completo de artículos desde el JSP desarrollado.
Para completar el desarrollo tengo que detallar un punto importante, como es la configuración del archivo web.xml:
xml version="1.0" encoding="UTF-8"?>
DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>



<servlet>
<servlet-name>CrearNuevoArticuloservlet-name>
<servlet-class>xcloudPackage.shared.servletCrearArticuloservlet-class>
servlet>
<servlet-mapping>
<servlet-name>CrearNuevoArticuloservlet-name>
<url-pattern>/newurl-pattern>
servlet-mapping>

<servlet>
<servlet-name>Emailservlet-name>
<servlet-class>xcloudPackage.shared.EmailServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>Emailservlet-name>
<url-pattern>/_ha/mail/*url-pattern>
servlet-mapping>


<welcome-file-list>
<welcome-file>/Articulos.jspwelcome-file>
welcome-file-list>

web-app>

Code 4 – Archivo de Configuración Web.xml

En el Code 4 se pude observar la declaración de los servlets necesarios para realizar la solución planteada en el articulo.
Finalmente podemos realizar una prueba local, y realizar el despliegue en la infraestructura de Google.
El siguiente Vídeo muestra la implementación del desarrollo descripto.

Ver Video

Espero les sea de utilidad!

Nicolas Bortolotti, Ingeniero U.T.N. Regional San Francisco - Comunidad Xcloud
En este artículo vamos a profundizar algunos conceptos sobre AppEngine en donde utilizaremos una aplicación que procese solicitudes desde el envío de un mail para realizar de forma simulada una solicitud de artículos a determinada organización.
Generalmente nos encontramos con diversos problemas a resolver y automatizar en el desarrollo de aplicaciones, y sinceramente es muy probable que se desencadenen requerimientos que necesiten interacción de un servicio de mail para por ejemplo recibir peticiones de clientes en solicitudes de pedidos.En el artículo se plantea una simulación para mostrar la solución desarrollada con Google AppEngine. Con esta solución estoy pensando en un modelo de cloud computing, gozando de todos los privilegios que propone el concepto y además facilitando escalar rápidamente y a demanda de requerirlo en mi aplicación.
Para esta solución se utiliza el servicio de mail de appengine pero no para enviar mails sino para recibir peticiones y procesarlas y con ello mostrar en un listado muy simple los resultados del pedido.

Tecnología utilizada:
  • Eclipse Helios Release
  • SDK AppEngine 1.2.6


Vamos al desarrollo!. En primer lugar generaremos una solución en Eclipse para AppEngine y en esta oportunidad voy utilizar simples JSP para mostrar los resultados como presentación.
En primer lugar voy a generar las entidades del modelo que se requieren para resolver la problemática, en esta oportunidad solo requiero de una entidad Articulo.

Fig. 1 – Modelo de Articulo


La Fig.1 muestra el modelo de código implementado para la generación de la entidad Articulo.
package xcloudPackage.shared;

public class Articulo
{
private String nombre;
private String descripcion;
private int precio;

public Articulo(String pNombre, String pDescripcion, int pPrecio)
{
this.nombre = pNombre;
this.descripcion = pDescripcion;
this.precio = pPrecio;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public String getDescripcion() {
return descripcion;
}
public void setPrecio(int precio) {
this.precio = precio;
}
public int getPrecio() {
return precio;
}

}

Code. 1 – Código Fuente de la Entidad Articulo

Una vez generada la entidad de mi modelo que de hecho es muy simple, tengo que definir la estrategia de persistencia, en esta oportunidad voy a utilizar una clase bien simple que almacena en un arraylist.

Fig.2 – Modelo de persistencia propuesta en la clase dataArticulo


La Fig.2 muestra el escenario de persistencia de la entidad Articulo, para este ejemplo se han definido dos métodos, uno que agrega Artículos y otro que lista la cantidad de artículos.
package xcloudPackage.shared;

import java.util.ArrayList;
import java.util.List;

public enum dataArticulo
{
INSTANCE;
private static long number=1;

private final List articulos = new ArrayList();

private dataArticulo()
{
//Sin implementar
}

public void Agregar(String nombre, String descripcion, int precio)
{
synchronized (this) {
number ++;
articulos.add(new Articulo(nombre, descripcion, precio));
}
}
public List getArticulos()
{

return articulos;
}

}

Code. 2 – Código Fuente de la solución de persistencia

Bien en el siguiente paso se requiere generar el servlet que de soporte a la inserción del articulo, para ello generaremos el “servletCrearArticulo”.

Fig. 3 – ServletCrearArticulo


La Fig.3 muestra el servletCrearArticulo que me permite como ustedes puede visualizar obtener parámetros como el nombre, descripción y precio de un artículo y persistirlos utilizando la instancia de “data Articulo”
package xcloudPackage.shared;

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@SuppressWarnings("serial")
public class servletCrearArticulo extends HttpServlet
{
public void doPost(HttpServletRequest a, HttpServletResponse resp)
throws IOException
{
String nombre = checkNull(a.getParameter("nombre"));
String descripcion = checkNull(a.getParameter("descripcion"));
int precio = Integer.parseInt(a.getParameter("precio"));


dataArticulo.INSTANCE.Agregar(nombre, descripcion, precio);

resp.sendRedirect("/Articulos.jsp");
}

private String checkNull(String s) {
if (s == null)
{
return "";
}
return s;
}
}

Code. 3 – Código Fuente del servletCrearArticulo

Como pueden observar en el Code 3, se realiza un “sendRedirect” a Articulos.jsp, vamos a generar esta página para poder completar los componentes necesarios para la visualización y solo quedará colocar la lógica de interacción con el servicio de mail.

Fig.4 – Representación de Articulos.jsp


La Fig.4 muestra el mecanismo de presentación para poder visualizar el listado de artículos que generaremos con cada envío de mail al servicio de appengine. Como podemos observar se mostrará en una tabla que posee como columnas, nombre, descripción y precio. Además no está detallado en el articulo pero a esta solución se le propone interactuar con la autenticación de Google para dar formalidad en ambientes más avanzados.
Finalmente vamos a construir el código fuente que permita procesar el email y persistir el mismo para poder visualizarlo en el listado anteriormente detallado de mi JSP.

Fig. 5 – EmailServlet para la insteracción con el servicio de mail.


Como se puede observar en la Fig. 5 se procesa el mail recibido y se realizar mediante la instancia de “dataArticulo” el agregado al escenario de persistencia, de esta forma podremos acceder al listado completo de artículos desde el JSP desarrollado.
Para completar el desarrollo tengo que detallar un punto importante, como es la configuración del archivo web.xml:
xml version="1.0" encoding="UTF-8"?>
DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>



<servlet>
<servlet-name>CrearNuevoArticuloservlet-name>
<servlet-class>xcloudPackage.shared.servletCrearArticuloservlet-class>
servlet>
<servlet-mapping>
<servlet-name>CrearNuevoArticuloservlet-name>
<url-pattern>/newurl-pattern>
servlet-mapping>

<servlet>
<servlet-name>Emailservlet-name>
<servlet-class>xcloudPackage.shared.EmailServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>Emailservlet-name>
<url-pattern>/_ha/mail/*url-pattern>
servlet-mapping>


<welcome-file-list>
<welcome-file>/Articulos.jspwelcome-file>
welcome-file-list>

web-app>

Code 4 – Archivo de Configuración Web.xml

En el Code 4 se pude observar la declaración de los servlets necesarios para realizar la solución planteada en el articulo.
Finalmente podemos realizar una prueba local, y realizar el despliegue en la infraestructura de Google.
El siguiente Vídeo muestra la implementación del desarrollo descripto.

Ver Video

Espero les sea de utilidad!

Nicolas Bortolotti, Ingeniero U.T.N. Regional San Francisco - Comunidad Xcloud