viernes, enero 26, 2007
Mas sobre cssutils
Antes de nada indicar que estoy usando la distribución 0.9.1b3 de cssutils.
Tests
En teoria los test podriamos ejecutarlos tras hacer una build del paquete, o incluso tras descomprimirlo. Mediante:
python setup.py test
Pero por lo que sea no me ha funcinado. Bueno no pasa nada... podemos lanzar los test desde el directorio de tests (../src/cssutils/tests) de la siguiente manera (en 'kk' tendremos la salida):
for i in test_*.py; do echo $i >> kk; python $i >> kk 2>&1; done
Veremos que aparecen trazas de error. No pasa nada. Lo importante es que el test nos devuelva OK.
encutils
cssutils tiene un paquete, encutils, a tener en cuenta.
La funcion principal es getEncodingInfo que devuelve informacion sobre le encoding. Esta informacion se extrae del elemento pasado: headers de HTTPResponse, XML declaration y lementos meta X/HTML.
Resumiendo podemos pasar un HTTPResponse o un texto como argumento.
Aunque no la he probado, parece currada.
csscapture
Permite extraer todos las hojas de estilo de una url determinada (incluyendo las que estan embebidas en la propia página html).
Usa HTMLParser.
El parseo (interioridades)
El parser desencadena el parseo al asignar el texto del css al objeto CSSStylesheet.
Para realizar el parseo se usa tokenizer.CSSTokenizer.
El único pero que veo a cssutils es que es un poco lento con el parseo. Necesitamos mas velocidad. No se si se podrá obtimizar algo... He estado echando un vistazo rápido pero el codigo no es sencillo.
Habrá que meteler el profiler, a ver si hay algo que canta.
Tests
En teoria los test podriamos ejecutarlos tras hacer una build del paquete, o incluso tras descomprimirlo. Mediante:
python setup.py test
Pero por lo que sea no me ha funcinado. Bueno no pasa nada... podemos lanzar los test desde el directorio de tests (../src/cssutils/tests) de la siguiente manera (en 'kk' tendremos la salida):
for i in test_*.py; do echo $i >> kk; python $i >> kk 2>&1; done
Veremos que aparecen trazas de error. No pasa nada. Lo importante es que el test nos devuelva OK.
encutils
cssutils tiene un paquete, encutils, a tener en cuenta.
La funcion principal es getEncodingInfo que devuelve informacion sobre le encoding. Esta informacion se extrae del elemento pasado: headers de HTTPResponse, XML declaration y lementos meta X/HTML.
Resumiendo podemos pasar un HTTPResponse o un texto como argumento.
Aunque no la he probado, parece currada.
csscapture
Permite extraer todos las hojas de estilo de una url determinada (incluyendo las que estan embebidas en la propia página html).
Usa HTMLParser.
El parseo (interioridades)
El parser desencadena el parseo al asignar el texto del css al objeto CSSStylesheet.
Para realizar el parseo se usa tokenizer.CSSTokenizer.
El único pero que veo a cssutils es que es un poco lento con el parseo. Necesitamos mas velocidad. No se si se podrá obtimizar algo... He estado echando un vistazo rápido pero el codigo no es sencillo.
Habrá que meteler el profiler, a ver si hay algo que canta.
martes, enero 23, 2007
Python bindings
Un par de productos para crear bindings entre python y otros lenguajes:
- boost.python. Para C++
- swig. [introducción]
lunes, enero 22, 2007
Parsers de CSS
He tenido que mirar que hay por ahí, para parsear CSS's en python. Lo primero que tengo que decir es que estoy realmente sorprendido. No he encontrado ningún producto maduro, y ni siquiera unos bindings en python.
Los dos parsers que he encontrado en python usan además DOM, por lo que no hay nada SAX (o en gerga CSS SAC).
Esto significa que alguien con interés, ganas y tiempo puede hacer algo útil para la comunidad del software libre...
Pero lo que mas me sorprende es no haber encontrado nada ni en python-es, ni en comp.lang.python.
Antes de entrar a comentar los parsers, comentar que CSS tiene tres versiones, CSS1, CSS2 y CSS3 (en desarrollo).
Todos los parsers implementan CSS1 y por lo que he podido ver CSS2 parcialmente.
Bueno al lio... los parsers de python encontrados son:
Si no nos convencen ninguno de los dos, no nos va a quedar mas remedio que implementar unos bindings a alguno existente en C (vamos lo normal en python... no lo vamos a hacer de uno implementado en Java; ummm, aunque no he dicho un disparate... siempre se puede usar jython ;)). En C he encontrado:
Finalmente se puede intentar usar el parser que use algún browser (implementando el binding correspondiente, claro). Entre los disponibles parece que el candidato más lógico sería usar del del firefox, Gecko.
Mas info sobre el parser de CSS de Gecko aquí.
Los dos parsers que he encontrado en python usan además DOM, por lo que no hay nada SAX (o en gerga CSS SAC).
Esto significa que alguien con interés, ganas y tiempo puede hacer algo útil para la comunidad del software libre...
Pero lo que mas me sorprende es no haber encontrado nada ni en python-es, ni en comp.lang.python.
Antes de entrar a comentar los parsers, comentar que CSS tiene tres versiones, CSS1, CSS2 y CSS3 (en desarrollo).
Todos los parsers implementan CSS1 y por lo que he podido ver CSS2 parcialmente.
Bueno al lio... los parsers de python encontrados son:
- cssutils (beta) y
- TechGame Framework CSS Parser and Engine (alpha)
Si no nos convencen ninguno de los dos, no nos va a quedar mas remedio que implementar unos bindings a alguno existente en C (vamos lo normal en python... no lo vamos a hacer de uno implementado en Java; ummm, aunque no he dicho un disparate... siempre se puede usar jython ;)). En C he encontrado:
- El SAC de w3.org.
- Libcroco: parser SAC y CSSOM like api para gnome.
Finalmente se puede intentar usar el parser que use algún browser (implementando el binding correspondiente, claro). Entre los disponibles parece que el candidato más lógico sería usar del del firefox, Gecko.
Mas info sobre el parser de CSS de Gecko aquí.
jueves, enero 11, 2007
Validad un DTD
Si queremos validar un DTD lo que podemos hacer es usar un validador de xml que use dicho DTD.
Al cargarlo detectará posibles errores.
Por ejemplo podemo susar xmllint:
xmllint --valid
Al cargarlo detectará posibles errores.
Por ejemplo podemo susar xmllint:
xmllint --valid
miércoles, enero 10, 2007
RSS Readers
Ya he comentado anteriormente sobre agregadores de feeds: [1],[2] y [3].
Me vuelve a surgir el tema porque tengo que obtener feeds de una intranet, por lo que los lectores web no me sirven. Voy a tener que usar el firefox o bien una aplicación local.
Para windows me recomiendan Omea Reader (Net 2.0) y para linux liferea (gnome) o kagregator. (kde)
Con el firefox voy a echarle un vistazo a sage y ver como funcionan los live bookmarks.
Me vuelve a surgir el tema porque tengo que obtener feeds de una intranet, por lo que los lectores web no me sirven. Voy a tener que usar el firefox o bien una aplicación local.
Para windows me recomiendan Omea Reader (Net 2.0) y para linux liferea (gnome) o kagregator. (kde)
Con el firefox voy a echarle un vistazo a sage y ver como funcionan los live bookmarks.
martes, enero 09, 2007
¿libxml2 leak in python (html sax-parsing)?
Me siento un poco fustrado con el parser de html de libxml2. Se nos va memoria a saco y no tengo ni idea de como evitarlo.
He preguntado a la lista, pero no ha servido de mucho. A ver si me aclaran algo mas... Actualizaré el post cuando sepa algo.
Tras detectar que en nuestro codigo el mayor problema con la memoria lo teníamos con el parser sax de html de libxml2, modifiqué el test que acompaña a la distribución (pushSAXhtml.py)para que en lugar de procesar 1 fichero, procese N, siendo N un número suficientemente grande para ver las perdidas de memoria...
Pues bien, en algo mas de 10 minutos procesando el proceso se cae por un segmentation fault.
El específico en el bucle para procesar el fichero por el parser es:
ctxt = libxml2.htmlCreatePushParser(handler, initdata, 0, inputFilePath)
ctxt.htmlParseChunk(data, len(data), 1)
ctxt = None
En el callback no hacemos nada:
class callback:
def startDocument(self):
print "."
def endDocument(self):
pass
def startElement(self, tag, attrs):
pass
def endElement(self, tag):
pass
def characters(self, data):
pass
def warning(self, msg):
pass
def error(self, msg):
pass
def fatalError(self, msg):
pass
¡Ojo! la fuga de memoria la vemos a nivel del sistema operativo (con top o mirando en /proc (por ejemplo con mem-monitor)), ya que las rutinas específicas de libxml2 nos indican que todo está OK.
En fin... que con este problema no podemos llevar nuestro codigo a producción. O solucionamos esto o tenemos que mirar otro parser (posible candidato beautifulsoup); cosa que no me gustaría.
Otra cosa que me ha frustado mucho es no encontrar nada en la web. ¿Es que nadie por ahí esta parseando html con libxml2 usando SAX? No me lo puedo creer...
Ah! un detalle que se me olvidada. En el código asignamos None al contexto. Es correcto. Eso provoca la invocación a xmlFreeParserCtxt(que es lo mismo que htmlFreeParserCtxt: esta llama a la anterior). Con lo cual no tenemos que liberar nada mas, ya que el documento no lo usamos. De hecho si intentamos obtener el documento los bindings de python nos devolverán una excepción.
Para terminar de cerrar el tema y asegurame de que no hay nada raro en mi entorno he hecho el ejemplo equivalente en C, y ha funcionado sin problemas. Ahí va el codigo:
Para hacerlo operativo modificar las constantes BUFFER_SIZE, NUM_ITERS, FILE_PATH, al gusto del consumidor.
He preguntado a la lista, pero no ha servido de mucho. A ver si me aclaran algo mas... Actualizaré el post cuando sepa algo.
Tras detectar que en nuestro codigo el mayor problema con la memoria lo teníamos con el parser sax de html de libxml2, modifiqué el test que acompaña a la distribución (pushSAXhtml.py)para que en lugar de procesar 1 fichero, procese N, siendo N un número suficientemente grande para ver las perdidas de memoria...
Pues bien, en algo mas de 10 minutos procesando el proceso se cae por un segmentation fault.
El específico en el bucle para procesar el fichero por el parser es:
ctxt = libxml2.htmlCreatePushParser(handler, initdata, 0, inputFilePath)
ctxt.htmlParseChunk(data, len(data), 1)
ctxt = None
En el callback no hacemos nada:
class callback:
def startDocument(self):
print "."
def endDocument(self):
pass
def startElement(self, tag, attrs):
pass
def endElement(self, tag):
pass
def characters(self, data):
pass
def warning(self, msg):
pass
def error(self, msg):
pass
def fatalError(self, msg):
pass
¡Ojo! la fuga de memoria la vemos a nivel del sistema operativo (con top o mirando en /proc (por ejemplo con mem-monitor)), ya que las rutinas específicas de libxml2 nos indican que todo está OK.
En fin... que con este problema no podemos llevar nuestro codigo a producción. O solucionamos esto o tenemos que mirar otro parser (posible candidato beautifulsoup); cosa que no me gustaría.
Otra cosa que me ha frustado mucho es no encontrar nada en la web. ¿Es que nadie por ahí esta parseando html con libxml2 usando SAX? No me lo puedo creer...
Ah! un detalle que se me olvidada. En el código asignamos None al contexto. Es correcto. Eso provoca la invocación a xmlFreeParserCtxt(que es lo mismo que htmlFreeParserCtxt: esta llama a la anterior). Con lo cual no tenemos que liberar nada mas, ya que el documento no lo usamos. De hecho si intentamos obtener el documento los bindings de python nos devolverán una excepción.
Para terminar de cerrar el tema y asegurame de que no hay nada raro en mi entorno he hecho el ejemplo equivalente en C, y ha funcionado sin problemas. Ahí va el codigo:
/* libxml2 C HTML Parser Example
* gcc-I -L -lxml2
*/
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 100000
#define NUM_ITERS 10000
#define FILE_PATH ""
/*****************************************************************************/
/*
* Foo context structure
*/
typedef struct
{
int foo;
} Context;
/*
* libxml start element callback function
*/
void startElement(void *voidContext,
const xmlChar *name,
const xmlChar **attributes)
{
return;
}
/*
* libxml end element callback function
*/
void endElement(void *voidContext,
const xmlChar *name)
{
return;
}
/*
* Text handling helper function
*/
void handleCharacters(Context *context,
const xmlChar *chars,
int length)
{
return;
}
/*
* libxml PCDATA callback function
*/
void characters(void *voidContext,
const xmlChar *chars,
int length)
{
return;
}
/*
* libxml CDATA callback function
*/
void cdata(void *voidContext,
const xmlChar *chars,
int length)
{
return;
}
htmlSAXHandler saxHandler =
{
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
startElement,
endElement,
NULL,
characters,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
cdata,
NULL
};
/*****************************************************************************/
char buffer[BUFFER_SIZE];
int main(void)
{
htmlParserCtxtPtr ctxt;
Context context;
char *filepath=FILE_PATH;
FILE *f = NULL;
long fileLen = 0;
long retRead = 0;
int i=0;
/*---- Reading the data */
/*
struct stat myStat;
stat(filepath,&myStat);
if (myStat.st_size >= BUFFER_SIZE)
{
print("El fichero no cabe en el buffer\n");
return 1;
}
*/
f = fopen(filepath, "r");
if ( f == NULL ) /* Could not open file */
{
printf("Error opening %s: %s (%u)\n", filepath, strerror(errno), errno);
return 1;
}
fseek(f, 0L, SEEK_END); /* Position to end of file */
fileLen = ftell(f); /* Get file length */
rewind(f); /* Back to start of file */
if (fileLen >= BUFFER_SIZE)
{
printf("El fichero no cabe en el buffer: %d\n",fileLen);
return 1;
}
retRead = fread(buffer,fileLen,1,f);
if (retRead != 1)
{
printf("Error haciendo el read");
return 1;
}
fclose(f);
/*---- We parser the file */
for(i=0;i < NUM_ITERS; ++i)
{
ctxt = htmlCreatePushParserCtxt(&saxHandler, &context, "", 0, "",
XML_CHAR_ENCODING_NONE);
htmlParseChunk(ctxt, buffer, fileLen, 0);
htmlParseChunk(ctxt, "", 0, 1);
htmlFreeParserCtxt(ctxt);
printf(".\n");
}
return 0;
}
Para hacerlo operativo modificar las constantes BUFFER_SIZE, NUM_ITERS, FILE_PATH, al gusto del consumidor.
miércoles, enero 03, 2007
Uso de etiquetas en blogger
Hace poco he migrado todos mis blogs a la nueva versión de blogger. Mi mayor interés para ello era el poder etiquetar los posts.
Pero una vez hecho, la template usada se mantenía (no se mostraban las labels). Tras estar indagando un poco he visto que es necesario actualizar la template, pudiendo modificar el diseño a golpe de ratón, cosa que antes no se podía. Es una gran mejora.
¡¡¡Ojo!!! Si en la template anterior habeis hecho modificaciones a mano se perderán, si no las meteis en la nueva template antes de guardarla.
Ya con respecto a las etiquetas indicar un par de cosas:
Y ya para acabar indicar que si estamos en blogger, cuando estamos visualizando nuestro blog, nos permite editar los elementos compositivos de la template (por ejemplo añadir un enlace a la lista de enlaces).
Resumiendo: ha mejorado mucho blogger con esta nueva versión.
Pero una vez hecho, la template usada se mantenía (no se mostraban las labels). Tras estar indagando un poco he visto que es necesario actualizar la template, pudiendo modificar el diseño a golpe de ratón, cosa que antes no se podía. Es una gran mejora.
¡¡¡Ojo!!! Si en la template anterior habeis hecho modificaciones a mano se perderán, si no las meteis en la nueva template antes de guardarla.
Ya con respecto a las etiquetas indicar un par de cosas:
- se muestran como una lista, bien ordenada alfabéticamente o por frecuencia
- se pueden hacer feeds por las etiquetas; mas información aquí.
Y ya para acabar indicar que si estamos en blogger, cuando estamos visualizando nuestro blog, nos permite editar los elementos compositivos de la template (por ejemplo añadir un enlace a la lista de enlaces).
Resumiendo: ha mejorado mucho blogger con esta nueva versión.
martes, enero 02, 2007
sábado, diciembre 30, 2006
domingo, diciembre 17, 2006
jueves, diciembre 14, 2006
miércoles, diciembre 06, 2006
martes, noviembre 21, 2006
Portatil ligero
Para mi, actualmente hay 3 nichos en el mercado de los portatiles:
- el de los ligeros
- el de los polivalentes
- el de los multimedia
El de los polivalentes será el típico, vamos... un portatil normalito, con pantalla de 14''-15''.
El de los ligeros, será el de los portatiles que no sobrepasen los 2,5 kilos.
Dentro de los ligeros, estarían los superligeros, cuyo peso no sobrepasaría los 2 kilogramos.
Yo andaba con ganas de comprarme un portatil ligero, ya que para la casa, donde este un sobremesa... Además me gusta tener un ordenador de respaldo...
Pero ya que era realmente un capricho, me he ido a los superligeros. No quiero que el peso sea una excusa para cargar con él. Vamos que lo puedas meter en cualquier lado...
Mi compra ha sido un Sony VAIO SVG SZ2M/B. Dentro de los SZ, el único motivo para irme a por ese modelo ha sido por el precio. Pero ahora mismo, supongo que por la llegada de los procesadores core 2 duo, estan bajando de precio (ver).
Si no nos importa cargar con un poco mas de peso, pues podríamos considerar el dell latitude 620.
Y dentro del margén de los 2,5 kilos, en cuanto a diseño lo tengo claro: me quedo con el Apple MacBook.
sábado, noviembre 04, 2006
Si como yo dispones del Router Xavi 7768r Wireless (uno de los que ponía telefonica), en el link anterior tendrás toda la información que necesites para configurarlo.
jueves, noviembre 02, 2006
En vista de que voy a tener un portatil nuevecito y me viene con el Home Edition, he curioseado en la red: Windows XP Home Edition vs. Professional Edition: What's the difference?
martes, octubre 31, 2006
RSS Readers
En primer lugar si quereis saber de que va el RSS, ahí va un link.
Ya hace tiempo que existen los RSS Readers, pero la verdad.... Había pasado mucho de su uso.... Hasta hace poco que empecé a usar el de Yahoo. Y la verdad... Te facilita el consultar esos blogs que son tus habituales...
Hoy he empezado a probar otro, alesti, y la verdad... Estoy encantado! Os recomiendo el uso de un RSS Reader sin dudarlo.
Realmente hay una gran cantidad de ellos para escoger, como podeis ver en los siguientes links: [1], [2] y [3]. O buscando info en google.
Si ya usais google, quizás os pueda interesar el uso de Google Reader.
Bueno hasta ahora estoy hablando de productos que estan en la web, pero no tiene porque ser así, pueden ser aplicaciones que tengais intaladas en vuestra máquina, o incluso en vuestro navegados, como la extension Sage de Firefox (y no es el único).
Volviendo a alesti, surgió como rival a bloglines.
Y ya para acabar este por mencionar un par de ellos mas que he oido mentar:
Lo que si que es fundamental, es que puedan exportar e importar las subscripciones, para de esta manera poder migrar de uno a otro.
martes, octubre 17, 2006
No he tenido tiempo de echar un vistazo a estos links en profundidad, pero parecen muy interesantes. Van sobre Amara:
Aparte de lo técnico, interesante ver que Uche Ogbuji tiene una pagina web.
Volviendo a Amara... por lo visto se basa en 4Suite, ofreciendo la funcionalidad de 4Suite de una manera mas 'pitoniana'.
Aparte de lo técnico, interesante ver que Uche Ogbuji tiene una pagina web.
Volviendo a Amara... por lo visto se basa en 4Suite, ofreciendo la funcionalidad de 4Suite de una manera mas 'pitoniana'.
lunes, octubre 16, 2006
A traves de Agile Testing, llego a una taxomonía de herramientas de testeo para python.
Para hacer unit testing en python, la herramienta estandard es PyUnit.
Unos links para profundizar en PyUnit:
Para hacer unit testing en python, la herramienta estandard es PyUnit.
Unos links para profundizar en PyUnit:
miércoles, octubre 11, 2006
Log4J
Si tienes que usar una librería de logs en Java, la mejor cadidata posiblemente sea Log4J.
Entre la documentación disponible, es de mirar:
Con estos dos ya tienes para tirar... El segundo tiene un fichero log4j.properties básico.
sábado, octubre 07, 2006
DOM Inspector
Al instalar Firefox , si personalizamos la instalación, podemos indicarle que se instalen las herramientas para desarrolladores. Entre ellas está el DOM Inspector, la cual es superutil (por ejemplo para hackear formularios con campos ocultos: vaya mala practica de programación...).
viernes, octubre 06, 2006
El siguiente enlace ya lo había enlazado previamente: Python Memory Management. Merece la pena que lo vuelva a enlazar, ya que es un artículo muy interesante sobre como gestiona python la memoria.
Una cosa muy interesante que dice es que en Python 2.5 la gestión de la memoria se ha cambiado, aunque no se indica en las 'what´s new' que he mirado.
Una par de links mas para acabar:
Una cosa muy interesante que dice es que en Python 2.5 la gestión de la memoria se ha cambiado, aunque no se indica en las 'what´s new' que he mirado.
Una par de links mas para acabar:
- Mail sobre el parche (de Tim Peters).
- Una presentacion de Evan Jones sobre el problema: Improving python´s memory allocator [en html].
jueves, octubre 05, 2006
miércoles, octubre 04, 2006
La extensión MM3-ProxySwitch del firefox es superutil si a menudo cambias de proxy para conectarte a internet.
martes, septiembre 12, 2006
miércoles, agosto 30, 2006
martes, agosto 29, 2006
martes, agosto 15, 2006
Blogger por fin se decide a meter nuevas 'features'. Como indican todavía esta en beta.
Menos mal que espabilan porque wordpress estaba ganando adeptos.
Veo que en ojobuscador también lo comentan.
Menos mal que espabilan porque wordpress estaba ganando adeptos.
Veo que en ojobuscador también lo comentan.
jueves, agosto 10, 2006
viernes, julio 28, 2006
Carnarvon: herramienta de arqueología de software [barrapunto.com]. Podría ser interesante echarle un vistazo.
jueves, julio 27, 2006
Internete es realmente sorprendente...
Hoy mirando el Ciberpais, leo un artículo sobre Chema Alonso; como hay un link a su blog, le hecho un vistazo y en el aparece el nombre de Sergio Montoro. ¿Mande?
Una sinopsis se activa e intuyo que puede ser el mismo Sergio Montoro con el que coincidí en Meta4. El tio era bueno... normal que siga en la brecha: es editor de la pastilla roja, creador de software libre y tiene su propia empresa. Bueno acabo con unos links:
Hoy mirando el Ciberpais, leo un artículo sobre Chema Alonso; como hay un link a su blog, le hecho un vistazo y en el aparece el nombre de Sergio Montoro. ¿Mande?
Una sinopsis se activa e intuyo que puede ser el mismo Sergio Montoro con el que coincidí en Meta4. El tio era bueno... normal que siga en la brecha: es editor de la pastilla roja, creador de software libre y tiene su propia empresa. Bueno acabo con unos links:
martes, julio 25, 2006
Un artículo sobre clasificación de imagenes en la web según su role: Image Classification for Mobile Web Browsing por Takuya Maekawa, Takahiro Hara y Shojiro Nishio
Ummm, puede ser interesante echarle una probazón a Flock:
"Flock es un navegador de OSD basado en Mozilla, que lo existiende para agregar una serie de herramientas útiles al usuario:
"Flock es un navegador de OSD basado en Mozilla, que lo existiende para agregar una serie de herramientas útiles al usuario:
- Un cliente para la gestión de galerías de fotos online
- Un cliente para el envío de post en bloggers de varios tipos (incluyendo Drupal)
- Un agregador de noticias online
lunes, julio 24, 2006
lunes, julio 03, 2006
GStreamer es una libería que se puede usar para implementar pipelines de procesamiento, teniendo bindings para varios lenguajes, entre ellos python.
Esta implementando en C, y se está usando bastante para hacer aplicaciones 'media player'.
Lo que si que es interesante es este extracto de su FAQ:
"The GObject object system provided by GLib implements objects in C, in a portable, powerful way. This library provides for introspection and runtime dynamic typing. It is a full OO system, but without the syntactic sugar. If you want sugar, take a look at GOB."
Esta implementando en C, y se está usando bastante para hacer aplicaciones 'media player'.
Lo que si que es interesante es este extracto de su FAQ:
"The GObject object system provided by GLib implements objects in C, in a portable, powerful way. This library provides for introspection and runtime dynamic typing. It is a full OO system, but without the syntactic sugar. If you want sugar, take a look at GOB."
miércoles, junio 28, 2006
martes, junio 27, 2006
viernes, junio 23, 2006
jueves, junio 22, 2006
libxml2 y xpath
Estoy probando a usar el DOM que implemente libxml2, y la verdad.... es un poco jaleoso... Habrá que probar a usar XPath.
Aquí un ejemplo de como facilita las cosas.
Y un thread interesante...
Otro ejemplo de uso y un ultimo link.
Las funciones que implementa el binding de python que estoy usando son:
xpathCastNodeToNumber
xpathCastNodeToString
xpathCmpNodes
xpathEval
xpathEval2
xpathNewContext
xpathNewNodeSet
xpathNewValueTree
xpathNextAncestor
xpathNextAncestorOrSelf
xpathNextAttribute
xpathNextChild
xpathNextDescendant
xpathNextDescendantOrSelf
xpathNextFollowing
xpathNextFollowingSibling
xpathNextNamespace
xpathNextParent
xpathNextPreceding
xpathNextPrecedingSibling
xpathNextSelf
xpathOrderDocElems
miércoles, junio 21, 2006
OWL y ontologías
Como ando metido en un fregado para generar reglas para drools a partir de OWL, me toca mirar un poquillo sobre ontologías [en inglés]
Como lenguajes para ontologías tenemos OWL [en inglés] en sus tres versiones Lite, DL y Full y RDF [en inglés].
Una ontología es un modelo de datos para representar los objetos de un dominio y sus relaciones con el objetivo de realizar de manera que se pueda hacer un procesamiento sobre dicha información. Es una forma de representación del conocimiento.
Pero por otro lado están las Taxonomías. Aquí se puede ver la diferene en ontología, taxonomía y otras estructuras de represantación del conocimiento. Y otra página muy interesante describiendo lo que es una ontología. Más paginas sobre las diferencias entre taxonomía, ontología y otras formas de representación: [1] [2] (el 1, muy interesante).
Las ontologías se usan en la Web Semantica, campo muy puntero actualmente en cuanto a investigación, y tendrán mucha importancia para el despegue de los 'Web Services'. Este paper habla sobre ello.
Y ya paa profundizar sobre los lenguajes, podemos empezar por aquí para RDF y por aquí para el OWL.
Como lenguajes para ontologías tenemos OWL [en inglés] en sus tres versiones Lite, DL y Full y RDF [en inglés].
Una ontología es un modelo de datos para representar los objetos de un dominio y sus relaciones con el objetivo de realizar de manera que se pueda hacer un procesamiento sobre dicha información. Es una forma de representación del conocimiento.
Pero por otro lado están las Taxonomías. Aquí se puede ver la diferene en ontología, taxonomía y otras estructuras de represantación del conocimiento. Y otra página muy interesante describiendo lo que es una ontología. Más paginas sobre las diferencias entre taxonomía, ontología y otras formas de representación: [1] [2] (el 1, muy interesante).
Las ontologías se usan en la Web Semantica, campo muy puntero actualmente en cuanto a investigación, y tendrán mucha importancia para el despegue de los 'Web Services'. Este paper habla sobre ello.
Y ya paa profundizar sobre los lenguajes, podemos empezar por aquí para RDF y por aquí para el OWL.
lunes, junio 19, 2006
Una noticia interesante de barrapunto, sobre los precios de algunas consultoras por dia.
Hay unos comentarios interesantes. De los cuales me quedo con estos párrafos:
"sobre lo de montar una empresa en españa, enterate de como va la cosa... enterate de las leyes y las "facilidades" que te dan...
y entonces lo comparas con otros paises... qieres una perla? en españa montar una sociedad limitada te cuesta, ente papeleos y demas, unos 1500? para empezar, mas un deposito de 3010?, el administrador de la empresa se tiene que dar de alta como autonomo y pagar seguridad social (320? al mes como minimo, y eso aunque estes trabajando para otra empresa y pagando SS a traves de ella), para cerrarla, otros 1500?...
para montar una empresa en EEUU solo necesitas una direccion de correos
en irlanda, donde vivo ahora, montar una empresa te cuesta 40? en papeleos (20? si lo haces a traves de internet) y hasta que no ganas determinada cantidad de dinero no pagas impuestos, y entonces, solo pagas el 5% (comparado con el 33% en españa)"
Es lamentable.
Hay unos comentarios interesantes. De los cuales me quedo con estos párrafos:
"sobre lo de montar una empresa en españa, enterate de como va la cosa... enterate de las leyes y las "facilidades" que te dan...
y entonces lo comparas con otros paises... qieres una perla? en españa montar una sociedad limitada te cuesta, ente papeleos y demas, unos 1500? para empezar, mas un deposito de 3010?, el administrador de la empresa se tiene que dar de alta como autonomo y pagar seguridad social (320? al mes como minimo, y eso aunque estes trabajando para otra empresa y pagando SS a traves de ella), para cerrarla, otros 1500?...
para montar una empresa en EEUU solo necesitas una direccion de correos
en irlanda, donde vivo ahora, montar una empresa te cuesta 40? en papeleos (20? si lo haces a traves de internet) y hasta que no ganas determinada cantidad de dinero no pagas impuestos, y entonces, solo pagas el 5% (comparado con el 33% en españa)"
Es lamentable.
viernes, junio 09, 2006
jueves, junio 08, 2006
Unas notas sobre la instalación de pyXML 0.8.4
pyXML incluye :
- xmlproc: a validating XML parser.
- Expat: a fast non-validating parser.
- sgmlop: a C helper module that can speed-up xmllib.py and sgmllib.py by a factor of 5.
- PySAX: SAX 1 and SAX2 libraries with drivers for most of the parsers.
- 4DOM: A fully compliant DOM Level 2 implementation
- javadom: An adapter from Java DOM implementations to the standard Python DOM binding.
- pulldom: a DOM implementation that supports lazy instantiation of nodes.
- marshal: a module with several options for serializing Python objects to XML, including WDDX and XML-RPC.
- XSLT
- XPath
Se instala en el directorio xml (por debajo de lib/pythonX.Y).
Mas sobre JAXWS
Para obtenerlo todo creo que debemos bajarnos el Java Web Services Developer Pack 2.0. Nos podremos bajar paquetes por separado, pero con este supongo obtendremos todo.
Documentación de Sun sobre WS, aquí y aquí.
Pero como no estoy seguro del todo, mejor me lo voy a bajar de jax-ws.dev.java.net.
Nota: vaya gena la instalación del jax-ws. No está documentado como narices instalarlo en modo consola. Y todo para sacar una gena de ventana donde aceptar la licencia. ¡Vaya cutrez!
Bueno... una nota final: jax-ws forma parte de GlassFish, el cual es un proyecto para implementar un servidor de aplicaciones Open Source usando tecnología de la plataforma Java EE 5.
martes, junio 06, 2006
Un mail muy interesante relativo a XSL y python.
Estoy ya peleandome con el XSLT y ya estoy con mi primer fregao.... los namespaces. Uffff.
Los tutoriales de w3shool están muy bien, pero para empezar.
No se que mas cosillas habrá por ahí, pero siempre nos quedará la w3.org.
Por cierto, como procesador para probar estoy usando xlstproc de libxml2. Implementa XSLT 1.0. Aquí, un poco de documentación.
(un poco despues....)
Ummm, parece que este link me va a dar la solución. Por lo visto el error que estoy teniendo es muy común. Piensas que XPath va a hacer el matching con el tag del nodo del xml y ¡no! hay que hacer el matching con el 'namespace' real, toda la URI.
Habrá que investigar si se puede evitar el poner todo el churro...
Lo que dice también el articulo es que los bindingds prefijo-namespace son dependientes del procesador.
Aunque esto puede ser también bussiness de Xpath. Habrá que echar también un ojo a la coc de xpath de w3.org. En concreto al punto: Node Tests.
Aquí está la recomendación sobre Namespaces en XML.
Y ya para acabar.... unos ejemplos con Xpath.
Estoy ya peleandome con el XSLT y ya estoy con mi primer fregao.... los namespaces. Uffff.
Los tutoriales de w3shool están muy bien, pero para empezar.
No se que mas cosillas habrá por ahí, pero siempre nos quedará la w3.org.
Por cierto, como procesador para probar estoy usando xlstproc de libxml2. Implementa XSLT 1.0. Aquí, un poco de documentación.
(un poco despues....)
Ummm, parece que este link me va a dar la solución. Por lo visto el error que estoy teniendo es muy común. Piensas que XPath va a hacer el matching con el tag del nodo del xml y ¡no! hay que hacer el matching con el 'namespace' real, toda la URI.
Habrá que investigar si se puede evitar el poner todo el churro...
Lo que dice también el articulo es que los bindingds prefijo-namespace son dependientes del procesador.
Aunque esto puede ser también bussiness de Xpath. Habrá que echar también un ojo a la coc de xpath de w3.org. En concreto al punto: Node Tests.
Aquí está la recomendación sobre Namespaces en XML.
Y ya para acabar.... unos ejemplos con Xpath.
viernes, junio 02, 2006
Que jartá de autoformación
Que si WDS, que si WDSL, que si SOAP, que si WS....
Y ahora XSL...
Que quereis saber de que van, pues wikipedia al canto, o bien los tutoriales de w3schools que estan muy bien.
De XSL voy a comentar alguna cosilla:
- El nombre le viene de 'eXtensible StyleSheet Language'.
- Consiste realmente de 3 partes:
- XSLT (XSL Transformations) - un lenguaje para transformar documentos XML
- XPath - un lenguaje para navegar por documentos XML
- XSL-FO - un lenguaje para formatear (de ahí el FO) documentos XML
Osea, que para decir que sabes XSL, realmente tienes que controlar esas 3 cosillas. Bueno... pues a empezar...
¿Y por cual? Fácil, por el más importante XSLT .
¿Y como podemos probar? Fácil también. Los browsers actuales tienen incluido un procesador de XSLT (como Firefox 1.0.2 o IE 6).
Aparte de dejar que el Browser haga la transformación, ésta se puede realizar en el cliente (mediante Javascript) o en el servidor (en este caso el XML no tendrá una referencia al XSL).
En el caso de Javascript el propio código Javascript hace la transformación, invocando al parser de XML; y en el caso de que la haga el browser directamente, habrá en el XML una referencia al XSL.
XPath
XPath es muy importante, no sólo porque es fundamental para XSLT, sino porque también lo es para XQuery y XPointer y XLink.
Y cual es la mejor herramienta para trabajar con todos estos XMLs: XMLSpy.
¿Y por cual? Fácil, por el más importante XSLT .
¿Y como podemos probar? Fácil también. Los browsers actuales tienen incluido un procesador de XSLT (como Firefox 1.0.2 o IE 6).
Aparte de dejar que el Browser haga la transformación, ésta se puede realizar en el cliente (mediante Javascript) o en el servidor (en este caso el XML no tendrá una referencia al XSL).
En el caso de Javascript el propio código Javascript hace la transformación, invocando al parser de XML; y en el caso de que la haga el browser directamente, habrá en el XML una referencia al XSL.
XPath
XPath es muy importante, no sólo porque es fundamental para XSLT, sino porque también lo es para XQuery y XPointer y XLink.
Y cual es la mejor herramienta para trabajar con todos estos XMLs: XMLSpy.
jueves, junio 01, 2006
martes, mayo 30, 2006
Buscan sobre sobre motores de reglas en Java, me he encontrado esta página que no conocía: The Java Community Process. En ella están todas las Specification Request.
Mas sobre Web Services
(continuación del post anterior)Bueno bueno..., ya nos vamos enterando mas de este mundillo hasta ahora desconocido para mi.
Ya me enterado un poco mas de que va este jaleo de los webservices. En pocas palabras....
Del cliente al servidor va a viajar un XML que se define en un WSD (esto son los datos). La funcionalidad del servicio estará definida en el DWSDL.
En la parte servidora:
- Se obtendrá un objeto Java a través del binding XML -> Java.
- Habrá un objeto Java que implemente el servicio.
- Se pasará un XML. Teniendo dos opciones:
- Pasar el XML tal cual (mas engorroso, ya que hay que generarlo)
- Pasar un objeto python => el binding Python -> XML se encarge de general el XML.
Sobre pyXML he encontrado un par de artículos de recomendada lectura: [1] y [2]
Sobre el Servicio:
- Va a usar un motor de reglas. Para independizarns del motor, se usará el interfaz JSR94.
lunes, mayo 29, 2006
Web Services desde Python
De nuevo aventurandonos en aguas fanganosas.... (aguas que no conozco).
Tengo que implementar en un cliente (Python) el interfaz con un Web Service (Java). Y también encargarme de parte del servicio en si (el core, que no del WebService).
Servidor
Para la parte servidora según el guru de turno (en este mundillo web, hay mucho gurú suelto y mucha sigla...) va a usar JAXWS.
Es posible que tenga que usar un parser de XML. Si al final es así usaré el que viene ya con java, JAXP.
Cliente
Y para la parte cliente, según he visto, hay dos opciones:
Tengo que implementar en un cliente (Python) el interfaz con un Web Service (Java). Y también encargarme de parte del servicio en si (el core, que no del WebService).
Servidor
Para la parte servidora según el guru de turno (en este mundillo web, hay mucho gurú suelto y mucha sigla...) va a usar JAXWS.
Es posible que tenga que usar un parser de XML. Si al final es así usaré el que viene ya con java, JAXP.
Cliente
Y para la parte cliente, según he visto, hay dos opciones:
La verdad... todavía no se cual usaré, a ver que puedo ver por la web... Parece que ZSI es mas completa pero SOAPpy mas sencilla de usar.
Ambas usan wstools y pyXML . La verdad... he echado un vistazo al enlace, y parece que la librería está muy bien. Hay que instalarla, ya que no viene incluida con python.
Para empezar abriendo boca, tutoriales para ambos productos: ZSI y SOAPpy.
Dentro de wstools hay un script muy util, xsdl2py.py que genera definiciones python a partir de un wsdl.
¿Cual usar: ZSI o SOAPpy?
En principio me decantaba por usar SOAPpy, porque parecía mas sencillo, pero tras instalar ambos, parece que ZSI es un producto mas maduro. Además ZSI ha pasado el test básico de ejecutar un ejemplo tonto de la distribución, mientras que SOAPpy no.
Nota posterior: ¡vaya! la versión que me habia instalado de SOAPpy era muy antigua. Actualmente las versiones estables son la 1.7 y la 0.11.5 para ZSI y SOAPpy respectivamente. Aunque ya van por la 2.0 y la 0.12.
Ambos usan la lista Pywebsvcs-talk [el archivo].
Web Services
El servicio que vamos usará el protocolo SOAP (sobre HTTP).
Para definir el servicio se usa WSDL. Que se tendrá que validar contra un XSD (un 'XML Schema')
Y ya para acabar unas entradas de la wikipedia:
Ambas usan wstools y pyXML . La verdad... he echado un vistazo al enlace, y parece que la librería está muy bien. Hay que instalarla, ya que no viene incluida con python.
Para empezar abriendo boca, tutoriales para ambos productos: ZSI y SOAPpy.
Dentro de wstools hay un script muy util, xsdl2py.py que genera definiciones python a partir de un wsdl.
¿Cual usar: ZSI o SOAPpy?
En principio me decantaba por usar SOAPpy, porque parecía mas sencillo, pero tras instalar ambos, parece que ZSI es un producto mas maduro. Además ZSI ha pasado el test básico de ejecutar un ejemplo tonto de la distribución, mientras que SOAPpy no.
Nota posterior: ¡vaya! la versión que me habia instalado de SOAPpy era muy antigua. Actualmente las versiones estables son la 1.7 y la 0.11.5 para ZSI y SOAPpy respectivamente. Aunque ya van por la 2.0 y la 0.12.
Ambos usan la lista Pywebsvcs-talk [el archivo].
Web Services
El servicio que vamos usará el protocolo SOAP (sobre HTTP).
Para definir el servicio se usa WSDL. Que se tendrá que validar contra un XSD (un 'XML Schema')
Y ya para acabar unas entradas de la wikipedia:
Para acabar, un tutorial de SOAP.
Notas finales:
- Para C++ está AXIS.
- Esto del web service es algo impuesto. Pero otras alternativas para hacer el servicio hubieran sido CORBA o XML RPC. Hay soporte para xml-rpc en python, y como orb que soporte python tenemos omniorb.
- En 'IBM developer works' IBM tienen un area sobre Web Services. En contreto hay varios articulos sobre python y SOAP: 1, 2, 3, 4 y 5. Que van de:
- Part 5: (2004) Nuevos desarrollos en SOAPpy.
- Part 4: (2003) Nuevos desarrollos en ZSI
- Part 3: (2002) Cambio de roles con ZSI y SOAPpy
- Part 2: (2002) Con y sin WSDL (sobre ZSI)
- Part 1: (2001) Introducción a varias librerías.
jueves, mayo 25, 2006
Y ya que estamos con Drools, pues vamos a refrescar unas cosillas de IA [los enlaces iniciales con de la wikipedia]:
- Programación Lógica (y en inglés).
- Declarative programming.
- Lógica matemática. (y en inglés).
Tipos de programación Lógica:
- Calculo lambda (y en inglés). Vamos... en lo que se basa LISP.
- Lógica de primer orden o de predicados (y en inglés). Aunque mejor ésta. Este último link es de lectura obligada para refrescar conocimientos antes de meternos con Drools.
- Lógica proposicional (y en inglés). Aunque una introducción mas sencilla es ésta.
- Higher-order logic.
- .../...
Vamos que mejor que la info de la wikipedia, ésta (al menos mas elemental).
La lógica de predicados es superior a la lógica preposicional por:
"La principal debilidad de la lógica proposicional es su limitada habilidad para expresar conocimiento. Existen varias sentencias complejas que pierden mucho de su significado cuando se las representa en lógica proposicional. Por esto se desarrolló una forma lógica más general, capaz de representar todos los detalles expresados en las sentencias, esta es la lógica de predicados."
La lógica de predicados es superior a la lógica preposicional por:
"La principal debilidad de la lógica proposicional es su limitada habilidad para expresar conocimiento. Existen varias sentencias complejas que pierden mucho de su significado cuando se las representa en lógica proposicional. Por esto se desarrolló una forma lógica más general, capaz de representar todos los detalles expresados en las sentencias, esta es la lógica de predicados."
lunes, mayo 22, 2006
Drools
Bueno pues ahora me toca trastear con Drools. Lo primero que veo es que usan para hacer las 'build' tanto ant, como maven, y como repositorio CVS.
El motivo de usar este motor de reglas, es que se pueden escribir la reglas en python.
La versión que estoy probando es la 2.5. Es decir... la útima antes de la compra de drools por parte de JBoss, pasando a ser JBoss Rules (Drools 3.0).
¿Y porque usar la 2.5 en lugar de la 3.0? Pues muy sencillo, en la 3.0 se han calzado el módulo semantico para python. Al menos de momento...
Tras leer un poco, e instalarse la version con todas las dependencias (drools-2.5-final-bin-withdeps.zip) es interesante hacer una primera prueba para ver si tira. Para ello lo mejor es usar el ejemplo mas tonto del tutorial. ¡Ojo! Hay que modificar la línea de ejecución. La correcta es (sin los espaciados tras los ':'):
java -classpath drools-base-2.5-final.jar: drools-core-2.5-final.jar: drools-io-2.5-final.jar: drools-smf-2.5-final.jar: drools-examples-2.5-final.jar: drools-python-2.5-final.jar:jython-20020827-no-oro.jar: xml-apis-2.0.2.jar: xercesImpl-2.7.1.jar: commons-jci-SNAPSHOT20051110.jar: commons-logging-1.0.4.jar org.drools.examples.helloworld.HelloWorldExample helloworld.python.drl
Por lo visto los dos ejemplos que vienen precompilados son:
- Hello World Example y
- Fibonacci Example
En el caso de que queramos ejecutar el mismo ejemplo pero usando el modulo para python, el comando sería (sin los espaciados tras los ':'):
java -classpath drools-base-2.5-final.jar: drools-core-2.5-final.jar: drools-io-2.5-final.jar: drools-smf-2.5-final.jar: drools-examples-2.5-final.jar: drools-java-2.5-final.jar: antlr-2.7.5.jar:janino-2.3.15.jar: xml-apis-2.0.2.jar: xercesImpl-2.7.1.jar: commons-jci-SNAPSHOT20051110.jar: commons-logging-1.0.4.jar: jdtcore-3.1.0.jar org.drools.examples.helloworld.HelloWorldExample helloworld.java.drl
jueves, mayo 11, 2006
Una utilidad curiosa de google, google trends [barrapunto.com].
Comentan también en barrapunto sobre TorPark: un cliente web, para navegar anonimamente.
Comentan también en barrapunto sobre TorPark: un cliente web, para navegar anonimamente.
miércoles, mayo 10, 2006
martes, mayo 09, 2006
lunes, mayo 08, 2006
miércoles, mayo 03, 2006
jueves, abril 27, 2006
miércoles, abril 26, 2006
lunes, abril 24, 2006
jueves, abril 20, 2006
martes, abril 18, 2006
Qué importa que se invierta en tecnología si fallamos por la base [lcomerciodigital.com] por Xabier García Pañeda.
jueves, abril 06, 2006
Microsoft investigando sobre el Spam.
Alguno de los articulos referenciados, ya los había incluido en este blog.
Alguno de los articulos referenciados, ya los había incluido en este blog.
miércoles, abril 05, 2006
A raiz del la polemica sobre el tipo de letra Segoe [barrapunto.com] , he encontrado este link: comp.fonts FAQ.
Más sobre la polémica en Slashdot.
Hay bastante info en la wikipedia sobre 'Typefaces'. Unos links:
Más sobre la polémica en Slashdot.
Hay bastante info en la wikipedia sobre 'Typefaces'. Unos links:
martes, abril 04, 2006
lunes, abril 03, 2006
viernes, marzo 31, 2006
Psyco
Ha llegado la hora de progra Psyco.
Aquí hay una presentacion.
Y aquí unos ejemplos sencillos para empezar.
La instalación como todo lo de python, trivial.
Y tras unas primeras pruebas, usando el psyco.full() he visto que si optimiza, si. Tanto usando la opción -O como sin ella. El -O también ayuda (el fichero generado en lugar de .pyc es .pyo; curioso).
jueves, marzo 30, 2006
miércoles, marzo 29, 2006
Interesante entrevista a Stratton Sclavos, presidente de Verisign, donde habla de VIP (Verisign Identity Protection), un sistema de autentificación global.
Menciona también el concepto de Pharming, una técnica de fraude que es realmente muy peligrosa.
Menciona también el concepto de Pharming, una técnica de fraude que es realmente muy peligrosa.
martes, marzo 28, 2006
Python Remote Objects
Pyro, parece interesante para programar objetos Python distribuidos de una manera sencilla.
En Spyron.org aparte de SPyRO(Simple Python Remote Objects) tienen también SPyDI (simple Python Distribute Indexing).
viernes, marzo 24, 2006
martes, marzo 21, 2006
Unas noticias de barrapunto:
- Programadores matando dragones. Está gracioso. En meneame sobre python:
- "Python lo mata en dos o tres lineas después de instalar un módulo para matar dragones. Igualito que perl."
- The Economist analiza el modelo de fuente abierta.
viernes, marzo 17, 2006
Python y UML
Un par de noticias al respecto:
- Doxygen ya soporta python
- Me comentan de una herramienta que no tenía controlada: pyUT.
martes, marzo 14, 2006
lunes, marzo 13, 2006
viernes, marzo 10, 2006
Python muda de piel
Vía barrapunto, me entero de que python tiene una nueva web.
Han cambiado incluso el logo del lenguaje. Todo ahora es mas serio.
Y un link de regalo: Python Cheese Shop.
martes, marzo 07, 2006
viernes, marzo 03, 2006
jueves, marzo 02, 2006
Georeferencias: almacenamiento
Hoy he leido un thread interesante en python-es. Va sobre el almacenaciento de georeferencias en una BD.
Quien pregunta parece que de momento está usando Berkeley BD. Comenta tb. que opción muy rapida de acceso es usar la estructura de directorios (aunque tiene sus desventajas). Por ejemplo para acceder a 1000, irias a 1/0/0/0.record (vamos como los indices de FAST).
En python se accede a dicha BD a través del módulo bsddb. Los creadores de la BDB son Sleepycat Software (adquiridos por Oracle).
Los difefentes métodos que acceso que soporta la BD son:
- Hash
- BTree
- Recno
- Queue
Otro producto que mencionan es pytables. Adjunto un comentario de Francesc Altet (de carabos, la empresa creadora):
"Pues aunque PyTables no es puro Python (si quieres velocidades altas de I/O casi siempre has de ir a parar a hacer extensiones en C), si que es multiplataforma (ha sido probado en Windows, MacOSX, GNU/Linux FreeBSD y múltiples Unix más). El acceso a los datos se hace a través de arboles binarios (a nivel de la libreria HDF5 de la cual depende), con lo que el acceso a los registros es muy rápido.
Ademés, PyTables suporta indexación de columnas.
Respecto a la limitación en la cantidad de recursos usados, PyTables está diseñado para trabajar perfectamente con tablas de más de mil millones de filas en entornos de memoria realistas, así que con tablas del orden de millones, no deberías de tener problemas.
Además, PyTables usa objetos numarray como contenedores de datos, con lo que el consumo de memoria se hace óptimo, especialmente cuando quieres mantener gran cantidad de información. Finalmente, PyTables también soporta compresión de datos transparente, con lo que puedes mantener tus bases de datos comprimidas y leerlas sin necesidad de que
ocupen más espacio del necesario.
Para ejemplos de cómo funciona PyTables te recomiendo que le eches un vistazo a los tutoriales que vienen en la documentación:
http://pytables.sourceforge.net/html-doc/usersguide3.html
Aunque, naturalmente, lo mejor es que lo descargues y lo pruebes por tí mismo. Así te aseguras de que no te están vendiendo la moto ;-)"
Y ya para acabar... gadfly: que es una base de datos relacional implementada en python basada en SQL.
Concluyendo.... un thread de muy interesante lectura.
Actualización
Unos links:
Actualización 2
El thread ha continuado algo (los archivos de la lista aquí).
"Pues aunque PyTables no es puro Python (si quieres velocidades altas de I/O casi siempre has de ir a parar a hacer extensiones en C), si que es multiplataforma (ha sido probado en Windows, MacOSX, GNU/Linux FreeBSD y múltiples Unix más). El acceso a los datos se hace a través de arboles binarios (a nivel de la libreria HDF5 de la cual depende), con lo que el acceso a los registros es muy rápido.
Ademés, PyTables suporta indexación de columnas.
Respecto a la limitación en la cantidad de recursos usados, PyTables está diseñado para trabajar perfectamente con tablas de más de mil millones de filas en entornos de memoria realistas, así que con tablas del orden de millones, no deberías de tener problemas.
Además, PyTables usa objetos numarray como contenedores de datos, con lo que el consumo de memoria se hace óptimo, especialmente cuando quieres mantener gran cantidad de información. Finalmente, PyTables también soporta compresión de datos transparente, con lo que puedes mantener tus bases de datos comprimidas y leerlas sin necesidad de que
ocupen más espacio del necesario.
Para ejemplos de cómo funciona PyTables te recomiendo que le eches un vistazo a los tutoriales que vienen en la documentación:
http://pytables.sourceforge.net/html-doc/usersguide3.html
Aunque, naturalmente, lo mejor es que lo descargues y lo pruebes por tí mismo. Así te aseguras de que no te están vendiendo la moto ;-)"
Y ya para acabar... gadfly: que es una base de datos relacional implementada en python basada en SQL.
Concluyendo.... un thread de muy interesante lectura.
Actualización
Unos links:
Actualización 2
El thread ha continuado algo (los archivos de la lista aquí).
miércoles, marzo 01, 2006
Está guapo: Visualizador del funcionamiento de las expresiones regulares.
Y otro link relacionado: Regular Expression Online Tester.
Y aprovechando el tema, no esta por demas recordar que para python tenemos a Kodos.
Y otro link relacionado: Regular Expression Online Tester.
Y aprovechando el tema, no esta por demas recordar que para python tenemos a Kodos.
Suscribirse a:
Entradas (Atom)