Columnas publicadas en 2010
| Title | Voto electrónico |
| Publication Type | Magazine Article |
| Year of Publication | 2010 |
| Authors | Wolf G |
| Magazine | Software Gurú |
| Frequency | Quarterly |
| Issue Number | 27 |
| Date Published | 02/2010 |
| Type of Article | Column |
| ISSN | 1870-0888 |
| Keywords | confiabilidad, democracia, Seguridad, voto electrónico |
| URL | http://www.sg.com.mx/content/view/919 |
| Full Text |
Voto electrónico La postura que ante las votaciones electrónicas han tomado diversos grupos relacionados con la creación y escrutinio de software y de procesos sociales ilustra muy bien varios de los puntos delineados en otros capítulos de la presente obra. Este capítulo formaba parte originalmente del capítulo «Software Libre y Construcción Democrática de la Sociedad», e ilustra uno de los puntos y de las maneras en que las comunidades de creación de conocimiento tanto de seguridad en cómputo como de Software Libre han abordado un punto de gran importancia para la vida en sociedades democráticas actuales, insertándose en el entorno político imperante. Hemos decidido, tanto por la extensión como por la relación de este tema con varios otros de los presentados en esta obra, hacer del presente apartado un capítulo independiente.
En las siguientes secciones analizamos por qué los tres argumentos caen por su propio peso. Agilidad en la obtención de resultados Una de las principales obsesiones de la sociedad actual es la velocidad del acceso a la información. Los medios electrónicos de comunicación y el uso de Internet nos han acostumbrado a que la información debe estar disponible tan pronto ocurren los hechos, y debe llegar a toda la sociedad tan pronto está disponible.
El uso de boletas a papel y tinta aptas para ser scanneadas por equipo de reconocimiento óptico puede ser la opción más adecuada en este sentido. Permite la verificación de cientos de boletas en apenas un par de minutos, y permite conservar todos los atributos positivos del sistema tradicional. Confiabilidad de los actores Algunos proponentes del voto electrónico mencionan que con el voto tradicional en papel todos estos fraudes siempre han existidohttp://seminario.edusol.info/resena/beatriz-ramirez/2009/03-1 (requiere registro)" href="#footnote1_zcki0ri">1, y que éste no agrava los riesgos — Sin embargo, más que reducir las posibilidades de los agentes fraudulentos, al implementar el voto electrónico estaríamos aumentando la profundidad a la que podrían llegar, e imposibilitando cualquier acción de auditoría o rendición de cuentas.
Uno de los más interesantes argumentos que ilustran por qué las urnas electrónicas carecen inherentemente de confiabilidad es el presentado —sin aplicarlo en éste ramo específico— por Ken Thompson en 1983 [8], en su discurso al recibir el Premio Turing de la ACM2. Thompson hace una sencilla demostración de por qué un sistema que llega al usuario final (y esto es mucho más cierto hoy en día que en 1983, en que los lenguajes y marcos de desarrollo utilizados suben increíblemente en la escala de la abstracción comparado con lo existente entonces) es prácticamente imposible de auditar por completo un programa, ni siquiera teniendo su código fuente, ni siquiera teniendo el código fuente del compilador. Traduciendo de las conclusiones de Thompson:
Éste argumento ha sido clave para llegar a conclusiones como la adoptada en marzo del 2009 por la Corte Suprema de Alemania [9],[10]:
El punto de la confiabilidad es el que más fervientemente se sigue debatiendo. El caso brasileño resulta muy esperanzador: A diferencia de la mayor parte de los gobiernos de países supuestamente desarrollados, en Brasil la tecnología utilizada para el voto electrónico está completamente basada en tecnología desarrollada localmente, empleando software libre. En noviembre del 2009, el Tribunal Superior Electoral brasileño convocó a la comunidad de seguridad a encontrar vulnerabilidades sobre las estaciones receptoras de votos, a cambio de una recompensa económica para los mejores análisis[11]. Dentro de los términos estipulados, sólo uno de los participantes (Sergio Freitas da Silva) logró su propósito [12]. Y si bien no logró vulnerar los resultados de éste sistema, sí logró –mediante un monitoreo de las radiaciones electromagnéticas– averiguar por quién emitía su voto cada uno de los electores, rompiendo el principio de secrecía electoral, empleando únicamente equipo casero de bajo costo al buscar que esto fuera meramente una prueba de concepto; un atacante determinado podría utilizar equipo mucho más sofisticado para intervenir las votaciones a mucha mayor distancia. Disminución de costos La sociedad está acostumbrada a lidiar con los bemoles del voto tradicional, utilizando al papel como su medio primario. Una crítica muy común a éstos procesos, especialmente en los países cuyas democracias no están bien consolidadas (y por tanto, requieren de mucho mayor inversión tanto en la vigilancia como en la promoción de la participación de las elecciones) es el costo — En México, citando a un caso extremo (el sistema electoral más caro de América Latina [13]), cada sufragio emitido en las elecciones intermedias del 2009 tuvo un costo superior a los 17 dólares, aunque hay estimaciones que lo llegan a ubicar en hasta 50 dólares, tomando en cuenta gastos ocultos.
El último punto mencionado es de especial relevancia: Un rastro impreso verificado por cada votante. La única garantía que un votante puede tener de que su voto fue registrado correctamente es que el sistema genere una boleta impresa y de caracter irrevocable, misma que sea verificada por el votante al instante, la cual se convertirá en el documento probatorio de la elección3. No hay manera —ver la cita de [8] en la sección Confiabilidad de los actores— de que el estado interno de una computadora sea confiable, y muchísimo menos cuando hablamos del proceso más importante y más sensible de la vida política de un país. Referencias
|
| Attachment | Size |
|---|---|
| Versión del artículo tal como fue enviada a SoftwareGurú | 11.91 KB |
| Versión impresa en SG (primer página) | 533 KB |
| Versión impresa en SG (segunda página) | 465.55 KB |
| Presentación en PDF | 908.54 KB |
| Title | Arquitecturas de paquetes al rescate |
| Publication Type | Magazine Article |
| Year of Publication | 2010 |
| Authors | Wolf G |
| Refereed Designation | Non-Refereed |
| Magazine | Software Gurú |
| Frequency | Quarterly |
| Issue Number | 28 |
| Date Published | 05/2010 |
| Type of Article | Column |
| ISSN | 1870-0888 |
| Keywords | Arquitectura de paquetes, Linux, modularización |
| URL | http://www.sg.com.mx/content/view/1054 |
| Short Title | Arquitecturas de paquetes al rescate |
| Full Text | Modularización: Arquitecturas de paquetes al rescateConvirtiendo a la hidra en nuestra aliadaEn el número 27 de Software Gurú, Agustín Ramos presentó un artículo acerca de estrategias para lograr una modularización efectiva en Java. Varios de los puntos de su artículo me llevaron a dedicar la presente columna a explicar a qué llamamos una distribución de Linux, y cuál es su relación –y la solución que ofrece– a los problemas derivados de la complejidad derivada de la modularización, que bien describió Agustín. Como deben ya saberlo, a diferencia de otros sistemas operativos, el entorno operativo completo al que normalmente nos referimos como Linux no es desarrollado por un sólo grupo, ni sigue un roadmap, criterios o visión en común. Mucho se ha argumentado acerca de las características que diferencían a los proyectos desarrollados desde planteamientos libres de aquellos desarrollados siguiendo metodologías tradicionales — No abordaré dicha discusión en este momento. Sin embargo, no quiero dejar de aprovechar la oportunidad de tener un artículo escrito por un colega en esta revista para ilustrar cómo abordamos la relación entre proyectos independientes –que logran una complejidad de miras mucho mayor que cualquier instancia de conjuntos de módulos desarrollados en casa– en el Software Libre, por qué enfatizamos tanto en lo prevalente que resulta dicha modularización, y cómo nos enfrentamos a su inherente complejidad. Los sistemas basados en Linux son estructurados, pues, en distribuciones. Una distribución es un conjunto de programas –típicamente del órden de miles– que, entre todos, presentan la funcionalidad que un usuario espera ya no sólo de un sistema operativo sino que de todo un entorno operativo integrado. Además, se encargan de gestionar las relaciones de dependencia entre dichos programas, y resolver dichas dependencias, para facilitar al usuario la instalación, remoción y actualización de software. Una instalación mínima de cualquier distribución de Linux no tiene menos de un par de centenares de paquetes individuales. El núcleo Linux, por sí mismo, no representa más que la interfaz más básica para presentar una abstracción del hardware ante los programas que corren sobre él. Formalmente, al mencionar Linux ni siquiera nos referimos a la interfaz de línea de comandos (misma que generalmente es provista por los paquetes bash, dash o sash, dependiendo de las necesidades del administrador). Son en realidad contados los paquetes que no dependen más que de paquetes esenciales. Toda distribución define un pequeño conjunto (decenas) de programas que es fundamental tener instalados como base para cualquier otro, conjunto mínimo que asumimos que siempre estará ahí para asegurarnos la funcionalidad mínima. Si bien las primeras distribuciones tuvieron por objetivo facilitar la instalación de un sistema basado en Linux a usuarios con menor involucramiento técnico, y fueron instrumentales en la primer ola expansiva de usuarios que fuimos adoptando Linux hacia mediados de los 1990, han trascendido ya a éste rol para dar respuesta al infierno de dependencias al que se refiere en su texto Agustín Ramos: Hacia fines de los 1990, aproximadamente cuando todas las distribuciones comenzaban a contar en miles los paquetes independientes que ofrecían, comenzó a hacerse obvio que no bastaba con que cada paquete indicara de qué otros paquetes dependía (incluyendo, claro está, la información de versiones pertinente), sino que era necesario contar con una arquitectura de paquetes: Un esquema orientado a depósitos y no a paquetes individuales, que se encargara de resolver las dependencias cada que el administrador instalara o eliminara un paquete. La primera arquitectura fue introducida por la distribución Debian, bajo el nombre de apt: A Package Tool. Es definitivamente gracias a apt que, al día de hoy, la versión de desarrollo de Debian cuenta con 15640 paquetes fuente independientes, que resultan en 27886 paquetes binarios, cubriendo prácticamente todas las áreas de necesidad en cómputo, tanto a nivel de aplicaciones como de bibliotecas. A diferencia de otras arquitecturas previas, como los ports de los Unixes BSD, Apt está además construido basado en el manejo de depósitos múltiples. Esto significa que, además de servirme para instalar los paquetes oficiales de la distribución, nos permite definir depósitos adicionales con el software que desarrollemos localmente, así como de paquetes adicionales que preparemos localmente para uso en nuestra organización. Con esto como introducción, veamos cómo ésto se aplica al texto de Agustín. Por razones de espacio, me enfoco a cómo éste esquema reduce fuertemente los efectos negativos de la modularización, permitiendo a los desarrolladores crear software más robusto y temer menos a esta tan dificil de conciliar fuente de dolores de cabeza.
Como pueden ver, manejar una arquitectura de paquetes simplifica algunas de las tareas más complicadas (y más ingratas) del desarrollo de software, el manejo de toda la talacha creada por los componentes que, a fin de cuentas, incluimos para ahorrarnos trabajo. Cuando veo los instaladores típicos, que crean enormes amasijos (típicamente en forma de enormes instaladores .msi o archivos .jar que incluyen copia de todas las dependencias para evitar estos problemas), no exagero: Me dan ganas de llorar. Porque además, al tener varias copias de una misma biblioteca en el sistema, tengo la certeza de que en caso de aparecer algún defecto en alguna de ellas, habrá componentes de mi sistema que reciban la corrección en cuestión — pero habrá otros que no. Acostumbrarse al manejo de dependencias externas nos reduce la tentación de acudir al tan temido ligado estático, reduce el peso de nuestras imágenes de instalación (y de nuestros sistemas ya instalados), y ayuda fuertemente a mantener un mayor control de calidad en nuestros procesos como un todo. Mucha gente evita aprovechar la modularización como medida preventiva para no perder la razón resolviendo dependencias y bugs creados por compatibilidad incompleta entre versiones. Sin embargo, dejar de usar buen software, ya existente y probado por terceros, sólo por no contar con las herramientas de seguimiento correctas es un triste error en el que debemos evitar caer. La hidra de la modularización a la que se refiere Agustín puede ser un mounstro mortal, pero si aprendemos a hablar con ella puede ser nuestro mayor aliado. Porque si dos cabezas piensan mejor que una, ¿qué decir de decenas de cabezas? |
| Attachment | Size |
|---|---|
| Texto del artículo enviado para su publicación | 10.82 KB |
| Fotografía de la primera página (publicada) | 965.07 KB |
| Fotografía de la segunda página (publicada) | 1.05 MB |
| Title | Historia y futuro de la interfaz hombre-máquina |
| Publication Type | Magazine Article |
| Year of Publication | 2010 |
| Authors | Wolf G |
| Refereed Designation | Non-Refereed |
| Magazine | Software Gurú |
| Frequency | Quarterly |
| Issue Number | 29 |
| Pagination | 46-47 |
| Date Published | 2010-08-01 |
| Type of Article | Column |
| ISSN | 1870-0888 |
| Keywords | historia, interfaz hombre máquina, interfaz usuario |
| URL | http://www.sg.com.mx/content/view/1087 |
| Full Text |
Historia y futuro de la interfaz hombre-máquinaFrecuentemente nos mostramos maravillados de cómo ha avanzado la manera en que interactuamos con la computadora en los últimos años, sin detenernos a pensar cuánta verdad hay –o no– detrás de esta afirmación. A fin de cuentas, hace apenas unos años el uso de las computadoras era verdaderamente limitado, y hoy en día están en todos lados, y parecería que cualquiera es capaz de manejarlas — Al menos, en sus funciones básicas. Yo sostengo que esta es una afirmación falsa, basada en las apreciaciones de gente ajena a nuestro campo, y producto más de la popularización que de un verdadero cambio cualitativo. Claro está, al poner en duda lo universalmente aceptado, recae en mí sustentar mi afirmación. Vamos, pues, con un breve recorrido de cómo evolucionó la interacción hasta el día de hoy. Los iniciosLas primeras décadas del desarrollo de la computación como una disciplina aplicada de la ingeniería (tomando como punto de partida de forma un tanto arbitraria a la primer computadora electrónica en 1943, ENIAC) verdaderamente vieron un cambio radical en la manera en que los usuarios se aproximaban a la computadora — Esto resulta poco más que una obviedad, dado que antes de 1943 no existían las computadoras siquiera. Las primeras computadoras no tenían nada que hoy reconoceríamos como interfaz — Tanto instrucciones como datos eran introducidos directamente a las ubicaciones de memoria al iniciar la ejecución a través de tarjetas perforadas, y eran leídos de los registros del procesador, mostrándolos directamente en un volcado binario, hacia tarjetas o cintas perforadas, que debían ser traducidas a algo legible empleando dispositivos mecánicos independientes. Teletipos y terminalesEl primer avance resultó en una dirección obvia, pero facilitó tremendamente tanto el uso como el aprovechamiento de los resultados: La interfaz textual. No hablo aún de una pantalla, sino de la adecuación del teletipo, híbrido de teclado e impresora, que comenzó su existencia como un reemplazo más ágil y confiable que el código Morse para la comunicación a larga distancia. El teletipo permitía ingresar programas mucho más complejos a memoria, lo cual llevó a que naciera y popularizara un concepto que nos parece muy ajeno a las interfaces de usuario: El de los archivos. Aparecieron los primeros editores (obviamente, mucho más espartanos de lo que conocemos hoy, y orientados a trabajo línea por línea), y como consecuencia directa, los programas pudieron comenzar a presentar una mucho mayor complejidad – llevando a la introducción de bibliotecas de código y a las diversas abstracciones y estrategias para manejar la complejidad. La transición del teletipo a la pantalla no es tan simple como podría parecer. Dejando de lado la mera complejidad técnica (relativa al estado del arte de la época) de crear dispositivos independientes y de relativo bajo costo capaces de mantener comunicación con la computadora central, generando la imagen en pantalla del texto que iban recibiendo — lo cual implicaba que tuvieran una memoria interna, aunque mínima para estándares modernos1, las ventajas de tener terminales con cierto grado de inteligencia se hicieron obvias, y comenzaron a aparecer terminales con diferentes estándares2 capaces de reposicionar el cursor, o de desplegar texto con atributos (negritas, subrayado, colores), caracteres semi-gráficos, hasta verdaderas capacidades de formularios como las que manejaban las IBM 3270, que comenzaron a permitir desacoplar la lógica de un programa de su presentación tal como hoy lo vemos en los navegadores Web. Las terminales además fueron centrales para la aparición de computadoras multitarea/multiusuario. Quienes gustamos de utilizar sistemas Unix utilizamos como una de nuestras herramientas más poderosas al emulador de terminal, o como le dice el resto del mundo, la ventana negra. Si bien las terminales como producto de hardware hace mucho tiempo que ya no existen para propósitos prácticos, la interfaz de línea de comandos programable permite un grado de expresividad tan rico que no ha podido ser reemplazado por ningún otro medio. WIMP: Window, Icon, Menu, PointerEn diciembre de 1968, en los laboratorios de Palo Alto de Xerox, Douglas Engelbart presentó la que al día de hoy se conoce como la madre de todas las demos: La introducción de la interfaz gráfica básica que seguimos utilizando hoy en día, manejada a través de un apuntador controlado por un mouse, presentando ventanas para la visualización de las diferentes aplicaciones en uso (o vistas de una misma aplicación), iconos representando atajos a las acciones de sistema disponibles, y con un menú como elemento estándar presentando las acciones relacionadas con cada aplicación activa. Y, claro, para la entrada y manipulación de datos dentro de cada aplicación, el dispositivo primario seguirá siendo el teclado. La demostración de Engelbart incluía ejemplos de aplicaciones verdaderamente revolucionarias en esa época, como la videoconferencia, el correo electrónico, el hipertexto o un editor colaborativo de tiempo real. Y aunque ha habido refinamientos sucesivos y grandes cambios en la parte estética de esta propuesta, para las computadoras de uso general seguimos utilizando este esquema de interacción — Con más de cuarenta años de antigüedad. Interfaces de propósito acotadoPosiblemente el mayor cambio en las interfaces de usuario viene de que, cada vez con mayor fuerza, tenemos dispositivos con gran poder de proceso de cómputo sin un formato de computadora de propósito general. No veo como casualidad que hoy veamos con entusiasmo a las interfaces tan revolucionarias como las presentes en teléfonos celulares o consolas de videojuego — Estamos llegando al punto en que vamos encontrando formas muy convenientes de interactuar con computadoras de propósito acotado, aunque éstas no sean adecuadas para aquellas de propósito general. Ilustro esto con dos ejemplos: Con la generación actual de consolas de videojuegos, Nintendo se anotó el mayor éxito al introducir su Wii: Una consola de relativamente bajas prestaciones y muy inferior a su competencia en las áreas en que típicamente competían, la capacidad gráfica. Sin embargo, su apuesta más fuerte fue hacia una interfaz novedosa: Los controles basados en acelerómetros, que permitieron modelar diferentes actividades como nunca antes se habían presentado en videojuegos. Por otro lado, el iPod de Apple introdujo una interfaz largamente prometida, basada en una pantalla táctil de tamaño reducido, y orientada a equipos destinados al entretenimiento, a la consulta rápida de información, y especialmente popularizada a través del teléfono aparecido poco tiempo después. Sin embargo, si bien esta interfaz ha resultado natural para una gran cantidad de personas, resultaría indudablemente impráctica y antiergonómica para una computadora de propósito general. Y claro, seguiremos viendo nuevas interfaces dedicadas a tareas específicas — Las más exitosas serán, sin duda, las más transparentes: Las que se integren de manera transparente a las tareas, mejorando nuestra vida sin requerir que reparemos siquiera en su existencia. Por ejemplo, ¿cuánta gente está consciente de la cantidad de cálculos que se realizan en un automóvil? ¿No es acaso uno de los mejores ejemplos de cómputo ubicuo que se ha insertado silenciosamente en nuestras vidas? Otras ideasHan habido, claro, otras muchas propuestas de interfaces para uso general. En general no han sido bien aceptadas, o han sido empleadas sólo en contextos muy específicos. Algunos ejemplos son:
Claro, hay muchas más ideas en el tintero, y en los años por venir seguro veremos varias más. Sin embargo, no ha habido cambios substantivos en las interfaces para interactuar con una computadora de propósito general en los últimos 40 años. Me resisto a creeer que esto sea porque el modelo actual sea perfecto; como desarrolladores, tenemos la tarea de proponer, adoptar y evaluar nuevos modelos de interacción. 1 Una terminal tonta, la categoría más simple de terminal, requiere de una memoria interna a partir de unos 2KB en anillo para representar los 80x25 caracteres que puede presentar en pantalla; (no olvidemos que las primeras computadoras personales que se vendieron al público, ya en los 1970, tenían típicamente una memoria total de 4Kb) 2 Estándares como ANSI, VT100, VT220, Wyse, y muchos otros que aún a 40 años de su introducción siguen en amplio uso |
| Attachment | Size |
|---|---|
| Versión impresa en la revista | 94.96 KB |
| Title | Los muchos significados del «cómputo en la nube»: Desmitificando el concepto |
| Publication Type | Magazine Article |
| Year of Publication | 2010 |
| Authors | Wolf G |
| Refereed Designation | Non-Refereed |
| Magazine | Software Gurú |
| Frequency | Quarterly |
| Issue Number | 30 |
| Pagination | 48-49 |
| Date Published | 12/2010 |
| Type of Article | Column |
| ISSN | 1870-0888 |
| Keywords | cloud computing, cómputo en la nube, IaaS, PaaS, SaaS |
| URL | http://www.sg.com.mx/content/view/1125 |
| Full Text | Uno de los términos ampliamente en boga en nuestro campo hoy en día es el cómputo en la nube. Tan en boga que me parece que se ha convertido en una palabra mágica, bastante hueca y sintomática de querer parecer en sintonía con los últimos desarrollos tecnológicos, sin comprenderlos en realidad. Además, al ser una frase que de golpe comenzó a escucharse con tanta insistencia, asumimos que es una estrategia nueva, una idea posibilitada por los nuevos avances tecnológicos — Y esto dista de ser el caso. En esta columna busco clarificar los conceptos y tipos básicos de cómputo en la nube, sus principales ventjas y desventajas, y brevemente encontrar paralelos con casos documentados de estos ”novedosos” conceptos SaaS: Bloques de construcciónCuando uno de nuestros sistemas utiliza un API público remoto, o cuando para nuestro flujo de trabajo empleamos a una aplicación que reside y es administrada fuera de nuestra organización, estamos empleando SaaS. Nuestro proveedor puede cobrar su servicio de diversas maneras: A través de una renta directa, requiriendo del despliegue de publicidad, recibiendo autorización para recolectar nuestra información y hacer minería de datos sobre de ella — Hay una enorme variedad de esquemas, que refleja la gran variedad de niveles de integración que se puede dar a los servicios. PaaS+IaaS: Flexibilidad en el uso de recursosMientras que en el apartado anterior partíamos de que –desde el punto de vista del usuario– hay una aplicación central que corre en sus instalaciones y consume procesamiento realizado por componentes distribuídos por el mundo (”en la nube”), aquí la aplicación completa será desplegada en el proveedor de servicios. El usuario deja de emplear un servidor –o una granja de servidores– para consumir sólo los recursos. Y, consecuentemente, el esquema de utilidad para un proveedor de servicios bajo esta modalidad puede ir desde la renta a costo fijo hasta un cobro por uso de recursos, típicamente permitiendo reconfiguraciones dinámicas del paquete (del conjunto máximo de recursos) como respuesta a la demanda del sistema.
|
| Attachment | Size |
|---|---|
| PDF, versión publicada en la revista | 2.35 MB |