Project VISNUE-TWEE
Het oefeningensysteem/2
A. Bultheel
Oktober 2003
http://nalag.cs.kuleuven.be/research/ALpubs/AL20.abs.shtml
Samenvatting:
We geven een technische beschrijving van een aanpassing
van het vorige oefeningensysteem,
in het project VISNUE-TWEE. Het genereert
vanuit een aangepast LATEXbestand een webpagina
waarin de opgave wordt beschreven, en een webformulier
waar de antwoorden moeten ingevuld worden.
De oefening kan aldus on-line opgelost worden.
De antwoorden van de ingevulde formulieren worden
elektronisch verstuurd naar de student als hij/zij daarom vraagt.
De antwoorden worden in elk geval in het systeem opgeslagen en
verwerkt zodat ze op een overzichtelijke manier kunnen bekeken
worden door het onderwijsteam zodat er een eventuele terugkoppeling
mogelijk is.
Het oefeningensysteem zoals beschreven in @L19 had een aantal problemen
waardoor het systeem omwille van de webbeveiliging die op de server
van kracht waren tot onwerkbare heksentoeren moest komen om de beveiliging
te omzeilen.
Daarom werd besloten een aanpassing te maken die gebruik maakt van een MySQL
gegevensbank. Overigens blijft het systeem naar het gebruik toe dezelfde
functionaliteit behouden. Deze tekst moet vooral dienen om het gebruik te
beschrijven en de opbouw van het geheel zodat herinstallatie of aanpassingen
maken aan het systeem mogelijk wordt.
Elke opgave wordt beschreven in een oefz<nr>.dat bestand.
Dit is een LATEX bestand met wat extra informatie voor het aanmaken van
een antwoordformulier (zie verder).
Een perl-script maak.pl zal een map oefz<nr> aanmaken als die nog
niet bestaat en het .dat
bestand daarnaartoe kopiëren. Daarwordt dan drie versies aangemaakt:
een .pdf formaat, een .html formaat (in een submap) en eventueel
een antwoordformulier in de vorm van een .inc bestand.
Voor het gebruik is er een login.php bestand dat de begeleider van de
oefeningen toelaat voor een bepaalde reeks en een bepaalde oefening de gegevensbank
toegankelijk te maken voor de studenten.
De studenten kunnen, na het opgeven van hun identiteit en eventueel
een email-adres en na het kiezen van hun reeks en de gewenste opgave,
het antwoordformulier krijgen door het bestand antwoord.php
in een browser te openen. Na het invullen van het formulier, kunnen
ze hun antwoorden indienen waarna ze weggeschreven worden in de gegevensbank,
en de antwoorden ook verstuurd worden naar het opgegeven email-adres.
Na het indienen van de antwoorden kan de begeleider de gegevensbank weer
afsluiten met het login.php script.
De ingediende antwoorden zijn dan per reeks en per oefenzitting te bekijken
door het php script browse.php te openen in een browser.
Zowel login.php als browse.php zijn met een paswoord beveiligd.
De bestanden nodig om het systeem te gebruiken, zijn verpakt in een
zipbestand oef.zip. Dit moet eerst uitgepakt worden.
Het uitpakken van oef.zip resulteert in een map oef
die vanaf nu de hoofdmap van het oefenzittingensysteem genoemd wordt.
In deze map vindt u volgende bestanden:
- index.html: een bestand waarin de informatie over de oefeningen staat met de links naar de verschillende oefeningen doe ondergebracht zijn in de submappen oefz<nr>.
- doel.html: een bestand waarin de doelstellingen van de oefeningen wordt uitgelegd
- oefzlijst.txt: een bestand waarin de lijst van de oefenzittingen met antwoordformulier staan met een korte omschrijving.
- login.php: een bestand dat gebruikt wordt om de gegevensbank te openen of te sluiten.
- antwoord.php: een bestand dat gebruikt wordt om de antwoordformulieren op te roepen
- browse.php: een bestand dat gebruikt wordt om de resultaten opgeslagen in de gegevensbank te bekijken.
- loadvars.inc: een bestand waarin variabelen geïnitialiseerd worden.
- maak.pl: een perlscript voor installatie van het systeem.
- defs.tex: een bestand dat de texdefinities bevat nodig voor
de formulierversie van de opgave.
- bevestig.html: een bestand waarin de student gevraagd wordt zijn gegevens te bevestigen.
- form.inc: een bestand waarin de code staat om het gepaste antwoordformulier op te roepen.
- .latex2html-init: een bestand waarin de configuratie voor het gebruik van LATEX2html is opgegeven.
In deze map bevinden zich ook een submap:
- readme: een map waarin de uitleg omtrent het oefenzittingensysteem
terug te vinden is; deze map bevat deze uitleg in LATEX formaat,
pdf formaat en html formaat.
voor de oefenzittingen te genereren.
Eerst moet het systeem op de hoogte worden gebracht van een aantal
gegevens over waar wat te vinden is.
Er is een bestand loadvars.inc in de hoofdmap waarin informatie staat over de
beveiligde map waar informatie voor php is te vinden ($padhttpd)
en het lokale pad ($padroot) waar de opgaven zullen aangemaakt worden.
Bijvoorbeeld
<?php
//variabelen voor de php
$padhttpd="/cw/wwwserver/.... ...../httpd";
$padroot="../oef";
?>
De httpd map moet aangemaakt worden door de systeembeheerder.
In de map $padhttpd staan een aantal bestanden met gevoelige
informatie die wel voor php beschikbaar is, maar niet door de buitenwereld
kan bekeken worden.
Die bestanden zijn:
- adepwd.inc: een bestand waarin loginnaam en paswoord staan
voor de begeleiders,
<?php
$naampwd="loginnaam";
$paswdpwd="loginpaswoord";
?>
- adevars.inc: een bestand waarin een aantal variabelen geladen worden.
O.a. het academiejaar in de vorm van 4 cijfers. Bijvoorbeeld 0304.
<?php
include("$padhttpd/ld_dbp.inc");
$acjaar="0304";
?>
- ld_dbp.inc: een bestand waarin gegevens over de gegevensbank worden
ingeladen.
Die gegevensbank moet aangevraagd worden bij de systeembeheerder.
Die wordt met een zekere naam gecreëerd op een server.
Die geeft een naam, een rootlogin en een rootpaswoord voor deze gegevensbank.
Die worden opgegeven in een script van de volgende vorm:
<?php
$db = mysql_connect("naam_db_server", "rootlogin_db" , "rootpasw_db");
mysql_select_db("naam_database",$db);
?>
- Verder 2 handige php scripts om post en get-variabelen te laden.
- ld_post_vars.inc
<?php
while( list($key, $val) = each($HTTP_POST_VARS)) { $$key = $val; }
?>
- ld_get_vars.inc
<?php
while( list($key, $val) = each($HTTP_GET_VARS)) { $$key = $val; }
?>
Alle gegevens over een oefenzitting zitten opgeslagen in een submap
van de hoofdmap onder een naam oefz<nr>.
Daarin zal minimaal een bestand oefz<nr>.dat zitten waarin de opgave beschreven is. Eventueel zijn daarin ook submappen maple en/of matlab
te vinden waarin informatie zit over programma's die in de oefenzitting moeten gebruikt worden.
Als er een bestand oefz<nr>.dat in de hoofdmap aanwezig is zonder dat
er een submap oefz<nr> bestaat, dan zal deze aangemaakt worden bij
het uitvoeren van maak.pl.
In de hoofdmap moet ook een bestand
oefzlijst.txt aangepast of aangemaakt worden indien nodig.
Voor elke oefenzitting met antwoordformulier is er in dit bestand 1 regel met het volgende formaat:
- Nummer van de oefenzitting.
- een dubbele punt en een spatie.
- Tekstuele omschrijving van het onderwerp van de oefenzitting,
niet langer dan 1 regel.
De verschillende onderdelen van een dergelijke regel volgen elkaar direct
op, zonder extra witruimte.
Deze informatie wordt gebruikt door form.inc die in antwoord.php ingelast wordt.
De oefz<nr>.dat bestanden geven alle informatie over een oefenzitting weer.
Ze zijn voor het overgrote deel een beschrijving van de opgave in LATEX.
De informatie over waar er welke invulvakjes voor het antwoordformulier
moeten gemaakt worden staat in een LATEX omgeving
\begin{form}
... \end{form}
en wordt beschreven in
html.
Sommige informatie die men wel in de opgave, maar niet in het antwoordformulier
wil hebben (zoals een link naar het antwoordformulier, of een link naar de opgave) kan ingesloten worden in een LATEX omgeving
\begin{noform}
... \end{noform}
.
Het effect van maak.pl:
Het perl script maak.pl zal volgende operaties uitvoeren:
- kopiëren:
Het bestand oefz<nr>.dat overbrengen naar de
submap oefz<nr>.
- aanmaken oefz<nr>.txt:
Uit dit .dat bestand worden dan alle korte beschrijvingen van de te geven
antwoorden in het antwoordformulier (als dit er is) geselecteerd en in
een bestand oefz<nr>.txt geplaatst.
- aanmaken van html versie:
Er wordt een kopie gemaakt van oefz<nr>.dat naar oefz<nr>.tex
waarbij de volgende operaties worden uitgevoer:
- De omgeving
\begin{noform}
... \end{noform}
wordt vervangen door
\begin{rawhtml}<!--NOFO -->
...
<!-- NOFO-->\end{rawhtml}
.
- De omgeving
\begin{form}
... \end{form}
wordt vervangen door
\begin{rawhtml}<!--FORM
... FORM-->\end{rawhtml}
.
Dan wordt met LATEX2html dit vertaald in de subsubmap
oefz<nr> van de submap oefz<nr>. Daarin is oefz<nr>.html of
index.html het aan te spreken bestand om de opgave van de oefening
te bekijken. Bij het aanmaken wordt gebruik gemaakt van de LATEX2html configuratie
die gedefineerd is in het bestand .latex2html-init van de hoofdmap.
Voor het aanmaken van oefz<nr> wordt dit tijdelijk gekopieerd naar die submap.
- aanmaken van pdf versie:
Vervolgens wordt een bestand oefz<nr>.pdf aangemaakt met
pdflatex.
De relatieve links naar ../matlab/... of ../maple/... worden vervangen
door absolute links.
- aanmaken van het antwoordformulier oefz<nr>.inc:
Tenslotte wordt het antwoordformulier aangemaakt als oefz<nr>.inc.
Dit gebeurt door
- een kopie te maken van oefz<nr>.html uit de
subsubmap oefz<nr> naar de submap oefz<nr>.
- Daarvan wordt de ``header'' en de ``footer''
weggelaten.
- Alle relatieve links worden aangepast.
- De lijnen
<!--FORM
en FORM-->
worden weggelaten zodat
de tussenliggende html-commando's actief worden.
- De tekst
NOFO-->
en <!--NOFO
wordt op de gepaste plaats
weggelaten zodat de tussenliggende html-lijnen niet weergegeven worden.
- Alle links worden aangepast zodat ze geopend worden in een nieuw venster.
Hoe de bestanden oefz<nr>.dat aanmaken?
- De hoofding moet naast de pakketten die de auteur wil gebruiken ook het
pakket html laden met
\usepackage{html}
laden indien de form of
noform omgevingen gebruikt worden.
- De eventuele links naar matlab/... of maple/... moeten voorafgegaan worden door ../ opdat de juiste bestanden zouden bereikt worden.
- De commandos's
\begin{form}
en \end{form}
alsook
\begin{noform}
en \end{noform}
moeten op een afzonderlijke
lijn staan.
- In de form-omgeving staat enkel geldige html tekst. Voor de mogelijke
soorten antwoorden: zie verder. Er mag geen
<!--
of -->
in voorkomen.
- Elke form-omgeving genereert een html invoer-item.
Al deze items moeten een unieke naam krijgen (net zoals de ``labels''
in LATEX). Die wordt opgegeven met
NAME="unieke_naam"
.
Als die unieke_naam
een tabel is, dan geeft men dat aan door vierkante haken:
NAME="unieke_naam[]"
.
- Elke form-omgeving bevat ook een afzonderlijke lijn waarop staat
\kort[....]
waarbij tussen de vierkante haken een tekst staat die
het in te vullen antwoord voorafgaat in de resultaten (gegevensbank en/of
boodschap verstuurd naar de student).
- De te genereren invulvakjes die in de form-omgeving kunnen
gemaakt worden zijn enkel beperkt door de html-mogelijkheden.
We geven enkele skeletten ter illustratie:
- RBQ (Radio Button Question):
wordt gebruikt voor een enkelvoudige selectievraag
waarbij alle opties getoond worden.
<BR>
<INPUT TYPE="RADIO" NAME="naam" VALUE="optie1"> Optie 1 of
<INPUT TYPE="RADIO" NAME="naam" VALUE="optie2"> Optie 2
( Kies 1 van de vorige items
<INPUT TYPE="RADIO" NAME="naam" VALUE="Niet ingevuld" checked>)
<BR>
Zorg dat er altijd 1 optie is ge``checked'', anders heeft de tekst opgegeven
in \kort[...]
geen corresponderend antwoord en klopt vanaf daar de overeenkomst
tussen vraag en antwoord niet meer in de gegenereerde tekst die wordt verstuurd en
opgeslagen in de gegevensbank.
- SEQ (Selection Question):
wordt eveneens gebruikt voor een enkelvoudige
selectievraag, maar ditmaal wordt slechts 1 keuzemogelijkheid tegelijk
getoond (menu).
<BR>
<SELECT NAME="naam" SIZE="1">
<OPTION VALUE="optie0"> geen antwoord</OPTION>
<OPTION VALUE="optie1"> Optie1</OPTION>
<OPTION VALUE="optie2"> Optie2</OPTION>
</SELECT>
<BR>
Zorg ook hier dat er steeds een optie ``geen antwoord'' of ``ik weet het niet''
voorzien is, anders kiest het systeem de eerste optie als antwoord, en
dan weet je niet of het de keuze van het systeem of van de student is
die je te zien krijgt.
- MCQ (Multiple Choice Question):
wordt gebruikt voor een meervoudige selectievraag
waarbij elke antwoordmogelijkheid afzonderlijk geselecteerd of
niet geselecteerd kan worden.
<BR>
<INPUT TYPE="CHECKBOX" NAME="naam[]" VALUE="ik verkies 1"> ik verkies 1 |
<INPUT TYPE="CHECKBOX" NAME="naam[]" VALUE="ik verkies 2"> ik verkies 2 |
<INPUT TYPE="CHECKBOX" NAME="naam[]" VALUE="ik verkies 3"> ik verkies 3
<BR>
Merk op dat de naam nu moet gevolgd worden door vierkante haken opdat het zou
doorgegeven worden als een tabel (``array'').
- FIQ (Fill In Question):
wordt gebruikt voor een invulvraag met woorden
(en evt. getallen), kleine invulvakjes.
<BR>
Een troep wolven noemt men een <INPUT TYPE="TEXT" NAME="naam" VALUE="troep">
<BR>
of
2 + 2 = <INPUT TYPE="TEXT" NAME="naam" VALUE="resultaat">
of
(d1,d2) = <TEXTAREA ROWS="1" COLS="20" NAME="naam">(d1, d2)</TEXTAREA>
of
<UL>
<LI> d(1) = <INPUT TYPE="text" NAME="example[]" VALUE="">
<LI> d(2) = <INPUT TYPE="text" NAME="example[]" VALUE="">
</UL>
- ESQ: (Essay Question):
wordt gebruikt voor een opstelvraag, groot invulvak
<BR>
<TEXTAREA ROWS="5" COLS="70" NAME="naam"></TEXTAREA>
<BR>
- Figuren in de opgaven:
Omdat de opgave omgezet wordt naar pdf, mogen figuren in eps formaat niet gebruikt worden, of er dienen gepaste maatregelen genomen te worden zodat de gebruikte figuren toch verwerkt kunnen worden (denk aan eps2pdf).
Nadat de .dat bestanden in de hoofdmap gezet zijn zal bij het
uitvoeren van het perlscript maak.pl, voor elke oefz<nr>.dat
de oefening aangemaakt worden.
Het systeem is nu klaar voor gebruik gedurende 1 academiejaar.
De verantwoordelijke voor de oefensessie opent met een browser
het bestand login.php in de hoofdmap en geeft aan
welke sessie (oefening nummer en reeks) moet opengezet worden.
Hij moet daarvoor de loginnaam en het loginpaswoord kennen.
Op het einde van de oefenzitting kan de sessie weer afgesloten worden op
dezelfde manier.
Bij het openzetten wordt voor de betrokken sessie een 1 geplaatst
in het veld open van de tabel sessies_nw van de gegevensbank. De drie velden in die tabel
zijn oefz, reeks, en open.
Men kan die tabel aanmaken door een tabel oefz en een tabel reeks
te maken waarin telkens slechts 1 veld aanwezig is waarin de nummers van de
oefenzittingen, respectievelijk de reeksen zijn ingevuld.
De tabel sessies_nw wordt dan aangemaakt met een MySQL commando
create table sessies_nw select oefz,reeks from reeks inner join oefz on 1
Nadien kan men een veld open bijvoegen in sessies_nw
dat de default waarde 0 heeft.
De student opent de pagina antwoord.php in een bladerprogramma.
Hij geeft algemene informatie betreffende zichzelf en de oefenzitting,
nl. zijn naam, voornaam, reeks, de oefenzitting en eventueel zijn
emailadres. Vervolgens bevestigt hij dit door op de knop ``verder'' te
klikken. Dan bevestigt hij zijn emailadres in een popup venster en
krijgt nu het invulformulier voor de gekozen oefenzitting te zien.
De student maakt nu de oefeningen en vult de gevraagde antwoorden in
in het formulier. Hij verstuurt zijn gegevens en krijgt een emailbericht
met zijn eigen antwoorden indien hij emailbevestiging wenst.
De oefensessie is afgelopen voor deze student.
Meerdere studenten die samenwerken kunnen hun namen en voornamen invullen
in hetzelfde vak als voor 1 student; zij zullen waarschijnlijk spaties,
ampersands, voegwoorden, enz. gebruiken om hun namen te scheiden.
Hiermee wordt rekening gehouden bij het verwerken van de gegevens.
Er is slechts 1 emailadres mogelijk.
- Als een student zijn naam, voornaam of reeksnummer niet invult,
krijgt hij een waarschuwing en geen volgende pagina te zien.
- Een student die een emailadres ingeeft dat niet voldoet aan een
aantal basisvereisten voor een correct emailadres krijgt eveneens een
boodschap. Omwille van deze controle worden ook alle andere
scheidingstekens anders dan een komma (eventueel gevolgd door een spatie)
geweigerd.
Hier ligt nog een mogelijkheid voor verbetering. De studenten wordt gevraagd
hun email adres na te kijken en te bevestigen.
Toch wordt dit niet altijd goed gedaan waardoor bij het versturen van deze
post er een foutenboodschap wordt gegenereerd, en bovendien zal de student
die zich niet bewust is van zijn tikfout zich afvragen waar de boodschap met zijn
antwoorden niet is verstuurd.
Een mogelijkheid is om van de LDAP techniek gebruik te maken.
De student moet zich dan wel juist identificeren, bv. met zijn m-nummer (s-nummer),
Men kan dan in een gegevensbank nagaan of deze student wel toegang heeft en
zijn correcte naam, voornaam, email-adres enz. automatisch opvragen.
- Als de gegevensbank niet is opengesteld voor een bepaalde
oefensessie, dan krijgt de student een waarschuwing en moet hij nakijken
of de juiste oefenzitting en reeks geselecteerd werden, en indien nodig de
begeleider van de oefensessie verwittigen. Dit is ingebouwd als basiscontrole
op de uitvoering van login.php.
De gegevensbank bestaat uit slechts 2 tabellen:
- sessies_nw een tabel met velden
- oefz: het nummer van de oefenzitting (met antwoordformulier)
- reeks: de nummers van de reeksen
- open: bevat de waarde 1 als de sessie open is en 0 anders
- oef_ade_result, een tabel met de volgende velden
- id: een uniek identificatienummer
- naam: naam van de student
- voornaam: voonaam van de student
- reeks: het reeksnummer
- oefz: het nummer van de oefenzitting
- email: het email adres van de student
- jaar: het academiejaar (bv. 0304)
- opgave: het antwoord van de student in html met korte teksten voor elk antwoord tussengelast.
De gegevensbank kan door de rootlogin, mits ingeven van het bijhorende
paswoord geraadpleegd worden via
https://naam_db_server/phpmyadmin/
Op dit moment is naam_db_server
op het departement computerwetenschappen
olympia.
Deze is eveneens bereikbaar door in te loggen op naam_db_server
en het volgende commando uit te voeren:
mysql -u rootlogin -h localhoost -p
www.mysql.com/documentation/
www.php.net
www.rexswain.com/perl5.html
© Adhemar Bultheel
2003-10-28