(toiminnot)

hwechtla-tl: Nettipäiväkirja 02.01.2014

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


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).


kommentoi (viimeksi muutettu 02.01.2014 18:25)