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

Video de mi charla Ruby para programadores Python

Hoy encontré que los organizadores de PyConAr 2014 habían subido el video de mi charla Ruby para programadores Python. Se que subir todos los videos de una conferencia lleva tiempo y es mucho trabajo. Muchas gracias!

https://www.youtube.com/watch?v=NdvTsh_eYe8


Última reunion de RubyLit del 2014

Anoche fue la última reunión/juntada/meetup del grupo local de usuarios del lenguaje de programación Ruby. Hubo asado y pileta. También una charla a cargo de Eloy (que estaría bueno postee en algún lado así no queda solo en nuestro recuerdo).

A continuación, las fotos de rigor. Como el que toca nunca baila, el que saca fotos no es retratado (al menos que usemos el modo automático).

[gallery ids="5236,5235,5234,5233,5232,5231,5212,5213,5230,5229,5228,5227,5226,5225,5224,5223,5222,5221,5220,5219,5218,5217,5215,5214,5211,5210,5209,5208,5237"]

[embed]https://www.youtube.com/watch?v=x9cF9kqbWKc[/embed]


Aprendiendo Ruby: desde Python

Hace un mes y medio estoy estudiando y trabajando con el lenguaje de programación Ruby. Después de unos cuatro años con Python y luego más de tres con PHP/JS, el cambio se sintió como una ráfaga de aire fresco y en esa ráfaga reconocí aromas del pasado.

El primer día que use Ruby, leí este artículo:

https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/

Es bastante incompleto.

Ruby es muy parecido a Python. Pero hay muchos detalles que te pueden morder. Mientras iba estudiando, fui haciendo una lista de los que me mordían. Esa lista se convirtió en mi primer charla de Ruby.

El jueves 7 de agostó se llevó a cabo la tercera meetup del año de RubyLit (el grupo de usuarios de Ruby local). En esta presenté una charla titulada Aprendiendo Ruby: desde Python. Las slides de la presentación fueron generadas en base a un notebook IPython usando el kernel IRuby y me permitieron mostrar código vivo dentro de cada slide.

Este es el notebook que usé el día de la charla: http://nbviewer.ipython.org/github/jjconti/aprendiendo-ruby/blob/rubylit_meetup/RubyDesdePython.ipynb

Y esta la versión actualizada con los comentarios que surgieron durante la charla y que voy mejorando con el tiempo: http://nbviewer.ipython.org/github/jjconti/aprendiendo-ruby/blob/master/RubyDesdePython.ipynb


Video de la charla sobre Sysadmins de cballard en act_as_rubylit 2010

La semana pasada me enteré que viernes y sábado era act_as_rubylit 2010, la segunda edición de un evento sobre Ruby organizado por amigos aca en Santa Fe. Conozco muy poco de Ruby, por lo que varias de las charlas del programa no me iba a servir realmente, pero una me llamó la atención: "Sysadmin: a la sombra del desarrollo", por César Ballardini.

César es un gurú local, nos inició en GNU/Linux a la mayoría de los sub 30 que conozco de la comunidad santafesina y es un gran tipo. Me hice un hueco entre el trabajo y un curso de maestría para llegar. 3:50 estaba manejando hasta la FICH, lugar dónde se realizaba el evento. Encontré el Aula Magna a eso de las 4:05 cuando la charla recién empezaba.

Algo que realmente envidio de las universidades de otros países es que todas las lectures se graban en video. Aca no. No tenemos la infraestructura y organizarse para hacerlo siempre es un inconveniente. Antes de salir había leído en la lista de Ruby Litoral que iban a filmar las charlas, pero más adelante en el mismo hilo el camarógrafo se arepentía.

Llegué con la secreta intensión de filmar la charla con mi celular. La verdad, se la banca. Tiene muy buena calidad y memoria para almacenar, pero falla la batería. Puedo grabar a lo sumo una charla antes de que se termine. Tengo que pensar en algún esquema en el que tenga el celu enchufado a la vez que filmo; y por supuesto, comprarme urgente un brazo robótico (ok, un porta GPS para el auto) que pueda poner a sostener la cámara al grabar. El brazo humano se me acalambró :)

Sin más preámbulos, les dejo la filmación y las slides que me envió César.

acts_as_rubylit 2010 - Sysadmin: a la sombra del desarrollo - César Ballardini from Orfx Sch on Vimeo.

Gracias Orfi por encargarte de editarlo y subirlo.


Primera vez con Ruby

El viernes por la tarde salí del trabajo y me fuí a escuchar la charla de César Ballardini, El modelo de objetos de Ruby, reflexiones sobre la reflexión. La daba en el marco del evento acts_as_rubylit, el cual se llevó a cabo en la Facultad de Ingeniería y Ciencias Hídricas, Universidad Nacional del Litoral de la ciudad de Santa Fe.

Nunca antes vi nada de Ruby. Bueno, casi, pero la última vez no pasé del Hola Mundo!juanjo_ruby_800

César empezó su charla explicando la Paradoja de Blub, de Paul Graham. Blub es un lenguaje de programación hipotético. No es el lenguaje de programación más poderoso, pero tampoco es Cobol o lenguaje de máquina. Un programador Blub está parado más o menos en el medio de la ladera de una montaña; hacia abajo están los lenguajes menos poderosos que Blub, él se da cuenta de esto, por supuesto, a todos esos lenguajes le faltan distintas características que nuestro programador usa en Blub para resolver sus problemas. En cambio, cuando mira para arriba (y ve lenguajes más poderosos que Blub), en realidad no se da cuenta que está mirando hacia arriba, simplemente piensa que está mirando a unos locos, hippies de pelos parados haciendo cosas raras. Cuando los programadores que están más arriba en la montaña miran hacia Blub se pregunta, ¿cómo puede alguien estar usando Blub? Ni siquiera tiene la funcionalidad X tan útil para resolver Y!

Por inducción se concluye que solo el programador que esté en la punta de la montaña, es decir el que conoce el lenguaje más poderoso, es capaz de distinguir las distintas posibilidades que se tienen con diferentes lenguajes. El programador Blub no puede verlo, por lo que solo sabe pensar en Blub, no se a enfrentado a problemas que le permitan pensar diferente.

La moraleja de la historia es que uno debería aprender lenguajes que lo obliguen a cambiar su forma de pensar y de resolver problemas (Alan J. Perlis).

Con esto terminó la primera parte de la charla, luego César hizo una explicación de pizarrón sobre qué es la Programación Orientada a Objetos ( y escribió con su fibrón: un objeto tiene Identidad, encapsula Estado y define Comportamiento). Según César, es un error que en la enseñanza de la POO se empiece por las Clases. ¿En qué parte de "Programación Orientada a Objetos" dice "Clase"? Las clases son solo una forma de crear objetos, pero hay muchas otras. Por ejemplo, existen muchos lenguajes OO basados en prototipos, como JavaScript.

Después de haber shockeado a la audiencia desarrollando estas dos ideas en un tono casi de declaración de principios, estábamos listos para ver cómo el Modelo de Objetos de Ruby podía cambiar nuestra forma de pensar.

Lo que sigue no son los ejemplos exactos que desrrolló César con su notebook, solo los que recuerdo. Mezclo los recuerdos de su sesión interactiva de Ruby con mi propio camino de aprendizaje, que arranca ni siquiera teniendo el intérprete instalado :)

Para empezar los ejemplos, tipeó en la terminal

irb

. Hice lo mismo, pero no estaba instalado, por lo que instalé ese paquete y presté atención a sus dependencias:

juanjo@fenix:~$ irb

El programa «irb» no está instalado actualmente. Puede instalarlo escribiendo:

sudo apt-get install irb

bash: irb: orden no encontrada

juanjo@fenix:~$ sudo apt-get install irb

[sudo] password for juanjo:

Leyendo lista de paquetes... Hecho

Creando árbol de dependencias

Leyendo la información de estado... Hecho

Se instalarán los siguientes paquetes extras:

irb1.8 libreadline-ruby1.8 ruby1.8

Paquetes sugeridos:

ruby1.8-examples rdoc1.8 ri1.8

Se instalarán los siguientes paquetes NUEVOS:

irb irb1.8 libreadline-ruby1.8 ruby1.8

0 actualizados, 4 se instalarán, 0 para eliminar y 0 no actualizados.

Necesito descargar 119kB de archivos.

Se utilizarán 664kB de espacio de disco adicional después de esta operación.

¿Desea continuar [S/n]?

Des:1 http://ar.archive.ubuntu.com jaunty-updates/main ruby1.8 1.8.7.72-3ubuntu0.1 [24,0kB]

Des:2 http://ar.archive.ubuntu.com jaunty-updates/universe libreadline-ruby1.8 1.8.7.72-3ubuntu0.1 [10,4kB]

Des:3 http://ar.archive.ubuntu.com jaunty-updates/universe irb1.8 1.8.7.72-3ubuntu0.1 [79,1kB]

Des:4 http://ar.archive.ubuntu.com jaunty/universe irb 4.2 [5138B]

Descargados 119kB en 2s (58,0kB/s)

Seleccionando el paquete ruby1.8 previamente no seleccionado.

(Leyendo la base de datos ...

248649 ficheros y directorios instalados actualmente.)

Desempaquetando ruby1.8 (de .../ruby1.8_1.8.7.72-3ubuntu0.1_i386.deb) ...

Seleccionando el paquete libreadline-ruby1.8 previamente no seleccionado.

Desempaquetando libreadline-ruby1.8 (de .../libreadline-ruby1.8_1.8.7.72-3ubuntu0.1_i386.deb) ...

Seleccionando el paquete irb1.8 previamente no seleccionado.

Desempaquetando irb1.8 (de .../irb1.8_1.8.7.72-3ubuntu0.1_all.deb) ...

Seleccionando el paquete irb previamente no seleccionado.

Desempaquetando irb (de .../apt/archives/irb_4.2_all.deb) ...

Procesando disparadores para man-db ...

Procesando disparadores para menu ...

Configurando ruby1.8 (1.8.7.72-3ubuntu0.1) ...

Configurando libreadline-ruby1.8 (1.8.7.72-3ubuntu0.1) ...

Configurando irb1.8 (1.8.7.72-3ubuntu0.1) ...

Configurando irb (4.2) ...

Procesando disparadores para menu ...NAME

   irb1.8 - interactive ruby

SYNOPSIS

   irb [options]

DESCRIPTION

irb stands for ‘interactive ruby’. irb is a tool to execute interactively ruby expressions read from stdin. Use of irb is easy if

   you know ruby.  Executing irb, prompts are displayed as follows. Then, enter expression of ruby. A input is executed  when  it  is

   syntacticaly completed</strong>.

Ahora si puedo empezar!

Objetos y mensajes

Un lenguaje OO consta de objetos y mensajes entre objetos. Algunas veces los mensajes están un poco camuflados, pero siempre están ahí:

irb(main):001:0> 1 + 2

=> 3

irb(main):002:0> 1.+ 2

=> 3

irb(main):003:0> 1.+(2) # para los lisperos que extrañan los paréntesis

=> 3

Identidad

Enviando el mensaje

object_id

, podemos preguntarle su identidad a un objeto:

irb(main):001:0> 1.object_id

=> 3

irb(main):002:0> "hola".object_id

=> -605926728

Clases

Enviando el mensaje

class

a un objeto, podemos preguntarle quién es su clase:

irb(main):005:0> 1.class

=> Fixnum

irb(main):006:0> 1.class.class

=> Class

irb(main):007:0> 1.class.class.class

=> Class

Podemos ver que la clase Fixnum es una instancia de la clase Class; y la clase Class también es instancia de la clase Class.

Enviando el mensaje

superclass

a una clase, podemos saber cual es su superclase, es decir, qué clase extiende.

irb(main):010:0> 1.class.superclass

=> Integer

irb(main):011:0> 1.class.superclass.superclass

=> Numeric

irb(main):012:0> 1.class.superclass.superclass.superclass

=> Object

Luego, la clase de Object es obviamente Class, pero... ¿cuál es su superclase?

irb(main):019:0> 1.class.superclass.superclass.superclass

=> Object

irb(main):020:0> 1.class.superclass.superclass.superclass.superclass

=> nil

Creo recordar que en SmallTalk también era así. Parece un chiste de los diseñadores :) nil ni siquiera es una clase:

irb(main):021:0> 1.class.superclass.superclass.superclass.superclass.superclass

NoMethodError: undefined method `superclass' for nil:NilClass

    from (irb):21

    from :0

irb(main):022:0> 1.class.superclass.superclass.superclass.superclass.class

=> NilClass

irb(main):023:0> 1.class.superclass.superclass.superclass.superclass.class.superclass

=> Object

irb(main):024:0> 1.class.superclass.superclass.superclass.superclass.class.class

=> Class

y la jerarquía de clases se cierra. Es para leer tranquilo y pensarlo.

El resto de la charla abarcó varias cosas más, pero creo que sería demasiado para desarrollarlo en un post y lo que mostré ya es suficiente para abrirle el apetito a los que estén buscando algún lenguaje para aprender y les produzca un cambio en su forma de pensar :). Si César postea sus ejemplos, los voy a estar referenciando desde aquí o voy a intentar hacer uno o dos posts más.

Gracias al Grupo de Usuarios de Ruby del Litoral por organizar el evento!


Herramientas

Los programadores que usamos Python, no dependemos de herramientas externas al lenguaje en la forma que se depende de ellas cuando se usa un lenguaje como Java.

I can't tell you how many times I've heard people say they wouldn't use Ruby because it lacks automated refactoring tools. Ruby doesn't actually need them in the way Java does; it's like refusing to switch to an electric car because there's no place to put the gasoline. But programmers are a stubborn bunch, and to win them over you have to give them what they think they want.

http://steve-yegge.blogspot.com/2007/02/next-big-language.html


Primer experiencia con Ruby

El jueves a la noche, bolso en mano ya que partía para Córdoba al día siguiente, participé de una reunión de RubyLit, el grupo de usuarios de Ruby del Litoral. Muchos ya eran cocidos y a otros los conocí ahí, la pasamos bárbaro, comimos pizza y charlamos mucho. Mi problema radicaba en que nunca había escrito un programa en este lenguaje de programación, por lo que media hora antes de salir para el evento seguí este tutorial on line que te enseña lo básico en 15 minutos (digamos que lo suficiente como para no pasar verguenza :D), les dejo el link para los que quieran empezar a probar este lenguaje:

http://tryruby.hobix.com/

Y, por supuesto, la foto de rigor:


Serpientes y rubíes

Ja! Levanto el guante del desafío que plantea Gastón en su blog:

juanjo@albus:~$ python

Python 2.5.1 (r251:54863, Mar 7 2008, 03:41:45)

[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

1. Dado un array con nombres de persona eliminar los nombre que comienzan con “Pe”:

>>> nombres = ['Pablo', 'Raul', 'Pedro', 'Pepe', 'Ariel', 'TerePe']

>>> [n for n in nombres if not n.startswith("Pe")]

['Pablo', 'Raul', 'Ariel', 'TerePe']

  1. Verificar si el mismo array contiene el nombre “Raul”:

>>> "Raul" in nombres

True

  1. Generar un string con todos los nombres unidos por “-”:

>>> "-".join(nombres)

'Pablo-Raul-Pedro-Pepe-Ariel-TerePe'

  1. Generar un segundo array con los nombres todos en minúsculas ordenado alfabéticamente:

>> sorted([n.lower() for n in nombres])

['ariel', 'pablo', 'pedro', 'pepe', 'raul', 'terepe']

  1. Desordenar el array:

>>> from random import shuffle

>>> shuffle(nombres)

>>> nombres

['Pepe', 'Pedro', 'Ariel', 'Raul', 'Pablo', 'TerePe']

  1. Averiguar si la lista siguiente tiene números pares:

>>> bool([n for n in numeros if n % 2 == 0])

True

  1. Averiguar si toda la lista son números pares:

>>> len(numeros) == len([n for n in numeros if n % 2 == 0])

False

  1. Obtener el producto de una lista de números:

>>> f = lambda x,y: x*y

>>> reduce(f, numeros)

120

  1. Obtener el factorial de 9999:

>>> reduce(f, xrange(1, 10000))

# la respuesta tiene 35656 caracteres.

  1. Averiguar si dos arrays son iguales:

>>> [1,2,3,4] == [1,2,3,4]

True

¿Conclusiones? Creo que las listas por comprensión de la serpiente le gana a los .metodos del rubí. Pero en 6 y 7 perdemos feo :-/ ¿Algún pythonista que reescriba esos ejercicios?