Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas

7 de marzo de 2012

Mis Plugins para Eclipse

Mi lista de plugins actuales para Eclipse y desarrollo web.

Eclipse

Me baso en: Eclipse IDE for JavaScript Web Developers. Este plugin trae:
  • Coloreado de syntasis, html, javascript, css,...
  • Autocompletado de css. Muy util para no ir buscando las propiedades que quieres aplicar.
  • Formateo de xml. Pretty print para ficheros xml, a veces es necesario
  • ...
Donwload: http://www.eclipse.org/downloads/packages/eclipse-ide-javascript-web-developers/indigosr2

Gestión de versiones


Subclipse
Para gestionar repositorios Subversion, el sucesor de CVS.

URL: http://marketplace.eclipse.org/node/979
Download: Desde Eclipse MarketPlace



Git
Muy de moda últimamente por sitios como Github y Bitbucket. En otro post ya indique como configurar Git en Eclipse.

URL: http://www.eclipse.org/egit/
Download: Desde Eclipse MarketPlace



Python + Django

Pydev
Editor por excelencia en Eclipse. Muchas posibilidades como: sintaxis, autocompletado, debugger, formateo de código,...

Una utilidad que he descubierto hace poco, es integralo con pep8.py, para chequear tu código con las convenciones de estilos definidas en Style Guide for Python Code.

Ahora tu código python será aún más bonito.

URL: http://pydev.org/
Download: Desde Eclipse MarketPlace



Django Editor
Plugin para editor de plantillas de Django. Simple pero efectivo.

URL: http://eclipse.kacprzak.org/
Download: Añadiendo una fuente en Install New Software.




Otros

Markdown Editor

Plugin para editar cómodamente fichero .md con posibilidad de vista prévia.


URL: http://www.winterwell.com/software/markdown-editor.php
Download: Añadiendo una fuente en Install New Software.

Nota: para poder instalarlo en Eclipse 3.5, en la ventana de añadir nuevo software, hay que desactivar la opción: "Group items by category"



¿que plugin es para ti esencial?

20 de diciembre de 2011

Django + Socket.io

Si queremos Websocket en nuestra aplicación Django, hay que calentarse un poco la cabeza.

La versión actual de mod_wsgi no es posible tener websocket. Aquí se discute como extender el módulo de Apache para permitir estas conexiones. Lo dejamos en espera.

Podemos utilizar el webserver Tornado, un server no bloqueante desarrollado por FriendFeed (Facebook). O utilizar soluciones con gevent. Esta librería de python nos permite realizar peticiones asíncronas tirando de libevent.

Para no complicarnos, podemos utilizar la aplicación django_socketio.

Con esta app tenemos un websocket y el cliente para javascript de socket.io con todas las dependencias que necesitamos.

Al turrón...

Instalamos django-socketio.

$ sudo apt-get install python-dev build-essential libevent-1.4-2 libevent-dev
$ sudo pip install django_socketio
[...]
Successfully installed django-socketio gevent-socketio sphinx-me gevent-websocket gevent greenlet

Añadimos la aplicación al settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',

    # Uncomment the next line to enable the admin:
    'django.contrib.admin',

    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',

    # socket
    'django_socketio',
)

Añadimos a urls.py

urlpatterns += patterns('',
    ("", include("django_socketio.urls")),

    [otras urls]
)

Ahora creamos las vistas que serán el punto de entrada para los eventos del websocket.

@events.on_subscribe(channel="^canal-")
def menssaje(request, socket, context, channel):
    if not request.user.is_authenticated():
        socket.send_and_broadcast_channel({'action': 'connect', 'text': 'Bienvenido Invitado'}, channel=channel)
    else:
        socket.send_and_broadcast_channel({'action': 'connect', 'text': 'Bienvenido %s' % str(request.user.username)}, channel=channel)

Hay diferentes decoradores para recibir los eventos que se envíen al socket. (Consultar sección Broadcast and Send Methods en el proyecto)

En este ejemplo, los usuarios se subscribirán a canales con nombre "canal-ID". Cuando lo hagan se enviarán mensajes, tanto al usuario que se ha suscrito, como al resto de clientes conectados al mismo canal.

Otra vista podría ser del tipo:

@events.on_message(channel="^canal-")
def message(request, socket, context, message):
    message = message[0]

    action = message["action"]
    text = message["text"]

    if action == 'talk':
        print text

        socket.broadcast_channel({'action': 'talk', 'text': text}, channel)

Un usuario envía al socket un mensaje que será enviado al resto de clientes.

Como se ve, se ha definido un protocolo de comunicación entre el cliente y el servidor. Con el parámetro action, se controla las diferentes acciones que se pueden hacer en nuestra aplicación.

Ahora la parte del cliente que se comunica con el server. (simplifico al máximo)

template.html


Para arrancar la aplicación

$ ./manage.py runserver_socketio

Ya veremos en próximas entregas como pasarlo a un entorno de producción.

Referencias:
https://github.com/stephenmcd/django-socketio
http://socket.io/

14 de diciembre de 2010

Uninstall software Python

Como sabréis el setup.py no tiene comando uninstall o remove. Para eliminar un software python utilizaremos la opción --record del comando install.

--record: filename in which to record list of installed files

Por lo que tendremos que re-instalar.

sudo python setup.py install --record files.txt

Ahora solo nos queda borrar todos los ficheros y directorios, ayudándonos del comando xargs, el cual ejecuta ordenes para cada linea del fichero.

cat files.txt | xargs rm -rf

Si tienes alguna reserva al ejecutar el rm -rf, visualiza el fichero:

cat files.txt | sudo xargs echo

Resumiendo:

sudo python setup.py install --record files.txt
cat files.txt | sudo xargs echo

Referencias:
http://kmandla.wordpress.com/2009/01/08/there-is-no-setuppy-uninstall/

13 de diciembre de 2010

Install OpenERP Ubuntu 10.10

Bienvenido al maravilloso mundo de OpenERP (anteriormente conocido como TinyERP).

A igual que mi colega m1cm3, haré una serie de entradas destinadas a instalar/configurar/aprender OpenERP, eso sí, en Ubuntu 10.10.

Comenzamos con la instalación. Describo los pasos a seguir para tener una instalación básica con los datos de ejemplo.

Versiones:

  • Ubuntu 10.10
  • PostgresSQL 8.4
  • OpenERP 5.0.15
  • Python 2.6.6

PostgreSQL

Instalamos es servidor desde el repositorio

$ sudo apt-get install postgresql

Cambiamos permisos del usuario admin: postgres

$ sudo su - postgres
$ psql postgres
postgres=# \password postgres
Ingrese la nueva contraseña: password
Ingrésela nuevamente: password
postgres-# \quit
$ exit

Habilitamos el login de forma local al servidor de postgresql. Y cambiamos el modo de acceso de los usuarios de cualquier tipo y a cualquier base de datos a md5 (por derfecto está a ident). Si no, nos encontraremos un mensaje similar cuando intentemos hacer un login local.

$ psql -d postgres -U postgres -W
psql: FATAL:  la autentificación Ident falló para el usuario <<postgres>>

Editamos y modificamos el fichero pg_hba.conf:

$ vi /etc/postgresql/8.4/main/pg_hba.conf


# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only

local   all         all                               md5

Reiniciamos el servidor postgresql.

$ sudo /etc/init.d/postgresql restart
 * Restarting PostgreSQL 8.4 database server

Creamos un usuario para OpenERP, openerp, indicando que será un superusurio.

$ sudo su - postgres
$ createuser --createdb --username postgres --no-createrole --pwprompt openerp
Ingrese la contraseña para el nuevo rol: password
Ingrésela nuevamente: password
¿Será el nuevo rol un superusuario? (s/n) S

Comprobamos si todo ha ido correcto.

$ psql
postgres=# SELECT * FROM pg_user ;
 usename  | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig
----------+----------+-------------+----------+-----------+----------+----------+-----------
 openerp  |    16384 | t           | t        | t         | ******** |          |
 postgres |       10 | t           | t        | t         | ******** |          |
(2 filas)
\quit

Probamos el login del usuario openerp a la base de datos por defecto postgres.

$ psql -d postgres -U openerp -W
Contraseña para usuario openuser:
psql (8.4.5)
Digite «help» para obtener ayuda.

postgres=# \quit

Todo ok.

EDIT: una mejor y más rápida instalación, seguir aqui

OpenERP

Instalaremos la última versión estable del server y demás clientes. Nos la descargamos desde su web: http://www.openerp.com/downloads


Instalando el openerp-server

Instalamos las librerías necesarias para el servidor:

$ sudo apt-get install python python-psycopg2 python-reportlab python-egenix-mxdatetime python-tz python-pychart python-pydot python-lxml python-vobject python-yaml

Descomprimimos el server y lo testeamos (sin instalación), de esta forma podremos saber si están todas las dependencias satisfechas o por el contrario nos falta alguna librería.

$ tar xvfz openerp-server-6.0.0-rc1.tar.gz
$ cd openerp-server-6.0.0-rc1/bin
$ python openerp-server.py


Con python openerp-server.py -h obtendremos todos los comandos del server.

Realizamos la instalación.

$ pwd
/home/b3ni/bin/openerp-server-6.0.0-rc1
$  sudo python setup.py install

Al finalizar ya está instalado, si no ha ocurrido ningún problema. Podemos hacer un whereis para ver donde está el bin.

$ whereis openerp-server
openerp-server: /usr/local/bin/openerp-server

Instalando el cliente gráfico

Librerías:

$ sudo apt-get install python python-gtk2 python-glade2 python-matplotlib python-egenix-mxdatetime python-hippocanvas

Descomprimimos y testeamos:

$ tar xvfz openerp-client-5.0.15.tar.gz
$ cd openerp-client-5.0.15/bin/
$ python openerp-client.py



Lo instalamos:

$ cd openerp-client-5.0.15/
$ sudo python setup.py install

Lo probamos y obtenemos el siguiente error, indicando que no puede encontrar openerp-icon.png y proponiendonos revisar el fichero de configuración .openerpc

$ openerp-client

CRITICAL:init:No se ha podido abrir el archivo «openerp-icon.png»: No existe el fichero o el directorio
CRITICAL:init:Ensure that the file /home/b3ni/.openerprc is correct

Editamos el fichero .openerpc e indicamos la ruta correcta al cliente (/usr/local/share):

[path]
pixmaps = /usr/local/share/pixmaps/openerp-client
share = /usr/local/share/openerp-client

Instalando el cliente web

Librerías:

$ sudo apt-get install python-cherrypy3 python-pybabel python-mako python-simplejson python-formencode python-pyparsing python-tz python-xlwt

Descomprimimos y configuramos:

$ tar xvfz openerp-web-5.0.15.tar.gz
$ vi openerp-web-5.0.15/config/openerp-web.cfg

En este fichero podemos configurar el servidor web. Por ejemplo el tipo de logging o el puerto donde escuchará el servidor web. Por defecto escuchará en el puerto 8080.

Arrancamos el server web:

$ pwd
/home/b3ni/bin/openerp-web-5.0.15
$ ./openerp-web.py
[12/Dec/2010:11:29:44] ENGINE Bus STARTING
[12/Dec/2010:11:29:44] ENGINE Started monitor thread '_TimeoutMonitor'.
[12/Dec/2010:11:29:44] ENGINE Started monitor thread 'Autoreloader'.
[12/Dec/2010:11:29:44] ENGINE Serving on 0.0.0.0:8080
[12/Dec/2010:11:29:44] ENGINE Bus STARTED

Ya podemos acceder desde nuestro navegador en la dirección localhost:8080


Continuará...

Referencias:
http://doc.openerp.com/install/linux/index.html
http://brunogirin.blogspot.com/2010/05/installing-openerp-on-ubuntu-1004-lts.html
http://doc.openerp.com/install/linux/server/index.html
http://doc.openerp.com/install/linux/client/index.html

6 de diciembre de 2010

lxml.etree.XMLSyntaxError: PCDATA invalid Char value

Al procesar un fichero xml con la librería lxml de Python, me he encontrado con el siguiente error en el parsing:

lxml.etree.XMLSyntaxError: PCDATA invalid Char value 19, line 3642, column 70

Provocado por un carácter extraño que se ha colado en los datos, representado por ^S

<Row>
    <idconcepto>3501</idconcepto>
    <ididioma>ITA</ididioma>
    <texto>Gestione ^S Amministrazione</texto>
    <patron>Gestione ^S Amministrazione</patron>
</Row>

Para evitar que salte este error, establecemos el parámetro recover del parser lxml a True.

dom = etree.parse(file_xml, \
      etree.XMLParser(ns_clean=True, recover=True))

Referencias: 
http://codespeak.net/lxml/parsing.html

17 de noviembre de 2010

Distintas formas de inicializar un diccionario Python

A partir de un lista con tuplas llave/valor

>>> keys = ['a', 'b', 'c', 'd']
>>> values = [1, 2, 3, 4]
>>> mapping = zip(keys, values)
>>> mapping
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> dict(mapping)
{'a': 1, 'c': 3, 'b': 2, 'd': 4}

A partir de un iterador

>>> def iter_dicc(num):
...     l = 'abcdefghijklmnopqrstuvwxyz'
...     for i in range(num):
...             yield (l[i], i+1)
>>> dict(iter_dicc(5))
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

Directamente en el contrucctor

>>> dict(a=1, b=2, c=3, d=4)
{'a': 1, 'c': 3, 'b': 2, 'd': 4}

Referencias:
>>> help(dict)

11 de noviembre de 2010

setting.py configurable por host y sistema operativo

Para un desarrollo de una aplicación Django donde intervengan varios colaboradores y en diferentes entornos de trabajo podemos trucar un poco el fichero setting.py.

Veamos como, poniendo un pequeño ejemplo.
  • Tenemos dos colaboradores b3ni y alex en el mismo proyecto.
  • Ambos colaboradores pueden desarrollar en diferentes entornos: linux/windows
  • Tenemos otro caso cuando el proyecto se ejecute en preproducción o producción.
Para que los desarrolladores puedan programar cómodamente y el proyecto pueda ser funcional en cualquier entorno, utilizaremos:

socket.gethostname()

Para identificar el host / usuario.

os.name

Para identificar la plataforma.

  • nt: Windows
  • posix: Linux

Ahora solo necesitamos encajarlo todo.

# diferentes tipos de configuraciones
import socket
import os

name_host = socket.gethostname()
name_os = os.name

if name_host == 'b3ni' or 'b3ni-laptop':
    # desarrollo en sobremesa y portatil
    # ----------------------------------
    DEBUG = True
    DIR_BASE = {'nt': r"C:/Users/b3ni/ws/project", 
                'posix': '/home/b3ni/ws/project'}[name_os]

    DATABASES = {
        'default': {
            'ENGINE':   'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
            'NAME':     DIR_BASE + r'/data.db', # Or path to database file if using sqlite3.
            'USER':     '', # Not used with sqlite3.
            'PASSWORD': '', # Not used with sqlite3.
            'HOST':     '', # Set to empty string for localhost. Not used with sqlite3.
            'PORT':     '', # Set to empty string for default. Not used with sqlite3.
        }
    }
    
    MEDIA_ROOT = DIR_BASE + r'/media'
    TEMPLATE_DIRS = (DIR_BASE + r"/templates/",)

elif name_host == 'alex':
    # desarrollo alex
    
    DEBUG = True
    DIR_BASE = {'nt': r"C:/Users/alex/workspace/dummy/project", 'posix': '/home/alex/workspace/dummy/project'}[name_os]

    DATABASES = {
        'default': {
            'ENGINE':   'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
            'NAME':     DIR_BASE + r'/data.db', # Or path to database file if using sqlite3.
            'USER':     '', # Not used with sqlite3.
            'PASSWORD': '', # Not used with sqlite3.
            'HOST':     '', # Set to empty string for localhost. Not used with sqlite3.
            'PORT':     '', # Set to empty string for default. Not used with sqlite3.
        }
    }
    
    MEDIA_ROOT = DIR_BASE + r'/media'
    TEMPLATE_DIRS = (DIR_BASE + r"/templates/",)
    
else:
    # PRODUCCION
    # ----------
    DEBUG = False

    DATABASE_ENGINE =   'mysql'
    DATABASE_NAME =     'xxx'
    DATABASE_USER =     'xxx'             # Not used with sqlite3.
    DATABASE_PASSWORD = 'xxx'             # 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.

    EMAIL_HOST = 'xxx'
    EMAIL_HOST_PASSWORD = 'xxx'
    EMAIL_HOST_USER = 'xx'

    MEDIA_ROOT = '/server/project/media'
    TEMPLATE_DIRS = ('/server/project/templates/',)
    
# RESTO DE CONFIGURACION DJANGO .....

8 de noviembre de 2010

easy_install en Windows 7

A día de hoy, la actual descarga de setuptools para python no funciona en windows 7, 64 bits.

Pasos instalar easy_install en windows 7
  1. Descargar ez_setup.py desde http://peak.telecommunity.com/
  2. Ejecutar: python ez_setup.py
Esto instalará easy_install.exe en: <python_dir>\Scripts

Listo.

Referencias: