Minulla on ollut jo vuosia yksi henkinen ongelma luomani sisällön suhteen. Tuo ongelma on vain vahvistunut samaa tahtia iän kertymisen kanssa. Kyse on digitaalisesta perinnöstä.
Olen luonut melkoisestikin sisältöä, joka on elossa ja saatavilla vain niin kauan kuin minäkin olen.
Katiska.eu on 1000+ artikkelin tietopankki, jonka ensimmäinen versio oli netissä 1996 (web tuli Suomeen 1993…). Olen tehnyt sitä siis ison ajan aikuisikääni ja se on vahva osa minua. Mutta sen säilyminen jälkipolville on ensisijaisesti rahakysymys ja toissijaisesti ylläpito-ongelma.
Kun kuolen, niin jonkun perikunnasta pitäisi ottaa maksut kontolleen ja hoitaa myös tekniikka. Kaikella kunnioituksella, mutta en luota millään mittarilla tuohon jatkuvuuteen. Tarvitsen siis suunnitelman, joka ei ole mitenkään riippuvainen siitä mitä muut tekevät tai eivät tee minun jälkeeni.
Sivuhyppy.
Jos koet nyt tarpeelliseksi sanoa, että Katiska ei ole säilyttämisen väärtti, niin olet oikeutettu mielipiteeseesi — mutta minua ei kiinnosta mielipiteesi, enkä halua edes kuulla sitä. Sen sijaan saattaisin kysyä hyvinkin nopeasti, että mitä itse olet luonut sellaista, joka kannattaa tai olisi syytä tallentaa. Selfieitäkö?
Minulla on tässä sama henkinen esto kuin greyhoundien treenaamisessa. Mielipiteitä saa olla, mutta minulla on huomattavan korkea kynnys kiinnostua itseäni huonompien mielipiteistä. Samalla tasolle päässeet, tai paremmat — he ovatko aivan eri asia.
Samaten voi esittää filosofisen kysymyksen, että miksi edes kiinnostaa, koska kuolema nollaa kaiken. Ainoa ketä kiinnostaa on luonnon tarve saada alkuaineet takaisin kiertoon.
Filosofia on kiinnostava aihe, mutta kysymys onkin siitä, että tietoisuus tiedon ja tuotoksen jatkuvuus riippuu olemassaolostani häiritsee minua juuri nyt. Ja siksi haluan ratkaista asian myös nyt.
Se siitä.
Tekniset kysymykset
Paras ratkaisu olisi kopioida tekstit muualle, koska asia on oleellista, ei esitystapa. Minulla ei ole tarvetta luoda pysyvää sivustoa, vaan mahdollistaa asian, eli tekstien, säilyminen. Käyttömukavuus ei ole oleellista.
Internet Archive olisi vaihtoehto. Mutta Trump opetti olemaan luottamatta Yhdysvaltoihin eikä mihinkään mikä on riippuvainen sen hetkisen kaksipuoluejärjestelmän laajavaltaisen presidentin oikuista. Niin yleishyödyllinen kuin Internet Archive onkin, niin se on riippuvainen hallinnon päätöksistä. Jotain tapaus TikTok opetti.
Siksi mietin vaihtoehtoisia tapoja, kuten tehdä iso import ja rakentaa vaikka per kategorian sisältö e-pubiksi. Tai kierrättää tekstit GitHubiin tai muualle, jonka jatkuvuus on ainakin jollain aikavälillä luotettava.
Tarkoitus on vain löytää ympäristö, joka on ilmainen ja vaikka kellään meistä ei ole kykyä nähdä tulevaisuuteen, niin oletettavasti pitkäikäinen.
Koska muuta en keksinyt, niin päätin laittaa tekstit GitHubiin.
Tuo valinta perustui oikeastaan vain kahteen tekijään:
- git helpottaa siirtoa ja arkiston ylläpitoa
- WordPressin import on tehtävä XML-muodossa, jota on vaikea käsitellä, mutta helppo muuttaa markdowniksi
Markdown on minulle valinta paristakin syystä.
Se on helpompaa lukea kuin html, kun tekstiä ei muuteta lukijan tai selaimen kautta tutuksi ihmisluettavaksi muotoiluksi. Yleensä tuo perustelu on vain väsyttävää, koska tagien kanssa ei tekstiä lueta. Mutta nyt luetaan, kun se on GitHubissa, ellei joku tee importia muualle.
Lisäksi olen oppinut kirjoittamaan markdownilla. On paljon helpompaa laittaa otsikkoon ##
kuin lähteä etsimään valikoista otsikkomuotoa. Tai tehdä lihavointi saman tien merkinnällä **
.
Toinen syy on käyttämäni työkalut. En ole vuoteen avannut läppäriäni, enkä varmaan ihan äkkiä avaakaan — sen akku on pullistunut aika pahasti. Teen aivan kaiken iPadillä. Ja siellä minulla on kirjoittamista varten appi Ulysses — joka on lähtökohtaisesti markdown-editori. On se paljon muutakin.
Ulysses on hieman arvokas, kuten aivan kaikki Applen ekosysteemissä. Maksaa joku 40 euroa vuosi. Mutta se osaa yhden asian, jota muut eivät osaa: se julkaisee WordPressiin automaattisesti html-muodossa. Joten saan kirjoittaa rauhassa paikallisesti tekstejäni, ja sitten nappulan painalluksella lähetän tuotoksen sivustolleni valmiiksi muotoiltuna ja rakennettuna.
Joten tein kaiken noilla raja-arvoilla: git, GitHub ja markdown-teksti.
Tekninen toteutus
Export WordPressistä on lasten leikkiä WP CLI avulla, mutta xml muunnos olikin työläämpi. Yksikään kokeilemani python-import ei toiminut, eikä minulla ollut halua alkaa kokeilemaan miten saan jonkun scriptin korjattua, jonka tekijä on sen hylännyt jo 10 vuotta sitten.
Löysin kuitenkin yhden node.js pohjaisen koodin. Hieman ongelmaa node.js-toteutuksessa on tietysti se, että en ymmärrä siitä hölkäsen pöläystä.
Mutta olen tohtoritasoa kopioimaan ja liimaamaan. Jouduin aptilla asentamaan ensin Node.js mutta kokeiltu scripto kaatui versio-ongelmaan halutessaan uudempaa — apt oli antanut, taas, iäkkään version.
Se korjaatui asentamalla NVM, joka antaa vaihtaa Node.js version.
Tein siitä bash-scriptin, joka asentaa samalla tarvittavan exportterin.
# 1. Lataa ja asenna NVM (versio 0.39.7)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 2. Lataa käyttöön nykyiseen shelliin
export NVM_DIR="$HOME/.nvm"
source "$NVM_DIR/nvm.sh"
# 3. Asenna Node.js versio 20 LTS
nvm install 20
# 4. Ota käyttöön versio 20
nvm use 20
# 5. Tarkista että node toimii
node -v
npm -v
# 6. Lataa exporter ja siirry skriptihakemistoon (voit vaihtaa halutessasi polun)
cd ~
git clone https://github.com/lonekorean/wordpress-export-to-markdown.git
cd wordpress-export-to-markdown
# 7. Asenna riippuvuudet
npm install
Tuo ajetaan vain kerran, joten toki kaikki nuo kohdat voi ajaa erikseenkin. Tein scriptin alunperin tekemään myös muunnokset xml -> md, mutta siinä oli liikaa käsitöitä ja se oli hieman hankala muutenkin. Joten tein uuden. Edellä oleva kuitenkin tarvitaan npm
versiovaihdon takia.
Tein tämän scriptin artikkelien hakemista ja muuttamista varten. Nimesin sen mielikuvitusta hyödyntäen convert_wordpress.sh
.
#!/bin/bash
# NVM täytynee olla käytössä, kunnes aptin versio joskus pävittyy
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# Asetukset
EXPORT_DIR="/root/wordpress-export-to-markdown/katiska_export"
STATE_FILE="$EXPORT_DIR/.last_export_date"
TODAY=$(date +%Y-%m-%d)
# Tarkista, onko tilatiedosto olemassa
if [ -f "$STATE_FILE" ]; then
START_DATE=$(cat "$STATE_FILE")
else
echo "❗ Ensimmäinen ajo, käytetään oletuspäivää 1993-01-01"
START_DATE="1993-01-01"
fi
# Luo vientihakemisto, jos ei ole olemassa
mkdir -p "$EXPORT_DIR"
# Aja vienti
echo "📦 Viedään artikkelit ajalta $START_DATE → $TODAY..."
wp --allow-root --path=/var/www/backend/html export --post_type=post \
--dir="$EXPORT_DIR" \
--start_date="$START_DATE" \
--end_date="$TODAY"
# Etsitään uudet WXR/XML-tiedostot
echo "🔍 Haetaan WXR-tiedostot konversiota varten..."
cd "$EXPORT_DIR" || exit 1
FILES=$(find . -maxdepth 1 -type f -name "*.xml")
if [ -z "$FILES" ]; then
echo "🚫 Ei uusia XML-tiedostoja löydetty."
else
for file in $FILES; do
echo "📝 Muunnetaan $file Markdown-muotoon..."
nvm use 20 >/dev/null
npx wordpress-export-to-markdown --input "$file" --output ./markdown
done
fi
echo "🧹 Poistetaan kaikki XML-tiedostot..."
rm -f $EXPORT_DIR/*.xml
# Päivitä tilatiedosto
echo "$TODAY" > "$STATE_FILE"
echo "✅ Vienti ja muunnos valmis. Päivitetty uusi lähtöpäivä: $TODAY"
Jokaisen xml-tiedoston kohdalla kysytään, että laitetaanko päivämääräkansioihin. Vastasin, että ei. Viimeiseksi kysyttiin, että mitä tehdään kuville. Käskin ottaa kaikki talteen, vaikka en niillä sinänsä tässä tarkoituksessa mitään teekään.
Tuohon kyselyyn joutuu jokaiselle xml-tiedostolle vastaamaan erikseen. Siinä taitaa tulla yksi kyselykierros liikaa, mutta en on vaivautunut penkomaan mikä loopissa mättää.
Tuon ajettuani oli iso liuta md-tiedostoja, mutta halusin ne Katiskan kategorian mukaisiin hakemistoihin. Lajittelu onnistuu, koska mukana liikkuu myös tieto kategoriasta ja tageista.
Tein tiedoston sort_by_category.py
. Tuosta tehdään suoritettava tutulla chmod +x
. Koska unohdin laittaa shebangin, niin tuo ajetaan python3 sort_by_category.py
Se laitetaan samaan hakemistoon missä xml-tiedostot ovat. Scriptissä on syytä olla koko polku sinne missä niin scripti kuin tiedostotkin ovat.
import os
import shutil
import yaml
INPUT_DIR = "/root/wordpress-export-to-markdown/katiska_export/markdown/posts"
OUTPUT_DIR = "/root/wordpress-export-to-markdown/katiska_export/markdown/categorized"
# Luodaan ulostulokansio, jos sitä ei ole
os.makedirs(OUTPUT_DIR, exist_ok=True)
# Käydään kaikki tiedostot läpi
for filename in os.listdir(INPUT_DIR):
if not filename.endswith(".md"):
continue
filepath = os.path.join(INPUT_DIR, filename)
with open(filepath, "r", encoding="utf-8") as f:
lines = f.readlines()
if lines[0].strip() != "---":
print(f"⚠️ Ei front matteria: {filename}")
continue
# Poimi front matter
end_idx = lines[1:].index("---\n") + 1
yaml_content = "".join(lines[1:end_idx])
try:
front = yaml.safe_load(yaml_content)
except Exception as e:
print(f"❌ YAML-virhe {filename}: {e}")
continue
categories = front.get("categories", [])
if not categories:
category = "Uncategorized"
else:
category = categories[0].strip().replace(" ", "_")
dest_dir = os.path.join(OUTPUT_DIR, category)
os.makedirs(dest_dir, exist_ok=True)
shutil.copy(filepath, os.path.join(dest_dir, filename))
print(f"✅ {filename} → {category}/")
print("\n🟢 Valmis. Tiedostot on järjestetty kansioon 'categorized/'.")
Minulla on hakemisto katiska-heritage
. Ensimmäisellä käyttökerralla siirsin komennolla mv -r ...
luodut hakemistot sinne. Kun jatkossa, aika ajoin, teen saman operaation uusiksi, niin siirrän vain muuttuneet ja uudet:
rsync -av --update --include="*/" --include="*.md" --exclude="*" categorized/ /root/katiska-heritage/
Kuten syntaksista näkee, niin tuo on vasta suunnitelma. En ole kokeillut toimiiko se noin. Mutta rsynciä on käytettävä, koska mv ei ymmärrä keskittyä vain muuttuneisiin ja uusiin.
Lopuksi poistin juuri muunnetut ja siirretyt md-tiedostot, mutta sen teen käsin. Arkailen hieman paljon automaattisia poistoja. Haluan nähdä mitä tuhoan lopullisesti.
Tein töitä /root hakemistossa, koska olen serverini ainoa käyttäjä ja kirjautuminen onnistuu vain SSH:lla, jolloin voin toimia rootin roolissa. Silloin kotihakemistoni on… /root
git
Ensimmäisellä kerralla tein hakemistoon katiska-heritage
normaalit repon luomiset GitHubiin, git init
, pushit ja muut. Varakopio oli näkyvissä maailmalle sen jälkeen.
Koska kirjoitan tätä samaan aikaan kun rakensin tuota, niin varsinainen jatkon työnkuva ei ole täysin selvillä, mutta nyt mukaan tulee se miksi Ulysses mainittiin alussa.
Saan kytkettyä repo-hakemiston suoraan sille External folders kautta. Silloin pääsen muokkaamaan tekstejä tarpeen mukaan. Tai selailemaan niitä paljon mukavammin kuin shellissä nanon kautta. Aivan koko Katiskan sisältö kun ei ole säilyttämisen arvoista, joten jotain kuratointia lienee syytä tehdä.
Mihin päädyttiin?
Nyt Katiskan tekstisisältö on tallessa GitHubissa.
https://github.com/eksiscloud/Katiska
Tarkoitushan ei ollut tehdä mitään mirroria tai rinnakkaissivustoa, vaan säilyttää nimenomaan tekstisisältö. Kuvat saisin myös talteen myös tällä tavalla, mutta ei niissä oikein ole mitään jälkipolville tallennettavaa. Eikä GitHubia ole edes tarkoitettu mediasisällölle.
Kuvissa on yksi digitaalisen perinnön suurimmista ongelmista: enää ei vintiltä löydy niitä pölyisiä kenkälaatikoita täynnä vanhoja valokuvia ja historiaa. Mutta tuo on oman aiheensa väärtti.
Videot ovat tallessa Youtubessa, ainakin sen aikaa mitä Google antaa niiden olla siellä. Podcastejä käy hieman sääliksi, enkä ole vielä päättänyt mitä niille tekisin. Se on seuraava projekti ja rakennan sen luultavasti Cernin rahoittamalle ja eurooppalaiselle Zenodolle — ja siinä vaiheessa saattaa mennä tämäkin kokonaan uusiksi
Mutta sillä välin saatan tehdä kopioinnin myös sivustolle https://jagster.eksis.one
Keskustele foorumilla Katiskan foorumi