8 Week Linux Course
Linux Palvelimet ict4tn021 3016 - Autumn 2021

Tux the Linux penguin

Learn to manage your own Linux server – in 8 weeks.

Beginners welcome. Previous instance student feedback excellent 4.8 out of 5. Course is in Finnish and 100% remote. Fully booked, queue started.

Course completed! Feedback was excellent 4.8 out of 5. Read more feedback in comments.

Course name and code:Linux palvelimet ict4tn021-3016
Timing2021 period 1 early autumn, w34-w41
Credits5 cr
ClassesTuesdays 8:15 - 13:45, online, mandatory participation
Max students30 (fully booked, queue started)
LanguageFinnish (+reading material in English)
RemoteYes, fully remote
Feedback4.8 / 5 Excellent feedback Five star experience
ServicesMoodle, Jitsi
First class2021-08-24 w34 Tue 08:15, Tero emails video conference link

The course is in Finnish (and requires full fluency in Finnish), so the rest of this page is in Finnish.

Tavoite

Aloita nollasta. Opiskele 8 viikkoa ja hallitset omaa Linux-palvelinta. Opintojakson suoritettuaan opiskelija:

  • Osaa hallita Linuxia palvelimena
  • Osaa tehdä tärkeimmät asetukset tärkeimmille palvelimille (Apache, OpenSSH)
  • Osaa asentaa www-ohjelmointiin sopivan alustan
  • Osaa tehdä itselleen uusia asetuksia palvelinohjelmistoihin ohjeiden avulla
  • Tietää esimerkkejä palvelintilan tarjoajista ja hinnoista sekä fyysisten palvelinten vastaavista ominaisuuksista

Osallistumiseen tarvitaan

  • Jitsi-videokonfferenssiin: tietokone, kuulokemikrofoni, kamera, internet-yhteys.
  • Linux-käyttöön: tietokone, jolla voit ohjeiden mukaan asentaa virtuaalikoneen ja Linuxin (edistyneemmät voivat toki asentaa Linuxin ihan oikean, erillisen koneen raudalle).
  • Aikaa: kahdeksan tiistaita oppitunteihin + joka viikko runsaasti aikaa läksyihin (oppitunneille pitää osallistua aktiivisesti ja kaikki läksyt palauttaa)

Linuxia ei tarvitse osata yhtään. Omalle tietokoneelle pitäisi osata asentaa ohjelmia, esimerkiksi virtuaalikone ohjeiden mukaan.

Aikataulu

Kurssin kahdeksan kertaa jakautuvat neljään osaan: peruskäyttö, demonit, automatisointi ja loppuhuipennus.

AiheViikko
1. Asennus, työpöytä ja lisenssitw34
2. Komentokehote, ylläpito ja paketinhallintaw35
3. Apache-weppipalvelinw36
4. Julkisen palvelimen ja nimen vuokraaminenw37
5. Ohjelmat weppipalvelimella, Python Flaskw38
6. Shell scriptitw39
7. Kertaus. Juho: IoT-lämpömittarit Flaskillaw40
8. Arvioitava lopputehtäväw41

Peruskäyttö

1. Asennus, työpöytä ja lisenssit FSF Free Software Definition, Rise of Open Source: Chapter 5. Raportin kirjoittaminen.

2. Komentokehote, ylläpito ja paketinhallinta w04 Command Line Basics, Commands for Admin.

Demonit

3. Apache-weppipalvelin Install Apache Web Server on Ubuntu Instant Firewall – sudo ufw enable.

4. Julkisen palvelimen ja nimen vuokraaminen Apachen oletussivu, Monta nimeä samaan IP-osoitteeseen. Virtuaalipalvelimia vuokrataan: Linode (associate link), Digitalocean, Amazon (monet Amazonin palvelut skaalautuvat automaattisesti, maksimihinnan rajoittaminen voi olla tarpeen). Julkisia nimiä vuokrataan: NameCheap, Gandi. Harjoittelua varten voit kokeilla myös http://www.dot.tk/ (ei tärkeille nimille). First Steps on a New Virtual Private Server – an Example.

Automatisointi

5. Ohjelmat weppipalvelimella. Palvelinpään ohjelmointi, Python Flask framework. Flask-asennus.

6. Shell scriptit, bash-skriptaus. Shell Scripting, aboutusers.sh, Over the Wire: bandit

Loppuhuipennus

7. Kertaus

8. Arvosteltava lopputehtävä

Suhde muihin kursseihin

Tälle kurssille ei vaadita mitään kursseja esitietoina.

Tämä kurssi (Linux palvelimet ict4tn021) on esitietona monille kursseille, esimerkiksi

Vanhoja kurssitoteutuksia

Vanhoilta kurssitoteutuksilta löytyy runsaasti opiskelijoiden palautteita ja linkkejä kotitehtävien esimerkkiratkaisuihin.

Vanhoja arvioitavia laboratorioharjoituksia:

Suoritukset

  • Läksyt
  • Aktiivinen etäosallistuminen opetukseen
  • Lopputehtävä (ilmoitetaan myöhemmin)

Arvosana perustuu kokonaisarvioon kurssisuorituksista.

Läksyt

Kotitehtäväraporttien linkit palautetaan 24 h ennen lähiopetuskerran alkua Moodleen, eli maanantaihin 08:15 mennessä.

Läksyt tehdään ja raportoidaan kunkin tunnin jälkeen. Tehtävät saa julkaista missä haluaa ja palauttaa linkin Moodleen. Kotitehtäväraportin tulee olla suoraan selaimella katseltavassa muodossa, tavallisena HTML-weppisivuna. Ei odt, ei odp, ei ppt, ei docx, ei doc, ei pdf. Kotitehtäviä ei voi palauttaa sähköpostitse. Linkit palautetaan Moodleen, mutta itse raportteja ei voi palauttaa Moodleen. Maksutonta kotisivutilaa saa esimerkiksi WordPress.com (helppo) ja GitHub.com.

Läksyt käydään läpi seuraavalla tapaamiskerralla, ratkotaan yhdessä ongelmia ja annetaan suullista palautetta. Arvosana kotitehtäväpaketista tulee vasta kurssin lopuksi, mutta tehtävät tulee silti palauttaa aina vuorokautta ennen seuraavia tunteja. Kurssilta poistetaan ne, jotka eivät ala suorittaa kurssia palauttamalla tehtäviä. Julkaiseminen on vapaaehtoista, mutta erittäin suositeltavaa. Jos et jostain syystä uskalla tai muuten halua julkaista, voit laittaa työn weppisivulle salasanan taakse (kaikille kotitehtäville sama salasana) ja jakaa tämän salasanan kurssilaisten kanssa. Jos tuntien yhteydessä järjestetään testejä läksyjen aiheista, niiden pisteet sisältyvät arvostelun kohtaan läksyt.

Muuta: Jos kurssilla otetaan riistiinarviointi käyttöön, määräaika siirtyy aiemmaksi. Jos haluat, voit laittaa Moodlen lisäksi linkin läksyihisi tämän sivun kommentteihin, jolloin sivusi saattaa nousta hakukoneissa.

Alustavat tehtävänannot

Tehtävät ovat virallisia vasta, kun ne on annettu tunnilla. Tehtävänannot muuttuvat vielä, koska tuntien aiheetkin voivat muuttua, ja lopullisessa arvioinnissa tehtävät arvioidaan niiden annettujen, virallisten tehtävien mukaan.

h1

a) Asenna Linux joko 1) VirtualBoxiin (helpompaa) tai 2) Kokeile omaa Linux-tikkua raudalla. Tämä kohta ei edellytä asentamista suoraan raudalle (koneelle ilman virtualisointia) – jos kuitenkin asennat, ota ensin varmuuskopiot. b) Listaa testaamasi koneen rauta (‘sudo lshw -short -sanitize’). Selitä listaus. c) Asenna kolme itsellesi uutta ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.
d) Mitä lisenssiä kukin näistä ohjelmista käyttää? Selitä lyhyesti, mitä oikeuksia ja velvolisuuksia tuosta lisenssistä seuraa. e) Listaa käyttämäsi ohjelmat (esim. MS Word), kunkin ohjelman käyttötarkoitus (esim. Tekstinkäsittely) ja vastaava vapaa Linux-ohjelma (esim. LibreOffice Writer). Jos johonkin tarkoitukseen ei löydy vapaata Linux-ohjelmaa, listaa sekin. f) Vapaaehtoinen lisätehtävä: varmuuskopioi tiedostosi (voit käyttää esimerkiksi ulkoista USB-levyä)

Vinkkejä

  • Debian Linuxin asentaminen virtuaalikoneeseen. Tunnilla on kätevä olla jokin Linux, ja virtuaalisesta on helppo aloittaa.
  • Live-tikkua kannattaa pitää aina mukana. Tikun teko: Windows: Rufus; Linux: gnome-disk-utility tai edistyneille dd. 'sudo apt-get update && sudo apt-get -y install gnome-disks-utility; gnome-disks'
  • Ohjelmien asennus onnistuu aptilla: 'sudo apt-get update', 'apt-cache search vector illustration', 'sudo apt-get -y install inkscape'.
  • Kotisivutilaa saa helposti ja mainosrahoitteisesti Wordpress.com:sta ja ilmaiseksi mutta haastavammalla käyttöliittymällä Githubista.
  • Raporttia kannattaa kirjoittaa koko ajan, samalla kun tekee. Mitä teit, mitä tapahtui, mitkä ovat päätelmät. Raportin kirjoittaminen.
  • Linuxille etsitään tietysti Linux-ohjelmat. Mieluiten ilmaiset ja vapaat ohjelmat. Ne ovat eri kuin Windowsille, esimerkiksi suljettulla rajoittavalla lisenssillä Illustrator, vapaa vastine Linuxille Inkscape.
  • Jos jäät jumiin: tee, raportoi ja palauta kaikki kohdat, jotka osaat. Raportoi jumiin jäänyt kohta erityisen tarkasti virheilmoituksineen. Katsotaan tunnilla yhdessä ratkaisut. Ja kahdeksan viikon päästä osaat Linuxia!

h2

  • a) Aiheuta lokiin kaksi eri tapahtumaa: yksi esimerkki onnistuneesta ja yksi esimerkki epäonnistuneesta tai kielletystä toimenpiteestä. Analysoi rivit yksityiskohtaisesti.
  • b) Tee unelmien apt-get -komento: yksi komentorivi, joka asentaa suosikkiohjelmasi.
  • c) Asenna komentokehotteen paketinhallinnasta kolme itsellesi uutta komentorivillä toimivaa ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.
  • d) Tarkista, että raporteissasi on lähdeviitteet: kurssiin, tehtävänantoihin, muiden opiskelijoiden raportteihin weppisivuihin, man-sivuihin ja kaikkeen muihinkin käyttämiisi lähteisiin. (tätä "Tarkista, .." alakohtaa ei tarvitse raportoida)
  • e) Opettele ulkoa ja harjoittele tärkeimmät komennot (tätä “opettele ulkoa” alakohtaa ei tarvitse raportoida):
    Karvinen 2020: Command Line Basics Revisited
  • f) Harjoittele komentokehotetta päivittäin. On hyvä, jos osaat komennot täysin automaatiotasolla lihasmuistista, kun siirrymme demonien pariin. (Kuten sovimme, tätä "Harjoittele komentokehotetta päivittäin" alakohtaa ei tarvitse raportoida)
  • g) Vaikeampi vapaaehtoinen bonuskohta, ei ole opetettu vielä: Asenna SSH-demoni. Kokeile omalla ssh-palvelimellasi jotain seuraavista: ssh-copy-id, sshfs, scp tai git. (Helpoin lienee scp: ‘scp foo.txt tero@example.com:’)

h3

Tee viisi vapaavalintaista [Update 2021-09-10:] neljä vapaavalintaista kohtaa. Säädä vaikeustaso oikeaksi: jos olet ihan alussa ja tämä on haastavaa, tee helpoimmat a b d i m. Jos osaat jo perusteet, tee useampia tai vaikeampia kohtia. Tarkoitus on, että tehtävät tehtyäsi osaat enemmän kuin osasit ennen. Tee tehtävät alusta lähtien koneella, vaikka olisitkin kokeillut samaa asiaa tunnilla.

  • a) Asenna Apache, laita käyttäjien kotisivut (http://example.com/~tero) toimimaan. Testaa esimerkkikotisivulla.
  • b) Surffaa oman palvelimesi weppisivuja. Etsi Apachen lokista esimerkki onnistuneesta (200 ok) sivulatauksesta ja epäonnistuneesta (esim 404 not found) sivulatauksesta. Analysoi rivit.
  • c) Tee virhe weppipalvelimella ajettavaan koodiin (esim PHP tai Python), etsi se lokista ja analysoi tuo lokirivi
  • d) Tee virhe johonkin Apachen asetustiedostoon, etsi ja analysoi tuo rivi. Etsimiseen sopivat esimerkiksi Apachen omat lokit, syslog sekä ‘apache2ctl configtest’.
  • e) Asenna ja kokeile PhpMyAdmin:a tai jotain muuta valmista weppiliittymää tietokantojen hallinnointiin.
  • f) Tee palvelimella ajettava weppiohjelma, joka tekee käyttäjälle jonkin yksinkertaisen laskun (esim. painoindeksi BMI)
  • g) Tee palvelimella ajettava weppiohjelma, joka käyttää tietokantaa. Voit tehdä jonkin yksinkertaisen CRUD-ohjelman, esimerkiksi TODO-listan
  • h) Tee Apachelle uusi sivu, joka näkyy suoraan palvelimen pääsivulla, mutta jonka sivuja voi muokata normaalin käyttäjän oikeuksilla (name based virtual host, DocumentRoot käyttäjän kotihakemistoon).
  • i) Kuinka monta eri HTTP Status:ta (200, 404, 500…) saat aiheutettua lokeihin? Selitä, miten aiheutit tilanteet ja analysoi yksi rivi kustakin statuksesta.
  • j) Asenna LAMP (Linux, Apache, MySQL, PHP). Testaa kunkin komponentin toiminta. Testaa lopuksi kokonaisuus. (Voit aloittaa tilanteesta, jossa Linux-käyttöjärjestelmä on jo asennettu, mutta ei muita (AMP) osia.
  • k) Kokeile jotain Flaskin uutta ominaisuutta flask-testipalvelimessa. Voit kokeilla esim. muotteja (templates), tietokantaa tai syötteiden ottamista lomakkeilta (forms).
  • l) Asenna Python Flask + PostgreSQL + Apache mod WSGI. Testaa kunkin komponentin toiminta. Testaa lopuksi kokonaisuus. (vaikea)
  • m) Vaihda Apachen oletussivu. Eli laita palvelimen etusivulla (ilman tildeä) näkyvä sivu niin, että alkuperäinen on jonkun käyttäjän kotihakemistossa ja voit muokata sitä ilman pääkäyttäjän oikeuksia.
  • n) Laita kaksi nimeä samaan IP-osoitteeseen. Voit simuloida nimipalvelun toimintaa /etc/hosts -tiedoston avulla. Eli niin, että samalla palvelimella osoitteella teronlenkkisivu.com tulee eri sisältö kuin osoitteella opipentest.com.

h4 - Oikea palvelin oikeaan nettiin

Vinkki: muista merkitä, mikä kohta raportissasi vastaa mihinkin alakohtaan a, b, c...

a) Vuokraa oma julkinen palvelin Internetiin. Vinkkejä: Perustele tehdyt valinnat. Voit saada myös ilmaiseksi Github Education -paketilla. Jos sinulla on aiempi palvelin, tee uusi alusta lähtien ja raportoi samalla. Käytä aina hyviä salasanoja.

ax) Vaihtoehtotehtävä, korvaa kohdan a. Suosittelen mieluummin tekemään a-kohdan, se on paljon hyödyllisempi. Kokeile virtuaalikoneiden tekoa vagrant:lla omalla paikallisella koneellasi. Sovella muut kohdat (b, c...) siten, että ne toimivat paikallisen koneen kanssa: esim testaa weppsivut paikallisesti curlilla, simuloi hyökkäys syöttämällä väärä salasana omaan ssh-palvelimeesi jne.

b) Suojaa palvelin tulimuurilla. Muista ensin reikä ssh-palvelimelle.

c) Laita koneellesi Apache-weppipalvelin. Korvaa testisivu. Laita käyttäjän kotisivut toimimaan. Kokeile eri koneelta, esim. kännykällä, että sivut toimivat. Vinkki: tee kotisivut normaalina käyttäjänä public_html/ alle, opettelemme "name based virtual hosting" myöhemmin.

d) Etsi lokeistasi merkkejä murtautumisyrityksistä ja analysoi ne. Vinkki: auth.log.

c) Vapaaehtoinen: Laita TLS-salakirjoitus (https) toimimaan Let's Encrypt avulla. Vinkki: certbot tai lego.

e) Vapaaehtoinen: Tee weppisivuja omalla, paikallisella koneellasi ja kopioi ne palvelimmelle scp-komennolla.

x) Vaikea, vapaaehtoinen vaihtoehtotehtävä Tämä on vain niille parille propellihatulle, jotka halusivat vaikeamman tehtävän. Korvaa muut h4 koti- ja tuntitehtävät. Koodaa ja julkaise uusi tietokantaa hyödyntävä weppipalvelu. Palvelun pitää ratkaista jokin käytännön ongelma, esimerkiksi ilmoittautuminen tapahtumaan, pisteytä tunti, äänestä suosikkia tms. Voit hyödyntää vanhoja koodejasi, kunhan lopputulos on uusi. Voit käyttää mitä vain kehitysalustaa (framework), esimerkiksi LAMP, Flask, Django, Postgre, Mariadb... Muista lisätä raporttiin ruutukaappaukset keskeisestä toiminnallisuudesta.

h5

Tehtävä on päivitetty ja valmis tehtäväksi. Tee kukin tehtävä alusta lähtien ja kirjaa samalla, vaikka olisit kokeillut tunnilla. Jos pidät propellihattua, katso kohta x.

a) Leikkinimi. Tee Apachelle uusi Name Based Virtual Host, ja testaa sitä simuloimalla nimipalvelua hosts-tiedoston avulla.

b) Julkinen nimi. Laita julkiselle palvelimellesi julkinen domain-nimi. Käytä oikeaa nimeä (joko vuokrattua tai ilmaispalvelusta). Tee Apachelle Name Based Virtual Host tälle nimelle. Kokeile eri laitteelta (esim. kännykältä), että nimi oikeasti toimii.

c) Hello Flask! Tee Python Flask hei maailma kehitysympäristössä. Voit siis käyttää tuotantoon sopimatonta app.run(debug=True) ajoa.

d) Tuotanto-Flask. Tee tuotantotyyppinen asennus Flaskista käyttäen Apachen WSGI-modulia. Kokeile, että pystyt muokkaamaan koodia ilman sudoa ja saat uuden version käyttöön käynnistämättä Apachea uudelleen. ('touch foo.wsgi')

e) Vapaaehtoinen bonus: Lisää tuotanto-Flaskiin muotit (templates).

f) Vapaaehtoinen bonus: Sun IP. Tee Flask-sivu, jolla näkyy tietoja käyttäjästä. Esimerkiksi request.user_agent.string, request.remote_addr. Muista "from flask import request".

g) Vapaaehtoinen bonus, haastavampi. Tee palvelinohjelma, joka laskee jotain käyttäjän antamista luvuista. Painoindeksi, tonttunimesi, pisteytys salasanallesi tms. Tässä tarvitaan lomakkeita (forms) ja POST-pyyntöjen lukemista.

x) Propellivaihtoehto, vapaaehtoinen, korvaa muut kohdat. Julkaise hyödyllinen Flask-ohjelma, joka käyttää tietokantaa ja lomakkeita. Hyöty voi olla pienikin, mutta ohjelman tulee tehdä jotain järkevää. (OK: äänestä paras kissankuva, ilmoittaudu arpajaisiin, nallekarhujen lainausjärjestelmä. Ei käy: lue esimerkkitietueita foo ja bar tietokannasta.) Hauskaa koodailua!

Vinkkejä:

h6

Update: muutin yhden kohdan vapaaehtoiseksi. Korjasin "tuotantopalvelin"->"tuotantotyyppinen asennus".

a) Uusi komento Linuxiin. Tee uusi komento, joka tulostaa käyttäjälle hyödyllistä tietoa. Kokeile, että komento toimii kaikista hakemistoista ja muillakin käyttäjillä kuin omallasi.

b) Parametreja. Tee skripti, joka ottaa komentoriviparametreja. Esim. 'greetuser Tero' joka tulostaa "moi" ja parametrinä olevan nimen, esim "moi Tero".

c) Monta polkua. Tee Flask-ohjelma, jossa on useampi polku. Esim "localhost:5000/foo" näyttää sivun, jolla lukee "Foo" ja "localhost:5000/bar" näyttää sivun, jolla lukee "Bar". Voit käyttää testipalvelinta.

d) Muotti. Tulosta Flaskilla sivu muotista. Voit käyttää testipalvelinta.

e) Vapaaehtoinen, suositeltava: The Real Deal. Laita c- ja d-kohtien ohjelma tuotantotyyppiseen asennukseen.

f) Vapaaehtoinen: ota käyttäjältä syötteitä lomakkeella Flaskiin.

g) Vapaaehtoinen: Neliö. Tee Flask-ohjelma, joka kysyy käyttältä sivun pituuden lomakkeella ("2") ja näyttää neliön pinta-alan (2*2 eli "4").

e) Vapaaehtoinen: Ensi kerralla Juho esittelee laajan IoT (esineiden Internet) -ohjelman Flaskilla. Vilkaise lähdekoodia etukäteen ja kirjaa lyhyesti tunnelmat vilkaisun perusteella.

Vinkkejä:

  • Hyödyllisiä ja hauskoja tietoja saa esim: uname -a; date --iso=min; cat /etc/lsb-release; uptime; w; whoami; last; hostname -I; df -h /home/
  • Parametrit ovat skriptissä automaattisesti muuttujissa $1, $2, $3... Tai kaikki $* (ja hienommin "$@")
  • Monta polkua: @app.route("/bar") ja @app.route("/foo")
  • Muotteja: return render_template("foo.html") näyttää muotin "templates/foo.html" Karvinen 2020: Flask Templates
  • Flask 1.1 QuickStart opettaa tunnilla näytetyt asiat ja paljon muutakin. (Ja tästä ohjeesta kannattaa käyttää samaa versiota joka sinulla on käytössä, 'apt-cache show python3-flask|grep ^Version')
  • Mozilla Developer Network MDN on paras lähde HTML:stä, esim. Your first form
  • Flaskia oppii lisää kurssillani Python Web Service From Idea to Production
  • Mukana on vaikeita kohtia. Jos jäät jumiin, tee ja raportoi ne mitkä osaat, ja katsotaan tunnilla yhdessä loput.

h7

a) Ratkaise valitsemasi vanha arvioitava laboratorioharjoitus tältä kurssilta. (Löytyy DuckDuckGolla, Googlella, linkeistä tältä sivulta tai hakemalla yläreunan hakutoiminnolla). Sovella tarvittaessa tehtäviä tähän toteutukseen sopivaksi, esimerkiksi PHP:n tilalta voi tehdä vastaavan Pythonilla; tai jättää pois jonkin epärelevantin kohdan.
b) Tarkista, että olet viitannut jokaisessa tehtävässä kaikkiin lähteisiin. Esimerkiksi kurssiin, tehtävänantoihin, käyttämiisi toisten kotitehtävärapotteihin, manuaalisivuihin, kotisivuihin... c) Kaikki tehtävät arvioitavaksi. Palauta linkki sivuun, josta löytyvät kaikki kotitehtäväraporttisi. Arviointi tehdään ensisijaisesti tästä linkistä. Linkki voi olla esimerkiksi blogin etusivu (jos blogissa on vain kotitehtävät) tai sivuun, jossa on linkki kuhunkin tehtävään. Kaikki tehtävät -linkin palautus Moodlessa kohtaan "Kaikki tehtävät arvioitavaksi". d) Tee uusi tyhjä virtuaalikone viimeisen kerran arvioitavaa labraa varten. Koneella ei saa olla luottamuksellisia tietoja. Kannattaa tehdä koneelle tarpeeksi iso virtuaalinen levy. Guest additions saa olla asennettuna. e) (vapaaehtoinen) Käytä Linuxia kurssin ulkopuolella.
f) (vapaaehtoinen) Varaa kalenteristasi viikon välein aikoja Linux-harjoitteluun kurssin jälkeen.

Muista ilmoittautua kursseille: Palvelinten hallinta (suositeltava kurssi tämän jatkoksi), Python weppikurssi w21 (varmistettu, toteutuu) ja Tunkeutumistestaus (jos täytät ennakkovaatimukset). Tervetuloa!

Adminstrivia

This has been updated after publishing, and will be updated as needed.

Tux logo by Larry Ewing.