kari Kari Antero Lavikka

Softaportfolio

Tälle sivulle olen kerännyt vapaa-/työaikana väsäiltyjä projekteja. Järjestys on satunnaisen kronologinen - uudemmasta vanhempaan.

WebChat

WebChat

Mannerheimin Lastensuojeluliitto ja Helsingin nuorisoasiainkeskus halusivat järjestää Galtsussa ohjattuja chatteja. Galtsussa ei ollut sopivaa toiminnallisuutta tarjolla, joten täytyi alkaa pohtia sopivaa ratkaisua.

Tein alussa muutaman periaatepäätöksen softan arkkitehtuurista, sillä halusin tehdä softasta helposti integroitavan erilaisiin ympäristöihin. Toisaalta halusin tutustua myös uusiin webiteknologioihin.

Arkkitehtuuri

Ominaisuudet

Chattia on käytetty yleisen keskustelun lisäksi myös isännöidyissä julkkischateissa, joissa vieraina on ollut muusikkoja, poliitikkoja, kansanedustajaehdokkaita, uutisankkureita, jne. Ehkä viihteellisimmät käyttötapaukset ovat olleet livevideostreamina lähetetyt bändikeikat, jossa IRC-Gallerian käytäjät ovat voineet olla menossa mukana kotoa käsin ja välissä myös jutella artistien kanssa.

IGTV

Galtsun toimistolle ilmestyi joskus (silloisen mittapuun mukaan) hullun iso 40" LCD-töllö. Siihen tietysti piti kehitellä kivaa täytettä ja niinpä syntyi IGTV.

Kyseessä on Javalla toteutettu palvelinsofta, joka lähetää Galtsuun lisättyjä kuvia eteenpäin XML-streamina. Itse kuvadata on Base64-koodattua. Asiakaspäässä on niinikään Javalla toteutettu härveli, joka lukee XML-streamia ja välittää datan edelleen animaattorisäikeelle. Ensimmäiset versiot käyttivät AWT:ta, mutta myöhemmässä vaiheessa tein versiot myös OpenGL:llä. Animointeja on useampi erilainen toteutus - kuvassa näkyvä 2D-vesio ja hienompi filminauhaa jäljittelevä 3D-versio. Nykyään asiakaspään voisi toteuttaa varmaan WebSocketeilla, Canvas-elementillä ja WebGL:llä.

IGTV:llä pyöritettiin taannoin vappuaiheisia kuvia Kampin Narinkkatorin mainosruudulla. Myös YouTubesta löytyy jokunen videopätkä.

IRC-Gallerian Vaalikone

Eduskuntavaalit 2007 + Suomen suosituin sosiaalinen media ja käyttäjäryhmä, josta perinteiset mediat vain haaveilivat. Täytyihän Galtsuunkin sitten vaalikone saada.

Ehdokkaat antoivat palautetta selkeästä käytettävyydestä ja käyttäjät kehuivat vertailuominaisuuksia. Eri puolueiden ja käyttäjäryhmien vastausten vertailu onnistui helposti. Oli myös mahdollisuus tarkastella ehdokkaita muista vaalipiireistä. Jostain syystä tätä ominaisuutta ei muilla ollut. Myöhemmin vaalikonetta käytettiin myös kuntavaaleissa ja eurovaaleissa. Toteutus oli tarkoitus ulkoistaa, mutta läskiksihän se meni. Vastasin lopulta itse jokseenkin kaikesta softan suunnitteluun ja toteutukseen liittyvästä.

Koodi on PHP:ta, laskenta tapahtuu tietokannassa.

Vaalikone oli varsin näkyvästi esillä mediassa ja sai jopa kunniamaininnan Grand One 08-kilpailussa, paras kuluttajille suunnattu palvelu -kategoriassa. \o/

Ehdotteleva haku (Proof of Concept)

Kirjoita pari kirjainta ja samantien ruudulle ilmestyy dropdown-lista vaihtoehdoista. Noitahan on jo monessa paikassa, mutta Galtsuun tarvittiin sellainen, jotta kuvia ja blogauksia olisi helppo tägätä aihetta käsitteleviin yhteisöihin.

Tein Inverted Indexiin perustuvan hakuserverin, joka pisteyttää tulokset mätsäävien hakusanojen / kirjainten ja yhteisön jäsenmäärän perusteella. Parhaimpia osumia tarjoillaan sitä mukaa kun hakusanoja kirjoitellaan. Tutkin mahdollisuutta käyttää Ternary search tree -tietorakennetta sanojen indeksointiin, mutta se ei osoittautunut mielekkääksi sanojen suuren määrän ja 64bit osoittimien viemän tilan takia. Päädyin lopulta tallentamaan hakusanat ihan Javan TreeMappiin, josta niitä voi hakea prefixeillä.

Lopullisen tulosjoukon muodostava algoritmi vaati jonkin verran pohdiskelua, sillä lyhyet prefixit johtavat suureen datamäärään - kuvittele vaikka hakusanoja "ra an". Roope Ankan lisäksi joudutaan pisteyttämään jok.ikinen yhteisö/käyttäjä, joiden nimissä esiintyy a:lla tai r:llä alkavia sanoja. Lyhyiden prefixien palauttaman tulosjoukon cachetus ja Merge-algoritmin käyttö useasta sanasta muodostuvien tulosjoukkojen rajaamiseen (leikkaus / intersection) osoittautui tehokkaaksi.

Oma osuuteni rajoittui yllä kuvatun Proof of Conceptin toteuttamiseen. Kollegat tekivät siitä käyttökelpoisen tuotteen, niin serverin kuin JavaScriptien suhteen. Webiserverinä on tosiaan Jetty.

Intarray PHP-extensio

PHP:n array-tietorakenne on melkoinen bloatti, sillä se toteuttaa samaan aikaan linkitetyn listan ja hajautustaulun. Primitiivien tehokas käsittely sen avulla on ihan naurettava ajatus. On hidas, mutta etenkin kuluttaa älyttömästi muistia.

Jokunen vuosi sitten koodasin Galtsua varten PHP:hen C-kielisen laajennuksen, joka mahdollistaa 32-bittisten kokonaislukutaulukoiden tehokkaan ... jos ei pyörittelyn niin ainakin tallennuksen. Toteutettuna on algoritmeja kuten binäärihaku ja erilaisia joukko-operaatioita kuten yhdiste, leikkaus ja erotus (union, intersect, difference). Lisäksi on kasa erilaisia leikkaa ja liimaa -funktioita.

Intarrayn voi ladata vaikka GitHubista.

Irkkibotti ja -clientti

Koodasin vuosia sitten yksinkertaisen IRC-protokollatoteutuksen ja sen päälle botin ja swing-clientin. Tuli harjoiteltua abstrahointia ja modulaarisen koodin kirjoittelua.

Myöhemmin bottia on käytetty IRC-Galleriassa moneen tarkoitukseen - esim. irkkaajaksi tunnistautumiseen ja ylläpito-oikeuksien hakemiseen galtsussa olevalle kanavalle. Jälkimmäisessä tilanteessa botti liittyy IRC-kanavalle ja selvittää onko käyttäjä oikeasti operaattori.

Botissa on tietysti erilaisia perustoimintoja kuten XML-konfiguraatio ja -käyttäjätietokanta, webiselaimella ja irkitse toimiva hallinta, erilaisia irkkitoimintoja kuten käyttäjien automaattinen oppaaminen, dynaamisten bannien hallinta, suosittu munakellotoiminto, jne.

Ajattelin joskus julkaista botin opensourcena, mutta en ole jaksanut dokumentoida sitä riittävän kattavasti.

Midlet-donitsi

Uudet kokeilut kiinnostavat lähes aina! Tein koulussa Java-harjoitustyönä kolmiulotteista silmänruokaa kännykkään. Olin portannut alunperin SupaGL:ään koodaamani 32bit grafiikkarutiinit Javalle jo aiemmin, ja tehnyt niiden avulla joitain 3D grafiikkaa pyöritteleviä appletteja. Porttaaminen midletiksi vaati kuitenkin kaiken laskennan muuttamista fixedpoint-luvuilla tapahtuviksi, sillä kännykästä puuttui kokonaan liukuluvut. Midletistä tuli lopulta ihan söpö ja Nokia 6600 pyöritteli donitsia ~6 FPS vauhdilla.

Alkuperäinen Java-appletti löytyy erilliseltä sivulta.

WWW sisällönhallintajärjestelmä (CMS)

CMS

Sisällönhallintajärjestelmä syntyi lähinnä omaan tarpeeseen, mutta päätyi se kyllä myös BDB:n asiakkaiden käyttöön. Arkkitehtuuri lyhyesti:

ProSales webikauppa

webikauppa

Tutustuin JavaEE:hen alunperin webikauppa-projektin merkeissä. Täytyy kirjoitella projektista joskus myöhemmin lisää.

Lyhyesti: Tomcat, Struts 1.0 (yök), JSP, PostgreSQL, käsipelillä tehty ORM-toteutus.

Keskustelufoorumi

foorumi

Kehitin vuoden 2001 aikoihin AP-Areena -tyylisen keskustelufoorumin, jossa tavoitteena oli mahdollisimman nopea ja varma toiminta ja helppo käytettävyys. AP-Areena oli tuolloin ihan uskomattoman hidas. Tekniikkana oli PHP & MySQL. Tehokkaan cachetuksen avulla sivuja pystyttiin palvelemaan lähemmäs 100kpl sekunnissa dual penaIII 500MHz:lla.

Milnet.fi portaali

milnet

Olin varusmiehenä Helsingin IlmatorjuntaRykmentissä Hyrylässä. Ensimmäinen puoli vuotta meni perinteisen palveluksen merkeissä AUK:ssa, mutta ryhmänjohtajakauteni olin HelItR:n Ilmatorjuntakoulun it-konttorilla kehittämässä kapiaisille ja reserviläisille tarkoitettua Milnet.fi -portaalia. Alaisina oli 3 friikkiä tykkimiestä ja nakki viuhui. Tekniikkana milnetissä oli PHP & MySQL. Myöhemmin Milnet korvattiin IBM:n toimittamalla järjestelmällä.

IRC-Gallerian ensimmäiset versiot

galleria

Liityin mukaan IRC-Galleria -projektiin silloin joskus kun galleria oli vielä pieni. Rohkenen ottaa kunnian lähinnä tietokannan suunnittelusta, silloisesta (rumasta) ulkoasusta, miljoonasta SQL-kyselystä, ja tehokkaasta html-sisällön cachettamisesta, joska tosin on sittemmin korvattu paljon hienostuneemmilla ratkaisuilla. Suurin osa koodista oli maza:n kirjoittamaa.

Myöhemmin kuvioihin tuli lisää porukkaa ja nykyinen versio on parinkymmenen kodarin tuotos.

Taulukkokomponentti AWT/Swing:lle

Grid

Erään pankkiiriliikkeen streamer-sovellukseen tarvittiin tehokaasti päivitettävää taulukkokomponenttia. Swingin JTable oli kaikessa MVC-hienoudessaan hieman raskas ja kokeilin hieman suoraviivaisempaa lähestymistapaa.

Ensimmäiset versiot toimivat olivat ehtaa AWT:ta, mutta myöhemmässä vaiheessa kuvioon tuli Swingin JScrollPane. Alkuperäinen AWT-versio oli erittäin tehokas melkein rajattoman kokoisilla taulukoilla, mutta koodi oli sen verran lowleveliä että eri Java- ja selainversioiden välillä oli melko paljon yhteensopivuusongelmia. Komponentti taitaa olla tänäkin päivänä käytössä - joskin hieman jatkokehitettynä.

Oheinen kuva on joku ensimmäisistä AWT-versioista.

SupaGL

SupaGL

Virittelin ennen inttiin lähtöä läjän grafiikkarutiineita, joilla voidaan piirtää vaikka ohessa näkyviä edustavia pörssikurssikäppyröitä. Koodi on ANSI C:tä, ja toimii jokseenkin kaikissa käyttiksissä. Kehuskelun aiheita ovat lähinnä 32bittinen alphablendattu RGBA grafiikka & coolit wu-antialiasioidut viivarutiinit. Nykyäänhän nuo ovat ihan peruskauraa, mutta vuosituhannen vaihteessa vielä varsin harvinaisia missään webikäppyröissä.

Nimetön peliprojekti

peli

Omaperäisyydellä tätä ei kyllä voi kehua. Vastaavia luolalentelyjä oli vaikka kuinka - AUTS, KOPS, Wings, Rocket Chase, jne. Toisaalta tavoitteena oli lähinnä tutustua hieman DirectX:ää vastaavaan SDL-kirjastoon ja C++:aan. Projekti jäi kesken, mutta tulipahan toteutettua parallax-skrollaavat ja alphablendatut graffat. Kaikki lentävät objektit ovat periytettyjä C++ -olioita.

Miinaharava TI-85 laskimelle

MineSweeper

Joku friikki oli väsännyt C-kääntäjän TI-85:lle. Small-C ei kyllä mitään optimointia osannut, mutta ihme kyllä sai käännettyä C:n subsettia z80 assembleriksi. Kaksiuloitteisia taulukkoja saati dynaamista muistinvarausta ei tuettu. Koodasin kuitenkin kaverin pyynnöstä pikaisen miinaharava-kloonin laskimelle. Pelille on oma sivu ticalc.org:ssa.

Koodasin myöhemmin myös pelin uusiksi ehdalla assemblerilla. Koko kutistui parisen kiloa, vaikka mukaan tuli scrollaava peliruutu. Lähdekoodit kuitenkin hukkuivat johonkin :-/

Graafinen ryhmäkalenteri

kalenteri

Tein vuoden 1996 kesällä töitä broidin firmalle. Koodasin Visual Basic:lla ryhmäkalenterin, jossa voidaan esittää useamman henkilön tai resurssin tapahtumia samassa näkymässä. Vaaka-akseli on konfiguroitavissa kellonajaksi vuorokauden sisällä tai lineaariseksi aika-akseliksi, jolloin pystyakselilla voidaan näyttää useita henkilöitä tai resursseja rinnakkain.

Nation on Fire BBS -mainos

nof

Ylläpidin 1994 - 1996 Nation on Fire -nimistä purkkia (BBS). Koodasin purkin kautta kiertäviin tiedostoihin lisättävän mainos-ohjelman, jonka tuli olla mahdollisimman pieni, mutta samalla myös näyttävä. Ohjelma on koodattu i386 assemblerilla, ja ohjelmatiedoston koko on huimat 1003 tavua. Rohkenen väittää onnistuneeni tavoitteessa kohtuullisesti. Sorsat & .com -tiedosto: nofsrc.zip