Gmail Push en iPhone

septiembre 23, 2009
Si algo llevamos esperando los usuarios de gmail y poseedores del iphone es el poder usar Push como los usuarios de otros dispositivos pueden desde hace mucho tiempo.
Pues bien, ese día ha llegado, desde ayer podemos usar push, no solo para consultar el correo, si no para sincronizar los calendarios y los contactos.
Si alguien no entiende inglés o prefiere leerlo en español, aquí va mi granito de arena ?
La configuración es sencilla, lo primero de todo es que necesitamos un iphone con el firmware 3.0 o superior.  Ya que se van a sincronizar datos como los contactos, se recomienda hacer un backup de dichos datos antes de configurarlo, por si las moscas.
Para activar el push debemos configurar una nueva cuenta de correo, para ello nos dirigimos a Cuentas de correo dentro de Ajustes y elegimos como nueva cuenta una de Exchange. Google utiliza el protocolo ActiveSync para gestionar el push.
El siguiente paso es rellenar los datos de conexión de la cuenta, para ello rellenamos los datos de la siguiente manera:
En el campo de dirección de correo, ponemos nuestra dirección completa de correo. Por ejemplo zbutton@gmail.com
Dejamos el campo de Dominio vacio
En el campo de usuario, volvemos a introducir nuestra dirección completa de correo, de nuevo zbutton@gmail.com
En el campo de contraseña, introducimos nuestra contraseña
Una vez rellenados estos campos, pulsamos en continuar. Se nos mostrará un mensaje de error, diciendo que es imposible verificar el certificado, no os preocupéis es normal. Pulsamos en aceptar y saldrá un nuevo campo que deberemos rellenar.
El nuevo campo es el servidor, y lo rellenamos con m.google.com. Pulsamos en Siguiente.
La siguiente pantalla nos pregunta que información queremos sincronizar, aparte del correo podemos sincronizar los contactos y los calendarios, pero ojo!, si sincronizamos ambas cosas podemos perder los datos que actualmente tenemos en el iphone. Cuando activamos alguna de las opciones se nos preguntará qué queremos hacer con los datos que actualmente están en el teléfono. Si decidimos conservarlos, puede que haya problemas de duplicados, si decidimos no conservarlos, los datos se borrarán.
Una vez configurado la cuenta debemos asegurarnos que en el modo de recuperar la información tenemos activado el push, y voila, cuando nos llegue un correo, el teléfono nos avisará sin tener que consultar nosotros el correo.
Solo hay una pequeña pega que poner y es que solo se puede tener una cuenta de Exchange a la vez, por lo que si ya tenemos previamente una cuenta configurada con este método, no podremos usar el push en el gmail. No todo podía ser perfecto.

Si algo llevamos esperando los usuarios de gmail y poseedores del iphone es el poder usar Push como los usuarios de otros dispositivos pueden desde hace mucho tiempo.

Pues bien, ese día ha llegado, desde ayer podemos usar push, no solo para consultar el correo, si no para sincronizar los calendarios y los contactos.

La información original esta en la web de google.

Si alguien no entiende inglés o prefiere leerlo en español, aquí va mi granito de arena 🙂

La configuración es sencilla, lo primero de todo es que necesitamos un iphone con el firmware 3.0 o superior. Ya que se van a sincronizar datos como los contactos, se recomienda hacer un backup de dichos datos antes de configurarlo, por si las moscas.

Para activar el push debemos configurar una nueva cuenta de correo, para ello nos dirigimos a Cuentas de correo dentro de Ajustes y elegimos como nueva cuenta una de Exchange. Google utiliza el protocolo ActiveSync para gestionar el push.

push1

push 2

El siguiente paso es rellenar los datos de conexión de la cuenta, para ello rellenamos los datos de la siguiente manera:

• En el campo de dirección de correo, ponemos nuestra dirección completa de correo. Por ejemplo zbutton@gmail.com

• Dejamos el campo de Dominio vacio

• En el campo de usuario, volvemos a introducir nuestra dirección completa de correo, de nuevo zbutton@gmail.com

• En el campo de contraseña, introducimos nuestra contraseña

Una vez rellenados estos campos, pulsamos en continuar. Se nos mostrará un mensaje de error, diciendo que es imposible verificar el certificado, no os preocupéis es normal. Pulsamos en aceptar y saldrá un nuevo campo que deberemos rellenar.

El nuevo campo es el servidor, y lo rellenamos con m.google.com. Pulsamos en Siguiente.

push 3

La siguiente pantalla nos pregunta que información queremos sincronizar, aparte del correo podemos sincronizar los contactos y los calendarios, pero ojo!, si sincronizamos ambas cosas podemos perder los datos que actualmente tenemos en el iphone. Cuando activamos alguna de las opciones se nos preguntará qué queremos hacer con los datos que actualmente están en el teléfono. Si decidimos conservarlos, puede que haya problemas de duplicados, si decidimos no conservarlos, los datos se borrarán.

push 4

Una vez configurado la cuenta debemos asegurarnos que en el modo de recuperar la información tenemos activado el push, y voila, cuando nos llegue un correo, el teléfono nos avisará sin tener que consultar nosotros el correo.

Solo hay una pequeña pega que poner y es que solo se puede tener una cuenta de Exchange a la vez, por lo que si ya tenemos previamente una cuenta configurada con este método, no podremos usar el push en el gmail. No todo podía ser perfecto.


Un cambio necesario. HTML 5.

septiembre 22, 2009
Estamos viendo nacer uno de los cambios más importantes de los últimos años, la próxima versión de uno de los lenguajes más usados en la actualidad, el HTML 5, está ultimando sus detalles finales.
El actual estándar (4.01) data de 1999 (aunque la última revisión fue en 2001), en estos casi 10 años, han pasado muchísimas cosas en lo que se refiere a las páginas web, la evolución del lenguaje que se responsabiliza de mostrar los contenidos al usuario necesitaba un cambio para adaptarse a estos nuevos tiempos.
Pese a que durante este tiempo el estándar HTML no se ha movido, lo cierto es que han surgido muchas tecnologías que ayudaban a paliar esta inmovilidad, como pueden ser los CSS, o incluso el mismo Flash.
Con cosas como Flash, se han cubierto las necesidades que las nuevas tecnologías demandaban.
Para entender la película al completo, falta incorporar a los actores principales, los navegadores, las aplicaciones que son los encargados de mostrar el HTML y todo su contenido adicional.
Aunque originalmente, los navegadores mostraban contenido bastante estático, hoy en día son plataformas lanzadoras de aplicaciones, como vemos, los movimientos de las grandes empresas se dirigen a encapsular cada vez mas aplicaciones en el navegador, ejemplos los hay en gran número, gmail, google docs, office online, flickr, solo son unos pocos casos.
El futuro de la web pasar por la implementación de los nuevos estándares en los navegadores.
A diferencia de las anteriores revisiones de HTML, la evolución que se va a publicar va a ser de gran importancia ya que el uso de la web hace 10 años no tiene nada que ver con el que se realiza hoy en día. Si pensamos para que usábamos un navegador hace 10 años y lo comparamos con el uso que le damos actualmente nos daremos cuenta que poco tiene que ver. Según que trabajo, es posible que la única aplicación que ejecutemos durante un día de trabajo sea un navegador.
Uno de los cambios más importantes que incorpora HTML5 es que expone una API que permite manipular directamente elementos de la página, por ejemplo, se ha incorporado el elemento canvas con el podrá pintar gráficos 2D de forma directa, sin tener que usar “trucos” de javascript o elementos externos como flash o applets java.
Derivado de las nuevas APIs, esta otro gran cambio, en HTML5 es la incorporación de elementos multimedia de forma nativa, mediante el uso del tag audio o video, podremos incrustar en nuestras webs videos sin tener que recurrir a ningún plugin, solo necesitaremos un navegador compatible.
Con esta nueva versión de HTML 5 también se ha incorporado la posibilidad de acceder a aplicaciones web estando offline, lo que ya nos proporcionaba Google Gears, va a estar incluido dentro del navegador. Como veíamos la penetración de las aplicaciones web en nuestro uso diario ha influido de forma determinante en la incorporación de estas necesidades.
Aparte de estos cambios, la nueva versión ha revisado numerosos elementos del lenguaje, por ejemplo han eliminado tags como <font> o <center> forzándolos a moverlos a la css con el fin de separar realmente la presentación del contenido.
Como comentábamos antes, la parte más importante del papel son los navegadores, y son los que tienen que materializar los cambios que impone el estándar, por ejemplo debido a la inclusión de los contenidos audiovisuales de forma nativa, los navegadores van a tener que incluir una gestión de contenidos multimedia  que antes no necesitaban incorporar, ya que se encargaban de ellos otros elementos como los plugins.
En el momento de escribir esta entrada hay varios navegadores con soporte preliminar de HTML 5. Firefox 3.5, Chrome v3, Safari 4 y Opera 10.
Un buen punto de entrada puede ser la versión de HTML 5 de youtube: http://www.youtube.com/html5 . Si entramos en esta web con uno de los navegadores anteriores podremos ver el video sin necesidad de instalar ningún plugin.

Safari HTML5

Estamos viendo nacer uno de los cambios más importantes de los últimos años, la próxima versión de uno de los lenguajes más usados en la actualidad, el HTML 5, está ultimando sus detalles finales.

El actual estándar (4.01) data de 1999 (aunque la última revisión fue en 2001), en estos casi 10 años, han pasado muchísimas cosas en lo que se refiere a las páginas web, la evolución del lenguaje que se responsabiliza de mostrar los contenidos al usuario necesitaba un cambio para adaptarse a estos nuevos tiempos.

Pese a que durante este tiempo el estándar HTML no se ha movido, lo cierto es que han surgido muchas tecnologías que ayudaban a paliar esta inmovilidad, como pueden ser los CSS, o incluso el mismo Flash.

Con cosas como Flash, se han cubierto las necesidades que las nuevas tecnologías demandaban.

Para entender la película al completo, falta incorporar a los actores principales, los navegadores, las aplicaciones que son los encargados de mostrar el HTML y todo su contenido adicional.

Aunque originalmente, los navegadores mostraban contenido bastante estático, hoy en día son plataformas lanzadoras de aplicaciones, como vemos, los movimientos de las grandes empresas se dirigen a encapsular cada vez mas aplicaciones en el navegador, ejemplos los hay en gran número, gmail, google docs, office online, flickr, solo son unos pocos casos.

El futuro de la web pasar por la implementación de los nuevos estándares en los navegadores.

A diferencia de las anteriores revisiones de HTML, la evolución que se va a publicar va a ser de gran importancia ya que el uso de la web hace 10 años no tiene nada que ver con el que se realiza hoy en día. Si pensamos para que usábamos un navegador hace 10 años y lo comparamos con el uso que le damos actualmente nos daremos cuenta que poco tiene que ver. Según que trabajo, es posible que la única aplicación que ejecutemos durante un día de trabajo sea un navegador.

Uno de los cambios más importantes que incorpora HTML5 es que expone una API que permite manipular directamente elementos de la página, por ejemplo, se ha incorporado el elemento canvas con el podrá pintar gráficos 2D de forma directa, sin tener que usar “trucos” de javascript o elementos externos como flash o applets java.

Derivado de las nuevas APIs, esta otro gran cambio, en HTML5 es la incorporación de elementos multimedia de forma nativa, mediante el uso del tag audio o video, podremos incrustar en nuestras webs videos sin tener que recurrir a ningún plugin, solo necesitaremos un navegador compatible.

Con esta nueva versión de HTML 5 también se ha incorporado la posibilidad de acceder a aplicaciones web estando offline, lo que ya nos proporcionaba Google Gears, va a estar incluido dentro del navegador. Como veíamos la penetración de las aplicaciones web en nuestro uso diario ha influido de forma determinante en la incorporación de estas necesidades.

Aparte de estos cambios, la nueva versión ha revisado numerosos elementos del lenguaje, por ejemplo han eliminado tags como <font> o <center> forzándolos a moverlos a la css con el fin de separar realmente la presentación del contenido.

Como comentábamos antes, la parte más importante del papel son los navegadores, y son los que tienen que materializar los cambios que impone el estándar, por ejemplo debido a la inclusión de los contenidos audiovisuales de forma nativa, los navegadores van a tener que incluir una gestión de contenidos multimedia que antes no necesitaban incorporar, ya que se encargaban de ellos otros elementos como los plugins.

En el momento de escribir esta entrada hay varios navegadores con soporte preliminar de HTML 5. Firefox 3.5, Chrome v3, Safari 4 y Opera 10.

Un buen punto de entrada puede ser la versión de HTML 5 de youtube: http://www.youtube.com/html5 . Si entramos en esta web con uno de los navegadores anteriores podremos ver el video sin necesidad de instalar ningún plugin.


Los inconvenientes de mezclar dos mundos

septiembre 7, 2009


En Muchas ocasiones cuando vemos las letras C++ o C, realmente no nos damos cuento de cuanto diferentes son ambos mundos. El facil acceso a C desde C++ sin duda es una gran ventaja ya que por una parte nos permite acceder a la gran funcionalidad que C ha adquirido en todos estos años y por otro lado nos permite utilizar el gran número de librerías que existen para el lenguaje de programación más común.

En el gran y “tedioso” libro sobre C++ de Bjarne Stroustrup, podemos encontrar las razones de porque cuando pensaba en crear un nuevo lenguaje de programación, pensó en C. Sus principales razones fueron: “C puede compilarse y ejecutarse en casi cualquier dispositivo electrónico”.

Sin embargo como vamos a ver en este post, C y C++ realmente son mundos muy diferentes.

Esto viene a cuento por un problema con el que me he topado recientemente, y que me ha dado algún que otro quebradero de cabeza.

Supongamos que tenemos una librería diseñada para ser usada en C. Dicha librería permite hacer llamadas asíncronas, de tal manera que a la función que realiza el proceso debemos pasarle un puntero a función con la dirección a la que llamara cuando la accion se termine, lo que normalmente se conoce como callback. Pongamos como ejemplo, una funcion de lectura de datos.

lib_read(int handle, int waitTime, int (*read_callback)(void *buffer, int sizeRead) );

El prototipo de la función de callback sería algo como:

int my_callback(void *buffer, int size)
{
/* CODIGO */
}

El funcionamiento normal sería realizar la llamada de la siguiente manera:

read(my_handle, 1000 /*ms*/, my_callback);

Hasta aquí, todo correcto. Cuando el proceso haya leído los datos, se llamara a la función my_callback con los datos listos para ser procesados.

Os preguntareis, ¿Cual es el problema?
Como decía anteriormente, vamos a introducir a C++ en la ecuación.
Digamos que tenemos una clase que se encarga de realizar las lecturas de esos datos que hablabamos anteriormente. El ejemplo serÌa algo como:

class ReadHandler
{
public:
ReadHandler();
vector ProcessData();
private:
char* readData;
int read();
/*Teorica funcion de callback para la libreria de lectura */
int my_callback(void* buffer, int size);

}

El objetivo de esta clase es leer los datos y procesarlos, de tal manera que cuando llamamos a ProcessData nos devolverá un array con los datos ya procesados. Gracias al diseño orientado a Objectos de C++, los datos están encapsulados en su clase. Y si creamos varias instancias de ReadHandler, los datos no se compartirán.

Como hemos visto que la librería anterior se ajusta a nuestras necesidades, por lo que nos planteamos usarla para nuestro programa.
Para ello pensamos que el constructor de la clase puede ser un buen lugar para realizar la llamada asincrona, asi cuando nos llamen a ProcessData, si el callback ya ha rellenado los datos contenidos en readData los podamos procesar y devolver su contenido.

Con todo organizado en nuestra cabeza nos ponemos manos a la obra. Añadiremos la función de callback a la clase, y en el constructor la llamaremos

lib_read(handle, 1000, my_callback);

Compilamos y…. error. Todo parece correcto y aun así falla, ¿por qué?. Bienvenidos al mundo de C 🙂

En la función le estamos pasando un puntero a función, y en C++, no es posible pasar de esa manera un puntero a una función miembro de la clase, como my_callback es, por lo que este será nuestro primer error, seguramente el mas sencillo de solucionar, ya que es el compilador quien se queja.

En C++, para crear un puntero a función miembro se debe usar el operando & precediendo al nombre, aún así, el compilador vuelve a fallar, ya que no es posible pasar un puntero a una función miembro no estática.

Esto nos deja un poco fuera de juego, ya que la librería era perfecta para nuestras necesidades y oye, al fin y al cabo C++ puede usar código C. El problema real es que la convención de llamadas a funciones en C y en C++ es diferente, en C++ aunque no se vea a ojos del programador, el primer parámetro de todas las funciones es un puntero a la instancia sobre la cual llamamos la función, lo que se conoce como la convención thiscall.

La siguiente aproximación puede pasar por abandonar temporalmente C++ y ya que la función necesita como callback, una función estática o una función que no sea de C++, pues podríamos usar una función de C.

El problema de esta aproximación es volver al “mundo” de C++, si el callback seria una función fuera de cualquier clase, no tendríamos una referencia a la instancia que llamo originalmente a la función que realiza la lectura asíncrona.

Llegados a este punto, hemos visto la problemática que tiene la situación, y de hecho este problema no tiene una solución elegante, pues se necesita que la librería proporcione un medio para pasar la instancia que le esta llamando.

Una solución bastante poco elegante pero que puede salvar alguna situación limite es usar una variable global para almacenar la instancia que llama a la función, y así poder hacer la llamada de vuelta.
En código sería algo como:

ReadHandler* global;
ReadHandler::ReadHandler()
{
global = this;
lib_read(…., callback_c);
}

int callback_c(…)
{
this->my_callback(…);
}

Sin duda, esta solución esta plagada de problemas, por ejemplo, ¿Qué pasaría si varios hilos crean instancias de ReadHandler?, pues como podemos predecir, habría un conflicto ya que la variable global no tendría un valor valido en cada llamada.

Dado a este problema y ya que es habitual utilizar librerías de C en C++, el diseño de este tipo de llamadas de forma correcta es crítico, y la mayoría de ellas habilita una variable donde se puede enviar la instancia que realiza la llamada. Por ejemplo, en la API de Windows nos encontramos con funciones con este prototipo

HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId );

Esta función crea un Hilo, llamando a la función en el parametro lpStartAddress, y pasandole como parametro el que le indicamos en lpParameter. El protipo del callback es:

DWORD WINAPI ThreadProc(LPVOID lpParameter );

Usando esta convención, en nuestro ejemplo:

ReadHandler::ReadHandler()
{
CreateThread(….,callback_compatible, (LPVOID) this, …. );
}

DWORD WINAPI callback_compatible(LPVOID lpParameter)
{
ReadHandler* rh = (ReadHandler) lpParameter;
this->my_callback(……);
}

Muchas librerías ya tienen esto en cuenta, y si estas desarrollando una librería deberias tenerlo en cuenta, ya que no es ningun esfuerzo extra y ganaras la compatibilidad con otros lenguajes como c++.