La peligrosa pulsión por controlarlo todo

Enlace

El anuncio del gobierno nacional sobre el lanzamiento de un nuevo DNI con mayor tecnología dispara, por lo menos, dos dudas tan razonables como preocupantes. La primera es por qué nuestro país ha de embarcarse en la emisión de un nuevo documento, siendo que el DNI ya se ha modificado dos veces en los últimos cuatro años -ésta será la tercera-, y la segunda, por qué ha de contener, además de los datos identificatorios de la persona, otros vinculados con su historia clínica, la Anses, el PAMI y la tarjeta SUBE.

Artículo completo en La Nación.

Una estrategia para usar y recordar contraseñas distintas

Estándar

En el pasado han ocurrido filtraciones de contraseñas de usuario en sitios tales como LinkedIn y Last.fm. Esta clase de eventos ponen de manifiesto una problemática que muchos usuarios compartimos: la administración de diversas contraseñas. Lo ideal, desde el punto de vista de la seguridad informática, es utilizar para cada servicio una contraseña diferente, pero esto se hace muy difícil porque llega un punto en que no podemos recordarlas todas. Entonces, ¿qué terminamos haciendo?: pues usar la misma para todo. Esto es muy riesgoso, ya que si la seguridad de un sitio falla en mantener secretas las contraseñas de sus usuarios, es posible que alguien con malas intenciones las utilice para acceder a nuestras otras cuentas. Para paliar este problema, existen diversos administradores de contraseñas tales como LastPass o KeePass que nos permiten acceder a todas nuestras contraseñas mediante la utilización de una sola. Sin embargo, estas herramientas también pueden ser vulneradas como ya ha pasado. Entonces, ¿que es lo que se puede hacer?.

Un esquema de contraseña para gobernarlas a todas

La siguiente es una sugerencia que se puede usar para idear y recordar contraseñas, todas distintas y fáciles de recordar. Algo así como un algoritmo de creación de contraseñas.

  1. Como primer paso, elijamos una frase, una que sea fácil de recordar. Como ejemplo vamos a usar un trabalenguas muy famoso: tres tristes tigres comen trigo en un trigal.
  2. A continuación extraemos la primer letra de cada palabra de la frase, con lo que obtenemos: tttcteun.
  3. Supongamos que vamos a crear una cuenta en WordPress. Teniendo en cuenta esto, vamos a modificar nuestra contraseña hasta el momento, quedando de la siguiente forma: tttc-WORDPRESS-teut. Lo que hicimos fue agregar entre guiones el nombre del sitio convertido a mayúsculas. De esta manera, la contraseña siempre va a ser diferente de acuerdo al sitio en el que estemos por iniciar sesión.
  4. Este paso es opcional: para dar mayor fortaleza a nuestra contraseña podemos agregar números en cualquier parte de la misma, quedando: tttc1-WORDPRESS-teut2

Esta estrategia se me ocurrió visitando este sitio de la Gibson Research Corporation. En el mismo podemos también usar la utilidad que se encuentra allí para darnos una idea de la fortaleza de nuestra nueva contraseña.

Por supuesto, es posible adaptar los expuesto anteriormente al esquema que se les ocurra.

Como acceder a la memoria interna de una tablet PC con Android desde Windows 7

Estándar

La novia de mi hermano tiene una tablet PC de la marca i-modo que ejecuta Android 2.3.4, y me pide que intente acceder al almacenamiento interno de la tableta con el propósito de poder copiar unas imágenes a la misma y mostrárselas a otra gente.

Luego de investigar, probar y renegar con el aparatejo por espacio de un par de horas, se me da por explorar el panel de configuración y me encuentro con que se estaba activado el modo de depuración USB. Desmarco el checkbox correspondiente y voila, al fin pude administrar sus archivos internos con el Explorador de Windows.

Todo esto lo hice desde un Windows 7 de 64 bits, sin tener que instalar drivers ni aplicaciones de terceros. Probablemente se pueda acceder a la tablet con Windows XP, pero no lo he probado ya que no dispongo una instalación del mismo. Además no explico en detalle como se hace para desactivar el bendito modo ni comparto imágenes de los pasos a seguir porque no estoy seguro si en otros dispositivos la interfaz es la misma. Van a tener que navegar por los menús de opciones por ustedes mismos.

Instalar PEAR en Debian Squeeze siendo usuario normal

Estándar

Para un proyecto PHP en el que estoy trabajando necesitaba instalar una versión reciente de PEAR. Como no quería realizar la instalación de manera global para no interferir con el sistema de paquetes de Debian ni utilizar la ya instalada por ser anticuada busqué la forma de hacerlo en un directorio de mi elección.

El proceso

Antes que nada abrimos una terminal que nos de acceso a un interprete de línea de comando.

Necesitamos el archivo phar que contiene el administrador de paquetes PEAR. Lo descargamos de esta URL: http://pear.php.net/go-pear.phar. Teniendo instalado wget u otro gestor de descarga de nuestra elección, ejecutamos:

$ wget http://pear.php.net/go-pear.phar

o lo bajamos directamente usando el navegador web actual.

Por defecto, la versión de PHP 5.3 que trae Debian tiene incorporado el parche Suhosin, el cual agrega seguridad al interprete pero resulta en ligeras incomodidades para los desarrolladores. Por mi parte aplaudo la decisión del equipo empaquetador. En consecuencia, si ejecutamos a continuación $ php go-pear.phar como muchos intuirían veremos que no pasa nada. Ni siquiera un mensaje indicando que el comando no tuvo éxito. Solo si inspeccionamos el archivo /var/log/syslog veremos unas líneas producidas por Suhosin indicando el error ocurrido. Esto pasa porque la configuración por defecto de PHP que trae Debian prohíbe la ejecución del especificado tipo de archivo.

Para sobrepasar este escollo debemos decirle al interprete de PHP que ignore dicha directiva solo por esta ejecución y ejecute el archivo phar indicado:

$ php -d suhosin.executor.include.whitelist="phar" go-pear.phar

Con lo cual la instalación iniciará su curso normal. Solo resta seguir las instrucciones que aparecen en pantalla.

Django y el error “object has no attribute ‘__name__'” al usar objetos invocables

Estándar

El framework web Django acepta como vista (concepto conocido en otros entornos como controlador) cualquier función o clase que cumpla con la interfaz “callable” (o invocable en castellano). Si decidimos emplear esta última forma nos encontraremos con que Django lanza una excepción en principio desconcertante:

AttributeError: object has no attribute '__name__'

¿Pero de donde sale eso? ¿Acaso Django se ha vuelto loco? ¡Si yo definí el método __call__ en la clase! ¡El framework no debería quejarse! ¡#$%&@! :D.

La respuesta a esto y tal vez a los improperios lanzados por el desarrollador 😉 es que en algún lugar de las profundidades del código fuente de Django (en un momento encontré el módulo causante del error pero ahora no lo recuerdo) el mismo está intentando acceder al atributo que menciona la excepción.

Cuando uno define una función en Python mediante la palabra clave def, detrás de bambalinas el interprete agrega el atributo __name__ a la misma (recordemos que en Python todo es un objeto, incluidas las clases y las funciones, y hasta es posible asignar atributos a esta última). Obviamente el framework espera que este atributo exista, es decir, espera una función propiamente dicha y no un objeto invocable.

La solución a esto es definir __name__ a mano, de la siguiente manera:

class Qwerty(object):

    __name__ = 'Qwerty'

    def __call__(self, *args, **kwargs):

        print args
        print kwargs

Personalmente he encontrado este error agregando vistas a la interfaz de administración que el framework genera con la ayuda del paquete django.contrib.admin (tal vez sea solo un bug que afecte a este paquete, debería probar usando objetos invocables en el despachador de URLs). Con esto espero ahorrarle a alguien horas de esfuerzo, desesperación y mechones de pelo. A mi me hubiese encantado :P.

Prácticas y ejercicios para aprender a usar LibreOffice y/o OpenOffice.org

Estándar

Acabo de poner a disposición de todos documentos en los cuales se presentan prácticas y ejercicios cuya intención es la de ayudar al aprendizaje en el uso de las suites ofimáticas LibreOffice y/o OpenOffice.org. Originalmente los confeccioné para cumplir mi papel de tallerista en el Programa Jóvenes con Más y Mejor Trabajo del Ministerio de Trabajo, Empleo y Seguridad Social de la República Argentina. Que les sea de provecho.

Problema de sincronización utilizando .ajax() y .submit() de jQuery

Estándar

Trabajando con jQuery me encuentro con un error en mi código que al principio hizo que me arrancara algunos mechones de pelo de mi cabeza ;).

Resulta que estaba escribiendo una función “callback” para el manejador de evento .submit() de jQuery asociado a un formulario. En el cuerpo de dicha función debía completar automáticamente un campo de acuerdo a valores ya introducidos y obtener un documento JSON desde el servidor con mas datos y en conjunto finalmente poder completar el campo. Para esto último necesitaba usar .ajax(). Y mi odisea empezó…

Por alguna extraña razón la llamada al servidor nunca llegaba a destino y la función “callback” error de .ajax() era invocada pasando un parámetro de error con valor 0. WTF pensaba.

Luego de un tiempo de probar y probar me di cuenta que no le daba tiempo a .ajax() para ejecutar su llamada al servidor ya que la función .submit() retornaba demasiado rápido. Teniendo en cuenta que por defecto .ajax() es asincrónico, pasando como parámetro async: false solucioné el problema.

Controladores flacos, Modelos gordos y Vistas tontas

Estándar

He llegado a la conclusión que cuando uno implementa el patrón de diseño MVC en una aplicación es una buena idea crear controladores que sean muy simples, modelos en donde resida la mayor parte del código, y finalmente vistas con código solamente relacionado con la muestra de datos al usuario y disposición (layout).

Algunas recomendaciones

Acerca de los controladores

Deberían consistir (en lo posible) en muy poco código, el suficiente como para responder a eventos (donde corresponda), dirigir el flujo de la aplicación de acuerdo a los estados de las entidades modelo invocando métodos dispuestos para tal fin, configurando la vista y poco mas de acuerdo a las necesidades.

Acerca de los modelos

El grueso de la aplicación debería residir en ellos: desde la lógica de negocios (obviamente ;)) pasando por la validación y hasta generación de vistas en base a su estado interno para estas ser entregadas a los controladores de acuerdo lo soliciten. Esto último no significa que los modelos deban generar y administrar la interfaz gráfica por si mismos, sino que deberían mantener alguna clase de referencia a mecanismos que lo hagan por ella, de manera de no exponer la información privada del modelo hacia otras partes de la aplicación, manteniendo el encapsulamiento, facilitando la refactorización y el reuso de código.

Es importante aclarar que solo los modelos pueden alterar su estado interno. Exponer un atributo privado mediante un método setter, sin que cumpla otra función mas que la de asignar un valor a dicho atributo, es equivalente a hacerlo público, por lo tanto es una mala practica de diseño. Por ejemplo: en vez de que un controlador use el siguiente pseudocódigo:

empleado.set_sueldo(empleado.get_sueldo() + (porcentaje * empleado.get_sueldo() / 100))

para modificar un sueldo sería mejor escribir

empleado.modificar_sueldo(porcentaje)

siendo porcentaje un entero positivo o negativo.

Acerca de las vistas

Solo deberían encargarse de la visualización del estado de los modelos utilizando lógica para tal fin pero para nada mas. Hay que mantenerlas bien simples y desprovistas de lógica en la medida de lo posible.

En fin

Lo expuesto anteriormente representa mi humilde opinión basada en la relativamente poca experiencia que tengo desarrollando software. Toda la información que he leído hasta ahora me hace pensar que no hay una única forma de implementar MVC y que el patrón puede y debe adaptarse a diferentes contextos de ejecución y lenguajes.

¡Hola Mundo!

Estándar

Saludos a todos los que pasan por este blog (ya sea por casualidad o intencionalmente :D).

Hace poco abrí una cuenta en WordPress.com ya que tenía ganas de probar algo nuevo y ver que tal es el servicio que proveen (que dicho sea de paso me parece muy bueno a pesar del corto tiempo que llevo usándolo). Tengo otro blog en Blogger.com pero así como se creó fue dejado de lado :). Mi filosofía es tratar en lo posible no depender de gigantes como Google que, aunque tengan como lema “No hacer el mal”, su injerencia en Internet es tan grande que a la larga o a la corta van a terminar haciendo algo “evil” (ya sea en lo moral y/o legal, aunque en este último apartado es mas difícil que suceda y/o que se note ;)).

Quienes me conocen dirían “vos siempre cambiando”. Y tienen razón, me encanta el cambio. No puedo estar sin el. Odio el estancamiento.

Bueno, eso es todo por ahora. Espero que la fiebre “bloguera” no se me pase tan rápido como la última vez.

Hasta entonces, nos estamos leyendo.