viernes, 14 de mayo de 2010

Nota: git hosting

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.

He encontrado dos servicios que tienen buena pinta:

github.com   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.

codaset.com 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...

martes, 11 de mayo de 2010

Nota Django. Crear una página de comentarios

Este post es la continuación de otros post que he realizado sobre el framework Django. 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 (SQLite3 en nuestro ejemplo) a través de los modelos de django, se usan plantillas (template) 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.

Lo primero que hay que hacer es crear el proyecto de django.

django-admin startproject commentweb


Creamos una app que va a tener el modelo que gestiona los comentarios que se almacenan en la base de datos.

python manage.py startapp comments


Añadimos el modelo dentro de commentweb/commments/models.py.


from django.db import models
# Create your models here.
class Comment(models.Model):
    title = models.CharField(max_length = 20)
    date = models.DateTimeField()
    text = models.TextField(blank = True)

El modelo consta de tres campos:

  • title: título del comentario.
  • date: fecha de la publicación.
  • text: contenido del comentario.


Ahora hay que modificar el archivo settings.py

Base de datos

DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'comments.sqlite'             # Or path to database file if using sqlite3.
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

Zona horaria. Se puede consultar en http://en.wikipedia.org/wiki/List_of_tz_zones_by_name

TIME_ZONE = 'Europe/Madrid'

Añadimos el path donde se almacenan los templates.

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    "/home/user/djangoprojects/commentweb/templates",
)


Aplicaciones disponibles. He borrado las que vienen por defecto y he añadido la que hemos creado.

INSTALLED_APPS = (
    'commentweb.comments',
)

A continuación sincronizamos la base de datos.

python manage.py syncdb


Nos inidica que hemos creado una nueva tabla

Nuestra página web va a tener dos direcciones, por lo tanto debemos editar el fichero commentweb/urls.py para añadirlas.


from django.conf.urls.defaults import *
from commentweb.comments.views import save
from commentweb.comments.views import comments

urlpatterns = patterns('',
    (r'^comments/$', comments),
    (r'^save/$', save)
)

Vamos a crear las páginas '/comments/' y '/save/'. La página '/comments/' 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 '/save/' 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 commentweb/comments/views.py. Pero antes, vamos a crear los templates que usan dichas funciones. En el directorio que hemos añadido anteriormente al archivo settings.py, vamos a crear el template comments.html. A continuación muestro su contenido:

< html>
    < head>
        < title>Comments< /title>
    < /head>
    < body>
        < form method="post" action="/save/">
            Title< input type="text" size="20" maxlength="20" name="title"> < br />
            < textarea name="text" rows="4" cols="40">< /textarea>< br/>
            < input type="submit" value="Comment!"/>
        < /form>
        {% for comment in comment_list %}
            < h2>{{comment.title}}< /h2>
            < p>Date: {{comment.date}}< /p>
            < p>{{comment.text}}< /p>
        {% endfor %}
    < /body>
< /html>

Nota: he dejado un espacio entre los caracteres '<' y la etiquetas para una correcta visualización en el blog. Cuando se use este fichero hay que eliminar dichos espacios.

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 textarea (name="text"), el nombre de título (name="title") y que la acción que se ejecuta al pulsar el botón "Comment!" (action="/save/") nos lleva a la página '/save/'. La segunda, es una etiqueta de plantilla for que nos muestra todos los comentarios que están almacenados en la variable comment_list. A continuación se muestra el template para la página save.html


< html>

    < head> 

        < meta http-equiv="Refresh" content="2;url=../comments/"> 

    < /head>



    < body>

        < p>Su comentario ha sido guardado. 
Por favor esperar a ser redireccionado.< /p>

    < /body>

< /html>


Nota: he dejado un espacio entre los caracteres '<' 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 template desde la vista. A continuación, vamos a ver las funciones que generan las vistas.

from commentweb.comments.models import Comment

from django.shortcuts import render_to_response

import datetime



# Create your views here.

def comments(request):

    comment_list = Comment.objects.all()

    return render_to_response('comments.html', {'comment_list': comment_list})



def save(request):

    txt = request.POST["text"]

    title = request.POST["title"]

    comment = Comment()

    comment.text = txt

    comment.date = datetime.datetime.now()

    comment.title = title

    comment.save()

    return render_to_response('save.html', None)



La funcion comment obtiente una lista de todos los comentarios que hay en la base de datos. Esta función retorna la salida de la función render_to_response 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.


Una vez realizado esto, nuestro ejemplo ya está terminado. Para poder comprobar su funcionamiento es necesario ejecutar el servidor de pruebas que trae django.

python manage.py runserver

la dirección de nuestra nueva página es:

http://127.0.0.1:8000/comments/

Una vez realizado todos los pasos anteriores, nuestra nueva página ya nos debería permitir introducir nuevos comentarios.

Nota ubuntu: Mostrar el path en Nautilus

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:
 

'Ctrl + l'

lunes, 10 de mayo de 2010

Nota Django: Intro II. Hello world 2.

Este post es la continuación de Intro django I. Ahora lo que vamos a ver es como poder leer la dirección que se escribe en el navegador y usar esos datos.

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.

Vamos a crear la página http://127.0.0.1:8000/say/xxx. Donde 'xxx' es cualquier combinación de entre uno y veinte caracteres de logitud. Esta página mostrará el texto introducido ('xxx').

Añadimos la nueva vista.

vi views.py

Editamos el archivo para que quede de la siguiente manera.

# Create your views here.
from helloweb.textapp.models import Textmodel
from django.http import HttpResponse


def say_hello(request):
    text = Textmodel.objects.get(pk = 1)
    html = "%s" % text.content
    return HttpResponse(html)
 

def say(request, txt): 
    html = "%s" % txt 
    return HttpResponse(html) 

Ahora vamos a editar el fichero helloweb/urls.py para que se pueda interpretar la nueva dirección.

vi urls.py

Añadimos la nueva dirección a urlpatterns.

from django.conf.urls.defaults import * 
from helloweb.textapp.views import say_hello 
from helloweb.textapp.views import say 

# Uncomment the next two lines to enable the admin: 
# from django.contrib import admin 
# admin.autodiscover() 

urlpatterns = patterns('', 
    # (r'^admin/', include(admin.site.urls)), 
    (r'^hello/$', say_hello), 
    (r'^say/([a-z]{1,20})/$', say) 
) 

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: http://docs.python.org/library/re.html#re-syntax

Una vez modificados los archivos, ejecutamos el servidor de pruebas que trae django.

python manage.py runserver


Ponemos la siguiente dirección en el navegador para comprobar que todo funciona.

http://127.0.0.1:8000/say/hello

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.



Plantillas de Django

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.

A continuación vamos a modificar la función say, 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.

Lo primero que hay que hacer es crear una plantilla. La voy a guardar como helloweb/templates/say_template.html

vi template.html

Añadir el siguiente código html al archivo:

 < html >
    < head >
        < title >Say page!!!< /title >
    < /head >
    < body >

        < h1 >Say page.< /h1 >
        < p >you say: {{ text }}.< /p >
    < /body >
< /html >

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 '<', '>' y las etiquetas.

El texto {{ text }} es una variable, y por lo tanto, este texto se reemplazará por un valor durante la ejecución.

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.

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/home/user/djangoprojects/helloweb/templates',
)

Nota: Es importante poner la coma al final de la cadena, ya que es una tupla.

Una vez hecho esto ya se han añadido los templates que estén en ese directorio al proyecto.


A continuación hay que modificar la función say del archivo helloweb/textapp/views.py para leer el template y añadir a dicho template las variables deseadas.


vi views.py

Modificamos la función say e importamos los módulos necesarios. Pongo el fichero views.py entero con las modificaciones necesarias para el uso del template.

# Create your views here.
from helloweb.textapp.models import Textmodel
from django.http import HttpResponse
from django.template.loader import get_template
from django import template

def say_hello(request):
    text = Textmodel.objects.get(pk = 1)
    html = "%s" % text.content
    return HttpResponse(html)

def say(request, txt):
    t = get_template('say_template.html')
    c = template.Context({'text': txt})
    html = t.render(c)
    return HttpResponse(html)

En la funcion say, hemos creado el template 't' a partir de la plantilla 'say_template.html'. Este fichero tiene que estar en el directorio que hemos añadido a settings.py. Después, se ha creado el contexto 'c' que contine el diccionario con la variable 'text', a la cual le daremos el valor de la variable 'txt' durante la ejecución.

Al poner la dirección http://127.0.0.1:8000/say/hello en el navegador, nos mostrará el contenido de la plantilla pero con el valor actual de la variable {{text}}, es decrir 'hello'.

jueves, 6 de mayo de 2010

Nota Django. Intro I. Hello world!!

Intro


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. http://es.wikipedia.org/wiki/Django

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.
Doy por hecho unos conocimientos mínimos de python y estar familirizado con lo que es django.
Si no es así recomiendo echar primero un vistazo a la documentación.
Django a primera vista. (Django at a glance) http://docs.djangoproject.com/en/dev/intro/overview/

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.

Para hecer este ejemplo he usado las siguientes referencias.

El libro de django:
http://www.djangobook.com
concretamente la traducción que hay en la siguiente página http://trac.usla.org.ar/django-book


Escribiendo tu primer app django (Writing your first Django app)
http://docs.djangoproject.com/en/dev/intro/tutorial01/
http://docs.djangoproject.com/en/dev/intro/tutorial02/
http://docs.djangoproject.com/en/dev/intro/tutorial03/
http://docs.djangoproject.com/en/dev/intro/tutorial04/

screencast de la creación de una wiki en django
http://pablogplanet.blogspot.com/2010/05/nota-django-screencast-crear-una-wiki.html


He hecho este ejemplo en ubuntu 10.04 Lucid Lynx.

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:

import django

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:

sudo apt-get install python-django


Crear el proyecto.

Para crear un proyecto hay ejecutar desde el dierectorio donde se quiere crear el proyecto:

django-admin.py startproject helloweb

Al ejecutar el comando anterior se crea un directorio helloweb.

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”


Una vez ejecutado el comando anterior, comprobar que se han creado correctamente los siguientes archivos:

helloweb/

  • __init__.py
  • manage.py
  • settings.py
  • urls.py



__init__.py: Indica que el directorio es un módulo de python (http://docs.python.org/tutorial/modules.html#packages)

manage.py Permite interactuar con el proyecto. Más información (http://docs.djangoproject.com/en/dev/ref/django-admin/#ref-django-admin)

settings.py: Configuración del proyecto (http://docs.djangoproject.com/en/dev/topics/settings/#topics-settings)

urls.py: Declaración de urls para el proyecto (http://docs.djangoproject.com/en/dev/topics/http/urls/#topics-http-urls)


Servidor web de pruebas

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.

Para iniciar el servidor ejecutar el siguiente comando desde el directorio helloweb:

python manage.py runserver

Si todo ha funcionado correctamente, se debería ver el siguiente mensaje:



Validating models...
0 errors found.

Django version 1.0, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.


Para comprobar que el servidor fuciona correctamente ir a la siguiente dirección:

http://127.0.0.1:8000/


Salir de la aplicación del servidor de pruebas.


Configuración de la base de datos.

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.

http://pablogplanet.blogspot.com/2010/04/base-de-datos-sqlite-y-gestor-sqlite.html


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

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:

vi settings.py

Rellenar los siguientes datos relacionados con la base de datos:

DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 
DATABASE_NAME = 'helloweb.sqlite'             # Or path to database file if using sqlite3. 
DATABASE_USER = ''             # Not used with sqlite3. 
DATABASE_PASSWORD = ''         # Not used with sqlite3. 
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3. 
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3. 

Al indicar DATABASE_NAME = 'helloweb.sqlite', se creará el fichero 'helloweb.sqlite' en el directorio del proyecto. Este fichero se puede visualizar con sqlitemanager.

Crear un módelo

Para crear una app nueva.

python manage.py startapp textapp

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.

vi models.py

Copiamos el siguiente modelo:


from django.db import models

# Create your models here.

class Textmodel(models.Model):
    content = models.CharField(max_length=20)

Sincronizar la Base de Datos

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

vi settings.py

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.


INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'helloweb.textapp'
)

A continuación sincronizamos la Base de Datos.

python manage.py syncdb

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.


Usando los modelos desde la consola

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:

python manage.py shell

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.

In [1]: from helloweb.textapp.models import Textmodel

In [2]: t = Textmodel()

In [3]: t.content = 'Hello world'

In [4]: print t.content
Hello world

In [5]: t.save()
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:

python manage.py shell

Vamos a leer un objeto del modelo. Usamos la clave primaria para obtenerlo.

In [1]: from helloweb.textapp.models import Textmodel

In [2]: t = Textmodel.objects.get(pk=1)

In [3]: print t.content
Hello world

Como podemos observar estos datos están almacenados en la BD por lo que aunque se cierre el interprete, estos datos están disponibles.

Si ahora imprimimos el objeto “t” obtenemos lo siguiente:

In [4]: print t
Textmodel object
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


vi models.py
Lo editamos para que quede de la siguiente manera:

from django.db import models

# Create your models here.

class Textmodel(models.Model):
    content = models.CharField(max_length=20)

    def __unicode__(self):
        return 'content:"%s"' % self.content

Mapeando URLs a Vistas

Ahora vamos a añadir una vista y modificar urls.py a para poder crear la página hello world.

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.

Vamos a editar el fichero helloweb/textapp/views.py y vamos a añadir la función “say_hello”.

vi views.py

Lo editamos.

# Create your views here.
from helloweb.textapp.models import Textmodel
from django.http import HttpResponse

def say_hello(request):
    text = Textmodel.objects.get(pk = 1)
    html = "%s" % text.content
    return HttpResponse(html)

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.


Ahora vamos a editar helloweb/urls.py

vi urls.py

Vamos a añdir una nueva tupla a urlpatterns.

from django.conf.urls.defaults import *
from helloweb.textapp.views import say_hello

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # (r'^admin/', include(admin.site.urls)),
    (r'^hello/$', say_hello)
)

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.

Para comprobar su funcionamiento es necesario que el servidor se esté ejecutando.

python manage.py runserver

A continuación se pone la siguiente dirección en el explorador:

http://127.0.0.1:8000/hello/

Si todo ha salido correctamente, debería aparecer una página con el texto "Hello world".

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.

Nota Django: Screencast. Crear una Wiki en 20 min

Screencast de django.
En este ejemplo, Siddhi nos muestra como crear una wiki con django en 20 minutos.
http://showmedo.com/videotutorials/video?name=1100000&fromSeriesID=110

sábado, 1 de mayo de 2010

Nota Android: Hard Reset y Android OS Monitor

Para realizar un reset hw y dejar el teléfono como viene de fábrica, hay dos maneras:

  • Marcando en el teléfono: *2767*3855#
  • LLamar + menú + colgar




Android Os Monitor.

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...