tiistai 8. joulukuuta 2015

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

Ylöjärven yhtenäiskoulussa koodattiin animaatioita

Olin maanantaina testaamassa Koodausta kouluun materiaalin animaatioharjoitusta Ylöjärven yhtenäiskoulussa. Testiryhmänä toimi puolikas 8.luokan ryhmä, joka oli aikaisemmin jo koodannut 2-3 tuntia Racket:illä (peruslaskuja, lippuja sekä autoja).

Nyt siirryimmekin jo aivan toiselle tasolle eli tutustuimme funktioiden määrittelemiseen, totuusarvoihin, vertailuoperaattoreihin sekä ehtolauseeseen. Aloitimme kertaamalla muuttujan käsitteen. Lippuja koodattaessa olimme käyttäneet jo muuttujia, ja palautimme mieleen miten muuttuja määritellään define:n avulla:

(define a 100)
(define väri "red")

Tämän jälkeen tutkimme miten saisimme tehtyä ympyrän, jonka säde ja väri on ilmoitettu muuttujien  avulla ja päädyimme tähän:

(circle a "solid" väri)

Nyt kokeilimme muuttaa a:n ja väri:n arvoa definessä ja huomasimme, että ympyräkin muuttui samalla. Tästä pääsimme hyvin siihen, että tarvitsemme muuttujia, mutta ne eivät pelkästään riitä, vaan meidän pitää saada nämä arvot jostakin, joten kirjoitimme tuon koodin ympärille funktion määritelmän:

(define (ympyrä a väri)
   (circle a "solid" väri))
  
Tätä testattiin interaktioikkunasta eri arvoilla ja todettiin se toimivaksi.

(ympyrä 100 "yellow")
(ympyrä 50 "blue")

Funktio-testausta
Nyt oppilaat saivat tehtäväksi määritellä jonkin toisen funktion, joka tekisi eri muotoisen kuvan. Tässä vaiheessa palautimme mieleen miten piirtofunktioita etsittiin Koodarin käsikirjasta. Teimme myös funktion, joka saa sisäänsä kuvan, jota se kiertää x astetta vastapäivään. Myös tätä testattiin.

(define (kierrä kuva asteet)
   (rotate asteet kuva))

Yksi pojista oli aikaisemmin koodannut USA:n lipun ja testaili sen pienentämistä ja suurentamista scale - funktion avulla.

Toisella tunnilla aloitimme tutustumaan animaatioihin. Kerroin animation - funktion toiminnasta, kuinka se kutsuu meidän "oma-kuva" - funktiota 28 kertaa sekunnissa luvuilla 0, 1, 2, 3, 4 ... jne. Selitin myös taululla piirtämäni kuvan avulla, miten empty-scene ja place-image toimivat. Sitten latasimme valmiin animaatiopohjan oppilaan tehtävät sivulta.

Kun painoimme "run", totesimme, että animaation punainen ympyrä ei värähdäkään ja pyysin oppilaita korjaamaan asian. Tämä oli yllättävän vaikeaa, vaikka olimme juuri tehneet vastaavan ympyrä - funktion, erot olivat vain pintapuolisia: funktion nimi oli eri (ympyrä vs. oma-kuva) ja muuttujan nimi oli eri (a vs. t). Pienen lypsämisen jälkeen joku ryhmästä keksi sen: muuttujaa pitää käyttää koodissa! Vaihdoimme siis 100:n t:ksi ja animaatio alkoi toimia.
 
(define (oma-kuva t)
  (circle 100 "solid" "red"))


Seuraava oppilaiden ihmettelyn aihe oli se, että miksi se vain jatkaa kasvamistaan. Miksi se ei pienene. Tähän oli helpompi vastata: koska sitä ei ole ohjelmoitu pienenemään. Se on ohjelmoitu vain suurenemaan. Tästä pääsimme hyvin siihen, että jotta se voisi pienentyä tarvitsemme koodiimme kaksi haaraa: "suureneva ympyrä" - haaran ja "pienenevä ympyrä" - haaran.

Lähdimme tutustumaan ehtolauseen käyttöön tutkimalla interaktioikkunassa ensin vertailuoperaattoreita <, > ja =. Kerroin, että nämä palauttavat totuusarvoja: #true ja #false ja että nämä ovat se tapa, jolla koodi saadaan haarautumaan "tosihaaraan" ja "epätosihaaraan".

>  (< 100 150)
#true

Näiden testailujen jälkeen testasimme interaktioikkunassa if-lausetta:

> (if (< 100 150) 
        "totta mooses"
        "väärin meni")

Kun kaikki olivat saaneet sekä "totta mooses" että "väärin meni" toimimaan, jatkoimme animaation kimpussa. Teimme siis ehtolauseen oma-kuva - funktioon.

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")

      (circle t "solid" "red")))

Nyt alkoikin sitten kova miettiminen miten ympyrä saadaan pienenemään eli mitä t:lle pitäisi tehdä. Kysyin oppilailta, että mikä laskutoimitus pienentää, ja vastaus löytyi heti: vähennyslasku. Sitten olikin hieman enemmän epäselvää mitä pitää vähentää mistäkin... Kun logiikkaa ei heti löytynyt totesin, että kokeillaan jotain, sitten nähdään mitä tapahtuu ja voidaan korjata sitä. Kokeilimme siis vähentää t:stä ensimmäisen ehdon raja-arvon (300).

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")
      (circle (- t 300) "solid" "red")))


Nyt ympyrä ei pienentynyt vaan palasi pieneksi ja lähti uudelleen suurenemaan. No seuraavaksi kokeilimme laittaa t:n ja 300 toisinpäin ehkäpä se auttaisi pienenemisessä?

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")
      (circle (- 300 t) "solid" "red")))


Nyt saimme tällaisen virheilmoituksen:
circle: expects a non negative real number as first argument, given -1

Tämän virheilmoituksen tulkinta oli helppoa: ympyrän säde ei voi olla negatiivinen. Ja negatiivinen säteen arvo koodissamme tulee heti kun t menee yli 300, koska:

> (- 300 301)
-1

Totesimme, että ehkä meidän pitää oikeasti miettiä miten tämän pitäisi toimia. Teimme seuraavan taulukon Word:illä:



Saimme tehtyä punaisen rivin perusteella yhtälön:

x - 301 = 299

Ja tämä saataiin ratkaistua:

x = 600

Ja nyt saimme lisättyä oikean arvon koodiimme:

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")
      (circle (- 600 t) "solid" "red")))


Ja nyt ympyrämme sekä suureni, että pieneni mutta törmäsimme lopuksi taas samaan ongelmaan:

circle: expects a non negative real number as first argument, given -1

Tämä oli jo helpompi ymmärtää, koska tässä toistui sama ongelma kuin ennenkin, nyt t menee yli 600 ja säde menee taas miinukselle:

> (- 600 601)
-1

Tähän otimme ratkaisuksi jakojäännöksen eli koodauskielellä modulon. Modulon avulla voidaan rajoittaa t:n arvot välille 0-599, jolloin emme joudu koskaan negatiivisiin säteisiin. Jakojäännöksen käsite oli hyvin hallussa oppilailla, koska seuraava päättely ei tuottanut mitään ongelmia:

601 / 600 jakojäännös on 1
602 / 600 jakojäännös on 2
603 / 600 jakojäännös on 3
...

Lisäsimme modulon koodiin ja animaatiomme toimi nyt niinkuin pitääkin.

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

                250 250 
               (empty-scene 500 500)))
Nyt oppilaat saivat muuttaa ympyrän muodon joksikin toiseksi, muuttaa värit haluamakseen jne. Yksi oppilas keksi kysyä miten animaatioon saisi enemmän haaroja, ja selitin miten valintalause (cond) toimii. Seuraavalla kerralla jatkamme näitä oppilaiden omia animaatioita, ehkäpä cond-lauseella terästettynä.
Yksinkertaisen ympyrä-animaation takana on yllättävän paljon matematiikkaa ja ohjelmointitietämystä

tiistai 24. marraskuuta 2015

Racket - iskuryhmän kolmas workshop

Tämän syksyn viimeisessä workshopissa kehittelimme tutustuimme Koodiaapinen MOOC:in Racket osion toteutukseen ja ideoimme tehtäviä todennäköisyyslaskennan, polynomilaskennan sekä suoraan- ja kääntäen verrannollisuuden opiskelemiseen.

1) Suoraan verrallisuuden havainnollistamiseen ideoitiin mopon kulutuksen koodaamista funktioksi, pisteiden laskemista ja plottaamista sekä suoran piirtämistä samaan kuvaan. Tämä vaatii lisäyksiä plot2D-kirjastoon.

2) Todennäköisyyslaskennasta voisi tehdä nopanheittosimulaattorin, eli arpoa 10, 100 ja 1000 nopan silmälukua ja piirtää niistä palkkidiagrammit ja verrata lähenevätkö ne laskettua todennäköisyyttä. Keskustelimme paljon siitä, tuottaako tietokone aidosti satunnaisia lukuja ja päätimme, että tämä täytyy vain testata.

3) Todennäköisyyttä voisi havainnoida myös radioaktiivisten atomien puoliintumisajan simulaation tai "tuplaa-panos"-pelisimulaation avulla (pienillä korteillä 1-6 tai isoilla korteilla 8-13 voittaa, 7 häviää aina).

4) Tutustuimme myös siihen miten Turtlelle saadaan generoitua map:in avulla pitkiä komentolistoja, ja teimmekin "random-Turtlen", joka kulki satunnaisen matkan satunnaiseen suuntaan. Tämä oli hauska eikä ollenkaan vaikea toteuttaa!

5) Lopuksi vielä pohdimme miten polynomilaskentaan voisi tuoda ohjelmointia, ja totesimme että lähdemme liikkeelle lausekkeen arvon laskemisesta ja teemme sitten jonkun oikeaan mittausdataan liittyvän polynomisovitteen kuvaajat.

Uusia ideoita siis syntyy jatkuvasti kun tämä joukko kokoontuu, nyt pitäisi vain työstää nämä tehtävien muotoon...

Tähän asti materiaalista on testattu peruslaskut ja peruskuvat, sekä geometriaan liittyviä funktioita ja ehtolauseista piilokuvat. Ensiviikolla testaukseen siirtyvät animaatiot sekä Turtle. Funktioiden parempi testaus siirrettiin keväälle, koska se tulee 9. matematiikassa esille vasta keväällä.

Random-Turtle kulkua (500 kierrosta):

 Koodi:
(require teachpacks/racket-turtle)

(define (kierros i)
  (list (turn-left (random 360))

        (forward (random 20))))

(define RANDOM-TURTLE (map kierros (range 0 500 1)))

(draw RANDOM-TURTLE)

maanantai 23. marraskuuta 2015

Racket - iskuryhmän toinen workshop

Racket - iskuryhmän toisessa workshopissa tutustuimme animaatioihin, joissa muuttujana on aika. Teimme ensin ufon laskeutumisanimaation, sitten laitoimme sen "rullaamaan" käyttämällä moduloa. Sitten käänsimme ufon kulkusuunnan nousuun, ja lopuksi teimme samaan animaatioon molemmat. Tässä harjoituksessa käytettiin ehtolauseita (if), valintalauseita (cond) sekä vertailuoperaattoreita (<, >, <=, >=, =). Kun systeemi oli selvillä iskuryhmän opettajat kokeilivat tehdä omia animaatioita, suurenevia ja pieneneviä palloja, väriä vaihtavia ja pyöriviä propelleja ja syntyi myös yksi pomppiva pallo joka "jousti" pompatessaan (litistyi ellipsiksi).
Animaation tekeminen havaittiin yllättävän matemaattiseksi harjoitukseksi, siinä joutui tekemään kuvan piirtofunktion (joutui miettimään muuttujia ja vakioita), miettimään jakojäännöstä (modulo) ja suunnittelemaan ehdollista suorittamista.
Käytimme tässä harjoituksessa big-bangiä, vaikka animate - funktio olisi toiminut aivan vastaavalla tavalla.

Tässä ufo-esimerkkianimaatio WeScheme:llä:

http://www.wescheme.org/view?publicId=f6lWg5Hmdg 

Yksinkertainenkin ufon lennättäminen vaatii matematiikkaa!

maanantai 21. syyskuuta 2015

Racket - iskuryhmän syksyn ensimmäinen Workshop

Eilen illalla Lielahden koulun ATK-luokka täyttyi Racket - iskuryhmän koodariopettajista. Workshop:ien idea on opiskella Racket - ohjelmointia yhdessä, jakaa kokemuksia ja vinkkejä sekä kehitellä uusia tehtäviä. Uusia opettajia oli saatu mukaan: Eeva Uitti (Ylöjärven yhtenäiskoulu), Kaisa Poikela (Kaukajärven koulu) sekä Sara Viertola (Pirkkalan yläaste).

Tällä kerralla esittelin ryhmälle DrRacket:in "pakettipalvelun", eli Package Managerin. Sen avulla asensimme koulun koneisiin koodaamiani apukirjastoja ml. Racket Turtlen sekä Display-read:in. Display-read kirjaston avulla voi kysellä helposti käyttäjältä tietoja, ja näiden avulla harjoitella vaikka if - rakennetta. Tämä kirjasto on vasta kehitteillä, joten siitä ei ole olemassa vielä valmiista käsikirja sivustoa. Racket Turtlen avulla taasen voi piirtää Turtle grafiikkaa, ja suurin osa iskuryhmää tutustuikin Turtlen ohjailemiseen Koodausta kouluun käsikirjan avulla.

Tässä joitakin illan aikana kehiteltyjä ja testattuja tehtäväideoita:

1) Ohjelma, joka kysyy käyttäjältä särmiön sivujen pituudet käyttäen display-read - funktiota, ja sen jälkeen kutsuu särmiön kokonaispinta-alan laskemiseen ohjelmoitua funktiota. Harjoitukseen kuuluu myös särmiön levityskuvan piirtäminen 2htdp/image kirjaston rectangle, above ja beside - funktioiden avulla. Sokerina pohjalla voisi olla vastaavan 3D - kuvion piirtäminen Racket Turtlella.

2) Ohjelma, joka kysyy käyttäjältä useamman suorakulmion kannan ja korkeuden tiedot display-read:in avulla (rekursiivisen silmukan avulla) ja sitten laskee pinta-alat, piirtää kuvat, vertailee pinta-aloja toisiinsa ja ilmoittaa suurimman. Päädyimme tallentamaan kannan ja korkeuden tiedot listan muotoon esim. (list (list 20 40) (list 40 50)(list 30 70)))

3) Ohjelma, joka laskee "vaatimattoman pojan" palkan. Eli, poika pyytää ensimmäiseltä päivältä palkaksi 2 senttiä, seuraavana päivänä 2 kertaa enemmän kuin edellisenä päivänä. Tehtävänä on laskea kuinka paljon hän saa rahaa 20 päivän työstä. Tämäkin tehtävä saatiin koodattua rekursion avulla, mutta mietittäväksi jäi voisiko sen tehdä vielä yksinkertaisemmin.

4) Racket Turtlella piirrettiin monenlaisia kuvioita, monikulmioita, ympyröitä yms. ja  yhdisteltiin niitä samaan kuvaan. Hienoimmassa kuviossa oli kolme eri väristä kolmiota kolmion muodossa ja niitä pyöriteltiin eri asentoihin repeat:in avulla!

Kouluilla, joissa oli jo kokeiltu Racket:iä saatiin palautetta, että kuvilla aloittaminen innosti ehkä enemmän kuin peruslaskuilla aloittaminen, tosin Ylöjärvellä 7. luokkalaiset pojat olivat innostuneet jopa niistäkin. Kaukajärvellä oli aloitettu motivointitunnilla, eli kerrottu mitä ohjelmointi on ja miksi se on tulossa kouluun, ja tämä oli auttanut oppilaiden innostuksen herättämisessä. Hatanpäällä oli 8. luokan matematiikan tunnilla tutkittu DrRacketin avulla neliön ja neliöjuuren konseptia opettajan itse laatiman monisteen ja koodin pohjalta, ja Lielahdessa DrRacketillä oli selvitetty lukujen suuruusjärjestyksiä käyttämällä vertailuoperaatioita (<, > ja =).

DrRacket oli myös saapunut koulujen ohjelmistojakeluun (viimein), joten nyt loputkin koulut pääsevät asentamaan ohjelmaa.

Ilta oli mitä antoisin! Oli hienoa huomata, että omia tehtäväideoita oli alkanut syntymään ja että käsikirja tuntui toimivan hyvin!

Näihin tarvitaan vain rectangle, above ja beside

perjantai 11. syyskuuta 2015

Racket iskuryhmä Takahuhdissa

Tänään aloitimme Koodausta kouluun materiaalin testaamisen oikeiden oppilaiden kanssa. Ensimmäinen testiryhmä oli Takahuhdin koulun 8. luokan matematiikkapainotuksen ryhmä.

Aloitimme asentamalla DrRacket:it luokan koneille ohjelmistojakelun kautta (SW center). Luokassa oli 25 konetta, joista 7:ään ei saatu syystä tai toisesta DrRacket:iä joten nämä oppilaat tekivät harjoituksia WeScheme-sivuston kautta. Tunnin jälkeen asennus saatiin toimimaan vielä kahteen koneeseen, lopuissa oli ohjelmistojakelusta johtuva ongelma, joka annettiin Fujitsulle selvitykseen.

1. Oppitunti

Aloitimme tutustumalla työkaluihin kirjoittamalla komentotulkkiin erilaisia juttuja. Aivan ensin, käänsimme DrRacket:in ikkunat vierekkäin (View -> Use Horizontal layout), koska käytössä oli nyt WeScheme:kin ja sen ikkunat ovat vierekkäin (selkeämpää oppilaiden seurata opettajan koneella tapahtuvaa toimintaa). Kasvatin myös opettajan koneen fontin isommaksi, että se näkyi myös luokan taakse (DrRacketin asetusten kautta).

Kerroin oppilaille, että Racket-tulkki on melko älykäs ja että sille voi heittää kokeeksi erilaisia kysymyksiä. Testasimme esim. mitä se vastaa jos sille sanoo:
> 6

Ja totesimme, että sehän vastasi että 6. Kokeilimme antaa sille myös merkkijonon:
> "Tiina"

ja totesimme, että se vastaa taas saman. Sitten joku keksi kirjoittaa, että 
> r u stupid?

Ja sai vastauksesksi:
r : this variable is not defined

Tästä olikin helppo lähteä puhumaan muuttujista, ja kerroin, että DrRacket ei tiedä mitä tuo tarkoittaa ennen kuin kerromme sen sille. Sitten "opetimme" Racket-tulkille uusia sanoja kirjoittamalla define-lausekkeita määrittelyikkunaan:
(define LOL "Lot's of laughs")
(define ;-/ "Not so happy")

Nyt saimmekin tulkilta jo monipuolisempia vastauksia. Tässä vaiheessa oppilaat jo kokeilivat innoissa mitä kaikkea saisivat tulkin vastaamaan :-) Huomasin, että osa tulkeista palautteli balettiin osa jääkiekkoon liittyviä merkkijonoja. Moni yritti antaa muuttujalle moniosaista nimeä ja korjasimme näitä lisäämällä alaviivoja esim.

(define r_u_stupid? "Yes I am")

Sitten selitin, että ohjelmoinnissa muokkaamme tietoa, ja että Racket kielessä operaatiot jotka muokkaavat tietoa ovat nimeltään funktioita. Tutustuimme yksinkertaiseen funktioon nimeltä + ja kävimme sen avulla läpi Racket-kielen syntaksin. Ensin sulkuauki-merkki, sitten funktion nimi, sitten argumentit ja lopuksi sulkukiinni-merkki.

Kokeilimme läpi kaikki peruslaskutoimitukset: + - * /. Näiden jälkeen kokeilimme yhdistää lausekkeita ja selitin että lausekkeet ovat sisäkkäin kuin maatuskanuket. Testasimme lausekkeiden yhdistämistä kirjoittamalla määrittelyikkunaan ensin matemaattisen lausekkeen kommenttiriville. Selitin, että kommenttimerkillä ; merkityn rivin yli hypätään kun koodia suoritetaan.
; (3 + 5) / (4  - 2)

Tämä lauseke muunnettiin Racket-kielelle ja katsottiin sen suoritus läpi stepperillä vaihe-vaiheelta ja huomattiin kuinka evaluointi tapahtuu sisältä ulospäin. Nyt oppilaat saivat keksiä oman laskulausekkeensa ja tutkia sen toimintaa stepperillä. Ne joilla oli WeScheme käytössä tekivät tämän vieruskaverinsa kanssa (WeSchemessä ei ole stepperiä).

Tässä vaiheessa tutustuimme myös virheilmoituksiin, erityisesti siihen miten puuttuva sulku ilmoitetaan ja miten DrRacket näyttää valmiin sulkuparin harmaana. 

2. Oppitunti

Latasimme Koodausta kouluun oppilaan tehtävistä Peruslaskut-tehtävän tiedostot ja oppilaat lähtivät koodaamaan niitä. Homma sujui hyvin, mutta moni unohti laittaa + ja - merkkien sekä lukujen väliin välilyönnin esim.(-2 4), jolloin Racket tulkitsi - merkin luvun etumerkiksi, ei funktion nimeksi ja siitä aiheutui seuraava  virheilmoitus:

Tämä asia kun opittiin katsomaan niin ryhmä koodasi näppärästi tehtäviä eteenpäin. Tehtävien määrä ja taso tuntui sopivalta, ja muutama ehti tehdä ne kaikki tunnin aikana. Lopputunnista tarkastimme vastaukset tykin kautta opettajan materiaalin mallivastauksista ja korjailimme lausekkeita oikeiksi. Oppilaat osasivat matematiikan laskujärjestyssäännöt mutta niiden ohjelmoiminen oikein olikin sitten aivan eri juttu.

3. Oppitunti

Viimeisellä oppitunnilla pääsimmekin sitten kuvien kimppuun. Kuviin tutustuimme avaamalla Koodarin käsikirjasta kohdan 3. Kuvat - 2htdp/image. Selitin, että Racket kielessä ei ole kuvan piirtofunktioita valmiina mutta, että voimme "laajentaa DrRacketin taitoja" ottamalla käyttöön kirjaston. Katsoimme käsikirjasta miten kirjasto otetaan käyttöön  ja kirjoitimme määrittelyikkunaan:

(require 2htdp/image) 

ja painoimme "run". Sitten avasin Käsikirjasta peruskuviot kohdan ja esittelin ensimmäisen piirtofunktion square. Selitin mitä eri argumentit tarkoittavat ja näytin, että käsikirjassa on kaikkiin funktioihin vastaava kuvaus ja esimerkit. Kirjoitimme komentotulkkiin esimerkin mukaan

> (square 50 "solid" "red")

Kehoitin oppilaita tutustumaan loppuajan itsenäisesti käsikirjan avulla eri piirtofunktioihin. Tämä onnistui hyvin, oppilat osasivat Käsikirjan avulla piirtää tähtiä, neljäkkäitä, ellipsejä ja jopa muuttaa tekstiä kuvaksi. Näytin vielä lopputunnista miten käsikirjasta löytää lisää värejä sekä miten tehdään oma väri make-color:in avulla ja tallennetaan se muuttujaan LEMPIVÄRI. Tässä vaiheessa moni laittoi erehdyksessä hipsut LEMPIVÄRI:n ympärille, joten palasimme siihen mikä on "merkkijono" ja mikä on MUUTTUJAN-NIMI.

(define LEMPIVÄRI (make-color 33 220 220))
(define NELIÖ (square 200 "solid" LEMPIVÄRI))

Sitten olikin jo aika tallentaa tuotokset kotihakemistoon. Ne jotka käyttivät WeScheme:ä siirsivät koodin Muistio-ohjelmaan ja tallensivat sen sitä kautta *.rkt tiedostoksi (WeSchemessä tallentaminen ei onnistunut koska Google-tunnukset olivat unohtuneet).

(square 200 "solid" LEMPIVÄRI)
Oppitunnit sujuivat hyvin, oppilaat koodasivat ahkerasti ja kokeilivat juttuja itsenäisesti. Tämä ryhmä kuunteli hyvin opettajan ohjeet ja osasi lukea myös käsikirjaa. Kotihakemistoon tallentaminen, kansion luominen, ja kahden ikkunan avaaminen vierekkäin näytölle olivat osalle oppilaista uusia juttuja.



En ole aikaisemmin vetänyt koodaustunteja näin, mutta hyvin tuntui uppoavan. Tässä lähestymistavassa hyvää oli se, että virheilmoitukset alkoivat heti saada sisältöä, koska olimme puhuneet heti merkkijonoista ja muuttujista. Ja käsikirjan käytön opettelu kuvien avulla tuntui myös  toimivan hyvin (tämä oli ensimmäinen kerta kun käytin käsikirjaa oppitunnilla).

Nyt on taas hyvä fiilis jatkaa materiaalin kehittelyä. Ainakin tällä ryhmällä suunnitelmien mukainen aloitusjakso toimi todella hyvin.