summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--blog/otherpost.txt~4
-rw-r--r--blog/post.org~4
-rw-r--r--blog/tekstinsyotto.html~312
-rw-r--r--fi/blog/index.org (renamed from blog/index.org)0
-rw-r--r--fi/blog/post.org (renamed from blog/post.org)0
-rw-r--r--fi/blog/sivujen-uudistus.org8
-rw-r--r--fi/blog/tekstinsyotto.html (renamed from blog/tekstinsyotto.html)0
-rw-r--r--fi/blog/yksinkertaisesti-monipuolinen.txt (renamed from blog/yksinkertaisesti-monipuolinen.txt)0
-rw-r--r--fi/index.org8
-rw-r--r--fi/pgp.org3
-rw-r--r--generated/blog/otherpost.txt4
-rw-r--r--generated/fi/blog/index.html (renamed from generated/blog/index.html)14
-rw-r--r--generated/fi/blog/post.html (renamed from generated/blog/post.html)16
-rw-r--r--generated/fi/blog/sivujen-uudistus.html221
-rw-r--r--generated/fi/blog/tekstinsyotto.html (renamed from generated/blog/tekstinsyotto.html)0
-rw-r--r--generated/fi/blog/yksinkertaisesti-monipuolinen.txt (renamed from generated/blog/yksinkertaisesti-monipuolinen.txt)0
-rw-r--r--generated/fi/index.html221
-rw-r--r--generated/fi/pgp.html212
-rw-r--r--lisp/org-publish-project-alist.el47
20 files changed, 721 insertions, 355 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e489128
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*#
+*~ \ No newline at end of file
diff --git a/blog/otherpost.txt~ b/blog/otherpost.txt~
deleted file mode 100644
index def158f..0000000
--- a/blog/otherpost.txt~
+++ /dev/null
@@ -1,4 +0,0 @@
-
-This is a plain text file
-
-* Please do not modify this
diff --git a/blog/post.org~ b/blog/post.org~
deleted file mode 100644
index 2cb70e1..0000000
--- a/blog/post.org~
+++ /dev/null
@@ -1,4 +0,0 @@
-
-* This is a blog post
-
-Lorem ipsum
diff --git a/blog/tekstinsyotto.html~ b/blog/tekstinsyotto.html~
deleted file mode 100644
index b828d01..0000000
--- a/blog/tekstinsyotto.html~
+++ /dev/null
@@ -1,312 +0,0 @@
-<!DOCTYPE html>
-<html lang="fi">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <link href="/global.css" rel="stylesheet" type="text/css">
- <title>Tarina toimivamman tekstinsyöttämiseni taustalla</title>
- </head>
-
- <body>
- <a id="skiptocontent" href="#content">Siirry pääsisältöön</a>
- <header>
- <a href="/fi/">FI</a> · <a href="/en/">EN</a>
- </header>
- <main id="content">
- <h1>Tarina toimivamman tekstinsyöttämiseni taustalla</h1>
-
-<p>Näppäimistöni ovat aina herättäneet hilpeyttä ystävieni keskuudessa.
-Koska ensimmäisessä blogikirjoituksessani kerroin, kuinka näppärää raakateksti voi olla,
-lienee sopivaa luoda katsaus,
-miten kirjoitan ohjelmakoodia ja muuta raakatekstiä tietokoneella,
- ja kuinka ohjelmisto- ja laitteistoratkaisuni tekstinmuokkauksen suhteen ovat muuttuneet ajan saatossa.</p>
-
-
-<p>Joskus lukion alkupuolella siirryin asteittain käyttämään Linuxia,
-ensin MinGW:n* kautta, sen jälkeen rinnakkain Windowsin kanssa
-ja myöhemmin ainoana käyttöjärjestelmänäni.
-Linuxin muokattavuus auttoi minua ymmärtämään,
-että kykenen itse vaikuttamaan siihen,
-miten ergonomisesti ja tehokkaasti kykenen työskentelemään tietokoneellani.</p>
-
-<p>Kun etsin tietoa netistä ratkaistakseni erinäisiä haasteita,
-en voinut olla törmäämättä mainintoihin Vim-ohjelmasta.
-Se on juurikin eräs ratkaisuista,
-jotka ovat auttaneet minua parantamaan työskentelyni sujuvuutta.</p>
-
-<p>Vim on tehokas tilapohjainen tekstinmuokkausohjelma.
-Sen tärkeimmät tilat ovat liiketila ja tekstinsyöttötila.
-Tekstinsyöttötilassa kirjoitettu teksti päätyy kulloinkin auki olevaan tiedostoon**.
-Liiketilassa taas voi siirtää kursoria ja suorittaa komentoja.
-Liiketilan erillisyys tekstinsyöttötilasta on äärimmäisen hyödyllistä;
-liiketilassa se mahdollistaa tavallisten kirjainten käytön liikkumis- ja yleiskomentoja vastaavina näppäinyhdistelminä.
-Kursoria liikutetaan HJKL-näppäimillä nuolinäppäinten tavoin,
-"N G" siirtää kursorin riville N, "$" taas rivin loppuun,
-"y y" kopioi rivin, jolla kursori on ja niin edelleen.
-Kaikkeen löytyy näppäinyhdistelmä.
- Liiketilassa on helppoa yhdistellä, toistaa ja ketjuttaa komentoja.
-Vimin etsi ja korvaa -toiminto on tehokkain, minkä olen nähnyt missään koodieditorissa.</p>
-
-<p>Tehokkaan tekstinmuokkauksen lisäksi
-Vimin toimintaa voi muokata tarkemmin kuin useimpia muita tekstinmuokkausohjelmia.
-Yksi osa tätä on nimenomaan liiketila – voit helposti lisätä näppäinyhdistelmiä, jotka tekevät mitä ikinä tahdot.
-Pitkälti kaikkia varsin laajassa dokumentaatiossa [1] mainittuja komentoja ja muuttujia voi muokata omien mieltymystensä mukaan.
-Vimiin on saatavilla runsaasti lisäosia [2], jotka voivat esimerkiksi lisätä Vimin yhteensopivuutta muiden ohjelmien kanssa.
-Olen sittemmin siirtynyt käyttämään Neovimiä.
-Se on Vimin modernimpi ja toteutukseltaan kevyempi***, mutta käytännössä samat ominaisuudet sisältävä versio.
-Neovim sisältää sisäänrakennettuna jopa LSP-tuen [3].
-LSP:n tiedoilla se kykenee muun muassa huomauttamaan tekstin muokkaajaa virheistä tämän työstämässä lähdekoodissa.
-Käytännössä ohjelma muuttuu LSP-serverin avulla täysiveriseksi IDE:ksi.</p>
-
-<p>Mikäli Vimin kuvaus jäi epäselväksi, on sen itse kokeileminen ja oppiminen sangen helppoa.
-Sitä oppii käyttämään katsomalla pari tutoriaalia YouTubesta (esim. <a href="https://youtu.be/-txKSRn0qeA">youtu.be/-txKSRn0qeA</a>) ja tekemällä
-Vimiin sisäänrakennetun tutoriaalin kirjoittamalla ":tutor" ja painamalla enteriä.
-Jos Vimin asennus ei vielä houkuta,
-löytyy samainen tutoriaali netistä,
-esimerkiksi osoitteesta <a href="https://remarkablemark.org/vimtutor/">remarkablemark.org/vimtutor/</a>.</p>
-
-
-<p>Viime aikoina olen myös tehnyt kokeiluja GNU Emacs -kehitysympäristön parissa,
-ja olen vaikuttunut sen kyvyistä.
-Lisäosien voimalla käytän sitä toistaiseksi kuitenkin enimmäkseen Vimin tavoin.
-On muutenkin järkevää jättää sen käsittely myöhemmäksi –
-se on luonteeltaan lähempänä käyttöjärjestelmää kuin tekstinmuokkausohjelmaa.</p>
-
-
-<p>Toinen suuri muutos,
-jonka tein vaihdettuani Linuxiin,
-oli näppäimistöasetteluni vaihtaminen.
-En koskaan oppinut kymmensormijärjestelmää kunnolla QWERTY-asettelulla,
-muun muassa oudosti aseteltujen näppäinten vuoksi,
-jotka hankaloittivat kymmensormijärjestelmän oikeaoppista käyttöä.
-Lienee kuitenkin paikallaan selventää,
-miksi QWERTY ei ollut minulle – ja tuskin muillekkaan paljon kirjoittaville – toimivin näppäimistöasettelu.</p>
-
-<p>QWERTY-asettelu kehitettiin aikanaan pääasiassa kirjoituskoneille.
-Erilaisia asetteluita oli olemassa paljon, joista varhaisimmissa
-näppäimet olivat käytännössä vain aakkosjärjestyksessä [4,5].
-Ensimmäisessä sähkeistä suoraan luettavaa tekstiä – morsekoodin sijaan – tuottavassa lennätikoneessa kirjaimet olivat aakkosjärjestyksen lisäksi kaikki samassa rivissä [6].
-Koska sellaisella näppäimistöllä oli vaivalloista kirjoittaa, siirrettiin kirjaimet kolmeen riviin ja numerot neljänteen.
-Nyt peräkkäin ja vierekkäin olevat näppäimet saattoivat kuitenkin painaessa juuttua toisiinsa.
-Ratkaisuna näppäimet aseteltiin siten, että useimmiten käytetyt näppäimet eivät olleet vierekkäin.</p>
-
-<p>Monilla Youtube-videoilla, joihin törmäsin todennäköisesti Linux-mielenkiintoni ja Youtuben algoritmin vuoksi,
-perusteltiin toiseen näppäimistöasetteluun vaihtamista jotakuinkin vastaavasti.
-Niillä vihjattiin, ettei ole järkevää, että useimmiten käytetyt kirjaimet ovat hajallaan ympäri näppäimistöä.
-<a href="#fig1">Kuvasta 1</a> näkee helposti,
-kuinka yleisimmin käytettyjä kirjaimia vastaavat näppäimet ovat QWERTYllä kaukana toisistaan.
-Mistä muusta muutokset ihmisten käytöksessä nykyään johtuisivat kuin YouTubesta.</p>
-
-<figure id="fig1">
- <img src="/images/qwerty.png" alt="Kuva QWERTY-näppäimistöstä korostuksilla">
- <figcaption>Kuva 1. Englanninkielinen QWERTY-asettelu, jossa näppäimiä on tummennettu sen perusteella, kuinka paljon niitä vastaavat kirjaimet esiintyvät teksteissä Wikipedian mukaan [7]. Tämä tuottamani kuva on vapaasti käytettävissä <a href="https://creativecommons.org/publicdomain/zero/1.0/legalcode.en">CC0-lisenssillä</a>.</figcaption>
-</figure>
-
-<p>Ei ole perusteltua sanoa, että näppäinten asettelua näppäimistölle ei olisi aikanaan mietitty.
-Olisi kuitenkin järkevämpää, että useimmiten käytetyt näppäimet olisivat niin kutsutulla kotirivillä,
-jolla sormia oletusarvoisesti pidetään näppäimistöä käytettäessä.
-Tällöin sormien tarvitsisi harvemmin jättää kotirivi,
-kasvattaen kirjoitusnopeutta ja lyhentäen matkaa, joka sormien on kuljettava näppäimistön yllä.</p>
-
-<p>Joidenkin kokeilujen kautta päädyin käyttämään Colemak-näppäimistöasettelua [8].
-Vuosilukujen valossa sen voidaan olettaa olevan QWERTYä paremmin suunniteltu.
-QWERTY syntyi 1800- ja 1900-luvuilla.
-Colemak puolestaan on suunniteltu 2000-luvulla [9] tehokkuutta ergonomisuutta ajatellen [8].
-Tietokoneet oli kehitetty jo pitkälle, kun Colemak suunniteltiin,
-joten sitä luodessa voitiin paremmin ottaa huomioon tekijöitä, jotka vaativat laajamittaisempaa laskennallista analyysiä.
-Esimerkiksi saman sormen peräkkäisiä kirjainpainalluksia,
-saman käden kirjainpainalluksia ja kotirivin eri puolille vuoroin kurottavia (esim. ”minimi” QWERTYllä) näppäily-yhdistelmien esiintyvyyksiä on voitu minimoida [10, 11].
-Yksinkertaisin argumentti Colemakin puolesta lienee se,
-että useimmin käytetyt näppäimet sijaitsevat kotirivillä,
-kuten <a href="#fig2">Kuvasta 2</a> näkyy.</p>
-
-<figure id="fig2">
- <img src="/images/colemak.png" alt="Kuva Colemak-näppäimistöstä korostuksilla">
- <figcaption>Kuva 2. Colemak, värikoodi tuotettu samoin kuin <a href="#fig1">Kuvassa 1</a>. Tämä tuottamani kuva on vapaasti käytettävissä <a href="https://creativecommons.org/publicdomain/zero/1.0/legalcode.en">CC0-lisenssillä</a>.</figcaption>
-</figure>
-
-<p>Colemak on toiminut hyvin omassa käytössäni.
-Uudella asettelulla kirjoittamista harjoitellessa näppäimistöni näppäinhatut olivat fyysisesti yhä QWERTY-asettelussa.
-Koska en voinut tarkastaa näppäimen sijaintia silmilläni,
-opin kirjoittamaan katsomatta näppäimistöä ollenkaan,
-mikä oli ollut minulle QWERTYä käyttäessä hankalaa.
-Kirjoittaminen myös on myös tuntunut mukavammalta;
-sormien tarvitsee harvemmin poistua kotiriviltä ja epämukavia näppäilysarjoja tuntuu esiintyvän harvemmin.</p>
-
-<p>On tietysti hyvä huomata, että Colemak on suunniteltu nimenomaan englannin kirjoittamista varten.
-Tahdon itse käyttää kaikista järkevistä käyttöjärjestelmistä löytyvää yleisnäppäimistöä,
-joka on samoin aseteltu riippumatta kielestä, jota kirjoitan.
-Koska kirjoitan paljon sekä suomea että englantia, ja joskus ruotsia,
-joudun joka tapauksessa näppäimistöasettelua valitessa tekemään kompromissin kielten välillä,
-tai valitsemaan jonkun harrastelijan tekemän esoteerisen useamman kielen yhdistävän näppäimistöasettelun,
-jota tuskin on todettu toimivaksi käytössä.
-Kaikeksi onneksi Suomeakin kirjoittaessa Colemak on tuntunut minusta luontevammalta kuin QWERTY.</p>
-
-<p>Alun perin kokeilin ensimmäisenä näppäimistöasettelunani QWERTYn jälkeen Dvorakia****.
-Saatoin mututuntumalla kirjoittaa Dvorakilla nopeammin kuin Colemakilla,
-mutta sillä kirjoittaminen oli käsilleni epämukavaa, etenkin oikealle pikkurillilleni,
-joka joutui usein kurkottamaan L-näppäimen perään.
-Hiljalleen ymmärsin,
-että itselle sopivaa näppäimistöasettelua valitessa
-olennaisinta on asettelun ergonomisuus eikä kirjoitusnopeus.
-Mitä hyötyä on nopeasta kirjoitustyylistä,
-jos ei voi kirjoittaa rasitusvamman vuoksi.</p>
-
-<p>Näppäimistöasettelua valitessani minulle oli tärkeää myös erikoismerkkien helppo saatavuus.
-Dvorakissa ei ollut juurikaan erikoismerkkejä, ei edes AltGr:n takana.
-Colemakilla käytettävissäni ovat helposti muun muassa paljon käyttämäni
-nk. ysiysi-lainausmerkit ‘”’ (AltGr+Shift+0)
-sekä m-viiva ‘–’ (AltGr+-), ja mukavuuksina esimerkiksi
-numeroiden potenssiversioita ‘¹²³’.</p>
-
-<p>Voit saada ensikosketuksen Colemakiin netissä esim. nopeuspelin <a href="https://gnusenpai.net/colemakclub/">gnusenpai.net/colemakclub/</a> kautta.
-Asennus-/käyttöönotto-ohjeet Colemakille puolestaan löytyvät osoitteesta <a href="https://colemak.com/Download">colemak.com/Download</a>.
-Muitakin eri tarkoituksiin optimoituja näppäimistöasetteluja löytyy runsaasti netistä,
-mutta Colemak lienee kaikista testatuin ja luotetuin vaihtoehto,
-joka löytyy monista laitteista vaihtoehtona ilman erillistä asennusta.
-</p>
-
-
-<p>Kiinnostuttuani näppäimistöasetteluni ergonomisuudesta aloin pohtimaan myös fyysisen näppäimistöni ergonomisuutta.
-Aloitetaan hyvin yksinkertaisella ajatusleikillä.
-Kuvittele olevasi pöydän ääressä ennen ateriaa.
-Miten asetat kätesi rennosti pöydälle eteesi?
-Entä jos niiden on oltava ainakin hieman erillään eikä yhdessä?
-Todennäköisesti kätesi olisivat keskemmällä kuin kyynärpääsi.
-On luultavaa,
-että ranteesi olisivat suorina,
-verrattuna esimerkiksi asentoon,
-jossa pikkurillejä taittaa kohti kyynärluita.
-Lopulta on yleistä, että kämmenesi eivät olisi olleet litteinä pöytää vasten,
-vaan että ranteesi peukalopuoli osoitti joko suoraan ylös tai hieman yläviistoon.</p>
-
-<p>Tavallinen näppäimistö pakottaa kädet epäluonnolliseen suppuun.
-Kuvittele ranteesi suoraan sormiesi takana.
-Vie sitten sormesi näppäimistön kotiriville.
-Joudut taittamaan pikkurilliäsi kohti kyynärluutasi.
-Epämukava asento, eikö?
-Ongelma ratkeaa jakamalla näppäimistö keskeltä kahtia .
-Tällöin eri puoliskot voi asettaa itselleen mieluisiin kulmiin
-ja itselleen mieluiselle leveydelle
-siten, että ranteet saavat olla suorassa.
-Samalla lapasi ja hartiasi pääsevät rentoutumaan.</p>
-
-<p>Ranteita on myös mukava kallistaa nostamalla peukkut ylemmäs kuin pikkurillit.
-Nyt kun näppäimistösi on kahdessa osassa,
-voit vapaasti kallistaa ne kulmaan, joka on ranteillesi mieluinen.
-Ainakin, jos näppäimistöillä on telineet,
-jotka sallivat niiden kallistamisen kätevästi.
-Jotkut kirjoittavat jopa näppäimistönpuolikkaat lähes pystysuorassa.</p>
-
-<p>Lopulta mielenkiintoisena huomiona on varsin kummallista, että näppäimistöjen sarakkeet ovat useimmiten viistossa eivätkä suoraan ylhäältä alas.
-Tämä on QWERTYn lisäksi toinen epäoptimaalinen jäänne kirjoituskoneiden ajalta.
-Olihan näppäinten varsien jotenkin ulotuttava pääasialliseen kirjoituslaitteistoon.
-Jos näppäimistöt suunniteltaisiin ensimmäistä kertaa nykyään ilman historiallista taakkaa, miksi tabulaattori-, näppäinlukko- ja shift-näppäimiä päätettäisiin kasvattaa eri pituisiksi siten, että loput kirjaimet joutuvat kuin väistämään toisiaan.
-Viistous ei sinänsä ole välttämättä epäergonomista,
-mutta esimerkiksi kaukana kotirivistä olevien numeronäppäinten löytäminen voi olla hankalaa,
-kun vaikkapa numero 5 on etusormen yläpuolella,
-vaikka sarakkeiden suoraan mennessä siinä pitäisi olla nelonen.</p>
-
-<p>Markkinoilla on näppäimistöjä, jotka ratkaisevat kaikki nämä ongelmat.
-Esimerkiksi Ergodox Ez [12] ja Voyager [13] ovat suosittuja vaihtoehtoja.
-Ne vain maksavat halvimmillaan runsaat kolmesataa euroa parilta,
-mahdollisia kuljetuskuluja ja tulleja huomioimatta,
-ja olen köyhä opiskelija, joten en aio hankkia sellaisia ainakaan vielä.</p>
-
-<p>Olisin kuitenkin paljon halunnut kyseisenlaisen näppäimistön.
-Runsas vuosi sitten yritin lievittää pulmaani tilaamalla
-Perixx Periboard-524B-näppäimistön.
-Näppäimistö on toiminut kiitettävästi,
-mutta sen sarakkeet eivät mene suoraan.
-Lisäksi näppäimistöllä ei ole mekaanisen näppäimistön hyötyjä.
-Muutoin näkemykseni siitä ei ole juurikaan muuttunut sen jälkeen,
-kun kirjoitin siitä geminikapselissani [14].</p>
-
-<p>Epäonnekseni tuhlasin rahaa – pian näppäimistön ostamisen jälkeen julkaistiin parempi vaihtoehto, jonka hankkiminen maksaa suunnilleen saman verran.
-Onnekseni voin hankkia sen paremman vaihtoehdon nyt, kun huomasin asian.
-Noin 10 kuukautta sitten
-eräs suomalainen tietotekniikan opiskelija julkaisi netissä ohjeet juuri tarpeeni täyttävän näppäimistön kokoamiseen.
-Näppäimistö on vieläpä suunniteltu juuri budjettiystävällisyys ja kokoamisen helppous mielessä.
-Näppäimistön nimi on Silakka54, ja sen kokoamisohjeet löytyvät GitHubista [15].
-Voit nähdä näppäimistön <a href="#fig3">Kuvassa 3</a>.
-Oletuksena näppäimistössä ei ole kallistavaa telinettä,
-mutta olen jo 3D-tulostanut sellaisen.
-Näppäimistöjä on saatavilla valmiiksi koottuina AliExpressistä,
-tai näppäimistön voi koota tilaamillaan osilla,
-kuten itse aion tehdä aidon vapaan lähdekoodin hengen mukaisesti.</p>
-
-<figure id="fig3">
- <img src="/images/silakka54.png" alt="Kuva Silakka54-näppäimistöstä">
- <figcaption>Kuva 3. Silakka54-näppäimistö. Kuva on <a href="https://github.com/Squalius-cephalus">Juho ”Squalius-cephalus” T.:n</a> ja se on lisensoitu <a href="/images/silakka54-license.txt">MIT-lisenssillä</a>.</figcaption>
-</figure>
-
-<p>Paremman asettelun lisäksi Silakka54:n hyötyjä ovat helppo muokattavuus,
-mekaanisten näppäinkytkinten tuoma tuntuma sekä QMK:n (tai Vialin) avulla muokattava firmware.
-Näppäimistöä voi muokata esimerkiksi sisältämään lisää kerroksia
-(vrt. AltGr:n pohjassa pitäminen,
-mutta eri näppäimen pohjassa pitäminen avaa pääsyn niihin merkkeihin,
-joita itse useimmiten tarvitsee),
-ja tavallisia näppäimiä voi asettaa toimimaan eri näppäiminä pohjaan painaessa
-– esimerkiksi välilyönnistä voi tehdä myös Ctrl-näppäimen.</p>
-
-<p>Koska näppäimistöasettelu määritellään firmware-tasolla,
-voi oman asettelunsa myös ottaa mukaan kaikkialle,
-minne näppäimistönsä saa mukaan.
-Itse aion hyödyntää tätä esimerkiksi sähköisessä EXAM-tenttijärjestelmässä,
-mikäli sallittua,
-sillä kyseinen järjestelmä pohjautuu ainoalle yleiselle käyttöjärjestelmälle,
-joka ei tarjoa Colemak-näppäimistöasettelua.</p>
-
-
-<p>Lopuksi maininnan ansainnee Thumb-Key,
-jota käytän näppäimistönä puhelimellani.
-Siinä näppäimet ovat suuremmat (ne ovat 4x4-ruudukossa),
-joten niihin on helpompi osua.
-Toki kääntöpuolena kaikki kirjaimet eivät mahdu näppäimille,
-mutta loput merkit saa kirjoitettua vetämällä oikeasta näppäimestä oikeaan suuntaan.
-Pidän isommista näppäimistä, muita perusteluja kyseiselle näppäimistölle en anna.</p>
-
-
-<p>En varmasti ole vielä valmis työskentelytapojeni optimoinnin kanssa.
-Tämä antoi kuitenkin katsauksen nykyään käyttämiini olennaisimpiin tekstinsyöttööni vaikuttaviin ratkaisuihin,
-niin ohjelmistojen kuin näppäimistöjen osalta.
-Ratkaisut ovat kaikki helposti kokeiltavissa, paitsi mahdollisesti Silakka54 – fyysisiä esineitä kun on hankala kokeilla heti netissä.
-Kokeilemalla ei menetä mitään ja kärsivällisellä harjoittelulla kokeilu voi olla sekä hyödyllinen että hauska.</p>
-
-
-<h2>Linkkejä ja lähteitä</h2>
-
-<p>
-[1] Vimin dokumentaatio. Vim-ohjelmassa saatavilla komennolla ":help", verkossa <a href="https://vimhelp.org/">vimhelp.org</a><br>
-[2] Ks. esim. <a href="https://vimawesome.com/">vimawesome.com</a><br>
-[3] Neovimin dokumentaation LSP-serverien konfiguroinnista: <a href="https://neovim.io/doc/user/lsp.html">neovim.io/doc/user/lsp.html</a><br>
-[4] <a href="https://distantwriting.co.uk/instruments.html">distantwriting.co.uk/instruments.html</a>, kuva 23<br>
-[5] W. A. Burt. Patentti laitteelle Typographer. 1829. United states patent and trademark office. Saatavilla <a href="https://ppubs.uspto.gov/api/pdf/downloadPdf/X005581?requestToken=eyJzdWIiOiJlYTExNzhhMy0xNTExLTQ1YTktOWJjMy0yMzdlYTNkYTM4NzgiLCJ2ZXIiOiIwODRjMTAzOC01ZGVjLTQwNjItOWUwNC05M2VjNzlmZWU1ZjUiLCJleHAiOjB9">ppubs.uspto.gov/api/pdf/downloadPdf/[...]</a>.<br>
-[6] Wikipedia: Printing telegraph. <a href="https://en.wikipedia.org/wiki/Printing_telegraph">en.wikipedia.org/wiki/Printing_telegraph</a><br>
-[7] Wikipedia, kirjainten esiintyvyys. <a href="https://en.wikipedia.org/w/index.php?title=Letter_frequency&oldid=1295211904">en.wikipedia.org/wiki/Letter_frequency</a><br>
-[8] Colemakin verkkosivut: <a href="https://colemak.com/">colemak.com</a><br>
-[9] Wikipedia-artikkeli Colemakista: <a href="https://en.wikipedia.org/wiki/Colemak">en.wikipedia.org/wiki/Colemak</a><br>
-[10] Colemakin suunnitteluprosessista: <a href="https://colemak.com/Design">colemak.com/Design</a><br>
-[11] Colemakin ergonomiset tekijät: <a href="https://colemak.com/Ergonomic">colemak.com/Ergonomic</a><br>
-[12] Ergodox Ez: <a href="https://ergodox-ez.com">ergodox-ez.com</a><br>
-[13] Voyager: <a href="https://zsa.io/voyager">zsa.io/voyager</a><br>
-[14] Geminilokini: ”Perixx budget split keyboard – first impression” <a href="gemini://cron4.fi/gemlog/periboard.gmi">gemini://cron4.fi/gemlog/periboard.gmi</a>, Verkkoportaalin kautta <a href="https://portal.mozz.us/gemini/cron4.fi/gemlog/periboard.gmi">portal.mozz.us/[...]</a><br>
-[15] Silakka54 <a href="https://squalius-cephalus.github.io/silakka54">squalius-cephalus.github.io/silakka54</a><br>
-</p>
-
-<br>
-
-<p>
-*MinGW ei tietenkään ole Linux, mutta sen kautta sain ensikosketuksen GNU:n komentoriviohjelmiin.<br>
-**Oikeastaan teksti päätyy vain tekstikenttään, josta se sitten usein tallennetaan (kirjoitetaan) tiedostoon.
-Usein tekstikentän sisältö myös vastaa kyseisen tiedoston sisältöä välitallennuksia vaille.
-Kuitenkaan tekstiä ei suoraan kirjoiteta tiedostoon
-kuten ei käytännössä missään tekstinmuokkausohjelmassa.
-Tosiasiassa tekstikentän ei tarvitse kuvata mitään tiedostoa,
-eikä sen sisältöjä tarvitse kirjoittaa mihinkään tiedostoon.<br>
-***Neovim sovelluksena vie vähemmän tilaa kuin Vim.<br>
-****Todellisuudessa käytin Svdvorakia, Dvorakin ruotsin kirjoittamiseen tarkoitettua versiota, koska oletus-dvorakista ei löydy ääkkösiäkään, toisin kuin oletus-colemakista.<br>
-</p>
- </main>
- </body>
-</html>
diff --git a/blog/index.org b/fi/blog/index.org
index 62167c8..62167c8 100644
--- a/blog/index.org
+++ b/fi/blog/index.org
diff --git a/blog/post.org b/fi/blog/post.org
index 3f385cd..3f385cd 100644
--- a/blog/post.org
+++ b/fi/blog/post.org
diff --git a/fi/blog/sivujen-uudistus.org b/fi/blog/sivujen-uudistus.org
new file mode 100644
index 0000000..9c81e5c
--- /dev/null
+++ b/fi/blog/sivujen-uudistus.org
@@ -0,0 +1,8 @@
+#+TITLE: Verkkosivujeni uudistus
+
+* TODO Päivitä sivut loppuun [0/5]
+- [ ] Lisää git-tietosäilöt, erityisesti sivujen koodi
+- [ ] Selitä muutokset täällä ja englanninkielisellä puolella
+- [ ] Luo englanninkielinen puoli
+- [ ] Tyylittele linkkilistat
+- [ ] Aseta blogin indeksi aikajärjestykseen
diff --git a/blog/tekstinsyotto.html b/fi/blog/tekstinsyotto.html
index 9ae7d80..9ae7d80 100644
--- a/blog/tekstinsyotto.html
+++ b/fi/blog/tekstinsyotto.html
diff --git a/blog/yksinkertaisesti-monipuolinen.txt b/fi/blog/yksinkertaisesti-monipuolinen.txt
index 8295fd7..8295fd7 100644
--- a/blog/yksinkertaisesti-monipuolinen.txt
+++ b/fi/blog/yksinkertaisesti-monipuolinen.txt
diff --git a/fi/index.org b/fi/index.org
new file mode 100644
index 0000000..5a60652
--- /dev/null
+++ b/fi/index.org
@@ -0,0 +1,8 @@
+#+TITLE: Joel Kronqvist
+
+Tervetuloa verkkosivuilleni! Löydät täältä seuraavaa:
+
+- [[./blog][Blogi]]
+- [[./pgp.org][Julkinen avaimeni]]
+
+Uudistin verkkosivut juuri, ja tietoa muutoksista löydät [[./blog/sivujen-uudistus.org][tästä blogipostauksesta]]!
diff --git a/fi/pgp.org b/fi/pgp.org
new file mode 100644
index 0000000..230a9ba
--- /dev/null
+++ b/fi/pgp.org
@@ -0,0 +1,3 @@
+#+TITLE: Julkinen avaimeni
+
+* TODO Lisää sisältö vanhoilta verkkosivuilta
diff --git a/generated/blog/otherpost.txt b/generated/blog/otherpost.txt
deleted file mode 100644
index a9f90fd..0000000
--- a/generated/blog/otherpost.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-
-This is a plain text file
-
-* Please do not modify this !
diff --git a/generated/blog/index.html b/generated/fi/blog/index.html
index 13557a1..a90b024 100644
--- a/generated/blog/index.html
+++ b/generated/fi/blog/index.html
@@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
<head>
-<!-- 2026-06-13 Sat 19:21 -->
+<!-- 2026-06-14 Sun 12:20 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Blogin sisällys</title>
@@ -193,9 +193,15 @@
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
-<link rel="stylesheet"type="text/css" href="../static/global.css">
+<link rel="stylesheet"type="text/css" href="../../static/global.css">
</head>
<body>
+<div id="preamble" class="status">
+<header>
+<a id="skiptocontent" href="#content">Siirry pääsisältöön</a>
+<a href="/fi/">FI</a> · <a href="/en/">EN</a>
+</header>
+</div>
<div id="content" class="content">
<h1 class="title">Blogin sisällys</h1>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
@@ -210,6 +216,10 @@
</tr>
<tr>
+<td class="org-left"><a href="./sivujen-uudistus.html">Verkkosivujeni uudistus</a> (2026-06-14) Alaotsikkoa ei saatavilla</td>
+</tr>
+
+<tr>
<td class="org-left"><a href="./tekstinsyotto.html">tekstinsyotto</a> (2025-07-28) Alaotsikkoa ei saatavilla</td>
</tr>
diff --git a/generated/blog/post.html b/generated/fi/blog/post.html
index 2605de8..575af71 100644
--- a/generated/blog/post.html
+++ b/generated/fi/blog/post.html
@@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
<head>
-<!-- 2026-06-12 Fri 19:45 -->
+<!-- 2026-06-14 Sun 12:20 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Test-post-title</title>
@@ -193,17 +193,23 @@
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
-<link rel="stylesheet"type="text/css" href="../static/global.css">
+<link rel="stylesheet"type="text/css" href="../../static/global.css">
</head>
<body>
+<div id="preamble" class="status">
+<header>
+<a id="skiptocontent" href="#content">Siirry pääsisältöön</a>
+<a href="/fi/">FI</a> · <a href="/en/">EN</a>
+</header>
+</div>
<div id="content" class="content">
<h1 class="title">Test-post-title
<br />
<span class="subtitle">Test subtitle</span>
</h1>
-<div id="outline-container-orgfa8ca1d" class="outline-2">
-<h2 id="orgfa8ca1d">Test post</h2>
-<div class="outline-text-2" id="text-orgfa8ca1d">
+<div id="outline-container-orgbd54fd1" class="outline-2">
+<h2 id="orgbd54fd1">Test post</h2>
+<div class="outline-text-2" id="text-orgbd54fd1">
<p>
This is a test org post.
</p>
diff --git a/generated/fi/blog/sivujen-uudistus.html b/generated/fi/blog/sivujen-uudistus.html
new file mode 100644
index 0000000..bdf59e4
--- /dev/null
+++ b/generated/fi/blog/sivujen-uudistus.html
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<head>
+<!-- 2026-06-14 Sun 12:20 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Verkkosivujeni uudistus</title>
+<meta name="author" content="Joel Kronqvist" />
+<meta name="generator" content="Org Mode" />
+<style type="text/css">
+ #content { max-width: 60em; margin: auto; }
+ .title { text-align: center;
+ margin-bottom: .2em; }
+ .subtitle { text-align: center;
+ font-size: medium;
+ font-weight: bold;
+ margin-top:0; }
+ .todo { font-family: monospace; color: red; }
+ .done { font-family: monospace; color: green; }
+ .priority { font-family: monospace; color: orange; }
+ .tag { background-color: #eee; font-family: monospace;
+ padding: 2px; font-size: 80%; font-weight: normal; }
+ .timestamp { color: #bebebe; }
+ .timestamp-kwd { color: #5f9ea0; }
+ .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
+ .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
+ .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+ .underline { text-decoration: underline; }
+ #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+ p.verse { margin-left: 3%; }
+ pre {
+ border: 1px solid #e6e6e6;
+ border-radius: 3px;
+ background-color: #f2f2f2;
+ padding: 8pt;
+ font-family: monospace;
+ overflow: auto;
+ margin: 1.2em;
+ }
+ pre.src {
+ position: relative;
+ overflow: auto;
+ }
+ pre.src:before {
+ display: none;
+ position: absolute;
+ top: -8px;
+ right: 12px;
+ padding: 3px;
+ color: #555;
+ background-color: #f2f2f299;
+ }
+ pre.src:hover:before { display: inline; margin-top: 14px;}
+ /* Languages per Org manual */
+ pre.src-asymptote:before { content: 'Asymptote'; }
+ pre.src-awk:before { content: 'Awk'; }
+ pre.src-authinfo::before { content: 'Authinfo'; }
+ pre.src-C:before { content: 'C'; }
+ /* pre.src-C++ doesn't work in CSS */
+ pre.src-clojure:before { content: 'Clojure'; }
+ pre.src-css:before { content: 'CSS'; }
+ pre.src-D:before { content: 'D'; }
+ pre.src-ditaa:before { content: 'ditaa'; }
+ pre.src-dot:before { content: 'Graphviz'; }
+ pre.src-calc:before { content: 'Emacs Calc'; }
+ pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+ pre.src-fortran:before { content: 'Fortran'; }
+ pre.src-gnuplot:before { content: 'gnuplot'; }
+ pre.src-haskell:before { content: 'Haskell'; }
+ pre.src-hledger:before { content: 'hledger'; }
+ pre.src-java:before { content: 'Java'; }
+ pre.src-js:before { content: 'Javascript'; }
+ pre.src-latex:before { content: 'LaTeX'; }
+ pre.src-ledger:before { content: 'Ledger'; }
+ pre.src-lisp:before { content: 'Lisp'; }
+ pre.src-lilypond:before { content: 'Lilypond'; }
+ pre.src-lua:before { content: 'Lua'; }
+ pre.src-matlab:before { content: 'MATLAB'; }
+ pre.src-mscgen:before { content: 'Mscgen'; }
+ pre.src-ocaml:before { content: 'Objective Caml'; }
+ pre.src-octave:before { content: 'Octave'; }
+ pre.src-org:before { content: 'Org mode'; }
+ pre.src-oz:before { content: 'OZ'; }
+ pre.src-plantuml:before { content: 'Plantuml'; }
+ pre.src-processing:before { content: 'Processing.js'; }
+ pre.src-python:before { content: 'Python'; }
+ pre.src-R:before { content: 'R'; }
+ pre.src-ruby:before { content: 'Ruby'; }
+ pre.src-sass:before { content: 'Sass'; }
+ pre.src-scheme:before { content: 'Scheme'; }
+ pre.src-screen:before { content: 'Gnu Screen'; }
+ pre.src-sed:before { content: 'Sed'; }
+ pre.src-sh:before { content: 'shell'; }
+ pre.src-sql:before { content: 'SQL'; }
+ pre.src-sqlite:before { content: 'SQLite'; }
+ /* additional languages in org.el's org-babel-load-languages alist */
+ pre.src-forth:before { content: 'Forth'; }
+ pre.src-io:before { content: 'IO'; }
+ pre.src-J:before { content: 'J'; }
+ pre.src-makefile:before { content: 'Makefile'; }
+ pre.src-maxima:before { content: 'Maxima'; }
+ pre.src-perl:before { content: 'Perl'; }
+ pre.src-picolisp:before { content: 'Pico Lisp'; }
+ pre.src-scala:before { content: 'Scala'; }
+ pre.src-shell:before { content: 'Shell Script'; }
+ pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+ /* additional language identifiers per "defun org-babel-execute"
+ in ob-*.el */
+ pre.src-cpp:before { content: 'C++'; }
+ pre.src-abc:before { content: 'ABC'; }
+ pre.src-coq:before { content: 'Coq'; }
+ pre.src-groovy:before { content: 'Groovy'; }
+ /* additional language identifiers from org-babel-shell-names in
+ ob-shell.el: ob-shell is the only babel language using a lambda to put
+ the execution function name together. */
+ pre.src-bash:before { content: 'bash'; }
+ pre.src-csh:before { content: 'csh'; }
+ pre.src-ash:before { content: 'ash'; }
+ pre.src-dash:before { content: 'dash'; }
+ pre.src-ksh:before { content: 'ksh'; }
+ pre.src-mksh:before { content: 'mksh'; }
+ pre.src-posh:before { content: 'posh'; }
+ /* Additional Emacs modes also supported by the LaTeX listings package */
+ pre.src-ada:before { content: 'Ada'; }
+ pre.src-asm:before { content: 'Assembler'; }
+ pre.src-caml:before { content: 'Caml'; }
+ pre.src-delphi:before { content: 'Delphi'; }
+ pre.src-html:before { content: 'HTML'; }
+ pre.src-idl:before { content: 'IDL'; }
+ pre.src-mercury:before { content: 'Mercury'; }
+ pre.src-metapost:before { content: 'MetaPost'; }
+ pre.src-modula-2:before { content: 'Modula-2'; }
+ pre.src-pascal:before { content: 'Pascal'; }
+ pre.src-ps:before { content: 'PostScript'; }
+ pre.src-prolog:before { content: 'Prolog'; }
+ pre.src-simula:before { content: 'Simula'; }
+ pre.src-tcl:before { content: 'tcl'; }
+ pre.src-tex:before { content: 'TeX'; }
+ pre.src-plain-tex:before { content: 'Plain TeX'; }
+ pre.src-verilog:before { content: 'Verilog'; }
+ pre.src-vhdl:before { content: 'VHDL'; }
+ pre.src-xml:before { content: 'XML'; }
+ pre.src-nxml:before { content: 'XML'; }
+ /* add a generic configuration mode; LaTeX export needs an additional
+ (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+ pre.src-conf:before { content: 'Configuration File'; }
+
+ table { border-collapse:collapse; }
+ caption.t-above { caption-side: top; }
+ caption.t-bottom { caption-side: bottom; }
+ td, th { vertical-align:top; }
+ th.org-right { text-align: center; }
+ th.org-left { text-align: center; }
+ th.org-center { text-align: center; }
+ td.org-right { text-align: right; }
+ td.org-left { text-align: left; }
+ td.org-center { text-align: center; }
+ dt { font-weight: bold; }
+ .footpara { display: inline; }
+ .footdef { margin-bottom: 1em; }
+ .figure { padding: 1em; }
+ .figure p { text-align: center; }
+ .equation-container {
+ display: table;
+ text-align: center;
+ width: 100%;
+ }
+ .equation {
+ vertical-align: middle;
+ }
+ .equation-label {
+ display: table-cell;
+ text-align: right;
+ vertical-align: middle;
+ }
+ .inlinetask {
+ padding: 10px;
+ border: 2px solid gray;
+ margin: 10px;
+ background: #ffffcc;
+ }
+ #org-div-home-and-up
+ { text-align: right; font-size: 70%; white-space: nowrap; }
+ textarea { overflow-x: auto; }
+ .linenr { font-size: smaller }
+ .code-highlighted { background-color: #ffff00; }
+ .org-info-js_info-navigation { border-style: none; }
+ #org-info-js_console-label
+ { font-size: 10px; font-weight: bold; white-space: nowrap; }
+ .org-info-js_search-highlight
+ { background-color: #ffff00; color: #000000; font-weight: bold; }
+ .org-svg { }
+</style>
+<link rel="stylesheet"type="text/css" href="../../static/global.css">
+</head>
+<body>
+<div id="preamble" class="status">
+<header>
+<a id="skiptocontent" href="#content">Siirry pääsisältöön</a>
+<a href="/fi/">FI</a> · <a href="/en/">EN</a>
+</header>
+</div>
+<div id="content" class="content">
+<h1 class="title">Verkkosivujeni uudistus</h1>
+<div id="outline-container-org94b1e2e" class="outline-2">
+<h2 id="org94b1e2e"><span class="todo TODO">TODO</span> Päivitä sivut loppuun <code>[0/5]</code></h2>
+<div class="outline-text-2" id="text-org94b1e2e">
+<ul class="org-ul">
+<li class="off"><code>[&#xa0;]</code> Lisää git-tietosäilöt, erityisesti sivujen koodi</li>
+<li class="off"><code>[&#xa0;]</code> Selitä muutokset täällä ja englanninkielisellä puolella</li>
+<li class="off"><code>[&#xa0;]</code> Luo englanninkielinen puoli</li>
+<li class="off"><code>[&#xa0;]</code> Tyylittele linkkilistat</li>
+<li class="off"><code>[&#xa0;]</code> Aseta blogin indeksi aikajärjestykseen</li>
+</ul>
+</div>
+</div>
+</div>
+</body>
+</html>
diff --git a/generated/blog/tekstinsyotto.html b/generated/fi/blog/tekstinsyotto.html
index 9ae7d80..9ae7d80 100644
--- a/generated/blog/tekstinsyotto.html
+++ b/generated/fi/blog/tekstinsyotto.html
diff --git a/generated/blog/yksinkertaisesti-monipuolinen.txt b/generated/fi/blog/yksinkertaisesti-monipuolinen.txt
index 8295fd7..8295fd7 100644
--- a/generated/blog/yksinkertaisesti-monipuolinen.txt
+++ b/generated/fi/blog/yksinkertaisesti-monipuolinen.txt
diff --git a/generated/fi/index.html b/generated/fi/index.html
new file mode 100644
index 0000000..f1a1013
--- /dev/null
+++ b/generated/fi/index.html
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<head>
+<!-- 2026-06-14 Sun 12:20 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Joel Kronqvist</title>
+<meta name="author" content="Joel Kronqvist" />
+<meta name="generator" content="Org Mode" />
+<style type="text/css">
+ #content { max-width: 60em; margin: auto; }
+ .title { text-align: center;
+ margin-bottom: .2em; }
+ .subtitle { text-align: center;
+ font-size: medium;
+ font-weight: bold;
+ margin-top:0; }
+ .todo { font-family: monospace; color: red; }
+ .done { font-family: monospace; color: green; }
+ .priority { font-family: monospace; color: orange; }
+ .tag { background-color: #eee; font-family: monospace;
+ padding: 2px; font-size: 80%; font-weight: normal; }
+ .timestamp { color: #bebebe; }
+ .timestamp-kwd { color: #5f9ea0; }
+ .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
+ .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
+ .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+ .underline { text-decoration: underline; }
+ #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+ p.verse { margin-left: 3%; }
+ pre {
+ border: 1px solid #e6e6e6;
+ border-radius: 3px;
+ background-color: #f2f2f2;
+ padding: 8pt;
+ font-family: monospace;
+ overflow: auto;
+ margin: 1.2em;
+ }
+ pre.src {
+ position: relative;
+ overflow: auto;
+ }
+ pre.src:before {
+ display: none;
+ position: absolute;
+ top: -8px;
+ right: 12px;
+ padding: 3px;
+ color: #555;
+ background-color: #f2f2f299;
+ }
+ pre.src:hover:before { display: inline; margin-top: 14px;}
+ /* Languages per Org manual */
+ pre.src-asymptote:before { content: 'Asymptote'; }
+ pre.src-awk:before { content: 'Awk'; }
+ pre.src-authinfo::before { content: 'Authinfo'; }
+ pre.src-C:before { content: 'C'; }
+ /* pre.src-C++ doesn't work in CSS */
+ pre.src-clojure:before { content: 'Clojure'; }
+ pre.src-css:before { content: 'CSS'; }
+ pre.src-D:before { content: 'D'; }
+ pre.src-ditaa:before { content: 'ditaa'; }
+ pre.src-dot:before { content: 'Graphviz'; }
+ pre.src-calc:before { content: 'Emacs Calc'; }
+ pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+ pre.src-fortran:before { content: 'Fortran'; }
+ pre.src-gnuplot:before { content: 'gnuplot'; }
+ pre.src-haskell:before { content: 'Haskell'; }
+ pre.src-hledger:before { content: 'hledger'; }
+ pre.src-java:before { content: 'Java'; }
+ pre.src-js:before { content: 'Javascript'; }
+ pre.src-latex:before { content: 'LaTeX'; }
+ pre.src-ledger:before { content: 'Ledger'; }
+ pre.src-lisp:before { content: 'Lisp'; }
+ pre.src-lilypond:before { content: 'Lilypond'; }
+ pre.src-lua:before { content: 'Lua'; }
+ pre.src-matlab:before { content: 'MATLAB'; }
+ pre.src-mscgen:before { content: 'Mscgen'; }
+ pre.src-ocaml:before { content: 'Objective Caml'; }
+ pre.src-octave:before { content: 'Octave'; }
+ pre.src-org:before { content: 'Org mode'; }
+ pre.src-oz:before { content: 'OZ'; }
+ pre.src-plantuml:before { content: 'Plantuml'; }
+ pre.src-processing:before { content: 'Processing.js'; }
+ pre.src-python:before { content: 'Python'; }
+ pre.src-R:before { content: 'R'; }
+ pre.src-ruby:before { content: 'Ruby'; }
+ pre.src-sass:before { content: 'Sass'; }
+ pre.src-scheme:before { content: 'Scheme'; }
+ pre.src-screen:before { content: 'Gnu Screen'; }
+ pre.src-sed:before { content: 'Sed'; }
+ pre.src-sh:before { content: 'shell'; }
+ pre.src-sql:before { content: 'SQL'; }
+ pre.src-sqlite:before { content: 'SQLite'; }
+ /* additional languages in org.el's org-babel-load-languages alist */
+ pre.src-forth:before { content: 'Forth'; }
+ pre.src-io:before { content: 'IO'; }
+ pre.src-J:before { content: 'J'; }
+ pre.src-makefile:before { content: 'Makefile'; }
+ pre.src-maxima:before { content: 'Maxima'; }
+ pre.src-perl:before { content: 'Perl'; }
+ pre.src-picolisp:before { content: 'Pico Lisp'; }
+ pre.src-scala:before { content: 'Scala'; }
+ pre.src-shell:before { content: 'Shell Script'; }
+ pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+ /* additional language identifiers per "defun org-babel-execute"
+ in ob-*.el */
+ pre.src-cpp:before { content: 'C++'; }
+ pre.src-abc:before { content: 'ABC'; }
+ pre.src-coq:before { content: 'Coq'; }
+ pre.src-groovy:before { content: 'Groovy'; }
+ /* additional language identifiers from org-babel-shell-names in
+ ob-shell.el: ob-shell is the only babel language using a lambda to put
+ the execution function name together. */
+ pre.src-bash:before { content: 'bash'; }
+ pre.src-csh:before { content: 'csh'; }
+ pre.src-ash:before { content: 'ash'; }
+ pre.src-dash:before { content: 'dash'; }
+ pre.src-ksh:before { content: 'ksh'; }
+ pre.src-mksh:before { content: 'mksh'; }
+ pre.src-posh:before { content: 'posh'; }
+ /* Additional Emacs modes also supported by the LaTeX listings package */
+ pre.src-ada:before { content: 'Ada'; }
+ pre.src-asm:before { content: 'Assembler'; }
+ pre.src-caml:before { content: 'Caml'; }
+ pre.src-delphi:before { content: 'Delphi'; }
+ pre.src-html:before { content: 'HTML'; }
+ pre.src-idl:before { content: 'IDL'; }
+ pre.src-mercury:before { content: 'Mercury'; }
+ pre.src-metapost:before { content: 'MetaPost'; }
+ pre.src-modula-2:before { content: 'Modula-2'; }
+ pre.src-pascal:before { content: 'Pascal'; }
+ pre.src-ps:before { content: 'PostScript'; }
+ pre.src-prolog:before { content: 'Prolog'; }
+ pre.src-simula:before { content: 'Simula'; }
+ pre.src-tcl:before { content: 'tcl'; }
+ pre.src-tex:before { content: 'TeX'; }
+ pre.src-plain-tex:before { content: 'Plain TeX'; }
+ pre.src-verilog:before { content: 'Verilog'; }
+ pre.src-vhdl:before { content: 'VHDL'; }
+ pre.src-xml:before { content: 'XML'; }
+ pre.src-nxml:before { content: 'XML'; }
+ /* add a generic configuration mode; LaTeX export needs an additional
+ (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+ pre.src-conf:before { content: 'Configuration File'; }
+
+ table { border-collapse:collapse; }
+ caption.t-above { caption-side: top; }
+ caption.t-bottom { caption-side: bottom; }
+ td, th { vertical-align:top; }
+ th.org-right { text-align: center; }
+ th.org-left { text-align: center; }
+ th.org-center { text-align: center; }
+ td.org-right { text-align: right; }
+ td.org-left { text-align: left; }
+ td.org-center { text-align: center; }
+ dt { font-weight: bold; }
+ .footpara { display: inline; }
+ .footdef { margin-bottom: 1em; }
+ .figure { padding: 1em; }
+ .figure p { text-align: center; }
+ .equation-container {
+ display: table;
+ text-align: center;
+ width: 100%;
+ }
+ .equation {
+ vertical-align: middle;
+ }
+ .equation-label {
+ display: table-cell;
+ text-align: right;
+ vertical-align: middle;
+ }
+ .inlinetask {
+ padding: 10px;
+ border: 2px solid gray;
+ margin: 10px;
+ background: #ffffcc;
+ }
+ #org-div-home-and-up
+ { text-align: right; font-size: 70%; white-space: nowrap; }
+ textarea { overflow-x: auto; }
+ .linenr { font-size: smaller }
+ .code-highlighted { background-color: #ffff00; }
+ .org-info-js_info-navigation { border-style: none; }
+ #org-info-js_console-label
+ { font-size: 10px; font-weight: bold; white-space: nowrap; }
+ .org-info-js_search-highlight
+ { background-color: #ffff00; color: #000000; font-weight: bold; }
+ .org-svg { }
+</style>
+<link rel="stylesheet"type="text/css" href="../../static/global.css">
+</head>
+<body>
+<div id="preamble" class="status">
+<header>
+<a id="skiptocontent" href="#content">Siirry pääsisältöön</a>
+<a href="/fi/">FI</a> · <a href="/en/">EN</a>
+</header>
+</div>
+<div id="content" class="content">
+<h1 class="title">Joel Kronqvist</h1>
+<p>
+Tervetuloa verkkosivuilleni! Löydät täältä seuraavaa:
+</p>
+
+<ul class="org-ul">
+<li><a href="./blog">Blogi</a></li>
+<li><a href="./pgp.html">Julkinen avaimeni</a></li>
+</ul>
+
+<p>
+Uudistin verkkosivut juuri, ja tietoa muutoksista löydät <a href="./blog/sivujen-uudistus.html">tästä blogipostauksesta</a>!
+</p>
+</div>
+</body>
+</html>
diff --git a/generated/fi/pgp.html b/generated/fi/pgp.html
new file mode 100644
index 0000000..32e3173
--- /dev/null
+++ b/generated/fi/pgp.html
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
+<head>
+<!-- 2026-06-14 Sun 12:20 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Julkinen avaimeni</title>
+<meta name="author" content="Joel Kronqvist" />
+<meta name="generator" content="Org Mode" />
+<style type="text/css">
+ #content { max-width: 60em; margin: auto; }
+ .title { text-align: center;
+ margin-bottom: .2em; }
+ .subtitle { text-align: center;
+ font-size: medium;
+ font-weight: bold;
+ margin-top:0; }
+ .todo { font-family: monospace; color: red; }
+ .done { font-family: monospace; color: green; }
+ .priority { font-family: monospace; color: orange; }
+ .tag { background-color: #eee; font-family: monospace;
+ padding: 2px; font-size: 80%; font-weight: normal; }
+ .timestamp { color: #bebebe; }
+ .timestamp-kwd { color: #5f9ea0; }
+ .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
+ .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
+ .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+ .underline { text-decoration: underline; }
+ #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+ p.verse { margin-left: 3%; }
+ pre {
+ border: 1px solid #e6e6e6;
+ border-radius: 3px;
+ background-color: #f2f2f2;
+ padding: 8pt;
+ font-family: monospace;
+ overflow: auto;
+ margin: 1.2em;
+ }
+ pre.src {
+ position: relative;
+ overflow: auto;
+ }
+ pre.src:before {
+ display: none;
+ position: absolute;
+ top: -8px;
+ right: 12px;
+ padding: 3px;
+ color: #555;
+ background-color: #f2f2f299;
+ }
+ pre.src:hover:before { display: inline; margin-top: 14px;}
+ /* Languages per Org manual */
+ pre.src-asymptote:before { content: 'Asymptote'; }
+ pre.src-awk:before { content: 'Awk'; }
+ pre.src-authinfo::before { content: 'Authinfo'; }
+ pre.src-C:before { content: 'C'; }
+ /* pre.src-C++ doesn't work in CSS */
+ pre.src-clojure:before { content: 'Clojure'; }
+ pre.src-css:before { content: 'CSS'; }
+ pre.src-D:before { content: 'D'; }
+ pre.src-ditaa:before { content: 'ditaa'; }
+ pre.src-dot:before { content: 'Graphviz'; }
+ pre.src-calc:before { content: 'Emacs Calc'; }
+ pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+ pre.src-fortran:before { content: 'Fortran'; }
+ pre.src-gnuplot:before { content: 'gnuplot'; }
+ pre.src-haskell:before { content: 'Haskell'; }
+ pre.src-hledger:before { content: 'hledger'; }
+ pre.src-java:before { content: 'Java'; }
+ pre.src-js:before { content: 'Javascript'; }
+ pre.src-latex:before { content: 'LaTeX'; }
+ pre.src-ledger:before { content: 'Ledger'; }
+ pre.src-lisp:before { content: 'Lisp'; }
+ pre.src-lilypond:before { content: 'Lilypond'; }
+ pre.src-lua:before { content: 'Lua'; }
+ pre.src-matlab:before { content: 'MATLAB'; }
+ pre.src-mscgen:before { content: 'Mscgen'; }
+ pre.src-ocaml:before { content: 'Objective Caml'; }
+ pre.src-octave:before { content: 'Octave'; }
+ pre.src-org:before { content: 'Org mode'; }
+ pre.src-oz:before { content: 'OZ'; }
+ pre.src-plantuml:before { content: 'Plantuml'; }
+ pre.src-processing:before { content: 'Processing.js'; }
+ pre.src-python:before { content: 'Python'; }
+ pre.src-R:before { content: 'R'; }
+ pre.src-ruby:before { content: 'Ruby'; }
+ pre.src-sass:before { content: 'Sass'; }
+ pre.src-scheme:before { content: 'Scheme'; }
+ pre.src-screen:before { content: 'Gnu Screen'; }
+ pre.src-sed:before { content: 'Sed'; }
+ pre.src-sh:before { content: 'shell'; }
+ pre.src-sql:before { content: 'SQL'; }
+ pre.src-sqlite:before { content: 'SQLite'; }
+ /* additional languages in org.el's org-babel-load-languages alist */
+ pre.src-forth:before { content: 'Forth'; }
+ pre.src-io:before { content: 'IO'; }
+ pre.src-J:before { content: 'J'; }
+ pre.src-makefile:before { content: 'Makefile'; }
+ pre.src-maxima:before { content: 'Maxima'; }
+ pre.src-perl:before { content: 'Perl'; }
+ pre.src-picolisp:before { content: 'Pico Lisp'; }
+ pre.src-scala:before { content: 'Scala'; }
+ pre.src-shell:before { content: 'Shell Script'; }
+ pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+ /* additional language identifiers per "defun org-babel-execute"
+ in ob-*.el */
+ pre.src-cpp:before { content: 'C++'; }
+ pre.src-abc:before { content: 'ABC'; }
+ pre.src-coq:before { content: 'Coq'; }
+ pre.src-groovy:before { content: 'Groovy'; }
+ /* additional language identifiers from org-babel-shell-names in
+ ob-shell.el: ob-shell is the only babel language using a lambda to put
+ the execution function name together. */
+ pre.src-bash:before { content: 'bash'; }
+ pre.src-csh:before { content: 'csh'; }
+ pre.src-ash:before { content: 'ash'; }
+ pre.src-dash:before { content: 'dash'; }
+ pre.src-ksh:before { content: 'ksh'; }
+ pre.src-mksh:before { content: 'mksh'; }
+ pre.src-posh:before { content: 'posh'; }
+ /* Additional Emacs modes also supported by the LaTeX listings package */
+ pre.src-ada:before { content: 'Ada'; }
+ pre.src-asm:before { content: 'Assembler'; }
+ pre.src-caml:before { content: 'Caml'; }
+ pre.src-delphi:before { content: 'Delphi'; }
+ pre.src-html:before { content: 'HTML'; }
+ pre.src-idl:before { content: 'IDL'; }
+ pre.src-mercury:before { content: 'Mercury'; }
+ pre.src-metapost:before { content: 'MetaPost'; }
+ pre.src-modula-2:before { content: 'Modula-2'; }
+ pre.src-pascal:before { content: 'Pascal'; }
+ pre.src-ps:before { content: 'PostScript'; }
+ pre.src-prolog:before { content: 'Prolog'; }
+ pre.src-simula:before { content: 'Simula'; }
+ pre.src-tcl:before { content: 'tcl'; }
+ pre.src-tex:before { content: 'TeX'; }
+ pre.src-plain-tex:before { content: 'Plain TeX'; }
+ pre.src-verilog:before { content: 'Verilog'; }
+ pre.src-vhdl:before { content: 'VHDL'; }
+ pre.src-xml:before { content: 'XML'; }
+ pre.src-nxml:before { content: 'XML'; }
+ /* add a generic configuration mode; LaTeX export needs an additional
+ (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+ pre.src-conf:before { content: 'Configuration File'; }
+
+ table { border-collapse:collapse; }
+ caption.t-above { caption-side: top; }
+ caption.t-bottom { caption-side: bottom; }
+ td, th { vertical-align:top; }
+ th.org-right { text-align: center; }
+ th.org-left { text-align: center; }
+ th.org-center { text-align: center; }
+ td.org-right { text-align: right; }
+ td.org-left { text-align: left; }
+ td.org-center { text-align: center; }
+ dt { font-weight: bold; }
+ .footpara { display: inline; }
+ .footdef { margin-bottom: 1em; }
+ .figure { padding: 1em; }
+ .figure p { text-align: center; }
+ .equation-container {
+ display: table;
+ text-align: center;
+ width: 100%;
+ }
+ .equation {
+ vertical-align: middle;
+ }
+ .equation-label {
+ display: table-cell;
+ text-align: right;
+ vertical-align: middle;
+ }
+ .inlinetask {
+ padding: 10px;
+ border: 2px solid gray;
+ margin: 10px;
+ background: #ffffcc;
+ }
+ #org-div-home-and-up
+ { text-align: right; font-size: 70%; white-space: nowrap; }
+ textarea { overflow-x: auto; }
+ .linenr { font-size: smaller }
+ .code-highlighted { background-color: #ffff00; }
+ .org-info-js_info-navigation { border-style: none; }
+ #org-info-js_console-label
+ { font-size: 10px; font-weight: bold; white-space: nowrap; }
+ .org-info-js_search-highlight
+ { background-color: #ffff00; color: #000000; font-weight: bold; }
+ .org-svg { }
+</style>
+<link rel="stylesheet"type="text/css" href="../../static/global.css">
+</head>
+<body>
+<div id="preamble" class="status">
+<header>
+<a id="skiptocontent" href="#content">Siirry pääsisältöön</a>
+<a href="/fi/">FI</a> · <a href="/en/">EN</a>
+</header>
+</div>
+<div id="content" class="content">
+<h1 class="title">Julkinen avaimeni</h1>
+<div id="outline-container-org7f3a04a" class="outline-2">
+<h2 id="org7f3a04a"><span class="todo TODO">TODO</span> Lisää sisältö vanhoilta verkkosivuilta</h2>
+</div>
+</div>
+</body>
+</html>
diff --git a/lisp/org-publish-project-alist.el b/lisp/org-publish-project-alist.el
index 0310ce0..c65f8f0 100644
--- a/lisp/org-publish-project-alist.el
+++ b/lisp/org-publish-project-alist.el
@@ -13,32 +13,31 @@ org-html-publish-to-html, otherwise use org-pubish-attachment."
(org-html-publish-to-html plist filename pub-dir)
(org-publish-attachment plist filename pub-dir)))
+(setq org-publish-use-timestamps-flag nil)
+
(let ((root "~/Documents/orgsite/") (generated "generated/"))
(setq org-publish-project-alist
- `(("blog"
- :base-directory ,(concat root "blog")
- :publishing-directory ,(concat root generated "blog")
- :base-extension any
- :exclude ".*~"
- :publishing-function org-html-publish-or-copy
- :html-head-extra "<link rel=\"stylesheet\"type=\"text/css\" href=\"../static/global.css\">"
+ (nconc
+ `(("fi"
+ :base-directory ,(concat root "fi")
+ :publishing-directory ,(concat root generated "fi")
+ :base-extension any
+ :exclude ".*~"
+ :recursive t
+ :publishing-function org-html-publish-or-copy
+ :html-head-extra "<link rel=\"stylesheet\"type=\"text/css\" href=\"../../static/global.css\">"
:html-postamble nil
+ :html-preamble "<header>
+<a id=\"skiptocontent\" href=\"#content\">Siirry pääsisältöön</a>
+<a href=\"/fi/\">FI</a> · <a href=\"/en/\">EN</a>
+</header>"
:with-toc nil
:section-numbers nil
- :language "fi")
-
-
- ; TODO Refactor
- ("static"
- :base-directory ,(concat root "static")
- :publishing-directory ,(concat root generated "static")
- :base-extension any
- :publishing-function org-publish-attachment)
- ("img"
- :base-directory ,(concat root "img")
- :publishing-directory ,(concat root generated "img")
- :base-extension any
- :publishing-function org-publish-attachment)
-
-
- )))
+ :language "fi"))
+ (seq-map (lambda (ident)
+ `(,ident
+ :base-directory ,(concat root ident)
+ :publishing-directory ,(concat root generated ident)
+ :base-extension any
+ :publishing-function org-publish-attachment))
+ '("static" "img")))))