Julius Plenz – Blog

So you want to write to a file real fast…

Or: A tale about Linux file write patterns.

So I once wrote a custom core dump handler to be used with Linux’s core_pattern. What it does is take a core dump on STDIN plus a few arguments, and then write the core to a predictable location on disk with a time stamp and suitable access rights. Core dumps tend to be rather large, and in general you don’t know in advance how much data you’ll write to disk. So I built a functionality to write a chunk of data to disk (say, 16MB) and then check with fstatfs() if the disk has still more than threshold capacity (say, 10GB). This way, a rapidly restarting and core-dumping application cannot lead to “disk full” follow up failures that will inevitably lead to a denial of service for most data handling services.

So… how do we write a lot of data to disk really fast? – Let us maybe rephrase the question: How do we write data to disk in the first place? Let’s assume we have already opened file descriptors in and out, and we just want to copy everything from in to out.

One might be tempted to try something like this:

ssize_t read_write(int in, int out)
{
    ssize_t n, t = 0;
    char buf[1024];
    while((n = read(in, buf, 1024)) > 0) {
        t += write(out, buf, n);
    }
    return t;
}

“But…!”, you cry out, “there’s so much wrong with this!” And you are right, of course:

An updated and semantically correct pattern reads like this (in a real program you’d have to do real error handling instead of assertions, of course):

ssize_t read_write_bs(int in, int out, ssize_t bs)
{
    ssize_t w = 0, r = 0, t, n, m;

    char *buf = malloc(bs);
    assert(buf != NULL);

    t = filesize(in);

    while(r < t && (n = read(in, buf, bs))) {
        if(n == -1) { assert(errno == EINTR); continue; }
        r = n;
        w = 0;
        while(w < r && (m = write(out, buf + w, (r - w)))) {
            if(m == -1) { assert(errno == EINTR); continue; }
            w += m;
        }
    }

    free(buf);

    return w;
}

We have a total number of bytes to read (t), the number of bytes already read (r), and the number of bytes already written (w). Only when t == r == w are we done (or if the input stream ends prematurely). Error checking is performed so that we restart interrupted syscalls and crash on real errors.

What about the bs parameter? Of course you may have already noticed in the first example that we always copied 1024 bytes. Typically, a block on the file system is 4KB, so we are only writing quarter blocks, which is likely bad for performance. So we’ll try different block sizes and compare the results.

We can find out the file system’s block size like this (as usual, real error handling left out):

ssize_t block_size(int fd)
{
    struct statfs st;
    assert(fstatfs(fd, &st) != -1);
    return (ssize_t) st.f_bsize;
}

OK, let’s do some benchmarks! (Full code is on GitHub.) For simplicity I’ll try things on my laptop computer with Ext3+dmcrypt and an SSD. This is “read a 128MB file and write it out”, repeated for different block sizes, timing each version three times and printing the best time in the first column. In parantheses you’ll see the percentage increase in comparison to the best run of all methods:

read+write 16bs             164ms      191ms      206ms
read+write 256bs            167ms      168ms      187ms  (+ 1.8%)
read+write 4bs              169ms      169ms      177ms  (+ 3.0%)
read+write bs               184ms      191ms      200ms  (+ 12.2%)
read+write 1k               299ms      317ms      329ms  (+ 82.3%)

Mh. Seems like multiples of the FS’s block sizes don’t really matter here. In some runs, the 16x blocksize is best, sometimes it’s the 256x. The only obvious point is that writing only a single block at once is bad, and writing fractions of a block at once is very bad indeed performance-wise.

Now what’s there to improve? “Surely it’s the overhead of using read() to get data,” I hear you saying, “Use mmap() for that!” So we come up with this:

ssize_t mmap_write(int in, int out)
{
    ssize_t w = 0, n;
    size_t len;
    char *p;

    len = filesize(in);
    p = mmap(NULL, len, PROT_READ, MAP_SHARED, in, 0);
    assert(p != NULL);

    while(w < len && (n = write(out, p + w, (len - w)))) {
        if(n == -1) { assert(errno == EINTR); continue; }
        w += n;
    }

    munmap(p, len);

    return w;
}

Admittedly, the pattern is simpler. But, alas, it is even a little bit slower! (YMMV)

read+write 16bs               167ms      171ms      209ms
mmap+write                    186ms      187ms      211ms  (+ 11.4%)

“Surely copying around useless data is hurting performance,” I hear you say, “it’s 2014, use zero-copy already!” – OK. So basically there are two approaches for this on Linux: One cumbersome but rather old and known to work, and then there is the new and shiny sendfile interface.

For the splice approach, since either reader or writer of your splice call must be pipes (and in our case both are regular files), we need to create a pipe solely for the purpose of splicing data from in to the write end of the pipe, and then again splicing that same chunk from the read end to the out fd:

ssize_t pipe_splice(int in, int out)
{
    size_t bs = 65536;
    ssize_t w = 0, r = 0, t, n, m;
    int pipefd[2];
    int flags = SPLICE_F_MOVE | SPLICE_F_MORE;

    assert(pipe(pipefd) != -1);

    t = filesize(in);

    while(r < t && (n = splice(in, NULL, pipefd[1], NULL, bs, flags))) {
        if(n == -1) { assert(errno == EINTR); continue; }
        r += n;
        while(w < r && (m = splice(pipefd[0], NULL, out, NULL, bs, flags))) {
            if(m == -1) { assert(errno == EINTR); continue; }
            w += m;
        }
    }

    close(pipefd[0]);
    close(pipefd[1]);

    return w;
}

“This is not true zero copy!”, I hear you cry, and it’s true, the ‘page stealing’ mechanism has been discontinued as of 2007. So what we get is an “in-kernel memory copy”, but at least the file contents don’t cross the kernel/userspace boundary twice unnecessarily (we don’t inspect it anyway, right?).

The sendfile() approach is more immediate and clean:

ssize_t do_sendfile(int in, int out)
{
    ssize_t t = filesize(in);
    off_t ofs = 0;

    while(ofs < t) {
        if(sendfile(out, in, &ofs, t - ofs) == -1) {
            assert(errno == EINTR);
            continue;
        }
    }

    return t;
}

So… do we get an actual performance gain?

sendfile                    159ms      168ms      175ms
pipe+splice                 161ms      162ms      163ms  (+ 1.3%)
read+write 16bs             164ms      165ms      178ms  (+ 3.1%)

“Yes! I knew it!” you say. But I’m lying here. Every time I execute the benchmark, another different approach is the fastest. Sometimes the read/write approach comes in first before the two others. So it seems that this is not really a performance saver, is it? I like the sendfile() semantics, though. But beware:

In Linux kernels before 2.6.33, out_fd must refer to a socket. Since Linux 2.6.33 it can be any file. If it is a regular file, then sendfile() changes the file offset appropriately.

Strangely, sendfile() works on regular files in the default Debian Squeeze Kernel (2.6.32-5) without problems. –

“But,” I hear you saying, “the system has no clue what your intentions are, give it a few hints!” and you are probably right, that shouldn’t hurt:

void advice(int in, int out)
{
    ssize_t t = filesize(in);
    posix_fadvise(in, 0, t, POSIX_FADV_WILLNEED);
    posix_fadvise(in, 0, t, POSIX_FADV_SEQUENTIAL);
}

But since the file is very probably fully cached, the performance is not improved significantly. “BUT you should supply a hint on how much you will write, too!” – And you are right. And this is where the story branches off into two cases: Old and new file systems.

I’ll just tell the kernel that I want to write t bytes to disk now, and please reserve space (I don’t care about a “disk full” that I could catch and act on):

void do_falloc(int in, int out)
{
    ssize_t t = filesize(in);
    posix_fallocate(out, 0, t);
}

I’m using my workstation’s SSD with XFS now (not my laptop any more). Suddenly everything is much faster, so I’ll simply run the benchmarks on a 512MB file so that it actually takes time:

sendfile + advices + falloc            205ms      208ms      208ms
pipe+splice + advices + falloc         207ms      209ms      210ms  (+ 1.0%)
sendfile                               226ms      226ms      229ms  (+ 10.2%)
pipe+splice                            227ms      227ms      231ms  (+ 10.7%)
read+write 16bs + advices + falloc     235ms      240ms      240ms  (+ 14.6%)
read+write 16bs                        258ms      259ms      263ms  (+ 25.9%)

Wow, so this posix_fallocate() thing is a real improvement! It seems reasonable enough, of course: Already the file system can prepare an – if possible contiguous – sequence of blocks in the requested size. But wait! What about Ext3? Back to the laptop:

sendfile                               161ms      171ms      194ms
read+write 16bs                        164ms      174ms      189ms  (+ 1.9%)
pipe+splice                            167ms      170ms      178ms  (+ 3.7%)
read+write 16bs + advices + falloc     224ms      229ms      229ms  (+ 39.1%)
pipe+splice + advices + falloc         229ms      239ms      241ms  (+ 42.2%)
sendfile + advices + falloc            232ms      235ms      249ms  (+ 44.1%)

Bummer. That was unexpected. Why is that? Let’s check strace while we execute this program:

fallocate(1, 0, 0, 134217728)           = -1 EOPNOTSUPP (Operation not supported)
...
pwrite(1, "\0", 1, 4095)                = 1
pwrite(1, "\0", 1, 8191)                = 1
pwrite(1, "\0", 1, 12287)               = 1
pwrite(1, "\0", 1, 16383)               = 1
...

What? Who does this? – Glibc does this! It sees the syscall fail and re-creates the semantics by hand. (Beware, Glibc code follows. Safe to skip if you want to keep your sanity.)

/* Reserve storage for the data of the file associated with FD.  */
int
posix_fallocate (int fd, __off_t offset, __off_t len)
{
#ifdef __NR_fallocate
# ifndef __ASSUME_FALLOCATE
  if (__glibc_likely (__have_fallocate >= 0))
# endif
    {
      INTERNAL_SYSCALL_DECL (err);
      int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0,
                                  __LONG_LONG_PAIR (offset >> 31, offset),
                                  __LONG_LONG_PAIR (len >> 31, len));

      if (! INTERNAL_SYSCALL_ERROR_P (res, err))
        return 0;

# ifndef __ASSUME_FALLOCATE
      if (__glibc_unlikely (INTERNAL_SYSCALL_ERRNO (res, err) == ENOSYS))
        __have_fallocate = -1;
      else
# endif
        if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP)
          return INTERNAL_SYSCALL_ERRNO (res, err);
    }
#endif

  return internal_fallocate (fd, offset, len);
}

And you guessed it, internal_fallocate() just does a pwrite() on the first byte for every block until the space requirement is fulfilled. This is slowing things down considerably. This is bad. –

“But other people just truncate the file! I saw this!”, you interject, and again you are right.

void enlarge_truncate(int in, int out)
{
    ssize_t t = filesize(in);
    ftruncate(out, t);
}

Indeed the truncate versions work faster on Ext3:

pipe+splice + advices + trunc        157ms      158ms      160ms
read+write 16bs + advices + trunc    158ms      167ms      188ms  (+ 0.6%)
sendfile + advices + trunc           164ms      167ms      181ms  (+ 4.5%)
sendfile                             164ms      171ms      193ms  (+ 4.5%)
pipe+splice                          166ms      167ms      170ms  (+ 5.7%)
read+write 16bs                      178ms      185ms      185ms  (+ 13.4%)

Alas, not on XFS. There, the fallocate() system call is just more performant. (You can also use xfsctl directly for that.) –

And this is where the story ends.

In place of a sweeping conclusion, I’m a little bit disappointed that there seems to be no general semantics to say “I’ll write n bytes now, please be prepared”. Obviously, using posix_fallocate() on Ext3 hurts very much (this may be why cp is not employing it). So I guess the best solution is still something like this:

if(fallocate(out, 0, 0, len) == -1 && errno == EOPNOTSUPP)
    ftruncate(out, len);

Maybe you have another idea how to speed up the writing process? Then drop me an email, please.

Update 2014-05-03: Coming back after a couple of days’ vacation, I found the post was on HackerNews and generated some 23k hits here. I corrected the small mistake in example 2 (as pointed out in the comments – thanks!). – I trust that the diligent reader will have noticed that this is not a complete survey of either I/O hierarchy, file system and/or hard drive performace. It is, as the subtitle should have made clear, a “tale about Linux file write patterns”.

Update 2014-06-09: Sebastian pointed out an error in the mmap write pattern (the write should start at p + w, not at p). Also, the basic read/write pattern contained a subtle error. Tricky business – Thanks!

posted 2014-04-30 tagged linux and c

Bookdump

Es hat sich mal wieder einiges angesammelt:

Robert A. Caro: The Power Broker – die monumentale Biographie einer Person und der Stadt, die er wesentlich prägte. Ich hatte vorher den Namen noch nie gehört, und war auch noch nie in New York City. Es ist mehr als beeindruckend zu lesen, wie ein so außergewöhnlicher Mensch sich durch politische Einflussnahme, Intelligenz, Willensstärke und Ausnutzung trivial scheinender Gesetzeslücken auf nicht-demokratische Weise in einem demokratischen System zum de-facto Alleinbestimmer über Bauvorhaben emporhebt und so die Realität des New Yorker Alltagslebens ganz entschieden bestimmt. (Achtung: Das Buch hat 1300 Seiten und wiegt gute 1,5kg, eignet sich daher nur bedingt zum Herumtragen…)

Auf Drängen eines Freundes habe ich eines von Hannah Arendts zentralen theoretischen Werken gelesen, Vita Activa (engl. The Human Condition). Mir gefiel ihr Stil nicht wirklich: Zu viel versucht sie zu „beweisen“, indem sie etymologische Ursprünge von Wörtern im Griechischen untersucht, oder Wort-Zusammensetzungen in anderen Sprachen analysiert und den entsprechenden Konnotationen intrinsische Wahrheit über die Begriffe abzugewinnen versucht.

Hermann Hesses Roman Das Glasperlenspiel ist eines der behutsamsten, intellektuell durchkonstruiertesten Geschichten, die ich gelesen habe. Die Hingabe und Aufrichtigkeit, mit der Joseph Knecht seiner Aufgabe als Glasperlenspielmeister nachgeht, ist so beeindruckend und einfach „schön“, die ganze Welt Kastaliens so liebevoll und detailliert porträtiert, dass ich das Buch kaum weglegen wollte – bis ich zu den Anhängen, den fiktiven Lebensläufen Knechts kam: die ich nur noch halbherzig überflogen habe; zu stark kommen die buddhistischen, spirituellen, wiederkehr-und-ganzheits-philosophischen Gedanken durch, die mir immer (auch bei anderen Autoren) als ausweichend, nicht tief gehend und verklärend sauer aufstoßen. Schade. (Mein früherer Mitbewohner Sergej, damals Mathematiker ein dutzend Semester über mir, schwärmte immer von der Kohomologietheorie als einem „wahren Glasperlenspiel“ – und nach der Lektüre weiß ich endlich, was er damit immer meinte, und bin geneigt, ihm zuzustimmen.)

Ein bisschen später habe ich noch Hesses Demian gelesen. Auch eine wunderschöne Geschichte.

Michel Houellebecq: Ausweitung der Kampfzone – Schreibstil und Protagonist gefielen mir nicht so gut, aber die Lektüre belohnt: Hie und da blitzen pointierte gesellschaftskritische Passagen auf, die es in sich haben – und die ich zumindest so schnell nicht vergessen werde.

Einen Klassiker unter den Abenteuerbüchern, Jon Krakauers Bericht einer im Frühjahr 1996 katastrophal endenden Mount-Everest-Expedition mit dem überaus passenden Titel Into Thin Air, habe ich an einem Abend bei Schnee und -10°C Außentemperatur verschlungen: extrem spannend. Minutiös und mit geschultem Blick für lokale Verhältnisse erläutert Krakauer nicht nur den Aufstieg, sondern auch die (meist abseits der zahlenden Bergsteiger stattfindende) Planung, Hintergründe seiner Mit-Bergsteiger und stellt nicht zuletzt auf fesselnde Weise dar, wie sehr der Menschliche Körper in eisiger Kälte und viel zu dünner Luft den letzten Rest eingebildeter Rationalität vergisst – ohne dasselbe überhaupt mitzubekommen. Ihm kommt außerdem die schwere Aufgabe zu, als einer der Überlebenden einer Expedition, an deren summit push day insgesamt 10 Leute ihr Leben ließen, auch bei sich selbst und den anderen Beteiligten Fehler festzustellen – und zu reflektieren, wie es möglich ist, nach so einem Vorfall wieder zurück ins „normale Leben“ zu kehren. Unbedingte Lese-Empfehlung.

Die Blendung von Elias Canetti hatte ich schonmal mit 18 Jahren angefangen und nach 100 Seiten gähnend weggelegt. Beim neuerlichen Lesen war das Buch eigentlich ganz gut: Ein schwacher Mittelteil – mir zu viele vorhersehbare und übertriebene Kopfgeburten der Leute –, aber starker erster und letzter Teil. Kann man schon lesen.

Den neuen Roman von Umberto Eco, The Prague Cemetary, war nicht so mein Fall.

Jewgenij Samjatins 200-Seiter Wir erschien schon 1920, das heißt vor Huxleys Brave New World und Orwells 1984 – und ich muss dem Nachwort zustimmen:

Dennoch bestehen grundlegende Unterschiede zwischen den drei Werken. Samjatins prophetische Leistung steht weit über der der beiden andern: Als er seinen Roman schrieb, existierte der Totalitarismus erst im Embryonalzustand – als Huxley schrieb, hatte die monopolkapitalistische Rationalisierung in Amerika ihren ersten Höhepunkt erreicht (Ford), als Orwell schrieb, stand der Stalinismus im Zenit der Macht. Dafür konnten die beiden Engländer das Antlitz der modernen Welt präziser und pointierter zeichnen.

Mit der Entwicklungshilfe und -politik ist es ja so eine Sache: Wie soll man die „dritte Welt“ behandeln? Direkte Hilfe? Hilfe zur Selbsthilfe? In Ruhe lassen? Was hilft eigentlich wirklich? – Im Wesentlichen geht es bei Entwicklungshilfe, wenn sie nicht in Waffenlieferungen besteht, fast immer um Länder, deren Bevölkerung großteils extrem arm ist: Die Menschen, die von weniger als einem US-Dollar am Tag leben. Die beiden Wirtschafts-Professoren Duflo und Banerjee analysieren in ihrem Buch Poor Economics, wie Wirtschaft in „arm“ funktioniert: Es gibt keine Banken (warum nicht? wer verleiht das Geld und zu welchen Zinssätzen?); es gibt keine gesundheitlichen und sozialen Sicherungssysteme (wie sparen für den Notfall? was, wenn die Ernte verdirbt?); das Risiko des totalen Bankrotts ist immer imminent (wie damit umgehen?). – Kurz: Wirtschaft funktioniert ganz anders, wenn man so gut wie kein Geld hat. Die Frage, die sich natürlich stellt ist: Gibt es Möglichkeiten, Institutionen oder Policies zu schaffen, um diese Zustände zu verbessern? Duflo und Banerjee kritisieren die „Monokultur-Ansätze“ von J. Sachs („Mehr Geld behebt das Problem“) und W. Easterly („Keine Hilfe zu geben lässt zu, eigene Lösungen zu finden“), und bewegen sich von Fall zu Fall durch verschiedene Lösungsansätze konkreter Probleme und bewerten die Wirksamkeit. Das ist das Ziel des Buches:

This book is an invitation to think again, again: to turn away from the feeling that the fight against poverty is too overwhelming, and to start to think of the challenge as a set of concrete problems that, once properly identified and understood, can be solved one at a time.

Leseempfehlung für alle, die sich mit Entwicklungshilfe auseinandersetzen wollen.

In den vergangenen Monaten habe ich Jonathan Franzen für mich entdeckt: Zuerst habe ich Freedom gelesen: locker und leicht, aber doch genug Dilemma, damit das Panorama nicht allzu beiläufig wirkt. An einigen Stellen wirkte der Roman recht autobiographisch. Man vergleiche das folgende Textfragment aus Freedom

In a pocket of his khakis was a handful of coins that he took out and began to fling, a few at a time, into the street. He threw them all away, the pennies of his innocence, the dimes and quarters of his self-sufficiency. He needed to rid himself, to rid himself. He had nobody to tell about his pain […]. He was totally alone and didn’t understand how it had happened to him.

Mit diesem Bericht (Archiviert) einer Reise Franzens in Deutschland:

Real anger, anger as a way of life, was foreign to me until one particular afternoon in April 1982. I was on a deserted train platform in Hanover. I'd come from Munich and was waiting for a train to Berlin, it was a dark grey German day, and I took a handful of German coins out of my pocket and started throwing them on the platform. There was an element of anti-German hostility in this, because I'd recently had a horrible experience with a penny-pinching old German woman and it did me good to imagine other penny-pinching old German women bending down to pick the coins up, as I knew they would, and thereby aggravating their knee and hip pains. The way I hurled the coins, though, was more generally angry. I was angry at the world in a way I'd never been before.

Daraufhin habe ich eine seiner Essay-Kollektionen, How to be Alone, gelesen. Sehr zu empfehlen! Der Mann kann wirklich gut schreiben, und schämt sich auch nicht, seine Schwächen öffentlich zu diskutieren. Aus Mr. Difficult (dem lustigsten der Artikel, der aber doch ziemlich ernst ist):

It’s hard to consider literature a medicine, in any case, when reading it serves mainly to deepen your depressing estrangement from the mainstream …

Und dann habe ich noch zur Abrundung The Corrections gelesen. Ein Panorama ähnlich Freedom, aber so langsam habe ich genug davon. Ich hole mir lieber noch einen weiteren Essay-Band…

Es gibt so Klassiker, die ich nie lese, weil ich das Thema nicht ansprechend finde. So ging es mir mit Harper Lees To Kill a Mockingbird, bis ein Freund mir das Buch auslieh und meinte ich müsste es lesen. Und ja, das ist ein beendruckend schönes Buch mit ungeahnter moralischer Komplexität.

Ich wollte ins Theater gehen, denn es wurde Dostojewskis Der Spieler aufgeführt. Aber die Vorstellung wurde kurzzeitig abgesagt, und stattdessen wurde Die Wirtin gespielt. Leider konnte ich doch nicht zu der Vorstellung gehen, und die Geschichte hat mir auch nicht wirklich gut gefallen. Aber da das Buch nun schonmal aufgeschlagen war, habe ich Der ewige Gatte gelesen, und das ist eine der gelungensten Kurzgeschichten des Autors, wie ich finde.

Ich war eine Woche in Dubai und hatte nichts zu lesen dabei, also war ich dort einkaufen: Roberto Bolaño: Woes of the true Policeman – Interessant vor allem für Leute, die 2666 gemocht haben (für die Biographie Arc(h)imboldis) – aber vielleicht auch als eigenständige (Fragment-)Lektüre insteressant. – Ernest Hemingway: A Farewell to Arms, nicht so sehr beeindruckend. Aber eine schöne Ausgabe mit 47 alternativen Enden. – Gustave Flaubert: Madame Bovary, die Geschichte startet so schön schnell: Junge schafft Studium nicht, dann doch, dann Heirat, dann Tod der bösen Frau, dann neue Heirat – und das alles in den ersten Kapiteln. Aber dann zieht sich die Handlung über die nächsten hundert Seiten so dermaßen, dass ich irgendwann keine Lust mehr drauf hatte. Ich bin vielleicht auch nicht die Zielgruppe.

Italo Calvino: Wenn ein Reisender in einer Winternacht – hätte man etwas kürzer, dafür aber besser machen können. Mehr meta.

Ich habe mich endlich mal an Thomas Mann gemacht. Die Buddenbrooks fand ich ziemlich langatmig, und an vielen Stellen zu kalt und distanziert, wenig einfühlsam, obwohl doch bewusst persönliches Drama geschildert werden sollte. Als Charakterisierung und Beschreibung des Niedergangs einer Familie aber natürlich meisterhaft. (Nachtrag 2014-05-21: Musil schreibt 1905 in sein Tagebuch: „Statt dessen las ich die Buddenbrocks [sic]. Sehr fein und langweilig; vielleicht meisterlich al fresco – aber langweilig; mitunter überraschend souverän.“)

Reiseliteratur neu definiert haben soll Bruce Chatwins Bericht über eine Expedition ins südliche Südamerika, In Patagonia. Ich war wenig beeindruckt, leider: Eine Aneinanderreihung von Geschichten und Begegnungen, aber keine davon hat mich wirklich berührt. Etwas Abenteuer ist natürlich auch dabei:

‘You could break a leg,’ she said, ‘or get lost and we’d have to send a search party. We used to ride it in a day, but you can’t get a horse through now.’

And all because of the beavers. A governor of the island brought the beavers from Canada and now their dams choked the valleys where once the going was clear. But still I wanted to walk the track.

Dazu in der ZEIT: Der Biberkrieg, wie die Biberplage in Feuerland eingedämmt werden soll.

Ich habe mich auch an James Joyce versucht: A Portrait of the Artist as a Young Man. Also damit konnte ich ja mal überhaupt nichts anfangen. Und noch ein Stück Weltliteratur, die ich irgendwie gar nicht verstehe: Gabriel García Márquez, Hundert Jahre Einsamkeit. Alle Leute heißen gleich, und ich kann mit der Geschichte gar nichts anfangen.

posted 2014-04-27 tagged bookdump

Embedding the Petersen Graph on the Cross Cap

Usually it’s really difficult to “show” what I do in mathematics, because to most people it’s just formulas – who cares if it’s topology or measure theory, it’s all the same. But I just finished a small project with a friend for a lecture called “Scientific Visualization”, and this is a result that you can just “watch”.

So, in case you have always been interested in the Petersen Graph and wondered how it is possible to embed it without edge intersection on the surface of the Cross Cap – well, I got a small report for you, and this animation:

(In case the <video> element fails in your browser, download it here: MKV (recommended) or MPG.)

posted 2014-04-11 tagged math

Besagter Lenz

Die Gärten sind nur noch zum Scheine kahl.
Die Sonne heizt und nimmt am Winter Rache.
Es ist zwar jedes Jahr dieselbe Sache,
doch es ist immer wie zum erstenmal.

(Aus: Erich Kästner, »Besagter Lenz ist da«, 1928)

posted 2014-03-02 tagged life

Musil

Ich habe in den letzten drei Monaten alle veröffentlichten Werke von Robert Musil gelesen, sowie zwei kleine Bücher mit Tagebuchfragmenten und Briefen des Autors. Irgendwie habe ich die Lektüre noch nicht in Gänze verarbeitet; aber vielleicht hilf es ein wenig, darüber zu schreiben, um ein bisschen zu beleuchten, was mich an diesem Autor fasziniert.

Man kommt bei Musil nicht umhin, ihn für seinen Stil zu loben: Wie mathematisch-präzise, wie realistisch! Niemals wird ein Ding ver-klärt, um es zu er-klären – lieber wird auf eine genaue Charakterisierung verzichtet zugunsten einer rigorosen, aber bruchstückhaften, teilweise zu keinem eindeutigen Schluss kommenden Behandlung.

Der Stil ist aber für Musil nur Mittel zum Zweck:

Ich wäre dem Publikum sehr dankbar, wenn es weniger meine ästhetischen Qualitäten beachten würde und mehr meinen Willen. Stil ist für mich die exakte Herausarbeitung eines Gedankens.

Musil ist generell sehr anstrengend zu lesen, und die Bücher liegen mir auch Monate nach der Lektüre noch sperrig im Kopf; ich konnte mir bisher kein abschließendes Urteil zu dem literarischen Werk dieses Autors bilden. Daher muss es an dieser Stelle genügen, ein paar Gedanken und Zitate zu den Büchern aufzulisten, in der Reihenfolge, in der ich sie gelesen habe.

Der Mann ohne Eigenschaften

Lang, in der Mitte fast einschläfernd, aber besonders im Nachhinein ein unglaubliches Buch. Die Präzision, mit der Musil schreibt, ist beeindruckend: Gedanken, die ich selbst schon wage hatte, werden dort so detailliert und umfassend dargestellt, dass ich mehrere Kapitel wieder gelesen habe und teilweise nach Tagen noch ein mir im Kopf herumspukendes Zitat rausgeschrieben habe. Wäre es nicht so lang, würde ich es gleich noch einmal lesen.

Die Hauptperson des Buches, der Mathematiker und Philosoph Ulrich, ist ein Charakter, der mir selbst sehr ähnlich scheint. Das ständige Es-könnte-auch-anders-sein, das sich immer Wiederholende Suchen nach strukturellen Gründen, nach ursprünglichen Prinzipien, die sich bei näherer Betrachtung als Trugschlüsse erweisen – dieses Ohne-Eigenschaften-Sein – aber in einem positiven Sinne! – trifft auch auf mich zu. Die Dinge passieren um uns, und wir werden geformt: nicht umgekehrt.

Ein Paradestück der Analyse ist zum Beispiel dieser Abschnitt aus dem Kapitel 34, Ein heißer Strahl und erkaltete Wände:

Im Grunde wissen in den Jahren der Lebensmitte wenig Menschen mehr, wie sie eigentlich zu sich selbst gekommen sind, zu ihren Vergnügungen, ihrer Weltanschauung, ihrer Frau, ihrem Charakter, Beruf und ihren Erfolgen, aber sie haben das Gefühl, daß sie betrogen worden seien, denn man kann nirgends einen zureichenden Grund dafür entdecken, daß alles gerade so kam, wie es gekommen ist; es hätte auch anders kommen können; die Ereignisse sind ja zum wenisten von ihnen selbst ausgegangen, meistens hingen sie von allerhand Umständen ab, von der Laune, dem Leben, dem Tod ganz anderer Menschen, und sind gleichsam bloß im gegebenen Zeitpunkt auf sie zugeeilt. So lag in der Jugend das Leben noch wie ein unerschöpflicher Morgen vor ihnen, nach allen Seiten voll von Möglichkeiten und Nichts, und schon am Mittag ist mit einemmal etwas da, das beanspruchen darf, nun ihr Leben zu sein, und das ist im ganzen doch so überraschend, wie wenn eines Tags plötzlich ein Mensch dasitzt, mit dem man zwanzig Jahre lang korrespondiert hat, ohne ihn zu kennen, und man hat ihn sich ganz anders vorgestellt.

Vergleiche auch die Fabel Kafkas Über die Einengung der Maus, in der die Katze sagt: „Du musst doch bloß die Laufrichtung ändern!“ – Der Abschnitt geht weiter mit:

Noch viel sonderbarer aber ist es, daß die meisten Menschen das gar nicht bemerken; sie adoptieren den Mann, der zu ihnen gekommen ist, dessen Leben sich in sie eingelebt hat, seine Erlebnisse erscheinen ihnen jetzt als der Ausdruck ihrer Eigenschaften, und sein Schicksal ist ihr Verdienst oder Unglück.

Im Nachhinein bleibt vor allem das Antiklimaktische des Buches hängen: Musil sagte selbst über den Roman: „Die Geschichte dieses Romans kommt darauf hinaus, daß die Geschichte, die in ihm erzählt werden sollte, nicht erzählt wird.“

Warum passierte denn nichts, warum fing Ulrich nichts mit seinen so wohldurchdachten Erkenntnissen an? Aber auch diese Frage wird ja beantwortet im Gespräch mit Agathe:

»Weshalb sind wir denn keine Realisten?« fragte sich Ulrich. Sie waren es beide nicht, weder er noch sie, daran ließen ihre Gedanken und Handlungen längst nicht mehr zweifeln; aber Nihilisten und Aktivisten waren sie, und bald das eine bald das andere, je nachdem wie es kam.

Gott ist tot: Das Nietzsche’sche Denken durchtränkt das Buch (explizit bei Clarisse; praktischer und struktureller bei Ulrich, der sich der Unzulänglichkeiten der Moral und der Unbestimmbarkeit von absolutem Gut und Böse längst verschrieben hat). Es ist auch ein gutes Stück Entfremdung darin, aber einer geistigen Art (also nicht im Marx’schen Sinne): Vielmehr eine Erkenntnis der Nicht-Erkennbarkeit der Welt, und auf diese Erkenntnis folgt nicht der Aufbau neuer Sinn-Kathedralen, sondern ein zerfaserndes, dielektisches Verneinen dessen, was „die Leute“ tun, ohne erkennbares Ziel außer wissenschaftlicher Strenge allem was „ist“ gegenüber.

Es ist definitiv ein philosophischer Roman – aber es fühlt sich ganz anders an, als wenn man Philosophie liest:

[Ulrich] war kein Philosoph. Philosophen sind Gewalttäter, die keine Armee zur Verfügung haben und sich deshalb die Welt in der Weise unterwerfen, daß sie sie in ein System sperren.

Und so bleibt alles fragmentarisch, aphoristisch, essayistisch – doch gleichzeitig vermittelt das Buch, dass dies die einzige Betrachtungsweise der Welt ist, die man zu rechtfertigen in der Lage ist. (Interessant, dass Ulrich gar keine zynischen Züge trägt.)

Vielleicht ist es das für mich bisher bedeutendste Buch, das ich gelesen habe.

Einige der Kapitel, gerade in der ersten Hälfte, kann man fast kontextlos lesen und verstehen. Zu empfehlen sind zum Beispiel:

Tagebücher und Briefe

Aus den Tagebüchern (Suhrkamp-Edition 1963): Beeindruckendes Essay-Fragment „Aus dem stilisierten Jahrhundert (Die Straße)“ über die 2x2=4-Welt der Leute, wie man diese Welt transzendiert und doch wieder erwacht, ohne den Finger darauf legen zu können, wie man „diesen Leuten“ eigentlich voraus ist (und ob man es überhaupt ist: doch das Gefühl bleibt).

Und immer wieder das Strukturelle, z.B. in folgender Selbstbeobachtung:

Am nächsten komme ich der Beschreibung meines Gedächtnisses (und auch meiner Phantasievorstellung) mit folgendem: Ich stelle in jeder Hinsicht unanschaulich vor, etwa in »Sachverhalten«. Ich merke mir auch selten Einzelheiten, sondern immer nur irgendeinen Sinn der Sache. Aus den Sachverhalten, die ganz formlos da sind, fast nicht da sind, bilden sich auf eine Weise, die ich nicht analysiert habe, die Aussagen.

Ich glaube, daß ich deshalb auch so schwer schreibe.

Und:

Ich sehe nicht ein, warum man in Begriffen sich verständigen soll, statt in Vorstellungen. Ich würde mich – vielleicht – lieber – in Vorstellungen verständigen, wenn es ginge. Man soll mir widersprechen.

Eine weitere Selbstbeobachtung:

Ich glaube, ich habe keine Moral. Grund: Mir wird alles zu Bruchstücken eines theoretischen Systems. Die Philosophie habe ich aber aufgegeben, so fällt die Berechtigung weg. Es bleiben nur: Einfälle. –

Das Musil-Lesebuch (Rowohlt 1991) muss man nicht unbedingt gelesen haben; Fragmente der Romane, die man besser ganz liest. Aber ein paar der bekannten kurzen Essays, die in dem Suhrkamp-Buch fehlen.

Die Verwirrungen des Zöglings Törleß

In der Neuausgabe des MoE von Anaconda waren einige OCR-Scan-bedingte Satzfehler; die habe ich an den Verlag geschickt, der sich prompt dafür bedankte, indem ich mir ein Buch meiner Wahl aus dem Sortiment aussuchen konnte: Den Törleß. (Übrigens eine schöne Ausgabe mit Leseband!)

Ich hatte das Buch einmal in der Schule gelesen, ohne mich darum zu kümmern. Tatsächlich ist es ein beeindruckendes Portrait einer Unsicherheit, die vielleicht nicht alle Menschen nur in der Pubertät ereilt: Die Welt zwischen Wissen und Fühlen, dass die Dinge eigentlich viel tiefer sind, als Umstehende ihnen zugestehen wollen. Interessant, wie die imaginären Zahlen, die – zumindest für einen Schüler – so berechtigungslos und doch nützlich in der Mathematik auftauchen, als Aufhänger dienen.

Erzählungen und Theaterstücke

Drei Frauen – „Grigia“ schön kafkaesk; die anderen beiden haben keinen Eindruck auf mich gemacht.

Vereinigungen – „Die Vollendung der Liebe“: Kann man die Genesis eines Gedanken überhaupt so genau beschreiben? Die Zugfahrt, während derer sie den Einfall eines Seitensprunges erhält, ist meisterhaft. – Die zweite Erzählung ist mir zu voll von „tierisch“ und tiefen, wabernden Gedanken, die irgendwann klein und hart und fest werden. Generell etwas, was mich in den frühen Werken stört, weil ich damit nichts anfangen kann.

Die Schwärmer (Theaterstück) – Schwer. Interessant. Schwer bestimmbare Charaktere. Ich würde die Wirkung des Stücks gerne mal auf der Bühne sehen. Zwei Zitate:

Alles hat einen Riß, wenn man klug ist und nicht glaubt?

Und:

Das menschlichste Geheimnis der Musik ist ja nicht, daß sie Musik ist, sondern daß es mit Hilfe eines getrockneten Schafdarms gelingt, uns Gott nahe zu bringen.

posted 2013-12-02 tagged bookdump and musil

Bookdump

Trotz meiner SciFi-Aversion habe ich auf mehrfache Empfehlung Orson Scott Caros (schon ziemlich altes) Buch Ender’s Game gelesen. Spannend! Der Film gefiel mir auch ganz gut – auch wenn man ihn viel besser versteht, wenn man das Buch gelesen hat: vieles wird nicht so klar herausgearbeitet. Hier ist noch ein interessantes Interview mit dem Autor.

Ab und zu finde ich in einer Grabbelkiste mal einen Roman von Ian Rankin, den ich noch nicht kenne: Doors Open ist ein nettes Buch über einen Kunstraub, und es ist nett, Rankin auch mal aus der Perspektive von nicht-Polizisten erzählen zu hören.

An einem Wochenende im September war ich in Kopenhagen, und obwohl ich zwei Bücher dabei hatte, war ich schon am Samstag mit ihnen durch. Wo findet man in Kopenhagen auf einen Sonntag Nachmittag ein englischsprachiges Buch? Der einzige Ort, wo ich tatsächlich Erfolg hatte, war dieses Cafe, das gleichzeitig ein Antiquariat ist. Selbiges hat am Sonntag geschlossen, aber es gibt ein paar Bücherregale, in denen sich Besucher ein Buch ausleihen (und dann auch käuflich erwerben) können. Das noch beste Buch, das ich fand, war ein mittlerweile nicht mehr lieferbares Buch von Richard Cox, The Katanga Run. Es geht um Ex-Fliegerkameraden, die einen alten Groll hegen, sich dann aber Anfang der 60’er Jahre im Kongo auf verschiedenen Seiten eines Konfliktes wiederfinden. Kein gutes Buch, und die Erzählung gipfelt darin, dass der UN-Generalsekretär unter mysteriösen Umständen abstürzt – aber keine Woche später lese ich die Meldung, dass die UN genau diesen 52 Jahre alten Fall neu untersuchen will, und beim Nachlesen über dieses Ereignis kam mir das Buch trotz seines Tom-Clancy-Stils historisch ziemlich akkurat vor. Zufälle gibt’s.

Das 2010 erschienene Buch von Bret Easton Ellis, Imperial Bedrooms, ist typisch und gut. Ich habe mir zu dem Buch notiert: „Beängstigend, wie profaniert und ent-menschlicht Leben werden können.“ – Wo ich schon bei Ellis war, musste ich ja auch mal das deutsche Pendant lesen: Leider aber ist Faserland von Kristian Kracht nicht so wirklich gut. Das Buch ist schon lesenswert, aber ich finde – so merkwürdig das klingt – am besten an diesem Buch noch den Titel. Neue Einsicht: Hanuta steht für „Haselnusstafel“ (das steht sogar auf Wikipedia!). (Nebenbemerkung: Die einzige noch bekanntere Abkürzung in dem Bereich ist denke ich mal „Haribo“, dessen Gründer ja kürzlich verstorben ist.)

Ein wunderschönes Buch ist Der Steppenwolf von Hermann Hesse. Ein kleines Zitat muss an dieser Stelle reichen:

Also, Harry, steh auf, lege dein Buch weg, seife dich ein, kratze dir das Kinn blutig, zieh dich an und habe ein Wohlgefallen an den Menschen!

Das erste Buch, was ich von Nassim Taleb gelesen habe, ist das kürzlich erschienen Antifragile. Teil Lebensphilosophie, Teil Wirtschaftsbuch kommt es ziemlich unwissenschaftlich, aber mit interessanten Einsichten daher. Wenn man nicht genau hinschaut, könnte man Taleb fast neophob nennen, und zumindest predigt er ein gutes Stück Konservativismus. Ich konnte dem Buch einige interessante Einsichten abgewinnen, gerade bezüglich der Vorteile von Optionalität gegenüber Sicherheit. Ein häufiger Kritikpunkt an Taleb ist, dass er zu selektiv und polemisch argumentiert, und eine rigorose Argumentation gelingt ihm nur selten. Aber als Denkanstoß ist das Buch sehr lesenswert, und das Ansinnen, „Antifragilität“ (das eben nicht nur Robustheit ist) als ein neues Wort im modernen Wortschatz zu verankern, ist lobenswert und in meinen Augen auch wichtig.

Ein Klassiker der Weltliteratur, der gut und überraschend einfach zu lesen ist: Vladimir Nabokovs Lolita. Viele Leute mögen das ja als schlecht verpackte Pornographie bezeichnen, aber der Rahmen, in den das Buch eingeschlossen ist und insbesondere die zweite Hälfte der Geschichte sind in meinen Augen viel interessanter und wichtiger als die Pädophilie des ersten Teils (auch wenn die Leichtigkeit des Ausdrucks manchmal sehr unpassend und grausam wirkt). Besonders beim Nachwort des Autors musste ich doch ziemlich lachen, hier mal ein Absatz:

Gewisse Techniken in den ersten Kapiteln vom Lolita (so zum Beispiel Humberts Tagebuch) verführten einige meiner ersten Leser zu der irrigen Annahme, daß der vorliegende Roman ein schlüpfriges Buch wäre. Sie erwarteten eine zunehmende Folge erotischer Szenen; als diese aufhörten, hörten auch die Leser auf und waren gelangweilt und enttäuscht. Das ist, vermute ich, einer der Gründe, warum nicht alle vier [vorher erwähnten] Verlage das Typoskript bis zum Ende gelesen haben. Ob sie es pornographisch fanden oder nicht, interessierte mich nicht. Ihre Weigerung, das Buch anzukaufen, gründete sich nicht darauf, wie ich mein Thema behandelte, sondern auf dieses Thema selbst, denn wenigstens drei Themen gibt es, die für die meisten amerikanischen Verleger absolut tabu sind. Die beiden anderen sind: eine Heirat zwischen Schwarz und Weiß, die zu einer glücklichen Ehe mit einer Unzahl von Kindern und Enkelkindern führt; und der absolute Atheist, der ein glückliches und nutzbringendes Leben führt und mit hundertsechs Jahren sanft entschläft.

Von einem Freund geschenkt, habe ich Arno Orzesseks Erstling Schattauers Tochter gelesen. Puh also naja – das Buch war schon spannend, die Geschichte interessant, und ich will jetzt auch nicht spoilern, nur um einen Kritikpunkt zu machen: Aber alles in Allem wirkte der Roman in etwa so wie man erwarten würde, dass der erste Roman eines studierten Literaturwissenschaftlers aussieht – es ist bekannt, welche Erzählformen gut kommen, welche Themen den Kanon zeitgenössischer (Aufarbeitungs-)Literatur bestimmen, es wird ein wenig mit Formulierungen experimentiert und wie man einen Spannungsbogen zum Schluss bringt weiß der Autor sowieso. Mir war vieles einfach zu vorhersehbar, die Charaktäre zu sehr nach den Notwendigkeiten ihrer Position in der Handlung gezeichnet, insgesamt: zu viel Reißbrett.

Von den beiden CCC-Sprechern Frank Rieger und Constanze Kurz habe ich an einem arbeitsfreien Samstag das neue Buch Arbeitsfrei gelesen: Sehr spannende Einblicke in moderne Produktionssysteme. Ich versuche immer noch eine Primärquelle (oder besser noch ein Video!) für diese Silos zu finden, die bei der Anlieferung jedes einzelne Weizenkorn auf Mutterkornspuren untersuchen, das ist wirklich unglaublich.

Auf Anempfehlung eines Freundes habe ich von Edgar Hilsenrath den Roman Das Märchen vom letzten Gedanken über den Genozid der Armenier während des ersten Weltkrieges gelesen. Ein sehr interessanter Erzählstil; insgesamt gefiel mir das Buch auch gut, aber es war in Teilen doch zu repetitiv und langatmig. Ehrlich gesagt hatte ich vor der Lektüre nicht einmal von diesem Völkermord gewusst.

Das kürzlich erschienene neue Roman von Robert Harris, An Officer and a Spy, ist insgesamt ziemlich lesenswert. Die Dreyfuß-Affäre bestimmt ja auch nicht unwesentlich die Handlung in Prousts Recherche, und ich hatte mir nie wirklich die Zeit genommen, intensiv über die damals herrschende Gesinnung der Franzosen zum Militär und zu den jüdischen Mitbürgern nachzulesen – und gerade dieses Defizit füllt der Roman gut aus. Anfang etwas holprig für meinen Geschmack, und natürlich dafür, dass das ein Jahrelang schwelender Konflikt war, recht kurz.

posted 2013-12-01 tagged bookdump

Impressionen aus Kirgistan

Ich war die zweite Septemberhälfte über in Bishkek, der Hauptstadt von Kirgistan. Dort habe ich Gerrit dabei unterstützt, einen achttägigen Scrum-Workshop zu veranstalten, der an der KSUCTA stattfand. Die dortige Informatik-Fakultät hat eine Partnerschaft mit der FH Zwickau (siehe hier für Details).

Bishkek ist so eine Stadt, die man am besten so beschreibt: Einer der nahen Vertrauten Lenins kam aus Bishkek, und deshalb wurde die Stadt aufgebaut zu einem Zentrum der Region mit viel Soviet-Pomp, breiten Straßen, und guter Infrastruktur – aber dann wurde Kirgistan Anfang der ’90er Jahre unabhängig, und seit dem geht alles langsam kaputt.

Man hat hier also auf der einen Seite diese gewaltigen Plätze mit heroischen Denkmälern:

– und auf der anderen Seite zumindest äußerlich komplett verfallene Soviet-Infrastruktur:

Diese Kontraste sind beeindruckend. Insgesamt ist die Stadt aber sehr entspannt. Klar, der Verkehr ist ziemlich abenteuerlich (und es kommt der Unfallrate auch nicht zu Gute, dass Kirgistan vor einigen Jahren erlaubt hat, auch japanische Autos – das heißt Rechtslenker – zu importieren, obwohl man im Land auf der rechten Seite der Straße fährt) – aber dank der schachbrettmusterartig angelegten Nord-Süd- und Ost-West-Straßen gibt es fast keine Staus und der Verkehr fließt ziemlich gut. Nur ist an einigen Tagen die Luft wirklich schwer zu atmen und voller unverbranntem Benzin. (Es gibt an den Tankstellen durchaus noch 80-Oktan-Benzin zu kaufen.)

Sobald man aus der Stadt heraus kommt, ist die Luft aber so frisch, und man ist, wo man auch hingeht, umgeben von Wasser und Bergen. Ich hatte das Glück, zwei Tage lang wandern gehen zu können.

Überall durch die Berge fließt Wasser: Manchmal kleine Rinnsale, manchmal ausgewachsene Flüsse mit mehr oder weniger abenteuerlichen Brückenkonstruktionen:

Teilweise läuft man Statuen oder anderen Steinmetzarbeiten über den Weg; meist aber nur Schaf-, Ziegen-, Kuh- und Pferdeherden (das ist besonders abends eher unentspannt, wenn die Herden über die Autobahnen getrieben werden).

Hauptsächlich ist es aber eins: idyllisch!

Ein Denkmal im Zentrum Bishkeks hat mich tief beeindruckt. Es erinnert an die Toten der Revolutionen von 2002 und 2010. Das Motiv ist klar: Abspaltung des Schlechten (schwarz) vom wesentlich größeren Guten (weiß) durch Revolution.

Was genau mich daran so fasziniert, ist etwas schwer auszudrücken: Auf gewisse Weise kristallisiert sich in dieser so plakativ simplen Darstellung des Gegensatzes von Gut und Böse einer der Grundirrtümer des sovietischen Sozialismus heraus: Dass Dinge auf zentralistisch–kollektivistische Weise ultimativ benennbar und zweifelsfrei entscheidbar sind, und dass das Schlechte einer Gesellschaft sich sozusagen aseptisch vom Guten abtrennen lassen kann; dass die Dinge nicht untereinander verflochten, vieldeutig und voller Widersprüche sind, die der Mensch nicht in der Lage ist, in aller Gänze zu erfassen.

posted 2013-10-01 tagged bishkek and kyrgyzstan

»La Recherche«

Fast den ganzen Sommer – 88 Tage, um genau zu sein – habe ich für die Lektüre von Marcel Prousts Auf der Suche nach der verlorenen Zeit gebraucht. Drei Monate also, in denen ich täglich ein bis zwei Stunden in der Belle Époque im Frankreich des ausgehenden 19. Jahrhunderts verbracht habe. Und nun, 4.195 Seiten später, ist das Abenteuer zu Ende. Was für eine Erfahrung!

Natürlich gibt es viel zu sagen zu einem solchen Buch, das regelmäßig als der »Roman der Romane« in den Listen der Bücher auftaucht, die man gelesen haben muss. Und auch ich erinnere mich noch gut, wie ich mit 18 Jahren – retrospektiv betrachtet war ich natürlich noch zu jung dafür – nach den ersten paar Dutzend Seiten (zunächst) ergebnisloser Landschftsbeschreibung das Buch gähnend weggelegt habe und mich Interessanterem gewidmet habe (wie es vermutlich Vielen geht, doch dazu weiter unten mehr) – und doch bin ich dadurch, dass mir in verschiedenen Kontexten immer wieder dieses Werk über den Weg lief Anfang dieses Sommers darauf gekommen, dass ich es doch noch einmal versuchen sollte. Angesichts des schieren Umfangs des Romans muss man sich nun einmal bewusst machen, dass das, was in einer 400-Seiten-Erzählung eine zehnseitige Exposition eines Vorortes samt seiner Bewohner ausmacht, hier entsprechend skaliert gute 100 Seiten ausmacht. Mit diesem Wissen gewappnet aber verliert man die Erwartungshaltung um eine sich nun doch hoffentlich bald herauskristallisierenden Handlung, und dieser Schritt tut dringend Not. Denn erst später – das heißt im zweiten, dritten, vierten Buch, und nicht mal dann in aller Gänze – erschließen sich dem Leser die zentralen Themen des Werkes. Wer aber so lange durchhält, wird reich belohnt.

Ich will aber hier nur einen zentralen Aspekt herausgreifen, und zwar den des Selbstmitleides des Protagonisten angesichts seiner Eifersucht. Schon früh erkennt ja der Leser, dass der Erzähler rückblickend seine damalige Weltsicht zu rekonstruieren versucht, zum Zeitpunkt des Aufschreibens aber schon sehr viel weiter ist mit seinen Gefühlen bezüglich der Liebe und Eifersucht gegenüber seiner Geliebten. Insbesondere ist schon zu dem Zeitpunkt klar, dass all diese den Erzähler so unglaublich leidend machenden Empfindungen späterhin vergessen sein werden. Genau dieser zeitliche Zusammenhang aber hat mich sehr mitgenommen: Es ist, als durchlebe man noch einmal im kleinsten Detail und mit Kenntnis der Zukunft diejenigen Leiden (und Fehler), die einen prägen, und die doch später als Gefühl, nicht jedoch als Erfahrung bedeutungslos geworden sind. Es ist in diesem Teil des Buches, dass der Erzähler eine große Wahrheit über die Welt, die Wesen, die sich in ihr bewegen und im Verhältnis dazu den Standpunkt des Betrachters erfährt:

Wir besitzen von der Welt nur formlose, fragmentarische Vorstellungen, die wir durch willkürliche Ideenassoziationen vervollständigen, aus denen sich gefährliche Suggestionen ergeben.

Wie aber kann man diese fragmentarischen Vorstellungen zu einem großen Ganzen zusammenführen? Am Ende des Buches, während der abschließenden Matinée, geht der Erzähler in einem vorausgreifenden Blick bereits auf die Kritiker seines Romans ein, als er sagt:

Da, wo ich die großen Gesetze suchte, glaubte man in mir jemanden zu sehen, der nach Einzelheiten grub.

Es ist genau dieses ständige Suchen nach Einzelheiten, um damit universelles zu illustrieren, das fasziniert. So sei in den Augen Adornos „Rettendes zu hoffen von der Rezeption eines Dichters, der das Exemplarische vereint mit dem Avancierten“.

Was mich durchaus irritiert hat bei der Nachlese zu diesem Buch war, wie sehr anscheinend meine Leseerfahrung von denen Anderer abweicht. Wird in den Feuilletons Proust angeführt, so zielt der Absatz fast unweigerlich auf die Erinnerung des Erzählers beim Genuss einer Madeleine oder des ihm vorenthaltenen Kusses der Mutter ab – beides Szenen, die zwar unglaublich detailliert im ersten Teil des ersten Buches dargestellt werden (und auf die später noch vielfach zurückgeblickt wird) – so als seien dies die zentralen Momente, die das Werk ausmachen. Mit Blick auf das gesamte Werk kommen mir gerade diese Stellen aber doch vergleichsweise wenig gehaltvoll vor. Die Aspekte des Romans, die ihn in meinen Augen großartig machen, sind vor allem die minutiös, in Zeit vor und zurück springend analysierten sozialen Dramen der Gesellschaft, durchaus nicht frei von Selbstironie; und natürlich der alles durchdringende Komplex von Liebe, Leidenschaft, Betrug und Eifersucht. Ist das nicht das, was den Leser an existentiellen Wahrheiten teilhaben lässt? Warum konzentriert sich also die Rezeption so sehr auf die unwillkührlichen Erinnerungen, die nun einmal punktuell und höchst individuell sind? – Vielleicht muss man den Grund darin suchen, dass einige dieser Autoren nicht weiter vorgedrungen sind als bis zu diesen Episoden; oder aber ich habe das Buch einfach mit einem ganz anderen Fokus gelesen.

Über einige Eindrücke bin ich während der Lektüre im Unklaren geblieben. Am Ende zumindest der ersten vier Bücher (bzw. den jeweils zwei Teilen, die sie ausmachen) hat mich jedes Mal ein Gefühl der Unvermitteltheit getroffen: Wie, aber die Geschichte geht doch gerade erst los?, habe ich jedes Mal gedacht. Ist das gewollt? Oder ist es das Gefühl eines Marathonläufers, der beim Anblick der Ziellinie denkt: Schon? – Des weiteren musste ich bei einigen Passagen herzhaft lachen und zuweilen auch den Kopf schütteln ob der Selbstreferenzialität, Provinzialität und Unfortschrittlichkeit der Personen und Gesellschaften. Es wirkt, als sei das sprichwörtliche Brett vorm Kopf sichtbar gemacht durch die Art und Weise, wie der Erzähler scheinbar teilnahmslos aus den »Skandalen« der lokalen gesellschaftlichen Prominenz berichtet, ganz im Stile Dostojewskis. Aber gerade diese »Unbeschwertheit« im Umgang mit Proust – dass man also über die Gesellschaftskarikaturen und den Autor selbst lachen kann – scheint nicht gerade unumstritten zu sein, meint Proust-Neu-Übersetzer Michael Kleeberg.

Wie viel muss man über Proust wissen, um das Werk gewinnbringend zu lesen? Ich habe im Nachhinein ein wenig in seiner Biographie gestöbert, fand das aber nicht wirklich aufschlussreich. Ja, je mehr man liest, desto mehr meint man, der Roman sei tatsächlich ein autobiografisches Kompendium. Aber ändert das etwas? Ich glaube nicht. – Im übrigen ist ausgerechnet Roland Barthes – von dem der einflussreiche Aufsatz »Der Tod des Autors« stammt – ein großer Proust-Anhänger gewesen, der der Meinung war, nach diesem finalen Monument des Romans habe es keinen Sinn mehr, einen weiteren zu schreiben, und seinen dahingehenden Versuch in Vorlesungsnotizen umgearbeitet hat.

Der Schriftsteller gebraucht nur ganz unaufrichtig in der Sprache der Vorreden und der Widmungen gewohnheitsmäßig die Wendung: ›Mein lieber Leser.‹ In Wirklichkeit ist jeder Leser, wenn er liest, ein Leser nur seiner selbst. Das Werk des Schriftstellers ist dabei lediglich eine Art von optischem Instrument, das der Autor dem Leser reicht, damit er erkennen möge, was er in sich selbst vielleicht sonst nicht hätte erschauen können. Daß der Leser das, was das Buch aussagt, in sich selbst erkennt, ist der Beweis für die Wahrheit eben dieses Buches, und umgekehrt gilt das gleiche, wenigstens bis zu einem gewissen Grad, da die Differenz zwischen den beiden Texten sehr oft nicht dem Autor, sondern dem Leser zur Last gelegt werden muss.

Wer die Zeit und Ausdauer hat, dem sei die Lektüre empfohlen.

posted 2013-08-27 tagged proust and bookdump

Bookdump

Dobelli: Die Kunst des klaren Denkens – Ganz nett für zwischendurch in der Bahn zum Lesen. Aber die referenzierten Werke (Kahnemann, Cialdini) sind natürlich wesentlich aufschlussreicher. – Melville: Moby Dick – Ein Klassiker, auch heute noch ist die Figur Ahabs Prototyp der Idee des verrückten und unnachgiebigen Anführers. Ich habe als Kind vermutlich eine vereinfachte Version gelesen, denn die Geschichte zieht sich ewig lang hin und ist in absolut ermüdendem, slang-durchsetzten Englisch geschrieben. Erstaunt hat mich, wie wissenschaftlich der Roman anmutet, und über Seiten die Genealogien gewisser Wahlgattungen ausgebreitet wird. (Das Buch erschien, als Darwin seine Evolutionstheorie noch nicht veröffentlicht hatte.)

William Gibson: Pattern Recognition – Mein zweiter Versuch Gibson zu lesen. Ganz interessant, aber für mich zu konfus. – Hunter S. Thompson: The Rum Diary – Das erste Mal, dass ich Thompson gelesen habe. Ganz lustiges Buch, und die Verzweiflung des Protagonisten kommt viel besser rüber als im gleichnamigen, kürzlich erschienen Film. – Charles Bukowskis erster und letzter Roman: Post Office und Pulp sind wie immer bei Bukowski, gute Unterhaltung. – Richard Price: Clockers ist irgendwie ziemlich länglich, aber ich habe es doch zu Ende gelesen. Gefühlt hat das Englisch in dem Buch auch ein bisschen auf meine Sprache abgefärbt. Der Film zum Buch ist nicht zu empfehlen.

Nachdem ich Aldous Huxleys Klassiker Brave New World wieder gelesen hatte und beeindruckt war, habe ich anschließend seine Utopie Island gelesen, und dann auch seine Abhandlung über die Ursprünge und Ausprägungen von Ewigkeitsphilosophie, The Perennial Philosophy, gelesen. Die Utopie hat mir ganz gut gefallen (ist nur etwas kitschig), aber mit seiner Faszination mit fernöstlicher Einheits- und Ewigkeits-Philosophie konnte ich überhaupt nichts anfangen.

Seit ich das kleine Büchlein Poststructuralism: A very short introduction gelesen habe, habe ich etwas für Kunst übrig. Siehe zum Beispiel die Kontroverse um Fountain.

Zwei Bücher habe ich gelesen, die mir wirklich gut gefallen haben. Zunächst Roberto Bolaños früher Roman The Savage Detectives. Ein Paradebeispiel für die nichtlineare/zirkuläre Erzählstruktur spanischer Literatur, ist das Buch lustig, spannend und voller Charaktere, an die man sich noch lange erinnern wird. Allein der Name der avant-gardistischen jungen Dichtertruppe, um die sich die Geschichte dreht: Visceral Realists, also sich auf tiefe, inwärts gerichtete und nicht dem Intellekt zugängliche Gefühle beziehende Realisten – ist eine geniale Wortkonstruktion. – Auf Empfehlung eines Bekannten habe ich Theodore Rozsaks Roman Flicker gelesen. Wenn man Umberto Eco mag, dann liegt man hier sicher nicht falsch. Eine grandiose Geschichte zwischen Wahn und Realität, die ich sicherlich nicht komplett auskosten konnte, weil mir viele der historischen Filmreferenzen fehlten. Lediglich das Ende ist ein bisschen mau.

Zwei Sachbücher habe ich gelesen, die allerdings so voller Fakten waren, dass es irgendwann ermüdend wurde und ich mir jeweils die letzten 200 Seiten gespart habe. Anders als auf dem Buchrücken von Made in Americe kann man Bill Bryson auch nicht beschreiben: „witty, learned, compulsive.“ – Das Kompendium The German Genius von Peter Watson ist ziemlich beeindruckend. Der Brite wählt einen Ansatz, den ich sehr wichtig finde: Zu zeigen, dass Deutsche Geschichte viel mehr ist als die Zeit ab der Machtergreifung Hitlers; insofern kümmert er sich statt dessen um die Aspekte der Kunst, Philosophie, Forschung, Sprache, Militärtechnik und sozialer Organisation der letzten 250 Jahre, die deutschen Ursprungs sind und bis heute bleibende Spuren in Europa und der Welt hinterlassen haben.

Ein Büchlein voller interessanter Fragen ist Ludwig Wittgensteins Philosophische Untersuchungen. Zum Beispiel solche wie diese hier:

226 – Nimm an, Einer folt der Reihe 1, 3, 5, 7, … indem er die Reihe der 2x+1 hinschreibt. Und er fragt sich: »aber tue ich auch immer das Gleiche, oder jedesmal etwas anderes?« Wer von einem Tag auf den andern verspricht »Morgen will ich dich besuchen« – sagt der jeden Tag das Gleiche; oder jeden Tag etwas anderes?

Das Buch durchzieht eine ständige Dialektik zwischen innerer Wahrnehmung und äußeren Umständen: Befolgt man eine Regel (zum Beispiel die der Arithmetik), wenn man glaubt, man befolge sie? Ist dies von außen überprüfbar? Ist überhaupt über den Begriff des Verstehens verhandelbar, d.h. kann man jemandem zugestehen, etwas verstanden zu haben, nur anhand stichprobenartiger Äußerungen, die konform mit der zu überprüfenden Regel gehen? – Es sind unter anderem solche Fragen, mit denen Wittgenstein sich auf beeindruckend spielerische Weise und mit vielen prägnanten Beispielen nähert. Und doch bleibt bei mir der Eindruck, nicht wirklich etwas „mitgenommen“ zu haben aus diesem Buch. Ist es, weil ich seit nunmehr vier Jahren in einer Welt der Mathematik lebe, in der es fast nur um Systeme ziemlich abstrakter Art geht, von der man notwendigerweise immer nur ein fragmentarisches Verständnis hat? In jedem Falle erscheinen mir viele dieser Fragen nicht wirklich in die Tiefe zu gehen. –

Und dann habe ich Auf der Suche nach der verlorenen Zeit von Marcel Proust gelesen. Dem widme ich aber einen eigenen Post.

posted 2013-08-27 tagged bookdump

Der Umstieg zu Neo

Vor einem Jahr habe ich angefangen, mit dem Neo-Layout statt wie vorher mit dem US-QWERTY-Layout zu tippen. Von den für mich sehr hilfreichen Erfahrungsberichten von Umsteigern geleitet – in deren Liste ich mich hiermit auch einreihen will – habe ich während meines Umstiegs in den ersten Tagen recht regelmäßig Protokoll geführt.

Tag 1 (12.08.): Wow, ich fühle mich komplett hilflos vor meinem eigenen Rechner. Für jeden Satz, den ich tippen will, brauche ich eine Minute und mehr. Passwörter einzugeben ist der Horror. Jede Tastenkombination, die sonst einfach „drin“ ist, geht voll ins Leere, besonders in Vim bekomme ich gar nichts hin; ich spiele sogar ein paar Configs kaputt, weil ich unabsichtlich die alte Taste „k“ drücke, aber da liegt nun „r“ wie „replace“. Ich habe eine erste Mail geschrieben (aber auf Kiswahili, d.h. mit untypischen Buchstabenanordnungen) – alles ist so anstrengend!

Tag 2 (13.08.): Mit viel Müh und Not kann ich mittlerweile tmux und Vim rudimentär bedienen. Die Wörter tröpfeln mittlerweile vor sich hin, manche Trigramme kommen schon ganz flüssig raus. Wenn ich nicht am Computer sitze, tippe ich teilweise unbewusst in Gedanken Wörter vor mich hin; wird mir das bewusst, dann bemühe ich mich, in Neo zu denken. In der Theorie kann ich zumindest die ersten zwei Ebenen auswendig, muss aber teilweise noch mehrere Sekunden überlegen, bevor ich lostippen kann. Für die dritte Ebene blende ich bei Bedarf den NeoLayoutViewer ein. Ab und zu bricht meine Konzentration plötzlich ein und ich tippe fünf Mal nacheinander auf die gleiche falsche Taste, bis ich mich zusammenreiße und nachdenke. – Alles in allem ist es sehr, wie eine neue Sprache zu lernen…

Tag 3 (14.08.): Alles geht ein bisschen besser und flotter. Nichts geht wirklich fehlerfrei. Heute habe ich bachelorarbeitsbedingt qualvoll langsam getext, und ich muss sagen: Den wirklichen Vorteil sehe ich da nicht – auf einer US-Belegung sind die wichtigen Sonderzeichen mindestens genau so gut zu erreichen… (Aktuelle Geschwindigkeit: 63 Tasten pro Minute.)

Tag 4 (15.08.): Horror: sieben Stunden bei der Arbeit, und ich bekomme nichts hin, alles dauert ewig. Keine Lust, mehr zu schreiben.

Tag 5 (16.08.): Noch ein Tag Arbeit. Irgendwie geht alles, aber gefühlt konnte ich vor zwei Tagen noch sicherer und schneller tippen…

Tag 9 (21.08.): Nachdem ich das Wochenende über nicht viel vorm Rechner saß, musste ich mich zu Beginn der Woche doch mal wieder an die Bachelorarbeit setzen. Mittlerweile bin ich nicht mehr so ganz gefrustet, und manche (selbst lange) Wörter schreiben sich schon wirklich flüssig. Das wird schon. (Mittlerweile ca. 120 KPM.)

Tag 14 (26.08.): Stichtag: Bis heute hatte ich mir Zeit gegeben, um zu entscheiden, ob ich weiter Neo tippen will. Ich würde das Experiment nicht als „gescheitert“ ansehen, aber ich bin mit 140 Tasten pro Minute noch weit hinter dem, was ich mit QWERTY geschafft habe. Diverse Di- und Trigramme kommen mittlerweile sehr flüssig – aber ich habe das Gefühl, dass ich doch irgendwie jedes Wort ein paar Mal tippen muss, bis ich es wirklich kann. Morgen wird es ernst, denn da veranstalte ich eine Schulung und muss zwei Tage lang am Beamer tippen…

Tag 104 (23.11.): Das Muscle Memory ist schon lange da: Ich kann mich nicht mehr erinnern, wo die Tasten vorher lagen, ganz natürlich finden meine Finger Tag für Tag ihren Weg. Ich vertippe mich gefühlt selten, aber meine Schreibgeschwindigkeit ist mit ca. 330 Anschlägen pro Minute noch immer erst bei ca. 2/3 meiner Geschwindigkeit von vor dem Umstieg.

Was ich schon früh zu schätzen gelernt habe ist die Mod4-Taste, die die vierte Ebene aktiviert: Hier kann man ohne umzugreifen mit den Cursor-Tasten navigieren, an den Anfang und das Ende der Zeile springen sowie Zeichen löschen. Das nutze ich sehr häufig auch in Vim im Insert-Mode, was ja normalerweise nicht als „die reine Lehre“ angesehen wird: Mit NEO muss man aber nicht umgreifen und die Homerow verlassen, so dass es viel schneller als ein zweifacher Mode-Wechsel ist. – Überhaupt Vim: Ich hätte nie gedacht – und das war auch der einzige Grund, warum ich nicht schon mal früher Dvorak gelernt habe – dass man Vim auch mit komplett umgestellten Tasten bedienen kann. Ich navigiere selbst häufig mit hjkl, auch wenn die Buchstaben denkbar merkwürdig dafür angeordnet sind. Man gewöhnt sich an alles. :-)

Tag 372 (19.08.): Vor ziemlich genau einem Jahr bin ich umgestiegen – und mittlerweile habe ich meine alte Tipp-Geschwindigkeit von knapp 470 Tasten pro Minute wieder erreicht. Das scheint nicht wirklich ein Fortschritt zu sein – zumindest auf den ersten Blick. Allerdings glaube ich, dass ich insgesamt schneller, besser und ergonomischer tippe: ich schaue nie mehr auf die Tastatur, ich muss für Pfeiltasten, Backspace, Escape und ähnliche Sequenzen Dank der Mod4-Taste meine Finger nur minimal bewegen. Insgesamt bin ich also ziemlich zufrieden mit meinem Umstieg.

Ein paar Anmerkungen zum Lernen:

Ein paar technische Bemerkungen zum Neo-Layout:


Ich möchte abschließend noch eine etwas philosophische Dimension dieses Umstieges thematisieren. Der Satz »Der Mensch gewöhnt sich an Alles« ist tiefgehender, als man denken könnte. Mir ist es innerhalb von wenigen Wochen gelungen, eine meiner zentralen Tätigkeiten komplett anders auszuüben. Dass das am Anfang frustrierend ist – und diese Notizen haben mich jetzt noch einmal ziemlich klar daran erinnern lassen, wie genervt ich war – ist natürlich zu erwarten. Aber wo ein Wille ist, ist auch ein Weg.

Genau wie die Anordnung der Buchstaben auf der Tastatur ziemlich arbiträr ist, und man von einer Anordnung auf die andere wechseln kann, weil keine der beiden eine inhärente „Wahrheit“ über Buchstaben und sprachliche Sätze enthält – genau so kann man auch Sprachen, Grammatiken, Denksysteme wechseln. Ich zum Beispiel sehe nun die Buchstaben K und H als ziemlich ähnlich an, weil ich sie mit dem gleichen Finger tippe und mich oft vertippt habe. Andere Leute können das vermutlich nicht nachvollziehen, und objektiv betrachtet ist mein Ähnlichkeitsgefühl auch absurd. Und doch lassen sich Effekte von Sprachverarbeitung auf die Realitätswahrnehmung feststellen.

Ich bin der Meinung, dass genau dieses Umwerfen gewisser fest geglaubter, aber tatsächlich arbiträrer Grundsätze ganz wichtig dafür ist, geistig nicht so schnell zu altern. Ein paar Ideen:

Oder, mit den Worten des Aphorismus Nr. 552 aus Nietzsches Menschliches, Allzumenschliches I, betitelt Das einzige Menschenrecht:

Wer vom Herkömmlichen abweicht, ist das Opfer des Außergewöhnlichen; wer im Herkömmlichen bleibt, ist der Sklave desselben. Zu Grunde gerichtet wird man auf jeden Fall.

posted 2013-08-19 tagged neo, linux and life

Views of the World

Have you ever read any of bin Laden’s writings? – Oh, you neither? – I didn’t even know he wrote anything substantial until today: I only remembered the bad-quality preaching video tapes aired after 9/11.

His writings are in part a very lucid criticism of US-American policies and practices. See, for example, this Letter to the American people from 2002. Disregarding all the cranky religious stuff, you’ll for example find these gems in Question 2, Part 2 (b) (xii):

(xii) […] All manners, principles and values have two scales: one for you and one for the others.

(a) The freedom and democracy that you call to is for yourselves and for white race only; as for the rest of the world, you impose upon them your monstrous, destructive policies and Governments, which you call the ‘American friends’. Yet you prevent them from establishing democracies. […]

(c) You are the last ones to respect the resolutions and policies of International Law, yet you claim to want to selectively punish anyone else who does the same. Israel has for more than 50 years been pushing UN resolutions and rules against the wall with the full support of America.

Differently structured and spiced with a bit of irony and cynism, this is straight-from-the-book Chomsky critique.

I searched for his writings in the first place because of this article from Ian Welsh:

The problem with [bin Laden’s] critique is that it is, substantially, accurate. Hate bin Laden or not, this is a model of the world which has predictive and analytical utility. It explains the past, it predicts the future, and it does both well. The fact that bin Laden’s critique is fairly similar to various left-wing critiques is not accidental. It is not because bin Laden and the left are fellow travellers (Islamists are strongly opposed to genuine leftists), it is because any set of model that track reality fairly well will tend to look alike. Of course, that they look the same is used to discredit people by association. “You agree with bin Laden” they say, and shut down discussion of how the world actually works.

The whole article is really worth reading.

posted 2013-08-09 tagged chomsky, politics and terror

An on demand Debugging Technique for long-running Processes

Debbuging long-running processes or server software is usually an “either–or”: Either you activate debugging and have huge files that you rarely if ever look at, and they take up a considerable amount of disk space – or you did not activate the debugging mode and thus cannot get to the debugging output to figure out what the program is doing right now.

There is a really nice quick and dirty Non-invasive printf debugging technique that just does a printf on a non-existent file descriptor, so that you can view the messages by strace-ing the process and grepping for EBADF.

I want to share here a few Perl code snippets for an approach that is a little neater IMO, yet a little bit more invasive. Consider a simple “server” doing some work, occasionally printing out a debug statement:

#!/usr/bin/perl

use strict;
use warnings;

sub Debug { }; # empty for now

while(1) {
    Debug("Here I am!");
    select undef, undef, undef, 0.1;
}

The idea is now to on demand create a UNIX domain socket where the process can write debug information to, so that (possibly a few) other processes can read and print out the debug info received on that socket.

We introduce a “global” structure $DEBUG, and a function to initialize and destroy the socket, which is named debug-<pid-of-process> and placed in /tmp.

my $DEBUG = {
    socket => undef,
    conn => [],
    last_check => 0,
};

sub Debug_Init {
    use IO::Socket;
    use Readonly;
    my Readonly $SOCKET = "/tmp/debug-$$";

    return if $DEBUG->{socket};

    unlink $SOCKET;
    my $s = IO::Socket::UNIX->new(
        Type => IO::Socket::SOCK_STREAM,
        Local => $SOCKET,
        Listen => 1,
    ) or die $!;
    $s->blocking(0);
    $DEBUG->{socket} = $s;
}

sub Debug_Cleanup {
    return unless $DEBUG->{socket};
    my $path = $DEBUG->{socket}->hostpath;
    undef $DEBUG->{socket};
    unlink $path;
}

When the process receives a SIGUSR1, we call Debug_Init, and to be sure we’ll clean up the socket in case of normal exit:

$SIG{USR1} = \&Debug_Init;
END { Debug_Cleanup; }

The socket is in non-blocking mode, so trying to accept() new connections will not block. Now, whenever we want to print out a debugging statement, we check if anyone has requested the debugging socket via SIGUSR1. After the first connection is accepted, we’ll only check once every second for new connections. For every accepted connection, we send the debugging message to that peer. (Note that UNIX domain sockets with Datagram type sadly do not support broadcast messaging – otherwise this would probably be easier.)

In case sending the message fails (probably because the peer disconnected), we’ll remove that connection from the list. If the last connection goes, we’ll unlink the socket.

sub Debug {
    return unless $DEBUG->{socket};
    my $s = $DEBUG->{socket};
    my $conn = $DEBUG->{conn};
    my $msg = shift or return;
    $msg .= "\n" unless $msg =~ /\n$/;

    if(time > $DEBUG->{last_check}) {
        while(my $c = $s->accept) {
            $c->shutdown(IO::Socket::SHUT_RD);
            push @$conn => $c;
        }
        $DEBUG->{last_check} = time if @$conn;
    }
    return unless @$conn;

    for(@$conn) {
        $_->send($msg, IO::Socket::MSG_NOSIGNAL) or undef $_;
    }
    @$conn = grep { defined } @$conn;

    unless(@$conn) {
        Debug_Cleanup();
    }
}

Here’s a simple script to display the debugging info for a given PID, assuming it uses the setup described above:

#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket;

my $pid = shift;
if(not defined $pid) {
    print "usage: $0 <pid>\n";
    exit(1);
}

kill USR1 => $pid or die $!;

my $path = "/tmp/debug-$pid";
select undef, undef, undef, 0.01 until -e $path;

my $s = IO::Socket::UNIX->new(
    Type => IO::Socket::SOCK_STREAM,
    Peer => $path,
) or die $!;
$s->shutdown(IO::Socket::SHUT_WR);

$| = 1;
while($s->recv(my $m, 4096)) {
    print $m;
}

We can now start the server; no debugging happens. But as soon as we send a SIGUSR1 and attach to the (now present) debug socket, we can see the debug information:

$ perl server & ; sleep 10
[1] 19731

$ perl debug-process 19731
Here I am!
Here I am!
Here I am!
^C

When we hit Ctrl-C, the debug socket vanishes again.

In my opinion this is a really neat way to have a debugging infrastructure in place “just in case”.

posted 2013-07-13 tagged linux and perl

So your favourite game segfaults

I’m at home fixing some things one my mother’s new laptop, including upgrading to the latest Ubuntu. (Usually that’s a bad idea, but in this case it came with an update to LibreOffice which repaired the hang it previously encountered when opening any RTF file. Which was a somewhat urgent matter to solve.)

But, alas, one of the games (five-or-more, formerly glines) broke and now segfaults on startup. Happens to be the one game that she likes to play every day. What to do? The binary packages linked here don’t work.

Here’s how to roll your own: Get the essential development libraries and the ones specifically required for five-or-more, also the checkinstall tool.

apt-get install build-essential dpkg-dev checkinstall
apt-get build-dep five-or-more

Change to a temporary directory, get the source:

apt-get source five-or-more

Then apply the fix, configure and compile it:

./configure
make

But instead of doing a make install, simply use sudo checkinstall. This will build a pseudo Debian package, so that at least removing it will be easier in case an update will fix the issue.

How can this be difficult to fix?! *grr*

posted 2013-06-14 tagged linux, ubuntu and rant

“nocache” in Debian Testing

I’m very pleased to announce that a little program of mine called nocache has officially made it into the Debian distribution and migrated to Debian testing just a few days ago.

The tool started out as a small hack that employs mmap and mincore to check which blocks of a file are already in the Linux FS cache, and uses this info in the intercepted libc’s open/close syscall wrappers and related functions in an effort to restore the cache to its pristine state after every file access.

I only wrote this tool as a little “proof of concept”, but it seems there are people out there actually using this, which is nice.

A couple of links:

My thanks go out to Dmitry who packaged and will be maintaining the tool for Debian – as well as the other people who engaged in the lively discussions in the issue tracker.

Update: Chris promptly provided an Arch Linux package, too! Thanks!

posted 2013-05-19 tagged linux and debian

Map Foraging

Mein Freund Kilian von der LMU hat sich zusammen mit zwei anderen Wissenschaftlern eine Studie ausgedacht, um die Visuelle Aufmerksamkeit von Teilnehmern zu testen. Ziel ist es, mit einem auf Google Maps basierenden Interface nach Tankstellen in Luftbildern zu suchen und diese zu markieren.

Die Studie ist offen für alle (sofern man über 18 ist und den GMaps-Nutzungsbedingungen zustimmt). Hier geht es zur Studie „Map Foraging“. Ein Hinweis: Bitte die einleitenden Texte sehr genau lesen – die Steuerung funktioniert nämlich nicht ganz so, wie man das von Google Maps gewohnt ist!

Ich selbst habe die Studie mehrmals hintereinander „gespielt“, einfach weil es wirklich Spaß macht.

posted 2013-05-11 tagged misc

Linkdump III

Ich sitze schon eine Weile auf diesem Artikel, der argumentiert, dass Überpopulation sich nicht als ein großes Problem darstellen wird in den kommenden Jahrzehnten. Jeffrey Sachs hatte ja argumentiert, man müsse die Weltbevölkerung bei ca. acht Milliarden Menschen stabilisieren, was ich nach wie vor für glaubhaft halte. – Mir erscheint der „No Population Bomb“-Artikel daher etwas zu optimistisch und technikgläubig. Und mal ehrlich: Dass Länder mit einem hohen BIP/Kopf eine stabile (oder stagnierende) Geburtenrate haben, war doch nicht neu?

„There is no alternative“ ist lesenswert mit interessanten Einsichten.

In the 1990s and the 2000s, right-wing parties were the enthusiasts of the market, pushing for the deregulation of banks, the privatisation of core state functions and the whittling away of social protections. All of these now look to have been very bad ideas. The economic crisis should really have discredited the right, not the left. So why is it the left that is paralysed?

Die Schadenfreude über den Reinhart–Rogoff-Fehler ist natürlich besonders in linken Kreisen verbreitet, aber Krugman fragt zu Recht:

Yet two big questions remain. First, how did austerity doctrine become so influential in the first place? Second, will policy change at all now that crucial austerian claims have become fodder for late-night comics?

Und dann habe ich heute einen interessanten Artikel über MMT gelesen. Ich wollte mich generell mal mit (Post-)Keynesianismus beschäftigen, weiß aber nicht wirklich, wo ich da anfangen soll.

Zum Schluss noch ein paar nachdenklich-wütende Worte zu Boston. Das im ersten Satz verlinkte Video ist wirklich ziemlich beunruhigend.

posted 2013-04-29 tagged linkdump

Internet Censorship in Dubai and the UAE

The internet is censored in the UAE. Not really bad like in China – it’s rather used to restrict access to “immoral content”. Because you know, the internet is full of porn and Danish people making fun of The Prophet. – Also, downloading Skype is forbidden (but using it is not).

I have investigated the censorship mechanism of one of the two big providers and will describe the techniques in use and how to effectively circumvent the block.

How it works

If you navigate to a “forbidden page” in the UAE, you’ll be presented with a screen warning you that it is illegal under the Internet Access Management Regulatory Policy to view that page.

This is actually implemented in a pretty rudimentary, yet effective way (if you have no clue how TCP/IP works). If a request to a forbidden resource is made, the connection is immediately shut down by the proxy. In the shutdown packet, an <iframe> code is placed that displays the image:

<iframe src="http://94.201.7.202:8080/webadmin/deny/index.php?dpid=20&
  dpruleid=7&cat=105&ttl=0&groupname=Du_Public_IP_Address&policyname=default&
  username=94.XX.0.0&userip=94.XX.XX.XX&connectionip=1.0.0.127&
  nsphostname=YYYYYYYYYY.du.ae&protocol=nsef&dplanguage=-&url=http%3a%2f%2f
  pastehtml%2ecom%2fview%2fc336prjrl%2ertxt"
  width="100%" height="100%" frameborder=0></iframe>

Capturing the TCP packets while making a forbidden request – in this case: a list of banned URLs in the UAE, which itself is banned – reveals one crucial thing: The GET request actually reaches the web server, but before the answer arrives, the proxy has already sent the Reset-Connection-Packets. (Naturally, that is much faster, because it is physically closer.)

Because the client thinks the connection is closed, it will itself send out Reset-Packets to the Webserver in reply to its packets containing the reply (“the webpage”). This actually shuts down the connection in both directions. All of this happens on the TCP level, thus by “client” I mean the operating system. The client application just opens a TCP socket and sees it closed via the result code coming from the OS.

You can see the initial reset-packets from the proxy as entries 5 und 6 in the list; the later RST packets originate from my computer because the TCP stack considers the connection closed.

How to circumvent it

First, we need to find out at which point our HTTP connection is being hijacked. To do this, we search for the characteristic TCP packet with the FIN, PSH, ACK bits set, while making a request that is blocked. The output will be something like:

$ sudo tcpdump -v "tcp[13] = 0x019"
18:38:35.368715 IP (tos 0x0, ttl 57, ... proto TCP (6), length 522)
    host-88-80-29-58.cust.prq.se.http > 192.168.40.73.37630: Flags [FP.], ...

We are only interested in the TTL of the FIN-PSH-ACK packets: By substracting this from the default TTL of 64 (which the provider seems to be using), we get the number of hops the host is away. Looking at a traceroute we see that obviously, the host that is 64 - 57 = 7 hops away is located at the local ISP. (Never mind the un-routable 10.* appearing in the traceroute. Seeing this was the initial reason for me to think these guys are not too proficient in network technology, no offense.)

$ mtr --report --report-wide --report-cycles=1 pastehtml.com
HOST: mjanja                         Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.40.1                  0.0%     1    2.9   2.9   2.9   2.9   0.0
  2.|-- 94.XX.XX.XX                   0.0%     1    2.9   2.9   2.9   2.9   0.0
  3.|-- 10.XXX.0.XX                   0.0%     1    2.9   2.9   2.9   2.9   0.0
  4.|-- 10.XXX.0.XX                   0.0%     1    2.9   2.9   2.9   2.9   0.0
  5.|-- 10.100.35.78                  0.0%     1    6.8   6.8   6.8   6.8   0.0
  6.|-- 94.201.0.2                    0.0%     1    7.7   7.7   7.7   7.7   0.0
  7.|-- 94.201.0.25                   0.0%     1    8.4   8.4   8.4   8.4   0.0
  8.|-- 195.229.27.85                 0.0%     1   11.1  11.1  11.1  11.1   0.0
  9.|-- csk012.emirates.net.ae        0.0%     1   27.3  27.3  27.3  27.3   0.0
 10.|-- 195.229.3.215                 0.0%     1  146.6 146.6 146.6 146.6   0.0
 11.|-- decix-ge-2-7.i2b.se           0.0%     1  156.2 156.2 156.2 156.2   0.0
 12.|-- sth-cty1-crdn-1-po1.i2b.se    0.0%     1  164.7 164.7 164.7 164.7   0.0
 13.|-- 178.16.212.57                 0.0%     1  151.6 151.6 151.6 151.6   0.0
 14.|-- cust-prq-nt.i2b.se            0.0%     1  157.5 157.5 157.5 157.5   0.0
 15.|-- tunnel3.prq.se                0.0%     1  161.5 161.5 161.5 161.5   0.0
 16.|-- host-88-80-29-58.cust.prq.se  0.0%     1  192.5 192.5 192.5 192.5   0.0

We now know that with a very high probability, all “connection termination” attempts from this close to us – relative to a TTL of 64, which is set by the sender – are the censorship proxy doing its work. So we simply ignore all packets with the RST or FIN flag set that come from port 80 too close to us:

for mask in FIN,PSH,ACK RST,ACK; do
    sudo iptables -I INPUT -p tcp --sport 80 \
       -m tcp --tcp-flags $mask $mask \
       -m ttl --ttl-gt 55 -m ttl --ttl-lt 64 \
       -j DROP;
done

NB: This checks for the TTL greater than, so we have to check for greater 56 and substract one to be one the safe side. You can also leave out the TTL part, but then “regular” TCP terminations remain unseen by the OS, which many programs will find weird (and sometimes data comes with a package that closes the connection, and this data would be lost).

That’s it. Since the first reply packet from the server is dropped, or rather replaced with the packet containing the <iframe> code, we rely on TCP retransmission, and sure enough, some 0.21 seconds later the same TCP packet is retransmitted, this time not harmed in any way:

The OS re-orders the packets and is able to assemble the TCP stream. Thus, by simply ignoring two packets the provider sends to us, we have an (almost perfectly) working TCP connection to where-ever we want.

Why like this?

I suppose the provider is using relatively old Cisco equipment. For example, some of their documentation hints at how the filtering is implemented. See this PDF, p. 39-5:

When filtering is enabled and a request for content is directed through the security appliance, the request is sent to the content server and to the filtering server at the same time. If the filtering server allows the connection, the security appliance forwards the response from the content server to the originating client. If the filtering server denies the connection, the security appliance drops the response and sends a message or return code indicating that the connection was not successful.

The other big provider in the UAE uses a different filtering technique, which does not rely on TCP hacks but employs a real HTTP proxy. (I heard someone mention “Bluecoat” but have no data to back it up.)

posted 2013-04-15 tagged censorship, security, dubai, linux and iptables

Linkdump II

Im Feuilleton der FAZ ist seit vorgestern die ungekürzte frankfurter Rede von George Soros zu lesen, und heute erschien ein Interview mit ihm. Ich finde ja, dass George Soros ein beeindruckender Mann mit Weitsicht ist, dem man zuhören sollte. (Und nebenbei bemerkt: Die „Lesermeinungen“ zu dem Interview sind ja sowas von unterirdisch…)

“I think this explains a lot about something that has always puzzled me: why the delay in resolving Cyprus after the Greek haircut?”

Exzerpt aus David Graebers neuem Buch. Mit interessanten Einsichten:

What if those currently running the system, most of whom witnessed the unrest of the sixties firsthand as impressionable youngsters, are—consciously or unconsciously (and I suspect it’s more conscious than not)—obsessed by the prospect of revolutionary social movements once again challenging prevailing common sense?

Und:

… but [politicians, CEOs, trade bureaucrats, and so forth] have succeeded magnificently in convincing the world that capitalism—and not just capitalism, but exactly the financialized, semifeudal capitalism we happen to have right now—is the only viable economic system. If you think about it, this is a remarkable accomplishment.

Erinnert mich an: “The greatest trick the devil ever pulled was convincing the word he didn’t exist.”

Zum Ende wird der Artikel etwas utopisch, wie der Titel “A Practical Utopian’s Guide to the Coming Collapse” ja schon vermuten lässt.

posted 2013-04-14 tagged linkdump

Bilder aus Dubai

Ich bin wieder in Berlin. Ich habe es keinesfalls bereut nach Dubai zu gehen, aber am Ende der Zeit wurde es mir doch ein bisschen langweilig. Ist nicht wirklich meine Stadt, auch wenn der Strand und das Essen vorzüglich sind.

Hier noch ein paar Bilder. Die Metro-Stationen sehen ziemlich futuristisch aus, und werden nonstop von innen gereinigt.

Das Burj Khalifa aus der Ferne…

… und der Blick vom 124. Stock runter:

Und in der Wüste war ich natürlich auch:

posted 2013-04-10 tagged dubai and life

Linkdump

Viel Zeit heute zum Lesen, auch wenn in Dubai kein Feiertag ist.

The science of obfuscation über Datensammler und absichtliche Verschleierung:

Obviously there is nothing inherently wrong with gathering data on individuals — it is lifeblood of the work of the epidemiologist, for example, and the starting point for many of the benefits mentioned above. It is in the combination of data gathering with authority and its interests where the problem begins. […] We don’t have access to the other databases, nor the techniques and the training in mathematics and computer science, to comprehend what can be done with seemingly trivial details from our lives and activities, and how they can provide more powerful, total and revealing analyses than we could have anticipated [14]. The inconsequential and even benign can quickly become the problematic and sinister.

Wenn ihr euch fragt, was Mathematiker eigentlich so machen, wenn sie ein gewisses Level erreicht haben: Diese Staubsaugeranalogie hilft weiter. So lustig es klingt, so wahr ist es auch.

Ein paar Gedanken zur Zeitumstellung und dem Konzept des „sozialen Jetlag“.

Hier spricht mal ein Insider darüber, dass das Problem der Finanzkrise natürlich kein Liquiditätsproblem ist, auch wenn man das jetzt noch nicht zugeben kann.

Während in Portugal der Besitz von geringen Mengen von Drogen seit 12 Jahren straffrei ist and die Bilanz recht gut aussieht, importiert man in UK schon Chinesen, um Amphetamine aus nicht staatlich kontrollierten Substanzen herzustellen.

Interessanter Artikel der ehemaligen Redenschreiberin von Zuckerberg über das neue Buch der COO von Facebook, Sandberg: Feminism’s Tipping Point: Who Wins from Leaning in?:

Sandberg’s book, very strategically, makes no mention of feminist critiques of Facebook, and instead imagines a feminist platform where women’s problems with undercompensation and sexism lie in women themselves, thus negating the need to change Facebook’s operations. In this way Sandberg is able to deploy Facebook’s oft-used tactic of building an in-house version of a competitive product, a move traditionally deployed against apps, against competing feminisms.

Greg Palast über den Irak und das Öl

Ich habe das Harlem-Shake-Video ja noch nicht gesehen, aber anscheinend war das im wesentlichen Fabrikation. Siehe auch: Wie die Reddit-Kultur sich als Werbevehikel missbrauchen lässt. (Wobei es da natürlich auch immer grandioses zu finden gibt.)

Und eine Studie belegt, dass das Klischee das zufriedenen, faulen Arbeitslosen ziemlicher Humbug ist.

Update 03. April: Hatte ich schon irgendwo abgelegt, aber erst heute gelesen: Sehr wichtiger Artikel von Morozov über Tim O’Reilly.

posted 2013-04-01 tagged linkdump

Gefühle und Meinungen respektieren

Was ich ja immer wieder faszinierend finde, ist die meist vollkommen unbemerkte und unreflektierte, aber in weiten Teilen der Bevölkerung vorherrschende Meinung, Atheisten hätten keine Meinungen oder Gefühle, die man respektieren müsste – während parallel dazu gefordert wird, doch toleranter gegenüber den Gläubigen des Islam/Christentum/Papst etc. zu sein, und ihre religiösen Gefühle zu schonen. DieStandard schreibt:

Das Ereignis Papst-Wahl verleitete viele Medien dazu, zu vergessen, dass nicht nur religiöse Gefühle verletzt werden können, sondern auch atheistische.

Das eine sind direkte Angriffe wie „Die Nichtgläubigen werden in der Hölle schmoren!“ und dergleichen; aber darum geht es mir nicht. Vielmehr geht es mir darum, wie ungleich hier argumentiert wird. Wenn Deniz Yücel seinen Kommentar über den neuen Papst beginnt mit:

Der neue Papst ist, den bislang vorliegenden Informationen nach zu urteilen, ein reaktionärer alter Sack wie sein Vorgänger, der seinerseits einem reaktionären alten Sack gefolgt war, der wiederum einen reaktionären alten Sack beerbt hatte.

… dann finden das die Autoren im Radio Vatikan Blog gelinde gesagt daneben:

[…] aber was gesagt werden muss, muss gesagt werden: Ihr seid dumm.

„Mimimi, die kritisieren unseren Glauben!“ – Mal ganz abgesehen davon, dass der neue Papst ein alter Sack ist und dass die katholische Kirche in ihren Strukturen so alt und verkalkt ist, dass man wohl in jedem anderen Gewerbe sagen würde: „wegschmeißen, aus den Fehlern lernen und neu anfangen“ – ganz abgesehen davon ist dies eine Art von Kritik, die nicht im geringsten anerkennt, wie sehr wir Atheisten jeden Tag für komplett dumm gehalten werden.

Wenn ich so als Atheist durchs Leben gehe, dann steht vor jeder religiösen Botschaft immer auch der Satz: „Wir halten euch alle für so dämlich und gutgläubig, dass ihr auch das Folgende akzeptieren werdet: …“. – Das fängt an bei Behauptungen wie dass die Kirche doch Ursprung und Bewahrer demokratischer Grundideale ist, geht weiter mit der Verbreitung rückständiger Sexual-, Moral- und Verantwortungs-Vorstellungen sowie Familienbildern und kulminiert natürlich in den diversen Mythen, die die Grundpfeiler monotheistischer Religionen ausmachen (insbesondere spielt meist ein eifersüchtiger Gott eine tragende Rolle).

So sieht die Realität aus, Tag für Tag. Und wenn mir jemand ernsthaft weismachen will, dass es keine intellektuelle Beleidigung ist, in einer renommierten Zeitung seitenlange Berichterstattung über einen Papst zu lesen, der im Jahre 2013 Abtreibung und gleichgeschlechtliche Beziehungen verbietet – anstatt eines Aufschreis ob der Rückständigkeit dieses Alten Sackes mitsamt seiner Institution – dann würde ich das gerne mal hören. Und bitte ohne die Worte „Tradition“, „althergebracht“ oder „weithin akzeptiert“ zu verwenden. Das wäre unsachlich.

posted 2013-03-20 tagged life and religion

Clay Shirky: How the Internet will (one day) transform government

posted 2013-03-19 tagged git

Locking a screen session

The famous screen program – luckily by now mostly obsolete thanks to tmux – has a feature to “password lock” a session. The manual:

This is useful if you have privileged programs running under screen and you want to protect your session from reattach attempts by another user masquerading as your uid (i.e. any superuser.)

This is of course utter crap. As the super user, you can do anything you like, including changing a program’s executable at run time, which I want to demonstrate for screen as a POC.

The password is checked on the server side (which usually runs with setuid root) here:

if (strncmp(crypt(pwdata->buf, up), up, strlen(up))) {
    ...
    AddStr("\r\nPassword incorrect.\r\n");
    ...
}

If I am root, I can patch the running binary. Ultimately, I want to circumvent this passwordcheck. But we need to do some preparation:

First, find the string about the incorrect password that is passed to AddStr. Since this is a compile-time constant, it is stored in the .rodata section of the ELF.

Just fire up GDB on the screen binary, list the sections (redacted for brevity here)…

(gdb) maintenance info sections
Exec file:
    `/usr/bin/screen', file type elf64-x86-64.
    ...
    0x00403a50->0x0044ee8c at 0x00003a50: .text ALLOC LOAD READONLY CODE HAS_CONTENTS
    0x0044ee8c->0x0044ee95 at 0x0004ee8c: .fini ALLOC LOAD READONLY CODE HAS_CONTENTS
    0x0044eea0->0x00458a01 at 0x0004eea0: .rodata ALLOC LOAD READONLY DATA HAS_CONTENTS
    ...

… and search for said string in the .rodata section:

(gdb) find 0x0044eea0, 0x00458a01, "\r\nPassword incorrect.\r\n"
0x45148a
warning: Unable to access target memory at 0x455322, halting search.
1 pattern found.

Now, we need to locate the piece of code comparing the password. Let’s first search for the call to AddStr by taking advantage of the fact that we know the address of the string that will be passed as the argument. We search in .text for the address of the string:

(gdb) find 0x00403a50, 0x0044ee8c, 0x45148a
0x41b371
1 pattern found.

Now there should be a jne instruction shortly before that (this instruction stands for “jump if not equal” and has the opcode 0x75). Let’s search for it:

(gdb) find/b 0x41b371-0x100, +0x100, 0x75
0x41b2f2
1 pattern found.

Decode the instruction:

(gdb) x/i 0x41b2f2
   0x41b2f2:    jne    0x41b370

This is it. (If you want to be sure, search the instructions before that. Shortly before that, at 0x41b2cb, I find: callq 403120 <strncmp@plt>.)

Now we can simply patch the live binary, changing 0x75 to 0x74 (jne to je or “jump if equal”), thus effectively inverting the if expression. Find the screen server process (it’s written in all caps in the ps output, i.e. SCREEN) and patch it like this, where =(cmd) is a Z-Shell shortcut for “create temporary file and delete it after the command finishes”:

$ sudo gdb -batch -p 23437 -x =(echo "set *(unsigned char *)0x41b2f2 = 0x74\nquit")

All done. Just attach using screen -x, but be sure not to enter the correct password: That’s the only one that will not give you access now.

posted 2013-03-12 tagged linux, c and security