I. I11 TURO VALAVAARA JAVASCRIPT-SOVELLUSKEHYKSET SÄÄASEMAN KÄYTTÖLIITTYMÄKEHITYKSESSÄ Kandidaatintyö Tarkastaja: Tutkija, DI Jari Seppälä 13. kesäkuuta 2010 II TIIVISTELMÄ TAMPEREEN TEKNILLINEN YLIOPISTO Automaatiotekniikan koulutusohjelma VALAVAARA, TURO: JavaScript-sovelluskehykset sääaseman käyttöliittymäkehityksessä Kandidaatintyö, 33 sivua, 11 liitesivua Kesäkuu 2010 Pääaine: Automaation tietotekniikka Tarkastaja: Tutkija, DI Jari Seppälä Avainsanat: AJAX, XML, XMLHttpRequest, JavaScript, selainkäyttöliittymä, web-sovelluspalvelu, jQuery, Dojo, Ample SDK Työn tavoitteena on selvittää JavaScript-sovelluskehysten soveltuvuus sääaseman selainkäyttöliittymän toteutukseen sekä toteuttaa sääasemalle uusi käyttöliittymä. Vaatimuksina toteutettavalle käyttöliittymälle ovat asynkronisen tiedonsiirron hyödyntäminen sekä tyylikäs ulkoasu. Käyttöliittymän avulla on mahdollista tarkastella sääaseman lämpötilamittauksia viimeisimpien kahdeksan tunnin ajalta havainnollisessa muodossa. Kymmenien JavaScript-sovelluskehysten joukosta vertailtaviksi valittiin kolme ominaisuuksiltaan lupaavinta sovelluskehystä: Ample SDK, Dojo ja jQuery. Sovelluskehyksiä tarkasteltaessa keskityttiin erityisesti niiden tarjoamiin kuvaaja- ja käyttöliittymäkomponentteihin sekä tiedonsiirtoa ja käsittelyä helpottaviin ominaisuuksiin. Sovelluskehysten analysoinnin tuloksena todettiin Dojon ja jQueryn soveltuvan sääaseman käyttöliittymän sovelluskehitykseen ja vastaaviin ohjelmistoprojekteihin. Käyttöliittymän toteutuksessa käytettäväksi sovelluskehykseksi valittiin jQuery. Toteutettu käyttöliittymä tarjoaa mahdollisuuden sääaseman mittaustietojen tarkasteluun kuvaaja- ja taulukkomuodossa. Mittaustietojen päivittäminen ei vaadi käyttäjältä sivun uudelleenlataamista eikä myöskään häiritse sovelluksen käyttöä. jQueryn tarjoamien käyttöliittymäkomponenttien avulla käyttöliittymästä saatiin helppokäyttöinen ja tyylikäs. Myös sovelluskehysten soveltuvuuden selvitys onnistui hyvin, eli työlle asetetut tavoitteet saavutettiin. Kattavampaa testausta eri selaimilla kannattaisi vielä tehdä ennen käyttöliittymän käyttöönottoa. III ALKUSANAT Tämä tekniikan kandidaatintyö on tehty Tampereen teknillisen yliopiston systeemitekniikan laitokselle keväällä 2010. Kandidaatintyö tarjosi mahdollisuuden tutustua kiinnostavaan aihealueeseen, jonka tuntemisesta on varmasti hyötyä tulevaisuudessa. Haluan kiittää työn ohjaajaa Jari Seppälää rakentavasta palautteesta sekä avusta aiheen valinnassa ja rajaamisessa. Kiitos myös Aki Kössilälle lähes valmiin työn lukemisesta ja kommentoinnista. Tampereella 13. kesäkuuta 2010 Turo Valavaara IV SISÄLLYS 1. 2. Johdanto .................................................................................................................... 1 Käytetävät tekniikat .................................................................................................. 2 2.1. XML .................................................................................................................. 2 2.2. JavaScript & Dokumenttioliomalli ................................................................... 3 2.3. XMLHttpRequest .............................................................................................. 5 2.4. Web-sovelluspalvelu & SOAP.......................................................................... 7 2.5. Sovelluskohde ................................................................................................... 8 3. Sovelluskehykset ....................................................................................................... 9 3.1. Ample SDK ....................................................................................................... 9 3.1.1. Työkalut kaavioiden luomiseen ......................................................... 10 3.1.2. Kuvauskielet ...................................................................................... 11 3.1.3. Tiedonsiirto ja -käsittely .................................................................... 12 3.1.4. Käyttöliittymäkomponentit ................................................................ 12 3.1.5. Soveltuvuus........................................................................................ 12 3.2. Dojo ................................................................................................................. 13 3.2.1. Työkalut kaavioiden luomiseen ......................................................... 14 3.2.2. Tiedonsiirto ja -käsittely .................................................................... 16 3.2.3. Käyttöliittymäkomponentit ................................................................ 16 3.2.4. Muut ominaisuudet ............................................................................ 17 3.2.5. Soveltuvuus........................................................................................ 17 3.3. jQuery.............................................................................................................. 18 3.3.1. Työkalut kaavioiden luomiseen ......................................................... 18 3.3.2. Tiedonsiirto ja -käsittely .................................................................... 21 3.3.3. Käyttöliittymäkomponentit ................................................................ 22 3.3.4. Muut ominaisuudet ............................................................................ 23 3.3.5. Soveltuvuus........................................................................................ 23 3.4. Käytettävän kirjaston valinta........................................................................... 23 4. Käyttöliittymän toteutus .......................................................................................... 25 4.1. Rajoitukset ...................................................................................................... 25 4.2. Käyttöliittymän rakenne ja navigointi ............................................................ 25 4.3. Tiedonsiirto ..................................................................................................... 26 4.4. Kuvaaja ........................................................................................................... 27 4.5. Taulukko ......................................................................................................... 27 4.6. Jatkokehitysideoita .......................................................................................... 28 5. Yhteenveto .............................................................................................................. 29 Lähteet ............................................................................................................................. 31 Liite A: käyttöliittymäkuvat ............................................................................................ 34 Liite B: Käyttöliittymän HTML-merkintä ...................................................................... 37 Liite C: Käyttöliittymän JavaScript-koodi (saascript.js)................................................. 39 V LYHENTEET JA TERMIT AJAX Joukko tekniikoita, joiden avulla web-sovelluksista saadaan tehtyä dynaamisia. (engl. Asynchronous JavaScript and XML). CSS W3C:n kehittämä ja ylläpitämä tyylikieli rakenteisten dokumenttien esitystavan muotoiluun. (engl. Cascading Style Sheets). Dojo Suosittu JavaScript-sovelluskehys. DOM Dokumenttioliomalli on ohjelmointirajapinta, joka mahdollistaa HTML- ja XML-dokumenttien muokkaamisen. (engl. Document Object Model). GPL-lisenssi Vapaa ohjelmistolisenssi, jolla lisensoituja tuotoksia saa vapaasti muokata ja käyttää sillä edellytyksellä, että muunnellun tuotteen jakelu tapahtuu myös GPL-lisenssin alla. GPRS Matkapuhelimen tai GPRS-sovittimen avulla käytettävä GSM-verkossa toimiva pakettikytkentäinen tiedonsiirtopalvelu. (engl. General Packet Radio Service). HTTP Alun perin web-sivujen siirtämiseen suunniteltu tilaton tietoliikenneprotokolla. (engl. HyperText Transfer Protocol). JavaScript Ohjelmointikieli, joka kehitettiin vuorovaikutuksen lisäämiseksi web-sivuille. JSON Yksinkertainen tiedonsiirtomuoto, joka muistuttaa JavaScript-ohjelmointikielen olioiden merkintätapaa. (engl. JavaScript Object Notation). jQuery Suosittu JavaScript-sovelluskehys. MIT-lisenssi Vapaa ohjelmistolisenssi, jolla lisensoituja tuotoksia saa vapaasti muokata ja käyttää myös suljetun lähdekoodin ohjelmistoissa, kunhan lisenssin teksti säilyy lähdekoodissa. VI Ohjelmointirajapinta Käyttöliittymä, jonka avulla eri ohjelmat voivat vaihtaa tietoa eli keskustella keskenään. SGML Standardoitu metakieli dokumenttien merkintäkielten määrittelyyn. (engl. Standard Generalized Markup Language). SMIL Multimediaesityksiä varten kehitetty XML-pohjainen kuvauskieli. (engl. Synchronized Multimedia Integration Language). SOAP XML-kieleen pohjautuva tietoliikenneprotokolla, jonka pääasiallisena tehtävänä on mahdollistaa proseduurien etäkutsut. (engl. Simple Object Access Protocol). Sovelluskehys Ohjelmistotuote, joka muodostaa rungon sen päälle rakennettavalle ohjelmalle. (engl. Software Framework). SVG XML:ään pohjautuva kaksiulotteisten vektorikuvien kuvauskieli. (engl. Scalable Vector Graphics). W3C Kansainvälinen yhteisö, jonka tavoitteena on kehittää suosituksia ja protokollia Web:in kehityksen varmistamiseksi. (engl. World Wide Web Consortium). Web-sovelluspalvelu Ohjelmointirajapinta joka tarjoaa palveluja muille sovelluksille tietoverkon, esimerkiksi Internetin, yli (engl. Web Service). WSDL XML-kieleen pohjautuva kieli web-sovelluspalvelujen kuvaamiseen. (engl. Web Services Description Language). XHTML WWW-sivujen kuvaamiseen luodusta HTMLkuvauskielestä kehitetty XML:ään pohjautuva kuvauskieli, jossa on tiukemmat tyylisäännöt kuin HTML:ssä. (engl. eXtensible HyperText Markup Language). XML Kuvauskieli jota käytetään dokumenttien kuvaamiseen ja formaattina tiedonvälityksessä. Pohjautuu SGML:ään. (engl. eXtensible Markup Language). XUL Käyttöliittymien toteuttamiseen suunniteltu XML-pohjainen kuvauskieli. (engl. XML User Interface Language). 1 1. JOHDANTO Selainkäyttöliittymät ovat muodostuneet varteenotettavaksi vaihtoehdoksi perinteisille graafisina työpöytäsovelluksina toteutetuille käyttöliittymille. Näiden sovellusten ongelmina ovat alustariippuvaisuus ja hankala päivitettävyys. Sovelluksista on tehtävä oma toteutus kaikille eri alustoille, joilla niiden halutaan toimivan. Tästä seuraa, että sovellus on käytettävissä vain rajatuissa käyttöympäristöissä tai vaihtoehtoisesti sovelluksen hinta on korkea. Lisäksi sovellusten päivittämisestä aiheutuu huomattavaa vaivaa, sillä päivitykset on usein asennettava manuaalisesti. Kaikki sovellukset tulisi kuitenkin pitää ajan tasalla, sillä eri käyttöliittymäversioiden samanaikainen käyttö saattaa aiheuttaa ongelmia. Päätelaitteiden lisääntynyt suorituskyky yhdessä tietoliikenneyhteyksien nopeuden huiman kasvun kanssa luovat edellytykset selainkäyttöliittymien toteuttamiselle ja käytölle. Selaimet tukevat yleisesti keskenään samoja tekniikoita kuten JavaScriptiä. Käyttöliittymää toteuttaessa tarvitsee siis ottaa huomioon ainoastaan käyttöliittymän toimivuus eri selaimilla sekä mahdolliset päätelaitteen fyysisen rakenteen aiheuttamat rajoitteet. Tämä on huomattavasti helpompaa kuin käyttöliittymän kehittäminen monelle eri käyttöjärjestelmälle. Päivitykseen liittyvistä ongelmista päästään eroon, sillä käyttöliittymä ladataan uudestaan joka käyttökerralla ja siihen tehdyt muutokset ovat heti voimassa. Tampereen teknillisen yliopiston (TTY) systeemitekniikan laitoksen sääaseman nykyinen käyttöliittymä on toteutettu perinteisillä staattisilla web-tekniikoilla. Tavoitteena on kehittää dynaaminen ja tyylikäs selainkäyttöliittymä sääasemalle käyttäen apuna JavaScript-sovelluskehystä. Alussa perehdytään yleisimpiin web-sovelluksissa käytettyihin tekniikoihin alan kirjallisuuden ja verkkomateriaalin avulla. Toteutusta varten analysoidaan kolmea JavaScript-sovelluskehystä ja niiden soveltuvuutta sääaseman selainkäyttöliittymän kehitykseen sekä vastaaviin projekteihin. Sovelluskehyksiin tutustuminen ja niiden arviointi tapahtuu pääasiassa sovelluskehysten web-sivujen sekä käytännön testauksen avulla. Parhaiten sääaseman käyttöliittymäkehitykseen soveltuvaa sovelluskehystä hyödyntäen toteutetaan käyttöliittymä sääasemalle PC-päätelaitteita varten. 2 2. KÄYTETÄVÄT TEKNIIKAT Tavoitteena on tehdä käyttöliittymästä mahdollisimman dynaaminen siten, että käyttäjän tarvitsee odottaa käyttöliittymän latautumista käytön aikana mahdollisimman vähän ja suurimman osan tiedonsiirrosta tulee tapahtua käyttäjän huomaamatta. Käyttöliittymän ensimmäisen lataamisen jälkeen käyttäjän on mahdollista käyttää sovellusta jatkuvasti myös uuden tiedon hakemisen aikana. Näiden tavoitteiden saavuttamiseksi käytetään useita tekniikoita, joihin perehdytään seuraavaksi tarkemmin. Asiakasohjelmien ja palvelimien välinen tiedonsiirto Internetissä tapahtuu suurilta osin http-protokollan (engl. HyperText Transfer Protocol) avulla. Tämä protokolla kehitettiin alun perin WWW-sivujen siirtämistä varten, mutta sitä voi käyttää kaikentyyppisen tiedon siirtoon asiakassovelluksen ja palvelimen välillä. [1, s.762.] Http on tilaton protokolla. Tämä tarkoittaa käytännössä sitä, että palvelimelle tehtyyn httppyyntöön eivät vaikuta mitenkään aiemmat pyynnöt. Palvelin tietää ainoastaan viimeisimmästä sille lähetetystä pyynnöstä ja palauttaa tietoa vain sen perusteella [1, s.762.] Lisäksi tiedonsiirto on synkronista, eli asiakasohjelma, esimerkiksi selain, jää odottamaan vastausta palvelimelta ja tällöin myös käyttäjä joutuu odottamaan. Tällainen tiedonsiirtomalli sopii hyvin yksinkertaisille linkitetyille tekstidokumenteille, mutta toimii huonosti monimutkaisemmilla sivuilla ja sovelluksilla. AJAX-tekniikat (engl. Asynchronous JavaScript and XML) tarjoavat ratkaisun tiedonsiirron synkronisuuden aiheuttamiin ongelmiin. Termi tarkoittaa tiedonsiirron toteuttamista asynkronisesti käyttäen hyväksi JavaScriptiä sekä XML:ää [2, s.296] tai muuta kuvauskieltä, kuten JSON:ia (engl. JavaScript Object Notation). W3C (engl. World Wide Web Consortium) on kansainvälinen yhteisö jonka tavoitteena on taata Internetin kehitys ja luoda siihen liittyviä suosituksia ja protokollia. Sen ylläpitämiä suosituksia ovat esimerkiksi HTML (engl. HyperText Markup Language), XML (engl. eXtensible Markup Language) ja CSS (engl. Cascading Style Sheets). Useat W3C:n suosituksista ovat de facto -standardeja. [3.] Seuraavaksi käydään lyhyesti läpi XML ja JavaScript sekä XMLHttpRequest-olio, joka toimii AJAX:in perustana. Lisäksi käsitellään lyhyesti Tampereen teknillisen yliopiston Systeemitekniikan laitoksen sääasemaan liittyvää sovelluspalvelua ja siihen liittyviä tekniikoita. 2.1. XML XML on yksinkertainen ja joustava SGML-standardiin (engl. Standard Generalized Markup Language) pohjautuva kieli rakenteisen tiedon kuvaamiseen. Se muistuttaa merkinnältään läheisesti HTML-kuvauskieltä, mutta XML kehitettiin erityisesti tiedon välitykseen ja varastointiin, kun HTML puolestaan suunniteltiin tiedon esittämistä var- 3 ten. [4.] XML on pohjimmiltaan tiettyjen sääntöjen mukaisesti muotoiltua tekstiä. Tämä tarkoittaa korkeaa sovellus- ja alustariippumattomuutta, sillä kaikki sovellukset jotka pystyvät käsittelemään tekstiä voivat käsitellä myös XML-muotoista tietoa. Täyden hyödyn saamiseksi ohjelman tulee kuitenkin ymmärtää XML-merkintää. [5.] XMLkielen avulla voidaan määritellä sovelluskohtaisten tietojen kuvaamiseen tarkoitettuja merkintäkieliä [2, s.4]. XML tarjoaa tavan kuvata varsinaisen tiedon lisäksi myös tiedon merkityksen ja rakenteen, jotka ovat niin kutsuttua metatietoa. Tämä mahdollistaa tiedon tehokkaan käsittelyn ohjelmallisesti. [2, s.7.] XML-kielessä ei ole ennalta määritettyjä avainsanoja, vaan dokumentin luoja määrittää ne itse. Dokumentin tulkinta riippuu täysin sovelluksesta jolla sitä käsitellään: eri sovellukset voivat käsitellä samaa XML-avainsanaa eri lailla. Rakenteellisesti XML-dokumentti koostuu vapaaehtoisesta esittelyosasta sekä esiintymäosasta, joka sisältää varsinaisen dokumentin esittämän tiedon. Esittelyosa kuvaa XML-dokumentin sekä mahdollisen tyyppijulistuksen. Kuva 2.1. Esimerkki kirjan kuvaavasta XML-dokumentista. Rakenteellisesti XML-dokumentti koostuu elementeistä. Elementti muodostuu alku- ja loppuavainsanoista. Avainsanan alku ja loppu puolestaan merkitään kulmasuluilla. Elementin alku- ja loppumerkinnän tulee sisältää täsmälleen sama avainsana ja loppuavainsana merkitään nimeä edeltävällä kauttaviivalla. Elementin sisältämä tieto sijoitetaan avainsanojen väliin. Näin ollen ”Hei maailma!”-merkkijonon sisältävän teksti-elementin merkintä on <teksti>Hei maailma!</teksti>. Elementti voi olla myös tyhjä, jolloin merkinnäksi riittää yksi avainsana. Tällöinkin elementin loppuminen on merkittävä kauttaviivalla. Tyhjän teksti-elementin merkintä on siis <teksti></teksti> tai <teksti />. Elementit voivat sisältää myös toisia elementtejä. Elementteihin on mahdollista liittää myös attribuutteja eli ominaisuuksia. Nämä ominaisuudet merkitään nimen jälkeen aloitusavainsanan merkinnän sisälle. [2, s.20–23.] Kuvassa 2.1 on esitetty yksinkertainen XML-dokumentti joka kuvaa yhden kirjan tiedot. Kuvan dokumentin esittelyosan elementti sisältää ominaisuudet version ja encoding. 2.2. JavaScript & Dokumenttioliomalli JavaScript on ohjelmointikieli joka tukee perinteistä lausepohjaista ohjelmointia sekä olio-ohjelmointia. Se suunniteltiin kevyeksi ja yleiskäyttöiseksi tulkattavaksi kieleksi, joka mahdollistaa dynaamisten web-sivujen luomisen. Kielen kehitti Netscape vuonna 4 1995 Navigator-selaintaan varten. Kielellä ei ole juurikaan tekemistä Javan kanssa, vaan se nimettiin JavaScriptiksi siinä toivossa, että Javan ympärillä ollut kohu edesauttaisi myös JavaScriptin menestymistä. Käytännössä JavaScript on vakiintunut käyttöön webselaimissa ja muut sovelluskohteet ovat harvassa. [2, s.90.] Kieltä on kuitenkin mahdollista käyttää nykyisin erilaisissa ympäristöissä ja tästä syystä sen standardoitu versio ECMAScript erotettiin isäntäympäristöstä, joka alun perin oli web-selain [2, s.94]. Kaikki suosituimmat selaimet kuten Mozilla Firefox, Internet Explorer ja Opera sisältävät tuen JavaScriptille. Koodia ei tarvitse erikseen kääntää, vaan tulkattaville kielille tyypilliseen tapaan isäntäsovellus, esimerkiksi selain, tulkkaa ja suorittaa koodia rivi kerrallaan [2, s.97]. Tämä tekee sovelluksista helposti muokattavia, sillä kaikki muutokset tulevat voimaan kun sivu ladataan uudestaan selaimeen. JavaScript-koodi voidaan upottaa web-sivuun omaksi elementikseen, tai vaihtoehtoisesti se voidaan ladata erillisestä tiedostosta sivun latautuessa. Jälkimmäinen tapa on suositeltava varsinkin koodimäärän kasvaessa ja se mahdollistaa saman koodin käytön useammalla eri sivulla [6, s.23, 26]. Kaikkien elementtien tulee kuitenkin sijaita sivun otsikko- tai runkoelementin sisällä. Kuva 2.2. Yksinkertainen HTML-dokumentti. Kuva 2.3. Dokumenttioliomallin mukainen puuesitys kuvassa 2.2. 5 JavaScriptin tarkoituksena oli alun perin luoda sivulle dynaamisuutta ja tästä syystä sillä oli pystyttävä muokkaamaan dokumenttia johon koodi on liitetty. Tähän tarkoitukseen kehitettiin dokumenttioliomalli (DOM, engl. Document Object Model), joka esittää HTML- tai XML-dokumentin puumaisena tietorakenteena. [2, s.168.] Dokumenttioliomalli on ohjelmointirajapinta, jonka kautta dokumentin sisältöön ja rakenteeseen pääsee käsiksi JavaScriptin tai jonkin muun ohjelmointikielen avulla. Dokumenttioliomallissa dokumentin elementit esitetään solmuina (engl. node). Kuvassa 2.3 on esitetty kuvan 2.2 yksinkertaisen HTML-dokumentin dokumenttioliomallin puurakenne. HTML-dokumentin runkoelementin (body) sisällä olevat elementit h2, p ja img ovat sen lapsisolmuja ja puumallissa ne esitetään haarautuviksi runkoelementistä. Elementtien sisällä oleva teksti puolestaan esitetään tekstisolmuna #text. Kaikilla solmuilla on äitisolmu ja lisäksi mahdollisesti sisaruksia. Kuvassa 2.3 meta ja title ovat sisarsolmuja, sillä head on niiden molempien äitisolmu. Dokumenttioliomalli mahdollistaa solmujen luomisen, muokkaamisen ja poiston. Tämä puolestaan mahdollistaa sen, että sivua voidaan ohjelmointikielen avulla muokata ja sen sisältöä päivittää lataamatta koko sivua uudestaan. [7, s.39.] Dokumenttioliomalli tarjoaa tapahtumankäsittelyrajapinnan, jonka avulla sivulle saadaan luotua vuorovaikutusta. Rajapinnan avulla voidaan elementteihin liittää erityyppisiä tapahtumia [2, s.178]. Tapahtumalle määritetään jokin toiminto, joka tavallisesti on funktiokutsu. Tyypillisiä esimerkkejä tapahtumista ovat muun muassa elementin ulkoasun muokkaaminen, kun hiiren osoitin siirretään elementin päälle ja tekstikentän automaattinen täydentäminen, joka hyödyntää AJAX:ia. Tätä ominaisuutta hyödynnetään muun muassa Googlen hakukoneessa. DOM 1 on W3C:n kehittämä ensimmäinen yhtenäinen malli dokumenttioliolle. Sitä edelsi niin kutsuttu DOM 0, jolla viitataan Internet Explorer 3.0:n ja Netscape Navigator 3.0:n mahdollisuuksiin muokata dokumentin elementtejä. DOM 0:aa ei ole muodollisesti määritelty ja toteutukset eri selaimissa eivät olleet yhtenäiset. Vaikka kaikki DOM 0:n ominaisuudet eivät sisälly täysin uudempiin DOM-määrittelyihin, niitä tuetaan edelleen selaimissa, jotta vanhat JavaScript-koodit eivät lakkaisi toimimasta. [2, s.170.] Nykyisistä selaimista Firefox 3 ja Opera 9 tukevat DOM 2:en HTML- ja tapahtumankäsittelyrajapintoja. Internet Explorer 8 tukee DOM 2:en HTML-rajapintaa, mutta tapahtumankäsittelyrajapinnan tuki on puutteellinen [8]. 2.3. XMLHttpRequest XMLHttpRequest-olio on AJAX:in ydin. Se mahdollistaa tiedon hakemisen asynkronisesti http-protokollan avulla ja samalla myös web-sivun osittaisen päivittämisen käyttäen hyväksi JavaScriptiä ja dokumenttioliomallia. Oliolle määritetään toiminto, joka suoritetaan kun vastaus palvelimelta saadaan. Tämä toiminto on hyvin usein vastaanotetun datan käsittelyn suorittava funktio, joka myös päivittää dokumentin sisällön. XMLHttpRequest-oliolla tehty pyyntö ei näy käyttäjälle mitenkään ellei vastausta käsittelevä funktio päivitä web-sivua, sillä asynkronisen pyynnön aikana käyttäjä voi jatkaa 6 web-sivun käyttöä normaalisti. Oliolla tehdyn pyynnön saa määritettyä myös synkroniseksi, mutta sille harvoin on tarvetta, sillä tällöin suurin osa AJAX-tekniikan hyödyistä menetetään. [7, s.26–31.] Microsoft esitteli ActiveX-komponenttina toteutetun XMLHTTP-olion Internet Explorer 5:ssä ja hieman myöhemmin vastaava toteutus tuli myös Firefox- ja Operaselaimiin XMLHttpRequest-nimisenä JavaScript-oliona. Nykyään kaikki suosituimmat selaimet tukevat XMLHttpRequest:ia. Internet Explorer 7:ssa ja sitä uudemmissa versioissa AJAX-toiminnallisuus on toteutettu muiden selainten kanssa yhtenevästi XMLHttpRequest-oliona ActiveX-komponentin sijaan. [7, s.25.] Internet Explorer 6:ssa XMLHTTP-olion luominen tapahtuu hieman eri lailla kuin 5:ssä, eli kaikkien selainten tukemiseksi on sovellukseen tehtävä kolme eri toteutusta AJAX-toiminnallisuudesta. Tämä on hankaloittanut web-sovelluskehitystä huomattavasti, sillä sovellusten toivotaan tavallisesti toimivan käytettävästä selaimesta riippumatta. HTTP-protokollaa hyödyntävänä asiakaspuolen tekniikkana XMLHttpRequest ei aseta erityisiä rajoituksia palvelinpuolen toteutukselle. Sen avulla haettavan tiedon tyyppiä ei ole rajoitettu, joskin XMLmuotoinen tieto on suositeltavaa sen helpon ohjelmallisen käsiteltävyyden vuoksi. [2, s.297.] Kuva 2.4. XMLHttpRequest-olion käyttö tiedonsiirrossa. Kuvassa 2.4 on esitetty pääpiirteittäin tiedonsiirto sääaseman sovelluspalvelun ja käyttöliittymän välillä. Vaiheessa 1. kutsutaan funktiota joka muodostaa XMLHttpRequest-olion. Tämä kutsu voi aiheutua esimerkiksi jostain käyttäjän toimesta käyttöliittymässä. Vaiheessa 2. XMLHttpRequest-olio lähettää muodostetun pyynnön sovelluspalvelulle. Sovelluspalvelu tekee kutsun perusteella tietokantakyselyn kohdassa kolme, ja saa vastauksen kyselyynsä kohdassa neljä. Sovelluspalvelu muodostaa tietokannasta haetusta tiedosta vastauksen ja lähettää sen vaiheessa 5. XMLHttpRequest saa vastauk- 7 sen ja mikäli kysely onnistui, välittää se vastauksena saadun tiedon 6. vaiheessa funktiolle joka käsittelee vastauksen. Tämä funktio voi tehdä saadulla tiedolla mitä vain, esimerkiksi päivittää sen sivulle haluttuun elementtiin tai olla tekemättä tiedolle mitään. Seitsemäs vaihe kuvaa web-sivun päivittämistä vastaanotetun tiedon pohjalta. Turvallisuussyistä selaimet asettavat rajoituksia XMLHttpRequest-olion käytölle. Ne estävät tiedon hakemisen muualta kuin siitä verkkotunnuksesta, jossa olio on luotu. Nämä rajoitteet on toteutettu hieman erilailla riippuen selaimesta, mutta nykyisissä selaimissa AJAX-pyynnöt toiseen verkkotunnukseen estetään oletuksena. [7, s.37, 38.] XMLHttpRequestin käyttö aiheuttaa myös muita ongelmia, sillä sen avulla tehdyt päivitykset eivät tallennu sivuhistoriaan, eli se rikkoo selaimen takaisin-painikkeen. 2.4. Web-sovelluspalvelu & SOAP Web-sovelluspalvelu on eräs hajautetun ohjelmistokehityksen työkalu. Ideana on, että palvelin tarjoaa jotakin palvelua verkon yli muille sovelluksille. Yleensä sovelluspalvelut toteutetaan http-protokollan yli käyttäen tiedonsiirrossa tekstipohjaista protokollaa, kuten XML:ää, SOAP:ia (engl. Simple Object Access Protocol) tai JSON:ia. Näillä saadaan aikaan korkea yhteensopivuus ja toimintavarmuus asiakkaan ja palvelimen alustoista ja ohjelmistoista riippumatta. [7, s.117.] Tyypillisesti web-sovelluspalvelut tarjoavat palveluja nimenomaan asiakasohjelmille. Sovelluspalvelulta saatava tieto sopii muotonsa vuoksi harvoin suoraan käyttäjälle esitettäväksi ja on yleensä ensin käsiteltävä ohjelmallisesti. Automaatiotekniikan liittyen on web-sovelluspalveluita hyödyntäen mahdollista kehittää muun muassa helppokäyttöisempiä, älykkäitä kenttälaitteita ja antureita, joiden konfigurointi ja käyttö on joustavampaa perinteisiin ratkaisuihin verrattuna [9]. SOAP on XML-pohjainen web-sovelluspalveluiden toteuttamiseen suunniteltu W3C:n määrittelemä tiedonsiirtoprotokolla [10]. Yksinkertaisuudessaan sen toiminta perustuu siihen, että http-protokollan POST-metodin [1, s.770] rungossa lähetetään SOAP-muotoinen viesti sovelluspalvelulle. Sovelluspalvelu käsittelee saamansa viestin ja palauttaa sen sisällön perusteella kutsujalle tietoa SOAP-viestiksi muotoiltuna. Rakenteellisesti SOAP-viesti sisältää kuoren, jonka sisällä ovat otsikko- ja runkoelementit sekä elementin virhetilanteista raportoimista varten. Sääaseman sovelluspalvelun kutsumiseen tarvitaan SOAP-kuoreen ainoastaan runkoelementti. Lisäksi websovelluspalveluihin liittyy WSDL-kuvauskieli (engl. Web Services Description Language). WSDL on XML:ään pohjautuva kieli, joka on tehty tarjottavan palvelun kuvaamista varten. Sillä on tarkoitus kuvata sovelluspalvelu niin tarkasti, että kuvauksen perusteella on mahdollista muotoilla SOAP-pyyntö ja toteuttaa asiakasohjelma sovelluspalvelulle. [11.] 8 2.5. Sovelluskohde Toteutettava selainkäyttöliittymä tehdään käytettäväksi Tampereen teknillisen yliopiston Systeemitekniikan laitoksen Vaisala Rosa -sääasemaan [12] kanssa. Sääasemalta saadaan GPRS-yhteyden välityksellä mittauksia tasaisin väliajoin. Mittaukset tallennetaan tietokantaan, josta niitä on mahdollista hakea web-sovelluspalvelun tarjoaman rajapinnan kautta käyttämällä hyväksi SOAP-protokollaa. Sovelluspalvelu tarjoaa mahdollisuuden hakea 1-100 viimeisintä mittausta.. Mittausten tiedot koostuvat sääaseman GPS-tiedoista (engl. Global Positioning System), päivämäärästä, kellonajasta, lämpötilan mittausarvosta sekä sen yksiköstä. [13.] Toteutettavan käyttöliittymän kannalta sääaseman ja palvelimen välisen kommunikoinnin toteutuksella ei ole juuri merkitystä, joten tutkimuksessa keskitytään tarkemmin tarjottuun sovelluspalveluun sekä selainkäyttöliittymän ja sovelluksen väliseen tiedonsiirtoon. II. 3. 911 SOVELLUSKEHYKSET Sovelluskehykset ovat ohjelmistokehityksen apuvälineitä, joiden tarkoituksena on helpottaa ja nopeuttaa uusien sovellusten rakentamista. Ideana on tarjota usein sovelluksissa tarvittavia komponentteja valmiina, jotta sovelluskehityksessä voidaan keskittyä sovelluskohtaisen sisällön ja toiminnallisuuden toteutukseen. [14.] Tyypillisesti sovelluskehykset tarjoavat valmiita komponentteja muun muassa käyttöliittymän toteutukseen sekä tiedon käsittelyyn ja siirtoon. Selainkohtaisten erojen vuoksi joitakin toimintoja, kuten XMLHttpRequestin käyttö, on toteutettava hieman eri lailla eri selaimille. JavaScript-sovelluskehyksissä on usein pyrkimyksenä toteuttaa tällaisia toimintoja uudestaan siten, että sovelluskehys pitää huolen selainkohtaisten erojen huomioimisesta ja piilottaa ne ohjelmistokehittäjältä. [15.] Erilaisia JavaScript-sovelluskehyksiä on tarjolla kymmeniä. Vaikka monet niistä tarjoavatkin käytännössä katsoen samoja palveluja, on toteutuksen laadussa ja ominaisuuksien määrässä suuria kirjastokohtaisia eroja. Osa kirjastoista keskittyy visuaalisten elementtien tarjoamiseen toisten panostaessa enemmän kirjaston helppoon käytettävyyteen tai erilaisiin tiedonsiirto- ja käsittelytapoihin. [16.] Sääaseman käyttöliittymän kehityksessä käytettävästä kirjastosta tulisi löytyä mahdollisuus taulukoiden luomiseen ja erilaisten kuvaajien piirtämiseen vastaanotetusta datasta sekä XML-datan käsittelyä helpottavia ominaisuuksia. Varsinkin kuvaajien piirto puuttuu tällä hetkellä monesta sovelluskehyksestä. Tarkemmin tarkastellaan Ample SDK-, Dojo-, sekä jQueryJavaScript-sovelluskehyksiä, joista kahteen ensin mainittuun sisältyy työkalut kuvaajien piirtämiseen ja kolmanteen on saatavilla useita laajennuksia, jotka mahdollistavat kuvaajien piirron [17;18;19]. Kaavio-ominaisuuksia korostetaankin selvästi vertailussa, sillä sääaseman sovelluspalvelulta saatavista lämpötilamittauksista piirretty kuvaaja on keskeinen osa toteutettavaa käyttöliittymää. 3.1. Ample SDK Ample SDK on melko tuore avoimen lähdekoodin JavaScript-sovelluskehys [17]. Sen kehittämisen aloitti vuonna 2008 perustettu suomalainen Clientside-yhtiö [20]. Ensimmäisen kehitysvuoden jälkeen Ample SDK muuttui avoimeksi projektiksi ja se on käytettävissä sekä GPL- (engl. General Public License) että MIT-lisenssillä, joka on Yhdysvalloissa Massachusetts Institute of Technology -yliopistossa kehitetty ohjelmistolisenssi. [21]. GPL on avoin lisenssi, jota käytetään useimmiten ohjelmistotuotteiden lisensoimiseen. Se sallii ohjelmakoodin kopioimisen, muuttamisen ja jakelun sillä ehdolla, että ohjelmakoodin tai sen osan edelleen jakelu tapahtuu saman lisenssin alla. Näin lisensoitua tuotetta ei siis voi käyttää suljetun lähdekoodin projektissa. Koodiin tehtyjä 10 muutoksia ei tarvitse kuitenkaan julkistaa, mikäli ohjelmaa ei jaella eteenpäin vaan käytetään ainoastaan omaan käyttöön. [22.] MIT-lisenssin ehtona ohjelman kopioimiseen, muuttamiseen ja jakeluun on lisenssitekstin säilyttäminen lähdekoodissa. Lähdekoodia ei kuitenkaan velvoiteta jakamaan, joten MIT-lisenssin alaista koodia voidaan käyttää myös suljetun lähdekoodin ohjelmistoissa. [23.] Kuvassa 3.1 on esitetty Ample SDK:n sovellusarkkitehtuuri pääpiirteittäin. Kuva 3.1. Ample SDK:n arkkitehtuuria havainnollistava kaavio. 3.1.1. Työkalut kaavioiden luomiseen Kotimaisuuden lisäksi Ample SDK:n valintaan vaikutti siitä löytyvät työkalut kuvaajien piirtoon. Ample SDK tarjoaa käytettäväksi kymmenen eri kaaviotyyppiä. Tavallisimpien kaavioiden kuten pylväs-, ympyrä-, pinta-ala- ja viivadiagrammien lisäksi sovelluskehys tarjoaa karttakuvaajan, sekä useita erikoisempia kaavioita. JavaScript kaavioille tyypilliseen tapaan kaaviot eivät ole vain datasta luotuja staattisia kuvia. Kaaviotyypistä riippuen on joka kuvaajasta mahdollista valita joko yksittäinen arvo tai kokonainen arvosarja [17]. Kuva 3.2. Yksinkertainen Ample SDK:lla luotu kuvaaja. 11 Kuva 3.3. Kuvan 3.2 luomiseen vaadittu XML-merkintä. Kaikista kaaviotyypeistä löytyy sovelluskehyksen sivuilta yksi tai useampi esimerkkikaavio sekä koodit esimerkkikaavioiden toteutuksista. Tämän enempää ohjeistusta kaavioiden käyttöön ei ainakaan toistaiseksi ole tarjolla. Lisäksi yhdessäkään esimerkkikaaviossa ei ole merkitty kuvaajiin mitään arvoasteikkoja, joten tällä hetkellä niitä ei oletettavasti ole saatavilla kuvaajiin. Amplen blogissa mainitaankin kaaviotyökalujen olevan vielä keskeneräisiä eikä niiden käyttämistä suositella missään varsinaisissa sovelluksissa [21]. Kaavioiden luomisen syntaksi on kuitenkin hyvin selkeää ja suoraviivaista ja omien kaavioiden luominen onnistuu helposti esimerkkikaavioiden koodin pohjalta. Amplen kaaviotyökalu eroaa muista tarkasteltavista sovelluskehyksistä syntaksin puolesta. Kun muissa kehyksissä mittaukset annetaan taulukkotyökalulle JavaScript-taulukkona, käyttää Ample omaa puhtaasti XML:ään pohjautuvaa merkintää. Mittaukset tulee siis muotoilla määrätyn malliseksi XML-dokumentiksi, josta sovelluskehys muodostaa kuvaajan. Kuvassa 3.2 on yksinkertainen Amplella luotu kaavio. Kuvassa 3.3 esitetty merkintä kirjoitetaan script-elementin sisään ja elementin nimiavaruudeksi on määritettävä Ample SDK:n chart-nimiavaruus. Tällä hetkellä kuvaajan akselit eivät mukaudu automaattisesti arvojen mukaan, eikä sivuilla ole ohjeita akselien muotoiluun. Tästä syystä arvoina on käytetty ainoastaan positiivisia arvoja, kun myöhemmissä esimerkkikaavioissa osa arvoista on negatiivisia. [17.] 3.1.2. Kuvauskielet Mielenkiintoinen piirre Ample SDK:ssa verrattuna muihin JavaScript-sovelluskehyksiin on se, että suurin osa työkalujen käytöstä tapahtuu käyttäen erilaisia kuvauskieliä. JavaScriptin kaltaista syntaksia ei nähdä juuri missään esimerkkikoodeissa ja sovelluskehyksen toiminta perustuukin kuvauskielten tulkkaamiseen JavaScriptin avulla. Sovelluskehyksen tarjoamien toimintojen jaottelu onkin tehty jakamalla ne omiin nimiavaruuksiinsa käytettävän kuvauskielen mukaan. Tämä tekee Amplesta helppokäyttöisemmän sellaisille käyttäjille, joilla on kokemusta kuvauskielistä kuten HTML tai XML, mutta jotka eivät ole käyttäneet JavaScriptiä. Kaiken kaikkiaan Ample SDK:n tarjoamat ominaisuudet perustuvat kuuden kuvauskielen käyttöön. [17.] Ample SDK tarjoaa yksinkertaisen ohjelmointirajapinnan Google Maps karttapalveluun AML-kuvauskielen (engl. Abstract Markup Language) kautta. Chart- 12 kuvauskieli on puolestaan Amplen kuvaajien luomisessa käytettävä kuvauskieli, josta on esimerkki kuvassa 3.3. SMIL (Synchronized Multimedia Integration Language) on multimediaesityksiä varten suunniteltu kuvauskieli, jonka avulla on mahdollista liittää erilaisia animaatioita sivun elementteihin. SVG (Scalable Vector Graphics) on kuvauskieli kaksiulotteisten vektorikuvien luomiseen. XHTML-kuvauskieltä (engl. eXtensible HyperText Markup Language) käytetään käyttöliittymän perusrakenteen ja -toimintojen toteuttamiseen. [17.] 3.1.3. Tiedonsiirto ja -käsittely Poiketen monista JavaScript-sovelluskehyksistä Ample SDK ei tarjoa selainriippumatonta toteutusta XMLHttpRequest-oliosta. Amplen web-sivuilla kerrotaan sovelluskehyksen pääpainon olevan nimenomaan graafisen käyttöliittymän toteuttamiseen tarkoitettujen työkalujen tarjoamisessa. Tiedonsiirtoon liittyviä komponentteja ei ole toistaiseksi tarjolla, kuten ei myöskään työkaluja rakenteisen tiedon tehokkaampaan käsittelyyn. Sovelluskehyksen dokumentaation yhteydessä on lyhyesti esitelty XMLHttpRequest, dokumenttioliomalli sekä muita web-sovelluskehitykseen liittyviä tekniikoita, mutta mitään uutta Ample ei näihin tarjoa. 3.1.4. Käyttöliittymäkomponentit XUL (XML User Interface Language) on käyttöliittymien toteuttamiseen tarkoitettu XML-pohjainen kuvauskieli. Sitä hyödyntäen Amplella voidaan luoda erilaisia perinteisen työpöytäsovelluksen kaltaisia ominaisuuksia sisältäviä käyttöliittymiä. Ample SDK ja XUL mahdollistavat muun muassa erilaisten ikkunoiden ja valikoiden luomisen, joiden ulkonäkö muistuttaa työpöytäsovellusten ulkonäköä. Tiedon esittämiseen puumaisena rakenteena sekä erilaisten syötteiden ja valintojen toteuttamisen löytyvät omat komponentit. Päivämäärän valintaan on tarjolla komponentti, jossa syötettävän päivän voi valita hiirellä kalenterista sen sijaan, että syöttäisi päivämäärän käsin tai valitsisi sen alasvetovalikoita käyttäen. Muita Amplen tarjoamia käyttöliittymäkomponentteja ovat muun muassa välilehdet sekä latauspalkki. [17.] 3.1.5. Soveltuvuus Ample SDK on hyvin tuore sovelluskehys ja selvästi vielä keskeneräinen. Useista Amplen sivuilla listatuista ominaisuuksista on vasta osittainen toteutus, eikä kaikista ominaisuuksista löydy vielä mitään esimerkkejä tai dokumentaatiota. Myös valmiiksi mainittujen sovelluskehyksen osien käyttöön on tarjolla hyvin vähän ohjeita tai esimerkkejä. Ohjesivulla on ainoastaan kuuden aiheen lista ja niistäkin vasta kolmeen on lisätty tietoa. [17.] Voidaan todeta, että sovelluskehyksen ilmeisen keskeneräisyyden vuoksi se ei vielä sovellu käyttöliittymän toteutukseen. Projekti vaikuttaa kuitenkin lupaavalta ja on kehittyessään tulevaisuudessa potentiaalinen vaihtoehto ainakin sääaseman selainkäyttöliittymän kaltaisiin projekteihin. SoapRequest-olio ja monipuoliset kaaviotyökalut olisi- 13 vat tehneet Amplesta hyvän valinnan sääaseman käyttöliittymän kehittämiseen, mutta tällä hetkellä kumpikaan mainituista ominaisuuksista ei ole riittävän valmis käytettäväksi. [17.] 3.2. Dojo Dojo on avoimen lähdekoodin JavaScript-sovelluskehys. Sen kehitys aloitettiin vuonna 2004. Dojon kehitystä tukevat monet tunnetut yhtiöt, kuten IBM, AOL, Sun ja Google. Dojo toolkit koostuu kolmesta osasta, jotka on jaettu omiin nimiavaruuksiinsa: Dojo, Dijit ja DojoX. [18.] Dojo-nimiavaruus on sovelluskehyksen pohja. Se jakautuu kahteen osaan: kaiken perustana toimivaan dojo.js JavaScript-tiedostoon, sekä sitä laajentavaan Dojo Core -kirjastoon. Pohjana toimiva dojo.js sisältää perustoimintoja kuten tapahtumankäsittelyä, Ajax-työkaluja ja luokkamallisen ohjelmoinnin. Dojo Core laajentaa tätä peruspakettia lisäämällä siihen esimerkiksi kehittyneempiä animaatioita ja takaisin-painikkeen toiminnan toteutuksen AJAX:ia käytettäessä [24]. Pelkkä dojo.js -tiedosto on suppein vaihtoehto Dojosta ja kaikki laajemmat kokonaisuudet tarvitsevat tämän tiedoston pohjakseen. Dijit-nimiavaruus sisältää Dojon käyttöliittymäkirjaston. Se vaatii pohjakseen dojo.js -tiedoston sekä Dojo Coren. Dijit sisältää suuren valikoiman erilaisia painikkeita, valinta- ja tekstikenttiä, kalentereita, valikoita ja käyttöliittymän ulkoasun muotoiluun kuten kehysten tekoon tarkoitettuja työkaluja [18]. DojoX–nimiavaruus pitää sisällään laajennuksia edellisiin nimiavaruuksiin [24]. Sitä kehitetään aliprojekteilla ja sen sisältämät työkalut saattavat kehitysvaiheesta riippuen olla valmiita ja testattuja tai vaihtoehtoisesti hyvinkin keskeneräisiä ja kokeellisia. Kuka tahansa voi saada kehittämänsä lisäominaisuuden lisättyä DojoX-kirjastoon ja se onkin lähinnä kokoelma käyttökelpoisia laajennuksia varsinaiseen sovelluskehykseen. Tästä syystä Dojox sisältää avaruuksista huomattavasti eniten erilaisia työkaluja jotka vaihtelevat Atom-syötteiden käsittelystä aina Googlen rajapintoihin. [18.] Dojon sovellusarkkitehtuuri on kuvattu pääpiirteittäin kuvassa 3.4. Kuvan kaaviossa on esitetty oleellisimmat sovelluskehyksen osat ja niiden sijoittuminen toisiinsa nähden. Kuvan kaaviossa ylempänä olevat kehyksen pääkomponentit tarvitsevat alemmat osat toimiakseen. 14 Kuva 3.4. Dojon arkkitehtuuria havainnollistava kaavio. 3.2.1. Työkalut kaavioiden luomiseen DojoX sisältää kirjaston kaavioiden luomiseen. Mahdollisia kaaviotyyppejä ovat piste-, viiva-, pylväs- ja ympyrädiagrammit. Lisäksi löytyy mahdollisuus pinta-alakaavion luomiseen. Se on käytännössä viivadiagrammi, jossa viivan ja x-akselin välinen osuus on täytetty. Viivadiagrammiin on mahdollista merkitä näkyviin datapisteet joista kuvaaja on piirretty. Erikoisuutena lähes kaikista kaavioista löytyy versiot, joissa seuraavan arvojoukon arvot lisätään edellisen arvojoukon arvoihin ja kuvaaja piirretään näistä yhteenlasketuista arvoista. [18.] Kuvaajiin, joissa on arvoakseli, saa halutessaan lisättyä taustaruudukon helpottamaan arvojen lukemista. Käytännössä tämä taustaruudukko on erillinen kaaviotyyppi, joka piirretään samaan kuvaan varsinaisen kaavion kanssa. Ruudukosta saa määritettyä erikseen pysty- ja vaakasuuntaisten viivojen piirtämisen ja myös sen, piirretäänkö viivat pää- vai apuarvoasteikon arvoille. [18.] 15 Kuva 3.5. Yksinkertainen Dojolla luotu kuvaaja. Ohjelma 3.1. Kuvan 3.5 luomiseen vaadittu koodi. Kuvaajat rakentuvat kolmesta osasta: itse kuvaajasta, akseleista sekä arvoista tai arvojoukoista jotka halutaan esittää. Tämä tekee kuvaajien luomisesta hieman työläämpää, sillä esimerkiksi akseleita ei oletuksena liitetä kuvaajaan vaan ne täytyy aina itse lisätä kuvaajaa luodessa. Pakolliset osat käyttökelpoisen kuvaajan tuottamiseksi ovat kuvaaja ja arvot. Akseleita ei ole pakko lisätä eivätkä kaikki kuvaajatyypit niitä edes tue. Kuvassa 3.5 on esitetty yksinkertainen viivadiagrammi ja ohjelmassa 3.1 sen luomiseen vaadittu koodi. Koodissa luodaan ensin määrätyn muotoinen taulukko, joka sisältää piirrettävät arvoparit. Kuvaajan voi piirtää myös pelkkiä lukuja sisältävästä taulukosta, mutta tällöin x-akselin arvot vastaavat automaattisesti taulukon indeksien arvoja. Taulukon luomisen jälkeen luodaan uusi kaavio-olio kuvaaja-nimiseen div-elementtiin. Tähän olioon lisätään sitten viivadiagrammi-tyyppinen kuvaaja oletusasetuksilla, sekä akselit ja arvosarja, josta kuvaaja piirretään. Kun kaikki halutut ominaisuudet on liitetty kuvaajaan, piirretään se kutsumalla kaavio-olion render-metodia. Jokaisella kuvaajalla on omat tälle kuvaajalle sopivat säädettävät ominaisuudet. Esimerkiksi viivadiagrammissa on mahdollista lisätä viivaan kaarevuutta sen sijaan että se vain yhdistäisi arvopisteet suorilla viivoilla ja pylväsdiagrammeissa puolestaan pystyy vaikuttamaan pylväiden väliin jäävään tilaan. [18.] Akseleiden käyttäminen on joustavaa. Niitä voi lisätä kaavioon mielivaltaisen määrän. Akselit ovat pysty- tai vaakasuuntaisia ja ne voi nimetä haluamallaan tavalla. Akseleiden arvoasteikot ja apuasteikot voi määrittää mielivaltaisesti tarkoituksiin sopivaksi valitsemalla mikä on pääarvojen väli, moneenko osaan yksi pääväli jaetaan apuasteikolla, miltä väliltä asteikon arvot ovat ja niin edelleen. Lisäksi arvoasteikot saa määritettyä sopeutumaan automaattisesti sen mukaan, minkälaisista arvoista kuvaaja piirretään. Arvoasteikosta voi myös määrittää erikseen näkyvyys kaikille eri asteikkomerkeille, kuten pää- ja apuasteikon arvoille. Arvot voi myös korvata esimerkiksi tekstillä, siten 16 että akselilla esitetään arvoina vaikka viikonpäivien nimiä, vaikka ne onkin piirtäessä esitetty numeroilla. Myös arvosarjojen muotoilu on mahdollista. Muotoilumahdollisuudet riippuvat käytettävän kuvaajan tyypistä. Arvosarjoja voi nimetä ja niille voi määrittää haluamansa värin. [18.] Kaavioihin on mahdollista liittää myös paljon toiminnallisuutta. Tapahtumankäsittely ja kaavion koostuminen erillisistä paloista mahdollistaa dynaamisten kaavioiden toteutuksen. Yksittäisten arvojen merkeille voi määrittää toiminnallisuutta kun niitä valitaan hiirellä tai pelkästään viedään hiiren osoitin pisteen päälle. [18.] Vastaavaa tapahtumankäsittelyä voi liittää lähes mihin tahansa kaavion osaan. 3.2.2. Tiedonsiirto ja -käsittely Dojo-nimiavaruus tarjoaa perustyökaluja tiedonsiirtoon ja käsittelyyn. Olennaista onkin selainkohtaisten erojen piilottaminen, jotta käyttäjän ei tarvitse itse miettiä miten eri selainten kohdalla toimitaan, vaan sovelluskehys huolehtii selainten erojen huomioimisesta. Tästä hyvänä esimerkkinä ovat Dojo:n xhr-funktiot, jotka tarjoavat käyttäjälle XMLHttpRequest-olion toiminnallisuuden selainriippumattomassa muodossa. Funktiot ovat korkeamman tason toteutuksia ja jokaista http-metodia kohden löytyy oma funktio. Tämä vähentää käytettävän funktion vaatimien parametrien määrää tehden funktiosta helppokäyttöisemmän. [18.] Dojo tarjoaa omat funktiot dokumenttioliomallin manipulointiin käyttäen hyväksi CSS:n valitsimia (Cascading Style Sheets). Kaikkiin käsiteltävän dokumentin solmuihin päästään käsiksi query-funktion avulla. Verrattuna dokumenttioliomallin tarjoaman ohjelmointirajapinnan syntaksiin, saadaan Dojon avulla dokumentin manipulointiin tarvittavaa koodimäärää vähennettyä huomattavasti. Funktiolle annetaan parametrina CSS-merkinnällä etsittävät solmut esimerkiksi solmun tunnisteen, luokan tai nimen perusteella ja se palauttaa taulukon löydetyistä kriteerit täyttävistä solmuista. Samalla funktiolla voidaan etsiä myös esimerkiksi tietyn solmun kaikki lapsisolmut tai ainoastaan tietyt kriteerit täyttävät lapsisolmut. [18.] Taulukkojen läpikäynti on Dojon avulla helppoa. Mikäli jokin taulukko halutaan käydä kokonaan läpi, ei tarvita perinteisiä iterointifunktioita kuten for-silmukkaa, vaan läpikäynti voidaan suorittaa Dojon forEach-funktiolla. Tämä funktio kohdistetaan haluttuun taulukkoon ja sille annetaan parametriksi funktio, joka suoritetaan kaikille taulukon alkioille. [18.] 3.2.3. Käyttöliittymäkomponentit Sovelluskehyksen Dijit-osa tarjoaa paljon erilaisia komponentteja käyttöliittymän visuaaliseen toteutukseen. Päivämäärän valintaa varten sovelluskehys tarjoaa kalenterikomponentin kuukausinäkymällä. Navigointiin liittyviä komponentteja on tarjolla kattava valikoima. Valikkokomponentit on pyritty luomaan ulkoisesti työpöytäsovelluksien valikkoja vastaaviksi, mikä mahdollistaa ulkonäöltään perinteisiä ohjelmia muistuttavien web-sovellusten toteuttamisen. Varsinaisen päävalikon lisäksi sovellukseen on mah- 17 dollista liittää työkaluvalikoita, väripaletteja, sekä hiiren oikeasta painikkeesta aukeava lisävalikko. Viimeksi mainittu korvaa hiiren oikean painikkeen painamisesta selaimeen normaalisti aukeavan valikon. Dijit tarjoaa tekstieditorin, joka tarjoaa mahdollisuuden tekstidokumenttien luomiseen ja muotoiluun selaimessa. Editorista löytyy tekstin muotoiluun vastaavia ominaisuuksia kuin esimerkiksi Microsoftin WordPad-tekstinkäsittelyohjelmasta. Muita käyttökelpoisia komponentteja ovat muun muassa latauspalkki sekä puumainen navigointivalikko. Käyttöliittymäosio tarjoaa mahdollisuuden myös tavallisia JavaScriptponnahdusikkunoita tyylikkäämpien ilmoitusten toteuttamiseen. [18.] 3.2.4. Muut ominaisuudet JavaScript on oliokieli, mutta siinä olioita ei toteuteta luomalla ensin luokkia kuten C++:ssa tai Javassa. JavaScriptissä toteutetaan ensin niin kutsuttu prototyyppiolio, jolta muut oliot voivat periä ominaisuuksia. Tämä on hyvin erilainen toteutustapa perinteisempään luokkamalliseen olio-ohjelmointiin verrattuna. [2, s.137–140.] Dojo tarjoaa mahdollisuuden luokka-malliseen olio-ohjelmointiin JavaScriptillä, mikä helpottaa luokkiin tottuneen ohjelmoijan JavaScriptin käyttöä. Dojo sisältää myös hieman poikkeavan tavan eri komponenttien käyttöönottoon. Kun tavallisesti kirjastojen komponentit sisällytetään sivulle script-elementtien avulla, tarvitsee Dojoa käyttäessä sivulle ladata näin ainoastaan dojo.js-tiedosto. Kaikki muut käytettävät komponentit voidaan sen jälkeen ottaa käyttöön Dojon require-funktion avulla. Tämä mahdollistaa kirjastojen lataamisen vasta sitten kun niitä oikeasti tarvitaan, mikä puolestaan nopeuttaa sivun ensimmäistä latausta. [18.] Kuten kappaleessa 3.2 todettiin, kaikki erikoisemmat työkalut löytyvät sovelluskehyksen DojoX-osiosta. Se sisältää komponentteja muun muassa flash-videoiden toistamiseen, Atom-syötevirtojen käsittelyyn, paljon JSON-muotoisen tiedon käsittelyyn liittyviä työkaluja, Googleen liittyviä erilaisia hakutyökaluja sekä Flickr-palveluun liittyviä komponentteja kuvien hakemiseen ja jakamiseen. [18.] Kaiken kaikkiaan sovelluskehyksen tarjoama työkaluvalikoima on laaja ja monipuolinen. Suurin osa sivuilla olevista komponenteista on pitkälle kehitettyjä ja käyttövalmiita. 3.2.5. Soveltuvuus Dojo tarjoaa käyttäjälle paljon esimerkkejä ja ohjeita erilaisten työkalujen ja komponenttien käyttöön. Eri ominaisuuksien dokumentointi on hyvää varsinkin kehyksen Dojo- ja Dijit-osissa. Tämän helpottaa sovelluskehyksen käyttöä huomattavasti. Internetistä löytyvän dokumentaation ja ohjeiden lisäksi Dojosta on saatavilla myös kirjallisuutta. DojoX-osa kokoaa hyvin sovelluskehyksen yhteyteen sille tehdyt laajennukset ja helpottaa osaltaan sopivien komponenttien löytämistä. [18.] Hyvän kaaviointityökalun sekä laajan käyttöliittymäkomponenttivalikoiman ansiosta Dojo soveltuu hyvin sääaseman käyttöliittymäkehitykseen. 18 3.3. jQuery jQuery on Ample SDK:n ja Dojon tapaan avoimen lähdekoodin JavaScriptsovelluskehys. Sen kehitys aloitettiin syksyllä vuonna 2005. Tavoitteena oli saada aikaan sovelluskehys, joka hyödyntäisi CSS-valitsimien käyttöä lyhyemmällä syntaksilla kuin muut sen hetkiset sovelluskehykset. Ensimmäinen versio sovelluskehyksestä julkaistiin vuoden 2006 tammikuussa ja toukokuussa jQuery tuli käytettäväksi MITlisenssin alla. [25.] jQuery on kehittynyt monipuoliseksi sovelluskehykseksi ja viimeisen vuoden aikana sen käyttö suosituimmilla web-sivuilla on kasvanut huomattavasti. jQuery onkin tällä hetkellä suosituimpia JavaScript-sovelluskehyksiä. [26.] Sitä käyttävät muun muassa Google, Dell ja Mozilla [19]. jQuery on jaettu kahteen osaan: kaiken olennaisimman toiminnallisuuden sisältävään peruskirjastoon sekä käyttöliittymäkirjastoon, joka vaatii toimiakseen peruskirjaston. Sovelluskehykselle kehitetyistä lisäosista ei ole Dojon tapaan muodostettu omaa kirjastoa, mutta niitä on kuitenkin listattu runsaasti jQueryn web-sivuilla. [19.] jQueryn arkkitehtuuri on kuvattu pääpiirteittäin kuvassa 3.6. jQueryn laajennukset on esitetty osittain varsinaisen kehyksen ulkopuolisena lohkona, sillä ne tarvitsevat pohjakseen kehyksen jQuery-osan, mutta eivät varsinaisesti kuulu tarjottuun sovelluskehyspakettiin. Kuva 3.6. jQueryn arkkitehtuuria havainnollistava kaavio. 3.3.1. Työkalut kaavioiden luomiseen jQuery ei sisällä itsessään työkaluja kaavioiden luomiseen. Sille on kuitenkin saatavilla suuri valikoima erilaisia laajennuksia, joilla kuvaajien piirtäminen onnistuu. Vertailuun on näistä valittu kolme kypsältä ja visuaalisesti hienolta näyttävää JavaScript-työkalua kuvaajien piirtämistä varten: Flot, jqPlot ja Highcharts. Näitä tarkastellaan seuraavissa aliluvuissa tarkemmin. Flot ja jqPlot on toteutettu laajennuksiksi jQuerya varten, ja ne 19 tarvitsevat jQueryn peruskirjaston toimiakseen. Highcharts puolestaan vaatii toimiakseen joko jQueryn tai MooTools-sovelluskehyksen. 3.3.1.1 Highcharts Highcharts on käytettävissä Creative Commons Attribution – Non-Commercial 3.0 lisenssin alla. Sen käyttäminen on ilmaista ei-kaupalliseen käyttöön. Highcharts tarjoaa mahdollisuuden erilaisten viiva-, pinta-ala-, pylväs- ja ympyrädiagrammien luomiseen. Lisäksi eri diagrammeja on mahdollista yhdistellä samaan kuvaan. Kuvassa voi olla myös useita arvoakseleita. Yleisesti ajatellen sääaseman käyttöliittymän toteutusta tämä mahdollistaa esimerkiksi sademäärien ja lämpötilojen kuvaamisen yhdellä kuvalla, jossa sademäärät voidaan esittää pylväillä ja lämpötila viivadiagrammilla. Sovelluspalvelu, jolle käyttöliittymä toteutetaan, tarjoaa kuitenkin vain lämpötilatietoa. Kaikki kaaviot ovat interaktiivisia ja kuvaajan elementin arvon tai jonkin muun tiedon saa näkymään viemällä hiiren osoittimen elementin päälle. Lisäksi kuvaajaan on mahdollista liittää suurennustoiminto jolla pitkän suuren datasarjan kuvaajaa saa tarkasteltua haluamaltaan väliltä. [27.] Kuva 3.7. Highcharts-laajennuksella luotu esimerkkikuva. Ohjelma 3.2. Kuvan 3.7 luomiseen vaadittu koodi. Kuvaajiin on mahdollista lisätä yksittäisiä datapisteitä. Kuvaajaa ei tarvitse piirtää uudestaan eikä uusinta mittausarvoa tarvitse välttämättä lisätä mihinkään taulukkoon, josta uusi kuvaaja sitten piirrettäisiin. Lisäksi Highcharts tarjoaa kaksi erikoisempaa ominaisuutta kuvaajien tekemiseen: mahdollisuuden käyttäjälle lisätä arvopisteitä hiiren avulla suoraan kuvaajaan, sekä pitkän aikavälin tietoja varten kuvaajan, pienestä koko aikaväliä esittävästä kuvaajasta on mahdollista maalata osa, joka sitten esitetään tarkemmassa kuvaajassa. Visuaalisesti Highcharts on vertailtavista kirjastoista näyttä- 20 vin. Kuvaajiin saa liitettyä valmiita tyylejä jotka helpottavat kuvaajien muokkaamista nopeasti halutunlaisiksi. Myös datapisteiden symbolin saa itse määrittää lisäämällä oman kuvan symboliksi. Kaavioiden luominen on selkeää ja syntaksi helposti ymmärrettävää ja sisäistettävää. Kuvassa 3.7 on mahdollisimman yksinkertainen Highchartsilla luotu esimerkkikuvaaja. Highchartsin sivuilla olevista esimerkeistä saa paremman käsityksen siitä, kuinka tyylikkäitä kaavioita sillä on mahdollista saada aikaan. Kaiken kaikkiaan Highcharts vaikuttaa kypsältä ja monipuoliselta kirjastolta kaavioiden luomiseen. [27.] 3.3.1.2 Flot Flot on jQuerylle tehty laajennus kuvaajien piirtoa varten. Sen on käytettävissä MITlisenssin alla. Sivuilla kerrotaan tavoitteina olevan helppo käytettävyys, tyylikäs ulkoasu sekä interaktiiviset toiminnot kuten kuvan lähentäminen. [28.] Kuva 3.8. Yksinkertainen Flot:illa luotu kuvaaja ilman lisämääreitä. Ohjelma 3.3. Kuvan 3.8 luomiseen vaadittu JavaScript-koodi. Flotin tarjoama kuvaajavalikoima on melko suppea. Tällä hetkellä sillä on mahdollista luoda ainoastaan pylväs-, pinta-ala- ja viivadiagrammeja. Kirjaston käyttö puolestaan on helppoa, sillä kaikki asetukset ovat valinnaisia. Kuvaajan piirtoa varten täytyy ainoastaan määrittää sivulle elementti, jonka koko määrätään kiinteäksi sekä taulukko, joka sisältää piirrettävän arvosarjan tai arvoparit. Tämän jälkeen tarvitaan yksi lyhyt komento, jossa määritellään kohde-elementti sekä arvosarja josta kuvaaja piirretään. Flot huolehtii itse arvoakseleiden skaalauksesta saamiensa arvojen perusteella, joten kuvaaja on mahdollista saada aikaan todella pienellä koodimäärällä. Arvoakseleiden asetukset voi myös määrittää erikseen, mikäli automaattinen skaalaus ei sovellu käyttötarpeisiin. [29.] Kuvassa 3.8 on esitetty yksinkertainen Flotilla luotu kuvaaja ja ohjelmassa 3.3 kuvaajan luomiseen vaadittu JavaScript-koodi. Koodin lisäksi vaaditaan ainoastaan jQuery- ja Flot-kirjastojen käyttöönotto sekä kohde-elementin luominen sivulle. Ohjelmassa 3.3 kuvaaja luodaan div-elementtiin, jonka tunniste on ”kuvaaja”. Elementin kooksi on määritelty 450x150 kuvapistettä. Flot mahdollistaa myös käyttäjän vuorovaikutuksen arvopisteiden kanssa. Pisteitä voi valita hiirellä ja niiden arvot on mahdollista asettaa näkymään liikuttaessa hiiren 21 arvon päälle. Myös kuvaajan lähentäminen ja loitontaminen sekä kuvaajan paikan liikuttaminen kuvassa on mahdollista. [29.] 3.3.1.3 jqPlot jqPlot on Flotin tapaan jQueryn pohjalle rakentuva kirjasto kuvaajien luomiseen. Se on käytettävissä MIT- ja GPL-lisenssien alla. jqPlotin avulla on mahdollista luoda viivapylväs- ja ympyrädiagrammeja. Arvot merkitään automaattisesti kuvaan pisteillä ja akselit muotoillaan automaattisesti, mikäli niille ei erikseen anneta asetuksia. Asteikot on mahdollista muotoilla myös logaritmisiksi tai ajan mukaan. Aikamuotoiluun on monipuoliset asetukset ja asteikkojen arvot voi antaa melkein missä tahansa yleisesti käytetyssä muodossa. Arvoasteikoita ja niiden otsikoita voi muotoilla melko vapaasti ja arvojen merkinnät voi kääntää haluamaansa kulmaan vaakatasoon nähden. Tästä on hyötyä erityisesti kun käytetään asteikon arvoina päivämääriä tai vastaavia pidempiä merkintöjä. Lisäksi kirjasto sisältää niin kutsutun tooltip-toiminnon, eli pisteen arvo saadaan näkyviin viemällä hiiren osoittimen pisteen päälle. [30.] Kuva 3.9. Yksinkertainen jqPlot:illa luotu kuvaaja ilman lisämääreitä. Ohjelma 3.4. Kuvan 3.9 luomiseen vaadittu JavaScript-koodi. Kuvassa 3.9 on esitetty ohjelmalla 3.4 luotu kuvaaja. jqPlotille on annettu ainoastaan kohde-elementti sekä taulukko, josta kuvaaja halutaan piirtää. Kirjasto suorittaa automaattisesti kaiken muotoilun. Kuten kuvasta 3.9 voidaan havaita, on jqPlotin avulla helppo luoda tyylikkäitä kaavioita pienellä koodimäärällä. Kuvaajan ulkoasua ja piirtoasetuksia voi myös melko vapaasti muokata mieleisekseen, mikäli automaattisesti muotoiltu kuvaaja ei sovi käyttötarkoituksiin. 3.3.2. Tiedonsiirto ja -käsittely jQueryn mainostetaan muuttavan tavan, jolla kirjoitat JavaScriptiä. Sovelluskehyksen toiminta rakentuu hyvin jQuery-funktion ympärille, jonka avulla päästään helposti käsiksi dokumenttioliomalliin. Erityisen lyhyttä syntaksista tekee se, että jQuery-nimen voi korvata kirjoittamalla pelkän dollarimerkin $. jQuery-funktiolle voi antaa CSS- 22 valitsimen, jonka perusteella etsitään kaikki täsmäävät elementit ja muodostetaan niistä jQuery-olio. Kaikki dokumentin div-elementit voitaisiin etsiä yksinkertaisesti komennolla jQuery(’div’); tai lyhyemmin $(’div’);. Verrattuna dokumenttioliomallin tarjoamaan ohjelmointirajapintaan jQueryn tarjoama dokumentin käsittelytapa vähentää tarvittavaa koodin määrää huomattavasti. Haettujen elementtien sisällön ja ominaisuuksien lisäämiseen, muokkaamiseen ja poistamiseen löytyy myös useita funktioita. [19.] jQueryn peruskirjasto tarjoaa Dojon tapaan selainriippumattoman AJAXtoteutuksen. jQueryssa se on toteutettu yhdellä funktiolla, jonka toiminta määritetään parametreilla. Haettaessa XML-muotoista tietoa ajax:illa muodostaa jQuery sovelluspalvelun palauttamasta tiedosta automaattisesti dokumenttiolion, jota voidaan käsitellä jQueryn tarjoamilla funktioilla samaan tapaan kuin web-sivua. Matalan tason ajaxfunktion lisäksi jQuery tarjoaa korkeamman tason get- ja post-funktiot kyseisistä httpmetodeista. Nämä funktiot tarvitsevat vähemmän parametreja verrattuna ajax:iin eivätkä ole yhtä yleiskäyttöisiä. Lisäksi jQuery tarjoaa load-funktion, joka mahdollistaa HTML:n lataamisen suoraan määrättyyn sivun elementtiin, sekä omat funktiot JSONmuotoisen tiedon sekä JavaScript-koodin lataamiseen. [19.] jQuery tarjoaa Dojon forEach-funktiota vastaavan each-funktion taulukko- ja tietorakenteiden läpikäyntiin. Alkioita ei tarvitse iteroida läpi silmukassa, vaan funktio suorittaa sille parametrina annetun toisen funktion jokaiselle alkiolle. [19.] 3.3.3. Käyttöliittymäkomponentit Sovelluskehyksen käyttöliittymäosa jQueryUI tarjoaa valikoiman komponentteja käyttöliittymän toteuttamiseksi. jQueryn web-sivuilta saa ladattua räätälöidyn käyttöliittymäpaketin, johon voi itse valita tarvitsemansa käyttöliittymäkomponentit ja lisäksi käyttöliittymäkomponenteissa käytettävän valmiin teeman eli CSS-tyylipaketin. Valmiita teemoja on valittavana yli kaksikymmentä, ja lisäksi sivulta löytyy editori omien teemojen helppoon luomiseen. Teemojen lisäksi käyttöliittymäosuuden tarjoamat ominaisuudet jakautuvat karkeasti kolmeen osaan: vuorovaikutuksen luomiseen elementteihin, varsinaisiin käyttöliittymäkomponentteihin ja visuaalisiin efekteihin. [19.] Vuorovaikutusosuus tarjoaa mahdollisuuden elementtien siirtämiseen ja niiden koon muuttamiseen hiiren avulla. Elementeillä voi myös olla määrätyt paikat, mutta niiden järjestystä näillä paikoilla voi muuttaa liikuttamalla elementtejä hiirellä. Efektiosio tarjoaa osittain samoja efektejä kuin peruskirjastokin, mutta valinnanvaraa on enemmän ja lisäksi efekteistä on havainnolliset esimerkit sivulla. Varsinaisista käyttöliittymäelementeistä löytyy muiden vertailtavien sovelluskehysten tapaan kalenterisovellus. jQueryUI tarjoaa useita komponentteja valikkojen luomiseen, kuten välilehdet. Erilaisia painike- ja syötteenvalintaelementtejä on myös tarjolla. Monet elementeistä ovat tavallisia html-elementtejä, joihin on lisätty käyttöliittymän teemaa hyväksi käyttäen tyylikäs ulkoasu. Erikoisempia komponentteja ovat latauspalkki sekä automaattinen tekstikentän täydennys, joka hyödyntää AJAX:ia. [19.] 23 3.3.4. Muut ominaisuudet jQuery mahdollistaa tapahtumankäsittelyn liittämisen elementteihin hyödyntäen kappaleessa 3.2.2 kuvattua elementtien etsimistoimintoa. Lyhyesti sanottuna jQuery tarjoaa suurimman osan dokumenttioliomallin tarjoamista mahdollisuuksista dokumentin muokkaamiseen huomattavasti lyhyemmällä syntaksilla. Sivun elementtien halutaan yleensä latautuvan ennen kuin JavaScript-koodia suoritetaan. Tämän varmistamiseen JavaScript ja DOM tarjoavat onLoad-funktion. [19.] Funktion huonona puolena on kuitenkin se, että JavaScript-koodia ei suoriteta ennen kuin kaikki sivun elementit, kuten kuvat, ovat kokonaan latautuneet. Tätä varten jQuery sisältää oman funktion, jolla voi tarkistaa dokumentin kaikkien elementtien latautuneen ennen kuin koodia suoritetaan, mutta joka ei odota esimerkiksi edellä mainittujen kuvien latautumista. Lisäksi peruskirjasto sisältää muun muassa joitakin efektejä joita on mahdollista liittää sivun elementteihin. [19.] 3.3.5. Soveltuvuus jQuery on monipuolinen ja kypsä JavaScript-sovelluskehys, joka tarjoaa kaikki tarvittavat ominaisuudet sääaseman käyttöliittymän toteuttamiseen. Vaikka aivan kaikkia ominaisuuksia kuten kuvaajien luomiseen vaadittavia työkaluja ei sisälly suoraan sovelluskehykseen, on jQueryn sivuilla listattu paljon sitä hyödyntäviä laajennuksia, esimerkiksi jqPlot ja Flot, jotka tarjoavat varsinaisesta sovelluskehyksestä puuttuvia toimintoja. Sovelluskehyksen suosio aiheuttaa sen, että sille on tarjolla jopa parempi valikoima erilaisia työkaluja verrattuna sellaisiin sovelluskehyksiin, jotka pyrkivät sisällyttämään edes jonkinlaisen toteutuksen esimerkiksi kuvaajista osaksi varsinaista sovelluskehystä. jQueryn käytön omaksuminen on helppoa tarjotun kattavan ohjeistuksen avulla. Sen voidaan todeta soveltuvan hyvin sääaseman käyttöliittymäkehitykseen. 3.4. Käytettävän kirjaston valinta Kuten luvussa 3.1 todettiin, Ample SDK ei keskeneräisyytensä vuoksi sovellu vielä sääaseman käyttöliittymäkehitykseen, joten vaihtoehdoiksi toteutusta varten jäävät Dojo ja jQuery. Molemmilla sovelluskehyksillä olennaisimpien toimintojen, kuten selainriippumattoman AJAX-pyynnön luominen ja dokumenttioliomallin helppo manipulointi on mahdollista. Dojon valintaa tukevat laajempi käyttöliittymäkirjasto, joustavampi mahdollisuus sovelluskehyksen eri komponenttien käyttöönottoon vasta tarvittaessa, sekä luokka-mallisen olio-ohjelmoinnin mahdollisuus. jQuery puolestaan sisältää hieman lyhyemmän syntaksin ja suuremman valikoiman laajennuksia. Myös jQuery:n ajaxfunktion toteutus on hieman monipuolisempi. 24 Käytettäväksi sovelluskehykseksi valikoitui jQuery. Valinta johtui pääosin jQuerylle saatavilla olevien kuvaajien piirtoon tarkoitettujen laajennusten laadusta verrattuna Dojon kuvaaja-työkaluun. Kuvaajien luominen Dojon avulla oli huomattavasti työläämpää ja sillä tuotetut kuvaajat eivät olleet visuaalisesti yhtä näyttäviä kuin jQueryn laajennuksilla luodut. Lisäksi Dojon puolesta puhuvat komponenttien lataaminen vasta tarvittaessa ja luokka-mallinen olio-ohjelmointi eivät ole tarpeellisia tämän kokoluokan ohjelmistoprojektissa. 25 4. KÄYTTÖLIITTYMÄN TOTEUTUS Tässä luvussa käydään läpi jQueryn avulla toteutetun sääaseman selainkäyttöliittymän toteutus. Tavoitteena toteutettavalle käyttöliittymälle on selkeys, helppokäyttöisyys sekä tyylikäs ulkonäkö. Käyttöliittymä toteutetaan mahdollisimman pitkälle JavaScriptiä hyödyntäen siten, että käyttöliittymäsivu tarvitsee ladata palvelimelta ainoastaan kerran. Latauksen jälkeen käyttöliittymän sisällön muuttaminen ja päivittäminen tapahtuu manipuloimalla dokumenttioliota jQueryn avulla ja tiedonsiirtoa tapahtuu ainoastaan haettaessa uutta mittausta sääaseman sovelluspalvelulta. Liitteissä B ja C on esitetty käyttöliittymän toteuttava HTML-dokumentti sekä käyttöliittymää varten itse tuotettu JavaScript-koodi. 4.1. Rajoitukset Suurimmat rajoitukset toteutettavalle käyttöliittymälle aiheutuvat sääaseman sovelluspalvelusta. Siltä on mahdollista hakea maksimissaan 100 viimeisintä lämpötilamittausta. Koska sääasemalta saadaan uusi mittaus viiden minuutin välein, on käyttöliittymässä mahdollista käsitellä tietoa hieman yli kahdeksan tunnin ajalta. Lisäksi käyttöliittymän toteutusta rajoittaa se, että ainoa sovelluspalvelulta saatava mittaus on lämpötila. Muita rajoituksia ja toteutuksessa huomioon otettavia asioita ovat AJAX:in rajoitteet sekä käyttöliittymän toimivuus eri selaimissa. Käyttöliittymän tulee toimia ainakin suosituimmissa web-selaimissa, eli Internet Explorerissa sekä Mozilla Firefoxissa [31]. Koska selaimet rajoittavat turvallisuussyistä AJAX:in käyttöä kuten luvussa 2.3. on todettu, on sovelluspalvelulta mahdollista hakea mittauksia ainoastaan käyttöliittymän ollessa sijoitettu samaan verkko-osoitteeseen sovelluspalvelun kanssa. 4.2. Käyttöliittymän rakenne ja navigointi Käyttöliittymä koostuu kolmesta näkyvästä pääkomponentista: navigointivalikosta, kehyksestä, jonka sisällä kaikki käyttöliittymän sisältö esitetään sekä kehyksen alapuolella olevasta tiedonsiirtoon liittyvästä latauspalkista. Nämä käyttöliittymän elementit ovat aina näkyvissä ja sivua käyttäessä ainoastaan kehyksen sisältö muuttuu. Tämä luo mielikuvan siitä, että kehyksen sisälle ladattaisiin toinen sivu, joka navigoidessa vaihtuisi. Koska monet Internetin käyttäjät ovat tottuneet tämän tyylisiin navigointiratkaisuihin, helpottaa tämä mielikuva sivun käyttöä. Käyttöliittymän alareunassa on jQueryUI-kirjaston tarjoama latauspalkkikäyttöliittymäelementti. Luodulle elementille asetetaan arvo elementille määritetyltä 26 arvoväliltä (oletuksena 0-100), joka ilmoittaa kuinka suuri osa palkista täytetään. Väritys määräytyy automaattisesti käytettävän käyttöliittymäteeman perusteella. Toteutettavassa käyttöliittymässä latauspalkkia käytetään kuvaamaan seuraavan mittauksen hakuun jäljellä olevaa aikaa. Käyttöliittymän kehys on kiinteän kokoiseksi määritetty html:n div-elementti, jolle on CSS-tyylien avulla määritetty ympäröivä kehys. Navigointivalikko on myös toteutettu jQueryUI:n tarjoamien painikkeiden avulla. Käytettävä painikeryhmä on käyttöliittymäkirjaston tarjoama visuaalinen muotoilu html:n valintaelementille, jossa ainoastaan yksi valinta voi olla kerrallaan aktiivinen. Tätä varsinaista valintaominaisuutta ei käytetä käyttöliittymässä muuhun kuin sen ilmoittamiseen, mikä käyttöliittymänäkymä on valittuna. Tämä näkyy kyseiseen näkymään liittyvän painikkeen tummempana värinä. Navigointi, eli tässä tapauksessa käyttöliittymän sisällön muokkaus JavaScriptillä, perustuu painikkeisiin liitettyihin tapahtumiin. Jokaiseen valikon painikkeeseen on liitetty jQueryn tarjoama click-tapahtuma. Kaikkien näkymien luomiseen on omat funktionsa, jotka tapahtumien avulla liitetään oikeisiin painikkeisiin. Kun painike valitaan hiirellä, aiheutuu siitä tapahtuma joka kutsuu käyttöliittymän sisältöä muokkaavaa funktiota. 4.3. Tiedonsiirto Käyttöliittymän lataamista lukuun ottamatta sovelluksen tiedonsiirto on toteutettu jQueryn ajax-funktiolla, joka palauttaa XMLHttpRequest-olion. Tätä oliota ei tarvitse itse suoraan käsitellä, mutta se on mahdollista. [19.] Tiedonsiirto sääaseman sovelluspalvelun ja käyttöliittymän välillä tapahtuu luvun 2.3 kuvan 2.4 esittämällä tavalla. Sovelluspalvelua käyttäessä http-metodiksi valitaan POST, jotta SOAP-pyyntö saadaan välitettyä palvelulle. SOAP-viesti asetetaan ajax:in data-kentän arvoksi. Vastaanotettavan tiedon tyypiksi asetetaan xml ja lisäksi beforeSend-määritteen avulla pyyntöön lisätään ennen lähetystä ”SOAPAction”-otsikkokenttä. Sovelluspalvelu vaatii tämän kentän pyyntöön, jotta mittauksia palautetaan. Kentälle ei kuitenkaan tarvitse antaa mitään arvoa, vaan riittää kun se on lisätty XMLHttpRequest-olioon. Onnistuneen pyynnön jälkeen sovelluspalvelulta saatu vastaus käsitellään ajaxfunktion success-kohdassa määritellyn funktion avulla. Toteutetussa käyttöliittymässä tämä funktio etsii jQuery:n valitsimia käyttäen kaikki SOAP-vastauksen measurementelementit. Löydetyt elementit käydään läpi ja niille suoritetaan funktio, joka etsii kyseisen mittauksen ajankohdan sekä arvon. Näistä arvoista muodostetaan taulukko, joka lisätään toiseen taulukkoon. Tuloksena saadaan siis taulukko taulukoita, jossa sisemmät taulukot sisältävät yhden mittauksen ajan ja arvon. Tämä taulukko on käyttöliittymän muiden funktioiden käytettävissä. Käyttöliittymän latautuessa haetaan sovelluspalvelulta sata mittausta. Sovelluspalvelulle tulee sääasemalta yksi uusi mittaus viiden minuutin välein. Siirrettävän tiedon määrän minimoimiseksi lataamisen jälkeen sovelluspalvelulta haetaan ajastetusti viiden minuutin välein ainoastaan uusin mittaus. Se käsitellään edellisessä kappaleessa kuva- 27 tulla tavalla ja lisätään tiedot taulukkoon. Samalla taulukosta poistetaan vanhin mittaus, eli se pysyy aina sadan alkion kokoisena. Ajastus on toteutettu hyödyntäen JavaScript-kielen setInterval- ja clearIntervalfunktioita. Ensimmäisellä määritetään jonkin funktion suoritus tapahtuvaksi millisekunteina annetun ajan välein. Funktiota suoritetaan annetun ajan välein siihen asti, kunnes käynnistetty ajastus keskeytetään clearInterval-funktiolla. Pelkkä uuden mittauksen haun ajastaminen on hyvin yksinkertaista. Käyttöliittymän toteutuksessa on ajastusta varten kuitenkin luotu oma ajastus-funktio, joka hyödyntää edellä mainittuja funktioita. Sille annetaan ajastusväli sekunteina ja funktio huolehtii ajan kuluessa latauspalkin päivittämisestä sekä suorittaa halutun ajan kuluttua uusimman mittauksen hakemisen. Käyttöliittymässä on myös hyödynnetty jQueryn tarjoamaa ajaxCompletefunktiota. Se suoritetaan aina kun ajax-tiedonhaku on suoritettu loppuun (eli myös paluufunktio on suoritettu). ajaxComplete-funktion sisällä luodaan uusimmista mittauksista kuvaaja ja taulukko sekä käynnistetään ajastus seuraavaan tiedonhakuun. 4.4. Kuvaaja Käyttöliittymän tärkein visuaalinen elementti on sovelluspalvelulta haetuista mittauksista piirretty kuvaaja. Työkaluksi kuvaajan luomiseen valikoitui jqPlot helppokäyttöisyyden ja riittävän monipuolisten ominaisuuksien vuoksi. Erityisesti aika-arvojen lisääminen akselin arvoiksi halutussa muodossa oli selvä etu Flotiin nähden. Kuvaaja luodaan omaan div-elementtiinsä ensimmäisen tiedonhaun jälkeen. Oletuksena kuvaaja piirretään kaikista haetuista mittauksista. Kuvaajan yhteydessä on valikko, josta voi valita tarkasteltavaksi kaikki viimeisimmät mittaukset, tai mittaukset ainoastaan yhden, kahden, neljän tai kuuden tunnin ajalta. Yhden ja kahden tunnin aikaväliä tarkasteltaessa aika-akselin arvoasteikko on jaettu viidentoista minuutin väleihin ja pidemmällä aikavälillä asteikon arvot ovat puolen tunnin välein. Lämpötila-akseli on jätetty automaattisesti skaalautuvaksi. Vuorovaikutuksen lisäämiseksi kaavioon on otettu käyttöön tooltip-toiminto, jolla mittauspisteen arvot saadaan näkyviin viemällä hiiren osoitin pisteen päälle. jqPlotin työkalut mahdollistavat sovelluspalvelulta saatavan mittaukseen liittyvän aikaleiman antamisen suoraan kuvaajalle. Asetuksista voidaan säätää mitkä osat aikaleimasta näytetään arvoakselilla ja tooltip-työkalussa. Näin aikaleimaa ei tarvitse itse muokata merkkijonona. Käyttöliittymän kuvaajanäkymä on esitetty liitteen 1 kuvassa B. 4.5. Taulukko Sovelluspalvelulta saatuja mittauksia on mahdollista tarkastella taulukkona. Taulukon toteuttamiseen on käytetty jQuerylle tehtyä Flexigrid-laajennusta. Käyttöliittymän taulukkonäkymä on esitetty liitteen A kuvassa C. Tämä laajennus mahdollistaa ulkonäöltä tyylikkäiden, dynaamisten taulukkojen luonnin käyttäen apuna ajax-tiedonhakua. Taulukon alkioita voi tällöin esimerkiksi järjestää haluamansa sarakkeen mukaan. [32.] 28 Flexigrid vaatii kuitenkin haettavan tiedon määrätynlaisessa muodossa, joten edellä mainittujen ominaisuuksien hyödyntämiseksi tarvittaisiin välipalvelin hakemaan tietoa sääasemalta ja tarjoamaan sitä laajennukselle oikeassa muodossa. Näin ollen käyttöliittymän taulukko on toteutettu tavallisena staattisena html-taulukkona joka muotoillaan Flexigridin avulla. Taulukon kokoa ja sarakkeiden leveyttä on mahdollista muuttaa hiiren avulla. [32.] Taulukossa esitetään ensimmäisessä sarakkeessa mittauksen päivämäärä ja kellonaika sekä toisessa sarakkeessa mittauksen arvo. Kuten kuvaajaan, myös taulukkoon voidaan valita tarkasteltavaksi viimeisimmät mittaukset viideltä eri ajanjaksolta. 4.6. Jatkokehitysideoita Sääaseman käyttöliittymän toiminta testattiin Mozilla Firefox 3.6.3 ja Internet Explorer 8 -selaimilla. Käyttöliittymälle olisi hyvä tehdä myös laajempaa testausta suosituimmilla selaimilla, kuten Operalla, Safarilla ja Google Chromella. Selaimista tulisi testata uusimpien versioiden lisäksi myös vanhempia versioita, sillä vanhempia versioita on usein laajalti käytössä pitkään uuden version julkaisun jälkeen [33]. Mikäli testauksen yhteydessä ilmenisi yhteensopivuusongelmia, tulisi käyttöliittymään tehdä vaadittavat muutokset ongelmien korjaamiseksi. Toiminnallisuuden osalta käyttöliittymää voisi kehittää edelleen tarjoamalla joustavammin erilaisia mahdollisuuksia tarkasteltavien mittausten valintaan. Mittauksia voisi valita tarkasteltavaksi mielivaltaisen määrän väliltä 1-100 ja myös ensimmäinen tarkasteltava mittaus olisi käyttäjän määritettävissä, jolloin tarkasteltavaksi valitut mittaukset eivät välttämättä olisi viimeisimmät mittaukset. Lisäksi mittauksista voisi laskea keskiarvoja halutulta ajalta ja tarkastella näitä keskiarvoja kuvaaja- ja taulukkomuodossa. Käyttöliittymällä olisi mahdollista tarkastella esimerkiksi viimeisimpien kahdeksan tunnin tuntikohtaisia lämpötilojen keskiarvoja. Pidemmän ajanjakson mittaustietojen tarkastelun mahdollistamiseksi käyttöliittymää varten voisi pystyttää välipalvelimen. Palvelimelle haettaisiin mittaustietoja sääaseman sovelluspalvelulta ajastetusti. Tiedot tallennettaisiin palvelimelle, joka puolestaan tarjoaisi käyttöliittymälle rajapinnat mittaustietoihin. Tämä mahdollistaisi myös taulukon tietojen hakemisen asynkronisesti, jolloin kaikki taulukon ominaisuudet, kuten taulukon arvojen järjestäminen, olisivat käytettävissä. 29 5. YHTEENVETO Työn tavoitteena oli selvittää JavaScript-sovelluskehysten soveltuvuutta Tampereen teknillisen yliopiston systeemitekniikan laitoksen sääaseman selainkäyttöliittymän toteutukseen ja vastaaviin ohjelmistoprojekteihin, sekä toteuttaa sääasemalle uusi käyttöliittymä. Vaatimuksena toteutettavalle käyttöliittymälle oli asynkroninen tiedonsiirto selaimen ja sääaseman sovelluspalvelun välillä sekä tyylikäs ulkoasu. Kymmenien JavaScript-sovelluskehysten joukosta vertailtaviksi valittiin kolme ominaisuuksiltaan lupaavinta sovelluskehystä: Ample SDK, Dojo ja jQuery. Valinnan ensisijaisena perusteena olivat kehyksien tarjoamat rajapinnat kuvaajien luomiseen. Kuvaajien lisäksi sovelluskehyksiä tarkasteltaessa keskityttiin erityisesti tarjottuihin käyttöliittymäkomponentteihin sekä tiedonsiirtoa ja käsittelyä helpottaviin ominaisuuksiin. Sovelluskehysten analysoinnin tuloksena todettiin Dojon ja jQueryn soveltuvan käyttöliittymän sovelluskehitykseen. Käyttöliittymän toteutukseen valittu jQuery-sovelluskehys tarjoaa monipuolisen käyttöliittymäkirjaston sekä laajennusten kautta useita komponentteja kuvaajien ja taulukkojen luomiseen. jQuery toteuttaa omana funktionaan selainriippumattoman toteutuksen asynkroniseen tiedonsiirtoon käytettävästä XMLHttpRequest-oliosta. Se pitää sisällään myös dokumenttioliomallin tarjoamaa rajapintaa selkeämmän ja helppokäyttöisemmän rajapinnan dokumenttien käsittelyyn ja muokkaamiseen. Rajapinnan hyödyntäminen vähentää dokumenttien käsittelyssä vaadittavan koodin määrää huomattavasti. Toteutettu käyttöliittymä tarjoaa mahdollisuuden sääaseman mittaustietojen tarkasteluun kuvaaja- ja taulukkomuodossa. Sääaseman sovelluspalvelulta haetaan uusia mittauksia ajastetusti. Mittaustietojen päivittäminen ei vaadi käyttäjältä sivun uudelleenlataamista eikä myöskään häiritse sovelluksen käyttöä. Sovelluskehyksen lupaama selainriippumattomuus todettiin testaamalla käyttöliittymän toimivuus useammalla eri selaimella. jQueryn tarjoamien käyttöliittymäkomponenttien avulla käyttöliittymästä saatiin helppokäyttöinen ja tyylikäs. Työn tavoitteet saavutettiin siis kaikilta osin. Ennen käyttöliittymän käyttöönottoa sille tulisi suorittaa kattavampaa testausta useammilla selaimilla ja myös selainten vanhemmilla versioilla. Käyttökelpoisiksi todetut sovelluskehykset ja suurin osa niiden laajennuksista ovat vapaasti käytettävissä myös kaupalliseen käyttöön. Koneiden ja kenttälaitteiden kehittyessä selainkäyttöliittymien käyttömahdollisuudet erilaisten prosessien ja tuotannon valvomosovelluksissa lisääntyvät. JavaScript-sovelluskehyksiä voidaan hyödyntää esimerkiksi edellä mainittujen selainkäyttöliittymien toteuttamiseen, erityisesti vähemmän aikakriittisiin sovelluksiin, kuten tuotantoinformaation tarjoamiseen yrityksen joh- 30 dolle. Sovelluskehyksiä hyödyntävien selainkäyttöliittymien etuina ovat alusta- ja käyttöjärjestelmäriippumattomuus sekä oleellisesti perinteisiä työpöytäsovelluksia helpompi ylläpidettävyys. Sovelluksen käyttö ei näin ollen rajoitu enää tietyille koneille, vaan käyttöliittymä on tarpeen tullen käytettävissä millä tahansa laitteella josta löytyy yleisimpiä web-tekniikoita tukeva selain ja Internet-yhteys. 31 LÄHTEET [1] Stallings, W. Data and Computer Communications. 7. Edition. Upper Saddle River, 2004. Pearson Education. 847 p. [2] Peltomäki, J. & Nykänen, O. Web-selainohjelmointi. 1. painos. Porvoo 2006, WS Bookwell. 312 s. [3] World Wide Web Consortium [WWW]. [viitattu 24.5.2010]. Saatavissa: http://www.w3.org/ [4] Extensible Markup http://www.w3.org/XML/ Language [WWW]. [5] XML Tutorial [WWW]. http://www.w3schools.com/xml/ [viitattu [viitattu 3.5.2010]. 29.5.2010]. Saatavissa: Saatavissa: [6] Negrino, T. & Smith, D. Javascript – Tehokas hallinta. 1. painos. Jyväskylä 2007, Gummerus Kirjapaino Oy. 493 s. [7] Asleson, R. & Scutta, N.T. Ajax – Tehokas hallinta. Jyväskylä 2007, Gummerus Kirjapaino Oy. 273 s. [8] Hammond, D. Web browser DOM support [WWW]. [viitattu 6.5.2010]. Saatavissa: http://www.webdevout.net/browser-support-dom [9] Lastra, J.L.M. & Delamer, I.M. Automation 2.0: Current trends in Factory Automation. The IEEE International Conference on Industrial Informatics, DCC, Daejeon, Korea, 13.-16.7.2008. IEEE. pp.1321-1323. [10] Latest SOAP versions http://www.w3.org/TR/soap/ [WWW]. [viitattu 7.5.2010]. Saatavissa: [11] Web Services Description Language (WSDL) 1.1 [WWW]. [viitattu 8.5.2010] Saatavissa: http://www.w3.org/TR/wsdl [12] Vaisala ROSA Weather Station [WWW]. [viitattu 24.5.2010]. Saatavissa: http://www.vaisala.com/weather/products/rosa.html [13] Salonen, M. Vaisala Rosa -sääaseman etäkäyttö Telit GE863-GPS moduulin avulla [WWW]. [viitattu 7.5.2010]. Saatavissa: http://ae.tut.fi/research/AIN/Publications/Salonen_Mikko_-_ROSA_loppuraportti.pdf 32 [14] Mnkandla, E. About Software Engineering Frameworks and Methodologies. IEEE AFRICON, Nairobi, Kenia, 23.-25.9.2009. IEEE. pp.1-5. [15] Compare JavaScript Frameworks [WWW]. [viitattu 11.5.2010]. Saatavissa: http://www.ibm.com/developerworks/web/library/wa-jsframeworks/ [16] JavaScript Multipurpose Frameworks [WWW]. [viitattu 8.5.2010]. Saatavissa: http://ajaxpatterns.org/Javascript_Multipurpose_Frameworks [17] Ample SDK, open-source GUI framework [WWW]. [viitattu 12.4.2010]. Saatavissa: http://www.amplesdk.com [18] Dojo Toolkit [WWW]. [viitattu 13.4.2010]. Saatavissa: http://www.dojotoolkit.org/ [19] jQuery: The Write Less, Do More, JavaScript Library [WWW]. [viitattu 26.4.2010]. Saatavissa: http://jquery.com/ [20] Clientside Oy [WWW]. [viitattu 12.4.2010]. Saatavissa: http://www.clientside.fi/ [21] Ample SDK blog http://blog.amplesdk.com/ [WWW]. [viitattu 12.4.2010]. Saatavissa: [22] The GNU General Public License [WWW]. [viitattu 15.5.2010]. Saatavissa: http://www.gnu.org/licenses/gpl.html [23] Open Source Initiative OSI: The MIT License [WWW]. [viitattu 15.5.2010]. Saatavissa: http://www.opensource.org/licenses/mit-license.php [24] Dojo Toolkit Reference Guide [WWW]. [viitattu 13.4.2010]. Saatavissa http://www.dojotoolkit.org/reference-guide/index.html [25] jQuery project [WWW]. [viitattu 16.5.2010]. Saatavissa: http://jquery.org [26] JavaScript Usage Statistics http://trends.builtwith.com/javascript [WWW]. [viitattu 16.5.2010]. Saatavissa: [27] Highcharts [WWW]. [viitattu 26.4.2010]. Saatavissa: http://www.highcharts.com/ [28] Flot - Attractive Javascript plotting for jQuery [WWW]. [viitattu 26.4.2010]. Saatavissa: http://code.google.com/p/flot/ 33 [29] Flot Examples [WWW]. http://people.iola.dk/olau/flot/examples/ [viitattu 26.4.2010]. Saatavissa: [30] jqPlot – Pure JavaScript Plotting [WWW]. [viitattu 26.4.2010]. Saatavissa: http://www.jqplot.com/ [31] Browser Statistics [WWW]. [viitattu http://www.w3schools.com/browsers/browsers_stats.asp 17.5.2010]. Saatavissa: [32] Flexigrid – Web 2.0 JavaScript Grid for jQuery [WWW]. [viitattu 17.5.2010]. Saatavissa: http://flexigrid.info/ [33] Firefox Browser – Firefox Version Statistics [WWW]. [viitattu 29.5.2010]. Saatavissa: http://www.w3schools.com/browsers/browsers_firefox.asp 34 LIITE A: KÄYTTÖLIITTYMÄKUVAT Kuva A. Toteutetun sääaseman käyttöliittymän Etusivu-näkymä. 35 Kuva B. Toteutetun sääaseman käyttöliittymän Kuvaaja-näkymä. 36 Kuva C. Toteutetun sääaseman käyttöliittymän Taulukko-näkymä. 37 LIITE B: KÄYTTÖLIITTYMÄN HTML-MERKINTÄ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <script type="text/javascript" src="js/jqplot/excanvas.js" /> <link type="text/css" href="css/eggplant/jquery-ui-1.8.custom.css" rel="stylesheet" /> <script type="text/javascript" src="jquery.js" /> <script type="text/javascript" src="js/jquery-ui-1.8.custom.min.js" /> <script type="text/javascript" src="js/jqplot/jquery.jqplot.min.js" /> <link rel="stylesheet" type="text/css" href="js/jqplot/jquery.jqplot.css" /> <script type="text/javascript" src="js/flexigrid/flexigrid.js" /> <link rel="stylesheet" type="text/css" href="js/flexigrid/flexigrid.css" /> <script type="text/javascript" src="js/jqplot//plugins/jqplot.canvasTextRenderer.min.js" /> <script type="text/javascript" src="js/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js" /> <script type="text/javascript" src="js/jqplot/plugins/jqplot.dateAxisRenderer.min.js" /> <script type="text/javascript" src="js/jqplot/plugins/jqplot.categoryAxisRenderer.min.js" /> <script type="text/javascript" src="js/jqplot/plugins/jqplot.highlighter.js" /> <script type="text/javascript" src="js/saascript.js" /> </head> <body> <div id="main" align="center"> <!-- Valikko --> <div id="menu"> <form> <input type="radio" id="etusivu" name="radio" checked="checked" /> <label for="etusivu">Etusivu</label> <input type="radio" id="kuva" name="radio" /> <label for="kuva">Kuvaaja</label> <input type="radio" id="taulukko" name="radio" /> <label for="taulukko">Taulukko</label> </form> </div> <!-- Kehys jonka sisälle tulee kaikki tieto, kuvaajat yms --> <div id="kehys"> <div id="sisadiv"> <div id="kuvadiv" style="width:550px;height:330px;"></div> <div id="tauludiv"></div> <div id="topvalinta" class="menupos2"> <div> <button id="valinta"> <span class="ui-button-text"> Mittaukset ajalta: </span> </button> </div> <ul id="navi"> <li><a href="#" id="1h">1h</a></li> <li><a href="#" id="2h">2h</a></li> <li><a href="#" id="4h">4h</a></li> <li><a href="#" id="6h">6h</a></li> <li><a href="#" id="kaikki">kaikki</a></li> <li></li> </ul> 38 </div> <div id="tekstidiv"></div> </div> </div> <br /> <!-- Ajan kuluminen seuraavaan säätietojen hakuun --> <div id="lataus"> <div align="center" id="progressbar"></div> Seuraava päivitys </div> </div> </body> </html> 39 LIITE C: KÄYTTÖLIITTYMÄN JAVASCRIPT-KOODI (SAASCRIPT.JS) //"Etusivu"-näkymän sisällön luominen function etuSivu(){ var sisalto = '<br/><br/><img src="tty.gif"/>'+ "<h1>" + vastaus[99][1] + " C°</h1><br/>"+ "<p>Tämä sivu on toteutettu osana TTY:n Automaatiotekniikan"+ " koulutusohjelman kandidaatintyötä. Sivu toimii käyttöliitty"+ "mänä TTY:n Systeemitekniikan laitoksen sääasemaan, joka "+ "sijaitsee Sähkötalon katolla. Sää- asemaan liitetyltä"+ " web-sovelluspalvelulta on saatavissa sata viimeisintä lämpötila"+ "mittausta. Näitä mittauksia on mahdollista tarkastella"+ " käyttöliittymällä kuvaaja- ja taulukkomuodossa.</p><p>"+ "Käyttöliittymän toteutuksessa on käytetty "+ "<a href='http://jquery.com/'>jQuery</a>- JavaScript-sovelluskehystä, "+ "sekä sitä hyödyntäviä <a href='http://www.jqplot.com/'>jqPlot</a>- "+ "ja <a href='http://flexigrid.info/'>Flexigrid</a>-laajennuksia. Käyttö"+ "liittymän toimivuus on testattu Internet Explorer 8:lla sekä" + " Mozilla Firefox 3.6.3:lla.</p><br/>"; $("#tekstidiv").append(sisalto); } //Kasvatetaan kulunutta aikaa yhdellä sekunnilla sekä päivitetään progress baria function kasvatus(sekuntit){ kulunut++; prosentit = Math.floor(kulunut*100/sekuntit); if (prosentit != edellinen) { $("#progressbar").progressbar("option", "value", prosentit); edellinen = prosentit; } if(kulunut > sekuntit){ //Halutun ajan kuluttua sammutetaan ajastin ja väläytetään palkkia //sekä suoritetaan datan päivitys clearInterval(ajastin); $("#progressbar").effect('pulsate','',400); datanHaku(); } } //ajastus-funktio palauttaa truen kun aikaa on kulunut parametrina //saatujen sekuntien verran function ajastus(sekunnit){ asetusaika = sekunnit; kulunut = 0; prosentit = 0; edellinen = 0; //Kutsutaan ajankasvatusta sekunnin välein ajastin = setInterval("kasvatus(asetusaika);",1000); return true; } 40 //Funktio jossa luodaan käyttöliittymäelementit sivulle function luoElementit(){ //Päävalikon luominen $("#menu").buttonset(); $("#etusivu").click(function(){ etusivuSel(); }); $("#kuva").click(function(){ kuvaSel(); }); $("#taulukko").click(function(){ taulukkoSel(); }); //Piilottaa valikon klikatessa missä vaan $(document).click(function(){ $("#navi").hide(); }) // Progressbar $("#progressbar").progressbar({ value: 0 }); } //Luo kuvaajan ja taulukon annetusta mittausmäärästä function piirra(vastaus,maara){ piirraKuvaaja(vastaus,maara); piirraTaulukko(vastaus,maara); } //Luodaan valikko, josta valitaan piirrettäven datapisteiden määrä function luoPiirtoValikko(){ $("#valinta").button({ text: true, icons: { primary: "ui-icon-triangle-1-s" } }).click(function() { $("#navi").slideDown('fast').show(); $("#navi").hover(function(){}, function(){ $("#navi").slideUp('fast'); }); }) //alasvetovalikon tapahtumankäsittely $("#1h").click(function(){ datamaara=12; piirra(vastaus,datamaara);}); $("#2h").click(function(){ datamaara=24; piirra(vastaus,datamaara);}); $("#4h").click(function(){ datamaara=48; piirra(vastaus,datamaara);}); $("#6h").click(function(){ datamaara=72; piirra(vastaus,datamaara);}); $("#kaikki").click(function(){ datamaara=100; piirra(vastaus,datamaara);}); } //Funktiot valintapainikkeiden tominnallisuudelle: //-----------------------------------------------//Etusivu-painike function etusivuSel(){ $("#valinta").hide(); $("#tauludiv").hide(); $("#kuvadiv").fadeOut("",function(){ $("#tekstidiv").empty(); etuSivu(); 41 }); } //Kuvaaja-painike function kuvaSel(){ $("#topvalinta").removeClass('menupos1').addClass("menupos2"); $("#tekstidiv").empty(); $("#tauludiv").hide(); $("#kuvadiv").show(); $("#kuvadiv").effect('slide',[],[],function(){ lampoplot.redraw(); $("#valinta").show(); }); } //Taulukko-painike function taulukkoSel(){ $("#kuvadiv").fadeOut("",function(){ $("#valinta").hide(); $("#topvalinta").removeClass('menupos2').addClass("menupos1"); $("#valinta").show(); $("#tekstidiv").empty(); $("#tauludiv").show(); }); } //Tiedonsiirtoon liittyvät funktiot: //-----------------------------------------------//uusi ajastus function ajastusKierros(){ piirraKuvaaja(vastaus,datamaara); ajastus(15); } //Funktio joka tekee ajax-kyselyn sivun latauksen yhteydessä function alkuDatanHaku(){ $.ajax({ type: 'POST', url: 'http://192.168.0.1:8080/TVPAWS/services/WeatherService', dataType: "xml", data: '<?xml version="1.0"?><SOAP-ENV:Envelope xmlns:SOAP-ENV'+ '="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>'+ '<impl:request xmlns:tns1="http://schemas.ain.rd.tut.fi" ' + 'xmlns:impl="http://ain.rd.tut.fi">'+ '<tns1:amountOfmeasurements>100</tns1:amountOfmeasurements>'+ '</impl:request></SOAP-ENV:Body></SOAP-ENV:Envelope>', cache: false, beforeSend: function(xhr) { xhr.setRequestHeader("Content-Type", "text/xml"); xhr.setRequestHeader("SOAPAction", ""); }, success: function(xml) { $(xml).find("measurement").each(function(){ //luodaan vastauksen arvoista taulukko //joka lisätään vastaus-tauluun var pari = new Array; pari.push( $(this).find("ns1\\:timestamp").text().substring(0,16) ); pari.push( parseFloat($(this).find("ns1\\:value").text()) ); vastaus.push(pari); }); //Käännetään taulukon järjestys piirtämistä varten vastaus.reverse(); etuSivu(); }, error: function(xhr, status, errorThrown){ alert(errorThrown+", ei toimi"); } }); } 42 function datanHaku(){ $.ajax({ type: 'POST', url: 'http://192.168.0.1:8080/TVPAWS/services/WeatherService', dataType: "xml", data: '<?xml version="1.0"?><SOAP-ENV:Envelope xmlns:SOAP-ENV'+ '="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>'+ '<impl:request xmlns:tns1="http://schemas.ain.rd.tut.fi" ' + 'xmlns:impl="http://ain.rd.tut.fi">'+ '<tns1:amountOfmeasurements>1</tns1:amountOfmeasurements>'+ '</impl:request></SOAP-ENV:Body></SOAP-ENV:Envelope>', cache: false, beforeSend: function(xhr) { xhr.setRequestHeader("Content-Type", "text/xml"); xhr.setRequestHeader("SOAPAction", ""); }, success: function(xml) { $(xml).find("measurement").each(function(){ //luodaan vastauksen arvoista taulukko //joka lisätään vastaus-tauluun var pari = new Array; pari.push( $(this).find("ns1\\:timestamp").text().substring(0,16) ); pari.push( parseFloat($(this).find("ns1\\:value").text()) ); vastaus.shift(); vastaus.push(pari); }); } }); } //Funktio taulukon luomista varten function piirraTaulukko(taulukko,maara){ var eka_alkio = 100 - maara; var datasarja = taulukko.slice(eka_alkio); datasarja.reverse(); $("#tauludiv").empty(); $("#tauludiv").append('<table id="taulu" style="display:none"></table>'); //luodaan sisältö piirrettävään taulukkoon $("#taulu").append("<tbody>"); $.each(datasarja, function(index,arvo){ var rivi = "<tr><td>" + arvo[0] + "</td><td>" + arvo[1] + "</td></tr>"; $("#taulu").append(rivi); }); $("#taulu").append("</tbody>"); //Luodaan flexigrid-taulukko tavallisesta #taulu-taulukosta $("#taulu").flexigrid({ //asetukset lämpötilataulun luomiseen colModel : [ {display: 'Aika', name : 'aika', width : 100, align: 'center'}, {display: 'Lämpötila C°', name : 'lampo', width : 60, align: 'center'} ], sortname: "aika", sortorder: "desc", title: 'Lämpötilamittaukset', width: 220, height: 309 }); } 43 //Funktio kuvaajan piirtämistä varten function piirraKuvaaja(taulukko,maara){ var otsikko = "Viimeisimmät " + maara + " mittausta:"; var eka_alkio = 100 - maara; //Luodaan kuvaajan piirtoa varten uusi taulukko joka on osa täyttä arvotaulua var datasarja = taulukko.slice(eka_alkio); //Tarkistetaan pienin ajan arvo ja päätetään sen perusteella kuvaajan aloitusaika //ensimmäistä arvoa edeltäväksi tasatunniksi tai puoleksi var alkuaika = datasarja[0][0].substring(0,14); var eka_mit_min = parseFloat(datasarja[0][0].substring(14,16)); //kuvaajan taustaruudukon piirtoväli var piirtotiheys = '0.5 hour'; //Piirretään tiheämpi taustaristikko pienemmälle datamäärälle if(maara < 25){ piirtotiheys = '0.25 hour'; } //valitaan mistä arvosta kuvaajan x-akseli alkaa if (eka_mit_min >= 45 && maara < 25) { alkuaika = alkuaika + "45"; } else if(eka_mit_min >= 30){ alkuaika = alkuaika + "30"; } else if(eka_mit_min >= 15 && maara < 25){ alkuaika = alkuaika + "15"; } else{ alkuaika = alkuaika + "00"; //aloitetaan tasatunnilta } //asetukset kuvaajan piirtämiseen plot_asetukset = { title: otsikko, axes: { xaxis: { min: alkuaika, max:datasarja[maara-1][0], renderer: $.jqplot.DateAxisRenderer, rendererOptions: { tickRenderer: $.jqplot.CanvasAxisTickRenderer }, tickNumber: 10, tickOptions: { formatString: '%H:%M', angle: -45, show: true }, tickInterval: piirtotiheys } }, highlighter: { tooltipOffset: 2, show: true, formatString: '<table class="jqplot-highlighter"><tr><td>Aika:</td>' + '<td>%s</td></tr><tr><td>Lämpö:</td><td>%s C°</td></tr></table>' } }; //poistetaan vanha kuvaaja ja piirretään uusi $("div#kuvadiv").empty(); lampoplot = $.jqplot("kuvadiv", [datasarja], plot_asetukset); } 44 /* * ----------------------------------------------------------------------* TÄSTÄ ALKAA VARSINAINEN OHJELMA, JOSSA KUTSUTAAN YLLÄ OLEVIA FUNKTIOITA * ----------------------------------------------------------------------*/ //Ensimmäiseen tiedonhakuun tarvittavat funktiot var vastaus = new Array; var lampoplot = null; var plot_asetukset = null; var datamaara = 100; //Dokumentin latauduttua suoritetaan: $(document).ready(function(){ //jQuery käyttöliittymäelementtien luominen: valikko ja latauspalkki luoElementit(); luoPiirtoValikko(); //Funktio joka suoritetaan, kun ajax-pyyntö on suoritettu loppuun $(document).ajaxComplete(function(){ //Kutsutaan funktiota kuvaajan piirtämistä varten. //Kutsu tehdään aina kun ajastus päättyy. Jos käyttöliittymässä ei ole //Kuvaaja-näkymä valittuna, kuvaaja piirtyy piilotettuun div-elementtiin piirraTaulukko(vastaus,datamaara); piirraKuvaaja(vastaus,datamaara); //Käynnistetään ajastus seuraavaan lämpötilan hakuun ajaxilla ajastus(300); //ajastus viiden minuutin päähän }); //Haetaan sääaseman mittaukset ajax:illa alkuDatanHaku(); });
© Copyright 2024