martes, enero 24, 2006
Un par de noticias de barrapunto:
- Yahoo! abre un centro de I+D en Barcelona.
- Vídeos de Rails vs Django. No tenía ni idea de la existencia de Django: al igual que Rails es un framework de desarrollo rápido de aplicaciones web basado en el lenguaje de programación Python.
lunes, enero 23, 2006
Visualización de datos específica: ¿cuál es vuestra aplicación favorita? [barrapunto.com]. Esta bien... dan unos cuantes enlaces, aparte de los tipicos: gnuplot, graphviz, ...
viernes, enero 20, 2006
Ejemplo de reimplementación de los metodos que modifican un diccionario [python]
class MyDict(dict):
def __setitem__(self,c,v):
print "En __setitem__"
dict.__setitem__(self,c,v)
def __delitem__(self,c):
print "En __delitem__"
dict.__delitem__(self,c)
def pop(self,c):
print "En pop"
return dict.pop(self,c)
def popitem(self):
# Saca la key del principio
print "En popitem"
return dict.popitem(self)
def clear(self):
print "En Clear"
dict.clear(self)
def update(self,D):
print "En update"
# !Ojo! si tenemos un tratamiento por key, al invocar al update del padre
# no se ejecutaría. Vamos... que update no hace uso de __setitem__.
# Con lo cual nos tocaria hacer a peluski aquí el tratamiento especifico
dict.update(self,D)
def setdefault(self,c,v=None):
print "En setdefault"
return dict.setdefault(self,c,v)
Si heredas un diccionario será para aprovechar la funcionalidad que te ofrece, y ampliarla.
La segunda opción, y en principio mejor será que internamente tu clase haga uso de un diccionario.
Por ejemplo para eliminar un elemento tenemos 3 posibilidades: 'pop', 'popitem' y hacer uso de 'del'. Estaría bien que tanto 'pop', como 'popitem' hicieran uso de '__delitem__' como hace 'del' de esta manera con meter nuestro código en '__delitem__' valdría para las tres opciones de borrado. Pero como no funciona así, es necesario crear un método adicional que sea invocado desde las tres.
Un ejemplo todavía peor es el de 'update'.
Det todas formas por principio deberíamos siempre preferir la composición a la herencia: que nuestra clase haga uso del diccionario en lugar de heredar de él.
jueves, enero 19, 2006
Vía Javier Pagés [inforenses.com], he visto 2 articulos relacionados con la Informatica Forense:
- El ordenador, único testigo.
- Los informáticos forenses se hacen imprescindibles en delitos de guante blanco.
Del segundo he obtenido varias empresas que se dedican a este tipo de temas:
Y un par mas:
- GDT (Grupo de Delitos Telemáticos de la Guardia Civil).
- Centro Criptológico Nacional
lunes, enero 16, 2006
En Europa se esta fraguando el desarrollo de un nuevo buscador, que pueda rivalizar con los lideres americanos (google, yahoo, ...): quaero [telepolis.com].
viernes, enero 13, 2006
bitacoras.com
Bueno... parece que he encontrado un sitio para la creación de bitacoras que realmente está muy bien: bitacoras.com.
Lo que te ofrecen (de su pagina):
- Soporte para bitácoras y fotologs
- WebFTP desde el Panel de control
- Posibilidad de programar anotaciones futuras
- Moderación de comentarios y protección frente a spam
- Miniblog: Ideal para recopilar enlaces
- Envío/recepción de trackbacks y pings
- Posibilidad de enviar anotaciones desde teléfono móvil
- Posibilidad de enviar anotaciones desde el e-mail
- Gran cantidad de plantillas personalizables
- Sistema propio de etiquetas TAGs
- Sindicación compatible con todos los lectores
- Estadísticas de uso
- Foros de soporte
- Chat de usuarios
Y lo que yo he podido ver ...
- meten una barra arriba (posible publicidad) (-)
- ¿limite de subida? (-)
- permite subir ficheros, has 60 KB (+)
- limite de tamaño de fichero a subir (-). Pero es algo normal.
- categorias (+)
- moderación de comentarios (+)
- medidas antispam en comentarios (+). Pero no tienen la posibilidad de obligar a teclear una palabra generada en una imagen, con lo cual, aunque el spam no aparezca automáticamente (pasa por moderación), te obliga a moderarlo. Con la imagén ni siquiera llegaría a la página de moderación.
- Tienen varios gestores (+):
- usuarios
- enlaces
- acronimos
- emoticonos
- importación y exportación de ficheros (la exportacion la hace a un fichero de texto dentro de un .zip con un formato determinado, incluyendo: el titulo, el resumen, el contenido, los comentarios, ...) (+)
Servicios Plus (de su web):
- Eliminar publicidad de mi bitácora por 1? al mes.
- Eliminar publicidad de mi bitácora, aumentar hasta 250 Mb. el espacio disponible y aumentar el número de autores (hasta 10) por 2? al mes. Y la supresión de la limitación de subida de 60 KB.
A mi me parece de lo mejor que he visto hasta ahora. Y por un euro al mes, que es nada, te quitas del medio la publicidad.
miércoles, enero 11, 2006
Me comenta JJ un sitio web (tienda fisicamente en San Sebastian de los Reyes) muy bueno sobre todo para componentes: alternate.
Lo proximo de Microsoft
Windows Vista e IExplorer 7 (por lo visto con un look&feel clavao a firefox).
martes, enero 10, 2006
Hace ya un tiempo JJ me comentó unos productos de OpenSymphony:
También me comentó sobre un repositorio de proyectos 'Open Source' Java: CodeHaus. Según sus palabras: "...projectos muy a seguir de cerca. Hay de todo desde compiladores AOP hasta integradores de ESB."
lunes, enero 09, 2006
Un par de posts sobre ¿la muerte de barrapunto?:
- Filtro editorial vs filtro democratico [barrapunto.com].
- La muerte de barrapunto [microsiervos.com] .
Una de las cosas nuevas de estas fechas ha sido un HD con unos cuantos Gigas. Andaba un poco escaso de espacio...
Tras instalarlo, llega la pregunta del millón. ¿Como lo particionamos?
Si vamos a usar windows (actualmente lo normal será usar 2000 o XP) pues tenemos dos opciones: fat32 y ntfs.
Con fat32 tenemos que tener en cuenta que tenemos una limitación en el espacio de la particion 32 GB.
Buscando en google, hay bastante información para comparar.
Me resulta curioso que hoy en barrapunto hay un post relaciona: Formatos de archivos para discos externos.
Ya para acabar... Lo de los GB, es una movida. Según la entrada en la wikipedia hay dos definiciones posibles de GB: 10^9 y 2^30. ¿Adivinais cual usan algunos fabricantes de discos duros? Pues sí, la primera. No os extrañe que cuando tengais formateado un disco duro la capacidad real (GB para el ordenador es 2^30) sea menor...
Tras instalarlo, llega la pregunta del millón. ¿Como lo particionamos?
Si vamos a usar windows (actualmente lo normal será usar 2000 o XP) pues tenemos dos opciones: fat32 y ntfs.
Con fat32 tenemos que tener en cuenta que tenemos una limitación en el espacio de la particion 32 GB.
Buscando en google, hay bastante información para comparar.
Me resulta curioso que hoy en barrapunto hay un post relaciona: Formatos de archivos para discos externos.
Ya para acabar... Lo de los GB, es una movida. Según la entrada en la wikipedia hay dos definiciones posibles de GB: 10^9 y 2^30. ¿Adivinais cual usan algunos fabricantes de discos duros? Pues sí, la primera. No os extrañe que cuando tengais formateado un disco duro la capacidad real (GB para el ordenador es 2^30) sea menor...
viernes, enero 06, 2006
miércoles, diciembre 28, 2005
PyPy
Tras hacer una lectura rápida de PyPy Archichecture Overview, queria reseñar que:
- Hacen uso de LLVM (Low Level Virtual Machine).
- Uno de sus targets es Squeak. Una versión de Smalltalk 'Open Source'.
- Usan Boehm-Demers-Weiser conservative garbage collector. Pero por lo visto la gestión de memoria se puede configurar para usar 'cuenteo de referencias' o no.
- Actualmente es unas 10-20 veces mas lento que CPython.
Redirección 301
Según leo, parece ser que la redirección 301 sirve para mirar un sitio a otro (cambiar el home). Interesting...
Nuevo sitio dedicado a caza recompensas de proyectos [barrapunto.com]. Estaría bien que existiese algo así en España.
Indagando mas sobre la noticia de que Guido ha sido contratado por Google, he encontrado la noticia en Slashdot: Guido Goes Google; y en el grupo de python: comp.lang.python.
En algún comentario, aparte de mencionar algunas herramientas de python, mencionan PyPy, como el futuro de python. Entre las otras mencionadas estaban:
En algún comentario, aparte de mencionar algunas herramientas de python, mencionan PyPy, como el futuro de python. Entre las otras mencionadas estaban:
- Iron Python. Python para .NET.
- wxPython. Para hacer GUIs. Para usarlo con wxGlade.
- Psyco.
lunes, diciembre 26, 2005
Vaya, otro blog sobre buscadores: OJObuscador.
Mirando su contenido me he encontrado el notición: Guido van Rossum ha sido contratado por Google.
Mirando su contenido me he encontrado el notición: Guido van Rossum ha sido contratado por Google.
miércoles, diciembre 21, 2005
martes, diciembre 20, 2005
¿Que es estar en un sandbox?
"Estar en un sandbox es que pasan de indexarte, o que te indexan la página de inicio y poco mas".
Via Telendro.
Un par de noticias de barrapunto:
- Telecos e informáticos, los más solicitados. Hay algun comentario interesante.
- En unas horas comenzará Hispalinux 2005. He mirado el programa y no tiene mala pinta...
lunes, diciembre 19, 2005
Sobre Dominios
La lista de TLDs (o 'Top Level Domains').
El link anterior es del ICANN, pero buscando en google, aparecen varias páginas con mas información.
Como no, en la wikipedia hay una entrada al respecto.
Los dominios se dividen en los siguientes tipos:
- Country Code Domains
- Infraestructure Domain (.arpa)
- Generic Domains (.aero, .biz, .com, .coop, .edu, .gov, .info, .int, .mil, .museum, .name, .net, .org, and .pro)
- Top Level Domains
Ya para acabar, un link en el que se mencionan los nuevos dominos de segundo nivel disponibles para .es.
El Sr. Reina ,director de la oficina comercial de Google España, ha lanzado su segundo blog.
Via Telendro.
Via Telendro.
De barrapunto: Tim Berners-Lee (el padre de la web) comienza un blog:
- Su blog.
- Su primer comentario.
Hasta el momento de crear su blog, su 'blog' han sido la serie de articulos técnicos Design Issues for the WWW.
miércoles, diciembre 14, 2005
Unas noticias de barrapunto
- cdlibre.org: Nueva recopilación de software libre para Windows. Interesante...
- Nessus 3.0. Nessus es un escaner de vulnerabilidades muy conocido, si no el más famoso. Comentan que como ya no es GPL tiene un fork: OpenVas.
- ¿Software libre para 'Business Intelligence'?.
lunes, diciembre 12, 2005
Sobre buscadores
Se está confirmando; Telendro va a ser de visita obligada a diario. Tiene unos de post interesantes:
- sobre SEO.
- sobre Noxtrum.
- sobre posicionamiento.
- y sobre extensiones de firefox. Va de un meme, pero está bien para ver que extensiones usa el de telendro.
sábado, diciembre 10, 2005
Acabo de meter un enlace a Telendro, en mi weblog. Es muy bueno su blog.
Acabo de mirarlo y se hace eco de la noticia de compra de del.icio.us, al igual que barrapunto.
También comenta sobre la nueva versión del algoritmo de google, Jagger.
Los posicionamiento cambian totalmente, y para mi para mejor (no por este blog).
Acabo de mirarlo y se hace eco de la noticia de compra de del.icio.us, al igual que barrapunto.
También comenta sobre la nueva versión del algoritmo de google, Jagger.
Los posicionamiento cambian totalmente, y para mi para mejor (no por este blog).
jueves, diciembre 08, 2005
Google da miedo
Estos tios no paran de sacar cosas. Es que es casi a diario, esta vez se trata de Google Transit.
miércoles, diciembre 07, 2005
De barrapunto:
- Lista de servicios de Google y Yahoo. Estaría bien el ponerlos en una tabla para poder compararlos.
- Un clon de digg en castellano ya está por la WWW. Habrá que echarles un vistazo...
martes, diciembre 06, 2005
Interesante página de msn me he encontrado: sandbox.
Voy a echar un vistazo a alguna cosilla de Microsoft...
Voy a echar un vistazo a alguna cosilla de Microsoft...
viernes, diciembre 02, 2005
Buscando sobre Spam, me he encontrado (aunque ya me habían hablado de él) con SpamAssassin. Por lo visto es de lo mejor que hay por ahí para la detección de Spam en el correo.
Creo que usa reglas aparte de filtros Bayesianos (clasificación). Quizás se podría rascar algo para Web Spam, no lo se...
Buscando en sourceforge.net me he encontrado con SpamBayes. Está implementado en python. Está basado también en filtros Bayesianos. Hay info al restpecto de dichos filtros en la web.
Creo que usa reglas aparte de filtros Bayesianos (clasificación). Quizás se podría rascar algo para Web Spam, no lo se...
Buscando en sourceforge.net me he encontrado con SpamBayes. Está implementado en python. Está basado también en filtros Bayesianos. Hay info al restpecto de dichos filtros en la web.
En la siguiente página, se pueden ver los puertos que usa yahoo messenger.
Estos son:
Estos son:
Chat & Messenger TCP Port 5050: Client Access only
Insider/Room Lists TCP Port 80: Client Access only
File Transfer TCP Port 80: Server Access.
Your ISP may block this port, as its used for web hosting.
You can change port in Messenger, Preferences, File Transfer.
Voice Chat UDP 5000-5010
TCP 5000-5001: Client Access
If UDP Fails, TCP will be used instead, see below.
WebCam TCP Port 5100: Client Access
Super Webcam TCP Port 5100: Server Access
P2P Instant Messages TCP Port 5101: Server Access
PMs between Buddys may not use the Yahoo! Server,
but this is not a requirement.
jueves, diciembre 01, 2005
En relación a Noxtrum, interesante lo que dicen sobre futuros desarrollos de google para España [google.dirson.com].
Buscando en google por noxtrum, salen ya bastantes comentarios. Este post está bastante bien.
Un par mas:
Buscando en google por noxtrum, salen ya bastantes comentarios. Este post está bastante bien.
Un par mas:
- de tecniblog.
- de OJO!Buscador.
Recall and precision
Estas dos medidas son claves en el mundillo de los buscadores para saber como de efectiva ha sido una busqueda. La siguiente pagina las describe muy bien.
Y en la siguiente página hay un estudio de como se comportan cinco buscadores con respecto al 'recall and precision'. Google sale muy bien parado.
Sobre Firefox:
Y un par de noticias que tenia por poner:
- Ya salió Firefox 1.5.
- Hay una extensión que es la caña: WebDeveloper. Es de probar: te muestra visualmente las celdas, los tamaños de la imagenes, ...
Y un par de noticias que tenia por poner:
miércoles, noviembre 30, 2005
Rescato lo siguiente de otro blog (error al postear)...
Unas noticias de barrapunto:
- Apertium: traducción automática de código abierto.
- ¿Cómo dividir un servidor de producción en tres?
- Google paga un euro por cada Firefox recomendado. Como todos los dias, una noticia de Google.
- ¿Qué código fuente recomiendas leer? En el momento de escribir este post, no hay ninguna aportación interesante.
martes, noviembre 29, 2005
Web spam
Una herramienta que analiza si una página usa técnicas consideradas como spam: Search Engine Spam Detector. Detectando las siguientes muchos trucos de los siguientes métodos:
- keyword stuffing
- doorway farms
- text hiding
Y unos links de la wikipedia sobre el tema:
- Spamdexing. O Search Engine Spamming. Tiene varios links externos para poder profundizar sobre el tema.
- Nigritude Ultramarine.
- Search Engine Optimization.
- Blog Spam.
- Google Bombing.
- Spam (electronic).
Y para acabar otro link muy interesante: Nigritude Ultramarine FAQ. Sobre todo el punto "What did Black Hat SEOs do to win the Nigritude Ultramarine contest?".
Python decompile
Para poder decompilar ficheros pyc tenemos dos opciones.
- La primera es comercial: de crazy-compilers.
- Y la segunda es una versión de para debian (o bsd). También disponible para python2.2.
- Este versión creo que parte del mismo código que la versión comercial (no disponible como aplicación, sino como servicio). Al pasar a ser comercial hicieron una nueva rama de desarrollo.
lunes, noviembre 28, 2005
Temas laborables
Dejamos lo tecnico para meternos en lo laboral. Me han pasado una web muy buena: weblaboral.net.
En ésta página se indican unas cantidades a saber.
No, no voy a perder el curro ;).
Marc Najork, del grupo grupo web de Microsoft Research, tiene online alguna presentación y artículos sobre web spam.
Solo hay que buscar un poquito en google o en Microsoft Research.
Solo hay que buscar un poquito en google o en Microsoft Research.
viernes, noviembre 25, 2005
miércoles, noviembre 23, 2005
viernes, noviembre 18, 2005
miércoles, noviembre 16, 2005
martes, noviembre 15, 2005
domingo, noviembre 13, 2005
Tras visitar la web [erdani.org] (por cierto ha cambiado de dominio) de Andrei Alexandrescu, veo que ha publicado un un nuevo libro junto a Herb Sutter: C++ Coding Standards.
martes, noviembre 08, 2005
Javier Pagés sigue activo, ahora veo que ha creado un nuevo portal, inforenses. Que bueno el nombre que ha pillado. Tambien existe inforense (sitio de criminalistica.net).
Veo también que Infoperitos, sigue funcionando.
Veo también que Infoperitos, sigue funcionando.
Mirando los post de ésta noticia de barrapunto (sobre DNI electrónico), me he encontrado con el termino Trampa para canarios.
lunes, noviembre 07, 2005
Dependecy Injection Pattern
Ya he podido echar un vistazo al articulo de Martin Fowler sobre el patrón Dependency Injection (DI).
Lo primero que hace es discutir del porque del nombre. Ya que se le estaba llamando de manera incorrecta Inversion of Control.
Posteriormente explica los tres tipos disponibles que hay:
- Constructor Injection
- Setter Injection
- Interface Injection
Entrando a discutirlas con ejemplos concretos de frameworks: picocontainer, spring y avalon (dicho proyecto de apache ya no existe como tal; aunque tras su extinción han surgido varios proyectos derivados).
A continuación compara el patrón con el Service Locator.
Lo que se puede extraer del articulo:
A continuación compara el patrón con el Service Locator.
Lo que se puede extraer del articulo:
- Tanto el Service Locator como la DI son maneras válidas de separar la configuración del uso.
- Si estamos realizando un servicio que va a ser usado en aplicaciones fuera de nuestro control, la DI tiene ventajas.
- Entre los tipos de DI, recomienda la 'Constructor' y la 'Setter' en ese orden (la de interfaz es mas 'intrusivo').
Tanto picocontainer como spring soportan la constructor y la setter. El que un framework use la DI no quita a que pueda usar Locators (Avalon combina ambos).
El patrón no es nada sorprendente, pero como casi siempre en estos casos, lo que hace es poner nombre a soluciones que se estaban usando.
El patrón no es nada sorprendente, pero como casi siempre en estos casos, lo que hace es poner nombre a soluciones que se estaban usando.
ipython
Ya comenté en un post anterior sobre ipython. Ya he podido echarle un vistazo...
La verdad es que existiendo, no le veo ninguna ventaja a seguir usando la shell por defecto.
Tras haberme leido la introducción mas recomendaba, y sin explorar todo lo que pueda ofrecer; simplemente por lo siguiente, ya merece la pena usalo:
- Historia de comandos
- Posibilidad de llamar a un editor externo.
- Multiples profiles.
- Uso de colores.
- Posiblidad de ejecutar comandos del Sistema Operativo.
- Logging.
- Posibilidad de ejecutar scripts desde el interprete. Esto es especialmente util (comando 'run':
- Podemos hacer que se ejecute el main o no
- Que nos de estadisticas de tiempos
- Usar el profiler
- O el depurador
- Definición de macros.
- 'Tab Completion'.
- Tener una shell embebida detro de un programa python.
Me comentan de Caspost, un servicio para meter audio y video en tu blog.
Mr. Hal, el otro dio me comentó sobre los siguientes servicios:
Voy a probarlos... ¡ya!
Mr. Hal, el otro dio me comentó sobre los siguientes servicios:
Voy a probarlos... ¡ya!
miércoles, noviembre 02, 2005
IDE´s para python
A través de Wing IDE he llegado a ésta página [spyced]donde comparan diferentes IDEs para python. Los editores comparados son:
- PyDev 0.9.8.1
- Eric3 3.7.1
- Boa Constructor 0.4.4
- BlackAdder 1.1
- Komodo 3.1
- Wing IDE 2.0.3
No se han includo en la comparativa de de Jonathan Ellis los editores (aunque se mencionan):
Los comentarios son lectura interesante. En alguno ponen a SPE bastante bien, y hay alguna URL a otras reviews.
Hace poco JJ me comentó que hay algun apropuesta para que eclipse soporte python.
Es curioso como vas encontrando cosas en la web. He llegado a la web de spyced, y creo que es una web que volveré a mirar. Parece estar interesante.
Según veo en la web, hay un framework para embeber python en HTML, spyce.
El tio de spyced, Jonathan Ellis forma parte del Utah Python User Group.
Actualización
Mas editores:
Y una comparativa.
Hace poco JJ me comentó que hay algun apropuesta para que eclipse soporte python.
Encontrar cosas en la web
Es curioso como vas encontrando cosas en la web. He llegado a la web de spyced, y creo que es una web que volveré a mirar. Parece estar interesante.
Según veo en la web, hay un framework para embeber python en HTML, spyce.
El tio de spyced, Jonathan Ellis forma parte del Utah Python User Group.
Actualización
Mas editores:
Y una comparativa.
Morfeo
Que bueno, TID esta pasando algunos de sus productos a Software Libre, como TIDORB. El proyecto en cuestion se llama Morfeo.
Debugging in python
Aunque puede ser interesante generar trazas de nivel debug, devido a la velocidad del ciclo de desarrollo (codificar, probar, corregir, probar, ...) he encontrado que simplemente usando el comando print, se depuraba perfectamente. Una vez depurado el codigo se eliminan los print.
Eso hasta ahora. He estado probando una cosilla que me ha costado bastante de depurar, con lo cual me ha hecho plantearme el echarle un vistazo al debugger de python (pdb), y que productos hay adicionales, así como GUIs.
Sin embargo ésta es una mejor introducción.
Una herramienta que puede ser interesante de probar es iPython. Es una shell mejorada.
Haciendo una pequeña buqueda en google, con respecto a GUIs que den soporte a la depuración he encontrado:
- winpdb, que se apoya en wxpython, que es un toolkit para desarrollo de aplicaciones gráficas con python.
- Wing IDE [Wingwire.com]. El cual es un editor para python. ¿El problema? que no es de gratis.
[actualizacion]
He visto en la lista de python-es, en un comentario que recomendaban winpdb.
Herb Sutter ha puesto online un artículo que seguro que es muy interesante de leer, va de la revolución que va a ser la concurrencia para el software.
En su página web, ha puesto los videos de un par de conferencias. Seguro que son interesantes.
En su página web, ha puesto los videos de un par de conferencias. Seguro que son interesantes.
lunes, octubre 31, 2005
Me ha vuelto a hablar JJ maravillas de Spring. He estado echanvo un vistazo a un artículo, sobre él, pero requiere mas tiempo del que tengo ahora. Es un poco espeso.
Me quedo con dos conceptos que mencionan:
Me quedo con dos conceptos que mencionan:
- 'Inversion of Control' (IoC)
- 'Dependency Injection' (a flavour of IoC)
Mas info aquí.
Por lo visto Apache Excalibur lo usa.
La idea es del concepto es:
"That's the basic concept of Inversion of Control; you don't create your objects, you describe how they should be created. You don't directly connect your components and services together in code, you describe which services are needed by which components, and the container is responsible for hooking it all together. The container creates all the objects, wires them together by setting the necessary properties, and determines when methods are invoked."
He habían comentado que en developerWorks (de IBM), había bastantes artículos sobre python, y efectivamente así es. Como muestra un botón, unos articulos sobre:
Despues de mirar lo de python, me puse a navegar un poco por la red, encontrando un artículo sobre la Web Semántica en la seccion web.
Despues de mirar lo de python, me puse a navegar un poco por la red, encontrando un artículo sobre la Web Semántica en la seccion web.
viernes, octubre 28, 2005
Interné en España
Estaba terminando hoy de ojear el ciberpais. En uno de los articulos sobre el estado de internet en España, comparado con otros paises en europa he visto que sólo ganamos en:
- bajar musica
- publicar en weblogs
Unas noticias de barrapunto:
- ¿Dónde está Esperanto?. Sobre todo interesante por un comentario donde mencionan a Lojban, otro lenguaje.
- Vaya, ¿vuelven las vacas gordas?.
- Los servicios informativos de Antena 3 calumnian a los internautas. A vueltas con la pirateria y la copia privada... Mas en la web de David Bravo y en los foros de A3.
- Turismo con podcasting. Interesante sobre todo por el termino podcasting. No se si lo había escuchado antes. Lo que si que se es que no lo había retenido.
jueves, octubre 27, 2005
Parsers SAX de html en python
Incluidos en python tenemos dos posibles parsers a usar:
- htmllib.HTMLParser (soporta sólo HTML 2.0)
- HTMLParser.HTMLParser (mas orientado a XHTML)
Actualmente estoy usando HTMLParser.HTMLParser. Un problema que tenemos con este parser es que necesitamos detectar correctamente los inicios y los fines de tags, y hay tags que a veces no traen el fin de tag. Para evitar esto, y teniendo en cuenta que estamos en una etapa del proyecto totalmente de desarrollo (avanzando en funcionalidad), solventamos el problema usando tidy y generado xhtml.
El problema de esta solución es que tidy incrementa bastante el tiempo de procesamiento. Esto, unido a la idea de que haya parsers que puedan procesar html de una manera mas robusta que HTMLParser.HTMLParser y sean mas rápidos (por ejemplo hechos en C) me llevó a mirar libxml2.
Lo bueno de libxml2 es que tiene bindings a python, con lo cual algo (no sencillo) que nos quitamos del medio. Además hay una librería ya mas 'python-oriented', lxml. El problema con lxml, es que no es SAX.
Aparte de libxml2, hay un par de parsers candidatos a usar que no he evaluado:
Sobre libxml2
Las primeras pruebas que he realizado con el parser SAX incluido en libxml2 han sido muy satisfactorias (unas 10 veces mas rápido que HTMLParser).
Pero necesito hacer mas pruebas, sobre todo con html mal formado.
Los mayores inconvenientes que le he encontrado son:
- Falta de documentación.
- No cubre todo el API de C.
- Mas delicado de usar (tenemos que gestionar nosotros mismos la memoria)
Ya haciendo mis pruebas, lo que no he podido hacer es abortar el procesamiento de un documento.
Si el motivo por el cual queremos parar el parseo es porque nos hemos excedido del tiempo, la solución es meter el documento en porciones (es lo mas sensato además).
En caso contrario, pues es un problema que espero averiguar...
Para acabar adjunto un ejemplo que viene incluido con la distribución:
Si el motivo por el cual queremos parar el parseo es porque nos hemos excedido del tiempo, la solución es meter el documento en porciones (es lo mas sensato además).
En caso contrario, pues es un problema que espero averiguar...
Para acabar adjunto un ejemplo que viene incluido con la distribución:
#!/usr/bin/python -u
import sys
import libxml2
# Memory debug specific
libxml2.debugMemory(1)
log = ""
class callback:
def startDocument(self):
global log
log = log + "startDocument:"
def endDocument(self):
global log
log = log + "endDocument:"
def startElement(self, tag, attrs):
global log
log = log + "startElement %s %s:" % (tag, attrs)
def endElement(self, tag):
global log
log = log + "endElement %s:" % (tag)
def characters(self, data):
global log
log = log + "characters: %s:" % (data)
def warning(self, msg):
global log
log = log + "warning: %s:" % (msg)
def error(self, msg):
global log
log = log + "error: %s:" % (msg)
def fatalError(self, msg):
global log
log = log + "fatalError: %s:" % (msg)
handler = callback()
ctxt = libxml2.htmlCreatePushParser(handler, "b">
ctxt.htmlParseChunk(chunk, len(chunk), 0)
chunk = "ar "
ctxt.htmlParseChunk(chunk, len(chunk), 1)
ctxt=None
reference = """startDocument:startElement html None:startElement body None:startElement foo {'url': 'tst'}:error: Tag foo invalid
:characters: bar:endElement foo:endElement body:endElement html:endDocument:"""
if log != reference:
print "Error got: %s" % log
print "Exprected: %s" % reference
sys.exit(1)
# Memory debug specific
libxml2.cleanupParser()
if libxml2.debugMemory(1) == 0:
print "OK"
else:
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
libxml2.dumpMemory()
lunes, octubre 24, 2005
Ojo con las trazas en python
En el proyecto que estoy actualmente hemos llegado a un punto en que lo que tenemos montado puede ser ya usado, funcionalmente. Pero nos quedaba una incógnita por resolver. ¿Es lo suficientemente rápido?
El sistema tiene que procesar documentos html, para lo cual en primer lugar usamos Tidy, luego se parsean, y los transformamos a nuestro formato interno.
El uso de Tidy es necesario ya que el parser de python (HTMLParser) no se traga cualquier cosa.
En un futuro seguramente usemos algún otro parser implementado en un lenguaje de mas bajo nivel y que valide, pero de momento el sistema actual nos ha servido para avanzar en el desarrollo.
Para la primera toma de tiempos usé simplemente la función time.time. Tomando tiempos con las trazas activadas y desactivadas. Mi sorpresa es que tidy no era lo que se llevaba mas tiempo (escribe el documento totalmente), sino que nuestra parte se llevaba mas.
Para seguir analizando, decidí usar el profiler de python, ya que nunca lo había usado.
La forma mas sencilla de uso es:
python profile.py <script> <args>
Su salida de texto, ya me sirvió para ver alguna cosilla sospechosa dentro del código (que no del parser).
De todas formas es mas potente usándolo dentro del código, ya que el fichero generado es binario:
import profile
profile.run(<funcion>,<fichero>)
Posteriormente a través del módulo pstats, se puede postprocesar:
import pstats
import sys
file = sys.argv[1]
p = pstats.Stats(file)
p.sort_stats('cumulative')
p.print_stats()
El profiler me orientó, sobre la zona del código con los problemas.
A partir de ahí usé una librería hecha a medida para la toma de tiempos. La ventaja de la librería sobre el profiler, es que el profiler te da el tiempo por llamada, y la librería de toma de tiempos te da mas libertad, ya que tu defines la porción de código que entra en la toma de tiempo.
Una vez tengamos este tipo de librería lo suyo es que dejemos el código instrumentado con ellas en sitios clave, y que mediante configuración podamos activar o desactivar la toma de tiempos.
Bueno que de desvío del tema... Con la librería vi que algo raro pasado. No era normal que una región de código que no hacía nada se llevase el tiempo que se estaba llevando. Hasta que me fijé en las dichosas trazas, que tenía desactivadas, y gualá. Di con el problema.
El problema de fondo es que vengo del desarrollo de C++ y allí normalmente cuando se desactivan las trazas, no se ejecuta ni la invocación.
Pero claro aquí estábamos con python, y con un recubrimiento del modulo de logging de python. La invocación ser realizaba, aunque la traza no se generase. Y lo que se estaba llevando el tiempo era la evaluación de los argumentos. Estaba pasando a string una estructura de datos bastante tocha.
Moraleja: ojito con la evaluación de los argumentos en las trazas.
De todas formas a posteriormente me he dado cuenta de que fui un gañán y que a veces no vemos lo que no queremos ver. Ya que en la salida del profiler salía que el logging era lo que se estaba llevando el tiempo. Pero claro como estaba desactivado el nivel DEBUG...
Diseño de librería de toma de tiempos
Continuando con este tema...
Como he indicado anteriormente la toma de tiempos se debe de poder activar y desactivar por configuración y a los tiempos se les asigna una marca o tag.
En el diseño original, la librería tenia dos métodos para una determinada marca; uno para el comienzo de toma de tiempo y otro para el final de toma de tiempo.
Esto tiene como problema el que se te puedan quedar marcas desbalanceadas.
Un diseño mejor, es que en lugar de definir un comienzo y fin de marca y se vayan acumulando los tiempos, lo que hagamos es para cada marca registrar el tiempo.
Una vez terminada la ejecución se pedirán los tiempos. Cuando se pidan los tiempos es cuando se calculan los acumulados. Para calcular los acumulados, será necesario indicar entre que marcas se van a hacer los cálculos.
Suscribirse a:
Entradas (Atom)