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


Quoted

Fillipo has just published Implementing Erasure Policies Using Taint Analysis.

With this in mind, and inspired by Conti and Russo’s work, we implement a mechanism to perform taint propagation, i.e. how to mark as erasure-aware data that is computed from other erasure-aware values. From now on, we use taint and erasure-aware as interchangeable terms.

Algunos problemas y soluciones al levantar bases de datos legacy con Django

Con Django podemos levantar una base de datos legacy en lugar de definir nuestro modelo de datos y arrancar una aplicación desde cero. No es necesariamente una base de datos vieja, sino una base de datos heredada de otro sistema; puede ser de un sistema anterior que se está reemplazando o incluso de otro sistema que queremos usar de forma paralela.

Luego de configurar nuestra base de datos y ejecutar:

python manage.py inspectdb > models.py

obtenemos una definición de modelos basada en en las tablas de la base de datos. Lo siguiente es ver si anda.

Lo más probable es que obtengamos un NameError. Esto pasa cuando en la definición de alguno de los modelos se hace referencia a otro modelo aún no definido! La solución indicada es empezar a reordernar los modelos, pero una forma más fácil es cambiar los nombres por strings. Un ejemplo:

jefe = models.ForeingKey(Empleado)

por

jefe = models.ForeingKey('Empleado')

Otra queja que nos puede hacer Django es que tengamos atributos llamados id que no sean primary key. Solución: les cambiamos el nombre.

Eventualmente vamos a necesitar habilitar la aplicación admin (ya que estamos usando Django para levantar datos, nada mejor que usar su ABM estrella para ahorrarnos mucho trbajo). Los pasos para hacer con éxito son:

  1. Habilitar la aplicaccion admin en settings.py.
  2. Ejecutar syncdb para que se creen las tablas de esta aplicación.
  3. Agregar los modelos de la base de datos heredada al archivo admin.py de la aplicación.

Por supuesto, si los nuevos modelos son cientos, es bastante engorroso hacer esto a mano. Les paso un hack; así luce mi admin.py:

from django.contrib import admin

from django.db.models import base

from my_app.models import *



for k,v in locals().items():

    if isinstance(v, base.ModelBase):

        admin.site.register(v)

Tip final. Si obtenemos un error de este tipo:

OperationalError at /admin/mango/datapointusers/

(1054, "Unknown column 'dataPointUsers.id' in 'field list'")

es por que alguna de las tablas levantadas no tenía una columna que sea clave primaria. Django necesita esto para poder distinguir los objetos entre si. Para cada tabla dónde tengamos este problema, podemos ejecutar el siguiente comando SQL para agregarle una columna llamada id; clave primaria y auto numérico.

ALTER TABLE `dataPointUsers` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;


Seminario: “La seguridad en el proceso de desarrollo de software”

El grupo del que participo en la facu va a estar dando un seminario a modo de comunicar lo que estuvimos haciendo en los 2 años de trabajo. Salió en el emilio:

Tendrá lugar en nuestra Facultad el seminario gratuito: “La seguridad en el proceso de desarrollo de software”. Expositores: Marta Castellaro, Pablo Pessonali, Juan Carlos Ramos, Susana Romaniz, Carlos Feck y Juan José Conti.
  • Fecha y hora de realización: jueves 28 de octubre, a las 17:00.
  • Duración: 2 horas.
  • Lugar: Aula Multimedios 1

Sin requisitos. Cupo limitado.

Certificado: de asistencia otorgado por la Facultad -sin evaluación.

Departamento Sistemas - UTN Santa Fe.




Mis charlas en PyConAr2010

Hoy, en el primer día de PyCon Argentina, en Córdoba, me tocó dar 2 charlas programadas y de yapa una charla relámpago. Les dejo mis slides:

    <li><a href="https://viejoblog.juanjoconti.com.ar/files/charlas/TaintModePyConAr2010.pdf" target="_blank">Taint Mode en Python</a>: Taint Mode es un modo de ejecución de algunos lenguajes de programación que permiten advertirle al programador sobre potenciales problemas de seguridad en su código. La charla: repaso de conceptos, discusiones sobre implementaciones, como funciona nuestra biblioteca y su API.</li>
    
    <li><a href="https://viejoblog.juanjoconti.com.ar/files/charlas/DecoradoresPyConAr2010.pdf" target="_blank">Entendiendo decoradores en Python</a>: los decoradores son una herramienta muy potente que viene con el lenguaje y permiten introducir cambios en código ya escrito de una forma poco intrusiva; sirven por ejemplo para hacer programación orientada a aspectos en Python. La charla: objetos, funciones, decoradores, decoradores con parámetros, clases decoradoras, decorando clases.</li>
    
    <li><a href="http://svn.juanjoconti.com.ar/dyntaint/trunk/webdemo/" target="_blank">Demo en Taint Mode en Python</a>: mostré  2 slides de la primer charla más una aplicación demo que sirve de prueba de concepto para mostrar que todo lo que dije antes funciona.</li>
    

    update:

    Fotos del primer día.


    Entendiendo *args y **kwargs en Python

    Me llegó un mail consultando sobre args y *kwargs en Python. ¿Qué es eso? Vamos por partes.

    En Python existen varias formas de llamar a una función. Por ejemplo, en su definición puede tener valores por defecto, entonces no es necesario utilizarlos todos al llamarla:

    >>> def f(a, b, c=3):
    

    ... print a, b, c

    ...

    >>> f(1,2)

    1 2 3

    Se pueden utilizar palabras claves como argumento, por supuesto, respetando algunas reglas:

    >>> def f(a, b, c):
    
    ...     print a, b, c
    
    ...
    
    >>> f(a=1, b=2, c=3)
    
    1 2 3
    
    >>> f(a=1, 2, 3)
    
      File "", line 1
    
    SyntaxError: non-keyword arg after keyword arg
    
    >>> f(1, 2, b=3)
    
    Traceback (most recent call last):
    
      File "", line 1, in
    
    TypeError: f() got multiple values for keyword argument 'b'
    
    >>> f(1, b=2, c=3)
    
    1 2 3

    Y finalmente, se puede llamar con listas arbitrarias de argumentos. Como en los casos anteriores, poder hacerlo depende de cómo hayamos definido la función:

    >>> def f(*args, **kwargs):
    
    ...     print "args:", args
    
    ...     print "kwargs:", kwargs
    
    ...

    Con args se indica, mapear todos los argumentos posicionales a una tupla llamada args. Y con *kwargs se indica, mapear todos los argumentos de palabra clave a un diccionario llamado kwargs.

    >>> f(1,2,3)
    
    args: (1, 2, 3)
    
    kwargs: {}
    
    >>> f(1,2,3, cuatro=4)
    
    args: (1, 2, 3)
    
    kwargs: {'cuatro': 4}
    
    >>> f(cuatro=4)
    
    args: ()
    
    kwargs: {'cuatro': 4}

    Notemos que se pueden definir argumentos con nombre propio antes de los argumentos agrupados y que no es necesario usar exactamente los nombres args y kwargs. También puede usarse solo uno de los dos:

    >>> def f(p, *a, **kw):
    
    ...     print "p:", p
    
    ...     print "a:", a
    
    ...     print "kw:", kw
    
    ...
    
    >>> f(1,2,3)
    
    p: 1
    
    a: (2, 3)
    
    kw: {}
    
    >>> f(1,2,3, cuatro=4)
    
    p: 1
    
    a: (2, 3)
    
    kw: {'cuatro': 4}
    
    >>> f(cuatro=4)
    
    Traceback (most recent call last):
    
      File "", line 1, in
    
    TypeError: f() takes at least 1 non-keyword argument (0 given)

    Espero que los ejemplos sirvan. Para más detalle, se pueden consultar las secciones del Tutorial de Python que enlacé.


    El hack del día: cómo usar Citrix desde Ubuntu

    Con el nombre genérico de Citrix, se suele conocer dentro de muchas empresas a una solución de virtualización de aplicaciones (XenApp) muy utilizada en corporaciones que permite a los usuarios conectarse con su PC a un servidor remoto y ejecutar las aplicaciones que allí se encuentran. Con esto se logra por ejemplo: reducir el gasto en licencias y centralizar actualizaciones.

    En la empresa donde trabajo (una multinacional del rubro de las telecomunicaciones) lo usa. Además de aplicaciones de gestión de equipos, dentro de "Citrix", se puede correr un escritorio remoto. Esto permite, desde una PC con Internet, acceder a tu puesto de trabajo respetando las políticas de seguridad que haya dispuesto la empresa.

    Ok, quiero acceder desde GNU/Linux. En particular Ubuntu, el SO que uso en mi notebook. El la mayoría de los casos, no vamos a tener soporte para esto. Escribo las siguientes instrucciones con la esperanza de que a alguien le sirva dentro de su organización.

    Lo primero que necesitamos es un software cliente. Es la parte fácil. Podemos bajar el cliente e instalarlo. El ejecutable queda en:

    /usr/lib/ICAClient/wfcmgr
    

    Al intenatr ejecutarlo puede ser que obtengamos un error diciendo que falta la bibiloteca libXm.so.4. en Ubuntu 10.04 no viene la versión 4 de esta biblioteca, sino la 3.

    Podemos instalar la versión 3:

    sudo apt-get install libmotif3
    
    

    y engañarlo; parece funcionar sin problemas:

    sudo ln -s /usr/lib/libXm.so.3.0.2 /usr/lib/libXm.so.4
    
    

    Lo siguiente que falta es un certificado, de lo contrario al intentar conectarnos obtendremos un error diciendo que no hemos especificado que confiamos en el host que nos servirá las aplicaciones.

    A los usuarios de Windows les dan un archivo binario de extesión .p7b al que le hacen click derecho y eligen la opción "Instalar certificado". En GNU/Linux no es tan fácil y luego de buscar bastante en Internet, no encontré la forma de instalarlo, pero la solución me llegó casi Inspiración Divina o por Instinto Animal.

    Utilicé el comando strings para leer cadenas de texto dentro del archivo .p7b y con grep busqué .crt, la extensión de los certificados:

    strings XXXX.p7b | grep .crt
    
    

    Encontré una url dentro de la empresa, me bajé el certificado y lo guardé en /usr/lib/ICAClient/keystore/cacerts, que es donde Citrix Xen App guarda los certificados.

    Voilá! Estaba adentro.


    Historias en Internet: el busto de Carlos Pellegrini

    El domingo a la tarde completé una misión que se me había asignado en el año 2006.

    Wikimedia Commons es el sitio web que sirve de repositorio de imágenes, videos, canciones y otras para Wikipedia (la enciclopedia libre) y sus proyectos hermanos.

    En el año 2006 subí varias fotos de mi pueblo, Carlos Pellegrini, entre ellas la de un busto de vice presidente del que tomó el nombre mi localidad (antes se llamaba Los Algarrobos). Estas es la imagen original:

    Luego de eso no volví a logearme en Commons. Años más tarde, en el 2009, entré para subir otras fotos y allí enocntré un mensaje de uno de los usuarios. Rosarinagazo decía:

    He visto que subiste la imagen del busto de Pellegrini que está en la localidad de Carlos Pellegrini. ¿Podrías hacerme un inmenso favor?, si estás allí, fijarte si está la firma del escultor. Estamos haciendo el Catálogo del escultor rosarino Erminio Blotta, y ¡podría ser de él!. Gracias de todas maneras Rosarinagazo 13:58, 7 September 2006 (UTC)

    ¡Habían pasado más de 3 años! Un montón para la velocidad a la que se mueve Internet. Ante la duda, le dejé un mensaje:

    Hace 3 años me preguntaste por el Busto de Carlos Pellegrini en la localidad de Carlos Pellegrini. Si todavía te interesa puedo verlo.

    Por esas cosas de la vida, me olvidé totalmente de este mensaje que había dejado en su página personal. Hace una semana volví a entrar:

    ¡¡¡Sí!!!, me interesa te fijes en el busto. Gracias Rosarinagazo 12:29, 10 August 2009 (UTC)

    Así que este domingo, aprovechando la visita a mi casa y luego del asado del domingo, me llegué hasta el centro de la plaza, que está en el centro del pueblo a cumplir con el encargue. Ceci me acompañó. No dejaba de ser divertido.

    Llegamos y miramos un poco, rapidamente al costado vimos una firma. Me trepé y con los dedos limpié un poco de la tierra que se había metido en la caligrafía del artista. No se leía.

    No supimos si era Mario o María, seguido por un apellido largo que empieza en C o L. Pero no era Erminio Blotta. Una lástima. Si bien parecía que no se veía nada, le sacamos un par de fotos para verlas luego con la computadora. Y aquí está la prueba:

    Misión cumplida. Tarde. Y fallida.