logo

Acerca de

Bienvenido a mi blog, el sitio perfecto para mis inquietudes, experiencias e idas de olla sobre temas de hoy en día.

Historia al azar

Categorías

Últimas entradas

Últimos comentarios

Enlaces

Meta

photo Luis PeraltaEstado Jabber
Ziritione
Castellón Spain
39.997638, -0.064030

Sindica

Sindícame, por cortesía del subliminal Atom.

16 Marzo 2008

El tener una API en 11870.com permite, entre otras cosas, el prototipado rápido de chorradas varias sin mucho esfuerzo. Así que hoy me ha dado por probar un poco otra API: Google Chart API (API de gráficas de Google) y que menos que explotar algún dato de los que hay en 11870.com. Ya se sabe, una imagen vale más que mil palabras, así que me he decidido a pintar las ciudades donde tengo sitios guardados.

Podría haber manejado a pelo la API de Google pero, puestos a probar, me he tirado a Python Google Chart que ofrece una interfaz para Python bastante cómoda. Lo primero que ha habido que hacer es descargar la lista de mis sitios:

import httplib2
import feedparser

def get_oos_entries(slug):
    user = "luis@XXXXXXX"
    key = "XXXXXXX"
    base_url = OOSURL + "/sites/" + slug
    
    entries = []
    
    h = httplib2.Http()
    h.add_credentials(user, key)
    next_url = [base_url]

    while len(next_url) == 1:
        base_url = next_url[0]
        r, c = h.request(base_url)
        feed = feedparser.parse(c)
        entries.extend(feed.entries)
        next_url = [i.href for i in feed.feed.links if i.rel == 'next']
        
    return entries

La lógica puede parecer un poco difusa, pero es simplemente porque el feed de resultados de nuestros sitios está paginado y los necesitamos todos. El cómo conseguir la key está documentado en 11870.com API authentication. Una vez con los sitios, tenemos que saber cuántos sitios hay por cada localidad o área geográfica:

from operator import itemgetter
from itertools import groupby

def do_chart_input(entries, field, other_threshold=None):
    f = itemgetter(field)
    lentries = [entry for entry in entries if entry.get(field, None)]
    sorted_entries = sorted(lentries, key=f)
    res = {}
    others = 0
    for k, g in groupby(sorted_entries, f):
        num = len(map(f, g))
        if other_threshold is not None and num / float(len(lentries)) < other_threshold:
            others += num 
        else:
            key = k + u' (' + str(num) + ')'
            res[key] = num
    
    if other_threshold is not None:
        res['Otros (' + str(others) + ')'] = others
        
    return res

A este método se le pasan las entries obtenidas con get_oos_entries, el campo sobre el que realizar la agrupación y si queremos que aquellas agrupaciones que no superen un cierto umbral se agrupen bajo un Otros. En el caso de mis ciudades, hay un montón de ellas donde sólo tengo un sitio, por lo que la gráfica salía muy muy fea si no aplicaba el filtro con umbral. El parámetro field sirve para determinar sobre qué elemento de cada entrada realizamos la agrupación y así conseguimos que el método sea lo suficientemente genérico como para calcular los datos sobre cualquier tipo de área (país, ciudad, barrio, etc...). El cuerpo principal de nuestro programita sería tal que así:

if __name__ == '__main__':
    entries = get_oos_entries('peralta')
    res = do_chart_input(entries, 'oos_locality', 0.03)
    chart = PieChart2D(600,375)
    chart.add_data(res.values())
    chart.set_pie_labels([i.encode('utf-8') for i in res.keys()])
    chart.set_title('mis ciudades en 11870.com')
    chart.download("/tmp/x.png")

Y el resultado:

Si quisiéramos pintar los barrios de manu, modificariamos el cuerpo principal tal que:

entries = get_oos_entries('manueltxo')
    res = do_chart_input(entries, 'oos_subdependentlocality', 0.03)

Y el resultado:

De aquí a hacer una interfaz web para mostrar estas imágenes a partir de cualquier usuario hay 15 minutos, pero se queda como ejercicio ;)

2 Diciembre 2007

Ayer me dio el impulso de probar python en mi Nokia N70, así que me bajé a comprar un Bluetooth USB dongle, porque lo de llevar la tarjeta de memoria del PC al teléfono cada vez que fuera a probar algo no me apetecía nada. Además, existe la posibilidad de usar una consola remota contra el intérprete de Python y eso sólo funciona con Bluetooth.

Si os animais a probarlo, Nokia es la que mantiene el proyecto y, bajo mi punto de vista, lo ha hecho muy bien.

Aproximadamente me pasé dos horitas intentando hacer que se asociase mi portátil con el móvil. Para empezar me faltaban algunos paquetes en mi Ubuntu. Tuve que instalar:

  • bluetooth
  • bluez-pin
  • bluez-utils
  • bluez-gnome

El más importante quizá fue bluez-gnome, que contaba que no tendría que instalar (long life XFCE!), pero resultó que sí, porque si no no me preguntaba la contraseña de asociación (y antes probé editar /etc/bluetooth/pin, /etc/bluetooth/hcid.conf y /var/lib/bluetooth/MAC/pincodes y nada de nada).

Una vez asociado quería probar la consola remota del intérprete, para que esto funcionara:

# sdptool add --channel=1 SP
# rfcomm listen /dev/rfcomm0 1

Y lanzar después la consola remota en el móvil. Aquí el comando clave fue el sdptool, antes se quejaba el móvil de que no había encontrado ningún puerto de serie en mi pc.

>>> import sysinfo
>>> sysinfo.battery()
85

Para subir archivos al móvil estuve utilizando obexftp (otro paquete más a instalar). La única pega que tuve fue al intentar subir un archivo con el mismo nombre que otro subido anteriormente y todavía no haberlo borrado. Se queja entonces el obexftp con un error de Permission denied que no es muy explicativo. En el momento de mandar un archivo .py, llega al móvil como un mensaje que, al intentar abrirlo, nos pregunta si queremos instalar el script.

Así que me pasé la tarde programando un escriptacho para jugar con los ids de celdas y el servicio de My Location de Google (la funcionalidad de My Location de Google Maps Mobile no funciona en los s60 2nd ed. porque el java no puede acceder a esos datos del móvil). Otro día hablaré del programita.

9 Octubre 2007

Y como hay quien no espera la llegada de las rebajas, Google acaba de comprar Jaiku, lo cuentan en su blog. Jaiku se podía entender como una especie de Twitter, pero menos centrado en el mandar mensajitos y más en la agregación de la identidad digital. Yo he llegado a usar Jaiku, sin hacerle mucho caso, aunque a veces entro simplemente para ver cómo es capaz de agregar toda mi vida digital de forma tan sencilla: las fotos de flickr, este blog, mis sitios de 11870, mi del.icio.us, ...

Si alguno de vosotros ha utilizado facebook, habrá descubierto el vicio que es echar un vistazo al news feed de nuestra home donde vemos todo lo que hace nuestra gente dentro de facebook. Lo bonito de Jaiku es que es abierto y se nutre de los feeds que nosotros le demos y de las relaciones que traslademos al sistema.

Pero lo que realmente me llamó la atención de Jaiku fue su aplicación para el móvil. En mi N70 la integración era terrorífica: los contactos, el estado (si el móvil lo pones en modo reunión se actualiza el estado en Jaiku), la posición geográfica (vía gps o triangulando estaciones), mandar mensajes, invitar a contactos de la agenda, ... En serio, de repente el móvil tenía alguna de las cosas que asocias claramente al futuro. Si todavía no la habéis probado, echadle un vistazo. Por cierto, el cliente utiliza XMPP para la comunicación con el servidor... buen estándar nunca muere.

Y enhorabuena al equipo de Jaiku oye, que es una gran noticia ;)

18 Agosto 2006

A Google le está dando por implementar determinada funcionalidad en Google Talk un poco a su manera. Un claro ejemplo son las últimas funcionalidades que han implementado: transferencia de ficheros y carpetas y buzón de voz. Prometen, por supuesto, documentar el funcionamiento con un JEP, pero tardarán. También prometen liberar una nueva versión de libjingle que será capaz de trabajar con las nuevas funcionalidades.

Pero los curiosos como yo lo único que podíamos hacer era montar un sniffer y observar el XML que se transfería en los momentos clave. Pero resulta que son un poco más listos que eso en Google y hay opciones de línea de comando para obtener el mismo resultado sin tanto jaleo:

    /log verbose tstamp thread file

Eso nos dejará un bonito fichero en el escritorio con el volcado del XML transferido. Para verlo en una consola en vez de en un archivo, sustituir file por debug.

16 Agosto 2006

Microsiervos se hace eco de un artículo sobre la historia de los buscadores de Internet, desde 1993 a 2006.

O eso pretende ser, porque se deja por ni siquiera nombrar a Dónde?, el primer buscador español (1 de junio de 1996), creado en la propia UJI por unos pocos locos y que funcionaba sin araña. Tampoco menciona a Olé, que fue absorbido por Terra en su día y cuya venta estuvo rodeada de no poco escándalo.

Una pena que un artículo escrito aquí no mencione esos primeros pasos pioneros (y que no se me tache de nacionalista, pero el reconocimiento ahí donde se debe).