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

Lista circular en Python

Estoy haciendo un juego inspirado en el Juego de la Vida. A modo de bonus-track también se podrán ver algunos patrones del tradicional juego de cero jugadores. Algunos patrones se cargarán de archivos en la computadora y se pondrán a disposición de usuario para que los examine. Para una mayor comodidad va a haber un botón "atrás" (>).

Si lo anterior fuera un enunciado en un examen de Algoritmos y Estructuras de Datos, ¿cual sería la estructura de datos más adecuada para mantener esa información? Sin dudas una lista circular. No sería muy agradable llegar al último patrón, apreatar "siguiente" y que no pase nada. Quiere que cuando esté parado en el último elemento y apriete "siguiente", me muestre el primero.

Una lista circular es una lista lineal en la que el último nodo a punta al primero.

Las listas circulares evitan excepciones en la operaciones que se realicen sobre ellas. No existen casos especiales, cada nodo siempre tiene uno anterior y uno siguiente.

El artículo va a ser un poco largo, va apasar por algunos lenguajes de programación y va a evaluar distintos enfoques. Pero adelanto que va a terminar en una implementación de una lista circular en Python basada en el manejo de índice.

Enfoque C

Conocí este tipo de estructura en la materia que mensioné más arriba. Usabamos C como lenguaje de programación, así que fué el primer lenguaje dónde implementé una. A esta estructura de datos se la llama dinámica por que puede crecer indefinidamente alocando porciones de memoria de la computadora, sin necesidad de que estas estén físicamente contiguas.

Supongamos que la lista circular va a ser de enteros (por simplicidad). Se necesitarán 1) una estructura Nodo más o menos así:


typedef struct nodo {

   int dato;

   struct nodo *next;

} nodo;

Node with next pointer

o así:


typedef struct nodo {

   int dato;

   struct nodo *next;

   struct nodo * prev;

} nodo;

Node with next and prev pointers

Las flechas de los dibujos son punteros (direcciones en memoria) a otros nodos, mediante los cuales estos se van a ir uniendo, bien para formar una lista lineal o para formar una lista como las que nos interesan, cuando el último nodo con su puntero next apunte al primero.

2) una forma de solicitar memoria para un nuevo nodo:


nodo * pnodo = (nodo *)malloc(sizeof(nodo));

y 3) manejar punteros; un puntero a la lista, uno a la posición actual, uno a la anterior a la actual.

Si bien usar estos elementos de la forma correcta is not rocket science, requiere cierto conocimiento de un nivel más bajo (por más cercano al hardware) de lo que los modernos lenguajes dinámicos nos tiene acostumbrado (de hecho en los lenguajes de más alto nivel, este problema ya viene solucionado).

Para solucionar mi problema voy a preferir una solución con un poquito más de nivel de abstracción, pero creo que este enfoque a modo de introducción sirve para ir poniendo las piezas en el tablero.

Enfoque Haskell

En la pasada CafeConf fuí a una charla de mi amigo Pupeno sobre lenguajes de programación, allí vi algo que no conocía. En Haskell, nos mostro este concepto: Listas infinitas. Lenguajes como este tiene una propiedad llamada Lazyness

En programación, lazy evaluation, también llamada delayed evaluation, es la técnica que consiste en retrasar un cálculo computacional hasta el momento en que su resultado se necesite.

Por ejemplo:


x = calculo_intensivo(1000)

no necesita ser evaluado hasta que por ejemplo se haga:


print x + 1

Esta propiedad permite entre otras cosas crear listas infinitas (de nuevo un un pseudo código muy parecido a Python):


miListaInfinita = ListaInfinita(arg)

Claro que no vamos a poder hacer:


print miListaInfinita

O podríamos pero la operación no terminaría nunca, pero si prodríamos hacer:


print miListaInfinita[100004]

Y dependiendo de la clase de lista infinita que sea se necesitarán calcular los anteriores términos (en el caso de por ejemplo la lista de Fibonacci) o no (en una lista de todos 0).

Bien. A dónde estamos yendo con todo esto? Al fin de cuentas yo estaba buscando una lista circular y me encontré con listas infinitas. La conclusión es que una lista circular puede verse como una lista infinita ya que:

a) Siempre puedo pedirle un elemento siguiente sin que se agoten.

b) Puedo pedir el elemento 100004º y también obtenerlo (luego de algunas vueltas, por su puesto).

Así sería una lista crcular (infinita) en Haskell:


cycle [1,2,3]

o


a = [1,2,3|a]  

Bien, puedo hacer esto en Python? Con poco esfuerzo, con mis conocimientos y en una tade de lluvia, yo no. Salvo en algunas excepciones, la evaluación en Python no es Lazy, sino Eager o estricta. De todas formas algunos links por si alguien quiere seguir investigado en esa línea:

<li>Generator expressions</li>

<ul>

<li><a href="http://gnosis.cx/publish/programming/charming_python_b13.html">http://gnosis.cx/publish/programming/charming_python_b13.html</a></li>

<li><a href="http://www.python.org/dev/peps/pep-0289/">http://www.python.org/dev/peps/pep-0289/</a></li>

<li><a href="http://docs.python.org/ref/genexpr.html">http://docs.python.org/ref/genexpr.html</a></li>

</ul>
Juanjo-ar-stafe> is python lazy? Habbie> python allows programmers to be lazy Habbie> and that's what matters itchi> Juanjo-ar-stafe: Are you not lazy?? :-)

Ya que agoté esta rama, backtracking y adelante!

De todas formas esto se trataba de Python, no?

Yo estaba cometiendo el error en pensar en el término Lista circular doblemente enlazada, lo cual tiene sentido en C, pero no en Python. Yo no se como están implementadas las estrcturas de datos que provee el lenguaje y sin embargo puedo usarlas sin problemas. La diferencia en que la lista en cuestión sea doble o simplemente enlazada es solo una cuestión de optimización y no de funcionalidad. Cito una parte de uno de los mails que intercambiamos con Pupeno al respecto y que me ayudó mucho a encarar mejor el problema:

El hacer una lista doblemente enlazada nos permite agregar funciones sobre la lista que la simplemente no nos permite y/o hacer que ciertas funciones sean mas rapido. En una lista podes hacer l.next() y tambien podes hacer l.prev() la diferencia es que prev() en una lista doblemente enlazada es constante en el tiempo O(1) y en una simple seria O(n) donde n es la cantidad de items en la lista (probablemente tenga un promedio de O(n/2)). Ahora, me parece que lo que vos necesitas realmente es que sea circular, no es cierto?

Ahora que ya se lo que necesito, puedo poner manos a la obra. ¿Qué necesito? Un objeto que sea una secuencia mutable de elementos al que siempre que quiera pueda decirle next() o prev() y me de el elemento siguiente o anterior al actual.

Lo primero en lo que podría pensar es en crear objetos Nodo y hacer una implementación C-like, usando referencias a objetos en lugar de punteros a estructuras pero.. creo que esto sería:

a) relativamente complicado, casi tanto como sería hacerlo en C. Más si mis objetivos de eficiencia, robustez y usabilidad son altos.

y b) un desapovechamiento de lo que ya está hecho (si llegó hasta aca, por favor siga leyendo).

Una de las estructuras de datos más poderosas que vienen con Python es list, algunos ejemplos rápidos:


>>> li = [1, "hola", 5, 8.5]

>>> li[3]

8.5

>>> li[:3]

[1, 'hola', 5]

>>> li[:]

[1, 'hola', 5, 8.5]

>>> li[-2]

5

>>> li[-2:]

[5, 8.5]

>>> li + ["muy bien"]

[1, 'hola', 5, 8.5, 'muy bien']

Robusta, eficiente y muy usable.

Como pueden ver el manejo de índices le da mucha flexibilidad y es uno de los elementos más usados que constituyen el lenguaje. ¿Cuanto tiempo me tomaría hacer una implementación desde cero así solo por encapricharme con usar referencia circular? Paso.. voy a extender list y a agregar la funcionalidad que requiero mediante el manejo de índices.

Primer implementación

Esta fue la priemr implementación que hice: circular.py

Enseguida mandé un mail a mi lista preferida de Python para pedir opiniones, de seguro tenía muchas cosas por mejorar.

Review 1

Enseguida Manuel Quiñones me mandó algunas optimizaciones (antes hacía llamadas recursivas de los métodos) + pruebas hechas con DocTest: circularDocTest.py

Mezclé sus optimizaciones con mi código original (seguí sin usar una forma automatizada de testeo) para seguir discutiendo en base a este: circular-r1.py

Review 2

Lucio Torre me apuntó este comportamiento no previsto:


>> Circular([]).prev() == Circular([None]).prev()

True

Estaba retornando None cuando se solicitaba un elemento de una lista vacía. Decidí que sería mejor lanzar una excepción en ese caso: circular-r2.py

Review 3

John Lenton se tomó el trabajo de reescribir la clase en una foma mucho más compacta (gacias!). Yo estaba considerando como especiales casos que en realidad no lo eran. Además me mostró como usar test de unidad en Python, cosa que nunca había hecho: circular-r3Tested.py

Review 4

Luego de unas sugerencias de estilo decidí hacer un mejor uso de los nombres de las variables (y métodos). También agregué una sugerencia muy interesante de Gabriel Genellina, en lugar de hacer:


if self == []:

para saber si la lista está vacía, usar:


if not self:

que es más rápido.

También permito que se contruya lal ista circular sin parámetros (lo que da una list circular vacía): circular-r4Tested.py

Review 5

Me deshago de la burocracia que tiene la clase y confío más en el programador (chau verificación de rango, chau set/get inncecesarios): circular-r5Tested.py

Este es el hilo en la lista de PyAr: http://mx.grulic.org.ar/lurker/message/20070221.033607.fd125b8e.es.html

Algunas referencias


El estilo HP

Cómo Bill Hewlett y yo creamos nuestra empresa es el subtítulo de este libro. Es uno de los que estuvo saliendo en la colección Grandes Casos Empresariales de La Nación y fué escrito por David Packard.

Lleno de anécdotas, es un libro lindo de leer. Empieza con recuerdos de Pueblo, en Stanford, la ciudad natal de David Packard y sigue con su paso por la universidad dónde conoce a Bill Hewlett. Cuenta los inicios de la empresa, el apoyo de un profesor, el primer garaje, experiencias laborales previas y como de apoco la empresa fue creciendo.

En la página 96, dentro del capítulo 5 se listas los objetivos que se plantearon como empresa. Recordemes que la empresa nació a finales de la década del 30, algunos de los objetivos son totalmente vanguardistas para la época como darles a los empleados la oportunidad de compartir los beneficios de la empresa, o la responsabilidad con la sociedad.

Se los listo a continuación (esta es una versión más pulida publicada en 1966):

  1. El Beneficio: Reconocer que el beneficio es la mejor medida individual de nuestra contribución a la sociedad y la fuente última de nuestra fuerza corporativa. Debemos intentar obtener el máximo beneficio posible sin dejar de lado los demás objetivos.

  2. Los clientes: Luchar por la mejora continua en términos de calidad, utilidad, y valor de los productos y servicios que ofrecemos a nuestros clientes.

  3. El campo de interés: Concentrar nuestros esfuerzos en buscar continuamente nuevas oportunidades de crecimiento pero limitando nuestra participación a campos en los que tengamos aptitudes y a los que podamos contribuir.

  4. El crecimiento: Impulsar el crecimiento como medida del fuerza y requicito para la supervivencia.

  5. Los empleados: Darles oportunidades laborales a los empleados de HP que incluyan la oportunidad de compartir el éxito de la empresa que ellos han hecho posible. Darles seguridad laboral basada en la actividad y hacer que se puedan sentir personalmente satisfechos por el cumplimiento de su trabajo.

  6. La organización: Crear un ambiente organizacional que fomente la moticavión personal, la iniciativa y la creatividad, y un amplio grado de libertad para trabajar hacia los objetivos y metas establecidas.

  7. La ciudadanía: Satisfacer nuestra obligación como buenos ciudadanos haciendo aportaciones a la comunidad y a las instituciones de nuestra sociedad que crean el entorno en el que operamos.

Ahora voy a intentar encontrar pasajes en el libro que reflejen cada uno de esos objetivos:

El Beneficio

En HP (como en otras empresas), las personas, los materiales, las instalaciones, el dinero y el tiempo son los recursos disponibles para llevar a nuestro negocio. Aplicando nuestras habilidades, convertimos dichos inputs en productos y servicios útiles. Si hacemos un buen trabajo, los clientes pagan más por nuestros productos que la suma de los costes de producción y distribución. Esta diferencia, nuestro beneficio, representa el valor que añadimos a los recursos que utilizamos.

Los clientes

La principal clave del éxito de las operaciones de HP es el trabajo que hacemos para satisfacer las necesidades del cliente. Alentamos a cada persona que forma parte del organización para que piense constantemente en cómo afecta lo que hace en el servicio al cliente.

El capo de interés

A veces nos encontrábamos con oportunidades de desarrollar productos que incluían nueva tecnología en áreas dónde no teníamos potencial comercial. Se los vendíamos a empresas que sí lo tuvieran.

El crecimiento

A lo largo de los años Bill y yo hemos especulado muchas veces sobre el tamaño ideal de la empresa. No creemos que el crecimiento sea importante por sí mismo. Sin embargo, el crecimiento continuo era esencial para nosotros para poder alcanzar nuestros objetivos, y para mantenernos competitivos.

Los empleados

El principio subyacente de las políticas de personal de HP es compartir, compartir las responsabilidades de definir y conseguir las metas, compartir la propiedad de la empresa a través de planes de adquisición de acciones, compartir los beneficios, compartir las oportunidades de desarrollo tanto personal como profesional e, incluso, compartir el peso creado por las ocasionales crisis en el negocio.

La organización

La política puertas abiertas apunta a construir confianza mutua y comprensión, y a crear un ambiente en el que las gente se sienta libre para expresar sus ideas, opiniones, problemas y preocupaciones. Esta política anima a los empleados que tengan problemas, ya sean tanto de tipo profesional como personal, a que lo hablen con el directivo pertinente. Todo el personal de HP, incluido el director general, trabajan en oficinas abiertas. Esta disponibilidad tiene el inconveniente de que siempre te pueden interrumpir, pero en HP creemos que las ventajas de la accesibilidad superan con creces sus inconvenientes.

La ciudadanía

Actualmente HP opera en muchas conunidades distintas de todo el mundo. Inculcamos a nuestra gente que cada una de estas comunidades debería estar mejor con nuestra presencia. Esto quiere decir ser sensible a las necesidades e intereses de la comunidad.

Hay varias anédotas en libro lindas de leer, se las dejo como comentarios más tarde.


Python multiplataforma: os.path.join()

Por lo general cuando se habla de multiplataforma se hace sólo referencia al hecho de que cierto código pueda ser ejecutado en diferentes plataformas (léase en la mayoría de los casos hardware + SO) sin tener que ser portado, es decir que se realicen cambios importantes en este.

En el caso de los programas escritos en un lenguaje compilado es necesario construir un archivo ejecutable (un archivo que contiene código binario) específico para cada plataforma en la que se lo quiera correr. Esto no sucede con los lenguajes interpretados, dónde la cuestión es más simple. Un programa escrito en un lenguaje interpretado será multiplataforma si el intérprete del lenguaje en el que está escrito lo es (siempre y cuando no se haga uso de alguna característica específica de alguna plataforma). Al fin de cuentas, el archivo ejecutable de un programa interpretado no será más que un archivo de texto plano.

Pero puede haber algo más...

Hace poco, usando Python, descubrí algo que me hizo pensar un poco más sobre las características que debe brindar un lenguaje de programación para que lo consideremos multiplataforma. Piensen lo siguiente: archivos. Un programa suele hacer un uso intenso de archivos (de configuración, imágenes, para guardar datos y luego recuperarlos, etc..). Lo que nos lleva a pesar: ¿cómo encuentra un programa esos archivos? Probablemente el lenguaje de programación que estemos utilizando nos proveerá de una función para abrir archivos[1] que recibiera como parámetros el nombre del archivo y la forma (modo) en que queremos abrirlo (para lectura, para escritura, crearlo si no existe, en modo binario, etc..). Dejemos de lado el modo y pensemos en lo que significa el nombre del archivo, ¿sería config.php un nombre válido? ¿Lo sería files/config.php? ¿Y que tal /var/www/prog/files/config.php? Me animo a darles una alternativa más en la que pensar: C:\wamp\www\prog\files\config.php.

Con esto quiero expresar que el parámetro nombre puede ser tanto un nombre absoluto para el archivo como uno relativo. config.php y files/config.php son ejemplos de nombre relativo mientras que /var/www/prog/files/config.php y C:\wamp\www\prog\files\config.php lo son de nombres absolutos. En mi opinión lo más cómodo es utilizar nombres relativos al directorio dónde se encuentra el archivo ejecutable, pero tenerlos todos juntos en el primer nivel de este sería engorroso y poco elegante.

Uno puede pensar en tener una organización de directorios que le permita trabajar cómodo a la vez que les permite a otros encontrar fácilmente lo que esta buscando. Por ejemplo:

data/ : para guardar los datos usados por el programa.

data/imgs/ : para las imágenes

data/sounds/ : para los sonidos

config/ : para los archivos de configuración

etc..

Y aquí es justamente dónde surge el problema cuya solución quería comentar.

Habrán notado en los ejemplos de más arriba hay una sutil diferencia. En los primeros se separa los nombres de los directorios con la barra "/" y en otros con "\". El primero es el separador de directorios utilizado en GNU/Linux (y en UNIX en general), mientras que el segundo es el utilizado en MS Windows. Y este es solo un ejemplo, pero pueden existir muchas diferencias (en este punto) de plataforma en plataforma, algunas que incluso no conozcamos u otras que ni siquiera han surgido aún!!

Usando la función os.path.join, un pathname que funcione correctamente en la plataforma dónde el programa sea ejecutado será creado[2].

La forma de usarla que he siembre visto es importando el módulo os:

import os

os.path.join("data", "sounds", "wrong.wav")

Yo conocí esta función leyendo un tutorial de PyGame. ¿Conocen algo parecido en otro lenguaje?

[1] Cuando hablo de abrir un archivo lo hago para ejemplificar la necesidad de encontrar un archivo, lo siguiente es igualmente válido para una función que por ejemplo reciba como parámetro el nombre de archivo de una imagen y la cargue en memoria para que luego podamos disponer de esta.

[2] Las versiones modernas de MS Windows se las arreglan para manejar pathnames que utilizan la barra "/" en lugar de la barra "\", pero esto es solo una parte de las plataformas dónde potencialmente ejecutaremos nuestro programa.


El Yotivenco

De atrás para adelante y con mucho cariño: El Conventillo. Es un grupo musical liderado por el actor (Diarios de motocicleta y Hermanos y Detectives) Rodrigo de la Serna, que interpreta candombes, milongas y tangos. En sus palabras, el folclore del Río de la Plata (de las dos orillas, sin papeleras que nos dividan), una mezcla de culturas. El negro con el tambor, el gaucho con la guitarra y el tano con el bandoneón (resumiendo la cosa).

Anoche vi un show suyo en el Parador Cultural de Villa General Belgrano (Córdoba) y a pesar de que nunca posteo sobre shows que voy a ver, y ya que hace poco estrené una sección Música en este blog, lo hago. Su actuación merece la excepción.

Antes de que la música inunde la sala, una pareja gay sentada atrás mío:

-- Epa.. esta lleno, mira vos, he? Lo deben haber llenado a lo último.

-- Si.

-- Está lindo armado, sencillo pero lindo.

-- Si.

-- Mucha percusión para tango, no?

-- Si.. La guitarra es lindo, tocarla.

-- Si. No es fácil. Podés rasguear, pero el punteo es trabajoso.

-- Si?

-- Si.

-- Ha, mira vos. Cantará de la Serna?

-- Nooo, que va a cantar. Leerá alguna poesía. Bah.. que se yo capaz que algo canta.

-- Che, grabaron un CD estos, no?

-- Nooo, que van a grabar.. Bah.. a lo mejor grabaron.. No, no grabaron.

-- Che, que es eso?

-- Debe ser una bandera, de Bolivia o algo así. Pero no, la de Bolivia tiene que tener más colores..

Estos dos personajes charlaban como si quisiesen que todos nos enterásemos de lo que decían. La verdad, era demasiado molesto. Algunas aclaraciones:

Una menor: el grupo si tiene un CD grabado (homónimo al grupo)

Uno mayor: de la Serna no es un adorno para el grupo, es el líder (y se nota en el escenario), es la vos principal de todos los temas cantados (la mayoría son cantados, pero también hacen temas instrumentales) y también toca la guitarra (hay 3 en el grupo, también hay un contrabajo y dos personas más en percusión).

Después de deleitar al público con su música y recibiendo tras cada pieza la ovación del público siempre agradecidas por palabras de Rodrigo en nombre de sus compañeros (decoradas con alguna pincelada de su profesión, la de actor) todos los integrantes su hicieron de algún instrumento de percusión, bajaron del escenario y tocando caminaron hasta la calle. Toda la sala los siguió hasta una calle de la Villa en la que sorprendidos caminantes recibían a los músicos siguiendo el ritmo con sus palmas.

Algo cómico para terminar.

En una parte del show, Rodrigo de la Serna, con mucho esmero, presenta a cada uno de sus músicos. Cuando termina, una vos desde el fondo grita "¿y vos quien sos?". Risas en el público. El actor (a quien me parece no lo cayó muy bien el chiste) contesta "Pequeño detalle. Me olvidaba. En guitarra y vos Rodrigo de la Serna."


Canciones de Soledad

Hace unos días mi amigo Juan Manuel (fan Nº 1 de La Sole en Carlos Pellegrini y zona aledañas, eterno buscador y coleccionista de los más raros elementos musicales de esta artista) me pidió que rastree en Internet las letras de algunos temas para él.

En un papelito arrugado tenía anotado:

Sorpresa (con Luciano Pereyra): no la pude conseguir :-(

Me salgo de la vaina (canta Romina, letra Sole): esa si! :-)

del otro lado del papelito:

Sembrador de tapera (Carabajal): no me entiendo la letra así que no estoy seguro de que ese sea el título, de todas formas no la encontre :-(

Los rastros de Juan Vagual: esa si!

Juan tenía grabadas las canciones que no conseguimos así que ayer, notebook en falda, nos las escuchamos una y otra vez para tipearlas. Los versos los organizamos a nuestro criterio y pueden faltar (o sobrar) signos de puntuación. Esero que alguien que busque estas canciones en Internet las encuentre.

Sorpresa

(Luciano Pereyra y Soledad)

La oportunidad de mi vida está,

se que no la dejaré escapar.

Con fuerza y con fe se que lograre

alcanzar la meta que jure.

Mi vos es un himno

que no callará,

encendiendo estrellas

entre tanta oscuridad.

Debo seguir, debo pelear.

Hoy tengo una oportunidad.

Cantando una canción podrá mi vos

llegar hasta tu corazón.

Debo seguir, debo pelear.

Hoy tengo un sueño que alcanzar

Y de mi la ilusión de libertad

que el mundo entero escuchará.

Cuando en mi interior pierdo dirección,

cuando ya no encuentro una razón

para continuar y no abandonar

a pesar de tanta adversidad.

Tras la tormenta

siempre sale el sol.

Brilla la esperanza

de un mañana que es mejor.

Debo seguir, debo pelear.

Hoy tengo una oportunidad.

Cantando una canción podrá mi vos

llegar hasta tu corazón.

Debo seguir, debo pelear.

Hoy tengo un sueño que alcanzar

Y de mi la ilusión de libertad

que el mundo entero escuchará.

Sembrador de taperas

(Cuti y Roberto Carabajal con Soledad)

Si acaso otra vez naciera,

que el mismo vientre me geste.

Y de la misma cimiente brote cantando a la vida.

Y sea América Latina el lugar donde despierte.

Haría los mismos caminos que hasta el amor me arrimaron,

pero esos que me alejaron de mis asombros de niño

y de mis muertos queridos no volvería a trajinarlos.

La tierra de mis nostalgias es fértil hembra morena,

pero las almas pequeñas, semillas del enanismo,

las usuras y egoísmo la sembraron de taperas.

Hermano pueblo emigrante de la orfandad sin frontera,

buscame una chacarera cuando se achica el consuelo.

Pa’ cantar que nuestro suelo, nuestra raíz, nos espera.

Por eso ando rebenqueando la servidumbre extranjera,

fabricantes de quimera que desarraigan mis changos.

Arrancándolos de cuajo como quitando malezas.

Si acaso otra vez naciera más te amaría semejante.

Si mi semejante de antes el que robara mi infancia

No me echarían la perrada cuando mi sangre reclame.

Si acaso otra vez naciera, Señor, si a tu valle vuelvo,

mi libertad y derecho que a todo el mundo le toca,

como mi sangre y mi sombra no morirían de destierro.

Hermano pueblo emigrante de la orfandad sin fronter,

buscame una chacarera cuando se achica el consuelo.

Pa’ cantar que nuestro suelo, nuestra raíz, nos espera.


Por último, esto termina de convencerme e que necesito una sección llamada Música en este blog.

[UPDATE] 11 de febrero de 2007. Veo que muchas personas están llegando al blog dsepués de buscar en algún buscador estos temas de Soledad. Hola visitantes :) Encontraron lo que buscaban? Espero que si. Los invito a que dejen un comentario contando de de dónde son. Saludos!


La orden del fenix

Algunos de uds por el título del post ya sabrán de que se trata. Es sorprendente la cantidad de Harrypotteros que hay ahí afuera. Desde chicos y chicas de la secundaria hasta adultos con gusto por la Fantasía.

Hace unas (pocas) semanas al rededor del cambio de año estuve leyendo el 5º libro de saga de Harry Potter. La historia se pone cada vez más atrapante, cuando abra la biblioteca de mi pueblo voy a sacar el 6º libro para leerlo.

La primer vez que oí hablar de este mago huérfano fué en el año 2000 (+/- 1,5 años, la exactitud de todas formas no es muy importante) cuando mis primos de Santa Fe emepezaron a leer sus aventuras. Me acuerdo también que por esos años salía mucho en los noticieros, la Harrymanía como la llamaban. Yo estaba leyendo El Señor de los Anillos de JRR Tolkien y sin sustento concideré a esta saga que se estaba publicando una fantasía bizarra, creo que incluso lo desacredité en algunas ocaciones. Este post es una sincera disculpa.

Hace menos de un año estaba esperando. En el lugar había un libro amarillo con un chico volando en una escoba en la tapa: Harry Potter y la Piedra Filosofal. Sin nada mejor que hacer, me puse a leerlo. Me enganchó la historia, lo pedí prestado y lo deboré en pocos días. Cuando ese fin de semana volví a mi pueblo alquilé la película homónima (no la conseguí en dvd por lo que tuve que desempolvar mi videocasetera) y la disfruté mucho. El resto del año continué pidiéndo prestado los libros y alquilando la película cada vez que terminaba de leer uno. Ahora que terminé el quito libro voy a tener que esperar hasta julio de este año para ver la 5ª película en el cine.

Hace unos días había empezado a escribir este post pero me colgé leyendo sobre esta historia y su autora en Internet. Lean esto:

En 1990, J.K. Rowling estaba viajando en un tren lleno de Manchester a Londres cuando la idea de Harry “simplemente pasó” por su cabeza. Rowling da cuenta de la experiencia en su sitio web diciendo: Yo había estado escribiendo casi continuamente desde que tenía seis años, pero nunca había estado tan emocionada sobre una idea así antes. [...] Yo simplemente me senté y pensé, durante cuatro horas (el tren se había retrasado), y todos los detalles burbujearon hacia mi cabeza, y este chico desarreglado y de pelo negro que no sabía que era un mago comenzó a ser cada vez más y más real para mí. Esa tarde, la autora comenzó la pre-escritura para su primera novela, Harry Potter y la Piedra Filosofal, un plan semi-detallado que incluiría los diagramas de cada uno de sus siete libros previstos, además de una cantidad enorme de información biográfica e histórica sobre sus personajes y el mundo mágico.

En el transcurso de los siguientes seis años que incluyeron su traslado a Portugal el nacimiento de su primera hija, el divorcio de su primer marido, y el regreso a Escocia, Rowling continuó la escritura de su libro. Viviendo en Edimburgo, Rowling escribió buena parte del mismo en cafés locales, con la ayuda de una beca del Consejo de las Artes escocés. Incapaz de afrontar el gasto de un jardín de niños, su hija sería una compañera constante en su trabajo.

En 1996, Harry Potter y la Piedra Filosofal fue terminado y el manuscrito fue enviado a diversos agentes. El segundo al que acudió, Christopher Little, ofreció representarla y envió el manuscrito a Bloomsbury. Después de que ocho editoriales lo hubieran rechazado, Bloomsbury ofreció a Rowling un adelanto de £3,000 por su publicación.

A pesar de que Rowling no había tenido en mente una categoría de edad particular para sus potenciales lectores cuando comenzó a escribir, los editores apuntaron inicialmente a niños de entre nueve y once años. En la víspera de la publicación, los editores pidieron a Joanne Rowling adoptar un nombre de autor con un género más neutral, para abordar a los chicos varones de esta edad, temiendo que no estarían interesados en leer una novela escrita por una mujer. Ella eligió utilizar J.K. Rowling (Joanne Kathleen Rowling), omitiendo su nombre y usando el de su abuela como segundo.

Que me dicen uds? Leyeron algún libro de la saga? les gustó?


Nuevamente en línea

Amigos, una nota rápida. Aproveché una hora de conexión esta siesta para volver a poner en línea mi blog. No se preocupen, el tema es temporal :)

Mantenganse sintonizados para futuras novedades.

Saludos a todos

Juanjo, desde Carlos Pellegrini.


Cargar programas gráficos como un usuario distinto al que está logueado

Escenario

Te despertás en la mañana. El zumbido de la computadora se entremezcla con el canto de los pájaritos. Tu hermana la debe haber encendido temprano. Una ducha para terminar de despertarte. Café, masitas de agua (típico desayuno del día que te das cuenta que hay que ir al super a hacer las compras de la semana). La computadora está encendida, pensás en iniciar el cliente de correo para leer algunos mails. Usás Thunderbird (no necesariamente, pero si algún cliente gráfico). Encendés el monitor que está apagado y rápidamente reconocés el wallpaper que tu hermana se hizo con la foto del novio. En la barra de tareas hay un programa minimizado: lees aMule 2.0.3. Click. Decenas de barritas de colores, algunas ya se completaron de verde (hoy es un buen día para compartir música).

Abris una terminal:

marisu@sarge:~$ su juanjo

Password:

juanjo@sarge:/home/marisu$ thunderbird

Xlib: connection to ":0.0" refused by server

Xlib: No protocol specified


(thunderbird-bin:15655): Gtk-WARNING **: cannot open display:

juanjo@sarge:/home/marisu$

Oops!

Sos un buen hermano, así que no querés cortarle la descarga de música a tu hermana. Pero querés aprovechar mientras el café está aún caliente para leer tus mails. ¿Solución?

Solución

juanjo@sarge:~$ exit

exit

marisu@sarge:~$ xhost +local:juanjo

non-network local connections being added to access control list

marisu@sarge:~$ su juanjo

Password:

juanjo@sarge:/home/marisu$ thunderbird

Dejo este post por que hoy a la mañana no recordaba el comando y estuve unos 10 minutos en google hasta encontrarlo, espero a alguien le sirva! ¿Alguna otra forma de solucionar el problema?

Saludos!


1ª experiencia XP

Métodos Ágiles

Métodos Ágiles para el Desarrollo de Software es una materia electiva del segundo cuatrimestre de 4º año de Ingeniería en Sistemas de Información en la la facultad dónde estudio (UTN-FRSF). Yendo al grano: estudia los llamados Métodos Ágiles, en particular eXtreme Programming.

La idea de estas metodologías, a diferencia de las tradicionales es evitar la tortuosa y burocrática documentación, a la vez que se enfocan en las personas y en los resultados.

XP: Programación eXtrema

Dentro de este contexto, la Programación eXtrema (una de las metodologías más exitosas del rubro) se presenta como una diciplina de desarrollo de software basada en valores como simplicidad, comunicación, retroalimentación y valor. Trabaja poniendo a todo el equipo ante práctica simples, con suficiente retroalimentación para permitirle ver dónde está y cómo encarar un problema particular.

En XP, cada contribuidor al proyecto es una parte integral del Equipo. El equipo se forma al rededor de un representante del negocio, llamado El Cliente, el cual se sienta y trabaja con el equipo diariamente (cliente in-situ).

Nuestro trabajo práctico consistía en desarrollar la primer versión de un sistema de gestión de socios de un club en base a una lista de historias provistas por la prfesora. Las historias son la forma en la que XP define los requisitos para el sistema.

Para realizarlo llevamos a cabo algunas de las prácticas que XP propone (las escribo sin un orden específico), bold significa que aplicamos conscientemente la práctica:

  • Cliente in-situ
  • Juego de la planificación
  • Metáfora
  • 40 hs semanales
  • Diseño sencillo
  • Recodificación
  • Programación en parejas
  • Pruebas
  • Versiones cortas
  • Propiedad colectiva
  • Estándares de codificación
  • Integración continua

Puede ser que el listado de prácticas no sea novedoso para algunos, de hecho son todas prácticas existentes. XP lleva su nombre por llevar todas estas prácticas al extremo. Si hacer pruebas es bueno, se escribirán pruebas para todos los métodos que lo ameriten y luego se escribirá el código que pase esas pruebas. Si integrar es bueno, se integrará continuamente. Si la retroalimentación del cliente es buena, se sumará este al equipo de desarrollo.

Se puede leer más sobre XP en:

Programación en parejas

Una de las prácticas que conscientemente llevamos a cabo fue la de programar en parejas. En el grupo eramos 4 y tuvimos la suerte de trabajar siempre en una casa con dos computadoras, por lo que las parejas podían ir rotando y hacerse consultas entre ellas. A mi parecer es una de las prácticas más importantes de XP, y es un tema tan amplio que hasta tiene su propio sitio web:

pair programming

pair programmers

Pruebas (de unidad)

El lenguaje de programación utilizado fue Java. También usamos un framework para mapear objetos en memoria a una base de datos relacional (Hibernate) y uno para generar reportes (JasperReports). Elegimos estas herramientas por que ya las habíamos usado para un trabajo práctico previo, lo que nos permitió poner foco en la metodología y no en la herramienta.

Para trabajar con pruebas, también utilizamos un framework (JUnit), desarrollado originalmente por Erich Gamma y Kent Beck (creador de XP). Trabajar de esta forma nos gustó muchos a todos los miembros de grupo, saber que luego de ese cambio el software sigue pasando las pruebas es alentador y refuerza uno de los valores de XP, la valentía.

Básicamente lo que hacíamos era:

1) Pensar en un método que se necesitaba.

2) Crear una prueba para ese método.

3) Correr la prueba. Fallaba.

4) Escribir código que haga pasar la prueba.

5) Correr la prueba. Si fallaba volvíamos al punto 4.

JUnit te provee de métodos parecidos a:

assertEquals(valorEsperado, valorCalculado);

Esa última línea puede fallar o puede pasar. A la vez se crea un árbol de pruebas con todas las que hallamos escrito y cuando lo ejecutamos, a medida que las pruebas van pasando una barra verde se va completando. Si la barra se completa de color verde significa que todas las pruebas pasaron. Si alguna prueba falla, la barra se vuelve roja.

Una de las prácticas es la recodificación (esta nos ayuda a mantener un diseño simple), pero.. como recodificar y saber que no hemos cometidos errores? Luego de realizar un cambio corremos nuevamente las pruebas. Si obtenemos una barra verde estamos listos para el siguiente cambio. Rigurosamente la barra verde nos indica que el sistema sigue pasando las pruebas que antes pasaba, no que no tenga errores, pero en la práctica parece ser una buena aproximación.

JUnit

keep de bar green

Frog

ClubXP

Además, como refuerzo para la Integración continua utilizamos Subversion para mantener ordenas las revisiones que ibamos haciendo del código: clubxp en code.Google.

Saludo

Bueno, fue algo de lo que quería contar. En estas fechas de finalización de cursado no escribo casi nada en el blog, así que les dejo un saludo y Hasta la próxima!


Pueblos originarios y Software Libre

En las pasadas CafeConf, Sergio Cayuqueo dió una charla titulada Pueblos Originarios y el Software Libre. No puede oirla, pero al finalizar me lo encontré a él y me dió entre otras cosas una copia del texto en el que se basó su presentación. Es muy lindo, así que se lo pedí para compartirlo con uds en el blog.

Los pueblos originarios en la era de la información y las telecomunicaciones

Seminario “Los Pueblos Originarios y la Integración Regional: Un aporte para el debate”

Hoy en día nuestra sociedad se ve influida por las telecomunicaciones, las cuales cumplen un rol fundamental para el desarrollo social de la era en que vivimos. Los pueblos originarios no deben quedar al margen de las telecomunicaciones, ya que esto genera un freno para la inclusión de los mismos.



Desde tiempos inmemorables los pueblos originarios han vivido en sociedad basándose en cooperación, y reciprocidad.



        Actualmente la evolución de las telecomunicaciones y la industria del software, no han adoptado estos conceptos, y han optado por no compartir la información sin una contraprestación, y aunque se dé el caso, no somos capaces de compartir dicha información con nuestros pares.



Luego de un tiempo surgió un movimiento dentro del desarrollo del software, el denominado Software Libre, el cual aplica el concepto de comunidad que destaca a grandes culturas como  la Andina, tanto en su filosofía, como en sus métodos de producción; en la base de ambas culturas es importante la cooperación entre individuos.



Tanto los pueblos originarios como la comunidad del Software Libre, pueden aprender uno del otro respetando cada uno su identidad, pero reconociendo sus raíces en la búsqueda humana de lograr un bienestar común.



Por ejemplo la cultura Andina es un sistema de valores y principios que florecieron en los Andes hace ya 5000 años y que en su apogeo territorial, con los Incas, llegó a  expandirse abarcando lo que ahora se conoce como Perú, Bolivia, Ecuador, Colombia y parte de Argentina y Chile. Esta cultura comunitaria, era de un gran respeto a la diversidad tanto social como ecológica y  a la naturaleza.



Esta cultura mantenía un núcleo social básico: el ayllu (comunidad en quechua), ésta era la base de su organización, y su mayor fuerza. En ella se buscada lograr el desarrollo y el bienestar de sus miembros mediante la reciprocidad en las labores. El principio de reciprocidad o Ayni (en quechua) implicaba el compartir las labores colectivas en beneficio de todos. Este trabajo colectivo era denominado Minka y buscaba resolver los problemas socio-económicos comunes además de ser llevado a cabo sin la imposición o control del Estado.



Y es que en una cultura con fuerte arraigo en la naturaleza, recibiendo mucho de ella y devolviendo su agradecimiento y conservación, el principio mas grande que parece haber guiado su desarrollo sería “para recibir primero hay que dar”, una relación de mutuo beneficio entre ellos y la naturaleza,  y entre ellos mismos.



Por otro lado, en la actualidad, en medio de un gran desarrollo de tecnologías de comunicación, la Fundación para el Software Libre promueve mayores libertades para los miembros de una nueva comunidad: “la de usuarios de software del planeta”, principalmente la libertad de compartir el software. Y de allí surgieron infinidad de proyectos  que permitían esa libertad y gracias a Internet evolucionaron aún mas, demostrando así que esos valores de las culturas originarias aún están vigentes, sólo que se han modernizado y  ahora la comunidad tiene a sus disposición otras herramientas más actuales para lograr su bienestar en conjunto.



“Para recibir primero hay que dar” y siendo Internet el Ayllu (la comunidad), el Software Libre es nuestra Minka y podemos elegir (o sea tenemos libertad de elección) contribuir o no a ella. En definitiva podemos utilizar un programa libremente y beneficiarnos con él, podemos compartirlo gratuitamente con nuestros amigos y hermanos sin tener que rendirle cuentas a nadie, podemos venderlo, y además,  tenemos la libertad de agregarle mejoras al programa, en caso que optemos por colaborar con el desarrollo del mismo, o también tenemos la oportunidad de establecer contacto con el creador del mismo para solicitar características y aditivos nuevos que se necesiten.



Así, en etnias con una fuerte herencia cultural comunitaria, el Software Libre no es sino un recordatorio de la fuerza que surge de la unión de intereses diversos con un objetivo: el bienestar común. Adaptar las tradiciones culturales ancestrales a la "modernidad", sin que ello implique perder nuestra identidad, es el reto de los tiempos venideros y opciones como el Software Libre nos muestran que ello es posible. Nuestro legado a la humanidad: el ayllu, nos marcara el camino.

Sergio Daniel Cayuqueo

sergio@linuxv.com.ar

Bibliografía

  • Katari: centro de documentación Quechua y Aymara http://www.katari.org
  • La fundación para el software libre y el proyecto GNU http://www.gnu.org
  • La Catedral y El Bazar, escrita por Eric Raymond es un documento que analiza desde la perspectiva de un participante-observador un proyecto de software libre y extrae lecciones a partir de el. Esta en http://es.tldp.org/Otros/catedral-bazar/
  • Observaciones personales de proyectos de software libre.

Futa Traw – Gran Parlamento Indígena Comisión Pueblos Originarios del Consejo Consultivo de la Sociedad Civil de la Cancillería Argentina

http://www.futatraw.org.ar