Hoy, dia ocupado como pocos en el trabajo (pero de eso igual hago otra entrada), me sorprendian un monton de tuits hablando de censura, cosa que no entendia y me comenzaba a temer una nueva vuelta de tuerca (a mucho peor) de la conocida “Ley de Sinde”. Pero no, era el anuncio por parte de Twitter acerca de su nueva politica. En resumidas cuentas viene a decir que en base a legislación y bajo peticion expresa de una entidad competente (entiendo que es alguien designado por el gobierno) no serán visibles los tuits que incumplan algun tipo de ley (y en ocasiones cuestiones morales/culturales).
Esto, me ha hecho pensar y mucho en lo que estaba poniendo la gente, sobre como se acababa el mundo, que si a mi no me censura nadie, que menuda mierda de red, etc. Y cada vez lo entendía menos. Quizás lo que mas me ha hecho pensar es la opinion generalizada de que twitter se habia acabado como herramienta de coordinación de movimientos activistas, especialmente explicada en los medios más tradicionales (periodicos y webs de noticias que necesitan tiempo antes de dar una noticia… hum, competencia de twitter, diria)

Pero lo cierto es que yo lo estoy viendo de otra manera, como una herramienta más potente de cara al hacktivismo: ahora un chino podría escribir tranquilamente en formato de 140 caracteres sin el temor a que sus vecinos o amigos le denuncien a un regimen, porque su tuit será borrado de su alrededor y sin embargo será accesible al resto del mundo, poniendo de relieve situaciones que se conocen vagamente por el miedo a las consecuencias. Y donde digo un chino, digo un cubano o tantos otros bajo politicas donde la libertad de expresión no es un derecho.
Y sigo pensando que seguirá siendo una herramienta magnifica de organización, porque para bloquear un “trending topic” primero habrá tenido que serlo (me acojonaré si empezamos con los precons de minority report, pero mientras tanto…) y una vez ha sido TT las formas de organización ya no pasan por tuits sino por multiples medios (IM, noticias, webs, foros, de palabra, etc.)

Mientras no haya un chivatazo por parte de Twitter a las autoridades de turno, creo que aplaudiré este paso y su conversión a una mejor herramienta de hacktivismo.

Y de paso mencionar otro post interesante de Ricardo Galli (creador de meneame) que ademas me ha puesto en marcha para escribir este.

 

He terminado (alcanzado el estado de 1.0) mi pequeño proyecto de acortador de urls, no pretende ser útil en el mundo real, pero si quizás sirva como punto de partida para otros en caso de querer ver un ejemplo de flask+redis+sqlalchemy.

La motivación principal, es una entrega para la facultad, pero he aprovechado para aprender un par de cosas y puede que acabe usándola para dar una charla introductoria en codemotion.

Está bajo licencia BSD (3 clausulas), por lo que podeis hacer casi cualquier cosa con ella ;)

Una última cosa, está pensada para trabajar con postgresql, pero cambiando la configuración de la bb.dd. debería poder adaptarse a otras bases de datos SQL

 

Si estás necesitado de aprender Haskell a marchas forzadas este fin de semana me ayudó mucho el libro: learn you a haskell for greater good. Y si lo prefieres en castellano está traducido en Aprende Haskell (si pongo los dos es porque al parecer la traducción es muy reciente y esta en proceso de revisión). Bastante conciso y la mayoría de los conceptos (si no eres nuevo completamente en programación funcional) se cogen rápido con la excepción quizás de los functores y las mónadas.

Realmente útil para iniciarse en ese complejo mundo que es Haskell. Seguramente acabe cogiendome la versión en papel de amazon

 

En un problema que resolvi recientemente en el proyecto euler, descubrí un algoritmo sencillo para calcular numeros primos: la criba de eratóstenes El cual inicialmente traduje a python como:

def eratostenes(m):
    primos = set(range(2,m+1))
    for i in xrange(2,int(sqrt(m))+1):
        if i in primos:
            for j in xrange(2,m/i+1):
                primos.discard(i*j)
    return primos

No comento el código por ser una transcripción directa del algoritmo enlazado, asi que si no entiendes como funciona, mejor leer el articulo de la wikipedia.

El problema de esta solución es que para números grandes, el conjunto inicial es muy grande y se crea nada mas empezar, por lo que en caso de no tener memoria suficiente pasará lo que tiene que pasar cuando el 99% de las aplicaciones están en la partición de swap.
Continue reading »

 

En el weekly python newsletter, enlazaban al problema de sacar la suma máxima, dado un árbol y utilizando el movimiento del clásico videojuego qBert (no del todo cierto porque qBert sí podía subir, pero eso son tecnicismos). El árbol en concreto sería así:

    chrismasTree =   [
                    [75],
                   [95,64],
                 [17,47,82],
                [18,35,87,10],
               [20, 4,82,47,65],
              [19, 1,23,75, 3,34]
                      ]

Y las reglas son que qBert siempre debe bajar por el árbol, bien hacia un lado o el otro.
Dado el pequeño número de datos, se puede hacer una aproximación por fuerza bruta (recorriendo todos los posibles caminos y comparándolos) pero esta solución sería malísima si cambiamos el set de datos al proporcionado por el proyecto euler en su problema 67, que aseguran que si pudieras comprobar 10⁷ rutas por segundo, tadarías 20 billones americanos (millardos por aquí) de años en resolverlo.
El código para generar este segundo árbol, sería:

    tri = []
    peUrl = "http://projecteuler.net/project/triangle.txt"
    for line in urllib.urlopen(peUrl).readlines():
        tri.append([int(x) for x in line.strip().split(" ")])
    print qbertRun(tri)

Y por si quieres intentar resolverlo, no pondré mi solución hasta después de “Leer mas”.
Continue reading »

 

Actualmente estoy trabajando en un prototipo de aplicación bastante sencillo, pero que requiere que aprenda bastantes cosas (y por lo tanto voy algo lento). Uno de los pequeños problemas con los que me enfrenté fue la creación de un sistema de usuarios y no quería dejar el password en abierto en la base de datos aun cuando solo fuera a utilizarlo yo.
Echando un ojo al módulo crypt de Python, requería un poco de sal, por lo que me vi de repente con que no quería meter la sal ni en un fichero de configuración ni obviamente en el código fuente. Por lo que finalmente decidí que la sal iba a ser parte del login y de ahí sacar todo. Así para comprobar la clave únicamente hago:

    from crypt import crypt
    def auth(self, clave):
        '''Comprueba si la clave suministrada es la del usuario'''
        return self.password == crypt(clave,self.username[:2])

el motivo de usar 2 caracteres es únicamente debido a los ejemplos que vi de uso de crypt, imagino que se podrían más caracteres, pero no me pareció necesario.
Si acaso, mi mayor problema con esta implementación es que la sal se vuelve conocida con solo leer el código y no se si a partir de ahí y con la clave encriptada se podría sacar la clave en plano. Por ahora y para la demo, esto me sirve y más adelante estudiaré mejores sistemas de encriptación y almacenado.
Mientras tanto, lo publico por si a alguien le viene bien.
Ah, decir además que esto lo uso mezclado con el decorator que sugieren en un snippet de Flask, pero obviamente cambiando la manera de acceso.

 

Ultimamente he sufrido las dos cosas que mas me molestan al programar (provocadas por mi, claro está)

  • una es la búsqueda de un error en el sitio incorrecto. El log de error no deja claro o puede llevar a error y te tiras un par de días buscando un error en el sitio equivocado.
    1. Lo bueno de este error es que me ha permitido descubrir un sitio como stackoverflow. Descubrirlo en el sentido de hacerme una cuenta, poner una pregunta y ser un poco más activo en general (respuestas, votos, etc).
  • en el proceso de aprendizaje de una librería, descubrir que algo lo entendiste mal
    1. Esto hace que te tires un montón de tiempo revisando código y dudando si es mejor rehacerlo o cambiarlo, al final consigues un engendro raro fruto de ese punto intermedio.

Estoy seguro de que hay más cosas que me molesten, pero esas dos suelen aparecer antes o después. Si me acuerdo ya pondré mas, porque por ahora parece una excusa promocional para stackoverflow :)

 

Esta mañana he encontrado un enlace recopilatorio de lecturas sobre python, cubriendo un buen montón de temas. Algunos de los mencionados ya los nombré hace poco.
Intentaré actualizar este post segun vaya leyendo algunos de esos artículos si merecen algún tipo de reseña especial.

 

El otro día vi en reddit algunos temas en los cuales se creaba música a partir de una línea de código (en realidad algo mas, pero la parte importante estaba solo en una) y como curiosidad personal, decidí hacer una versión serpentina de dicho programa, una vez conseguido (fácil, rápido y feo) quise poner un poco mas interés y utilizar funciones lambda y generadores. El resultado es el siguiente:

#redirigir el output a /dev/audio o instalar sox y redirigir a
# "play -u -b 8 -t raw -r 8000 -" sin las comillas

#modificar la parte interna de la funcion int() para variar la "melodia"
func = lambda t: int((t<<6|t|(t<<16)) * 10 + ((t<<11) & 7))

#generador de secuencia
def inc(t):
    '''generador para incrementar t'''
    c=t
    while True:
        yield c
        c=c+1

if __name__=='__main__':
    for t in inc(0):
        print("%X" % func(t))

Espero que alguien lo encuentre interesante y genere nuevas “melodías”. Quizás decir que el generador es lo que menos me ha gustado ya que queda poco “pitónico”, si bien el programa final queda bastante legible ya que añadí algo de codigo por variar la funcionalidad inicial y dar mas opciones con el fichero.
Para ver el resultado final recomiendo el video de los enlaces

 

Estoy intentando hacer la transición del código de Python de una aplicación desde mx.DateTime a la librería estándar de Python datetime. Las razones son 2, por un lado quitarnos una dependencia que no hace falta realmente y por otra facilitar la transición a psycopg2 (estamos usando el 1 ahora mismo). La mayor parte de las cosas son fácilmente traducibles ya que en ocasiones usan la misma sintaxis o parecida.

Si bien nadie debería jugar demasiado con epoch dado que Python ofrece múltiples opciones para jugar con la fecha tanto en mx.DateTime como en datetime, parece que los tiempos de C no se olvidan y hay quien lo prefiere. Esto, me ha supuesto un problema ya que para traer una fecha de un timestamp a datetime es sencillo, pero la inversa no. En cualquier otro caso estaría estudiando un poco el código para adaptarlo y hacerlo sencillo, pero dado que tengo que cambiar algo más de 100 ficheros, me corre cierta prisa cambiar todo y que de primeras funcione igual, es decir que no puedo cambiar apenas el código mas que lo estrictamente necesario.

Por si alguien más lo necesita, el código para pasar de datetime al número de segundos desde ‘epoch’ sería el siguiente:

time.mktime(datetime.datetime.today().timetuple())

datetime.datetime.today() puede sustituirse por cualquier otra fecha en formato datetime, además se pierde la precisión del float debido al uso de timetuple, por lo que si los microsegundos son importantes, esta no es una forma válida, aunque posiblemente sería parcheable.

Fuente