Tämä on informaatioverkostojen studio 1 -kurssin Juho Ojalan ohjelmointiprojektin loppuraportti.
1. Kohdeohjelman yleiskuvaus
1.1 Ohjelman toiminnallisuus
1.2 Ohjelman käyttöliittymä
2. Tekninen toteutus
2.1 Yleisperiaatteet
2.2 Lähtötiedot
2.3 Toteutusympäristö ja käytetyt työvälineet
2.4 Luokkarakenne
2.5 Algoritmi
3. Projektityöskentelyn kuvaus
3.1 Aikataulu ja ajankäyttöarvio
3.2 Toteutuksesa käytetyt työskentelytavat
3. Yhteenveto
3.1 Arvio projektin lopputuotteesta
3.2 Tärkeimmät opitut kokemukset
Alkuperäisessä aihe-ehdotuksessa tarkoituksena oli luoda monikäyttöinen sovellus, jota voitaisiin helposti hyödyntää hyvinkin erilaisiin tarkoituksiin. Ohjelman perusidean ymmärrettävyyden parantamiseksi päädyin kuitenkin jo projektisuunnitelmaa tehdessä rajaamaan ohjelman siten, että se soveltuu suoraan käytettäväksi vain yhteen tarkoitukseen. Tämän ansioista voidaan valita käyttöliittymään ja myös ohjelmakoodiin vähemmän abstrakteja käsitteitä eri asioille. Pienillä muutoksilla ohjelma voi kuitenkin sitten soveltaa myös hyvinkin erilaisiin tarkoituksiin.
Ohjelmaa voidaan käyttää eri käyttäjien kollektiivisen suosion laskemiseen verkkoyhteisössä, ja se käyttää sen laskemiseen Google Pagerank -algoritmista sovellettua algoritmia. Käyttäjä voi valita kahden algoritmin välillä. Näistä toinen kehitettiin ohjelman kehitystyön aikana. Ohjelma osaa hakea tiedot MySQL-tietokannasta, laskea käyttäjien suosiot, esittää niitä graafisesti ruudulla ja tallentaa ne takaisin MySQL-tietokantaan.
Ohjelman toiminnallisuuden selostamiseksi on määriteltävä joitakin käsitteitä
käyttäjä = Verkkoyhteisöön rekisteröitynyt ja siellä vaikuttava
henkilö
kommentti = Käyttäjän antama mielipide jostakin toisesta käyttäjästä,
voi olla positiinen tai negatiivinen.
kommentoija = Käyttäjä, joka on antanut mielipiteensä jostakin
toisesta verkkoyhteisön käyttäjästä
perussuosio = Käyttäjän jommallakummalla ohjelman
edistyneemmistä algoritmeista laskettu suosio, jossa ei huomioida käyttäjän
saamien negatiivisten kommenttien osuutta
kokosuosio = Käyttäjän jommallakummalla ohjelman edistyneemmistä
algoritmeista laskettu suosio, jossa on huomioitu käyttäjän saamat negatiiviset kommentit
palikkasuosio = Se luku, joka saadaan, kun positiivisten kommenttien
määrästä vähennetään negatiivisten kommenttien määrä.
d-vakio, vakio d = algoritmissa käytetty vakio, joka vaikuttaa karkeasti
sanottuna siihen, kuinka paljon kunkin kommentin arvoa määritettäessä painotetaan kommentin
antajan omaa suosiota
Ohjelmaan toteutettiin seuraavat suunnitelmassa pakollisiksi määritellyt ominaisuudet
Tämän lisäksi ohjelmaan toteutettiin myös seuraavat ominaisuudet
Jälkimmäisenäkin esitettyjen toimintojen toteuttaminen osoittautui välttämättömäksi, koska se oli ainoa tapa arvioida kunnolla algoritmien toimivuutta.
Ohjelmaan toteutettiin graafinen käyttöliittymä käyttäen Java-ohjelmointikielen tarjoamia graafiseen käyttöliittymien tekoon tarkoitettuja perustoimintoja.
Pääikkunassa on otsikolla "Tietokanta"-otsikoitu paneeli, jonka kenttiin käyttäjä määrittää tietojen hakemista varten seuraavat seikat
Käyttäjän määritettyä nämä tiedot hän voi hakea tiedot MySQL-tietokannasta klikkamalla "Lähtötiedot"-paneelissa olevaa "Hae tiedot"-nappulaa. Ohjelman haettua tiedot avautuu uusi Poimintalista-ikkuna, jolla voi selata haettuja ja myös laskettuja tietoja.
Tulosten laskemista varten käyttäjän tulee määrittää "Algoritmi"-paneelin kenttiin seuraavat seikat:
Oletusasetuksilla tulee käyttötarkoituksesta riippuen ihan hyvää jälkeä. Ohjelman käyttäjän valittua sopivat asetukset hän voi suorittaa iteroinnit "Engine"-paneelin nappuloita käyttäen. Lasketut tiedot päivittyvät aiemmin avautuneeseen toimintalistaan.
Käyttäjän halutessa viedä tiedot tietokantaan tulee hänen täyttää vielä joitakin tietoja "Tietokanta"-paneelin kenttiin. Tämän jälkeen tiedot voi viedä tietokantaan painamalla "Vie tiedot tietokantaan"-nappulaa.
Lisäksi käyttöliittymään liittyy "Viestit"-ikkuna, johon tulostuu ohjelman toimintaan liittyviä viestejä. Pääikkunassa on valikko, josta voi tallentaa käytössä olevat tietokantaasetukset sekä sulkea ohjelman.
![]() |
![]() |
Vasemmalla puolella on kuva toteutuneesta käyttöliittymästä, oikealla puolella ensimmäinen hahmotelma.
Ohjelma toteutettiin Java-ohjelmointikielellä. Toteutuksessä muun muassa seuraavia Java-API:n paketteja. MySQL-yhteyden toteuttamista varten oli ladattava sen hoitava komponentti sivustolta http://www.mysql.com
Jotta ohjelma tulkitsisi lähtötiedot oikein, on niiden oltava tietokantataulussa seuraavassa muodossa
| fromnick | targetnick | pidan |
| *devil_girl_89* | lonelyAngel | true |
| masq | devilboy | true |
| josSu | masq | false |
fromnick = kommentin antaja
targetnick = kommentin kohde
fromnick = kommentin tyypi, true on positiivinen ja false negatiivinen
Ohjelma kirjoitettiin XEmacs-ohjelmistolla ja se voidaan kääntää ja ajaa käyttäen Java 5.0 SDK:ta.
Alla on epätäydellinen UML-kuvaus ohjelman luokkarakenteesta. Ohjelmoinnin
aikana huomattiin, että suunnitellun Engine-luokan voi mukavasti sisällyttää
Kayttajalista-luokkaan. Jälkeenpäin ajatellen luokkarakenne olisi kannattanut
toteuttaa siltä osin erilailla, että algoritmit olisivat olleet omissa luokissaan. Sen ansiosta
ohjelmaan olisi voinut kuka tahansa helposti lisätä uusia algoritmejä, jotka toteuttaisivat
ohjelmassa määritellyn algoritmi-rajapinnan.
Ohjelmakoodista generoidun Javadoc-dokumentaation löydät täältä
Kun tiedot haetaan tietokannasta asetetaan jokaisen käyttäjän suosion alkuarvoksi luku 1. Tämän jälkeen lasketaan jokaisen käyttäjän suosio jollakin allaolevista kaavoista. Kun näin on tehty, lasketaan uudestaan käyttäjien suosiot käyttäen nyt edellisessä laskussa saatuja tuloksia. Suunnitelmaa tehtäessä oli epäselvää voiko suosioarvoja laskea samanaikaisesti eri iteraatiokertojen tuloksien avulla. Ohjelma toteutettiin aluksi näin, ja tämä tuotti selvästikin vääränlaisia tuloksia. Siksi ohjelmaa muutettiin siten, että se ei sotke eri iteraatiokerroilla laskettuja tuloksia keskenään laskennan aikana. Kun iterointia toistetaan riittävästi, saadut tulokset eivät enää iterointien seurauksena muutu. Silloin ollaan päästy haluttuihin arvoihin.
Alla on kahden eri algoritmin kaavat kahden eri tunnusluvun laskemiseen. Kaikissa kaavoissa
käyttäjä A on saanut a positiivista ja b negatiivista kommenttia.
Lisäksi kaikissa kaavoissa pätee allaoleva:
Seuraava on "Google-style"-algoritmin kaava perussuosion laskemiseen:
Kokosuosio lasketaan "Google-style"-algoritmilla seuraavasti:
Alla on "al gore rhythm" -algoritmin kaava perusuosion laskemiseen:
Kokosuosio lasketaan "al gore rhythm" algoritmia käytettäessä seuraavasti:
Kaavat PDF | PS | TEX | DVI muodossa
Algoritmien keskeinen ero on se, että Google-algoritmissa "on nimittäjässä" käyttäjän antamien kommenttien lukumäärä. Tämä johtaa siihen, että käyttäjän antaman yksittäisen kommentin arvo vähenee käyttäen antaessa uusia kommentteja. Al gore rhythm -algoritmissa näin ei ole. Tuon tekijän yksinkertainen poistaminen nimittästä ei kuitenkaan tuota haluttua tulosta, tällöin nimittäin lasketut arvot eivät lähestyisi iteraatoiden kuluessa mitään tiettyä arvoa, vaan tulokset muuttuisivat täysin kaoottisiksi. Siksi laskettuja arvoja skaalataan sopivalla skaalaustekijällä, joka on käyttäjien yhteenlaskettu lukumäärä jaettuna iteraatiokerralla jaetun suosion määrällä. Asia selviää tarkemmin kaavoja tarkastelemalla.
Projekti lähti hyvin liikkeelle, ja säin tärkeimmät asian toimimaan melko nopeasti, käyttäen joitakin kokonaisia päiviä projektin tekemiseen. Tämän jälkeen totesin, että tahtia kannattanee hieman hidastaa. Pari viikkoa ennen joulua minut otti haltuunsa eräs tätä huomattavasti kiinnostavampi projekti, minkä takia projektin etenemiseen tuli noin 3-4 viikon tauko. Palautusta edeltävällä viikolla värkkäsin projektiin joitakin lisäominaisuuksia ja hioin käyttöliittymää kivemmaksi. Aikaa projektiin tuli käytettyä jonkun verran yli ajankäyttöarvion. Kuvittelin että loppuraportti syntyisi melko nopeasti suunnitelman laajuuden ansiosta, mutta huomasin sen vaativan varsin paljon työtä, koska jotkut seikat oli vaan pakko selittää perusteellisesti. Sinäänsä projekti oli tuon alkupyrähdyksen ansiosta aika hyvin aikataulussa.
Projektin teon aikana tarkoitukseni oli pitää projektipäiväkirjaa, koska kuvittelin etten pystyisi muistamaan kaikkia esille tulevia asioita, ellei niitä kirjaa ylös. Koin kuitenkin päiväkirjan pitämisen melko turhaksi, minkä takia sen pitäminen jäi väkinäisen alun jälkeen kokonaan pois. Javadoc-kommentit tein lähes kokonaan koodin kirjoittamisen yhteydessä.
Projektin lopputuote täyttää suunnitelmassa määritellyt tavoitteet. Ohjelmaan toteutetut algoritmit eivät ole ohjelmoinnillisesti kovin haastavia, mutta niiden toiminnan hahmottaminen ja niiden toimivuuden varmistaminen oli yksi haastavimmista tehtävistä. Teknisesti ohjelma on toteutettu kohtuullisen tyylikkäästi ja pidän luokkarakennetta siinä havaitsemastani parannusmahdollisuudesta varsin onnistuneena. Ohjelmalle tai ainakin sen idealle voisi sopivin muutoksin löytyä kiinnostavaa käyttöä isommissa verkkoyhteisöissä.
Koko kurssin aikana olen oppinut koodaamaan elegantimpaa koodia, ja tämä kehitys jatkui myös projektin teon aikana. Projektin aikana opin erityisesti käyttämään Java-APIa paremmin, koska vastauksia kysymyksiin ei löytynyt helpommin muilta koodin parissa puurtavilta. Swingin käytön yleinen ymmärrys kasvoi ja opin käyttämään ohjelmassa Java-API:n ulkopuolisia komponentteja. Projekti lisäsi myös huomattavasti omaan Java-osaamiseen kohdistuvaa luottamusta.