eassari tekninen kuvaus Harri Laine Taustaa

Samankaltaiset tiedostot
eassari Practicing, assessment and exam engine Harri Laine Taustaa

Vaatimusmäärittely. AssariXP. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

eassari harjoitteluympäristön yleisrakenne

Toteutusdokumentti. AssariXP. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Suunnitteludokumentti

RINNAKKAINEN OHJELMOINTI A,

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

OHJELMISTOTUOTANTOPROJEKTI

OHJELMISTOTUOTANTOPROJEKTI

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

C++11 seminaari, kevät Johannes Koskinen

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

Capacity Utilization

Choose Finland-Helsinki Valitse Finland-Helsinki

Lohdutus - tietokantadokumentti

Lohtu-projekti. Ylläpitäjän dokumentti. Versiohistoria: Ensimmäinen versio Andreas Asuja

812336A C++ -kielen perusteet,

Telecommunication Software

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Järjestelmän syötteet ja tulosteet Kohahdus Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

FinFamily Installation and importing data ( ) FinFamily Asennus / Installation

Tietokantakurssit / TKTL

Lab SBS3.FARM_Hyper-V - Navigating a SharePoint site

CSE-A1200 Tietokannat

Information on Finnish Language Courses Spring Semester 2018 Päivi Paukku & Jenni Laine Centre for Language and Communication Studies

1. SIT. The handler and dog stop with the dog sitting at heel. When the dog is sitting, the handler cues the dog to heel forward.

Tietorakenteet ja algoritmit

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

Information on Finnish Language Courses Spring Semester 2017 Jenni Laine

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

Other approaches to restrict multipliers

Network to Get Work. Tehtäviä opiskelijoille Assignments for students.

Java UI-komponentit (JTable) Juha Järvensivu 2007

Encapsulation. Imperative programming abstraction via subprograms Modular programming data abstraction. TTY Ohjelmistotekniikka

Tietokannat II -kurssin harjoitustyö

Denormalisointia turvallisesti. Ougf syysseminaari Pörssitalo Helsinki Timo Raitalaakso

Information on Finnish Courses Autumn Semester 2017 Jenni Laine & Päivi Paukku Centre for Language and Communication Studies

Tietokannat II -kurssin harjoitustyö

Salasanan vaihto uuteen / How to change password

TIEKE Verkottaja Service Tools for electronic data interchange utilizers. Heikki Laaksamo

ECVETin soveltuvuus suomalaisiin tutkinnon perusteisiin. Case:Yrittäjyyskurssi matkailualan opiskelijoille englantilaisen opettajan toteuttamana

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

Results on the new polydrug use questions in the Finnish TDI data

15. Ohjelmoinnin tekniikkaa 15.1

Tuotteiden tiedot: Lisää uuden tuotteen tiedot. Muuta tai poista tuotteen tiedot. Selaa kaikkien tuotteiden tietoja.

HELIA 1 (14) Outi Virkki Tiedonhallinta

Java ja tietokannan käsittely (JDBC)

The CCR Model and Production Correspondence

Use of spatial data in the new production environment and in a data warehouse

Alternative DEA Models

Tietotekniikan laitos Käki-projekti TIETOKANTASUUNNITELMA. 1. Johdanto

3. Taulujen määrittely ja muuttaminen

Digitaalisen median tekniikat. JSP ja XML Harri Laine 1

Digitaalisen median tekniikat. JSP ja XML

SQL - STRUCTURED QUERY LANGUAGE

Opiskelijat valtaan! TOPIC MASTER menetelmä lukion englannin opetuksessa. Tuija Kae, englannin kielen lehtori Sotungin lukio ja etälukio

KONEISTUSKOKOONPANON TEKEMINEN NX10-YMPÄRISTÖSSÄ

Suunnitteludokumentti

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Information on preparing Presentation

OP1. PreDP StudyPlan

15. Ohjelmoinnin tekniikkaa 15.1

Returns to Scale II. S ysteemianalyysin. Laboratorio. Esitelmä 8 Timo Salminen. Teknillinen korkeakoulu

FIS IMATRAN KYLPYLÄHIIHDOT Team captains meeting

HELIA TIKO-05 1 (22) ICT03D Tieto ja tiedon varastointi E.Räty, O.Virkki

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Laskennallisesti Älykkäät Järjestelmät. Sumean kmeans ja kmeans algoritmien vertailu

Tällä viikolla. Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia

3. TAULUJEN MÄÄRITTELY JA MUUTTAMINEN

MALE ADULT FIBROBLAST LINE (82-6hTERT)

General studies: Art and theory studies and language studies

Hohde Consulting 2004

Supplies

PIC-koodin luominen URF-tietokantaan Participant Portal

SIMULINK S-funktiot. SIMULINK S-funktiot

Ohjelmointi 1 C#, kevät 2013, 2. tentti

EUROOPAN PARLAMENTTI

Security server v6 installation requirements

2017/S Contract notice. Supplies

Sisällysluettelo Table of contents

S SÄHKÖTEKNIIKKA JA ELEKTRONIIKKA

FETAL FIBROBLASTS, PASSAGE 10

Data protection template

Vaalikone.fi API Presidentinvaalit 2012

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Security server v6 installation requirements

SELL Student Games kansainvälinen opiskelijaurheilutapahtuma

Rekisteröiminen - FAQ

Suunnitteludokumentti

Listarakenne (ArrayList-luokka)

Gap-filling methods for CH 4 data

MEETING PEOPLE COMMUNICATIVE QUESTIONS

Group 2 - Dentego PTH Korvake. Peer Testing Report

Immigration Studying. Studying - University. Stating that you want to enroll. Stating that you want to apply for a course.

SENAATTILA uudistuu keväällä 2015

Transkriptio:

eassari tekninen kuvaus Harri Laine Taustaa eassari on tietokantapohjainen ympäristö automaattisesti tarkastettavien harjoitus- ja koetehtävien suorittamiseen. Monikielisyys ja helppo laajennettavuus ovat olleet päätavoitteita järjestelmää suunniteltaessa. Ohjelmiston avulla opiskelijalle voidaan selainkäyttöliittymässä esittää tietokannassa määriteltyjä tehtäviä. Opiskelija antaa vastauksen tehtävään käyttöliittymän kautta. vastaus tarkistetaan normaalisti heti ja opiskelijalle annetaan palautetta tehdyn tarkistuksen perusteella. Samantapaisia harjoittelu- ja koeympäristöjä on tarjolla useilla oppimisalustoilla, esim WebCT:ssä. Näissä tehtävät kuitenkin rajoittuvat yleensä pienehköön joukkoon yleisiä tehtävätyyppejä. Tyypillinen tehtävätyyppi on monivalintakysymys. Tehtävässä tarjotaan kiinteä joukko vaihtoehtoja, joista opiskelija valitsee jonkin. Jokaiseen vaihtoehtoon voidaan liittää palaute, joka näytetään käyttäjälle. Tämä voidaan toteuttaa myös siten, että opiskelijalle ei näytetä vaihtoehtoja vaan tarjolla on vastauskenttä, jonne opiskelija kirjoittaa vastauksen. Tätä verrataan ennalta määriteltyihin vaihtoehtoihin ja palaute annetaan vertailun tuloksen perusteella. Monimutkaisemmassa merkkaustehtävässä opiskelija voi valita useita vaihtoehtoja ja palautetta annetaan valittujen ja valitsematta jääneiden vaihtoehtojen perusteella. Muita yleiskäyttöisiä tehtävätyyppejä ovat elementtien järjestykseen laittaminen ja aukkojen täyttö, joka vastaa useaa monivalintaa saman tehtävän sisällä. Koska vaihtoehtojen määrä on rajattu, on jokaiselle valinnalle mahdollista määritellä valintakohtainen palaute. Aina ei vaihtoehtojen määrää kuitenkaan ole järkevää rajoittaa pieneen määrään. Jokaisen valinnan pitäisi tästä huolimatta tuottaa erilainen palaute. Tällainen tilanne esiintyy esimerkiksi silloin kun käyttäjän vastaus ohjaa simulaatiota tai käyttäjä antaa vastauksena lausekkeen, jonka arvo on laskettava. Kokeissa voisi olla järkevää arpoa osallistujille henkilökohtaiset tehtävät muuttamalla jotain tehtävään sisältyvää parametriarvoa. Tällöin vastausvaihtoehdotkin muuttuvat dynaamisiksi eikä niitä voida hallita kiinteiden vaihtoehtojen avulla. Simulaation ohjauksessa edellisen tehtävän vastaus muuttaa seuraavan tehtävän lähtötilannetta, eli tehtävät ovat dynaamisia. Edellä kaavailtuja tehtävätyyppejä on mahdollista toteuttaa laatimalla kutakin uutta tehtävätyyppiä varten ohjelmakomponentti, joka esittää tehtävän, vastaanottaa vastauksen ja tuottaa palautteen. Teknisesti tällainen ohjelmakomponentti voisi olla vaikkapa Java-appletti. Tällaisen komponentin ohjelmointi voi olla varsin työlästä. Uusien tehtävätyyppien kytkentä harjoitteluympäristöön ei ole mahdollista kuin harvoissa harjoitteluympäristöissä. Tehtävätyypit eassari järjestelmässä tarjolla on joukko valmiita tehtävätyyppejä. Tyyppivalikoimaa voidaan täydentää uusilla tehtävätyypeillä. Järjestelmä tarjoaa myös appletteja yksinkertaisemman palvelimella toteutettavan tekniikan tehtävätyyppien toteutukseen tarvittavien ohjelmien laatimiseen. Uutta tehtävätyyppiä määriteltäessä sille määritellään näyttö- ja arvioijakomponentit (kuva 1). Näyttökomponentin (Displayer) tehtävänä on tuottaa tehtäväasettelu ja siihen liittyvät vastauskäyttöliittymän elementit. Jos vastauskäyttöliittymään halutaan dynaamisuutta ja vuorovaikutusta näyttökomponentti tuottaa tätä hoitamaan JavaScript koodia. Tehtävän perusasetelmaan tarvittavat tehtäväkohtaiset tiedot haetaan tietokannasta. Näyttökomponentti

päättää mitä tietoja se tarvitsee ja miten se näitä hyödyntää. Se voi viedä kannasta hakemiaan tietoja suoraan käyttöliittymään tai muuttaa niitä. Se voi myös arpoa tehtäväparametreja. Samaa näyttökomponenttia voidaan käyttää monessa eri tehtävätyypissä. Näyttökomponentille voidaan määritellä alustusparametreja. Vastausnäytön lopulliseen ulkoasuun vaikuttaa lisäksi käytettävä tyylitiedosto. Tehtävätyyppi Displayer Laatii tehtäväksiannon Määrittää vastauskäyttöliittymän Analyser Arvioi ratkaisun Laatii palautteen Kuva 1: Tehtävätyypin käsittelyyn tarvittavat ohjelmakomponentit Vastauksen käsittelyn keskeinen komponentti on arvioija (Analyser), Arvioija saa arviointimetodin kutsuparametrina käyttäjän antaman vastauksen (taulukkona, jos vastaus muodostuu monesta erillisestä osata) ja tiedot näyttökomponentin tehtävänasetteluun tekemistä muutoksista. Vastauksen arvioinnissa arviointimoduuli voi käyttää kannasa annettavia tehtäväkohtaisa arviointitietoja esimerkiksi vastausvaihtoehtoja ja niiden palautteita. Arviointi voi sisältää myös ulkopuolisten ohjelmistokomponenttien kutsuja. Esimerkiksi SQL-kyselyjen oikeellisuuden arvioija voisi suorittaa kyselyn tietokantaohjelmiston avulla ja sisällyttää kyselyn tuloksen opiskelijalle annettavaan palautteeseen Arviointimoduuli määrittää kannasta haettavien tietojen rakenteen ja tulkinnan. Arviointi tuottaa tuloksenaan Feedback-olion. Tämän avulla voidaan raportoida järjestelmävirheestä tai toisalta arvioinnin tuloksesta. Arvioinnin tulos muodostuu kolmesta osasta. oikeellisuusprosentista, ilmoitustekstistä ja liiteaineistosta. Oikeellisuusprosentti on välillä 0-100. Tehtäväkohtaisesti voidaan antaa hyväksymisraja (cutoffvalue). Jos oikeellisuusprosentti on tätä korkeampi, tehtävä tulkitaan hyväksytysti suoritetuksi. Ilmoitusteksti on vastauksesta annettava pedagoginen palaute. Liiteaineisto pitää sisällään muuta arvioijan tuottamaan tietoa, esimerkiksi SQL-kyselyjen tapauksessa kyselyn tuottaman tuloksen. Tehtäviä voidaan suorittaa upottamalla vastauksen käsittelyn tai tehtävänannon käynnistävä pyyntö erilliseen oppimateriaaliin. Esimerkiksi tietokantakurssin kyselyesimerkit voitaisiin ajaa suoraan oppimateriaaliin upotetuista suorita napeista. Tehtäviä voi suorittaa myös kurssiin sisältyvän harjoittelumoduulin tai tentin osina. Tenttimoduulin määrittelyssä voidaan määritettä tarkastetaanko tehtävä heti vai vasta myöhemmin tentin päätyttyä. Displayer ja Analyser komponentit käynnistyvät kehyskoodin toimesta automaattisesti.

Arviointi ja näyttömoduulit ovat yhteydessä tietokantaan käteismuisti (cache) rajapinnan kautta. Niiden ei tarvitse tuntea tietokannan rakennetta. Ne pyytävät käsiteltävän tapahtuman tietoja käteismuistilta, joka tarvittaessa hakee tiedot tietokannasta. Esimerkki arviointikomponentista import trainer.*; public class SimpleAnalyser implements AnalyserInterface { final static String ECODE="E"; final static String TCODE="T"; final static int PARAMETER_ERROR=2; AttributeCache cache; String myname; String taskid; String language; ParameterString initp; public SimpleAnalyser() { cache=null; myname="simpleanalyser"; taskid=null; language="en"; public void init (String taskid, String lang, String initparams) { taskid= taskid; language= lang; initp= new ParameterString(initparams ; * Analysis method, checks the answer and gives the feedback * Assumes: answer array contains only one string, if there are more only * the first * is analysed. public Feedback analyse(string [] answer ) throws CacheException { Feedback fb=null; String currentparameter=null; // check that the answer is not empty if (answer[0]==null answer[0].length()==0) { fb= new Feedback(1,0, cache.getattribute(ecode,"noanswer","message", language),null

// compare the answer with check values until full match or all values // are checked // generate feedback for matching value currentparameter="valuecount"; String vc= cache.getattribute(tcode,taskid,"valuecount",language if (vc!=null) { try { int valuestocheck = Integer.parseInt(vc for (int i=1; i<=valuestocheck; i++) { currentparameter="value#"+i; String checkvalue= cache.getattribute(tcode,taskid,currentparameter,language if (checkvalue!=null) { if (answer[0].equals(checkvalue)) { currentparameter="correctness#"+i; String cinfo= cache.getattribute(tcode,taskid,currentparameter,language if (cinfo!=null) { int cinfoint= Integer.parseInt(cInfo currentparameter="msg#"+i; String fmessage= cache.getattribute(tcode,taskid,"msg#"+i,language fb= new Feedback(0,cInfoInt,fMessage,null else { fb= new Feedback(PARAMETER_ERROR, cache.getattribute(ecode,"notaskattribute", "MESSAGE",language)+ myname+' '+taskid+'.'+"correctness#"+i else { fb= new Feedback(PARAMETER_ERROR, cache.getattribute(ecode,"notaskattribute","message",language)+ myname+' '+taskid+'.'+"value#"+i catch (NumberFormatException ex) { fb= new Feedback (PARAMETER_ERROR, cache.getattribute(ecode,"attributetypeerror", "MESSAGE",language) + myname+ ' '+ taskid+'.'+currentparameter else { fb= new Feedback(PARAMETER_ERROR, cache.getattribute(ecode,"notaskattribute","message",language)+ myname+ ' '+ taskid+'.'+"valuecount"

// if no match or errors were found generate feedback for 'no match' String omessage= cache.getattribute(tcode,taskid,"others",language if (omessage!=null) { fb= new Feedback(0,0,oMessage,null else { fb = new Feedback (PARAMETER_ERROR, cache.getattribute(ecode,"notaskattribute","message",language)+ myname+ ' ' + taskid+'.'+"others" public void registercache( AttributeCache c) { cache=c; Ylläoleva analysoija käyttää tehtävän tarkastukseen tehtäväattribuutteja, joita tämän tehtävätyypin yhteydessa ovat VALUECOUNT, VALUE#1,, VALUE#n, CORRECTNESS#1,, CORRECTNESS#n ja MSG#1,, MSG#n. Muilla tehtävätyypeillä voi olla eri nimisiä tehtäväattribuutteja. Tehtäväattribuuteista voi olla useita kieliversioita.

Esimerkki näyttökomponentista: import trainer.*; public class SimpleDisplayer implements DisplayerInterface { final static String DCODE="D"; final static String TCODE="T"; AttributeCache cache; String myname; String taskid; String language; ParameterString initp; public SimpleDisplayer() { cache=null; myname="simpledisplayer"; taskid=null; language="en"; public void init (String taskid, String lang, String initparams) { taskid= taskid; language= lang; initp= new ParameterString(initparams ; /*** * loads the URL of the stylesheet attached to the displayer public String getstyle () throws CacheException { String style= cache.getattribute(dcode,myname,"stylesheet",language return style; * generates the tasktype specific javascript for processing the task form public String getscript () throws CacheException { String script= cache.getattribute(dcode, myname, "JAVASCRIPT", language return script; * generates the body of the form bt simply loading it from the database public String getsetting(string initval, String hiddens) throws CacheException { StringBuffer st = new StringBuffer( st.append("<form NAME=\"answerform\" ACTION=\"Answer\">\n" st.append("<table class=\"tasktable\">" st.append("<th CLASS=\"taskheader\" COLSPAN=\"2\">\n" st.append(taskid+": " st.append(cache.getattribute(tcode, taskid, "NAME", language)

st.append("</th></tr>\n" st.append("<tr>\n<td class=\"fname\">" st.append(cache.getattribute(dcode, myname, "TASK", language) st.append("</td>\n<td CLASS=\"setting\">" st.append(cache.getattribute(tcode,taskid,"setting",language) st.append("</td></tr>\n<tr><td class=\"fname\">" st.append(cache.getattribute(dcode,myname,"answer",language) st.append("</td>\n<td>" if (initp.nextelementbyname("answer")) { String tp= initp.getattributevalue("type" if (tp!=null && tp.equals("field")) { String arg1=initp.getattributevalue("size" String arg2=initp.getattributevalue("maxlength" st.append("<input TYPE=\"TEXT\" NAME=\"ANSWER\" SIZE=\"" if (arg1!=null) st.append(arg1 else st.append("20" st.append("\"" if (arg2!=null) { st.append("maxlength=" st.append(arg2 st.append("\"" st.append(" VALUE=\"" if (initval!=null) st.append(initval st.append("\">\n" else { String arg3=initp.getattributevalue("cols" String arg4=initp.getattributevalue("rows" st.append("<textarea NAME=\"ANSWER\" COLS=\"" if (arg3!=null) st.append(arg3 else st.append("60" st.append("\" ROWS=\"" if (arg4!=null) st.append(arg4 else st.append("5" st.append("\">" if (initval!=null) st.append(initval st.append("</textarea>\n" else { st.append("<input TYPE=\"TEXT\" NAME=\"ANSWER\" SIZE=\"20\" VALUE=\"" if (initval!=null) st.append(initval st.append("\">\n" st.append("</td></tr>\n<tr><td CLASS=\"buttons\" COLSPAN=\"2\">\n" st.append("<input TYPE=\"SUBMIT\" NAME=\"SUBMIT\" VALUE=\"" st.append(cache.getattribute(dcode,myname,"submit",language) st.append("\">\n" st.append("<input TYPE=\"BUTTON\" VALUE=\""

st.append(cache.getattribute(dcode,myname,"reset",language) st.append("\" onclick=\"document.answerform.answer.value='';\">\n" if (hiddens!= null) st.append(hiddens st.append("</td></tr></table>" st.append("</form>" return st.tostring( * generates a link to technical instructions public String gettechnicalhelp() throws CacheException { String helpurl= cache.getattribute(dcode,myname,"howtohelp",language String helptext=null; String helplink=null; // String helpimg=null; // String helpte if (helpurl!=null) { helptext =cache.getattribute(dcode,myname,"howtohelptext",language if (helptext==null) helptext = (language.equals("fi")?"ohje":"help" helplink="<a HREF=\""+helpURL+"\">"+helpText+"</A>"; return helplink; * generates a link to topic specifig help public String gettopichelp() throws CacheException { String helpurl= cache.getattribute(tcode, taskid,"topichelp",language String helptext=null; String helplink=null; // String helpimg=null; // String helpte if (helpurl!=null) { helptext =cache.getattribute(tcode,taskid,"topichelptext",language if (helptext==null) helptext = (language.equals("finnish")?"ohje":"help" helplink="<a HREF=\""+helpURL+"\">"+helpText+"</A>"; return helplink; public void registercache( AttributeCache c) { cache=c;

Järjestelmän tietokanta drop table storedanswer; drop table studentmodel; drop table taskinmodule; drop table task; drop table pluginparamattributes; drop table pluginparameters; drop table attributevalues; drop table taskattributes; drop table student; drop table module; drop table course; drop table tasktype; * Tasktype: * Tasks are of the same type if they share both the * displayer and the analyser and their initialization parameters create table tasktype ( typename varchar(40) not null primary key, /*task type identifier author varchar(40), /* author's name - currently not used datecreated date, /* date the tasktype was defined - currently not used description varchar(1000), /* other metadata about the tasktype - xml format, not used displayer varchar(40), /* name of the displayer class analyser varchar(40), /* name of the analyser class displayerinit varchar(1000), /* tasktype specific initialization parameters for the displayer, xml format analyserinit varchar(1000) /* tasktype specific initialization parameters for the analyser, xml format * Course is a collection of modules create table course ( courseid varchar(20) not null primary key, /* course identifier coursename varchar(40), /* course name - not used currently coursemetadata varchar(2000), /* course metadata in xml format - not used courselogo varchar(80), /* url to the image file that contains course logo coursestyle varchar(80) /* name of the course specific css style sheet * Module is a part of a course

create table module ( courseid varchar(20) not null, /* course identifier moduleid varchar(20) not null, /* identifies the module within the course moduletype varchar(20) not null, /* specifies the type of the module - training, exam modulename varchar(40), /* name of the module in English modulestyle varchar(80), /* file name of the module specific style sheet modulemetadata varchar(2000), /* module specific metadata in xml-format, not used currently moduleseqno integer, /* module sequence number within the course iscreditable char, /* specifies whether student gets gredit by passing the task creditsupto timestamp, /* upto which time credits are available taskselector varchar(80), /* classaname for the plugin class that select the next task to be presented selectorinit varchar(1000), /* module specific initialization parameters for the selector plugin primary key (courseid, moduleid), foreign key (courseid) references course * A reusable learning object create table task ( taskid varchar(20) not null primary key, /* each task has a unique id taskname varchar(40), /* name of task in English - not used currently author varchar(40), /* Name of author - not used currently datecreated date, /* date tasktype was definet - currently not used tasktype varchar(40), /* the type of the task - this connects the displayer and analyser to the task taskmetadata varchar(2000), /* other task specific metadata - xml-format, not used currently numberoftries_def integer, /* how many tries are allowed - default value shouldstoreanswer_def char, /* should the system store the answer (Y/N) - default value shouldregistertry_def char, /* should the system register the try (Y/N) - default value shouldknowstudent_def char, /* must the student be known (Y/N) -default value shouldevaluate_def char, /* should the task be evaluated on-line (Y/N) - default value cutoffvalue integer, /* the value to be exceeded to pass the task foreign key (tasktype) references tasktype

* the usage of a task as part of a module create table taskinmodule ( courseid varchar(20) not null, /* the course where used moduleid varchar(20) not null, /* the module where used seqno integer not null, /* sequence number of the task within the module taskid varchar(20) not null, /* which task is used numberoftries integer not null, /* how many tries are allowed in this context shouldstoreanswer char, /* should the system store the answer (Y/N) in this context shouldregistertry char, /* should the system register the try (Y/N) in this context shouldknowstudent char, /* must the student be known (Y/N)in this context shouldevaluate char, /* should the task be evaluated immediately (Y/N) cutoffvalue integer, /* the value to be exceeded to pass the task primary key (courseid, moduleid, seqno), foreign key (taskid) references task, foreign key (courseid, moduleid) references module * * Schema information about the task attributes used by displayers and analysers, * Fixed attributes of the task table are not defined here create table taskattributes( tasktype varchar(40) not null, /* the task the attribute is attached to attributename varchar(40), /* the name of the attribute typeofvalue varchar(12) not null, /* type of value NONE= no value TEXT= text value NUM= numeric value languagedependent char, /* is the value dependent on the language (Y/N) primary key (tasktype,attributename), foreign key (tasktype) references tasktype * * Schemas for the plugin initialization parameters create table pluginparameters( classname varchar(40) not null, /* the name of the plugin class elementname varchar(40) not null, /* the name of the element sequenceno integer,

/* the sequence number of the element in the parameter set typeofvalue varchar(12) not null, /* type of value NONE= no value TEXT= text value NUM= numeric value repeat integer, /* how many times this element may occur at most primary key (classname, elementname) * structure of plugin initialization parameters create table pluginparamattributes ( classname varchar(40) not null, /* the name of the plugin class elementname varchar(40) not null, /* the name of the element attributename varchar(40) not null, /* name of the attribute sequenceno integer, /* the sequence number of the element in the parameter set typeofvalue varchar(12) not null, /* type of value NONE= no value TEXT= text value NUM= numeric value primary key (classname, elementname, attributename), foreign key (classname, elementname) references pluginparameters * Attribute values for task, tasktype, course, displayer, analyser attributes * and general error messages * All language dependent attribute values are here and also some values that * apply for all languages create table attributevalues ( objecttype char, /* the type of object the attribute is attached to A= analyser C= course D= displayer E= general error message T= task X= general message objectid varchar(40), /* Identifier of the object A,D: class name C: course identifier T: taskid E: errorname attributename varchar(40), /* Name of the attribute language varchar(3),

/* language of the attribute value, currently FI,EN,ALL valuetype char, /* type of the value C=character, N=number attributevalue varchar(2000), /* the value as a string, most are short primary key (objecttype, objectid, attributename, language) * student create table student ( sid varchar(20) not null primary key, /* Student identifier, free format, must be unique external_studentid varchar(15), /* student id in some associated system (like student number in university) external_studentid2 varchar(15), /* student id in some associated system (like student number in university) lastname varchar(40) not null, /* student's last name firstname varchar(40) not null, /* student's first name email varchar(80), /* student's email address password varchar(12), /* student's password lastvisit timestamp /* last time student has visitid the system * Stored answers create table storedanswer ( sid varchar(20) not null, /* Student identifier courseid varchar(20) not null, /* course identifier moduleid varchar(20) not null, /* module identifier seqno integer not null, /* task sequence number within the module trynumber integer not null, /* the number of try for this task correctness integer not null, /* correctnes indicator 0-100 (100 =correct) whenanswered timestamp, /* time the answer was registered answer varchar(2000), /* the given answer feedbacklanguage varchar(3), /* language used for feedback feedbackcode varchar(20), /* identifier of the feedback feedbackextra varchar(1000), /* feedback specific information primary key (sid,courseid,moduleid, seqno, trynumber), foreign key (sid) references student, foreign key (courseid, moduleid, seqno) references taskinmodule

* Students status and history create table studentmodel ( sid varchar(20) not null, /* Student identifier courseid varchar(20) not null, /* course identifier moduleid varchar(20) not null, /* module identifier seqno integer not null, /* task sequence number within the module lasttrynumber integer not null, /* the biggest try number for this task currentresult integer not null, /* the highest correctness value for this task wascreditedintime char, /* did the correctness value exceed the cutoff value before deadline (Y/N) primary key (sid,courseid,moduleid,seqno), foreign key (sid) references student, foreign key (courseid, moduleid, seqno) references taskinmodule