Hace unos días, en el grupo Google-Developer-Day-Madrid, vi un mensaje de Jorge Álvaro, del Lamboratory en el que nos presentaba su nuevo Gadget, el Gadget para Comunicación Multiusuario ...


Hace unos días, en el grupo Google-Developer-Day-Madrid, vi un mensaje de Jorge Álvaro, del Lamboratory en el que nos presentaba su nuevo Gadget, el Gadget para Comunicación Multiusuario, un Gadget que permite la comunicación entre Gadgets de distintos usuarios. Además han desarrollado como ejemplo un Gadget para jugar a las 3 en raya.

















La idea de definir un método de comunicación entre Gadgets me pareció muy interesante. La comunicación entre Gadgets de distintos usuarios puede tener múltiples usos, desde juegos online a aplicaciones colaborativas pasando por la típica aplicación de chat. Pero, a la vez no es un problema sencillo, son varios los retos que se presentan: ¿Cómo se define el protocolo de los mensajes? ¿Cómo soluciono la sincronización entre mensajes? ¿Cómo identifico a los usuarios/Gadgets? ¿Cómo gestiono el estado (conectado/desconectado/desconocido) de un usuario/Gadget?.

Las soluciones que propone Jorge incluyen comunicaciones centralizadas en el Gadget para Comunicación Multiusuario, cuyas funcionalidades son compartidas por todos los Gadgets de la página, mensajes de texto a definir por el Gadget "cliente", identificación de usuarios/Gadgets basada en números generados aleatoriamente o una sincronización por turnos. Todas ellas soluciones sencillas y que funcionan pero que también tienen sus inconvenientes como apunt Raúl Ochoa en su mensaje.

Os animo a que incluyáis su pestaña, a que estudiéis el funcionamiento de esta solución y a que, finalmente, hagáis vuestras sugerencias de mejora. ¿Alguien se anima a hacer un planteamiento teórico del problema de comunicación entre Gadgets?



Todo el equipo de este blog quiere desearos una Feliz Navidad. Durante estas fiestas seguiremos publicando, pero con algo menos de frecuencia. Aunque suelen ser días repletos de celebraciones, si por cualquier razón os aburrís, hemos elaborado una lista de cosas que podéis hacer con algunas de las iniciativas de este año ...


Todo el equipo de este blog quiere desearos una Feliz Navidad. Durante estas fiestas seguiremos publicando, pero con algo menos de frecuencia. Aunque suelen ser días repletos de celebraciones, si por cualquier razón os aburrís, hemos elaborado una lista de cosas que podéis hacer con algunas de las iniciativas de este año:
  • Si todavía os falta algún regalo, podéis coger una cámara y regalar un vídeo en YouTube.
  • Probar a convertir en un mapplet vuestro mashup de Google Maps y enviarlo al directorio.
  • Compartir con el mundo vuestros KMLs a través de la galería de Google Earth.
  • Repasar alguna presentación del Google Developer Day o ver alguna de las que tuvieron lugar en cualquiera de las 10 ciudades del mundo en las que se celebró. Pueds hacerlo en el canal de YouTube (por cierto, el vídeo de portada del canal es el del GDD Madrid).
  • Jugar con el API de gráficos, el producto para desarrolladores lanzado más recientemente.
  • Y para los más atrevidos, podéis hacer pruebas con Android, no hay que olvidar que Google repartirá hasta 10 millones de dólares en premios a las mejores aplicaciones para móviles.
Muchísimas gracias por todos los comentarios que nos habéis enviado desde que estrenamos Programa con Google y, una vez más, ¡Feliz Navidad de parte de todo el equipo!





La velocidad de carga de las páginas web viene determinada por muchos factores, pero los más importantes son la combinación de la latencia y el número de recursos a descargar, y por otro lado el ancho de banda y el tamaño de estos recursos. Como programadores, lo único que podemos hacer para disminuir la latencia entre nuestros servidores y nuestros usuarios es colocar los servidores lo más cerca posible de nuestros usuarios, o distribuirlos por todo el planeta si nuestra página web no tiene un uso mayoritario en un solo país. Pero estas soluciones suelen ser muy caras y no están al alcance de todo el mundo.


En la práctica, la latencia y el ancho de banda del usuario lo tendremos que tomar como elementos incontrolables. Como el ancho de banda ha ido creciendo exponencialmente desde hace unos años, este elemento ya no tiene la importancia tan crítica que tenía hace tan solo unos años, y el tiempo de espera debido a la latencia y el número de recursos a descargar ha cobrado más importancia. Veamos pues, en detalle, el proceso de descarga de una página web, y por qué afecta tanto la latencia al tiempo total de descarga.


Cuando el navegador tiene que mostrar una página web nueva, digamos http://www.ejemplo.com/, primero tiene que convertir el nombre del dominio a una dirección IP con la que poder conectar, asi que contacta con los DNS de nuestro ISP para conseguir esta dirección IP. Con la dirección IP en su mano, intenta establecer una conexión TCP con ese servidor, siguiendo el proceso conocido como “three-way handshake”. El navegador envía un paquete SYN y espera pacientemente la respuesta del servidor, que será un paquete SYN + ACK. Cuando el navegador reciba el paquete respuesta del servidor ya puede mandar un paquete ACK de respuesta e inmediatamente lanzar una petición HTTP GET del recurso que nos interesa (en nuestro ejemplo, “/”), a lo que el servidor responderá, por ejemplo, mandando el contenido del fichero “index.html”.


Si el tiempo que tarda un paquete en llegar de nuestro navegador al servidor es de 100 ms, necesitaremos 400 ms debido a la latencia antes de que el navegador consiga el primer byte de contenido real, y ya podemos tener una flamante conexión a 20 Mb/s que no reducirá nada este tiempo de espera. A partir de aquí, y hasta que el navegador termina de recibir “index.html” pasará un tiempo dominado por el tamaño de este fichero y el ancho de banda de que dispongamos. Si “index.html” pesa 100 KB y tenemos una conexión de 4 Mb/s tardará unos (100 * 8) Kb / (4 * 1024) Kb/s * 1.2 = 235 ms. El factor “mágico” de 1.2 tiene cuenta de la sobrecarga típica de datos a enviar debido a la encapsulación de estos datos en paquetes.


Una vez con el contenido del HTML, el navegador procede a interpretarlo y, típicamente, encontrará dentro del HTML referencias a otros recursos, como hojas de estilo CSS, Javascript, imágenes, etc. Para cada uno de estos recursos extra se repite todo el proceso anterior, asi pues si hacemos referencia a 10 recursos, un número muy conservador hoy en día, perderíamos 10 * 400 ms = 4 s extra debido a la latencia.


Afortunadamente el navegador paraleliza estas peticiones, pero para no sobrecargar al servidor no hace más de dos peticiones a la vez al mismo dominio. Mención especial merecen los ficheros Javascript, que no se descargan en paralelo. Si en nuestro HTML no usamos ningún fichero Javascript, los 10 recursos añadirán entonces 10 * 400 ms / 2 = 2 s extra.


¿Cómo podemos “engañar” al navegador para que descargue más ficheros en paralelo de nuestro servidor? Hay un truco muy sencillo, que es crear varios subdominios que apunten al mismo servidor, y dividir el enlace en el HTML a nuestros recursos entre estos subdominios. El navegador empieza a descargar en paralelo un máximo de 2 recursos por subdominio, sobre un máximo de 4 dominios simultáneamente. Haciendo esto el tiempo perdido estableciendo las conexiones TCP y empezando a descargar los recursos será de 0.8 s (400 ms para establecer las primeras 8 conexiones + 400 ms para las 2 últimas conexiones).


Hay una forma aún más sencilla de reducir este tiempo de espera. Si el servidor no cierra la conexión TCP con el cliente en cada petición HTTP, usando KeepAlives, dividimos por dos el efecto de la latencia en cada recurso que se descargue en una conexión ya abierta. El efecto de KeepAlives depende del número de subdominios que tengamos, si lo servimos todo desde el mismo dominio, en lugar de los 4 s anteriores tardaremos 400 ms para establecer las 2 primeras conexiones en paralelo + 200 ms por cada uno de los otros 8 recursos a bajar / 2 (número de recursos que se descargan en paralelo) = 400 + 200 * 4 = 1.2 s. Sobre 4 subdominios tendremos una espera usando KeepAlives de 0.6 s, ya que los 2 últimos recursos se descargan sin necesidad de establecer otra vez la conexión TCP.


Hay que tener en cuenta que en algunos servidores web la activación de KeepAlives tiene un impacto sobre el rendimiento muy significativo. Os recomiendo utilizar un servidor web alternativo, como lighttpd, nginx o cherokee al menos para vuestro contenido estático, con KeepAlives activado.


Un cambio que puede tener un efecto significativo en el tiempo de descarga es concatenar todos los ficheros CSS a descargar en un solo fichero (o 2, uno general al sitio y otro particular a la página), concatenar los ficheros Javascript, e incluso concatenar las imágenes, seleccionando la subimagen a mostrar usando CSS Sprites. Así podremos reducir significativamente el número de recursos a descargar.


Otro de los factores que sorprendentemente puede influir en el tiempo de descarga es el tamaño de las peticiones que hace el navegador. Cuando el navegador le pide al servidor una página, le envía también información extra, como el nombre del navegador, el idioma preferido por el usuario, las cookies, etc. Muchos de estos datos (como las cookies) no suelen influir en el resultado devuelto por el servidor para los ficheros CSS, JS o imágenes, y si nuestras cookies son cross-subdomain podemos evitar que el navegador tenga que mandarlas si colocamos los ficheros estáticos en otro dominio. Yahoo! por ejemplo usa el dominio yimg.com para servir este tipo de ficheros. A pesar de que las cookies son relativamente pequeñas, hemos de recordar que típicamente los usuarios navegan con conexiones asimétricas, donde la velocidad de subida puede ser 50 veces inferior a la velocidad de bajada de datos.


Una vez aplicados estos cambios en nuestras páginas, podremos concentrarnos en la segunda parte de mayor influencia en la velocidad, el tamaño de los recursos a descargar, y las distintas formas en que podemos influenciar la caché del navegador para evitar tener que descargar todo cada vez que un usuario llegue a nuestra página. Pero esa es otra historia de la que hablaremos otro día.



Google Sketchup es conocido porque permite crear reproducciones en 3D que luego se pueden visualizar sobre Google Earth. Lo que pocos saben es que también tiene un API Ruby. Pero sí, así es. Es más, con esta API se pueden crear herramientas para aumentar la funcionalidad de Sketchup (por ejemplo, Sandbox Tools para crear y manipular grandes superficies en los modelos), automatizar tareas comunes, crear nuevas ventanas que te permitan, por ejemplo, interactuar con información propia y enlazar con librerías personalizadas (por ejemplo, drivers de dispositivos).



Google Sketchup es conocido porque permite crear reproducciones en 3D que luego se pueden visualizar sobre Google Earth. Lo que pocos saben es que también tiene un API Ruby. Pero sí, así es. Es más, con esta API se pueden crear herramientas para aumentar la funcionalidad de Sketchup (por ejemplo, Sandbox Tools para crear y manipular grandes superficies en los modelos), automatizar tareas comunes, crear nuevas ventanas que te permitan, por ejemplo, interactuar con información propia y enlazar con librerías personalizadas (por ejemplo, drivers de dispositivos).

Para los que ya sabíais esto, os preguntaréis ¿y cuál es la novedad? Pues la novedad es que ahora ya está toda la información centralizada en la página de Code (en inglés). Allí encontraréis la documentación de referencia, un blog dedicado a este tema, un grupo de Google para poder plantear y responder preguntas, una versión wiki (con moderador) de nuestra documentación y acceso al SDK (beta) que os permite crear plug-ins o acceder (en modo lectura / escritura) a los archivos de Sketchup. A modo de inspiración, también podréis encontrar un ejemplo de cómo añadir un menú para dibujar escaleras. Esperamos que ahora os resulte mucho más sencillo acceder a esta información y que probéis el API (y si desarrolláis algo, no olvidéis que nos lo podéis mandar a programacongoogle@google.com para comentarlo).



El pasado 5 de noviembre se anunció la creación de la Open Handset Alliance, una coalición de más de 30 empresas entre las que se encuentran operadoras como ...


El pasado 5 de noviembre se anunció la creación de la Open Handset Alliance, una coalición de más de 30 empresas entre las que se encuentran operadoras como T-Mobile o Telefónica y fabricantes como HTC, LG, Motorola o Samsung, con el compromiso de crear un teléfono móvil mejor.

Conjuntamente se anunciaba Android, una plataforma software completa, abierta y libre para dispositivos móviles basada en el Kernel de Linux y con un entorno de ejecución basado en una máquina virtual Java adaptada a estos dispositivos.

A partir del 12 de noviembre ya se ha podido descargar una primera versión del SDK de Android, que incluye un simulador donde probar tus desarrollos. Se estima que los primeros dispositivos con Android llegarán al mercado en la segunda mitad de 2008.

Para estimular la creación de aplicaciones está en marcha el Android Developer Challenge, con 10 millones de dólares en premios para las aplicaciones más originales y que mejor partido saquen de la información disponible en un dispositivo móvil, a la que Android permite un fácil acceso.

Para saber más, lo mejor es descargar el SDK y empezar a jugar con las aplicaciones de muestra, modificándolas y reutilizándolas para crear nuevas aplicaciones. Es recomendable instalar Eclipse con el plugin de Android, aunque no es imprescindible. Hay más información (en inglés) en la web de Android (Hello, Android!, Tutorial, Blog, Videos).





Una nueva iniciativa de Google pretende introducir a los estudiantes pre-universitarios en el desarrollo de software open source: el Google Highly Open Participation Contest. Este concurso ofrece la oportunidad de colaborar creando código, escribiendo documentación, testeando, mejorando la localización, etc. de diez proyectos open source que participan en esta iniciativa. Los concursantes podrán ganar premios en metálico, un viaje al Googleplex y también habrá camisetas y un certificado de participación para todos los que completen al menos una tarea.


Hasta ahora hemos desarrollado el Google Summer of Code junto con la comunidad de software open source durante tres años y los resultados han sido muy buenos: cientos de estudiantes universitarios han participado y miles de personas de todo el mundo han desarrollado juntos software open source, produciendo millones de líneas de código.


Estamos muy orgullosos del éxito del Google Summer of Code y de lo mucho que ha ayudado a la comunidad y por eso hemos estado pensando en nuevas formas de colaborar con proyectos open source y encontrar nuevos colaboradores.


La idea de este concurso es que todo el que lo desee pueda participar. Cualquier persona interesada puede sugerir tareas que serán incluidas en el concurso, cada uno de los proyectos participantes ha creado una guía sobre cómo colaborar sugiriendo tareas para el concurso.


Si quieres saber más sobre esta iniciativa, consulta las FAQs, o participar en la lista de correo del concurso. Personalmente, me encantaría ver estudiantes españoles participando en el concurso, espero que muchos se animen.





Hasta que tengamos más aplicaciones candidatas, q uiero estrenarme en el blog comentando un mashup creado por un estudiante de Oviedo por aquello de que la tierra tira. Fisgonia es un portal que permite visualizar camaras web clasificadas por categoría y geolocalizadas sobre los mapas de Google.





Hasta que tengamos más aplicaciones candidatas, quiero estrenarme en el blog comentando un mashup creado por un estudiante de Oviedo por aquello de que la tierra tira. Fisgonia es un portal que permite visualizar camaras web clasificadas por categoría y geolocalizadas sobre los mapas de Google.

El corazón del portal es un sencillo programa escrito en JavaScript que usa el API de Google Maps para determinar qué webcams deben pintarse en el mapa que se está visualizando o para detectar los eventos de movimientos del mapa para refrescar sus contenidos. El portal dispone además de una opción que permite añadir webcams a sus visitantes/colaboradores con una ayuda que facilita mucho su geolocalización. Complementan el portal un feed RSS para acceder a todas las cámaras y otro para las novedades, así como un archivo KML para visualizar las cámaras en Google Earth.


Con aproximadamente 400 cámaras web registradas (la mayoría en EEUU), este portal es un claro ejemplo de cómo se pueden crear aplicaciones que combinan los conceptos de la web 2.0 con la potencia de productos como Google Maps, aprovechando la sencillez de las APIs de Google, en este caso, la de Google Maps.


Ya sabéis, si os apetece recorrer el mundo a golpe de webcams podeis pasaros por Fisgonia y asistir en tiempo real al tratamiento veterinario de una vaca en una granja de Utrecht, admirar las pirámides de Egipto o añorar la Playa de San Lorenzo en Gijón (¿he mencionado que la tierra me tira?). También, si habéis desarrollado una aplicación usando cualquiera de las APIs de Google y queréis que la comentemos en esta sección, no dudéis en escribirnos a programacongoogle@google.com.



Hoy lanzamos una nueva herramienta que permite generar gráficos y diagramas de forma dinámica y sencilla, e insertarlos en páginas web. Por ejemplo, la siguiente URL genera la imagen que aparece más abajo.


Hoy lanzamos una nueva herramienta que permite generar gráficos y diagramas de forma dinámica y sencilla, e insertarlos en páginas web. Por ejemplo, la siguiente URL genera la imagen que aparece más abajo.

http://chart.apis.google.com/chart?cht=p3&chd=s:hW&chs=250x100&chl=Hello|World



Y ya está. Sin estado, sin llamadas, sólo tienes que enviar los datos como parámetros en una petición http y obtendrás de vuelta un gráfico en formato png. Inserta la petición como parámetro src en un tag img y listo. Actualmente, el API soporta gráficos de líneas, histogramas, diagramas de sectores, diagramas de puntos y sparklines.

En un principio, esta herramienta se construyó para uso interno. La utilizamos, por ejemplo, en Google Video y Google Finance. Pero nos pareció buena idea ponerla a disposición de otros usuarios. Tenéis toda la información (en inglés) en la página del API, y también hay un grupo de asistencia para atender vuestras consultas.

El API de gráficos de Google comenzó como un proyecto del 20% en Zurich, y estamos encantados de poder lanzarla hoy para todo el mundo. ¡Animáos a utilizarla! Tenéis el post original aquí.







¡Bienvenidos al primer blog oficial de Google para desarrolladores en español! A partir de ahora vamos a intentar manteneros informados de las últimas novedades que Google pone a vuestra disposición para facilitaros la creación de aplicaciones, así como de eventos y otras noticias que os puedan interesar.


¡Bienvenidos al primer blog oficial de Google para desarrolladores en español! A partir de ahora vamos a intentar manteneros informados de las últimas novedades que Google pone a vuestra disposición para facilitaros la creación de aplicaciones, así como de eventos y otras noticias que os puedan interesar.

También queremos explorar de vuestra mano el panorama de las aplicaciones creadas en español con las herramientas de Google, y presentaros algunas a través del blog. Así que ya sabéis: si acabáis de desarrollar cualquier aplicación con productos de Google de la que estéis especialmente orgullosos, y os apetece compartirla con nosotros y con todos los demás desarrolladores, no tenéis más que enviárnosla a programacongoogle@google.com. Intentaremos destacar una por semana, y a todos los colaboradores que aparezcan en el blog, les enviaremos una fantástica camiseta, de esas que nunca pasan de moda, como muestra de agradecimiento... ;-)

Si tenéis alguna pregunta técnica sobre la que queráis respuesta, también podéis enviárnosla a la misma dirección. Los colaboradores del blog irán publicando posts sobre temas variados, con consejos técnicos, y respondiendo a vuestras dudas. No podremos responder a todas, pero intentaremos cubrir las más recurrentes.

Esperamos que os resulte útil e interesante, y que nos mandéis vuestros comentarios y vuestras sugerencias.