Archivo de la categoría: Programación

Todo lo que tiene que ver con la programación de ordenadores.

NoBrowser: Aplicación Android para evitar el uso del navegador

Logo NoBrowser

Esta entrada es para presentar NoBrowser, mi primera aplicación para móviles. En concreto para Android, que es el sistema que uso.

¿Por qué se creó NoBrowser?

Hasta hace poco había estado usando un teléfono HTC Magic, el cuál ya es un poco viejecillo, y por tanto se puede considerar un dispositivo de gama baja: poca potencia de CPU y poca memoria. ¿Ves ya por dónde van los tiros? :-)

Una de las cosas que más hago con el teléfono es leer Twitter, y debido a la limitación de 140 caracteres, la gente usa servicios para “saltarse” esa limitación, como pueden ser:

  • Twitlonger

    Este servicio te permite escribir más de 140 caracteres, de forma que en Twitter se publica un tweet con todo lo que quepa más un enlace a su web para leer el resto. Sinceramente, no soy partidario de este tipo de servicios —si quieres escribir más, abre un blog— pero sí leo a gente que lo usa.

  • Videos de youtube con enlaces de youtu.be

    Youtube usa su propio servicio de acortado de direcciones, y curiosamente no son “capturados” por la aplicación de Youtube para Android, de forma que si haces clic sobre uno de estos enlaces, lo que ocurre es que primero se abre el navegador y luego te pregunta si quieres abrir la aplicación de Youtube. Y lo malo es que además, una vez visto el vídeo, vuelves atrás y se vuelve a ¡abrir el navegador! porque el sistema ya lo había sacado de memoria ¿No sería más rápido si no se tuviese que abrir el navegador?

  • Acortadores de direcciones

    Una cosa interesante de NoBrowser es que puede seguir los acortadores de direcciones, de forma que si tenemos, por ejemplo, un enlace bit.ly que redirige a youtu.be y éste al vídeo original, si tenemos la certeza de que es un vídeo, podemos abrir el enlace con NoBrowser y directamente nos abrirá la aplicación de Youtube.

Cuando ya estuve harto de estos problemas busqué en el Android Market una aplicación que me permitiese hacer esto, y como habéis adivinado no la encontré. Así que nada, aprovechando que soy programador, y aunque no me gusta Java para nada, me remangué y me puse a trastear un poquillo para hacer lo que necesitaba. Poco a poco ha ido saliendo algo.

¿Qué hace exactamente NoBrowser?

Lo que hace la aplicación básicamente es capturar ciertos enlaces para tratarlos ella y evitar en todo lo posible que se abra el navegador cuando no es necesario, y como NoBrowser es una aplicación bastante liviana, todo el proceso es mucho más rápido. A continuación paso a detallar lo que hace exactamente:

  • Enlaces de Twitlonger

    Cuando se pulsa sobre un enlace de Twitlonger, el sistema nos preguntará si queremos abrirlo con el navegador o con NoBrowser.

    Si elegimos el navegador, se abrirá éste y nos mostrará la página de Twitlonger con el tweet completo. Abrir el navegador en la Magic, como ya he dicho, supone un tiempo de espera precioso —y desesperante— y luego cargar la página completa, con sus imágenes y demás.

    Sin embargo, si elegimos abrir el enlace con NoBrowser, lo que ocurre es que éste mostrará una ventanita con el contenido del tweet. Abrir NoBrowser es casi instantáneo, y además, no se descarga nada más que el texto, por lo que es un ahorro de tiempo y de ancho de banda, lo cual puede significar dinero también en una conexión de datos móvil.

  • Enlaces a youtu.be

    Este es un tipo de enlaces que la aplicación de Youtube ya debería capturar, pero por raro que parezca, no es así. Cuando pulsamos sobre uno de estos enlaces, el sistema nos preguntará de nuevo si queremos abrirlo con el navegador o con NoBrowser. Como en el caso anterior, si se abre con NoBrowser, éste nos redirigirá directamente a la aplicación de Youtube y se morirá, de forma que podremos ver el vídeo antes que si lo hiciésemos con el navegador, y además, una vez visto el vídeo volveremos directamente a la aplicación en la que estábamos —cliente de Twitter por ejemplo— sin tener que pasar otra vez por el navegador.

  • Enlaces seguros al Android Market

    Este caso es el mismo que el anterior. Curiosamente la aplicación del Market para Android no captura los enlaces seguros (https://), y nos manda a la web.

    Si elegimos abrir estos enlaces con NoBrowser, éste nos redirige automáticamente a la aplicación.

Futuro

Tengo previsto añadir nuevas funcionalidades, como por ejemplo:

  • Petición de confirmación antes de redirigir a la aplicación concreta.
  • Visualizador de imágenes.

Descarga y código fuente

Cherokee Summit 2010

Logo del Cherokee Summit 2010
Bueno, hoy se ha hecho el anuncio oficial de que el próximo 7 y 8 de mayo tendrá lugar en Madrid (España) el primer congreso/reunión de programadores, usuarios e interesados por mi servidor web favorito.

El evento coincidirá con la liberación de la versión 1.0 de Cherokee, y además se hablará del roadmap de la versión 2.0

Dentro de unos meses cogeré mis bártulos para acudir a la cita, porque además de poder conocer en persona al resto de miembros del equipo de desarrollo y usuarios activos, podré asistir y/o participar en varias charlas sobre infraestructuras web de alto rendimiento. Seguro que aprenderé bastante… ya estoy deseando. :-)

En la página web del Cherokee Summit 2010 podréis encontrar más información sobre el evento, las charlas que se darán, cómo llegar, etc… y lo más importante: cómo apuntaros para asistir. Las plazas están limitadas a 80 asistentes, así que si estáis interesados ¡daos prisa!

Por cierto, la asistencia es gratuita.

Pymaldi: Accediendo a los lectores Kimaldi desde Python

Mi amigo David y yo estamos desarrollando una aplicación para el control de acceso a instalaciones, y la gestión de turnos de trabajo. Básicamente se trata de que cada trabajador tenga una tarjeta RFID con sus datos y foto, y que esa tarjeta la sirva para entrar a las instalaciones abriendo las barreras, para abrir puertas, para picar el comienzo de su jornada laboral, para poder comer en el comedor, etc… En fin, muchas cosas que ya contaré en profundidad cuando la terminemos, y si es que nos proponemos venderla a otros clientes además de para el que inicialmente la estamos haciendo, que será lo más probable, ya que su diseño es totalmente abierto.

El caso es que para implementar nuestra solución optamos por usar lectores de la empresa Kimaldi, concretamente el Biomax2, que tenía muy buena pinta. El problema es que el SDK que provee la empresa es sólo para Windows, así que tuvimos que coger el manual del aparato, mirar el protocolo de comunicaciones para intentar hacernos “algo” y así poder interactuar con él desde cualquier sistema operativo, pero principalmente desde Linux, que es el que nos interesaba.

Aprovechando que había descubierto las cualidades de Python colaborando en el desarrollo del Cherokee-Admin, propuse que usásemos Python. Es un lenguaje que te da muchas facilidades para programar cualquier cosa y es muy portable. Hacer eso en C no nos daría más que dolores de cabeza y mucho más tiempo de programación.

Así que nada, puestos manos a la obra, pensamos que lo mejor sería hacer una librería que intentase emular el comportamiento del componente OCX que proporciona Kimaldi, incluyendo los mismos nombres de funciones de éste. ¿Qué conseguíamos con esto? pues que el que estuviese habituado a ese API tuviese más facilidad para programarlo, ya que nuestra idea era liberar esa librería con algún tipo de licencia de código abierto.

Después de un tiempo de desarrollo inicial y de que todo lo básico funcionase, la liberamos, y está disponible en la página del proyecto Pymaldi en Google Code. Desde entonces hemos ido añadiendo nuevos métodos y hemos mejorado algunas cosas.

La librería funciona en base a eventos, es decir, el programa que usa la librería puede enviarle comandos al lector en plan: “pon esto en el display”, “activa el relé 1 durante 2 décimas de segundo”, etc… pero además puede recibir eventos que se produzcan en el lector, como cuando una tarjeta se pasa por él, cuando se pulsa una tecla del teclado, cuando se reinicia el lector, etc. Todo esto de una forma muy simple, como se puede ver en el ejemplo adjunto:

from pymaldi import Pymaldi

class MyPymaldi (Pymaldi):
    def __init__(self):
        Pymaldi.__init__(self)

    def onReadCard (self, card_id):
        if card_id:
            msg = 'Card ID: %s' % (card_id)
        else:
            msg = 'Error reading card'

        rc = self.WriteDisplay(msg)
        if rc:
            print "ERROR (WriteDisplay): %d" % rc


reader = MyPymaldi()
reader.OpenPortUDP('192.168.2.22')
rc = reader.SetUpBIOMAX2()
if not rc:
    print "BIOMAX2 ready!"
else:
    print "ERROR (SetUpBIOMAX2): %d" % rc
    raise SystemExit

while True:
    try:
        reader.wait_events()
    except KeyboardInterrupt:
        raise SystemExit

Este código lo que haría es conectar con el lector que tiene la IP 192.168.2.22 y se queda a la espera de que pasen una tarjeta por él. En cuanto se pasa una tarjeta, se ejecuta una función que lo que hace es decirle al lector que ponga en el display el texto: “Card ID: ” seguido del número de tarjeta. ¿A que es fácil? :-)

Si sólo queremos pintar algo en la pantalla, nada más simple que:

from pymaldi import Pymaldi

class MyPymaldi (Pymaldi):
    def __init__(self):
        Pymaldi.__init__(self)


reader = MyPymaldi()
reader.OpenPortUDP('192.168.2.22')
rc = reader.SetUpBIOMAX2()
if not rc:
    print "BIOMAX2 ready!"
else:
    print "ERROR (SetUpBIOMAX2): %d" % rc
    raise SystemExit

rc = reader.WriteDisplay("Hola SKaRCHa ;)")
if rc:
    print "ERROR (WriteDisplay): %d" % rc

raise SystemExit

Y este sería el resultado:

Biomax2 usándose con Pymaldi

¿Se puede hacer más fácil? :D

Bueno, pues termino ya, que sólo pensaba hacer un comentario para anunciar la liberación de la librería y ha salido una entrada más larga de lo esperado. Si has llegado hasta aquí es porque te interesa la programación y/o el cacharreo, si no, no te entiendo… :D

Librería Pymaldi.

Cherokee y rTorrrent

Como mi amigo JLuis me preguntó si podía usar Cherokee con rTorrent, me puse a preparar una entrada explicando cómo configurarlo todo; pero hablando con Álvaro llegué a la conclusión de que iba a ser mejor invertir ese tiempo en escribir un asistente para Cherokee-Admin, así que ayer subí un parche que implementa el asistente que permite configurar Cherokee para conectar con rTorrent.

Tan sólo tendríais que configurar rTorrent poniendo algo como esto en vuestro rtorrent.rc:

scgi_port = localhost:5000

La parte de Cherokee la hará el asistente. Disponible ya en la versión 0.99.24.

¿Cómo? ¿que todavía no usas Cherokee? ¡¿A qué estás esperando?! :D

Límite de variables enviadas por POST en PHP

Esta mañana me comentaba un amigo que tenía problemas a la hora de añadir nuevos campos en su aplicación de facturación en PHP.

Después de muchas pruebas, descubrimos que la variable $_POST de PHP contenía sólo las primeras 200 variables que se le enviaban al PHP.

Me puse a buscar y el problema estaba en que la versión de PHP que está usando su proveedor de hosting está parcheada con Suhosin, y este parche por defecto limita el número de variables enviadas por POST a 200.

La solución, poner esta directiva en el php.ini:

suhosin.post.max_vars = 2048

Por supuesto, se puede poner más, pero con eso nos era suficiente.

Más información sobre las opciones de configuración de este parche.