miércoles, enero 10, 2007

¿Devaluacion de la informatica también en la ESO?
Aunque es un poco bobá lo que dicen.

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:




/* 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:
  • se muestran como una lista, bien ordenada alfabéticamente o por frecuencia
  • se pueden hacer feeds por las etiquetas; mas información aquí.
Si en lugar de querer una lista queremos cosillas mas chulas como por ejemplo una nube, pues en la web podeis encontrar info al respecto, como por ejemplo: Code for Beta Blogger Label Cloud.

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

Los lemas de Google

Aparte del 'Don´t be evil' tienen unos cuantos mas: los 10 principios de google [vía dirson].

domingo, diciembre 17, 2006

jueves, diciembre 14, 2006

Un visor de subversión interesante: websvn. Puedes subscribirte a feeds RSS.

miércoles, diciembre 06, 2006

Hoy ha tocado hacer algo que tenía pendiente desde hace mucho, mucho tiempo; darle un lavado de cara al blog.

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 multimedia está orientado a sustituir un ordenador de sobremesa.
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.







Un par de entradas del blog de AI2:
Como anda el patio, ¿no?

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'.

lunes, octubre 16, 2006

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:
Mas info sobre la incorporación de la nueva gestión a python 2.5 aquí.

jueves, octubre 05, 2006

¿A estas alturas quien no conoce los Google Groups (antiguos DejaNews)? Pues bien leo en diferentes sitios que les han dado un lavado de cara. Pongo un par de fuentes: [1] y [2].

miércoles, octubre 04, 2006

La extensión MM3-ProxySwitch del firefox es superutil si a menudo cambias de proxy para conectarte a internet.