Planet Entropia (CCC Karlsruhe)
Planet EntropiaWenger Online#Blog: Backe, backe Kuchen
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/2014-12-21-09.00.52.jpg"><img class="alignnone size-medium wp-image-494" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/2014-12-21-09.00.52-300x180.jpg" alt="Krümelmonster" width="300" height="180" /></a></p>
<p>Die Kinder waren fleißig und und getreu nach dem Lied “In der Weihnachtsbäckerei gibt es manche Leckerei, Zwischen Mehl und Milch macht so mancher Knilch eine riesengroße Kleckerei.” sah es nachher in der Küche aus…</p>
2014-12-20T10:02:56+01:00Wenger Online#Blog: Hornisgrinde
<p>Super Wetter heute auf der Hornisgrinde, wenig tiefer versinkt alles in den Wolken… <a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/11/2014-11-30-15.59.19.jpg"><img class="alignnone size-large wp-image-486" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/11/2014-11-30-15.59.19-1024x396.jpg" alt="2014-11-30 15.59.19" width="1024" height="396" /></a></p>
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/11/2014-11-30-13.08.17.jpg"><img class="alignnone size-medium wp-image-488" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/11/2014-11-30-13.08.17-300x180.jpg" alt="2014-11-30 13.08.17" width="300" height="180" /></a></p>
2014-11-30T20:48:25+01:00Wenger Online#Blog: Chili Ernte
<p>Nach dem es nun draußen langsam zu kalt für unsere Chilis geworden ist mussten diese nun ins warme Wohnzimmer umziehen. Hier reifen sie jetzt besonders schnell und man kommt mit dem verzehen garnicht mehr hinterher. Ein paar muss ich wohl trocknen oder einlegen.</p>
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1050358.jpg"><img class="alignnone size-medium wp-image-499" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1050358-225x300.jpg" alt="Chilies" width="225" height="300" /></a></p>
2014-11-15T10:10:27+01:00nomeata’s mind shares: Can one recommend Debian stable to Desktop users?
<p>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!</p>
<p>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 href="http://bazaar.launchpad.net/~ubuntu-desktop/evolution-data-server/ubuntu-trusty/view/228/debian/patches/evolution-data-server-3.10.4-poodle-enable-tls-for-ssl.patch">a patch</a>, originally from Fedora, two weeks ago. For Debian, there is a <a href="https://bugs.debian.org/765838">bug report</a> but no sign of action.</p>
<p>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.</p>
<p>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.</p>
<p><strong>Update</strong> (2010-11-3): Laney just uploaded a <a href="https://packages.qa.debian.org/e/evolution-data-server/news/20141103T121708Z.html">fixed package</a>. Thanks!</p>2014-11-01T14:52:28+01:00nomeata’s mind shares: Switching to systemd-networkd
<p>Ever since I read about <a href="https://coreos.com/blog/intro-to-systemd-networkd/">systemd-networkd being in the making</a> 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 <a href="https://packages.debian.org/sid/systemd">the systemd package</a>!</p>
<p>My previous setup was a combination of <code>ifplugd</code> to detect when I plug or unplug the ethernet cable with a plain DHCP entry in <code>/etc/network/interface</code>. A while ago I was using <code>guessnet</code> 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 <code>systemd-networkd</code> is just fine with me. So after stopping <code>ifplugd</code> and</p>
<pre><code>$ cat > /etc/systemd/network/eth.network <<__END__
$ systemctl enable systemd-networkd
$ systemctl start systemd-networkd</code></pre>
<p>I was ready to go. Indeed, <code>systemd-networkd</code>, 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. <code>ifplugd</code> <a href="https://bugs.debian.org/708295">failed to detect</a> this change and I often had to manually run <code>ifdown eth0 && ifup eth0</code>; this now works.</p>
<p>But then I was bitten by what I guess some people call the viral nature of <code>systemd</code>: <code>systemd-networkd</code> would not update <code>/etc/resolve.conf</code>, but rather relies on <code>systemd-resolved</code>. And that requires me to change <code>/etc/resolve.conf</code> to be a symlink to <code>/run/systemd/resolve/resolv.conf</code>. But of course I also use my wireless adapter, which, at that point, was still managed using <code>ifupdown</code>, which would use <code>dhclient</code> which updates <code>/etc/resolve.conf</code> directly.</p>
<p>So I investigated if I can use <code>systemd-networkd</code> also for my wireless account. I am not using NetworkManager or the like, but rather keep <code>wpa_supplicant</code> running in roaming mode, controlled from <code>ifupdown</code> (not sure how that exactly works and what controls what, but it worked). I found out that this setup works just fine with <code>systemd-networkd</code>: I start <code>wpa_supplicant</code> with this service file (which I found in the <a href="http://w1.fi/cgit/hostap/tree/wpa_supplicant/systemd/wpa_supplicant.service.arg.in">wpasupplicant repo</a>, but not yet in the Debian package):</p>
Description=WPA supplicant daemon (interface-specific version)
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I
<p>Then <code>wpa_supplicant</code> will get the interface up and down as it goes, while <code>systemd-networkd</code>, equipped with</p>
<p>does the rest.</p>
<p>So suddenly I have a system without <code>/etc/init.d/networking</code> and without <code>ifup</code>. Feels a bit strange, but also makes sense. I still need to migrate how I manage my UMTS modem device to that model.</p>
<p>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 <code>/etc/network/if-up.d/</code> etc. I want to run things like <code>killall -ALRM tincd</code> and <code>exim -qf</code>. If you know how to do that, please tell me, or answer over at <a href="http://unix.stackexchange.com/questions/160378/with-systemd-networkd-perform-an-action-upon-network-configuration-change">Stack Exchange</a>.</p>2014-10-14T20:26:13+02:00nomeata’s mind shares: New website layout
<p>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 <a href="http://www.joachim-breitner.de/bilder/pages/201308_1.html">very true</a>). Another reason was that I was visting my brother, who is very good at web design (check out his <a href="http://www.breitnerundbreitner.de/">portfolio</a>), who could help me a bit.</p>
<p>I wanted something practical and maybe a bit staid, so I drew inspiration from typical <a href="http://www.joachim-breitner.de/various/SA/ShiversStudienarbeit.pdf">Latex typography</a>, and also from <a href="http://blog.ezyang.com/">Edward Z. Yang’s blog</a>: 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.</p>
<p>Of course this would be very dire without a suitable background. I really like the procedural art by <a href="http://www.complexification.net/">Jared Tarbell</a>, espcially <a href="http://www.complexification.net/gallery/machines/substrate/index.php">substrate</a> and <a href="http://www.complexification.net/gallery/machines/interAggregate/index.php">interAggregate</a>. 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.</p>
<p>I simplified the navigation a bit. The old <a href="http://alt3.joachim-breitner.de/news">News section</a> has been removed recently already. The <a href="http://alt3.joachim-breitner.de/links">Links section</a> 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 <a href="http://www.joachim-breitner.de/heisse-news/">Heisse News</a> is demoted to a mention on the Contents section.</p>
<p>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.</p>
<p>Being the nostaltic I am, I still keep the <a href="http://alt3.joachim-breitner.de/">old design</a>, as well as the <a href="http://alt2.joachim-breitner.de/">two</a> <a href="http://alt.joachim-breitner.de/">designs</a> before that, around and <a href="http://www.joachim-breitner.de/content#old-websites">commented their history</a>.</p>2014-10-07T15:40:54+02:00nomeata’s mind shares: ghc-heap-view for GHC 7.8
<p>Since the last release of <a href="http://hackage.haskell.org/package/ghc-heap-view">ghc-heap-view</a>, 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.</p>
<p>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.</p>
<p>I used this chance to migrate its source repository from Darcs to <a href="http://git.nomeata.de/?p=ghc-heap-view.git">git</a> (<a href="http://github.com/nomeata/ghc-heap-view">mirrored on GitHub</a>), 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: <a href="https://travis-ci.org/nomeata/ghc-heap-view"><img src="https://travis-ci.org/nomeata/ghc-heap-view.svg?branch=master" alt="ghc-heap-view"/></a></p>
<p>I did not test it very thoroughly yet. In particular, I did not test whether <a href="http://hackage.haskell.org/package/ghc-vis">ghc-vis</a> works as expected.</p>
<p>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.</p>2014-10-07T13:55:05+02:00nomeata’s mind shares: 11 ways to write your last Haskell program
<p>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 <code>last :: [a] -> a</code>. We did not demand a specific behaviour for <code>last </code>.</p>
<p>This is a survey of various solutions, only covering those that are actually correct. I elided some variation in syntax (e.g. guards vs. <code>if</code>-<code>then</code>-<code>else</code>).</p>
<p>Most wrote the naive and straightforward code:</p>
<pre class="sourceCode haskell"><code class="sourceCode haskell">last [x] <span class="fu">=</span> x
last (x<span class="fu">:</span>xs) <span class="fu">=</span> last xs</code></pre>
<p>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:</p>
<pre class="sourceCode haskell"><code class="sourceCode haskell">last (x<span class="fu">:</span>xs)
<span class="fu">|</span> null xs <span class="fu">==</span> <span class="dt">True</span> <span class="fu">=</span> x
<span class="fu">|</span> otherwise <span class="fu">=</span> last xs
last (x<span class="fu">:</span>xs)
<span class="fu">|</span> length (x<span class="fu">:</span>xs) <span class="fu">==</span> <span class="dv">1</span> <span class="fu">=</span> x
<span class="fu">|</span> otherwise <span class="fu">=</span> last xs
last (x<span class="fu">:</span>xs)
<span class="fu">|</span> length xs <span class="fu">==</span> <span class="dv">0</span> <span class="fu">=</span> x
<span class="fu">|</span> otherwise <span class="fu">=</span> last xs
<span class="fu">|</span> lenght xs <span class="fu">></span> <span class="dv">1</span> <span class="fu">=</span> last (tail xs)
<span class="fu">|</span> otherwise <span class="fu">=</span> head xs
<span class="fu">|</span> lenght xs <span class="fu">==</span> <span class="dv">1</span> <span class="fu">=</span> head xs
<span class="fu">|</span> otherwise <span class="fu">=</span> last (tail xs)
last (x<span class="fu">:</span>xs)
<span class="fu">|</span> xs <span class="fu">==</span>  <span class="fu">=</span> x
<span class="fu">|</span> otherwise <span class="fu">=</span> last xs</code></pre>
<p>The last one is not really correct, as it has the stricter type <code>Eq a => [a] -> a</code>. Also we did not expect our students to avoid the quadratic runtime caused by using <code>length</code> in every step.</p>
<p>The next class of answers used <code>length</code> to pick out the right elemet, either using <code>(!!)</code> directly, or simulating it with <code>head</code> and <code>drop</code>:</p>
<pre class="sourceCode haskell"><code class="sourceCode haskell">last xs <span class="fu">=</span> xs <span class="fu">!!</span> (length xs <span class="fu">-</span> <span class="dv">1</span>)
last xs <span class="fu">=</span> head (drop (length xs <span class="fu">-</span> <span class="dv">1</span>) xs)</code></pre>
<p>There were two submissions that spelled out an explicit left folding recursion:</p>
<pre class="sourceCode haskell"><code class="sourceCode haskell">last (x<span class="fu">:</span>xs) <span class="fu">=</span> lastHelper x xs
lastHelper z  <span class="fu">=</span> z
lastHelper z (y<span class="fu">:</span>ys) <span class="fu">=</span> lastHelper y ys</code></pre>
<p>And finally there are a few code-golfers that just plugged together some other functions:</p>
<pre class="sourceCode haskell"><code class="sourceCode haskell">last x <span class="fu">=</span> head (reverse x)</code></pre>
<p>Quite a lot of ways to write <code>last</code>!</p>2014-10-02T13:47:49+02:00nomeata’s mind shares: Using my Kobo eBook reader as an external eInk monitor
<p>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!</p>
<p>So while I was in Portland for DebConf14 (where I guess I felt a bit more like tinkering than otherwise) I bought a <a href="http://en.wikipedia.org/wiki/Kobo_Aura_HD">Kobo Aura HD</a>. 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.</p>
<p>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 <a href="http://wiki.mobileread.com/wiki/Kobo_Touch_Hacking">plenty of instructions</a> 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 <code>telnetd</code> daemon that comes with the device’s busybox installation. Then I just have to make the device go online and <code>telnet</code> onto it. From there it is a pretty normal Linux system, albeit without an X server, using the framebuffer directly.
<p>I even found an existing project providing <a href="http://www.mobileread.com/forums/showthread.php?p=2927319">a VNC client implementation</a> 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 <code>kvncclient</code> shares that code with <a href="https://github.com/koreader/koreader"><code>koreader</code></a>, 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:
<li>I changed the screen size to match the Kobo’s resolution. Using <code>xrandr</code>’s <code>--panning</code> option this is possible even though my real screen is only 900 pixels high.</li>
<li>I <a href="http://www.jurta.org/en/prog/noblink">disabled the cursor-blink</a> 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, <code></p></code>).</li>
<li>My terminal windows are now black-on-white.</li>
<li>I had to increase my font-size a bit (the kobo has quite a high DPI), and color is not helpful (so <code>:set syntax=off</code> in vim).</li>
<p>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 <code>x11vnc</code>, 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.
<p>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).
<p>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 href="http://www.mobileread.com/forums/forumdisplay.php?f=247">a web forum</a>, 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, <code>koreader</code> is a must if you read more PDFs than actual ebooks. And then you have to deal with the how-to-start-it problem.
<p>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?
<p>PS and related to this project: Thanks to Kathey!</p>
2014-09-21T20:11:07+02:00nomeata’s mind shares: Die ersten hausgemachten Tip-Toi-Bücher
Das letzte halbe Jahr war es sehr ruhig um unser <a href="https://github.com/entropia/tip-toi-reveng">Tip-Toi-Projekt</a>. Das erste Ziel war damals erreicht: Ich konnte existierende Bücher mit neuen Texten versehen, und <a href="http://www.joachim-breitner.de/blog/641-Personalisierte_Tip-Toi-Datei_als_Geschenk">meinem Neffen eine Freude machen</a>. Und so passierte erstmal lange nichts.
Bis sich vor ein paar Tagen plötzlich ein gewisser „Pronwan“ meldete und erzählte, dass er erfolgreich komplette Tip-Toi-Bücher (naja, Seiten) für seine Kinder gestaltet, gedruckt und mit eigenen Audio-Dateien versehen hat. Er hat das ganze in einem <a href="https://www.youtube.com/watch?v=4AjvjFM8GzM">Video-Tutorial</a> beschrieben. Fazit ist: Selber Drucken geht, wenn man die Bilder etwas blasser macht (schwarze Punkte auf schwarzem Grund geht schlecht) und gegebenenfalls erst das Bild mit einem Farb-Laserdrucker druckt und dann die die Punkt-Matrix mit einem Schwarz-Weiß-Drucker drüberlegt.
In dem Video kommt auch mein <code>tttool</code> zum Einsatz, das – obwohl eigentlich eher für mich und für Leute, die das GME-Dateiformat besser verstehen wollen, gedacht – dabei ganz gut wegkommt. Aus ist erwähnenswert dass „Pronwan“ Windows verwendet und vermutlich die von mir unter Wine vorkompilierte exe-Datei verwendet – die Platformunabhängigkeit von Haskell zahlt sich aus.
Das ganze ist wohl für einen interessierten Hobbisten wirklich recht gut zu machen. Ich bin gespannt was da noch alles kommt. Vielleicht gibts ja bald eine Webseite wo man hausgemachte Tip-Toi-Bücher sammeln und tauschen kann! Im <a href="https://www.mikrocontroller.net/topic/214479#3794528">Microcontroller-Forum</a> gibts stets die neusten Infos.
2014-09-08T23:04:54+02:00nomeata’s mind shares: ICFP 2014
<p>Another on-my-the-journey-back blog post; this time from the Frankfurt Airport Train Station – my flight was delayed (if I knew that I could have watched the remaining Lightning Talks), and so was my train, but despite 5min of running through the Airport just not enough. And now that the free 30 Minutes of Railway Station Internet are used up, I have nothing else to do but blog...</p>
<p>Last week I was attending <a href="http://icfpconference.org/icfp2014/index.html">ICFP 2014 </a> in Gothenburg, followed by the <a href="http://www.haskell.org/haskell-symposium/2014/schedule.html">Haskell Symposium</a> and the <a href="http://www.haskell.org/haskellwiki/HaskellImplementorsWorkshop/2014">Haskell Implementors Workshop</a>. The justification to attend was <a href="http://research.microsoft.com/en-us/um/people/simonpj/papers/ext-f/coercible.pdf">the paper on Safe Coercions</a> (joint work with Richard Eisenberg, Simon Peyton Jones and Stephanie Weirich), although Richard got to hold the talk, and did so quite well. So I got to leisurely attend the talks, while fighting the jet-lag that I brought <a href="http://www.haskell.org/haskellwiki/HaskellImplementorsWorkshop/2014">from Portland</a>.
<p>There were – as expected – quite a few interesting talks. Among them <a href="http://dl.acm.org/authorize?N87643">the first keynote, Kathleen Fisher</a> on the need for formal methods in cars and toy-quadcopters and unmanned battle helicopters, which made me conclude that my Isabelle skills might eventually become relevant in practical applications. And did you know that if someone gains access to your car’s electronics, they can make the seat belt pull you back hard?
<p><a href="http://dl.acm.org/authorize?N87763">Stefanie Weirich’s keynote</a> (and the subsequent related talks <a href="http://dl.acm.org/citation.cfm?id=2633361">by Jan Stolarek</a> and <a href="http://www.haskell.org/haskellwiki/HaskellImplementorsWorkshop/2014#Dependent_Haskell">Richard Eisenberg</a>) on what a dependently typed Haskell would look like and what we could use it for was mouth-watering. I am a bit worried that Haskell will be become a bit obscure for newcomers and people that simply don’t want to think about types too much, on the other hand it seems that Haskell as we know it will always stay there, just as a subset of the language.
Similarly interesting were refinement types for Haskell (talks <a href="http://dl.acm.org/authorize?N87776">by Niki Vazou</a> and <a href="http://www.youtube.com/watch?v=vqvNQixKr6w">by Eric Seidel</a>), in the form of <a href="http://goto.ucsd.edu/index.html">LiquidTypes</a>, something that I have not paid attention to yet. It seems to be a good way for more high assurance in Haskell code.</p>
Finally, the <a href="http://www.haskell.org/haskellwiki/HaskellImplementorsWorkshop/2014">Haskell Implementors Workshop</a> had a truckload of exciting developments in and around Haskell: More on GHCJS, Partial type signatures, interactive type-driven development like we know it from Agda, the new Haskell module system and amazing user-defined error messages – the latter unfortunately only in <a href="http://www.cs.uu.nl/wiki/bin/view/Helium/WebHome">Helium</a>, at least for now.
But it’s not the case that I only sat and listened. During the Haskell Implementors Workshop I held a talk “Contributing to GHC” with a live demo of me fixing <a href="http://hackage.haskell.org/trac/ghc/ticket/9556">a (tiny) bug in GHC</a>, with the aim of getting more people to hack on GHC (<a href="http://joachim-breitner.de/publications/ContributingToGHC_HIW2014_2014-09-08.pdf">slides</a>, <a href="http://www.youtube.com/watch?v=tq2Mo7NsO5w">video</a>). The main message here is that it is not that big of deal. And despite me not actually saying much interesting in the talk, I got good feedback afterwards. So if it now actually motivates someone to contribute to GHC, I’m even more happier.
And then there is of course the Hallway Track. I discussed the issues with fusing a left fold (unfortunately, without a great solution). In order to tackle this problem more systematically, John Wiegley and I created the beginning of a “<a href="http://github.com/nomeata/list-fusion-lab">List Fusion Lab</a>”, i.e. a bunch of list benchmark and the possibility to compare various implementations (e.g. with different RULES) and various compilers. With that we can hopefully better assess the effect of a change to the list functions.
PS: The next train is now also delayed, so I’ll likely miss my tram and arrive home even later...
PPS: I really have to update my 10 year old picture on my homepage (or redesign it completely). Quite a few people knew my name, but expected someone with shoulder-long hair...
PPPS: Haskell is really becoming mainstream: I just talked to a randomly chosen person (the boy sitting next to me in the train), and he is a Haskell enthusiast, building a structured editor for Haskell together with his brother. And all that as a 12th-grader...
2014-09-06T22:46:22+02:00nomeata’s mind shares: DebConf 14
<p>I’m writing this blog post on the plane from Portland towards Europe (<a href="https://www.joachim-breitner.de/blog/656-This_blog_goes_static">which I now can!</a>), using the remaining battery live after having watched one of the DebConf talks that I missed. (It was the systemd talk, which was good and interesting, but maybe I should have watched one of the power management talks, as my battery is running down faster than it should be, I believe.)
<p>I mostly enjoyed <a href="http://debconf14.debconf.org/">this year’s DebConf</a>. I must admit that I did not come very prepared: I had neither something urgent to hack on, nor important things to discuss with the other attendees, so in a way I had a slow start. I also felt a bit out of touch with the project, both personally and technically: In previous DebConfs, I had more interest in many different corners of the project, and also came with more naive enthusiasm. After more than 10 years in the project, I see a few things more realistic and also more relaxed, and don’t react on “Wouldn’t it be cool to have <em>crazy idea</em>” very easily any more. And then I mostly focus on Haskell packaging (and related tooling, which sometimes is also relevant and useful to others) these days, which is not very interesting to most others.
<p>But in the end I did get to do some useful hacking, heard a few interesting talks and even got a bit excited: I created a new tool to schedule binNMUs for Haskell packages which is quite generic (configured by just a regular expression), so that it can and will be used by the OCaml team as well, and who knows who else will start using hash-based virtual ABI packages in the future... It runs via a cron job on people.debian.org to produce output <a href="https://people.debian.org/~nomeata/binNMUs-haskell.txt">for Haskell</a> and <a href="https://people.debian.org/~nomeata/binNMUs-ocaml.txt">for OCaml</a>, based on data pulled via HTTP. If you are a Debian developer and want up-to-date results, log into <code>wuiet.debian.org</code> and run <code>~nomeata/binNMUs --sql</code>; it then uses the projectb and wanna-build databases directly. Thanks to the ftp team for <a href="http://email@example.com">opening up incoming.debian.org</a>, by the way!
<p>Unsurprisingly, I also held a <a href="//summit.debconf.org/debconf14/meeting/68/debian-haskell-group-bof/">talk on Haskell and Debian</a> (<a href="http://joachim-breitner.de/publications/DebianHaskell_DebConf14_2014-08-28.pdf">slides available</a>). I talked a bit too long and we had too little time for discussion, but in any case not all discussion would have fitted in 45 minutes. The question of which packages from Hackage should be added to Debian and which not is still undecided (which means we carry on packaging what we happen to want in Debian for whatever reason). I guess the better our tooling gets (see the next section), the more easily we can support more and more packages.
<p>I am quite excited by and supportive of Enrico’s agenda to remove boilerplate data from the debian/ directories and relying on autodebianization tools. We have such a tool for Haskell package, <a href="http://hackage.haskell.org/package/cabal-debian">cabal-debian</a>, but it is unofficial, i.e. neither created by us nor fully endorsed. I want to change that, so I got in touch with the upstream maintainer and we want to get it into shape for producing perfect Debian packages, if the upstream provided meta data is perfect. I’d like to see the Debian Haskell Group to follows Enrico’s plan to its extreme conclusion, and this way drive innovation in Debian in general. We’ll see how that goes.
<p>Besides all the technical program I enjoyed the obligatory games of Mao and Werewolves. I also got to dance! On Saturday night, I found a small but welcoming <a href="http://www.portlanddancing.com/moreinfo.aspx?moreinfo=3800">Swing-In-The-Park</a> event where I could dance a few steps of Lindy Hop. And on Tuesday night, Vagrant Cascadian took us (well, three of us) to a blues dancing night, which I greatly enjoyed: The style was so improvisation-friendly that despite having missed the introduction and never having danced Blues before I could jump right in. And in contrast to social dances in Germany, where it is often announced that the girls are also invited to ask the boys, but then it is still mostly the boys who have to ask, here I took only half a minute of standing at the side until I got asked to dance. In retrospect I should have skipped the HP reception and went there directly...
<p>I’m not heading home at the moment, but will travel directly to Göteborg to attend <a href="http://icfpconference.org/icfp2014/index.html">ICFP 2014</a>. I hope the (usually worse) west-to-east jet lag will not prevent me from enjoying that as much as I could.
2014-08-30T15:10:58+02:00nomeata’s mind shares: This blog goes static
<p>After a bit more than 9 years, I am replacing <a href="http://s9y.org/">Serendipity</a>, which as been hosting my blog, by a self-made static solution. This means that when you are reading this, my server no longer has to execute some rather large body of untyped code to produce the bytes sent to you. Instead, that happens once in a while on my laptop, and they are stored as static files on the server.
<p>I hope to get a little performance boost from this, so that my site can more easily hold up to being <a href="https://news.ycombinator.com/item?id=6934611">mentioned on hackernews</a>. I also do not want to worry about security issues in Serendipity – static files are not hacked.
<p>The actual implementation of the blog is rather masochistic, as my web page runs on one of these weird obfuscated languages (<a href="http://www.w3.org/TR/xslt">XSLT</a>). Previously, it contained of XSLT stylesheets producing makefiles calling XSLT sheets. Now it is a bit more-self-contained, with one XSLT stylesheet writing out all the various html and rss files.
<p>I managed to import all my old posts and comments thanks to <a href="https://gist.github.com/michitux/3731880">this script</a> by Michael Hamann (I had played around with this some months ago and just spend what seemed to be an hour to me to find this script again) and a small Haskell script. Old URLs are rewritten (using <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a>) to the new paths, but feed readers might still be confused by this.</p>
<p>This opens the door to a long due re-design of my webpage. But not today...</p>
2014-08-23T15:54:43+02:00nomeata’s mind shares: Good bye GNOME
<h3>When I was young... <br/></h3>
<p>I have been a user of <a href="http://www.gnome.org/">GNOME</a> for a long time. I must have started using it in either 2000 or 2001, when <a href="http://www.linuxtag.org/">LinuxTag</a> was in Stuttgart. For some reason I wanted to start using one of the two Desktop Environments available (having used <a href="http://fvwm95.sourceforge.net/">fvwm95</a> and/or <a href="http://www.icewm.org/">IceWM</a> before, I believe). I approached one of the guys at the GNOME booth and asked the question “Why should I use GNOME over KDE?”, knowing that it is quite a silly question, but unable to come up with a better one. He replied something along the lines of “Because it is part of GNU”, and that was good enough for me. Not that it matters a lot whether I use one or the other, but it was a way to decide it.</p>
<p>Back then GNOME was still version 1.2, with detachable menus and lots of very colorful themes – I first had something with thick yellow borders and then a brushed metal look. Back then, <a href="http://sawfish.wikia.com/">sawfish</a> was the window manager of choice.</p>
<p>I used GNOME for many years. People complained when GNOME 2.0 came out, but I liked the approach they were taking: Simplicity and good defaults are a time saver! I did my bit of customization, such has having my panel vertically on the left edge, and even had a tool running that would react on certain events and make the window manager do stuff, such as removing the title bar and the borders from my terminals – naked terminals are very geeky (I forgot the name of the tool, but surely some will recognize and remember it).</p>
<h3>Leaving the path of conformance <br/></h3>
<p>In 2009 I got more and more involved in Haskell and stumbled over <a href="http://xmonad.org/">xmonad</a>, a tiling window manager implemented and configured in Haskell. I found this a user interface that like a lot, so I started using it. This was no problem: GNOME happily let me replace the default window manager (metacity) with xmonad, and continue working. I even implemented <a href="http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-EwmhDesktops.html">the necessary support</a> in xmonad so that it would spare out the gnome-panel, and that the pager (which displays the workspaces and windows) would work, and even interact with xmonad.</p>
<p>I was happy with this setup for a few more years, until GNOME3 came out. Since then, it has become harder and harder to maintain the setup. The main reason is gnome-shell, which replaces both gnome-panel and doesn’t work with any window manager but the new default, mutter. I want to use GNOME’s panel, but not its window manager, so I was stuck with a hardly maintained gnome-panel. I fixed what I could (with some patches applied upstream <a href="https://twitter.com/nomeata/status/358986039320252416">two years after submission</a>, and some not at all) and lived with the remaining warts.</p>
<h3>The end (for now) <br/></h3>
<p>But a few days ago, GNOME 3.12 was pushed to Debian and I <a href="http://bugs.debian.org/755140">couldn’t even logout</a> our shut down the computer any more, as gnome-session tries to talk to gnome-shell now to do that. Also, monitor configuration (e.g. remembering what setup to use when which monitors are attached) has been moved to gnome-shell. I tried to work around it a bit, but I quickly realized that it was time to make a decision: Either do it the GNOME way all the way, including using gnome-shell, or ditch GNOME:</p>
<p>Now as I said: I like the design and the philosophy of GNOME, including GNOME3, and I have told people who were complaining about it first to give it a try, and succeeded. I also tried it, but after years using a tiling window manager, I just couldn’t adjust to not having that any more. If xmonad could be changed to remotely control gnome-shell, I this might actually work for me! I think one of the biggest problems I had was to adjust to how gnome-shell handles multiple monitors. In xmonad, my workspaces are independent of the monitors, and I can move any workspace to any monitor.<br/></p>
<p>So I had to ditch GNOME. My session now consists of a shell script making some adjustments (blank black background, loading the xmodmap), starts a few tools (<a href="https://github.com/travitch/taffybar">taffybar</a>, <a href="http://www.nongnu.org/mailnotify/">mail-notification</a>, <a href="https://nagstamon.ifw-dresden.de/">nagstamon</a>, <a href="http://www.jwz.org/xscreensaver/">xscreensaver</a> and <a href="http://www.knopwob.org/dunst/">dunst</a>) and executes xmonad. So far it works good. It boots faster, it suspends faster.</p>
<p>I still use some GNOME components. I login using gdm (but it is auto-login, I guess I could try something faster), and gnome-keyring-daemon is also started. And I still use evolution (which has its own set of very disappointing problems in the current version).</p>
<p>Compared to my old setup, I’m still missing my beloved <a href="http://www.nongnu.org/link-monitor/">link-monitor-applet</a>, but I guess I can implement an approximation to that in taffybar. The same for some other statistics like cpu temperature. I don’t have the GNOME menu any more, which I did not use regularly, but was useful occasionally. <br/></p>
<p>The biggest problem so far is the lack of session management: I yet have to find a good way to logout and shutdown, while still giving Firefox time to finish without believing it crashed. Dear lazyweb: What is the best solution for that problem? Can systemd help me here somehow?<br/></p>
<p>All in all I want to thank the GNOME guys for providing me with a great desktop environment for over a decade, and I hope I’ll be able to use it again one day (and hopefully not out of necessity and lack of viable alternatives).<br/></p>
2014-07-19T17:13:06+02:00nomeata’s mind shares: Another instance of Haskell Bytes
<p>When I gave my “Haskell Bytes” talk on the runtime representation of Haskell values the first time, <a href="/blog/archives/558-Haskell-Bytes.html">I wrote</a> here “It is in German, so [..] if you want me to translate it, then (convince your professor or employer to) invite me to hold the talk again“. This has just happened: I got to hold the talk as <a href="http://corp.galois.com/blog/2014/6/9/tech-talk-haskell-bytes.html">a Tech Talk at Galois</a> in Portland, so now you can fetch <a href="http://www.joachim-breitner.de/publications/haskell_bytes_portland_2014-06-13.pdf">the text also in English</a>. Thanks to Jason for inviting me!<br/></p>
<p>This was on my way to the <a href="http://www.cs.uoregon.edu/research/summerschool/summer14/">Oregon Summer School on Programming Languages</a> in Eugene, where I’m right now enjoying the shade of a tree next to the campus. We’ve got a relatively packed program with lectures on dependent types, categorical logic and other stuff, and more student talks in the evening (which unfortunately always collide with the open board game evenings at the local board game store). So at least we started to have a round of <a href="http://webdiplomacy.net/board.php?gameID=143507">diplomacy</a>, where I am about to be crushed from four sides at once. (And no, I don’t think that this has triggered the “illegal download warning” that the University of Oregon received about our internet use and threatens our internet connectivity.)<br/></p>
2014-06-19T20:00:29+02:00nomeata’s mind shares: ZuriHac 2014
<p>I’m writing this on the train back from the <a href="http://www.haskell.org/haskellwiki/ZuriHac2014">ZuriHac Haskell Hackathon</a> in Zürich, generously sponsored by <a href="http://better.com/">Better</a> and Google. My goal for this event was to attract new people to work on <a href="http://www.haskell.org/ghc/">GHC, the Haskell compiler,</a> so I announced a „GHC bugsquashing project“. I <a href="https://ghc.haskell.org/trac/ghc/wiki/ZuriHac2014">collected</a> a few seemingly simple ticket that have a good effort/reward ratio for beginners and encouraged those who showed up to pick one to work on.</p>
<p>Roughly six people started, and four actually worked on GHC on all three days. The biggest hurdle for them was to get GHC built for the first time, especially those using a Mac or Windows. They also had to learn to avoid recompilation of the whole compiler, which takes an annoying amount of time (~30 minutes for most people). But once such hurdles weren taken all of them managed to find their way around the source code to the place they need to touch and were able to produce a patch, some of which are already merged into GHC master. When I wasn’t giving tips and hints I was working on various small tickets myself, but nothing of great impact. I very much hope that this event will pay off and one or two of the newcomers end up being regular contributors to GHC.<br/><br/>We took breaks from our respective projects to listen to interesting talks by Edward Kmett and Simon Marlow, and on Saturday evening we all went to the shores of the Zurisee and had a nice Barbecue. It was a good opportunity to get into contact with more of the attendees (the hacking itself was separated in multiple smaller office rooms) and I was happy to hear about people having read my recent <a href="http://www.joachim-breitner.de/publications/CallArity-TFP.pdf">Call Arity</a> paper, and even found it valuable.<br/><br/>Thanks to the organizers and sponsors for this nice opportunity! <br/></p>
2014-06-08T19:34:14+02:00nomeata’s mind shares: Predicting the livetime of a Hackage package
<p>The <a href="https://wiki.debian.org/Haskell">Debian Haskell Group</a> has no proper policy about when to update a certain package to a new version from <a href="http://hackage.haskell.org/">Hackage</a>. So far, we upgrade when one of us personally needs something, when someone nudges us, if its required as a dependency or just when we feel like it. I was thinking about ways to improve that.</p>
<p>One thing that we should definitely do is to upgrade to new versions that differ only in the forth version number, e.g. from 126.96.36.199 to 188.8.131.52 – these are most likely bug fix uploads and have little risk of breaking things. (Unless they are <em>only</em> changes to the .cabal file, then they might not be an improvement for our users or us.) I plan to code that soon.</p>
<p>But what else can we do? Ideally we’d package versions that will be the newest version for a long time, and not versions that are going to be replaced the next day. Unfortunately, deciding that requires visionary powers. But maybe there is a correlation between the upload history and the lifetime of a new package? Maybe there are patterns, e.g. the first upload after a long time tends to be replaced fast, but the third package in a short succession has a high chance to live long? Can we predict the livetime of a freshly uploaded package? So after a bit of hacking I got this graphic:</p>
<div align="center"><img src="http://www.joachim-breitner.de/various/hackage-release-history-histogram.png" width="600" height="600"/></div>
<p>It needs a bit explanation: Both axis are time differences, the picture is one year by one year. For every release of which we know the lifetime (i.e. there has been an upload later), we draw its history on a vertical line. The horizontal position of the line corresponds to the lifetime of the release: A package that was superseded immediately later (which I sometimes do after spotting annoying typos) would appear on the far left, a package that is stable for one year on the far right.</p>
<p>The history itself is a series of dots, representing the previous uploads of that package, with their distance from the lower edge indicating the time that has passed since then. So if a package had two updates half a year ago, and then no update for another half year, it would contribute two dots right above each other in the middle of the picture.</p>
<p>Unfortunately, the picture does not yield any insight, besides that short-lived packages are more frequent than long-lived packages.</p>
<p>So I tried another view:</p>
<div align="center"><img src="http://www.joachim-breitner.de/various/hackage-stability-prediction.png" width="600" height="600"/></div>
<p>I grouped uploads by the livetime of their two preceding uploads. For each such groups, the circle indicates the average livetime. The darkness indicates the absolute number in the sample. So we see a correlation between the packages livetime and the livetime of its predecessor, which is also not very surprising. We can state some hypothesis, like: “A package replacing a very old package is likely to be long-lived if its pre-predecessor lived very long or very shortly, but less so if that lived for a few months.“ But I’m not sure of the significance of these.</p>
<p>I could have also taken into account which uploads are major and which are minor, by looking at the version number, but I didn’t.</p>
<p>What’s the conclusion? Nothing much. I got some funny looking graphs. And there needs to be a way to render pictures like the first within the axes of a Chart diagram. I put the (somewhat hackish) <a href="http://git.nomeata.de/?p=stability-predictor.git">code online</a> – feel free to play with it.</p>
2014-05-28T21:43:42+02:00experimentalworks: Mercurial vs. Git vs. Bazaar: The aftermath<p>Over the last years, the version control system community has fought, what some people would call the “VCS war”. People were arguing on IRC, conferences, mailinglists, they wrote blog posts and upvoted HN articles about which was the best version control system out there. The term “VCS war” is borrowed from the “Editor wars”. A constant fight which people argue which of the major editors VIM, or Emacs and later TextMate or Sublime, or again Vim and Emacs is the best editor. It is similar to programming language discussions, shell environments, window manager and so on and so forth. What they all have in common is that they are tools that are used daily by software engineers, and therefore a lot of people have an opinion on it.</p>
<p>When in 2005 both Git and Mercurial were released and Bazaar followed shortly after, the fight who is the best system of the three started. While early Mercurial versions seemed to be much easier to use than Git, Git was already used in the Linux kernel and built up a strong opinion. Things were even till 2008 Github launched and changed the OpenSource world and is what people would consider Git’s “killer app”. Mercurial’s equivalent Bitbucket never reached the popularity of Github. But people were still writing articles, arguing about merging and rebasing, arguing about performance and abilities to rewrite history, wrote long blog posts about confusing branching strategies. Those were complicated enough that they had to write helper tools, about which they could write articles again….and so on and so forth.</p>
<p>Recently things have become quiet. But why is that? What happend to Git, Mercurial and Bazaar?</p>
<p>I haven’t followed bazaars history much. It’s most notable users were MySQL and Ubuntu. In the early development bazaar lacked performance and couldn’t keep up with Git and Mercurial. It tried to solve this by changing the on-disk format a few times, requiring their users to upgrade their servers and clients. The development was mostly driven by Canonical and they had a hard time reaching out for more active developers. In the end there isn’t much to say about Bazaar. It development slowly deceased and it’s been widely considered the big looser of the VCS wars. <em>Bazaar is dead.</em></p>
<p>Mercurial started out for the very same reason Git was created and was developed at the same time Linux wrote Git. They both had a fast growing active development group and were equally used in the first years. While Git was the “faster” decentralized version control system, Mercurial was widely considered the more user-friendly system. Nevertheless with the rise of Github, Mercurial lost traction. However the development continued and while more and more people used Git and Github, the Mercurial community worked on some new ideas. Python picked it as it’s version control system in 2012 and Facebook made moved to Mercurial in 2013. So what’s so interesting about Mercurial? </p>
<li>Mercurial is extensible: It’s written mostly in Python and has a powerful extension API. Writing a proof of concept of a new backend or adding additional data that is transferred on cloned is fairly easy. This is a big win for the Python or the Mozilla community that makes it easy for them to adapt Mercurial to their needs.</li>
<li>Mercurial caught up on Git features and performance: Mercurial added “bookmarks”, “rebase” and various other commands to it’s core functionality and constantly improved performance.</li>
<li>Mercurial has new ideas: Mercurial came up with three brilliant ideas in the last 3 years. They first introduced a query language called “revsets” which helps you to easily query the commit graph. Second, they introduced “phases”. A barrier that prevents user from accidentally changing or rebsaing already published changesets – a common mistake for Git users. And last, but not least Evolution Changeset, a experimental feature that helps you to safely modify history and keep track of the history of a changing commit.</li>
<p>So while Mercurial is certainly not the winner, it found a niche with a healthy and enthusiastic community. <em>It’s worth a shot trying it if you are not 100% happy with Git.</em></p>
<p>The big winner obviously is Git. With the introduction of Github pushed Git usage. Github’s easy to approach fork&merge mechanism revolutionized OpenSource development to a point where most younger projects don’t use mailinglists anymore but rather rely on pull-requests and discussion on Github issues. Github’s feature and community is attractive enough for people to learn git. In addition, Git had a healthy and vocal community creating blog posts, introduction videos and detailed technical explanations. Noways Git market share is big enough that companies move from Subversion to Git because a new hire will more likely know Git than any other version control system (maybe SVN). As an open source developer, there is no way around Git anymore. Moreover the development is going on in rapid pace and the community constantly improves performance and is slowly reaching the v2.0 milestone. It’s yet to be seen if they are going to port some of the ideas from Git. A major challenge for Git however, still, is to deal with large repositories, something that at least the Mercurial community has partly solved. <em>If you haven’t learned it, learn it, there isn’t going to be a way around it anyway – deal with it.</em></p>
<p>The war is over, and we are all back on working on interesting features with our favorite Version Control System. Nobody needs to write blog posts anymore which system is better and you certainly won’t be able to circumvent Git entirely.</p>
<p><a href="http://blog.experimentalworks.net/?flattrss_redirect&id=661&md5=5bafeaad8ed7ef2a5cfd937b03397046" title="Flattr" target="_blank"><img src="http://blog.experimentalworks.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>2014-05-28T06:15:42+02:00nomeata’s mind shares: Does list fusion work?
<p>I’m writing this in the lunch break of <a href="http://www.cs.uu.nl/wiki/TFP2014">TFP in Soesterberg</a>. The invited talk this morning was by Geoffrey Mainland, and he talked about the difficulties of (informal) reasoning about performance in high-level languages like Haskell, especially with fancy stuff in the compiler like fusion. So I couldn’t help but think about a (very small) help here.</p>
<p>Consider the the two very similar expressions <code>foldl (+) 0 [0..1000]</code> and <code>foldr (+) 0 [0..1000]</code>. Which of these fuse away the list? Hopefully both, but hard to predict.</p>
<p>So with my <a href="http://hackage.haskell.org/package/list-fusion-probe">list-fusion-probe library</a>, you can write</p>
<pre>import Data.List.Fusion.Probe (fuseThis)
main = print $ foldr (+) 0 (fuseThis [0..1001])</pre>
<p>and find out. If you compile this (with <code>-O</code>!), it will print</p>
<p>If you change the <code>foldr</code> to <code>foldl</code>, it will print</p>
<pre>Test: fuseThis: List did not fuse</pre>
<p>So you can see that the function <code>fuseThis :: [a] -> [a]</code> does nothing if the list gets fused away, but causes a run-time error if not. It allows you to annotate your code with your assumptions of list fusion, and get shouted at if your assumptions are wrong.</p>
<p>It wouldn’t be hard to have the compiler give a warning or error message at compile time; we’d just need to introduce a special function <code>abortCompilation</code> that, when found in the code during compilation, does just that.</p>
<p>Note that you’ll have trouble reproducing the above in GHC HEAD, where <code>foldl</code> <em>does</em> fuse (which is <a href="/blog/archives/648-Going-to-TFP-2014.html">what I’m going to talk about tomorrow</a> here).<br/></p>
2014-05-26T12:10:46+02:00Uploads from neingeist: barcode detection for the visually impaired
<p><a href="http://www.flickr.com/people/neingeist/">neingeist</a> posted a video:</p>
<p><a href="http://www.flickr.com/photos/neingeist/13911952203/" title="barcode detection for the visually impaired"><img src="http://farm4.staticflickr.com/3790/13911952203_ff126184ec_m.jpg" width="240" height="177" alt="barcode detection for the visually impaired" /></a></p>
<p>work in progress</p>2014-04-17T08:10:32+02:00Wenger Online#Blog: Mit dem Fahrrad durch das Murgtal
<p>Wir haben das wunderschöne Frühlingswetter für eine Fahrradtour durch das Murgtal genutzt. Mit der S-Bahn ging es zuerst bis nach Raumünzach hoch. Von dort ein paar schweißtreibende Kilometer bis zum Stausee hinauf, wo wir uns bei einem Picknick in der Sonne am Strand stärkten. Immer an der Murg entlang fuhren wir dann das ganze Tal wieder hinunter und begeneten nicht nur Vögeln und Geißen und Eseln. Auch eine Schlange nutze die Frühlingssonne um sich auf der Straße aufzuwärmen.</p>
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/Schlange-im-Murgtal.jpg"><img class="alignnone size-medium wp-image-502" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/Schlange-im-Murgtal-300x225.jpg" alt="Schlange im Murgtal" width="300" height="225" /></a></p>
2014-04-14T10:21:39+02:00experimentalworks: Short update…<pre>
$ curl -I http://blog.experimentalworks.net | grep X-Powered-By
<p><a href="http://blog.experimentalworks.net/?flattrss_redirect&id=654&md5=371466cfff49b4131bf3dd23eaad7163" title="Flattr" target="_blank"><img src="http://blog.experimentalworks.net/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>2014-03-22T16:58:07+01:00Wenger Online#Blog: Projektarbeiten
<p>Bald müssen die Projektarbeiten für die Schule fertig sein, so wird nicht nur fleißig geschrieben, sondern auch gehämmert und gefeilt.</p>
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040843-e1419159039396.jpg"><img class="alignnone size-medium wp-image-505" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040843-300x225.jpg" alt="Sous Vide Controller" width="300" height="225" /></a> <a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040859-e1419159641730.jpg"><img class="alignnone size-medium wp-image-509" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040859-300x225.jpg" alt="Sous Vide Controller - Wie soll das alles da reinpassen?" width="300" height="225" /></a> <a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040865.jpg"><img class="alignnone size-medium wp-image-510" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040865-300x225.jpg" alt="Sous Vide Controller" width="300" height="225" /></a> <a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040881-e1419159113975.jpg"><img class="alignnone size-medium wp-image-507" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040881-300x225.jpg" alt="Sous Vide Controller" width="300" height="225" /></a></p>
<p>Davids Sous-Vide Controller mit Arduino und 3D gedruckter Frontplatte (Danke an <a href="https://www.db4cl.com/" target="_blank">Obelix</a> für das drucken).</p>
<p>Nach einigen Tuning durchläufen, das autotuning Feature der Arduino PID Bibliothek war nicht wirklich in der Lage passende Parameter zu finden, also hat David die Parameter anhand der aufgezeichneten Temperaturverläufe abgeschätzt,ist die Regelung nun schnell und ohne Überschwingen. Mehr Präzision und vorallem Geschwindigkeit würde Sinnvoll nur mit einer kräftigeren Heizung und mit einer Umwälzpumpe funktionieren.</p>
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040871.jpg"><img class="alignnone size-medium wp-image-514" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040871-300x200.jpg" alt="P1040871" width="300" height="200" /></a> <a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040867.jpg"><img class="alignnone size-medium wp-image-511" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040867-300x225.jpg" alt="Sous Vide Ente mit Orangen" width="300" height="225" /></a></p>
<p>Das Ergenbiss kann sich sehen lassen, Sous-Vide Entenbrust mit karamelisierten Orangen und Rotwein-Butter Soße.</p>
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040855-e1419159072664.jpg"><img class="alignnone size-medium wp-image-506" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040855-300x225.jpg" alt="Teslaspule wickeln" width="300" height="225" /></a></p>
<p>Das wickeln der Teslaspule beansprucht ganz schön die Geduld wenn der Draht wirklich schön neben einander liegen soll. Jede Ungenauigkeit kann später zu Überschlägen an dieser Stelle und zum Abbrennen der Spule führen. Die erste Spule zerstörte sich selbst als sie zum trocknen draußen stand und durch den Temperaturunterschied die Wicklungen plötzlich ganz locker wurden und alle kreuz und Quer verrutschten.<a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040855-e1419159072664.jpg"><br />
<p><a href="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040885-e1419159174557.jpg"><img class="alignnone size-medium wp-image-508" src="http://www.wenger-online.de/blog/wp-content/uploads/2014/12/P1040885-300x225.jpg" alt="Buchbinden" width="300" height="225" /></a></p>
<p>Am Ende mussten dann noch die Bücher gebunden werden…</p>