jueves, mayo 24, 2007

Videos y material de cursos universitarios sobre Ciencias de la Computación (en inglés)

En el sitio web http://www.aduni.org/courses/ se encuentran disponibles bajo licencia CCA-SA los videos y el material completo (en inglés) de los cursos sobre Ciencias de la Computación dictados por la ArsDigita University durante los años 2000 y 2001.

El ArsDigita University (ADU) fue un programa anual e intensivo de pos-bachillerato en Informática basado en el curso de pre-graduados del Massachusetts Institute of Technology (MIT). El programa no requería el pago de cuotas, fue financiado y apoyado por la ArsDigita Foundation, y la mayoría de los instructores eran profesores del MIT. La misión principal de la ADU y del sitio web de ADUni.org es "... ofrecer la mejor educación en Ciencias de la Computación del mundo, a nivel de pre-graduado, a la gente que actualmente no puede acceder a ella".

Los cursos con material disponible son:

Matemática para ciencias de la computación, dictado por Tara Holm
Una introducción básica al Cálculo y al Álgebra lineal. Comprende cálculo diferencial: gráficas de funciones, límites, derivadas, diferenciación sobre problemas del mundo real; cálculo integral: suma, integración, áreas bajo la curva y cálculo de volúmenes; álgebra lineal: espacios de vector, transformaciones lineales, matrices, operaciones sobre matrices y diagonalización.

Estructura e interpretación de programas de computadora, por Holly Yanco
Una introducción a la programación y al poder de la abstracción, basado en el libro homónimo de Abelson y Sussman. Los conceptos clave incluyen: construcción de abstracciones, procesos computacionales, procedimientos de orden superior, datos compuestos, abstracciones de datos, operaciones genéricas, intercambio de mensajes, flujos, interpretación de lenguajes de programación, modelo de máquina, compilación y lenguajes embebidos.

Matemática discreta , por Shai Simonson
Este curso cubre los tópicos matemáticos más relacionados con la Informática: lógica, relaciones, funciones, teoría de conjuntos, técnicas de demostración, inducción matemática, teoría de grafos, combinatoria, probabilidad discreta, recursividad, relaciones recursivas y teoría numérica.

Cómo funcionan las computadoras, por Gill Pratt
Incluye las bases del diseño lógico digital, arquitectura y organización de computadoras, lenguaje ensamblador, diseño de procesadores, jerarquías de memoria. El conjunto de problemas se basa en la utilización del simulador RISC Beta-Sim.

Diseño orientado a objetos, por David Goddeau
Los conceptos del paradigma orientado a objetos, utilizando Java, con énfasis en Ingeniería de Software.

Algorítmos, por Shai Simonson
Se estudia el diseño de algoritmos de acuerdo a su metodología y aplicación. Las metodologías vistas incluyen: divide y vencerás, programación dinámica y algoritmos voraces. Las aplicaciones comprenden ordenamiento, búsqueda, algoritmos de grafos, algoritmos geométricos, matemáticos y de búsqueda de cadenas.

Sistemas, por Luis Rodriguez
Se centra en la ingeniería de sistemas de software y hardware: técnicas para el control de la complejidad, infraestructura de sistemas, redes y sistemas distribuidos, atomicidad y coordinación de actividades en paralelo, recuperación y confiabilidad, privacidad de la información, y el impacto de los sistemas de computación en la sociedad.

Aplicaciones web, por Philip Greenspun
Trata sobre el diseño de un sitio web dinámico con un back-end de base de datos, incorporando lenguajes de scripting, cookies, SQL y HTML. Enfatiza las interfaces computadora-humano y el despliegue gráfico de la información.

Teoría de la computación, por Shai Simonson
Un tratamiento teórico sobre qué puede hacerse y cuán rapido. Se habla sobre aplicaciones, compiladores, búsqueda de cadenas y diseño de circuitos de control. Se analizan las máquinas de estado finito, gramáticas libres de contexto y máquinas de Turing, con sus variaciones; y se bosquejan las nociones de decibilidad, teoría de la complejidad y problemas NP-Completos.

Inteligencia artificial, por Patrick Winston
Un vistazo rápido sobre la inteligencia artificial desde los puntos de vista técnicos y filosóficos. Los temas incluyen búsqueda, A*, representación del conocimiento y redes neuronales.

Taller de Unix
Un taller de auto-aprendizaje para conocer y/o volver a ver un amplio conjunto de herramientas de Unix tales como shell scripts, awk, lex, yacc, grep, etc.

Sistemas de gestión de bases de datos, por Ravi Jasuja
Discurre sobre los sistemas de base de datos desde la capa física, B-trees y servidores de archivos, hasta la capa abstracta del diseño relacional. Incorpora alternativas y aproximaciones genéricas al diseño y la administración de base de datos relacionales y orientadas a objetos, estándares SQL, lenguajes algebraicos de consulta, restricciones de integridad, disparadores, dependencias funcionales, formas normales, transacciones, seguridad y data warehousing.

Probabilidad aplicada, por Tina Kapur
Se enfoca en el análisis, modelado y cuantificación y de la incertidumbre mediante la enseñanza de variables aleatorias, procesos aleatorios simples y sus distribuciones de probabilidad, procesos de Markov, teoremas de límites, elementos de inferencia estadística y toma de decisiones bajo condiciones de incertidumbre.

Realmente encontré aquí un compendio de recursos muy interesantes sobre ciencias de la computación, disponibles para todo el mundo. Lamentablemente, debido a dificultades para encontrar financiamiento y disputas legales entre los fundadores y miembros de la corporación, el programa fue discontinuado tras la graduación de la primer promoción.

Ojalá que sigan surgiendo proyectos de esta naturaleza, que permitan acercar el conocimiento, en forma libre y gratuita, hacia toda la comunidad. Y si fuera en castellano, mucho mejor...

viernes, mayo 18, 2007

Redes Privadas Virtuales con OpenVPN

Buscando información sobre Redes Privadas Virtuales (VPNs), caí en el sitio de OpenVPN:

OpenVPN es una solución VPN SSL que puede adaptarse a un amplio rango de configuraciones, incluyendo acceso remoto, VPNs sitio-a-sitio, seguridad WiFi, y soluciones de acceso remoto a escala empresarial con balanceo de carga, recuperación ante fallos y controles de acceso granulares. Implementa una extension de red segura en las capas 2 o 3 de OSI usando el protocolo estándar SSL/TLS. Está implementada en espacio de usuario utilizando dispositivos virtuales de red tun/tap y TLS/SSL, entre otras cosas. Y para mejor, es GPL.

Les recomiendo leer la ilustrativa presentación de James Yonan: Understanding the User-Space VPN: History, Conceptual Foundations, and Practical Usage.

viernes, mayo 04, 2007

Come mis datos: por qué todos malinterpretamos la E/S de archivos

En besttechvideos publicaron un video de la última LinuxConf en Australia donde Stewart Smith, un ingeniero de software de MySQL AB, comenta acerca de cómo debemos proceder para mantener la integridad de los datos en disco al desarrollar una aplicación.

El video está disponible aquí (en flash) o aquí (en ogg).
Como la disertación es en inglés, les dejo una síntesis de lo que Smith comenta:

Una breve introducción

Al comienzo de los tiempos, toda la entrada y salida de archivos era sincrónica; es decir, una llamada a grabar implicaba que los datos llegaban al dispositivo físico en el momento, y el procesamiento se detenía hasta finalizar la operación. Por razones obvias la performance de este método es muy baja, de ahí que surgió la llamada entrada/salida asíncrona, que permite continuar la ejecución del código mientras los datos son leídos o escritos a disco.

Lamentablemente, no existe un mundo sin fallas: las computadoras se cuelgan, se corta la luz, se termina la batería, alguien se tropezó con el cable, etc...

Bien, ¿cuando ocurre un corte de energia, qué es lo que se pierde?
  • Lo que está en buffers de la aplicación
  • Lo que está en buffers de las librerías
  • Lo que está en buffers del S.O. (page/buffer cache)
¿Dónde radican los errores que llevan a la pérdida de datos?
  • En el código de la aplicación
  • En el código de la librería utilizada
  • En el código del kernel del sistema operativo
¿Cuál es el flujo de los datos desde una aplicación hacia el disco, al grabar?

En un resumen burdo: con las funciones fwrite, fprint y otras, la aplicación pasa los datos a la librería (p. ej., glibc); la librería a su vez dirige los datos con write y similares al sistema operativo; y este último hacia el disco mediante page out y flushing periódico realizado entre 5 y 30 segundos (o más si se trata de una laptop). En cualquiera de estos momentos nuestros datos son vulnerables ante una falla de energía.

¿Es
write atómico? ¿Qué pasa si se corta la energía en la mitad de una operación write?

Pues no, y si se corta la energía en la mitad de la operación lo más probable es que la información en el archivo sea un conglomerado entre los datos de la versión anterior y los de la que se estaba guardando.

¿Cómo puede evitarse esto?

El truco más viejo consiste en escribir sobre un archivo temporal y luego renombrar al finalizar la operación de escritura. De esa forma, los datos originales estarían seguros aún si se corta la energía durante la etapa de escritura del archivo temporal. Y nunca tenemos que olvidarnos de las excepciones (permiso denegado, espacio en disco agotado).

¿Hummm... por qué dice estarían en la afirmación anterior?

Aquí tenemos una interesante cuestión. Stewart indica en que close y rename no implican sync. Redondeando, nadie asegura que la operación de cambio de nombre rename se realice después del write y consecuente close, aún estando en el orden correcto. Las operaciones sobre los datos de un archivo (tales como la grabación) se almacenan en buffers diferentes a las operaciones sobre los metadatos (tales como el renombrado), por lo que puede ocurrir (y generalmente ocurre) que estas últimas se realicen primero. En el triste caso de un fallo de energía, habremos perdido la información original por haberse efectuado el cambio de nombre primero, y además tendríamos un archivo corrupto, dado que los datos habrían quedado a medio grabar.

Por suerte para nosotros, el modo ordered del sistema de archivos ext3, nos asegura que el orden de prioridad es: primero write, luego close y luego rename. En otras palabras: primero grabar los datos al disco, luego actualizar el inodo y finalmente actualizar la entrada en el directorio.

Bien, ahora sabemos que haciendo fsync mas la técnica del archivo temporal, sobre un sistema de archivos ext3 y efectuando los controles de errores correspondientes, si ocurre un fallo durante una operación de escritura, los datos originales se mantienen seguros...

¿Qué tal en otras plataformas?

El Sr. Smith nos da una advertencia interesante cuando observa que el estándar POSIX define como válida una implementación de fsync nula. En otras palabras, no podemos quedarnos tranquilos al utilizar fsync en nuestras aplicaciones, pues puede que el sistema operativo subyacente implemente dicha función sólo haciendo nada. O sea, que una fsync implementada como sigue es válida en el estándar POSIX:

int fsync (int fd) { return 0; }

¿Y cómo se dio cuenta?

Cuando se cansó de tener páginas corruptas con MySQL, pues el fsync de MacOS X no descarga a disco el contenido del buffer de escritura, sino que se requiere un fcntl adicional. Así que hay que hacer algunas definiciones diferentes dependiendo del sistema operativo para el cual se compile la aplicación...

En el video, Stewart también discurre con bastante detalle sobre el tratamiento de archivos de gran tamaño y las técnicas utilizadas para la recuperación de datos (undo/redo logs) y prealocación de espacio.

En fin, un poco de charla para espabilar las neuronas y refrescarse con en inglés. Espero que lo disfruten...

miércoles, mayo 02, 2007

09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0

A ver...

09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0
09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0
09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0
09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0
...

Ufff... lo tendré que repetir varias veces para poder recordarlo.

Por si no lo saben, es la "llave de procesamiento" que uno requiere para poder desencriptar y poder ver las películas HD-DVD codificadas con AACS. Obviamente también se requiere algo de software, pero es lo de menos. Y por si las libertades fueran muchas ya hay intentos de censurar dicho numerillo, siempre bajo la tutela de la tristemente famosa DMCA.

Por ello, me hago eco de lo dicho por la Asociación Linux Español:

"Gracias a la publicación de este código, dicha práctica ilegal que pretendía poner un freno al desarrollo tecnológico, al crecimiento de la industria, a la libre competencia, y libertad de elección de los usuarios, ha llegado a su fin. La Asociación Linux Español llama a los usuarios a divulgar este código, por el libre desarrollo de la industria, por la libertad de la tecnología, y por la libertad de los usuarios."

Publicado por yo el día 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 a las 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 horas.