¿Devaluacion de la informatica también en la ESO?
Aunque es un poco bobá lo que dicen.
miércoles, enero 10, 2007
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.
Suscribirse a:
Entradas (Atom)