<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5472687726050812204</id><updated>2012-01-17T19:53:37.136-08:00</updated><category term='gobject'/><category term='trucos'/><category term='qr-code'/><category term='android'/><category term='nutilus'/><category term='css'/><category term='south'/><category term='git'/><category term='python'/><category term='varios'/><category term='notas'/><category term='tutorial'/><category term='sqlite'/><category term='script'/><category term='pygtk'/><category term='nota'/><category term='vim'/><category term='qrcode'/><category term='django'/><category term='blog'/><category term='tip'/><category term='pablo vieytes'/><title type='text'>Mis Notas Sobre Python, Ubuntu y Otros Temas.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-7960101272905712582</id><published>2010-07-28T09:19:00.000-07:00</published><updated>2010-07-28T09:19:22.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='pablo vieytes'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='notas'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='trucos'/><title type='text'>Notas. Algunos trucos de django</title><content type='html'>He encontrado &lt;a href="http://stackoverflow.com/questions/550632/favorite-django-tips-features"&gt;algunos trucos&lt;/a&gt;&amp;nbsp;en &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt;. Pongo dos que me han gustado. El primero ya lo usaba, pero aun así lo pongo porque me parece básico. El segundo, es más bien de relleno. De los que había es el que más me gustaba. El post me vale más que nada de recordatorio. Iré échando un ojo al hilo de para ver si ponen alguno más que esté bien.&lt;br /&gt;&lt;br /&gt;Direcciones relativas en el fichero settings.py:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import os.path&lt;br /&gt;PROJECT_DIR = os.path.dirname(__file__)&lt;br /&gt;...&lt;br /&gt;STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")&lt;br /&gt;...&lt;br /&gt;TEMPLATE_DIRS = (&lt;br /&gt;    os.path.join(PROJECT_DIR, "templates"),&lt;br /&gt;)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un decorador para los templates:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;@render_to('template.html')&lt;br /&gt;def foo(request):&lt;br /&gt;    bar = Bar.object.all()&lt;br /&gt;    return {'bar': bar}&lt;br /&gt;&lt;br /&gt;# equals to&lt;br /&gt;def foo(request):&lt;br /&gt;    bar = Bar.object.all()&lt;br /&gt;    return render_to_response('template.html', {'bar': bar}, context_instance=RequestContext(request))&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-7960101272905712582?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/7960101272905712582/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/07/notas-algunos-trucos-de-django.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7960101272905712582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7960101272905712582'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/07/notas-algunos-trucos-de-django.html' title='Notas. Algunos trucos de django'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-3726204130359132858</id><published>2010-07-26T06:57:00.000-07:00</published><updated>2010-07-27T04:33:39.435-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='pablo vieytes'/><category scheme='http://www.blogger.com/atom/ns#' term='south'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota: Añadiendo south a un projecto existente de django</title><content type='html'>Hace poco tiempo, &lt;a href="http://pablogplanet.blogspot.com/2010/06/notas-mini-tutorial-django-south.html"&gt;miré por encima&lt;/a&gt;&amp;nbsp;como funcionaba &lt;a href="http://south.aeracode.org/"&gt;&lt;i&gt;south&lt;/i&gt;&lt;/a&gt;, pero no lo había usado hasta ahora. Simplemente había traducido y resumido el tutorial oficial para hacer un mini tutorial, pero sin incluirlo en ningún proyecto.&lt;br /&gt;&lt;br /&gt;Ahora se ha añadido al proyecto sobre el que estoy trabajando el módulo &lt;a href="http://south.aeracode.org/"&gt;&lt;i&gt;south&lt;/i&gt;&lt;/a&gt; y por lo tanto tenía que añadir las migraciones correspondientes a la base de datos de mi ordenador de desarrollo.&lt;br /&gt;&lt;br /&gt;No he sido capaz de añadir &lt;i&gt;&lt;a href="http://south.aeracode.org/"&gt;south&lt;/a&gt;&lt;/i&gt; sin borrar los datos que había previamente en las tablas. Me imagino que se podrá, pero como no me ha salido a la primera y los datos que tenía, eran de prueba, simplemente me he cargado las tablas de la base de datos.&lt;br /&gt;&lt;br /&gt;El orden que he seguido es el siguiente:&lt;br /&gt;&lt;br /&gt;Borrar las tablas de la base de datos se las aplicaciones que vaya a gestionar South.&lt;br /&gt;&lt;br /&gt;Eliminar las aplicaciones de&amp;nbsp;INSTALLED_APPS.&lt;br /&gt;&lt;br /&gt;Sincronizar la base de datos.&lt;br /&gt;&lt;br /&gt;Añadimos de nuevo las aplicaciones a INSTALLED_APPS.&lt;br /&gt;&lt;br /&gt;Creamos la primera migración de las aplicaciones que vaya a gestionar South.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py schemamigration app_name –-initial&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Donde &lt;i&gt;app_name&lt;/i&gt; es el nombre de la aplicación que gestiona South. Hay que repetir este proceso para cada aplicación que gestionemos con South.&lt;br /&gt;&lt;br /&gt;Ahora aplicamos la migración.&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py migrate app_name&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A partir de este momento, cada vez que se realice un cambio en los modelos, es necesario crear una nueva migración con:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;manage.py schemamigration app_name –-auto&lt;/code&gt;&lt;/pre&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para aplicar los cambios realizados hay que volver a usar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py migrate app_name&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-3726204130359132858?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/3726204130359132858/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/07/nota-anadiendo-south-un-projecto.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3726204130359132858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3726204130359132858'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/07/nota-anadiendo-south-un-projecto.html' title='Nota: Añadiendo south a un projecto existente de django'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-1637150351803218923</id><published>2010-06-27T15:19:00.000-07:00</published><updated>2010-06-27T15:25:04.390-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Nota: Palabras Clave para los colores en CSS</title><content type='html'>&lt;h2&gt;Palabras clave para los colores en CSS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6KLpbZOYDsA/TCfOMCJLjEI/AAAAAAAAAKU/gLufv8NnUk8/s1600/f0303.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6KLpbZOYDsA/TCfOMCJLjEI/AAAAAAAAAKU/gLufv8NnUk8/s320/f0303.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;X11 color names&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6KLpbZOYDsA/TCfPe0YdVBI/AAAAAAAAAKc/2t5xJURy2R0/s1600/colors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_6KLpbZOYDsA/TCfPe0YdVBI/AAAAAAAAAKc/2t5xJURy2R0/s400/colors.png" width="380" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/h2&gt;&lt;a href="http://en.wikipedia.org/wiki/Websafe"&gt;http://en.wikipedia.org/wiki/Websafe&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-1637150351803218923?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/1637150351803218923/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-palabras-clave-para-los-colores-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1637150351803218923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1637150351803218923'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-palabras-clave-para-los-colores-en.html' title='Nota: Palabras Clave para los colores en CSS'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6KLpbZOYDsA/TCfOMCJLjEI/AAAAAAAAAKU/gLufv8NnUk8/s72-c/f0303.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-4360764931808604765</id><published>2010-06-24T23:18:00.000-07:00</published><updated>2010-06-24T23:23:36.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Nota: Script en Django</title><content type='html'>Puede ser una buena idea, para un proyecto de django, tener scripts externos que realicen tareas concretas.&amp;nbsp;Para generar estos scripts, vamos a usar la opción, que tiene django a partir de la versión 1.0, de crear subcomandos para &lt;i&gt;"manage.py"&lt;/i&gt;. Una vez creado el subcomando, para ejecutar el script, simplemente habrá que ejecutar el fichero &lt;i&gt;"manage.py"&lt;/i&gt;&amp;nbsp;pasándole como parámetro nuestro subcomando.&lt;br /&gt;&lt;br /&gt;En la &lt;a href="http://docs.djangoproject.com/en/dev/howto/custom-management-commands/"&gt;página&lt;/a&gt; de django, nos muestran como se crean los subcomandos.&lt;br /&gt;&lt;a href="http://docs.djangoproject.com/en/dev/howto/custom-management-commands/"&gt;Writing custom django-admin commands&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La metodología para crear los subcomandos es muy fácil, en el directorio de una app de django, hay que crear unos directorios y unos ficheros. El fichero que contiene el código del subcomando, tendrá el nombre del subcomando con la extensión &lt;i&gt;"py"&lt;/i&gt;. Veamos como quedaría el directorio de la app si el nombre del subcomando fuese "my_subcommand":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;app/&lt;br /&gt;    __init__.py&lt;br /&gt;    models.py&lt;br /&gt;    management/&lt;br /&gt;        __init__.py&lt;br /&gt;        commands/&lt;br /&gt;            __init__.py&lt;br /&gt;            my_subcommand.py&lt;br /&gt;    tests.py&lt;br /&gt;    views.py&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por los tanto los ficheros que hay que crear son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;management/__init__.py&lt;/li&gt;&lt;li&gt;management/commands/__init__.py&lt;/li&gt;&lt;li&gt;management/commands/my_subcommand.py&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Es importante crear los ficheros __init__.py. Estos ficheros están en blanco, pero indican que los directorios son módulos de python. &lt;br /&gt;&lt;br /&gt;En el fichero &lt;i&gt;"management/commands/my_subcommand.py"&lt;/i&gt;, es donde hay que escribir el código del subcomando.&lt;br /&gt;&lt;br /&gt;Como ejemplo, voy a poner un subcomando de &lt;i&gt;"manage.py"&lt;/i&gt; que muestre el texto "Hello world!".&lt;br /&gt;&lt;br /&gt;Dentro del directorio de cualquier aplicación del proyecto, tiene que estar añadida la aplicación a INSTALLED_APPS, creamos los siguientes ficheros:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;management/__init__.py&lt;/li&gt;&lt;li&gt;management/commands/__init__.py&lt;/li&gt;&lt;li&gt;management/commands/hello_world.py&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Los ficheros __init__.py están vacíos, y en&amp;nbsp;&lt;i&gt;"management/commands/hello_world.py"&lt;/i&gt;&amp;nbsp;copiamos el siguiente código.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from django.core.management.base import BaseCommand&lt;br /&gt;&lt;br /&gt;class Command(BaseCommand):&lt;br /&gt;    help = 'check unchecked votes'&lt;br /&gt;&lt;br /&gt;    def handle(self, *args, **options):&lt;br /&gt;        print "Hello world!"&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para ejecutar el script, hay que ir al directorio principal del proyecto y ejecutar en el terminal:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py hello_world&lt;/code&gt;&lt;/pre&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Este ejemplo es muy simple, y no usa los modelos de django, pero vale para ver como es la estructura de un subcomando. En el fichero que contiene el código del subcomando, se pueden importar los modelos como en cualquier otro fichero del proyecto.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from myproject.myapp.models import Model&lt;/code&gt;&lt;/pre&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo que nos permite generar scripts que interactúen con los modelos creados en nuestro proyecto y usar la metodología de django para trabajar con la base de datos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-4360764931808604765?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/4360764931808604765/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-script-en-django.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/4360764931808604765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/4360764931808604765'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-script-en-django.html' title='Nota: Script en Django'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-4205193884967201345</id><published>2010-06-24T22:36:00.000-07:00</published><updated>2010-06-24T22:37:10.895-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota: Tutoriales oficiales de django</title><content type='html'>En la página web de &lt;a href="http://www.djangoproject.com/"&gt;django&lt;/a&gt; hay una gran variedad de tutoriales.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.djangoproject.com/wiki/Tutorials"&gt;http://code.djangoproject.com/wiki/Tutorials&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-4205193884967201345?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/4205193884967201345/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-tutoriales-oficiales-de-django.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/4205193884967201345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/4205193884967201345'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-tutoriales-oficiales-de-django.html' title='Nota: Tutoriales oficiales de django'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-1704652789395791342</id><published>2010-06-22T23:08:00.000-07:00</published><updated>2010-06-22T23:08:28.905-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>nota: lista vacía en python</title><content type='html'>Comprobación de lista vacía:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;a = []&lt;br /&gt;if not a:&lt;br /&gt;    print "list is empty"&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-1704652789395791342?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/1704652789395791342/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-lista-vacia-en-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1704652789395791342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1704652789395791342'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/nota-lista-vacia-en-python.html' title='nota: lista vacía en python'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-3114159180489400639</id><published>2010-06-09T01:17:00.000-07:00</published><updated>2010-06-09T01:17:37.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='pygtk'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Usando path relativos para los templates de Django</title><content type='html'>En el archivo settings.py, es necesario indicar donde se encuentran los templates con su path absoluto:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;TEMPLATE_DIRS = (&lt;br /&gt;    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".&lt;br /&gt;    # Always use forward slashes, even on Windows.&lt;br /&gt;    # Don't forget to use absolute paths, not relative paths.&lt;br /&gt;)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Teniendo en cuenta que es código python, podemos hacer que esos paths se calculen a partir de paths relativos. Veamos como.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es necesario incluir el siguiente código en el fichero settings.py&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import os&lt;br /&gt;PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Una vez añadido este código al fichero, ya podemos indicar el template de forma relativa. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;TEMPLATE_DIRS = (&lt;br /&gt;os.path.join(PROJECT_PATH, 'templates')&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-3114159180489400639?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/3114159180489400639/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/usando-path-relativos-para-los.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3114159180489400639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3114159180489400639'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/usando-path-relativos-para-los.html' title='Usando path relativos para los templates de Django'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-7624403494034479706</id><published>2010-06-01T03:28:00.000-07:00</published><updated>2010-06-01T08:15:38.630-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='south'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Notas: Mini tutorial Django South</title><content type='html'>&lt;a href="http://south.aeracode.org/"&gt;South&lt;/a&gt; permite hacer migraciones de aplicaciones Django. El principal objetivo de este mini tutorial, es mostrar como south nos proporciona una capa que nos permite cambiar los modelos en las aplicaciones django y mantener la informanción introducida anteriormente.&lt;br /&gt;&lt;br /&gt;Página oficial del módulo:&lt;br /&gt;&lt;a href="http://south.aeracode.org/"&gt;http://south.aeracode.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para instalar el módulo, yo lo he hecho, a través de easy_install.&lt;br /&gt;&lt;br /&gt;Si no tienes instalado la herramienta de instalción, se instala con:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;sudo apt-get install python-setuptools&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;y para instalar el módulo de south:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;sudo easy_install South&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este mini tutorial, está basado en el &lt;a href="http://south.aeracode.org/docs/tutorial/index.html"&gt;tutorial oficial&lt;/a&gt; que se puede encontrar en la página de South. Es muy importante seguir el orden en que se sincroniza la base de datos. Si no se hace en el orden correcto, pueden aparecer errores.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://south.aeracode.org/docs/tutorial/index.html"&gt;http://south.aeracode.org/docs/tutorial/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://south.aeracode.org/docs/tutorial/index.html"&gt;&lt;/a&gt;Creamos un proyecto nuevo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;django-admin startproject demosouth&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora, hay que configurar la base de datos que va a usar django. Yo he usado sqlite, ya que para estos ejemplos sencillos, me parece la opción más simple. (Ver como hacerlo &lt;a href="http://pablogplanet.blogspot.com/2010/05/django-es-un-framework-de-desarrollo.html"&gt;aquí&lt;/a&gt;). También incluimos la applicacion 'south' en INSTALLED_APPS. He comentado el resto de aplicaciones que vienen por defecto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuación se sincroniza la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;./manage.py syncdb&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Ahorar creamos una aplicación sobre la que trabajar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;./manage.py startapp southtut&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Editamos el fichero southtut/models.py y añadimos la siguiente clase:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Knight(models.Model):&lt;br /&gt;    name = models.CharField(max_length=100)&lt;br /&gt;    of_the_round_table = models.BooleanField()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Añadimos la aplicación southtut a INSTALLES_APPS. Ahora &lt;b&gt;no sincronizamos&lt;/b&gt; la base de datos, en vez de eso, creamos una migración,&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;./manage.py schemamigration southtut –-initial&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;y la aplicamos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;./manage.py migrate southtut&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al aplicar la migración, se ha generado la tabla correspondiente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para ver como no afecta los cambios en modelos de django en la la información introducida con anterioridad, es necesario que las tablas de la base de datos contengan información. Se puede hacer mediante&amp;nbsp;&lt;i&gt;"./manage.py shell"&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;o directamente en la base de datos. Al haber usado sqlite, se puede usar la herramienta sqlitemanager para introducir datos en la tabla.&lt;br /&gt;&lt;br /&gt;A continuación se va a modificar el modelo. El principal objetivo de este tutorial, es aprender a modificar un modelo de django y que los datos que estaban almacenados con anterioridad, no se pierdan. Editamos southtut/models.py.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Knight(models.Model):&lt;br /&gt;    name = models.CharField(max_length=100)&lt;br /&gt;    of_the_round_table = models.BooleanField()&lt;br /&gt;    dances_whenever_able = models.BooleanField()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora creamos una migración nueva. Esta migración contiene las modificaciones que se han hecho en los modelos, pero todavía no se han visto reflejadas en las tablas de la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;./manage.py schemamigration southtut –-auto&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;y la aplicamos&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;./manage.py migrate southtut&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al aplicar la migración, la tabla referente al modelo que se ha cambiado reflejará dichos cambios. Si ahora comprobamos los valores de la base de datos, mediante sqlitemanager en nuestro ejemplo, vemos que se mantienen los datos que hemos introducido anteriormente, pero se ha añadido una nueva columna a la tabla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-7624403494034479706?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/7624403494034479706/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/notas-mini-tutorial-django-south.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7624403494034479706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7624403494034479706'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/06/notas-mini-tutorial-django-south.html' title='Notas: Mini tutorial Django South'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-6905634022719270054</id><published>2010-05-14T09:17:00.000-07:00</published><updated>2010-05-14T09:19:48.993-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='varios'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota: git hosting</title><content type='html'>Git es un software de sistema de control de versiones distribuido. Los servicios de git hosting permiten, como su nombre indica, hospedar repositorios de git.&lt;br /&gt;&lt;br /&gt;He encontrado dos servicios que tienen buena pinta:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/"&gt;github.com&lt;/a&gt; &amp;nbsp; Este parece bastante serio. Por ejemplo tiene el repositorio de Ruby on Rails. La única pega que he encontrado, es que la versión gratuita no tiene proyectos privados. Está orientado al software colaborativo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codaset.com/"&gt;codaset.com&lt;/a&gt;&amp;nbsp;tiene unas características parecidas al anterior. Está pensado para software libre. Además, es gratuito y te permite controlar la privacidad de tu proyecto. Público, semipúblico o privado son las opciones de privacidad de los proyectos. A parte del repositorio propimente dicho, tiene un web presenta el estado del proyecto, un blog, una wiki, un sistema de tickes...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-6905634022719270054?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/6905634022719270054/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-git-hosting.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/6905634022719270054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/6905634022719270054'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-git-hosting.html' title='Nota: git hosting'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-3435919920951408449</id><published>2010-05-11T09:14:00.000-07:00</published><updated>2010-06-02T01:59:39.455-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota Django. Crear una página de comentarios</title><content type='html'>Este post es la continuación de otros post que he realizado sobre el framework Django.&amp;nbsp;En este post voy a poner un pequeño ejemplo de como se haría una página de comentarios. Creo que es bastante ilustrativo porque toca temas importantes de django. Maneja la base de datos (&lt;i&gt;SQLite3&lt;/i&gt; en nuestro ejemplo) a través de los modelos de django, se usan plantillas (&lt;i&gt;template&lt;/i&gt;) con el gestor de plantillas de django, se genera una página a partir de plantillas en las cual se escriben registros almacenados en la base de datos y se leen datos de un formulario que incluye esa misma página.&lt;br /&gt;&lt;br /&gt;Lo primero que hay que hacer es crear el proyecto de django.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;django-admin startproject commentweb&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Creamos una app que va a tener el modelo que gestiona los comentarios que se almacenan en la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py startapp comments&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Añadimos el modelo dentro de &lt;i&gt;commentweb/commments/models.py.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from django.db import models&lt;br /&gt;# Create your models here.&lt;br /&gt;class Comment(models.Model):&lt;br /&gt;    title = models.CharField(max_length = 20)&lt;br /&gt;    date = models.DateTimeField()&lt;br /&gt;    text = models.TextField(blank = True)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;El modelo consta de tres campos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;title: título del comentario.&lt;/li&gt;&lt;li&gt;date: fecha de la publicación.&lt;/li&gt;&lt;li&gt;text: contenido del comentario.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Ahora hay que modificar el archivo &lt;i&gt;settings.py&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Base de datos&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.&lt;br /&gt;DATABASE_NAME = 'comments.sqlite'             # Or path to database file if using sqlite3.&lt;br /&gt;DATABASE_USER = ''             # Not used with sqlite3.&lt;br /&gt;DATABASE_PASSWORD = ''         # Not used with sqlite3.&lt;br /&gt;DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.&lt;br /&gt;DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Zona horaria. Se puede consultar en &lt;a href="http://en.wikipedia.org/wiki/List_of_tz_zones_by_name"&gt;http://en.wikipedia.org/wiki/List_of_tz_zones_by_name&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;TIME_ZONE = 'Europe/Madrid'&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Añadimos el path donde se almacenan los &lt;i&gt;templates&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;TEMPLATE_DIRS = (&lt;br /&gt;    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".&lt;br /&gt;    # Always use forward slashes, even on Windows.&lt;br /&gt;    # Don't forget to use absolute paths, not relative paths.&lt;br /&gt;    "/home/user/djangoprojects/commentweb/templates",&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aplicaciones disponibles. He borrado las que vienen por defecto y he añadido la que hemos creado.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;INSTALLED_APPS = (&lt;br /&gt;    'commentweb.comments',&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A continuación sincronizamos la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py syncdb&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nos inidica que hemos creado una nueva tabla&lt;br /&gt;&lt;br /&gt;Nuestra página web va a tener dos direcciones, por lo tanto debemos editar el fichero &lt;i&gt;commentweb/urls.py&lt;/i&gt; para añadirlas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from django.conf.urls.defaults import *&lt;br /&gt;from commentweb.comments.views import save&lt;br /&gt;from commentweb.comments.views import comments&lt;br /&gt;&lt;br /&gt;urlpatterns = patterns('',&lt;br /&gt;    (r'^comments/$', comments),&lt;br /&gt;    (r'^save/$', save)&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Vamos a crear las páginas &lt;i&gt;'/comments/'&lt;/i&gt; y &lt;i&gt;'/save/'&lt;/i&gt;. La página &lt;i&gt;'/comments/'&lt;/i&gt; mostrará los comentarios que hay almacenados en la base de datos. Además, tendrá un formulario que nos permita añadir nuevos comentarios. La página &lt;i&gt;'/save/'&lt;/i&gt;&amp;nbsp;almacena un comentario nuevo. Esta página se llama desde el formulario de la página anterior cuando se añade un nuevo comentario. Para gestionar estas páginas hay que crear las funciones comments y save en &lt;i&gt;commentweb/comments/views.py&lt;/i&gt;. Pero antes, vamos a crear los &lt;i&gt;templates&lt;/i&gt; que usan dichas funciones. En el directorio que hemos añadido anteriormente al archivo settings.py, vamos a crear el template &lt;i&gt;comments.html.&lt;/i&gt; A continuación muestro su contenido:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt; html&amp;gt;&lt;br /&gt;    &amp;lt; head&amp;gt;&lt;br /&gt;        &amp;lt; title&amp;gt;Comments&amp;lt; /title&amp;gt;&lt;br /&gt;    &amp;lt; /head&amp;gt;&lt;br /&gt;    &amp;lt; body&amp;gt;&lt;br /&gt;        &amp;lt; form method="post" action="/save/"&amp;gt;&lt;br /&gt;            Title&amp;lt; input type="text" size="20" maxlength="20" name="title"&amp;gt; &amp;lt; br /&amp;gt;&lt;br /&gt;            &amp;lt; textarea name="text" rows="4" cols="40"&amp;gt;&amp;lt; /textarea&amp;gt;&amp;lt; br/&amp;gt;&lt;br /&gt;            &amp;lt; input type="submit" value="Comment!"/&amp;gt;&lt;br /&gt;        &amp;lt; /form&amp;gt;&lt;br /&gt;        {% for comment in comment_list %}&lt;br /&gt;            &amp;lt; h2&amp;gt;{{comment.title}}&amp;lt; /h2&amp;gt;&lt;br /&gt;            &amp;lt; p&amp;gt;Date: {{comment.date}}&amp;lt; /p&amp;gt;&lt;br /&gt;            &amp;lt; p&amp;gt;{{comment.text}}&amp;lt; /p&amp;gt;&lt;br /&gt;        {% endfor %}&lt;br /&gt;    &amp;lt; /body&amp;gt;&lt;br /&gt;&amp;lt; /html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Nota&lt;/b&gt;: he dejado un espacio entre los caracteres '&amp;lt;' y la etiquetas para una correcta visualización en el blog. Cuando se use este fichero hay que eliminar dichos espacios.&lt;br /&gt;&lt;br /&gt;La plantilla anterior tiene dos partes fundamentales. La primera, es un formulario que permite añadir comentarios. De este formulario es importante el nombre del &lt;i&gt;textarea&lt;/i&gt; (&lt;i&gt;name="text"&lt;/i&gt;), el nombre de título (&lt;i&gt;name="title"&lt;/i&gt;) y que la acción que se ejecuta al pulsar el botón &lt;i&gt;"Comment!"&lt;/i&gt; (&lt;i&gt;action="/save/"&lt;/i&gt;) nos lleva a la página&lt;i&gt;&amp;nbsp;'/save/'&lt;/i&gt;.  La segunda, es una etiqueta de plantilla for que nos muestra todos los comentarios que están almacenados en la variable &lt;i&gt;comment_list&lt;/i&gt;.  A continuación se muestra el &lt;i&gt;template&lt;/i&gt; para la página save.html  &lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt; html&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt; head&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt; meta http-equiv="Refresh" content="2;url=../comments/"&amp;gt; &lt;br /&gt;&lt;br /&gt;    &amp;lt; /head&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt; body&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt; p&amp;gt;Su comentario ha sido guardado. &lt;br /&gt;Por favor esperar a ser redireccionado.&amp;lt; /p&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt; /body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt; /html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Nota&lt;/b&gt;: he dejado un espacio entre los caracteres '&amp;lt;' y la etiquetas para una correcta visualización en el blog. Cuando se use este fichero hay que eliminar dichos espacios.  Esta plantilla es muy simple. Nos muestra un mensaje diciendo que el comentario de ha guardado y pasado 2 segundos nos redirecciona otra vez a la página comments. El proceso en el que se guarda el comentario en la base de datos se realiza en la función que invoca este &lt;i&gt;template&lt;/i&gt; desde la vista.      A continuación, vamos a ver las funciones que generan las vistas.  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from commentweb.comments.models import Comment&lt;br /&gt;&lt;br /&gt;from django.shortcuts import render_to_response&lt;br /&gt;&lt;br /&gt;import datetime&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Create your views here.&lt;br /&gt;&lt;br /&gt;def comments(request):&lt;br /&gt;&lt;br /&gt;    comment_list = Comment.objects.all()&lt;br /&gt;&lt;br /&gt;    return render_to_response('comments.html', {'comment_list': comment_list})&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def save(request):&lt;br /&gt;&lt;br /&gt;    txt = request.POST["text"]&lt;br /&gt;&lt;br /&gt;    title = request.POST["title"]&lt;br /&gt;&lt;br /&gt;    comment = Comment()&lt;br /&gt;&lt;br /&gt;    comment.text = txt&lt;br /&gt;&lt;br /&gt;    comment.date = datetime.datetime.now()&lt;br /&gt;&lt;br /&gt;    comment.title = title&lt;br /&gt;&lt;br /&gt;    comment.save()&lt;br /&gt;&lt;br /&gt;    return render_to_response('save.html', None)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La funcion &lt;i&gt;comment&lt;/i&gt; obtiente una lista de todos los comentarios que hay en la base de datos. Esta función retorna la salida de la función &lt;i&gt;render_to_response &lt;/i&gt;que tiene dos parametros de entrada. El primero es el template con el que se crea la página. El segundo, es un diccionario que contiene los valores de las variables que hay en las plantillas. La clave del diccionario es una cadena que corresponde al nombre de la variable que usa el template ({{comment_list}} en este caso) y valor del diccionario, es el valor que la variable va a tomar durante la ejecución. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una vez realizado esto, nuestro ejemplo ya está terminado. Para poder comprobar su funcionamiento es necesario ejecutar el servidor de pruebas que trae django.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py runserver&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;la dirección de nuestra nueva página es:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://127.0.0.1:8000/comments/"&gt;http://127.0.0.1:8000/comments/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Una vez realizado todos los pasos anteriores, nuestra nueva página ya nos debería permitir introducir nuevos comentarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-3435919920951408449?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/3435919920951408449/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-django-crear-una-pagina-de.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3435919920951408449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3435919920951408449'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-django-crear-una-pagina-de.html' title='Nota Django. Crear una página de comentarios'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-3997890407085667474</id><published>2010-05-11T04:05:00.000-07:00</published><updated>2010-05-11T04:05:33.856-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nutilus'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota ubuntu: Mostrar el path en Nautilus</title><content type='html'>Por defecto, en ubuntu 10.04, nautilus muestra el path en el que nos encontramos mediante botones. Si queremos obtener el path como un texto, por ejemplo para copiarlo, simplemente hay teclear:&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;'Ctrl + l'&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-3997890407085667474?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/3997890407085667474/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-ubuntu-mostrar-el-path-en-nautilus.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3997890407085667474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3997890407085667474'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-ubuntu-mostrar-el-path-en-nautilus.html' title='Nota ubuntu: Mostrar el path en Nautilus'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-7855928289169334396</id><published>2010-05-10T09:03:00.000-07:00</published><updated>2010-05-11T02:03:05.669-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota Django: Intro II. Hello world 2.</title><content type='html'>Este post es la continuación de &lt;a href="http://pablogplanet.blogspot.com/2010/05/django-es-un-framework-de-desarrollo.html"&gt;Intro django I&lt;/a&gt;.&amp;nbsp;Ahora lo que vamos a ver es como poder leer la dirección que se escribe en el navegador y usar esos datos.&lt;br /&gt;&lt;br /&gt;Vamos a modificar el archivo urls.py y el archivo views.py para que cuando se escriba la dirección  en el navegador, podamos leer los datos introducidos. Es necesario crear una nueva página, por lo que es necesario modificar el archivo urls.py y crear una nueva vista.&lt;br /&gt;&lt;br /&gt;Vamos a crear la página&amp;nbsp;&lt;a href="http://127.0.0.1:8000/say/xxx"&gt;http://127.0.0.1:8000/say/xxx&lt;/a&gt;.&amp;nbsp;Donde 'xxx' es cualquier combinación de entre uno y veinte caracteres de logitud. Esta página mostrará el texto introducido ('xxx').&lt;br /&gt;&lt;br /&gt;Añadimos la nueva vista.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi views.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Editamos el archivo para que quede de la siguiente manera.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# Create your views here.&lt;br /&gt;from helloweb.textapp.models import Textmodel&lt;br /&gt;from django.http import HttpResponse&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def say_hello(request):&lt;br /&gt;    text = Textmodel.objects.get(pk = 1)&lt;br /&gt;    html = "%s" % text.content&lt;br /&gt;    return HttpResponse(html)&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;def say(request, txt): &lt;br /&gt;    html = "%s" % txt &lt;br /&gt;    return HttpResponse(html) &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Ahora vamos a editar el fichero helloweb/urls.py para que se pueda interpretar la nueva dirección.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi urls.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Añadimos la nueva dirección a&amp;nbsp;urlpatterns.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from django.conf.urls.defaults import * &lt;br /&gt;from helloweb.textapp.views import say_hello &lt;br /&gt;from helloweb.textapp.views import say &lt;br /&gt;&lt;br /&gt;# Uncomment the next two lines to enable the admin: &lt;br /&gt;# from django.contrib import admin &lt;br /&gt;# admin.autodiscover() &lt;br /&gt;&lt;br /&gt;urlpatterns = patterns('', &lt;br /&gt;    # (r'^admin/', include(admin.site.urls)), &lt;br /&gt;    (r'^hello/$', say_hello), &lt;br /&gt;    (r'^say/([a-z]{1,20})/$', say) &lt;br /&gt;) &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La expresión [a-z]{1,20} hace referencia a cualquier cadena de caracteres entre la a y la z (sólo minúsculas) con una longitud de entre 1 y 20 caracteres. Para más información sobre las expresiones regulares (o regexes). Enlace: &lt;a href="http://docs.python.org/library/re.html#re-syntax"&gt;http://docs.python.org/library/re.html#re-syntax&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Una vez modificados los archivos, ejecutamos el servidor de pruebas que trae django.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py runserver&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ponemos la siguiente dirección en el navegador para comprobar que todo funciona.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://127.0.0.1:8000/say/hello"&gt;http://127.0.0.1:8000/say/hello&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El navegador nos debe mostrar el texto 'hello' en el contenido de la página. Podemos cambiar el texto 'hello' en la barra de direcciones por cualquier otro texto de entre uno y veinte caracteres en minúsculas, y esa nueva cadena es la que aparecerá en el contenido de la página.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Plantillas de Django &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el ejemplo anterior, el html se generó directamente con python. Esto no es muy conveniente y que el diseño de la página está empotrada en su programación. Lo adecuado es hacerlo de forma separada. Django tiene un sistema de plantillas (templates) que permite separar la parte de programción en django y la parte de diseño web.&lt;br /&gt;&lt;br /&gt;A continuación vamos a modificar la función &lt;i&gt;say&lt;/i&gt;, para que en vez de escrbir directamente el html, se extaraiga de una plantilla y los datos que queramos introducir en la página, los proporcione django.&lt;br /&gt;&lt;br /&gt;Lo primero que hay que hacer es crear una plantilla. La voy a guardar como helloweb/templates/say_template.html&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi template.html&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Añadir el siguiente código html al archivo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt; &amp;lt; html &amp;gt;&lt;br /&gt;    &amp;lt; head &amp;gt;&lt;br /&gt;        &amp;lt; title &amp;gt;Say page!!!&amp;lt; /title &amp;gt;&lt;br /&gt;    &amp;lt; /head &amp;gt;&lt;br /&gt;    &amp;lt; body &amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt; h1 &amp;gt;Say page.&amp;lt; /h1 &amp;gt;&lt;br /&gt;        &amp;lt; p &amp;gt;you say: {{ text }}.&amp;lt; /p &amp;gt;&lt;br /&gt;    &amp;lt; /body &amp;gt;&lt;br /&gt;&amp;lt; /html &amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;He dejado espacio entre las etiquetas html para que se vea correctamente en el blog pero en nuestro ejemplo no hay que dejar espacios entre los caracteres '&amp;lt;', '&amp;gt;' y las etiquetas.&lt;br /&gt;&lt;br /&gt;El texto {{ text }} es una variable, y por lo tanto, este texto se reemplazará por un valor durante la ejecución.&lt;br /&gt;&lt;br /&gt;A la hora de usar un template en django dentro de un proyecto, es necesario añadir el path donde se encuentra el template al fichero helloweb/settings.py. Las rutas hay que ponerlas de forma absoluta, es decir, partiendo de '/'. A continuación pongo lo que hay que variar en el archivo settings.py para añadir un directorio de templates.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;TEMPLATE_DIRS = (&lt;br /&gt;    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".&lt;br /&gt;    # Always use forward slashes, even on Windows.&lt;br /&gt;    # Don't forget to use absolute paths, not relative paths.&lt;br /&gt;    '/home/user/djangoprojects/helloweb/templates',&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Nota: Es importante poner la coma al final de la cadena, ya que es una tupla.&lt;br /&gt;&lt;br /&gt;Una vez hecho esto ya se han añadido los templates que estén en ese directorio al proyecto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuación hay que modificar la función &lt;i&gt;say&lt;/i&gt; del archivo helloweb/textapp/views.py para leer el template y añadir a dicho template las variables deseadas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi views.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Modificamos la función &lt;i&gt;say&lt;/i&gt; e importamos los módulos necesarios. Pongo el fichero views.py entero con las modificaciones necesarias para el uso del template.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# Create your views here.&lt;br /&gt;from helloweb.textapp.models import Textmodel&lt;br /&gt;from django.http import HttpResponse&lt;br /&gt;from django.template.loader import get_template&lt;br /&gt;from django import template&lt;br /&gt;&lt;br /&gt;def say_hello(request):&lt;br /&gt;    text = Textmodel.objects.get(pk = 1)&lt;br /&gt;    html = "%s" % text.content&lt;br /&gt;    return HttpResponse(html)&lt;br /&gt;&lt;br /&gt;def say(request, txt):&lt;br /&gt;    t = get_template('say_template.html')&lt;br /&gt;    c = template.Context({'text': txt})&lt;br /&gt;    html = t.render(c)&lt;br /&gt;    return HttpResponse(html)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En la funcion &lt;i&gt;say&lt;/i&gt;, hemos creado el template&lt;i&gt; 't'&lt;/i&gt; a partir de la plantilla &lt;i&gt;'say_template.html'.&lt;/i&gt; Este fichero tiene que estar en el directorio que hemos añadido a settings.py. Después, se ha creado el contexto&lt;i&gt; 'c' &lt;/i&gt;que contine el diccionario con la variable 'text', a la cual le daremos el valor de la variable 'txt' durante la ejecución.&lt;br /&gt;&lt;br /&gt;Al poner la dirección &lt;a href="http://127.0.0.1:8000/say/hello"&gt;http://127.0.0.1:8000/say/hello&lt;/a&gt; en el navegador, nos mostrará el contenido de la plantilla pero con el valor actual de la variable {{text}}, es decrir 'hello'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-7855928289169334396?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/7855928289169334396/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-django-intro-i-hello-world.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7855928289169334396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7855928289169334396'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-django-intro-i-hello-world.html' title='Nota Django: Intro II. Hello world 2.'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-3762188027509030914</id><published>2010-05-06T09:48:00.000-07:00</published><updated>2010-05-11T02:38:24.368-07:00</updated><title type='text'>Nota Django. Intro I. Hello world!!</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Intro&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Django es un framework de desarrollo web de código abierto, escrito en Python, que cumple en cierta medida el paradigma del Modelo Vista Controlador.&lt;/i&gt; &lt;a href="http://es.wikipedia.org/wiki/Django"&gt;http://es.wikipedia.org/wiki/Django&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voy a hacer un pequeño ejemplo en django. No es una explicación muy detallada del funcionamiento de django, sino más bien un “hello world!” un poco más desarrollado. &lt;br /&gt;Doy por hecho unos conocimientos mínimos de python y estar familirizado con lo que es django.&lt;br /&gt;Si no es así recomiendo echar primero un vistazo a la documentación.&lt;br /&gt;Django a primera vista. (Django at a glance)  &lt;a href="http://docs.djangoproject.com/en/dev/intro/overview/"&gt;http://docs.djangoproject.com/en/dev/intro/overview/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Estoy aprendiendo a usar django y por lo tanto puede que haya algún error. Si ves algo que crees que no es correcto, por favor déjame un comentario.&lt;br /&gt;&lt;br /&gt;Para hecer este ejemplo he usado las siguientes referencias. &lt;br /&gt;&lt;br /&gt;El libro de django:&lt;br /&gt;&lt;a href="http://www.djangobook.com/"&gt;http://www.djangobook.com&lt;/a&gt;&lt;br /&gt;concretamente la traducción que hay en la siguiente página http://trac.usla.org.ar/django-book&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Escribiendo tu primer app django (Writing your first Django app)&lt;br /&gt;&lt;a href="http://docs.djangoproject.com/en/dev/intro/tutorial01/"&gt;http://docs.djangoproject.com/en/dev/intro/tutorial01/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.djangoproject.com/en/dev/intro/tutorial02/"&gt;http://docs.djangoproject.com/en/dev/intro/tutorial02/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.djangoproject.com/en/dev/intro/tutorial03/"&gt;http://docs.djangoproject.com/en/dev/intro/tutorial03/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.djangoproject.com/en/dev/intro/tutorial04/"&gt;http://docs.djangoproject.com/en/dev/intro/tutorial04/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;screencast de la creación de una wiki en django&lt;br /&gt;&lt;a href="http://pablogplanet.blogspot.com/2010/05/nota-django-screencast-crear-una-wiki.html"&gt;http://pablogplanet.blogspot.com/2010/05/nota-django-screencast-crear-una-wiki.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;He hecho este ejemplo en ubuntu 10.04 Lucid Lynx. &lt;br /&gt;&lt;br /&gt;Lo primero que hay que hacer es comprobar que está instalado django. Doy por por hecho que python ya está instalado. La manera mas sencilla para comprobar si está instaldo django es mediante el interprete de comandos de python. Hay que abrir un terminal y entrar en el interprete de python. Un a vez dentro del interprete de comandos tecleamos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import django&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Si no hay ningún error, django está instaldo correctamente. Si no se tiene instalado se puede instalar directamente de los repositorios con el siguiente comando:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;sudo apt-get install python-django&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Crear el proyecto.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para crear un proyecto hay ejecutar desde el dierectorio donde se quiere crear el proyecto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;django-admin.py startproject helloweb&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al ejecutar el comando anterior se crea un directorio helloweb.&lt;br /&gt;&lt;br /&gt;El archivo django-admin.py debe estar en el path, si no es así se debe añadir. En mi ordenador se encuentra en: “/usr/lib/python-django/bin”&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una vez ejecutado el comando anterior, comprobar que se han creado correctamente los siguientes archivos:&lt;br /&gt;&lt;br /&gt;helloweb/&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;__init__.py&lt;/li&gt;&lt;li&gt;manage.py&lt;/li&gt;&lt;li&gt;settings.py&lt;/li&gt;&lt;li&gt;urls.py&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;__init__.py: Indica que el directorio es un módulo de python (&lt;a href="http://docs.python.org/tutorial/modules.html#packages"&gt;http://docs.python.org/tutorial/modules.html#packages&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;manage.py Permite interactuar con el proyecto. Más información   (&lt;a href="http://docs.djangoproject.com/en/dev/ref/django-admin/#ref-django-admin"&gt;http://docs.djangoproject.com/en/dev/ref/django-admin/#ref-django-admin&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;settings.py: Configuración del proyecto (&lt;a href="http://docs.djangoproject.com/en/dev/topics/settings/#topics-settings"&gt;http://docs.djangoproject.com/en/dev/topics/settings/#topics-settings&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;urls.py: Declaración de urls para el proyecto (&lt;a href="http://docs.djangoproject.com/en/dev/topics/http/urls/#topics-http-urls"&gt;http://docs.djangoproject.com/en/dev/topics/http/urls/#topics-http-urls&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Servidor web de pruebas&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para comprobar el funcionamiento de nuestro proyecto, django proporciona un pequeño servidor. Este servidor sólo se debe usar para pruebas y nunca como servidor comercial.&lt;br /&gt;&lt;br /&gt;Para iniciar el servidor ejecutar el siguiente comando desde el directorio helloweb:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py runserver&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Si todo ha funcionado correctamente, se debería ver el siguiente mensaje:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Validating models...&lt;br /&gt;0 errors found.&lt;br /&gt;&lt;br /&gt;Django version 1.0, using settings 'mysite.settings'&lt;br /&gt;Development server is running at http://127.0.0.1:8000/&lt;br /&gt;Quit the server with CONTROL-C.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para comprobar que el servidor fuciona correctamente ir a la siguiente dirección:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://127.0.0.1:8000/"&gt;http://127.0.0.1:8000/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Salir de la aplicación del servidor de pruebas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Configuración de la base de datos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para este ejemplo se va a usar la base de datos sqlite. Las base de datos sqlite, es una base de datos muy simple que nos permite probar este ejemplo sin la necesidad de instalar nada mas. Al usar esta base de datos, se creará un fichero que contendrá toda la información. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html"&gt;http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hay que editar el fichero helloweb/settings.py y configurar la base de datos que va a usar nuestro proyecto. En nuestro caso vamos a usar una BD SQLite&lt;br /&gt;&lt;br /&gt;Abrir el fichero con el editor que estés más cómodo. Yo uso habitualmente el editor vi. Cuando en este ejemplo pongo que se edite un archivo pondré vi y el nombre del archivo, como a continuación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi settings.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Rellenar los siguientes datos relacionados con la base de datos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. &lt;br /&gt;DATABASE_NAME = 'helloweb.sqlite'             # Or path to database file if using sqlite3. &lt;br /&gt;DATABASE_USER = ''             # Not used with sqlite3. &lt;br /&gt;DATABASE_PASSWORD = ''         # Not used with sqlite3. &lt;br /&gt;DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3. &lt;br /&gt;DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3. &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al indicar DATABASE_NAME = 'helloweb.sqlite', se creará el fichero 'helloweb.sqlite' en el directorio del proyecto. Este fichero se puede visualizar con &lt;a href="http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html"&gt;sqlitemanager&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Crear un módelo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para crear una app nueva.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py startapp textapp&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al crear esta app se crea un directorio con el mismo nombre. Dentro de este direcctorio se habrá creado un fichero llamado models.py (helloweb/textapp/models.py) que es donde vamos a crear nuestro modelo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi models.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Copiamos el siguiente modelo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from django.db import models&lt;br /&gt;&lt;br /&gt;# Create your models here.&lt;br /&gt;&lt;br /&gt;class Textmodel(models.Model):&lt;br /&gt;    content = models.CharField(max_length=20)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Sincronizar la Base de Datos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora hay que sincronizar la base de datos. Para que sincronice correctamente, el primer paso que hay que hacer el añadir la app que acabamos de crear. Abrimos helloweb/settings.py&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi settings.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Vamos a la parte final del archivo donde está INSTALLED_APPS. Borramos 'django.contrib.auth' ya que no se va a usar en este ejemplo. Además añadimos nuestra app.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;INSTALLED_APPS = (&lt;br /&gt;    'django.contrib.contenttypes',&lt;br /&gt;    'django.contrib.sessions',&lt;br /&gt;    'django.contrib.sites',&lt;br /&gt;    'helloweb.textapp'&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A continuación sincronizamos la Base de Datos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py syncdb&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al realizar este proceso se habrá creado el fichero de la Base de Datos (helloweb/helloweb.sqlite). Si se quiere se puede visualizar este fichero en sqlitemanager y comprobar que se han creado las tablas correspondientes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Usando los modelos desde la consola&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a ver como se puede hacer uso de los modelos en django. Esto nos permite interactuar con la base de datos de una manera muy sencilla. Para abrir la consola interprete de comandos ejecutamos es siguiente comando:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py shell&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Al ejecutar este comando ya hemos entrado en la consola y ha añadido al path nuestro poryecto. Ahora vamos a ver como se pueden usar los modelos. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;In [1]: from helloweb.textapp.models import Textmodel&lt;br /&gt;&lt;br /&gt;In [2]: t = Textmodel()&lt;br /&gt;&lt;br /&gt;In [3]: t.content = 'Hello world'&lt;br /&gt;&lt;br /&gt;In [4]: print t.content&lt;br /&gt;Hello world&lt;br /&gt;&lt;br /&gt;In [5]: t.save()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Salimos del interprete. ctrl+d. Si volvemos a abrir la base de datos con sqlitemanager, podemos comprobar que se ha creado un nuevo registro en la tabla “textapp_textmodel” con el texto que hemos introducido en el interprete de comando. Ahora volvemos a abrir el interprete de comandos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py shell&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Vamos a leer un objeto del modelo. Usamos la clave primaria para obtenerlo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;In [1]: from helloweb.textapp.models import Textmodel&lt;br /&gt;&lt;br /&gt;In [2]: t = Textmodel.objects.get(pk=1)&lt;br /&gt;&lt;br /&gt;In [3]: print t.content&lt;br /&gt;Hello world&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como podemos observar estos datos están almacenados en la BD por lo que aunque se cierre el interprete, estos datos están disponibles.&lt;br /&gt;&lt;br /&gt;Si ahora imprimimos el objeto “t” obtenemos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;In [4]: print t&lt;br /&gt;Textmodel object&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Si queremos que nos de un resultado más inteligible, hay que añadir la función __unicode__ al modelo. Cerramos el interprete de comando y abrimos helloweb/textapp/models.py&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi models.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Lo editamos para que quede de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from django.db import models&lt;br /&gt;&lt;br /&gt;# Create your models here.&lt;br /&gt;&lt;br /&gt;class Textmodel(models.Model):&lt;br /&gt;    content = models.CharField(max_length=20)&lt;br /&gt;&lt;br /&gt;    def __unicode__(self):&lt;br /&gt;        return 'content:"%s"' % self.content&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Mapeando URLs a Vistas&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a añadir una vista y modificar urls.py a para poder crear la página hello world.&lt;br /&gt;&lt;br /&gt;Estos dos pasos se pueden hacer en orden invertido pero para que funcione correctamente se necesita que los dos se hayan ejecutado de forma correcta.&lt;br /&gt;&lt;br /&gt;Vamos a editar el fichero helloweb/textapp/views.py y vamos a añadir la función “say_hello”.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi views.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Lo editamos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# Create your views here.&lt;br /&gt;from helloweb.textapp.models import Textmodel&lt;br /&gt;from django.http import HttpResponse&lt;br /&gt;&lt;br /&gt;def say_hello(request):&lt;br /&gt;    text = Textmodel.objects.get(pk = 1)&lt;br /&gt;    html = "%s" % text.content&lt;br /&gt;    return HttpResponse(html)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Hemos añadido la fución e importado los módulos necesarios. Esta función lee un módelo y genera como salida una página html. No es un ejemplo muy útil ya que la forma de leer el objeto es mediante un  número literal. En lo único que hay que fijarse en este ejemplo es que desde las vistas tenemos acceso a los modelos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a editar helloweb/urls.py&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;vi urls.py&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Vamos a añdir una nueva tupla a urlpatterns.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;from django.conf.urls.defaults import *&lt;br /&gt;from helloweb.textapp.views import say_hello&lt;br /&gt;&lt;br /&gt;# Uncomment the next two lines to enable the admin:&lt;br /&gt;# from django.contrib import admin&lt;br /&gt;# admin.autodiscover()&lt;br /&gt;&lt;br /&gt;urlpatterns = patterns('',&lt;br /&gt;    # (r'^admin/', include(admin.site.urls)),&lt;br /&gt;    (r'^hello/$', say_hello)&lt;br /&gt;)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Esta tupla lo que indica es que cuando se ponga la dirección hello/ en el explorador, se va a ejecutar la función say_hello  de la vista.  &lt;br /&gt;&lt;br /&gt;Para comprobar su funcionamiento es necesario que el servidor se esté ejecutando.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;python manage.py runserver&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A continuación se pone  la siguiente dirección en el explorador:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://127.0.0.1:8000/hello/"&gt;http://127.0.0.1:8000/hello/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si todo ha salido correctamente, debería aparecer una página con el texto "Hello world".&lt;br /&gt;&lt;br /&gt;Si se desea modificar algún fichero de los anteriores, no es necesario reiniciar el servidor, ya que este reconoce los cambios y los actualiza automáticamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-3762188027509030914?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/3762188027509030914/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/django-es-un-framework-de-desarrollo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3762188027509030914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3762188027509030914'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/django-es-un-framework-de-desarrollo.html' title='Nota Django. Intro I. Hello world!!'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-9163910696349400189</id><published>2010-05-06T03:25:00.000-07:00</published><updated>2010-05-06T03:25:48.046-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota Django: Screencast. Crear una Wiki en 20 min</title><content type='html'>Screencast de django.&lt;br /&gt;En este ejemplo, &lt;a href="http://showmedo.com/videotutorials/?author=1982"&gt;Siddhi&lt;/a&gt; nos muestra como crear una wiki con django en 20 minutos.&lt;br /&gt;&lt;a href="http://showmedo.com/videotutorials/video?name=1100000&amp;amp;fromSeriesID=110"&gt;http://showmedo.com/videotutorials/video?name=1100000&amp;amp;fromSeriesID=110&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object data="http://showmedo.com/static/flowplayer/flowplayer-3.1.5.swf" height="344" id="_332" type="application/x-shockwave-flash" width="425"&gt;&lt;param name="movie" value="http://showmedo.com/static/flowplayer/flowplayer-3.1.5.swf" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="flashvars" value='config={&amp;quot;key&amp;quot;:&amp;quot;#$824e5316466b69d76dc&amp;quot;,&amp;quot;logo&amp;quot;:{&amp;quot;url&amp;quot;:&amp;quot;http://showmedo.com/static/images/showmedo_logo_vp.png&amp;quot;,&amp;quot;fullscreenOnly&amp;quot;:false,&amp;quot;top&amp;quot;:20,&amp;quot;right&amp;quot;:20,&amp;quot;opacity&amp;quot;:0.5,&amp;quot;displayTime&amp;quot;:0,&amp;quot;linkUrl&amp;quot;:&amp;quot;http://showmedo.com&amp;quot;},&amp;quot;clip&amp;quot;:{&amp;quot;baseUrl&amp;quot;:&amp;quot;http://showmedo.com&amp;quot;,&amp;quot;autoPlay&amp;quot;:false,&amp;quot;autoBuffering&amp;quot;:true},&amp;quot;playlist&amp;quot;:[{&amp;quot;url&amp;quot;:&amp;quot;http://videos1.showmedo.com/ShowMeDos/1100000.flv&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;Learn Django: Create a Wiki in 20 minutes&amp;quot;,&amp;quot;baseUrl&amp;quot;:&amp;quot;http://showmedo.com&amp;quot;,&amp;quot;autoPlay&amp;quot;:false,&amp;quot;autoBuffering&amp;quot;:true}],&amp;quot;plugins&amp;quot;:{&amp;quot;controls&amp;quot;:{&amp;quot;url&amp;quot;:&amp;quot;http://showmedo.com/static/flowplayer/flowplayer.controls-3.1.5.swf&amp;quot;,&amp;quot;playlist&amp;quot;:true}}}' /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-9163910696349400189?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/9163910696349400189/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-django-screencast-crear-una-wiki.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/9163910696349400189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/9163910696349400189'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-django-screencast-crear-una-wiki.html' title='Nota Django: Screencast. Crear una Wiki en 20 min'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-2703600803299334930</id><published>2010-05-01T05:55:00.000-07:00</published><updated>2010-05-01T05:57:41.356-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Nota Android: Hard Reset y Android OS Monitor</title><content type='html'>Para realizar un reset hw y dejar el teléfono como viene de fábrica, hay dos maneras:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Marcando en el teléfono: *2767*3855#&lt;/li&gt;&lt;li&gt;LLamar + menú + colgar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;Android Os Monitor.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es una aplicación gratuita que se encuentra en el market que nos permite ver que tareas se están ejecutando en nuestro terminal, que conexiones hay abiertas, el estado de la batería...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-2703600803299334930?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/2703600803299334930/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-android-hard-reset-y-android-os.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/2703600803299334930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/2703600803299334930'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/05/nota-android-hard-reset-y-android-os.html' title='Nota Android: Hard Reset y Android OS Monitor'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-2138442158638182447</id><published>2010-04-29T09:59:00.000-07:00</published><updated>2010-04-29T10:01:06.790-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gobject'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Notas Python: GObject en Python</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;GObject, la clase base&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GObject, una clase que implementa todo lo básico, y que forma la base de todas las demás clases, tanto en GTK+ como en el resto de librerías de la plataforma GNOME.&lt;br /&gt;&lt;br /&gt;El lenguaje C no es un lenguaje preparado para POO, pero con un esfuerzo mínimo, y gracias al trabajo de los desarrolladores de GTK+, se puede usar en este lenguaje. Esto se consigue mediante el sistema de objetos de GLib (GObject), que, mediante el uso de las características del lenguaje C, ofrece la posibilidad de usar POO.&lt;br /&gt;&lt;br /&gt;Este sistema de objetos de GLib tiene algunas limitaciones propias del uso del lenguaje C (lenguaje no pensado para la POO), pero aun así, su funcionalidad es tal, que es más que probable que jamás se eche ninguna funcionalidad en falta. Dicha funcionalidad incluye:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;herencia, característica imprescindible de cualquier lenguaje orientado a objetos que se precie de serlo; permite la creación de clases que heredan la funcionalidad de otras clases ya existentes. Esto permite crear clases con la funcionalidad básica y, basadas en dicha clase, crear otras que añadan una funcionalidad más específica.&lt;/li&gt;&lt;li&gt;polimorfismo, que permite tratar a un mismo objeto bajo distintas personalidades.&lt;/li&gt;&lt;li&gt;interfaces, que permite la definición de interfaces (clases abstractas) y su posterior implementación en clases.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Python es un lenguaje orientado a objetos por lo que a primera vista se puede pensar que las librerías gobject no son necesarias pero, hay algunas características propias de gobject que son muy útiles cuando se está trabajando en GNOME. A continuación voy a poner las dos que para mi son mas importantes: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Señales, este mecanísmo permite conectar nuestro programa con su entorno. Es muy útil cuando se usa para comunicarse entre diferentes partes un mismo proyecto.&lt;/li&gt;&lt;li&gt;Notificaciones cuando se cambian las propiedades de la clase (properties). Permite “conectar” funciones (callback) que se ejecutan cuando una propiedad cambia.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Sub clases gobject en Python.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vamos a ver el proceso de creación de una subclase de GObject en Python.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Crear  propiedades nuevas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo primero que se hace es crear una clase “Car” que hereda de “gobject.GObject”. A continuación se crea el diccionario  __gproperties__. En este caso, este diccionario solamente tiene una propiedad “fuel”.&lt;br /&gt;En la funnción __init__ de nuestra clase, se inicializa el gobject con  “gobject.GObject.__init__(self)”, usa para registrar los métodos y señales que hayamos creado. &lt;br /&gt;Después se crean los métodos “do_get_property” y  “do_set_property” para leer y escribir en las “properties” respectivamente.&lt;br /&gt;Por último, se llama a la función gobject.type_register, con nustra clase como parámetro para registrar la clase como “official GType”, es necesario para que funcion correctamente.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import pygtk&lt;br /&gt;pygtk.require('2.0')&lt;br /&gt;import gobject&lt;br /&gt;&lt;br /&gt;class Car(gobject.GObject):&lt;br /&gt;    __gproperties__ = {&lt;br /&gt;        'fuel' : (gobject.TYPE_FLOAT, 'fuel of the car',&lt;br /&gt;                  'amount of fuel that remains in the tank',&lt;br /&gt;                  0, 60, 50, gobject.PARAM_READWRITE)# typ, nick name,\&lt;br /&gt;   description, minimum value, maximum value,default value, flags&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    def __init__(self):&lt;br /&gt;        gobject.GObject.__init__(self)&lt;br /&gt;        self.fuel = 50&lt;br /&gt;&lt;br /&gt;    def do_get_property(self, property):&lt;br /&gt;        if property.name == 'fuel':&lt;br /&gt;            return self.fuel&lt;br /&gt;        else:&lt;br /&gt;            raise AttributeError, 'unknown property %s' % property.name&lt;br /&gt;&lt;br /&gt;    def do_set_property(self, property, value):&lt;br /&gt;        if property.name == 'fuel':&lt;br /&gt;            self.fuel = value&lt;br /&gt;        else:&lt;br /&gt;            raise AttributeError, 'unknown property %s' % property.name&lt;br /&gt;&lt;br /&gt;gobject.type_register(Car)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;código procedente de  &lt;a href="http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm"&gt;http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Uso de las propiedades.&lt;/span&gt;&lt;br /&gt;Para tener usar los métodos de lectura y escritura que hemos creado anteriormente  (“do_get_property” y  “do_set_property”), se escriben “get_property” y “set_propertie” respectivamente. Ver el código de ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from car1 import Car&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; aCar = Car()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print "The car has %f of fuel at the beginning" % aCar.get_property('fuel')&lt;br /&gt;The car has 50.000000 of fuel at the beginning&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; aCar.set_property('fuel', 20)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print "Now the car has %f of fuel" % aCar.get_property('fuel')&lt;br /&gt;Now the car has 20.000000 of fuel&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;código procedente de&amp;nbsp;&lt;a href="http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm"&gt;http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A continiación se muestra como hacer que se cree una señal cuando se modifica una propiedad. En el primer ejemplo, la señal se genera cuando se modifica cualquier “property”.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import pygtk&lt;br /&gt;pygtk.require('2.0')&lt;br /&gt;import gobject&lt;br /&gt;&lt;br /&gt;from car1 import Car&lt;br /&gt;&lt;br /&gt;def myCallback(obj, property):&lt;br /&gt;    if property.name == 'fuel':&lt;br /&gt;        if obj.get_property('fuel') &amp;lt; 10:&lt;br /&gt;            print 'we are running out of fuel!!'&lt;br /&gt;            &lt;br /&gt;def test():&lt;br /&gt;    aCar = Car()&lt;br /&gt;    aCar.connect('notify', myCallback)&lt;br /&gt;    aCar.set_property('fuel', 5.0)&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    test()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En cambio en el segundo ejemplo, sólo se genera la señal cuando se modifica la “property” fuel.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import pygtk&lt;br /&gt;pygtk.require('2.0')&lt;br /&gt;import gobject&lt;br /&gt;from car1 import Car&lt;br /&gt;&lt;br /&gt;def myCallback(obj, property):&lt;br /&gt;    if obj.get_property('fuel') &amp;lt; 10: &lt;br /&gt;        print 'we are running out of fuel!!'&lt;br /&gt;&lt;br /&gt;def test():&lt;br /&gt;    aCar = Car()&lt;br /&gt;    aCar.connect('notify::fuel', myCallback) &lt;br /&gt;    aCar.set_property('fuel', 5.0)&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    test()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;código procedente de&amp;nbsp;&lt;a href="http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm"&gt;http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Aviso&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Si se usan nombres compuestos para las propiedades, cuado se definen en el diccionariop __gproperties__ se deben separar con el carácter '_' (background_color), pero en cambio, cuando se define y se usa el argumento de la clase, se debe hacer con el carácter '-'  (self.background-color).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Creación de señales propias con gobject.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Al crear una clase heredada de gobject se pueden crear señales para que una vez que creamos objetos de esa clase, se puedan conectar a las señales que hemos creado.&lt;br /&gt;&lt;br /&gt;A continuación voy a porner un ejemplo de la clase Car, creada antes, añadiendo una señal ('engine-started'). &lt;br /&gt;&lt;br /&gt;Es necesario crear un diccionario llamado __gsinals__, que contiene:&lt;br /&gt;El nombre de la señal como clave y&lt;br /&gt;los datos de configuración de la señal&lt;br /&gt;&lt;br /&gt;Para emitir la señal, se usa el método emit. Los parámetros de dicho método, son el nombre de la señal y, en este caso, la propiedad que hemos creado (fuel).&lt;br /&gt;&lt;br /&gt;El método do_engine_started, es opcional y se ejecuta cuando la señal se emite.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import pygtk&lt;br /&gt;pygtk.require('2.0')&lt;br /&gt;import gobject&lt;br /&gt;&lt;br /&gt;class Car(gobject.GObject):&lt;br /&gt;    __gproperties__ = {&lt;br /&gt;        'fuel' : (gobject.TYPE_FLOAT, 'fuel of the car',&lt;br /&gt;                  'amount of fuel that remains in the tank',&lt;br /&gt;                  0, 60, 50, gobject.PARAM_READWRITE)&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    __gsignals__ = {&lt;br /&gt;        'engine-started' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,&lt;br /&gt;                            (gobject.TYPE_FLOAT,))&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    def __init__(self):&lt;br /&gt;        gobject.GObject.__init__(self)&lt;br /&gt;        self.fuel = 50&lt;br /&gt;&lt;br /&gt;    def do_get_property(self, property):&lt;br /&gt;        if property.name == 'fuel':&lt;br /&gt;            return self.fuel&lt;br /&gt;        else:&lt;br /&gt;            raise AttributeError, 'unknown property %s' % property.name&lt;br /&gt;&lt;br /&gt;    def do_set_property(self, property, value):&lt;br /&gt;        if property.name == 'fuel':&lt;br /&gt;            self.fuel = value&lt;br /&gt;        else:&lt;br /&gt;            raise AttributeError, 'unknown property %s' % property.name&lt;br /&gt;&lt;br /&gt;    def do_engine_started(self, remaining_fuel):&lt;br /&gt;        print '***** Beginning of class closure *****'&lt;br /&gt;        print 'The engine is ready and we still have %f of fuel' % self.fuel&lt;br /&gt;        print '***** End of class closure *****'&lt;br /&gt;&lt;br /&gt;    def start(self):&lt;br /&gt;        self.emit('engine-started', self.get_property('fuel'))&lt;br /&gt;        &lt;br /&gt;gobject.type_register(Car)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;código procedente de&amp;nbsp;&lt;a href="http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm"&gt;http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Uso de las señales. Se muestra como podemos conectar un objeto de la clase que hemos creado a las señales que hemos definido:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import pygtk&lt;br /&gt;pygtk.require('2.0')&lt;br /&gt;import gobject&lt;br /&gt;&lt;br /&gt;from car4 import Car&lt;br /&gt;&lt;br /&gt;def myCallback(obj, remaining_fuel, data=None):&lt;br /&gt;    print '***** Beginning of User callback *****'&lt;br /&gt;    print 'The engine is starting and we still have %f of fuel' % remaining_fuel&lt;br /&gt;    print '***** End of User callback *****'&lt;br /&gt;&lt;br /&gt;def lastCallback(obj, remaining_fuel, data=None):&lt;br /&gt;    print '***** Callback connected with connect_after *****'&lt;br /&gt;    obj.set_property('fuel', remaining_fuel - 10)&lt;br /&gt;    print 'Now we have %f of fuel' % obj.get_property('fuel')&lt;br /&gt;    print '***** End of this callback *****'&lt;br /&gt;    &lt;br /&gt;def test():&lt;br /&gt;    aCar = Car()&lt;br /&gt;    aCar.connect('engine-started', myCallback)&lt;br /&gt;    aCar.connect_after('engine-started', lastCallback)&lt;br /&gt;&lt;br /&gt;    aCar.start()&lt;br /&gt;    &lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    test()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;código procedente de&amp;nbsp;&lt;a href="http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm"&gt;http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Documentación:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;python subclass&lt;br /&gt;&lt;a href="http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm"&gt;http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm&lt;/a&gt;&lt;br /&gt;gobject reference manual:&lt;br /&gt;&lt;a href="http://library.gnome.org/devel/gobject/stable/"&gt;http://library.gnome.org/devel/gobject/stable/&lt;/a&gt;&lt;br /&gt;glib:&lt;br /&gt;&lt;a href="http://www.es.gnome.org/Documentacion/Desarrollo/SistemaDeObjetosDeGlib"&gt;http://www.es.gnome.org/Documentacion/Desarrollo/SistemaDeObjetosDeGlib&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-2138442158638182447?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/2138442158638182447/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/notas-python-gobject-en-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/2138442158638182447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/2138442158638182447'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/notas-python-gobject-en-python.html' title='Notas Python: GObject en Python'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-7636770466710141965</id><published>2010-04-26T14:24:00.000-07:00</published><updated>2010-04-26T14:38:10.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='varios'/><title type='text'>Da un Aspecto Profesional a tu Blogspot. Blogger in Draft</title><content type='html'>En la Página de Blogger in Draft se puede leer lo siguiente:&lt;br /&gt;&lt;i&gt;"Blogger en borrador es una versión especial de Blogger en la que puedes probar nuevas funciones antes de su lanzamiento público. Entra y echa un vistazo a nuestras novedades."&lt;/i&gt;&lt;br /&gt;&lt;a href="http://draft.blogger.com/"&gt;http://draft.blogger.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Me ha gustado bastante la utilidad para crear las plantillas para el blog.&lt;br /&gt;Para probar esta nueva utilidad entra en &lt;a href="http://draft.blogger.com/"&gt;draft.blogger.com&lt;/a&gt; -&gt; Diseño -&gt; Diseñador de Plantillas.&lt;br /&gt;&lt;br /&gt;A partir de una plantilla inicial, se puede ir modificando hasta conseguir buenos resultados y bastante personalizados. Permite elegir la imagen de fondo entre una gran variedad, o si lo deseamos subir una imagen propia. También se puede modificar muy facilmente el color del texto que aparece en nuestro blog. Todos los cambios que vamos haciendo se van mostrando en "tiempo real" sobre una imagen previa del blog que tenemos debajo de los menús del Diseñador de Plantillas y con un único click, podemos a pantalla completa una vista previa de nuestro diseño. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Video promocional de google sobre esta nueva utilidad para blogspot.&lt;br /&gt;&lt;br /&gt;&lt;object width="450" height="300"&gt;&lt;param name="movie" value="http://www.youtube.com/v/r6haqZoivBQ&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/r6haqZoivBQ&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-7636770466710141965?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/7636770466710141965/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/da-un-aspecto-profesional-tu-blogspot.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7636770466710141965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/7636770466710141965'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/da-un-aspecto-profesional-tu-blogspot.html' title='Da un Aspecto Profesional a tu Blogspot. Blogger in Draft'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-1398702656100239540</id><published>2010-04-26T04:28:00.000-07:00</published><updated>2010-04-26T08:41:34.730-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qrcode'/><category scheme='http://www.blogger.com/atom/ns#' term='qr-code'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Nota Android: Crear un qr-code</title><content type='html'>&lt;i&gt;"Un código QR (Quick Response Barcode) es un sistema para almacenar información en una matriz de puntos o un código de barras bidimensional."&amp;nbsp;&lt;/i&gt;&lt;a href="http://es.wikipedia.org/wiki/C%C3%B3digo_QR"&gt;wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Con la aparición de los nuevos teléfonos móviles, los smartphones, se está empezando a usar estos códigos de barras para almacenar urls y proporcionar un acceso rápido a paginas web, liberandonos de la necesidad de tener que escribir la dirección. En la actualidad, es bastante habitual encontrar en la web qrcodes de aplicaciones que enlazan directamente con su ubicación en el "Android Market".&lt;br /&gt;&lt;br /&gt;Para poder utilizar qrcodes con un smartphone gestionado por android, es necesario tener instalado una aplicación que permita leer dichos códigos a través de la cámara de fotos e interpretarlos.&lt;br /&gt;&lt;br /&gt;En "Android Market", se puede encontrar "shopsavvy", una aplicación que permite la lectura de qrcodes, a partir de la cámara de photos. Esta aplicación tiene otras utilidades, como la de puntos de venta, precios del producto..., pero si el qr-code corresponde a una ulr, esta aplicación directamente nos enlaza, o bien con el "Market" o bien con el navegador.&lt;br /&gt;&lt;br /&gt;Para crear un qr-code de una dirección concreta, hay una &lt;a href="http://www.qrcode.es/?page_id=18&amp;amp;language=es"&gt;web&lt;/a&gt; que nos genera automáticamente la imagen a partir de un texto introducido por el usuario.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.qrcode.es/?page_id=18&amp;amp;language=es"&gt;http://www.qrcode.es/?page_id=18&amp;amp;language=es&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A continuación, pongo la imagen de un qr-code que redirecciona a este blog.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6KLpbZOYDsA/S9V44hlx-9I/AAAAAAAAAFc/aOm3hf_Ijf0/s1600/palnet.blogspot.qr_img.php.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_6KLpbZOYDsA/S9V44hlx-9I/AAAAAAAAAFc/aOm3hf_Ijf0/s320/palnet.blogspot.qr_img.php.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-1398702656100239540?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/1398702656100239540/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/nota-android-crear-un-qr-code.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1398702656100239540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1398702656100239540'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/nota-android-crear-un-qr-code.html' title='Nota Android: Crear un qr-code'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6KLpbZOYDsA/S9V44hlx-9I/AAAAAAAAAFc/aOm3hf_Ijf0/s72-c/palnet.blogspot.qr_img.php.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-1057725230320746144</id><published>2010-04-23T07:12:00.000-07:00</published><updated>2010-04-23T07:32:28.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pygtk'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota Python: Intro PyGTK</title><content type='html'>&lt;i&gt;"GTK+ o The GIMP Toolkit es un conjunto de bibliotecas multiplataforma para desarrollar interfaces gráficas de usuario (GUI), principalmente para los entornos gráficos GNOME, XFCE y ROX aunque también se puede usar en el escritorio de Windows, MacOS y otros. GNOME está basado en GTK+, lo que significa que los programas de GNOME usan GTK+."&lt;/i&gt; (wikipedia)&lt;br /&gt;PyGTK es un binding de la biblioteca gráfica GTK para el lenguaje de programación Python.&lt;br /&gt;&lt;br /&gt;Gtk está basado en contenedores, lo que implica que un widget no se dice donde se ubica, no es necasrio el uso de coordenadas, si no que se dice que en que contenedor está el widget. Agunos widgets (como una ventana, un botón...) son contenedores que sólo pueden almacenar un único widget (un botón solamente almacena la etiqueta). Si se necesitase poner más de un widget en un contenedor de este tipo (por ejemplo una ventana), se debería poner un contenedor que permitiese más de un widget (por ejemplo una caja).&lt;br /&gt;&lt;br /&gt;Los widgets GtkHBox y GtkVBox son contenedores que admiten más de un widget.  GtkHBox y GtkVBox son cajas invisibles que empaquetan widgets horizontal o verticamente respectivamente.&lt;br /&gt;&lt;br /&gt;La siguiente imagen muestra una ventana que contiene una caja vertical, esta a su vez contiene dos botones.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6KLpbZOYDsA/S9GrL7G9ErI/AAAAAAAAAEk/fjF9ojjWDUo/s1600/ventana.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_6KLpbZOYDsA/S9GrL7G9ErI/AAAAAAAAAEk/fjF9ojjWDUo/s320/ventana.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo en ubuntu 10.04:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6KLpbZOYDsA/S9GrPh6tCZI/AAAAAAAAAEs/O1PiFvcZQRk/s1600/Pantallazo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_6KLpbZOYDsA/S9GrPh6tCZI/AAAAAAAAAEs/O1PiFvcZQRk/s320/Pantallazo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para crear la ventana anterior en pygtk hay que hacer lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#objects&lt;br /&gt;window = gtk.Window(gtk.WINDOW_TOPLEVEL) &lt;br /&gt;caja = gtk.VBox(False, 0) &lt;br /&gt;hello_button = gtk.Button("Say hello") &lt;br /&gt;bye_button = gtk.Button("Say bye") &lt;br /&gt;&lt;br /&gt;#add widgets&lt;br /&gt;caja.pack_start(hello_button, True, True, 0) &lt;br /&gt;caja.pack_start(bye_button, True, True, 0) &lt;br /&gt;window.add(self.caja) &lt;br /&gt;&lt;br /&gt;#show widgets&lt;br /&gt;hello_button.show() &lt;br /&gt;bye_button.show() &lt;br /&gt;caja.show() &lt;br /&gt;window.show()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Cuando se ejecuta un program en gtk se debe ejecutar el bucle main. Este bucle main se encarga de recoger los eventos y las señales. Para que se ejecute este bucle en PyGTK, hay que ejecutar la función:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;gtk.main()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para salir de dicho bucle hay que ejecutar la función:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;gtk.main_quit()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Para recoger los eventos o las señales es necesario “conectar” los widgets. A continuación se muestra como se “conectan” los botones a las funciones “callback” para la señal "clicked":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;hello_button.connect("clicked", callback1) &lt;br /&gt;bye_button.connect("clicked", callback2) &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A continuación se muestra un pequeño ejemplo basado en la ventana con dos botones que se ha mostrado anteriormente. Aparte de las señales de los botones, también se ha “conectado” la ventana principal para que al cerrarse la ventana se termine el programa("delete_event", "destroy")&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/usr/bin/python &lt;br /&gt;&lt;br /&gt;import pygtk &lt;br /&gt;import gtk &lt;br /&gt;&lt;br /&gt;class HelloWorld(): &lt;br /&gt;&lt;br /&gt;    def delete_event(self, widget, event): &lt;br /&gt;        return False    &lt;br /&gt;&lt;br /&gt;    def destroy(self, widget): &lt;br /&gt;        gtk.main_quit() &lt;br /&gt;&lt;br /&gt;    def __init__(self): &lt;br /&gt;        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) &lt;br /&gt;        self.caja = gtk.VBox(False, 0) &lt;br /&gt;        self.hello_button = gtk.Button("Say hello") &lt;br /&gt;        self.bye_button = gtk.Button("Say bye") &lt;br /&gt;        &lt;br /&gt;        self.caja.pack_start(self.hello_button, True, True, 0) &lt;br /&gt;        self.caja.pack_start(self.bye_button, True, True, 0) &lt;br /&gt;        self.window.add(self.caja) &lt;br /&gt;&lt;br /&gt;        self.window.connect("delete_event", self.delete_event) &lt;br /&gt;        self.window.connect("destroy", self.destroy) &lt;br /&gt;        self.hello_button.connect("clicked", self.b_click, 1) &lt;br /&gt;        self.bye_button.connect("clicked", self.b_click, 2) &lt;br /&gt;&lt;br /&gt;        self.hello_button.show() &lt;br /&gt;        self.bye_button.show() &lt;br /&gt;        self.caja.show() &lt;br /&gt;        self.window.show() &lt;br /&gt;&lt;br /&gt;    def b_click(self, widget, data): &lt;br /&gt;        if data == 1: &lt;br /&gt;            print "Hello World!" &lt;br /&gt;        else: &lt;br /&gt;            print "Bye" &lt;br /&gt;&lt;br /&gt;    def main(self): &lt;br /&gt;        gtk.main() &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__": &lt;br /&gt;    hello = HelloWorld() &lt;br /&gt;    hello.main() &lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-1057725230320746144?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/1057725230320746144/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/nota-python-intro-pygtk.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1057725230320746144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1057725230320746144'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/nota-python-intro-pygtk.html' title='Nota Python: Intro PyGTK'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6KLpbZOYDsA/S9GrL7G9ErI/AAAAAAAAAEk/fjF9ojjWDUo/s72-c/ventana.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-1400489962882901201</id><published>2010-04-22T04:53:00.000-07:00</published><updated>2010-04-22T05:28:56.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota Python: Salto de línea en Strings</title><content type='html'>Barra invertida (\) al final de cada línea permite hacer una salto de línea durante la edición del código sin que afecte a la cadena resultante:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;print "hello \&lt;br /&gt;       world!"&lt;br /&gt;&amp;gt;&amp;gt; "hello world!"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Una pareja de triples comillas también permite hacer un salto de línea cuando se está editando el código pero dicho salto aparecerá en la cadena si se hace un print con ella.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;print """hello&lt;br /&gt;world!"""&lt;br /&gt;&amp;gt;&amp;gt; "hello &lt;br /&gt;world!"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Si sólamete queremos introducir un salto de línea en una cadena, se debe usar'\n'.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;print "hello \nworld!"&lt;br /&gt;&amp;gt;&amp;gt; "hello &lt;br /&gt;world!"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-1400489962882901201?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/1400489962882901201/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/tweet-python-salto-de-linea-en-strings.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1400489962882901201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1400489962882901201'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/tweet-python-salto-de-linea-en-strings.html' title='Nota Python: Salto de línea en Strings'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-551614066741092769</id><published>2010-04-21T11:16:00.000-07:00</published><updated>2010-04-22T04:27:52.526-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Configuración de vim para python</title><content type='html'>Si se tiene "vi" como punto de partida e instalas vim, ya cambia bastante el aspecto de los programas en python. Por lo tanto, lo primero que he hecho ha sido instalar vim.&lt;br /&gt;&lt;br /&gt;Instalación en Ubuntu:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;sudo apt-get install vim&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Aun así, hay algunas cosas que todavía se pueden ajustar mas, como puede ser el "autoindent" (auto sangrado) y asignar los 4 espacios al tabulador.&lt;br /&gt;&lt;br /&gt;Para añadir estas características al editor, hay que modificar un fichero de configuración. Se puede añadir a dos fichero diferentes en función de para que usuarios queremos que estén disponibles estos ajustes.&lt;br /&gt;&lt;br /&gt;Si se desea que estos cambios sean generales en el programa, se debe modificar el siguiente fichero:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/usr/share/vim/vimrc&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En cambio, si sólo se quiere que estas modificaciones estén disponibles para un usuario, se debe modificar el siguiente archivo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;~/.vimrc&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;A continuación pongo los ajustes que tengo en mi .vimrc:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;syntax on&lt;br /&gt;&lt;br /&gt;set tabstop=4&lt;br /&gt;set shiftwidth=4&lt;br /&gt;set expandtab&lt;br /&gt;set softtabstop=4&lt;br /&gt;"set background=dark "comentado&lt;br /&gt;set autoindent&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-551614066741092769?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/551614066741092769/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/configuracion-de-vim-para-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/551614066741092769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/551614066741092769'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/configuracion-de-vim-para-python.html' title='Configuración de vim para python'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-3775492142761221625</id><published>2010-04-21T09:59:00.000-07:00</published><updated>2010-04-27T02:34:01.560-07:00</updated><title type='text'>SQLite en Python.</title><content type='html'>Una herramienta muy útil para trabajar con SQLite &amp;nbsp;es la extensión de firefox "&lt;a href="http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html"&gt;sqlitemanager&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Hay una gran cantidad de bases de datos, tanto de pago como gratuitas. También existen una gran variedad de módulos distintos para trabajar con esas bases de datos en Python, lo que implica que hay una gran cantidad de &lt;a href="http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones"&gt;APIs&lt;/a&gt; que aprender.&lt;br /&gt;&lt;br /&gt;Se ha desarrollado una propuesta de API estándar para el manejo de bases de datos en Python para que el código sea prácticamente igual para todas las bases de datos. Esta API es Python Database API (DB-API)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.python.org/dev/peps/pep-0249/"&gt;http://www.python.org/dev/peps/pep-0249/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hay un módulo que se ajusta a la DB-API 2.0 para SQLite. Dicho módulo es:&lt;br /&gt;slqlite3&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Para realizar la conexión con la base de datos se hace con la función "connect" esta función tiene unos parámetros de entrada que no están estandarizados. Para el módulo sqlite3 el parámetro de entrada es la ruta donde se encuentra almacenado el archivo que contiene los datos. También se puede poner la cadena ":memory:" lo que implicará que se usará la memoria RAM para la base de datos, por lo tanto no se almacenarán datos al terminar la ejecución del programa.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;import sqlite&lt;br /&gt;bdd = sqlite3.connect("./db.sqlite")&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Para poder realizar operaciones, se han de realizar sobre un cursor.&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;cur=bdd.cursor()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;Si en nuestra base de datos está desactivado la opción de autocommit, será necesario hacer un commit:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;bdd.commit()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/python&lt;br /&gt;import sqlite3&lt;br /&gt;&lt;br /&gt;#connect to the data base&lt;br /&gt;bdd = sqlite3.connect("./db.sqlite")&lt;br /&gt;&lt;br /&gt;#cursor&lt;br /&gt;cur=bdd.cursor()&lt;br /&gt;&lt;br /&gt;#create a table&lt;br /&gt;cur.execute("""CREATE  TABLE "main"."data" &lt;br /&gt;             ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , &lt;br /&gt;             "name" VARCHAR)""")&lt;br /&gt;&lt;br /&gt;#insert a value&lt;br /&gt;name="Nombre"&lt;br /&gt;sql_script="INSERT INTO data ( name ) VALUES (\'%s\')" % name&lt;br /&gt;cur.execute(sql_script)&lt;br /&gt;bdd.commit()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#close the data base &lt;br /&gt;bdd.close()&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nota: Si se va a ejecutar este ejemplo por segunda vez, no debe existir el fichero "db.sqlite" en el mismo directorio, ya que va a intentar crear otra vez la tabla "data" y dará error.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Post relacionados:&lt;br /&gt;&lt;a href="http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html"&gt;http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bibloigrafía:&lt;/div&gt;&lt;div&gt;&lt;a href="http://mundogeek.net/tutorial-python/"&gt;http://mundogeek.net/tutorial-python/&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-3775492142761221625?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/3775492142761221625/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/sqlite-en-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3775492142761221625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/3775492142761221625'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/sqlite-en-python.html' title='SQLite en Python.'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-5117671043525345990</id><published>2010-04-21T09:31:00.000-07:00</published><updated>2010-04-21T09:35:23.908-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlite'/><title type='text'>Base de datos sqlite y gestor "sqlite manager".</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;SQLite es un sistema de gestión de bases de datos relacional que está contenida en una relativamente pequeña biblioteca en C.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;El motor de SQLite no es un proceso independiente con el que el programa principal se comunica, si no que pasa a ser parte del programa principal que lo gestiona.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;El conjunto de la base de datos &lt;/b&gt;(definiciones, tablas, índices, y los propios datos), es guardada &lt;b&gt;en un único &amp;nbsp;fichero&lt;/b&gt; estándar en la máquina host. Este diseño simple se logra bloqueando todo el fichero de base de datos al principio de cada transacción.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/es-ES/firefox/addon/5817"&gt;Sqlite manager&lt;/a&gt; es una extensión para firefox que permite manegar bases de datos sqlite. Esta extensión permite, crear nuevas tablas, visualizar el contenido de tablas existentes, modificar dicho contenido, o bien añadir nuevos registros a la base de datos.&lt;br /&gt;&lt;br /&gt;Extensión:&lt;br /&gt;&lt;a href="https://addons.mozilla.org/es-ES/firefox/addon/5817"&gt;https://addons.mozilla.org/es-ES/firefox/addon/5817&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Algunos pantallazos de sqlitemanager.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Ejemplo de base de datos en sqlitemanager:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_6KLpbZOYDsA/S88nm_LBvUI/AAAAAAAAADs/qfCR7xOevWw/s1600/Pantallazo-SQLite+Manager+-+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://2.bp.blogspot.com/_6KLpbZOYDsA/S88nm_LBvUI/AAAAAAAAADs/qfCR7xOevWw/s400/Pantallazo-SQLite+Manager+-+1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Interfaz para la creación de una nueva tabla:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_6KLpbZOYDsA/S88nxR5xXNI/AAAAAAAAAD0/0thYi3M2uHE/s1600/Pantallazo-SQLite+Manager+-+Create+Table.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://4.bp.blogspot.com/_6KLpbZOYDsA/S88nxR5xXNI/AAAAAAAAAD0/0thYi3M2uHE/s400/Pantallazo-SQLite+Manager+-+Create+Table.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Registros de una tabla existente:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_6KLpbZOYDsA/S88nyY2WH-I/AAAAAAAAAD8/AXmTRWDcNgk/s1600/Pantallazo-SQLite+Manager+-+-tmp-sqlite-snippetsdb.sqlite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://1.bp.blogspot.com/_6KLpbZOYDsA/S88nyY2WH-I/AAAAAAAAAD8/AXmTRWDcNgk/s400/Pantallazo-SQLite+Manager+-+-tmp-sqlite-snippetsdb.sqlite.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-5117671043525345990?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/5117671043525345990/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/5117671043525345990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/5117671043525345990'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html' title='Base de datos sqlite y gestor &quot;sqlite manager&quot;.'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6KLpbZOYDsA/S88nm_LBvUI/AAAAAAAAADs/qfCR7xOevWw/s72-c/Pantallazo-SQLite+Manager+-+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-6346154993993606997</id><published>2010-04-21T08:24:00.000-07:00</published><updated>2010-04-22T05:29:11.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota Python: Tamaño de una cadena</title><content type='html'>Para obtener el tamaño de una cadena se utiliza la función len()&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;str='cadena'&lt;br /&gt;len(str)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-6346154993993606997?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/6346154993993606997/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/python-tamano-de-una-cadena.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/6346154993993606997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/6346154993993606997'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/python-tamano-de-una-cadena.html' title='Nota Python: Tamaño de una cadena'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-445348348246891180</id><published>2010-04-21T08:23:00.000-07:00</published><updated>2010-04-22T05:28:41.003-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='nota'/><title type='text'>Nota Python: How to i++</title><content type='html'>En Python no se usa i++ para incrementar una variable como en c/c++. &lt;br /&gt;En Python usamos: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;i += 1&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-445348348246891180?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/445348348246891180/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/python-how-to-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/445348348246891180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/445348348246891180'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/python-how-to-i.html' title='Nota Python: How to i++'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-1308540591876493573</id><published>2010-04-21T08:19:00.000-07:00</published><updated>2010-04-21T09:03:39.636-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='varios'/><title type='text'>Logos y botones para twitter</title><content type='html'>Gran cantidad de logos y botones para twitter:&lt;br /&gt;&lt;div&gt;&lt;a href="http://www.vincentabry.com/31-logos-et-boutons-pour-twitter-2480"&gt;http://www.vincentabry.com/31-logos-et-boutons-pour-twitter-2480&lt;/a&gt; &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;img alt="" border="0" height="320" src="http://lh6.ggpht.com/_6KLpbZOYDsA/S87ucwk8LXI/AAAAAAAAACY/DrE_l8bXmAA/s320/31-twitter-logo-buttons-free.jpg" style="display: block; height: 576px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 469px;" width="260" /&gt; &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-1308540591876493573?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/1308540591876493573/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/logos-y-botones-para-twitter.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1308540591876493573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/1308540591876493573'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/logos-y-botones-para-twitter.html' title='Logos y botones para twitter'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_6KLpbZOYDsA/S87ucwk8LXI/AAAAAAAAACY/DrE_l8bXmAA/s72-c/31-twitter-logo-buttons-free.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5472687726050812204.post-8503021467530347409</id><published>2010-04-21T08:10:00.000-07:00</published><updated>2010-04-21T11:32:36.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='varios'/><title type='text'>Cajas de Código en blogspot</title><content type='html'>Vamos a "diseño-&amp;gt;Edicion de html". Lo primero que&lt;b&gt; hay que hacer es hacer un backup de la plantilla&lt;/b&gt; por si se comete algún error. Para descargar la plantilla pinchamos en "Descargar plantilla completa".&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A continuación buscamos &lt;span class="Apple-style-span" style="font-family: Trebuchet, 'Trebuchet MS', Arial, sans-serif; font-size: 13px; line-height: 21px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;]]&lt;/span&gt;&lt;/i&gt;&lt;strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;/i&gt;&lt;/strong&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;/b:skin&lt;/span&gt;&lt;/i&gt;&lt;strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;/strong&gt;&lt;/span&gt; &lt;br /&gt;&lt;b&gt;Antes&lt;/b&gt; del texto anterior copiamos: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;pre&lt;br /&gt;{&lt;br /&gt;background:#efefef;&lt;br /&gt;border:1px solid #A6B0BF;&lt;br /&gt;font-size:120%;&lt;br /&gt;line-height:100%;&lt;br /&gt;overflow:auto;&lt;br /&gt;padding:10px;&lt;br /&gt;color:#000000 }&lt;br /&gt;pre:hover {&lt;br /&gt;border:1px solid #efefef;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;code {&lt;br /&gt;font-size:120%;&lt;br /&gt;text-align:left;&lt;br /&gt;margin:0;padding:0;&lt;br /&gt;color: #000000;}&lt;br /&gt;.clear { clear:both;&lt;br /&gt;overflow:hidden;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para introducir código en el blog a la hora de editar, debemos copiar el código entre las etiquetas(pero sin los espacios): &lt;br /&gt;"&amp;lt; pre&amp;gt;&amp;lt; code&amp;gt;codigo&amp;lt; /code&amp;gt;&amp;lt; /pre&amp;gt;" &lt;br /&gt;Si queremos que estas etiquetas estén disponibles cada vez que empezamos un post, se deben copiar en:&lt;br /&gt;"Configuración-&amp;gt;Formato-&amp;gt;Plantilla de entrada"&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Nota&lt;/b&gt;: Cuando se va a publicar la entrada, te puede dar un error. Si es así, pinchas la opción " Dejar de mostrar los errores HTML del cuerpo de esta entrada"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5472687726050812204-8503021467530347409?l=pablogplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pablogplanet.blogspot.com/feeds/8503021467530347409/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/codigo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/8503021467530347409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5472687726050812204/posts/default/8503021467530347409'/><link rel='alternate' type='text/html' href='http://pablogplanet.blogspot.com/2010/04/codigo.html' title='Cajas de Código en blogspot'/><author><name>Pablo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/-gyE0vi5MW70/TxZCJKdbYfI/AAAAAAAAAXY/9xz-J8DtQAA/s220/avatar-retocado-peq.png'/></author><thr:total>0</thr:total></entry></feed>
