Blog
Here I do some blogging. If you are fluent in both Finnish and English, just continue reading. You can also pick postings in English. Please note that this is my personal blog and in principle it is not related to Codegrove.
Täällä minä bloggaan. Tässä luettelossa ovat suomenkieliset ja englanninkieliset jutut peräkkäin, mutta voit myös valita pelkästään suomenkieliset kirjoitukset. Kirjoitan blogiin omana itsenäni, eli nämä kirjoitukset eivät välttämättä liity mitenkään itse Koodilehtoon.
Melkein kuin demotaidetta
Tänään olin kokoustamassa kaupungissa illalla. Sillä aikaa oli alkanut satamaan lunta. Kuitenkin yksi asia sai minut minuutiksi pysähtymään keskelle rapakeliä.
Se oli valtava, valehtelematta liki kymmenmetrinen kuutioefekti pyörimässä paikallisliikennekeskuksen lähellä, Forumin rakennuksen seinässä. Siinä pyöri hervoton kuutiorakennelma seinällä, koko talon korkuinen se on. Kameraa ei ollut mukana, mutta joku voisi siitä kuvan käydä räpsäisemässä.
Googlen katunäkymästä käy ilmi, mitä seinää tarkoitan.
Efekti on toteutettu siten, että hyvin tehokkaan valonheittimen edessä on rakennelma erilaisia rautalankamallisia kuutioita. Ne ovat kiinnitetty pyörivälle alustalle. Kun rakennelma pyörii tavallisen kiinteän valonlähteen edessä, heijastuu seinälle varjokuva, joka jättää varjoonsa monet demoskenen hienoimmista shadereista.
Kannattaa käydä kurkkaamassa. Se luultavasti liittyy Valo on Jyväskylässä -tapahtumaan, vaikka sitä en tapahtuman sivuilta löytänytkään. Siitä vaikka idea Instanssien summamutikka-kompoon!
Demotaidetta näemmä siis osaavat vahingossa tehdä muutkin taiteilijat. :-)
Cumbersome migration of my old blog
I have spent the last three days with migration of my old 52 blog messages from Saunablog to Codegrove. I don't want to be dependant of my mobile operator so I decided to migrate the blog on a site I host together with my friends.
Saunablog is hosted by my mobile operator and is running on Nucleus CMS. Codegrove, on the other hand, is running on Plone 4.
Migrating postings shouldn't be too hard. To copy and paste 52 articles. Well, that isn't the point. I can do copy-pasting neverendingly and it gives me nothing. Doing a real migration is the art I am willing to know better.
Please note that these migration scripts I provide are useful only for me. If you need to do something similar, you need to adapt those scripts for your needs.
Looting of old data
The first bumb was I have no access to the database of Saunablog. The site is hosted somewhere and all I've got are ordinary user privileges allowing just posting and editing. I'm calling it looting because I don't really own the servers and the techniques can be used to get something you don't even own.
I started with wget. I logged on my Saunablog in Firefox to get the cookie. Then I used exporting script to get cookies.txt, which can be used with wget.
I wrote hallintasivu.xsl and download-uri.xsl for that purpose. It takes blog administrative interface page as input and produces a wget line per posting. It can be directed to a script file which is run after the first pass. In a fresh directory, run:
$ xsltproc --encoding 'ISO 8859-1' hallintasivu.xsl index.php.html >index.xml $ xsltproc download-uri.xsl index.xml >tmp-download.sh $ sh tmp-download.sh
Now you got all those raw messages. But that's only the first step.
About importing to Plone
Plone has support for WebDAV which makes it much simpler to transfer data to and from Plone instance. You don't need to hack Plone, just mount the site to your directory tree. Well, in theory, yes.
Importing data to Plone is like throwing a loaded die. It's getting the desired result most of the time, but there is a chance for a fail. Plone's WebDAV support has been barely documented. It was much easier to think Plone as a black box and to imagine a way to get a rabbit out of the box. After two days of trial and error I managed to do something I was happy with.
So, we need loads of configuration and a mysterious XSLT script to do the trick. Details follow.
Enabling WebDAV on Plone
This is quite staightforward. One has Plone in a directory with buildout configuration. Let's follow the instructions Epeli found and add the following to the [instance] section of buildout.cfg:
zope-conf-additional = enable-ms-author-via on <webdav-source-server> address localhost:1337 force-connection-close off </webdav-source-server>
After editing the file, you need to re-run buildout, of course.
$ sudo bin/buildout $ sudo bin/instance restart
After that, you should have WebDAV running on port 1337. Quite elite, huh?
Mounting Plone instance
You can install WebDAV support for your Debian or Ubuntu box straight from the package manager. First of all, get davfs2.
$ apt-get install davfs2
You can mount the site as an ordinary user but for me it's much better to do it system-wide. I added the following to my local /etc/fstab:
https://my.plone.site/ /mnt/codegrove davfs uid=joell,noauto 0 0
Getting that done was easier than I thought.
Converting data to Plone format
This is the most trickiest part of the work. The results are based on trial and error as I earlier mentioned. So I don't have any sources of information to cite.
Having the blog postings to preserve their timestamps was trickier than I thought. It's difficult to "forge" modification or creation date, but setting effective date (aka publishing date) is a feasible solution. Also, I wanted to enable comments and hide the blog postings from the navigation.
The following headers were optimal for me. The example is taken from one of my postings:
title: Warshavjanka 2.0 description: Kirjoitettu 07.06.2008 klo 15.24 effectiveDate: 2008-06-07 15:24 subject: saunablogi finnish ajatukset allowDiscussion: True language: fi excludeFromNav: True Content-Type: text/html
I also added publishing date to the description field because that makes it easy to show dates in listings. Subject is holding the tags. Additional tags are listed on new, indented lines.
I wrote a script called plonefy.xsl to do the dirty part of transforming. I've run it like this:
$ for JOO in saunablog/msg-*; do xsltproc --encoding 'ISO 8859-1' plonefy.xsl $JOO >plone_raw/$(echo $JOO|sed 's/saunablog\/msg-\(.*\)\.html/sb-\1/');done
Migration of in-line pictures
After having some guru meditation I grasped how to get all the pictures related to my blog. I used the following incantation:
$ cat msg-*|grep -o '<%[^%]*%>'|sed 's/<%image(\([^|]*\)|.*/http:\/\/path.to\/my\/blog\/\1/' > pics.txt $ cd pics $ wget -i ../kuvat.txt
As you can see, sed is a write-only script.
Nucleus has its own inline image tags in the form of url, width, height and title, separated by |'s. To convert those tags to an ordinary XHTML image tags, the following spell can be sent:
$ for MSG in *; do sed 's/<%image(\([^|]*\)|\([^|]*\)|\([^|]*\)|\([^)]*\))%>/<img src="pics\/\1" alt="\4" title="\4" width="\2" height="\3" \/>/g' <$MSG >../plone_final/$MSG; done
Sending the content to Plone
Now we have the final documents ready for uploading to the Plone instance. I just copied the files in plone_final to the blog folder of my plone instance using cp.
Remember to publish the postings to make them visible.
It has something to do with cp or WebDAV, but the order of the postings seems to be quite random. I work-arounded it by creating a collection and set it to descending order of effective dates. Then I limited the collection to the current location (..) to hide all other files on the site from the collection view.
To made it perfect, I set the collection to have 3 postings per page (from Edit...Number of Items) and to show the postings on collection page (from Display...All Content).
Now we are getting somewhere. All old data has been imported and it's time to start posting new ones!
PS. Thanks to everybody at #codegrove for their patience and help when I was getting mad with this migration.
Paluumatka 27.-29.7.
Kuten otsikosta saattaa päätellä, paluumatka ei ollut ihan niin nopea kuin sen oli tarkoitus olla.
Kaikki alkoi kuitenkin suunnitelmien mukaisesti aikataulun mukaan Malmööseen saapuessa. Vaihtoaikaa Göteborgin junaan oli noin tunti ja yritin löytää kaupungilta jotakin paikkaa, josta saisi aamupalaa järkevään hintaan, mutta kaikki paikat olivat kiinni kun oli sunnuntai. Puistosta löysin penkillä nukkuvia reppumatkaajia. Asemalla sentään oli Pressbyrån auki, josta sain vähän matkaevästä.
Useamman tunnin matka Göteborgiin Ö-junalla oli vähän mitäänsanomatonta, mutta ei nyt varsinaisesti tylsääkään. Paikkakuntia välillä vilisi paljon, koska paikallisjuna tietysti pysähtyi joka paikassa. Göteborgiin saavuttuani minulla oli pari tuntia aikaa katsella paikkoja ja syödä jotakin. Kävinkin seikkailemassa kaupungilla ja otin kuvia. Kaupunki vaikutti melko selkeältä ja miltei ruutukaavaiselta. Asema oli ihan keskustassa. Kaupunki vaikutti siltä, että siihen voisi tutustua enemmänkin.
Jatkoin IC-junalla aikataulun mukaan kohti Tukholmaa. Puolessa välissä turvalaitteet alkoivat reistaamaan ja juna alkoi madella. Kello kulki, juna ei. Näytti siltä, että 1h 15min laivaan vaihtamisajasta Tuhkolmassa kului yhä enemmän. Lopulta kun tarkistin asian konduktööriltä, oli juna noin tunnin jo myöhässä. Ei käytännössä mahdollista ollut ehtiä laivaan. Olisi pitänyt olla paikallinen, joka olisi osannut taktikoida taksien kanssa. Tosin sekään tuskin olisi riittänyt muutaman minuutin matkantekoon asemalta laiturille. Siispä vaihtoehdoksi jäi vain jäädä Ruotsiin.
Soitin Eskilstunassa asuvalle tädilleni ja sain majapaikan lyhyellä varoitusajalla. Vaihdoin siis Arbogasta Eskilstunaan menevään bussiin. Bussi korvasi ratatöiden takia suljettua väliä, joten siihen kelpasi Interrail-lippuni. Tosin ulkomaalaistaustaiselta näyttänyt bussikuski hetken aikaa pyöritteli lippua hämmennyksen vallassa. Harvoinpa bussissa sellaista näkee.
Selvisin mainiosti Eskilstunaan ja perille päästyäni tuntui kuin olisi tullut kotiin. Oltiin huolissaan, onko syöty, onko rahaa ja miten on jaksettu matkustaa. Sainkin syödä itseni melkein kipeäksi asti. Näytin vielä lomakuvia tietokoneelta ja selittelin reissun vaiheita. Aamulla ennen viittä kuitenkin täytyi herätä, että ehti vähän yli viideltä lähteneeseen junaan Eskilstunasta Tukholmaan. Juna kuljettikin minut näppärästi perille ja talsin asemalta laivalle aamulla. Rinkan vyötärövyö piti tosin solmia umpisolmulla kiinni, koska kiinnitys hajosi edellisenä iltana, kun minua haettiin asemalta. No, ei se mitään, selvisin hyvin lopulta.
Satamassa minua palveltiin hyvin. Sain mennä Viking Linen päivälinjalla ilman lisämaksua Turkuun, vaikka lippuni oli edelliselle illalle. Antoivat hytinkin siihen. Ei kannata luottaa puhelinpalveluun. Soitin nimittäin sinne Arbogan asemalla odottaessani ja siellä väittivät, ettei varausta saa muutettua ja menettää koko varauksen. Kallista ja virheellistä tietoa. Kiitokset menevät kuitenkin Vikingille joustavuudesta tällaista matkailijaa kohtaan.
No, laivassa jatkoin uniani puolelle päivin ja sitten kävin pyörimässä laivalla. Siellä katsoin junayhteyden valmiiksi Turun satamasta Jyväskylään. Näytti lähtevän samaan aikaan kuin laiva saapuu satamaan. Elin siinä käsityksessä, että junat haluavat matkustajia ja siis odottavat laivaa. No, näinhän ei tietenkään ole asian laita. Laivan infosta asiaa tarkistaessani sanoivat, että klo 19.50 satamasta lähtevä juna ei ole edes tarkoitettu Viking Linelle vaan Siljalle. Okei, okei, onpa fiksua. Se onkin sitten myöhäisin yhteys Jyväskylään, mitä junalla pääsee. Tarkistin bussiaikataulut ja niinhän sielläkin oli, että ei ole ainoatakaan siihen aikaan lähtevää bussia Jyväskylään, eikä myöskään Tampereelta Jyväskylään. Game over. Pitäisi jäädä jonnekin *tun Turkuun.
Tampereelle pitäisi ainakin päästä. Tampereelta on kuitenkin kohtuulliset aamuyhteydet Jyväskylään. Vielä ennen yhdeksää onneksi satamasta lähti juna Tampereelle, eikä jatka siitä eteenpäin. Siispä osa ratkaisua saavutettiin, ainoaksi ongelmaksi vaan jäi löytää halpa majapaikka Tampereelta. Viestittelin täkäläisille tutuille ja tuntui olevan väki poissa paikkakunnalta kesällä. Vasta kun olin jo junassa Tampereelle, hoksasin ottaa yhteyttä SONK-toveriini. Hän vieläpä asui aseman lähettyvillä, joten ratkaisu löytyi kivuttomasti. Samalla sai turistua SONK-asioita ennen nukkumaan menoa. Näppärää ja tehokasta!
Tiistaiaamuna matka jatkui kahdeksan junalla kohti Jyväskylää. Konduktööri oli rento ja sain käyttää matkalippuni Turusta Jyväskylään kahdessa osassa. Maksoin ainoastaan junatyypin vaihdosta. Juna tuli yllättäen minuutin etuajassa asemalle. Kiiruhdin Jyväskylässä asemalta ohjaamaan Ohjelmointi 2 -kurssin harjoitustyötä Agoralle. Matka oli viimein ohi. Paluu arkeen oli edessä.