TRAKLA [1.] on Tietorakenteet ja algoritmit -kurssille opetuksen tueksi suunniteltu ohjelmisto. Ohjelmisto jakaa kurssille ilmoittautuneille opiskelijoille sähköpostin välityksellä henkilökohtaisia kotitehtäviä, sekä kykenee tarkastamaan opiskelijoiden lähettämiä vastauksia automaattisesti. TraklaEditor tarjoaa opiskelijalle mahdollisuuden ratkaista kotitehtävät graafisessa muodossa näyttöpäätteellä. Editorin tarkoituksena on luoda miellyttävämpi rajapinta TRAKLA-serverin tarjoaman tekstipohjaisen käyttöliittymän ja käyttäjän välillä. Lisäksi on tarkoitus eliminoida käyttäjän tekemät virheet kommunikoitaessa TRAKLA-serverin komentokielellä sekä piilottaa tehtäväkohtainen sisäinen esityskieli.
Alkuperäinen Juha Hyvösen suunnittelema ja toteuttama TraklaEdit toteutettiin Machintosh-ympäristössä. Laiteriippuva ympäristö kuitenkin johti siihen, että TraklaEdit in käyttö jäi vähäiseksi. Jotta ohjelmaa voitiin käyttää usean sadan opiskelijan kurssilla, laiteriippuvuudesta tuli päästä eroon. Tämä johtikin siihen luonnolliseen ajatukseen, että TraklaEditor in uusi painos tuli saada toimimaan WWW-ympäristössä. Tähän tarjosi työkalut JavaSoftin kehittämä Java-kieli [2.], jolla on mahdollista ohjelmoida pieniä Java-ohjelmasia (applet) WWW-ympäristöön.
Koska kyseessä on graafinen editori, tarvitaan käyttöä varten graafinen näyttöpääte. Lisäksi tarvitaan WWW-selain, joka osaa suorittaa Java-koodia (tulkki). Tällaisia ohjelmia ovat esimerkiksi Netscape ja Internet Explorer . Lisäksi WWW-selaimen asetuksista (Options/Security Preferences) tulee Java-ohjelmien suoritus sallia (enabled). Suositeltavin käyttöympäristö on Unix ja Netscape. Unix-ympäristö on myös TraklaEditorin käännös ja kehitysympäristönä, joten ohjelmaa on myös testattu eniten tässä ympäristössä.
TraklaEditorin sisältävien sivujen suunnitteluun ja testaukseen suositellaan samaa ympäristöä kuin opiskelijoille on tarkoitus antaa oletusympäristöksi!
Käyttöympäristönä Unix ja Netscape
Unix-käyttöjärjestelmälle Java-tuki löytyy Netscapen versiosta 2.00 lähtien. Kyseistä versiota ei kuitenkaan kannata käyttää siinä ilmenneiden turvallisuusriskien takia operoitaessa Javan kanssa. Ilmenneet ongelmat on korjattu versiossa 2.02. Käytettäväksi suositellaankin versiota 2.02 tai uudempaa - ei kuitenkaan beta-versioita.
Käyttöympäristönä Mac ja Netscape
Mac-ympäristössä Java-tuki löytyy versiosta 3.0 lähtien. Ongelmia saattaa esiintyä varsinkin beta-versioiden kanssa vanhemmilla Maceilla. Virallista versiota odotellessa kannattanee käyttää Unix-yhteyttä (esim. MacX:n kanssa) ja Unixin Netscapea. Vaihtoehtoisesti voi yrittää operoida Netscape Golden versiolla.
Käyttöympäristönä MS-Windows ja Netscape tai Internet Explorer
Järjestelmä toimii varsin luotettavasti kaikilla MS-Windows selaimilla, joiden versionumero on 3 tai uudempi.
Appletviewer
Java-appletteja voidaan ajaa myös erillisellä appletviewer -ohjelmalla, joka seuraa mukana Javan kehitystyökaluissa. Kyseistä ohjelmaa voi käyttää esimerkiksi vikatilanteiden selvittelyssä ja debuggauksessa. Kyseistä ohjelmaa ei kuitenkaan suositella opiskelijoiden käyttöön, koska ohjelmalla ei voi selailla WWW-sivuja. Tällöin tehtäväkohtainen sanallinen informaatio jää pois, joka on tarkoitus julkaista erillään varsinaisesta appletista.
Tässä dokumentissa on tarkoitus keskittyä lähinnä TraklaEditorin tuntemien parametrien esittelyyn ja editorin luontiin HTML-kuvauksen avulla. Perusteet itse HTM-kielestä (HTML) oletetaan tunnetuiksi. Lisätietoja itse HTM-kielestä löytyy erittäin paljon erilaisista oppaista ja internetistä.
Tehtäväsivujen automaattinen generointi
Varsinainen TRAKLA-ohjelmisto osaa generoida ja räätälöidä opiskelijoille sähköpostitse lähetettävät tehtävät automaattisesti. Tätä varten ohjelmalle tulee määritellä aihe-sivu jokaiselle tehtävälle erikseen. Aihesivu sisältää erilaisia makroja, joilla sivusta voidaan luoda opiskelijakohtaiset tehtävät.
Vastaavanlainen aihesivu tulee luoda myös TraklaEditoria varten. Sivu sisältää HTML-kuvauksena annetun tehtävän. Kuvauksessa on mahdollista käyttää samoja makroja kuin varsinaisessa sähköpostiviestissä. Lisätietoja TRAKLAn tehtäväkohtaisista räätälöintiohjelmista löytyy TRAKLAn dokumenteista.
Tehtäväsivun luonti
Uuden tehtäväsivun luominen tapahtuu lisäämällä TRAKLA-järjestelmän tehtävärunkoihin uusi HTML-pohja. Pohjat on nimetty vastaavalla tavalla kuin varsinaiset sähköpostilla välitettävät tehtävänannotkin. Jokaista TRAKLAn aihe.xx -tiedostoa tulee olla vastaava htmlL.xx -tiedosto. Merkki L kertoo tässä minkä kielisestä tehtäväsivusta on kysymys. Esimerkiksi suomenkieliset tehtävät ovat htmls.xx -tiedostoissa. Merkintä xx kertoo tehtävän fyysisen numeron. Jokainen uusi tehtävä saa uuden juoksevan fyysisen numeron. Tehtävän looginen numero (millä numerolla tehtävä näkyy opiskelijalle) määräytyy TRAKLAn jokaiselle kurssille erikseen määritettävästä kurssi-tiedostosta.
Koko tehtävä rakennetaan kahdesta eri HTML-pohjasta. Näistä otsikkopohjaa ei tarvitse tehdä uudelleen, koska sellainen on jo jokaiselle tehtäväkierrokselle erikseen. Otsikkopohjien avulla tehtäviin saadaan opiskelijan nimi, opintokirja yms. tiedot. Varsinainen tehtävä kirjoitetaan numeroituun tehtäväpohjaan. Tehtäväpohja koostuu tehtävän tekstiosuudesta ja tehtävän ratkaisemiseen tarkoitetusta appletista. Applet voi sijaita missä kohtaa tahansa tehtävän tekstiä. Tyypillisesti tehtäväpohja jakautuu kolmeen osaan: Tehtävän anto, applet ja esimerkki. Tekstisouudessa (tehtävän anto ja esimerkki) voi olla linkkejä muihin WWW-sivuihin (esim. tehtävää koskevaan teoriaan, tehtävän algoritmiesitykseen, kolmansien osapuolien algoritmianimaatioihin jne.). Tekstiosuus kirjoitetaan kuten mikä tahansa tekstidokumentti HTML-muodossa. Applet puolestaan kirjoitetaan määrämuotoisesti käyttäen ohjelman tukemia parametrejä appletin alustukseen.
<HTML>
<HEAD>
<TITLE> Graph </TITLE>
</HEAD>
<BODY>
<H1> Excercise 1.3 </H1>
<P>
Move the letters from the input stream to a queue and output stream. The queue is
implemented as a circular array. Input stream items marked "*" mean "get".
</P>
<HR>
<APPLET CODE="TraklaEditor.class" WIDTH=400 HEIGHT=200>
<param name=objects value="Stream Input stream;VF*Z*DB**R**,Stream Queue; ,Stream Output stream; ,">
<param name=disable value="*">
<param name=output value="Queue">
</APPLET>
<HR>
</BODY>
</HTML>
Esimerkki 1: Yksinkertainen tehtäväpohja
Kuten aikaisemmasta esimerkistä voitiin nähdä, luodaan varsinainen TraklaEditori sille annettavien parametrien perusteella. Parametrit on sijoitettu <APPLET CODE="..."> ja </APPLET>-rivien väliin. Kaikki parametrit ovat nimi/arvo (name/value) pareja.
<param name=excercise value="1.3">
Esimerkki 2: TraklaEditorille välitettävien parametrien esittäminen
Lainausmerkkien käyttö ei ole pakollista, mutta suositeltavaa (vrt. HTML-dokumentin laatiminen). Seuraavassa on määritelty TraklaEditin dokumentoidut parametrit. Merkinnöillä tarkoitetaan seuraavaa:
x = { ... } tarkoittaa, että x on jokin sulkujen sisällä olevista alkioista.
x = String tarkoittaa yleistä merkkijonoa.
x = Char tarkoittaa yleistä merkkiä.
x = Char* tarkoittaa merkeistä koostuvaa taulukkoa (alkiot ovat siis yhden merkin
mittaisia)
x = Integer tarkoittaa lukuarvoa.
Yleinen merkkijono voi olla 16 bittinen unicode merkistön mukainen. HTML ei kuitenkaan ainakaan toistaiseksi tue unicode-merkistöä kokonaan, joten tällä hetkellä rajoitutaan ASCII-merkistöön.
Yleinen merkki on TraklaEditin hyväksymä merkki. Tällaisia ovat kaikki 7-bittiset ASCII merkit lukuunottamatta merkkejä ";+,-_ ". Huom. välilyönti kuuluu mukaan. Tyypillisesti välilyönti ei aiheuta virhettä, mutta sitä ei lasketa mukaan taulukon (Char*) alkioihin.
Oliot ja entiteetit
Tehtävän kuvauksessa tulee määritellä tehtävään tarvittavat oliot. Oliot voidaan nähdä neljänä erilaisena entiteettinä, joita ovat paneeli, lovi, polku ja alkio -entiteetit. Paneelit ovat korkean tason olioita, jotka koostuvat polku ja lovi -entiteeteistä. Alkiot ovat olioita, jotka voivat kullakin hetkellä (tila) sijaita jossakin lovessa. Alkiot ovat siis varsinaisia siirreltäviä olioita. Lisätietoja luokkahierarkiasta ja ylimmän tason kuvaus koko järjestelmästä löytyy TraklaEditiä käsittelevästä julkaisusta [3.].
Entiteetit eli oliot määritellään parametrilla objects . Yleisessä muodossa oliot määritellään seuraavasti:
<PANEELI> <NIMI>;
<ALKIOT>+
<width>+
<height>
jossa
<PANEELI> = {stream
, hashstream
, nodepanel
, nodepair
, tree
, stack
, graph
, textfield
, textarea
, button
}
<NIMI> = String
<ALKIOT> = Char* | MAKRO
<width> = Integer
<height> = Integer
Kuvaukset eri paneelityypeistä on taulukossa 1. Käytössä on myös joukko makroja, joilla voidaan toteuttaa sellaisia rakenteita , joita muutoin ei voitaisi toteuttaa tai jotka vaatisivat pitkiä merkkijonoketjuja.
%S(
n)
tuottaa n = Integer kappaletta tyhjiä alkoita.
%U(
n)
tuottaa n = Integer kappaletta alkioita järjestyksessä ABC...
%N(
n)
tuottaa n = Integer kappaletta alkioita numerojärjestyksessä (0123456789012...)
Kaikkia objects -parametrin kenttiä ei tarvitse antaa. Tyypillisesti paneeli määritellään antamalla paneelille <NIMI> sekä määritellään sen alussa sisältämät <ALKIOT>.
Kentällä <width> voidaan vaikuttaa paneelin ulkoasuun. Kenttä ei vaikuta kaikkiin paneeleihin ja sen toiminta saattaa poiketa eri paneeleiden kesken. Stream- ja Node-tyyppisissä paneeleissa kentällä voidaan määritellä lovien väliin jäävä tila (prosentteina suhteessa loven leveyteen).
Kenttä <height> on myös paneelikohtainen määre, kuten <width>. Kenttä on määritelty tällä hetkellä Stack-paneelille ja sillä voidaan vaikuttaa graafisen pino-olion korkeuteen (kuinka monta alkiota pinoon grafiikassa mahtuu).
Kentällä <width> voidaan lisäksi määritellä tekstialueen ja tekstikentän leveys. Lisäksi kentällä <height> voidaan määritellä tekstialueen korkeus.
Tehtävien lähetys (export)
Jotta tehtävien automaattinen lähetys TRAKLA-ohjelmistolla olisi mahdollista, tarvitaan vähintään kaksi parametriä: posturl ja output . Näistä ensinmainittu määrittelee WWW-palvelimen ja tarvittavan CGI-ohjelman nimen. Jälkimmäisellä määritellään mitkä oliot (paneelin lovissa olevat alkiot) vastaukseen sisällytetään. Vastausformaattia voidaan lisäksi muuttaa oletusarvoisesta formaatista parametrillä order . Lisäksi tarvitaan tehtävän tarkastusta varten tiedot tehtävästä ja vastauksen lähettävästä opiskelijasta (ks. "Käyttäjä- ja tehtäväkohtaiset tiedot" sivulla 8).
Parametri posturl saa arvonaan http-osoitteen CGI-ohjelmaan. Esimerkiksi "http://130.233.40.178/CGI-bin/trakla/form-mail". WWW-palvelimen osoite on annettu IP-numerolla, koska Javan turvallisuusmanageri sitä vaatii (nimipalvelimeen ei voi luottaa ja Javan turvallisuusmääräyksissä on määritelty, että applet saa ottaa yhteyden ainoastaan siihen koneeseen, josta se on ladattu).
Parametrillä output määritellään kuinka vastaus muodostetaan. Yleisessä tapauksessa parametri saa arvokseen:
param name=objects
value=<OUTPUT>,
<OUTPUT>,
...,
<OUTPUT>
jossa
<OUTPUT> = <PANEELIN>\
<PANEELI>|end;
<EROTIN>+
<ETULIITE>
jossa
<EROTIN> = String
<ETULIITE> = String
Kaikkia output -parametrin kenttiä ei tarvitse antaa. Oletustoiminto on, että annetun <PANEELIN> kaikki tilat tulostetaan vastaukseen. Tila koostuu paneelin sisältämistä alkioista. Tulostusmuoto on paneelikohtainen ja sitä voidaan muuttaa order -parametrillä . Tyhjät alkiot paneelissa korvataan annetulla kentällä <EROTIN>. Jos erotinta ei määritellä, tyhjää alkiota ei tulosteta vastaukseen lainkaan. Kenttä <EROTIN> määrittelee vastauksen eteen tulevan tekstin (esim. a), b), ...).
Mikäli paneelin kaikkia tiloja ei haluta vastaukseen, tulee käyttää "\ "-kenttää. Tällöin vastaukseen sisällytetään ne <PANEELIN> tilat, jotka ovat vastauksessa ennen kuin annettuun <PANEELI>-olioon vaikutetaan. Kenttään voidaan antaa siis mikä tahansa määritelty paneeli tai end , jolloin vastaukseen sisällytetään ainoastaan <PANEELIN> lopputila.
<param name = posturl value = "http://130.233.40.178/CGI-bin/trakla/form-mail">
<param name = objects value = "nodepanel alkiot;plnadgvsyzxcuz+10,nodepanel paikka;%S(1),tree puu;%S(63)">
<param name = output value = "puu\paikka;-+a),puu\end;-+b)">
Esimerkki 3: Ouput-parametrin käyttö vastausformaatin määrittelyssä.
Esimerkissä 3 on määritelty 2 nodepanel -tyyppistä oliota (alkiot ja paikka) sekä tree -olio (puu). Alussa alkiot -paneeli sisältää 14 alkiota (p,l,n,...) ja vastaavan määrän lovia. Lovien väliin jätetään väli, jonka pituus on 10% loven leveydestä (+10). Paikka -paneeli alustetaan yhdellä tyhjällä paikalla käyttäen makroa %S(1) . Puurakenne on aluksi tyhjä, sisältäen 63 tyhjää lovea (solmua). Tehtävän vastaus lähetetään TRAKLA-ohjelmistolla käyttäen form-mail -nimistä CGI-scriptiä. Tehtävänanto voisi olla vaikka seuraavanlainen:
Lisää tyhjään binääriseen hakupuuhun järjestyksessä annetut alkiot
. Poista tämän jälkeen puun juurialkio vetämällä se tyhjään paikkaan
ja palauta puu binääripuuksi.
Tehtävä on siis kaksiosainen, jolloin TRAKLA-ohjelmisto odottaa tehtävään a- ja b-kohtia. Tehtävän ratkaisijan ei tarvitse kuitenkaan välittää tästä yksityiskohdasta, koska se voidaan peittää sopivalla tehtävän annon sanamuodolla. Käyttäjän esittämä vastaus generoidaan nyt output -parametrin esittämällä tavalla. A-kohdassa vastauksen alkuun lisättäisiin merkkijono "a)" ja vastaukseen tulostettaisiin puun se tila, joka oli vastauksessa ennen kuin paneeliin paikka siirrettiin alkio. Vastaavalla tavalla b-kohdan vastaukseen lisätään alkuun "b)" ja vastaus on puun viimeinen tila (lopputila). Puun tila (vastaus) esitetään vastauksessa oletusarvoisesti seuraajaluettelona. Tällöin vastaus voisi näyttää seuraavalta.
a)
p: l w
l: a n
a: - d
d: c g
w: s y
s: - u
y: x z
z: - z
b)
s: l w
l: a n
a: - d
d: c g
w: u y
y: x z
z: - z
Esimerkki 4: Puun oletusarvoinen tulostusmuoto vastauksessa on seuraajaluettelo.
Vastauksen tulostusjärjestyksen muuttaminen
Tulostusjärjestyksen muuttaminen on mahdollista joillekin paneelityypeille. Järjestystä voidaan muuttaa parametrillä order , joka saa argumenttinsa seuraavasti:
param name=order
value=<ARG>,
<ARG>,
...,
<ARG>
jossa
<ARG>=<PANEELI>;
<ARVO>
jossa
<ARVO>={append
, level
} taulukon 2 mukaisesti.
Käyttäjä- ja tehtäväkohtaiset tiedot
Tyypillisesti käyttäjä- ja tehtäväkohtaiset tiedot lisätään HTML-sivulle CGI-scriptillä. Niitä ei siis kirjoiteta tehtäväpohjiin. Jotta tehtävän automaattinen tarkastaminen olisi mahdollista, tarvitaan opiskelijasta kuitenkin opiskelijanumero ja tehtävästä kurssi, kierros ja tehtävänumero. Nämä tiedot välitetään appletille seuraavilla parametrillä.
param=userid
value=<OPINTOKIRJAN NUMERO + TARKISTE>
param=courseid
value=<KURSSITUNNUS>
param=exercise
value=<#KIERROS>.
<#TEHTÄVÄNUMERO>
Lisäksi myöhempää käyttöä varten on varattu parametrit:
param=email
value=<SÄHKÖPOSTIOSOITE>
param=realname
value=<NIMI>
Kaikki edellämainituista paramereistä saavat String-tyyppisiä agrumentteja paitsi parametri exercise , jonka argumentti on muotoa Integer. Integer.
Dynaamiset rakenteet
Kaikki paneelit ovat tyypillisesti luonteeltaa staattisia. Ts. rakenteen koko ei muutu sen manipuloinnin seurauksena. Esimerkiksi puurakenteen koko tulee määritellä appletin parametreissä, eikä puuhun voi tällöin lisätä alkioita enempää kuin parametreissä on määritelty. Dynaamisia, manipuloinnin seurauksena kooltaan muuttuvia, rakenteita on tarkoitus kuitenkin jatkossa toteuttaa. Tällä hetkellä kuitenkin käytössä on vain yksi rakenne: lista.
Minkä tahansa paneelin voi määritellä listarakenteeksi parametrillä
param=listarray
value=<PANEELI>
Tällöin paneelin lovi toimii siten, että siihen pudotettu alkio lisätään lovelle generoituun listarakenteeseen, eikä itse loveen. Parametrin toiminta on tarkoitettu Nodepanel ja Streampanel-tyyppisille (tai niihin verrattaville) paneeleille. Parametrin toimintaa muissa paneeleissa (kuten esim. tree-paneeli) ei ole määritelty. Huom! esimerkiksi pino (stack ) on myös dynaaminen rakenne, joka käyttää hyväkseen listaa. Rakenteen luonti ja manipulointi hoidetaan kuitenkin ohjelmassa sisäisesti.
Paneeleiden ulkoasuparametrit
Paneeleiden ulkoasua voidaan hienosäätää muutaman erillisen parametrin avulla. Seuraavassa on esitelty nämä parametrit ja niiden kuvaukset.
param name=show
value=<PANEELI>
Parametrillä voidaan lisätä paneelin lovien numerot näkyviin. Lovet on nimetty (numeroitu) juoksevalla numerolla, joka saadaa tällä parametrillä näkyviin loven yläpuolelle.
param=shadowed
value=<PANEELI>
Parametrillä saadaan loveen näkyviin sen alustuksessa saaman alkion nimi. Lisäksi loveen ei voi siirtää mitään muuta alkiota kuin se, joka siinä on alunperin ollut. Alkio voidaan kuitenkin siirtää lovesta pois johonkin muuhun loveen (eli paneeliin, joka ei ole määritelty parametrillä shadowed ), jolloin loveen jää himmennettynä siinä olleen alkion nimi.
Pitkät alkionnimet
Paneeleiden alustuksessa sen saamat alkiot voidaan nimetä ainoastaan yhden merkin mittaisilla nimillä. Tämä johtuu pitkälti TRAKLA-järjestelmän makrokielen epäjohdonmukaisuuksista (eri tehtävien kesken). Alkioden nimiä voidaan kuitenkin uudelleennimetä erillisellä parametrillä rename . Nimen pituus tulisi kuitenkin olla <= 3 merkkiä, koska muutoin se ei mahdu sille varattuun tilaan grafiikassa.
param name=rename
value="<A1><A2>...<An>/
<E><B1><E><B2>...<E><Bn>"
jossa alkion <Ak> nimi korvataan <Bk>:lla, k = 1...n ja
<Ak> = Char
<Bk> = String
<E> = Char
Alkioiden liikuttelun estäminen
Eräissä tapauksissa on tarpeen, että alkion liikuttaminen voidaan estää. Tähän tarkoitukseen on parametri disable , joka saa arvonaan listan alkioiden nimiä, jotka halutaan estää:
param name=disable
value="<A1>,
<A2>,
...,
<An>"
jossa <Ak> = String, k = 1..n.
Vastauksen merkistön muunnos
Parametrinvälitys CGI-ohjelmien kanssa vaatii erottimia, kun välitetään parametri/arvo -pareja. Näitä erottimia ei saa olla varsinaisessa lähetettävässä vastauksessa mukana. Tällöin tarvitaan merkistön muunnosta, jolla erikoismerkit saadaan siirtymään oikein. Vastaava muunnos takaisin alkuperäiseksi merkiksi tehdään CGI-ohjelmassa. Muunnosta varten TraklaEditissä on parametri encode .
param name=encode
value="<A1>/
<S1>,
<A2>/
<S2>,
...,
<An>/
<Sn>"
jossa <Ak> = Char korvataan merkkijonolla <Sk> = String, k = 1..n
Olioiden suhteelliset koot ja kirjasinkoko
Olioiden kokoa voidaan muuttaa oletuskoosta parametrillä itemsize . Kaikki oliot piirtävät itsensä grafiikalla suhteessa tähän parametriin. Oletusarvoisesti itemsize = 20. Tehtäväappletissa parametriä voi muuttaa myös ajon aikana. Tämä tapahtuu erillisellä Size -valikolla, jolla kirjasinkokoa voidaan vaihtaa. Teknisistä syistä kirjasinkoko on puolet parametrin itemsize arvosta.
param name=itemsize
value=n
jossa n=Integer