Tietokantasovellus Antti Myyrä 014012055 Tietojenkäsittelytieteen laitos Helsingin Yliopisto Postininjojen havaintopalvelu 1. Johdanto Järjestelmän tarkoituksena on toimia postininjojen havainnoista ilmoittamisille, havaintojen erityispiirteiden raportoinnille sekä aiempien havaintojen selaamiselle. Postininjat ovat Itellan (ent. Posti) tavarantoimituksen erikoisjoukkoja, joita on vuosikaudet koulutettu lähes äänettömään ja näkymättömään liikkumiseen. Usein ainoa merkki postininjasta on havaitsijalle ovesta tullut lappu tai merkintä sähköiseen järjestelmään saapuvan lähetyksen toimitusyrityksestä vaikka olisi ollut kotona odottamassa saapuvaa pakettia. Yksi tiedustelu ja keskustelua postininjoista löytyy mm. erään havaitsijan kertomuksesta osoitteesta https://www.facebook.com/posti.fi/posts/551563268210869. Lukuisista havainnoista huolimatta postininjojen määrää ja levinneisyyttä ei kuitenkaan tunneta eikä ole tietoa keskittyvätkö ninjat erityisesti kaupunkeihin vai haja-asutusalueille. Luotavan järjestelmän tavoitteena onkin auttaa kokonaiskuvan muodostamisessa ja alustavan tietopohjan kokoamisessa myöhempää tutkimusta varten. Työ toteutetaan Apache-palvelinympäristössä käyttäen ohjelmointikielenä PHP:ta ja tietokantana MySQL:ää. Ympäristö ei ole Tietojenkäsittelytieteen laitoksen, vaan oma palvelimeni. PHP:n valitsin kieleksi sen vuoksi että ratkon lähes päivittäin työssäni erilaisia PHP:hen liittyviä koodiongelmia, mutten ole ikinä itse toteuttanut tällä kielellä mitään. Korkea aika siis aloittaa. Erillisiä frameworkkejä (esim. Zend) en aio käyttää. Selaimelta vaaditaan Javascript-tukea, sillä osa havaintojen visualisoinneista esitetään käyttäen Google Maps APIn avulla luotuja karttoja, jotka luodaan juuri Javascriptin avulla. Sivuston muotoilujen vuoksi selaimessa on oltava myös CSS-tuki.
Palvelimelta vaaditaan web-palvelimen lisäksi asennettuna PHP-tulkki sekä MySQL-tietokanta. Palvelu on helposti siirrettävissä toisaalle kloonaamalla Github-repositorion, määrittämällä uudella palvelimella tietokannan asetukset ja siirtämällä tietokantadumpin uudelle tietokantapalvelimelle. 2. Yleiskuva järjestelmästä Käyttötapauskaavio Kuva 1, Käyttötapauskaavio Käyttäjäryhmät Vierailija Vierailijalla tarkoitetaan ketä tahansa erikseen rekisteröitymätöntä sivuilla kävijää. Vierailijoita ovat myös sivuilla saapuvat rekisteröityneet kävijät, jotka eivät ole vielä kirjautuneet sisään.
Käyttäjä Käyttäjä on sivustolle rekisteröitynyt ja sisään kirjautunut kävijä. Käyttäjä voi kirjata havaintoja ja kommentoida nykyisiä. Myös ylläpitäjät ovat sivuston käyttäjiä. Ylläpitäjä Ylläpitäjä on sivuston hallinnoija, joka voi poistaa väärät havainnot ja valvoo keskustelua. Käyttötapauskuvaukset Vierailijan käyttötapaukset Havaintojen selaus: Kuka tahansa sivustolla kävijä voi selata havaintoja ajankohdan tai paikkakunnan perusteella sekä tarkastella havaintoihin tehtyjä kommentteja sekä niihin liitettyjä kategorioita. Muita käyttötapauksia: rekisteröityminen, kirjautuminen Käyttäjän käyttötapaukset Havaintojen kirjaus: Käyttäjät voivat kirjata järjestelmään havaintojaan. Havaintoon kirjataan sijainnin lisäksi ajankohta sekä siihen mahdollisesti liittyvät kategoriat (ns. tagit) Havaintojen kommentointi: Havaintoihin voi kirjoittaa kommentteja havainnon tarkentamiseksi tai kyseenalaistamiseksi. Kommentit mahdollistavat myös keskustelun havainnoista ja niihin liitetyistä kategorioista. Omien tietojen muokkaaminen: Käyttäjällä on tiedoissaan mm. nimi ja salasana, joita on mahdollista muokata. Myös ylimääräiset käyttäjätiedot, kuten kuva ja käyttäjän kuvaus itsestään, on mahdollista lisätä myöhemmin. Kategorioiden lisäys, poisto ja muokkaus: Havaintoihin liittyviä kategorioita on mahdollista lisätä, poistaa ja muokata myös havainnosta käytävän keskustelun edetessä. Havaintoon voidaan
esimerkiksi liittää Epävarma -kategoria mikäli havaintopaikkakunnalla tai sen läheisyydessä ei ole aiemmin tehty postininjahavaintoja. Ylläpitäjän käyttötapaukset Havaintojen poistaminen ja muokkaus: Ylläpitäjän on mahdollista poistaa vääriä havaintoja tai muokata havainnon sijaintia mikäli se on alunperin virheellinen. Poistettaessa poistuvat myös havaintoon liittyvät kommentit. Kommenttien poistaminen ja muokkaus: Ylläpitäjä voi poistaa havaintoihin tehtyjä asiattomia kommentteja tai tarvittaessa muokata niitä esimerkiksi kirjoitusvirheiden tai kirosanojen poistamiseksi. Käyttäjien poistaminen ja muokkaus: Ylläpitäjä voi poistaa häiriköivän käyttäjän tai tietojensa poistoa pyytäneen käyttäjän. Poistettaessa käyttäjän tekemät havainnot ja lisäämät kommentit eivät kuitenkaan välttämättä poistu. 3. Järjestelmän tietosisältö Kuva 2, Käsitekaavio
Tietokohde: Käyttäjä Attribuutti Arvojoukko Kuvailu id Kokonaisluku Käyttäjän numeerinen tunniste Nimi Merkkijono, max. 64 Käyttäjän nimi tai nimimerkki (kumpaa tahtookaan käyttää) Salasana Merkkijono, max. 256 Käyttäjän salasana, joka on salattu hajauttamalla ja ylimääräisellä satunnaismerkkijonolla (salt) Salt Merkkijono, max. 32 Satunnaismerkkijono, jolla hajautuksesta saadaan varmempi Kuvaus Merkkijono, max. 512 Käyttäjän kuvaus itsestään Tyyppi Kokonaisluku Käyttäjän status (1: käyttäjä, 2: ylläpitäjä) Käyttäjät ovat palvelun sisällöntuottajia. Käyttäjä voi lisätä omia uusia havaintoja, kommentoida omia ja muiden havaintoja sekä lisätä havaintoihin kategorioita (ns. tageja). Tietokohde: Havainto Attribuutti Arvojoukko Kuvailu id Kokonaisluku Havainnon numeerinen tunniste Havaitsija Kokonaisluku Havaitsijan numeerinen tunniste (käyttäjän id) Aika Ajankohta Havainnon ajankohta Sijainti Merkkijono, max. 32 Paikkakunta Merkkijono, max. 32 Otsikko Merkkijono, max. 32 Kuvaus Merkkijono, max. 1024 (24-04-2014 14:23:15) Havainnon sijainti, Googlen Maps API:n koordinaatit Koordinaateista saatu paikkakunta Havaitsijan havainnolle antama otsikko Havaitsijan havainnon tarkempi kuvailu
Postininjoista tehdyt havainnot ovat palvelun sisältö, jonka ympärille muut toiminnot rakentuvat. Havaintoon kirjataan havainnon ajankohta, havaintopaikka sekä tarkempi kuvaus havainnosta. Havaintoa voi myös kommentoida ja siihen voi lisätä kategorioita. Tietokohde: Kommentti Attribuutti Arvojoukko Kuvailu id Kokonaisluku Kommentin numeerinen tunniste Havainto Kokonaisluku Havainnon, johon kommentti liittyy, numeerinen tunniste (id) Kommentoija Kokonaisluku Kommentoijan numeerinen tunniste (id) Aika Ajankohta Kommentin ajankohta (2014-04-24 14:23:15) Kommentin sisältö Kommentti Merkkijono, max. 512 Havaintomuokkaus Totuusarvo Merkintä onko kyseessä ko. havaintoon tehty muokkaus, esim. lisätty kategoria Kommenttiin liittyvät niin kommentoija kuin myös kommentoitava havainto, sekä kommentin ajankohta. Kommentista löytyy sen sisällön lisäksi vielä totuusarvo Havaintomuokkaus, joka kuvaa kertooko kommentti jostain havaintoon tehdystä muokkauksesta (esim. kategorian lisäyksestä), jolloin kommenttia käsitellään hiukan eri tavalla. Tietokohde: Kategoria Attribuutti Arvojoukko Kuvailu Id Kokonaisluku Kategorian numeerinen tunniste Kategorian nimi Nimi Merkkijono, max. 32 Pisteet Kokonaisluku Kategoriasta saatavat pisteet, joilla voi antaa havainnoille pisteytyksiä
Kategoriat ovat niinsanottuja tageja, joilla voidaan paremmin hahmottaa havainnon samankaltaisuutta muihin havaintoihin nähden. Havaintojen erityispiirteitä voidaan näin paremmin dokumentoida ja vertailla näitä muihin samoja kategorioita saaneisiin havaintoihin. Tietokohde: Havaintokategoria Attribuutti Arvojoukko Kuvailu Havainto Kokonaisluku Havainnon numeerinen tunniste (id) Kategoria Kokonaisluku Kategorian numeerinen tunniste (id) Havaintokategoriat ovat apuväline many-to-many-relaation toteuttamiseen havaintojen ja kategorioiden välillä. Tästä tietokantataulusta voidaan hakea joko tiettyyn havaintoon liittyvät kategoriat tai vaihtoehtoisesti tiettyyn kategoriaan liittyvät havainnot. 4. Relaatiotietokantakaavio Kuva 3, Relaatiokaavio
5. Järjestelmän yleisrakenne Järjestelmä on toteutettu kurssin suositteleman MVC-mallin mukaisesti. Kontrollerit sijaitsevat juurihakemistossa, näkymät hakemistossa views ja mallit hakemistossa libs/models. Muut järjestelmän käyttämät yleistiedostot, kuten tietokantayhteyteen liittyvät seikat, löytyvät libs-hakemiston tiedostosta yleiset.php. Tietokanta-asetukset löytyvät libs-hakemistosta tiedostosta authconf.php. Järjestelmässä käytetään javascriptiä Googlen karttojen generointiin mm. etusivulla ja havaintoa lisättäessä. Muuten järjestelmä on PHP:ta, ja HTML:ää sekä CSS-muotoiluja käytetään vain näkymissä. Järjestelmä käyttää istuntoja tallentaessaan kirjautuneen käyttäjän sessiontauluun nimellä kirjautunut. 6. Käyttöliittymä Kuva 4, Käyttöliittymäkaavio
Käyttöliittymäkaaviosta löytyy suurempi versio työn dokumentaatiokansiosta. Kaavion lisäksi käyttöliittymään kuuluu myös navigaatiopalkki, josta löytyy pääsy etusivulle, havaintoihin, kirjautuneille omiin käyttäjätietoihin sekä ylläpitäjän tapauksessa vielä erilliseen ylläpitonäkymään. 7. Asennustiedot Asennus aloitetaan kopioimalla järjestelmän tiedostot haluttuun kansioon. Tämä onnistuu helpoiten esim. lataamalla pakatun zip-tiedoston osoitteesta https://github.com/ajmyyra/postininjat/archive/master.zip ja purkamalla tämän ko. kansioon. Ympäristön MySQL:n versiolla ei ole väliä(suosituksena silti 5.5), mutta PHP:n on oltava versio 5.5 tai uudempi. Kun tiedostot on purettu, on oikeat tietokanta-asetukset määritettävä vielä tiedostoon auth-conf.php hakemistosta libs. Esimerkkitiedosto löytyy samasta hakemistosta nimellä auth-conf.php.example. Kun asetukset ovat kunnossa, täytyy alustaa vielä tietokanta. Tarvittavat tiedostot tähän löytyvät sql-kansiosta. Ensin ajetaan tiedoston createtables.sql sisältö ja tämän jälkeen tiedosto add-initial-data.sql. Tämä alustaa tarvittavan kannan ja lisää sinne ylläpitotunnuksen käyttäjänimellä admin ja salasanalla n6#oa+9w (molemmat ilman -merkkejä). Sekä käyttäjänimi että salasana kannattaa muuttaa sisäänkirjautumisen jälkeen joksikin toisiksi. Tämän jälkeen voit aloittaa järjestelmän käytön. Mene selaimella kansioon johon järjestelmän tiedostot purit, luo tunnus ja ala kirjaamaan havaintoja. 8. Käynnistys- ja käyttöohje Järjestelmä löytyy oletustunnuksin osoitteesta http://ninjat.derppaus.info. Oletuskäyttäjää ei ole, mutta tällaisen voi hyvin luoda rekisteröitymällä. Ylläpitäjän tunnukset löytyvät kappaleesta Asennustiedot. Itse järjestelmän käyttö on helppoa. Ja sivulta toiselle navigointi onnistuu näppärästi sivun ylälaidassa olevan menun avulla. Ylläpitäjällä on tavalliseen käyttäjään nähden hiukan ylimääräisiä valintoja, mutta nämä ovat helppoja ymmärtää. Esimerkiksi käyttäjän poistaminen onnistuu tämän tietojen muokkauksesta (johon pääsee hallinnan käyttäjälistauksen kautta).
9. Testaus, tunnetut bugit ja puutteet sekä jatkokehitys Järjestelmää on testattu joukkoistettuna tuttujen kesken (Nixun penetraatiotestaajalle on aina hyvä uhota että järjestelmä on täysin varma. Ei ollut), sekä sqlmap-työkalulla (http://sqlmap.org), joka on ajettu automatisoidusti sovellusta vasten aina uuden pushin yhteydessä tuotantoon. Syötteet on pyritty tarkistamaan varmuuden vuoksi useassa kohtaa: sekä tietokantaan tallennettaessa että sivuja näyttäessä. Järjestelmässä ei ole tunnettuja bugeja, mutta uusia ominaisuuksia olisi vielä lisättävänä ja käytettävyyttä paranneltavana. Esimerkiksi paikkakunnan voisi havaintoa kirjattaessa hakea suoraan sijaintitiedosta eikä sitä tarvitsisi erikseen kirjoittaa. Kategorioissa jo nyt olevat pisteet jäävät tällä hetkellä vielä käyttämättä, eikä niillä voi esimerkiksi listata eniten pisteitä saaneita havaintoja. Samoin sijaintidata jää etusivun karttaa lukuunottamatta monin paikoin hyödyntämättä (esim. läheisten havaintojen näyttäminen). Näitä on tarkoitus lisätä mikäli sovellus saa käyttäjiä. 10. Omat kokemukset Aloittaessani tietokantasovellustani en ollut ikinä koodannut yli kolmea riviä PHP:ta. Projekti olikin siis melkoinen sukellus syvään päähän, mutta uskoisin tämän aikana oppineeni merkittävästi lisää PHP:sta sekä Googlen Maps APIsta ja hiukan lisää myös Javascriptistä ja SQL:stä. Kurssi oli melko työläs, mutta todella mielenkiintoinen! Nyt pystyn tarvittaessa luomaan kaikenlaista webissä toimivaa. Ensi kerralla aion tosin käyttää apuna jotakin frameworkkiä. Ongelmien kannalta kurssin irkkikanava oli todella hyödyllinen lähde ja täältä sai apua joskus myös yön pimeinä tunteina. Samoin myös assari auttoi pyydettäessä, joten en kokenut olevani ongelmieni kanssa yksin. Erityisen hyvänä koin kurssia varten pystytetyn Advanced Kittenry sivuston. Ilman näitä olisin voinut olla hyvin hukassa.