Bueno, pues me encontré en [ http://www.jezuk.co.uk/cgi-bin/view/software/eliza ] un bot eliza programado en python que puede ser usado directamente o como módulo, así que traducido a español y con la librería de IRC pues ya está listo un bot para hacer la gracia.
Todo junto aquí [ wilson.zip ] (hay que ejecutar a wilson.py)
Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas
miércoles, 6 de abril de 2011
viernes, 1 de abril de 2011
Intérprete de Tubes
Actualizado: el intérprete tenía un bug en una tabla, ya está arreglado [ http://pastebin.com/1zQQD0a4 ]
El otro día, rondando por esolang.org me encontré con un lenguaje de esos que hay que probar, Tubes, donde la lógica del programa se escribe en forma de cañerías, por ejemplo, un bucle que va mostrando 012301230123...
┌┐ ◉◆ ║║ ▶┤│ └┘
Pero había un problema, aún no había una implementación, así que hubo que ponerse manos a la obra, y de paso aprovechar para probar Python 3 que se maneja mejor que la versión 2 con las cadenas Unicode (todos los "dibujos" del código son unicode :P), este es el resultado[ http://pastebin.com/1zQQD0a4 ].
Como parámetro necesita el código a ejecutar, pero luce más si se le pasa la opción -d para que muestre el estado actual, se puede regular el retardo entre operaciones especificandolo después de -d (sinó no muestra el estado no hay retardo) y... eso es todo, chim pum!
Nos vemos
Etiquetas:
esoterico,
interpretes,
python,
python3
jueves, 24 de marzo de 2011
Comprobación de números primos con el FIPS186
Que no se diga, aquí está el código del algoritmo y una comprobación para ver el número de falsos positivos y negativos:
Por ejemplo:
Primos: 1225
Falsos negativos: 608
Falsos positivos: 0
ps: se me pasó poner la licencia, como siempre está bajo WTFPL
Saludos
Por ejemplo:
Primos: 1225
Falsos negativos: 608
Falsos positivos: 0
ps: se me pasó poner la licencia, como siempre está bajo WTFPL
Saludos
Etiquetas:
python
miércoles, 23 de marzo de 2011
Introduccion a la criptografia, con Python: DSA (V -2)
Después de 8 meses de demorar el momento de enfrentarse a DSA, continúa esta introducción a la criptografía ( aaaleluyaaaa... )
Pues seguimos con la introduccion a la criptografia... acababamos de ver el cifrado usando ElGamal y quedaba pendiente el algoritmo de firmado usando DSA para pasar a la sexta parte ( hashes de nuevo ), así que ahí vamos, documentación y código intercalado:
Pues seguimos con la introduccion a la criptografia... acababamos de ver el cifrado usando ElGamal y quedaba pendiente el algoritmo de firmado usando DSA para pasar a la sexta parte ( hashes de nuevo ), así que ahí vamos, documentación y código intercalado:
Etiquetas:
cifrado asimetrico,
DSA,
introduccion a la criptografia,
python
Obtener el número de bits de un número en Python [tip]
Perdón a los que les estoy rallando con esto de los tips, son cosas que cuando no se te ocurren no sabes de donde sacarlas, pero ya escritas son simples y obvias, sin más dilación:
def bitN(i):
return len(bin(i)[2:])
Me explico, se pasa a binario bin(i), se separa el número del indicador de formato [2:] (0b) y se muestra su longitud len( )
Saludos
def bitN(i):
return len(bin(i)[2:])
Me explico, se pasa a binario bin(i), se separa el número del indicador de formato [2:] (0b) y se muestra su longitud len( )
Saludos
miércoles, 16 de marzo de 2011
Cifrando con autómatas celulares
Hoy traigo un pequeño experimento, este es un cifrado que se basa en el mismo concepto que otro código anterior [ Un autómata celular para generar números pseudo-aleatorios ], pero en vez de generar números aleatorios, sirve como cifrado de flujo [ http://pastebin.com/uX1WpGjF ] .
Etiquetas:
automata celular,
cifrado de flujo,
python
viernes, 11 de marzo de 2011
Escapando caracteres especiales en Python [tip]
Supongamos que tenemos un texto como este:
def miniscape(s):
return str([s])[2:-2]
Resultado:
\nBla\nblablabla\\ /\nblabla\n
Y para darle la vuelta?
def miniunscape(s):
i = 0
while True:
try:
x = s.index("\\x", i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+chr(int(s[x+2:x+4],16))+s[x+4:]
i = x + 1
except:
break
reptable = [("\\\\","\\"),("\\n","\n"),("\\'","'"),("\\a","\a"),
("\\b","\b"),("\\f","\f"),("\\r","\r"),("\\t","\t"),
("\\v","\v")]
for r in reptable:
i = 0
while True:
try:
x = s.index(r[0], i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+r[1]+s[x+2:]
i = x + 1
except:
break
return s
En pastebin [ http://pastebin.com/5uvf3tBK ]
Y ya está, nos vemos
BlaY queremos representarlo todo en una línea sin perder información, como hacerlo?
blablabla\ /
blabla
def miniscape(s):
return str([s])[2:-2]
Resultado:
\nBla\nblablabla\\ /\nblabla\n
Y para darle la vuelta?
def miniunscape(s):
i = 0
while True:
try:
x = s.index("\\x", i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+chr(int(s[x+2:x+4],16))+s[x+4:]
i = x + 1
except:
break
reptable = [("\\\\","\\"),("\\n","\n"),("\\'","'"),("\\a","\a"),
("\\b","\b"),("\\f","\f"),("\\r","\r"),("\\t","\t"),
("\\v","\v")]
for r in reptable:
i = 0
while True:
try:
x = s.index(r[0], i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+r[1]+s[x+2:]
i = x + 1
except:
break
return s
En pastebin [ http://pastebin.com/5uvf3tBK ]
Y ya está, nos vemos
martes, 22 de febrero de 2011
Haciendo un iterador a medida en Python
Mientras no van llegando cosas que requiren más tiempo aquí va algo que puede resultar interesante, vamos a hacer nuestro propio iterador dinámico, que permita modificar su comportamiento desde el propio script, por ejemplo, si hacemos:
for i in my_iterator(1,1000,"<<1"):
print i
my_iterator( inicio, límite, paso ) Mostraría esto:
1
2
4
8
16
32
64
128
256
512
for i in my_iterator(1,1000,"<<1"):
print i
my_iterator( inicio, límite, paso ) Mostraría esto:
1
2
4
8
16
32
64
128
256
512
Etiquetas:
python
viernes, 18 de febrero de 2011
Como evitar que un hilo de pyGTK bloquee a los demás [ tip ]
Si alguien ha intentado programar un script que use pyGTK lanzándolo en un hilo aparte se habrá dado cuenta de que bloquea a todo el proceso, lo que es bastante molesto. La solución es hacer esto desde ese hilo antes de levantar la interfaz:
gtk.gdk.threads_init()
Hay más sobre hilos y pyGTK ( esto en concreto no ) en: http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html
Saludos
gtk.gdk.threads_init()
Hay más sobre hilos y pyGTK ( esto en concreto no ) en: http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html
Saludos
jueves, 10 de febrero de 2011
Gráficos de tortuga sobre imágenes en Python
Pues hoy traigo una mini-libraría que se apoya en PIL para hacer gráficos de tortuga directamente sobre imágenes [ imgturtle.py ]:
Dibujado con este script [ dragon.py ]
Dibujado con este script [ dragon.py ]
Etiquetas:
graficos de tortuga,
python
domingo, 6 de febrero de 2011
Arkanoid con Pygame
Este juego lo había escrito para un concurso de programación hace varios meses, pero no conseguí que las colisiones funcionaran bien, ahora que ya he conseguido arreglarlo minimamente y he añadido un par de cambios, este es el resultado:
viernes, 4 de febrero de 2011
PyIC ( Librería IRC para python ) 0.2
Pues eso, habemus nueva versión de PyIC ( una librería para clientes IRC ), ya está subida en GitHub [ https://github.com/kenkeiras/PyIC ]
Se puede ver como quedan las funciones en el README, pero los cambios básicamente son estos:
Se puede ver como quedan las funciones en el README, pero los cambios básicamente son estos:
jueves, 3 de febrero de 2011
Nueva versión de GUIml, añadido Tktinter
Pues eso, que ya está listo el soporte para Tkinter en GUIml:
Desluce un poco al lado de los otros,¿verdad?
Solo resaltar una cosa, da "X Window System error" cuando las ventanas de "About" no se cierran antes que el programa principal ( no pongais about's y todos contentos ), esto se arreglará cuando sepa que lo provoca.
Se puede descargar desde aquí: guiml02.zip
ps: está en camino una batería de nuevas versiones, stay tuned
Hasta pronto.
Desluce un poco al lado de los otros,¿verdad?
Solo resaltar una cosa, da "X Window System error" cuando las ventanas de "About" no se cierran antes que el programa principal ( no pongais about's y todos contentos ), esto se arreglará cuando sepa que lo provoca.
Se puede descargar desde aquí: guiml02.zip
ps: está en camino una batería de nuevas versiones, stay tuned
Hasta pronto.
domingo, 30 de enero de 2011
Añadiendo el Wiimote a los scripts de PyGame
Pues eso, veamos como podemos hacer para añadir de forma fácil la posibilidad de usar el Wiimote en los scripts que usan PyGame modificando mínimamente el código.
La idea es muy simple, el sistema de eventos de PyGame permite añadir eventos desde fuera, mezclando eso con el sistema de callbacks de cwiid ( la librería para manejar el Wiimote ) podemos hacer como si se pulsasen teclas del teclado desde el Wiimote, los eventos se pueden crear así:
ev = pygame.event.Event( <tipo de evento>, { "key": <tecla> } )
Y después solo hay que añadirlos con:
pygame.event.post( ev )
Entonces el script quedaría algo como esto [ wii4pygame.py ], solo hay que hacer bind_wiimote(), opcionalmente mandando el número del led a activar ( 1 por defecto ), por ejemplo:
La idea es muy simple, el sistema de eventos de PyGame permite añadir eventos desde fuera, mezclando eso con el sistema de callbacks de cwiid ( la librería para manejar el Wiimote ) podemos hacer como si se pulsasen teclas del teclado desde el Wiimote, los eventos se pueden crear así:
ev = pygame.event.Event( <tipo de evento>, { "key": <tecla> } )
Y después solo hay que añadirlos con:
pygame.event.post( ev )
Entonces el script quedaría algo como esto [ wii4pygame.py ], solo hay que hacer bind_wiimote(), opcionalmente mandando el número del led a activar ( 1 por defecto ), por ejemplo:
viernes, 28 de enero de 2011
Controlando el reproductor Totem desde el Wiimote
Al principio la idea no era exactamente esa, de hecho era sobre rhythmbox... pero empecemos desde el principio.
Hablando con un colega sobre nosequé salió la idea de controlar el Rhythmbox ( reproductor de música de gnome bastante usado ). Al volver sobre la idea días ¿ semanas ? más tarde, leyendo la documentación sobre como hacer un plugin llegue a esta web: http://redjunasun.blogspot.com/2010/11/wiimote-for-controlling-rhythmbox.html a ver... compila perfectamente con "gcc archivo.c -o loquesea -lcwiid" y funciona bien.
Y no es un plugin, hmmm... parece ser que lo que usa para controlarlo es el DBus y uno pensando que solo servía para cosas de bajo nivel, mola controlar el reproductor así, enfin, eso ya está hecho, habrá que buscar otra cosa, probemos con el Totem.
Actualización: corregidos botones que no deberían hacer nada pero hacían play/pause
Hablando con un colega sobre nosequé salió la idea de controlar el Rhythmbox ( reproductor de música de gnome bastante usado ). Al volver sobre la idea días ¿ semanas ? más tarde, leyendo la documentación sobre como hacer un plugin llegue a esta web: http://redjunasun.blogspot.com/2010/11/wiimote-for-controlling-rhythmbox.html a ver... compila perfectamente con "gcc archivo.c -o loquesea -lcwiid" y funciona bien.
Y no es un plugin, hmmm... parece ser que lo que usa para controlarlo es el DBus y uno pensando que solo servía para cosas de bajo nivel, mola controlar el reproductor así, enfin, eso ya está hecho, habrá que buscar otra cosa, probemos con el Totem.
Actualización: corregidos botones que no deberían hacer nada pero hacían play/pause
miércoles, 26 de enero de 2011
Montando un sistema de descargas oculto ( 2 ): cifrando y pensando a lo grande
[ Montando un sistema de descargas oculto ( 1 ): las bases ]
Seguimos avanzando, está claro que aunque los datos se ocultan dentro de una imágen, si tiras de esteganografía para esto, dejar los datos simplement así es casi como que vayan en *****, si alguien busca datos ocultos en una imágen LSB es lo primero que se probaría, hay que reforzarlo con un cifrado, con un simple ARC4 con una clave segura y suficiente padding basta para darle en los morros a los cotillas y para desalentar a algun bot que analice la red en busca de algo sospechoso, este cifrado ya se explico anteriormente, así que vamos con lo siguiente.
Una sola imágen está bien para cosas pequeñas, pero hasta una relativamente grande no puede soportar más de 1 mega, hay que buscar una forma de dividir el archivo y mantener una lista de las ubicaciones de las partes, digamos por ejemplo que queremos dividir el archivo cifrado entre las imágenes y subir estas a un hosting de imágenes como Imageshack.us, habría que guardar las URL donde quedan las imágenes, ya puestos la clave se podría sacar de "/dev/urandom" para que sea lo suficientemente cerca y de paso guardar el tamaño del archivo original, en esta implementación, el formato usado es este:
Actualización: corregido un error muy tonto que podía ocurrir al guardar la clave en el gzip :P
Seguimos avanzando, está claro que aunque los datos se ocultan dentro de una imágen, si tiras de esteganografía para esto, dejar los datos simplement así es casi como que vayan en *****, si alguien busca datos ocultos en una imágen LSB es lo primero que se probaría, hay que reforzarlo con un cifrado, con un simple ARC4 con una clave segura y suficiente padding basta para darle en los morros a los cotillas y para desalentar a algun bot que analice la red en busca de algo sospechoso, este cifrado ya se explico anteriormente, así que vamos con lo siguiente.
Una sola imágen está bien para cosas pequeñas, pero hasta una relativamente grande no puede soportar más de 1 mega, hay que buscar una forma de dividir el archivo y mantener una lista de las ubicaciones de las partes, digamos por ejemplo que queremos dividir el archivo cifrado entre las imágenes y subir estas a un hosting de imágenes como Imageshack.us, habría que guardar las URL donde quedan las imágenes, ya puestos la clave se podría sacar de "/dev/urandom" para que sea lo suficientemente cerca y de paso guardar el tamaño del archivo original, en esta implementación, el formato usado es este:
Actualización: corregido un error muy tonto que podía ocurrir al guardar la clave en el gzip :P
Etiquetas:
esteganografia,
python
domingo, 23 de enero de 2011
Montando un sistema de descargas oculto ( 1 ): las bases
La idea era mostrar primero un posible escenario de control total de internet, pero se volvió demasiado post-apocalíptico. Na' , imaginaos simplemente que queremos distribuir eh...código fuente, pero sin que nadie se dé cuenta de que su servidor lo aloja.
Una opción es utilizar algo conocido como esteganografía, como dice en la Wikipedia:
Vamos, que así como la criptografía intenta que los datos no sean recuperables sin una contraseña, la esteganografía apunta a pasar mensajes sin que se interpreten como tales.
Por ejemplo, hay imágenes en casi cualquier página de Internet, podemos introducir nuestros datos en una imágen y después subirla a un foro, un host de imágenes o donde nos de la gana.
Una opción es utilizar algo conocido como esteganografía, como dice en la Wikipedia:
La esteganografía es la disciplina en la que se estudian y aplican técnicas que permiten el ocultamiento de mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. Es una mezcla de artes y técnicas que se combinan para conformar la práctica de ocultar y enviar información sensible en un portador que pueda pasar desapercibido.
Vamos, que así como la criptografía intenta que los datos no sean recuperables sin una contraseña, la esteganografía apunta a pasar mensajes sin que se interpreten como tales.
Por ejemplo, hay imágenes en casi cualquier página de Internet, podemos introducir nuestros datos en una imágen y después subirla a un foro, un host de imágenes o donde nos de la gana.
Etiquetas:
esteganografia,
grafico,
python
jueves, 13 de enero de 2011
GUI's en python con [ GTK | QT4 ] y [XML | HTML... ]
Hoy traigo una librería que aún no está acabada, pero puede que interese a la gente que no le guste complicarse lo más mínimo con las interfaces, pero que aún así le interese hacer unas GUI para los script [ guiml.zip ].
La idea es simple, le pasas un pedazo de HTML a la "librería" y esta selecciona el Toolkit disponible (por ahora solo soporta Gtk y Qt4, cuando le heche el guante a algo que tenga tk instalado lo añado ) hace una GUI basandose en eso, por ejemplo, para
<title>Simple test</title>
<form action="test">
Decide <br>
<input type="submit" value="SI" name="Si"><input type="submit" value="NO" name="No">
Con Gtk:
Con Qt4:
La idea es simple, le pasas un pedazo de HTML a la "librería" y esta selecciona el Toolkit disponible (por ahora solo soporta Gtk y Qt4, cuando le heche el guante a algo que tenga tk instalado lo añado ) hace una GUI basandose en eso, por ejemplo, para
<title>Simple test</title>
<form action="test">
Decide <br>
<input type="submit" value="SI" name="Si"><input type="submit" value="NO" name="No">
Con Gtk:
Con Qt4:
domingo, 9 de enero de 2011
Historias desde los confines de random()
Pues eso, hoy toca un script al estilo de cierto juego analógico, ese en el que hay que escribir una frase en un trozo de papel sabiendo sólo con que palabra empezar (última palabra que escribió la persona anterior) y pasarsela a la siguiente hasta que vuelva a la primera.
Lo que hace el script [ randomstories.zip ] es tomar un número cualquiera de palabras de una página de wikipedia, y repetir el proceso haciendo que la primera palabra encaje con la última hasta alcanzar el tamaño máximo del mensaje. El archivo que hay que ejecutar es randomstories.py .
Lo que hace el script [ randomstories.zip ] es tomar un número cualquiera de palabras de una página de wikipedia, y repetir el proceso haciendo que la primera palabra encaje con la última hasta alcanzar el tamaño máximo del mensaje. El archivo que hay que ejecutar es randomstories.py .
Etiquetas:
python
viernes, 7 de enero de 2011
Rompiendo captchas
Por cosas de la vida, últimamente ando trasteando con las arañas, crawleando cosas varias... y al final era inevitable toparse con los CAPTCHAs, así que se me ha presentado la ocasión de intentar vencerlos, por ahora esto es lo poco que he conseguido [ captcha_baker.py ], lo poco que hace el propio script es leer los pixels de la primera línea y pasar a blanco los que estén cerca de estos, y a negro el resto. Después corta las letras por las columnas en blanco.
El valor de la "cercanía" es modificable (de hecho la idea viene del parámetro "umbral" de la selección de color de GIMP).
Depende de Image Magick para convertir las imágenes a BMP, Python Image Library para recortar las letras y tesseract-ocr para reconocer las letras.
No funciona demasiado bien, pero estoy bastante contento con el resultado para ser una primera prueba.
Los parámetros son:
./captcha_baker.py <imágen> <número de letras> [<umbral>]
El número de letras no es realmente necesario, se puede poner a 0 para no considerarlo. El umbral por defecto es 15. Por último unas muestras.
El valor de la "cercanía" es modificable (de hecho la idea viene del parámetro "umbral" de la selección de color de GIMP).
Depende de Image Magick para convertir las imágenes a BMP, Python Image Library para recortar las letras y tesseract-ocr para reconocer las letras.
No funciona demasiado bien, pero estoy bastante contento con el resultado para ser una primera prueba.
Los parámetros son:
./captcha_baker.py <imágen> <número de letras> [<umbral>]
El número de letras no es realmente necesario, se puede poner a 0 para no considerarlo. El umbral por defecto es 15. Por último unas muestras.
Suscribirse a:
Entradas (Atom)






#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import random
""" FIPS186
Step 1. Set i = 1 and n > or = to 50.
Step 2. Set w = the integer to be tested, w = 1 + 2 a m, where m is odd and 2 a is m, where m is odd and 2 is the largest power of 2 dividing w - 1
Step 3. Generate a random integer b in the range 1 < b < w
Step 4. Set j = 0 and z = b**m mod w mod w
Step 5. If j = 0 and z = 1, or if z = w - 1, go to step 9
Step 6. If j > 0 and z = 1, go to step 8
Step 7. j = j + 1. If j < a, set z = z 2 mod w and go to step 5 mod w and go to step 5
Step 8. w is not prime. Stop.
Step 9. If i < n, set i = i + 1 and go to step 3. Otherwise, w is probably prime
"""
from math import sqrt
# Comprobación real
def rchk(n):
for i in xrange(2,int(sqrt(n))+1):
if not n % i:
return False
return True
# Especificada en el FIPS186
def chkprime(w, n = 50):
m = w-1
a = 0
while not m & 1:
m >>= 1
a += 1
i = 0
while True:
b = random.randint(2, w-1)
j = 0
while True:
z = (b**m) % w
if ( j == 0 and z == 1) or \
z == w-1:
if (i<n):
i += 1
break
else:
return True
if j > 0 and z == 1:
return False
j += 1
if j < a:
z = ( z * z ) % w
else:
return False
fn = 0
fp = 0
pr = 0
inicio = 10
fin = 10000
import sys
for i in xrange(inicio,fin):
c = chkprime(i)
r = rchk(i)
if not i%100:
sys.stdout.write("\r"+str(i)+" "+str(pr))
sys.stdout.flush()
if c:
pr += 1
if c != r:
if c:
fp += 1
pr -= 1
else:
fn += 1
pr += 1
print ""
print "Primos:", pr
print "Falsos negativos:", fn
print "Falsos positivos:", fp