sunnuntai 17. tammikuuta 2016

Racket - iskuryhmän materiaalin testaaminen oppilaiden kanssa

Tehtävien ideoinnin lisäksi Racket - iskutyhmä on testannut Koodausta kouluun ohjelmointimateriaaleja omien oppilaidensa kanssa. Tässä yhteenveto syksyn testaamisista.

Kämmenniemen koulu

9. luokka (tietotekniikkapainotus)

Testitunnit:
  1. Peruslaskut ja DrRacket-ympäristöön tutustuminen (1h).
  2. Peruskuvioiden piirtäminen ja kuvien yhdistely. Japanin lipun, Suomen lipun ja auton lisäksi osa ehti tehdä myös omia kuvia. (3h)
  3. Funktion käsitteeseen tutustuminen koodaamalla pinta-alan laskufunktioita sekä avaruuskappaleiden levityskuvia. (2h)
  4. Ehto- ja valintalauseisiin sekä vertailuoperaattoreihin tutustuminen harjoittelemalla ensin yksinkertaisia if-lauseita (lämmityksensäätely- ja portsari-funktio). Toisella tunnilla tehtiin monimutkaisempi valintalause (bussin rahastaja) sekä piilokuva (Saksan lippu). Tarkemmin tunneista täällä.(2h)
  5. Ryhmä testasi itsenäisesti Racket Turtlea seuraamalla materiaalin videoita. (2h)
  6. Viimeiseksi tehtiin vielä tietokilpailupelejä. (2h)
Osa Kämmenniemen koululla koodatuista Racket Turtle - kuvista (koottu Padlet-seinälle)
Tässä oppilaiden haastattelu kuuden viikon ohjelmointijakson jälkeen:

 
Takahuhdin koulu

Testitunnit:

7. luokka (matikkapainotus)
  1. Laskujärjestysharjoitus ja DrRacket:iin tutustuminen. (2h) 
  2. Peruskuvioiden piirtäminen sekä kuvien yhdistely, Japanin ja Suomen liput tai auto. (2h)
  3. Peruskuvioiden jälkeen tutustuttiin mm. "rotate", "scale" ja "crop" komentojen käyttöön, jonka jälkeen jatkoimme tehtäväsivuilta löytyviin "monimutkaisten kuvien" harjoitteluun. (3h)
  4. Oman ja luokan logon suunnittelu ja toteutus (2h)
8. luokka (matikkapainotus)
  1. Ryhmä tutustui Racket-koodaamiseen tekemällä laskujärjestysharjoituksen sekä piirtämällä peruskuvioita. Tarkemmin tunneista täällä. (3h)
  2. Racket Turtle peruskuvioiden piirtäminen.(2h)
  3. Jouluisten kuvien piirtäminen käyttäen hyväksi peruskuvioita ja niiden yhdistelyä. (2h)

Kevätlukukaudella on vielä tarkoitus koodata ohjelmat erilaisten pinta-alojen laskemiseksi.

Ylöjärven yhtenäiskoulu

Testitunnit:

7. luokka
  1. Laskujärjestysharjoitus ja DrRacket:iin tutustuminen (1h).
  2. Peruskuvioiden piirtäminen sekä kuvien yhdistely, Japanin ja Suomen liput tai auto. (2h)
Ylöjärvellä oli tulostettu opettajan materiaalista ohjediat tietokoneluokan seinälle
8. luokka (matematiikka)
  1. Laskujärjestysharjoitus ja DrRacket:iin tutustuminen (1h).
  2. Peruskuvioiden piirtäminen sekä kuvien yhdistely, Japanin ja Suomen liput tai auto. (2h)
  3. Funktion käsite kuvafunktioiden avulla sekä ehtolause ja valintalause ympyräanimaation yhteydessä (kasvava ja pienenevä ympyrä). Tarkemmin tunneista täällä. (2h)
  4. Oman animaation tekeminen valintalauseen ja funktion avulla. Tarkemmin tunneista täällä. (2h) 
Racket - animaatio, jossa pyöritetään Minion hahmoa
8. luokka (ohjelmointikurssi)
  1. Racketiin tutustuminen, peruskuvioiden piirtäminen, muuttujan määrittäminen (2h)
  2. Kuvioiden yhdistäminen ja muokkaaminen (4h)
  3. Funktioihin perehtymistä ja kuvioiden tuottamista funktioiden avulla (2h)
  4. Peruslaskutoimitusharjoituksia (2h)
  5. Prosenttilaskentaa, pinta-alojen ja tilavuuksien laskemista itse muodostettujen funktioiden avulla (3h)
  6. Funktioiden testitapausten muodostamista ja funktion testaamista (1h)
  7. Kuvioiden piirtämistä käyttäjältä kysytyn tiedon (display-read) perusteella (2h)
9. luokka (3 ryhmää, ryhmästä riippuen joko peruskuvioiden tuottamista tai funktion muodostamista)
  1. Racketiin tutustuminen
  2. Peruskuvioiden piirtäminen, muuttujan määrittäminen, kuvioiden yhdistäminen, peruslaskutoimitusharjoituksia ja funktioiden muodostamista sekä prosenttilaskentaa, pinta-alojen ja tilavuuksien laskemista itse muodostettujen funktioiden avulla (1-2h)
Kaukajärven koulu

Testitunnit:

8. luokka (ohjelmointikurssi)
  1. Peruskuvioiden piirtäminen sekä kuvien yhdistely, Japanin ja Suomen liput tai auto. (2h)
  2. Racket Turtle peruskuvioiden piirtäminen (kolmio, neliö, suunnikas, toisto). Tarkemmin tunneista täällä. (2h)
  3. Racket Turtle spiraalin tekeminen funktion ja map:in avulla. Tarkemmin tunneista täällä. (2h)  
Kauksun Turtlet
Tämän lisäksi Kaukajärven koulun kaikille matematiikan opettajille pidettiin 1,5h Racket alkeet perehdytys.

Tesoman koulu

Testitunnit:

7. luokka
  1.  Racket Turtle peruskuvioita (kolmio, kuusikulmio, suunnikas). (1h)
  2.  Racket Turtle peruskuvioita toiston avulla sekä värin vaihtaminen. (1h)
8. luokka
  1.  Funktiot ja muuttujat. Tarkemmin tunneista täällä. (1h) 
  2.  Kuvaajien piirtäminen plot2D:llä. Tarkemmin tunneista täällä. (1h)
Kuvaajia piirrettynä DrRacket:illä

9. luokka
  1.  Racket Turtle peruskuvioita, kuvia toiston ja värinvaihdon avulla. (1h)
Moision koulu

Testitunnit:
 
8. luokka (suurin osa koulun 8. luokista matematiikan tunneilla)
  1. Laskujärjestysharjoitus ja DrRacket:iin tutustuminen (1-2h).
  2. Peruskuvioiden piirtäminen sekä kuvien yhdistely, Japanin, Suomen, Saksan, Brasilian liput (tai auto). (1-2h) 
Moision koululla koodattuja lippuja
Tämän lisäksi Moision koululla pidettiin kaikille matikan opettajille 1h Racket alkeet perehdytys.

Lielahden koulu

Testitunnit:
 
7. luokka
  1. Peruslaskut ja DrRacket:iin tutustuminen. (1h)
  2. Vertailuoperaattorit, murtolukujen ja negatiivisten lukujen suuruusjärjestys. (1h)
  3. Peruskuvioiden piirtäminen ja tallentaminen. (1h)
8. luokka (AT pakollinen, 2 ryhmää)

  1. Peruskuviot ja DrRacket:iin tutustuminen. (1h)
  2. Kuvien yhdistely, Japanin ja Suomen liput. (1h)
8. luokan peliohjelmointikurssi 

Peliohjelmointikurssilla koodattiin "Whack-a-mole"-pelit Racket:illä. Peligrafiikat tehtiin GIMP2-ohjelmalla. Tunneista tarkemmin täällä. (4 x 2h)

Yksi "What-a-,mole"-peli Lielahden koulusta
Hatanpään koulu

Testitunnit:

8. luokka

Tutustui neliön ja neliöjuuren käsitteeseen Racket-harjoituksen avulla. (1h)
Neliön ja neliöjuuren käsitteen tutkimiseen tarkoitettuja Racket:illä piirrettyjä kuvia

Linnainmaan koulu

8. luokka (AT valinnainen, 2 ryhmää) 

Ryhmät ovat käyneet läpi Koodiaapisesta löytyvää materiaalia. Aikaa on ollut valinnaiskurssin takia mukavasti käytössä ja ryhmät jatkavat tästä keväällä eteenpäin.
  1. Laskujärjestysharjoituksia ja DrRacketiin tutustumista (2h)
  2. Peruskuvioiden piirtäminen, kuvien yhdistely, monimutkaiset kuvat (4h)
  3. Oman monimutkaisen kuvan suunnittelu ja toteutus (2-4h)
  4. Funktioihin tutustuminen ja niiden käsittely tehtävien avulla (pinta-alat, tilavuudet, kuvafunktiot) (4h) 
Linnanmaalla koodattuja Racket - kuvia

torstai 17. joulukuuta 2015

Racket Turtle - jatkot Kaukajärvellä

Kaukajärven ohjelmointikurssilaiset (8lk) tekivät kurssin päätteeksi Racket Turtlen - jatkotason tehtäviä. Ensin mietimme miten saisimme Turtlen tekemään perusspiraalin:

Tämä oli helppo tehtävä: jokaisella kierroksella pitäisi vain kulkea hieman pidempi matka. Tätä varten teimme funktion, joka osaa tehdä yhden MUUTTUVAN pituisen sivun:

(define (sivu matka)
    (list (forward matka)
           (turn-left 90)))

Seuraavaksi mietimme miten saisimme annettua tuolle funktiolle listan kasvavia matkan arvoja. Tutkimme interaktioikkunassa miten range - funktio toimii:

(range 0 100 5)

ja totesimme, että sen avulla saisimme tarvittavat matkan arvot. Vielä tarvittiin funktio joka syöttää nämä sivu-funktiolle ja olisimme valmiit:

(map sivu (range 0 100 5))

Tälle annettiin definellä nimi ja piirrettiin se:

(define spiraali (map sivu (range 0 100 5)))
(draw spiraali)

 Jotta spiraalia saataisiin enemmän ei ollut vaikea keksiä, että range:a piti lisätä.

Perusspiraalia lähdettiin sitten muuttaamaan, lisäämällä värejä (esim. antamalla värilista), sekä muuttamalla kulma joksikin muuksi kuin 90 astetta.

Kun kokeilut olivat tuottaneet hienoja kuvia ne tallennettiin taas Padlet - seinälle.

Toisella tunnilla opettelimme vielä leimasimen käytön ja lisäsimme hieman tähtiä spiraalien sekaan. Tällaisia hienoja kuvia syntyi tällä kaksoistunnilla:
Racket Turtle - taidetta à la Kauksu

Funktiotunti Tesomalla (jatko)

Jatkoimme 8lk kanssa polynomifunktioihin tutustumista. Kerroin, että polynomifunktioilla voidaan mallintaa vaikka lasten pituuskasvua ja muita oikean elämän ilmiöitä. Selitin, että erilaiset funktiot käyttäytyvät eri tavalla riippuen siitä ilmiöstä jota ne mallintavat. Sitten lähdimme tutustumaan erilaisiin polynomeihin.

Koska oppilaat eivät olleet vielä käyneet polynomeja matematiikan tunnilla niin selitin lyhyesti mikä on polynomi, termi, kerroin, muuttuja, vakio, ensimmäisen ja toiseen asteen polynomi. Sitten teimme funktiot seuraaville polynomeille (yksi funktio kerrallaan):

Koodina nämä näyttäisivät tältä:

(define (p1 x)
    (* 2 x))

(define (p2 x)
    (+ (* -2 x) 3))

(define (p3 x)
    (+ (- (expt x 2)) -3))

Jokaisen funktion koodaamisen jälkeen testasimme sitä interaktioikkunassa:

> (p1 4)
> (p2 10)
> (p3 3)

Ja testaamisen jälkeen teimme piirsimme niiden kuvaajat plot2D - kirjaston avulla (require teachpacks/plot2D):

 (plot2D (list (func p1 0 10)
               (func p2 0 10)
               (func p3 0 10)))


Tässä tuli testattua nyt sekin, että koodaamalla voi opiskella myös hyvin perinteisesti matematiikkaa. Toki mitään WOW-efektiä tässä ei tietenkään synny, ei opettajan eikä oppilaankaan taholta, kuvaajia kun voi piirtää monella muullakin ohjelmalla. Toki tässä on se hyöty, että ei tarvitse opetella montaa ohjelmaa kun samalla ohjelmalla voi hoitaa kaiken (ohjelmointi, kuvaajat jne.)

Vielä kun jostain löytäisi ne polynomifunktiot, jotka mallintavat niitä oikeita pituuskäyriä niin olisi saanut tämänkin asian lähemmäksi todellisuutta...

Ylöjärven animaatiot (jatko)

Viimeisellä kouluviikolla jatkoimme animaatioiden kanssa Ylöjärven yhtenäiskoulussa. Palautimme mieleen asioita kahden viikon takaa: muuttuja, funktio, ehtolause, vertailuoperaatio sekä animaatiomoottori (animate).
Uutena asiana otimme cond-valintalauseen, että saimme animaation tekemään useampaa kuin kahta juttua. Jatkoimme viimekertaisen ympyräanimaation kehittelyä jokainen omaan suuntaansa.

Aloitimme oman animaation tekemisen ensin vaihtamalla ympyrän johonkin muuhun kuvaan esim. tähteen (star, radial-star) ja vaihtamalla sille värin. Sitten muutimme koodin niin, että if:in tilalle vaihdettiin cond.

(define (oma-kuva t)
   (cond [(< t 250)
          (star t "solid" "purple")]
         [else
          (circle t "solid" "red")]))

Kaksi viikkoa oli aika pitkä aika muistaa se, että jos jätti tuon t:n pois ja kirjoitti vaikka 40 niin tähden koko ei muuttunut. Tässä tuli hyvin kerrattua jälleen kerran muuttujan käsite. Animaatiossa se vieläpä konkretisoituu niin hyvin, jos muuttuja ei ole käytössä niin kuva ei todellakaan muutu!

Cond-lause ei sinänsä tuottanut ongelmia mutta ehtojen säätäminen oli uusi asia, joka vaati miettimistä. Esim. moni kopioi ensimmäisen ehdon eikä vaihtanut lukuja, ja sitten ihmetteli miksi kolmas kuva ei koskaan tule esiin... No, miksiköhän ei?

(define (oma-kuva t)
   (cond [(< t 250)
          (star t "solid" "purple")]
         [(< t 250)
          (star t "solid" "yellow")]
         [else
          (circle t "solid" "red")]))

Toinen pohdinnan paikka tuli eteen siinä, kun animaatio piteni, jossain vaiheessa viimeiset kuvat putosivat pois. Tässä vaiheessa olisi pitänyt muistaa, että rajoitimme animaation t:n tietylle välillä. Jos olemme rajoittaneet t:n välille 0-199, tietenkään kuva jonka pitäisi tulla esiin kun t on 300-400 ei ikinä ilmesty. Tämän sai korjattua muokkaamalla modulo:a.

(define (kuva t)
  (place-image (oma-kuva (modulo t 400)) 

               250 250 
               (empty-scene 500 500)))

Viimekerralla tehty "kuha-kääntyy" funktio otetiin nyt käyttöön, kuvat laitettiin pyörimään, vaihtamaan väriä, suurenemaan ja pienenemään. Osa vaihtoi myös place-imageen x:n tilalle muuttujan, jolloin kuva lähti kulkemaan vasemmalta oikealla. Ja modulon avula se saatiin toistamaan samaan (nyt rajoittava arvo saatiin empty-scene:n leveydestä). Muutama oppilas lisäsi myös tekstiä  animaatioonsa.

Tässä yksi animaatio, jossa kuva pyörii, liikkuu eteenpäin ja mukana on myös teksti:



tiistai 8. joulukuuta 2015

Muuttuja, lauseke ja funktio - tunti Tesomalla

Tesoman 8.luokan matematiikan ryhmä aloitti tutustumisen Racket-ohjelmointiin tänään. Esimmäiseksi tutustuimme siihen, että on olemassa lukuja ja merkkijonoja. Testasimme niitä interaktioikkunassa. Muuttujan käsitteeseen törmäsimme kun keksimme kirjoittaa merkkijonon ilman "hipsuja" ja DrRacket ilmoitti "this variable is not defined".

Seuraavaksi määrittelimme muuttujia (sekä merkkijonoja, että lukuja) määrittelyikkunassa definen avulla, ja testasimme miksi luvussa ei saa olla hipsuja (sillä ei voi laskea).

(define a 5)
(define b 10)

Nyt kokeilimme laskea näiden muuttujien avulla esilaisia lausekkeita: yhteen-, vähennys-, kerto- ja jakolaskua (interaktioikkunassa):

> (+ a b)
> (- a b)
> (* a b)
> (/ a b)

Kokeilimme myös desimaalilukuja, negatiivisia lukuja sekä potenssiin korottamista expt:in avulla:

> (expt a b)

Sitten tutustuimme funktion käsitteeseen: sen avulla voidaan kirjoittaa laskusääntö, että jokin toiminto saadaan automatisoitua (esim. lentokoneen autopilotti). Piirsin taululle seuraavan kuvan:


Oppilaat saivat keksiä muuttujan nimen ja funktion säännön itse
Tämän koodasimme sitten funktioksi:

(define (plus3 a)
  (+ a 3))

Lisäsimme vielä lopuksi sille selityksen kommenttiriville:

; plus3 : Luku -> Luku

Lopuksi testasimme mitä tapahtuu kun funktiota kutsutaan eri arvoilla. Osa tajusi heti mitä seuraava rivi palauttaa:

> (plus3 100)

Tämän jälkeen ehdotin, että oppilaat olisivat tehneet jonkun oman funktion, mutta aika loppui kesken (ja olihan tässäkin jo hirveästi asiaa yhdelle oppitunnille). Seuraavalla kerralla jatkamme polynomifunktioiden kirjoittamista ja niiden kuvaajien piirtämistä DrRacket:illä.

Turtle-testausta Kaukajärvellä

Viime perjantaina joukko 8.luokan oppilaita ohjelmoi Racket Turtlea tekemään erilaisia geometrisia kuvioita. Ensimmäiseksi latasimme DrRacket:in Package Managerin avulla "teachpacks" paketin, jossa myös Racket Turtle - kirjasto on. Sitten latasimme Koodausta kouluun materiaalin sivuilta valmiin koodin, joka piirtää neliön. Tutkimme koodia yhdessä hidastetun piirtotoiminnon (step-by-step) avulla ja kun Turtlen ohjaamislogiikka oli selvillä oppilaat saivat tehtäväksi muuttaa koodi piirtämään kolmion. Osa sai kolmion valmiiksi nopeasti ja he siirtyivät kuusikulmioon ja neljäkkääseen. Kun kaikki olivat saaneet kolmion valmiiksi, näytin miten kuusikulmion sai tehtyä kätevämmin repeat - komennon avulla.

(define sivu
   (list (forward 100)
          (turn-left 60)))

(define kuusikulmio
    (repeat 6 sivu))

(draw kuusikulmio) 

Näytin vielä miten repeat:in avulla voi toistaa myös aikaisemmin piirretyn kuvion:

(define neliöt
    (repeat 4 neliö))

Kun repeat oli hanskassa ryhdyimme leikkimään sen avulla, ja toistimme jo valmiiksi saatuja peruskuvioita: neliötä, kolmiota, kuusikulmiota tai neljäkästä. Jotta kaikki kuviot eivät olisi vain sinisiä opettelimme vaihtamaan myös väriä change-color:in avulla. Osa oppilaista opetteli myös pen-up, pen-down ja go-to komennot, jotta sai kuvansa nätisti keskelle piirtoaluetta. Lopuksi oppilaat saivat ladata itse piirtämänsä Turtle-kuvan Padlet-seinälle kaikkien ihailtavaksi. Tällaisia niistä sitten tuli:

Kauksun Turtle-Padlet
Tämä ryhmä oli jo aikaisemmin tutustunut DrRacket:iin piirtämällä peruskuvioita sekä yhdistettyjä kuvia ja näiden Turtle kuvien tekemiseen meni yksi kaksoistunti. 

keskiviikko 2. joulukuuta 2015

Kämmenniemen koulun 9. luokan piilokuvatestausta

Ennen näitä tunteja Kämmenniemen koulun 9. luokka oli koodannut tänä syksynä Racket:illä jo vaikka mitä: peruskuvia (lippuja ja autoja), pinta-alafunktioita sekä avaruuskappaleiden levityskuvia. Tällä kaksoistunnilla tarkoitus oli tutustua totuusarvoihin, ehtolauseisiin sekä tehdä piilokuvaharjoitus.

Ensimmäisellä tunnilla lähdimme liikkeelle totuusarvoista. Kirjoitimme interaktioikkunaan true ja false totesimme, että ne ovat arvoja kuten luvut ja merkkijonotkin. Sitten kokeilimme vertailuoperattoreita. Annoimme ensin muuttujalle a arvon viisi, ja sitten teimme vertailuja sillä seuraavasti:

> (define a 5)

> (< a 5)
#false

> (= a 5)
#true

Tästä pääsimmekin sitten ehtolauseeseen (if), kokeilimme myös sitä interaktioikkunassa. Tätä testattiin muutaman kerran eri ehdoilla (if - lause palautettiin interaktioikkunaan painamalla Crtl+nuoliylös):

> (if (< a 5)
        "pienempi kuin 5"
        "suurempi tai yhtäsuuri")

Koska ryhmä oli tehnyt jo funktioita aikaisemmin, lähdimme tekemään funktioita, jotka käyttävät ehtolausetta hyväkseen. Ensimmäiseksi teimme funktion "lämmitin", jonka tehtävänä olisi pitää luokkahuone lämpimänä: aina kun lämpötila laskisi alle 22 astetta, lämmitin menisi päälle. Aivan ensimmäiseksi mietimme mitä muuttujia funktio tarvitsee ja mitä se palauttaa:


;; lämmitin : Luku -> Merkkijono 

Sitten kirjoitimme funktiolle rungon eli stub:in:

(define (lämmitin t) 
    "")

Sitten suunnittelimme funktion toiminnan käyttämällä check-expect - lauseita:

(check-expect (lämmitin 20)
              "lämmitin päälle")

(check-expect (lämmitin 25)
              "lämmitin pois päältä")

(check-expect (lämmitin 22)
              "lämmitin pois päältä")


Nyt tiesimme mitä funktiolta odotetaan, joten pystyimme täydentämään funktion rungon valmiiksi:

(define (lämmitin t)
  (if (< t 22)
      "lämmitin päälle"
      "lämmitin pois päältä"))


Tämän jälkeen oppilaat saivat suunnitella funktion "portsari", jonka piti päästää baariin sisälle vain täysi-ikäiset henkilöt. Tämä sujui hyvin, tosin osa portsareista ei ollut erityisen kohteliaita alaikäisille asiakkailleen. Toimivan portsarin jälkeen teimme vielä bussin "rahastaja":n, jonka piti matkustajan iän perustella palauttaa bussimatkan hinta. Päätimme, että hintaluokkia olisi: lapsi, nuori ja aikuinen (osa oppilaita otti mukaan myös seniorit). Tämäkin funktio tehtiin funktion suunnitteluportaiden avulla.

;; rahastaja : Luku -> Luku
(define (rahastaja ikä)

   0)

Sitten check-expect:it:

(check-expect (rahastaja 10)
              1)
(check-expect (rahastaja 13)
              1.20)
(check-expect (rahastaja 23)
              2)
(check-expect (rahastaja 18)
              2)
(check-expect (rahastaja 12)
              1.2)


Ja lopuksi funktio, jossa käytimme nyt cond - valintalausetta, että saimme useamman ehdon toimimaan kätevästi (perusrakenteen teimme yhdessä, tarkemman säädön jokainen sai tehdä itse):

(define (rahastaja ikä)
  (cond [(>= ikä 18) 2]
        [(< 11 ikä 18) 1.2]
        [else 1]))


Tämä funktio oli jo niin monimutkainen, että check-expectejä todellakin tarvittiin sen testaamiseen ja koodin saamiseksi oikein. Ensimmäisellä yrittämällä moni 18 täyttänyt pääsi nimittäin lastenlipulla (kun = merkki oli unohtunut koodista) eli rajatilanteiden testaaminen todellakin kannatti.

Näiden harjoitusten jälkeen otimme projektiksi piilokuvaharjoituksen. Koodiin tutustumisen jälkeen tehtäväksi tuli muuttaa koodia niin, että se tuottaa Saksan lipun. Tähän menikin sitten kaksoistunnin loppuaika ja lähes kaikki saivat lippunsa toimimaan. Yksi oppilas taisi ehtiä tehdä myös hieman haastavamman Suomen lipunkin.

Saksan lipun avulla opeteltiin valintalausetta ja vertailuoperaattoreita