Can You Control Hundred Computers?
Palvelinten hallinta - ICT4TN022-3014 - 2021 late autumn
Remotely control hundreds of machines, from cloud to laptop. Excellent 4.95/5 feedback, read student comments.
Linux course done, and now you want more? Your laptops keep moving around the network and go behind firewalls, but you still want to control them? You went to cloud, and have so many computers now? Palvelinten hallinta ict4tn022-3014.
Yes, you can still enroll. Yes it's popular and yes there is a queue, but I can often fit many students from the queue.
Update: New visitor: Arttu Uskali, Head of Support, Upcloud
Update: New visitor: Juho Syrjänen, Fraktio
Course name and code: | Palvelinten hallinta ict4tn022-3014 |
Timing | 2021 period 2 late autumn, w43-w50 |
Credits | 5 cr |
Classes | Thursdays 8:15 - 13:45, online, mandatory participation |
Max students | 30 (fully booked, enroll quickly to get a place in the queue) |
Language | Finnish (+reading material in English) |
Remote | Yes, fully remote |
Feedback | 4.95 / 5 Excellent feedback * |
Services | Moodle, Jitsi |
First class | 2021-10-28 w43 Thu 08:15, Tero emails video conference link |
* Two instances in 2021 spring, one had 4.9/5 feedback and the other had 5.0/5 (every participant gave feedback, every feedback was 5). Read student comments.
Just write what you want (idempotency). Control almost everything with one system (single source of truth). In plain text (infrastructure as code, versionable).
Control 10 computers. Or 100. Or 1000. Or control 2071 computers, like Jussi did on a previous course. Or handle 7 different operating systems (Linux, Windows, BSD...) and OS versions with a single master, like Matias.
My current research area is configuration management systems: I gave an invited speech in IEEE ICIM Chengdu and a plenary speech in IEEE ICIM Oxford; I’ve also been teaching these modern methods to companies. Previous feedback for this course has been from very good 4.3 to excellent 4.9 out of 5.
The course is in Finnish (and requires full fluency in Finnish), so the rest of this page is in Finnish.
Opintojakson suoritettuaan opiskelija
- Osaa hallita palvelimia kuvailemalla tavoitetilan (idempotenssi)
- Osaa tehdä asetukset pelkkänä tekstinä ja versioitavasti (infrastruktuuri koodina)
- Pystyy tekemään tavalliset ylläpitotoimet valitulla työkalulla Saltilla (yksi totuus)
Esitiedot
Esitiedot, kertaa nämä. Kysely toisella opetuskerralla.
Opettele komennot ja hakemistot ulkoa. Harjoittele niitä kokeilemalla moneen kertaan Linuxissa.
- Linuxin komennot, apt Command Line Basics Revisited
- Tiedostojärjestelmän rakenne (etc, var…). Alkeet löytyvät samasta Command Line Basics Revisited
- Demonien hallinta (esim Apache) Install Apache Web Server on Ubuntu (paitsi demonin potkaisu nykyisin 'sudo systemctl restart apache2')
Alustava aikataulu
Pidän kaikki kurssini kokonaan etäopetuksena syksyllä 2021. Kurssi kestää 8 viikkoa, 2021 periodin 2 eli loppusyksyn. Läksyt 24 h ennen seuraavan lähiopetuskerran alkua linkkinä Moodleen (vaatii Haaga-Helian tunnukset).
Tämä alustava aikataulu elää kurssin aikana.
Aihe | Viikko |
---|---|
1. Hei Salt! Orjakoneiden ohjaaminen tulimuurien takaa | w43 |
2. Infra koodina. Tärkeimmät funktiot. | w44 |
3. Git, maailman suosituin versionhallinta. Vierailu: 10:00 DevOps, Juho Syrjänen, Fraktio. | w45 |
4. Vierailu: Support for global public and private cloud. Arttu Uskali, Head of Support, Upcloud | w46 |
5. Demonit, package-file-service. | w47 |
6. Oikeaa elämää - oma miniprojekti | w48 |
7. Kertaus ja neuvoja omien järjestelmien hallintaan. 9 Sami Kivelä: Salt ja Windows. | w49 |
8. Omien miniprojektien esittely | w50 |
Arviointi
Osien ohjeelliset painoarvot ovat
- Kotitehtävät 50%
- Oma moduli 50%
Arvosana perustuu kokonaisarvioon suorituksista. Kaikki kotitehtävät pitää tehdä. Etäopetukseen pitää osallistua aktiivisesti.
Työkaluja kurssille
Remote Learning Tools for Tero's Courses
Anna palautetta
Palaute on todella tärkeä tapa kehittää kurssia – kiitos kommenteista jo etukäteen. Palaute kahteen kanavaan
1) Vapaamuotoinen palaute kommenttina tämän kurssisivun perään
Kysymyksiä tarvitse toistaa. Vapaamuotoiseen palautteeseen saa kirjoittaa mitä vain. Mutta tässä vinkiksi:
- Opitko jotakin – eli osaatko nyt sellaista, mitä et osannut ennen kurssia?
- Teitkö jotain ensimmäistä kertaa? Käytit jotain kieltä, tekniikkaa tai työkalua?
- Oliko opittu hyödyllistä? Luuletko, että sille on käyttöä esim. tulevaisuudessa töissä tai kotona?
- Mitä pidit esityksistä? Esitysten seuraamisesta, esittämisestä, aiheista?
- Mitä mieltä olit vierailijoista?
- Viihdyitkö kurssilla?
- Miten voisin parantaa kurssia?
- Suosittelisitko kurssia? Kenelle kurssi sopisi? Koulutoverille tai kollegalle?
2) Numeerinen palaute Haaga-Helian uuteen palautejärjestelmään
Vertailukohtana tyypillinen Haaga-Helian kurssi
Numeeriset: Asteikko 1-välttävä (huonoin) ... 5-kiitettävä (paras)
- Oma aktiivisuutesi opiskelussa 1-5
- Osaamistavoitteiden saavuttaminen 1-5
- Työskentelytavat tukivat oppimista 1-5
- Opiskeluympäristö tuki oppimista 1-5
- Hyödyllisyys työelämään 1-5
Avoimet kysymykset (näihin voi myös kopioida samat vastaukset jotka kirjoitit aiemmin)
- Mitkä asiat edistivät oppimistasi?
- Miten kehittäisit toteutusta / toteutuskokonaisuutta, jotta osaamistavoitteet saavutettaisiin paremmin?
Kokonaisarviosi toteutuksesta / toteutuskokonaisuudesta 1-5
Kiitos palautteesta ja jännittävästä kurssista!
Läksyt
Palautus 24 h ennen seuraavaa lukujärjestykseen merkittyä aikaa (riippumatta siitä, onko silloin videotapaamista). Weppisivulle (HTML), ja Moodleen pelkkä linkki. Halutessasi voit laittaa linkin myös kommentiksi tämän sivun perään, niin sivusi saa lisää kävijöitä ja nousee PageRankissa.
Nämä läksyt ovat alustavia. Läksyt ovat virallisia vasta, kun ne on annettu tunnilla. Tämä on edistynyt kurssi, joten pystymme tekemään muutoksia kurssin kuluessa ja sovittamaan läksyt aiheen mukaan.
h1 Hei maailma & monet tilat
z) Lue ja tiivistä kukin artikkeli muutamalla ranskalaisella viivalla. Tässä z-alakohdassa ei tarvitse siis tehdä testejä tietokoneella.
- Karvinen 2021: Salt Run Command Locally
- SaltStack Configuration Management: Get Started Tutorial
- Karvinen 2020: Command Line Basics Revisited
- Karvinen 2008: Install Apache Web Server on Ubuntu
Kertaa esitiedot ja opettele näiden esitietoartikkeleiden komennot ulkoa, eli "Command Line Basics Revisited" ja "Install Apache Web Server on Ubuntu".
Tee ja raportoi: Kokeet tulee tehdä tietokoneella ja kirjoittaa raportti samalla. Vaikka olisit joskus kokeillut samanlaisia asioita, pelkkä muistelu ei riitä, vaan testit tulee tehdä ja raportoida samalla.
a) Mikä meininki? Selvitä, mikä käyttöjärjestelmä (Linuxin versio) sinulla on käytössä, ja mikä Saltin versio.
b) Hei koodina! Tee "Hei Saltin maailma" omana erillisinä tiedostona (esim. /srv/salt/hellotero/init.sls)
c) Onko tietoa? Kerää jostain koneesta tiedot Saltilla, esimerkiksi käyttöjärjestelmä, vapaan muistin määrä, virtualisointi jne. Poimi tuloksesta olennaiset osat ja selitä ne.
d) Kultajyvät. Laadi komento, joka näyttää koneesta vain tärkeimmät tiedot (grains.item)
e) Tee oma konfiguraatio (infraa koodina), jossa on useampia tilafunktioita samassa tiedostossa.
f) Idempotenssi. Tee idempotentti esimerkkikomento saltilla. Aja komentoa useita kertoja. Osoita selitetyin esimerkein, että komentosi on idempotentti.
g) Omat mausteet. Kokeile jotain uutta (ei aiemmin kurssilla näytettyä) ominaisuutta kustakin tärkeimmästä tilafunktiosta pkg, file, service, user.
h) Vapaaehtoinen: kokeile Saltia Windowsissa.
i) Vapaaehtoinen: kokeile herra-orja -arkkitehtuuria yhdellä koneella, niin että herra ja orja ovat samalla koneella.
j) Vapaaehtoinen: lisää koneeseen orja, joka on eri koneella.
k) Vapaaehtoinen: asenna ja tee asetukset jollekin palvelimelle (Apache, SSHd...) Saltilla. (pkg-file-service)
Vinkkejä:
- Karvinen 2006: Raportin kirjoittaminen
- Mikä meininki? 'cat /etc/*version /etc/*release', 'uname -a', 'sudo salt-call --version' (tai grainsilla)
- Karvinen et al 2021: Can You Control Hundred Computers?: Comments
- Hei maailma tiedostosta - infra as code
- Ratkaisu ongelmaan: apt-get ei löydä paketteja (salt-minion, tree) Debian 11-bullseye:lla
- Tietoja koneesta: grains.items, grains.item
- Ohjeita 'sudo salt-call --local sys.state_doc|less'
- Omat mausteet: ohje yhdestä funktiosta 'sudo salt-call --local sys.state_doc pkg'
- Vaikeita kohtia? Ratko kaikki mitä osaat, raportoi ja palauta ajoissa. Vaikeasta tai kesken jääneestä kohdasta erityisen tarkka raportti: mitä teit, mitä tapahtui. Ota ruutukaappaukset ja sanatarkat virheilmoitukset talteen. Mistä arvelet ongelman johtuvan? Mitä ratkaisuvaihtoehtoja vielä voisi kokeilla? Löydätkö (esim virheilmoituksella hakemalla) lähteitä, joissa ehdotetaan ratkaisuja? Ja katsotaan yhdessä tunnilla loput.
h2 master-slave
z) Lue ja tiivistä, muutama ranskalainen viiva riittää.
- Karvinen 2018: Salt Quickstart - Salt Stack Master and Slave on Ubuntu Linux
- Karvinen 2017: Vagrant Revisited - Install & Boot New Virtual Machine in 31 seconds
- Karvinen 2021: Two Machine Virtual Network With Debian 11 Bullseye and Vagrant
- SaltStack contributors 2021: Salt system architecture
a) Two-face. Tee koneesta oma orjansa, eli asenna salt-master ja salt-slave samalle koneelle. Osoita, että voit ohjata orjaa tämän yhteyden yli.
b) Hello Vagrant! Asenna "debian/bullseye64" aloittamalla 'vagrant init' -komennolla. Kokeile asentaa jotakin uudelle virtuaalikoneelle. Poista lopuksi virtuaalikone. (Korjasin komennon salt init -> vagrant init)
c) Mun verkko. Asenna kaksi vagrant-virtuaalikonetta samaan verkkoon. Teron Vagrantfile voi olla hyödyksi. Kokeile kirjautua kummalekin koneelle. Kokeile pingata koneilta toisiaan. Kokeile pingata kummaltakin koneelta jotain konetta Internetissa.
d) Master-slave. Asenna äsken tekemillesi koneille Salt master-slave arkkitehtuuri niin, että toinen kone on herra ja toinen orja. Testaa asennuksen toimivuus.
e) As code. Kirjoita infraa koodina (esim /srv/salt/heitero/init.sls) ja ota nämä asetukset käyttöön orjalla. Käytä orjaa edellisestä kohdasta niin, että asetukset otetaan käyttöön verkon yli.
f) Vapaaehtoinen: kokeile Saltia jollain muulla alustalla kuin tunnilla käytetty Debian amd64.
g) Vapaaehtoinen: ohjaa kolmea orjaa.
Vinkkejä:
- Demonien käynnistys 'sudo systemctl start salt-master'
- Jos muokkaat jotain asetustiedostoa 'sudoedit /etc/salt/minion', käske myös tuon demonin lukea uudet asetukset 'sudo systemctl restart salt-minion'
- Vaikeita kohtia? Ratko kaikki mitä osaat, raportoi ja palauta ajoissa. Vaikeasta tai kesken jääneestä kohdasta erityisen tarkka raportti: mitä teit, mitä tapahtui. Ota ruutukaappaukset ja sanatarkat virheilmoitukset talteen. Mistä arvelet ongelman johtuvan? Mitä ratkaisuvaihtoehtoja vielä voisi kokeilla? Löydätkö (esim virheilmoituksella hakemalla) lähteitä, joissa ehdotetaan ratkaisuja? Ja katsotaan yhdessä tunnilla loput.
h3 Versionhallinta
z) Lue ja tiivistä artikkeli muutamalla ranskalaisella viivalla. Tässä z-alakohdassa ei tarvitse siis tehdä testejä tietokoneella.
- Commonmark contributors: Markdown Reference (huomaa ainakin otsikot risuaidoilla, kappalejako tyhjällä rivillä, sisennys (tab) koodia, lista, linkki, kuva.
a) MarkDown. Tee tämän tehtävän raportti MarkDownina. Helpointa on tehdä raportti GitHub-varastoon, jolloin md-päätteiset tiedostot muotoillaan automaattisesti. Tyhjä rivi tekee kappalejaon, risuaita ‘#’ tekee otsikon, sisennys merkitsee koodinpätkän.
b) Pull first. Tee useita muutoksia git-varastoosi. Tee muutama muutos, jossa yksi commit koskee useampaa tiedostoa. Anna hyvä kuvaukset (commit message), yksi englanninkielinen lause imperatiivissa (määräysmuodossa) "Add top level menu to Foobar synchronizer"
b) Kaikki kirjataan. Näytä omalla git-varastollasi esimerkit komennoista ‘git log’, ‘git diff’ ja ‘git blame’. Selitä tulokset.
c) Huppis! Tee tyhmä muutos gittiin, älä tee commit:tia. Tuhoa huonot muutokset ‘git reset --hard’. Huomaa, että tässä toiminnossa ei ole peruutusnappia.
d) Formula. Tee uusi salt-tila (formula, moduli, infraa koodina). (Eli uusi tiedosto esim. /srv/salt/terontila/init.sls). Voit tehdä ihan yksinkertaisen parin funktion (pkg, file...) tilan, tai edistyneemmin asentaa ja konfiguroida minkä vain uuden ohjelman: demonin, työpöytäohjelman tai komentokehotteesta toimivan ohjelman. Käytä tarvittaessa ‘find -printf “%T+ %p\n”|sort’ löytääksesi uudet asetustiedostot.
f) Vapaaehtoinen: Laita srv/salt/ gittiin. Tee uusi moduli. Kloonaa varastosi toiselle koneelle (tai poista srv/salt ja palauta se kloonaamalla) ja jatka sillä.
e) Vapaaehtoinen: Omaa koiranruokaa. Säädä jotain käyttämääsi konetta Saltilla.
h4 Aikajana
Vinkkejä:
- Lähes kaiken voi konfiguroida viidellä funktiolla: pkg-file-service (watch), user, exec.
- Asenna aina ensin käsin
- Ohjelmat tallentavat asetukset tiedostoihin. Joten aikajana tiedostoista näyttää, mitkä tiedostot pitää tehdä.
- Saltilla asennetaan ohjelma (pkg), laitetaan asetustiedostot paikalleen (file) ja lopuksi jokin ohjelma lukee tiedot (service-watch; työpöytäohjelma kun se avataan; pakettilista sudo apt-get update tai pkg-refresh).
- Testaa. Tee pienin testattava kokonaisuus kerralla.
a) Captain obvious. Linuxissa on paketinhallinta, joten ohjelmien asentaminen on yksinkertaista. Tee tila, joka asentaa 10 suosikkiohjelmaasi paketinhallinnasta. Tässä a-kohdassa voit jättää ohjelmat oletusasetuksille.
Vinkkejä: Asenna tässä a-kohdassa valmiiksi luotetuista pakettivarastoista, niin ei tarvitse asentaa uusia varastoja, ja tiedät saavasi vapaita ohjelmia. Ohjelmien asennus voi viedä aikaa, jos haluat seurata etenemistä komento komennolta niin 'sudo salt-call --local -l debug state.apply terosapps'. Sisäänrakennettu ohje kertoo, kuinka "pgks" toimii: 'salt-call --local sys.state_doc pkg.installed|less'
b) CSI Pasila. Tiedostoista saa aikajanan 'cd /etc/; sudo find -printf '%T+ %p\n'|sort|tail'.
- Anna esimerkki aikajanasta
- Selitä jokainen kohta komennosta, jolla aikajana tehdään. Vinkki: '%T+' löytyy 'man find' kohdasta printf.
- Aja jokin komento, joka muuttaa järjestelmän yhteisiä asetustiedostoja
- Ota uusi aikajana ja etsi muutos sieltä
- Onko samalla hetkellä muutettu yhtä vai useampaa tiedostoa?
c) Tiedän mitä teit viime kesän^H^H^H komennolla. Säädä jotain ohjelmaa ja etsi sen muuttamat tiedostot aikajanasta. Tee sitten tästä oma Saltin tila.
Vinkki: tässä kohdassa pitää muuttaa jonkin ohjelman asetuksia, pelkkä ohjelman asennus pkg.installed on liian helppoa.
d) Asenna jokin toinen ohjelma asetuksineen.
Vinkki: tässäkin kohdassa edellytetään asetusten muuttamista. Jos haluat, voit valita erilaisen ohjelman kuin c-kohdassa. Esimerkiksi jos asensit c-kohdassa demonin, voit asentaa tässä komentoriviohjelman tai graafisen käyttöliittymän ohjelman.
h5 Demonit
Vinkki: Ensin käsin, vasta sitten automaattisesti.
a) Watch it! Asenna Saltilla SSHD asetuksineen. Lisää ssh-demonille ylimääräinen portti. Osoita testein, että uusi portti toimii. Vaihda porttia masterilla olevasta asetustiedoston mallista (/srv/salt/sshd/sshd_config tms), aja tila orjille, ja osoita testein, että palvelin käynnistyy jos ja vain jos asetustiedoston malli masterilla on muuttunut. Vinkki: Karvinen 2018: Pkg-File-Service – Control Daemons with Salt – Change SSH Server Port
b) Securerer shell. Tee Saltin kautta jokin muu sshd:n asetus ja osoita, että se toimii. Siivoa sshd_configista turhat kommenttirivit. Laita tiedostoon kommentti, jossa varoitetaan, että tiedosto ylikirjoittuu automaattisesti. Liitä siivottu sshd_config vastaukseesi.
c) Maailman suosituin. Tee Salt-tila (eli formula, siis omaa infraa koodina), joka asentaa Apache-weppipalvelimen. Korvaa testisivu /var/www/html/index.html sivulla, jossa lukee vain "Hello".
d) Minä ja kissani. Lisää Apache-reseptiisi (siihen Saltilla kirjoittamaasi) tuki käyttäjien kotisivuille. Voit laittaa kotisivut päälle 'a2enmod userdir', ottaa /etc/-tiedostoista aikajanan ja tehdä tarvittavat symlinkit file.symlink.
e) Valmiiseen pöytään. Tee käyttäjille valmiit esimerkkikotisivut siten, että esimerkkikotisivu syntyy käyttäjää luodessa. Katso, että sivuille tulee oikea omistaja. Vinkki: /etc/skel/ kopioidaan luoduille käyttäjille. Kotisivuja etsitään osoitteesta /home/tero/public_html/index.html.
f) Mootorix. Tee Salt-tila, joka asentaa Nginx-weppipalvelimen ja tekee sille jonkin asetuksen. Vinkki: ensin käsin, vasta sitten automaattisesti. Tässä tehtävässä osa haastetta on selvittää, miten nginx otetaan käyttöön.
e) Vapaaehtoinen: Asenna ja säädä Saltilla jokin demoni, jota tunnilla ei ole käsitelty (eli muu kuin Apache, OpenSSH tai Nginx).
h6 Ikkuna ja projekti
z) Lue ja tiivistä artikkeli muutamalla ranskalaisella viivalla. Tässä z-alakohdassa ei tarvitse siis tehdä testejä tietokoneella.
- Karvinen 2018: Control Windows with Salt
- Karvinen 2018: Configure Windows and Linux with Single Salt Module
- SaltStack contributors 2021: Windows Package Manager
Tee tietokoneella ja raportoi:
a) Kerää tietoa Windowsista Saltilla. Mitkä kohdat ovat erityisesti Windowsin osalta kiinnostavia? Selitä kohdat. (Asenna tarvittaessa Salt Windowsiin, jos et tehnyt sitä tunnilla).
b) Asenna ohjelmia Windowsille Saltilla.
c) Draft zero. Tee ensimmäinen versio omasta miniprojektistasi. Sen ei tarvitse olla vielä valmis, vaan se voi vaikkapa toteuttaa pienen osan tarvittavasta toiminnallisuudesta. Jonkin (pienenkin) asian pitää kuitenkin toimia niin, että projektisi säätää jotain Saltilla tai vastaavalla työkalulla.
d) Tee omalle miniprojektille weppisivu. (Voi olla myös GitLabin/GitHubin automaattisesti README.md -tiedostosta tekemä).
Vinkkejä
Oman miniprojektin weppisivu:
Katso, että taitoksen yläpuolella (skrollaamatta) näkyy
- Projektin tarkoitus
- Lisenssi (saat vapaasti valita, suosittelen GPL 3)
- Ruutukaappaus lopputuloksesta
Ja sivulla on hyvä olla erittäin helppo ohje siitä, kuinka projektisi otetaan käyttöön / asennetaan.
Olisi mukava, jos mainitsisit, millä kurssilla projektisi on tehty.
Sivu voi olla englanniksi tai suomeksi, suosittelen englantia.
Voi mainita, missä vaiheessa projekti on, ja päivittää tätä tietoa projektin edetessä. Esimerkiksi "This pre-alpha project does not contain any code yet.", "I have tested this with two Linux virtual machines", "I've been using this daily for a week on my own main desktop" tai missä vaiheessa projekti ikinä onkaan.
Helpointa on tehdä projektille uusi Gitlab tai Github -varasto, ja julkaista sinne sitä mukaa kun projekti kehittyy.
Lisätietoja miniprojektista alla kohdassa h7.
h7 Oma miniprojekti - DL 2021-12-13 w50 ma kello 16:00
Tee oma miniprojekti, joka hyödyntää kurssilla opetettua modernia keskitettyä hallintaa.
- Projektilla tulee olla jokin tarkoitus (ei pelkästään esimerkkejä sekalaisista komennoista)
- Ja tästä kannattaa aina aloittaa, myös esitys
- Modernia keskitettyä hallintaa (suoraan kurssin tavoitteista)
- Idempotentti (shell script tai pelkkää cmd.run peräkkäin ei käy)
- Infraa koodina
- Yksi totuus
- Voit käyttää muutakin työkaluja kuin Saltia, kunhan periaatteet (idempotentti, infra koodina, yksi totuus) ovat samat
- Projektin sivusta on ohje edellisessä tehtävässä (tarkoitus, ruutukaapaus lopputuloksesta, lisenssi, ohje)
- Projektit esitellään viimeisellä tapaamiskerralla (demo olisi kiva)
- Ajoissa
- Projektin on valmistuttava ajoissa.
- Jos tulee kiire, tee suppeampi.
- Etene onnistumisesta onnistumiseen
- Tee ensin aivan yksinkertainen, toimiva projekti. Ja tallenna kopio tästä versiosta.
- Sitten tee hieman hienompi, ja testaa että se toimii. Tallenna kopio versiosta.
- Ja sitten isompi. Siis koko ajan toimivia versioita.
Huomaa määräaika.
Moodleen palautetaan projekin palautuksen yhteydessä linkki, josta löytyvät kaikki läksyt.
h7 Oma moduli
Tehtävä päivittyy
Oma moduli (iso tehtävä). Ratkaise jokin oikean elämän tai keksitty tarve omilla tiloilla/moduleilla. Voit käyttää Salttia tai muuta valitsemaasi modernia keskitetyn hallinnan ohjelmaa. Esitä tulos viimeisellä opetuskerralla, 5-10 min. Live demo olisi kiva. Raportoi modulisi tarkoitus, koodi ja testit.