Web-Cat: evaluación automática de prácticas de programación

Web-CAT es un sistema de evaluación automatizado de ejercicios prácticos de programación. Dicho de otro modo: si estás enseñando a programar a un grupo de alumnos, les pides que resuelvan ejercicios prácticos y quieres que los puedan subir a una web y recibir feedback automáticamente, WebCat es lo que andabas buscando, en especial si el lenguaje de programación en el que solicitas los ejercicios es Java, dado que dispone de buenos plugins para integrar los tests sobre los ejercicios con JUnit, así como para la realización de tests de cobertura, de forma automática.

En mi caso, lo que buscaba era que los propios alumnos pudieran crear sus pruebas unitarias sobre las clases que deben de programar y que el sistema (WebCat en este caso), pasara dichos tests MÁS las pruebas JUnit que yo haya especificado (y que el alumno no dispone). WebCat es justo la herramienta que buscaba. Veamos el proceso de instalación.

Bajamos el .war desde SourceForge (un .war es un archivo de instalación automática de una aplicación web J2EE, para poder instalarla en dos clicks sobre por ejemplo, el servidor Tomcat).

Desde el Tomcat Manager (http://localhost:8080/manager), instalamos el .war recién descargado.
Desconozco la razón, pero desde que pulsamos el botón de instalar hasta que realmente se instala transcurren unos 2 minutos (¡en local!). ¿Tal vez se esté descargando dependencias? No lo sé, pero tras esos dos minutos, recibiremos un mensaje de OK.

Pulsamos a continuación sobre el enlace que lleva el nombre de la aplicación (/Web-CAT_1.4.0) para entrar en el asistente de configuración.

Vamos siguiendo los pasos, aceptamos la licencia, configuramos MySQL, le damos un nombre al sitio web, indicamos directorios de trabajo, dirección del servidor SMTP, email de administración, mecanismo de autenticación (built-in database, es decir, MySQL, o bien LDAP o bien a través de un plugin que especifiquemos), nombre de usuario administrador… hasta terminar por crear un semestre de prueba, con nombre de asignatura, cursos, etc.

Al terminar, el asistente nos felicitará por haber recorrido todos sus apartados correctamente y nos dejará en la pantalla de login. Nos identificamos con la cuenta de administrador que hayamos especificado previamente. Una vez autenticados, entraremos en la pantalla principal de WebCat.

Lo primero será ahora crear algún usuario/alumno (aparte del administrador), luego un curso (si no lo hemos hecho antes) y finalmente asociar usuarios/alumnos al curso. Para ello, pulsamos en la pestaña «Administer», «Edit database», y en la opción «User», seleccionamos el icono de la lupa ( < sarcastic mode > sólo me costó 15 minutos encontrar la opción en este panel tan intuitivo… < / sarcastic mode > ). Pulsamos el botón New (antes de rellenar los campos) y ahora sí, cumplimentamos los campos Authentication Domain – el nombre de tu centro – , username, password, email (son los únicos campos obligatorios) y pulsamos Save.

Crear el curso: pulsamos en Courses / New. Le damos un nombre al curso y siguiente. Ahora, elegimos «Manually add students» y elegimos a los estudiantes. Por ahora sólo tenemos uno, así que no hay mucho que pensar.

Crear ejercicios: pulsamos en Assignments, seleccionamos el curso, y pulsamos Next hasta que nos permita bautizar al nuevo ejercicio con un nombre, url, etc.

En el apartado Submission Rules, podemos indicar quién puntúa qué, plazos para aceptar los trabajos, si penalizamos por envíos tardíos, etc. Guardamos nuestras preferencias y volvemos a la página anterior.

Ahora podemos indicar que queremos usar el plugin JUnit en WebCat. Para ello, en el apartado Plugin, pulsamos el botón Add. Seleccionamos JavaTddPlugin, y a continuación pulsamos en el botón de edición del plugin.

En el apartado «JUnit Reference Test Class(es)», es donde podremos especificar los tests JUnit que queremos pasar a cada uno de los ejercicios que nos envíen los alumnos. En «Supplemental Classes for Assignment», podemos indicar clases auxiliares que WebCat deberá de incluir para compilar los ejercicios. Subimos un archivo .java con las pruebas unitarias que deseemos (se puede subir también un .zip con varios .java…)

Al terminar, no olvidarse de pulsar en «Publish it» o los alumnos no verán el ejercicio.

HackIt! Nivel 11: backtracking

Después del dolor del nivel 10 (un nivel genial no quita que no pueda ser doloroso 😉 llegamos al nivel 11 un tanto «acongojados», porque asumimos que, como la dificultad vaya en aumento, nos pueden dar las uvas.

Sin embargo, tras leer el enunciado, yo creo que este nivel no debería de haber ocupado el puesto número 11, sino alguno inferior, pues es resoluble incluso por «fuerza bruta visual», es decir, cogemos lápiz, cogemos papel y se puede resolver (no es trivial, pero se puede hacer con algo de tiempo y paciencia). Pero me estoy adelantando; la prueba pide que, en el siguiente tablero, encontremos un camino tal que el número de baldosas de cada color que atravesemos sea el mismo. Por ejemplo, 2 verdes, 2 azules y dos amarillas. El blanco no cuenta (casillas inicial y final). Se sobreentiende que no se puede pisar 2 veces la misma casilla (no lo dice el enunciado pero es una asunción que hago):

Aquellos de vosotros que habéis estudiado algoritmos de backtracking en el pasado (y os acordáis de algo 😉 me imagino que os estaréis frotando las manos, porque efectivamente, es resoluble por backtracking. Por cierto, cómo cambia la carrera de informática… hoy en día, en mi facultad, la asignatura de «Estructuras de datos y algoritmos» en Ingenieros Técnicos en Informática (que por cierto me tocó impartir este año), no se incluía la parte de backtracking por distintas cuestiones que mejor me ahorro comentar (y no son todas por «culpa de los profesores»). No me parece bien. Así que, el año que viene (y si los hados me designan a Donostia otra vez) pienso dar la tabarra hasta que encaje, como antaño, esta parte de la asignatura en el temario. Tal vez tenga que pedir también que nos pongan una máquina de café más cerca del aula… 😉

Ahora que estamos en temporada de exámenes, sé que cualquier excusa es buena para dejar de estudiar (como dice mi blog-colega txipi, «incluso os enrolaríais en un carguero uzbeko» con tal de no hincar los codos 😉 …. esta prueba de HackIt tiene su cosita: es probable que aprendáis (aprender de verdad) más de recursividad y algoritmos de backtracking resolviéndola por vuestra cuenta que estudiando la teoría correspondiente. Os pasaré mi propuesta de solución en Java en unos días… aunque ahora que lo pienso, igual la guardo como ejercicio para el año que viene };-)

Gráficas simples con GNUPlot

screenshot3.pngHoy he necesitado crear una pequeña gráfica que mostrara simultáneamente dos funciones simples:

f(x) = 2*x + x**2
g(x) = 52 + 2*x

Me he acordado de que en Linux disponemos de una aplicación con este objetivo (que a pesar del nombre, tal y como bien nos corrige Etxekalte, NO es una aplicación GNU, y ni siquiera tiene una licencia GPL) y tras echarle un vistazo a los ejemplos de la documentación he podido crear mi pequeño script:

$ gnuplot
set xtics 1
set yrange [0:100]
plot [0:10] 2*x + x**2, 52 + 2*X

El resultado lo podéis ver en la figura adjunta. ¿Alguien me puede decir cómo se haría eso mismo en el sistema de Redmond? (Tal y como apunta Marlowe, GNUPlot también está disponible para Windows)

Reto de programación: apretones de manos

Hace poco he participado en una prueba más de TopCoder.com, un excelente sitio para mantener engrasados los conocimientos de estructuras de datos, algoritmos, análisis y diseño de sistemas y programación general. Una de las pruebas me dejó varado y no pude completar a tiempo el ejercicio. Posteriormente he leído bastante al respecto y profundizado en la serie de los números de Catalan, en la que se basa la solución al problema. Sin más, os dejo con el enunciado, a ver si conseguís solucionarlo 😉

Consideremos una reunión de n personas alrededor de una mesa circular. Antes de comenzar la reunión, se dan la mano unos a otros. Cada persona estrecha la mano de otra persona en un momento dado (y sólo de una). Los apretones de manos se dan todos a la vez (es decir, en un momento dado, cada persona está estrechando la mano de otra) Decimos que un apretón de manos es perfecto si no hay brazos que se crucen entre sí en el momento del apretón. Dado un entero n, devolver el número de apretones de manos perfectos posibles que existen para n personas sentadas a la mesa.

Ejemplo:

si n = 4 personas, los posibles apretones de mano son:

HandsShaking_4_correct/tmp/HandsShaking_4_correct_2.GIF/tmp/HandsShaking_4_wrong.GIF

Las primeras dos figuras muestran apretones de manos perfectos. La 3ª no es un apretón de manos perfecto. La solución para n=4 por tanto es 2. Para n=8 sería 14.