Para instalar con python, el paquete estandar es distutils [distutils-sig].
Una alternativa es usar setuptools, que se supone incorpora ciertas mejoras sobre distutils.
Para distribuir código python nos vale. Si ademas nuestro proyecto require de versiones de librerías o de aplicaciones externas y queremos comprobar las dependencias, necesitaremos alguna herramienta adicional, tipo GNU Build System (GBS).
La mayor limitación de GBS es que es para UNIX, por lo que si queremos instalar en windows, necesitaremos cygwin. Una alternativa a usar cygwin es MinGW.
jueves, julio 19, 2007
miércoles, julio 18, 2007
MAC OS X
Estos tios de apple la verdad es que son unos genios. Me he enterado hace poco que el OS de apple está basado en BSD, vamos... que está basado en UNIX. Un motivo mas para querer un MAC. Podeis comprobarlo.
sábado, julio 14, 2007
Configuración de arranque de windows
Hoy he descubierto un comando superutil para ver que programas/servicios se ejecutan cuando arrancamos un windows, y para poder modificar el comportamiento. Se trata de msconfig.
viernes, julio 13, 2007
miércoles, julio 11, 2007
Alternativas a SWIG
Me está siendo duro usar swig...
¿Porque estoy usando swig? Pues sencillo porque en otra parte del proyecto se ha usado para acceder a C++.
Pero buscando información me he encontrado con que hay alternativas:
¿Porque estoy usando swig? Pues sencillo porque en otra parte del proyecto se ha usado para acceder a C++.
Pero buscando información me he encontrado con que hay alternativas:
Parece que la gente del grupo de python o que menos le gusta es SWIG. Por ejemplo:
"The best thing to do is to offer your C++-lib with a C-style interface. Then you can use python's ctypes (included since python2.5) to access the shared library.
If you insist on using C++, you can expose the lib using several available wrapper generators. I know of three: SIP, Swig & Boost::Python. The first I've got some very good first-hand experience. The second is somewhat primitive IHMO. The third I never used. "
El que diga que ctypes está incluido desde python2.5 no quiere decir que no se pueda usar con versiones anteriores.
Al respecto ver los mitos sobre swig.
Otro módulo interesante es pyrex.
lunes, julio 09, 2007
sábado, julio 07, 2007
Estoy que lo rompo!
Me pasan un portatil para el curro y creo que no me ha durado ni un mes.
Se ve que venía de serie con un 'xp media center' y lo transformaron en un 'xp pro' y así ha ido.
Bueno el jueves me lo dan ya de nuevo en teoria con un 'xp pro' instalado desde cero. Pues na que me pongo a enredar con el linux (live cd) para ver si logro hacer una imagen del sistema y ya me lo he cargado.
¡¡¡¡¡GAAAAAAAAAAAAAAAAAÑAAAAAAAAAAAAAAAAAAAAAAAAN!!!!!
No se como, pero supongo que me he cargado el MBR. La verdad es que el particionamiento que tiene es raro de cojones.... Como me de la lata lo particiono de otra manera...
C: es la unidad de datos (/dev/sda2 y bootable)
D: es la del sistema (/dev/sda5 (unidad lógica sobre /dev/sda1)
Y luego tengo espacio libre para meter un linux.
Antes de enredar me salve el MBR (por supuesto) pero no se porque me da que va a estar en sda2...
También salvé la tabla de particiones y según vi seguia igual.
Resumiendo no se que puede haber pasado.
Seguiremos indagando...
Con que cara les voy a llevar a los pobres chavales de sistemas el portatil de nuevo para qu eme lo instalen.... Me da que voy a apañarmelas por mi mismo.
Se ve que venía de serie con un 'xp media center' y lo transformaron en un 'xp pro' y así ha ido.
Bueno el jueves me lo dan ya de nuevo en teoria con un 'xp pro' instalado desde cero. Pues na que me pongo a enredar con el linux (live cd) para ver si logro hacer una imagen del sistema y ya me lo he cargado.
¡¡¡¡¡GAAAAAAAAAAAAAAAAAÑAAAAAAAAAAAAAAAAAAAAAAAAN!!!!!
No se como, pero supongo que me he cargado el MBR. La verdad es que el particionamiento que tiene es raro de cojones.... Como me de la lata lo particiono de otra manera...
C: es la unidad de datos (/dev/sda2 y bootable)
D: es la del sistema (/dev/sda5 (unidad lógica sobre /dev/sda1)
Y luego tengo espacio libre para meter un linux.
Antes de enredar me salve el MBR (por supuesto) pero no se porque me da que va a estar en sda2...
También salvé la tabla de particiones y según vi seguia igual.
Resumiendo no se que puede haber pasado.
Seguiremos indagando...
Con que cara les voy a llevar a los pobres chavales de sistemas el portatil de nuevo para qu eme lo instalen.... Me da que voy a apañarmelas por mi mismo.
viernes, julio 06, 2007
[swig] Primeros pasos
La forma mas simple de generar los bindings es usar %include [el_fichero.h].
Pero es dificil que sea una buena idea, a no ser que lo que se quiera usar sea algo muy sencillito.
Según la documentación recomiendan una serie de pasos:
Resumiendo.... que mejor solo hagas bindings para lo que realmente necesitas.
A continuación pongo otra parrafada interesante, sobre porque usar interface files.
"Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package.
There are several reasons why you might want to do this:
Un ejemplo de dos posibilidades de definicion. Una primera teniendo el fichero de interfaz:
/* File : interface.i */
%module mymodule
%{
#include "header.h"
%}
extern int foo(double);
extern double bar(int, int);
extern void dump(FILE *f);
Y la segunda (que en este caso estaría justificada por ser el fichero muy sencillo):
/* File : interface.i */
%module mymodule
%include header.h
Por ejemplo si usamos la ultima aproximación con libcroco, debemos usar el flag --includeall e indicar con -I las rutas de todos los ficheros necesarios (incluyendo los del sistema), generandose mucho codigo, cuando lo que necesitaremos será simplemente una función y acceder a unas estructuras de datos.
Es mas.... posiblemente al final la aproximacion mas facil será crear unas funciones de utilidad en C, y ya hacer los wrappers a dichas funciones de utilidad con swig.
Nota: un flag interesante es -v.
Pero es dificil que sea una buena idea, a no ser que lo que se quiera usar sea algo muy sencillito.
Según la documentación recomiendan una serie de pasos:
- "Identify the functions that you want to wrap. It's probably not necessary to access every single function in a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are particularly good source for finding things to wrap.
- Create a new interface file to describe the scripting language interface to your program.
- Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
- Make sure everything in the interface file uses ANSI C/C++syntax.
- Make sure all necessary `typedef' declarations and type-information is available in the interface file.
- If your program has a main() function, you may need to rename it (read on).
- Run SWIG and compile."
Resumiendo.... que mejor solo hagas bindings para lo que realmente necesitas.
A continuación pongo otra parrafada interesante, sobre porque usar interface files.
"Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package.
There are several reasons why you might want to do this:
- It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
- Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
- Interface files can provide more structure and organization.
- SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
- Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files."
Un ejemplo de dos posibilidades de definicion. Una primera teniendo el fichero de interfaz:
/* File : interface.i */
%module mymodule
%{
#include "header.h"
%}
extern int foo(double);
extern double bar(int, int);
extern void dump(FILE *f);
Y la segunda (que en este caso estaría justificada por ser el fichero muy sencillo):
/* File : interface.i */
%module mymodule
%include header.h
Por ejemplo si usamos la ultima aproximación con libcroco, debemos usar el flag --includeall e indicar con -I las rutas de todos los ficheros necesarios (incluyendo los del sistema), generandose mucho codigo, cuando lo que necesitaremos será simplemente una función y acceder a unas estructuras de datos.
Es mas.... posiblemente al final la aproximacion mas facil será crear unas funciones de utilidad en C, y ya hacer los wrappers a dichas funciones de utilidad con swig.
Nota: un flag interesante es -v.
[swig] Formato del fichero de interfaz
Una cosa que no esta bien explicada, o al menos no como un punto en la documentación (o al menos no lo he visto) que es el formato del fichero de interfaz, y una lista con las directivas soportadas.
En el fichero hay una serie de bloques que el formato[etiqueta] %{ %}.
Donde [etiqueta] puede ser:
El '%' es porque es el formato de las instrucciones para swig.
Por ejemplo el nombre del modulo en python se especifica con %module.
Todas esas etiquetas, con la excepcion de inline) sirven para incluir codigo que será includo en el fichero generado para el hacer el wrapper. No se parsean ni se generan los wrappers.
La excepción es inline: el codigo inline se da al compilador de C y a swig.
Un ejemplo de uso de inline lo tenemos en el primer ejemplo de swig: simple. Como no existe un header se meten las declaraciones en un bloque inline.
Si por el contrario tenemos un header, lo normal será usar el bloque %header y luego ya a continuación indicar las funciones para las cuales queremos generar los wrappers.
En el fichero hay una serie de bloques que el formato
Donde [etiqueta] puede ser:
- %runtime
- %header
- %wrapper
- %init
- %inline
El '%' es porque es el formato de las instrucciones para swig.
Por ejemplo el nombre del modulo en python se especifica con %module.
Todas esas etiquetas, con la excepcion de inline) sirven para incluir codigo que será includo en el fichero generado para el hacer el wrapper. No se parsean ni se generan los wrappers.
La excepción es inline: el codigo inline se da al compilador de C y a swig.
Un ejemplo de uso de inline lo tenemos en el primer ejemplo de swig: simple. Como no existe un header se meten las declaraciones en un bloque inline.
Si por el contrario tenemos un header, lo normal será usar el bloque %header y luego ya a continuación indicar las funciones para las cuales queremos generar los wrappers.
swig
En este post os presento a swig, el cual es una herramienta que nos permite 'conectar' programas escritos en C/C++ con programas escritos en lenguajes de script: como python, ruby, ...
Básicamene lo que hace es coger unas definiones y generar los wrapper necesarios para acceder al codigo C/C++,
En mi caso lo usaré para acceder a libcroco desde python. O bueno al menos eso intentaré.
Lo suyo es usar la version mas actual de swig, la 1.3.X. Sobre todo si estas con python 2.X.
Una de las cosas que sorprende es la calidad de la documentación. Da una imagen de un producto currado.
La mejor forma de empezar es tras bajarlo e instalarlo, echarle un vistazo a los ejemplos, que vienen bien documentados.
Según lo vaya creyendo conveniente pondrá algun post...
Básicamene lo que hace es coger unas definiones y generar los wrapper necesarios para acceder al codigo C/C++,
En mi caso lo usaré para acceder a libcroco desde python. O bueno al menos eso intentaré.
Lo suyo es usar la version mas actual de swig, la 1.3.X. Sobre todo si estas con python 2.X.
Una de las cosas que sorprende es la calidad de la documentación. Da una imagen de un producto currado.
La mejor forma de empezar es tras bajarlo e instalarlo, echarle un vistazo a los ejemplos, que vienen bien documentados.
Según lo vaya creyendo conveniente pondrá algun post...
miércoles, julio 04, 2007
Hacía mucho no visitaba a Telendro. Demoledor post sobre la información que puede manejar google sobre una web: Regalar toda la información sobre tu web a google.
martes, julio 03, 2007
jueves, junio 21, 2007
Logitech Alto
Se tenian que enrollar en mi empresa y que preparasen puestos para la gente que usa portatil con por ejemplo algo tipo Logitech Alto.
¿Su precio? Pues creo que anda por los 99 euros.
¿Su precio? Pues creo que anda por los 99 euros.
miércoles, junio 20, 2007
RotatingFile
He estado buscando algo para implementar la escritura en un fichero, con politica de rotación al superar un determinado tamaño, ya que no interesa reinventar nada.
Lo único que he encontrdo es el handler RotatingFileHandler de python.
Dicho handler podría ser valido o no, dependiendo de los requisitos funcionales. A mi, para lo que tengo que hacer no, pero ahí va un ejemplo de su uso. Una clase que lo recubre:
Lo único que he encontrdo es el handler RotatingFileHandler de python.
Dicho handler podría ser valido o no, dependiendo de los requisitos funcionales. A mi, para lo que tengo que hacer no, pero ahí va un ejemplo de su uso. Una clase que lo recubre:
import logging
import sys
from logging.handlers import RotatingFileHandler
#------------------------------------------------------------------------------
# RotatingFile
#------------------------------------------------------------------------------
class RotatingFile:
#------------------------------------------------------------------------------
def __init__(self,pathFilename,numBytes=0,numFiles=0):
"""
Notas:
- El fichero es de texto
- Para que exista la rotación los argumentos opcionales no pueden ser
0.
"""
# Notas:
# - Como al logger no se le fija un nivel, sacará todo
# - Al logger se le pone como identificador, la ruta al fichero.
# - Si numFiles es muy alto el algofirmo que se usa en el 'handler'
self.__logFile = pathFilename
self.__logger = logging.getLogger(self.__logFile)
hdlr = RotatingFileHandler( self.__logFile,'a',numBytes,numFiles )
fmt = logging.Formatter("%(message)s")
hdlr.setFormatter(fmt)
self.__logger.addHandler(hdlr)
#------------------------------------------------------------------------------
def write(self,value):
self.__logger.critical(value)
#------------------------------------------------------------------------------
# main (de prueba)
#------------------------------------------------------------------------------
if ( __name__ == "__main__") :
rf = RotatingFile("rotatingfile.out",10,5)
for i in range(10):
rf.write(str(i))
lunes, junio 18, 2007
WinShit
Definivamente.... windows es una mierda de sistema operativo.
El viernes lo pude comprobar en mis propias carnes. Me paso algo que como es posible que jamas puede llegar a pasar en un sistema operativo. ¿Como puede ser que el SO no sea capaz de borrar un arbol de directorios?
En mi curro suelo currar remotamiente con sesiones ssh, pero para probar una cosilla, decidí hacerlo en local, usando el eclipse: así mataba dos pajaros de un tiro: probaba lo que tenía que probar y echaba un vistazo a eclipse.
Pues bien... como no controlo eclipse, y tampoco miré ni un misero tutorial ni leches, hice algo mal y el programita de marras me metió en un bucle creando una estructura de directorios anidada recursiva muy profunda.
Al detectalo pues intenté borrarlo, encontrandome con el problema que menciono: link a la página de soporte de Microsoft.
Al no poder se me ocurrió es usar Linux, pero Linux con ntfs no se lleva demasiado bien... Hay cosillas por ahí un poco experimentales... y ante mi urgencia y no tener instalado linux en la maquina (probé con live-cd) me busqué alguna alternativa.
Al final mediante el comando subst y paciencia he podido borrar casi todo, pero me queda algo que no he sido capaz. Parece que hay algo corrupto (pero chkdsk no da errores)... A ver si le vuelvo a meter mano y acabo de una vez con el dichoso arbolito...
Unos links para acabar:
El viernes lo pude comprobar en mis propias carnes. Me paso algo que como es posible que jamas puede llegar a pasar en un sistema operativo. ¿Como puede ser que el SO no sea capaz de borrar un arbol de directorios?
En mi curro suelo currar remotamiente con sesiones ssh, pero para probar una cosilla, decidí hacerlo en local, usando el eclipse: así mataba dos pajaros de un tiro: probaba lo que tenía que probar y echaba un vistazo a eclipse.
Pues bien... como no controlo eclipse, y tampoco miré ni un misero tutorial ni leches, hice algo mal y el programita de marras me metió en un bucle creando una estructura de directorios anidada recursiva muy profunda.
Al detectalo pues intenté borrarlo, encontrandome con el problema que menciono: link a la página de soporte de Microsoft.
Al no poder se me ocurrió es usar Linux, pero Linux con ntfs no se lleva demasiado bien... Hay cosillas por ahí un poco experimentales... y ante mi urgencia y no tener instalado linux en la maquina (probé con live-cd) me busqué alguna alternativa.
Al final mediante el comando subst y paciencia he podido borrar casi todo, pero me queda algo que no he sido capaz. Parece que hay algo corrupto (pero chkdsk no da errores)... A ver si le vuelvo a meter mano y acabo de una vez con el dichoso arbolito...
Unos links para acabar:
miércoles, junio 13, 2007
WinSysAdmineando
No se porque la gente dice que Windows es mas sencillo que Linux. Lo es hasta que no te salen quebraderos de cabeza. Claro si usas un XP Home Edition pues pocos problemas vas a tener...
Porque yo ya llevo unos cuantos con mi XP Profesional Edition. El último hoy, con la instalación de los drivers del Scanner Scanjet G3010 y el Photoshop.
Tras instalarlo en usuario Administrador iba sin problemas pero en usuario normales no funcionaba, ni el scanner ni el Photoshop. Vamos por partes...
Scanner
El software de HP, por lo que he podido leer por ahí es un poco gena en entorno multiusuario. Y el soporte por lo visto deja un poquito que desear... [pendiente meter un par de referencias]
La solución al final ha sido dar permisos a los usuarios normales a una determinada key del registro.
Photoshop
Tras solucionar lo del scaner todavía quedaba lo de photoshop. En un principio pensaba que el problema estaba relacionado, pero seguía sin funcionar...
La solución ha sido el meter a los usuario que lo usan como 'usuarios avanzados'. Ya se que no es muy solución muy profesional pero me ha funcionado y paso de perder mas tiempo con esto.... ;)
¿Que os parece? ¿Sencillo verdad? ¡Ja!
Relacionado hoy en meneame: Detecta todo lo que se inicia en tu windows.
Porque yo ya llevo unos cuantos con mi XP Profesional Edition. El último hoy, con la instalación de los drivers del Scanner Scanjet G3010 y el Photoshop.
Tras instalarlo en usuario Administrador iba sin problemas pero en usuario normales no funcionaba, ni el scanner ni el Photoshop. Vamos por partes...
Scanner
El software de HP, por lo que he podido leer por ahí es un poco gena en entorno multiusuario. Y el soporte por lo visto deja un poquito que desear... [pendiente meter un par de referencias]
La solución al final ha sido dar permisos a los usuarios normales a una determinada key del registro.
Photoshop
Tras solucionar lo del scaner todavía quedaba lo de photoshop. En un principio pensaba que el problema estaba relacionado, pero seguía sin funcionar...
La solución ha sido el meter a los usuario que lo usan como 'usuarios avanzados'. Ya se que no es muy solución muy profesional pero me ha funcionado y paso de perder mas tiempo con esto.... ;)
¿Que os parece? ¿Sencillo verdad? ¡Ja!
Relacionado hoy en meneame: Detecta todo lo que se inicia en tu windows.
martes, junio 12, 2007
A vueltas con cssutils
Tercer post en el que menciono cssutils. Los anteriores [1][2].
En este os puedo decir que lo estoy usando, y que la verdad funciona bien, aunque le he visto 2 peros:
El problema debe ser, que según está hecho es simplemente ineficiente. O que el hacer un parser en python, es simplemente ineficiente. No lo se....
Quizás con menos comprobaciones....
He vuelto a mirar en python-es y en google groups, y no he encontrado nada de nada. Me da que voy a tener que implementarmelo... o hacer unos bindings a alguno de C.
Un par de referencias de cara a una posible implementación [vía]:
En este os puedo decir que lo estoy usando, y que la verdad funciona bien, aunque le he visto 2 peros:
- Las estructuras de datos manejadas no son muy pythonianas
- Es lento (muy). Por poner un ejemplo en procesar los css's de elpais.com tarda mas de 10 segundos (en una maquina Linux potente potente).
El problema debe ser, que según está hecho es simplemente ineficiente. O que el hacer un parser en python, es simplemente ineficiente. No lo se....
Quizás con menos comprobaciones....
He vuelto a mirar en python-es y en google groups, y no he encontrado nada de nada. Me da que voy a tener que implementarmelo... o hacer unos bindings a alguno de C.
Un par de referencias de cara a una posible implementación [vía]:
viernes, junio 01, 2007
Norton Ghost
Tras tener un sistema básico montado, lo suyo es tener una copia de respaldo para poderlo restaurar.
Tras investigar que hay por ahí (lo justo), he probado Norton Ghost ya que parace que es la mejor herramienta pra hacer imagenes del HD. Pues bien, no me ha servido. Porque lo que yo quiero es algo que me vuelva a restaurar el sistem desde CD y que el propio CD sea arrancable.
Se me ocurre hacerlo con linux a través del comando dd, pero como que es muy básico.
Seguiremos investigando.... y probando.
Una referencia: Disk cloning.
Tras investigar que hay por ahí (lo justo), he probado Norton Ghost ya que parace que es la mejor herramienta pra hacer imagenes del HD. Pues bien, no me ha servido. Porque lo que yo quiero es algo que me vuelva a restaurar el sistem desde CD y que el propio CD sea arrancable.
Se me ocurre hacerlo con linux a través del comando dd, pero como que es muy básico.
Seguiremos investigando.... y probando.
Una referencia: Disk cloning.
Nuevo ordenata
Que mala racha...
Pues no va y me peta el Desktop de casa (creo que la placa). Y unos dias despues el monitor...
Total que me he pillado otro ordenata. Tocaba actualizarse. Esta vez me he lanzado a un procesador AMD económico, 2 GB de memoria, disco duro de 250 GB, placa con soporte a firewire, una fuente sileciosa, una tarjeta de video ATI... Vamos en torno a 500 leuros.
Como monitor un LG de 17'' que no llegó a los 180 leuros.
Tras ello, la rutina de turno, instalar los OS. Ya me he actualizado a XP Pro, y le he metido un ubuntu 7.04.
Tras tener el ubuntu (que usa gnome) me comenta el Hectorín que le gusta mas kubuntu. Y he aqui mi duda.... ¿Cual es mejor kde o gnome?
Resumiendo por lo que he leido...: a gusto del consumidor. Lo que si parece es que gnome es mas ligerito.
A mi personalmente me gusta. Lo veo simple e intuitivo. Y como las aplicaciones que mas voy a usar no van a ser las que vengan con ambos desktops... Pues como que me vale ubuntu.
Pero tengo ganas de probar el kde. A ver si me bajo un live cd (si es que lo tienen).
Bueno paso unos links sobre el tema:
Y lo que he visto es que gentoo sigue teniendo su nicho. Por lo que he leido tienen una wiki muy completa, que sirve para el resto de distribuciones también. Pero vamos el instalar gentoo es para freakis y no lo haría nunca para un desktop. Podría ser interesante para un servidor en el que sólo quieres meter lo justo y necesario.
Pues no va y me peta el Desktop de casa (creo que la placa). Y unos dias despues el monitor...
Total que me he pillado otro ordenata. Tocaba actualizarse. Esta vez me he lanzado a un procesador AMD económico, 2 GB de memoria, disco duro de 250 GB, placa con soporte a firewire, una fuente sileciosa, una tarjeta de video ATI... Vamos en torno a 500 leuros.
Como monitor un LG de 17'' que no llegó a los 180 leuros.
Tras ello, la rutina de turno, instalar los OS. Ya me he actualizado a XP Pro, y le he metido un ubuntu 7.04.
Tras tener el ubuntu (que usa gnome) me comenta el Hectorín que le gusta mas kubuntu. Y he aqui mi duda.... ¿Cual es mejor kde o gnome?
Resumiendo por lo que he leido...: a gusto del consumidor. Lo que si parece es que gnome es mas ligerito.
A mi personalmente me gusta. Lo veo simple e intuitivo. Y como las aplicaciones que mas voy a usar no van a ser las que vengan con ambos desktops... Pues como que me vale ubuntu.
Pero tengo ganas de probar el kde. A ver si me bajo un live cd (si es que lo tienen).
Bueno paso unos links sobre el tema:
- Stallman on Qt, the GPL, KDE, and GNOME
- KDE vs. GNOME: Is One Better?
- Which Has the Best Apps?: KDE vs. GNOME, Part 2
- Y una comparación de la wikipedia.
Y lo que he visto es que gentoo sigue teniendo su nicho. Por lo que he leido tienen una wiki muy completa, que sirve para el resto de distribuciones también. Pero vamos el instalar gentoo es para freakis y no lo haría nunca para un desktop. Podría ser interesante para un servidor en el que sólo quieres meter lo justo y necesario.
Suscribirse a:
Entradas (Atom)