Tumblelog by Soup.io
Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

May 09 2012

wakelift: ipython notebook for more engaging documentation

During my work on zasim, I've found out that the most excellent ipython notebook web application is well suited for creating engaging and enlightening interactive examples and tutorials for your library, framework or program.

You can find examples for all things discussed in this article both in the IPython example notebooks and the zasim example notebooks.

Here's how it works.

Run ipython notebook in the console, perhaps supplying --notebook-dir as the place where notebooks should be kept. Then just create a few notebooks with text cells for explanations and code cells for examples. Other than full examples, that can just be run with "run all", you can also write incomplete code cells and ask the user to fill out the code, perhaps with an assertion at the end that the user has to make pass as an exercise.

But there's more to the ipython notebook than just code input and text output:

Cooler types of output

Displaying different formats in-line

The notebook can display graphics (pngs and svgs for instance) and HTML or javascript snippets as code output and you can input TeX equations in your markdown cells, that will be rendered with MathJax.

Making an object pretty-printable as a png or similar is pretty simple; you just have to implement a method like repr_png or similar that return appropriate data. Look at the documentation of IPython.core.formatters for more information on the available formats.

Displaying multiple things for one cell

If you want to display multiple things in one go, you can import the function display for objects that have appropriate repr_format methods or the different display_foo methods for png, svg, … from IPython.core.display. They can be used in loops for instance to display sequences of images in multiple lines. But we don't have to restrict ourselves to static imagery. With a little trick (that's going to be improved upon "soon"!) we can even get animations.

Displaying (crude) animations

At the moment, this is rather slow and somewhat sloppy with a bit of flickering, but you can use IPython.core.display.clear_output to remove stdout, stderr or "other" output from the cell currently being run. That "other" contains any images or snippets you have displayed with the display function.

With a bit of time.sleep and clear_output, you can make animations. But don't choose too short pauses between the frames, because the web frontend does not wait until the new image is generated and loaded before clearing the output.

With text, of course, this works more smoothly.

Cooler types of interaction

Using gui event loops

Of course, the magic behind the ipython notebook is just the same as the magic behind the qtconsole or the regular interactive shell. That means that you can run different types of event loops and control them from the notebook. For zasim that means that you can use the supplied PySide/Qt-based gui elements and let them show up on the screen. Of course there is no automagic VNC setup going on, so the gui windows will just pop up on the screen of the user where ipython notebook was called and will fail if no gui is available.

All you need to do to get the event loop running and push gui elements around is this little line in one of your cells:

%gui qt

Connecting other frontends

Since every notebook runs a stardard IPython kernel behind the scenes, you can connect any program that supports the IPython zmq protocol. That includes the IPython QtConsole and the regular interactive shell, too.

In the terminal you've started the notebook with, you'll see a couple of lines like this one:

[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-dcd04517-dd1e-4339-84e8-46ef617e26c1.json

Just supply this --existing argument to your other application and you can interact with the kernel that's running for the notebook.

Currently, commands run in the notebook won't show up in other connected frontends and vice versa, so it can get a bit confusing if you actively change state from the other connected frontend, but it's still very useful to inspect the state of the kernel.

Cooler ways of launching the notebook

Distributing example and tutorial notebooks with your library or framework has just one little problem: The user most likely won't be able to write to the notebooks and keep their changes, due to system-wide installations being read-only. And if the user can write to those notebooks, you may not want them to overwrite the example versions you distributed.

To solve this problem, I wrote a little ipython notebook launcher that creates copies of all the notebook's files and launches the notebook, as well as a browser, for those copies. I even went a little further and added the option to put customised imagery and style sheets in there, so you can brand the notebook web app with your logo or your website style.

This piece of code has a page on the IPython Cookbook section of their wiki and the version I use in zasim can be found in the github repo as well.

Keeping your docs and code in sync

One important thing is to keep the documentation up to date with changes to your internals. Of course you should be on your toes anyway every time you change something that's described in the documentation, but every now and then, one or two sentences in your documentation might slip by unnoticed and become out of date.

Using sphinx for zasim helped me in that aspect, because I can put code examples everywhere as doctest blocks that will be executed whenever the documentation is built. This already helps a fair bit, but one could go even further and add invisible doctests right next to the paragraphs that make statements to ensure that all statements in the documentation hold true even as you change your documentation.

But in addition to that, we can also run our example notebooks as unit tests. This can be done with a rather simple conftest.py file for py.test. Details can be found on the IPython cookbook page.

A large part of this has been done for me by minrk of the IPython project. Thanks!

Exporting notebooks to sphinx

At the moment, sphinx integration is not there, but according to an old blog post somewhere, it's a high priority item. I imagine there would be a plugin for sphinx that would read and/or execute an ipynb file including output cells and imagery and put it right into a sphinx document. That I'd love to see.

Until then you can use the print function in the notebook to open a print-view that you can then save using your browser as an html file with imagery.

That's not ideal, but it will certainly get better. Until then, you can do it like me and just tease your potential users with one or two screenshots.

Conclusion

All in all, the ipython notebook isn't just really useful for end users as a tool, but also for developers of anything that could be learnt through guided experimentation. It is not only more convenient than just text (which the user would have to copy-paste to a shell to try), but also more interactive, because the user can immediately change values inside the cells and re-evaluate. That gets pretty close to immediate feedback.

So do give it a try, either with the IPython example notebooks or the zasim example notebooks.

May 07 2012

nomeata’s mind shares: Free Groups in Agda

I must say that I do like free groups. At least whenever I play around with some theorem provers, I find myself formalizing free groups in them. For Isabelle, my development of free groups is already part of the Archive of Formal Proofs. Now I became interested in the theorem prover/programming language Agda,so I did it there as well. I was curious how well Agda is suited for doing math, and how comfortable with intuitionalistic logic I’d be.

At first I wanted to follow the same path again and tried to define the free group on the set of fully reduced words. This is the natural way in Isabelle, where the existing setup for groups expects you to define the carrier as a subset of an existing type (the type here being lists of generators and their inverses). But I did not get far, and also I had to start using stuff like DecidableEquivalence, an indication that this might not go well with the intuitionalistic logic. So I changed my approach and defined the free group on all words as elements of the group, with a suitable equivalence relation. This allowed me define the free group construction and show its group properties without any smell of classical logic.

The agda files can be found in my darcs repository, and the HTML export can be browsed: Generators.agda defines the sets-of-generators-and-inverses and FreeGroups.agda (parametrized by the Setoid it is defined over) the reduction relation and the group axioms. Here are some observations I (disclaimer: Agda-beginer) made:

  • Fun fact: Free groups exist not only in classical logic.
  • Without any automation as in Isabelle, even simple things get quite complicated. A simple substitution of an equality with subst requires me to specify not only the equality and the term I want it to apply, but also to repeat the common part of the terms. Or when using the associativity of list concatenation, I have to pass all three sublists to the lemma. Maybe I am a bit spoiled by Isabelle, but I’d be worried that this would prevent large proofs.
  • The levels are also annoying. Although my theory stays within one level, I have to annotate it everywhere. I’d expect the type inference to figure this out for me.
  • Equality reasoning with begin ... ∎ is quite nice and surprisingly well readable.
  • Besides the additional work, it is nice to be able to do the proof in almost all detail. There is a limitation, though, as some steps are done automatically (if they happen to occur when evaluating/normalizing a term) and the others, even if similar-looking, are not.
  • It’d be great if one would be free in the choice of editor, but vim users generally have a hard time in the field of theorem provers.

If I were to extend this theory, there are two important facts to be shown: That there is a unique reduced word in every equivalence class (norm_form_uniq), and the universal property of the free group. For the former (started in NormalForm.agda) I’m missing some general lemmas about relations (e.g. that local confluence implies global confluence, and even the reflexive, symmetric, transitive hull is missing in the standard library). For the latter, some general notions such as a group homomorphism need to be developed first.

I planned to compare the two developments, Isabelle and Agda. But as they turned out to show quite things in different orders, this is not really possible any more. One motivation to look at Agda was to see if a dependently typed language frees me from doing lots of set-element-checking (see the “mems” lemma in the Isabelle proof of the Ping-Pong-Lemma). So far I had no such problems, but I did not get far enough yet to actually tell.

Thanks to Helmut Grohne for an educating evening of Agda hacking!


Flattr this post

May 04 2012

Chre kocht Gulasch: GPN 12 - Beim chilligen Hacken Leute treffen und was lernen

Der Entropia e. V. lädt wieder zur "Gulaschprogrammiernacht" ein! Dieses Mal dauert der große süddeutsche Hacker-Kongress ganze vier Tage -- er beginnt mit Fronleichnam, einem gesetzl. Feiertag in Baden-Württemberg.

Zum Einstimmen:


Zum Merken:
  • Was: GPN 12 - Hacken, Treffen, Lernen, Chillen

  • Wann: 2012-06-07 (Do.) - 2012-06-10 (So.)

  • Wo: Hochschule f. Gestaltung Karlsruhe, ehemal. IWKA, neben ZKM



Und jetzt: Anmelden!

May 03 2012

NervengiftLabs: codestre.am vs shelr.tv

Nach meinem Artikel über Shelr.tv bin ich darauf hingewiesen worden (Danke an Timo für den Tipp), dass ich mir doch mal codestre.am anschauen soll.

codestre.am funktioniert im Prinzip ähnlich wie shelr, d.h. man kann Dinge, die man in einer Shell tippt (und was ausgegeben wird) mitschneiden und als ein “Video” speichern.

Im Gegensatz zu shelr, kann codestre.am allerdings Livestreams. Sehr nettes Feature. Online kann man dazu auch chatten, fehlt eigentlich nur noch Voice-Chat (aber das kann man ja auch anders lösen).

Um Aufnahmen mit codestre.am zu machen müsst ihr euch zuerst auf der Website anmelden und eine neue Aufnahme erstellen. Dann bekommt ihr einen Befehl, den ihr ausführen sollt; der sieht ungefähr so aus:

curl get.codestre.am/xxxxxxxxxxxxxxxxxxxxxxxxx | sh

Ihr bekommt also für jedes “Video” ein eigens generiertes Shellskript. Sobald es ausgeführt wird, öffnet sich eine neue Shell, die dann live gestreamt wird. Schließt man die Shell, wird die Übertragung beendet. Durch erneutes Starten des Skripts kann man sie allerdings fortsetzen. Um einen Stream ganz zu schließen, muss man ihn online als abgeschlossen markieren. Dann wird er in ein “Video” konvertiert und kann jederzeit wiedergegeben werden.

Lokal Aufnahmen zu speichern, wie in shelr ist nicht möglich, allerdings lassen sie sich als privat markierten, sodass man sie nur mit dem passenden Link ansehen kann. (Das Feature hat shelr inzwischen auch bekommen).

Hier noch eine kleine Gegenüberstellung ohne Anspruch auf Vollständigkeit:

codestre.am

shelr.tv

  • Livestream
  • Livechat
  • Man kann gut Text aus dem Player kopieren*
  • Embedding von Aufnahmen
  • private Aufnahmen
  • etabliert, d.h. viele durchsuchbare Aufnahmen, zu verschiedenen Themen
  • Aufnehmen sind in “Echtzeit”, d.h. lange Pausen im Stream bleiben erhalten
  • - Pfeiltasten funktionieren in ncurses-Oberflächen nicht
  • Lokale Aufnahmen (ohne Anmeldung)
  • Lokales Abspielen
  • Kommentieren anderer Aufnahmen
  • Embedding von Aufnahmen
  • private Aufnahmen
  • das Format beinhaltet keine Pausen**

* beide Player funktionieren zwar auf HTML-Basis, im shelr-Player passieren allerdings manchmal komische Dinge, wenn man Text auswählen will
** das heißt nicht, dann es keine Pausen gibt, nacheinander Eingegebenes wird auch nacheinander ausgegeben, es gibt allerdings keine langen Pausen, wenn man lange nichts tut

Besonders die Livestream-Funktion hat mich an codestre.am sehr begeistert, aber manchmal will man aber vielleicht auch einen lokalen Client haben, um Aufnahmen zu machen und zu verwalten. Dann muss man eben zu shelr greifen.

Wenn man fertige Aufnahmen sucht, dann ist man auf jeden Fall bei codestre.am besser bedient, da es dort schon eine große Auswahl (sogar nach Programmiersprache sortiert) gibt. Schön wären allerdings Aufnahmen mit Audiospur, die leider beide nicht liefern.

Hanno's blog: Zu Vroniplag und Annette Schavan

Gestern früh machten erste Meldungen die Runde, dass in einem anonymen Blog Vorwürfe erhoben wurden, Annette Schavan (CDU) habe in ihrer Dissertation abgeschrieben. Dass der Fall eine gewisse Brisanz hat, dürfte sofort klar sein: Immerhin ist Schavan Ministerin für Bildung und Forschung.

Die erste Reaktion der Ministerin bestand darin, dem Urheber der Vorwürfe seine anonymität anzukreiden. Ein typischer Ablenkungsversuch, was mir schon ein starkes Indiz dafür schien, dass die Vorwürfe stimmen werden. Es ist schließlich völlig egal, wer aus welchem Grund und mit welchen Mitteln derartige Vorwürfe erhebt. Relevant ist einzig und allein die Frage ob die Vorwürfe korrekt sind oder nicht.

Im Laufe des Tages gab es aber eine nicht unspannende Wendung in der Geschichte. Die Macher der Internetseite Vroniplag meldeten sich zu Wort. Die Arbeit von Vroniplag hat in der Vergangenheit zahlreichen Prominenten wie der EU-Abgeordneten Silvana Koch-Mehrin (FDP) den Doktortitel gekostet, die Macher haben sich inzwischen bei vielen einen guten Ruf erarbeitet. Vroniplag erklärte nun, sie hätten die Dissertation ebenfalls untersucht und seien in einer knappen Abstimmung zu dem Schluss gekommen, die Vorwürfe nicht zu veröffentlichen. Vroniplag-Aktivistin Debora Weber-Wulf bezeichnete die Doktorarbeit im Spiegel als "problematisch", aber sie sei kein mit anderen Fällen vergleichbares Plagiat. Es scheint wohl so, dass einzelne Sätze übernommen wurden, bei denen man eine Quellenangabe erwarten würde, aber eben kein Betrug in großem Stil.

Offenbar fährt Vroniplag hier eine Strategie der Form "Alles oder nichts". Plagiate werden nur dann veröffentlicht, wenn sie eindeutig sind. Ich finde das eigentlich keine sinnvolle Strategie. Was spräche dagegen, wenn Vroniplag in solch einem Fall mit einer eben differenzierten Meldung an die Öffentlichkeit geht? Was andere daraus machen - die Universität, die Politik oder auch nur die allgemeine Öffentlichkeit - bleibt dann denen überlassen.

Klar, ein Problem ist, dass eine solche Meldung schnell ein Eigenleben entwickeln könnte und alle abwiegelnden Worte es nicht in Presseberichte schaffen. Vroniplag hat sich in der Vergangenheit einen Ruf erarbeitet: Wenn dort eine Arbeit als Plagiat bezeichnet wird, stimmt es meistens. Insofern ist es verständlich, dass die dort aktiven sehr vorsichtig mit solchen Grenzfällen umgehen. Sie aber zu verschweigen ist meiner Meinung nach auch keine sinnvolle Lösung.

Die Universität Düsseldorf, an der die Dissertation geschrieben wurde, wird die Vorwürfe nun untersuchen. Das ist gut so. Vielleicht finden sie weitere Plagiate, vielleicht stellen sie fest, dass die Arbeit zwar problematisch, aber im Rahmen des tolerierbaren ist, vielleicht kommen sie zu einem ganz anderen Schluss. Aber die jetzt erfolgte Veröffentlichung des Sachverhaltes ermöglicht es der Universität überhaupt erst, sich eine eigene Meinung zu bilden.

April 23 2012

NervengiftLabs: Shell-”Videos” aufnehmen und teilen mit shelr.tv

Wenn man in Tutorials oder Forenbeiträgen mal ein paar Terminalbefehle wiedergeben will, dann schreibt man sie meistens ja einfach nacheinander hin. Manchmal will man aber eigentlich auch zeigen, wie das Ganze aussehen soll, wenn es richtig ist. Und grade, wenn man Programme erklären will, die etwas Interaktion erfordern, wär es doch eigentlich toll, wenn man einfach das ganze Prozedere aufzeichnen und mit anderen teilen kann.

Shelr.tv machts möglich:

Shelr liefert ein Terminalprogramm, das man im AUR, oder über rubygems mit

sudo gem install shelr

installieren kann.

Nach dem Aufruf mit

shelr record

wird erst nach einem Namen für die Aufnahme gefragt und dann eine neue Shell startet. Alles, das in dieser Shell ausgegeben wird, und alles, das (sichtbar, d.h. keine Tastenkombinationen oder Passwörter) eingegeben wird, wird mitgeschnitten und gespeichert. Mit Strg-D, oder durch Beenden der Shell, wird die Aufnahme beendet. Gespeicherte Aufnahmen kann man mit

shelr play last/<ID>

wiedergeben, wobei <ID> entweder eine lokal gepeicherte, oder die URL einer auf shelr.tv veröffentlichten Aufnahme sein kann. Hochgeladene “Videos” kann man auch auf der Seite anschauen, da gibts auch ein paar Beispiele.

Eigene Aufnahmen kann man, nachdem man sich auf der Seite angemeldet hat und den API-key mit

shelr setup &lt;API-KEY&gt;

eingetragen hat, mit

shelr push last/&lt;ID&gt; [--private]

hochladen.

 

April 22 2012

NervengiftLabs: Gamepad auf Tastatur mappen

Aus Langeweile habe ich mal meine HumbleBundle-Käufe durchgeschaut und nach Spielen gesucht, die ich noch gar nicht gespielt habe. Bit.trip.runner war eins davon (übrigens ein saugeiles Spiel, wers nicht hat: kaufen!). Das wollte ich dann auch gleich spielen. Dummerweise wurden im Spiel bei meinem Gamepad (das ich ja beim Bau des letzten Buzzers so pfleglich behandelt habe, dass es sogar noch nutzbar ist) nicht alle Tasten richtig erkannt/belegt und mit der Tastatur will man das Spiel eigentlich nicht spielen…

Einfachste Lösung: qjoypad (sourceforge.net oder AUR).

Nach dem Start findet man ein neues Icon im Tray. Mit einem Klick darauf öffnet sich ein Fenster, in dem man jede Achse und jeden Knopf mit Tasten oder Mausachsen belegen kann. Man kann auch verschiedene Konfigurationen speichern.

Wenn das Terminalfenster, in dem qjoypad läuft, den Fokus hat, werden dort auch alle Joystick-Events ausgegeben. Man muss allerdings zu den angezeigten Achsen- und Buttonnummern immer +1 rechnen, um zu wissen, welche man in der GUI belegen muss.

April 19 2012

NervengiftLabs: Humble Botanicula Bundle

Dieses Mal gibt es bis zu vier Spiele für  Mac, Windows und Linux und außerdem auch einen Film zum selbstbestimmten Preis.

Das Humble Botanicula Bundle besteht aus drei liebevoll gestalteten point-and-click-adventure-Spielen von Amanita DesignBotanicula, Machinarium und Samorost2. Zahlt ihr mehr als der Durchschnitt (aktuell 8.63$), bekommt ihr noch das Spiel Windosill, auch ein point-and-click-Puzzle, und den Film Kooky. Der mit Stop-Motion und Puppen gedrehte Film handelt von einem verlorenen Teddybär, der auf der Suche nach seinem Zuhause ein großes Abenteuer erlebt. (Ich hab ihn mir noch nicht angesehen, aber der Trailer sieht nicht schlecht aus.)

Im Gegensatz zu den bisherigen Bundles ist der Charity-Teil diesmal durch The World Land Trust, die sich um den Schutz des Regenwalds und anderer bedrohter Lebensräume kümmern, abgedeckt.

Wie immer könnt ihr die Verteilung des Geldes selber einstellen.

Steam-Keys gibts natürlich auch dazu :)

April 12 2012

halcy.de v4: Revision 2012

The 2012 edition of Revision, a demoparty held annually in Saarbrücken (Germany), has come and gone. SVatG was there with record attendance (4 people!), and for once, we’d actually prepared something before the party, which is not something that usually happens - and this time, two releases!

Please enjoy:

Peridiummmm (A demo for the STM32F4 ARM-based µC)

[Pouet]- [Binary (Arm Cortex M4)]- [Source Code]

Blockparty 5 Non-Invitation

[Pouet]- [Binary (Windows)]

Meeting up with everyone (esp. Saga Musix) was great, of course, but this time, the best part was going to the party with people from my actual demo group, especially nrr, who flew over here just for the party! (Also, Mithaldu, who was spontaneously recruited at the party place).


Left to right: Mithaldu - nrr - ryx - halcy (with las^mercury sprinting in back)

Having finished up before the party, we of course didn’t party code any super dumb party prods filled with ridiculous jokes, a practice we at SVatG despise.

Finally, my favourite release from the party:

Boogietown by Ghostown & RNO

Overall, kickass party, hope to be there again next year. For me, the next party will most likely be Evoke, though I would really, really like to go to Assembly this year and see WAHa_06x36.

NervengiftLabs: Bubbletea-Bubbles selber bauen

Heute mal eine etwas andere Anleitung:

Mein Bruder ist grad voll süchtig nach diesem BubbleTea-Zeug. Letzte Woche hat er mich ewig angenörgelt, ich solle ihm doch einen ganzen Eimer mit dem Zeug bestellen.

Fand ich sinnlos.

Zwei Tage später kamen dann die Chemikalien zum Selbermachen. Das ist nicht sinnlos. :)

Für das Zeug braucht man nur zwei Dinge: Alginat (Handelsname “Algizoon“) und etwas um eine ionenhaltige Lösung zu erzeugen, z.B. Calciumlactat (“Calazoon“). Insgesamt zahlt man knapp 30€ für 300/400g. Das gibt einige Kilo Bubbles, fehlt nur noch eine Maschine, die alles vollautomatisch macht :)

Für einfache Bubbles rührt man sich zwei Lösungen an:

  • 3 Portionierlöffel (liegen dem Zeug bei, ungefähr gestrichene Teelöffel) Alginat auf 120 ml Wasser.
  • 3 Portionierlöffel (unbedingt einen zweiten Löffel benutzen, sonst gibts Klumpen) Calciumlactat auf 130 ml Wasser

Beides gut verrühren, gerade das Alginat braucht etwas länger um sich ganz zu lösen.

Die Alginatlösung kann man dann mit ca. 100-150 ml Saft, Sirup oder auch Alkohol mischen. Dann muss man diese Lösung nur langsam in die Calciumlösung tropfen. Es bildet sich dann sofort eine Schicht um den Tropfen.

Mit einer Spritze kann man schnell kleine Bubbles machen

Mit einer Spritze oder Pipette kann man die Lösung ganz gut portionieren, allerdings werden die Bubbles, die dabei entstehen ziemlich klein. Bisher ist die beste Lösung für größere Bubbles, die leicht viskose Alginatlösung langsam den Löffel herunterlaufen zu lassen, so dass sich unterm Löffel ein Tropfen bildet (s.Bild) und dann in die Calciumlösung fällt. Mit ein bisschen Übung lassen sich so einigermaßen schnell viele Bubbles machen.

Mit etwas Übung kann man mit einem Löffel schöne große Bubbles herstellen

Nach ein paar Minuten (am besten immer wieder testen) ist die Schicht um die Bubbles dick genug und man kann sie aus der Lösung fischen. Danach sollte man sie mit viel klarem Wasser abspülen, sonst haben sie bald die Konsistenz von Gummibällen :)

Gut abspülen ist wichtig

Die Bubbles kann man dann mit Eistee/Saft/Sirup/… aufgießen und mit dicken Strohhalmen servieren.

Statt für Bubbles kann man mit Alginat aber auch ein paar andere nette (und/oder eklige) Sachen machen. Zum Beispiel kann man eine Alginatlösung mit Sirup und nach Bedarf auch Alkohol anrühren und in ein Schnapsglas füllen. Wenn man dann ein bisschen von der Calciumlösung dazugibt, hat man ein leckeres Gelee. Sieht besonders cool aus, wenn man mehrere farbige Gelees schichtet.

Omnomnom! Buntes Gelee

Am Ende unserer ersten Experimentier-Session haben wir dann noch die Reste an Alginatlösung in die Calciumlösung gekippt… das Ergebnis ist was für ne Halloween-Party:

Schwabbel-Gedärme :)

April 06 2012

Zeitgeistaustreibung: Eigentum und andere Dinge

Das Eigentum wie wir es kennen ist im Wandel. Es ist eine schleichende Revolution und ich bin mir ganz sicher, viele werden dies zunächst als steile These abtun - aber es tut sich was und das nachhaltig, da bin ich mir sicher. Doch von vorne:

Seit einigen Monaten lebe ich in einem Zustand, den man für konservative Menschen aus der Generation meiner Großeltern getrost als "Ohne festen Wohnsitz" beschreiben könnte. Das heisst nicht, dass ich nicht wüsste, wo ich heute Nacht schlafen soll. Oder morgen Nacht. Aber das Gefühl eigener vier Wände, und vor allem eigener Möbel und Dinge, das gibt es gerade nicht. Zuerst waren es bauliche Maßnahmen in meiner Karlsruher Wohnung, dann mein Umzug nach Hamburg. Ich bin hier gut untergebracht, keine Sorge. Aber darum geht es hier nicht. Vielmehr um all das, was die letzten Monate mit meinem Bewusstsein angestellt haben.
Continue reading "Eigentum und andere Dinge"

April 05 2012

Hanno's blog: Sodom, Gomorra und Schach

SchachEs ereignete sich im mittelfränkischen Weißenburg: Ein paar Schachspieler wollten dort die mittelfränkische Meisterschaft des traditionellen Brettspiels am verlängerten Osterwochenende durchführen. Eine kaum verwerfliche Angelegenheit, sollte man meinen.

Anders sah das allerdings die beiden Groß-KirchenSekten. Schachspielen an Karfreitag - und das mitten in Bayern - das geht schließlich nicht an. Immerhin werden da Damen geschlagen, Bauern geopfert und Türme gezogen - sündiger geht's wohl kaum. Der Bürgermeister des Ortes hatte gerade schon einen Streit mit den Vertretern des katholischen und evangelischen Fundamentalismus hinter sich und fragte in vorauseilendem Gehorsam bei den Kirchenvätern um Erlaubnis, den sündigen Schachspielern eine städtische Halle zu vermieten. Die Kirchenoberen verweigerten diese prompt.

Ich bin ein entschiedener Befürworter von Religionsfreiheit. Jeder Mensch hat das Recht zu glauben was er will, egal wie sinnlos das auch sein mag. Aber die Misere hier ist die, dass Vertreter von Religionsgemeinschaften fordern, dass ihre Regeln auch für andere Menschen zu gelten haben. Da ist eine Grenze überschritten und das bezeichne ich bewusst und deutlich als Fundamentalismus. Egal ob es um Muslime geht, die anderen das Zeichnen von Karrikaturen verbieten wollen oder um Christen, die meinen, an ihren Feiertagen entscheiden zu können, was andere Menschen tun dürfen. In vielen Gegenden Deutschlands gilt beispielsweise noch immer ein Tanzverbot an manchen christlichen Feiertagen.

Die Giordano Bruno Stiftung Mittelfranken ruft aus Anlass der Provinzposse zum Kirchenaustritt auf. Einen Aufruf, den ich nur aus vollem Herzen unterstützen kann.

Bildquelle: Roland Scheicher auf Wikimedia Commons, gemeinfrei

April 03 2012

The Turkey Curse: Über (vermeintliche) Nähe der Netz-Vereine zu Parteien

Gestern wurde die Gründung des Vereins CNetz an verschiedenen Stellen kommentiert, einem Verein, der maßgeblich von CDU/CSU-Bundestagstagsabgeordneten gegründet wurde. Damit ist nun ein zweiter Verein dieser Art nach D64, dem Pendant der SPD, im Kontext einer Partei gegründet wurde. Ich persönlich finde es gut, wenn solche Vereine entstehen, denn das zeigt ganz offensichtlich, dass so langsam alle möglichen politischen Grupprierungen verstanden haben, welche Bedeutung das Netz für die Gesellschaft besitzt. Jedenfalls heisse ich diesen Verein, genau wie D64, herzlich willkommen und freue mich über möglichen Austausch.

Der von mir sehr geschätzte Kai Biermann hat in dem Artikel Unionspolitiker gründen Internetlobby CNetz auf Zeit Online folgende (bewusst vorsichtig formulierte) Aussage getroffen:

Damit existieren nun drei netzpolitische Vereine, die jeweils einer Partei nahe stehen: die Digitale Gesellschaft, deren Mitglieder teilweise auch Mitglied bei den Grünen sind, die Initiative D64, die eng mit der SPD verflochten ist und eben CNetz, dessen Vorstand aus Unionsmitgliedern besteht.
Deswegen sehe ich mich genötigt, etwas zu meiner persönlichen Sicht der “Parteinähe” der Digitalen Gesellschaft zu Bündnis 90/Die Grünen zu schreiben.

Es ist richtig, dass bei der Digiges einige Mitglieder der Grünen dabei sind. Es gibt aber schon augenscheinlich einen fundamentalen Unterschied, den Kai auch klar macht: Beim CNETZ und bei D64 sind es Mandatsträger und Parteifunktionäre, die dort einen Verein gegründet haben, während es bei der Digiges eher “Fußvolk” ist, also Leute, die bei den Grünen keinerlei Funktionen oder Mandate haben, ja soweit ich weiss nicht einmal sowas wie Sachverständige Bürger sind.

Eine Ausnahme scheint oberflächlich betrachtet Markus’ Teilnahme an der Internet-Enquete für die Grünen sein, aber das heisst in etwa genauso viel wie die Teilnahme Constanzes für Die Linke oder padeluun für die FDP, nämlich nur, dass diese Parteien Leute dort haben wollten, die vor allem durch Kompetenz glänzen und mit ihnen nicht vollkommen in Widerspruch stehen. Aber diese Enquete ist eine Besonderheit im politischen Betrieb und muss auch so gesehen werden.

Ich würde übrigens sogar soweit gehen, dass die Digiges auch ohne die Existenz der Grünen bestehen würde und der parteipolitische Zusammenhang tatsächlich viel zufälliger ist, als es den Anschein haben mag.

Die Digitale Gesellschaft speist sich aus Leuten, die alle ihre Erfahrungen in Aktivitäten rund um Bürgerrechtsgruppen oder spezialisierten bzw. technikzentrierten Gruppen und Vereinen gemacht haben. Die Notwendigkeit zur Gründung im letzten Jahr erfolgte, soweit ich das beurteilen kann, aus der Einsicht, dass Gruppen wie die AKs, der CCC oder andere zwar alle durchweg ganz hervorragende Arbeit leisten, aber innerhalb dieser Gruppen viel und oft episch über eigentlich Selbstverständliches gestritten wird und teilweise persönliche Animositäten eine Rolle spielen. Nicht falsch verstehen: Ich habe grundsätzlich überhaupt gar kein Problem damit, denn ich bin bekanntermaßen ein Freund des auch ausufernden Diskurses, und diese Gruppen leisten nach wie vor Erstaunliches. Ohne sie wäre so manche politische Entscheidung gefällt worden, die nachhaltige, negative Probleme geschaffen hätten. Dafür bin ich überaus dankbar. Aber die Schlagkraft dieser Gruppen leidet etwas unter diesen Diskussionen, und nur wenige Mitglieder in diesen Gruppen haben Bock, sich die ständig wiederholende, anstrengende und aufreibende Arbeit im Rahmen einer Lobbyarbeit zu geben, die grade so dringend nötig ist.

Ich bin nun seit knapp vier Monaten Mitglied in der Digiges und habe vor allem eine Erfahrung gemacht: Die Signal-Noise-Ratio ist so ganz anders, als ich das bislang gewohnt bin. Das liegt u.a. daran, dass über bestimmte Dinge einfach nicht diskutiert werden muss. Es ist beispielsweise schlicht unnötig, darüber zu streiten, ob das Fluggastabkommen nun auch was Gutes hat. Nein, es ist den Beteiligten klar, so dass man sich innerhalb der Digiges darauf konzentriert, konkrete, schlagkräftige Aktionen dazu zu initiieren. Ich geniesse das sehr, denn ich habe selten in diesem Umfeld eine so effektive Arbeit erlebt (und ich kenne mittlerweile viele solcher Gruppen).

Damit das so schlagkräftig funktionieren kann, ist diese Gruppe weniger offen als andere, was nach wie vor bei einigen Leuten für Unmut sorgt. Wenn es sowas wie ein Auswahlkriterium bei der Digiges gibt, dann ist es die Fähigkeit, anzupacken und Projekte durchzuziehen statt dem üblichen “man müsste mal”, das in anderen Gruppen teilweise für viel Gerede und vergleichsweise dann doch wenig Ergebnisse sorgt - zumindest gemessen am Aufwand. Die Digiges verzichtet schlicht auf Leute, die sich mit der Mitgliedschaft im Verein schmücken, aber ansonsten nichts gebacken bekommen. Deswegen ist die Digiges aus meiner Sicht auch so erfolgreich, obwohl die Anzahl der Mitglieder eigentlich lächerlich gering ist. Es gibt auch keine öffentlichen Listen, bei der jeder Spinner seine Erkenntnisse über Gott und die Welt zum besten geben kann, weil das den Betrieb nur unnötig aufhält und wirklich rein gar nichts bringt.

Diese augenscheinliche Intransparenz bietet, wie gesagt, viel Angriffsfläche, aber ich muss sagen, diese Anwürfe gehen mir vollkommen am Arsch vorbei - frei nach dem Motto: Besser machen! Die beiden Vereine CNetz und D64 haben sich u.a. auch deswegen gegründet, um genau das zu tun. Ob sie es schaffen liegt aber letztendlich im Auge des Betrachters.

Auch ich bin ein Mitglied der Grünen, habe dort meinen Spass und fühle mich dort sehr wohl. Ich bin in der Partei zur Zeit vor allem in die Diskussionen um die Reform des Urheberrechts involviert, die laut und leidenschaftlich vor allem zwischen den Medien bzw. Netzpolitikern und den Kulturpolitikern geführt wird, aber natürlich auch in andere Diskussionen in dem Umfeld, die ins technische Abgleiten und letztendlich Bürgerrechtsdiskussionen sind (z.B. Staatstrojaner, VDS u.v.a.m.).

Die Grünen sind aber eben eine Partei, die wie alle anderen um Mandate kämpft und sich regierungsfähig halten will - und damit zu (auch schmerzhaften) Kompromissen bereit sein muss. Auch damit habe ich prinzipiell gar kein Problem, denn das ist das politische Spiel, also der Wettstreit um Ideen und deren Umsetzung sowie der Übernahme politischer Verantwortung, die damit einher geht, die schlicht was anderes ist als ein “wünsch dir was”, das man sich als NGO oder rein oppositionelle Gruppe leisten kann.

Ich weiss auch, dass ich gar nicht Mitglied in dem Laden sein müsste, um mich dort so zu beteiligen wie es grade tue (so ticken die Grünen nunmal schon immer und hat mit ihrem Selbstverständnis zu tun), aber ich sehe auch ausserhalb meiner politischen Kernthemen sehr viel Überschneidungen, die ich mit anderen Parteien nicht habe - sei es vom Stil her, von der Programmatik oder im Umgang miteinander. So schätze ich es z.B. sehr, dass ich, egal welche Frage ich stelle, oft von den Abgeordneten oder deren Mitarbeitern direkt kontaktiert und mit Informationen versorgt werde - selbst dann, wenn ich dort eine vollkommen andere Meinung vertrete als der betreffende Politker und wir uns im innerparteilichen Wettstreit miteinander befinden. Das ist mir so bei den Piraten nicht untergekommen (dort bedeutet ein Unterschied in der Meinung oft eher Ad Hominem-Attacken und Intrigantentum) und weiss auch nicht, wie das in anderen Parteien läuft. Aber egal, ich bekomme bei den Grünen das, was ich brauche, und das sind vor allem erst einmal Informationen und bin gerne bereit, dort meine Erkenntnisse und Meinung in die Diskussion einzubringen - mit wechselndem Erfolg. Aber man kann mir ganz sicher nicht unterstellen, ich sei ein Parteisoldat.

Die Digiges ist in meiner Wahrnehmung nach jedenfalls der EDRI, dem CCC und den AKs wesentlich näher als den Grünen. Und auch innerhalb der Grünen, beispielsweise aus der Kulturecke, wird die Digiges eher als natürlicher Gegner denn als Verbündeter gesehen, und das wohl auch zurecht. Denn die Digiges nimmt kein Blatt vor den Mund und greift selbstverständlich auch die Grünen heftig an, wenn dort seltsame Diskussionen stattfinden und komische Entscheidungen gefällt werden. Die Digiges begreift die Grünen am Ende des Tages wie jede andere Partei auch: Als einen Akteur, der eine Menge Unsinn verzapft, wenn man nicht genau aufpasst.

Wenn die blosse Parteimitgliedschaft einiger Mitglieder schon als Parteinähe einer Organisation gesehen wird und hier keinerlei Unterschied macht, dann müsste der CCC mittlerweile eine parteinahe Organisation der Piraten gelten. Denn immerhin ist dort mit Maha ein Mitglied der Piraten im Vorstand, sogar eines, dass in den Medien viel Beachtung findet. Aber jeder, der den CCC kennt, sollte wissen, dass das Quatsch ist. Der CCC begreift sich von jeher als überparteilich und handelt als Organisation auch so. Für den CCC sind auch die Piraten eine Partei wie jede andere und wird auch so behandelt: Man kann miteinander reden, aber die Piraten geniessen eigentlich keinerlei Sonderstellung (vielleicht letztendlich eher sogar im Gegenteil).

Genau das war auch für mich damals der Grund, als ich für ein Mandat im NRW-Landtag angetreten bin, meine Aktivitäten innerhalb des Clubs während der Zeit komplett einzustellen, weil ich, obwohl ich mich für moralisch soweit integer halte, um dort ein Trennung der Aktivitäten zu vollziehen, trotzdem wohl nicht hätte verhindern können, dass dem CCC etwas unterstellt wird und ich am Ende für die Partei innerhalb des Vereins irgendwie geworben hätte. Das halten übrigens die Piraten im Abgeordnetenhaus Berlin, die CCC-Mitglieder sind, meiner Wahrnehmung nach auch so, und das ist richtig, und dasselbe gilt auch für Maha, der dort eine klare Trennlinie zieht.

Es ist jedenfalls ganz klar etwas vollkommen anderes, wenn Mandats- und Funktionsträger in solchen Vereinen maßgebliche Mitglieder sind als einfache Parteimitglieder. Denn diese Mandats- und Funktionsträger mögen eine andere Meinung vertreten als ihre Parteien, kämpfen aber am Ende um Macht und Einfluß innerhalb ihrer Partei oder im parlamentarischen Betrieb. Ich finde es auch ehrlich gesagt ein wenig befremdlich, wenn Politiker in Lobbyorganisationen tätig sind, die diese Netzvereine nun einmal sind. Denn sie haben ganz andere Möglichkeiten, politische Aktivitäten zu entfalten, indem sie gezielt Anfragen stellen, bezahlte Mitarbeiter haben, die ihnen helfen und auch sonst ein Menge Instrumentarien haben, um ihre politischen Ziele auf die Bühne zu bringen: Sie können ihre Standpunkte sehr direkt ohne Umwege in die Fraktionen und Parteien einbringen und sollten solche Vereine eigentlich gar nötig haben, denn diese Vereine sind ja grade ein Art Gegenentwurf und verstehen sich eher als ausserparlamentarische Opposition und Lobbyist für Bürgerrechte.

Von daher hat Kai mit seiner vorsichtigen Formulierung in dem Artikel zwar irgendwie recht, aber trotzdem entsteht ein Eindruck, den ich für falsch halte.

Nachtrag: Nach der Veröffentlichung des Artikels ist mir klar geworden, dass mit Jonas Westphal bei der Digiges der Netzpolitische Sprecher der Berliner SPD Mitglied ist. Das zeigt einmal mehr, wie wenig Parteipolitik in der Digitalen Gesellschaft eine Rolle spielt, wenn ich das nicht einmal mitgekommen habe :)

March 27 2012

Hanno's blog: Ancient streamed audio formats

I've promised that I'll dig into some old file formats and check how well they can be accessed on today's systems with free software.

Today, I'll start with audio formats. To begin, in general there are two kinds of audio formats. Streamed audio formats start with a more or less raw audio stream, apply some encoding and sometimes (lossless or lossy) compression. There are also tracker audio formats. They have internal information on tone pitches and instruments. Most really old computer audio files are tracker formats (like the popular C64 SID format). This blog post will be about streamed audio formats and I'll save the tracked ones for a later one.

The file formats I've chosen are more or less random, the main criteria being that I once stepped over them and still remember that. There's a hughe collection of all kinds of media file samples on the mplayer server.

The single most important project regarding exotic audio or video formats is ffmpeg, a library that does despite its name much more than decoding mpeg. All major free software media players use ffmpeg.

The file formats I've investigated:
  • Some of the very first files distributing music through the Internet I remember were real audio files (extension .ra or .rm) from the german punk band WIZO. Real audio has a whole bunch of variants, scanning through some of my old backups, most of them used either AC-3 or Real Audio 2.0 as their codec. Thanks to Waybach Machine, you can still find the WIZO downloads (Raum der Zeit - Techno is AC-3, the others are RealAudio 2.0).
  • vqf (or TwinVQ) was once announced having better quality than MP3 and was discussed as its successor. However, it seems it is almost completely distinct today, I didn't find anything at all (except in the above mentioned sample collection) in vqf format for download.
  • Monkey's audio, extension .ape, is a lossless audio codec, which is itself licensed under some kind of noncommercial-use-only license that doesn't qualify as free software. It's not really old, as it's still being developed, but I added it as another example of an uncommon format.
  • Shorten (extension shn) is an old lossless audio format, which was often used by the etree project that collects recordings of concerts. Today, it is mostly deprecated by flac, but the old recordings are still available.
  • voc: The popular dos floppy copying program vgacopy had sound before I had a soundcard - it used the pc speaker to play .voc files it had shipped. It's a format used by some Creative software for their SoundBlaster. It's a more-or-less raw audio format like wav.
ffmpeg is able to decode and play all of these audio codecs. But what I found out was that this doesn't necessarily mean every application using ffmpeg can do this as well. I've tested mplayer, xine, vlc, audacious and totem (based on gstreamer). Although there are quite many free software media players - both for audio and video - out there, this should cover pretty much everything. Most media players use xine, vlc or gstreamer indirectly.

 mplayerxinevlcaudacioustotem/gstreamerra AC3YesNoYesYesNora 2.0YesNoNoYesNovqfYesNoYesYesNoapeYesNoNoYesYesshnYesYesNoYesYesvocYesScratchyScratchyNoNo
Shorten playback has some problems, seeking often does not work, but this seems to be a limitation of the format itself. If I found feature requests for those formats, I've linked them, I also opened a bunch of them myself.

Conclusion: ffmpeg does a really fine job in playing all the obscure audio streaming formats. However, not every player that's based on ffmpeg plays every format ffmpeg can play. mplayer is the only player that succeeds with everything, probably because mplayer's devleopment is very tightly related to ffmpeg's development.

Update: I forgot to mention libav. It is a fork of ffmpeg. However, there's not that much to say, as ffmpeg and libav are still quite similar in their codec support. audacious does not support libav yet, all other apps just produce the same result.

March 25 2012

Zeitgeistaustreibung: Wo sind all die Utopien hin?

Es geht hoch her in den Internet-Debatten. Sei es die spackenkritische Privatsphäria, seien es Anonymous, seien es Diskussionen um Verteidigungskämpfe und wie diese zu führen seien, sei es das ganze Ding mit dem Urheberrecht, der Kulturwertmark und der Abschaffung von allem. Ich habe etwa 2007 mein Engagement in Sachen Netzpolitik von "jede freie Minute" auf "wenn es passt" zurück geschraubt und wenn ich mir das ganze Ding so angucke, viel hat sich nicht verändert.

Wir, und ich meine hier alle, die sich progressive Gedanken zur sich verändernden Welt machen, diskutieren immer noch um die gleichen Dinge, wir führen einen Verteidigungskampf nach dem anderen. Und das meistens unglaublich spät, ACTA war schon damals ein Thema, die Vorratsdatenspeicherung auch. Aus welchem Grund auch immer hat die Politik es geschafft, unsere Geschwindigkeit an die ihre anzupassen.

Continue reading "Wo sind all die Utopien hin?"

March 19 2012

NervengiftLabs: Humble Bundle for Android #2

Es ist schön zu sehen, dass es immer mehr tolle Indie-Games auch auf Androidgeräte schaffen.

Das aktuelle Humble Bundle bietet wieder 5 Spiele für Android, Linux, Mac und Windows zum selbstbestimmten Preis. Steam Keys bekommt man auch.

Diesmal gibt es:

  • das Fantasy RPG Avadon: The Black Fortress (Achtung: nur für Tablets ab 7″)
  • den Single-Button Platformer Canabalt (kann man hieronline spielen)
  • das 3D-Puzzlespiel Cogs
  • der Puzzler Zen Bound 2 (klingt interessant und sehr gechillt, bin leider noch nicht zum Ausprobieren gekommen)
  • das Strategiespiel Swords and Soldiers, im Prinzip ein Tower-Wars (bekommt man nur, wenn man mehr als der Durchschnitt zahlt, momentan ~6$)

Außerdem unterstützt man wie immer den Guten Zweck (EFF und Child’s Play)

Wer jetzt immer noch nicht überzeugt ist: hier das offizielle Promo-Video (englisch)

March 14 2012

NervengiftLabs: Compositing mit i3

i3 benutzt man ja eigentlich nicht unbedingt aus ästetischen Gründen, auch wenn es mit einem schönen GTK-Theme (ich empfehle Ubuntus “Ambiance” aus dem AUR-Paket “light-themes“) durchaus schick aussehen kann.

Aber eigentlich können ein paar dezente Effekte auch nicht stören, finde ich. i3 kann von Haus aus leider kein Compositing, das lässt sich aber leicht mit xcompmgr aus dem gleichnamigen Paket nachrüsten.

xcompmgr -cf -r 0 -D 6

gibt einen leichten Überblendeffekt beim Wechseln der Arbeitsflächen und Öffnen von Fenstern. Der Parameter -r 0 deaktiviert Schatten, da das bei Tiling-Windowmanagern ein bisschen sinnlos und – meiner Meinung nach – nicht schön ist.

Bei mir gab es anfangs Grafikfehler, die verschwunden waren, nachdem ich den Befehl in die i3-config eingetragen und mich neu angemeldet hatte. Auf meinem Netbook funktioniert das leider nicht, was ich aber auf den Intel-Grafikchip schiebe.

Ein guter Grund für xcompmgr ist vor allem auch, dass Notification-Dienste, wie notify-osd, schön dargestellt werden und kein schwarzer, eckiger Hintergrund hinter dem Notification-Popup liegt. Docks, wie z.B. der Avant Window Navigator, funktionieren allerdings nicht sonderlich gut, was aber an i3 zu liegen scheint.

March 13 2012

nomeata’s mind shares: ghc-heap-view: Complete referential opacity

During the last week, I created ghc-heap-view, a library to investigate the actual memory representation of Haskell values. It is inspired by vacuum and the GHCi debugger, but goes beyond them by allowing the user to look inside thunks and functions and see what other values they refer to. Let me demonstrate it by running the included demo:

ghc-heap-view-demo

Here are a four different lists, where the first three are already evaluated.
The first one, l, was defined as a top level constant as

> l = [1,2,3]

and is now found at 0x00000000006d1750/2 (where the /2 is the pointer tag information) and fully evaluated:

    ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_STATIC, srtlen = 1}, 
                 ptrArgs = [0x00000000006d16e0/1,0x00000000006d1730/2],
                 dataArgs = [], descr = "ghc-prim:GHC.Types.:"}

The second one, l2, is locally defined

> let l2 = 4:l

and now found at 0x00007fdce19fe4b0/2. See how the cons-cell references l!

    ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_2_0, srtlen = 1},
                 ptrArgs = [0x00000000006dca50/1,0x00000000006d1750/2],
                 dataArgs = [],
                 descr = "ghc-prim:GHC.Types.:"}

And the binding

> args <- map length `fmap` getArgs

evaluates to the “one”, global empty list at 0x00000000006db640/1:

    ConsClosure {info = StgInfoTable {ptrs = 0, nptrs = 0, tipe = CONSTR_NOCAF_STATIC, srtlen = 0},
                 ptrArgs = [],
                 dataArgs = [],
                 descr = "ghc-prim:GHC.Types.[]"}

And now we have, at 0x00007fdce19fe4c8, the concatenation of them, but unevaluated:

> let x = l ++ l2 ++ args

The thunk keeps a reference to l2 and args, but not l, as that is at a static address, unless you are running this in GHCi:

    ThunkClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = THUNK_2_0, srtlen = 1},
                  ptrArgs = [0x00007fdce19fe4b0/2,0x00000000006db640/1],
                  dataArgs = []}

Now to some more closure types. m and m' locally bound of type the unboxed type Int#, with values 42 resp. 23.

> let f = x n -> take (I# m + I# x) n ++ args
      t = f m' l2

So here is (0x00007fdce1937d50/2), referencing its free variables args and 42:

    FunClosure {info = StgInfoTable {ptrs = 1, nptrs = 1, tipe = FUN_1_1, srtlen = 65553},
                ptrArgs = [0x00000000006db640/1],
                dataArgs = [42]}

And t is a thunk that applies f (also referenced here) to an unboxed value (23) and l2:

    ThunkClosure {info = StgInfoTable {ptrs = 2, nptrs = 1, tipe = THUNK, srtlen = 0},
                  ptrArgs = [0x00007fdce19fe4b0/2,0x00007fdce1937d50/2],
                  dataArgs = [23]}

Lastly, here is the standard example for self reference:

> let x = id (:) () x

This is what x (0x00007fdce1947940) looks like, at least without -O:

    ThunkClosure {info = StgInfoTable {ptrs = 0, nptrs = 0, tipe = THUNK, srtlen = 1},
                  ptrArgs = [],
                  dataArgs = []}

So it is unevaluated. Let us evaluate it using seq. Now we have, still at 0x00007fdce1947940:

    IndClosure {info = StgInfoTable {ptrs = 1, nptrs = 0, tipe = BLACKHOLE, srtlen = 0},
                indirectee = 0x00007fdce194cc98/2}

The thunk was replaced by an indirection. If we look at the target, 0x00007fdce194cc98/2, we see that it is a newly created cons-cell referencing the original location of x:

    ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_2_0, srtlen = 1},
                 ptrArgs = [0x00000000006db620/1,0x00007fdce1947940],
                 dataArgs = [],
                 descr = "ghc-prim:GHC.Types.:"}

After running the garbage collector (performGC), we find that the address of x is now 0x00007fdce19f30d0/2 and that the self-reference is without indirections:

    ConsClosure {info = StgInfoTable {ptrs = 2, nptrs = 0, tipe = CONSTR_2_0, srtlen = 1},
                 ptrArgs = [0x00000000006db620/1,0x00007fdce19f30d0/2],
                 dataArgs = [],
                 descr = "ghc-prim:GHC.Types.:"}

Future plans

The output of ghc-heap-view is not really pretty yet; even the indentation in this blog post was added manually by me, so this really needs a pretty printer providing a nicer, possibly more compact representation, including something like what vacuum provides. Maybe vacuum can be ported to use this library, and also include the thunk’s and function’s references in the output. Maybe also the GHCi debugger can be extended to show more information about unevaluated expressions using this. Internally, the library is not very polished yet either. It only handles those closures types that I have seen so far, and is likely to break horribly if run in a threaded or debugging enabled runtime.

How it works

Obviously, this is not standard Haskell 98 code, but rather deep trickery involving the GHC API and some C code. Initially I tried to use the API that vacuum and the GHCi debugger rely on, which is an operation

unpackClosure# :: a -> (# Addr#, Array# b, ByteArray# #)

which takes any Haskell value and returns the address to its info table, the pointers and the non-pointer-data in the closure. Unfortunately, it was not complete in that it was meant only for data closures and will for other closure types, e.g. thunks, return no data and no pointers (as can be seen in the code). So I implemented my own version of this operation:

foreign import prim "slurpClosurezh" slurpClosure# :: Any -> (# Addr#, ByteArray#, Array# b #)

where the returned ByteArray# contains the complete closure, including extra information fields such as the arity of a function. The Array# is again the list of pointers in the closure. At first glance, this is a duplication, as the pointers are of course also contained in the ByteArray#. But as soon as the GHC runtime reigns again, a garbage collector run can happen, the referenced values will move somewhere else, and the words that once were pointers in the ByteArray# become useless. But the corresponding entries in the Array# are updated by the garbage collector, as it knows that these are pointers, and not just words. This way, we get both a faithful copy of the closure on the heap and useful references to the contained data. Here is a demonstration of this effect:

$ ghci -XMagicHash -package ghc-heap-view
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
[..]
Loading package ghc-7.4.1 ... linking ... done.
Loading package ghc-heap-view-0.1 ... linking ... done.
Prelude> let {a = [1,2,3,4]; b = 5:a}
Prelude> :m + GHC.HeapView 
Prelude GHC.HeapView> rawHeapData <- getClosureRaw b
Prelude GHC.HeapView> rawHeapData 
(0x000000004080d658,[1082185320,140040739366568,140040739365928],[0x00007f5dc68626a8,0x00007f5dc6862428])
Prelude GHC.HeapView> System.Mem.performGC
Prelude GHC.HeapView> rawHeapData 
(0x000000004080d658,[1082185320,140040739366568,140040739365928],[0x00007f5dc41b3ad8,0x00007f5dc41b3b28]) 

The function rawHeapData is a thin wrapper around slurpClosure# which turns the primitive array in normal lists. Note that the second component of the triple is unchanged, but the third is updated by the garbage collector. Of course this means that the Show instance for the data type that ghc-heap-view uses to reference values is not referential transparent either.

The foreign function import above is of type “prim”, i.e. does not call a C function but rather a Cmm function. Cmm is a reduced C that GHC uses internally to compile the Haskell code to, and most primitive operations are implemented in this language – although I do quickly call regular C from my Cmm code to do the more complicated stuff, mainly figuring out what words of the closure are pointers.

The knowledgeable reader might notice that I am passing a boxed value of type Any to the foreign function. This is currently not possible with foreign prim functions, and to actually use that code, you need the patch in GHC ticket #5931. But you can use ghc-heap-view without that as well (and the Cabal package will by default use that path), using the following hack to obtain the pointer to a Haskell value on the Heap as an unboxed type that can pass to the primitive operation:

foreign import prim "slurpClosurezh" slurpClosure'# :: Word#  -> (# Addr#, ByteArray#, Array# b #)
data Ptr' a = Ptr' a
aToWord# :: Any -> Word#
aToWord# a = case Ptr' a of mb@(Ptr' _) -> case unsafeCoerce# mb :: Word of W# addr -> addr
slurpClosure# :: Any -> (# Addr#, ByteArray#, Array# b #)
slurpClosure# a = slurpClosure'# (aToWord# a)

This works because a Word and a Ptr' have the same closure layout, only differing in the fact that one stores an a, and the other stores a Word#.

Once we obtained the raw representation of the closure, we do the parsing in Haskell. Using the info table and the raw closure, we have enough information to tell which words have to be replaced by the appropriate pointer (which might already have been updated by the garbage collector) in the pointers list.

This work was supported by a scholarship from the Deutsche Telekom Stiftung.


Flattr this post

February 28 2012

NervengiftLabs: Umzug – jetzt in Selbstverwaltung

Hier mal ein paar Worte zu meinem supertollen neuen Hoster Uberspace:

Eigentlich ist wordpress.com ja ganz nett, aber es nervt schon ein bisschen, wenn man nicht einmal Plugins (z.B. für Syntax-Highlighting) installieren kann.

hosted on asteroids

Außerdem wollte ich mir eigentlich auch schon seit längerer Zeit irgendwo einen V-Server zulegen, dass ich da so Sachen, wie ein EtherpadLite und ein immer laufendes irssi, draufpacken kann. War mir bisher aber zu teuer.

Doch letzten Samstag kam dann die Rettung: Ich hatte so nebenbei beim Surfen einen Podcast (raummaschine.de) auf den Ohren. Zugegebenermaßen war ich nicht sehr aktiv am Zuhören, aber als es darum ging, dass sie selbst bei Uberspace ihre Websites liegen haben, weil das da voll toll ist und man da selbst bestimmen kann, wie viel man zahlen will, wurde ich hellhörig und hab mir das gleich mal angeschaut.

Was kriegt man bei Uberspace?

Uberspace sind ein paar Linux-Systementwickler/ -admins, die nebenbei dieses shared-hosting anbieten. Sie machen das nicht aus kommerziellen Gründen, sondern als ihre “Spielwiese”, wie sie es selbst nennen.

Zur Verfügung hat man neben einem Webserver, Mails, MySQL und SFTP-Zugriff auch noch eine SSH-Shell (sogar mit ssh-keys), wo einem alle gängigen Skriptsprachen, wie Python, Perl, Ruby, Lua und mehr, cronjobs, und sogar die Gnu Compiler Collection und eine user-spezifische Paketverwaltung zur Verfügung stehen.

Man kann frei wählen, wie viel man zahlen möchte, das Minimum liegt bei 1€ pro Monat. Dazu lädt man einfach sein Uberspace-Konto per Überweisung auf und der eingestellte Betrag wird monatlich abgebucht. Der erste Monat ist sogar kostenlos.

Standardmäßig bekommt man dann eine Adresse nach dem Schema NAME.HOST.uberspace.de, also bei mir z.B. neuro.aquarius.uberspace.de, auch mit SSL/HTTPS. Man kann aber auch auf Anfrage seine eigene Domain benutzen; falls noch nicht vorhanden, kann man sie sich auch über Uberspace registrieren lassen. Das kostet dann einmalig 5€ und der Mindestbetrag pro Monat steigt um 0,50€.

Der Service ist einfach nur Spitze. Samstag Abend um halb 10 oder so, brauchte ich einen offenen Port für ein Skript. Meine Mail wurde innerhalb von 15 Minuten beantwortet und bearbeitet. Meine Domain war auch innerhalb eines halben Tages bestellt und aufgeschaltet (inklusive Subdomain-Extrawünschen für Soup und Dyndns). Wenn man Support will, dann spricht man da auch mit jemandem, der Ahnung hat, nicht so eine First-Level-Support-Trulla. Man hat regelmäßig das Bedürfnis, den monatlichen Betrag etwas zu erhöhen :)

Ach und habe ich erwähnt, dass die keine persönlichen Daten von euch wollen, weil sie die ja gar nicht brauchen? (Ausnahme ist, wenn ihr eine Domain haben wollt, aber dann wird das auch nur weitergegeben und nicht bei denen gespeichert)

Was mache ich auf Uberspace?

Meinen Blog hosten. Seht ihr ja :P

Außerdem habe ich noch ein EtherpadLite aufgesetzt, um allein, oder mit mehreren Leuten Dinge zu brainstormen. Eine Anleitung, wie man das installiert findet sich im Uberspace-Wiki. Im Prinzip nur Copy&Paste.

Dann habe ich noch in einem screen ein irssi laufen, so dass ich dauerhaft in manchen IRC-Channels online bin und mich einfach über ssh zum chatten oder backlog lesen da reinhängen kann.

February 26 2012

Zeitgeistaustreibung: Gedanken zu Crowdfunding

Das mit dem Crowdfunding ist nun beileibe nichts neues. Kickstarter gibt es auch schon seit 2008. Das erste abgeschlossene Millionen-Projekt hätte das LunaTik-iPod-Uhrenarmband sein können, das im Dezember 2010 mit 942.578 Dollar da stand. Und dann kam der Februar 2012. Das Elevation Dock, das Double Fine Adventure und der Order of the Stick Reprint. Letztere noch gar nicht abgeschlossen, alle aber über eine Millionen US-Dollar. Ein Dammbruch? Vielleicht, auch wenn der Einwand "Das sind doch Nerd-Projekte" natürlich gerechtfertigt ist.

Und doch: es tut sich was.
Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.