miércoles, diciembre 31, 2008

Feliz 2009



Pues na, último post del 2008... Aunque sólo sea para desear una feliz noche y de paso dejar el link al último blog técnico de año descubierto: elcaparazon.

Va de web semantica.
Si no sabeis que es alguna de estas cosas: twine, FOAF, SIOC ISNINDI, Kiwi, SearchMonkey, Diigo, pues segro que os es de utilidad.

viernes, diciembre 19, 2008

Protégé OWL Tutorial

Como ya mencioné el tutorial A Practical Guide To Building OWL Ontologies Using The
Protègè-OWL Plugin and CO-ODE Tools
está realmente bien.
Sólo con leer esto, ya nos enteramos bastante de que va el cotarro. Pero como ya he indicado en post previos, para hacerte una idea de que se cuente es conveniente leer algo mas.

Tras introducirte el tema de las ontologías, y los tipos de OWL, pasa a crear una ontología sencilla sobre pizzas, usando claro está Protégé.
El texto se basa en una versión del programa más antigua, con lo que la descripción no es fiel a las versiones actuales, pero se sigue sin problemas. Yo he usado Protégé 3.4.

Sobre el interfaz de protégé...
Me ha gustado. Es bastante intuitivo.
Veremos que hay 5 tabs, de los que nos interesarán 4:
  • Metadata: Donde se gestionan los metadatos de la ontología, las importaciones, ...
  • OWLClassses: donde trabajamos con las clases.
  • Properties: donde se definen las propiedades
  • Individuals: donde se definen los individuos
En cuanto a los menus...
Son muy evidentes. En Reasoning, tendremos las opciones para chequear la consistencia de la ontología y para clasificarla. Mediante la segunda opción es como podemos generar una ontología inferida (se generan nuevas relaciones y nodos, mediante inferencia)

En cuanto a las preferencias...
Tenemos varias:
  • Edit -> Preferences...: General y Property Files (protege.properties y Protege.lax). En el último fichero podemos controlar la memoria usada por protégé. Estas son propiedades generales de Protegé.
  • Project -> Configure...: Específicas del proyecto.
  • OWL -> Preferences...: Ya específicas del OWL. Por ejemplo los tests a ejecutar se configuran aquí.
Para ayuda a la creación, protégé proporiona wizards. Los podemos encontrar en el menú Tools, tanto en Patterns, como en Quick OWL.
En el tutorial se usan (al menos):
  • Tools -> Patterns -> Value Partition...
  • Tolos -> Quick OWL -> Create multiple subclasses...
  • Tolos -> Quick OWL -> Create multiple properties...

Sobre los ficheros usados por protégé...
Si se usa el almacenamiento en fichero, la ontología se guardará en un fichero .owl. En dicho fichero estarán las uris de las ontologías que usen la que estamos definiendo. Si esos recursos no estan accesible, por ejemplo porque los tengamos en archivos locales en el sistema de archivos, Protégé es capaz de cargarlos. Para ello usa un fichero con la extensión .repository. El tercer archivo que usa es el .pprj, en el que se almacena toda la información ya específica del nuestro proyecto con Protégé.
Si importamos una ontología y esta a su vez depende de otra que no está accesible, bien porque no dispongamos de ella, no se pueda acceder online, o la ruta en el .repository esté mal, Protégé nos dará un error al cargarla.

Y tras este preámbulo vayamos a lo que nos cuenta el tutorial...

Como ya he indicado a lo largo del tutorial, mediante OWL-DL (DL viene de Lógica Descriptiva) se crea una jerarquia de clases, propiedades (funcionales, inversas, transitivas y simétricas). Una jerarquía de clases es una taxonomía.
Las propiedades tienen dominio y rango.
Las propiedades pueden ser tres tipos: Object, Annotation, Datatype.

Posterioremente se pasa a crear restricciones.
Una cosa importante sobre las clases, y es que por defecto no son 'disjoints'.
Y otra importante, es que OWL no usa UNA (Unique Name Assumption). Es decir que dos nombres diferentes pueden referirse al mismo individuo.
En DL las clases son conceptos y las propiedades roles (vamos... relaciones).

Tenemos los siguientes tipos de Property Restrictions:
  • Quantifier Restrictions (existencial quantifier y universal quantifier). Las restricciones mas comunes son las existenciales.
  • Cardinality Restrictions
  • hasValue Restrictions
Una restricción, de hecho, describe lo que es una 'anonymous class' (o 'unnamed class').
Las existenciales también se las conoce como 'some' o 'at least one'.
Las universales también se las conoce como 'only' o 'all'.

Lo siguiente que pasa es a probar el Razonamiento. Con Protégé 3.4 y escogiendo como razonador Pellet, no hace falta instalar nada adicional. Esto nos servirá para detectar inconsistencias en la ontología. Intenté usar DIG, pero no me funcionó (usando RacerPro).

Posteriormente se muestra la diferencia entre las condiciones 'necesarias' y las 'necesarias y suficientes', lo que da lugar a clases primitivas y definidas (El icono tiene tres lineas).Una clase primitiva sólo tiene condiciones necesarias.
Es posible tener mas de un bloque de condiciones 'necesarias y suficientes'.

Llegados a este punto es importante tener en cuenta dos cosas:
  • Podemos pensar que con crear una restricción universal vale, ¡¡¡pues no!!!. Si creamos una restricción universal normalmente deberemos crear la correspondiente existencial, ya que la universal no garantiza la existencia. Lo que indica es que si la relación existe para una determinada propiedad, lo será con los miembros de una determinada clase.
  • Y por otro lado, OWL trabaja con Open World Assumption (en contraposición con Close World Assumption).
Mediante razonamiento, se pueden crear nuevas relaciones de tipo superclass-subclass.

Posteriormente muestra como crear Closure Axioms, Value Partitions (es un 'patrón de diseño) y Covering Axioms.
Y va acabando con hasValue Restrictions, Enumerated Classes, Annotation Properties, namespaces, imports, tests, todo lists.

Al final tiene un par de apendices:
  • A: donde repasa todos los tipos de restricciones: quantifier (someValuesFrom, allValuesFrom), hasValue, cardinality, minCardinality, maxCardinality.
  • B: Intersection Classes, Union Classes.

Unos apuntes aleatorios:
  • todas las clases son descendientes de owl:Thing
  • como se ha indicando antes, por defecto las clases se superponen (overlap). Es decir, cuando creamos dos hermanas, no se asume que sus miembros pertenecen a una u a otra. Si es lo que queremos hay que indicarlo explicitamente.
  • Se puede introducir metadatos a varios elementos. Para ello se dispone de Dublin Core ontology.
  • Lo que en el tutorial llama 'Properties Matrix Wizards', en el menú actual es 'Create multiple properties...'.

python y webSemantica

Ahora que he tenido mas tiempo para mirar todos estos temas piensas ¿y con python que?
Pues bien, con python poco, la verdad.

Con respecto a rdf tenemos rdflib [wen]. Aparte de rdf/xml soporta N3, NTriples, Turtle, TriX yRDFa .
Otras librerias, que parece ya no se mantienen son sparta y tramp.
Como razonador (forward chaining), existe cwm. O pychinko (usa RETE).


Ya en cuanto a owl...
Desde luego el artículo a leer es este: Deep Integration of Python with Web Ontology Languaje.
Relacionado con el artículo está seth, pero no es puro python, tiene dependencias de java, ya que usa como razonador pellet. Para la integración usan JPype.

jueves, diciembre 18, 2008

miércoles, diciembre 17, 2008

Creando y distribuyendo paquetes en python

Hay un hilo interesante sobre este tema, distribuido entre varios blogs. Enlazo el último post de Ian, sobre el tema, ya que desde él podeis tirar del hilo: Using pip Requirements.

Me quedo con la idea de probar pip y virtualenv.
Un buen artículo sobre migración de java a python. Todavía no le leido los comentarios, pero parece que también merecen la pena.

martes, diciembre 16, 2008

A vueltas con el OWL

Como podeis ver por el post anterior ando enredando un poco con protégé.
Sobre OWL y ontologías tengo un post anterior.

El motivo de estar mirando esto, no es por estar ahora mismo involucrado en algo; es simplemente que en mi anterior proyecto, usabamos protégé como herramienta, y teníamos una base de datos de conocimiento en formato OWL.

Mas que una ontología, teníamos varias: una taxonomía genérica, una taxonomía léxica y gramátical, reglas para clasificar documentos, y alguna cosilla mas.

Este paper está muy bien, para ver de que va el tema este de las ontologías junto a protégé. Es un poco antiguo, con lo que el GUI ha cambiado, pero sigue siendo válido.
Para complementarlo no estaría mal hechar un vistazo a rdf-primer y a owl-overview.
Pero vamos... todo depende del nivel que querais profundizar...

La primera vez que ves un archivo OWL, piensas.... ¿pero este cristo que es? Tiene el problema del XML, que es muy verboso. Pero es que el OWL lo es brutalmente. El tema es que no está pensado para un lector humano, sino para ser interpretado por una máquina.
El ser tan verboso, puede tener como problema lo que nos pasó a nosotros, y es que la ontología que manejabamos ya no se podía cargar si la manteniamos en formato OWL. Tuvimos que pasar a usar una BD (en en el fondo para un entorno multiusuario es lo correcto). Y cuanto se requiera, pues exportar a OWL. Para las exportaciones, usabamos el API de Protégé (Java).
La ventaja es que es algo estándard.

Ojo! he visto que las versiones mas recientes de protegé se comportan mejor con ficheros grandes. Por ejemplo la 3.4 es capaz de cargar un fichero que la 3.1 no puede.

Paso de OWL a DRL

Una de las cosas que hicimos, fue pasar de OWL a DRL. Inicialmente trabajamos directamente con el OWL, y mediante un script en python generabamos un fichero DRL para Drools (o JBoss Rules). Osea... Java.
Posteriormente esto se hizo en Java, tirando del API.

Bueno... sobre esto quería comentar que parsear el OWL en python fue un poco jaleoso, ya que se hizo a pelo. Creo recordar que en su momento ni siquiera miramos si había algun parser específico para OWL y usamos uno genérico para XML.
Bueno esto empezó como muchas cosas... un trabajo rápido para ayudar a un compañero, y al final el marrón que lo quedas tu...

Bueno sobre esto y python, en un post futuro...

Poniendolo en contexto

Con los recursos que ya he enlazado, son suficientes para meterse en este tema, pero faltaría poner todo esto en contexto. Y el contexto no es mas que la Web Semántica, que es una de las 'ramas' de la Web 3.0.
Me he encontrado un par de artículos en eslomas.com, que os pueden servir muy bien, para poner todo esto en contexto:
Su autor, Francisco Echarte, ha estado investigando sobre folksonomías: [paper][memoria]

Como no podía ser de otro manera en hipertexto, también teneis una entrada.

domingo, diciembre 14, 2008

Code as Design

Vía RG llego a un artículo que es de muy interesante lectura: Code as Design: Three Essays by Jack W. Reeves. Bueno... realmente son 3 escritos que os podeis bajar en pdf.

Lo triste es que llegue esto a mis manos ahora.... Un ensayo de los noventa, que me llegue ahora tras mas de 10 años currando y una Ingeniería Superior. En fin...
Mejor tarde que nunca...

Yo al igual que RG y Reeves he visto la programación como parte fundamental del desarrollo de software (al contrario que mucha gente, que parece que lo que están deseando es dejarlo; considerando por ello que evolucionan profesionalmente). Por eso siempre me he considerado 'desarrollador' o Ingeniero del Software. Porque veo el desarrollo como un todo: desde el análisis a la codificación y las pruebas. Nunca me han gustado las etiquetas esas de 'analista', 'diseñador',... Por eso me ha gustado mucho el artículo. La idea está realmente bien expuesta.

Otro tema es que quieras dejar la programación porque te muevas mas hacia la gestión. Pero si estas en el lado técnico, no programar creo es un error.

jueves, diciembre 11, 2008

Protegé


Ya llovió desde que publiqué un post sobre Ontologías y OWL.
Pues bien, para manejar ontologías disponemos de Protégé, que es una herramienta open source.
La herramienta soporta dos modos de edición de ontologías:

  • The Protégé-Frames editor: que permite editar de acuerdo a el Open Knowledge Base Connectivity protocol (OKBC).
  • The Protégé-OWL editor: que permite editar ontologías para la web semantica. En concreto en formato OWL (W3C's Web Ontology Language ).
En mi proyecto anterior creamos una ontología en formato OWL.
El OWL realmente es XML, y la herramienta puede trabajar directamete con el fichero de texto o bien con el respaldo de una base de datos (pero *creo* que el diseño de la misma es muy pobre; de hecho en la versión 4 están cambiando esto y no está disponible).

Actualmente la versión 'release' es la 3.3.1, aunque hay dos versiones beta, la 3.4 y la 4.
La versión 4, soporta OWL 2.0, mientras que la versión 3 soporta OWL 1.0, RDF(S) y Frames.

La aplicación va sobre un GUI (Java), pero parece que hay un proyecto sobre web: WebProtege.
En principio todo se puede correr sobre la misma máquina, o no.


Instalación
En Windows, es trivial, pero si quereis instalarlo en Linux y no teneis escritorio te puedes encontrar un poco perdido, ya que no hay mucha información.
Si ejecutais el script de instalación con '-?' os da una pequeña ayuda, donde podeis ver que con '-i console' se puede instalar en modo consola.

Si procedeis a instalar en modo consola, no aparece ningún mensaje, pero se instala en el $HOME del usuario con que ejecuteis el script.

En el directorio donde se instala hay un fichero xml con información sobre la instalación.
En teoría se puede parametrizar la instalación pero de momento no he encontrado información al respecto.

EGroupWare


Minipost para reseñar esta aplicación [wikipedia].
Tienen una demo online.

Mi bro la está usando y me ha comentado que está realmente bien, y es forfree. ¿Que mas se puede pedir?
En la wikipedia está catalogada como una herramienta de Gestión de Proyectos, pero es mas que eso... es una solución mas integral.

wiki


Bueno... ya tengo un wiki corriendo.
Escogí MoinMoin. Los motivos principales por ser python y no usar BD.
El otro candidato finalista a probar que tenía en mente, era DokuWiki pero ya no lo voy a probar...
Escribiendo este post he visto que hay otra wiki realmente interesante TWiki.

En caso de querer usar BD supongo que hubiera tirado a MediaWiki.

Como podeis ver, los enlaces son todo de wikimatrix, y es que la página es la caña. Realmente es la referencia en el tema wiki. Te permite comparar cartacterísticas..., los lenguajes, ver estadísticas... Además en su foro hay mucha info.

Si alguna vez teneis que escojer una wiki, darle tiempo, no es un tema trivial. Merece la pena hacerlo bien, que luego hay que apechugar... En wikimatrix, vais a encontrar todo lo necesario para ayudaros.

Sobre el tema de los wikis en general comentar:
  • Es una pena que no haya un éstandar de codificación wiki. Te facilitaría el hecho de migrar de una a otra.
  • Si tienes muy claro que carácterísticas quieres se te facilita la elección.
  • En todo caso, en wikimatrix, hay un 'wizard' que te puede ayudar en la elección.
  • Una cosa a tener en cuenta, es usar las mas usadas. Por algo será.
  • El tema de los pluggings no es una cosa a despreciar... si usas una engine muy usada (como mediawiki) vas a disponer de un gran número de pluggings. Un ejemplo de MediaWiki: puedes pasar la página a pdf mediante un plugging.
  • Lo del WYSIWYG puede ser muy a tener en cuenta. Sobre todo si lo van a usar usuarios poco técnicos.

lxml marketing

Ha publicado un muy buen post Ian Bicking haciendo marketing sobre lxml.
Yo *realmente* no he usado, se lo sugerí a un compañero de proyecto, y le eché un cable con el tema... pero no le he dado un uso intensivo.
Pero tampoco se lo he dado a BeatifulSoup. He trasteado un poco, pero tampoco le he dado un uso serio.
Si tuviera que decidir me decantaría por lxml, porque lo que si que he usado es libxml2. A dia de hoy no me quedaría con libxml2, sino que me quedaría con lxml.

Por otro lado es interesante uno de los comentarios donde indican la imposibilidad de usar lxml en GAE. Por el contrario BeatibulSoup si se puede...

miércoles, diciembre 10, 2008

Sobre Dijkstra

A raiz de un post de RGalli, me he leido el artículo que linka (uno de los EWDs de Dijkstra, vamos un manuscrito): On the cruelty of really teaching computing science. [es][wiki].

Es de recomendada lectura a todo Ingeniero Informático, en estos tiempos que corren.
Ah! un regalo final, el link al archivo lo los EWDs.

viernes, diciembre 05, 2008

wiki vs CMS

Y aqui me ando montando un site para un grupo interno de mi empresa...
Tras hacer una página temporal a manubrio con html, tengo que escoger que soft usar para ir metiendo contenidos.
La duda es un wiki o un CMS....
La respuesta un wiki. Y además será MoinMoin. No porque esté hecho en python, sino porque no usa BD (de momento no quiero usarla), y he visto que realmente es potente.
En caso de haber tirado por un CMS, supongo que hubiera escogido Drupal.

El porque una wiki... sencillo. No necesito lo que hace que un framework de este tipo pase a ser considerado CMS (gestion mas potente de usuarios, mangement roles, workflow, tracear el contenido, ...). Aparte de lo que dice el artículo de la wikipedia, aquí podeis ver que es lo que hace a un CMS realmente serlo.

Otro soft que quiero usar es trac, que también incorpora wiki. Pero de momento no.

jueves, diciembre 04, 2008

Hoy me he encontrado un post interesante de python. Una buena recopilación de herramientas para acelerar python. Alguna no la conocía: Tools for Accelerating Python [Amund Tveit's Blog].

miércoles, diciembre 03, 2008

ntlmaps

Si habeis montado una maquina linux y teneis la desgracia que teneis que pasar con un proxy de microsoft con autentificación teneis la opción de usar NTLM Authorizaton Proxy Server.

Lo configuras, lo arrancas (es un script python) y a correr....
Claro, para poder correr tienes que usar como proxy http://localhost:5865 (una opción es meter el valor en la variable de entorno http_proxy).

Fedora 10 vs Ubuntu 8.10

Tenía que instalar un servidor linux. En principio tenía pensado meter Ubuntu, que es la distro que ultimamente he instalado en desktops. Pero a ultima hora me vino la duda....
Ummm, ¿y porque no Fedora?

Indagando esto es lo que he encontrado en la red:

+ I think their dev cycle is very similar, the installation manager and the community is better in Ubuntu, while Fedora is the distribution to use if you want to be serious about working at a professional level with Linux (meaning, RedHat
+ Fedora 10 vs ubuntu 8.10: "El resumen de la gran comparativa así como la conclusión es que en rendimiento las diferencias son ínfimas y la elección de una u otra distribución viene dada por las preferencias o las características extras de cada una según el gusto del usuario.
+ Next time, especially if your using Linux professionally, purchase hardware that has OEM support for Linux.
+ Ubuntu 8.10 has also gained Dynamic Kernel Module Support (DKMS), a new framework developed by Dell that will automatically rebuild kernel modules when new versions of the kernel are released. This improvement will hopefully prevent third-party drivers from breaking when kernel updates are pushed down to users.
+ Fedora is the leader in innovation, what you see in ubuntu has been implemented and developed in fedora six months ago.
+ Ubuntu is a great "just works" distro, whereas Fedora is much nicer for tweakers.

Resumiendo.... que me he decantado por una Ubuntu Server. La diferencia entre la Server y la WorkStation es que la Server no tiene X, ni programas de escritorio.
El sistema de paquetes de Ubuntu es mejor, y aunque las novedades no estan disponibles tan rápidamente, pues como que me da igual... prefiero la estabilidad.

La instalación es en modo texto, y te da opción de instalar paquetes típicos de servidor: samba, LAMP, ...

Nota final: Lo interesante de trabajar con Fedora es que lo que mas te vas a encontrar luego en entornos reales es Red Hat ES.
La fábula del pastor y el jefe de proyectos [de Rodrigo Corral].
Habrá que seguir este blog...

lunes, diciembre 01, 2008

Sobre Webkit

Ese post es un autoapunte sobre la 'rendering engine' Webkit [wikipedia].
En principio no podemos correla tal cual en linux, pero tenemos webkitgtk, y un par de futuribles ports: qtwebkit y wxWebkit. (osea sobre wxWidgets).

Así a bote pronto, me interesa el primero (que es el desarrollado), ya que disponemos de pywebkitgtk.

Para variar... comentar que hay poca documentación sobre webkit. Creo que lo mejor que debe de haber es la doc del port a Objective-C.

Y ya para acabar, un regalo; unos links sobre el tan recurrente tema de qt vs gtk: [1][2][3].
Resumiendo:
  • gtk: licencia lgpl, menos documentado, C (pero hay ports a C++ y a python)
  • qt: licencia dual, mas sencillo, mejor documentado, C++

Alrededor de Oracle

Pregunta el gerente al empleado -- ¿Y que tal de Oracle?
-- Siempre he estado alrededor de Oracle

¿¿¿¿¿ Mande????? Vaya respuesta ingeniosa. ¿Que debemos entender?
  • La persona en cuestión siempre ha estado currando en las Rozas
  • o por el contrario en los proyectos es que ha estado, se ha usado Oracle, pero el siempre ha escurrido el bulto, y se ha logrado zafar de implementar las queries
  • .../...

viernes, noviembre 28, 2008

PanelR

Ricardo Galli, nos muestra su 'frustación' por no haber podido sacar adelante su último vaporware.
Lo hizo con python y Google App Engine.

Gracias a su post llego a friendfeed y stackoverflow (guapo el diseño...).

miércoles, noviembre 26, 2008

Sobre Search Engines


Estoy un poco frustrado...
Que poca documentación hay sobre search-engines en general....
Es un campo como con un poco de oscurantismo.
Si ni siquiera la wikipedia tiene tablas comparativas de productos... hay que ver.
Si siquiera los listados estan completos.

La verdad... hacer cualquier cosa en este campo... lleva un coste de entrada alto... Precisamente por esta falta de documentación en general.

Mi experiencia hasta ahora sólo ha sido con Fast Data Search, y es mi referencia. Por lo que he visto, lo único realmente que se le aproxima sería Nutch. Por lo que así a bote pronto, si la tecnología y/o el lenguaje no es importante creo que la elección actual para montar algo debería ser Nutch.

Nutch viene con todo lo necesario: indexador, buscador y crawler. Pero ademas, permite ampliar el core, mediante pluggings. Algo fundamental...
Y algún producto adicional alrededor, como Solr.
Por todo ello es el candidato número uno a considerar.

El problema es si queremos usarlo desde python, ya que si que tenemos pylucene, pero no pyNutch.

Como alternativa a indexar/buscar de lucene tenemos xapian. Puede que tengamos claro que queremos xapian [un articulo] en lugar de lucene, por alguna característica diferenciadora del primero (de nuevo hecho en falta una tabla comparativa).
Si queremos montarnos un framework en python, con xapian puede que lo tengamos más fácil, pero será mucho mas curro que con Java.

Tenemos dos alternativas... sumarnos a la corriente y tirar por nutch, o montar una alternativa con python.
Incluso si tomamos la opción de la alternativa, todavía nos quedaría la decisión de decidir que indexador usar (pylucene o xapian) y que crawler.

A la hora de decidir que indexador usar ahí van unos enlaces (hay muy poca información de comparativas):

¿Y nadie se ha planteado esto antes? Pues claro que si. De hecho ahí comentar un par de productos Lupy (ya extinto) y nucular.

Ya para acabar...
Meter unas notas sobre que mas cosas hay por ahí y que no considero.
En primer lugar referenciar la cutre pagina de la wikipedia, y otra mucho mejor.
Y unas cuantas search engines adicionales:
  • sphinx: (C++) Es un producto activo. He leido que tinene bindings para python. No he visto que tenga crawler. Tiene pluggins para conectarse a diversas BDs, como MySQL. De hecho parece que es el uso que se le está dando principalmente, a buscar en BDs.
  • YaCy: tiene un crawler, pero es como un sistema totalmente distribuido. Debe ser una cosa rara.. no he produndizado mas. (C)
  • swish-e: No he leido nada en contra del producto. Por lo visto es muy sencillo. Tiene un crawler en perl, que genera datos en formato específico apra swish (C/perl). El crawler no tiene mala pinta... Hasta soporta callbacks. Hay una versión para C++. Refs: [1]. La versión actual tiene un problema gordo, no soporta unicode. Y la indexación no es incremental.
  • Terrier: Incluye crawler (Java)
  • egothor: Incluye crawler (Java)
  • Zebra: Viendo el site, se puede apreciar que es un producto de calidad. Muy bien documentado. Parece que su punto diferenciador es que soporta el interfaz Z39.50. No tiene crawler. Creo que sólo soporta texto y XML. (C)
  • zettair: No he visto que tenga crawler. (C)

Heritrix vs Nutch


Enlazando con el post anterior, ahí va este.
Como ya dije, me llevé una muy buena impresión de Heritrix. Esto unido a que no soy fun de Java, me hizo en un primer momento pensar que Heritrix era el mejor producto... Pero no es el caso...
Como ya he indicado en el post anterior, como almacena Heritrix los datos tiene su pega...
Es por ello que he procedido a buscar en la web comparaciones entre ambos...
En este post, adjunto lo que he encontrado.

De [1] (ojo, del 2005):
"The primary aim of Heritrix is to be an "archival crawler" --
obtaining complete, accurate, deep copies of websites. This
includes getting graphical and other non-textual content.
Resources are stored exactly as they were received -- no
truncation, encoding changes, header changes, etc.


Recrawls of the same URLs do not replace prior crawls in any
sort of running page database.


The focus has usually been dozens to hundreds of chosen
websites, but has begun to shift to tens of thousands or
hundreds of thousands of websites (entire national domains).


Crawls are launched, monitored, and adjusted via a (fairly
complex) web user interface, allowing flexible (and sometimes
downright idiosyncratic) definition of what URLs should be
visited and which should not.


My understanding is that with the Nutch crawler's alternate
aims, some of the things it does differently are:
- only retrieves and saves indexable content
- may truncate or format-shift content as needed
- saves content into a database format optimized for
later indexing; refetches replace older fetches
- run and controlled from a command-line
- emphasizes volume of collection under default conditions,
rather than exact satisfaction of custom parameters


I'm not up-to-date on the Nutch crawler, I could be missing
important features or distinctions.


It'd be nice to converge parts of the crawlers' architectures,
for example to share link-extraction or trap-detection
techniques."

Me preocupa sobre lo que dice que almacena y no nutch. Tengo que hacer pruebas de esto...

De [2] (del 2008):
"Here are a (few) dimensions that may help
with your investigation:

+ The Nutch crawler operates in a stepped, batch fashion. It runs
through a list of generated URLs fetching each individual URL until the
list is done. You then generate the next list to run after running
analysis of the most recent fetch. Heritrix just runs fetching until it
runs out of URLs that fit its defined scope.
+ The Nutch crawler is a MapReduce job. This means that distribution is
just a matter of adding nodes and tasks (Tasks are retried if they fail,
etc.). Heritrix distribution is the divvying up of the crawl-space
outlined above (but from what I've heard, on big crawls folks just don't
bother with the sort-and-insert step reasoning that eventually every
individual crawler will trip over its URLs if its let run long enough).
If a heritrix instance crashes, recovery is manual involving either the
rerunning of a pseudo-crawl 'journal' or revivification using the last
'checkpoint'.
+ Heritrix has more crawling features -- knobs and switches -- than the
crawler in Nutch and it is more 'dogged' about fetching content than
Nutch given its roots in an Archiving organization.

The latter feature you may not want and regards the former, its easy
enough adding whats missing given Nutch is pluggable, open source."

Como indican, la forma de distribuir el trabajo es totalmente diferente.
Voy a terminar el post, con dos graficos que muestran las arquitecturas de ambos crawlers:


Nutch



Heritrix





Notas:
  • Consultando el API de Heritrix, puedo comprobar que hay mas de un 'processor' de escritura. Aparte de el de por defecto, ARCWriterProcessor , tenemos: Kw3WriterProcessor, MirrorWriterProcessor, WARCWriterProcessor (este formato parece que no ha pasado de la etapa experimental).
  • Si realmente queremos acceder al crawler store desde python, quizás sea mejor opción Heritrix, aunque nos toque hacer un WriterProcessor a medida.
  • El siguiente link explica como funciona Heritrix. Tomado del Developer Manual.

martes, noviembre 25, 2008

Open Source Crawlers


Estoy echando un vistazo a ver que que hay disponible Open Source, para crawlear.
Este post es un miniapunte, de lo que seguramente sea un artículo mas largo...

El punto lógico de entrada para mirar... pues la wikipedia.
He intentado encontrar algo mas allá... pero realmente no he encontrado nada interesante.

Sin hacer un análisis muy exhaustivo, os puedo decir que los tres principales candidatos a considerar serían (*1):
Los dos últimos son java, mientras que el primero creo es C.
nuch, está bien, porque es un producto con bastante apoyo, una documentación posiblemente por encima del resto (por ser de apache).

La alternativa sería hacer nosotros el crawler, pero esto sería una solución sólo a llevar a cabo si no nos queda mas remedio, ya que no es un tema trivial.

nutch
En principio no lo iba a considerar, por no haber entendido correctamente su arquitectura.
Pensaba que no tenía un crawler-store independiente de los indices. Pero no es así.
Si que lo tiene, y al igual que heritrix, en formato comprimido. Son lo que llaman segmentos.
Realemente lo que se almacena son objetos java, serializados y comprimidos.

httrack
El primero ya lo había usado para crawlear sites pequeñitos, pero aquí estamos hablando de usarlo para hacer crawleos potentes, de la web.
Todavía no lo he probado en serio en esta faceta, ya que sólo lo había usado en windows, y como he indicado para hacer crawleos de sites.
Pero el core del crawler es una librería con lo cual siempre vamos a poder acceder a ella desde python (esto siempre lo tengo en el punto de mira ;).

De hecho ya hay un módulo python disponible, httrack-py, que permite implementar ciertos callbacks en python.
Pero si lo que queremos es integrar completamente la librería en python, me temo que no vamos a tener nada disponible... Eso si, siempre podemos hacer nuestros propios bindings; para ello disponemos del código fuente...

El producto la verdad, está bastante documentado.
Ya para acabar indicar que lo que nos interesa realmente, no es la estructura de mirroring que genera el comando (al estilo de wget, vamos...) sino los datos cacheados.
Estos datos estan en unos tar.gz, a los cuales tendremos que acceder a través de una librería ya que directamente casi seguro nos van a dar problemas en la descompresión...

Total... que para poderlo usar algún desarrollo vamos a tener que hacer...

heritrix
El que esté detras de este crawler archive.org, ya es una garantía de que el producto va a estar bien.
La documentación es un poco pobre, pero para lanzar una prueba básica te apañas.
Indicar que tuve problemas para lanzarlo en windows, pero en linux ninguno.
El interfaz para la configuración es web (el crawler corre un servidor web de configuración), y soporta la gestión de crawlers distribuidos.

A la hora de definir el 'job' de crawleo, tenemos muchas opciones a configurar. Es aquí donde la documentación es mas pobre. Seguramente tengamos que recurrir al API java y a la documentación para desarrolladores para ampliar el tema. La de usuario no lo cubre.

Como resultado del crawleo se guardan los documentos en unos archivos ARC, comprimidos. De todo el proceso se van generando datos. Que podemos consultar tando desde el GUI, como desde diferentes archivos.

Con la instalación, se incluye el comando arcreader, que nos permite acceder a los contenidos de los archivos arc.
En la web, se indica que hay readers/writers en python para los archivos ARC, dentro de la herramienta hedaern

Conclusión
No tengo nada claro que producto usar. Es una conclusión inconclusa...
En principio descartgaría httrack, ya que su función es mas limitada. Está mas bien diseñado para crawlear sites, en lugar de la web. Pero es un producto que fácilmente podemos integrar con python.

Con respecto a los otros dos... dificil cuestión. Heritrix, me ha parecido realmente potente.
Tanto por la forma de trabajar como por todos los datos que te ofrece.
En este aspecto me ha llamado mas la atención que nutch. También es posible nutch te muestra esa información, pero de momento no haya accedido a ella, ya que sólo lo he lanzado modo comando.
Quizás el mayor problema de heritrix, es que está orientado a conseguir una imagen de la web en un momento dado. Si recrawleamos, un mismo documento, no va a sustituir a la versión anterior.
Estaría duplicado (*2).

Heritrix tiene una ventaja con respecto a nutch, y es que el formato del crawler-store es tal que podriamos acceder desde cualquier lenguaje. Por el contrario al crawler-store de nutch sólo podemos acceder desde java, ya que lo que se almacenan son objetos java serializados y comprimidos.
Con ambos productos, podemos extraer documentos vía comando.

(*1) Son los que me han parecido mas usables
(*2) al menos con el comportamiento por defecto; y creo que sin defecto, ya que los archivos ARC llevan implicito un timestamp. Para poder decidir si un documento está en un crawler-store o no habría que recorrelos enteros...


jueves, noviembre 06, 2008

Manejando HTML entities

Estoy haciendo un pequeño proyecto personal en python, para lo cual estoy parseando html con BeatifulSoup. Me he decantado por él por los siguientes motivos:
  • Probarlo mas a fondo
  • No quiero tener dependencias que no sean python (descartado entonces lxml/libxml2)
  • No necesito la solución más rápida
Sobre BeatifulSoup ya postearé alguna cosilla...
Pero este post va sobre el manejo de entidades de html. Al tratar el texto con BeatifulSoup, no me las transformaba a texto unicode. Por lo que me puse a indagar...
Por lo que he podido ver en el rato que he estado buscando parece que no hay nada en las librerías estándares para pasar entre entidades html y cadenas. Se me hace raro...

Enseguida encuentras que en el módulo htmlentitydefs, que tiene las definiones que necesitas pero no tiene ninguna función que realice el trabajo... Se me hace raro...

Buscando un poco mas encontré un thread, donde proporcionan como hacerlo (vamos..., que no vamos a reinventar la rueda...): Convert from unicode chars to HTML entities [encode][decode].

Pero BeatifulSoup, ya se encarga de ello, si pasas en el constructor el parámetro adecuado.

soup = BeautifulSoup(data,convertEntities=BeautifulStoneSoup.HTML_ENTITIES )


Mas info aquí.

miércoles, noviembre 05, 2008

Corriendo Linux en el portatil

Necesito tener disponible un linux... Y las alternativas que tengo son:
  • que me den algun usuario en alguna máquina
  • utilizar algun hosting (que ya tengo)
  • instalarme linux (descartado, ya que no puedo permitirme enredar a ese nivel con el portatil; ya me cargué el XP en un par de ocasiones....)
  • usar cygwin
  • usar vmware
Y la opción ganadora es... vmware. Además tenemos dos versiones que son forfree: vmware player y wmware server.
De momento para lo que yo quiero me bastaría con el wmware player (ya que no necesito más de un SO virtual; si necesitame mas de uno tendría que usar wmware server, o pillar un workstation piratilla; porque no voy a pagar por ello...).

sábado, noviembre 01, 2008

Pasando pagina...


Ayer, viernes 31 fue mi último día de trabajo en el 'proyecto' (averigua) que me ha tenido ocupado unos 3 añitos... Se dice pronto...

Puedo decir, que personalmente ha sido el mas gratificante, a pesar del tiempo que he estado en él. Seguramente podría haber estado otros 3 añitos. ¡Ojo! con esto no quiero decir que no haya habido crisis... que ha habido unas cuantas (en una apuntito estuve de largarme...). Pero ya se sabe... lo malo se olvida y perdura lo bueno. Y lo bueno es que me lo he pasado bien, he tenido unos compañeros geniales y hemos aprendido mucho.

Hasta ahora le mejor experiencia había sido cuando con 2 compañeros desarrollé NQOS en Dycsa.
En parte se repite la historia, aunque de distinta manera. No he logrado ver a ambos sistemas en producción. Con NQOS porque fuimos a parar a otra compañía, como la mayor parte de la empresa (despachados a Indra).

En el caso de averigua, se repite un poco la historia. Un equipo pequeño, y lo dejo antes de que realmente esté en producción. Si es que alguna vez lo llegara a estar...
Y el problema no es del proyecto, que es lo que da mas pena, sino de factores externos, interés en él real, la existencia de enemigos en la casa... en fin... muchas cosas que al final nada tienen que ver con la calidad del producto.
El 'adolestente' que es ahora, no ha tenido una infancia fácil. Nació en la familia de un buscador, y estaba destinado a tener un futuro en esa familia.
Pero la vida da muchas vueltas y antes de llegar a la 'adolescencia' se tuvo que buscar la vida por su cuenta, o perderla... como pasó con el buscador.
Fruto de esas vueltas es que en este momento, no este en un estado mas saludable; pero es lo que tiene la calle... hay que buscarse la vida... y sobrevivir siempre pendiente del enemigo no es fácil... (ni que decir tiene que es mucho mejor criarte arropado en una familia que te quiere y te guía).

No se que será de su futuro, pero no pinta bien. De momento se queda al 'trantran', con un equipo mínimo para subsistir, hasta que decidan darle cerrojazo por completo, o para que se den cuenta de que 'averigua mola'. O mejor... sean capaces de darle uso; en fin...

La verdad... que mal funcionan las empresas españolas. Son de lo peor! No llegan a apostar al 100% con ideas novedosas, no apuestan por la gente, racanean siempre con eso, y luego se gastan la pasta en chorradas, o maquinas que luego no usan; guerras internas, envidias, directores que no valen para lo que hacen,... en fin.. un asco.

Una pena para los que abandonamos el barco ahora, sobre todo para su ideólogo y yo; ya que somos de los que quedabamos, los que sentamos la base de lo que es ahora la criatura (en cuanto arquitectura, que en cuanto a lingüistica hay mucha chicha, y esa no era mi guerra).

Pero por otro lado, se abren nuevo horizontes. ¿Cual será el próximo reto? No espero mucho de la consultora en la que trabajo. ¿Intentará meterme ahora en cualquier gena, con tal de dejar de ser un coste para ella... ?
Si pasas por aqui de vez en cuando, y lees estas lineas y sabes de algo que me pudiera intersar, pues dedirte que estoy en modo 'escuchar ofertas interesantes' ;).

Building Scalable Web Sites

Building Scalable Web Sites, de Cal Henderson, es el libro que me tengo ahora entre manos.
Me quedé con la copla de él, leyendo el blog de kirai, y una dia de estos me dio el pronto y lo pillé en amazon.

Por lo visto los capitulos estrella, son el 8 y sobre todo el 9. Podeis leer críticas sobre él en el link de amazon, o también en slashdot.

El libro está bien escrito y cubre muchos temas de desarrollo web. El código escrito está principalmente en php (pongamos un 95%), pero no importa si no usas php, ya que lo importante no esta en el código...

Aquí podeis acceder a prácticamente todo el contenido del libro.

Desde mi punto de vista (y sin haberlo leido todavía entero) es de lectura recomendable. Pero mejor echar un vistazo a las críticas de amazon y slashdot...

Y unos links para acabar...

viernes, octubre 24, 2008

Descriptors y Decorators

Hay un post de Ian Bicling sobre como usarlos en combinación.
En dicho post hay unas referencias a un HowTo sobre Descriptors (interesante leer los comentarios) y a un nuevo tutorial sobre Decorators de Bruce Eckel.

Antes de comentar al respecto postear dos referencias mas sobre Bruce: una en la que habla sobre la que será su próxima publicación, Python 3 Patterns and Idioms; y otra que la que habla porque no habrá un Thinking in Python (es interesante además porque da unas referencias a otros libros).

Bueno volviendo al tema del post...
Realmente puedes leer sobre los descriptors, pero realmente para pillarlos hay que trastear con ello y leerlo con muchaaaa calma (y lo ideal sería probando los ejemplos). Pero bueno.... El tutorial sirve para pillar la idea.

El de los descriptors por el contrario si que es sencillo. Y son muy muy potentes.
Una de las cosas que eché de menos cuando empecé con python es el poder tracear las entradas y salidas de funciones o métodos. Esto típicamente se hace en C/C++ con macros.
Pues bien... con descriptors es posible hacerlo.

El pero es que con los descriptors en principio pareceque que tienes que modificar el código fuente. Pero no!!! Aunque es la forma evidende de usar los descriptors no es la única, ya que todo el mecanismo es dinámico. De hecho... esto se podría hacer sin los descriptors, ya que todo en python es dinámico...
Que quedo con la copla para experimentar con ello en un futuro...

miércoles, octubre 22, 2008

Usando webkit desde python

Antes de nada comentar que no lo he probado, pero me gustaría...
Se puede usar webkit desde python a bravés de pywebkitgtk.

Relacionadas, parte de pywebkitgtk, veo que también existen Pyjamas and python-qt4-webkit.

Intentando investigar un poquito sobre este tema... que he encontrado este post de comp.lang.pyhon (enfocado principalmente a ejecutar javascript, pero relacionado):

"pyv8 is the newest addition: http://advogato.org/article/985.html

it's a python wrapper around google's v8 javascript execution
library.

then there's pykhtml: http://paul.giannaros.org/pykhtml/

it's a python wrapper around KHTML, providing very convenient access
to KDE's HTML capabilities: what pykhtml does is "pretends" that the
GUI part of KDE doesn't exist, so you can run your program as a
command-line shell; it will execute the javascript, which you will
have to wait a bit for of course; then you can walk the DOM tree
(using pykhtml bindings) using pykhtml.DOM.getElementById() and
getElementsByTagName("a") etc. etc. looking for the URLs.

there's even an AJAX example included which does 1-second polling of
the DOM model, waiting for a spell-checking web site to deliver the
answer.

then there's webkit, with the new glib bindings:
https://bugs.webkit.org/show_bug.cgi?id=16401

which are then followed up by python bindings to _those_ bindings:
http://code.google.com/p/pywebkitgtk/issues/detail?id=13

this will also allow you to execute arbitrary javascript - again, it's
similar to KHTML and in fact webkit really _is_ the KDE KHTML code
(JavaScriptCore, KJS etc) but forked, improved, etc. etc.

unfortunately, the glib bindings are tied - at three key and strategic
locations - to gtk at the moment, which will take _very_ little work
to "un"tie them [pay me and i'll do the work], so you would need to
create a blank gtk window - just like is done with pykhtml, behind the
scenes.

it would be a very simple task to create a "dummy" - console-based -
port of webkit, providing an array of callbacks which you must hand to
the library. at the moment, the design of webkit is not particularly
good in this respect: there are three ports, gtk, wx and qt, which are
heavily tied in to webkit. it would be a _far_ better design to be
passing in a struct containing function callbacks (rather a lot of
them - about eighty!) and then what you could do is have a "console"-
based port of webkit, which would do the job you needed.

alternatively, if you don't mind wrapping a binary application with
e.g. Popen3 then look at the webkit DumpRenderTree application, paying
particular attention to using the --html option. you won't have any
control over how long the javascript is executed for. after an
arbitrary and small period of time, DumpRenderTree _stops_ executing
the javascript and prints out the HTML DOM model (in a non-html-layout
fashion - it's used for debugging and testing purposes but will
suffice for your purposes).

so, as it stands, pywebkitgtk is _no worse_ than pykhtml, but with a
little bit of tweaking, the "gtk" could be removed from "pywebkitgtk"
and you'd end up with... ohh... call it "pywebkitglib" ... which would
be much better as a stand-alone library, for your purposes

then there's also "spidermonkey", which is mozilla's javascript
engine. i haven't investigated this option: haven't had a need to.

then there's also PyXPCOMExt, which is embedding python into mozilla,
and from there you have PyDOM, which allows you access to the DOM
model of the mozilla "thing". so, if you don't mind embedding your
application into XULRunner, you've got a home for executing your app
and obtaining the urls, post-javascript-execution.

the neat thing about PyXPCOMExt is that you have complete and full
access to python - so your app can make external TCP and UDP sockets,
you can embed an entire _server_ in the damn thing if you want (you
could embed... python-twisted if you wanted!) you can access the
filesystem - anything. absolutely anything. reason: the _entire_
python suite is embedded into the browser. every single bit of it.

that's about all i've been able to find, so far. there might be more
options out there. not that there aren't enough already :)

all of them will allow you complete and full access to execution of
javascript, including AJAX execution. which is why you'll need to do
that "polling" trick in many instances. "

lunes, octubre 20, 2008

Pasar de pdf a texto/html

Para extraer el texto del pdf, se de dos aplicaciones que funcionan bien:
Por lo visto en una etapa del pipeline de fast (de las que vienen disponibles), se usa xpf (no lo puedo asegurar al 100%).
Nosotros en cierta ocasión usabamos el segundo (¿o fue pdf2html?). Porque nos daba mejores resultados.

Si quieres hilar mas fino, y no depender de una aplicación externa existe Poppler.
Parece que ha habido un amago de hacer bindings a python para poppler...
Uno de los peor de poppler es que no hay documentación.

Dentro del paquete poppler-utils, hay utilidades de conversión.
He visto que existe el paquete pyPdf.

viernes, octubre 17, 2008

Primer curso python impartido


Bueno... ayer se acabó el primer curso python.

No se como habrá resultado, ya que es dificil verse desde fuera (estaría genial poderse ver grabado, para corregir posibles defectos). Pero creo que en general ha estado bien.
Aparte de mi exposición, el material desde luego si que creo que está bastante bien.
Tras la experiencia del curso, quizás podría retocar alguna cosa (muy poca), o por mi parte mirar con mas detalle alguna referencia. Pero la verdad... para un curso de 12 horas, poco mas puedo ampliar. El tiempo está muy bien ajustado ya.

Lo malo, pero esto ya es típico de los cursos dentro de una empresa, quizas un poco de falta de interés por algun alumno (bueno es la percepción desde el lado del profesor). Pero vamos.... esto es algo de esperar. Pero con que haya ya sólo uno con interés es suficiente. Aún así, la gente con menos interés ha podido ver de que va esto de python...

El peor día fue el primero, en el que empecé con un poco de tensión, pero una vez superada el resto bien.
El último día me lleve un chasco. Hice una demo sobre como con joins() la concatenación de cadenas es mas eficaz que usando el operador '+'. Y no fue así. Los tiempos salieron similares.... [1]

A la presentación que tenía preparada le añadí contenido de la presentación de Gustavo Picón, para hacerla mas amena. Sobre todo para el comienzo.

El hacer un curso en python, es realmente muy sencillo, por la interactividad que te permite el interprete.
A la hora de escoger ejercicios para realizar por el alumno, hay dos opciones: hacer muchos ejercicios sencillos, o hacer menos pero mas complejos (no por la dicitultad del problema, sino por que consitas en hacer aplicaciones que realmente hagan algo).
Me decidí por la segunda opción.
En cuanto a la teoría indicar, que la aproximación al contenido ha sido la de pensar, según mi experiencia que debería tener. Y a partir de ahí elaborarlo, tirando de distintas fuentes y metiendo muchas referencias externas.
Lo mas sencillo hubiera sido fusilar algo ya existente, pero no me interesaba esta aproximación (mucho mas cómoda para mi). Ahora cualquiera con interés puede ver libros, u otras presentaciones y el contenido será diferente.

Al final el curso está dividido en 4 partes correspondientes a 4 dias (3 horas por dia):
  • Teoría, jugar un poco con python
  • Ejercicio 1 y explicación
  • Teoría, comienzo de Ejercicio 2
  • Explicación ejercicio 2, y practica libre
Durante la realización de los ejercicios, he mostrado mas cosillas...

Ya para acabar, indicar que en la web hay muchas presentaciones (incluso videos). Ahí va un listado de presentaciones de guido.
Y el enlace a la presentación del curso: El mundo de python.

Notas:
[1] Efectivamente, hay novedades que no sabia sobre esto. Por lo visto desde CPython 2.4 según What's New in Python 2.4: "String concatenations in statements of the form s = s + "abc" and s += "abc" are now performed more efficiently in certain circumstances. This optimization won't be present in other Python implementations such as Jython, so you shouldn't rely on it; using the join() method of strings is still recommended when you want to efficiently glue a large number of strings together."

jueves, octubre 16, 2008

NTLM Authorization Proxy Server

Relacionado con el firefox, ya comenté hace tiempo de una extensión interesante. MM3-ProxySwitch. Es interesante si necesitamos cambiar frecuentemente de proxies.

Otra utilidad muy util es un script en python que te permite autentificarte ante un proxy NTLM.
Si tenemos el MS Proxy Server y no estamos en el dominio, con firefox será un infierno navegar, ya que nos pedirá que nos autentifiquemos con cada petición. Este script, NTLM Authorization Proxy Server, lo soluciona.
Su autor Dmitry Rozmanov.

He indagado en Pypi, pero no está. Eso si, me he encontrado otro proxy disponible.

domingo, septiembre 28, 2008

Singleton

Necesitaba encontrar un ejemplo sobre uso de metaclases en python, y me decanté por el patrón Singleton, ya que había visto algo.
Resumiendo... la mejor solución actual es usando metaclases y es:

class Singleton(type):
def __init__(cls, name, bases, dct):
cls.__instance = None
super(Singleton,cls).__init__(cls, name, bases, dct)

def __call__(cls, *args, **kw):
if cls.__instance is None:
cls.__instance = super(Singleton,cls).__call__(cls, *args,**kw)
return cls.__instance


No se si tiene algun problema, ya que no estoy nada puesto en metaclases. Para acabar unas referencias comentadas:
  • wiki-es: donde ví la implementación de metaclases. Pero el cçodigo aquçi incluido varia en que usa super.
  • wiki-en: no tiene la opción de metaclass
  • Gary Robinson, implementa un singleton siguiendo unas ideas de aquí. No he tenido tiempo de mirarlo. Pero lo dejo anotado, ya que puede merecer la pena echarle un ojo.

viernes, septiembre 26, 2008

Google Moderator

Leo en genbeta sobre una aplicación sobre Google App Engine, Google Moderator.
Veo que están metiendo preguntas para Guido sobre python.

Python popularity

Me he encontrado con este blog, donde incluyen unos gráficos sobre la evolución de los lenguajes para el desarrollo de proyectos open-source. La fuente es un sitio llamado ohloh.

Python va evolucionando muy favorablemente. Otro gráfico de mi interés.

viernes, septiembre 12, 2008

Webkit vs Gecko

Hay un post en barrapunto sobre una comparativa entre WebKit y Gecko.
Me ha congratulado leer algún comentario sobre Gecko que cuadra totalmente con lo que yo ví una vez que intenté evaluar si nos podia servir para un proyecto:
  • no había documentación por ningún lado
  • la organización del codigo es un cristo, no está nada modularizado, aparte que la cantidad de codigo de la base es... brutal!!!
Vamos... que te descargas el código de Mozilla y no sabes ni por donde entrarle...
El artículo (el de dosideas) está muy bien, y es corto.

sábado, septiembre 06, 2008

Google Chrome

La novedad de la semana... ¿Y será la última de septiembre? Seguro que no... ya que es el decimo aniversario de google.
Hay un post relacionado de dirson que también está muy bien, va sobre una encuesta sobre los productos de google.
Hay muchas cosas por leer entorno a Chrome, pero todavía no he tenido mucho tiempo...
Por de pronto comentar que el comic, está relamente bien. Redomendable su lectura.

Ya un detalle super geek. Tras instalarmelo me aparece un artículo de Ian Bicking, como en los marcadores y como los mas visitados...
Es curioso... porque en el usuario que uso habitualmente no lo tengo ni en favoritos. Tendré que revisar el usuario admin...

sábado, agosto 30, 2008

Directorio de programación

En python.es surgió la idea de crear un directorio de blogs sobre python.
No había compartido nunca el enlace enl a lista, pero bueno... la verdad es que ya tengo unos cuantos contenidos en python que pueden ser interesantes.
El link irá a parar a directorioprogramacion.blogspot.com.

Habrá que echarle un ojo a ver como crece su contenido.. .

jueves, agosto 28, 2008

lxml

Ya he mentado en algun post anterior este parser de xml/html, pero no había tenido ocasión de probarlo.
En el proyecto ahora tenemos que manejar unos xml y hasta la fecha habíamos usado libxml2... Era el momento de cambiar... y la verdad es que está muy bien. Y bien documentado.

Ahí van unos enlaces:
  • la web. Que incluye un enlace a el manual (pdf). En formato html se acompaña con el código fuente. En la propia web hay más documentación en formato html, incluyendo el api.
  • Otro tutorial.
  • Y por supuesto tiene lista de correo [archivo].

jueves, agosto 21, 2008

Shutdown programado en windows

Hoy he aprendido un comando superutil:

shutdown -s -t [tiempo]

Te sirve para programar un shutdown en windows. Es muy util, imaginaros que habeis dejado descargandose algo y os quereis ir a la cama...
Con /? podeis ver el resto de opciones.

HTTrack

Hacía mucho que no usaba un Web Spider (o crawler). Y aprovechando que para el proyecto estamos usado HTTrack, lo he probado para un uso personal.

La verdad... esta muy bien. El único pero que le hemos visto es que no puedes obtener un mapeo entre las direcciones web, y las locales.

Se puede usar tanto para Linux, como para Windows.
Y ya lo que me ha sorprendido es que hay disponible una librería python, para usarlo desde python: httrack-py.

En linux, recordar que podemos usar para para los mismo wget.
En la wikipedia, podeis encontrar muchos mas crawlers.

martes, agosto 19, 2008

ConfigParser

Modulo muy útil para manejar ficheros de configuración en formato clave/valor y con secciones.
Vamos... al estilo de los .ini de windows.

Dentro del módulo se definen 3 clases:
  • RawConfigParser
  • ConfigParser
  • SaveConfigParser
RawConfigParser establece el interfaz básico. Una cosa en la que no había reparado es que al constructor se le puede pasar un diccionario con valores por defecto.

Yo hasta la fecha había usado ConfigParser, pero se te puede quedar corta...
El comportamiento de los métodos get() es que si una clave no existe te da una Excepción.
Nosotros hemos ampliado el interfaz con una variante de los métodos para que si una clave no existe, te devuelva el valor que le pasas por defecto. Vamos... similar que lo que puedes hacer desde el constructor, pero a nivel de método.
Lo que si que soporta son 'interpolaciones'. Es decir, el poder usar valores de variables como valores de otras variables dentro del mismo fichero de configuración.

Otra ampliación que le hemos metido es el poder hacer sustituciones en los valores a partir de variables del entorno. Para esto usamos el formato ${varname}. La verdad... Se podría haber hecho con las interpolaciones, usando el argumento opcional 'vars'.

SafeConfigParser simplemente modifica el método ser() para garantizar que el valor pasado sea un string.

jueves, agosto 14, 2008

Chuletilla para subversion

Estaba ya usando desde hacía tiempo subversion, pero la verdad... tampoco había leido demasiado sobre el mismo...
He ido tirando con mis conocimientos (básicos) sobre CVS. Pero notaba mis carestías, por lo que me dispuse a leer los capítulos 1,2 y 3 del siguiente libro. Se lo recomiendo a cualquier que esté trabajando con subversión; o que vaya a trabajar... Se lee rápido.

A continuación una chuletilla de cosas extraidas del susodicho..

Una vez hecho el checkout, el ciclo de trabajo típico es como sigue:
  • Update your working copy
    • svn update
  • Make changes
    • svn add
    • svn delete
    • svn copy
    • svn move
  • Examine your changes (estos comandos se pueden usar sin conectividad con el repositorio)
    • svn status
    • svn diff
      • Se puede usar un programa externo
    • svn revert
  • Merge others' changes
    • svn merge
    • svn resolved
      • elimina los ficheros temporales, cuando hay un conflicto
  • Commit your changes
    • svn commit
Otros comandos útiles son lo que te permiten examinar los ficheros (Examining history)
    • svn log
    • svn diff
    • svn cat
    • svn list
Y finalmente otros comandos:
    • svn import
    • svn cleanup
Notas:
  • Revisiones
    • Subversion lets you refer to these revisions by number, keyword, or date.
      • Con el date, si queremos sacar lo mas cercano a una fecha (incluyendola) hay que mete el día posterior
    • Las revisiones no van asociadas a archivo. Es decir si haces un checkout o un update de una revisión, te va a sacar todo lo que haya en esa rama con esa revisión (lo que hay en el HEAD, es decir lo mas actual con respecto a la revisión solicitada).
  • Se pueden hacer copias con 'history'
  • Los archivos pueden tener propiedades asociadas. Al ejecutar el comando se puede pedir que se ignoren.
  • Y por supuesto hay muchos comandos mas... Todo bien cubierto en el documento enlazado...
Y ya para acabar del todo, unos ejemplos de uso del comando status (muy útil y que no estaba acostumbrado a usar):

  • svn status --verbose --> saca info de todo, aunque no haya cambiado
  • svn status --show-updates --verbose --> este ya contacta repositorio
  • svn status -u -v --> la versión corta
  • svn status -vu | grep "*" --> nos indica que no tenemos actualizado con respecto el repositorio

viernes, agosto 08, 2008

Web Frameworks

En la lista de python últimamente han salido varios hilos sobre desarrollo web en python.
Especialmente interesante este: [1][2]
Aunque hay alguno mas: [3][4]

Los links son del archivo web.

lunes, julio 07, 2008

Revisitando urls

Python tiene la función urlparse que permite obtener los diferentes componentes de una url.
Ejemplo:

(scheme,netLoc,path,parameters,query,fragment) = urlparse( url )

Vamos a ver que contiene cada parte....:

  • scheme: Pues el esquema... ta claro.
  • netLoc: La localización de red... (ojo! incluye el puerto)
  • path: El path
  • query: La query (lo que va después de ?)
  • fragment: Esto es lo que va tras '#', al final de la url.


Si en la parte de la query ya tratamos los parametros, entonces ¿para que sirve parameters? Pues por lo visto son parámetros que pueden llevar cada 'segmento' del path. Eso si, no lo he visto en la vida.

Referencias:

¿Para Alma?

Suena muy fuerte el rumor de que Alma Technologies va a comprar a mi empresa....
Supongo que pronto sabremos algo.
Como cosa interesante el comentar que en Alma tienen un grupo dedicado a temas de tecnologías de búsquedas. Tienen un producto: SearchBox.

miércoles, junio 25, 2008

Desde luego navegapolis me está gustando mucho. Espero sigan en la misma linea...
Su último post: Directivos sin talento.

martes, junio 24, 2008

Futuro de python vs perl

De comp.lang.python: Python 3000 vs Perl 6.

Avances en C++

Aunque hace siglos que no toco C++, hay que estar al tanto..
Veo en el blog de Herb Sutter una entrada sobre unos cambios interesantes: Type Inference vs. Static/Dynamic Typing.

Un cambio en el lenguaje muy prometedor.
Gracias a ese post he llegado a una librería que desconocía: POCO.

Y ya para acabar aquí unos links a unas charlas (que no he visto, pero me gustaría) sobre el futuro de C++.

jueves, junio 19, 2008

Outsourcing

En Ingenieros de Primera tienen un artículo majetón sobre el Outsourcing : Aplicación del Outsourcing en las "Tecnologías de la Información".
Mucho mejor que los de la wikipedia [es][en].

Lo que no definen son algunos de los terminos usados: CIO (este no tengo claro a que se refiere exactamente), ROI, CTO.

martes, junio 10, 2008

refs refs refs

Hacia tiempo que Ian Bicking no publicaba nada. Acaba de publicar un post sobre Erlang.
Lo interesante ya no es el post en si, sino la cantidad de referencia que suelta en él, a saber:
  • Monkey path: "is a way to extend or modify the runtime code of dynamic languages (e.g. Smalltalk, Javascript, Ruby, Perl, and Python) without altering the original source code."
  • Bencode: "is the encoding used by the peer-to-peer file sharing system BitTorrent for storing and transmitting loosely structured data."
  • JSON: "(JavaScript Object Notation) is a lightweight data-interchange format." En dicha página hay muchas referencias sobre JSON y Python.
  • WebOb: "WebOb provides objects for HTTP requests and responses"
Y como no vamos a desvelar todas las cosillas interesantes... pues mas enlaces en el post...

CSV en python

Python tiene un modulo para manejar CSVs: csv [PEP].
Buscando un poco seguro que podeis encontrar otras implementaciones. Está bien que la librería incorpore este manejo de archivos ya que es bastante común.

Una cosa interesante que tiene, son los dialectos. Veamoslo con un ejemplo:


>>> import csv
>>> csv.list_dialects()
['excel-tab', 'excel']

Como podeis ver, el módulo incorpora dos dialectos para escribir/leer csv's del agrado de excel. Y es que hay que decir que no hay un estandar sobre CSV.

El hecho de estar mirando esto es porque estoy implementando un reader y andaba pensando si reutilizar este... En principio estoy por la labor... Si hay algo implementado mejor reutilizarlo ¿no?.
Lo que si que necesito de todas todas es un recubrimiento...
En principio hay dos cosas que me llaman la atención:
  • Si al consctructor del DictReader se le pasan los campos, si el fichero tiene cabecera, la lee como una línea normal ¡Ojo!. Si no se pasan los campos toma la primera linea como claves para el diccionario.
  • El constructor es muy flexible en su uso, a la hora de pasarle los parámetros.
  • El modulo tiene una clase para intentar deducir el formato de un csv: Sniffer.
Veamos un ejemplo:


#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

import csv
import sys


class midialecto(csv.Dialect):
delimiter = 'þ'
quotechar = '"'
lineterminator = '\r\n'
doublequote = True
skipinitialspace = True
quoting = csv.QUOTE_MINIMAL

csv.register_dialect("midialecto", midialecto)


campos = ['campo1','campo2']
f = open("ejemplo.csv","r")

# A descomentar la que mas nos guste
#
#dr = csv.DictReader(f,campos,None,None,'midialecto')
#dr = csv.DictReader(f,dialect='midialecto',fieldnames=campos)
#dr = csv.DictReader(f,dialect='midialecto')


for row in dr:
print row.keys()
print row.values()
sys.exit()


En el anterior ejemplo (descomentar una de las lineas que crean el 'dr') se imprime la primera línea que se lee del fichero, y se aborta.
Con los 3 constructores podemos ver la flexibilidad en la construcción, y como se comporta ante la presencia del argumento 'fieldnames' (si no se pasa => la primera linea se usa para formar las claves del diccionario).
Los parámetros que definen el formateo, pueden pasarse incluso en un diccionario.