Dvorak, here I come

Inspired by this nice blog post by Matt Might, I decided to give the Dvorak keyboard layout, more specifically, the Programmer Dvorak, a try. I experienced minor finger fatigue symptoms lately, which also contributed to this decision. This nice site gave me some indication which layout would be best for most of my writing. Now, I can’t afford less productive time at the moment, so the path Matt chose won’t work for me. Instead, I decided to continue working using regular QWERTY, while doing Dvorak lessons three times a day. I will switch completely, once I reached reasonable fluency. This will most probably result in slower learning progress, but it seems worth the trade-off.

I use DvorakNG, a simple typing tutor, to do the lessons. The program gives some simple statistics after each lesson: an error ratio (1 – erroneous / total typed characters), and characters per second/minute. I will document those values in this post, updating it from time to time. There will even be some plots once I collected enough data! For now, I will start with just the home row keys of the Dvorak layout. I typed the same lesson using QWERTY to give a fair comparison. Here are the values:

Dvorak
When Time Total Misses Ratio CPS CPM
23/03/2014 14:34 1058.21 1540 125 91.88% 1.46 87.32
23/03/2014 18:41 866.99 1535 96 93.75% 1.77 106.23
24/03/2014 11:50 809.24 1530 119 92.22% 1.89 113.44
24/03/2014 15:33 832.88 1536 100 93.49% 1.84 110.65
25/03/2014 11:53 655.09 1513 70 95.37% 2.31 138.58
25/03/2014 15:05 628.56 1514 57 96.24% 2.41 144.52
26/03/2013 08:52 563.03 1520 76 95.00% 2.70 161.98

versus

QWERTY
When Time Total Misses Ratio CPS CPM
23/03/2014 14:34 238.06 1494 40 97.32% 6.28 376.54

To compare the two, I just divided the values for error ratio and characters per second (CPS):

Comparison
When Ratio CPS
23/03/2014 0.94 0.23
23/03/2014 0.96 0.28
24/03/2014 11:50 0.95 0.30
24/03/2014 15:33 0.96 0.29
25/03/2014 11:53 0.98 0.37
25/03/2014 15:05 0.99 0.38
26/03/2013 08:52 0.98 0.43

I’m planning to update the Dvorak-Table daily, and the QWERTY table once a week, to see if it gets worse. I’m really curious how these numbers will develop.As you can see, the error ratio only differs slightly (reason being my bad typing skills in QWERTY), while typing speed is considerable lower (23% of QWERTY speed).

Update 27/3:

So, I finally updated the tables. I was able to improve considerably, which is nice. However, I will abandon this lesson, since using just the home row is quite boring. Not sure if I will collect the same amount of data for each lesson.

How Schools Teach Us to Write Badly

A couple of hours ago I enrolled in an online course on (scientific) writing on Coursera. I still have to absorb the first lectures, but a statement that struck me was that our education strengthens a particular bad writing habit: It drives us into using meaningless filler words and other clutter to match with the length requirements of essays, rather than solely focusing on the content. I still have difficulties to get loose of that habit.

I Found My Toy Problem

More often than not, I find myself tempted to learn a new programming language. Especially if it follows a different paradigm than the languages I already know. Which are, unfortunately, not that many. But learning a new language is a tedious task: you have to read through loads of tutorials, introductions and how-to’s, which are most certainly at a very basic level, and thus utterly boring. Without a somehow clear goal in mind, I usually just give up and visit Reddit to look at pictures of cats.

Without knowing on which problems you might want to apply your new knowledge, it is hard to stick to learning stuff. Finding a problem that needs to be solved, is interesting and is suitable to serve as a first exercise in a newly learned programming language is also tricky. After all, it mustn’t be too advanced and complicated, in order to be able to use a freshly learned tool to solve it, but at the same time, not too simple so that one does not find it too boring and trivial.

I finally found my personal toy problem which I will use to learn new programming languages: Implementing three of the most important algorithms for inference on Hidden Markov Models: the forward algorithm, the forward-backward algorithm and the Viterbi algorithm. For simplicity, I will only consider the case of discrete emission distributions. The code will not contain any kind of error checking whatsoever. It will be just some ugly hack, but I can live with that. Moreover, I will only use the standard libraries of each programming language. Let’s see where this will lead me.

As a starting point, I implemented the algorithms using my current language of choice, Python. I’ll just show the basics and the forward algorithm here, the rest can be found at my GitHub. So, here it goes:

class HMM:
    def __init__(self, pi, A, B):
        self.pi = pi
        self.A = A
        self.B = B

def normalise(l):
    norm_const = sum(l)
    return map(lambda x: x / norm_const, l), norm_const

So here we just have the data structure (which is basically just a struct) and a function to normalise values in a list. And now for the forward algorithm:

def forward(model, observations):
    state_idxs = range(len(model.pi))
    log_prob = 0.

    alphas = [[model.pi[i] * model.B[i][observations[0]] for i in state_idxs]]
    alphas[0], nc = normalise(alphas[0])
    log_prob += log(nc)

    for obs in observations[1:]:
        alphas += [[sum([alphas[-1][j] * model.A[j][i] for j in state_idxs]) * model.B[i][obs] for i in state_idxs]]
        alphas[-1], nc = normalise(alphas[-1])
        log_prob += log(nc)

    return alphas, log_prob

Simple as that! As I wrote before, check out the rest of the code at my GitHub.

The next language I want to implement the stuff in is Haskell. I started to read the fantastic „Learn You a Haskell For Great Good!“ by Miran Lipovača. I’m really looking forward to using a functional language.

A Script to Reorganise Shotwell’s Photo Library

I am a patient guy. But since the developers of the photo organising software Shotwell apparently can’t get this feature done, after postponing it for the fourth time, I’m fed up.

When importing photos from my camera, Shotwell puts them in a directory based on the date the photo was taken. In the software itself, you can define so-called „events“, containing multiple photos, possibly taken on different days. Their location on the hard disk however is never changed. You can’t use the event’s name to organise the files on your hard disk. This is not a problem if you want to browse your photos only from Shotwell, but as soon as you’d like to view them on your TV using XBMC, browsing becomes unbearable.

Additionally, merging events, creating events and even changing the date of photos takes ages, while uploading cropped and straightened photos to Picasaweb from Shotwell sometimes yields funny results. At some point I decided to search for another way of organising my photos. However, they were all hidden in a confusing directory structure, plus it took me quite a long time to name all those events. Hence, I decided to stick with Shotwell for some time. At least, until they implement the aforementioned feature. Well, I guess they never will…

That’s why I decided to do it on my own, and created a python script that reads Shotwell’s database and restructures the directories the way I want them to be. If you suffer from the same problem, you can download it from my github:

https://github.com/fdlm/shotwell-db-org

Beware of bugs, you could possibly destroy all your photos, I am not responsible for any of this, the code is ugly but I don’t care … you know the rules. Back up your photos before using it.

That said, the script worked from me, but is far from feature-complete. Maybe it might help someone who has the same problem I had before writing it.

Improved sound quality using an external USB soundcard on Raspberry Pi

So after setting up MPD on my Raspberry Pi, I managed to get transmission daemon and NFS running. You can use about any good tutorial for this, since there are no special tricks involved – everything works just like on a normal GNU/Linux box.

However, you can’t expect a 35€ device to ship with a great DAC. I’m not really what you would call an audiophile, discussing how the new USB cable totally changed the sound characteristics, and how everything now sounds fresher, warmer, crisper whatsoever. Nevertheless, since I just didn’t like the Pi’s analog output, I ended up buying an external soundcard, an ESI Dr. Dac, which got good reviews on the net. It is a dead-simple device which features a single 3,5mm jack which is used for both the analog and optical digital out. The best part however is that it just works out of the box without any hassle. And of course, the sound is notably better than before (fresher, warmer, crisper).

All I had to do is to connect it to the Pi and remove line containing ‚snd_bcm2835‚ from /etc/modules, since I won’t need the analog output anymore. This way, the Dr. Dac automatically gets the default pulseaudio device, and MPD will use it for sound output. Yeah, that’s all, we’re done.

Unfortunately it does not seem to be that easy to convince XBMC to use the Dr. Dac for sound output. There is some kind of support for this, but it is far away from stable and made my XBMC crash. Maybe I’ll dig into this someday, but until then I’m happy with this setup. Most of the time I’m using the Raspberry Pi to listen to music, and once every two weeks or so I have to connect my amplifier directly with the Pi instead of the Dr. Dac. No, I don’t mind the sound quality when watching series.

Setting up MPD on a Raspberry PI with a RaspBMC installation


UPDATE:

Yesterday I installed RaspBMC Final. PulseAudio is now running out of the box, so you can skip the installation and setup of ALSA.
—-

Well, there are probably millions of tutorial for this, but still I decided to write down all the necessary steps to set up MPD on my „media center“ at home. All this is done on a fresh install of RaspBMC RC5 / XBMC RC2, as released on the 30th of December. The steps are fairly straight-forward.

Let’s start with enabling sound output through ALSA and PulseAudio:

sudo modprobe snd_bcm2835

Furthermore we’ll add „snd_bcm2835“ (without the parentheses) to /etc/modules, so it will be loaded on startup.

Then, install MPD:

sudo apt-get install mpd

Now let’s configure MPD. To do this we must edit /etc/mpd.conf. The file contains a lot of comments which explain the configuration settings in detail. I’ll go through all the things I needed to change in order to get MPD working. First, MPD needs to find the music. I keep my music on an external disk which I connect directly to the Raspberry PI. RaspBMC mounts it automagically on /media/. Hence, „music_directory“ points to „/media/media-disk/Musik“.

I also want the playlists to be on this disk. Thus, „playlist_directory“ is set to „/media/media-disk/Musik/playlists“.

While read-only access to the disk suffices for reading the music, if I want to save MPD playlists, I’ll need write access. RaspBMC mounts the disk with the user „pi“, with write permissions for the user’s group, but not for others. Since MPD will run with its own user called „mpd“, I changed MPDs group to „pi“. Furthermore, I want to control the daemon from other devices, so I changed „bind_to_adress“ to „any“.

Last but not least you have to configure an audio output. I use PulseAudio for the moment, since it worked out of the box, but I’ll consider moving directly to ALSA if I notice performance issues. It’s as simple as it can be:

audio {
  type   "pulse"
  name   "Wohnzimmer"
}

And that’s it. The complete configuration file can be found here.

Next, I’ll configure NFS to access my media files from any device at home, and make transmission-daemon work.

 

Why you shouldn’t use boost::any (especially not in time-critical code)

In case you didn’t know, boost::any is a conveniant way to store & pass any (no shit, Sherlock!) datatype you can imagine. No one would expect that such nice things work without some overhead – however the implementation of boost::any does not seem to be the fastest around, as some tests I did today show. Luckily, I remembered a stack overflow answer to some unrelated question about boost::any, pointing out that there’s an alternative for boost::any in the boost library itself, namely boost::spirit::hold_any, being smaller, faster and providing nifty stream output operators. Back then, assuming boost itself being heavily optimised, I could not imagine that the performance difference was substantial, so I dropped the idea of using boost::spirit::hold_any, hoping that if its implementation was that good it would replace boost::any sooner or later anyways. As I learned today, this assumption is simply wrong.

Using a simple testing program I evaluated the performance of boost::any, boost::spirit::hold_any and simply casting to void* and back. Needless to say, casting around void pointers is the fastest method, but you are losing any type information whatsoever and may run into bugs which are difficult to find. However, even the difference between boost::any and boost::spirit:hold_any is almost an order of magnitude! Lesson learned: if you want to use a typesafe fire-and-forget-use-any-datatype concept, stay away from boost::any and stick with boost::spirit::hold_any – their usage is essentialy the same. If you need the last bit of speed (and you have checked using a profiler that hold_any is the thing thats slowing the code down) you may want to consider entering the minefield of void pointer casting🙂

Stop your jibber-jabber, here’s the real data (setting 100000000 size_t values using each method to pass the argument to a function):

Method g++ g++ -O1 g++ -O2 g++ -O3
boost::any 7.29s 3.64s 3.63s 3.21
boost::spirit::hold_any 2.93s 0.93s 0.66s 0.40
void* 0.49s 0.32s 0.05s 0.05

It is crucial to mention that the comparison between the boost classes and passing void pointers is only fair when using these classes only to pass parameters to functions, and not their ability to store arbitrary data – to accomplish this using void pointers one would need additional code overhead, which would certainly slow the whole thing down. The key of this article was to compare boost::any to boost::spirit::hold_any, using the void* method to introduce some baseline maximum speed.

Last but not least, here’s the code I used to evaluate the performances: test.cpp. Remove the .doc extension – WP does not like uploading .cpp files🙂

Die unmenschliche Regierung in China

Heute auf orf.at:

Ai Weiwei nennt chinesische Regierung „unmenschlich“

Der regierungskritische chinesische Künstler Ai Weiwei hat die kommunistische Führung in Peking als „unmenschlich“ bezeichnet. In einem Telefonat mit der Nachrichtenagentur AFP sagte der unter Hausarrest stehende Konzeptkünstler heute: „Die Regierung, das gesamte System (…) opfert Bildung, Umweltressourcen und die Interessen der meisten Menschen, nur damit einige wenige Menschen mit Verbindung zur Regierung extrem reich werden können.“

Gottseidank leben wir ein einer Demokratie, denn BEI UNS IST DAS GANZ ANDERS!!!!

Sprache, Integration: Sebastian Kurz setzt den Weg der Inkompetenz der VP fort…

Es ist ja nicht so, dass die Schwarzen in Österreich über eine Unmenge an kompetenten und/oder mitdenkenden Leuten verfügen würden – aber anscheinend fühlt man sich auch recht wohl dabei. Ansonsten ist nicht zu erklären, dass gerade Sebastian Kurz an die Spitze der JVP gekommen ist, und von dort aus seinen Beitrag zum Wahlkampf in Wien beitragen darf. Abgesehen von der „geilen“ Politik seines schwarzen Geil-O-Mobil Hummers  (… hat sich hier jemand über Steuergeldverschwendung beschwert?), mit der man in Begleitung diverser Blondinchen wohl die Jugend dazu bringen will, Politik wieder interessant zu finden – indem man sie lächerlich macht – gibt es auch auf sachlicher Ebene den gewohnten … nun, sagen wir Blödsinn.

Da es in diesem Land, seitdem ich es bewusst wahrgenommen habe (also ca. 1994), keinen Wahlkampf gibt, bei dem nicht „die Ausländer“ eine tragende Rolle spielen, wird es auch hierbei wieder um die so oft ins Rennen geworfene, aber nie konkretisierte „Integrationsdebatte“ gehen. Interessant übrigens, dass große Teile der Bevölkerung ihre Politik so wählen, dass sie sich hauptsächlich um jene kümmert, die sie doch hassen. Ist wohl eine Art der Autoaggression – wie auch immer!

Jedenfalls fordert der junge Sebastian in der aktuellen Datum zum wiederholten Male, dass in Moscheen, im öffentlichen Leben und im Idealfall auch in der Familie ausschließlich auf Deutsch gesprochen werden soll. Völlig unabhängig davon, dass es der Politik egal sein kann, bzw. egal sein muss in welcher Sprache ich mich mit Freunden oder Bekannten in meiner Freizeit unterhalte, unabhängig davon, dass die Politik das familiäre Privatleben nichts angeht, und auch unabhängig davon, dass jeder vernünftige und/oder mitdenkende Mensch Zwei- oder Mehrsprachigkeit als wünschenswertes Ziel und großen Vorteil für die Person selber, aber auch für die Gesellschaft erachtet, und auch abgesehen davon, dass sich die meisten Parteien beim Thema Deutschkenntnisse mal selber an die Nase fassen sollten, ist dieser Vorschlag in höchstem Maße kontraproduktiv. Er bewirkt genau das Gegenteil von dem, was diese Leute (vorgeblich) erreichen wollen: gute Deutschkenntnisse als Grundlage für Integration.

Legen wir die Fakten auf den Tisch

Kaum jemand ist in der Lage, nach seinem 20. Lebensjahr eine Sprache so zu erlernen, dass er sie akzent- und fehlerfrei verwenden kann. Zumindest nicht, wenn er sich nebenbei um andere Dinge kümmern muss, z.B. die Ernährung der Familie. Die logische Folge ist, dass so gut wie alle Personen, die als Erwachsene nach Österreich kommen, niemals perfekt Deutsch sprechen werden, was – meiner Meinung nach – überhaupt kein Problem ist. Im Gegensatz dazu lernen Kinder sehr schnell und sehr gut neue Sprachen. Am Besten von den Eltern. Man muss jetzt nur in der Lage sein, eins und eins zu addieren, um zu sehen, was die Folge wäre, wenn in Familien, in denen die Eltern fehlerbehaftetes Deutsch mit unnatürlicher Aussprache mit den Kindern sprechen: Die Kinder übernehmen die Fehler der Eltern. Ist das so schwer zu verstehen? Das ist jetzt kein theoretisches philosophieren auf abstrakter Ebene. Spontan fallen mir zwei Personen aus meinem (Ex-)Bekanntenkreis ein, die genau das Problem hatten (wobei einer sogar in Österreich geboren wurde!) und deswegen auch Probleme in der Schule bekamen. Denn solche Sprachfehler, die man schon als Kleinkind aufgenommen hat, bleiben einem oft ein Leben lang. Es ist sehr schwierig sich von ihnen zu lösen. Im Gegensatz dazu stehen einige Leute (auch aus meinem Bekanntenkreis), bei denen in der Familie NIE Deutsch gesprochen wurde – sie sprechen fehlerfrei. Nun kann man hier einwenden, dass die Stichprobengröße äußerst gering ist – das stimmt natürlich. Dennoch ist es bemerkenswert, und stützt nun mal eine in sich recht schlüssige Theorie.

Kinder erlernen Sprachen durch nachahmen. Sie sollten sie daher auch von jenen nachahmen, die sie richtig beherrschen. Das heißt: möglichst viel Kontakt mit deutschsprachigen Kindern, und irgendwann kommen sie nach hause und sprechen Deutsch. Man braucht keine Sprachkurse mit Grammatikübungen, Vokabeltests und Noten. Und vielleicht sollte man auch aufhören, Leuten mit ausländischem Akzent automatisch in gebrochenem Deutsch zu antworten („Gehst du Bahnhof, dann rechts, bist du da!“). Aber das ist „anderes Baustelle“.

Damit ist nicht genug. Nicht nur, dass die heranwachsenden Mitbürger mit Migrationshintergrund (political correctness ftw!) verkrüppeltes Deutsch lernen, das Deutschsprechen in der Familie hat einen weiteren gravierenden Nachteil: man verlernt seine Muttersprache. Und wie bereits erwähnt, sollten bis auf ein paar Hinterwäldler die meisten verstanden haben, dass das nur negativ sein kann. Nicht zuletzt seit allgemein bekannt sein sollte, dass die Beherrschung seiner Muttersprache das erlernen von weitern Sprachen (z.B. Deutsch) erleichtert.

Sie ist da – die Linzer Stadtwache

Ein Flyer in meinem Postkasten hat es heute offiziell gemacht: seit Anfang September dreht die Stadtwache a.k.a. Linzert Ordnungsdienst, wie das Ganze amtlich heißt, ihre Runden durch die Stahlstadt, um für Recht, Ordnung und Sauberkeit zu sorgen. So weit, so bekannt. Eine kleine Faktensammlung rundet den Flyer ab. Wer bis jetzt noch nicht kräftig zu den Stadtwachplänen gefacepalmt hat, bekommt nun die Gelegenheit.

Dabei sind jeden Tag zwischen 8 und 24 Uhr drei Zweier-Teams im Einsatz.

Sechs wackere Kämpfer sorgen also nun für Sicherheit. Weil 600 Polizisten es nicht schaffen. Auf eine Stadtwache kommen 31559 Bürger (Stand 2009). Eine Stadtwache muss 16008 km² bewachen. Anscheinend hat das Wimmerl ein Dimensionstor mit dem Weg nach Krypton gefunden, auf eine andere Weise KANN das gar nicht funktionieren…

Mit hochtechnischer Ausrüstung („Kamera und Handy“!!!) geht die Männer und Frauen des Ordnungsdienstes  auf die Pirsch – um für die braven Linzer Bürger u.a. folgende Aufgaben zu erledigen:

Verhinderung von illegaler Bettelei und illegaler Straßenmusik

… denn wo kämen wir da hin, wenn einfach jeder auf der Straße musizieren könnte. Hält ja kein Mensch aus, diese Dauerbeschallung der Linzer Innenstadt. Sorry Leute, Kulturhauptstadt ist vorbei!

Vermeidung strafbarer Handlungen durch Anwesenheit

Ja, das steht tatsächlich wörtlich so im Flyer. Durch Anwesenheit. 16000 km² pro Person.

Erstattung von Anzeigen bei strafbaren Handlungen

… was jedem anderen Bürger natürlich nicht erlaubt ist. Dafür braucht es einen Ordnungsdienst!

So sehr ich die Linzer SPÖ dafür treten könnte, dass sie diesem Schwachsinn zugestimmt haben, scheinen sie einfach draufgekommen zu sein, dass diese Stadtwache ein gänzlich sinnloses Unterfangen ist, was genau NICHTS an irgendetwas ändern wird, aber die ewigen Angst- und Sicherheitspolitiker Wimmerl und Watzl endlich ihre Bappen halten werden, wenn sie ihr Spielzeug Stadtwache zum Geburtstag bekommen.

Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.