martes, junio 11, 2013

Cómo colaborar con la plataforma MOOC de edX

¿Por qué edX?


edX es una iniciativa de prestigiosas universidades de NorteAmérica, Europa y Asia que han unido sus esfuerzos para poner a disposición del mundo una vasta biblioteca de cursos en línea usando su propia plataforma para MOOC (Massive Open Online Courses). Aunque es muy interesante su oferta de contenido (después de todo estamos hablando de clases que dan en Berkeley, Queensland, MIT, Harvard, entre otras), lo que llama especialmente la atención sobre edX frente a su competencia (por ejemplo Coursera o Udacity) es que han sido los primeros en abrir las entrañas de su plataforma a la comunidad del código abierto (open source).

¿Cómo funciona el proyecto? 

El proyecto edx-platform comprende dos componentes principales: la plataforma de gestión del aprendizaje (edX) y la herramienta de edición de contenidos (Studio).

El código fuente está escrito primordialmente en Python, aunque también hay partes escritas en Ruby y NodeJS. Los diferentes proyectos que integran la arquitectura están accesibles en repositorios alojados en GitHub, una especie de red social donde los participantes aportan al desarrollo de proyectos de software de código abierto. Este esquema fue favorecido por el consorcio detrás de edX para no limitarse a los recursos que ellos puedan aportar sino más bien aprovechar la iniciativa y creatividad de gente alrededor del mundo, siguiendo el ejemplo de iniciativas exitosas como la de Wikipedia.

La arquitectura de edX-platform

La plataforma está compuesta basicamente por:

  • un repositorio de Cursos
  • una interfaz con sistemas externos de calificación
  • bibliotecas de código y módulos para calificación
  • un entorno para ejecución de programas

Repositorio de cursos

Actualmente la plataforma del LMS (Learning Managenent sistema de gestión de aprendizaje) está basada en XModules (componentes de cursos), pero está siendo migrada a XBlock (arquitectura de componentes para construir cursos).

Configuration suministra una forma simple pero flexible de levantar una instancia de la plataforma edX completamente configurada y lista para usarse.

Interfaz con sistemas externos de calificación

XQueue define una interfaz entre el LMS y sistemas externos que provean la calificación de exámenes y trabajos enviados por los estudiantes. Esto permite que se usen los módulos de calificación que ya trae edX o que uno desarrolle o adapte su propio mecanismo personalizado de calificación y lo conecte con el LMS.

Calificación

Como la idea es que los cursos que se publiquen en esta plataforma estén abiertos para una comunidad enorme (alrededor de 100.000 participantes simultáneos) es necesario contar con mecanismos para calificar que no dependen de la intervención manual de uno o varios profesores. De esta manera, no solo se evalúan los típicos cuestionarios de selección única o múltiple, sino también respuestas abiertas. Para eso se cuenta con módulos como:

edx-ora (Open Response Assessor) recibe trabajos enviados desde el LMS a través de la interfaz XQueue, los pasa ya sea por un motor de calificación basado en aprendizaje automático, un sistema de calificación manual por pares o por profesores, según corresponda y devuelve el resultado al LMS.

Discern es un API que permite el uso de un motor de clasificación de textos basado en aprendizaje automático. Si uno quiere desarrollar su propio motor de calificación, debe implementarlo dentro de estar interfaz para comunicarse con el LMS. Una forma de hacerlo es basándose en bibliotecas de funciones como EASE.

EASE (Enhanced AI Scoring Engine) no es un módulo sino una biblioteca de funciones que permite alimentar mecanismos de clasificación de contenido textual basado en aprendizaje automático. Es útil para calificar exámenes que no se ajustan a un formulario de selección múltiple, como ensayos o preguntas de respuesta abierta. Suministra funciones que asignar una nota a texto arbitrario y predictores numéricos, buscando predecir objetivos a partir de valores arbitrarios de forma escalable y con alto desempeño.

Entorno para ejecución de programas

CodeJail gestiona la ejecución de programas en entornos seguros de prueba. Está diseñado en principio para ejecución de código Python, pero también se puede usar para otros lenguajes.

XServer recibe código fuente de programas enviados por los estudiantes desde el LMS y lo ejecuta usando sistemas de calificación, los cuales deben ser desarrollados aparte.

sábado, marzo 02, 2013

Cómo construir un módulo en Drupal 7 paso a paso

Descripción paso a paso de cómo construir y activar un módulo en un sitio Drupal 7. Se requiere que ya haya sido instalado el núcleo del nuevo sitio Drupal 7 (Drupal Core) en una plataforma como DAMP (Drupal + Apache + MySQL + PHP).

Contenido

  1. Crear archivos básicos del módulo
  2. Definir los metadatos del módulo
  3. Implementar un enganche de Drupal 7
  4. Activar el módulo
  5. Visualizar la ejecución del módulo

1. Crear archivos básicos del módulo

Para crear un módulo se necesitan básicamente dos archivos: la declaración del módulo (.info) y la implementación de su funcionalidad (.module). Estos archivos deben estar ubicados en una carpeta que debe llamarse igual que los archivos. Paso a paso:
  • Ir a la carpeta de instalación de nuestro sitio Drupal (por ejemplo "/Users/usuario/Documents/DrupalSites/drupal-example").
  • Ubicar la carpeta donde se deben ubicar los módulos que desarrollemos: "/sites/all/modules/custom/".
  • En dicha ubicación crear una nueva carpeta con el nombre del nuevo módulo. Por ejemplo "drupal_example". Este nombre nada tiene que ver con el nombre del sitio ("drupal-example").
  • Allí creamos dos archivos de texto nuevos con el nombre del módulo ("drupal_example") y las dos extensiones que mencionamos al principio: "drupal_example.info" y "drupal_example.module". 


2. Definir los metadatos del módulo

El Archivo de metadatos (drupal_example.info) debe contener como mínimo las tres líneas siguientes: nombre, descripción y la versión del núcleo de Drupal con la que es compatible. 



Por su parte, el archivo de implementación del módulo (drupal_example.module) consiste en un archivo  que comienza con el marcador de apertura de PHP (<%php), el cual NO SE CIERRA. La razón es que Drupal podría interpretar cualquier carácter después del cierre del bloque PHP como parte del contenido a mostrar en la página, incluso algo tan aparentemente inocuo como un salto de línea. Para evitar este tipo de problemas, se considera TODO el contenido del archivo como un bloque PHP.

3. Implementar un enganche de Drupal 7

Lo que hacemos típicamente en un archivo de implementación de un módulo es extender o reemplazar la funcionalidad nativa de Drupal con nuestro propio código. Para hacerlo usamos un recurso llamado "enganche" (hook) que es invocado por el núcleo de Drupal en muchos puntos clave para para su funcionamiento interno. La lista de los enganches del sistema de módulos de Drupal 7 está en api.drupal.org.

Si un módulo habilitado implementa un enganche que sea relevante en la operación que se está ejecutando en ese momento, Drupal ejecuta el código del enganche definido en el módulo en lugar de su implementación nativa. Para nuestro ejemplo, vamos a implementar el enganche "hook_init", que es lo primero que se ejecuta cuando se va a construir el contenido de cualquier página de un sitio Drupal.

<?php
/**
 * Implements hook_init()
 *
 * Runs on every page
 */

function drupal_example_init()
{
  global $user; // Use the global variable $user
  $greeting = "$user->name, ";

  // Greets the user according to the current time
  if (date('A') == "PM")
    $greeting .= "Good afternoon!";
  else
    $greeting .= "Good morning!";

  print_r($greeting);
}



  • La convención es reemplazar la palabra "hook" en el nombre de la función por el nombre del módulo. Así, si el enganche se llama "hook_init", lo implementamos como "drupal_example_init".
  • Si el enganche recibe parámetros, nuestra función también debe recibir los mismos parámetros. En este caso no recibe ninguno.
  • Si el enganche devuelve contenido, también debe hacerlo nuestra función y, obviamente, con el mismo formato. Tampoco es el caso en este ejemplo.
  • Para mostrar un sencillo texto dinámico, usamos la variable global "$user", la cual se inicializa con los datos del usuario autenticado. Evidentemente si el visitante todavía no ha ingresado al sitio Drupal pues no va a existir la variable "$user".
  • Inicializamos la variable en la que vamos a construir un saludo sencillo con el nombre del usuario, que corresponde al atributo "name" de la variable "$user".
  • Usamos la función nativa de PHP "date()" para obtener la fecha y hora actuales. Le pasamos como parámetro el formato "A" para que retorne únicamente "AM" o "PM" dependiendo de la hora.
  • Dependiendo de la hora, se anexa a la variable de saludo el texto correspondiente.
  • Como el enganche no devuelve ningún contenido, simplemente usamos la función nativa de PHP "print_r()" para mostrar el texto en la salida estándar, que en este caso sería la parte de la página donde se invocó al enganche. 

4. Activar el módulo

  • Asegurarse de que el sitio Drupal esté ejecutándose. 
  • Abrir el sitio e ingresar como administrador.
  • En el menú administrativo click en "Modules".
  • En la lista que se despliega, bajar hasta la sección "OTHER" y habilitar el nuevo módulo marcando la casilla "ENABLED" correspondiente.
  • Click en "Save configuration".
  • En caso que no se viera el módulo, limpiar cache y recargar la página de módulos:
    • En el menú administrativo click en "Configuration".
    • En la sección "DEVELOPMENT" de la página que se despliega, click en "Performance".
    • En la página que se despliega click en "Clear all caches".


5. Visualizar la ejecución del módulo

Abrir cualquier página como usuario autenticado. Lo primero que debería mostrarse inmediatamente después del menú administrativo es el texto de nuestro saludo construido dinámicamente por nuestro módulo:


Como el texto no se devolvió como un contenido estructurado, no hace parte de ningún bloque de la diagramación que Drupal calcula para el sitio web. Se trata vilmente de un texto puesto como caiga en el código HTML de la página, como lo podemos evidenciar inspeccionando el elemento BODY:







jueves, febrero 14, 2013

Cómo instalar el módulo de desarrollo en un nuevo sitio Drupal 7 paso a paso

Descripción paso a paso de cómo instalar el módulo Devel de Drupal. Se requiere que ya haya sido instalado el núcleo del nuevo sitio Drupal 7 (Drupal Core) en una plataforma como DAMP (Drupal + Apache + MySQL + PHP).

Contenido


1. Verificar los módulos instalados

  • Abrir el panel de control de DAMP. Por Finder, ir a "/Applications/acquia-drupal/" y doble click en la aplicación "Acquia Dev Desktop Control Panel". 
  • Asegurarse de que la plataforma esté arriba, es decir que tanto el indicador de Apache como el de  MySQL estén en verde.
  • Abrir el sitio Drupal 7 en el navegador (por ejemplo "http://drupal-example:8092") e ingresar como el usuario administrador.
  • En la barra de menú superior, click en la opción "Modules".

2. Descargar el módulo Devel

  • En la ventana que se abre aparece la lista de módulos instalados, con una casilla de verificación que indica cuáles están habilitados. El grupo "DEVELOPMENT" no aparece cuando el núcleo de Drupal está recién instalado (nuestro caso). 
  • Click en el enlace "+ Install new module".

  • Se abre la sección donde se indica la ubicación del archivo. Si ya se ha descargado previamente, se puede seleccionar la ubicación del mismo. Vamos a asumir que no tenemos todavía el archivo y lo vamos a buscar manualmente en la página de Drupal.
  • Dar click derecho en el enlace "modules" (resaltado en la imagen de abajo) y abrir el enlace en una nueva pestaña ("Open Link in New Tab") para conservar abierta esta ventana y volver a ella después de encontrar el archivo.


  • Ir a la nueva pestaña y en el filtro especificar la categoría (Modules categories: Developer) y la versión de Drupal con la que debe ser compatible el módulo (Filter by compatibility: 7.x). Podemos también especificar el nombre del módulo (Search Modules: Devel), pero para el ejemplo queda en blanco para ver qué otros módulos populares arroja la búsqueda.
  • Click en "Search". 


  • Desplazarse hacia abajo en la página para encontrar los módulos resultantes. Click en "Devel".
  • En la página del módulo (drupal.org/project/devel), bajar hasta la sección de descargas ("Downloads") y buscar las versiones publicadas recomendas ("Recommended releases", resaltadas en fondo verde).
  • Ir a la versión más reciente (7.x) y dar click derecho sobre el enlace "tar.gz" (que es el usual para Mac OS X, pero en teoría da exactamente lo mismo descargar la versión ".zip"). Seleccionar la opción copiar dirección del enlace para usarla en la otra pantalla ("Copy Link Address").


  • Con la dirección copiada (en este caso "http://ftp.drupal.org/files/projects/devel-7.x-1.3.tar.gz") ir a la pestaña de nuestro sitio Drupal y pegarla en el campo de la dirección de origen ("Install from URL").
  • Click en "Install".



  • Al terminar la descarga del archivo, Drupal automáticamente desempaqueta y ejecuta el contenido del archivo. Si todo funciona correctamente, debe aparecer una pantalla como esta:


3. Habilitar y verificar la instalación del módulo


  • Click en el enlace "Enable newly added modules" o ir a la página inicial y dar click en la opción "Modules" del menú administrativo en la esquina superior de la pantalla.
  • Bajar hasta la nueva sección "DEVELOPMENT" y allí marcar en la casilla de "Devel" para habilitarlo.
  • Click en "Save configuration". 


  • El módulo Devel consiste en una variedad de herramientas útiles para desarrolladores, pero que no tienen una utilidad directa en la presentación para usuarios finales. Por esta razón, la página inicial de nuestro sitio Drupal refleja ningún cambio en la superficie después de la instalación del módulo. Para ver las secciones que implementa Devel, debemos ir a una página de contenido.
  • Como el sitio está vacío, en lugar de un nodo de contenido podemos ver la página de nuestro usuario administrador. Click en "My account" en la esquina superior derecha.
  • En la página que se abre, podemos visualizar la información del usuario administrador con el que ingresamos. A diferencia de antes, ahora encontramos una pestaña "Devel" junto a las demás pestañas que clasifican el contenido de la página ("View", "Edit" y "Shortcuts").  


  • Click en la pestaña "Devel".
  • Se abre una sección con dos botones ("Load" y "Render") y una subsección anaranjada de contenido.
  • El módulo Devel usa un componente llamado Krumo para desplegar la información del objeto relevante en la subsección anaranjada.
  • Predeterminadamente, Devel muestra el contenido del objeto al ser cargado en memoria ("Load"). Al dar click en el objeto se despliegan el nombre, tipo de datos y valor de cada uno de sus atributos. Al dar click en "Render" se muestran los objetos (y su estado) involucrados en el despliegue del objeto en pantalla. 

4. Configurar el módulo


  • Además de la pestaña "Devel" en cada página de contenido, el módulo ofrece otras herramientas que haremos visibles para poderlas usar como administradores del sitio Drupal. Para configurar este comportamiento, click en la opción "Structure" del menú administrativo.
  • Click en la opción "Blocks".



  • Bajar hasta la sección donde están los bloques inhabilitados.
  • En los bloques deseados, habilitarlos seleccionando una región para que sean visibles. Por ejemplo, habilitar los bloques "Development", "Execute PHP" y "Switch User" y ubicarlos en la región "Sidebar Second" para que sean desplegados a la derecha del área de contenido.


  • Verificar que los bloques deseados quedaron clasificados en la región deseada.


  • Bajar hasa el final de la página. Click en el botón "Save blocks" para guardar los cambios en la configuración.
  • Recargar la página para ver los bloques del módulo en la región configurada.

martes, febrero 12, 2013

Cómo instalar Drupal 7 en Mac OS X paso a paso

Contenido


1. Descargar Drupal

  • Descargar del sitio oficial de Drupal la última versión estable: http://drupal.org/project/drupal
  • Para Mac, preferible el paquete en formato ".tar.gz" que el formato ".zip".

2. Desempaquetar Drupal

  • Copiar el archivo descargado de la carpeta de descargas (por ejemplo "/Users/usuario/Downloads") a la carpeta de sitios de DAMP (por ejemplo "/Users/usuario/Documents/DrupalSites")
  • Abrir el archivo con "click derecho / Open" o simplemente doble click.
  • Cambiar el nombre de la carpeta (por ejemplo "drupal-7.19") por uno más amigable cuando se vea en el URL del sitio web (por ejemplo "drupal-example").
  • Evitar el uso de "_" (por ejemplo "drupal_example") para no tener sorpresas con la forma como los buscadores encuentran el sitio con base en el URL. 

3. Importar el nuevo sitio en DAMP

  • Abrir el panel de control de DAMP. Por Finder, ir a "/Applications/acquia-drupal/" y doble click en la aplicación "Acquia Dev Desktop Control Panel". 
  • Asegurarse de que la plataforma esté arriba, es decir que tanto el indicador de Apache como el de  MySQL estén en verde.
  • Click en el botón "Settings". En la ventana que se abre, ir a la última pestaña "Sites".
  • Click en el botón "Import". En la ventana que se abre, seleccionar la ubicación de la carpeta (por ejemplo la terminada en "/DrupalSites/drupal-example").
  • En la sección de base de datos, seleccionar "Create new database". En el nombre, tener en cuenta que los servicios de alojamiento ponen a los nombres de bases de datos el dominio como prefijo (por ejemplo, si el dominio es "VerdeDigital.co", el prefijo de las bases de datos que se usen bajo ese dominio será "verdedig_"). Esto obviamente no importa al hacer una instalación local como esta pero, previendo que se quiere montar el sitio en un servicio de alojamiento, es mejor que el nombre de la base de datos local sea el mismo que tendrá en el servidor final. 


  • Click en el botón "Import". 
  • Mac OS X pedirá la contraseña del administrador para autorizar cambios en el sistema.
  • Si el proceso es exitoso, el nuevo sitio debe salir en la lista del panel de control de DAMP.




4. Configurar el nuevo sitio

  • Se abre una ventana del navegador con la primera pantalla del proceso de configuración (por ejemplo "drupal-example:8092/install.php").
  • Seleccionar la opción "Starndard".
  • Click en el botón "Save and continue".


  • Seleccionar el idioma. Predeterminadamente el núcleo de Drupal sólo viene en inglés así que basta con dar click en el botón "Save and continue".
  • Esperar unos segundos a que proceso pueble la base de datos y genere los archivos correspondientes al perfil. 
  • En la pantalla de configuración, definir el título del sitio. Se recomienda que sea lo más parecido posible al nombre de la carpeta del sitio, pero no es necesario usar "-" en lugar de espacios.
  • Definir su cuenta de correo electrónico como remitente (site e-mail address) y destinatario de las notificaciones (E-mail address).
  • Definir el usuario y contraseña del administrador del sitio.
  • Seleccionar el país y zona horaria predeterminada. Esto tiene implicaciones en la forma como el sitio web presentará información relacionada con fechas y horas.
  • Click en el botón "Save and continue". 


  • Eso es todo. El sitio web ya está listo para ser manipulado y usado.

jueves, enero 26, 2012

Ojo con la conversión de números reales a texto en Java

Cuando necesitamos convertir un número real a texto en Java lo primero que intentamos es unir el número con un texto vacío así:

String valorTexto = "" + valorReal;


"Mágicamente", el operador "+", que permite unir dos textos, genera internamente una operación de conversión del valor numérico a texto sin que el programador tenga que preocuparse explícitamente por la conversión. ¿Cierto?

Pues la verdad es que esto funciona con números de hasta 7 cifras. ¿Qué pasa con un número de 8 cifras?

String valorTexto = "12345678.5"
double valorReal = Float.parseFloat(valorTexto);
valorTexto = "" + valorReal;


El texto resultante no es el "12345678.5" original sino un desconcertante "1.2345678E7".
Una buena opción para que todos los dígitos del número real se preserven y evitando la notación científica es usar la clase java.math.BigDecimal:

String valorTexto = "12345678.5";
BigDecimal valorReal = new BigDecimal(valorTexto);
valorTexto = valorReal.toPlainString();

jueves, noviembre 18, 2010

¿Cómo implementar GD en PHP5 para Windows?

GD es una biblioteca de funciones gráfica usada por varias aplicaciones que generan imágenes dinámicamente. En el caso de PHP5 para Windows, se supone que los pasos para implementar GD son los siguientes:
  • Descargar los binarios para Windows (gd-2.0.34-win32.zip)
  • Descomprimir el zip y de la carpeta "bin" extraer el archivo "bgd.dll". Éste es equivalente a "php_gd2.dll" según http://www.boutell.com/gd/faq.html
  • Renombrar "bgd.dll" como "php_gd2.dll" y ubicarlo en "c:\php\ext\" (o en la carpeta correspondiente a las extensiones de la instalación local de PHP5).
  • Editar php.ini y asegurarse de que la carpeta de extensiones está correctamente configurada (por ejemplo extension_dir ="C:\php\ext") y que está habilitada la extensión gd2 (extension=php_gd2.dll).
  • Reiniciar el servidor web (Apache o IIS).
Eso dice la teoría, pero al reiniciar Apache, me encuentro con este error:

PHP Startup: Invalid library (maybe not a PHP library) 'php_gd2.dll'

¿Alguna idea de por qué pasa y cómo resolverlo?

jueves, agosto 19, 2010

Voto electrónico en Colombia

Las críticas a cómo la Registraduría y el CNE han llevado las recientes elecciones parlamentarias han vuelto a poner sobre la mesa opciones como el voto electrónico. ¿Qué tan viable es en Colombia?

          Analicemos uno por uno los retos que enfrentaría el voto electrónico de ser integrado al sistema electoral: fraude por suplantación de los votantes, fraude en el conteo, demora en entrega de resultados y desconfianza de los abstencionistas.

          Para evitar la suplantación de los votantes los sistemas biométricos son mucho más fiables que la presentación de la cédula.  Aunque entre estos sistemas el de lectura de la retina sea preferido sobre el de la huella dactilar, el segundo es más fácil de implementar porque ya se dispone de las huellas.

          Aunque las ventajas del voto electrónico (del cual ya se hizo un piloto en las pasadas elecciones parlamentarias) son obvias ante el fraude en la mesa de votación y la demora, queda la desconfianza de los abstencionistas. Éstos podrían aumentar porque justamente lo que hace a la votación electrónica eficiente y segura es lo que impide que pueda auditarse. Al no haber tarjetones físicos no puede haber reconteo y el mandato constitucional de que el voto sea secreto inutiliza el mecanismo tradicional que hace fiables las transacciones electrónicas: saber quién hizo qué y cuándo.

          Una alternativa probada ya en Australia es que el software para procesar los votos sea de fuente abierta (open source). Así no hay temor de que se entregue la soberanía nacional al fabricante de un software propietario y que los académicos y profesionales del país estén blindando permanentemente al sistema contra intentos de fraude de particulares o de funcionarios del mismo gobierno.

          En conclusión, la identificación biométrica de los votantes sí puede ser una mejora importante que se podría implementar mientras se superan los obstáculos para un sistema de voto electrónico a nivel nacional. Y quién sabe, tal vez esté más cerca de lo que pensamos.