Samstag, Januar 31, 2015

My first ever patch for GDB

I have recently started contributing to KDevelop, my favorite free software IDE, effectively taking over maintainership of the GDB plugin. In the course of this work, I noticed a rather silly little thing in GDB.

Unfortunately, the current "Launch Configuration" dialog in KDevelop makes it rather easy to accidentally set a directory as the name of the executable to be launched. That's a whole issue in itself which needs to be addressed at some point. For now, my attention was caught by the following, rather self-contradictory error message:
(For the non-German-speakers: "Erfolg" means "success".) It turns out that this is not KDevelop's fault, as the second part of the error message is generated by GDB itself. So I dug into the sources to GDB, which I had lying around anyway, and was able to find and fix the cause of the confusion without too much effort. The result is bug #17911 and its attachment. It's a trivial patch, but it feels good anyway. Now it'll have to be picked up by some of the maintainers...

Donnerstag, Januar 29, 2015

Fun with references and bitfields in C++

Do you know C++ well? Then you'll surely know what this piece of code does:
#include <iostream>

struct Bitfields {
    unsigned int a : 3;
    unsigned int b : 29;
};

int main()
{
    Bitfields b;
    b.a = 2;
    b.b = 3;
    const unsigned int& r = b.a;
    std::cout << sizeof(Bitfields) << ' ' << r << std::endl;
    b.a = 4;
    std::cout << r << std::endl;
}
Go ahead, try it. A few days ago I would still have been convinced that this doesn't even compile. Then a student of mine ran into a problem with bitfields, and in tracking the problem down, we found out that it does - but with a surprising twist.

This is a story about one of the dark corners of C++.

Bitfields are a convenient feature. When you want to run a graph algorithm like Dijkstra and its extensions on a graph with tens of millions or even billions of nodes, reducing your node data structures from, say, 24 bytes to 16 bytes is a big deal. Sometimes this is possible because that 8-bit char really only needs 3 bits, and together with alignment issues these kind of savings can add up. Bitfields are convenient syntax for what one would otherwise have to do manually using bit shifts and masking operations.

Unfortunately, bitfields don't compose very well with other language features. For example, they don't have a byte-level address, so you cannot take pointers to them. Since you cannot take pointers to them, you cannot take references to them.

Wait, hold on, you can. But only const references. And what happens then is completely at odds with how references to variables work everywhere else in C++: a temporary object of the underlying non-bitfield type is allocated and initialized with the value of the bitfield. The reference then refers to that temporary. What?!

Once you recover from the shock, a perfectly plausible and sane story explains this insane behavior. Bitfields don't compose well with the rest of the language. This could be changed. The type system could be extended to cover bit fields properly. References to a bitfield of type unsigned int:7 could be represented as a pointer plus a bit-shift offset. Everything would make perfect theoretical sense... except that bitfields are only rarely used, and in mostly-C-looking code. They are already one of the premier sources of compiler bugs, and making everything involving a rarely-used feature like bitfields more complex is probably not going to help. Hence there isn't much interest in complicating things just to integrate bitfields properly. That's a perfectly reasonable and pragmatic decision to make.

Except that with generic programming and templates, a common pattern is that functions take const T& parameters - including functions like std::max, which one would very plausibly want to use with a value from a bitfield. If you cannot take references to bitfields, that's not possible - and that would become really annoying really quickly for the people who actually do use bitfields. So a pragmatic compromise is made: the bitfield value is copied to a temporary, and a reference to that temporary is passed to the function.

In fact, one might think of this as a special case of what happens when you combine an implicit type conversion with the fact that const references can bind to temporary return values of functions. Consider the following sample program:
#include <iostream>

struct Ops {
    unsigned int a;

    operator unsigned int() const {return a;}
};

int main()
{
    Ops o;
    o.a = 11;
    const unsigned int& s = o;
    std::cout << s << std::endl;
    o.a = 4;
    std::cout << s << std::endl;
}
This program prints 11 twice, because s ends up being bound to the temporary object that is returned by the custom type conversion operator. In 99% of all cases, this is exactly what you want, and suddenly, the behavior seems downright logical - except that when you see only the first example program above, printing the same number twice is a pretty crazy outcome.

I actually like C++ as a language. I think it occupies an important part of the design space for languages, and especially with the more recent developments, it does so quite well - but it definitely has its share of weirdness. The saving grace is that there is a reasonable story for why it behaves the way it does, and while the outcome is a bit crazy, it doesn't actually matter much in practice - unlike, say, JavaScript's Array.prototype.sort.

Mittwoch, Januar 28, 2015

Thoughts on the HoloLens

Last week, Microsoft publicly announced their take on augmented reality, the HoloLens. Some people are already complaining about the technically incorrect use of the term "holographic", but certainly the ostensibly live demo is impressive. The combination of an augmented reality display with Kinect-style gesture recognition could be a significant step further towards the non-dystopic part of a Minority Report-like future.

There is one important technical issue though that I'm worried the Microsoft marketing machine may be trying to bury. Think about how the visual system works: it's all about photons arriving in your eye at the right time in the right place. Usually, those photons are reflections off objects in the world around us. Augmented reality of the type that Microsoft claims to have built here must allow a mixture of such reflected photons and photons that are generated by a process similar to computer screens and projectors.

Here's the thing: All existing augmented reality systems are additive in terms of brightness. They always let the real-world photons through, and add their own augmented-reality photons to do their thing. This means, for example, that this type of system cannot show black text on a white (real-world) wall. It also means that augmented-reality objects appear transparent.

The demo video pretends that the augmented-reality objects are (or can be) opaque, but keep in mind that you're looking at a rendered simulation. What you see in the video is not really what the AR user is seeing, even though the presenter claims that it is. The fact that the "visor" of the systems appears so dark could also hint at a "solution" which simply decides to make the real world quite dark, so that the augmented-reality objects can stand out better.

Now the laws of physics allow one to build a "perfect" AR system that can show opaque objects. It requires building a lens that can filter the real-world photons out selectively, on a per-pixel basis. This kind of technology isn't crazy science-fiction; after all, we can manipulate matter on a nanometer scale. It's just that as far as I know, nobody has built such a thing yet, and if Microsoft have done so, then why are they so quiet about this issue in their announcement?

So who knows. Maybe I missed something in the announcement. For now, I'm skeptical.

Dienstag, Januar 27, 2015

Sado-Maso Europolitik

(Dieser Kommentar ist auch als Gastbeitrag auf Deliberation Daily erschienen.)

Anlässlich des Wahlergebnisses in Griechenland schreibt Stefan Sasse einen klugen Kommentar, in dem er unter anderem den wichtigen Hinweis gibt:
Die Belastungen, denen die Griechen ausgesetzt sind, sind in einer Demokratie auf die Dauer nicht zu ertragen, und für die Griechen gehen sie mittlerweile in die Halbzeit einer Dekade. Den Deutschen reichten seinerzeit zweieinhalb Jahre unter solchen wirtschaftlichen Bedingungen, um alle Demokraten zum Teufel zu wünschen und ihr Glück im Autoritarismus zu suchen.
Davor aber schreibt er:
Das BIP des Landes ist gewaltig eingebrochen, und mit ihm die Gehälter, Löhne und Sozialleistungen, auf denen der bisherige griechische Lebensstandard fußte. Man mag dies wie die meisten Staaten der Europäischen Union, Deutschland voran, als eine ökonomisch notwendige und schmerzhafte Anpassungsoperation sehen, an deren Ende ein gesundes Griechenland den Kampf um wirtschaftlichen Wohlstand erneut aufnehmen kann. In der Realität aber ist die Frage, ob diese Sicht richtig ist – die an dieser Stelle auch nicht beantwortet werden kann – völlig irrelevant.
Ich kann verstehen, dass Stefan dieses Fass an dieser Stelle nicht aufmachen wollte, aber die Frage ist alles andere als irrelevant. Wenn wir aus der ersten großen Wirtschaftskrise der Eurozone lernen wollen, müssen wir diese Frage richtig beantworten.

Da gibt es keinen Zweifel: Die deutsche Mainstream-Position ist gefährlicher, quasi-religiöser, und sadistisch-masochistischer Unfug.

Das ist drastisch formuliert, aber auf mehreren Ebenen gut begründbar. Zunächst ist die Position quasi-religiös: sie fußt nicht auf sauberer volkswirtschaftlicher Analyse, sondern auf dem unreflektierten Glauben an die Lehren der schwäbischen Hausfrau, die aber makroökonomisch nicht anwendbar sind. Ja, es gibt deutsche Ökonomen - auch akademischer Couleur - die im deutschen Mainstream schwimmen. International sind diese Ökonomen ziemlich isoliert.

Stefan hat bereits erklärt, wieso die Position gefährlich ist - siehe das Zitat eingangs.

Vor allem aber ist die Position Unfug, nämlich sachlich falsch. Es gibt Situationen, in denen ein Land tatsächlich wirtschaftlich schwierige Zeiten durchleben muss. Aber solche Situationen sehen anders aus, und können von Demokratien auch gut überlebt werden. Man denke zum Beispiel an Großbritannien oder die USA im Zweiten Weltkrieg. Die Anstrengungen des Krieges hatten drastische wirtschaftliche Konsequenzen, und die Menschen mussten tatsächlich "ihre Gürtel enger schnallen". Aber da waren die Gründe für jeden klar erkennbar, weshalb daraus keine Probe für die Demokratie wurde. Und, was auch noch auffallen sollte: es gab keine Arbeitslosigkeit. Im Gegenteil: wer immer irgendwie wirtschaftlich oder militärisch einsetzbar war wurde eingesetzt.

Warum konnte die Arbeitslosigkeit in Griechenland über 25% steigen? Es ist offensichtlich, dass es den Menschen in Griechenland besser ginge, wenn dort mehr Menschen arbeiten und daher mehr produziert würde. Tatsächlich ist Arbeitslosigkeit immer Verschwendung und nie zwangsläufig notwendig.

Wenn Griechenland 2009 aus dem Euro ausgetreten wäre, dann stünde das Land heute zweifellos deutlich besser da. Das lehren uns die historischen Erfahrungen, die vor dem Zweiten Weltkrieg mit der Aufgabe des Goldstandards gemacht wurden - der Austritt aus dem Euro wäre analog dazu. Ja, eine wieder eingeführte Drachme, oder wie auch immer die neue von Griechenland ausgegebene Währung dann genannt würde, hätte zunächst deutlich an Wert verloren. Aber gleichzeitig hätte die griechische Regierung die Handlungsfreiheit gehabt, um Vollbeschäftigung zu erreichen. Die Wirtschaft wäre wieder besser gelaufen, und eine Wirtschaft, die gut läuft, ist gleichzeitig eine flexiblere und anpassungsfähigere Wirtschaft.

Wenn ich Alexis Tsipras wäre, würde ich deshalb auch den griechischen Austritt als "nukleare Option" auf dem Verhandlungstisch belassen. Langfristig gesehen braucht Griechenland den Euro nicht wirklich. Aber die Eurozone braucht Griechenland als Mitglied, um langfristig zu überleben: ein "Grexit" würde in der nächsten Krise Nachahmer finden.

Wir stellen also fest: das griechische Leid ist unnötig, wenn man bereit ist, den Euro aufzugeben. Damit ist die deutsche Position sachlich falsch. Aber was, wenn man den Euro beibehalten will?

Die deutsche Position basiert auf einem Fünkchen Wahrheit. Wenn die relative Produktivität, insbesondere gemessen als Marktwert der produzierten Güter dividiert durch dafür gezahlte Gehälter und Löhne, zwischen zwei Ländern verschieden ist, dann führt dies mittelfristig zu einem Ungleichgewicht im Handel zwischen diesen Ländern. Wenn die Länder verschiedene Währung verwenden, dann führt dieses Ungleichgewicht zu einer Verschiebung des Wechselkurses, so dass sich die relative Produktivität und damit der Handel wieder ausgleicht.

Innerhalb der Eurozone gibt es keine Wechselkurse, so dass sich die Handelsströme nicht automatisch ausgleichen. Den Handelsströmen stehen in der Bilanz Geldströme gegenüber, so dass sich das (relativ gemessen) unproduktivere Land auf Dauer verschuldet.

In den meisten ähnlich gestrickten Situationen wird politisch ein direkter Ausgleich geschaffen, so zum Beispiel innerhalb Deutschlands ganz explizit durch den Länderfinanzausgleich. Es gibt aber auch einen impliziten Ausgleich durch die Steuern und Ausgaben der Bundesregierung, die einen signifikanten Teil der Wirtschaftsleistung ausmachen.

Zwischen Griechenland und dem Rest der Eurozone gibt es keinen direkten Ausgleich dieser Form. Die einzige Alternative wäre also ein Angleichen der relativen Produktivität. Hier behauptet die deutsche Position, dass dies nur möglich ist, indem die Löhne und Gehälter in Griechenland jahrelang nicht steigen oder sogar fallen. Das ist offensichtlich falsch, denn schließlich könnten die Löhne und Gehälter auch einfach in Deutschland (und einigen anderen Ländern) einige Jahre lang deutlich schneller steigen.

tl;dr: Die deutsche Position basiert auf den Irrglauben,
  1. dass der Ausgleich in relativer Produktivität durch griechisches Leid und Lohndumping geschehen muss anstatt durch Belohnung deutscher und anderer Arbeiter und Angestellter (weshalb ich die deutsche Position sadistisch-masochistisch nenne), und
  2. dass irgendein Währungsraum der Welt langfristig ohne politische Finanzausgleiche (egal ob explizit oder implizit) funktionieren könnte.

Montag, Januar 26, 2015

Ausländische Investitionen

Syriza hat die Wahlen in Griechenland mit deutlichem Abstand gewonnen. Typisch für der Herren eigener Geist, in dem sich unsere heutige Zeit spiegelt, sorgen sich die Verfechter der marktkonformen Demokratie um die verschiedenen wirtschaftlichen Konsequenzen des Wahlergebnisses. Zum Beispiel: Sieht es für ausländische Investitionen in Griechenland jetzt düster aus? Ich möchte dies als Anlass für ein paar grundsätzliche Überlegungen nehmen.

Lauscht man den Sonntagsreden der Politiker, dann gehört die Steigerung der Attraktivität des eigenen Landes für ausländische Investoren zu den wichtigsten Tugenden einer Regierung. Zeit für die Frage nach des Kaisers neuen Kleidern: Warum eigentlich?

Die oberflächlichen Argumente sind einfach: Da kommt jemand, stellt eine Fabrik o.ä. hin, und das schafft Arbeitsplätze. So weit richtig, sofern man mal von den vielen Beispielen der Enttäuschung absieht, in denen ein ausländisches Unternehmen mit zeitlich beschränkten Steuergeschenken angelockt wird. Wenn diese Geschenke dann auslaufen sind alle furchtbar überrascht, wenn sich das Unternehmen wieder verabschiedet.

Aber selbst wenn die Investoren bleiben, so bleiben sie nur, wenn und weil sie einen dauerhaften Profit darin sehen. Aus der Perspektive des Auslands sieht das super aus: Man schickt eine einmalige Geldsumme, und erhält anschließend einen potentiell ewig anhaltenden Geldstrom, ohne, dass man dafür eine Gegenleistung bieten muss. Dies ist schließlich das Wesen allen Profits und aller Kapitalerträge.

Dementsprechend schlecht sieht der Deal für das Land aus, in dem die Investition getätigt wird: Klar, am Anfang kommt da eine Geldsumme herein, und klar, da werden Arbeitsplätze geschaffen. Aber gleichzeitig verpflichtet sich das Land dazu, potentiell auf ewig einen Geldstrom ins Ausland zu schicken, ohne dafür eine Gegenleistung zu erhalten.

Auf einmal sehen ausländische Investitionen überhaupt nicht mehr so toll aus.

Es wird noch schlimmer: Braucht man die ausländischen Investitionen überhaupt, um die Arbeitsplätze zu schaffen? In vielen Fällen nein. Das nötige Geld für den Aufbau der Fabrik o.ä. kann auch im Inland zum Beispiel durch den Finanzsektor bereitgestellt werden. Die gleiche Produktion kann oft gewährleistet werden, ohne dass danach langfristig Geld ins Ausland fließt. Schlimmstenfalls fließen die gleichen Ströme an reiche Inländer, bestenfalls in Pensionsfonds oder in einen Staatsfonds à la Norwegen oder Alaska.

Ein schönes Beispiel für all diese Überlegungen ist die Ausbeutung Rohstoff-reicher armer Länder. Dort kommen ausländische Investoren und bauen Minen. Sie entziehen dem Land die Bodenschätze, aber die Gewinne kassieren Ausländer. Dabei könnten diese Länder prinzipiell die gleichen Minen selbst bauen. Sicherlich müssten sie anfänglich notwendige Maschinen aus dem Ausland kaufen - aber die langfristigen Gewinne würden sie selbst einkassieren. Es wäre genau das umgekehrte Bild: eine einmalige Geldsumme wurde anfänglich ans Ausland gehen, damit ein langfristiger Geldstrom an Gewinnen aus dem Ausland aufgebaut wird. Das sieht kurzfristig teuer aus, ist aber langfristig der intelligentere Weg. Manche Regierungen verstehen das auch.

Das Beispiel der Maschinen, zu deren Bau das technische Know-How zumindest anfänglich nicht im Inland verfügbar ist, zeigt auch, dass ausländische Investitionen unter bestimmten Umständen ein akzeptabler Kompromiss sein können. Zum Beispiel eben dann, wenn das organisatorische Know-How im Inland nicht verfügbar ist, und dafür gesorgt wird, dass diese Know-How im Zuge der Investition langsam aufgebaut wird. Letzteres zu garantieren ist aber ein extrem schwieriges Spiel mit dem Feuer.

Die Idee, sich für ausländische Investitionen attraktiv machen zu wollen, ist fehlgeleitet. Das heißt nicht, dass man sich abschotten muss. Es heißt erst recht nicht, dass man auf internationalen Handel verzichten sollte - das ist eine andere Geschichte. Aber es heißt eben, dass es besser für ein Land ist, wenn es Investitionen aus sich selbst heraus generiert. Daran sollte sich Politik orientieren.

Sonntag, Januar 25, 2015

Use .kateconfig for setting per-project indentation and tab settings in Kate

Everybody who has ever worked with source code knows: proper indentation is vital to keeping your sanity.

However, people cannot seem to agree on whether to use tabs or spaces (and if the latter, how many spaces) to use for indentation. This is unfortunate, because the obviously correct way of doing it is with tabs. The only reason why many people believe spaces are superior is because
  1. they want their indentation to look shorter than 8 fixed-width characters, the tab-width was not configurable back in the computing stone age, and people in general are incredibly conservative; and
  2. they fundamentally misunderstand the difference between indentation and alignment, and generally overuse alignment.
Having contributed my part to the eternal flame war, even more important than using tabs for indentation is having a consistent style within each project.

So what is a user of the Kate editor (like myself, who uses it as part of KDevelop) to do when faced with working in different projects with different styles? I recently discovered a feature of Kate that is not documented widely enough: It will search the full hierarchy of parent directories for a file named .kateconfig. So just put a .kateconfig file in the root directory of each project you're working on, containing a single line like the following:
kate: space-indent off; indent-width 4; replace-tabs off; tab-width 4; indent-mode cstyle;
And voilà, you're good to go!