Elokuvissa näemme usein hulluja koodareita, jotka silmät kiiluen hakkaavat tietokoneelle yötä myöten käsittämättömiä komentorivejä toisensa perään. Oikeasti koodaaminen eli tietokoneohjelmointi ei ole lainkaan noin mystistä. Se on oikeastaan vain yksityiskohtaisten ohjeiden antamista tietokoneelle.
Mitä ohjelmointi on?
Nykyisin ohjelmakoodia on kaikkialla. Tietokoneiden, tablettien ja älykännyköiden lisäksi esimerkiksi jääkaapeissa, liesissä, ilmalämpöpumpuissa ja autoissa. Koodin määrä elämässämme lisääntyy koko ajan, vaikka emme sitä ehkä huomaakaan.
Esimerkiksi uusimmissa Fordin automalleissa on ohjelmakoodia jopa 150 miljoonaa riviä. Ilman ohjelmistoja kaikki tietokoneet ja muut älylaitteet ovatkin vain hyödytön kasa elektroniikkaa.
Ohjelmointi ei ole lainkaan mystistä. Siinä vain annetaan tietokoneelle tarkka toimintaohje eli algoritmi, jonka avulla se tekee halutun asian. Tietokoneohjelma voi esimerkiksi vähentää palkastasi verot ja sivukulut ja laskea näin käteen jäävän nettopalkan. Tätä tarkoitusta varten tietokone tarvitsee tiedon veroprosentistasi sekä sivukuluista ja käskyn, että ne pitää vähentää alkuperäisestä luvusta.
Koska tietokone ei suoraan ymmärrä ihmisen ohjeita, täytyy ohjeet kirjoittaa jollakin tietokoneen ymmärtämällä ohjelmointikielellä. Tällaisia nykyään yleisesti käytettyjä ohjelmointikieliä ovat mm Python, Java, C++ ja Ruby.
Yksinkertainen esimerkki: Piirrä ympyrä
Yksinkertaisuuden takaamiseksi käytössä on suomalainen Turtle Roy -ohjelmointikieli, jota käytetään mm. lapsille suunnatuissa koodikouluissa.
YMPYRÄN PIIRTÄMISEEN TARVITTAVAT KOMENNOT fd = mene eteenpäin (forward) lt = käänny vasemmalle (left turn) sequence = ketjuta repeat = toista |
Ympyrä piirretään antamalla 360 kertaa komenot mene eteenpäin 1 pikseli fd 1 ja käänny yksi aste vasemmalle lt 1.
Mutta koska nämä kaksi tehdään aina peräkkäin, voidaan ne yhdistää sekvenssiksi
sequence [fd 1, lt 1] |
Nyt olemme ohjelmoineet pätkän, jossa tietokonetta ohjeistetaan menemään 1 pikseli eteenpäin ja kääntymään sen jälkeen 1 aste vasemmalle. Jos kyseisen koodin antaa 360 kertaa, niin kone on piirtänyt ympyrän. Koska kukaan ei halua toistaa koodia, niin ohjelmoimme koneen toistamaan koodin 360 kertaa
repeat 360 (sequence [fd 1, lt 1]) |
Koodi on valmis!
Ilman ohjelmistoja kaikki tietokoneet ja muut älylaitteet ovat vain hyödytön kasa elektroniikkaa.
Usein vaaditun tehtävän suorittamiseen tarvitaan erilaisia ehtolausekkeita, vertailuja ja toistolausekkeita.
Muutamia esimerkkejä tällaisista lausekkeista liittyy vaikkapa nopanheittoon. Tietokoneelle nopanheitto tarkoittaa yhden ja kuuden välillä olevan kokonaisluvun arpomista satunnaislukugeneraattorilla:
KOODI: Heitä noppaa kunnes saat silmäluvuksi vähintään 5
OHJELMOINTIRAKENNE: EHTOLAUSEKE JOSSA LUKUMÄÄRÄÄ EI OLE MÄÄRITELTY
KOODI | KÄSKY |
import random | # tuo random-moduuli, jolla käsitellään satunnaislukuja |
while True: | # niin kauan kuin ehtolauseke on totta, suorita seuraavat käskyt |
silmaluku = random.randint(1,6) | # luo arvo nimeltä silmaluku, jonka arvo on satunnaisluku väliltä 1-6 |
if silmaluku >= 5: | # jos silmaluku -arvo on suurempi tai yhtä suuri kuin 5 |
break | # lopeta |
KOODI: Heitä noppaa kuusi kertaa
OHJELMOINTIRAKENNE: SILMUKKA
KOODI | KÄSKY |
import random | # tuo random-moduuli, jolla käsitellään satunnaislukuja |
heitot = [] | # tee tyhjä lista, jonka nimi on "heitot" |
def noppa(n): | # tee funktio nimeltä noppa, jonka parametri on n |
for i in range(n): | # käy läpi kaikki (n kertaa) |
silmaluku = random.randint(1, 6) | # luo arvo nimeltä "silmaluku", jonka arvo on satunnaisluku välillä 1-6 |
heitot.append(silmaluku) | # lisää "silmaluku" listaan nimeltä "heitot" |
noppa(6) | # suorita funktio "noppa" parametrillä 6, eli tee funktio 6 kertaa. |
print("Tulos:", heitot) | # Tulosta ruudulle sana "Tulos:" ja listan "heitot" sisältö. |
Edellisissä esimerkeissä esitellyt ohjeet on kirjoitettu Python-kielellä if, if-else, for in range, while ym. käskyillä. Vastaavanlaisia rakenteita löytyy lähes kaikista ohjelmointikielistä, niiden kirjoitusasu vain vaihtelee kielestä toiseen.
Tietokone tekee mitä käsketään, mutta ei välttämättä sitä mitä halutaan
Ohjelmointi vaatii tarkkuutta ja huolellisuutta, koska tietokone noudattaa saamiaan ohjeita mekaanisesti. Tietokone tekee mitä käsketään, mutta ei välttämättä sitä mitä halutaan. Pienikin virhe ohjelmassa voi aiheuttaa täysin odottamattoman lopputuloksen.
Joskus ohjelmointivirhe voi olla jopa kohtalokas, esimerkiksi Yhdysvalloissa 1980-luvulla koodausvirheen takia säteilyhoitolaite antoi viidelle potilaalle tappavan annoksen säteilyä. Toinen tunnettu esimerkki ohjelmointivirheestä on Ariane 5 -avaruusraketin tuhoutuminen 40 sekuntia laukaisun jälkeen vuonna 1996. Lähellä oli, että raketista putoavat romut olisivat vahingoittaneet laukaisua seuranneita vieraita.
Toisaalta, jos ohjelma on koodattu oikein, tietokone suorittaa sen erittäin nopeasti ja virheettömästi.
Konekielistä symbolisiin ohjelmointikieliin
Tietokoneen ohjelmointikieliä on kehitetty paljon vuosikymmenten varrella. On tulkinnanvaraista mikä oikein on ohjelmointikieli, ja sen vuoksi niiden määrää on mahdoton sanoa täsmällisesti. Joka tapauksessa niitä on satoja, eräiden laskutapojen mukaan jopa tuhansia.
Ensimmäiset ohjelmointikielet olivat niin sanottuja konekieliä, joita tietokoneen suoritin ymmärsi. Niillä kirjoitetut ohjelmat olivat pelkkiä nollien ja ykkösten jonoja, ja ne syötettiin syötettiin tietokoneelle kytkimiä kääntelemällä. Esimerkiksi konekielinen käsky 10110100 10110111 merkitsee suorittimelle, että se laskee kahden sisäisen rekisterin sisällöt yhteen ja siirtää tuloksen kolmannen rekisterin osoittamaan muistipaikkaan.
Myöhemmin kehitettiin kuitenkin ihmiselle havainnollisempia tapoja esittää käskyt tietokoneelle, koska konekielinen koodaaminen oli ymmärrettävästi vaikeaa ja vaati äärimmäistä tarkkuutta. Näin syntyi symbolinen konekieli eli assembler language. Symbolisella konekielellä edellinen käsky olisi esimerkiksi muotoa ADD A,B,@C
Nämä havainnollisemmat ohjelmat oli sitten käännettävä erityisellä ohjelmalla, kääntäjällä, konekieliseksi koodiksi, joka voitiin syöttää tietokoneeseen sen ymmärtämässä muodossa, eli bitteinä. Vielä 1980-luvulle saakka ohjelmakoodia saatettiin syöttää tietokoneelle reikäkorteilla.
Ohjelmointikielien tarkoitus on toimia ihmisten ja tietokoneiden välisenä rajapintana
Symbolisenkin konekielen käyttö on vaivalloista, joten yleensä ohjelmoinnissa käytetään korkean tason ohjelmointikieliä. Niiden tarkoitus on toimia ihmisten ja tietokoneiden välisenä rajapintana. Nykyisin yleisessä käytössä olevia ohjelmointikieliä ovat esimerkiksi Java, C-kieli ja Python. Nämä korkean tason ohjelmointikielet eivät myöskään ole aikaisempien kielien tapaan konekohtaisia, vaan mahdollistavat myös saman ohjelman käytön eri konekieliä käyttävissä tietokoneissa.
FORTRAN-ohjelmointikieli mullisti tietokonemaailman
Ensimmäistä tietokoneohjelmaa on vaikea nimetä. Se on myös määrittelykysymys.
Jo kauan ennen elektronisten tietokoneiden aikaa mekaanisten koneiden ohjaamiseen käytettiin algoritmeja. Usein ensimmäisenä tällaisena pidetään Ada Lovelacen laatimaa algoritmia Charles Babbagen mekaaniselle tietokoneelle v. 1842. Tämä ohjelma laski Bernoullin lukuja.

Ensimmäisenä korkean tason ohjelmointikielenä pidetään saksalaisen insinöörin Konrad Zusen> toisen maailmansodan aikana kehittämää tietokoneohjelmaa Plankalkülia, jota hän käytti mm. shakkivastustajanaan Z3 tietokoneessaan. Plankalkül hautautui kuitenkin arkistoihin eikä sillä ole ollut muuta kuin kuriositeettiarvoa.
Piti odottaa 1950-luvun puoliväliin asti, ennenkuin syntyi ensimmäinen korkean tason ohjelmointikieli, jolla oli merkitystä. Tuolloin kehitetty FORTRAN (FORmula TRANslator) yleistyi nopeasti samalla kun elektroniset tietokoneet kehittyivät. Iästään huolimatta sitä käytetään edelleen runsaasti erityisesti raskasta tieteellistä laskentaa vaativissa tehtävissä, mitä varten se aikanaan kehitettiinkin.
Monet sen ominaisuudet: taulukkomuuttujat, muuttujan ohjaamat silmukat (ns. for-silmukat) sekä haarautuva if-lause, löytyvät nykykielistäkin.
Ohjelman toiselta riviltä ilmenee että arvattava luku on 42 (LUKU=42). Jos arvaa liian pienen luvun, ohjelma kertoo rivillä kahdeksan arvauksen olevan liian pienen (PRINT*, 'LIIAN PIENI ARVAUS'). Jos se on liian iso niin vastaavasti se kertoo rivillä 14 luvun olevan liian suuri. Kun arvaus osuu kohdalle se kertoo arvauksen olevan oikein ja arvausten lukumäärän.
Yhä uusia ohjelmointikieliä syntyy
1950-luvun lopussa kehitettiin COBOL (COmmon Business Oriented Languange) joka on kaupallis-hallinnollinen kieli. Kieli oli tarkoitettu suurten tietomäärien yksinkertaisiin käsittelyyn. Cobolin käskyt on laadittu niin lähelle käyttöenglantia kuin mahdollista. Jos ohjelman parametreiksi ja muuttujiksi vielä valitaan sopivia sanoja, saattaa koodaamista osaamatonkin ymmärtää mitä ohjelma oikein tekee.
1960-luvun alussa kehitettiin ALGOL. Siitä tuli Euroopassa 1960-luvun lopun suosituin kieli. Algol on siinä mielessä merkityksellinen kieli, että sen pohjalta kehitettiin myöhemmin paljon käytössä olleet Pascalin ja C-kielen eri versiot.
Pascal kehitettiin 1960 ja -70-lukujen taitteessa erityisesti opetuskäyttöä varten. Se oli hyvin käytetty ohjelmointikieli Suomessakin opetuskäytössä 1970-luvulta 1990-luvun alkupuolelle asti kunnes C-kieli syrjäytti sen.
Toinen paljon opetuskäytössä ollut ohjelmointikieli on 1960-luvun puolivälissä kehitetty BASIC (Beginner´s All-purpose Symbolic Instruction Code). Basicistä on kehitetty tehokkaampia uudempia ohjelmointikieliä, kuten Microsoftin Visual Basic.
Kotitietokoneiden yleistyessä 80-luvulla moni sai ensikosketuksensa ohjelmointiin nimenomaan Basic-kielellä, jolla pystyi tekemään omia pieniä pelejä mm. Commodore 64, Vic-20 tai Amiga-koneisiin. Näitä ohjelmia levitettiin jopa radio-ohjelman kautta, kuten Elävän arkiston artikkelissa kerrotaan.
Yleisradio opetti Basic-ohjelmointia 1970-luvulla jopa televisiossa.
Algolista kehitetty C on yleiskäyttöinen ohjelmointikieli, joka on levinnyt laajalle 1970-luvulta lähtien. Sen vahvuuksia ovat yksinkertaisuus, tehokkuus ja joustavuus ja siirrettävyys. Monet uudemmat ohjelmointikielet, kuten C++, C# ja Java pohjautuvat C-kieleen.
Seuraavassa esimerkkiohjelma C-kielestä, joka kysyy käyttäjältä kaksi lukua ja tulostaa niiden summan. C-kieli poikkeaa suhteellisen vähän konekielestä ja sen vuoksi sen kieliasu ei ole maallikolle yhtä helposti aukeavaa esim. Fortran-ohjelmointikieli. Toisaalta sillä kirjoitetut ohjelmat ovat vastaavasti hyvin pienikokoisia ja tehokkaita.
Internetin kehitys tuo uusia tarpeita ja uusia kieliä
1990-luvun puolivälissä ohjelmoinnin fokus siirtyi kohti verkkosovelluksia internetin leviämisen myötä, ja näitä varten kehitettiin uusia ohjelmointikieliä. Tässä esitellään niistä muutamia yleisimpiä.
Ensimmäisiä erityisesti verkkosovelluksia varten kehitetty kieli oli oli Java, joka on C-sukuinen oliokieli. Java on tällä hetkellä maailman yleisin ohjelmointikieli. Sillä toteutetut ohjelmat toimivat esimerkiksi Windows-, Linux- ja Mac-ympäristöissä. Myös Androidin sovellukset kirjoitetaan Java-kielellä, mutta Windows-maailmaan tarkoitetut ohjelmat eivät suoraan toimi Androidilla (ja päinvastoin).
1990-luvulla kehitettiin myös ohjelmointikieli Python. Se on monipuolinen, tulkattava ohjelmointikieli ja sopii erityisesti verkkosovelluksiin. Pythonia voi käyttää myös vaativassa ja tieteellisessä laskennassa ja sitä käyttäen voi tuottaa myös graafisia esityksiä. Pythonia pidetään helppona oppia sen yksinkertaisen syntaksin(lauseopin) ja korkean tason tietorakenteiden takia. Monet suosittelevat sitä ensimmäiseksi ohjelmointikieleksi.
Myös Ruby on ohjelmointikieli, jota käytetään erityisesti verkkopalveluiden toteuttamiseen Ruby on Rails (RoR) laajennuksen avulla. Ruby on monessa suhteessa mielenkiintoinen kieli, ja selkeän syntaksin vuoksi sen alkeita pidetään melko helppoina oppia. Esimerkiksi mikroblogipalvelu Twitter on toteutettu Rubyllä.
PHP kehitettiin webin alkuaikoina helpottamaan dynaamisen sisällön lisäämistä kotisivuille. Sitä hyödynnettiin aluksi erityisesti web-lomakkeiden käsittelyyn. Vuosien myötä PHP on laajentunut täysimittaiseksi ohjelmointikieleksi, jota käytetään monissa suurissakin palveluissa.
JavaScrip on ohjelmointikieli, jota yleensä käytetään verkkoselaimessa toimivien skriptien eli komentosarjojen tekemiseen ja se perustuu löyhästi C-ohjelmointikieleen. Sen tärkein sovellus on mahdollisuus lisätä verkkosivuille dynaamista toiminnallisuutta. Esimerkiksi JavaSript käsky alert ('Oletko valmis?'), luo koneen ruudulle ikkunan ja siihen tekstin "Oletko valmis" ja odottaa, että käyttäjä kuittaa tämän klikkaamalla ikkunassa olevaa OK-painiketta.
Nimestään huolimatta JavaScriptillä ei ole mitään tekemistä Java-kielen kanssa.
Lisää ohjelmoinnista radio-ohjelmassa
Millaista ohjelmoijan työ sitten oikein on ja millaisia taitoja se vaatii? Ja mitä tulevaisuudessa on vielä koodaamiselta odotettavissa? Ja tarvitaanko peruskouluihin ylipäätään ohjelmointia? Näitä kysymyksiä pohditaan allaolevassa Tiedeykkösen jaksossa.
Koodi - suomi -sanakirja
Lyhyt terminologiasanasto
Algoritmi Yksityiskohtainen kuvaus tai ohje siitä, miten tehtävä tai prosessi suoritetaan. Tietokoneohjelma on algoritmi.
API Ohjelmointirajapinta on määritelmä, jonka mukaan eri ohjelmat voivat tehdä pyyntöjä ja vaihtaa tietoja eli keskustella keskenään. Hyvä esimerkki rajapinnasta on käyttöjärjestelmän rajapinta, jolla ohjelmat voivat käyttää keskusmuistia sekä tiedostoja.
Assembler Symbolinen konekieli Assemblerilla tarkoitetaan kullekin prosessorityypille ja sen käskykannalle erikseen määriteltyä laitteistoläheistä ohjelmointikieltä. Hyvin koneläheinen ohjelmointikieli, jossa konekielikäskyt on korvattu helpommin muistettavilla lyhennyksillä, kuten MOV (move, siirrä). Assemblylla voidaan tehdä nopeaa koodia ja kieli on sinänsä on hyvin yksinkertainen, mutta prosessorit eivät ole kovin yksinkertaisia, joten Assemblylla koodaaminen on työlästä touhua. Assembly on kielen nimi, kun taas Assembler on Assembly-kielen kääntäjä.
Binääriluku Kaksikantainen luku. Luku, joka on esitetty ykkösinä ja nollina (001010), niin kuin tietokone lukuja käsittelee. Lukujen esitys 2^x muodossa.
Bitti Pienin tietoalkio tietokoneessa. Binääriluvun osa; arvo voi olla 1 tai 0. (mikron virtapiireissä virtaa tai ei virtaa)
Bugi Virhe ohjelmassa. Katso myös virhe, error, mistake
Debugata Etsiä virheitä ohjelmasta, yleensä erillisellä hommaan tarkoitetulla ohjelmalla eli debuggerilla.
Do..while Suorittaa silmukan kerran ja sen jälkeen niin kauan kun ehto on tosi.
Editor Ohjelmointitarkoitukseen kehitetty tekstinkäsittelyohjelma, Ohjelma jolla kirjoitetaan lähdekoodia. Editorista on poistettu tavallisen tekstinkäsittelyohjelman tekstin muotoilua (bold, italic, ...) hoitavat toiminnot. Editoreissa voi nykyään olla ohjelmointikelen rakenteen ymmärtäviä toimintoja (esim väritys tai muotoilu)
Ehtolauseke on looginen väittämä, joka liitetään if ja elifrakenteisiin. Jos ehtolauseke on tosi, suoritetaan se osio, johon lause oli liitettynä. Muussa tapauksessa suoritetaan rakenteen else-osio tai sen puuttuessa rakenne ohitetaan kokonaan.
Else Jos if ei toteudu, niin else toteutuu. Katso "if".
For Yksinkertainen toistorakenteiden tekeminen. Käytetään yleensä kun toistetaan ohjelman rakennetta tietyn määrän.
Frontend tarkoittaa selaimen tulkitsemaa ja ihmiskäyttäjille visuaalisessa muodossa esittämää osuutta sivustosta, erotuksena palvelimen puolella toimivasta ohjelmistosta (backend). Frontendiin kuuluvat mm. tekstisisältö, värit, kuvat, typografia, käyttöliittymäkomponentit ja muut vastaavat asiat.
Funktio Funktiot ovat ohjelman sisäisiä pieniä itsenäisiä osasia. Funktion tarkoitus on, että konetta opetetaan kerran tekemään jokin asia, ja kun kone on sen oppinut, asian tekemiselle annetaan nimi. Esimerkiksi näytölle voitaisiin piirtää yksinkertainen talo komennolla ”piirräTalo”.
If Ehtolause jolla ohjelman suorituksessa voidaan tehdä valintoja. Ehtoa seuraava lohkorakenne tai lause suoritetaan jos ehto on tosi. Katso myös "else"
Java Laiteriippumaton olio-ohjelmointi kieli. Java on Sun Microsystemsillä kehitetty C++ muistuttava säieperustainen olio-ohjelmointikieli. Ilmaisten lisenssien myötä kieli ja välikooditulkit ovat levinneet kaikkiin tärkeimpiin ympäristöihin. Sunin tytäryhtiö on jo julkistanut Java-välikoodia konekielenään käyttäviä prosessoreita. Käytetään runsaasti web ohjelmien suunnitteluun.
JavaScript Netscapen kehittämä skriptauskieli, jolla voidaan laatia ohjelmia suoraan HTML-dokumentteihin. Voidaan käyttää esimerkiksi dokumenteissa virhetarkistuksiin ja tiedon esikäsittelyjen toteuttamiseen.
Koodi Joko ohjelman lähdekoodi eli kääntämätön muoto tai jo käännetty konekieli.
Käsky (lause) Tarkoittaa yhtä loogista riviä koodia, jolla suoritetaan jokin operaatio, kuten tulostus, sijoitus tai vertailu.
Kääntäjä eli Compiler on ohjelma, jolla voidaan kääntää lähdekooditiedosto konekieliseen muotoon ajamista varten. Kääntäjä lukee koko lähdekoodin ennen kuin tuottaa funktionaalisen ohjelman.
Loop Silmukka. Toistorakenne
Lähdekoodi Tiedosto tai joukko tiedostoja, johon on tallennettu varsinaiset koodirivit yhdestä tehtävästä tai ohjelmasta.
Muuttuja Nimetty paikka, jonne voi varastoida tietoa. Nimensä mukaisesti ,uuttujan sisältöä voi muuttaa.
Olio Järjestelmän ajonaikainen osa joka suorittaa tietyn tehtävän. Olio luodaan tietyn luokan avulla eli jokaista olita vastaa luokkakaaviossa luokka, jolla opi on saatu aikaan. Metafoora: Luokka on piparkakkumuotti, jolla tehdään pipari eli olio. Samalla luokalla voidaan tehdä useita samanlaisia olioita. Samanlaisilla oliot sisältävät kuitenkin eri tietoa.
Olio-ohjelmointi Olio-ohjelmat muodostuvat ohjelmassa ja sen ympäristössä esiintyvät oliot kuvaavista luokkamäärittelyistä ja sen ohjelmaoliojoukon määrittelystä ja aktivoinnista, minkä käyttäytyminen ratkaisee ohjelman tehtävän. Ohjelmointiteknisesti olio voidaan ymmärtää yksilöidysti viitattavaksi muistitilaksi, joka osaa itse muuttaa sisältöään. Käytännössä kaikkiin yleisimmin käytettyihin ohjelmointikieliin/-ympäristöihin on kehitetty eri tasoisia olion käsitettä tai olioajattelua tukevia laajennuksia.
Silmukka> Silmukan avulla sama ohjelmakoodi voidaan suorittaa useita kertoja.
Tietokanta muodostuu tietueista. Tietueita voidaan lisätä, muuttaa ja poistaa. Tietokannasta voidaan poimia tietoja tietueiden avainarvojen avulla erilaisten hakurutiinien avulla.
Tietue on useista tietoalkioista muodostuva kokonaisuus. Esimerkiksi sanakirjan osamuuttujat ovat tietueita, jotka sisältävät kaksi alkioa, avaimen ja arvon.
Toistolause Rakenne jolla sama asia tehdään kunnes tietty ehto täyttyy.
Tulkki on ohjelma, jolla voidaan suorittaa lähdekooditiedostoja. Tulkki lukee lähdekooditiedostoja sitä mukaa, kun niitä ajonaikana tarvitaan.
While suorittaa lausetta tai lohkoa niin kauan kun ehto on tosi.
Lähteinä on käytetty mm.seuraavia sanastoja, joista löytyy kattavampi lista termeistä:
http://www.netikka.net/herala/Sanak.html
http://www.doria.fi/bitstream/handle/10024/63381/isbn%209789522149701.pdf Sivu 111.
EDIT 19.9: Korjattu ulkoasua
EDIT 21.9: Korjattu koodiesimerkkejä
EDIT. 7.12.2016: lisätty metatietoja
EDIT. 23.2.2022: poistettu toimimaton osuus