sábado, julio 07, 2007

Estoy que lo rompo!

Me pasan un portatil para el curro y creo que no me ha durado ni un mes.
Se ve que venía de serie con un 'xp media center' y lo transformaron en un 'xp pro' y así ha ido.
Bueno el jueves me lo dan ya de nuevo en teoria con un 'xp pro' instalado desde cero. Pues na que me pongo a enredar con el linux (live cd) para ver si logro hacer una imagen del sistema y ya me lo he cargado.

¡¡¡¡¡GAAAAAAAAAAAAAAAAAÑAAAAAAAAAAAAAAAAAAAAAAAAN!!!!!

No se como, pero supongo que me he cargado el MBR. La verdad es que el particionamiento que tiene es raro de cojones.... Como me de la lata lo particiono de otra manera...

C: es la unidad de datos (/dev/sda2 y bootable)
D: es la del sistema (/dev/sda5 (unidad lógica sobre /dev/sda1)

Y luego tengo espacio libre para meter un linux.

Antes de enredar me salve el MBR (por supuesto) pero no se porque me da que va a estar en sda2...
También salvé la tabla de particiones y según vi seguia igual.
Resumiendo no se que puede haber pasado.

Seguiremos indagando...

Con que cara les voy a llevar a los pobres chavales de sistemas el portatil de nuevo para qu eme lo instalen.... Me da que voy a apañarmelas por mi mismo.

viernes, julio 06, 2007

[swig] Primeros pasos

La forma mas simple de generar los bindings es usar %include [el_fichero.h].
Pero es dificil que sea una buena idea, a no ser que lo que se quiera usar sea algo muy sencillito.
Según la documentación recomiendan una serie de pasos:

  • "Identify the functions that you want to wrap. It's probably not necessary to access every single function in a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are particularly good source for finding things to wrap.
  • Create a new interface file to describe the scripting language interface to your program.
  • Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
  • Make sure everything in the interface file uses ANSI C/C++syntax.
  • Make sure all necessary `typedef' declarations and type-information is available in the interface file.
  • If your program has a main() function, you may need to rename it (read on).
  • Run SWIG and compile."

Resumiendo.... que mejor solo hagas bindings para lo que realmente necesitas.
A continuación pongo otra parrafada interesante, sobre porque usar interface files.

"Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package.
There are several reasons why you might want to do this:
  • It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
  • Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
  • Interface files can provide more structure and organization.
  • SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
  • Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files."


Un ejemplo de dos posibilidades de definicion. Una primera teniendo el fichero de interfaz:


/* File : interface.i */
%module mymodule
%{
#include "header.h"
%}
extern int foo(double);
extern double bar(int, int);
extern void dump(FILE *f);


Y la segunda (que en este caso estaría justificada por ser el fichero muy sencillo):



/* File : interface.i */
%module mymodule
%include header.h


Por ejemplo si usamos la ultima aproximación con libcroco, debemos usar el flag --includeall e indicar con -I las rutas de todos los ficheros necesarios (incluyendo los del sistema), generandose mucho codigo, cuando lo que necesitaremos será simplemente una función y acceder a unas estructuras de datos.
Es mas.... posiblemente al final la aproximacion mas facil será crear unas funciones de utilidad en C, y ya hacer los wrappers a dichas funciones de utilidad con swig.

Nota: un flag interesante es -v.

[swig] Formato del fichero de interfaz

Una cosa que no esta bien explicada, o al menos no como un punto en la documentación (o al menos no lo he visto) que es el formato del fichero de interfaz, y una lista con las directivas soportadas.

En el fichero hay una serie de bloques que el formato [etiqueta] %{ %}.
Donde [etiqueta] puede ser:

  • %runtime
  • %header
  • %wrapper
  • %init
  • %inline
Si no se pone la etiqueta, estamos ante un bloque de tipo header.
El '%' es porque es el formato de las instrucciones para swig.
Por ejemplo el nombre del modulo en python se especifica con %module.

Todas esas etiquetas, con la excepcion de inline) sirven para incluir codigo que será includo en el fichero generado para el hacer el wrapper. No se parsean ni se generan los wrappers.
La excepción es inline: el codigo inline se da al compilador de C y a swig.

Un ejemplo de uso de inline lo tenemos en el primer ejemplo de swig: simple. Como no existe un header se meten las declaraciones en un bloque inline.

Si por el contrario tenemos un header, lo normal será usar el bloque %header y luego ya a continuación indicar las funciones para las cuales queremos generar los wrappers.

swig

En este post os presento a swig, el cual es una herramienta que nos permite 'conectar' programas escritos en C/C++ con programas escritos en lenguajes de script: como python, ruby, ...

Básicamene lo que hace es coger unas definiones y generar los wrapper necesarios para acceder al codigo C/C++,

En mi caso lo usaré para acceder a libcroco desde python. O bueno al menos eso intentaré.
Lo suyo es usar la version mas actual de swig, la 1.3.X. Sobre todo si estas con python 2.X.

Una de las cosas que sorprende es la calidad de la documentación. Da una imagen de un producto currado.

La mejor forma de empezar es tras bajarlo e instalarlo, echarle un vistazo a los ejemplos, que vienen bien documentados.

Según lo vaya creyendo conveniente pondrá algun post...

miércoles, julio 04, 2007

Hacía mucho no visitaba a Telendro. Demoledor post sobre la información que puede manejar google sobre una web: Regalar toda la información sobre tu web a google.

martes, julio 03, 2007

jueves, junio 21, 2007

Logitech Alto

Se tenian que enrollar en mi empresa y que preparasen puestos para la gente que usa portatil con por ejemplo algo tipo Logitech Alto.
¿Su precio? Pues creo que anda por los 99 euros.

miércoles, junio 20, 2007

RotatingFile

He estado buscando algo para implementar la escritura en un fichero, con politica de rotación al superar un determinado tamaño, ya que no interesa reinventar nada.
Lo único que he encontrdo es el handler RotatingFileHandler de python.
Dicho handler podría ser valido o no, dependiendo de los requisitos funcionales. A mi, para lo que tengo que hacer no, pero ahí va un ejemplo de su uso. Una clase que lo recubre:


import logging
import sys
from logging.handlers import RotatingFileHandler

#------------------------------------------------------------------------------
# RotatingFile
#------------------------------------------------------------------------------

class RotatingFile:

#------------------------------------------------------------------------------


def __init__(self,pathFilename,numBytes=0,numFiles=0):
"""
Notas:
- El fichero es de texto
- Para que exista la rotación los argumentos opcionales no pueden ser
0.
"""

# Notas:
# - Como al logger no se le fija un nivel, sacará todo
# - Al logger se le pone como identificador, la ruta al fichero.
# - Si numFiles es muy alto el algofirmo que se usa en el 'handler'

self.__logFile = pathFilename
self.__logger = logging.getLogger(self.__logFile)
hdlr = RotatingFileHandler( self.__logFile,'a',numBytes,numFiles )
fmt = logging.Formatter("%(message)s")
hdlr.setFormatter(fmt)
self.__logger.addHandler(hdlr)


#------------------------------------------------------------------------------

def write(self,value):
self.__logger.critical(value)

#------------------------------------------------------------------------------
# main (de prueba)
#------------------------------------------------------------------------------

if ( __name__ == "__main__") :
rf = RotatingFile("rotatingfile.out",10,5)
for i in range(10):
rf.write(str(i))

lunes, junio 18, 2007

WinShit

Definivamente.... windows es una mierda de sistema operativo.
El viernes lo pude comprobar en mis propias carnes. Me paso algo que como es posible que jamas puede llegar a pasar en un sistema operativo. ¿Como puede ser que el SO no sea capaz de borrar un arbol de directorios?

En mi curro suelo currar remotamiente con sesiones ssh, pero para probar una cosilla, decidí hacerlo en local, usando el eclipse: así mataba dos pajaros de un tiro: probaba lo que tenía que probar y echaba un vistazo a eclipse.

Pues bien... como no controlo eclipse, y tampoco miré ni un misero tutorial ni leches, hice algo mal y el programita de marras me metió en un bucle creando una estructura de directorios anidada recursiva muy profunda.
Al detectalo pues intenté borrarlo, encontrandome con el problema que menciono: link a la página de soporte de Microsoft.

Al no poder se me ocurrió es usar Linux, pero Linux con ntfs no se lleva demasiado bien... Hay cosillas por ahí un poco experimentales... y ante mi urgencia y no tener instalado linux en la maquina (probé con live-cd) me busqué alguna alternativa.

Al final mediante el comando subst y paciencia he podido borrar casi todo, pero me queda algo que no he sido capaz. Parece que hay algo corrupto (pero chkdsk no da errores)... A ver si le vuelvo a meter mano y acabo de una vez con el dichoso arbolito...

Unos links para acabar:

miércoles, junio 13, 2007

WinSysAdmineando

No se porque la gente dice que Windows es mas sencillo que Linux. Lo es hasta que no te salen quebraderos de cabeza. Claro si usas un XP Home Edition pues pocos problemas vas a tener...

Porque yo ya llevo unos cuantos con mi XP Profesional Edition. El último hoy, con la instalación de los drivers del Scanner Scanjet G3010 y el Photoshop.

Tras instalarlo en usuario Administrador iba sin problemas pero en usuario normales no funcionaba, ni el scanner ni el Photoshop. Vamos por partes...

Scanner
El software de HP, por lo que he podido leer por ahí es un poco gena en entorno multiusuario. Y el soporte por lo visto deja un poquito que desear... [pendiente meter un par de referencias]
La solución al final ha sido dar permisos a los usuarios normales a una determinada key del registro.

Photoshop
Tras solucionar lo del scaner todavía quedaba lo de photoshop. En un principio pensaba que el problema estaba relacionado, pero seguía sin funcionar...
La solución ha sido el meter a los usuario que lo usan como 'usuarios avanzados'. Ya se que no es muy solución muy profesional pero me ha funcionado y paso de perder mas tiempo con esto.... ;)

¿Que os parece? ¿Sencillo verdad? ¡Ja!
Relacionado hoy en meneame: Detecta todo lo que se inicia en tu windows.

martes, junio 12, 2007

A vueltas con cssutils

Tercer post en el que menciono cssutils. Los anteriores [1][2].
En este os puedo decir que lo estoy usando, y que la verdad funciona bien, aunque le he visto 2 peros:
  • Las estructuras de datos manejadas no son muy pythonianas
  • Es lento (muy). Por poner un ejemplo en procesar los css's de elpais.com tarda mas de 10 segundos (en una maquina Linux potente potente).
Echando un vistazo rápido al código, no he visto nada raro que salte a la vista. He mirado a ver si había alguna construcción que pudiese ser costosa, pero no. El código está pero que muy bien.
El problema debe ser, que según está hecho es simplemente ineficiente. O que el hacer un parser en python, es simplemente ineficiente. No lo se....
Quizás con menos comprobaciones....

He vuelto a mirar en python-es y en google groups, y no he encontrado nada de nada. Me da que voy a tener que implementarmelo... o hacer unos bindings a alguno de C.
Un par de referencias de cara a una posible implementación [vía]:

viernes, junio 01, 2007

Norton Ghost

Tras tener un sistema básico montado, lo suyo es tener una copia de respaldo para poderlo restaurar.
Tras investigar que hay por ahí (lo justo), he probado Norton Ghost ya que parace que es la mejor herramienta pra hacer imagenes del HD. Pues bien, no me ha servido. Porque lo que yo quiero es algo que me vuelva a restaurar el sistem desde CD y que el propio CD sea arrancable.

Se me ocurre hacerlo con linux a través del comando dd, pero como que es muy básico.

Seguiremos investigando.... y probando.
Una referencia: Disk cloning.

Nuevo ordenata

Que mala racha...
Pues no va y me peta el Desktop de casa (creo que la placa). Y unos dias despues el monitor...
Total que me he pillado otro ordenata. Tocaba actualizarse. Esta vez me he lanzado a un procesador AMD económico, 2 GB de memoria, disco duro de 250 GB, placa con soporte a firewire, una fuente sileciosa, una tarjeta de video ATI... Vamos en torno a 500 leuros.
Como monitor un LG de 17'' que no llegó a los 180 leuros.

Tras ello, la rutina de turno, instalar los OS. Ya me he actualizado a XP Pro, y le he metido un ubuntu 7.04.

Tras tener el ubuntu (que usa gnome) me comenta el Hectorín que le gusta mas kubuntu. Y he aqui mi duda.... ¿Cual es mejor kde o gnome?
Resumiendo por lo que he leido...: a gusto del consumidor. Lo que si parece es que gnome es mas ligerito.
A mi personalmente me gusta. Lo veo simple e intuitivo. Y como las aplicaciones que mas voy a usar no van a ser las que vengan con ambos desktops... Pues como que me vale ubuntu.
Pero tengo ganas de probar el kde. A ver si me bajo un live cd (si es que lo tienen).

Bueno paso unos links sobre el tema:
Me decanté por ubuntu, porque parece que es la distribución de moda. La alternativa podría haber sido fedora.
Y lo que he visto es que gentoo sigue teniendo su nicho. Por lo que he leido tienen una wiki muy completa, que sirve para el resto de distribuciones también. Pero vamos el instalar gentoo es para freakis y no lo haría nunca para un desktop. Podría ser interesante para un servidor en el que sólo quieres meter lo justo y necesario.

jueves, mayo 24, 2007

Ummmm, Javier Casares ha publicado una Guía SEO. Puede ser una compra interesante. O un buen regalito.

jueves, mayo 17, 2007

Evitar que google fagocite un proyecto [vía dirson].

Cuanta razón hay en ese post. Todos los grandes proyectos se han hecho por pocas personas.

martes, mayo 08, 2007

Teclado

¡Estoy realmente sorprendido! He estado mirando para cambiar el teclado de mi ordenador de sobremesa de casa y no he encontrado por ningún lado teclados que seán bajitos que no sean wireless o que tengan la típica forma ergonómica. ¿Que pasa, se ha demostrado que no es eficaz?
No lo entiendo... paso del wireless. Para un teclado es innecesario. Paso de gastar pilas y de meter mas ondas....

De lo visto (incluyendo los wireless) el que mas me ha gustado es el Logitech S510. Impresionante! Super plano y con apoyamanos.

jueves, mayo 03, 2007

REST

Representational State Transfer (REST), es un estilo de arquitectura software que la introduce su autor () en una disertación sobre diferentes estilos de arquitectura software. El título de la disertación es "Architectural Styles and the Design of Network-based Software Architectures". A ver si le hecho un vistazo...

viernes, abril 20, 2007

CAPTCHA

Siempre que hablo con JJ de cosas técnicas, me sorprende y aprendo algo nuevo.
Lo de hoy, CAPTCHA. No sabía que estos sistemas que determinan si el que está haciendo la petición es humano o no se llamaban así.

jueves, abril 19, 2007

Python Threads

De momento no me he visto en la necesidad de utilizar los threads de python, pero les he estado echando un vistazo.
Norman Natloff tiene unos tutoriales guapos y unos de ellos va sobre los threads: Tutorial on Threads Programming with Python.

Unos apuntes breves:
  • Hay 2 modulos, thread y threading; siendo el segundo de mas alto nivel.
  • No me mirado los modulos en detalle, pero el módulo threading se ve bastante completito: tiene locks, rlocks, semáforos, variables de condición, un recubrimiento sobre las variables de condición (Event) y timers. Pero sobre todo una clase para mi muy interesante Queue.
  • No se puede hacer multiproceso real con python, es decir sólo estará un thread ejecutandose y los threads son 'not pre-empted'. Es el interprete a través de un componente llamado GIL el que determina la planificación (bien porque un thread ha estado corriendo durante un determinado tiempo o bien por una operación E/S). Hay criticas al GIL... quizas en un futuro desaparezca.
  • Para depurar se puede usar PDB pero con unas limitaciones (también existe RPDB (bueno ya obsoleto... la evolución es winpdb))
Finalmente comentar que gracias a este tutorial he conocido la existencia de dis, el 'disassember' de python. Y un link sobre herramientas de depuración para python.

miércoles, abril 18, 2007

Backups de USB Flash Drive

De un tiempo a esta parte uso poco el HD del ordenata para mis documentos. El motivo es que uso un USB Flash Drive.
Tiene como ventaja el que tienes tus datos allí donde fueres. Como desventaja que es mas facil de perder...
De vez en cuando hacía backups; muy de vez en cuando. Pero tras el despiste de dejarmelo ayer en la ofi, me he dicho a mi mismo que esto no puede seguir así...

La solución: instalarte un programa de backups en tus ordenatas habituales y hacer periódicamente un backup. Que menos que semanal...

Para esto por supuesto que no necesitas el cojoprograma, sino una cosa sencillita. En genbeta he visto que tenían un par de utilidades y ya he probado una de ellas, Cobian Backup. Me ha gustado, supersencilla.
La otra es Comodo Backup.

Ambas son de gratis.

Hub vs Switch

Como se olvidan las cosas...
Leo ayer: "Un switch realiza la misma función que un hub dentro del diseño de una red, pero al contrario que un hub, un switch proporciona la máxima velocidad de red a cada puerto."

Ok, te quedas con la copla de que el switch es mas rapido, ¿pero porque? La respuesta aquí. Basicamente el porque es que el Hub es un dispositivo muy tonto, y el switch es mas listo. El Hub envia los paquetes a todos sus puertos.

Y ya puesto vamos a ver la diferencia con un router. El router se usa básicamente para unir redes.
Trabajan con la capa 3; o lo que es lo mismo, la de red.

martes, abril 10, 2007

HotLinking

No conocía el termino hotlinking [genbeta]. En el anterior enlace lo explican, indicandote como evitarlo mediante imgred.

martes, abril 03, 2007

Unas respuestas interesantes a una noticia de barrapunto: ¿Basta el software abierto para ser libre?. Explican muy bien la ventata de GPL sobre la licencia de BSD.

libxml2 XmlTextReader

Acabo de ver que libxml2, aparte de los APIs SAX y DOM tiene un tercero, XmlTextReader.
Parece que está a caballo entre los dos anteriores, por lo que puede ser un muy buen candidato a tener en cuenta. Lo recomiendan usar en lugar de SAX. SAX tieen los siguientes problemas:
  • Modelo de programación mas complejo
  • No estandar
  • No proporciona validación directa
  • El procesamiento de entidades, namespaces y 'procesamiento base' (no se que quiere decir esto exactamente) es mas dificil.

viernes, marzo 30, 2007

Creación implicita de atributos

Al modificar un fichero de un compi de curro, me llamó la atención que él creaba las variables de instancia como si fueran de clase. Y le funcionaba, cosa que me estrañó mucho.

Indagando un poco al respecto ya se porqué. Antes de nada un ejemplo:


class B:
b = "B"

class C(B):
def __init__(self,v):
self.b = v


b1 = B()
b2 = B()
c = C("c")

#--- Valores originales
print b1.b,b2.b,c.b

#--- Cambiamos la variable de clase
B.b = "BB"
print b1.b,b2.b,c.b

#---- Cambiamos variable de instancia de objeto de tipo B
b1.b = "B"
print b1.b,b2.b,c.b



Que nos proporciona la salida:

B B c
BB BB c
B BB c


El ejemplo anteiror nos muestra que cuando referenciamos una variable de instancia que no existe, pero si como clase, automáticamente se crea una variable de instancia con el valor de la variable de clase.

jueves, marzo 29, 2007

Identificadores únicos

¿Que opciones tenemos disponibles para asignar un identificador único a un buffer de datos?
En un principio estaba pensando algo como el comando sum de unix.

Pero al no encontarlo en el api de python, he mirado alternativas, y una opción que tenemos es usar alguno de los módulos criptográficos disponibles.
En python 2.4 estan md5, hmac y sha en 2.5 veo que ademas está hashlib.

Modulos relacionados

Si lo que queremos es generar un identificador único podemos usar uuid.
Hay un modulo con diferentes funciones para codificar strings: binascii.

lunes, marzo 19, 2007

¡¡¡¡Que bien!!!! Estoy dando palmas con las orejas.
Solo por esto ya merece mi contribución a AI2. Ya solo queda esperar que estos 'deseos' fructufiquen en realidades.

lunes, marzo 05, 2007

11870

Hoy me han pasado esta url, 11870. La idea es muy buena, una web 2.0 de clasificados.
Un nuevo 'enemigo' para quien trabajo, TPI.

La verdad... el tema de los clasificados está movidito. Una cosa nueva de QDQ.

sábado, marzo 03, 2007

Fractales en python

En Febrero empezó un thread muy interesante sobre fractales en python.
En Marzo hay mas posts, como muestra un botón.

jueves, marzo 01, 2007

Crear un fichero temporal en python

Con el módulo os, se puede hacer, pero la mejor manera es usando el módulo tempfile. Normalmente lo haremos mediante el uso de mkstemp.

martes, febrero 20, 2007

Test chi-cuadrado

O chi-square test.
Si por lo que sea necesitamos calcularlo en python, con el módulo stats.py podeis.
Y un poco de teoría aquí.

Alguna mas cosilla de mismo autor aquí.
Nota: stats.py depende de pstat.py.

Como casi siempre en la wikipedia hay info:

Ejemplo de uso.
Una explicación de un compi de curro (estadístico él) de como aplicarlo a una porción de texto (resultado de secuenciar un hmtl).

1.- Divide el churro en k partes (cuanto más mejor, pero que sea significativo el número de etiquetas que caen dentro de cada parte). Para el ejemplo que me has dado (60 etiquetas dentro del body) lo dividimos en 9:
parte1: (etiqueta 1) <= x < (etiqueta (60/9)*1) --> 1.00 <= x <> 6.66 <= x <> 13.33 <= x <> 20.00 <= x <> 26.66 <= x <> 33.33 <= x <> 40.00 <= x <> 46.66 <= x <> 53.33 <= x <> 1/9 = 0.11
Número de casos esperados en cada intervalo: N/k --> 13/9 = 1.44

4.- Con todos estos datos podemos generar una tabla como la que sigue:
Intervalo 1 2 3 4 5 6 7 8 9
Límite inferior 1 6.67 13.33 20.00 26.67 33.33 40.00 46.67 53.33
Límite superior 6.67 13.33 20.00 26.67 33.33 40.00 46.67 53.33 60.00
Casos observados (Oi) 2 2 0 0 0 2 4 2 1
Probabilidad esperada 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11
Casos esperados (Ei) 1.44 1.44 1.44 1.44 1.44 1.44 1.44 1.44 1.44

Variabilidad 0.22 0.22 1.44 1.44 1.44 0.22 4.55 0.22 0.13
Vi=((Oi-Ei)^2)/Ei

Variabilidad acumulada 0.22 0.44 1.88 3.32 4.76 4.97 9.52 9.74 9.88
SUM(Vi)

El número que nos interesa es el último de todos: 9.88
Este se compara con el valor de la chi cuadrado para k-1 grados de libertad y alfa (nivel de significación). Vamos a elegir un alfa de 5% que es suficientemente significativo, el resultado es 15.51 (Excel: CHIINV(0,05;8))
Como 9.88 es menor que 15.51 entonces se acepta la hipótesis nula: la etiqueta se distribuye uniformemente por el churro.


Resumiendo...
Si haces los cálculos para cada etiqueta, aquella que menor variabilidad acumulada tenga será la más uniforme y por consiguiente la que te interesa... para lo que tu quieres solo te interesa ese calculo, aunque no está de más comprobar que se distribuye uniformemente comparando el elegido con el valor de la chi-cuadrado.


Para acabar comentar unas notas finales:
  • Chi-cuadrado se usa contra el spam.
  • Código para la chi-inversa. Aunque la he probado y no me da lo mismo que la CHIINV del excel.
  • En scipy está implementada, en el módulo stats.

miércoles, febrero 14, 2007

Interesante lectura: La increíble hisotoria de FAST [vía]
El futuro del XML en el 2007: Todavía no he leido el artículo pero tiene pinta de merecer la pena.
Con respecto a lo que dicen en barrapunto sobre los Web Services, de que han fracasado antes de despegar. Pues no lo se, ya que sólo lo he tocado de refilón. Pero si me parece la arquitectura un poco complicada.

martes, febrero 13, 2007

En una noticia de barrapunto, hay unos comentarios muy interesantes sobre virus y malware.
Como muestra éste. Ah! los comentarios son de runlevel0 (1932).

sábado, febrero 10, 2007

Navegando por ahí he llegado la web de Jorge Villanova, que fijate tu curra en TPI, en Noxtrum.
No he tenido de leer los posts, pero parece que tiene alguna entrada interesante:
  • En este habla sobre 'The Long Tail'
  • Y en este sobre 'The Search'
Un artículo muy bueno: Why Writing Your Own Search Engine is Hard [vía ojobuscador].

miércoles, febrero 07, 2007

Web 2.0

Un video muy bueno que explica que es la web 2.0.

domingo, febrero 04, 2007

Hacer software es dificil

Veo en barrapunto una noticia que me interesa: El software es dificil.
Por supuesto que lo es. Creo que el siguiente post de slasdot lo resume muy bien (la noticia en slasdot está enlazada desde barrapunto:


"Why doesn't anyone complain about how hard brain surgery is? Why doesn't anyone complain about how hard building space exploration vehicles is? Why doesn't anyone complain about how hard creating a successful marketing campaign is? Software engineering is difficult because it's a complex subject that takes a combination of intelligent people and training to produce good results. Just because businesses are too stupid to realize this doesn't make the problem go away. You can't throw complex projects at untrained, stupid, incompetent people and expect them to produce quality software. You can't just invent some magic formula for software development that will work 100% of the time to maximize efficiency. Software engineering is NOT manufacturing. Accept it and move on for fuck's sake. "

Recuerdo los tiempos de la facultad, cuando te hablaban de las herramientas de cuarta generación. Si hay algo que tengo cada vez mas claro es que jamás se podrá sustituir la labor humana en la producción de software. Es utópico.
En un curro como el mio actual, donde continuamente tienes que estar 'inventandote' algoritmos... dime tu como vas a sustituir esa labor humana. Y buscando soluciones... Y descubriendo y evaluando productos o librerias.... ¿Lo puede hacer cualquiera? Desde luego que no. A ver si algúndía se dan cuenta los que mueven el cotarro que hay que dar una vuelta de tuerca al mercado del desarrollo del software. Se den cuenta de que no somos monos que pulsamos teclas.

miércoles, enero 31, 2007

martes, enero 30, 2007

Tipos set y Set

Me acabo de dar cuenta de que a partir de la versión 2.4 de python existe como 'built-in type' el tipo set.
En versiones anteriores había que usar el tipo Set del modulo sets.
Por lo que he podido leer es mas mejor ahora usar set.
Un post interesante de OjoBuscador de José R. Pérez Agüera: Todo el mundo tiene un buscador, pero ¿realmente lo tienen? Interesante echarle un ojo a los comentarios.
¡chapó!: Reglas estúpidas [kirai.net].

lunes, enero 29, 2007

Ejecutar comandos del sistema

Conocía os.system, pero hoy en la python-es han comentado un par de opciones mas; popen:

import os
data=os.popen('ls').read()
file=open('fichero.txt','w')
file.write(data)
file.close()

Y con commands:

import commands
out = commands.getoutput('ls')

f = file('lsout.txt', 'w')
f.write(out)
f.close()

SSH Tuneling

ssh -l username -g -L localport:remotehost:remoteport remotegateway
Sobre Google Bombing y Don´t be evil [Ismael El-Qudsi].

viernes, enero 26, 2007

Mas sobre cssutils

Antes de nada indicar que estoy usando la distribución 0.9.1b3 de cssutils.

Tests
En teoria los test podriamos ejecutarlos tras hacer una build del paquete, o incluso tras descomprimirlo. Mediante:

python setup.py test

Pero por lo que sea no me ha funcinado. Bueno no pasa nada... podemos lanzar los test desde el directorio de tests (../src/cssutils/tests) de la siguiente manera (en 'kk' tendremos la salida):

for i in test_*.py; do echo $i >> kk; python $i >> kk 2>&1; done

Veremos que aparecen trazas de error. No pasa nada. Lo importante es que el test nos devuelva OK.

encutils

cssutils tiene un paquete, encutils, a tener en cuenta.
La funcion principal es getEncodingInfo que devuelve informacion sobre le encoding. Esta informacion se extrae del elemento pasado: headers de HTTPResponse, XML declaration y lementos meta X/HTML.
Resumiendo podemos pasar un HTTPResponse o un texto como argumento.
Aunque no la he probado, parece currada.

csscapture
Permite extraer todos las hojas de estilo de una url determinada (incluyendo las que estan embebidas en la propia página html).
Usa HTMLParser.

El parseo (interioridades)
El parser desencadena el parseo al asignar el texto del css al objeto CSSStylesheet.
Para realizar el parseo se usa tokenizer.CSSTokenizer.
El único pero que veo a cssutils es que es un poco lento con el parseo. Necesitamos mas velocidad. No se si se podrá obtimizar algo... He estado echando un vistazo rápido pero el codigo no es sencillo.
Habrá que meteler el profiler, a ver si hay algo que canta.

martes, enero 23, 2007

Python bindings

Un par de productos para crear bindings entre python y otros lenguajes:

lunes, enero 22, 2007

Parsers de CSS

He tenido que mirar que hay por ahí, para parsear CSS's en python. Lo primero que tengo que decir es que estoy realmente sorprendido. No he encontrado ningún producto maduro, y ni siquiera unos bindings en python.

Los dos parsers que he encontrado en python usan además DOM, por lo que no hay nada SAX (o en gerga CSS SAC).
Esto significa que alguien con interés, ganas y tiempo puede hacer algo útil para la comunidad del software libre...

Pero lo que mas me sorprende es no haber encontrado nada ni en python-es, ni en comp.lang.python.

Antes de entrar a comentar los parsers, comentar que CSS tiene tres versiones, CSS1, CSS2 y CSS3 (en desarrollo).
Todos los parsers implementan CSS1 y por lo que he podido ver CSS2 parcialmente.

Bueno al lio... los parsers de python encontrados son:
de los dos parece más maduro cssutils, pero todavía no los he probado.

Si no nos convencen ninguno de los dos, no nos va a quedar mas remedio que implementar unos bindings a alguno existente en C (vamos lo normal en python... no lo vamos a hacer de uno implementado en Java; ummm, aunque no he dicho un disparate... siempre se puede usar jython ;)). En C he encontrado:


Finalmente se puede intentar usar el parser que use algún browser (implementando el binding correspondiente, claro). Entre los disponibles parece que el candidato más lógico sería usar del del firefox, Gecko.
Mas info sobre el parser de CSS de Gecko aquí.

jueves, enero 11, 2007

Validad un DTD

Si queremos validar un DTD lo que podemos hacer es usar un validador de xml que use dicho DTD.
Al cargarlo detectará posibles errores.
Por ejemplo podemo susar xmllint:

xmllint --valid

miércoles, enero 10, 2007

RSS Readers

Ya he comentado anteriormente sobre agregadores de feeds: [1],[2] y [3].
Me vuelve a surgir el tema porque tengo que obtener feeds de una intranet, por lo que los lectores web no me sirven. Voy a tener que usar el firefox o bien una aplicación local.
Para windows me recomiendan Omea Reader (Net 2.0) y para linux liferea (gnome) o kagregator. (kde)
Con el firefox voy a echarle un vistazo a sage y ver como funcionan los live bookmarks.
La tecnología de clustering de google.
¿Devaluacion de la informatica también en la ESO?
Aunque es un poco bobá lo que dicen.

martes, enero 09, 2007

¿libxml2 leak in python (html sax-parsing)?

Me siento un poco fustrado con el parser de html de libxml2. Se nos va memoria a saco y no tengo ni idea de como evitarlo.
He preguntado a la lista, pero no ha servido de mucho. A ver si me aclaran algo mas... Actualizaré el post cuando sepa algo.

Tras detectar que en nuestro codigo el mayor problema con la memoria lo teníamos con el parser sax de html de libxml2, modifiqué el test que acompaña a la distribución (pushSAXhtml.py)para que en lugar de procesar 1 fichero, procese N, siendo N un número suficientemente grande para ver las perdidas de memoria...

Pues bien, en algo mas de 10 minutos procesando el proceso se cae por un segmentation fault.
El específico en el bucle para procesar el fichero por el parser es:

ctxt = libxml2.htmlCreatePushParser(handler, initdata, 0, inputFilePath)
ctxt.htmlParseChunk(data, len(data), 1)
ctxt = None

En el callback no hacemos nada:

class callback:
def startDocument(self):
print "."

def endDocument(self):
pass

def startElement(self, tag, attrs):
pass

def endElement(self, tag):
pass

def characters(self, data):
pass

def warning(self, msg):
pass

def error(self, msg):
pass

def fatalError(self, msg):
pass


¡Ojo! la fuga de memoria la vemos a nivel del sistema operativo (con top o mirando en /proc (por ejemplo con mem-monitor)), ya que las rutinas específicas de libxml2 nos indican que todo está OK.
En fin... que con este problema no podemos llevar nuestro codigo a producción. O solucionamos esto o tenemos que mirar otro parser (posible candidato beautifulsoup); cosa que no me gustaría.

Otra cosa que me ha frustado mucho es no encontrar nada en la web. ¿Es que nadie por ahí esta parseando html con libxml2 usando SAX? No me lo puedo creer...

Ah! un detalle que se me olvidada. En el código asignamos None al contexto. Es correcto. Eso provoca la invocación a xmlFreeParserCtxt(que es lo mismo que htmlFreeParserCtxt: esta llama a la anterior). Con lo cual no tenemos que liberar nada mas, ya que el documento no lo usamos. De hecho si intentamos obtener el documento los bindings de python nos devolverán una excepción.

Para terminar de cerrar el tema y asegurame de que no hay nada raro en mi entorno he hecho el ejemplo equivalente en C, y ha funcionado sin problemas. Ahí va el codigo:




/* libxml2 C HTML Parser Example
* gcc -I -L -lxml2
*/

#include
#include
#include
#include
#include
#include

#define BUFFER_SIZE 100000
#define NUM_ITERS 10000
#define FILE_PATH ""

/*****************************************************************************/

/*
* Foo context structure
*/
typedef struct
{
int foo;
} Context;

/*
* libxml start element callback function
*/
void startElement(void *voidContext,
const xmlChar *name,
const xmlChar **attributes)
{
return;
}


/*
* libxml end element callback function
*/
void endElement(void *voidContext,
const xmlChar *name)
{
return;
}



/*
* Text handling helper function
*/
void handleCharacters(Context *context,
const xmlChar *chars,
int length)
{
return;
}



/*
* libxml PCDATA callback function
*/

void characters(void *voidContext,
const xmlChar *chars,
int length)
{
return;
}



/*
* libxml CDATA callback function
*/

void cdata(void *voidContext,
const xmlChar *chars,
int length)
{
return;
}




htmlSAXHandler saxHandler =
{
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
startElement,
endElement,
NULL,
characters,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
cdata,
NULL
};


/*****************************************************************************/

char buffer[BUFFER_SIZE];

int main(void)
{
htmlParserCtxtPtr ctxt;
Context context;
char *filepath=FILE_PATH;
FILE *f = NULL;
long fileLen = 0;
long retRead = 0;
int i=0;


/*---- Reading the data */
/*
struct stat myStat;
stat(filepath,&myStat);
if (myStat.st_size >= BUFFER_SIZE)
{
print("El fichero no cabe en el buffer\n");
return 1;
}
*/

f = fopen(filepath, "r");

if ( f == NULL ) /* Could not open file */
{
printf("Error opening %s: %s (%u)\n", filepath, strerror(errno), errno);
return 1;
}

fseek(f, 0L, SEEK_END); /* Position to end of file */
fileLen = ftell(f); /* Get file length */
rewind(f); /* Back to start of file */

if (fileLen >= BUFFER_SIZE)
{
printf("El fichero no cabe en el buffer: %d\n",fileLen);
return 1;
}


retRead = fread(buffer,fileLen,1,f);
if (retRead != 1)
{
printf("Error haciendo el read");
return 1;
}
fclose(f);

/*---- We parser the file */
for(i=0;i < NUM_ITERS; ++i)
{
ctxt = htmlCreatePushParserCtxt(&saxHandler, &context, "", 0, "",
XML_CHAR_ENCODING_NONE);
htmlParseChunk(ctxt, buffer, fileLen, 0);
htmlParseChunk(ctxt, "", 0, 1);
htmlFreeParserCtxt(ctxt);
printf(".\n");
}


return 0;
}




Para hacerlo operativo modificar las constantes BUFFER_SIZE, NUM_ITERS, FILE_PATH, al gusto del consumidor.

miércoles, enero 03, 2007

Uso de etiquetas en blogger

Hace poco he migrado todos mis blogs a la nueva versión de blogger. Mi mayor interés para ello era el poder etiquetar los posts.

Pero una vez hecho, la template usada se mantenía (no se mostraban las labels). Tras estar indagando un poco he visto que es necesario actualizar la template, pudiendo modificar el diseño a golpe de ratón, cosa que antes no se podía. Es una gran mejora.
¡¡¡Ojo!!! Si en la template anterior habeis hecho modificaciones a mano se perderán, si no las meteis en la nueva template antes de guardarla.

Ya con respecto a las etiquetas indicar un par de cosas:
  • se muestran como una lista, bien ordenada alfabéticamente o por frecuencia
  • se pueden hacer feeds por las etiquetas; mas información aquí.
Si en lugar de querer una lista queremos cosillas mas chulas como por ejemplo una nube, pues en la web podeis encontrar info al respecto, como por ejemplo: Code for Beta Blogger Label Cloud.

Y ya para acabar indicar que si estamos en blogger, cuando estamos visualizando nuestro blog, nos permite editar los elementos compositivos de la template (por ejemplo añadir un enlace a la lista de enlaces).

Resumiendo: ha mejorado mucho blogger con esta nueva versión.

martes, enero 02, 2007

sábado, diciembre 30, 2006

Los lemas de Google

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

domingo, diciembre 17, 2006

jueves, diciembre 14, 2006

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

miércoles, diciembre 06, 2006

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

martes, noviembre 21, 2006

Portatil ligero



Para mi, actualmente hay 3 nichos en el mercado de los portatiles:
  • el de los ligeros
  • el de los polivalentes
  • el de los multimedia
El de los multimedia está orientado a sustituir un ordenador de sobremesa.
El de los polivalentes será el típico, vamos... un portatil normalito, con pantalla de 14''-15''.
El de los ligeros, será el de los portatiles que no sobrepasen los 2,5 kilos.

Dentro de los ligeros, estarían los superligeros, cuyo peso no sobrepasaría los 2 kilogramos.

Yo andaba con ganas de comprarme un portatil ligero, ya que para la casa, donde este un sobremesa... Además me gusta tener un ordenador de respaldo...
Pero ya que era realmente un capricho, me he ido a los superligeros. No quiero que el peso sea una excusa para cargar con él. Vamos que lo puedas meter en cualquier lado...

Mi compra ha sido un Sony VAIO SVG SZ2M/B. Dentro de los SZ, el único motivo para irme a por ese modelo ha sido por el precio. Pero ahora mismo, supongo que por la llegada de los procesadores core 2 duo, estan bajando de precio (ver).

Si no nos importa cargar con un poco mas de peso, pues podríamos considerar el dell latitude 620.

Y dentro del margén de los 2,5 kilos, en cuanto a diseño lo tengo claro: me quedo con el Apple MacBook.

sábado, noviembre 04, 2006

Si como yo dispones del Router Xavi 7768r Wireless (uno de los que ponía telefonica), en el link anterior tendrás toda la información que necesites para configurarlo.

jueves, noviembre 02, 2006

En vista de que voy a tener un portatil nuevecito y me viene con el Home Edition, he curioseado en la red: Windows XP Home Edition vs. Professional Edition: What's the difference?

martes, octubre 31, 2006

RSS Readers


En primer lugar si quereis saber de que va el RSS, ahí va un link.
Ya hace tiempo que existen los RSS Readers, pero la verdad.... Había pasado mucho de su uso.... Hasta hace poco que empecé a usar el de Yahoo. Y la verdad... Te facilita el consultar esos blogs que son tus habituales...
Hoy he empezado a probar otro, alesti, y la verdad... Estoy encantado! Os recomiendo el uso de un RSS Reader sin dudarlo.

Realmente hay una gran cantidad de ellos para escoger, como podeis ver en los siguientes links: [1], [2] y [3]. O buscando info en google.

Si ya usais google, quizás os pueda interesar el uso de Google Reader.

Bueno hasta ahora estoy hablando de productos que estan en la web, pero no tiene porque ser así, pueden ser aplicaciones que tengais intaladas en vuestra máquina, o incluso en vuestro navegados, como la extension Sage de Firefox (y no es el único).

Volviendo a alesti, surgió como rival a bloglines.
Y ya para acabar este por mencionar un par de ellos mas que he oido mentar:
Lo que si que es fundamental, es que puedan exportar e importar las subscripciones, para de esta manera poder migrar de uno a otro.







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

martes, octubre 17, 2006

No he tenido tiempo de echar un vistazo a estos links en profundidad, pero parecen muy interesantes. Van sobre Amara:


Aparte de lo técnico, interesante ver que Uche Ogbuji tiene una pagina web.

Volviendo a Amara... por lo visto se basa en 4Suite, ofreciendo la funcionalidad de 4Suite de una manera mas 'pitoniana'.

lunes, octubre 16, 2006

miércoles, octubre 11, 2006

Log4J


Si tienes que usar una librería de logs en Java, la mejor cadidata posiblemente sea Log4J.
Entre la documentación disponible, es de mirar:
Con estos dos ya tienes para tirar... El segundo tiene un fichero log4j.properties básico.

sábado, octubre 07, 2006

DOM Inspector


Al instalar Firefox , si personalizamos la instalación, podemos indicarle que se instalen las herramientas para desarrolladores. Entre ellas está el DOM Inspector, la cual es superutil (por ejemplo para hackear formularios con campos ocultos: vaya mala practica de programación...).

viernes, octubre 06, 2006

El siguiente enlace ya lo había enlazado previamente: Python Memory Management. Merece la pena que lo vuelva a enlazar, ya que es un artículo muy interesante sobre como gestiona python la memoria.
Una cosa muy interesante que dice es que en Python 2.5 la gestión de la memoria se ha cambiado, aunque no se indica en las 'what´s new' que he mirado.
Una par de links mas para acabar:
Mas info sobre la incorporación de la nueva gestión a python 2.5 aquí.

jueves, octubre 05, 2006

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

miércoles, octubre 04, 2006

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

viernes, septiembre 22, 2006

Un par de empresas que tienen herramientas lingüísticas:

martes, septiembre 12, 2006

Parece que yahoo empieza a ponerse las pilas con su mail [vía ojobuscador].

miércoles, agosto 30, 2006

Para el indexador de un buscador se puede usar xapian.
No lo he leido pero parece interesante: Selección de ads basada en contenido para weblogs

martes, agosto 29, 2006

Logging en un Web Service


Me veo en la tesitura de generar unos logs para un web servide (Java). Las opciones que tenemos disponibles:
Por lo que me ha recomendado JJ y lo que leo [1] y [2] (por ejemplo), me decanto por Log4j.

martes, agosto 15, 2006

Blogger por fin se decide a meter nuevas 'features'. Como indican todavía esta en beta.
Menos mal que espabilan porque wordpress estaba ganando adeptos.
Veo que en ojobuscador también lo comentan.

jueves, agosto 10, 2006

Veo a través de OjoBuscador, que en Yahoo tienen un Python Developer Center.

viernes, julio 28, 2006

Carnarvon: herramienta de arqueología de software [barrapunto.com]. Podría ser interesante echarle un vistazo.

jueves, julio 27, 2006

Internete es realmente sorprendente...
Hoy mirando el Ciberpais, leo un artículo sobre Chema Alonso; como hay un link a su blog, le hecho un vistazo y en el aparece el nombre de Sergio Montoro. ¿Mande?
Una sinopsis se activa e intuyo que puede ser el mismo Sergio Montoro con el que coincidí en Meta4. El tio era bueno... normal que siga en la brecha: es editor de la pastilla roja, creador de software libre y tiene su propia empresa. Bueno acabo con unos links:

martes, julio 25, 2006

Un artículo sobre clasificación de imagenes en la web según su role: Image Classification for Mobile Web Browsing por Takuya Maekawa, Takahiro Hara y Shojiro Nishio
Ummm, puede ser interesante echarle una probazón a Flock:

"Flock es un navegador de OSD basado en Mozilla, que lo existiende para agregar una serie de herramientas útiles al usuario:
  • Un cliente para la gestión de galerías de fotos online
  • Un cliente para el envío de post en bloggers de varios tipos (incluyendo Drupal)
  • Un agregador de noticias online
.../..."
¿"sudo" para Windows? [barrapunto]

lunes, julio 24, 2006

Me comentan de un reader de RSS que está muy bien: Alesti.

lunes, julio 03, 2006

GStreamer es una libería que se puede usar para implementar pipelines de procesamiento, teniendo bindings para varios lenguajes, entre ellos python.
Esta implementando en C, y se está usando bastante para hacer aplicaciones 'media player'.
Lo que si que es interesante es este extracto de su FAQ:
"The GObject object system provided by GLib implements objects in C, in a portable, powerful way. This library provides for introspection and runtime dynamic typing. It is a full OO system, but without the syntactic sugar. If you want sugar, take a look at GOB."

miércoles, junio 28, 2006

Un paper donde se indica como montar un server que use WSDL con ZSI.

martes, junio 27, 2006

Drools ahora tiene blog.

viernes, junio 23, 2006

Un articulo interesante del director de Google en el ciberpaís: Zeitgeist (El espíritu actual).

jueves, junio 22, 2006

libxml2 y xpath


Estoy probando a usar el DOM que implemente libxml2, y la verdad.... es un poco jaleoso... Habrá que probar a usar XPath.

Aquí un ejemplo de como facilita las cosas.
Y un thread interesante...
Otro ejemplo de uso y un ultimo link.

Las funciones que implementa el binding de python que estoy usando son:

xpathCastNodeToNumber
xpathCastNodeToString

xpathCmpNodes

xpathEval

xpathEval2

xpathNewContext

xpathNewNodeSet

xpathNewValueTree

xpathNextAncestor

xpathNextAncestorOrSelf

xpathNextAttribute

xpathNextChild

xpathNextDescendant

xpathNextDescendantOrSelf

xpathNextFollowing

xpathNextFollowingSibling

xpathNextNamespace

xpathNextParent

xpathNextPreceding

xpathNextPrecedingSibling

xpathNextSelf

xpathOrderDocElems


miércoles, junio 21, 2006

OWL y ontologías

Como ando metido en un fregado para generar reglas para drools a partir de OWL, me toca mirar un poquillo sobre ontologías [en inglés]
Como lenguajes para ontologías tenemos OWL [en inglés] en sus tres versiones Lite, DL y Full y RDF [en inglés].

Una ontología es un modelo de datos para representar los objetos de un dominio y sus relaciones con el objetivo de realizar de manera que se pueda hacer un procesamiento sobre dicha información. Es una forma de representación del conocimiento.

Pero por otro lado están las Taxonomías. Aquí se puede ver la diferene en ontología, taxonomía y otras estructuras de represantación del conocimiento. Y otra página muy interesante describiendo lo que es una ontología. Más paginas sobre las diferencias entre taxonomía, ontología y otras formas de representación: [1] [2] (el 1, muy interesante).

Las ontologías se usan en la Web Semantica, campo muy puntero actualmente en cuanto a investigación, y tendrán mucha importancia para el despegue de los 'Web Services'. Este paper habla sobre ello.

Y ya paa profundizar sobre los lenguajes, podemos empezar por aquí para RDF y por aquí para el OWL.

lunes, junio 19, 2006

Una noticia interesante de barrapunto, sobre los precios de algunas consultoras por dia.
Hay unos comentarios interesantes. De los cuales me quedo con estos párrafos:

"sobre lo de montar una empresa en españa, enterate de como va la cosa... enterate de las leyes y las "facilidades" que te dan...

y entonces lo comparas con otros paises... qieres una perla? en españa montar una sociedad limitada te cuesta, ente papeleos y demas, unos 1500? para empezar, mas un deposito de 3010?, el administrador de la empresa se tiene que dar de alta como autonomo y pagar seguridad social (320? al mes como minimo, y eso aunque estes trabajando para otra empresa y pagando SS a traves de ella), para cerrarla, otros 1500?...

para montar una empresa en EEUU solo necesitas una direccion de correos

en irlanda, donde vivo ahora, montar una empresa te cuesta 40? en papeleos (20? si lo haces a traves de internet) y hasta que no ganas determinada cantidad de dinero no pagas impuestos, y entonces, solo pagas el 5% (comparado con el 33% en españa)"

Es lamentable.

viernes, junio 09, 2006

AI2 extrena blog.

jueves, junio 08, 2006

Unas notas sobre la instalación de pyXML 0.8.4


pyXML incluye :
  • xmlproc: a validating XML parser.
  • Expat: a fast non-validating parser.
  • sgmlop: a C helper module that can speed-up xmllib.py and sgmllib.py by a factor of 5.
  • PySAX: SAX 1 and SAX2 libraries with drivers for most of the parsers.
  • 4DOM: A fully compliant DOM Level 2 implementation
  • javadom: An adapter from Java DOM implementations to the standard Python DOM binding.
  • pulldom: a DOM implementation that supports lazy instantiation of nodes.
  • marshal: a module with several options for serializing Python objects to XML, including WDDX and XML-RPC.
Y aunque no se indica en el listado anterior:
  • XSLT
  • XPath
Si no he entendido mal, si queremos intalar 4suite, no hay que instalar estos dos ultimos módulos.
Se instala en el directorio xml (por debajo de lib/pythonX.Y).

Mas sobre JAXWS


Para obtenerlo todo creo que debemos bajarnos el Java Web Services Developer Pack 2.0. Nos podremos bajar paquetes por separado, pero con este supongo obtendremos todo.

Documentación de Sun sobre WS, aquí y aquí.

Pero como no estoy seguro del todo, mejor me lo voy a bajar de jax-ws.dev.java.net.

Nota: vaya gena la instalación del jax-ws. No está documentado como narices instalarlo en modo consola. Y todo para sacar una gena de ventana donde aceptar la licencia. ¡Vaya cutrez!

Bueno... una nota final: jax-ws forma parte de GlassFish, el cual es un proyecto para implementar un servidor de aplicaciones Open Source usando tecnología de la plataforma Java EE 5.

martes, junio 06, 2006

Un mail muy interesante relativo a XSL y python.

Estoy ya peleandome con el XSLT y ya estoy con mi primer fregao.... los namespaces. Uffff.
Los tutoriales de w3shool están muy bien, pero para empezar.
No se que mas cosillas habrá por ahí, pero siempre nos quedará la w3.org.

Por cierto, como procesador para probar estoy usando xlstproc de libxml2. Implementa XSLT 1.0. Aquí, un poco de documentación.

(un poco despues....)

Ummm, parece que este link me va a dar la solución. Por lo visto el error que estoy teniendo es muy común. Piensas que XPath va a hacer el matching con el tag del nodo del xml y ¡no! hay que hacer el matching con el 'namespace' real, toda la URI.
Habrá que investigar si se puede evitar el poner todo el churro...
Lo que dice también el articulo es que los bindingds prefijo-namespace son dependientes del procesador.

Aunque esto puede ser también bussiness de Xpath. Habrá que echar también un ojo a la coc de xpath de w3.org. En concreto al punto: Node Tests.

Aquí está la recomendación sobre Namespaces en XML.

Y ya para acabar.... unos ejemplos con Xpath.


viernes, junio 02, 2006

Que jartá de autoformación


Que si WDS, que si WDSL, que si SOAP, que si WS....
Y ahora XSL...
Que quereis saber de que van, pues wikipedia al canto, o bien los tutoriales de w3schools que estan muy bien.
De XSL voy a comentar alguna cosilla:
  • El nombre le viene de 'eXtensible StyleSheet Language'.
  • Consiste realmente de 3 partes:
    • XSLT (XSL Transformations) - un lenguaje para transformar documentos XML
    • XPath - un lenguaje para navegar por documentos XML
    • XSL-FO - un lenguaje para formatear (de ahí el FO) documentos XML
Osea, que para decir que sabes XSL, realmente tienes que controlar esas 3 cosillas. Bueno... pues a empezar...
¿Y por cual? Fácil, por el más importante XSLT .
¿Y como podemos probar? Fácil también. Los browsers actuales tienen incluido un procesador de XSLT (como Firefox 1.0.2 o IE 6).
Aparte de dejar que el Browser haga la transformación, ésta se puede realizar en el cliente (mediante Javascript) o en el servidor (en este caso el XML no tendrá una referencia al XSL).
En el caso de Javascript el propio código Javascript hace la transformación, invocando al parser de XML; y en el caso de que la haga el browser directamente, habrá en el XML una referencia al XSL.

XPath
XPath es muy importante, no sólo porque es fundamental para XSLT, sino porque también lo es para XQuery y XPointer y XLink.

Y cual es la mejor herramienta para trabajar con todos estos XMLs: XMLSpy.

Microsoft Business Rule Engine (MS-BRE)


Pues si, Microsoft tiene un 'Rule Engine'. Viene con el producto 'BizTalk', vamos... un BPM.
Buscando en la web se encuentran cosillas sobre él, como por ejemplo:

jueves, junio 01, 2006

Me recomiendan para editara WSD's o WSDL's, XMLSpy [altova.com].
Leo en Dirson que ask.com va a lanzar un buscador de blogs. Se puede probar aquí (su lanzamiento no es oficial todavía).
Una comparativa entre Oracle y MySQL [barrapunto]. Con una muy amplia introducción.