Diario de mi Proyecto : PFC sobre Moodle

  Archivos
Jul 07 [2]
Jun 07 [12]
Mayo 07 [13]
Mar 07 [3]
Nov 06 [6]
Oct 06 [5]


Sindicación
Artículos
Comentarios


Enlaces
eGrupos
ZoomBlog

 
Inicio | Mi Perfil | Suscríbete al blog
Mayo del 2007

 

8º entrega finalizada

Enlace permanente 30 de Mayo, 2007, 10:35

Acabo de finalizar el documento de la 8º entrega. El proyecto va fenomenal y creo que ha entrado en la recta final.

A partir de esta entrega me voy a centrar en el formulario de opciones, es decir, que las opciones que se configuran funcionen perfectamente. Voy a ir programando también las distintas instrucciones de compilación para los distintos tipos de lenguaje, modificaré la interfaz para que recoja la descripción del módulo, o enunciado del problema, y el botón de subida de archivos lo programaré para que aparezca cuando se indique en las opciones.

Mañana tengo reunión con Alberto y probablemente acordemos más trabajo. Aunque esta semana reduciré el tiempo al proyecto ya que el 7 de junio tengo el último examen difícil de la carrera (me quedan dos) y le dedicaré casi todo el día.

Bye
Comentarios 25 ~ Comentar | Referencias (0)


 

Tercer problema solucionado!!

Enlace permanente 28 de Mayo, 2007, 0:12

Genial!
Gracias al foro de desarrolladores de Moodle me han informado que la función stripslashes() devuelve el texto original sin las medidas de seguridad que aplica la plataforma. Con la utilización de la misma, he solucionado este problema y la compilación y ejecución de código se realiza con total normalidad.

A seguir programando! Byeee


Comentarios 15 ~ Comentar | Referencias (0)


 

Problema de Moodle al recoger texto

Enlace permanente 27 de Mayo, 2007, 21:22

Vaya tardecita que llevo... Casi tres horas con el mismo problema... Creo que está solucionado, aunque tendré que hacer más pruebas.

Resulta que esta tarde he estado programando la forma en que voy a capturar el texto introducido desde una de las consolas por un usuario y pasarlo a un archivo para así compilarlo y ejecutarlo. Pero antes de esto, he tendio otros dos problemas que he tardado en solucionar.

Primer problema

El botón ejecutar. Necesitaba que el botón fuera de acción y no de formulario, es decir, pulsar y que se lance el proceso de compilación y ejecución. Pues resulta que en PHP no existen los botones interactivos, tenía que hacerlo en JavaScript con lo que no podía utilizar las funciones ya desarrolladas en PHP.
Investigando un poco encontré el siguiente código para "engañar" a PHP y que se produzca la acción deseada:

<?php
if( $_POST['ActBack']  == "1" && isset($_POST['ActBack'])){
              REMOTERUNNING_running($result,$text);
            }
?>

El código anterior se declara al comienzo de la página, y dentro del formulario:

<input type="hidden" name="ActBack" value="0">   
      <input type="submit" name="btnBack "value="Ejecutar" onClick = "eval('ActBack.value=1')">

Con lo anterior, el botón funciona perfectamente y al pulsarlo se ejecuta la función REMOTERUNNING_running();

Segundo problema

La ejecución de los programas los realizaré mediante la consola del sistema, pero los mensajes de error y warnings del compilador he preferido mostrarlos en la interfaz del módulo. Para representar un cuadro donde mostrar los mensajes utilicé la función print_textarea() para mostrar texto, pero al pasarle una variable con la información, aparecía todo seguido, sin retornos de carro.

Para solucionar esto, creé un pequeño FRAME dentro de la misma página, pero no conseguía pasarle el texto de ninguna forma así que he optado por crear una tabla con "Scroll" y css, es decir, que si los errores sobrepasan el tamaño de la ventana, se visualizará un scroll para navegar y ver toda la información.

Esto lo he conseguido con el siguiente código:

<style type="text/css">
            td.scroll
            {
                width: 420px;
                height: 260px;
                font-family: verdana;
                font-size: 11px;
                color: #ccddee;
                background-color: #203b59;
                scrollbar-base-color: #203b59;
                scrollbar-3d-light-color: #a0bbd9;
                scrollbar-arrow-color: #a0bbd9;
                scrollbar-darkshadow-color: #203b59;
                scrollbar-face-color: #203b59;
                scrollbar-highlight-color: #809bb9;
                scrollbar-shadow-color: #809bb9;
                scrollbar-track-color: #203b59;
                }
        </style>
...

<td><table width="420" height="260"><tr><td class="scroll"><div style="width: 100%; height: 100%; overflow: auto;"><p aling="left"><?php echo $result; ?></p></div></td></tr></table></td>


















Tercer problema

La propia captura del texto... Esto me ha dado muchísimos problemas. La solución ha sido sencilla, aunque estoy investigando alguna más.

Resulta que a la hora de capturar texto del usuario, Moodle posee un sistema de seguridad para no ejecutar código sql malicioso. Resulta que si se añade dobles comillas (" ") a un texto en un formulario, Moodle introduce barras invertidas para desactivar posibles instrucciones sql. Si introducimos texto como printf("Hola mundo"), Moodle lo convierte en printf(\"Hola mundo\") con lo cual se producen errores de compilación.

Por ahora no es posible desactivar esta medida de seguridad, pero lo que he realizado es tratar la cadena como un todo y sustituir esas \" por " o "\ por " de la siguiente manera:

$text= str_replace(' \" ',' " ',$text);
$text= str_replace(' "\ ',' " ',$text);


Con la solución de los problemas anteriores ya tengo el módulo muy avanzado con la funcionalidad que se marcó en los objetivos del proyecto. A partir de este momento, me centraré en la programación de las opciones, de los distintos lenguajes y puliré el código adaptándolo a las normas de estilo de Moodle.

Bye


Comentarios 20 ~ Comentar | Referencias (0)


 

Consola controlada

Enlace permanente 26 de Mayo, 2007, 10:37

Hola!

Ya tengo el problema de lanzar la consola del SO controlada. E incluso he descubierto varias instrucciones muy interesantes. Resulta que era problema de mi ordenador. Cuando se inicia, está ejecutándose ya el servidor httpd de Apache. Solo tengo que pararlo y volver a iniciarlo manualmente.

Por lo tanto instrucciones como exec(cmd.exe /K start program.exe) funcionan perfectamente, lanzándose la consola y visualizando los resultados. El usuario será el encargado de cerrar esta consola.

Ahora mismo estoy trabajando en el proceso de compilación y ejecución de un fichero con PHP. Cuando termine actualizaré este artículo y expondré los resultados.

Bye

ACTUALIZACIÓN

Proceso de compilación y ejecución de programas finalizado y funcionando perfectamente. Código utilizado:

$so = getenv("HTTP_USER_AGENT");
system('gcc d:\misdoc~1\g.c 2>compilar.txt',$valorgcc); //Con esto recojo el valor devuelto por gcc
if(!$valorgcc) {  
       if (preg_match("/win/i",$so)) {
       shell_exec('start D:\AppServ\www\moodle\mod\RemoteRunning\a.exe');
       }
      else {
      shell_ex a.exe');
 unset($result);

      $result = 'ENHORABUENA'.'<BR>'.'Su programa ha sido ejecutado satisfactoriamente.';
}

 else {
     REMOTERUNNING_read_compilation($result);
}


Como el módulo tiene que funcionar tanto en Windows como en Unix, en la variable $so almaceno el SO en el que me encuentro. Lanzo la compilación del fichero con gcc y devuelvo el valor en $valorgcc. Si el proceso finaliza correctamente ($valorgcc = 0) ejecuto el fichero a.exe desde una consola. Si en la compilación hay errores ejecutaré la función REMOTERUNNING_read_compilation(), creada en lib.php, que se encargará de leer las líneas del fichero compilar.txt con los errores de compilación, para posteriormente mostrarlos en una consola del módulo.

El código de la función REMOTERUNNING_read_compilation(&$read) es el siguiente:

function REMOTERUNNING_read_compilation(&$read) {
   
    $chain = array();
    $i = 0;
    $fp=fopen(FILE_COMPILATION,'r');
    while(!feof($fp)) {
        $chain[$i] = fgets($fp);
        $i++;
        $chain[$i] = "<BR>";
        $i++;
    }
    $read=implode("",$chain);
    fclose($fp);
}  

El código de ejecución de unix contiene errores que corregiré más adelante, para lanzar el programa creado desde unix no será con 'bash a.exe'. Todavía tengo que investigar esto. Cuando finalice el proyecto para Windows lo modificaré para que funcione perfectamente para Unix.

Bye
Comentarios 2 ~ Comentar | Referencias (0)


 

Comenzando una nueva entrega

Enlace permanente 25 de Mayo, 2007, 18:44

Hola!

Ya estoy trabajando en una nueva entrega. Ésta va a estar centrada sólo y exclusivamente en programar el módulo Remote Running. Después de una reunión con Alberto, hemos decidido cambios importantes:

  • Seguridad código malicioso: se puede detectar código malicioso en el programa del usuario revisando el código para buscar instrucciones tipo exec o system.
  • El ejecutable será lanzado por consola sin redireccionar la salida a un fichero para no perder interactividad con el usuario. Esto ocasiona un problema en PHP, ya que éste no ofrece múltiples hilos de ejecución. Si lanzo un programa sin redireccionar la salida a un fichero, PHP esperará a finalizar la ejecución con lo que no se podrá controlar el tiempo de ejecución. Por lo tanto, esta opción será descartada por el momento. Investigaré la web Multi-threading strategies in PHP » Implicit Evaluation with PHP, en la que proponen un pseudo multi-hilo para PHP.
  • Varias opciones nuevas:
    • Permitir reenvío.
    • Email al profesor.
    • Tamaño máximo de fichero subidos al servidor.
    • El tiempo máximo de examen será renombrado a límite de tiempo.
A trabajar!
Comentarios 22 ~ Comentar | Referencias (0)


 

7º entrega finalizada

Enlace permanente 23 de Mayo, 2007, 17:27

Hola!
Acabo de terminar la 7º entrega de este proyecto. He finalizado la entrega con la ejecución controlada en tiempo de los programas que se ejecutarán en Remote Running. Voy a controlar este tiempo para abortar la ejecución de aquéllos que lo sobrepasen.

En cuanto a la ejecución segura de código malicioso, no tengo muy claras las cosas. He visto que www.codeide.com no reconoce funciones como system() o exec(). Esto seria interesante para asegurarse que el usuario no puede ejecutar comandos dentro del servidor como del, rm, etc. El único problema es que tengo que averiguar como lo han conseguido... Retomaré este problema si al finalizar la programación del módulo me sobra tiempo para poder implementar algo interesante.

Otro problema me está surgiendo a la hora de lanzar la consola (cmd.exe, en el caso de Windows) desde el módulo. Estoy comprobando que la ejecución se produce en segundo plano, es decir, cmd.exe se ejecuta pero el SO no muestra el terminal. Esto no es un problema a la hora de compilar, pero necesito mostrar la consola al usuario para que interactúe con los programas ejecutados.

Ahora mismo estoy probando con instrucciones como las siguientes:

exec("cmd.exe /C start gcc d:\misdoc~1\g.c");
exec('cmd.exe /C start D:\AppServ\www\moodle\mod\RemoteRunning\a.exe');

El argumento start debería lanzar la consola, pero esto no se produce. En la primera instrucción no es necesario mostrar la consola, pero sí al ejecgram.exe ya que si el programa necesita interactuar con el usuario, es necesario mostrar algún tipo de terminal.

Seguiré investigando este tema.

Byeee

Comentarios 26 ~ Comentar | Referencias (0)


 

Redireccionar la entrada y salida de los programas

Enlace permanente 17 de Mayo, 2007, 11:58

En cuanto al segundo punto de las tareas para esta 7º entrega ya he pensado alguna solución:

Redireccionamiento de salida

La salida producida por los programas la volcaré a un fichero y posteriormente leeré del mismo y mostraré el resultado en la consola oportuna en Remote Running.

Redireccionamiento de entrada

Esto es más complicado, como el módulo ha de funcionar en Windows y Linux, no puedo utilizar sólo comandos de Unix para capturar las señales que se producen a la hora de necesitar datos un programa.

La primera idea que se me ocurrió fue capturar la señal producida por un programa cuando pide datos de entrada (scanf, cin, etc) y lanzar algún tipo de consola para introducir esos datos por teclado. ¿Puede PHP capturar señales a nivel de SO? Si consigo realizar la captura de datos de la anterior manera, ¿cómo los introduzco en el programa?

Consultando con algunos compañeros se nos ocurrió una idea básica. Hacer una lectura del código fuente del programa para buscar instrucciones de entrada, pedirlas mediante mensajes en pantalla y luego pasarlas como argumento al programa. Esta idea tiene el inconveniente de tener que programar las variables como si fueran argumentos, restingiendo así la programación.

Lo que realizaré como solución provisional es tomar los datos por los terminales típicos del SO que se esté utilizando en ese momento.

Bye
Comentarios 32 ~ Comentar | Referencias (0)


 

Formulario completo!

Enlace permanente 16 de Mayo, 2007, 10:59

Conseguido!
Ya he averiguado como restringir la calificación y el tiempo de examen hasta que no se pulse el cuadro de Examen. El código es una combinación de JavaScript, HTML y PHP.

Primero: se creará una variable en JavaScript incluyendo los campos que se quieren restringir. Los campos a restringir son time_exam y grade y se corresponden con el nombre de los campos de texto o botones que se bloquearán mientras el módulo no esté destinado a un examen:

<script type="text/javascript" language="javascript">   
    var timelimititems = ['time_exam', 'grade'];
</script>

Segundo:  se define los campos del formulario, tanto el botón de restricción como los campos que se bloquearán:

<td>
     <input name="timelimitenable" type="checkbox" value="1" alt="<?php print_string("exam", "REMOTERUNNING") ?>" onclick="return lockoptions('form','timelimitenable', timelimititems)" <?php if ($form->exam) echo 'checked="checked"'; ?> />
</td>

El anterior es el botón de restricción, mediante return lockoptions('form','timelimitenable', timelimititems) estamos programando que al marcar el cuadro se bloqueen timelitmititems, que está formado por time_exam y grade, es decir, se bloquearán la calificación máxima y el tiempo de examen.

 
<td>
       <?php
             print_grade_menu($course->id, "grade", "$form->grade");
         ?>
</td>

print_grade_menu es una función especial de Moodle para escribir cuadro de opciones de calificación máxima, grade es el nombre del cuadro de texto.


<input type="text" name="time_exam" size="5" value="<?php  p($form->time_exam) ?>" />

Tercero: una vez terminado el formulario general hay que añadir el siguiente script para que bloquee las opciones si no está marcada la casilla de Examen:

<script type="text/javascript">
<?php
    if (!$form->time_exam) echo "lockoptions('form','timelimitenable', timelimititems);";
?>
</script>

Y sin más me despido con capturas de los resultados:




Comentarios 12 ~ Comentar | Referencias (0)


 

Definiendo opciones de Remote Running

Enlace permanente 16 de Mayo, 2007, 9:39

Hola!
Continuando con el trabajo del módulo, he definido y creado el formulario de opciones de la actividad. Éstas serán las siguientes:
  • Nombre: el nombre que tendrá la actividad dentro del curso.

  • Descripción: un breve comentario sobre el módulo.

  • Tiempo máximo de ejecución: será el tiempo límite de ejecución de los programas. Es opcional y puede ser utilizado como medida de seguridad. Este tiempo será definido en segundos.

  • Lenguaje: lista con los lenguajes que soportará el módulo. Se elegirá uno de ellos que será con el que se trabaje.

  • Examen: si se marca, se orienta la actividad como un examen.

  • Calificación máxima: mediante esta opción se calificará al alumno con una nota máxima, si el módulo ha sido utilizado como examen. Estará visible si se ha marcado la opción examen.

  • Tiempo total de examen: permite un tiempo máximo de examen. Elección visible si la actividad es un examen.

  • Subir archivo: si el profesor necesita el trabajo del alumno para una revisión posterior se marcará esta opción. Mediante la misma, el alumno puede guardar su trabajo en un archivo y subirlo al servidor. Posteriormente este archivo estará disponible para el profesor.

Falta un asunto por terminar. No he conseguido que la calificación y el tiempo de examen aparezcan inhabilitados hasta que se marque la casilla de Examen. Por ahora me estoy pegando (y me está dando una paliza...) con el PHP y las funciones de Moodle. Cuando tenga resultados vuelvo a actualizar explicando un poco el código.

A partir de ahora voy a seguir investigando el otro objetivo de la entrega, la redirección de entrada / salida. Aquí os dejo una captura del formulario.

Bye


Comentarios 8 ~ Comentar | Referencias (0)


 

Reunión de la séptima entrega

Enlace permanente 11 de Mayo, 2007, 17:59

    Esta mañana me he reunido con Alberto para corregir trabajo anterior y definir nuevos objetivos para esta entrega.
Un cambio importante ha sido en el nombre del módulo, que pasará de denominarse CERP a llamarse definitivamente Remote Running, consiguiéndose un nombre más intuitivo en cuanto a la finalidad del módulo.

Después de estar un par de horas corrigiendo documentos y analizando aspectos de la programación del módulo a desarrollar, se ha concretado los siguientes puntos como trabajo para esta nueva entrega:

  • Definición de opciones: definiré todas las opciones del módulo, mirando entre las múltiples que ya están desarrolladas en Moodle y otras específicas de la nueva actividad.
  • Redirección entrada / salida: cuando se cree un programa que necesite datos de entrada, ¿cómo realizaré la captura de datos?
  • Ejecución segura / en tiempo: será deseable una ejecución de programas segura, para que no se pueda ejecutar código malicioso y una ejecución en tiempo necesaria, es decir, que los programas tengan un tiempo máximo de ejecución y compilación.
A currar!

Bye

Comentarios 5 ~ Comentar | Referencias (0)


 

Programando CERP!!!

Enlace permanente 9 de Mayo, 2007, 13:02

Por fin! Aquí estoy programando el módulo!
He tenido que volver a instalar Moodle debido a que con tantas pruebas de módulos anteriores me ha dado fallos al desinstalar CERP y volver a añadirlo para hacer pruebas con el fichero de idioma.

Por lo tanto, la versión definitiva sobre la que programaré CERP es la versión 1.7.2+ de Moodle.

Estoy teniendo problemas con el idioma porque me reconoce el español pero no me salen las tildes. Esto creo que es problema de la codificación utf8. Investigaré un poco y luego pondré resultados.

Bye

ACTUALIZACIÓN

Menuda tontería... simplemente hay que guardar el fichero cerp.php en formato utf8 con cualquier editor de textos... Yo lo he realizado con el UltraEdit.

En fin! Todo funciona correctamente por ahora! Seguiré con la interfaz y pensando en opciones de configuración. Por ahora tengo muy pocas, simplemente, nombre, descripción y el tiempo máximo de compilación.

Bye
Comentarios 22 ~ Comentar | Referencias (0)


 

Capturando errores de gcc

Enlace permanente 8 de Mayo, 2007, 18:34

   ¿Cómo devuelve los errores y avisos de compilación el compilador gcc? Esto ha sido parte del trabajo de la quinta entrega, junto con varios apartados de la memoria y el estudio de determinadas cuestiones del chat de Moodle.

Necesito capturar estos errores y avisos para poder mostrarlos en una de las dos consolas que formarán la interfaz del módulo CERP. La idea por ahora es básica, redireccionar a un archivo, y si no está vacío, leer errores y avisos y mostrarlos. Esto se consigue redireccionando los errores de gcc a un archivo de la siguiente forma:

gcc -o ejecutable compilar.c 2 > errores.txt

Después hay que comprobar que el fichero errores.txt no esté vacío para leer sus líneas y mostrarlas en una de las consolas. Si el fichero estuviera vacío entonces solo quedaría ejecutar ejecutable y mostrar los resultados.

Saludos

Referencias: Redirecciones y tuberías, http://www.wikilearning.com/redirecciones_y_tuberias-wkccp-4230-13.htm
Comentarios 22 ~ Comentar | Referencias (0)


 

Seguimos trabajando

Enlace permanente 4 de Mayo, 2007, 11:16

Pues seguimos trabajando en el proyecto, estos últimos días los he orientado a temas de documentación, sin entrar de lleno en el módulo. En cuanto a éste, por ahora solo tengo el esqueleto, muy sencillo de crear.
He vuelto a corregir el índice del proyecto, quedando de la siguiente manera:

Resumen

Índice

1.       Introducción

1.1.     Objetivos del proyecto 

2.       Sistemas de gestión del aprendizaje (LMS)

2.1.     Moodle

2.2.     Aplicaciones para la compilación remota.

3.       Tecnologías

4.   Planificación del proyecto

5.       Análisis del sistema

6.       Diseño del sistema 

7.       Manual de usuario

8.       Manual del programador 

9.       Conclusiones y trabajo futuro

Bibliografía y referencias 

Anexos:

1.       Entregas

2.       Tutorial de creación del módulo

3.       Blog del proyecto en Internet



A parte de lo anterior, he seguido mejorando el tutorial y he comenzado a realizar los apartados siguientes de la documentación:

Resumen

Índice

1.       Introducción

1.1.     Objetivos del proyecto 

2.       Sistemas de gestión del aprendizaje (LMS)

2.1.     Moodle

2.2.     Aplicaciones para la compilación remota.


Para los siguientes días voy a seguir mejorando el trabajo anterior y comenzaré a programar el módulo CERP.

Bye

Comentarios 24 ~ Comentar | Referencias (0)



Blog alojado en ZoomBlog.com

 

 

<<   Mayo 2007  >>
LMMiJVSD
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31    

Categorías
General [41] Sindicar categoría