Enviando mensajes SMS desde la línea de comandos

Enviar mensajes SMS desde una de nuestras aplicaciones o scripts siempre es una necesidad, la forma más fácil y obvia es sencillamente hacerlo a través de gateways de correo que algunos proveedores celulares ofrecen. Lo cual es común en USA y Europa, por ejemplo si alguien desea enviar un SMS a un celular de TMobile en USA sólo debe de poner como destinatario una dirección e-mail de esta forma 1234567890@tmomail.net donde 1234567890 es el número del celular al que deseamos enviar el mensaje.

Sin embargo esa opción no está disponible en todo el mundo, algunos carriers no la ofrecen y en su reemplazo solamente nos permiten enviar mensajes SMS a través de interfases web que requieren usualmente que resolvamos un captcha. Lo cual hace demasiado complicado automatizar ese proceso a través de un script con curl. Un ejemplo de ello es Claro del Perú.

Buscando una forma de resolver este problema es que encontré la librería pygooglevoice, dicha librería permite a cualquiera que tenga una cuenta de Google Voice el enviar/recibir mensajes SMS  de manera gratuita a cualquier parte del mundo. ¿Aplicaciones?, muchas, desde sistemas de monitoreo y alarma a sistemas interactivos de información usando mensajes SMS (podríamos por ejemplo crear nuestro propio clon de twitter).

Si desean darle una ojeada más extensa a la documentación antes de instalar la librería pueden hacerlo aquí.

La instalación es sencilla, aquí los pasos de cómo hacerla en un Ubuntu 8.04 (Hardy):

$ wget http://pygooglevoice.googlecode.com/files/pygooglevoice-0.5.tar.gz
$ sudo apt-get install python-simplejson
$ tar -zxvf pygooglevoice-0.5.tar.gz
$ cd pygooglevoice-0.5
$ sudo python setup.py install
$ cd

Listo con esos pasos tenemos instalada la librería y un utilitario llamado "gvoice" que nos permite administrar nuestra cuenta Google Voice desde la línea de comandos. Pero como nuestro objetivo es poder enviar mensajes SMS a números telefónicos de cualquier parte del mundo (bueno sólo carriers GMS están soportados), de manera automatizada, podemos usar un sencillo script en Python como este que viene de ejemplo:

from googlevoice import Voice
from googlevoice.util import input

voice = Voice()
voice.login()

phoneNumber = input(‘Number to send message to: ‘)
text = input(‘Message text: ‘)

voice.send_sms(phoneNumber, text)

Luego podremos ejecutarlo y el script nos preguntará nuestro e-mail en gmail que es usado como credencial en Google Voice, el password, el número telefónico al cual queremos enviarle un mensaje de texto y finalmente el mensaje de texto. Aunque este es un ejemplo bastante trivial las aplicaciones del mismo son enormes. Hay que tener presente que este escript no limita el tamaño del mensaje, así que si este excede los 140 caracteres será truncado.

Malas prácticas de programación

Luego de haber sufrido infinidad de ataques a muchos de los blogs que hosteo, hace ya buen tiempo decidí cortar por lo sano, simplemente instalé Suhosin, en mis servers y deje que todo tipo de actividad extraña fuera bloqueada (Ojo, esto es sólo a nivel PHP, eso no quiere decir que no intalen firewalls, IDS u otras medidas adicionales de seguridad en sus servidores). Hasta el día de hoy creía no tener efectos secundarios. Sin embargo, debido a que éste blog usa un viejo plugin para el módulo de "Contactame", descubrí que luego de la última actualización dicho plugin no estaba funcionando.

Al principio creí que era debido a la última migración/actualización que hice de mi server. Si mi memoria no me falla este es el septimo server que hospeda mi blog. Luego de recibir el reporte de @cnieto de que el formulario tenía problemas, hice lo que siempre hago asegurarme de que el exim4 este seteado para hacer relays a dominios externos. Luego de ello pense que el problema se había solucionado, sin embargo para mi sorpresa en un test que hice luego de haber reconfigurado el exim, me di cuenta de que aún no funcionaba.

Luego de leer los logs, encontré este misterioso mensaje:

"ALERT – configured request variable name length limit exceeded – dropped variable"

Con detalles de la IP desde donde me estaba conectando y un increíblemente largo nombre de variable de 204 caracteres de largo. Seamos honestos a que mente retorcida se le puede ocurrir darle 204 caracteres de longitud al nombre de una variable. Al parecer el plugin que estoy usando lo hace, razón por lo cual tuve que editar el archivo "/etc/php5/conf.d/suhosin.ini" y cambiar los valores por defecto de estas dos variables:

;suhosin.post.max_name_length = 64
;suhosin.request.max_varname_length = 64

Por los siguientes:

suhosin.post.max_name_length = 254
suhosin.request.max_varname_length = 254

Luego de reiniciar el Apache, el formulario de "Contactame" ya estaba nuevamente operando como lo hacía en el anterior server. Creo que en Lenny el módulo Suhosin se ha vuelto más paranoico o sencillamente tampoco estaba funcionando en el anterior server que era Lenny también pero estaba en RackspaceCloud, si los chicos del "Fanatical Support", que terminaron desiluncionandome, razón por la cual  volví a hostear nuevamente el servidor virtual de mi blog en el server físico que tengo colocado en el data center de la compañía donde trabajo. Como sea el problema no estaba en el seteo del sistema que estaba racionalmente configurado, sino en las malas prácticas de programación que al parecer algunos desarrolladores de pequeños proyectos Open Source suelen tener. Es por eso que la gran mayoría de proyectos Open Source nunca crecen.

Bueno ya pude desahogar mi enojo, para eso también sirve el blog. Desde ahora ya esta activa nuevamente la página de "Contactame".

Aplicaciones Twitter con CodeIgniter

Luego de haber estado estudiando el API de Facebook y como desarrollar aplicaciones utilizando CodeIgniter, al cual le dedique no hace mucho un post. Estuve estudiando ahora el API de Twitter y como integrarlo con CodeIgniter, para ello utilicé la librería desarrollada por Elliot Haughin. Realmente la librería es muy fácil de utilizar, y como se especifica claramente en la documentación de la librería es vital para que esta funcione hacer dos cosas:

  1. Editar el archivo system/application/config/config.php y en la declaración de la variable "$config[‘uri_protocol’]", reemplazar el valor "AUTO" que esta por defecto por el valor "PATH_INFO".
  2. En el mismo archivo anterior system/application/config/config.php debemos agregar el caracter "?" a los caracteres permitidos, eso se hace a través de la variable "$config[‘permitted_uri_chars’]".

La aplicación de prueba que he desarrollado y que puede ser vista en http://www.volkanrivera.com/twitterapp/, es en realidad muy simple, se basa en los famosos tests que aparecían en el extinto semanario "Monos y Monadas", pero nos permite ilustar algunas ventajas respecto de las aplicaciones Twitter con respecto a las aplicaciones Facebook. Hasta el momento estas son las que he encontrado yo:

  1. Las aplicaciones Twitter pueden correr en URLs propios, en los cuales tenemos todo el espacio para desarrollar el diseño que querramos además de que podemos ubicar nuestra propia publicidad contextual, en el ejemplo se ha colocado AdSense, en el lugar que más nos beneficie. En las aplicaciones Facebook, en las cuales estamos dentro de Facebook, nuestro espacio esta restringido al iFrame que nos asigna Facebook, aunque es posible colocar AdSense tambien.
  2. Es posible sólo efectual la validación del usuario y luego cerrar la sesion twitter controlando al usuario a través de nuestras propias variables de sesión. Es decir luego de que hemos validado a través del protocolo oAuth, no necesitamos a Twitter hasta que nuestro usuario haga un logout o cierre el navegador, lo cual haría que la sesion en CodeIgniter se cerrara.

Sin embargo en cualquiera de los casos, si utilizamos Facebook o Twitter para autenticar a los usuarios de nuestra aplicación o servicio, tenemos el inconveniente de que si dichos servicios están caídos, algo que suele pasar frecuentemente con Twitter, nuestros usuarios no podrían autenticarse. Pero por otro lado también hay sus ventajas, entre ellas una identidad única y consistente a través de toda la web, además de acceso a datos demográficos (especialmente en Facebook), que nos permiten personalizar de una manera que hace apenas 5 años pensabamos no era posible.

Me pregunto que tan factible sería el desarrollo de un juego de rol multijugador, utilizando Twitter para la interacción de los mismos, una de las principales ventajas de utilizar Twitter para esto es que los jugadores podrían seguir interactuando incluso desde sus celulares.

¿Se aproxima el fin de la era Microsoft?

Cuando entramos es este tercer milenio (año 2001), Microsoft era el amo indiscutible de la industria TIC. Nadie tenia el suficiente dinero, ni un modelo de negocios equivalente. El anterior rey IBM, había caído derrotado y se refugiaba en su último bastion para sobrevivir, las mainframes.

El gigante de Redmond despertó iras y sospechas en todo el mundo, muchos comparaban la estrategia de abarcar todos los rincones de la industria TIC que utilizaba Microsoft, a la estrategia de asimilación de los borgs. El mundo TIC parecía haber caído en las manos de Microsoft por siempre, sin embargo con la aparición de los smartphones, en donde RIM con su popular Blackberry redifinió que se podía hacer con un teléfono móvil y una conexión a Internet, algo cambio en el mundo. Una tendencia que el iPhone a vuelto bastante notoria.

Cuando se trataba de desarrollar aplicaciones, todos tenían que desarrollar para Windows, si no tenías una versión de tu aplicación para Windows, pues difícilmente podrías hacer dinero. Todo un circulo virtuoso para Microsoft lo mantenía como líder. Dejenme explicar a lo que me refiero. Los desarrolladores de aplicaciones debian hacer su producto compatible con el sistema dominante del mercado (Windows), pues era la única forma de acceder a un gran público, debido a que tenía muchas aplicaciones disponibles Windows atraía a más usuarios, siendo el resultado neto una expansión contínua del número total de usuarios del sistema operativo Windows, lo que a su vez también hacía crecer el número de aplicaciones disponibles.

Sin embargo diversos factores, muchos de ellos externos al sector TIC, han cambiado la dinámica del mercado. iPhones, netbooks, redes sociales (Twitter, Facebook), tecnologías de gran ancho de banda para celulares como GPRS/EDGE/3G, han cambiado la forma como las personas desean usar la mayor de todas las aplicaciones que hemos desarrollado la web.

Justamente, el hecho que Microsoft desatendiera la web y considerara que la dominaba sólo porque controlaba el navegador, recordemos que en un momento entre el 2002 y el 2003 Internet Explorer llego a tener el 95% del mercado de navegadores. Es lo que permitió que empresas como Apple (iPhone), Google (Android), MySpace, Facebook o Twitter hicieran un disrupción del mercado. Ahora ya no es necesario un PC para poder usar la web, para comunicarnos con los amigos o para poder jugar, ese es el principal problema de Microsoft.

Ahora incluso la Union Europea ha hecho un acuerdo con Microsoft y le ha permitido poner al Internet Explorer como una de las opciones que los usuarios pueden elegir entre otros browsers como por ejemplo Google Chrome, Safari, Opera, Firefox, al momento de instalar su sistema operativo Windows 7. Tal vez una de las razones que los reguladores europeos han considerado para cerrar este trato de Microsoft es de que incluso ahora que no es posible ese tipo de configuraciones cuando se instala un Windows, la participación de Internet Explorer en el mercado esta cayendo sostenidamente desde principios del 2008. Aquí les dejo un interesante cuadro que he encontrado en Silicon Alley Insider:

Colapso del IE

 
La perdida constante de mercado por parte del Internet Explorer, es básicamente el resultado de la desidia de Microsoft, que durante casi 6 años no desarrollo un nuevo browser. Período en el cual sus principales competidores introdujeron varias mejoras, y duarante el cual el némesis de Microsoft, introdujo su propio browser Chrome e incluso ahora está a punto de lanzar su propio sistema operativo para netbooks, Chrome OS.

Otro factor que también ha contribuido al debilitamiento de Microsoft ha sido sin duda la falla épica llamada Windows Vista, que está queriendo ser reemplazado por un poco menos exigente en recursos, Windows 7. Sin embargo los números aún no muestra una clara adopción de Windows 7 en las empresas. Lo cuál tiene sentido ya que han aparecido una infinidad de nuevas tecnologías una de ellas la virtualización de escritorios, que no obligan a actualizar el hardware de los equipos en los escritorios de las empresas. Otro factor que está retrasando la adopción de Windows 7 en las empresas, es sin duda, que no es posible hacer un upgrade sencillo desde Windows XP, que sigue siendo el rey en los escritorios corporativos.

No creo que Google Apps, o cualquiera de las aplicaciones ofimáticas basadas en web puedan destronar al omnipresente Microsoft Office. Ese seguirá siendo el bastión de Microsoft, probablemente el lugar donde se refugiará y tratará de exprimir tanto a sus usuarios, como IBM lo hace con los usuarios de sus mainframes. Pero el nuevo rey de la web es sin duda Google.

Resumiendo, creo en lo personal que el fin de la era de dominación de Microsoft se aproxima, junto con el final de la era PC. Las netbooks de $80 o menos, los smartphones y las redes sociales serán sin duda la plataforma en la cual correrán las aplicaciones del futuro. De alli la carrera por el sistema operativo que las controle a todas. Lamentablemente Microsoft se ha marginado a si mismo de la batalla por esa plataforma, casi de la misma forma como IBM lo hicera a finales de los ochenta con su OS/2.

Afinando el Acer Aspire One

Acer Aspire OneEn los próximos días dependeré casi exclusivamente de mi netbook, una Acer Aspire One 110L. Lo cual me puso en la necesidad de resolver algunos detalles que no me gustaban de esta netbook que por lo demás resuelve todas mis necesidades.

A diferencia de algunos que tratan de utilizar una netbook como una laptop barata, desde el momento mismo que compré la mia en agosto del 2008, mi idea era utilizarla como lo que realmente es, un equipo ultraportable para despligue en lugares donde el espacio cuenta. Si alguno de Uds. lectores ha tenido que trabajar en los limitados pasadizos entre los racks de un data center, sabran a que me refiero. Además llevar una netbook a todo lado en el maletín es mucho menos fatigoso que estar cargando un latop de 15 pulgadas.

En diciembre del año pasado le intalé Ubuntu 8.10 (Intrepid Ibex), para ello seguí el tutorial AspireOne 110L, luego en mayo de este año hice un upgrade a Ubuntu 9.04 (Jaunty Jackalope) sin mayores contratiempos. Pero a pesar de que había optimizado todo lo que había podido. El problema era que el Gnome con los 512MB de RAM que tiene la netbook hacían que el booteo y cargar el Firefox para googlear algo sea lento. Lo cual era soportable cuando no tenía apuro, pero en ciertos momentos resultaba ciertamente mortificante.

Decidido a optimizar el tiempo de respuesta, opté por probar LXDE en mi Ubutnu, había leído muy buenos comentarios de este escritorio que es además compatible con las librerias gtk+. Debido a que LXDE era soportado en Jaunty, todo fue tan simple como usar aptitude, el comando fue este:

sudo aptitude install lxde

Luego de eso reinicié el sistema y seleccioné LXDE como mi gestor de ventanas por defecto (más detalles en este tutorial). La respuesta del sistema fue buena, la carga de las aplicaciones era rápida, pero aparecieron dos problemas. El primero era que el sonido no funcionaba, podía vivir sin sonido, después de todo no uso mi netbook como mi equipo primario. El segundo problema si era grave, la red dejó de funcionar. Es decir no funcionaba ni el ethernet ni el wireless, lo cual no era aceptable para mi ya que esa es el principal uso que le doy de mi netbook; es decir un equipo que me permite correr mis herramientas de red.

Como sabía que había tenido que hacer unos cuantos tweaks para conseguir hacer funcionar Ubuntu en mi Acer Aspire One, me puse a googlear buscando tips de como hacer lo mismo con LXDE. Fue entonces que di de casualidad con el site Aspire One Kernel, dicho sitio mantenido por un australiano de nombre Stuart y que además ayuda a mentener el kernel de la distribución Kuki Linux, tiene un par de paquetes deb con el kernel 2.6.29, optimizados para correr en el Aspire One.

Despues que instalé los paquetes y reinicié el equipo, lo primero que noté es que el incio fue mucho más rápido. Luego, revisando con mayor detalle pude notar que el uso de la memoria era menor. Además que con el nuevo kernel ya funcionaba el ethernet. Sin embargo el wifi aún no funcionaba, googleando un poco más descubrí que lo único que había que hacer era iniciarlo manualmente con el comando "nm-applet". Para ello debemos de abrir una consola y ejecutar este comando:

nm-applet>/dev/null 2>/dev/null&

Luego de eso veremos que el applet del wifi se depliga en la parte izquierda de la barra de tareas.

Respecto al sonido, por defecto LXDE lo deshabilita. Para poder activarlo debemos hacer click con el botón izquierdo del mouse en la barra de tareas y seleccionar la opción "Agregar/Suprimir elementos del panel", luego hacemos click en el botón "Añadir", buscamos el applet llamado "Control de volumen" y lo agregamos.
Los mismos pasos anteriores pueden ser usador para agregar un "Monitor de batería" y el "Monitor de estado de red".

Listo, con los pocos pasos anteriores ahora el Aspire One puede bootear en un pestañeo y el desempeño del entorno gráfico es sorprendente, el Firefox carga casi inmediatamente y OpenOffice trabaja sin problemas, aunque sigue siendo un poco lento al cargar. Además he podido notar que el wifi tiene un poco más de alcance, porque ahora cuando exploro la red veo señales que antes no veía y las que antes podía ver ahora las veo con más barras.

Espero que estos tips sean de utilidad para todos aquellos propietarios de estas pequeñas pero poderosas herramientas.