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í.
viernes, abril 20, 2007
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:
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))
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.
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.
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:
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:
Que nos proporciona la salida:
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.
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.
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.
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.
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.
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:
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:
- Chi-square distribution [Distribución chi-cuadrado]
- Chi-square test [Prueba chi-cuadrado]
- Inverse-chi-square distribution
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
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.
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).
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:
No he tenido de leer los posts, pero parece que tiene alguna entrada interesante:
Suscribirse a:
Entradas (Atom)