===== Preguntas de evaluación con ficheros =====
Las preguntas con ficheros son un tipo muy especial de [[es:manual:items:externos|pregunta externa]] en la que Siette espera como respuesta del alumno uno o varios ficheros (con un límite de 4). Una vez que recibe el fichero, Siette lo guarda y lo copia en un [[#directorio de trabajo]] y sobre aplica una serie de pruebas consistentes en la ejecución de una secuencia de instrucciones del sistema operativo de las que espera obtener ciertos resultados por la salida estándar. Comparando estos resultados con los resultados esperados, la ejecución de esta serie de pruebas escritas en un lenguaje propio denominado [[es:manual:spsl|SPSL]], devuelve a Siette una cadena de caracteres que Siette interpreta como la respuesta del alumno, comparándola con las posibles respuestas incluidas del [[es:manual:items:externos#ítem base]] y procediendo a partir de ese momento como con cualquier otro ítem interno.
En esta sección se introducen algunos ejemplos sencillos para explicar la base de su funcionamiento, hay casos especiales que se tratarán aparte como las [[es:manual:items:externosficherogenerativas|preguntas generativas con ficheros]] y las [[es:manual:items:externosficherocompuestas|preguntas compuestas con fichero]].
Finalmente al final del capítulo se incluyen algunas [[es:manual:items:externosficheroconsejos|consideraciones y consejos]] en el uso de preguntas con ficheros.
==== Corrección de la ejecución directa ====
El caso mas simple de preguntas de ejecución de ficheros es aquel en el que el fichero enviado como respuesta se procesa y se captura su salida que se pasará a Siette directamente como respuesta.
Siette reconocerá esta respuesta como cualquier otra respuesta a una pregunta de respuesta libre e intentará reconocer mediante alguno de los patrones si la respuesta (el resultado de la ejecución del [[es:manual:spsl|script de procesamiento]]) coincide con alguno de ellos.
=== Ejemplo 1 ===
El siguiente es el enunciado (y la solución) de un pequeño programa en Python para determinar si una lista de números que se le pasa como argumento al programa está o no ordenada:
{{ es:manual:items:item-externo-python-1.png?500 }}
Para evaluar esta pregunta, se requiere al alumno que envíe un fichero con el nombre ''test.py''. Para evaluar la solución se mostrará al alumno un área de texto donde debe introducir como respuesta el contenido de este fichero:
{{ es:manual:items:item-externo-python-2.png?500 }}
Para corregir este ítem se usa un [[es:manual:spsl|script de procesamiento]] escrito en el [[es:manual:spsl|lenguaje SPSL]], con las siguientes instrucciones, en la pestaña [[es:help_items_advanced_files|Avanzado]], en donde debe indicarse previamente que el [[es:help_items_advanced#Sistema de presentación de la pregunta]] es ''Enviar fichero'':
python3 test.py 1 2 3 4; python3 test.py 1 5 3 4;
cuya ejecución en el caso correcto dará como salida la secuencia:
TrueFalse
Por consiguiente, bastaría con indicar en Siette que el patrón de respuesta correcta es ''TrueFalse'' para que Siette interprete que esta salida corresponde a la respuesta correcta. Cualquier otra salida encajaría con el patrón de respuesta no reconocida, a menos que también se proporcionen patrones de posibles respuestas incorrectas, como ''FalseFalse'' que corresponde al caso en que no reconoce una lista ordenada:
{{ es:manual:items:item-externo-python-7.png?500 }}
Puede añadirse un refuerzo especifico para informar al alumno del error, pulsando el botón ''Completar'' y usando el [[es:help_items_content_pattern#editor intermedio|formulario]] que aparece:
{{ es:manual:items:item-externo-python-8.png?500 }}
==== Corrección de la ejecución mediante etiquetas ====
Salvo casos sencillos en los que la ejecución sea simple, la evaluación directa del resultado de la ejecución de una instrucción no permite una evaluación detallada. Cuando se usa un [[es:manual:spsl|script de procesamiento]], la salida que se devuelve es simplemente la ejecución de la última de las sentencias, por lo que se pierde información en el caso en el que se requiera realizar diversas pruebas, cuyo resultado puede ser unas veces correcto y otras no.
Para solucionar este problema el [[es:manual:spsl|script de procesamiento]] trabaja con patrones de reconocimiento específicos para cada una de las sentencias de ejecución del //script// y devuelve a Siette como respuesta de la ejecución //etiquetas// que resumen el resultado de varias pruebas.
=== Ejemplo 2 ===
Para el problema del ejemplo anterior, supongamos ahora que el [[es:manual:spsl|script de procesamiento]] es el siguiente:
python3 test.py 1 2 3 4 == True -> : Incorrecto
python3 test.py 1 5 3 4 == False -> Correcto : Incorrecto
Este //script// toma escribe en un fichero ''test.py'' el texto introducido por el alumno, y lo ejecuta con el interprete ''python3'' pasandole primero unos parametros con los que debe dar un resultado ''True''. Si no da este resultado el [[es:manual:spsl|script de procesamiento]] devolverá como respuesta la etiqueta ''Incorrecto''. . Si la primer prueba tiene éxito, probara una segunda con una lista no ordenada. Si el resultado es ''False'', devolverá como respuesta la etiqueta ''Correcto'' y si no la etiqueta ''Incorrecto''.
Al igual que en otros ítem externos, hay que indicar en el [[es:manual:items:externos#ítem base]] que estas son las dos opciones posibles de respuesta mediante los correspondientes patrones, ya que en este caso el [[es:manual:items:externos#ítem base]] es un [[es:manual:items:tiposbasicos:respuesta_libre|ítem de respuesta libre]], en la pestaña [[es:help_items_content_pattern|Contenido]]
{{ es:manual:items:item-externo-python-9.png?500 }}
Nótese que en este caso se trata se muestran directamente las etiquetas, y no de la respuesta. La respuesta que en este caso devuelve Siette, a diferencia del ejemplo anterior, es realmente un comentario en HTML, que contiene la etiqueta. Es decir las posibles respuestas de la ejecución de este //script// son las secuencias '''' e ''''. Por consiguiente las etiquetas anteriores son equivalentes a los siguientes patrones:
{{ es:manual:items:item-externo-python-3.png?500 }}
El //checkbox// que aparece al pie de la lista de etiquetas permite mostrar alternativamente los patrones o las etiquetas.
También en este caso es interesante poder usar el campo [[es:manual:test:refuerzos|''Refuerzo'']] para informar al alumno del motivo del fallo. Para ello se podría hacer la siguiente modificación en el [[es:manual:spsl|script de procesamiento]]:
python3 test.py 1 2 3 4 == True -> : Incorrecto1
python3 test.py 1 5 3 4 == False -> Correcto : Incorrecto2
y consiguientemente las modificaciones en los patrones:
{{ es:manual:items:item-externo-python-4.png?500 }}
a los que puede añadirse un [[es:manual:test:refuerzos|refuerzo]] específico pulsando el botón ''Completar'' y usando el [[es:help_items_content_pattern#editor intermedio|formulario]] que aparece:
{{ es:manual:items:item-externo-python-5.png?500 }}
{{ es:manual:items:item-externo-python-6.png?500 }}
Evidentemente, en un caso real se deberían añadir mas pruebas en el [[es:manual:spsl|script de procesamiento]] para garantizar que el programa cumple las especificaciones de forma general, y no tan solo en dos casos de prueba.
=== Ejemplo 3 ===
Un ejemplo clásico es la evaluación de las prácticas de programación en un lenguaje de programación, por ejemplo, supongamos el siguiente enunciado:
{{ es:manual:items:item-externo-mcd-1.png }}
en donde el alumno debe enviar su propia implementación en C++, mediante un fichero de nombre ''mcd.cpp''
Para evaluar este fichero hay que definir algunos parámetros en la pestaña [[es:help_items_advanced
|Avanzado]].
== Nombre del fichero ==
Es el nombre que se dará al fichero que envía el alumno. En realidad da igual el nombre del fichero del alumno. Cualquier fichero que envíe se renombrará con el nombre que se le asigne. En el ejemplo ''mcd.cpp''
== Directorio base ==
Es un subdirectorio del [[es:manual:temas#directorio auxiliar]] de la asignatura que puede contener algunos archivos de prueba o archivos auxiliares para la ejecución de las pruebas.
== Directorio de trabajo ==
Cada vez que se ejecuta un ítem externo de fichero Siette asigna un directorio diferente dentro del subdirectorio ''exec'' del [[es:manual:temas#directorio auxiliar]] de la asignatura. Sobre este directorio copia dos cosas en este orden:
* El archivo o archivos enviados por el usuario.
* Todos los archivos que hubiera en el directorio base o sus subdirectorios.
En el ejemplo anterior no es necesario ningún archivo adicional, por lo que no hace falta usar ningun directorio base.
== Script de procesamiento ==
El [[es:manual:spsl|script de procesamiento]] es un //programa// escrito en [[es:manual:spsl|lenguaje SPSL]], que se introduce en el campo ''Script'' de la pestaña [[es:help_items_advanced_files|Avanzado]].
En el caso anterior el [[es:manual:spsl|script de procesamiento]] es el siguiente:
@PatronSiette: false, false, false, true
@OnError stop
g++ -w -o mcd mcd.cpp <> *(error|warning)*
chmod +x mcd == *
echo 18 24 | ./mcd == *<6|6> -> 1
echo 192 224 | ./mcd == *<32|32> -> 5
echo 110 154 | ./mcd == *<22|22> -> 10
Básicamente este //script// lo que hace es compilar el fichero enviado por el alumno, mediante la instrucción del sistema operativo: ((Obviamente, el servidor debe tener instalado el compilador ''g++'')).
g++ -w -o mcd mcd.cpp
Modificar los permisos de ejecución mediante la instrucción:
chmod +x mcd
y realizar tres pruebas de ejecución en la que en vez de esperar una respuesta por la entrada estándar se le pasan los valores mediante la instrucción ''echo'' y una tubería de Unix, que conecta esa salida a la entrada del programa recien compilado
echo 18 24 | ./mcd
El resultado de esta prueba debería ser ''6'', o bien ''mcd=6'', o cualquier otra que terminase con el número 6. Para ello el [[es:manual:spsl|script de procesamiento]] utiliza el [[es:manual:items:patron:siette|patron Siette]] ''*<6|6>'', que encaja con cualquiera de estas respuestas.
En caso de que la prueba tenga éxito el //script// asigna el valor de ''1'' como posible respuestas, pero continúa su ejecución. realiza a continuación la siguiente prueba
echo 192 224 | ./mcd
que debe dar como resultado una secuencia que termine en ''32''. Si esta prueba tiene éxito, asigna el valor ''5'' omo posible respuesta, y prosigue con le ejecución. Si no, la ejecución del [[es:manual:spsl|script de procesamiento]] termina y devuelve el valor que habia preparado anteriormente, es decir ''1''.
Finalmente realiza la tercera prueba con otros valores diferentes. Si tiene exito devolverá un ''10'', y si no lo tiene devolvera ''5'' que es la etiqueta asociada a la última prueba correcta.
En realidad, las etiquetas que devuelve el //script// son algo mas elaboradas, ya que pueden incluir información sobre la ejecución del script y la última sentencia que provocó un error. Por ejemplo, suponiendo que las dos primeras pruebas funcionan, pero no asi la tercera, el [[es:manual:spsl|script de procesamiento]] devolveria realmente una cadena de texto como esta:
>echo 192 224 | ./mcd
x: y: mcd=24
que se muestra al alumno de esta forma:
>echo 192 224 | ./mcd \\
x: y: mcd=24 \\
que le indica que al ejecutar el programa ''mcd'' con los valores ''192 224'' el resultado obtenido es ''24'' (que no es correcto).
La respuesta del [[es:manual:spsl|script de procesamiento]] es un trozo de texto en HTML. La primera parte de esta respuesta corresponde a la etiqueta de evaluación que se devuelve dentro de un comentario HTML para no interferir con la presentación de la respuesta al alumno.
== Reconocimiento de la respuesta externa ==
Como cualquier otra pregunta externa, la respuesta debe ser comparada con los patrones de respuesta que contenga el [[es:manual:items:externos#ítem base]]. En este ejemplo los patrones que contiene este [[es:manual:items:externos#ítem base]] se muestran en la siguiente imagen:
{{ es:manual:items:item-externo-mcd-2.png }}
Como puede apreciarse en este caso el patrón de reconocimiento, en este caso un [[es:manual:items:patron:siette|patrón Siette]] que encaja con la respuesta del [[es:manual:spsl|script de procesamiento]] es ''*'', es decir, el patrón reconoce solamente la etiqueta de evaluación dentro del comentario HTML e ignora el resto de la respuesta de cara a la evaluación.
En el caso en que se usen etiquetas para componer la respuesta como resultado del [[es:manual:spsl|script de procesamiento]], el interfaz de usuario se ha simplificado, de manera que no es necesario introducir los patrones, ni el [[es:manual:items:patrones#tipos_de_patrones_de_evaluación|tipo de patrón]] y las opciones de reconocimiento, sino simplemente las etiquetas. Esto facilita la tarea del programador y evita posibles errores. En el caso anterior la interfaz de usuario mostrará la pestaña ''Contenido'' de la siguiente forma:
{{ es:manual:items:item-externo-mcd-3.png }}
Puesto que la respuesta del [[es:manual:spsl|script de procesamiento]] no ha sido completamente errónea, es potestad del profesor decidir si asigna un crédito parcial a esta respuesta, mediante el sistema de [[es:manual:test:tipos#por puntos|evaluación por puntos]], o bien si se dispone de datos suficientes, se podría calibrar un modelo de respuesta [[es:manual:test:tipos#TRI|TRI politómico]]; pero esto ya es otra historia...