Crear tests para Blackboard con Sage


Emmanuel Briand,
Departamento Matemática Aplicada I,
Universidad de Sevilla,
22 de marzo de 2020. Revisado: 15 de julio de 2023.

Ver también: BBLearnTools


La información es este tutorial se aplica a Blackboard Original, pero no al nuevo Blackboard Ultra.

Introducción

En la Universidad de Sevilla se utiliza el “entorno de aprendizaje” Blackboard Learn. El editor de formulas matemáticas proporcionado en Blackboard (MathType) es poco cómodo. Una alternativa, poco documentada, consiste en utilizar Mathjax 2. En el caso de la creación de pruebas de Blackboard, presenta algunas dificultades adicionales. Aquí explico cómo consigo crear pruebas de Blackboard con formulas interpretadas por Mathjax.

En este tutorial, crearemos preguntas y “bancos de preguntas” en formato .txt listas para cargar en Blackboard. Nos interesamos específicamente a la manera de integrar formulas de matemáticas en el texto de las preguntas.

Al lector que no es familiar con la manera de crear pruebas en Blackboard, le aconsejamos echar una ojeada a la página de ayuda de Blackboard relevante, y en particular la lista de los tipos de pregunta. Suponemos que el lector tiene alguna familiaridad con la sintaxis LaTeX.

Ejemplo 1: una pregunta única

Vamos a crear una prueba de Blackboard con una pregunta de tipo NUM (“Numérica calculada”). El formato en el cuál debe ser escrita la pregunta, viene indicado en esta documentación de Blackboard. Las formulas matemáticas serán interpretadas por Mathjax.

Aquí está la prueba tal y como aparecerá a los estudiantes en Blackboard.

Se trata de calcular un determinante. Se incluye “datos para copiar y pegar” para permitir resolver el ejercicio mediante SAGE u otro sistema de cálculo símbolico (aunque obviamente en este ejemplo, el ordenador no debería no ser necesario… es cierto que podría haber elegido un mejor ejemplo…).

Hay dos maneras de entrar el texto de la pregunta en Blackboard:

Elegimos la segunda manera, ya que es la única manera que sirve para crear un largo banco de pruebas con el mismo patrón, de manera automatizada, cosa que vamos a querer hacer luego.

Preparación manual

Paso 1: Preparación de la pregunta

A continuación está el texto que escribimos en un fichero, mediante un editor de texto (o un Notebook de SAGE o PYTHON), para generar la pregunta. (No es el contenido del fichero .txt que cargaremos en Blackboard; dicho fichero se obtendrá de este texto aplicando algunas transformaciones).

Hallar el determinante de la matriz \(A\), donde 
\[
A=\begin{bmatrix}1&2\\3&4\end{bmatrix}
\]
<br>
<hr> 
Datos para copiar y pegar:
<br>
<br>
<span style="font-family:Courier New;">
    A = matrix([[1, 2], [3, 4]])
</span>
<hr>
Tu respuesta:

Observaciones:

Paso 2: Generación del fichero a cargar en Blackboard

Tenemos que aplicar algunas transformaciones al texto, o bien dentro del editor con una herramienta Find and Replace, o con un script de algún lenguaje de programación aplicado al fichero de texto.

<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML" async>
</script>

Aquí está este fichero. Ojo que aquí no se ven las tabulaciones.

NUM <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML" async> </script>Hallar el determinante de la matriz \(A\), donde \[A=\begin{bmatrix}1&2\\3&4\end{bmatrix}\]<br><hr> Datos para copiar y pegar:<br><br><span style="font-family:Courier New;">    A = matrix([[1, 2], [3, 4]])</span><hr>Tu respuesta: -2      

Procederemos finalmente a cargar este fichero como pregunta de prueba blackboard.

Paso 3: Carga del fichero

En el menú del curso, desplegamos el menú Herramientas del curso y pinchamos en Exámenes, Encuestas y Bancos de preguntas.

A continuación, en la página Exámenes, Encuestas y Bancos de preguntas, pinchamos en Bancos de preguntas.

En la página Información sobre banco de preguntas, proporcionamos una descripción del banco de preguntas, y le damos al botón Enviar. Luego, en la página Lienzo del banco de preguntas, pinchamos en Cargar preguntas:

Procederemos a cargar el fichero .txt que hemos preparado. No sale un resumen de la pregunta.

Dando al botón “vista preliminar”, tendremos una vista preliminar de la pregunta ¡Ojo con esta vista preliminar: no siempre revela todos los fallos que podemos haber cometido. En particular, algunas formulas LaTeX pueden ser bien interpretadas por MathJax en la vista preliminar, y mal en la vista de usuario, porque Blackboard habrá insertado tags HTML para poner el texto en forma, entretanto.


Automatizando el Paso 2 (generación del fichero de texto).

Las tareas de preparación del texto de pueden automatizar con algún programa. Lo hacemos con PYTHON, con una función prepare_question cuyo código está aquí. Aquí esta la llamada a la función, con las operaciones de lectura y escritura de los ficheros.

# importamos la función. Para python3 o Sage9:
from CODE.prepare_for_blackboard import prepare_question
# Para Sage < 9, cambiar en
# load("CODE/prepare_for_blackboard.py")
# Se puede también copiar y pegar el contenido del fichero.


texto = r"""
Hallar el determinante de la matriz \(A\), donde 
\[
A=\begin{bmatrix}1&2\\3&4\end{bmatrix}
\]
<br>
<hr> 
Datos para copiar y pegar:
<br>
<br>
<span style="font-family:Courier New;">
    A = matrix([[1, 2], [3, 4]])
</span>
<hr>
Tu respuesta:
"""

texto_bb = prepare_question(texto)
answer = -2
tolerance = 0
import csv
csv.register_dialect('blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')
with open('EJEMPLOS/det.bb.txt', 'w') as f:
    writer = csv.writer(f, 'blackboard')
    writer.writerow(["NUM", texto_bb, answer, tolerance])

Comento: la función prepare_question toma dos argumentos:


Ejemplo 2: 150 variantes de una pregunta, con datos numéricos diferentes.

Digamos que queremos producir 150 ejercicios del tipo del anterior, pero con datos numéricos distintos. Estos 150 ejercicios serán cargados en Blackboard para formar un banco de preguntas, como descrito en el ejemplo 1.

Generación del fichero de texto

Utilizamos un patrón, o “texto con campos variables”. Utilizamos un lenguaje de programación para generar los datos y las respuestas que corresponden (suelo utilizar SAGE, aquí utilizaremos simplemente PYTHON) y el código anterior para insertar los datos en el patrón y escribir las 150 variaciones del ejercicio en un mismo fichero.

El código para producir las 150 variantes sería el que sigue.

# importamos la función. Para python3 o Sage9:
from CODE.prepare_for_blackboard import prepare_question
# Para Sage < 9, cambiar en
# load("CODE/prepare_for_blackboard.py")
# Se puede también copiar y pegar el contenido del fichero.

# patrón
patron = r"""
REF: 0101191211-%(i)s 
<hr>
Hallar el determinante de la matriz \(A\), donde
\[
A=\begin{bmatrix}
%(a)s & %(b)s \\ %(c)s & %(d)s
\end{bmatrix}
\]
<br>
<hr>
Datos para copiar y pegar:
<br>
<br>
<span style="font-family:Courier New;">
    A = matrix([[%(a)s ,%(b)s], [%(c)s, %(d)s]])
</span>
<hr>
Tu respuesta:
"""

# Generación de los datos
import random
seed = 123
random.seed(seed)

def dice():
    r"""
    Sortea un entero desde -5 hasta 5.
    """
    return random.randint(-5,5)

# 150 sucesiones de 4 enteros aleatorios
datos = [(dice(), dice(), dice(), dice() ) for i in range(150) ] 
# Guardo los datos
with open('EJEMPLOS/det.datos.txt', 'w') as f:
    f.write(str(datos))

# Escritura del banco de pregunta
import csv
csv.register_dialect('blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')

tolerance = 0
with open('EJEMPLOS/det.pools.txt', 'w') as f:
    writer = csv.writer(f, 'blackboard')
    for (i, (a,b,c,d)) in enumerate(datos):
        texto_bb = prepare_question(patron, {'i':i, 'a':a, 'b':b, 'c':c, 'd':d})
        answer = a*d-b*c
        writer.writerow(["NUM", texto_bb, answer, tolerance])

Comentarios:

Comprobando que todo funcionó: test.

Después de escribir el fichero de banco de pregunta, es conveniente visualizar por lo menos una pregunta. Para esto, se puede extraer del fichero el texto de la primera pregunta, escribirlo en un nuevo fichero .html y visualizar dicho fichero HTML en un navegador.

A continuación enseñamos como hacer la extracción con PYTHON.

import csv
csv.register_dialect('blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')
with open('EJEMPLOS/det.pool.txt', 'r') as f:
    reader = csv.reader(f, 'blackboard')
    row0 = next(reader) 
    # se aisla el segundo campo, que contiene el texto de la pregunta
    texto = row0[1]
with open('EJEMPLOS/det.pool_test.html', 'w') as f:
    f.write(texto)

Otra manera de generar el fichero .txt, con SAGE

Enseñamos aquí como producir un banco de 150 preguntas del mismo tipo que el anterior, utilizando esta vez SAGE en vez de PYTHON, y la función random_matrix de SAGE,

load("CODE/prepare_for_blackboard.py")

patron = r"""
REF: 0101191213-%(i)s 
<hr>
Hallar el determinante de la matriz \(A\), donde 
\[
A=%(A)s
\]
<br>
<hr> 
Datos para copiar y pegar:
<br>
<br>
<span style="font-family:Courier New;">
    A = matrix(2, 2, %(L)s)
</span>
<hr>
Tu respuesta:
"""

# Generación de los datos
my_seed = 123
set_random_seed(my_seed)

# 150 matrices
datos = [(random_matrix(ZZ, 2, 2, x=-5, y=6 )) for i in range(150) ] 
# Guardo los datos
with open('EJEMPLOS/det2.datos.txt', 'w') as f:
    f.write(str(datos))

# Escritura del banco de preguntas    
import csv
csv.register_dialect('blackboard', delimiter='\t', quoting=csv.QUOTE_NONE, quotechar='')
    
tolerance = 0
with open('EJEMPLOS/det2.pool.txt', 'w') as f:
    writer = csv.writer(f, 'blackboard')
    for (i, A) in enumerate(datos):
        texto_bb = prepare_question(patron, 
                                    {'i':i, 'A':latex(A), 'L': str(A.list() ) } )
        answer = A.det()
        writer.writerow(["NUM", texto_bb, answer, tolerance])

Notas

Ejemplo de problemas por espacios en blanco en formula LaTeX

Blackboard transforma

Sea $$A=\left(\begin{array}{rrrrr}-3281 & 58680 & -246330 & 364840 & -175770 \\-2445 & 43913 & -184590 & 273420 & -131670 \\-1955 & 35160 & -147754 & 218680 & -105210 \\-\frac{6515}{4} & 29295 & -\frac{246015}{2} & 181870 & -\frac{174825}{2} \\-1395 & 25080 & -105210 & 155400 & -74620\end{array}\right).$$

en

Sea <span style='word-break:break-all;word-wrap:break-word'>$$A=\left(\begin{array}{rrrrr}-3281</span> &amp; 58680 &amp; -246330 &amp; 364840 &amp; -175770 \\-2445 &amp; 43913 &amp; -184590 &amp; 273420 &amp; -131670 \\-1955 &amp; 35160 &amp; -147754 &amp; 218680 &amp; -105210 \\-\frac{6515}{4} &amp; 29295 &amp; -\frac{246015}{2} &amp; 181870 &amp; -\frac{174825}{2} \\-1395 &amp; 25080 &amp; -105210 &amp; 155400 &amp; -74620\end{array}\right).$$ 

Es revelado por el examen del código fuente de la página web de cuestionario presentado a los estudiantes por Blackboard (¡El problema NO se aprecia en la vista preliminar presentada después de cargar las preguntas!). El código HTML contiene un </span> después del primer coeficiente de la matriz, que impide el tratamiento correcto de la formula por MathJax.

Problemas específicos de otros tipos de preguntas

Otros tipos de preguntas pueden plantear problemas específicos. Por ejemplo, en las preguntas de tipo “FIB_PLUS” (“Rellenar los espacios en blanco con varias opciones”), los corchetes [...] tienen una significación especial (delimitan los espacios en blanco). Es necesario escapar todos los otros corchetes de apertura.

Referencias adicionales