Automágica: durante 2017 estoy trabajando bastante en Automágica, mi software para editar libros: Más información - Posts relacionados

La historia de Python: Y la serpiente ataca

El siguiente texto es una traducción del artículo And the Snake Attacks de Greg Stein publicado en http://python-history.blogspot.com/.

Y la serpiente ataca

Esta bien. Bueno. En 1995, cuando tuve mi primer contacto con Python, cualquier referencia a una "serpiente" estaba prohibida. Python tomaba el nombre de Monty Python, no del reptil. Si alguien estaba atacando, eran Los Caballeros que dicen Ni o posiblemente el Conejo de Caerbannog.

De cualquier manera, volviendo a 1994, yo estaba combatiendo con villanos ficticios en la escena LPMUD. La Web apenas estaba presente, y la banda ancha era algo inaduito. El entretenimiento de bajo ancho de banda estaba a la orden del día.

Esperá. Demos un paso atrás. 1979. Mi primera computadora fue una Apple ][, y uno de mis juegos favoritos era Colossal Cave. Inmediatamente después, conocí y jugué Zork. Yo estaba enamorado del concepto de ficción interactiva y de como una computadora podía llevarte a través de esas historias. Esos juegos me engancharon, y me llevaron a una vida de computadoras. (Y si, ¡te podes imaginar la emoción de reunirme con Don Woods casi 25 años mas tarde!)

Por eso la escena MUD me intereso bastante. Pero yo quería ayudar a hacer esos juegos. Conocí a John Viega, un compañero creador de LPMUD, programador y diseñador. Al mismo tiempo, el estaba trabajando en el Laboratorio de Graficos por Computadora de la Universidad de Virgina, en un sistema llamado Alice. Este sistema estaba pensado para gente poco conocedora, y querian un lenguaje facil de aprender para crear animaciones. Elijieron Python por su claridad, poder y simplicidad.

John era un fanático tremendo, y me encamino a Python. "Tenes que aprender esto!" "Bueno, bueno" decía yo. El lenguaje era fácil, pero poderoso. Podía hacer de todo, sin mucho fastidio.

Era febrero de 1995, y no volví atras.

No sabía en ese momento cuan trascendental seria Python en mi carrera y en mi vida. Gracias, Guido, por tu creación.

Traducido por Joaquín Sorianello.

Revisado por Juan José Conti.

Si encontrás errores en esta traducción, por favor reportalos en un comentario y los corregiremos a la brevedad.

Todas las traducciones de esta serie pueden encontrarse en La historia de Python.


Borrar todos los archivos de un directorio menos los que...

terMenos los que respetan un PATRON:

for a in ls | grep -v PATRON; do rm -fr $a; done

Menos los que contienen tar.gz en su nombre:

for a in ls | grep -v tar.gz; do rm -fr $a; done

Útil en muchas situaciones.

La línea de comandos es tu amiga.



8 de mayo: Python Day en Rafaela

El próximo sábado se va a desarrollar en la ciudad de Rafaela un Python Day, un día de charlas para que quienes no conozcan Python puedan acercarse al lenguaje. Vamos a tener muchas charlas introductorias y esperamos pueda aprovechar este evento tanto la comunidad universitaria como la ciudad en general.

http://www.pyday.com.ar/rafaela2010/

Por mi parte voy a estar colaborando con una charla nueva: Entendiendo Decoradores en Python. Esperemos salga bien :)

El Python Day es un evento organizado por PyAr con el apoyo de la Universidad Católica de Santiago del Estero, Departamento Académico Rafaela. El evento dura un día donde se darán pequeños cursos y charlas relacionadas a este lenguaje que de a poco va a haciendo su lugar entre los desarrolladores. Tenemos como intención hacer un espacio en donde cualquier persona interesada pueda acercarse para preguntar, aprender y experimentar con estas herramientas. El evento se llevará a cabo acá a partir de las 9:00 de la mañana. ¿Qué es Python? Python es un lenguaje de programación interpretado creado por Guido van Rossum en el año 1990. En la actualidad Python se desarrolla como un proyecto de código abierto, administrado por la Python Software Foundation. La última versión estable del lenguaje es la 2.6 (01 de octubre de 2008). Fuente: Wikipedia Quiero participar… ¿Qué Hago? Si lo que querés es asistir a las charlas, solo aparecete por la universidad el 8 de mayo a partir de las 09:00 y listo (por favor, si es posible, registrate previamente por web)



Siempre es bueno escuchar a Richard

El jueves después de trabajo, salimos César, Ceci, Mariano y yo hacia la ciudad de Rosario. Como se había anunciado, Richard Stallman, el padre del Software Libre y líder del proyecto GNU daría una charla abierta a las 19 en un auditorio del Politécnico de Rosario.

1rajornadagnulinuxrosariojuanjo

Recién cuando estaba manejando, caí en la cuenta de que la última y única vez que había oído hablar a RMS había sido 10 años atrás. Escribí por ese entonces:

...1º Jornada nacional de GNU/Linux, del 4 al 6 de Agosto de 2000, organizado por el LUGRo (Linux User Group de Rosario). Fue el primer gran evento del software libre y Linux realizado en nuestro país. La verdad es que estuvo muy buena, buena organización, puntualidad, espacio suficiente para que los concurrentes disfruten de un evento de esta envergadura, Y sin duda lo mejor de toda la jornada fue la presencia "estelar" de Richad M. Stallman (RMS)...

Tenía 15 años y solo un par de meses antes me había enterado qué existía otro sistema operativo, leído sobre las 4 libertades del software y escuchado sobre las personas que trabajaban en esta comunidad. Dos meses después de haber conocido esto, el hombre que había iniciado el movimiento venía a mi país, a menos de 200 km de mi casa a presentar sus ideas: no me lo quería perder.

Así fue que con un amigo viajamos a Rosario, nos instalamos en la casa de sus tías y participamos del primer gran evento de Software Libre  de latinoamérica, no teníamos ni idea de dónde estábamos, no teníamos ni idea de como usar Bash y apenas habíamos intentado instalar alguna distribución, a riesgo de quemar el monitor. Sin embargo, fue una gran decisión: conocí personas con la que me relaciono aún hoy, me motivó para seguir aprendiendo y me permitió formar parte de un movimiento de escala mundial sin precedentes.

rms_en_rosario

10 años después volvió a Rosario.

El día jueves 15 comenzó con la visita al rector de la UNR, el señor Darío Maiorana, quién se entrevisto con Richard en una charla de 45 minutos, si bien la misma estaba pactada para solo 5. En dicha charla, Maiorana se intereso por la utilización de Software Libre en la educación y acepto la sugerencia de ir adoptándolo en todas las facultades de la UNR. Luego de esta entrevista, Richard estuvo ante periodistas en una conferencia de prensa donde fue bombardeado con preguntas de todo tipo las cuales fueron contestadas puntualmente y sin ambigüedad. Por la tarde, fue recibido por el Intendente de Rosario, el señor Miguel Lifschitz. En la entrevista que mantuvieron Lifschitz le comento a Richard sobre los esfuerzos realizados por la Municipalidad para adoptar el uso de Software Libre en la administración pública. Al mismo tiempo, Richard le pidió al intendente que se publiquen en los sitios web de la municipalidad y las dependencias de la misma, un mensaje de que se utiliza Software Libre para el desarrollo y funcionamiento del sitio. Al final la charla se le entrego al intendente una copia del libro “Voto Electrónico, Los riesgos de una ilusiónHackerMás tarde, a las 19, se realizo la charla libre y gratuita en el auditorio de la Facultad de Ciencias Exactas, Ingeniería y Agrimensura donde 600 personas estuvieron presentes ante un discurso magistral sobre la filosofía libre. La respuesta del público fue muy buena y el evento termino con una larga cola de personas que quisieron inmortalizar su presencia junto a Stallman en fotos que serán publicadas en el sitio del LUGRo. El día viernes por la mañana se realizo una reunión en el Concejo Municipal de la Ciudad de Rosario donde se entrevisto con su presidente, Miguel Zamarini, el concejal Jorge Boasso y varias autoridades y concejales. Hubo especial interés de los concejales sobre la temática y Richard pudo explicar varios puntos importantes como la necesidad de utilizar Software Libre en la educación y el estado. También charlo con los concejales sobre los peligros de la utilización de sistemas electrónicos en los procesos de votación. Fuente: LUGRo

Puertas_traseras

Una de las primeras cosas que leí escritas por RMS fue El Derecho a Leer, un cuento corto de ciencia ficción en el que se previene de un posible futuro y se ve la importancia del Software Libre en una sociedad. Si no lo leiste, te invito a hacerlo.


La historia de Python: Los orígenes de las características "Funcionales" de Python

El siguiente texto es una traducción del artículo Origins of Python's "Functional" Features de Guido van Rossum publicado en http://python-history.blogspot.com/.

Los orígenes de las características "Funcionales" de Python

Yo nunca considere que Python esté fuertemente influenciado por lenguajes funcionales, no importa lo que la gente diga o piense. Estoy  mucho mas familiarizado con lenguajes imperativos, como C y Algol 68, y aunque hice a las funciones objetos de primera clase, nunca vi a Python como un lenguaje de programación funcional. Sin embargo, tiempo atrás, tenia claro que los usuarios querían hacer mucho mas con las  listas y las funciones

Una operación común en las listas fue la de mapear una función a cada elemento de una lista, creando una nueva lista. Por ejemplo:

def square(x):

    return x*x

vals = [1, 2, 3, 4]

newvals = []

for v in vals:

    newvals.append(square(v))

En los lenguajes funcionales como Lisp y Sheme, operaciones como esa son provistas como funciones incorporadas al lenguaje. Por lo tanto, los nuevos usuarios, familiarizados con este tipo de lenguajes se encontraron a si mismos implementando funcionalidades similares en Python. Por Ejemplo

def map(f, s):

    result = []

    for x in s:

        result.append(f(x))

    return result
def square(x):

    return x*x

vals = [1, 2, 3, 4]

newvals = map(square,vals)

Un detalle sutil del código de arriba es que a mucha gente no le gusto la idea de tener que definir una función separada para la operación  que estaban aplicando a cada elemento de la lista. Lenguajes como Lisp permitían funciones simplemente definidas "al vuelo", al hacer la llamada a la función map. Por ejemplo en Scheme, se pueden crear funciones anónimas y hacer operaciones de asignación en una expresión simple usando lambda, de esta forma:

(map (lambda (x) (* x x)) '(1 2 3 4))

Aunque en Python las funciones son objetos de primera clase, no tenia un mecanismo similar para para crear funciones anónimas.

A finales de 1993, los usuarios estaban proponiendo varias ideas para crear funciones anónimas y funciones para manipular listas como: map(), filter() y reduce().  Por ejemplo, Mark Lutz (autor de "Programming Python") envió este código, para una función que  crea funciones usando exec:

def genfunc(args, expr):

    exec('def f(' + args + '): return ' + expr)

    return eval('f')
# Sample usage

vals = [1, 2, 3, 4]

newvals = map(genfunc('x', 'x*x'), vals)

Entonces Tim Peters lo siguió con una solución que simplificaba un poco mas la sintaxis, permitiendo que los usuarios escriban:

vals = [1, 2, 3, 4]

newvals = map(func('x: x*x'), vals)

Estaba claro que había una demanda de esas funcionalidades. Sin embargo, al mismo tiempo,  me parecía demasiado "hacky" que se creen funciones anónimas como strings, que tenías que procesar usando "exec". Así que en enero de 1994, las funciones map(), filter(), y reduce() fueron agregadas a la biblioteca estándar. Ademas se creo el operador lambda para crear funciones anónimas (como expresión) con una sintaxis mas sencilla. Por Ejemplo:

vals = [1, 2, 3, 4]

newvals = map(lambda x:x*x, vals)

Esas incorporaciones representan una significativa  contribución de código fuente. Desafortunadamente no recuerdo el autor, y  no esta registrado en el SVN. Si es tuyo, ¡dejá un comentario!

Nunca estuve del todo conforme con el uso de la termino "lambda", pero a falta de una mejor y mas obvia alternativa, fue lo adoptado para Python. Después de todo, fue la elección del contribuyente anónimo, y en ese momento los grandes cambios requerían menos discusión que actualmente, para bien o para mal.

Lambda solo pretendía ser una herramienta sintáctica para definir funciones anónimas. Sin embargo, la elección de esa terminología tuvo muchas consecuencias inesperadas. Los usuarios acostumbrados a los lenguajes funcionales esperaban que la semántica fuese igual que en estos. Como resultado, encontraban que la implementación de Python no tenia demasiadas características avanzadas. Un detalle de lambda es que la expresión no puede referirse a variables en el ámbito circundante. Por  ejemplo, si tenes el siguiente código, la función map() se rompería, porque la función lambda se ejecutaría con una referencia indefinida a la variable "a".

def spam(s):

    a = 4

    r = map(lambda x: a*x, s)

Había formas de solucionar este problema, pero involucraban prácticas ilógicas como setear argumentos por defecto y pasar argumentos escondidos en la expresión lambda. Por ejemplo:

def spam(s):

    a = 4

    r = map(lambda x, a=a: a*x, s)

La solución "correcta" a este problema fue que las funciones interiores llevaran, implícitamente, referencias a todas las variables locales del entorno circundante referenciadas por la función. Esto es conocido como "closure", y es un aspecto esencial de los lenguajes funcionales. Sin embargo esa capacidad no se introdujo hasta la versión 2.2 (pero podia ser importada "desde el futuro" en Python 2.1).

Curiosamente, map, filter y reduce, que motivaron originalmente la introducción de lambda y otras características funcionales, fueron, en gran medida reemplazadas por las listas por comprensión y las expresiones generadoras. De hecho, la función reduce fue removida de las funciones incorporadas en Python 3.0 (Sin embargo no es necesario que me manden quejas por la quita de lambda, map o filter: se quedarán en su sitio :-)

Hay que tener en cuenta que, aunque yo no preveía a Python como un lenguaje funcional, la introducción de closures ha sido útil en el desarrollo de muchas otras características avanzadas de programación. Por ejemplo, ciertos aspectos de los nuevos estilos de clases, decoradores y otras funcionalidades dependen de esta característica.

Finalmente, aunque a lo largo de los años se introdujeron varias características de programación funcional, Python no tiene ciertas capacidades que se encuentran en los verdaderos lenguajes de programación funcional. Por ejemplo, Python no realiza ciertos tipos de optimizaciones (como recursión por la cola). En general, por la naturaleza extremadamente dinámica de Python, es imposible de hacer optimizaciones en tiempo de compilación como las de lenguajes como Haskell o ML. Y eso es bueno.

Traducido por Joaquín Sorianello.

Revisado por Juan José Conti.

Si encontrás errores en esta traducción, por favor reportalos en un comentario y los corregiremos a la brevedad.

Todas las traducciones de esta serie pueden encontrarse en La historia de Python.


La historia de Python: El Gran (o Enorme) Renombrado

El siguiente texto es una traducción del artículo The Great (or Grand) Renaming de Guido van Rossum publicado en http://python-history.blogspot.com/.

El Gran (o Enorme) Renombrado

Cuando creé Python, siempre lo imagine como un programa autónomo, enlazado ocasionalmente con bibliotecas de terceros. Por lo tanto, en el código fuente, se definían nombres globales con total libertad, como "object", "getlistitem", "INCREF" y muchos otros mas. Cuando la popularidad de Python se incrementó, la gente comenzó a pedir una versión "embebida", que fuera también una biblioteca enlazable a otras aplicaciones - de una forma similar en la que Emacs incorpora un interprete de Lisp.

Desafortunadamente, la integración se complicaba por conflictos entre los nombres globales de Python y los definidos por la aplicación - "object" era especialmente popular. Para lidiar con ese problemas se eligió una convención, por la cual todos los nombre globales comenzarían con "Py" o "_Py" (para los internos que tenían que ser globales por razones técnicas) o "PY" (para las macros).

Por razones de compatibilidad hacia atrás (ya que había muchos módulos de extensión de terceros) y para facilitar la transición a los desarrolladores del núcleo (que tenían los viejos nombres enquistados en sus mentes) hubieron dos fases. En la fase uno, el enlazador aceptaba los nombres antiguos, pero el código fuente usaba los nuevos, que eran traducidos a los antiguos usando muchas macros del pre procesador de C. En la fase dos, el enlazador veía los nuevos, pero, para beneficio de los módulos de extensión que todavía no habían sido portados, otro conjunto de macros traducía los viejos a los nuevos. En ambas fases el código podía incluir ambos, y funcionar correctamente.

Investigué un poco la historia en los logs de Subversion. Encontré la revisión r4583 del 12 de enero de 1995, que marca el comienzo de la fase dos, introduciendo los nuevos nombres a los archivos de encabezado. Pero en diciembre de 1996 el renombrado de los archivos fuentes ".c" seguia en marcha. En ese momento el renombrado parecía haber cambiado de nombre, los comentarios de registro lo llamaban "El Enorme Renombrado". Las macros de compatibilidad hacia atras fueron finalmente removidos en mayo de 2000, como resultado de la liberación 1.6. El comentario de r15313 celebra este evento.

La mayor parte del crédito se lo llevaron Barry Warsaw y Roger Masse, que participaron en la desagradable tarea de renombrar los contenidos de archivo, tras archivo, tras archivo... (aunque con la ayuda de un script). También ayudaron en la tediosa tarea de agregar test unitarios para gran parte de la biblioteca estándar.

Wikipedia hace referencia a un anterior Gran Renombrado, que aparentemente consistió en el renombre de grupos de USENET. Probablemente lo recordaba de forma inconsciente cuando lo llamé asi. También encontré algunas referencias a un Gran Renombrado posterior en Sphinx, el paquete utilizado para generar la documentación de Python. Zope también tuvo uno, y algunos debates recientes de Py3k utilizan el término para el cambio de PyString a PyBytes (aunque es menor, comparado con los otros).

Los Grandes o Enormes cambios de nombres son a menudo eventos traumáticos para las comunidades de desarrollo de software, porque requieren que los cerebros de los programadores sean recableados, la documentación reescrita y se complica la integración de parches creados antes, pero aplicados después (esto es especialmente problemático cuando existen ramas no renombradas).

Traducido por Joaquín Sorianello.

Revisado por Juan José Conti.

Si encontrás errores en esta traducción, por favor reportalos en un comentario y los corregiremos a la brevedad.

Todas las traducciones de esta serie pueden encontrarse en La historia de Python.


Huevos de Pascua caseros

Para estas Pascuas tenemos huevos caceros que hicieron mi hermana y mi mámá:

huevos_en_casa_002

huevos_en_casa_004

huevos_en_casa_005

Ahora hay que esperar hasta el Domingo de Resurrección para comerlos :)


Servidor SMTP para hacer pruebas

Cuando estamos programando, muchas veces necesitamos de un servidor de mails para que nuestro programa envíe todo tipo de mensajes: reportes de error, avisos, passowords luego de una gesistración, "contact us", etc...

Muchas veces no se tiene un servidor SMTP instalado en la computadora de desarrollo, pero si tenemos Python instalado, podemos ejecutar el siguiente comando y tener un servidor de prueba en el que en lugar de enviar los mails porla red, se imprimen por la salida standar:

python -m smtpd -n -c DebuggingServer localhost:25