Google Open Pizza Night

Recientemente he sido invitado al Google Open Pizza Night. Un evento que se desarrollará en las oficinas de Google en Madrid (Torre Picasso Planta 26) el 27 de Marzo desde las 17:30. Dejo una mini FAQ que venía adjunta a la invitación:

* ¿Qué es el Open Pizza Night?
Es un evento bastante informal en el que programadores que conocen o trabajan con nuestras APIs y programadores de Google se juntan para comentar proyectos, ideas, sugerencias, etc. Es como lo que sucede en los intermedios de una conferencia, entre sesión y sesión, pero sin las sesiones.

* ¿Quién puede participar?
Cualquier programador que quiera conocer las APIs de Google o ya haya trabajado con ellas, que quiera pasar un rato con otros programadores en las oficinas de Google y no tenga nada mejor que hacer esa noche.

* ¿Qué más habrá en el Open Pizza Night?
Otras personas interesantes con las que programar. Alguna minipresentación. Un lugar donde pasar un buen rato. Wifi. Mucha pizza.

* ¿Y qué pasará?
A las 17:30 empezarán a llegar los participantes. Después de tomar algo juntos y conocernos, empezará la actividad. Os presentaremos el tema de la noche, y después empezará el código. Para recuperar fuerzas tomaremos unas pizzas, y después, si queréis presentar alguna aplicación relevante al tema, podéis comentárnoslo en vuestro email de confirmación, y os apuntamos en la lista. Seguro que alguno se anima.

* ¿Qué tengo que llevar?
La verdad, lo único que tienes que hacer es venir tú mismo. Y si tienes un ordenador para programar, también tráetelo.

* ¿Por qué es por la tarde / noche?
Lo hemos puesto tarde para que pueda venir mucha gente que, de otra forma, por estudios o trabajo, no podría participar.

La verdad es que puede ser una experiencia muy interesante. Desde que hice Hora y Lugar, me han atraido las APIs de Google. Estúve presente en el Google Developer Day 2007. Comencé con Android, pero no lo veía muy fino. Ahora con las APIs de Youtube tengo que pensar que podría hacer. En todo caso los servicios de google son una fuente de recursos muy útiles para el programador que desea hacer un proyecto web 2.0. A ver como se presenta el día, intentaré tomar fotos.

Enviar net send anónimos

En windows podemos enviar mensajes a otros usuarios a través de la red de un dominio con el comando net send, siempre y cuando tengamos iniciado el servicio Mensajero de windows. Desde linux con smbclient -M también podemos hacer lo mismo.

Sin embargo siempre se enviará como remitente el equipo desde donde se envió el mensaje. Si queremos mandar un mensaje con un remitente distinto debemos recurrir al envío del mismo a través de la tubería \MAILSLOT\MESSNGR que tiene abierta windows si el servicio que comentaba antes está iniciado. Aquí muestro los pasos a seguir usando win32.

Primero se debe abrir esa tubería mediante un CreateFile poniendo como ruta lo siguiente \\<nombre de equipo>\\MAILSLOT\MESSNGR.

Después debemos escribir a esa tubería con WriteFile la siguiente cadena <origen>\0<destino>\0<mensaje>\0

Finalmente cerramos la tubería con CloseHandle.

Para ilustrar el funcionamiento, podeis bajaros el código fuente de un programa aquí.

Si quereis usarlo ya compilado, podeis bajaros el ejecutable aquí.

gateway email2qrcode

Antes de nada, ¿que es el qrcode?, la wikipedia lo define como:

Un código QR es un sistema para almacenar información en una matriz de puntos o un código de barras bidimensional creado por la compañía japonesa Denso-Wave en 1994; se caracterizan por los tres cuadrados que encontramos en las esquinas y que permiten detectar al lector la posición del código. La sigla «QR» se derivó de la frase inglesa «Quick Response» pues el creador aspiraba a que el código permitiera que su contenido se leyera a alta velocidad. Los códigos QR son muy comunes en Japón y de hecho son el código bidimensional más popular en ese país.

Todos conocemos los códigos de barras que estan ya presentes en cualquier producto que adquiramos. Como la información que puede contener un código de barras es limitada (solo unos pocos carácteres), se buscaron formas de incluir muchos más datos en aproximadamente el mismo espacio, de ahí que aparecieran los nuevos códigos 3D (en contraposición a los de barras, llamados 2D), los cuales codifican la información en una cuadricula punteada, pudiendo almacenar hasta kilobytes de información.

Existen varios estándares:

PDF 417 Lo podeis generar aquí.

Datamatrix lo podeis generar aquí.

MaxiCode lo podeis generar aquí.

QRCode lo podeis generar aquí.

La ventaja de QRCode es que esta muy extendido, ya que es un estandard ISO (18004) que todo el mundo puede usar libremente y existen librerias comerciales y gratuitas tanto para generarlo como para decodificarlo. Para móviles, uno de los mejores lectores gratuitos que hay hecho en java es el kaywa reader.

Imagen qrcode

En este artículo explico como hice un gateway que decodifica los qrcodes que se hayan enviado por correo electrónico, respondiendo al remitente con el texto que contenian las imágenes.

El proceso es tan simple como:

Enviar las imágenes qrcode adjuntas a un correo electrónico y enviarlo a qrdecode@sistemasorp.es.

Posteriormente en el servidor, una tarea cron ejecuta cada minuto un script en perl.

Este script de perl comprueba el buzón de correo y si hay mensajes los procesa. Si detecta que hay imágenes ejecuta una librería java llamada Open Source QR Code Library (http://sourceforge.jp/projects/qrcode/) y toma su salida estandar para luego crear un correo y enviarselo al remitente con el texto de la/s imagen/es.

Si quereis descargaros el script de perl, lo podeis hacer aquí.

¿Cómo evitar el efecto slashdot (barrapunto, meneame, etc.)?

El efecto slahsdot es algo que puede tirar los servidores abajo. Su nombre proviene del proveedor de noticias slashdot.

Todo empieza cuando alguien escribe algo interesante en una web. Al principio sólo los lectores habituales lo conocerán y más tarde los motores de búsqueda lo indexarán, pero esto no provoca ninguna caida del servidor.

La verdadera caida es cuando literalmente miles o cientos de miles de personas acceden a esa página en un corto lapso de tiempo. Esto es provocado cuando un tercero publica un enlace a la página mencionada en un proveedor de noticias como slahsdot, barrapunto, meneame, etc. Entonces en las primeras horas que aperece publicado el enlace, ingentes cantidades de usuarios acceden a la página para poder ver en detalle lo que está publicado en esta.

Ya se trate de un servidor mal configurado, o de un servidor con pocos recursos, o de un servidor cuyo ancho de banda contratado sobrepasa el límite contratado, el caso es que antes o después puede dejar de dar servicio ante la avalancha de peticiones, provocando el malestar de los usuarios que en ese momento quieren acceder al contenido de la página.

Para ello se creó en 2004 un servicio gratuito llamado CoralCDN. Este servicio esta basado en una red distribuida p2p, en la cual se cachea el contenido de las páginas en multiples servidores de PlanetLab. Así si todo el mundo accede a la página a través de este servicio, tiene garantizado que podrá verla, ya que no accederá a la original, sino a la cacheada repartida entre varios servidores.

Cachear una página y acceder a esa caché es tan sencillo como añadir el sufijo nyud.net al dominio de la URL que queremos acceder. Así por ejemplo para acceder a este artículo a través de la versión cacheada, habría que acceder a través de https://www.sistemasorp.es.nyud.net/2008/02/03/¿como-evitar-el-efecto-slashdot-barrapunto-meneame-etc/.

No se trata de un proxy web, ya que no parsea la página modificando los enlaces para acceder a sus versiones cacheadas, sino que está orientado a cachear una página en concreto.

Para evitarse el trabajo de tener que añadir el sufijo al dominio de la url, existen diversas soluciones para automatizar el acceso. Desde los plugins oficiales de CoralCDN hasta extensiones firefox y otras soluciones explicadas aquí.

Año nuevo, vida nueva

Vuelvo a las andadas.

Casi un año después  de haber escrito mi último artículo en el blog El arte de programar, retomo la idéa original de exponer temas relacionados con la informática y proyectos en los que me involucro, añadiendo la posibilidad de escribir otros temas más genéricos.

Con este nuevo blog (aunque con la experiencia del anterior) me embarco de nuevo en la aventura de la escritura personal en internet, estrenando un flamante wordpress.

Como es de suponer, cuando alguien publica un blog es porque quiere que los demás lo lean, por lo que espero sinceramente que sea de vuestro agrado el contenido que iré añadiendo a este.

Intentaré poco a poco ir añadiendo los artículos del anterior blog para que todo este centrado en uno.

Wardriving con la fonera

La fonera es para mi un ordenador con muchas posibilidades. La verdad es que tenerlo solo para compartir la conexión de internet me parece subestimar todo su potencial. Entre las muchas cosas que pueden hacerse con ella (la imaginación es el único limite), una de ellas es hacer wardriving. Hasta ahora el wardriving se hacía con un portatil o una pda que tuviese wifi y gps (ambos en módulos separados o integrados en el hardware) pero eso ha cambiado…

Antes de empezar quiero comentar que todo esto es experimental, y que no me hago responsable de los daños que pudierais ocasionaros a vosotros mismos o a cualquier cosa implicada en el proceso.

Pues bien, la principal ventaja del sistema de wardriving que he estado desarrollando es que es mucho más barato que las soluciones anteriormente citadas, por lo que paso a detallar lo necesario para fabricarse un sistema de wardriving con la fonera (los enlaces son méramente orientativos, no me llevo ninguna comisión por ellos):

Como es lógico, es necesario una fonera, que cuesta unos 30 € en fon (o menos si lo compras en ebay o incluso si te la regalan).

Un módulo gps que funcione a 3,3 voltios, que cuesta alrededor de 40 €. Aunque si se tiene ya un gps de mano con conexión serie se puede hacer un circuito con un chip max3232 (que no 232).

Una antena wifi omnidireccional con imán y conector rp-sma ideal para ponerla en el techo del coche, por unos 17 €. Aunque se puede usar la antena que viene en la fonera (con lo que habrá menos cobertura).

Finalmente un adaptador de mechero para el coche de 5 voltios y 2 amperios por unos 12 €. En mi caso me compré un adaptador de mechero para la PSP que también reúne las características necesarias y que modifiqué ligeramente para poder enchufarlo a la fonera.

Para unir el GPS al puerto serie de la fonera me fabriqué un pequeño cable que va unido a un circuito, y este a su vez a la fonera través de un cable IDE.

Al final uniendo todos los componentes quedaría así:

Para hacer funcionar el invento necesitáis instalar en la fonera el firmware OpenWRT Kamikaze, en La Fonera Developers Forum podeis encontrar un artículo estupendo de como hacerlo. Si no lo hago con el firmware que trae por defecto FON es simplemente porque la fonera no arranca si no encuentra una conexión de red válida (y en el coche no tendremos red alguna) además de que usa el led de WLAN que nosotros aprovecharemos para otro tema.

Ahora por la parte software programé un demonio el cual se encarga de escanear las redes wifi al mismo tiempo que va tomando la posición GPS. El demonio se llama fonerawd y guarda los resultados del escaneo en el directorio /www/wifispots, creando un fichero con la mac de cada red detectada y guardando dentro de este el SSID de la red, el tipo de conexión, si está encriptada o no y su latitud y longitud (si no existe GPS pondrá error, si no tiene señal será 0); todos estos campos están separados por el carácter barra «|».

El puerto serie de la fonera lo programé gracias a este artículo que explica como hacerlo en modo canónico, que es ideal para recibir las lineas de datos del protocolo NMEA del GPS. El escaneo de redes lo hice basándome en este artículo que aunque no explica como hacerlo, el código fuente es suficientemente descriptivo.

Este software esta bajo licencia GPL y lo podéis descargar aquí:

https://www.sistemasorp.es/blog/fonerawd.tar.gz

Aunque ya viene el ejecutable probablemente queráis compilarlo por vosotros mismos, por lo que además de seguir las instrucciones que publiqué en un reciente artículo, debéis compilarlo incluyendo una librería y un directorio de includes de la siguiente forma:

mips-linux-uclibc-gcc -I../fonera/staging_dir_mips/usr/include -L../fonera/staging_dir_mips/usr/lib -liw -o fonerawd fonerawd.c

Donde la ruta ../fonera la debéis cambiar a la ruta donde tengáis el toolchain.

Una vez compilado el ejecutable debéis descargarlo a la fonera en el directorio /usr/bin

wget http://xxx.xxx.xxx.xxx/fonerawd
mv fonerawd /usr/bin

donde xxx.xxx.xxx.xxx es la ip de un servidor web. Después hay que darle permisos de ejecución

chmod +x /usr/bin/fonerawd

Ahora debemos hacer unas modificaciones en el kamikaze:

1) Editar con el vi el fichero /etc/inittab y desactivar el entrada por consola comentado la linea tts/0::askfirst:/bin/ash –login con una almohadilla «#». Esto hará que los comandos NMEA del GPS enviados al puerto serie no provoquen el crear una sesión shell por el puerto serie ya que contienen un retorno de carro y el linux lo confundiría con la pulsación de la tecla ENTER.

2) Poner una ip fija en la fonera para luego poder entrar en ella sin tener que adivinar que IP tiene. Para ello editamos con el vi el fichero /etc/config/network y ponemos esto en la interfaz lan (la ip puede ser cualquier otra de vuestro segmento de red):

config interface lan
option ifname eth0
option proto static
option ipaddr 192.168.0.12
option netmask 255.255.255.0

3) Instalar el modulo proc_gpio citado en este artículo. Para ello debéis copiar el fichero proc_gpio.ko en el directorio /lib/modules/2.6.19.1 . Esto nos permitirá tener control sobre la luz WLAN de la fonera.

4) En el directorio /etc/init.d crear un fichero con el vi llamando red y le añadís las siguientes líneas:

#!/bin/sh /etc/rc.common

start () {
wlanconfig ath0 destroy
wlanconfig ath0 create wlandev wifi0 wlanmode sta
ifconfig ath0 up
insmod proc_gpio.ko
echo 1 > /proc/gpio/2_dir
echo 1 > /proc/gpio/2_out
/usr/bin/fonerawd
}

stop () {
echo «hola»
}

Y le damos permisos de ejecución. Finalmente debéis crear un enlace a este fichero desde el directorio /etc/rc.d de la siguiente forma:

ln -s /etc/init.d/red S76red

Esto hará que cuando se arranque la fonera y busque en el directorio rc.d que scripts deben ejecutarse, se ejecute el script llamado red. Este script crea una interfaz wireless llamada ath0 en modo cliente para poder escanear las redes wifi, luego el módulo proc_gpio hará que se encienda la luz de WLAN, señal que indica que el demonio fonerawd esta cargado y podemos conectar el gps al puerto serie de la fonera (y no antes).

El proceso a seguir sería el siguiente:

1) Ponéis la fonera en el salpicadero del vehículo.

2) Ponéis la antena en el techo del vehículo y pasais el cable al interior a través de la ventanilla conectándola a la fonera.

3) Enchufáis el adaptador al mechero del coche y el otro extremo de este a la fonera.

4) Cuando la luz de WLAN este encendida conectar el módulo GPS.

Un resultado de una de mis salidas haciendo wardriving se puede ver en https://www.sistemasorp.es/fonerawd

Hacer wardriving no conlleva que te conectes a las redes wifi necesariamente, simplemente se trata de listarlas, por eso este proyecto solo lista las redes y no hace nada más con ellas, siendo 100% legal.

El próximo proyecto que tengo en mente es hacer que la fonera con el firmware de FON pueda actuar como interfaz entre internet y un PIC 16F628 para hacer domótica.

Actualización 04/02/2007:

Añado un video sobre una sesión de wardriving con la fonera:

A pesar de que en el vídeo somos dos personas, en las sesiones de wardriving con la fonera solo es necesario el conductor, ya que la fonera se encarga de hacerlo todo ella sola (eso si, poned el gps cuando la luz de WLAN esté en verde y antes de movilizar el vehículo).

Creo que también es necesario un pequeño esquema de como se deben conectar los pines del gps que he utilizado para las sesiones con los pines de la fonera:

Sun Solaris 10 en mi casa

Después de tres semanas de haber rellenado el formulario para que me enviasen los dvd del sistema operativo Solaris 10 (uno para SPARC y otro para 32 y 64 bits) y las herramientas de desarrollo Sun Studio 11, finalmente ha llegado:


Me gusta mucho linux, pero tener un unix en mis manos (y próximamente en mi ordenador) es un placer de informático 🙂

Fuentes del proyecto de domótica

Como muchos me habéis pedido aquí dejo las fuentes del proyecto de domótica:

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.

Luces: (Visual C++ 6.0) El corazón del sistema software. Este es el encargado de abrir el puerto tcp 1976 para recibir conexiones, validar usuarios, enviar por el puerto paralelo las ordenes que estos dicten entre otras cosas. Podeis descargar el programa compilado, con su base de datos y su fichero .ini aquí (Recordad que para ejecutarlo en windows NT, 2000, XP o 2003 debeis usar el allowio)

Web: (DHTML y ASP) Interfaz web para poder usar el sistema mediante un navegador o un móvil con WEP.

Applet: (Visual J++) Applet de java para la interfaz web, la cual muestra en tiempo real los cambios de los aparatos eléctricos.

Remoto: (Visual C++ 6.0) Aplicación para gestionar los comandos de un mando a distancia por infrarrojos.

SMS: (Visual C++ 6.0) Aplicación para gestionar los comandos de mensajes cortos por móvil.

Me hubiera gustado modificar los fuentes para dejarlos más claros, elegantes e incluso más eficientes, pero no he tenido tiempo hasta ahora y no lo tendré en un tiempo futuro, por lo que los pongo tal como los dejé.

Compilando programas para la fonera

Hace poco leí un artículo en barrapunto donde descubrí (un poco tarde, ya lo sé) que la fonera tenía ssh (y por ende linux embebido).

El caso es que viendo páginas como la de radikalq3 me animé a solicitar a FON su preciado router wireless (cuando aún estaba de oferta a 5 ?) para hacer «pruebas y experimentos» y de paso unirme a la comunidad FON.

La recibí ayer, y por supuesto habilité el ssh mediante hardware (cables, condensadores, MAX232 y el puerto serie). Por cierto, una vez listado todo el proceso de arranque el usuario debe pulsar INTRO para activar la consola. Una vez abierto el puerto 22 monté de nuevo la fonera y me conecté por ssh. La primera vez que entras debes entrar como root y con password admin. Posteriormente cambié la clave de root desde la web de FON en Configura tu Router Social FON/Contraseña del Router

A continuación me bajé los fuentes de la fonera http://download.fon.com/firmware/fonera/latest/fonera.tar.bz2 (unos noventa megas), los guardé en mi carpeta personal de mi servidor con mandriva 2006, los descomprimí con tar xvjf fonera.tar.bz2, ejecuté make menuconfig sin modificar nada, grabé y posteriormente tecleé make. La primera vez no me compiló, por lo que tuve que instalar varios paquetes: urpmi flex, urpmi bison y urpmi byacc.

Una vez compilados los fuentes ya solo me quedaba saber como poder compilar un programa y subirlo a la fonera. La compilación se explica en la web de OpenWRT:
http://downloads.openwrt.org/docs/buildroot-documentation.html#using_toolchain. Así que me puse manos a la obra e hice este programa llamado prueba.c el cual simplemente abre le fichero /etc/passwd y muestra su contenido (en vez de hacer el típico hola mundo):

Lo compilé con mips-linux-uclibc-gcc -o prueba prueba.c y se creó un ejecutable sin problemas. A continuación lo moví a /var/www/html para que estuviese disponible a través del servidor web apache y desde la fonera lo recuperé con wget http://192.168.0.11/prueba (notese que la ip del servidor será distinta en vuestro caso), le cambié los permisos para que se pudiera ejecutar chmod 755 prueba y finalmente lo probé funcionado perfectamente.

Espero que esto os anime a crear vuestros propios programas. Este ejecutable me ocupó unos 7 KBytes y aún tengo 7 megas de espacio libre en la fonera para añadirle nuevas cosas 🙂

Actualización 08/02/2007:

Dani, un lector del blog me comentó que la fonera solo tiene 4 megas libres de espacio de almacenamiento permanente (y no 7 megas como había escrito en el artículo). Después de hacer dos experimentos que podéis leer en los comentarios de este blog la capacidad real de la fonera con el firmware de FON es de 5 MB. Gracias Dani por forzarme a experimentar 😉

Manejar aparatos eléctricos desde el PC: domótica (5/5)

Hola a todos de nuevo. La espera se ha hecho larga (¡¡¡ casi 7 meses !!!), pero es porque me enfrasqué en otros proyectos y he sacrificado el tiempo del blog para poder desarrollarlos, aunque siempre he estado pendiente de los comentarios. Uno de ellos (que no el único) ha sido el de crear Hora y Lugar: una web para crear recordatorios de citas y que ha quedado cuarta en el concurso de Google Maps España.

Como broche final a esta serie de artículos, expongo la interfaz por antonomasia que hace que la domótica cobre un nuevo sentido. Y esa es manejar el sistema mediante el móvil. Ya no se trata de estar en casa o de tener una conexión a internet, sino de prácticamente poder usar nuestros aparatos desde cualquier lugar (donde haya cobertura claro). En esta ocasión es a base de SMS, que todo el mundo sabe escribir y son relativamente baratos, aunque en un futuro añadiré la funcionalidad de centralita, donde una voz te pregunta e informa y tu envías comandos mendiante tonos DTMF (pulsando las teclas del teléfono) o bién mediante voz; todo ello usando TAPI.

Usando el móvil que ya todos conoceis desarrollé la interfaz para poder tratar los mensajes recibidos y traducirlos en comandos para el sistema. Para iniciarlo se carga el programa SMS indicandole en que puerto esta eschuchando el móvil y cual es la dirección del servidor.

Cuando queramos hacer algo, escribimos un mensaje sms con el formato usuario contraseña comando.

Cuando el móvil recibe el mensaje, el programa SMS que esta comprobando si ha recibido un mensaje cada cierto tiempo lo procesa, muestra el teléfono de origen, la fecha y la cadena enviada.

A continuación envía el comando al servidor y nos responde con otro mensaje sms indicando en que estado se encuentra el sistema después de haber procesado el comando.

De la aplicación se puede salir simplemente pulsando INTRO.

Aquí teneis un video donde podeis ver como funciona todo lo que he ido explicando en todos los artículos:

Si no podeis visualizarlo bién, el enlace es https://www.youtube.com/watch?v=-Y5wO0ydRxo

Y así acaba esta serie de artículos, esperando que os haya servido de utilidad y que os haya dado ideas de como implantarlo vosotros mismos (como ya muchos me habeis comentado). Mi idea es seguir desarrollandolo añadiendo nuevas funcionalidades como reconocimiento de voz, centralita (como ya he comentado más arriba) y más control en los aparatos (de ser un mero encender y apagar a poder manejar todas las funcionalidades).

Manejar aparatos eléctricos desde el PC: domótica (4/5)

Códigos fuentes del proyecto