Climbing time IIZO3030, IIO11100, IIM50300 Pekka Melgin H3173 Aleksi Olkkonen H4198 Loppuraportti 4.2015 Ohjelmistotekniikan koulutusohjelma Tekniikan ja liikenteen ala
1 Sisältö 1 Johdanto... 3 2 Yleiskuvaus... 3 2.1 Sovelluksen kuvaus... 3 2.2 Ongelma... 4 3 Toteutus... 5 3.1 Vaatimusmäärittely... 5 3.2 Suunnittelu... 6 3.3 Tietokannan suunnittelu ja luonti... 7 3.4 Koodaaminen... 7 3.5 Sovelluksen kokonaisrakenne... 9 3.6 Funktiot ja luokat... 9 3.7 Työnjako... 9 4 Ongelmat... 10 5 Lähdekoodi... 10 6 Itsearvio... 11 6.1 Tietokannat... 11 6.2 Palvelinohjelmointi... 11 6.3 Ohjelmistosuunnittelu... 12 Liitteet... 13 Liite 1. Prototyypit/mockup... 13 Liite 2. Käsitemalli... 16 Liite 3. Luokkamalli... 17 Liite 4 Sekvenssikaavio suorituksen lisäämisestä... 17
Liite 5 Sekvenssikaavio sisäänkirjautumisesta... 18 2 Liite 6 Sekvenssikaavio uloskirjautuminen... 18 Liite 7 Sekvenssikaavio reitin lisäämisestä palveluun... 19 Liite 8 Kokonaisrakenteen kuvaus... 19 Liite 9 Commit historia... 19
3 1 Johdanto Tämä dokumentti liittyy Jyväskylän Ammattikorkeakoulun opintojaksojen IIZO3030 Tietokannat, IIO11100 Ohjelmistosuunnittelu sekä IIM50300 palvelinohjelmointi loppudokumentointiin Harjoitustyön tavoitteena on tutustuttaa opiskelija www-palvelinsovelluksen toteuttamisen periaatteisiin ja rajoitteisiin. Osaa toteuttaa tietokantaratkaisuun pohjautuvan www-palvelinsovelluksen ja osaa hyödyntää palvelinohjelmien ominaisuuksia sovelluskehityksessä. Ymmärtää tietokantajärjestelmän yleisen rakenteen ja toimintaperiaatteen, osaa luoda ja suunnitella tietokannan sekä osaa käyttää tietokantaa. Tuntee ohjelmistosuunnittelun eri vaiheet sekä keskeiset käsitteet ja yleisesti käytetyt toimintatavat ja kuvauskielet. Harjoitustyöhön kuuluu suunnitelma joka toteutettiin ohjelmistosuunnittelu-opintojakson vaatimusten mukaisesti. Laaja ja kattava tietokanta suunniteltiin ja toteutettiin Tietokannat-opintojakson harjoitustyönä. Palvelinohjelmointi-opintojaksossa tuotettiin varsinainen sovellus. Tässä dokumentissa käytetään termiä crag osoittamaan luonnosta löytyviä kalliomuodostelmia tai isoja lohkareita jotka voivat sisältää yhden tai useampia reittejä. 2 Yleiskuvaus 2.1 Sovelluksen kuvaus Tuotettava ohjelmisto on selaimessa toimiva palvelu, jonka tarkoituksena on toimia kiipeilyharjoittelun seurannan apuna. Käyttäjä voi rekisteröityä palveluun joka mahdollistaa omien harjoituskertojen tietojen tallennuksen palvelimelle omaksi ja muiden nähtäväksi. Harjoituskertoja voi tallentaa sekä sisällä, että ulkona suoritettavaan harjoitteluun. Palvelusta löytyy ulkoa löytyviä crageja jotka sisältää reittejä. Käyttäjä
pystyy myös lisäämään omia löytämiään reittejä sekä crageja palveluun, joita käyttäjät voivat kiivetä. Näitä pystyy myös selaamaan. 4 Palvelun käyttöympäristönä toimii Internet-selain. Tämä mahdollistaa palvelun käyttämisen monella eri laitteella käyttöjärjestelmästä sekä näytön resoluutiosta riippumatta. Tällä hetkellä palvelu on optimisoitu vain mobiilikäyttöön. Palvelun tarvittavan toiminnalisuuden tuottamiseen käytettiin seuraavia teknologiota/työkaluja: - Palvelimena toimii LAMMP-pohjainen(LAMP+MongoDB) Ubuntu 14.04.2 LTS osoitteessa: www.climbingti.me - Apache versio: 2.4.7 - PHP versio: 5.5.9 - Tietokannnanhallintajärjestelmänä toimii MariaDB 10.0.17 - MongoDB 3.0.0 - HTML5 & CSS3 - Jquery 2.1.3 - Google Maps Javascript API V3 - Google maps Geolocation-marker extension/plugin - Chart.js - Image.class.php Manuel Reinhard, manu@sprain.ch 2.2 Ongelma Kynä ja paperi liian työlästä ja hidasta käyttää, huono käyttöliittymä. Paperille liian vaikea laittaa tietoa ylös, pitää ajatella enemmän. Statistiikan kerääminen paperille talletetuista tiedoista on äärimmäisen vaikeaa sekä työlästä. Ei ole olemassa tarvittavaa sovellusta. Kaikilla on joko puhelin tai tietokone. Webbi-pohjaiset palvelut/softat isossa nousussa. Nyky-aikana kaikki on puhelimessa tai netissä.
5 3 Toteutus 3.1 Vaatimusmäärittely Kiipeilyreenikerrat joutuu kirjoittamaan kynällä paperille. Nykypäivänäkään ei ole vielä olemassa kunnollista palvelua johon voisi kirjoittaa omat reenit muistiin. Ohjelmalla ratkaistaan kiipeilyn harjoittelemisen datan tilastointi. palvelun/ohjelman ominaisuudet: - profiili(käyttäjätunnukset yms.) - suoritukset - reitit - topatut reitit - yritykset - reittien greidaus - fingerboard pidot - muiden käyttäjien profiilien selaaminen ja kommentointi - reittien paikkojen merkitseminen - statistiikka - kuvien lisääminen User storyt: - käyttäjänä haluan tallentaa suoritukseni nettiin (topatut reitit, yritysten määrä, fingerboard pidot, campus (metolius(4inch), moon spacing (the standard 22cm)), sis. reittien greidit, otetyypit esim. krimppi, slope jne. ) - käyttäjänä haluan selata aikaisempia suorituksiani - käyttäjänä haluan nähdä suoritusteni statistiikkoja - käyttäjänä haluan nähdä muiden käyttäijen suorituksia - käyttäjänä haluan merkata reittejä mitä olen löytänyt/luonnosta löytyneitä reittejä - käyttäjänä haluan myös rekisteröityä palveluun jotta tietoni tallentuisivat palveluun - käyttäjänä haluan ehdotuksia reiteistä jotka voisivat olla minulle sopivia
fdgff fff ff fff ff fff ff fff fff ff fff ff fff ff fff fff 6 - käyttäjänä haluan katsoa muiden käyttäjien profiileja - käyttäjänä haluan voida ehdottaa jo entuudestaan mentyjen reittien greidauksia - käyttäjänä haluan lisätä kuvia palveluun - vierailijana haluan selata palveluun lisättyjä reittejä - vierailijana haluan kokeilla palvelua ensin ilman rekisteröitymistä 3.2 Suunnittelu Projektin toteutuksessa käytettiin aluksi Google Drivea säilyttämään lähdekoodit. Työn edetessä huomattiin tämän ratkaisun täydellinen sopimattomuus sovelluskehitykseen, joten siirryttiin nopeasti käyttämään Gittiä versionhallintana. Projekti aloitettiin määrittelemällä sovelluksen tärkeimpien toimintojen vaatimukset, muun muassa user storyja hyväksikäyttäen. User storyja miettittiin projektin toteuttajien (innostuneita kiipeilijöitä) omien toiveiden pohjalta. Suunnittelun alkuvaiheessa laadittiin myös alustavia käyttöliittymäprototyyppejä. kuvio 1 prototyyppimalleja. Näiden jälkeen aloitettiin luokkamallien suunnitteleminen. Tässä vaiheessa huomattiin että nykyisillä taidoilla luokkien suunnitteleminen etukäteen osoittautui erittäin
7 hankalaksi, joten tehtiin päätös suunnitelman täydentämiseen toteuttamisen lomassa, ja siirryttiin tietokannan suunnitteluun ja luontiin. 3.3 Tietokannan suunnittelu ja luonti Käsiteanalyysi suoritettiin aluksi ja se löytyy täältä. Tietokannan suunnittelussa ei ilmennyt projektia seisauttavia ongelmia. Kannasta tuli laaja sekä kattava. Suunnittelussa huomattiin suoritusten merkkaamiseen vaadittavien taulujen rakenteet olivat hyvin yhdenmukaisia toistensa kanssa. MariaDB:ssä tauluja olisi tullut neljä (4) kappaletta joiden kentät olisivat olleet identtisiä yhtä tai paria saraketta lukuunottamatta. Päädyttiin ratkaisuun suoritusten säilyttämiseen MongoDB:ssä. kuvio 2 tietokannan yleisrakenne kuvattuna. 3.4 Koodaaminen Projektin koodaaminen aloitettiin tuottamalla ensin prototyyppien mukaisesti layoutit sovellukselle. Tämä vaati monia työtunteja HTML:n, CSS:n ja JavaScriptin kanssa. Front-end puolen valmistumisen jälkeen alettiin työstämään Back-endiä. Tämä toteutettiin käyttämällä php-ohjelmointikieltä ja sen versiota 5.5.9.
8 Sovellus toteutettiin olio-ohjelmoinnin periaatteita hyödyntäen ja soveltaen. PHP:n ja MariaDB:n yhteydet toteutettiin PDO-ajuria käyttäen, ja kaikki sql-kyselyt suojattiin sql-injektiolta parametrisouduilla kyselyillä. MongoDB:n yhteydet hoidettiin käyttämällä PHP:n mongo-driver-moduulia. Kuvio 3 luokkamalli valmiista sovelluksesta.
9 3.5 Sovelluksen kokonaisrakenne kuvio 4 funktioiden suhteet toisiinsa sekä tietokantoihin 3.6 Funktiot ja luokat Funktioiden kommentointi hoidettiin PHPdocilla. Kyseisen dokumentoinnin näkee seuraavasta linkistä. Myös lähdekoodia voi tarkastella PHPdocin kautta. http://climbingti.me/phpdoc/climbphpdoc.html 3.7 Työnjako Työtä tehtiin yhteistyössä pääasiassa koulun tarjoamissa tiloissa, eikä erillisiä vastuualueita suunnitteluvaiheessa määritelty. Näiden yhteistyötyöskentelyjen lisäksi projekti eteni silloin tällöin myös projektin jäsenten omatoimisella työskentelyllä. Projektin alussa tuntimääristä pidettiin kirjanpitoa, mutta työskentelyn edetessä tämä jäi
10 vähemmälle huomiolle. Kaiken kaikkiaan projektiin kului aikaa noin 14 viikkoa yhtämittaista työskentelyä. Githubin commit-historiasta näkee työn etenemisen (yhteistyötyöskentelyjen commitit merkattiin Aleksi Olkkonen-käyttäjällä), katso liite 9. 4 Ongelmat Ongelmia tuli yhdellä taululla oli kolme vaihtoehtoista kohdetta. Ratkaisu vaihtoehtoina oli laittaa kaikki Foreign key:t not not nulliksi, toisena oli laittaa välitaulut jokaiseen kohtaan. Päädyttiin käyttämään välitauluja. Toisena ongelmana tuli suoritustietojen säilyttäminen MariaDB:ssä. Mariassa tauluja olisi tullut neljä (4) kappaletta joiden kentät olisivat olleet identtisiä yhtä tai paria saraketta lukuunottamatta. Päädyttiin siihen tulokseen että kaikki suoritustiedot säilytetään MongoDB:ssä. 5 Lähdekoodi Lähdekoodi on luettavissa php-highlighterin avulla seuraavista osoitteista: www.climbingti.me/highlighter.php www.climbingti.me/classes/highlighter.php www.climbingti.me/ajax/highlighter.php www.climbingti.me/includes/highlighter.php Palvelimelle on tehty testikäyttäjä, ara:pokemon666ara, jolla pääsee tarkastelemaan tiedostorakennetta ja selaamaan kaikkia tiedostoja. Sivu löytyy palvelimelta polusta /var/www/html.
11 6 Itsearvio 6.1 Tietokannat Pekka Melgin: 5 Paljon tauluja ja vielä enemmän yhteyksiä niiden välillä. MongoDB:n integrointi harjoitustyöhön. Aleksi Olkkonen: 5 Paljon tauluja ja vielä enemmän yhteyksiä niiden välillä. MongoDB:n integrointi harjoitustyöhön. Tietokanta suunniteltu yhdessä aivoriihessä. 6.2 Palvelinohjelmointi Pekka Melgin: 4 Aleksi Olkkonen: 4 Virheiden käsittely suurimmilta osilta puuttuu sekä syötteiden tarkistaminen koska aika alkoi loppumaan. Projektin parissa työskenteltiin jatkuvasti loppuun asti ominaisuuksia lisäillen ja parannellen, tietyt ominaisuudet ja toiminnot jäivät puuttumaan ainoastaan ajanpuutteen vuoksi. PHP:n koodaaminen kaiken kaikkiaan sujui kivutta.
12 6.3 Ohjelmistosuunnittelu Pekka Melgin: 3 Aleksi Olkkonen: 3 Vaatimusmäärittelyn tekeminen onnistui hyvin, ongelmat ilmenivät luokkamallin suunnittelemisessa, projektin laajuuden sekä ohjelmistosuunnittelun vähäisen kokemuksen vuoksi. Tästä johtuen luokkamallia suunniteltiin koodaamisen yhteydessä. Loppujen lopuksi kaikki vaadittavat dokumentit saatiin tuotettua.
13 Liitteet Liite 1. Prototyypit/mockup
14
15
Liite 2. Käsitemalli 16
17 Liite 3. Luokkamalli Liite 4 Sekvenssikaavio suorituksen lisäämisestä
18 Liite 5 Sekvenssikaavio sisäänkirjautumisesta Liite 6 Sekvenssikaavio uloskirjautuminen
19 Liite 7 Sekvenssikaavio reitin lisäämisestä palveluun Liite 8 Kokonaisrakenteen kuvaus Liite 9 Commit historia katso commit_historia.png