Excelente video del filósofo argentino José Pablo Feinmann.
Monthly Archive for Septiembre, 2009
El programa consta de dos partes: el contenedor de resultados y el script.
Contenedor de resultados
Se trata del elemento HTML donde se mostrarán los resultados de una búsqueda. Los términos de búsqueda se establecen en el atributo title.
Por ejemplo, si quisiéramos mostrar los resultados del tag #obama:
1 | <div class="twitter_search" title="#obama"></div> |
Podés crear todos los contenedores que quieras en la misma página, en el lugar que desees:
1 2 3 4 | <p>Novedades sobre Python</p> <div class="twitter_search" title="#python"></div> <p>Novedades sobre jQuery</p> <div class="twitter_search" title="#jquery"></div> |
El script
Son las instrucciones JavaScript del programa que se encargará de todo el trabajo: obtendrá los términos de búsqueda, solicitará los resultados a través de la API de Twitter y mostrará los resultados en el navegador.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | $(document).ready(function() { var url = 'http://search.twitter.com/search.json?callback=?'; $('.twitter_search').each(function() { var container = $(this); var search = container.attr('title'); if (search) { var since_id = 0; if (container.children().length) { since_id = container.children(':first').attr('id').replace('#', ''); } $.getJSON(url, {'q': search, 'since_id': since_id}, function(data) { if (data.results.length) { for (i in data.results.reverse()) { var r = data.results[i]; var div = $('<div id="#' + r.id + '"></div>'); div.hide(); div.addClass('twitter_result'); div.append('<img src="' + r.profile_image_url + '" alt="' + r.from_user + '" />'); div.append('<a href="http://twitter.com/' + r.from_user + '">' + r.from_user + '</a>'); div.append('<span>' + r.text + '</span>'); container.prepend(div); div.slideDown('slow'); if (since_id) { container.children(':last').slideUp(); } } } }); } }); }; |
Acá pueden ver una demostración funcional (y comentada) del script: Twitter Search + jQuery.
Aclaraciones de la demo:
- Casi no hay consumo de bandwidth de nuestro servidor, porque estoy usando jQuery 1.3.2 desde Google y es el navegador del usuario quien se encarga de hacer el request de búsqueda a la API de Twitter
- En la demo los resultados se actualizan automáticamente cada 5 segundos (setInterval("twitter_search();", 5000))
- Sigo una estructura FIFO (gracias al parámetro since_id de la API). Esto significa que iré agregando nuevos resultados en la cabecera mientras remuevo los más antiguos
- La demo es XHTML 1.0 Transitional
El 25 de diciembre me voy a Perú con unos amigos, y quiero saber cuántos días faltan. Puedo contar los días del calendario, buscar en Google alguna herramienta para realizar este tipo de cálculos, o sino…
>>> from datetime import datetime >>> td = datetime(2009, 12, 25) - datetime.now() >>> td.days 94
Más rápido que buscar en Google, no?
Por mi trabajo, siempre estoy pendiente de lo que sucede en Crunchbase (de hecho, estoy suscripto a su feed de páginas recientes). Con tantas empresas y personas yendo y viniendo por Twitter, se transformó en una fuente de consulta permanente.
¿Puedo consultar Crunchbase con Python? La respuesta es obvia
Crunchbase tiene una API muy interesante que devuelve resultados en formato JSON. Pueden encontrar documentación sobre su uso en en crunchbase-api.
Para este programa estoy usando la librería simplejson (sudo apt-get install python-simplejson)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import sys, urllib, simplejson api = 'http://api.crunchbase.com/v/1/search.js?%s' def main(): if len(sys.argv) >= 2: q = ' '.join(sys.argv[1:]) source = urllib.urlopen(api % urllib.urlencode({'query': q})) results = simplejson.loads(source.read()) if results['results']: for r in results['results']: name = r.get('name') if not name: name = ' '.join([w.capitalize() \ for w in r['permalink'].split('-')]) print '%s (%s): %s' % ( name.strip(), r['namespace'].capitalize(), r['crunchbase_url'], ) else: print 'No results for "%s"' % q else: print 'Usage: python %s <keyword(s)>' % sys.argv[0] if __name__ == '__main__': main() |
Aquí tienen algunos resultados:
mahadeva@blue:~$ python crunchbase.py Usage: python crunchbase.py mahadeva@blue:~$ python crunchbase.py popego Popego (Company): http://www.crunchbase.com/company/popego Santiago Siri (Person): http://www.crunchbase.com/person/santiago-siri
El programa en sí no es muy cómodo de usar (para eso existen los add-ons de de Firefox
), pero es un buen punto de partida para utilizar, por ejemplo, como una aplicación de Django, o un bot que interactúe con Twitter.
Acá les muestro un simple notificador de correo con Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import sys, libgmail def main(): if len(sys.argv) >= 3: g = libgmail.GmailAccount(sys.argv[1], sys.argv[2]) try: g.login() except libgmail.GmailLoginFailure: print 'Login incorrecto' else: unread = g.getUnreadMsgCount() if unread: import pynotify, gtk pynotify.init('Gmail notify') pynotify.Notification('Gmail', '%d mensajes sin leer' % unread, gtk.STOCK_DIALOG_INFO).show() if __name__ == '__main__': main() |
En la primera línea estoy importando el módulo libgmail porque uso Gmail. Si usan Ubuntu, pueden instalar esta librería con sudo apt-get install python-libgmail.
Alternativamente pueden obtener un XML en formato Atom a través de https://mail.google.com/mail/feed/atom (van a necesitar algo como urllib2.HTTPPasswordMgrWithDefaultRealm).
Como es un script que se ejecuta desde la línea de comandos, sys.argv[1] será mi nombre de usuario y sys.argv[2] mi contraseña.
Si en mi cuenta hay correo no leído (línea 12), importo pynotify y gtk (porque uso Gnome) para mostrar un mensaje en mi pantalla:

Dos cosas a tener en cuenta:
- En el ejemplo utilizo sys.argv para obtener el nombre de usuario y la contraseña, pero tengan en cuenta que esa información queda almacenada en ~/.bash_history o en otros logs del sistema. Es preferible definir dos variables dentro del script
- Pueden hacer que el script corra periódicamente utilizando cron. Por ejemplo: */1 * * * * /usr/bin/python2.5 /path/al/script.py usuario@gmail.com contraseña
Hoy estuve viendo los resultados de la búsqueda #pyconar2009 en Twitter Search, y me dije: “por qué no hacer las búsquedas desde consola, con Python?”
Unos minutos después, aquí está el resultado:
1 2 3 4 5 6 7 8 9 10 11 12 | import feedparser, urllib def main(): feed_source = 'http://search.twitter.com/search.atom?%s' q = raw_input('Search term: ') if q: f = feedparser.parse(feed_source % urllib.urlencode({'q': q})) for entry in f.entries: print '%s: "%s"' % (entry.author, entry.title) if __name__ == '__main__': main() |
En este caso usé Universal Feed Parser ($ sudo apt-get install python-feedparser), pero pueden utilizar la librería que más les guste
El 4 y el 5 asistí a la PyCon Argentina 2009, la primera conferencia mundial en castellano sobre el lenguaje de programación Python. Vi muchas caras conocidas: desde compañeros de laburo hasta amigos del mundo del Software Libre. También vi a un par de voluntarios que habían participado de la última Wikimanía en Buenos Aires.
Del primer día quiero destacar dos charlas:
- Me gustó mucho “Hacking Django, mismo framework, distintos paradigmas” de Nubis. Hizo gala de sus conocimientos y demostró ser un excelente orador. Le veo mucha pasta como conferencista.
- “The State of Django” de Jacob Kaplan-Moss me pareció excelente. De todas formas, no estoy totalmente de acuerdo con su punto de vista sobre los problemas de escalabilidad en Django. Si en algún momento se publica un video sobre la charla, me gustaría hacer algunos comentarios.
Al final del día me fui a tomar unas cervezas con los pibes de Cycle (hace mil que no los veía), y a la nochecita pintó un paintball por Belgrano.
Del segundo día también destaco dos charlas:
- La charla “Multiprocesamiento en Python” de Claudio Freire me encantó. Se explayó con soltura sobre temas como multithreading, multiprocessing y el famoso “GIL” de Python. También me gustó que haya hecho una breve introducción a Pyrex.
- “Unladen Swallow” de Collin Winter fue otra excelente charla. Allí se expuso cómo Google busca que Python sea 5x más rápido. Si quieren más información al respecto, les recomiendo visitar el plan del proyecto y prestar especial atencion a “Places we would like to optimize“.
Mi balance general sobre PyCon Argentina
A favor:
- El lugar está muy bueno (salas bien iluminadas, limpias y con buena acústica)
- En general, la calidad de las charlas programadas fue excelente
- Buena onda permanente (me sentí como “en familia”)
- El equipo organizador y los voluntarios hicieron un gran laburo
- No se afanaron ninguna laptop
En contra:
- No me gustó casi ninguna charla relámpago del segundo día1
- Hubiera estado bueno que haya un micrófono entre los asistentes para hacer preguntas sin tener que gritar
Un aplauso para los “pitufos” de PyCon Argentina 2009!
Ah, y el año que viene nos vamos todos a Córdoba, para la PyCon Argentina 2010!
1 – Salvo excepciones, como la de Roberto Alsina o la de Felipe Lerena.

