miércoles, 15 de octubre de 2008

Como Python engulle Arduino

Desde hace un mes aproximadamente vengo trabajando en un mini-proyecto de desarrollo de una IDE <<no java>> para el hardware libre Arduino.
Al principio me topé con la gran pregunta de todo programador “¿que lenguaje debo utilizar?”, no me tomó mucho tiempo elegir a Python y la principal razón es que “yo conozco Python”, ¿sencillo no?.

Luego realice una búsqueda para ver si había algo echo en Python, después de algunos trastazos me conseguí con una IDE llamada Editra y observé que además de ser un editor muy versátil que soporta unos 60 lenguajes de programación, era un proyecto que permite el fácil desarrollo e integración de nuevos componentes “Puglins” y sobre todo que es libre.

Empecé a revisar la documentación de Editra para ver como podía crear un Plugin de Arduino y en la actualidad ya tengo un desarrollo funcional, la dirección del proyecto es: http://wiki.cenditel.gob.ve/wiki/hlpd/idearduino

Este es un proyecto liberado bajo licencia GPL , por el momento el Plugin y la página cuentan con traducción e internacionalización a Español, Ingles e Italiano. ¡Anímate y participa!.



Capturas de Pantalla:







Vídeo:






Publicaciones:


David Cuartielles, uno de los creadores de Arduino a publicado un articulo en el Blog de Arduino sobre el Plugin de Arduino para Editra.

miércoles, 8 de octubre de 2008

Paquetes egg - - como poner huevos con Python

En Linux/Debian es necesario instalar el paquete python-setuptools

#aptitude install python-setuptools


para hacer este ejercicio tome como insumo la documentación de la página http://peak.telecommunity.com/DevCenter/setuptools, luego crear directorios y ficheros del paquete:

$mkdir egg_prueba
$mkdir paquete_egg

$cd egg_prueba

$echo "" > paquete_egg/__init__.py
$vim paquete_egg/familia.py


   1 
2 class Familia:
3 def __init__(self):
4 self.nombre = ""
5
6 def set_nombre(self, nombre):
7 self.nombre = nombre
8
9 def get_nombre(self):
10 return self.nombre

luego crear en el directorio paquete_egg/ el fichero setup.py que contiene toda la información del paquete.

$vim setup.py


   1 
2 # importa setuptools
3 from setuptools import setup, find_packages
4
5 # Tupla con información del paquete
6 setup(
7 name = "familia" # Nombre Paquete,
8 version = "0.1" # Versión Paquete,
9 packages = find_packages() # Busca módulos dentro del directorio paquete_egg,
10 scripts = [] # Scripts que deben ir a /usr/bin,
11
12 install_requires = [] # Dependencias de otros paquetes,
13
14 package_data = {}# Diccionario con ficheros que deben incluirse en el paquete, por ejemplo {'': *.txt},
15
16 # Metadatos para el repositorio Pypi
17 author = "Alexander Olivares",
18 author_email = "olivaresa@cantv.net",
19 description = "Este es un paquete egg de prueba con una clase Familia",
20 license = "GPL",
21 keywords = "" # Palabras clave de busqueda,
22 url = ""
23 )


Luego de hacer esto debemos tener la siguiente estructura de archivos y directorios:


egg_prueba/
setup.py
paquete_egg/
__init__.py
familia.py

Estando en el directorio egg_prueba/ ejecutar:

$python setup.py bdist_egg


Eso creara el paquete que estará en egg_prueba/dist/familia-0.1-py2.4.egg

para instalar:

#easy_install egg_prueba/dist/familia-0.1-py2.4.egg


para utilizar:


   1 from familia import *
2
3 f = Familia()
4 f.set_nombre("Olivares")
5 print f.get_nombre()
6 "Olivares"

Python 3000 - primer acercamiento

Python 3000 "py3k" ó Python 3.0 se encuentra actualmente en su fase beta2, la versión final de esta prevista para mediados de Octubre.
Me dispuse a probar la versión beta y la descargue de la página http://www.python.org/download/releases/3.0/, la descomprimí y ejecute:



$./configure
$make
$make test


Luego se recomienda instalarlo ejecutando "make install", pero en mi caso solo quería probar algunas cosas por tanto no me hizo falta, ejecute ./python y ya tenia la consola interactiva (>>>) de Python 3000.

Tomando como referencia de lo nuevo de Python 3000 en la dirección http://docs.python.org/dev/3.0/whatsnew/3.0.html, realice una serie de pruebas sencillas, que muestro a continuación:



Python 2.4


Python 3000


Comentario


>>>print "Hola"


>>>print("hola")


"print" ahora es una función


>>>aox = u"computación"


>>>aox = "computación"


por defecto los strings son utf-8


>>>if aox <> u"computación":


>>>if aox != "computación":


reemplazado "<>" por "!="


>>>True, False = 1, "2"


>>>


True , False, None son palabras reservadas


>>>aox = raw_input("Nombre")


>>>aox = input("Nombre")


raw_input() reemplazado por input()


>>>for i in xrange(10):


>>>for i in range(10):


xrange() reemplazado por range()



Estas son algunas de las características que han sufrido cambios y hacen imcopatible cualquier aplicación escrita con Python 2.x con Python 3000. En adelante estaré alimentando este post con nuevas impresiones.

Enlaces de interés:

http://www.python.com.ar/moin/Python3Mil

Internacionalización con Python

Para la utilización de traducción de aplicaciones a otros lenguajes utilizar la librería gettext

Siempre los strings a traducir deben ser etiquetados con _(), por ejemplo si queremos traducir "Hello" debería declararse como _("Hello") del resto se encargara gettext.

import gettext
gettext.translation("es", "./locale",languages=['es']).install()


El directorio locale/ es el que tendrá los ficheros de traducción.

Suponiendo que tenemos una aplicación que se llama aox.py que contiene strings que debemos traducir podríamos generar los ficheros de traducción con los siguientes comandos:

$xgettext aox.py -o locale/es/LC_MESSAGES/aox.pot
$msginit -i locale/es/LC_MESSAGES/aox.pot -o locale/es/LC_MESSAGES/es.po
$vim locale/es/LC_MESSAGES/es.po
$msgfmt locale/es/LC_MESSAGES/es.po -o locale/es/LC_MESSAGES/es.mo


En caso de modificar el programa o strings a traducir podremos actualizar los ficheros de traducción con los siguientes comandos:

$mv locale/es/LC_MESSAGES/aox.pot locale/es/LC_MESSAGES/aox.old.pot
$xgettext aox.py -o locale/es/LC_MESSAGES/aox.new.pot
$msgmerge -o locale/es/LC_MESSAGES/aox.pot locale/es/LC_MESSAGES/aox.old.pot locale/es/LC_MESSAGES/aox.new.po
$mv locale/es/LC_MESSAGES/es.po locale/es/LC_MESSAGES/es.old.po
$msginit -i locale/es/LC_MESSAGES/aox.pot -o locale/es/LC_MESSAGES/es.new.po
$msgmerge -o locale/es/LC_MESSAGES/es.po locale/es/LC_MESSAGES/es.old.po locale/es/LC_MESSAGES/es.new.po
$vim locale/es/LC_MESSAGES/es.po
$msgfmt locale/es/LC_MESSAGES/es.po -o locale/es/LC_MESSAGES/es.mo

Editar código Python con vim

El editor vim es muy potente para editar código en Python, no tiene nada que enviar a algunas reconocidas IDE's y además tiene muchos plugins.
Para utilizarlo en Linux/Debian se debe instalar el paquete "vim-python"

#aptitude install vim-python

Luego agregar estas lineas al fichero /etc/vim/vimrc

syntax on
set tabstop=4
set shiftwidth=4
set expandtab
set softtabstop=4
set background=dark
set autoindent

set smartindent " Identacion de acuerdo a marcadores lexicos
set sta " Las tabulaciones se ecriben como sw
set linebreak " Quebrar lineas largas
set sbr=@@@ " Marcador de linea quebrada
set number " Mostrar numero de linea
set scrolloff=2 " Para mostrar el contexto al cursor
set wildmode=list:longest,full " Autocompletacion en linea de comandos
set showcmd " Mostrara el comando a medida que lo tipeamos
set visualbell " Sin ruidos, por favor

autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except, finally,def,class

Esto les dará una mejor forma de trabajo, además de coloreado de sintaxis, 4 espacios por tab y algunas cosas mas.

Para utilizar la opción de auto-completado de código, presionar las teclas Ctrl-x Ctrl-o, por ejemplo:

$vim aox.py

import sys

sys. y aqui Ctrl-x Ctrl-o y les saldrá una solapa con todas las opciones
de sys

Screenshot



Como hacer un Mirror de GNU/Debian

Alexander Olivares, olivaresa@cantv.net

V0.1, 1 de Febrero del 2005.


En este documento se comenta como hacer una replica de GNU/Debian, no es un documento avanzado lo que se busca es explicar lo mas sencillamente posible como hacerlo.


Introducción.

Un Mirror de GNU/Debian no es mas que obtener una replica ó imagen de los paquetes de software necesario a partir de un site.

GNU/Debian es una de las distribuciones de Linux que mas esta teniendo aceptación en los usuarios de Linux, es uno de los sistemas operativos de código abierto que se desarrolla prácticamente día a día con una gran cantidad de paquetes que podemos mantener actualizados totalmente en línea accediendo a un sitio que contenga un mirror, es por eso que es interesante mantener un replica de GNU/Debian, especialmente si tenemos varias computadoras que utilizan esta distribución las cuales debemos mantener actualizadas.

Requerimientos.

  • Sistema Operativo GNU/Debian Testing (Sarge) ó Unstatble (Sid).

  • Saber que es lo que se desea replicar, es posible realizar un replica parcial o total, GNU/Debian esta soportado por las Arquitecturas (Intel x86 IA-32 i386, Sun Sparc, AMD64, etc... ver http://www.es.debian.org/ports/ ) y normalmente se mantienen 3 versiones llamadas (stable, testing, unstable ver http://www.es.debian.org/releases/ ), en este caso nos basaremos en un replica parcial a partir de la arquitectura i386 y la versión testing.

  • Elegir el sitio origen de donde se generara la replica por ejemplo ftp.debian.org.

  • Conexión de Banda Ancha a Internet (Cable,Aba ú otra..) igual o superior a los 256 Kbps.

  • Espacio suficiente en disco duro para almacenar la replica, por lo menos de 6 a 8 GB por versión.

  • Servicio Web Apache para compartir la replica.

Obtener e Instalar el Software Necesario.

Para crear y mantener actualizado nuestra replica utilizaremos un script escrito en perl llamado debmirror y lo instalaremos de la siguiente manera:

apt-get install debmirror


al ejecutar esta instrucción nos hará una pregunta si bajar e instalar dicho paquete y a su vez nos informara las dependencias con que cuenta el paquete y las instalara de forma automática.

Ejecución del la Actulizacion.

  • Sito Destino donde se almacenara la replica = /var/www/debian

  • Sitio origen de la replica = ftp.debian.org

  • Arquitectura que deseamos replicar = i386

  • Versión que deseamos replicar = testing ó sarge

  • Secciones a replicar = main, contrib, non-free

Teniendo estos parámetros ejecutamos actualización de la replica de la siguiente manera:

debmirror /var/www/debian --host=ftp.debian.org --root=/debian
--dist=testing --section=main,contrib,non-free --arch=i386
--progress --method=http --nosource --ignore-release-gpg


En este momento ya podemos bajar y mantener actulizada nuestra replica.

Ejecución de las Actualizaciones Automáticamente.

Para ejecutar diariamente la actualización de la replica basta con realizar este script con cualquier editor de texto y almacenarlo en el directorio de root con el nombre updatemirror.

#!/bin/sh
echo "Script de Actualización Automatica de MIRROR de GNU/DEBIAN"
echo "Verificando..."
st=`ps cax |grep -c "debmirror"`
echo "Analizando Ejecucion..."
if [ $st -eq 0 ];then
echo "Ejecutando Actualizacion...."
debmirror /var/www/debian --host=ftp.debian.org --root=/debian
--dist=testing --section=main,contrib,non-free --arch=i386
--progress --method=http --nosource --ignore-release-gpg
else
echo "La Actualización esta en proceso..."
fi


Cambiar los permisos de fichero para poder ejecutarlo.

chmod u+x updatemirror


Colocarlo en el demonio de ejecución de programas Cron a las 11:00pm todos los días.

crontab –e


y escribimos;

0 23 * * * /root/updatemirror


Configuración de las Estaciones.

Supongamos que el Servidor que contiene la replica posee la dirección ip 192.168.0.1

Editar el fichero /etc/apt/sources.list y agregar la siguiente linea:

deb http://192.168.0.1/debian testing main contrib non-free


Ejecutar el comando:

apt-get update;apt-get upgrade

Como comparar bases de datos de PostgreSQL

“diffdbpg” es un script sencillo realizado en Python que permite hacer una comparación básica entre dos bases de datos de PostgreSQL para detectar diferencias de estructura de datos.

Para utilizar el script debe editarlo con cualquier editor de texto y cambiar los valores de las variables:

#Base de datos 1 que se presume mas actualizada
db1="drupal" # nombre de base de datos
user1="aox" # usuario de base de datos
password1="xoa" # password de base de datos
host1="localhost" # host base de datos

#Base de datos 2 que se presume desactualizada
db2="drupal_1" # nombre de base de datos
user2="aox" # usuario de base de datos
password2="xoa" # password de base de datos
host2="localhost" # host base de datos


Para Ejecutar el script:

$python diffdbpg.py


Puede también ejecutar el script y dirigir la salida a un fichero, por ejemplo:
$python diffdbpg.py > aox_db

Descarga el script diffdbpg.py