Planeta Gente USLA

July 24, 2010

Vientos de Libertad

Diccionario bidireccional en Python

Bidirectional dict o Injective mapping es una estructura de datos muy útil.

Por lo general cuando usamos un diccionario o tabla hash, tenemos un valor asociado a una clave:

>>> d = {1:'uno', 2:'dos'}
>>> d[1]
'uno'

Pero algunas veces también resulta útil indexar por el valor y obtener la clave.

>>> d['uno']
1

Por ejemplo, en un programa tengo un archivo de configuración que contiene un diccionario dónde las claves son strings de 3 caracteres representando un edificio (‘SFE’, ‘GDP’, …) y las claves números de puerto (5007, 5008, …). En algunas partes el programa requiere conocer el edificio a partir del número de puerto y en otras el puerto a partir del edificio.

¿Cómo obtenemos este comportamiento?

Pregunté en StackOverflow y si bien me apuntaron a una implementación, la solución que más me gustó fue esta:

>>> d.update( dict((d[k], k) for k in d))

Así se ve d ahora: {1: 'uno', 2: 'dos', 'uno': 1, 'dos': 2}

Y podemos efectivamente indexar por clave o por valor:

>>> d[1]
'uno'
>>> d['uno']
1

Advertencias

No se pueden usar objetos inmutables

En los diccionarios de Python solo objetos inmutables pueden ser clave de diccionarios, por lo tanto, en nuestro diccionario bidireccional, tanto las claves como los valores deberán serlo.

Actualizaciones

Otra limitación de este enfoque son las desincronizaciones que puede sufrir al modificar el bidict luego de realizar la transformación; hay que tener cuidado!

  • Luego de agregar un nuevo elemento debemos volver a ejecutar la línea mágica para que cree la entrada inversa.
  • No podemos agregar un par que tenga como clave algo que ya existía como valor o que tenga como valor algo que ya existía como clave.
  • Si borramos una entrada, hay que también borrar su inversa.

Conclusión personal

Como les contaba antes, yo estaba usando el diccionario original en un archivo de configuración, por lo que no toco la estructura de datos durante la ejecución del programa, así que esta solución compacta y elegante… como dijo el filósofo: me viene al pelo!

Espero a alguien más le sirva.

by Juanjo at July 24, 2010 08:59 PM

July 23, 2010

Vientos de Libertad

Talk: Taint Mode for Python via a Library (video)

OWASP have just published the video of my talk in OWASP App Sec Research 2010 in Stockholm.

First talk in English ever.
Fue mi primer charla en inglés.



Slides and text are also avaliable.

by Juanjo at July 23, 2010 03:04 PM

July 22, 2010

Martin Albisetti

Ubuntu One iphone client, source code released

We should have released the source for the iphone client right after we did the upload to the appstore, but a bunch of bureaucracy and crazy work deadlines postponed this until now.
We’re going to be doing some work for the Ubuntu 10.10 release on the iphone client as well as on a new Android client, both clients are going to be open source, like all our other Ubuntu One clients.
We’ve created the projects on Launchpad, pushed the initial source code for the iphone client, and will start pushing Android as soon as we get out of the exploration stage.

The projects are available at:

iphone:  https://launchpad.net/ubuntuone-ios-client
android: https://launchpad.net/ubuntuone-android-client

Stay tuned for more on our new mobile services!

by beuno at July 22, 2010 10:45 PM

Vientos de Libertad

Pilas y colas en Python

La forma más directa de tener pilas y colas en Python es usando listas, una de las poderosas estructuras de datos que vienen con el lenguaje.

Una pila es una estructura de datos secuencial en la que el último elemento insertado es el primero en retirarse (LIFO) y puede implementarse directamente con los métodos append y pop.

Una operación común en las pilas es top, que devuelve el elemento en el tope de la pila, pero sin quitarlo; esta operación se puede emular indexando por -1.

>>> pila = [6,7,8]
>>> pila.append(9)
>>> pila
[6, 7, 8, 9]
>>> pila.pop()
9
>>> pila.pop()
8
>>> pila[-1]
7

Implementar una cola requiere algo más. En las colas, a diferencia de las pilas, el primer valor insertado es el primero en quitarse (FIFO).

Un primer intento es implementarla con append y pop(0) que obtiene el primer elemento (o con insert insertando al principio y pop). Pero las listas de Python, si bien están optimizadas para insertar al final y quitar del final, no lo están para insertar al principio o quitar del principio. La solución es utilizar collections.deque que si está implementada con estas operaciones optimizadas.

>>> from collections import deque
>>> cola = deque([1,2,3])
>>> cola.append(4)
>>> cola
deque([1, 2, 3, 4])
>>> cola.popleft()
1
>>> cola.popleft()
2
>>> cola
deque([3, 4])

by Juanjo at July 22, 2010 03:07 PM

Bitácora de Vuelo - Facundo Batista

Metiendo la uña del pulgar


"Uña del pulgar", o thumbnail es una versión reducida de una imagen, usada para ayudar a su organización y reconocimiento. En la era de las imágenes digitales, los motores de búsqueda visuales y los programas para organizar imágenes normalmente hacen uso de los thumbnails, así como los sistemas operativos y entornos de escritorio recientes [-]

Hace unos meses mandé a digitalizar unas diapositivas que tenía mi familia. Un par de días atrás empecé a procesarlas, usando el JBrout para agregarle los tags indicando metadata de la imagen (lugar, año, gente que aparece, etc.).

El problema que tuve es que cuando abría con el JBrout fotos que había sacado yo, las veía perfectamente, pero cuando abría las diapositivas, veía una "X" fea que no me decía nada. No tardé demasiado en darme cuenta que el problema era que el JPEG no tenía adentro el correspondiente thumbnail.

Entonces, ¿cómo les metí el thumbnail a cada una?

Luego de buscar un rato por la web (pensé que tenía que haber algún programa que lo hiciera solo y masivo), encontré esta forma (lo más probable es que hayan mil más...).

    convert foto_original.jpg -thumbnail '200x200>' -unsharp 0x.5 thumbnail.jpg

convert es uno de los utilitarios de la fantástica ImageMagick, toma mi foto_original.jpg y me deja thumbnail.jpg. El -thumbnail le dice que voy a generar justamente un thumbnail, lo cual aparte de cambiar el tamaño hace otras cosas (por ejemplo, le saca toda la metadata interna, para que ocupe menos). El '200x200>' es una notación de ImageMagick que indica que la imagen resultante tiene que caber en una zona de 200 por 200 (o sea, me la reduce manteniendo el factor de forma hasta que el alto o el ancho ocupen como mucho 200 pixeles). El -unsharp 0x.5 lo recomiendan para mejorar la visualización de la imagen pequeñita. En esta página tienen otros detalles y temas a considerar al generar thumbnails (que no se aplican en mi caso).

Luego, para poner esa nueva y pequeña imagen dentro de la original, utilicé otro utilitario:

    exiftool '-ThumbnailImage<=thumbnail.jpg' foto_original.jpg

No hay demasiado que explicar en este caso.

Luego de verificar que todo funcionó correctamente, pasé a trabajar todas las diapositivas en masa. Los archivos tenían esta estructura: tres directorios CajaA, CajaB y CajaC (correspondientes a las tres cajas de diapositivas que mandé a digitalizar), con archivos adentro tipo a001.jpg, b033.jpg, etc.

Obviamente no iba a ejecutar esos dos comandos uno por uno para cada imagen, así que pasé a hacer uso del poder de bash, y escribí en la terminal:

    for foto in `find -name "????.jpg"`; do
         echo $foto;
         convert $foto -thumbnail '200x200>' -unsharp 0x.5 $foto.thumb;
         exiftool '-ThumbnailImage<='$foto.thumb $foto;
    done;


Basicamente, un loop sobre todas los archivos, haciendo un echo para ver qué procesaba, más los dos comandos anteriores.

Esto me dejó todo procesado, pero medio sucio, ya que por cada imagen tenía un .thumb, y además un _original que deja el exiftool. Así que procedí a borrar todo eso:

    find -name '*.thumb' -or -name '*_original' | xargs rm

O sea, le dije a find que encuentre todos los archivos que quería borrar, pero en lugar de mostrarlos por pantalla, se los pasé a xargs que los fue tomando y aplicando el rm para borrarlos.

Resultado final: tengo todas mis diapositivas con un thumbnail adentro. Y de paso aprendí un par de utilitarios nuevos, y algunas otras cositas.

by facundo at July 22, 2010 02:00 PM

July 20, 2010

Humitos

humitos

¡Exacto! ¡Qué mala leche hijo de puta!

Resulta que el 17 de Junio me compré una Netbook Samsung N210 de la cuál todavía no tuve tiempo de hacer un post sobre lo excelente que resultó y lo bien que funcionaba con Debian desde 0 y cómo llegué a configurar las pequeñas cosas que hacen que utilizarla sea un placer.

Lamentablemente, este post es para todo lo contrario, en vez de hablar bien no me va a quedar otra que hablar mal. Y no porque sea un mal producto o algo funcione como yo no me lo esperaba, pero… Sí, digamos, algo funcionó como realmente no me lo esperaba.

Anoche, después de un día sumamente ocupado (como todos los míos :P ) vuelvo de la casa de mi novia y levanto la tapa de la Netbook, que estaba suspendida, para ponerme al día con los emails, blogs, y de ser posible escribir un post. En ese momento, después de levantar la tapa y esperar los 3 segundos que demora en activar todo como para que esté lista para funcionar, noto que la pantalla no se prendía; lo que me hizo pensar que estaba “demorando mucho”… Y sí, demoró mucho, demoró tanto que nunca prendió la pantalla :(

Hoy 20 de Julio, ya pasado 1 mes y 3 días, puedo decir que esta máquina está fallada :( . 1 mes y 3 días, ¿entendés?… Justo cuando la terminé de poner a punto, instalar todos los programas que necesito, configurarlos, etc. Estaba en el momento en el que decía: “puta! cómo me gusta como anda esta porquería” :S

Por la mañana de hoy fui a Frávega, dónde la compré, a hacer el reclamo y me dijeron que tenía que llamar al soporte técnico de Samsung, que ellos no tenían nada que ver. Así que me dieron un teléfono y me dijeron que iba a necesitar una fotocopia de la factura, y que me anote todos los números de serie de mi equipo porque ellos la pasaban a buscar por mi casa y luego la devolvían. Entonces, con estos números me aseguraba que sea mi equipo y no otro.

De ahí, me fui a sacar las fotocopias, me compré una tarjeta Telecom Global para poder llamar a Buenos Aires (donde era el service :( ) y me vine para mi casa. Llego, la pruebo de nuevo y lo mismo: “La pantalla prender, pero no tiene NADA de brillo. Digamos, está muerta la luz del fondo”. Y bueno… no queda otra que llamar…

Hago el mate, busco para anotar, busco el teléfono inalámbrico y me voy al fondo, a dónde tengo la otra pc. Llamo al teléfono que me dieron que es de “LAM Service” y me dicen que ellos no arreglan Netbooks, que sólo trabajan con cámaras de fotos y filmadoras, así que me iban a derivan a Samsung Argentina que era un 0800. Bueno, no me quedaba otra. Llamo a este 0800 y me dicen que ellos me iban a derivar al lugar más cercano a dónde yo vivo y me mandan con MEGATECH que quedaba en Capital Federal. Entonces les digo que cómo era el servicio, si ellos lo venían a buscar como me había dicho el de Frávega o qué onda y… ¡No!, lo tenía que llevar…

Hablamos un rato más y me dijo que me iba a derivar con alguno de Entre Ríos, ya que yo vivía en Paraná. Me derivó con uno de Concepción del Uruguay que se llama INFOPROA y me dijo que me comuniquen con ellos porque seguramente tenía que acercar de alguna manera la Netbook hasta ahí, que lo podía hacer por correo o con un amigo :P . Le dije que muchas gracias por la sugerencia, nunca se me hubiera ocurrido… ¡Hijo de puta!

Vamos de nuevo, levanto el teléfono, marco los 400 números de la tarjeta Telecom, marco los 10 números del lugar este y me comunico con una mina que con suerte sabía como se llamaba el técnico con el cuál me tenía que derivar, de hecho se olvidó de poner en mute el teléfono y escuché toda la conversación absurda que tuvo con otra persona que merodeaba por la oficina.

Después de un rato de escuchar boludeces y ella decirlas, me dice que “el” técnico no estaba (notar las comillas) y que no sabía cuando volvía, así que me iba a tomar mis datos y él luego se iba a comunicar conmigo. Después de esta comunicación y cuando la netbook llegue a sus manos iban a demorar 72hs para decirme cuál es el problema y cuánto tiempo van a demorar y que luego la podía pasar a buscar.

Si sumo, tiempo + pasajes + las sesiones de psicólogo + medicamentos creo que llego a la suma de la netbook y ni me conviene meterme en este quilombo. Veremos que pasa.

En resumen: “Lamentable el servicio técnico de Frávega, LAM Service, Samsung, , Megatech e Infoproa”

Gracias totales! Creo que me quedo con mi Olivetti pedorra, que andaba la mitad de las cosas con Linux pero nunca me dejó a pata… Bueno, al menos no en el primer mes!!!

Editado un par de minutos después de su publicación:

Megatech, este mensaje es para vos: “Tenés a una secretaria llamada Paula, te recomiendo que la cambies”. A ver, paso a explicarte porqué. Me pregunto si seré tan pero tan pero tan inteligente yo ¿no?. La cuestión es que como soy tan inteligente, me pregunté: “¿Será que no tienen una sucursal en Santa Fe?, que culiados”. Y me dije: “Voy a volver a llamar preguntando si no hay una sucursal en Santa Fe”.

Cacho el teléfono, marco los 410 números de nuevo, me atiende nuevamente Paula. Le digo que había llamado recién y que me derivó a Concepción del Uruguay y que se me complicaba, si no había un lugar en Santa Fe y… “Sí exactamente señor, tenemos sucursales en Rosario y Santa Fe Capital”, a lo que contesto: “Joya, dame el contacto de la de Santa Fe Capital” …

  • “Bueno señor, tome nota. Estamos en Salta 3238 y el teléfono es: 0341…”
  • “Pará, esa característica es de Rosario”
  • “Ah, mmmhh…. Eh… Sí, exactamente. Déjeme chequear… Ok, estamos en blah blah”

¿Podés creer? Me mandaron a un lugar que está a 6hs de dónde yo vivo (Concepción del Uruguay) siendo que podía “cruzar el charco” y estar en el servicio técnico en 45 minutos y después me estaban dando la información de Rosario cuando fui más que claro…

¡Megatech sos lo más, sabelo… El problema es esta chica Paula :P !

Editado después de llamar al servicio técnico de Santa Fe:

Antes que nada, gracias Paula por recomendarme este lugar.

Bueno, me atendió un flaco o gordo, no sé, que me dijo: “Macho, tenés que traerla y vamos a demorar de 5 a 15 días en repararla.”, a lo que yo contesté: “Pero, ¿en esa cantidad de días vas a saber qué tiene nomás o me la voy a poder traer” y el amigo dijo: “Traela y vemos” :)

Cortito y al pié, ¿para qué me va a decir que la tiene lista en X días si no tiene idea que cuerno hay que hacerle? Así que… Allá vamos, no sé bien cuando pero iré…


by humitos at July 20, 2010 02:18 PM

July 18, 2010

Beatriz Busaniche

La regulación argentina: comentarios sobre la Ley de Propiedad Intelectual 11723

Por Beatriz Busaniche1. 2

La ley de propiedad intelectual es una regulación antigua, que data del año 1933 y que se ocupa de las obras literarias, científicas y artísticas. La normativa es, según el observatorio de las leyes de propiedad intelectual de Consumers International, una de las peores normativas del mundo considerando el acceso a conocimiento y cultura3. Contrariamente, el Informe Especial 301 de la Oficina de Comercio de los EEUU indica que la ley es correcta, aunque detecta problemas en la observancia de la misma.
La ley 11723 aprobada en 1933 llegó para reemplazar la anterior regulación en la materia en Argentina, la ley 7092 de 1910, que fue el primer texto legislativo conocido en Argentina en materia de derechos de autor. Hasta entonces, los litigios relacionados se resolvían por aplicación de la Constitución Nacional y el Código Civil. La Constitución Nacional es el antecedente directo de la 11723, ya que en su artículo 17 indica que “todo autor o inventor es propietario exclusivo de su obra, invento o descubrimiento por el término que le acuerde la ley”.
Inspirada en la cláusula del progreso de los EEUU, el párrafo 8vo. del artículo 1ro. de la constitución aprobada en 1787, la versión argentina no llega a fijar la prioridad como sí lo hace la constitución de los EEUU, donde se dota al Congreso de la potestad de “fomentar el progreso de la ciencia y las artes útiles, asegurando a los autores e inventores, por un tiempo limitado, el derecho exclusivo sobre sus respectivos escritos y descubrimientos.”. La cláusula Argentina omite el objetivo de promover las artes y las ciencias útiles, y consagra el derecho de autor en términos de propiedad.
“La más sagrada, la más personal de todas las propiedades”, decía Le Chapelier en su informe que antecedió el decreto de enero de 1791 por el cual la Asamblea Constituyente de la Revolución Francesa consagró el derecho de los autores a la representación pública de sus obras. Durante buena parte del siglo XIX, principalmente en Francia y Alemania, el derecho de autor fue tratado como dominio y propiedad. Sin embargo, con el correr de los años y la mayor profundidad tanto en la doctrina como en la jurisprudencia, ese concepto fue objeto de numerosos cuestionamientos, entre los que se pueden destacar que:

  • la obra no es una cosa, por lo tanto el dominio que se ejerce sobre ella es diferente del que se ejerce sobre una propiedad tangible;
  • el derecho de autor nace del acto creativo de una obra, y no de las formas clásicas de adquisición del dominio de un bien tangible;
  • el plazo de ejercicio del derecho monopólico es limitado en el tiempo, no es ilimitado como en el sistema de propiedades materiales;
  • el sistema de coautoría es diferente del sistema de condominio;
    el derecho moral, propio del derecho de autor, no tiene contraparte alguna en el derecho de dominio y propiedad;
  • no existe transferencia plena del derecho de autor, pues la obra nunca deja de ser una obra de su autor, nunca abandona la esfera de la personalidad de éste, independientemente de las enajenaciones que puedan producirse
    4.

En Alemania, a partir del pensamiento filosófico de Kant sobre el derecho de autor como derecho de la personalidad del creador, surgieron las tendencias dirigidas a reconocer lo que hoy se conoce como “derechos morales”, una tendencia que se plasmó luego como doctrina judicial en Francia durante la primera mitad del siglo XIX.
Surgen entonces otras teorías como la de los derechos sobre bienes inmateriales, encarnada por el belga Edmond Picard, quien argumentó que se debe reconocer a los autores un derecho sui generis sobre sus obras, de naturaleza real, dentro del gran número de los denominados derechos reales5.
La ley argentina retoma estas teorías. En su proyecto de ley, el Senador Sánchez Sorondo explicaba: “la concepción de la ley argentina, así como la de los proyectos que la reforman, es la de atribuir al derecho de autor las normas y conceptos de la propiedad del derecho común, aunque con algunas reservas y limitaciones derivadas de la naturaleza misma del derecho de autor”6. Así, el legislador toma las normas de origen español y portugués y reivindica a su vez los derechos patrimoniales de los autores sobre las obras.
La ley argentina tiene a su vez un fuerte hincapié en la protección centrada en la obra más que en el titular de los derechos, en lo que se aproxima a la lógica de la common law, es decir, la vertiente del copyright7. Aún así, pese a no tener un apartado específico sobre derechos morales, los mismos se desprenden de varios artículos de la norma argentina que tratan especialmente sobre la paternidad y la integridad de la obra.
Con el correr de los años prácticamente todas las legislaciones del mundo se han ido apartando de la concepción del derecho de autor en tanto propiedad, elemento que ha permanecido intacto en la ley argentina a pesar del paso de los años, las sucesivas modificaciones y el cuestionamiento sobre la pertinencia de ese concepto en el marco legal del derecho de autor. Esta concepción sostenida desde 1933 hace de la ley argentina una ley única en muchos sentidos, pero especialmente en sus concecuencias directas sobre la vida social y el acceso a la cultura.
La ley indica además que “la propiedad intelectual se regirá por las disposiciones del derecho común” (art. 12), con lo que se le confiere a los titulares todos los atributos del derecho de propiedad que no se encuentran limitados legislativamente.
Aquí es donde radica la rigurosidad de la ley argentina, anacrónica en la materia y única como tal en el mundo. Un problema que se arrastra desde la Constitución Nacional y que hace en la ley 11.723, la cristalización de una analogía perjudicial con la difusión y el goce de las artes y el conocimiento para la ciudadanía. Es esta lógica la que nos obliga a pensar en una actualización que sobrepase los meros retoques de articulado, y que nos obliga a iniciar un debate amplio, completo y profundo sobre la naturaleza jurídica del derecho de autor, la aplicación de cada uno de estos conceptos en los tiempos que vivimos, la respuesta de esta norma centenaria a los desafíos de las nuevas tecnologías y la necesidad urgente de replantear una modernización integral y completa de los sistemas que regulan la forma en la cual producimos, intercambiamos y promovemos el acceso a la cultura.
El Pacto Internacional de Derechos Económicos, Sociales y Culturales8, que en Argentina tiene rango constitucional, otorga a todas las personas el derecho a la educación y a la participación en la vida cultural. También otorga derechos a los autores, pero en nada ese reconocimiento se condice con lo que establece nuestra ley nacional. El pacto de Derechos Económicos, Sociales y Culturales se atiene a brindar a los autores un reconocimiento que garantice su nivel de vida adecuado, lo cual no necesariamente implica otorgarles un monopolio de por vida sobre sus obras9.
La Declaración Universal de los Derechos Humanos10 hace lo propio en su artículo 27 al instaurar el derecho al libre goce de los beneficios de las artes y las ciencias, así como el justo reconocimiento a autores e inventores por sus contribuciones a la vida cultural. Estos tratados dan cuenta de un equilibrio, donde las personas puedan gozar efectivamente de la vida cultural. Ese equilibrio se ha perdido en Argentina. Quienes tratan de gozar libremente de las artes son declarados criminales y viven bajo las amenazas de una ley que está radicalmente fuera de época y merece una revisión amplia, profunda y general, que nos permita construir un sistema de derechos de autor más apropiado y justo para el ejercicio pleno de nuestros derechos básicos.

  1. Este trabajo se distribuye bajo una licencia Creative Commons, Atribución, Compartir Obras Derivadas Igual de Argentina. Para más información visite http://creativecommons.org/licenses/by-sa/3.0/deed.es_AR
  2. Este texto es un anticipo de nuestro nuevo libro.. por venir! Pronto!
  3. http://www.consumersinternational.org/Templates/Internal.asp?NodeID=101219&int1stParentNodeID=97418&int2ndParentNodeID=97436&lc=2
  4. Lipszyc, Delia – “Derechos de Autor y derechos conexos” Ediciones UNESCO, CERLALC, Zavalía. Edición 2006.
  5. Emery, Miguel Ángel. “Propiedad Intelectual” Editorial Astrea 4ta. Reimpresión 2009.
  6. Ibidem. Pag. 7
  7. Ibidem. Pag. 8
  8. http://www2.ohchr.org/spanish/law/cescr.htm
  9. “16. El período de protección de los intereses materiales en virtud del apartado c) del párrafo 1 del artículo 15 no debe por fuerza abarcar toda la vida de un creador. El propósito de que los autores gocen de un nivel de vida adecuado puede lograrse también mediante pagos únicos o la concesión al autor durante un período determinado del derecho exclusivo a explotar su producción científica, literaria o artística. ” En COMITÉ DE DERECHOS ECONÓMICOS, SOCIALES Y CULTURALES 35o período de sesiones Ginebra, 7 a 25 de noviembre de 2005 OBSERVACIÓN GENERAL No 17 (2005) Adoptada el 21 de noviembre de 2005* Disponible en línea en http://portal.unesco.org/culture/es/files/30545/11432108781Comment_sp.pdf/Comment_sp.pdf
  10. http://www.un.org/es/documents/udhr/index.shtml

by Bea at July 18, 2010 09:00 PM