jueves, 30 de septiembre de 2010

Nuevos productos de Google

Si eres de los que te gusta Google y los servicio que tiene, seguro que te resulta complicado estar al día de todas las novedades que se producen. Para hacerlo tenemos la opción de suscribirnos a todos los blogs que encontremos en Internet o, acceder a una pagina que ha creado Google donde podremos ver las novedades de todos los servicios a medida que van saliendo. Aquí os dejo el enlace a New Products de Google y el vídeo promocional que tienen en su página sobre el servicio Instant.



Página Oficial: Haz click aquí
Google Instant: Haz click aquí

martes, 28 de septiembre de 2010

Tablas dinámicas en los Spreadsheets de Google

Uno de los principales motivos por los que decidí empezar a usar las hojas de cálculo de Google es por la ventaja de tener disponible siempre mis documentos sin tener que ir cargando con ellos a cuesta y poder usarlos desde cualquier soporte y sistema operativo. Pero pasar de usar Excel a usar las hojas de calculo de Google no ha sido una tarea fácil debido a que la funcionalidad que ofrece esta limitada, de momento, por el soporte sobre el que se ejecuta: El navegador Web. Pero esta limitación es temporal debido a que los navegadores están evolucionando rápidamente y dentro de poco tiempo no distinguiremos entre aplicaciones de escritorio y aplicaciones web.

Pero lo cierto es que hoy por hoy, intentar hacer las mismas cosas que hacemos con Excel en las hojas de calculo de Google requieren un poco más de esfuerzo. Una de esas cosas que yo usaba con frecuencia eran las tablas dinámicas. Siempre me ha parecido un sistema ideal para analizar información agrupándola por conceptos y es lo primero que he echado en falta en el sistema de Google. Después de investigar un poco he encontrado una solución que solventa esta carencia y que pasaré a explicar.

Lo primero es preparar un conjunto de datos sobre los que trabajar. Yo he preparado una serie de datos simulando una facturación de clientes. En la lista aparece la fecha de emisión de la factura, el nombre del cliente, y el importe facturado. El mes se ha calculado usando la formula month que extrae el mes de una fecha. El resultado es el que podéis ver en el cuadro de la derecha.

Ahora lo que queremos hacer es analizar la evolución de cada cliente por meses. Aquí es donde entra en juego la función que nos permitirá resolver el problema. La función a usar es query. Esta función nos permite realizar consultas sobre un conjunto de datos. La sintaxis es muy sencilla. query(rando de datos;consulta a ejecutar).  La sintaxis a utilizar en la consulta es similar a la utilizado en SQL con algunas limitaciones y peculiaridades.

Vamos con un ejemplo: Queremos agrupar la facturación de cada cliente para tener un total por año. La sintaxis para la consulta seria SELECT B, SUM(C) GROUP BY B. Aunque es bastante evidente la expresión indica que seleccionemos la columna B, sume la C agrupando los valores del campo B. En mi caso, el texto completo de la fórmula es el siguiente:

=QUERY(A3:D23;"SELECT B, SUM(C) GROUP BY B").

"Nota: Es importante que el nombre esté en mayúsculas."

Pero esto solo soluciona la mitad del problema porque no hemos conseguido agruparlo por mes. Nuestra primera intención podría ser incluirlo en la consulta como SELECT B, D, SUM(C) GROUP BY B, C y, aunque sintacticamente es correcto, el resultado no lo es del todo porque, efectivamente lo ha agrupado pero de forma secuencial y nosotros queremos transponer los meses para poder compararlos.
Aquí es donde debemos incluir la instruccion PIVOT que nos permitirá transponer los valores que queramos. La formula finalmente quedará como

=QUERY(A2:D23;"SELECT B,SUM(C) GROUP BY B PIVOT D").

El resultado es bastante buenos si le aplicamos formato a las celdas y conseguimos darle un aspecto más formal marcando los bordes para delimitar los datos. Para finalizar podremos generar un gráfico sobre los datos calculados de la formula anterior. A diferencia a las tablas dinámicas de Excel, no podemos seleccionar los datos para filtrar el contenido dinámicamente, pero podríamos generar un listado y filtrar los datos con unas lista desplegable. Para poder incluir condiciones deberemos usar la cláusula WHERE dentro de la consulta.

Para finalizar os dejo unos enlaces con el ejemplo completo para que podáis consultarlo y a la documentación ampliada. En el ejemplo encontrareis una hoja con el ejemplo básico y otro un poco más elaborado simulando una tabla dinámica con una lista desplegable. Como la hoja no es editable para poder usar la lista tendréis que crearos una copia del documento para poder verlo funcionar completamente.

Ejemplo: link
Documentación funciones: link
Documentación función Query: link

lunes, 27 de septiembre de 2010

Cita

"Hay tres clases de mentiras: La mentira, la maldita mentira y las estadísticas."
Mark Twain 

lunes, 20 de septiembre de 2010

Citas

"Sólo una cosa es más dolorosa que aprender de la experiencia, y es, no aprender de la experiencia."
Laurence Johnston Peter 

jueves, 16 de septiembre de 2010

Multiplicar cuentas de GMail

Todos conocemos de sobra el servicio de email ofrecido por Google en su plataforma Gmail, pero pocos conocen ciertas peculiaridades de este servicio que pueden ser muy útiles.

El primero es bastante conocido entre la gente que tiene cuentas desde hace tiempo. Es la posibilidad de usar alias en nuestra dirección de correo. Esto nos permite poner un sufijo a nuestra dirección habitual de email concatenándolo con un signo +. Por ejemplo, si nuestra dirección de email habitual es micorreo@gmail.com, podemos usar micorreo+foro@gmail.com. Si mandamos un correo a cada dirección, en ambos casos nos entrara en nuestro buzón habitual micorreo@gmail.com. ¿Y que utilidad tiene esto? Aunque a priori parezca un poco trivial, lo cierto es que nos permite filtrar el correo entrante de una manera más exacta. Podemos usar los alias, por ejemplo, al registrarnos en foros concatenando el nombre del foro después del nombre del buzón y luego utilizar alguna regla para clasificar ese correo. Así conseguiremos que la publicidad proveniente de otros sitios se nos cuele entre nuestro correo habitual.


Una variación del método anterior es usando puntos. El sistema los ignora, por lo que podemos usar mi.correo@gmail.com, micorr.eo@gmail.com y todos los correos nos entrarán en el buzón habitual micorreo@gmail.com.

El segundo, y menos conocido, es el de que los usuarios de cuentas de gmail también pueden usar un dominio alternativo que es googlemail. Este dominio recibe el correo en el mismo buzón que nuestra cuenta habitual en gmail. Es decir, podríamos dar nuestra dirección como micorreo@gmail.com o micorreo@googlemail.com. El motivo de la existencia de este segundo dominio es porque en algunos países como Reino Unido y Alemania han existido problemas de marca con el nombre gmail. Por lo tanto, en esos países, se han registrado las cuentas con el dominio googlemail. La ventaja de usar un segundo dominio es que a todos los efectos es como tener dos direcciones de email distintas y podemos aplicar una estrategia parecida al caso anterior. Es decir, podemos usar micorreo@gmail.com para amigos y conocidos y micorreo@googlemail.com para las ofertas de trabajo, por ejemplo.


La ventaja de usar estos métodos es clara, ya que, sin tener que abrir varias cuentas de correo, podemos disponer de tantas direcciones de email como necesitemos y gestionarlas desde un único buzón.

Complete Google Synchronizer

Después de mucho tiempo alejado de la programación en .Net he decidido realizar un pequeño proyecto personal, a modo de ejercicio, para no dejar en el olvido mis pocos conocimientos en esa materia. Para ello decidí buscar algo relacionado con la tecnología de Google que estoy trabajando actualmente (y su extensísima API de Google). 

Me surgió la idea de realizar un sistema de sincronización de la cuenta de Google con los datos de Outlook. Mi sorpresa fue que encontré varios programas que sincronizaban contactos, algunos que sincronizaban el calendario (como el de Google Calendar Sync) , pero ninguno gratuito que hiciese ambas cosas. Finalmente decidí abordar este proyecto y surge Complete Google Synchronizer.

Quiero aprovechar el desarrollo de la aplicación para ir comentando un poco el planteamiento del mismo, el modelo de datos usado y trabajar un poco la api de google para acceso a datos. Aunque en esta ocasión se quedará de momento como una pequeña presentación de la aplicación.

Tanto el código fuente del proyecto, como una versión ejecutable de la aplicación se encuentran disponibles de forma libre bajo licencia GPL v3, en la siguiente dirección: http://code.google.com/p/completegooglesync/
Soy consciente que la aplicación está en un estado muy primario y que faltan muchas cosas por completar, pero se irán resolviendo con el tiempo y, por eso mismo, ha de usarse todavía con cierta prudencia.

La aplicación, en su estado actual, solo sincroniza contactos con Outlook 2003. En versiones sucesivas se irán incluyendo las cosas que faltan para que verdaderamente sea "Complete":
  • Sincronización de fotos de los contactos
  • Sincronización de calendario
  • Sincronización de tareas
Como he dicho anteriormente, el código es libre, por lo que si alguien lo quiere, ahí lo tiene, y si además quiere participar será bienvenido. Para ejecutar la aplicación será necesario tener instalado el  NET Framework 2.0. El código está escrito en C# con vs2005.

lunes, 13 de septiembre de 2010

Cita

"Si quieres resultados distintos, no hagas siempre lo mismo."
Albert Einstein

martes, 7 de septiembre de 2010

Reuniones eficientes

En cuanto recibimos un Email convocándonos a una reunión, casi todo el mundo resopla. En ese momento nos invade una sensación de astío y es por el hecho de que las reuniones normalmente se asocian con una forma de perder el tiempo. Y lo peor, es que por regla general suele ser así. 

Para evitar esto, existen pautas muy claras que se deben usar para conseguir que el tiempo empleado en reunirnos sea completamente útil. Estas pautas son aplicables a cualquier tipo de reunión, incluso a las que a priori no damos importancia porque se vayan a tratar temas menores o no relevantes.

Antes de comenzar conviene valorar la necesidad de la reunión. Hay que pensar que todos los que asistirán a la reunión van a reservarse un tiempo de su jornada y es necesario que su participación este justificada y que puedan hacerlo con garantías suficientes para que no sea una perdida de tiempo. También hay que considerar que cada empleado tiene un coste, y que sentar a 5 personas en una reunión para discutir un tema y salir de la sala sin una solución al mismo puede suponer un gasto considerable.
  • Coordinador: Toda reunión tiene que tener un coordinador. Su misión será la de asegurarse que se sigue el plan previsto en la agenda y, si es necesario, asignando los tiempos de palabra a cada uno. No interesa que se formen corrillos y surjan dos o tres temas de conversación a la vez. Generan un murmullo de fondo y distraen la atención, a parte de ser una falta de educación a los compañeros.
  • Convocar la reunión con suficiente antelación: Aquí se impone el sentido común. No existe un tiempo establecido para convocar reuniones. No hay nada que siente peor, que enterarte en un pasillo que te tienes que meter en un despacho para reunirte con tres personas más. La antelación facilitará que los asistentes preparen el tema de la reunión y acudan con argumentos suficientes. Aunque la reunión sea muy urgente tendrá que existir algo de margen entre la convocatoria y la reunión, 15 minutos pueden decantar la balanza entre un tiempo productivo y un tiempo perdido.
  • Agenda: Ni que decir tiene que todos los asistentes tienen que conocer al dedillo los temas a tratar. No vale con rellenar solo el asunto de la convocatoria. Deberemos esmerarnos en incluir todos los detalles posibles de la reunión en la agenda de los temas a tratar. Aunque solo exista un tema, el contenido a tratar es fundamental.
  • Estimación del tiempo: Es muy importante, antes de convocar la reunión, calcular el tiempo que nos llevará tratar cada tema. Este calculo debería incluir el tiempo adicional de debate si el tema lo requiriese. Aunque este punto parece obvio, no siempre se le asigna el tiempo adecuado a las reuniones y se intenta encajar en una reunión de una hora, temas que por su propia envergadura requerirían dos. No hay nada que de más rabia que terminar una reunión y que no haya dado tiempo a tratar todos los temas. Por eso es fundamental hacer una previsión realista del tiempo del contenido completo de la reunión.
  • Preparar el contenido por escrito: Para poder proyectar con coherencia y efectividad una idea, la preparación por escrito es nuestra mejor herramienta. El hecho de preparar el tema por escrito nos ayudará a racionalizar nuestras ideas y ordenarlas. Además nos servirá como esquema/plantilla para poder ir recorriendo la argumentación sin dejarnos ningún punto.
  • Mentalidad abierta: A la hora de ir a una reunión a discutir un tema hay que presentarse con una mentalidad abierta, dispuesto a escuchar los comentarios de los compañeros de la reunión. Si se está discutiendo como arreglar un problema, no ayudamos si nos cerramos en banda intentando defender nuestra propuesta a capa y espada. Solo con una mentalidad abierta surgirán las mejores ideas.
  • Puntualidad: La puntualidad en una reunión es fundamental. Habrá que evitar convocar las reuniones a primera hora de la mañana, o justo después de comer, ya que es complicado que todo el mundo esté disponible en ese momento. Creo que un margen razonable sería una hora después de esas. Es decir, que si la jornada laboral empieza a las 9, convocar la reunión a las 10. Así daremos tiempo a que la gente pueda gestionar los temas urgentes y llegar a la reunión con toda su atención puesta en los temas a tratar. A la hora de la reunión yo soy partidario de no demorar el comienzo de la misma más de 10 minutos. Creo que es tiempo de cortesía suficiente para esperar a la gente. Durante este tiempo la puerta de la sala permanecerá abierta, y tras cumplir el plazo de cortesía que estimemos oportuno, cerraremos la puerta y quien no haya llegado para entonces se quedará fuera. Es importante este punto, ya que hay gente que llega tarde de forma recurrente a las reuniones, faltando al respeto de los compañeros que le están esperando. Con esta técnica conseguiremos aumentar la puntualidad de los asistentes. Igual de importante que es empezar a la hora indicada, la reunión no debe extenderse de la hora de finalización. Los asistentes se habrán planificado el día teniendo en cuenta la duración de la reunión y perjudicaría directamente su productividad cualquier variación del horario. De hecho, lo ideal es intentar acabar las reuniones 15 minutos antes de lo programado inicialmente. Favorecerá tener la sensación de haber acabado antes de lo previsto y nos dará a todos un tiempo adicional antes de retomar los temas pendientes. Para ello, podemos incluir esos minutos de más en la programación de la reunión para poder tener también algo de margen de cara a posibles variaciones en la programación.
  • Timming: Si hemos hecho bien los deberes a la hora de valorar el tiempo necesario para tratar cada tema es preciso ceñirnos a ello. Así conseguiremos tratar todos los temas de la reunión sin dejarnos ninguno. Si algún tema por su propia complejidad requiriese dedicarle más tiempo, se consumirá el tiempo previsto para tratarlo y se convocará otra reunión para tratar el tema con más profundidad, pero nunca debemos dejar que un tema ocupe todo el tiempo de la reunión. 
  • Acta de la reunión: Es preciso redactar un acta después cada reunión donde se especifiquen detalladamente las intervenciones de cada participante, con los comentarios realizados y, lo más importante, un resumen con los acuerdos alcanzados y los objetivos para la próxima reunión (si la hubiese), incluyendo los responsables correspondientes en cada caso.
Teniendo en cuenta estos factores conseguiremos reuniones más eficientes reduciendo el tiempo y el coste de las mismas. Para tener una estimación del coste que puede tener una reunión, les dejo este enlace a MeetOrDie donde podemos tener una "estimación" (de forma poco real aunque bastante divertida) del coste de nuestras reuniones.

lunes, 6 de septiembre de 2010

Cita

"Recuerda que eres tan bueno como lo mejor que hayas hecho en tu vida."
Billy Wilder 

miércoles, 1 de septiembre de 2010

Desafío Google Chrome

Hoy, 1 de Septiembre, Google abre el plazo de presentación para su concurso Desafío Google Chrome. Para participar en el concurso tendremos que presentar nuestras extensiones para el navegador Google Chrome antes del próximo 15 de Octubre.


Las Extensiones de Google Chrome permiten añadir nuevas funcionalidades al navegador pudiendo personalizarlo con las funciones que queramos y manteniéndolo libre de elementos que no utilizas. Estas funcionalidades se pueden aplicar sobre la página, el navegador directamente o sobre el mismo contenido de la página.

Los requisitos para poder participar son los siguientes:
  • El equipo debe ser como máximo de 2 personas.
  • El plazo para enviar las extensiones estará abierto del 1 de Septiembre al 15 de Octubre.
  • Para participar debes publicar tu extensión en la Galería Google Chrome y rellenar nuestro Formulario de Participación.
  • El idioma utilizado para la extensión deberá ser Castellano.
  • La extensión no puede replicar una ya existente en la galería oficial de Google Chrome independientemente del idioma.
  • Las extensiones serán juzgadas por su creatividad, y por su implementación técnica.
  • Los participantes no podrán presentarse en representación de una empresa.
  • No podrán presentarse extesiones que pertenezcan a la categoría Override o Themes.
  • La extensión no puede incluir obras de terceros protegidas por derechos de autor.
El ganador se llevará un móvil Nexus One y su extensión será publicada en el Top Picks de la galería de extensiones de Chrome, lo que es una gran oportunidad para dar a conocer nuestros trabajos como programador.

Para aprender un poco más sobre el desarrollo de extensiones, Google ha organizado el día 9 de Septiembre un workshop en sus oficinas de la Torre Picasso de Madrid.

Para más información visitar la página creada para la ocasión en: http://sitescontent.google.com/desafio-chrome/

Fuente: Blog "Programa con Google"