SoturiBotin synkkä menneisyys

joulukuu 12, 2007

Nyt kun lapsi on laitettu (irk)maailmalle on hyvä kerrata hieman taustoja. Mistä kaikki sai alkunsa? Miten kummassa jotain niin ällistyttävän ihmeellistä kuin SoturiBotti on voitu saada aikaiseksi.

Kaikki alkoi eräänä harmaana iltapäivänä jokin aika sitten. Javasoturit olivat kokoontuneet päämajaansa pitämään huippukokousta. Yht’äkkiä jokaisen eteen lävähti kaksi paperia. TAPAUS Nro 7 luki isoin kirjaimin otsikkona. Se oli tämän huippusalaisen projektin koodinimi ja tästä sai alkunsa kaikki se, mikä myöhemmin tultiin tuntemaan nimellä SoturiBotti.

TAPAUS 7 sisälsi kolme virikettä, joilla nuorten ja viattomien Javasotureiden hennot mielet turmeltiin loppuelämäksi. IRC, Turingin testi, tekoäly, onMessage, botti! Näitä sanoja ihmettelimme ja lopulta meidät aivopestiin uskomaan, että suffeli todella on parasta suklaata ja Lucky Strike parasta tupakkaa.

Hyvästi elämä! Vihdoin todella opimme mitä on irkkaaminen. Maailma täynnä kanavia, joilla toistaan älykkäämmät ja viehättävämmät botit viekoittelevat meitä pois tästä niin kutsutusta todellisuudestamme. Tämä ei ollut vielä tarpeeksi ja päätimme, kuten Frankenstein aikanaan, luoda jotain vielä suurempaa! Nimesimme projektimme SoturiBotiksi.

Koska meillä ei kuitenkaan ollut vielä tarpeeksi kykyjä SoturiBotin luomiseen päätimme hajaantua Otaniemen salaisimpiin sopukoihin tietoa etsimään. Päätimme ottaa kaiken mahdollisen selville rajapinnoista, puheenmuodostusalgoritmeista, jo olemassaolevista boteista, toiminnallisuuksien toteutuksista ja inhimillisistä boteista. Päätimme kokouksen ja hajaannuimme jokaiseen neljään ilmansuuntaan. 

Tieto lisää tuskaa ja nyt sinä tiedät miten kaikki sai alkunsa. 


Olo: Projekti-aiheen pitchaus

joulukuu 12, 2007

Viimeisessä olo-tapaamisessamme kokoonnuimme purkamaan ryhmäläistemme alustavia suunnitelmia projektiaiheiksi. Tämä oli myös oiva tilaisuus saada kuittauksia epäselviin tai muuten vaan mieltä askarruttaviin asioihin ja päivitellä kuinka niin mukavat yhteisoppimisemme alkavat olla tiensä päässä:(.

Suurin osa ryhmätovereistamme oli päättänyt koodata pelin. Tämä oli myös oma suunnitelmani, joten olin iloinen kuullessani etten ole yksin. Kirjanpito-ohjelmaakin esiteltiin, mutta oma peli oli suurimmalle osalle päivän sana. Oli kiinnostavaa kuulla kuinka erilaisia ja toteuttamiskelpoisiakin ideoita kaverit olivat keksineet. Tulee varmasti olemaan mielenkiintoista päästä kurssin jälkeen katsomaan mitä kukin on lopulta saanut aikaiseksi.

OLO-tapaamisemme kesti tavallista lyhyemmän ajan, sillä projektiaiheiden esittely sujui harvinaisen mallikkaasti ja suoraviivaisesti, vaikka assarit yrittivätkin loppua hieman pitkittää omilla kokemuksillaan ja neuvoillaan;). Vinkit tosin tulevat aivan varmasti tarpeeseen viimeistään joululomalla projektiin hajoillessa. Sitä odotellessa hajoilemme vielä edellisiin kierroksiin.


5. teoriatehtävä, säikeet.

joulukuu 12, 2007

Menipä, että hujahti. Viides (ja viimeinen!) teoriatehtävä on kunnialla (tai vähintään rimaa hipoen) saatu raapusteltua. Aihe oli tähän astisista alueista selvästi vaikeimmin hahmotettava: säikeet Javassa. Lähdin lähestymään aihetta käsitekartan kautta. Pohjatietoja tuotokseeni sain etenkin kirjasta Mika Vesterholm-Jorma Kyppö, Java-ohjelmointi (tuttavallisemmin kalakirja) sekä Sunin Java-esimerkeistä ja googlaamalla.

Prosessin aikana selvisi paljon mielenkiintoisia asioita lähtien siitä, että välikokoiset säikeet muodostavat mikrotubulusten ja mikrofilamenttien kanssa solun tukirangan, mutta keskitytään tässä vain olennaiseen. Sain selville, että Javassa säikeet ovat ikään kuin rinnakkaisia prosesseja, jotka mahdollistavat tehtävien samanaikaisen suorittamisen. Lähteissäni korostettiin paljon ihan uutta käsitettä, “rinnakkaisuutta”, tutun peräkkäisyyden “rinnalle”.

Säikeiden omaksuminen oli selvästi hitaampaa kuin aiempien tehtäväkierrosten käsitteisiin pureutuminen aiheen tuntemattomuuden vuoksi. Uskon kuitenkin saaneeni hyvän peruskäsityksen säikeiden toiminnasta ja rakenteesta. Kuitenkin se, ettei säikeitä oikeassa ohjelmoinnissa käytetä lainkaan koko kurssilla (ellei omassa projektissa niin halua), ei tue oppimista, vaan säikeet saattavat unohtua nopeasti.

Minulle selvisi kyllä, että säie toteutetaan joko syrjäyttämällä Run()-metodi tai toteuttamalla Runnable-liittymä, mutta itse omien rinnakkaisten säikeiden toteuttaminen olisi varmasti tuonut oman lisänsä. Tämä olisi voitu esimerkiksi tehdä korvaamalla joitain viimeisen eli kuudennen java-kierroksen osatehtäviä säikeitä käsittelevillä osatehtävillä.

Säikeistä selvisi, että niiden yksi käyttökelpoisimmista ominaisuuksista on prioriteetin asettaminen. Prioriteetin avulla voidaan määrittää mitä säikeitä halutaan suorittaa ensisijaisesti ja mitkä säikeet eivät ole niin tärkeitä. Säikeiden suurimpana hyötynä mieleen jäivät ohjelman nopeuttaminen sekä rinnakkaisten tehtävien hallitseminen. Esimerkiksi julkisen web-palvelimen toiminnan ylläpitäminen vaatisi säikeitä, koska tällöin tulee käsitellä useamman käyttäjän samanaikaisia toimenpiteitä. Säikeidenkin käytössä tulee kuitenkin olla varovainen. Kalakirjassa oli havainnollisia esimerkkejä säikeiden jumiutumisesta ikuiseen silmukkaan epäpätevän ohjelmoinnin tuloksena.

Tätä kirjoittaessani olen jo saanut käsitekartastani arvosanan, mutta en palautetta, joten ties vaikka jokin virheellinen tietokin olisi vahingossa tähän erehtynyt. Toivotaan, että ei. Kysymysmerkkien poistamiseksi tietenkin voisin liittää säikeet jollain aasinsillalla tulevaan projektiini. Huih, taidankohan sentään! :)


Viimeinen avaus

joulukuu 6, 2007

Olimme viimein päässeet viimeisen OLO-tapauksen kimppuun. Tällä kertaa tavanomaisten post-it -lappujen sijasta käsitteitä ja kommentteja niistä lätkittiin juuri esiteltyyn dialogikartta-ohjelmaan, jonka hyödyllisyys ja käyttökelpoisuus oli luennolla aiheuttanut hilpeyttä niin proffan kuin opiskelijoidenkin puolella. Ohjelman ideana oli lätkiä ongelmatilanteita ruudulle ja vetää siitä ratkaisuehdotuksia ja niiden kommentteja.

Lähdimme ko. ohjelmalla käsittelemään digitaalisen valokuva-albumin rakentamista. Albumi oli tarkoitus rakentaa Javan swing-komponenttien avulla ja periaatteessa teimme suunnitelman ohjelman käyttöliittymän ulkoasusta ottamatta kantaa itse tietokantarakenteisiin. Ehkäpä eniten keskustelua aiheutti seuraavaan ja edelliseen kuvaan siirtymiseen tarkoitettujen painikkeiden sijoittelu ja toteutus.

Oppimistavoitteiksi asetettiin swing-komponentit JFrame, JButton, JPanel, JLabel, JTextField/Area ja Border-/GridbagLayout. Lisäksi tapahtuman lähde-tapahtuman kuuntelija -suhde päätettiin selvittää.


Javasoturi-botin esittely

joulukuu 5, 2007

Seuraavassa esittely Bottiseminaari-osallistujamme Javasoturi-botin toteutuksesta:

Runko

Bottimme rungon muodostaa luokka SoturiBotti, joka on pircbotin alaluokka. Tämä luokka hoitaa kanavalle liittymisen sekä viestien välittämisen eri ominaisuuksille.

Varsinaiset botin ominaisuudet on toteutettu omissa luokissaan. Näiden luokkien tulee täyttää rajapinta SoturiOminaisuus joka määrittelee seuraavat toteutettavat metodit: uuden viestin saapuessa suoritettava uusiViesti sekä kerroOminaisuus joka palauttaa kuvailun kyseisestä ominaisuudesta. Näitä komentoja voi sitten kysyä kirjoittamalla kanavalle !ominaisuudet.

Ominaisuudet:

SoturiHymni:

Tämä yhteisesti toteutettu ominaisuus oli alunperin kehitetty vain testaukseen, mutta hyväksi todettuna säilytettiin. Javasoturi tarkkailee viestejä ja tunnistaa sanan hymni, jolloin lähettää kanavalle teekkarihymnin. Myöhemmin Antti ohjelmoi botin laulamaan hymnin aina keskiyöllä ja hymnin sanat tulemaan kanavalle sellaisella viiveellä, että se mahdollistaa mukana laulamisen!

SoturiAltti:

SoturiAnna:

Ikinä ei ole liikaa yhteislaulua ja hymnin lisäksi tarvitaan muutakin teekkarilaulujen kirjoa, jotta kulttuuri välittyy fukseille. Javasoturi tarkkailee viestejä ja tunnistaa sieltä sanoja kuten irkki, laulu, Vipunen ja karaoke, jolloin Botti ehdottaa reipashenkistä yhteislaulua joko randomilla (yleiset avainsanat kuten laulu, karaoke) tai jotain tiettyä laulua (nainen, irkki, linkki…). Laulujen sanat tulemaan kanavalle pienellä viiveellä, jotta niiden mukana on kiva laulaa!

SoturiAntti:

Etsii Java-Apista Googlen sivuhaulla vastauksia käyttäjien kysymyksiin käyttäen URLConnection-luokkaa. Reagoi kysymyslauseisiin joiden sisältämiä yli nelimerkkisiä sanoja se yksitellen etsii Googlella Apista ja palauttaa ensimmäisen saamansa hakutuloksen. Voidaan käyttää myös komennolla !api jolloin huomioon otetaan kaikki komennon jälkeen tulevat hakusanat. Google ei ilmeisesti toivoisi hakukonettaan käytettäväksi koneellisesti, joten hakujen mahdollistamiseksi botin tulee leikkiä olevansa normaali Mozilla-selain.

Botin lähdekoodin palauttamisen jälkeen havaittiin myös ominaisuuden tekemien hakujen suuren määrän aiheuttavan 403 Fordidden-virheitä Googlen suunnalta. Parantelin koodia siten että kysymyksen havaittuaan se lähettää yksittäisten sanojen sijasta koko lauseen (lyhyet sanat karsittuna) haettavaksi OR-notaation kera, jolloin jos mikä tahansa lauseen sanoista löytyy apista, saa käyttäjä vastauksen. Google toki luokittelee korkeammalle sivun jossa esiintyy mahdollisimman moni sanoista, joten vastausten oikeellisuus parantui myös.

SoturiLaura:

Tässä ominaisuudessa Javasoturi yrittää vastata yleisimpiin kysymyksiin. Varsinkin “ei toimi”, “ei skulaa” ja vastaavankaltaisiin viesteihin reagoidaan. Reagointi on toteutettu siten, että botti etsii tulleesta viestistä tiettyjä merkkijonoja, jotka eivät välttämättä ole kokonaisia sanoja, vaan esimerkiksi sanojen vartaloita. Näin se voi reagoida erilaisiin taivutusmuotoihin. Vastaus on joko vakio, tai botti arpoo sen satunnaisesti.

Itse vastaukset on pyritty toteuttamaan siten, että käyttäjän tarkentaisi ongelmiaan. Esimerkiksi “ei toimi” -valitukseen vastataan “Valittaako kääntäjä jotain?”, jolloin kyselijä saattaa vastata, että “Joo, se heittää ArrayIndexOutofBoundsExceptionin” . Muut botin ominaisuudet taas osaavat reagoida tähän ja keskustelu jatkuu hyödyllisesti.

Tämä ominaisuus reagoi myös muiden Javasoturin ominaisuuksien antamiin neuvoihin. Mikäli kysyjä ilmentää hämmennystään vastauksen saatuaan, tämä luokka arpoo sopivan vastauksen. Nämä ominaisuudet olivat tärkeimmät, mutta luokassa on vielä pari muutakin ominaisuutta. Kaikki kuitenkin toimivat samalla periaatteella.

SoturiLauri:

SoturiMaiju:

Tässä ominaisuudessa Javasoturi tunnistaa epäonnistuneita irc-komentoja (l. ilman kauttaviivaa laitetut esim. exit, whois) ja kommentoi niihin liittyen. Lisäksi tunnistaa sanan java ja 30% todnäk. vaihtaa otsikon javamyönteiseksi. Lisäksi tunnistaa taukoon liittyvä sanojaa, jolloin ehdottaa taukojumppaa. Taukojumpan liikket tulee hieman viiveellä, toteutettu säikeen sleep() metodilla. Tunnistus tapahtuu siten, että Soturi tarkkailee kanavalle lähetettyjä viestejä ja reagoi tiettyihin sanoihin.

SoturiMikko:

Ominaisuuden pohjalla on ajatus, että bottimme on rajattu java-assariksi eikä siedä kun puhutaan matematiikasta, joka ei ole bottimme vahvuuksia. Omaisuus etsii siis irkkaajien viesteistä matematiikkaan liityviä sanoja String-luokan contains-metodilla ja sen jälkeen katsoo Date-luokasta periytyvillä metodeilla kellonajan ja kommentoi sen mukaan mikä bottimme olotila siihen aikaan päivästä on. Halusin nimenomaan tutkia tuota kellonajan mukaan toimimista, koska se näytti hyödylliseltä ja sen avulla botille saattoi toteuttaa ajanjaksoja jolloin se käyttäytyy samalla tavalla ja vaihtaa käyttätymistään tietyin väliajoin. Käytin Date-luokkaa (vaikka se on jo hieman vanhentunut) uudemman Calendar-luokan sijaan, koska sieltä löytyi juuri omiin ratkaisuihini sopivat valmiit metodit.

SoturiTaija:

Oma ominaisuuteni oli kannustusominaisuus, eli tarkoitus oli tehdä assaribotti kannustaman tuskaisista tunnelmista kärsiviä koodareita ystävällisillä kommenteilla. Alun perin laitoin botin arpomaan muutamista eri kannustavista kommenteista yhden ja tulostamaan sen, jos kanavalla annettaisiin käsky !ahdistaa tai !masentaa yms. Sitten kun sovimme tekevämme botista mahdollisimman ihmismäisen, ns. “aidon” assarin, niin muutin botin tunnistamaan tekstin keskeltä sanat, jotka viittavat ahdistukseen, tuskaisuuteen, masennuksiin ja kirosanoihin, ja sitten arpomaan sopivan kannustavan kommentin. Yhteiskoodauksen jälkeen botin ominaisuutta vielä muutettiin siten, että se reagoi vain tiettyjen nimimerkkien teksteihin. Tämä tehtiin sen takia, että botilla oli myös kettuiluominaisuus, eikä olisi ollut kovinkaan aidon oloista, jos botti olisi ensin kannustanut samaa henkilöä ja sitten piruillut päälle. Niinpä päädyimme tähän vaihtoehtoon, jossa botti valitsee nimimerkin perusteella, ketkä ovat lemppariopiskelijoita, ja ketkä eivät.

SoturiValtteri:

Ominaisuus, joka heittää kanavalle linkin suoraan Janne Käen viime vuoden luentokalvoihin. Reagoitavien sanojen skaala kattaa suurimman osan tärkeimmistä Javan osa-alueista, kuten säikeet, taulukot tai swing-ohjelmoinnin. Reagoi sanaan taivutuksen yleisimmissä muodoissa, myös lauseen keskellä.


Te jotka ette ole vielä kirjoittaneet omasta ominaisuudestanne: Kirjautukaa sisään ylläpitoon ja valitkaa yläpalkista Hallitse ja tämän viestin kohdalla Muokkaa. Kiitos! -Antti


Java 5: Let’s Swing!

joulukuu 1, 2007

Tämänkertainen java-tehtävä olikin taas aivan uutta asiaa, nimittäin tällä kertaa ohjelma toteutettiin graafisesti, eli ruudulle ilmestyy ohjelman käynnistäessä ikkuna! Cool!

Oli varsin rentouttavaa päästä eroon iänikuisista sienistä ja ninjoista, jotka olivat tuottaneet ah, niin monelle harmaita hiuksia paikkaan jos toiseenkin. Oli aika ryhtyä sikailemaan ja swingaamaan sokoban-klooni Sikobanin tahtiin.

OLO-sessioista ja esseestä tutut JFrame, JButton & co. tulivat ensimmäistä kertaa oikeasti nenän eteen, ja aluksi swing-komponenttien käyttö tuntuikin vieraalta kuin porkkana korvassa. Lisäksi piti myös opetella graafiseen käyttöliittymään liittyvien tapahtumien lähteiden ja kuuntelijoiden käyttö, jotta napeista painettaessa tapahtuisikin jotakin. No, hetken aikaa erilaisia netin tutorialeja selattuani alkoi komponenttien lisäily tuntua hieman tutummalta ja lopulta ahaa-elämys kulminoitui hetkeen, kun itse koodattu ikkuna pamahti ruutuun nappien ja valikoiden kera.

Graafisen toteutuksen vielä kaihertaessa älynystyröitä pitikin jo käydä pelin loogisen toteutuksen kimppuun, jossa tuhraantuikin yllättävän paljon aikaa. NullPointereita ja ArrayIndexOutOfBoundseja sateli puolelta jos toiselta. This was very nice..NOT! No, seuraavaksi pitikin aloittaa jo logiikan integroiminen graafiseen käyttöliittymään.

Ensin sikoja ja ties mitä dollareita ilmestyi  joka paikkaan, mutta onneksi logiikan sijaan vika oli grafiikassa, ja ongelmat oli melko helposti ratkaistu. Oli hienoa saada lopulta peli toimimaan niin, että siat ja possut liikkuivat halutulla tavalla. Possu pääsi maaliin!

Itseltäni jäi viimeinen osatehtävä hieman kesken, joten uusien kenttien pelaaminen vaatii koodin pientä rukkausta. Odotan innolla malliratkaisun saapumista, jotta JFileChooserin haamu ei jää kummittelemaan pienen koodarin mieleen..

possu