Joachim Breitner

Blog

Ein Tiptoi-Taschenrechner

Published 2015-01-23 in sections Deutsch, Tiptoi.

Die Tiptoi-Bastelei hat wieder neuen Schwung bekommen. Auf der neuen Tiptoi-Mailingliste sind bereits 27 Leute unterwegs, und wir haben neue Features des Tiptoi-Dateiformats GME entschlüsselt. Auch wird unser kleines All-Round-Tiptoi-Tool tttool mächtiger: Man kann jetzt den Skripten symbolische Namen geben, statt die Codes direkt zu verwenden, und auf Wunsch erstellt tttool Audio-Samples direkt mittels eines Text-To-Speech-Programms (siehe z.B. text2speech.yaml). Außerdem hat es jetzt eine anfängerfreundlich(ere) Deutsche Webseite.

Insbesondere wurde kürzlich ein Sprungbefehl entschlüsselt, mit dem man jetzt schon richtig komplizierte Abläufe ausführen kann. Als kleine Demonstration habe ich ein Photo eines Taschenrechners genommen, über alle Tasten (bis auf den Dezimalpunkt) Codes gelegt und in unserem selbsterfunden YAML-Dateiformat den Rechner zum Leben erweckt.

Ein Taschenrechner, der jetzt sprechen kann

Ein Taschenrechner, der jetzt sprechen kann

Die meiste Logik war dabei für das Vorlesen deutscher Zahlen bis im Zehntausender-Bereich (der Stift rechnet mit 16bit, mehr braucht man also nicht) nötig. Der Code mag vielleicht auch für andere nützlich sein.

Mit dem Ausdrucken hatte ich ein wenig Schwierigkeiten. Mit dem Farblaserdrucker, auf den ich Zugriff habe, konnte ich gar nichts erreichen, und auch der Schwarz-Weiß-Laserdrucker liefert erst dann etwas brauchbares, als ich die Flächen der Tasten (etwas krude) komplett weiß gefärbt habe.

Alle nötigen Dateien – YAML-Datei, die Audio-Dateien, die fertige GME sowei die Bilder in drei Varianten als GIMP-Datei – habe ich in ein Git-Repository gepackt, falls jemand damit spielen möchte.

PS: Die Deutsche Webseite ist noch etwas unvollständig. Ich freue mich über jede Hilfe bei der Pflege der Seite.

...und wo sind die Ings?

Published 2015-01-04 in sections Deutsch.

Vor ein paar Tagen schrieb ich an dieser Stelle, dass die meisten Ortsnamen auf -ingen im Süden liegen, und belegte das mit einer Google-Maps-Karte mit eigezeichnetem mittlerem Breitengrad. Darauf hin wurde ich gebeten, dies doch auch für Orte auf -ing zu machen, und auf der Karte die Orte auch einzuzeichnen.

Dies habe ich jetzt gemacht. Diesmal verwendete ich die Generic Mapping Tools, wie schon bei dem Familienbuchprojekt. Hier die Grafik für die Orte auf -ingen und hier für die auf -ing.

Ich hab nur den Median eingezeichnet, der bei -ing bei 48,499°N liegt. Der Durchschnitt liegt bei 48,950°N.

Fazit: Orte auf -ingen liegen (meist) im Schwabenland, Orte auf -ing (meist) in Bayern, aber auf die Karte sollte man trotzdem schauen bevor man in die falsche Himmelsrichtung fährt.

Wo sind die -ingens

Published 2014-12-29 in sections Deutsch.

Wenn ich einen Ortsnamen höre, der auf -ingen endet, dann verorte ich ihn erstmal im Süden Deutschlands, zumindest ohne weitere Informationen. Kürzlich wurde angezweifelt, ob das sinnvoll sei, schließlich gibt es ja auch z.B. in Niedersachsen etliche Orte auf -ingen. Das konnte ich nicht auf mir sitzen lassen.

Also nahm ich die Daten von geonames.org für Deutschland. Von den 147327 Orten enden 2089 auf -ingen. Nun war es einfach den Durchschnitt und Median des Breitengrades für alle Orte (50,63° und 50,62°) sowie für alle Ingens (49,64° und 48,93°) auszurechnen. Besonders der Median war auf meiner Seite: Die Hälfte aller Orte auf -ingen in Deutschland liegen südlich von Karlsruhe!

Hier das Ganze nochmal als Bild:

Durchschnitt und Median der Orte auf -ingen

Durchschnitt und Median der Orte auf -ingen

Geschenke mit dem Tiptoi-Stift verteilen

Published 2014-12-26 in sections Deutsch, Tiptoi.

Nachdem inzwischen klar ist, dass man mit haushaltsüblichen Mitteln die Punkt-Codes für den Tiptoi-Stift selber herstellen kann, wurde es für mich Zeit, damit etwas jenseits der üblichen Anwendungen zu machen. Und so spannte ich den Tiptoi-Stift in die großfamiliäre Bescherungszeremonie ein.

Die Idee war, dass auf allen Geschenken kleine Aufkleber zu finden sind, die, wenn man mit dem Stift draufgeht, verraten, für wen das Geschenk ist. So kann ein (und wirklich nur ein! – daher weniger Chaos) Kind die Aufkleber suchen, aktivieren und dem Empfänger das Geschenk bringen.

Von der technischen Seite her ist das einfach. Mit meinem Tiptoi-Tool erzeuge ich mit dem Befehl tttool generate-oid 272,3701-3716 einen eigenen Anschaltcode und genügend weitere Codes: Einen pro Familienmitglied („Grandpa“, „Homer“, „Marge“ etc.), und noch ein paar für Kombinationen („Dies ist für Homer und Marge.“). Mit GIMP verteilte ich diese großflächig auf ein Blatt. 1200dpi×A4 sind zwar ganz schön viele Pixel, aber auf meinem drei Jahre alten Laptop trotzdem noch gut zu bearbeiten.

Leider haben die im generate-oid-Befehl verwendeten Zahlen nicht viel mit den vom Stift gelesenen Zahlen zu tun. Daher musste ich mir die richtigen Werte erst noch vom Stift im Debug-Modus auf Chinesisch vorlesen lassen: Der Startcode ist 42, der erste weitere Code ist 8066 und dann gehts so weiter.

Mit diesen Daten habe ich dann ein sehr einfaches Tiptoi-Programm im tttool-eigenen YAML-Format erstellt:

product-id: 42
comment: Weihnachtsgeschenktags
welcome: hallo

scripts:
  8066:
  - P(grandpa)
  8067:
  - P(homer)
  8068:
  - P(marge)
  8069:
  - P(bart)
  8070:
  - P(lisa)
  8071:
  - P(bartundlisa,lisaundbart)
  8072:
  - P(maggie)
  8073:
  - P(moe)

Es werden keine Register verwendet, da es keine Dynamik gibt. Lediglich bei den Geschenken für zwei liest er die Namen in einer zufällig Reihnenfolge vor – nicht dass Bart sonst behauptet, das Geschenk ist ja mehr für ihn als für Lisa.

Natürlich habe ich auch die entsprechenden Texte aufgenommen und als grandpa.ogg, homer.ogg usw. im gleichen Verzeichnis gespeichert. Auch eine hallo.ogg habe ich aufgenommen, damit man auch mitbekommt, wenn der Stift den Anschaltcode erkannt hat.

Mit tttool assemble weihnachten.yaml entsteht nun die weihnachten.gme-Datei, die ich auf den Tiptoi-Stift kopiere.

Nun müssen nur noch die Codes auf die Geschenke. Zuerst hatte ich die Codes auf Etiketten gedruckt (daher auch die 2×6-Anordnung in der PNG-Datei), aber da war noch ein Bug im Punktmuster, den ich erst merkte, als ich kurz vor knapp das ganze mit einem Stift testen konnte. Als der Bug dann behoben war, hatte ich nur noch normales Druckerpapier zur Verfügung, aber mit so Klebe-Quadraten für Photoalben war es genauso gut möglich, die Geschenke zu markieren. Zumindest als mir aufgefallen ist, dass ich die Schnipsel auch wirklich richtig rum draufkleben sollte...

Die Reste der Codes

Die Reste der Codes

Den Anschaltcode darf man natürlich nicht vergessen; der kam auf einen Schoko-Goldtaler. Damit war dann alles bereit und die Kinder konnten zur Bescherung auf die Jagd nach kleinen weißen Quadraten gehen, und hatten einen rießen Spaß, als sie meine Stimme aus dem Stift hörten.

Mit etwas mehr Vorbereitungszeit könnte man die Aufkleber natürlich noch schöner gestalten, in dem man mit den Codes schöne kindgerechte Motive aufs Papier bringt. Dies dann vielleicht fürs nächste Mal.

PS: Am 31. Januar werde ich im Fablab Karlsruhe einen Workshop geben, in dem gezeigt wird, wie man sein eigenes Tiptoi-Produkt erstellt. Es gibt noch keine Webseite dafür, aber im Mikrokontroller-Forum stehen die wichtigsten Infos. Wenn du in der Gegend ist: Ich freue mich über jeden Teilnehmer!

PPS: Es gibt seit heute eine Tiptoi-Bastler-Mailingliste, auf der Ideen wie diese hier besprochen, Probleme mit dem tttool-geklärt und neue Erkentnisse über den Stift und das GME-Format ausgetauscht werden können. Auch hier bist du herzlich willkommen, mitzumachen.

Can one recommend Debian stable to Desktop users?

Published 2014-11-01 in sections English, Debian.

My significant other is running Debian stable on her laptop, and it has worked fine for quite a while. But since a week or two, she could not access her University IMAP account via Evolution. Obviously quite a showstopper!

Today I had a closer look, and my suspicion was that the University changed their SSL configuration due to the recent POODLE attack and that Evolution was incompatible with that. After some more searching, I found that Ubuntu had applied a patch, originally from Fedora, two weeks ago. For Debian, there is a bug report but no sign of action.

So I fetched the sources, applied the patch, built the package, installed it and things were working again. Yay for that! But this is obviously not the best way to handle such issues.

I know that Debian is volunteer driven and we often lack the manpower for certain things, so I don’t want to rant about this particular issue. I also continue to be a happy user of Debian unstable on my laptop, and Debian stable on my servers. But I seriously wonder: Can I really recommend Debian stable to users, for their laptops and desktops? If not, what are the alternatives? Ubuntu obviously comes to mind, having some full-time staff for such issues... But that would be giving up on promoting Debian as the universal operating system.

Update (2010-11-3): Laney just uploaded a fixed package. Thanks!

Switching to systemd-networkd

Published 2014-10-14 in sections English, Debian.

Ever since I read about systemd-networkd being in the making I was looking forward to try it out. I kept watching for the package to appear in Debian, or at least ITP bugs. A few days ago, by accident, I noticed that I already have systemd-networkd on my machine: It is simply shipped with the systemd package!

My previous setup was a combination of ifplugd to detect when I plug or unplug the ethernet cable with a plain DHCP entry in /etc/network/interface. A while ago I was using guessnet to do a static setup depending on where I am, but I don’t need this flexibility any more, so the very simple approach with systemd-networkd is just fine with me. So after stopping ifplugd and

$ cat > /etc/systemd/network/eth.network <<__END__
[Match]
Name=eth0
[Network]
DHCP=yes
__END__
$ systemctl enable systemd-networkd
$ systemctl start systemd-networkd

I was ready to go. Indeed, systemd-networkd, probably due to the integrated dhcp client, felt quite a bit faster than the old setup. And what’s more important (and my main motivation for the switch): It did the right thing when I put it to sleep in my office, unplug it there, go home, plug it in and wake it up. ifplugd failed to detect this change and I often had to manually run ifdown eth0 && ifup eth0; this now works.

But then I was bitten by what I guess some people call the viral nature of systemd: systemd-networkd would not update /etc/resolv.conf, but rather relies on systemd-resolved. And that requires me to change /etc/resolv.conf to be a symlink to /run/systemd/resolve/resolv.conf. But of course I also use my wireless adapter, which, at that point, was still managed using ifupdown, which would use dhclient which updates /etc/resolv.conf directly.

So I investigated if I can use systemd-networkd also for my wireless account. I am not using NetworkManager or the like, but rather keep wpa_supplicant running in roaming mode, controlled from ifupdown (not sure how that exactly works and what controls what, but it worked). I found out that this setup works just fine with systemd-networkd: I start wpa_supplicant with this service file (which I found in the wpasupplicant repo, but not yet in the Debian package):

[Unit]
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=simple
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I

[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service

Then wpa_supplicant will get the interface up and down as it goes, while systemd-networkd, equipped with

[Match]
Name=wlan0
[Network]
DHCP=yes

does the rest.

So suddenly I have a system without /etc/init.d/networking and without ifup. Feels a bit strange, but also makes sense. I still need to migrate how I manage my UMTS modem device to that model.

The only thing that I’m missing so far is a way to trigger actions when the network configuration has changes, like I could with /etc/network/if-up.d/ etc. I want to run things like killall -ALRM tincd and exim -qf. If you know how to do that, please tell me, or answer over at Stack Exchange.

New website layout

Published 2014-10-07 in sections English, Digital World.

After 10 years I finally got around to re-decorating my website. One reason was ICFP, where just too many people told me that I don’t look like on my old website any more (which is very true). Another reason was that I was visting my brother, who is very good at web design (check out his portfolio), who could help me a bit.

I wanted something practical and maybe a bit staid, so I drew inspiration from typical Latex typography, and also from Edward Z. Yang’s blog: A serif font (Utopia) for the main body, justified and hyphenated text. Large section headers in a knobbly bold sans-serif font (Latin Modern Sans, which reasonably resembles Computer Modern). To intensify that impression, I put the main text on a white box that lies – like a paper – on the background. As a special gimmic the per-page navigation (or, in the case of the blog, the list of categories) is marked up like a figure in a paper.

Of course this would be very dire without a suitable background. I really like the procedural art by Jared Tarbell, espcially substrate and interAggregate. Both have been turned into screensavers shipped with xscreensaver, so I hacked the substrate code to generate a seamless tile and took a screenshot of the result. I could not make up my mind yet how dense it has to be to look good, so I for every page I randomly pick one of six variants randomly for now.

I simplified the navigation a bit. The old News section has been removed recently already. The Links section is gone – I guess link lists on homepages are so 90s. The section Contact and About me are merged and awaiting some cleanup. The link to the satire news Heisse News is demoted to a mention on the Contents section.

This hopefully helps to make the site navigatable on mobile devices (the old homepage was unusable). CSS media queries adjust the layout slightly on narrow screens, and separately for print devices.

Being the nostaltic I am, I still keep the old design, as well as the two designs before that, around and commented their history.

ghc-heap-view for GHC 7.8

Published 2014-10-07 in sections English, Haskell.

Since the last release of ghc-heap-view, which was compatible with GHC-7.6, I got 8 requests for a GHC-7.8 compatible version. I started working on it in January, but got stuck and then kept putting it off.

Today, I got the ninths request, and I did not want to wait for the tenth, so I finally finished the work and you can use the new ghc-heap-view-0.5.2 with GHC-7.8.

I used this chance to migrate its source repository from Darcs to git (mirrored on GitHub), so maybe this means that when 7.10 comes out, the requests to update it come with working patches :-). I also added a small test script so that travis can check it: ghc-heap-view

I did not test it very thoroughly yet. In particular, I did not test whether ghc-vis works as expected.

I still think that the low-level interface that ghc-heap-view creates using custom Cmm code should move into GHC itself, so that it does not break that easily, but I still did not get around to propose a patch for that.

11 ways to write your last Haskell program

Published 2014-10-02 in sections English, Haskell.

At my university, we recently held an exam that covered a bit of Haskell, and a simple warm-up question at the beginning asked the students to implement last :: [a] -> a. We did not demand a specific behaviour for last [].

This is a survey of various solutions, only covering those that are actually correct. I elided some variation in syntax (e.g. guards vs. if-then-else).

Most wrote the naive and straightforward code:

last [x] = x
last (x:xs) = last xs

Then quite a few seemed to be uncomfortable with pattern-matching and used conditional expressions. There was some variety in finding out whether a list is empty:

last (x:xs)
  | null xs == True = x
  | otherwise       = last xs

last (x:xs)
  | length (x:xs) == 1 = x
  | otherwise          = last xs

last (x:xs)
  | length xs == 0 = x
  | otherwise      = last xs

last xs
  | lenght xs > 1 = last (tail xs)
  | otherwise     = head xs

last xs
  | lenght xs == 1 = head xs
  | otherwise      = last (tail xs)

last (x:xs)
  | xs == []  = x
  | otherwise = last xs

The last one is not really correct, as it has the stricter type Eq a => [a] -> a. Also we did not expect our students to avoid the quadratic runtime caused by using length in every step.

The next class of answers used length to pick out the right elemet, either using (!!) directly, or simulating it with head and drop:

last xs = xs !! (length xs - 1)

last xs = head (drop (length xs - 1) xs)

There were two submissions that spelled out an explicit left folding recursion:

last (x:xs) = lastHelper x xs
  where
    lastHelper z [] = z
    lastHelper z (y:ys) = lastHelper y ys

And finally there are a few code-golfers that just plugged together some other functions:

last x = head (reverse x)

Quite a lot of ways to write last!

Using my Kobo eBook reader as an external eInk monitor

Published 2014-09-21 in sections Digital World, English.

I have an office with a nice large window, but more often than not I have to close the shades to be able to see something on my screen. Even worse: There were so many nice and sunny days where I would have loved to take my laptop outside and work there, but it (a Thinkpad T430s) is simply not usable in bright sun. I have seen those nice eInk based eBook readers, who are clearer the brighter they are. That’s what I want for my laptop, and I am willing to sacrifice color and a bit of usability due to latency for being able to work in the bright daylight!

So while I was in Portland for DebConf14 (where I guess I felt a bit more like tinkering than otherwise) I bought a Kobo Aura HD. I chose this device because it has a resolution similar to my laptop (1440×1080) and I have seen reports from people running their own software on it, including completely separate systems such as Debian or Android.

This week, I was able to play around with it. It was indeed simple to tinker with: You can simply copy a tarball to it which is then extracted over the root file system. There are plenty of instructions online, but I found it easier to take them as inspiration and do it my way – with basic Linux knowledge that’s possible. This way, I extended the system boot script with a hook to a file on the internal SD card, and this file then runs the telnetd daemon that comes with the device’s busybox installation. Then I just have to make the device go online and telnet onto it. From there it is a pretty normal Linux system, albeit without an X server, using the framebuffer directly.

I even found an existing project providing a VNC client implementation for this and other devices, and pretty soon I could see my laptop screen on the Kobo. Black and white worked fine, but colors and greyscales, including all anti-aliased fonts, were quite broken. After some analysis I concluded that it was confusing the bit pattern of the pixels. Luckily kvncclient shares that code with koreader, which worked fine on my device, so I could copy some files and settings from there et voilá: I now have an eInk monitor for my laptop. As a matter of fact, I am writing this text with my Kobo sitting on top of the folded-back laptop screen!

I did some minor adjustments to my laptop:

  • I changed the screen size to match the Kobo’s resolution. Using xrandr’s --panning option this is possible even though my real screen is only 900 pixels high.
  • I disabled the cursor-blink where possible. In general, screen updates should be avoided, so I hide my taffybar (which has a CPU usage monitor) and text is best written at the very end of the line (and not before a, say, </p>).
  • My terminal windows are now black-on-white.
  • I had to increase my font-size a bit (the kobo has quite a high DPI), and color is not helpful (so :set syntax=off in vim).

All this is still very manual (going online with the kobo, finding its IP address, logging in via telnet, killing the Kobo's normal main program, starting x11vnc, finding my ip address, starting the vnc client, doing the adjustments mentioned above), so I need to automate it a bit. Unfortunately, there is no canonical way to extend the Kobo by your own application: The Kobo developers made their device quite open, but stopped short from actually encouraging extensions, so people have created many weird ways to start programs on the Kobo – dedicated start menus, background programs observing when the regular Kobo app opens a specific file, complete replacements for the system. I am considering to simply run an SSH server on the device and drive the whole process from the laptop. I’ll keep you up-to-date.

A dream for the future would be to turn the kobo into a USB monitor and simply connect it to any computer, where it then shows up as a new external monitor. I wonder if there is a standard for USB monitors, and if it is simple enough (but I doubt it).

A word about the kobo development scene: It seems to be quite active and healthy, and a number of interesting applications are provided for it. But unfortunately it all happens on a web forum, and they use it not only for discussion, but also as a wiki, a release page, a bug tracker, a feature request list and as a support line – often on one single thread with dozens of posts. This makes it quite hard to find relevant information and decide whether it is still up-to-date. Unfortunately, you cannot really do without it. The PDF viewer that comes with the kobo is barely okish (e.g. no crop functionality), so installing, say, koreader is a must if you read more PDFs than actual ebooks. And then you have to deal with the how-to-start-it problem.

That reminds me: I need to find a decent RSS reader for the kobo, or possibly a good RSS-to-epub converter that I can run automatically. Any suggestions?

PS and related to this project: Thanks to Kathey!