jueves 10 de septiembre de 2009

List comprehensions y generadores: Haskell y Python para principiantes

Un feature que siempre me gustó de Python son las list comprehensions (o listas por comprensión) y los generadores. En este post voy a escribir un texto que me hubiera gustado encontrar un tiempo atrás cuando por primera vez me topé con estas maravillas.

Una lista por comprensión es una forma de obtener una lista de manera "descriptiva", por ejemplo la lista de las primeras 10 potencias de 2:


[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]


Podría obtenerse como:


[2**n for n in range(0,11)]


Que se pdoría leer como: "2 elevado a la n, para n en el rango de 0 a 11". En este caso range() es un generador de números.

Qué significa que sea un generador? simplemente que retorna un iterador y a medida que se le pidan cosas las va a ir produciendo (existe otra función que hace esto mismo con mejoras en el consumo de memoria, llamada xrange(), pero no me voy a poner a explicarlo acá).

Entonces podríamos por ejemplo, querer hacer un generador que me devuelva los números de la secuencia de fibonacci (nunca le encontré el sentido a usar esta secuencia, salvo para jugar, que es lo que estamos haciendo...). Entonces veamos un poco qué herramientas nos provee python (algunas) para hacer generadores.

El siguiente código va contando. Hasta cuando? por siempre, me devuelve un número atrás del otro siempre que yo le pida:



def contar():
x = 0
while True:
yield x
x = x + 1



El operador yield alcanza para crear un generador. Lo que hace es devolver el control al caller de la función generadora. Al volver a llamarse el generador, retoma la ejecución desde la línea siguiente al yield, haciendo lo que queremos y no devolviendo siempre 0, o colgarse (por el while True).

En una consola de python, podemos probarlo:


>>> a = contar()
>>> a.next()
0
>>> a.next()
1
>>> a.next()
2
>>> a.next()
3
>>> a.next()
4


Lo mismo hacemos ahora, pero para generar la venerada secuencia (notar que los dos primeros están aparte pues son los casos base de la definición recursiva de la secuencia)



def fib():
i = 0
first = 0
yield first
second = 1
yield second
while True:
next = first + second
first = second
second = next
yield next



Ahora bien, todo muy lindo pero de donde vienen estas bondades como las listas por comprensión y los generadores? Bueno, las listas por comprensión al menos, fue un feature que Python "tomó prestado" de otro lenguaje... Haskell, del paradigma funcional.

Cómo hacemos esto mismo que acabamos de hacer en Python en Haskell? Empecemos por las listas por comprensión:


Main> [2^n| n<-[0..10]]
[1,2,4,8,16,32,64,128,256,512,1024]


Que "leído" sería: "Los dos-a-la-N que vienen de tomar n de la lista de 0 a 10", como Haskell habla mas que nada, el lenguaje de los matemáticos, no tiene problemas similares al range(n,m) de python, que va de n a (m-1)...

Sigamos. Qué notan de raro en la línea en haskell? Un generador!, en realidad dos! Por qué?


Main> [0..10]
[0,1,2,3,4,5,6,7,8,9,10]


Genera la secuencia de 0 a 10. Mientras que n <-[0..10]
en el contexto de la lista por comprensión, va "tomando" n's de la lista.

Algo importante para decir, es que los generadores dentro de las listas por comprensión, tanto en Python como en Haskell pueden anidarse, prueben estos códigos en Python y Haskell respectivamente:


Main> [ (x,y)| x<-[0..5], y<-[11..15] ]



[(x,y) for x in range(0,6) for y in range(11,16)]


Dan lo mismo!

Una prueba de velocidad


Ya es suficiente como para que el que este leyendo esto siga investigando por su cuenta las bondades de los generadores y las listas por comprensión tanto en Python como en Haskell, al final del post hay algunos links.
Pero me quedé jugando, y probé algunas cosas... por ejemplo. Fíjense estas definiciones de funciones que hay para ir tomando los números de fibonacci en Haskell:



fibo 0 = 0
fibo 1 = 1
fibo n = fib (n-1) + fib (n-2)


fib :: Int -> Integer
fib n = fibs !! n
where
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)



fibo es la versión recursiva, LENTA que me va dando los números de la lista. Cada vez que quiere calcular el n-ésimo número, tiene que calcular los (n-1) y (n-2)-ésimos, y para calcular cada uno de estos seguir hacia atrás, por lo que el orden de este algoritmo es exponencial.
En cambio fib es una versión que hace uso de una SUPER bondad de los lenguajes funcionales que son los folds, funciones de alto orden (les recomiendo leer este último link!). Esta implementación tiene orden lineal, o sea, que la podemos poner a competir con la versión que habíamos armado para python y que la competencia sea mas justa... hagamoslo!

Los competidores:


fib :: Int -> Integer
fib n = fibs !! n
where
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)



VS.



def fib():
i = 0
first = 0
yield first
second = 1
yield second
while True:
next = first + second
first = second
second = next
yield next



Los invito a que lo prueben... En el próximo post mis resultados...

Espero que este post les haya dejado algo!

Links:
Este link es en la doc de python una comparación con Haskell.
http://www.haskell.org/haskellwiki/List_comprehension
http://www.haskell.org/haskellwiki/Fold
http://www.zvon.org/other/haskell/Outputprelude/zipWith_f.html
http://docs.python.org/tutorial/datastructures.html#list-comprehensions
http://docs.python.org/tutorial/classes.html#generators

sábado 5 de septiembre de 2009

Se fue Pycon Argentina 2009

Hoy terminó Pycon 2009, la verdad es que nos llevo mucho tiempo prepararla y superó las expectativas en todos los sentidos (asistentes, salió todo perfecto, no se robaron nada... :D). Las charlas estuvieron muy buenas y variadas y la gente parece haberla disfrutado mucho.

En cuanto estén los slides de las charlas comento las que pude ver. Ahora me voy a dormir, que no doy mas.

martes 2 de junio de 2009

Pycon Argentina Call for Charlas (CFCh)

Se agradece la difusión. y espero verlos a todos ahi! (quienquiera que lea este blog!)
----

Call For Charlas (CFCh)
PyCon Argentina - http://ar.pycon.org/
Primera Conferencia Argentina de Python
Buenos Aires - 4 y 5 de Septiembre de 2009'''


PyAr, el grupo de usuarios de Python de Argentina invita a toda la comunidad de usuarios de Python y de Software Libre en general a proponer presentaciones y charlas para la Primera Conferencia Argentina de Python.

En este evento nos juntaremos desarrolladores y programadores tanto principiantes como avanzados; bloggers, autores y diseñadores web; gerentes, administradores y emprendedores; científicos, ingenieros, curiosos y todo aquel que tenga ganas de acercarse a la comunidad Python en Argentina.

El autor de cada charla seleccionada podrá participar presencialmente, como orador en el evento. En los casos en que la charla sea realizada por varios autores, se permitirá un máximo de 3 oradores.

Aclaración: Por cuestiones presupuestarias, sólo se podrán financiar los pasajes, total o parcialmente, de algunos autores seleccionados que residan fuera de Capital Federal o Gran Buenos Aires. Por favor aclarar junto a la propuesta de charla si se solicita ayuda económica.

Agradecemos la contribución de todos en la difusión de este llamado y del evento en si mediante los banners diseñados para tal fin y que se encuentran en http://ar.pycon.org/2009/helping/publicize/

Dónde enviar las Charlas
Las charlas deben ser ingresadas para su aprobación en
http://ar.pycon.org/2009/conference/proposals/submit/
La fecha límite de envío de charlas es el Lunes 29 de Junio inclusive.
En caso de consultas o inconvenientes, contactarse con charlas[.--arroba-- .]python.org.ar

Cómo enviar las Charlas
El envío de la propuesta de charla debe tener los siguientes datos:

  • Título:

  • Autor(es): Nombre y apellido, breve descripción de cada uno, foto, asociación, grupo de usuarios, organismo, o empresa a la que pertenece, si corresponde.

  • Tiempo estimado de duración: Las charlas generalmente son de 45'. En caso de que sea mayor o menor el tiempo requerido solicitamos su justificación.

  • Breve descripción de la charla: Uno o dos párrafo(s) que explique -no tan brevemente- el contenido de la presentación.

  • Nivel objetivo de la charla: introductorio / intermedio / avanzado

  • Tipo de publico: Desarrolladores avanzados, desarrolladores principiantes, empresarios, docentes, público en general

  • Conocimientos previos: Especificar que conocimientos previos deberán tener los asistentes.

  • Tags: web, gui, databases, frameworks, orm, ide, ciencia, educación, juegos, comunidad, etc.

  • Teléfono del/los autor/es: Para poder comunicarnos.

  • Ciudad de residencia del/los autor/es.




Qué formato deben tener las Presentaciones
El envío de las diapositivas y/o presentaciones debe tener alguno de los siguientes formatos:

  • Openoffice.org presentation

  • HTML standard

  • Postscript o PDF

  • Texto plano



Licencia
Debe especificarse una licencia que permita que !PyAr distribuya el material en un CD de Documentación y que permita ser descargado del sitio web de !PyAr. Se recomienda Creative Commons o similares.

viernes 22 de agosto de 2008

Jornadas de software libre 2008


Ayer estuve en las Jornadas Regionales de Software Libre, muy bien organizadas por CaFelug, la verdad es que estuvo muy bueno (hoy sigue) y les recomiendo ir.

Tuve la oportunidad de ir a las charlas de Raymond Hettinger, core developer de python y la verdad me encataron sus charlas. En la primera habló de python-3000 (py3k) y algunos de los features/cambios que hicieron en el lenguaje (que vale la pena aclarar, no es backward-compatible con código 2.x, aunque proveen de las tools para transformar el código). En cuanto suban el material de las charlas lo apunto.

En cuanto a la segunda charla, dió un tutorial de descriptors que estuvo muy bueno. Basicamente fue una charla muy didactica y con un nivel tecnico interesante.

Sobre el final del día y como broche de oro, habló John "maddog" Hall (su blog) titulada "Making Money and Saving Money with Free Software" donde hizo un muy comico (vestido de astronauta!) recorrido sobre las formas de emprender proyectos con software libre, los beneficios reales de este y en particular, se concentró en desmentir la falacia del TCO (Total Cost of Ownership), medida que algunas empresas utulizan como bandera de ataque el software libre, contra el valor del software libre en cuanto a flexibilidad para adaptarse a las necesidades de negocios y no de los negocios al software.

Bueno, no queria dejar de contar algunas cosas que vi, pronto pongo links al material

jueves 3 de julio de 2008

El fin de los tiempos

Bueno, hace tiempo que quiero postear algo sobre esto. Parece que un cambio de paradigma GROSO se esta gestando.

Resulta que hay un señor llamado Alan Kay, ya consagrado científico, ganador del Turing Award 2003 (que es como el oscar pero en ciencias de la computacion), premio que otorgaron a Dijkstra, Knuth, Rivest+Shamir+Adelman (RSA), y otros. Kay se embarco en un proyecto cuyo proposito es "Revolucionar la programacion".

Para variar, entre las cosas que hizo Kay, está el lenguaje Smalltalk que lo inventó mientras trabajaba para Xerox. Dicho sea de paso, este lenguaje revolucionó el mundo de la programación, con el denominado Object Oriented Programming (OOP) que basicamente se transformo en el paradigma de-facto para la industria de software (salvo uno que otro kamikaze que programa COBOL u otras yerbas), ojo, en el ambito academico hay muchos otros paradigmas recopados como el funcional, pero no me quiero ir de tema.

Entonces Kay Recibió un funding de la NSF para llevar a cabo un proyecto PARA REVOLUCIONAR LA COMPUTACION, asi, como lo digo. Y se lo grantearon.

Este es el informe de avance del primer año, donde cuentan los delirios que se les ocurrieron. Basicamente proponen:

  • Reinventar los sistemas operativos

  • Reinventar las conexiones entre redes

  • Reinventar los soportes de informacion

  • Reinventar todo



Como? Inventaron un Meta-meta language- language (lo escribo en ingles porque los modificadores directos tienen sentido solo en ese idioma) que basicamente es un lenguaje para escribir lenguajes, incluso para reescribirse a si mismo. Si, limaron.

Entonces comenzaron a reinventar todo, obviamente, con el concepto de que TODO, TODO es un objeto. Conexiones de red, documentos impresos, pdf. Todo combinable, ya que los objetos deberian poder recibir estimulos de otros objetos, y saber responder, todo con mensajes. O sea, que un objeto deberia poder hacer SOLO lo que su interfaz (de objeto) le permite.

Es muy largo el informe, y sinceramente parece de ciencia ficcion al principio, pero a medida que vas leyendo no podes creer lo que estan haciendo.

Cada vez mas convencido, si este tipo levanta un dedo, es porque tiene algo para decir, ninguna pavada.

Les recomiendo, leanlo. Por mi parte a medida que pueda seguir les voy a contar mas.

Ahh, otra cosa, Kay tambien invento cosas como Etoys para enseñar a programar a los chicos, ya que tambien da clases en escuelas primarias, enseñando programación. En el informe (entre tantas cosas) dice que "los chicos deberian aprender a programar en el mismo momento en el que aprenden a escribir". Loco? en 20 años vemos.

Que lo disfruten!

Toda la info del proyecto en : http://www.vpri.org/html/work/ifnct.htm

gutes

miércoles 21 de mayo de 2008

ET Phone Home: sobre neutrinos

Ayer encontré en slashdot un paper (en formato pdf) sobre unos tipos que plantean las comunicaciones intergalacticas (suena muy a ficción, pero básicamente se refieren a distancias enormes en el espacio) que como medio usan a los neutrinos.

Para entender mejor de que hablaban volvi a leer con mas detenimiento que son los neutrinos, que tipos hay, etc. Les cito algo de historia:

(NOTA: también descubrí que los papers de física de este tipo, estan escritos horribles, como una narrativa del siglo 13 sobre alguna construcción matemática, pero bue, debe ser su estilo particular)

Neutrinos


Los neutrinos son de la familia de los fermiones, son particulas super chiquitas, tan chiquitas que traspasan cualquier tipo de materia (mas chiquitos incluso que los fotones).

Resulta que W. Pauli postuló la noción de neutrino para encajar un error de cuenta que tenía cuando estab midiendo la conservación de energía y de momento en beta decays (según la sabia wikipedia, esto es cuando por resultado de un decaimiento radioactivo una particula beta (electron o positron) es emitido). Bueno, en fin, lo postuló (aparentemente) para describir que una particula no detectaba se llevaba la energía que le faltaba en la medición de energía, momento y momento angular.
El nombre "neutrino" se lo dió E. Fermi pero no voy a ahondar en esto que no lei nada.



Volviendo al paper. Primero discuten qué tipo de neutrinos son mejores para este tipo de comunicaciones, basandose en los niveles de Señal/Ruido que aceptan, también evalúa neutrinos de distintos niveles de energía (medidos en eV, electronVolt - 1 MeV/c² = 1.783×10−30 kg, parede que en fisica de particulas, la masa y la energía son intercambiables, gracias al laburo de Einstein, entonces esta medida se usa como medida de masa o energía).

Una de las cosas que postulan estos tipos es que los de SETI que son una fundación que se dedica a tratar de explicar la vida en el universo, no encuentran hace años ninguna señal que viene del espacio (o del mas alla) porque de alguna manera ya no se transmite sobre fotones o particulas mas grandes. O sea, que como no tenemos la tecnología como para sensar partículas más chicas entonces por eso (podría ser) que no podemos escuchar a los parientes de ET.

Después discute como codificar la información (usando la oscilación de los neutrinos) con propiedades de los neutrinos, tambien parece que plantean una especie de super rayos de neutrinos que tienen mucha energía (o masa) pero bue, mi super nulo entendimiento de la materia no me permite llegar ams alla.

Les recomiendo el paper, yo no lo terminé de leer, ni entendí un 10%. Lo que sí pude hacer, es acordarme por qué era eso de que quería estudiar física después de computación :D .

martes 18 de marzo de 2008

Teorias acerca de otras mentes

Disclaimer: Este NO es un post computronico pero debo advertirles que es un poco volado (al menos el tema que trata). Si esperan algo mas terricola salteen este post.

Un amigo me prestó un libro Titulado Sistemas emergentes. O qué tienen en común hormigas neuronas, ciudades y software. de Steven Johnson. El libro es una especie de introducción un tanto computrónica a la inteligencia colectiva, este término refiere a la inteligencia que (con un apropiado uso del término) emerge de la interacción de indivduos (personas/animales/programas) con comportamiento de cierta forma acotado y atómico. Un ejemplo recurrente en el libro son las hormigas.

Las hormigas forman colonias y poseen un comportamiento bastante elemental como individuos. Una hormiga puede decidir cargar comida y llevarla al hormiguero, recolectar cadáveres y llevarlos al área que la propia colonia designó para esto. El asunto es (brevemente, ya que no es el propósito del post) que la colonia como una unidad tiene comportamiento del cual los individuos que la componen (las hormigas) no son conscientes, ni siquiera saben que está'ocurriendo, y por supuesto, tampoco ejercen una conducta que lleve a estos resultados colectivos. En fin, esa es muy brevemente, una posible explicación mediante un ejemplo de lo que significa el comportamiento emergente.

Pero dentro del libro, descubrí un tema que realmente me interesa, y es la capacidad del ser humano de elaborar teorías acerca de otras mentes. Y me voy a detener un rato en contar de qué se trata esto con 2 ejemplos sacados del libro:

La prueba de los smarties (Perner, Leekam, & Wimmer, 1987)


Si clickean en la imagen la van a ver mas grande. Pero aca va al traducción: Una maestra muestra a un niño una caja de smarties (unas pastillitas de chocolate muy conocidas, que vienen en tubito) y le pregunta:
- "Qué hay dentro de la caja?", a lo que el niño responde
- "Smarties."
- "No. Hay un lápiz." Responde la maestra.
Entretanto la maestra le cuenta que otro adulto (Jose) se va a incorporar a la charla, y le dice que Jose no vió el contenido de la caja. Entonces le pregunta al niño:
- "Si le muestro el paquete a Jose y le pregunto 'Qué pensas que hay en la caja'? Que pensás que me va a contestar?

Y aquí la diferencia: Un chico de 4 años respondería (en general y correctamente) "Smarties" pues sabe que le va a pasar igual que a el, que pensó que había eso. En cambio, uno de 3 años contestaría "un lápiz", erróneamente. Esto es a lo que me refiero con las teorías sobre otras mentes.

Algunas definiciones que encontré sobre este tema:


  • "Teoría de la mente": Es la atribución de estados mentales (e.g. pensamientos, creencias, deseos, intenciones) a otros (y uno mismo)(Premack & Woodruff, 1978).



  • Ojo que acá "mindreading" es como se lo llama nomas, no es nada paranormal...

    El entendimiento de estados mentales (lectura de la mente/mindreading) nos permite explicar eventos observables (acciones) mediante la inferencia de entidades no observables (creencias, deseos, etc.)


  • También involucra entender que los estados mentales del otro pueden diferir de los de uno mismo, y también pueden diferir con la realidad (lo que sea que sea la realidad :D) (por ej: falsas creencias, intentos insatisfechos)


Bueno, podría seguir escribiendo pero tengo este post en el tintero hace demasiado tiempo asi que corto acá, y quiza hago otro post después.

Unos links que pueden ser útiles para entender de que se trata esto:

La pagina de Malinda Carpenter: Esta mujer hizo una cantidad notable de estudios sobre el comportamiento de los chimpances. Les recomiendo leer su material.

Un curso de M. Carpenter [slides]. Esta muy bueno este PPT es como un resumen de un montón de laburos de muchas personas.

Shared intentionality. Lo escribieron M. Tomasello y M. Carpenter. Hasta ahora, los que me parece hicieron mas laburo en este campo.

Psychological projection: La visión de Freud de este fenomeno (Wikipedia)

Theory of mind (Wikipedia)

Este es un breve escrito sobre la relación entre la teoría de otras mentes y los "False Beliefs"

The mathematics of human thought. Quiza no tenga mucho que ver con lo que escribí, pero me parece que puede interesarles si llegaron a leer hasta acá (en realidad no tiene NADA que ver).

RECURSION AND HUMAN THOUGHT: WHY THE PIRAHÃ DON'T HAVE NUMBERS

\g