<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Bosco Curtu &#187; django/python</title>
	<atom:link href="http://bcurtu.com/?feed=rss2&#038;cat=25" rel="self" type="application/rss+xml" />
	<link>http://bcurtu.com</link>
	<description>@bcurtu en twitter</description>
	<pubDate>Wed, 21 Jul 2010 15:40:48 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Cómo se hizo el mapa de calor</title>
		<link>http://bcurtu.com/?p=654</link>
		<comments>http://bcurtu.com/?p=654#comments</comments>
		<pubDate>Mon, 30 Mar 2009 20:51:41 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<category><![CDATA[dooplan]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=654</guid>
		<description><![CDATA[En el anterior post explicaba lo que era el mapa de calor de dooplan. Robert construyó la solución (a partir de otro desarrollo) y aquí explica cómo funciona.
]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://bcurtu.com/?p=652">anterior post</a> explicaba lo que era el <a href="http://www.dooplan.com/places/list">mapa de calor</a> de dooplan. Robert construyó la solución (a partir de otro desarrollo) y <a href="http://robertrv.wordpress.com/2009/03/11/heat-maps-with-django/">aquí</a> explica cómo funciona.</p>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=654</wfw:commentRss>
		</item>
		<item>
		<title>pdb.set_trace() en Google App Engine</title>
		<link>http://bcurtu.com/?p=611</link>
		<comments>http://bcurtu.com/?p=611#comments</comments>
		<pubDate>Sun, 25 Jan 2009 14:27:04 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=611</guid>
		<description><![CDATA[GAE redirecciona todo el stdout a la salida del navegador (response), por lo que el pdb tal cual no funciona. Para hacerlo funcionar hay que hacer un pequeño truco:
import sys, pdb
for attr in ('stdin', 'stdout', 'stderr'):
    setattr(sys, attr, getattr(sys, '__%s__' % attr))
pdb.set_trace()
Yo lo he encapsulado en un fichero, así puedo usarlo más [...]]]></description>
			<content:encoded><![CDATA[<p>GAE redirecciona todo el stdout a la salida del navegador (response), por lo que el pdb tal cual no funciona. Para hacerlo funcionar <a href="http://jjinux.blogspot.com/2008/05/python-debugging-google-app-engine-apps.html" target="_blank">hay que hacer un pequeño truco</a>:</p>
<pre>import sys, pdb
for attr in ('stdin', 'stdout', 'stderr'):
    setattr(sys, attr, getattr(sys, '__%s__' % attr))
pdb.set_trace()</pre>
<p>Yo lo he encapsulado en un fichero, así puedo usarlo más o menos como antes. Lo he llamado gpdb.py:</p>
<pre>import sys
import pdb

def set_trace():
    for attr in ('stdin', 'stdout', 'stderr'):
        setattr(sys, attr, getattr(sys, '__%s__' % attr))

    return pdb.set_trace()</pre>
<p>Y para usarlo, en mi código añado:</p>
<pre>            import gpdb; gpdb.set_trace()</pre>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=611</wfw:commentRss>
		</item>
		<item>
		<title>Y el Amigo Invisible llegó a la nube</title>
		<link>http://bcurtu.com/?p=609</link>
		<comments>http://bcurtu.com/?p=609#comments</comments>
		<pubDate>Sun, 25 Jan 2009 12:48:37 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[amigoinvisible]]></category>

		<category><![CDATA[django/python]]></category>

		<category><![CDATA[programación]]></category>

		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=609</guid>
		<description><![CDATA[He subido el amigo invisible versión Django + GAE y ha funcionado! Aquí tenéis una versión primitiva de la aplicación, pero que funciona al 100%. Y con múltiples exclusiones!
TODOs:

L&#38;F, ponerle el css adecuado
Corregir los últimos cambios de app_bij.py que ha hecho David
Uno, dos o tres pasos?
Añadir todas las funcionalidades extras: Recuperar el sorteo, ver con [...]]]></description>
			<content:encoded><![CDATA[<p>He subido el <a href="http://el-amigo-invisible.appspot.com/" target="_blank">amigo invisible versión Django + GAE</a> y ha funcionado! Aquí tenéis una versión primitiva de la aplicación, pero que funciona al 100%. Y con múltiples exclusiones!</p>
<p>TODOs:</p>
<ul>
<li>L&amp;F, ponerle el css adecuado</li>
<li>Corregir los últimos cambios de app_bij.py que ha hecho David</li>
<li>Uno, dos o tres pasos?</li>
<li>Añadir todas las funcionalidades extras: Recuperar el sorteo, ver con quien juegas, comentar lo que quieres que te regalen&#8230;</li>
<li>Añadir AdSense (y forrarme)</li>
<li>&#8230;</li>
<li>Y cuando todo vaya bien, mover el DNS para que www.amigoinvisibleonline.com apunte a la nube</li>
</ul>
<p>PD. Tengo un límite de 2000 emails por día. Esto puede ser un problema, estas navidades estuve enviando más de 4000 al día, tendré que preguntar precios.</p>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=609</wfw:commentRss>
		</item>
		<item>
		<title>Primeros pasos con GAE y Django</title>
		<link>http://bcurtu.com/?p=606</link>
		<comments>http://bcurtu.com/?p=606#comments</comments>
		<pubDate>Sat, 24 Jan 2009 22:59:14 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=606</guid>
		<description><![CDATA[Mi tutorial step-by-step:

Te bajas el GAE SDK y te lo instalas
Te bajas Django, si no lo tuvieras y quieres usar una versión moderna (&#62;0.96)
Crea tu proyecto django, donde quieras: django-admin.py startproject xxx
Modifica el settings.py quitar todas las referencias a la BBDD, sessions, auth y admin. Ver esta nota
Copiar django framework y todo su contenido en [...]]]></description>
			<content:encoded><![CDATA[<p>Mi tutorial step-by-step:</p>
<ul>
<li><a href="http://code.google.com/intl/es-ES/appengine/downloads.html" target="_blank">Te bajas el GAE SDK</a> y te lo instalas</li>
<li><a href="http://www.djangoproject.com/download/" target="_blank">Te bajas Django</a>, si no lo tuvieras y quieres usar una versión moderna (&gt;0.96)</li>
<li>Crea tu proyecto django, donde quieras: django-admin.py startproject xxx</li>
<li>Modifica el settings.py quitar todas las referencias a la BBDD, sessions, auth y admin. <a href="http://code.google.com/intl/es-ES/appengine/articles/django.html" target="_self">Ver esta nota</a></li>
<li>Copiar django framework y todo su contenido en la raiz del proyecto</li>
<li>Añade un fichero app.yaml, descriptor del proyecto, que contenga:</li>
</ul>
<pre>application: aio
version: 1
runtime: python
api_version: 1
handlers:
- url: /static
static_dir: site_media
- url: /.*
  script: main.py</pre>
<ul>
<li>Crea un fichero main.py, conteniendo lo siguiente:</li>
</ul>
<pre>import logging, os, sys

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Remove the standard version of Django.
for k in [k for k in sys.modules if k.startswith('django')]:
  del sys.modules[k]

# Force sys.path to have our own directory first, in case we want to import
# from it.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

# Django imports and other code go here...
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi

def main():
  # Run Django via WSGI.
  application = django.core.handlers.wsgi.WSGIHandler()
  util.run_wsgi_app(application)

if __name__ == '__main__':
  main()</pre>
<ul>
<li>Crea los modelos usando los <a href="http://code.google.com/intl/es-ES/appengine/docs/python/datastore/typesandpropertyclasses.html" target="_blank">Types y Properties</a> delGAE</li>
<li>Si vas a <a href="http://code.google.com/intl/es-ES/appengine/articles/djangoforms.html" target="_blank">usar ModelForms</a> también. Recuerda que los forms normales y los formset son los de django.</li>
<li>Para hacer las queries, <a href="http://code.google.com/intl/es-ES/appengine/docs/python/datastore/creatinggettinganddeletingdata.html" target="_blank">usa estos comandos</a>.</li>
<li>Para ejecutar el proyecto: ./dev_appserver.py &lt;projecto&gt;</li>
<li>Para acceder al admin, y a una consola interactiva, puedes verlo desde aquí: http://localhost:8080/_ah/admin</li>
<li>Todo lo demás funciona igual. Eso sí, ojo con la librería contrib.auth, que tampoco existe, <a href="http://code.google.com/intl/es-ES/appengine/docs/python/users/" target="_blank">se usan cuentas de google</a>.</li>
<li>Por supuesto, la mayoría de pluggables fallarán, porque hay que migrar a los nuevos modelos&#8230;</li>
</ul>
<p>Tengo el amigo invisible más o menos listo, tengo que probar el envío de mails, y luego lo subiré a los servidores de Google. A ver si mañana lo termino.</p>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=606</wfw:commentRss>
		</item>
		<item>
		<title>Google App Engine</title>
		<link>http://bcurtu.com/?p=604</link>
		<comments>http://bcurtu.com/?p=604#comments</comments>
		<pubDate>Sat, 24 Jan 2009 17:31:17 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[amigoinvisible]]></category>

		<category><![CDATA[django/python]]></category>

		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=604</guid>
		<description><![CDATA[Llevo esta tarde peleándome con el Google App Engine, para portar el amigo invisible a esto. Y no ha sido trivial. Por un lado, te quedas sin admin. La consola de administración del GAE no es para nada lo mismo. Por otro lado, y mucho mucho mucho más importante, no puedes usar import pdb;pdb.set_trace() Cómo [...]]]></description>
			<content:encoded><![CDATA[<p>Llevo esta tarde peleándome con el <a href="http://code.google.com/appengine/" target="_blank">Google App Engine</a>, para <a href="http://code.google.com/intl/es-ES/appengine/articles/appengine_helper_for_django.html" target="_blank">portar</a> el <a href="http://www.amigoinvisibleonline.com/">amigo invisible</a> a esto. Y no ha sido trivial. Por un lado, te quedas sin admin. La consola de administración del GAE no es para nada lo mismo. Por otro lado, y mucho mucho mucho más importante, no puedes usar import pdb;pdb.set_trace() Cómo puedes debugar sin eso?!!</p>
<p>Las diferencias con django se producen en la parte de BBDD, ya que se sustituyen los models de django por el sistema de Google. La definición es sencilla, pero <a href="http://code.google.com/intl/es-ES/appengine/docs/python/datastore/queryclass.html#Query_get" target="_blank">los métodos para hacer queries</a> dejan mucho que desear. Y las exceptions lanzadas también son diferentes.</p>
<p>Ojo también con los forms. Los ModelForms se extienden de un paquete de GAE, mientras que los forms normales son los de Django.</p>
<p>Por último, <a href="http://code.google.com/intl/es-ES/appengine/articles/django10_zipimport.html" target="_blank">es posible y fácil</a> utilizar Django en su versión actual. Simplemente hay que definir un archivo main.py (y declararlo en el app.yaml), con el siguiente contenido:</p>
<pre>import logging, os, sys

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Remove the standard version of Django.
for k in [k for k in sys.modules if k.startswith('django')]:
  del sys.modules[k]

# Force sys.path to have our own directory first, in case we want to import
# from it.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

# Django imports and other code go here...
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi

def main():
  # Run Django via WSGI.
  application = django.core.handlers.wsgi.WSGIHandler()
  util.run_wsgi_app(application)

if __name__ == '__main__':
  main()</pre>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=604</wfw:commentRss>
		</item>
		<item>
		<title>Trucos de Django Admin</title>
		<link>http://bcurtu.com/?p=580</link>
		<comments>http://bcurtu.com/?p=580#comments</comments>
		<pubDate>Wed, 31 Dec 2008 15:31:21 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=580</guid>
		<description><![CDATA[Django Admin me sigue pareciendo una herramienta clave dentro de django. Es terriblemente potente y flexible. Es verdad, como dice nuestro compañero de trespams, el admin no es para el usuario final, pero puede ser un herramienta super útil para el usuario interno. En dooplan usamos el admin (entre otras cosas) para el equipo de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin" target="_blank">Django Admin</a> me sigue pareciendo una herramienta clave dentro de django. Es terriblemente potente y flexible. Es verdad, como <a href="http://trespams.com/2008/11/15/el-django-admin-no-es-fer-aplicacions-dusuari-final/" target="_blank">dice nuestro compañero de trespams</a>, el admin no es para el usuario final, pero puede ser un herramienta super útil para el usuario interno. En <a href="http://www.dooplan.com" target="_blank">dooplan</a> usamos el admin (entre otras cosas) para el equipo de editores de los eventos.</p>
<p>Con el Admin cada editor tiene los permisos de acceso a lo que le corresponde, tienen filtros y búsquedas a su medida, formularios muy fáciles de rellenar (hasta campos autotext!), histórico de modificaciones&#8230; Es una plataforma que con muy poco esfuerzo nos ha ofrecido una solución potentísima, que un desarrollo a medida no lo habría hecho mejor (y a que coste&#8230;)</p>
<p>Pues bien, el otro día James Bennett proponía un par de <a href="http://www.b-list.org/weblog/2008/dec/24/admin/" target="_blank">trucos interesantes para hackear aún más el admin</a>. Yo completo ese tutorial con otro truco interesante. Cómo mostrar un formulario para el alta y otro para la modificación de un mismo modelo. Este caso puede ser interesante para simplificar el alta de un objeto, pero mantener el control completo en caso de la modificación.</p>
<p>Simplemente hay que sobreescribir los métodos add_view() y change_view() del ModelAdmin. Siguiendo con <a href="http://www.b-list.org/weblog/2008/dec/24/admin/" target="_blank">el ejemplo propuesto por Bennett</a>, si queremos que en el alta solo tuviéramos que entrar title, slug y body, y en la modificación quisieramos ocultar el slug (para evitar que se modifique la url) y la fecha podríamos hacer esto:</p>
<pre><span class="k">class</span> <span class="nc">EntryAdmin</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">ModelAdmin</span><span class="p">):</span>
    ...
    def add_view(self, *args, **kwargs):
        self.fields = ('title','slug','body')
        return super(EntryAdmin, self).add_view(*args, **kwargs)

    def change_view(self, *args, **kwargs):
        self.fields = ('title','body','subject','author')
        return super(EntryAdmin, self).change_view(*args, **kwargs)</pre>
<p>Por supuesto, podemos ser aún más vagos y sobreescribir solo uno de los métodos, y dejar que el otro coja los parámetros por defecto:</p>
<pre><span class="k">class</span> <span class="nc">EntryAdmin</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">ModelAdmin</span><span class="p">):</span>
    ...
    fields = ('title','body','subject','author')

    def add_view(self, *args, **kwargs):
        self.fields = ('title','slug','body')
        return super(EntryAdmin, self).add_view(*args, **kwargs)</pre>
<p>Esto también funcionaría</p>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=580</wfw:commentRss>
		</item>
		<item>
		<title>Mi primer snippet (chispas)</title>
		<link>http://bcurtu.com/?p=578</link>
		<comments>http://bcurtu.com/?p=578#comments</comments>
		<pubDate>Tue, 30 Dec 2008 19:42:36 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=578</guid>
		<description><![CDATA[Hoy me ha salido casi sin querer mi primer djangosnippet. Es un filtro para el admin, para poder seleccionar ver solo los elementos con el campo a null, o los que tengan valor, o todos juntos.
Funciona cuando quieres filtrar un campo genérico (un numérico, un string&#8230;) y este campo es nullable. Si no tuvieras este [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy me ha salido casi sin querer <a href="http://www.djangosnippets.org/snippets/1270/" target="_blank">mi primer djangosnippet</a>. Es un filtro para el admin, para poder seleccionar ver solo los elementos con el campo a null, o los que tengan valor, o todos juntos.</p>
<p>Funciona cuando quieres filtrar un campo genérico (un numérico, un string&#8230;) y este campo es nullable. Si no tuvieras este filtro te aparecen todos los valores posibles (completamente inutil en este tipo de campo). Si el campo no es nullable, este filtro no se activa.</p>
<p>El filtro hay que aplicarlo como parche sobre un fichero de django.</p>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=578</wfw:commentRss>
		</item>
		<item>
		<title>migrations</title>
		<link>http://bcurtu.com/?p=531</link>
		<comments>http://bcurtu.com/?p=531#comments</comments>
		<pubDate>Fri, 10 Oct 2008 19:27:45 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=531</guid>
		<description><![CDATA[



A una semana (más o menos) de nuestra salida en beta hemos empezado a utilizar migraciones. Hasta ahora no eran necesarias, ya que en periodo de desarrollo construyes y te cargas la bbdd tantas veces como necesites, pero ahora que ya tenemos a nuestros editores empezando a introducir información en la BBDD no podemos permitirnos [...]]]></description>
			<content:encoded><![CDATA[<div class="entry-body">
<div>
<div class="item-body">
<div>
<p>A una semana (más o menos) de nuestra salida en beta hemos empezado a utilizar migraciones. Hasta ahora no eran necesarias, ya que en periodo de desarrollo construyes y te cargas la bbdd tantas veces como necesites, pero ahora que ya tenemos a nuestros editores empezando a introducir información en la BBDD no podemos permitirnos ese lujo.</p>
<p>Así que hemos empezado con las migraciones. Para quién no sepa lo que son las migrations es una técnica que permite hacer modificaciones sobre la BBDD (el esquema) de una forma controlada. Es decir, cuando el desarrollador necesita crear una nueva columna, por ejemplo, lo hace a través de una migración, es decir un comando que se ejecutará para hacer los cambios automáticamente y de forma controlada.</p>
<p>En <a href="http://wiki.rubyonrails.org/rails/pages/UnderstandingMigrations" target="_blank">Ruby On Rails está muy bien resuelto</a>, y viene por defecto con el framework. La verdad que es una de las características que más envidio de RoR. Django sin embargo no viene con ellas por defecto, pero existen 3 plugables:</p>
<ul>
<li><a href="http://code.google.com/p/django-evolution/" target="_blank">Django-evolution</a>, el más veterano, pero un poco limitado. Solo controla una serie de cambios, un poco limitados en mi opinión</li>
<li><a href="http://south.aeracode.org/" target="_blank">South</a>, una interesante y atractiva opción. Sin embargo, las pruebas que he hecho no han sido satisfactorias</li>
<li><a href="http://code.google.com/p/dmigrations/" target="_blank">DMigrations</a>, <a href="http://simonwillison.net/2008/Sep/3/dmigrations/" target="_blank">proyecto liderado por Simon Wilson</a> , un django-evangelist británico, que es el que más me ha gustado y estamos utilizando. Exige que sea el desarrollador quién informe al sistema de las migraciones, mientras que en los otros el sistema es quien las descubre, pero permite mayor flexibilidad.</li>
</ul>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=531</wfw:commentRss>
		</item>
		<item>
		<title>Festuc en Django</title>
		<link>http://bcurtu.com/?p=527</link>
		<comments>http://bcurtu.com/?p=527#comments</comments>
		<pubDate>Wed, 08 Oct 2008 19:42:09 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<category><![CDATA[dooplan]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=527</guid>
		<description><![CDATA[Hoy los amigos de Festuc están actualizando su web con una nueva versión hecha en Django. Enhorabuena festuceros! Nos habéis ganado en la carrera de ser la primera (gran) web hecha en Django en Cataluña. A nosotros nos falta nada, un par de semanas.
Festuc y dooplan tienen mucho en común, además de que ambas plataformas [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy los amigos de <a href="http://www.festuc.com" target="_blank">Festuc</a> están actualizando su web con una <a href="http://ojoudjat.blogspot.com/2008/10/triple-salto-mortal-con-tirabuzn.html" target="_blank">nueva versión hecha en Django</a>. Enhorabuena festuceros! Nos habéis ganado en la carrera de ser la primera (gran) web hecha en Django en Cataluña. A nosotros nos falta nada, un par de semanas.</p>
<p>Festuc y dooplan tienen mucho en común, además de que ambas plataformas serán Django, compartiremos un mismo objetivo, convertirnos en referencia del ocio. Sin embargo el enfoque es ligeramente diferente. Mientras ellos van a por un target de twenty something, fiesteros, aves nocturnas&#8230;, nosotros desde dooplan intentaremos posicionarnos en un rango de edad superior y con una oferta de ocio más variada. No queremos centrarnos en fiestas exclusivamente, queremos también llegar a esos que disfrutan con una buena exposición, una conferencia, una feria, con sus hijos, con su pareja&#8230; Un público diferente.</p>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=527</wfw:commentRss>
		</item>
		<item>
		<title>consensus, otro motor de filtrado colaborativo en python</title>
		<link>http://bcurtu.com/?p=523</link>
		<comments>http://bcurtu.com/?p=523#comments</comments>
		<pubDate>Tue, 30 Sep 2008 19:17:20 +0000</pubDate>
		<dc:creator>Bosco</dc:creator>
		
		<category><![CDATA[django/python]]></category>

		<category><![CDATA[programación]]></category>

		<category><![CDATA[recommenders]]></category>

		<guid isPermaLink="false">http://bcurtu.com/?p=523</guid>
		<description><![CDATA[Jordi me ha pasado un link a Consensus, una sencilla librería python para filtrado colaborativo. Es extremadamente sencilla (que no simple) por lo que se puede entender facilmente la filosofía detras. Interesante.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.terraquis.net" target="_blank">Jordi</a> me ha pasado un link a <a href="http://exogen.case.edu/projects/consensus/" target="_blank">Consensus</a>, una sencilla librería python para filtrado colaborativo. Es extremadamente sencilla (que no simple) por lo que se puede entender facilmente la filosofía detras. Interesante.</p>
]]></content:encoded>
			<wfw:commentRss>http://bcurtu.com/?feed=rss2&amp;p=523</wfw:commentRss>
		</item>
	</channel>
</rss>
