viernes, 26 de abril de 2013

Primeros pasos con Google Course Builder

28 comments

Introducción

Google Course Builder nació como un experimento de Google para montar un MOOC: Power Searching with Google. A raíz del éxito de este curso, y de los MOOC en general, el uso de esta herramienta se ha extendido tanto en su desarrollo por parte de Google y otras entidades (es código abierto) como en su uso en algunas iniciativas de éxito como UniMOOC - AEmprende.



En este post veremos lo sencillo que es, usando Course Builder, montar nuestro propio MOOC en unos cuantos pasos y cómo subirlo a la "nube" para que esté disponible para todo el mundo.

Instalación Google App Engine

Una de las razones del éxito de Course Builder es que está alojado en Google App Engine, la nube de Google. Esto significa que no tenemos que preocuparnos por alquilar/comprar servidores, montar bases de datos, balancear la carga, etc. App Engine gestiona todo por nosotros de forma automática. Además también nos aporta una forma sencilla de probar todo lo que añadamos al curso en nuestro propia máquina sin tener que subirlo a la nube, lo cuál resulta muy útil cuando añadamos nuevos contenidos y necesitemos probarlos  antes. Ahora vamos a instalar ésta última herramienta, el 'launcher', para montar nuestro curso en local.

Instalando Python 2.7

En primer lugar deberemos instalar Python 2.7 en nuestra máquina. Python es uno de los lenguajes que nos permite usar el App Engine y más concretamente el lenguaje en que está desarrollado el Course Builder, por lo que necesitamos las herramientas necesarias para poder ejecutarlo. Para descargarlo, vamos a http://www.python.org/download/releases/2.7/ y en la sección "Downloads" elegimos la correspondiente a nuestra plataforma (está disponible en Windows, Mac o incluso el código fuente). 

La instalación es muy sencilla, pero si tenemos algún problema siempre podemos acudir a la guía oficial de instalación de Python.

Instalando AppEngine SDK

Con Python ya instalado, podemos descargarnos el SDK (Software Development Kit) del Google App Engine (¡versión Python!) de https://developers.google.com/appengine/downloads. Está disponible para Windows, Mac OS y Linux (lo cual es otro punto a su favor). La instalación es muy sencilla en las tres plataformas, por lo que no entraré en detalles. Si tenéis algún tipo de problema, siempre podéis acudir a la guía oficial de Google.

Ahora podremos buscar en nuestro PC un ejecutable llamado GoogleAppEngineLauncher. Con él podemos manejar todo lo relacionado con el App Engine sin apenas tocar la línea de comandos. La interfaz es muy sencilla.
GoogleAppEngineLauncher en Mac OS
En el centro podemos ver todas las aplicaciones que tenemos activas en nuestra máquina (NO subidas a la nube, sino en local) y en la fila de arriba podemos ver varios botones. Los más importantes nos permiten:
  • Ejecutar la aplicación seleccionada en local (Run)
  • Parar su ejecución (Stop)
  • Ir a la URL en local de la aplicación seleccionada (Browse)
  • Ver los logs (Logs)
  • Subirlo a la nube (Deploy)

Google Course Builder

Con el punto anterior finalizado, ahora ya podemos descargarnos el Google Course Builder (¡por fin!) y ejecutarlo en nuestra máquina. Para ello, vamos a la sección de "Downloads" del repositorio oficial del GCB y elegimos la última versión (en estos momentos es la 1.3.1). Si descomprimimos la descarga, veremos varios archivos y carpetas. Este es el código (sí, el código) del GCB, ya que es una plataforma abierta que permite obtener y modificar su código a nuestro gusto.

Ejecutando GCB en local

Ahora volvemos al SDK del App Engine, más concretamente a la aplicación que hemos comentado antes (GoogleAppEngineLauncher) y clickamos en File > Add Existing Application... 
Menú File > Add Existing Application...
En Path ponemos la ruta al directorio del GCB que acabamos de descargar y pulsamos en Add.
Menú para añadir una aplicación existente
Con la aplicación añadida podemos pulsar en el botón Browse de la aplicación del App Engine y nos llevará a la URL donde está disponible el GCB (siempre desde nuestra máquina, aún no estamos en la nube) donde veremos el curso por defecto del GCB.
Curso por defecto de GCB

Añadir nuestros contenidos al GCB

Ahora que tenemos el curso por defecto ya funcionando, vamos a sustituir sus contenidos por los nuestros. 

Editando ‘course.yaml’

Para ello, en primer lugar, vamos a modificar  algunos parámetros como el título o el idioma en el fichero 'course.yaml' que encontramos en el directorio raíz del GCB. El propio fichero está muy bién documentado, pero si tenemos dudas podemos ir a https://code.google.com/p/course-builder/wiki/CourseSettings, donde está explicado en detalle qué modifica cada uno de los puntos. 

De momento vamos a cambiar el idioma y el título del curso. Para ello editamos en 'course.yaml' los parámetros 'title' y 'locale', y los cambiamos por "Nuestro curso" y "es_ES", respectivamente. Guardamos el fichero, recargamos la página en el navegador y deberíamos ver algo así:
GCB con nuestros parámetros

Añadiendo nuestras unidades

Con estos parámetros modificados, vamos ahora a añadir una nueva unidad. Nos vamos al fichero 'data/unit.csv', donde están las unidades del curso. En  la primera línea podemos ver los campos que debemos añadir:
  • id: Número entero que representa a la unidad. Debe ser único (entre los ids del resto de unidades), ya que identifica unívocamente a una unidad.
  • type: Indica que tipo de unidad es. Puede ser: 'A' (es un Assessment o examen), 'U' (es una unidad propiamente dicha, con lecciones), 'O' (es cualquier otra cosa, como un enlace externo).
  • unit_id: Este campo varía su significado según el tipo de unidad: si el tipo es 'A' representa el código que debe identificar al examen ('final', por ejemplo), si el tipo es 'U' representa el orden en que se mostrará en la planificación del curso y si el tipo es 'O', representa el enlace al recurso externo.
  • title: Título o nombre de la unidad, sea del tipo que sea.
  • release_date: Fecha en que la unidad estará disponible para los alumnos.
  • now_available: Si su valor es 'True', indica que la unidad está disponible ahora mismo. Por el contrario, si es 'False', indica que está cerrada.
Vamos a añadir nuestra unidad con los siguientes valores:
  • id: 12 (es el siguiente id disponible)
  • type: U (ya que va a ser de tipo unidad)
  • unit_id: 7 (saldrá la última)
  • title: Nuestra nueva unidad
  • release_date: No ponemos nada, ya que estará disponible siempre
  • now_available: True
La línea a pegar al final, sería:
12,U,7,Nuestra nueva unidad,,True

Si recargamos la página principal del curso veremos que nuestra unidad aparece al final pero, a pesar de haberla marcada como activa, no nos deja acceder. De hecho, no nos deja acceder a ninguna. Esto es porque, aunque la aplicación ahora mismo sea una "demo" en local es una "demo real", por lo que debemos registrarnos como estudiantes. Para ello vamos a "Registro" e introducimos nuestro nombre.
Formulario de registro
Ahora si volvemos a la pestaña de "Curso" ya veremos que las unidades son accesibles y al final está la nuestra.
Planificación de nuestro curso
No obstante, si entramos en ella nos avisa de que aún no tiene ninguna lección. ¡Vamos a añadirle alguna!

Añadiendo nuestras lecciones

Nos vamos al fichero 'data/lesson.csv'. Como en el caso de las unidades, en la primera linea vemos los campos que tiene cada lección:
  • (1) unit_id: unit_id de la unidad a la que está asociada la lección.
  • (2) unit_title: Título de la unidad a la que está asociada la lección.
  • (3) lesson_id: id de la lección. Este id representa también su orden dentro de la unidad, por lo que debe empezar en 1 y ser consecutivo entre las lecciones de una misma unidad.
  • (4) lesson_title: Título de la lección.
  • (5) lesson_activity: Si vale 'Yes', indica si la lección tiene o no alguna actividad/ejercicios. Si está en blanco, no tiene.
  • (6) lesson_activity_name: Si la lección tiene alguna actividad, es su nombre.
  • (7) lesson_notes: URL a la versión en texto de la lección.
  • (8) lesson_video_id: ID del video en YouTube de la lección.
  • (9) lesson_objectives: Objetivos de la lección. En este campo podemos meter todo el código HTML que queramos.
En esta imagen, obtenida del repositorio del GCB, podemos ver en que se traduce cada campo:
"Mapa" de propiedades de las lecciones
Vamos a añadir nuestra nueva lección con los siguientes valores:
  • unit_id: 7 (es el campo unit_id de nuestra unidad, no el de id)
  • unit_title: Nuestra nueva unidad
  • lesson_id: 1 (la primera leccion de la unidad)
  • lesson_title: Nuestra nueva lección
  • lesson_activity: Lo dejamos vacio ya que no tendrá ninguna actividad.
  • lesson_activity_name: Dado qe no no tenemos ninguna actividad, lo dejamos vacío también.
  • lesson_notes: Lo dejamos vacío por que no añadiremos notas a nuestra lección.
  • lesson_video_id: 0gSnhdBk-Uo
  • lesson_objectives: <ul><li>Aprender a montar un MOOC con Google Course Builder</li></ul> (recordad que es código HTML)
La línea para pegar al final del fichero sería
7,Nuestra nueva unidad,1,Nuestra nueva lección,,,,0gSnhdBk-Uo,<ul><li>Aprender a montar un MOOC con Google Course Builder</li></ul>

Si ahora recargamos la página de nuestro curso y accedemos a nuestra unidad podremos ver nuestra nueva lección creada:
Nuestra nueva lección
De esta manera podríamos añadir nuestros contenidos al curso. En posteriores posts explicaremos como añadir actividades (ejercicios) asociadas a lecciones y assessments (examenes), así como personalizar más el curso (cambiar colores, etc).

Subirlo a la nube

Tenemos nuestro curso, con nuestros contenidos y nuestros parámetros pero nos queda una cosa: subirlo a la nube de Google para que todo el mundo pueda aprender con nuestro curso. 

Para ello primero tenemos que crearnos una aplicación el App Engine (podemos hacerlo con nuestra cuenta de GMail), por lo que nos vamos a https://appengine.google.com/ y clickamos en "Create Application".

Ahora, en "Application Identifier", ponemos el identificador de nuestra aplicación (pruebagcb en nuestro caso). El identificador e único entre todas las aplicaciones del App Engine y define la URL desde la que será accesible después. En "Application Title" ponemos el título de nuestra aplicación (no es tan importante como el identificador) y en "Authentication Options" elegimos "Open to all Google Accounts". Estos último es especialmente importante, ya que es necesario para que el GCB funcione.
Panel de creación de aplicaciones en AppEngine
Una vez creada, nos vamos al fichero 'app.yaml' de nuestro curso y cambiamos el valor del campo 'application' por el identificador de nuestra aplicación (para nosotros, pruebagcb). Por lo tanto, la línea quedaría así:
application: pruebagcb

Ahora nos vamos a la aplicación que instalamos en nuestro equipo en los primeros pasos, el launcher del App Engine, y elegimos nuestro curso (que ahora estará identificado con el identificador de nuestra aplicación). Pulsamos sobre el botón "Deploy", ponemos nuestras credenciales de GMail y ya está. La aplicación se encargará ahora de subirla a la nube y nos mostrará el progreso en una nueva ventana. Una vez acabe, mostrará la siguiente línea:
*** appcfg.py has finished with exit code 0 ***

Si ahora vamos a http://<identificador de nuestra aplicación>.appspot.com/, http://pruebagcb.appspot.com/ en nuestro caso, veremos nuestro curso, que ahora sí que está en la nube, y por tanto accesible para cualquier estudiante que quiera aprender con nosotros. 

28 comentarios:

  1. LLEGO HASTA EL GOOGLE ENGINE APP LAUNCHER, COLOCO ADD EXISTING FILE,ESCOJO POR EL BROWSER LA CARPETA "COURSE BUILDER", Y ME APARECE EN EL G.APP ENG.LOUNCHER MY COURSE, PERO NO SE ACTIVA EL BOTON BROWSER.
    QUE HICE MAL?....
    POR FAVOR, GRACIAS

    ResponderEliminar
    Respuestas
    1. Saludos,te falta darle "RUN" cuando seleccionas lo que añadiste... esperas unos momentos y se activa el botón "BROWSE"
      Yo lo hice así y me funciono... tengo problemas con la edición del curso pues se me complica mucho eso pero he llegado hasta ahí
      Espero te ayude en algo, saludos desde Bolivia

      Eliminar
    2. Hola, creo que lo primero que tienes que hacer es revisar el archivo de log que te dará indicios de cual es el posible problema.

      Si el problema es la edición del curso ya te comento que el curso inicial solo es de lectura y por tanto tienes que trabajarlo desde carpeta y código, no de forma de admin.
      Si creas un subcurso e importas, este último ya si lo podrás modificar.

      Espero que te haya servido de ayuda la información.

      Eliminar
  2. Hola Ricardo, tienes que darle a "Run" (a la izquierda de "Browser"), para poner en marcha el GCB.

    Un saludo.

    ResponderEliminar
    Respuestas
    1. Hola Adrian, gracias.Doy "run" y sale como un reloj amarillo al lado del file, dejando activos los botones "logs" y "edit". y no me manda al curso por defecto .

      Eliminar
    2. Dale a "Logs" y dime qué es lo que te aparece. Cuando se queda "cargando" es porque ha habido algún error.

      Eliminar
    3. Ya se activa el icono Run al lado del archivo, y también los botones "stop" y "browser", solo que cuando le doy al browser me manda a una ventana vacía "http://localhost:8080" .
      Gracias por la ayuda.

      Eliminar
  3. No entra en el post todo el código en "Log"
    Pero en las dos últimas lineas sale:
    AttributeError: 'RemoteStub' object has no attribute 'SetConsistencyPolicy'
    INFO 2013-05-09 14:33:55,699 server.py:585] default: "GET /_ah/warmup HTTP/1.1" 500 -

    ResponderEliminar
    Respuestas
    1. Ese es un bug de la 1.3.1 del GCB que les aparece a algunas personas. Tienes que comentar (poniendo un '#' delante), la linea 81 del fichero appengine_config.py

      Eliminar
  4. Hola, también tengo el mismo problema de Ricardo. El botón "Browse" no se activa. Estoy trabajando en Windows 7.

    log
    Running command: "['C:\\Python33\\pythonw.exe', 'C:\\Program Files (x86)\\Google\\google_appengine\\dev_appserver.py', '--skip_sdk_update_check=yes', '--port=8080', '--admin_port=8000', u'C:\\Users\\Andr\xe9s Del Rio\\Downloads\\Courses Builder\\coursebuilder']"

    ResponderEliminar
    Respuestas
    1. Por lo que veo le das al botón "Run", ¿verdad? ¿Después no te aparece nada en la ventana de logs? ¿Únicamente se queda cargando?

      Quizá tengas algún problema con la versión de Python que has instalado, o que por algún motivo AppEngine no la encuentra en tu ordenador.

      Eliminar
  5. AL intentar hacer browse aparece lo siguiente:
    "No selected projects Running so we have nothing to browse"

    Y en el log:

    "ImportError: No module named site
    2013-07-29 15:22:09 (Process exited with code 1)"

    Alguna idea de porque?

    ResponderEliminar
  6. Hola, alguien sabe como exportar el curso desde la web para editarlo en mi pc.
    Ya le he trabajado mucho y no quiero perder lo hecho hasta ahora.

    Gracias.

    ResponderEliminar
    Respuestas
    1. hola Lorenzo,
      A mi también me pasa lo mismo, el que se encuentra de forma local si podemos acceder pero no nos permite modificar de forma externa, y cuando generamos un curso online, no me permite descargarlo para poder tener copia de seguridad.
      Alguien nos podría ayudar en esto.

      Eliminar
  7. LLEGO HASTA EL GOOGLE ENGINE APP LAUNCHER, COLOCO ADD EXISTING FILE,ESCOJO POR EL BROWSER LA CARPETA "COURSE BUILDER", Y ME APARECE EN EL G.APP ENG.LOUNCHER MY COURSE, PERO CUANDO APRIETO EL BOTON "BROWSER" NO ME CARGA LA PÁGINA

    ResponderEliminar
    Respuestas
    1. Saludos,te falta darle "RUN" cuando seleccionas lo que añadiste... esperas unos momentos y se activa el botón "BROWSE"
      Yo lo hice así y me funciono... tengo problemas con la edición del curso pues se me complica mucho eso pero he llegado hasta ahí
      Espero te ayude en algo, saludos desde Bolivia

      Eliminar
  8. Una duda, he creado un curso nuevo para hacer pruebas , una vez que ya no necesito este curso como lo borro esta ya subido a google course.

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. hola, he estado realizando los paso y funciona todo perfecto, el único inconveniente es que todos los vídeos han de ser por youtube.

    Estoy de acuerdo que se agiliza el seleccionar vídeos, pero yo tengo vídeos que son privados y están en otros servidores con otros formatos.

    He intentado trastear sin conseguir nada modificar el archivo youtube_video.js, alguien me puede dar la solución, a poder poner un vídeo .flv que se encuentra en otro servidor, sin tener que poner código html puro.

    Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. ¿y si en vez de usar lesson_video_id: montas el video con un en el HTML?

      Eliminar
  11. Si utilizo caracteres ASCII extendidos en el unit.csv tira un error a pesar de tener configurado es_ES en el course.yaml ¿Qué tengo que modificar para que me acepte caracteres ASCII extendidos? Muchas gracias.

    ResponderEliminar
  12. Ya lo descubrí. Era un problema del editor, no del archivo YAML. Saludos.

    ResponderEliminar
  13. tengo probelmas al darle browser solo me aparece la pantalla en blanco
    no carga ni nada de nada ayuda por favor

    ResponderEliminar
  14. Hola, seguí los pasos tal como lo indican muy claramente en esta página, me funcionó muy bien, hasta que el Launcher se tildó y me decía que ocurrieron varios errores y que mirara el archivo LOG.
    Esto es lo que dice:
    Traceback (most recent call last):
    File "GoogleAppEngineLauncher.py", line 42, in
    File "wx\_core.pyc", line 7913, in __init__
    File "wx\_core.pyc", line 7487, in _BootstrapApp
    File "launcher\app.pyc", line 53, in OnInit
    File "launcher\app.pyc", line 97, in _CreateModels
    File "launcher\maintable.pyc", line 35, in __init__
    File "launcher\maintable.pyc", line 96, in _LoadProjects
    File "launcher\project.pyc", line 63, in ProjectWithConfigParser
    File "launcher\project.pyc", line 285, in _LoadFromConfigParser
    File "ConfigParser.pyc", line 520, in get
    ConfigParser.NoOptionError: No option 'name' in section: '2'

    Si alguien me puede ayudar, se lo agradeceré.
    Saludos!

    ResponderEliminar
  15. Hola,
    Al momento de correr el proyecto me arroja lo siguiente
    PYTHON INTERPRETER NONE NOT FOUND.
    CANNOT RUN PROJECT.

    A que se puede deber???

    ResponderEliminar
  16. A mi me arroja este error, no se a que se deba:

    2016-03-07 16:17:07 Running command: "['C:\\Python34\\pythonw.exe', 'C:\\Program Files (x86)\\Google\\google_appengine\\dev_appserver.py', '--skip_sdk_update_check=yes', '--port=8080', '--admin_port=8000', u'C:\\Users\\cordaz.ADPECO\\Desktop\\coursebuilder']"
    Traceback (most recent call last):
    File "C:\Program Files (x86)\Google\google_appengine\dev_appserver.py", line 83, in
    _run_file(__file__, globals())
    File "C:\Program Files (x86)\Google\google_appengine\dev_appserver.py", line 79, in _run_file
    execfile(_PATHS.script_file(script_name), globals_)
    NameError: name 'execfile' is not defined
    2016-03-07 16:17:07 (Process exited with code 1)

    ResponderEliminar
  17. Buenos días, al leer las url de documentación todas están fuera de linea. al querer ver tu ejemplo desarrollado en este articulo también se encuentra fuera. Saben si la plataforma de google sigue en linea o cambio a estas fechas?

    ResponderEliminar