Pidin taas muutamia oppitunteja lapsille. Mukavaa, kun on joululoma, niin ehtii tekemään tällaista. Yksityistunnit ovat lisäksi käteviä sikäli, että muut lapset saavat puuhailla mieleisiään asioita, kun yhdellä on oppitunti, eikä kukaan ylikuormitu (paitsi ehkä minä?).
Viisivuotiaalla oli Logo-kielellä "sotku-kehrä-vipperä"-oppitunti. Kutsun sitä näin, koska sen pointtina on lähteä liikkeelle jostain söheröstä, ja tehdä siitä aina vain suurempia kokonaisuuksia toiston avulla. Tämä tekniikka luo kaikenlaisia kauniita ja yllättäviä kuvioita suhteellisen pienellä vaivalla, ja kertaa komentojen määrittelyä siinä ohessa. On myös kivaa ohjelmoida vaihteeksi niin, ettei etukäteen oikein tiedä, mitä on tarkoitus saada tulokseksi.
Ensimmäinen ohje oli "tehdään komento nimeltä sotku, joka menee johonkin, kääntyy jonkin verran, menee lisää ja kääntyy taas". Tulos oli tällainen:
to sotku et 110 oi 110 et 37 va 37 end
Testailimme sitä muutaman kerran, ja panimme sitten Logon toistamaan sitä: "toista 30 [sotku]". Tällainen on paljon kirjoittamista viisivuotiaalle, mutta lapseni on onneksi aika kärsivällinen ja sitä paitsi ylpeä siitä, että muistaa, miten tehdään avaava hakasulje. Jee. Toistosta oli tuloksena hieno tähti. Muutimme sen määritelmäksi:
to tähti toista 30 [sotku] end
Lapsi halusi jo tulostaa tämän, mutta halusin demota vielä, miten paljon monimutkaisempia kuvioita saadaan aikaan. Teimme muutamia iteraatioita:
? toista 20 [va 20 tähti] ? toista 20 [va 50 tähti] (tässä vaiheessa lapsi väsyi kirjoittamaan) ? toista 6 [va 90 tähti]
Tähän viimeiseen oltiin tyytyväisiä. Koska kirjoittaminen väsytti, vaihdoimme osia: hän saneli minulle, mitä kirjoitetaan, ja minä kirjoitin. Tämä oli hyvä ratkaisu, jota voin tulevaisuudessakin käyttää.
to lumihiutale toista 6 [va 90 tähti] end
Sitten otettiin screenshot, tallennettiin määritelmät (save "hiutale.logo) ja lapsi alkoi väritellä lumihiutalettaan. Hieno lopputulos! Tietysti olisi voinut ottaa vielä yhden toista-tason lisää :)
Kymmenvuotiaan kanssa halusin palata shell-ohjelmointiin kahdestakin syystä. Ensinnäkin halusin näyttää lisää, mitä kaikkea ihmeellistä voimme saada aikaan shellin komennoilla. Toisekseen, halusin korostaa, miten komentojen määrittely Logossa ja komentojen määrittely shellissä on sama asia, mutta eri näköinen.
Lähdimme kokeilemaan dialog-komentoa. Sillä saa vähällä vaivalla aikaan tyylikkäitä curses-käyttöliittymiä. Ideana oli tehdä jonkinlainen monivalintoihin perustuva seikkailupeli (vaikka se tietenkin kannattaisi tehdä www-sivuna, kuten tämän wikin paikka: linnan portti).
Näytän tässä siistittynä koko session.
$ dialog $ dialog --yesno "teettkö itsarin" 10 60 $ dialog --menu "teettkö itsarin" 10 60 3 a "ehkä" b "joskus" c "ehkä en" $ dialog --no-cancel --menu "teettkö itsarin" 10 60 5 a "ehkä" b "joskus" c "ehkä en" $ dialog --no-cancel --menu "teettkö itsarin" 10 60 5 a "ehkä" b "joskus" c "enkä en" $ kysy () { dialog --no-cancel --menu "teettkö itsarin" 10 60 5 a "ehkä" b "joskus" c "enkä en"; } $ kysy $ kysy () { dialog --no-cancel --menu "$1" 10 60 5 a "ehkä" b "joskus" c "enkä en"; } $ kysy "olenko banaani" $ kysy () { dialog --no-cancel --menu "$1" 10 60 5 a "$2" b "$3" c "$4"; } $ kysy "olenko banaani" $ kysy "olenko banaani" joo ei "mies olet" $ kysy "oletko banaani" "enkä en" "kakka" "joskus" $ kysy () { dialog --no-cancel --menu "$1" 10 60 5 a "$2" b "$3" c "$4" 2>/tmp/vastaus; } $ kysy "oletko banaani" "enkä en" "kakka" "joskus" $ cat /tmp/vastaus
Kuten huomaatte, edellisen komennon palauttaminen historiasta on hyvin tärkeä ominaisuus. Yllä olevastakin on siivottu puolen tusinaa pieleen mennyttä komentoa pois. Ehdotin, että tehtäisiinkin monivalintatesti, esimerkiksi "oletko himokas luistelija" -testi. Mutta tässä vaiheessa lapsi sanoi, ettei enää oikein jaksaisi lisää. Niinpä vain tallensimme:
$ echo 'kysy () { dialog --no-cancel --menu "$1" 10 60 5 a "$2" b "$3" c "$4" 2>/tmp/vastaus; }' $ echo 'kysy () { dialog --no-cancel --menu "$1" 10 60 5 a "$2" b "$3" c "$4" 2>/tmp/vastaus; }' >kikkare $ cat kikkare $ ls
Eli tuloksena oli tällä kertaa yksi tiedosto, jossa yksi rivi, "kysy"-komennon määritelmä. Eiköhän tästä päästä myöhemmin eteenpäin. Testi-idea on siitä kiva, että siinä pystyisi käyttämään Unix-työkaluja frekvenssijakaumien laskemiseen (sort | uniq -c | sort -nr).