Legend of Grimrock, altmodischer Crawler in neu
2012 einen Dungen-Crawler zu veröffentlichen, der abgesehen von der Grafik nur eine vorsichtig modernisierte Variante von Klassikern des Genres wie Eye of the Beholder ist, war ein gewagtes Experiment. Es scheint gelungen zu sein: Das Spiel bekam einen Nachfolger und Legend of Grimrock selbst erntete positive Reviews.
Ich tat mir mit dem Spiel anfangs allerdings ziemlich schwer. Ein Lands of Lore war das einzige Rollenspiel dieser Machart, das ich je gespielt hatte. Und es war keine zu positive Erinnerung, denn ich fand es zwar faszinierend, aber spätestens im Dschungelabschnitt wusste ich nie was ich machen sollte, verlief mich und starb. Ähnlich war mein erster Versuch mit Legends of Grimrock, als ich nach einer kurzen Weile schlicht an den Monstern scheiterte.
Jetzt motivierte mich aber der Blog The CRPG Addict mit seinen vielen Berichten über alte Rollenspiele, Grimrock nochmal eine Chance zu geben. Mittlerweile hatte ich auch verstanden, dass in diesem Genre Kämpfe aktiver geführt werden müssen als es erst scheint: Indem man immer um die Gegner herummanövriert kann man den meisten Schaden vermeiden. So sind die Gegner dann nicht mehr unbezwingbar, die anderen Mechaniken des Spiels werden erlernbar.
In Grimrock spielt man eine Gruppe von Abenteurern, die in einen Dungeon geworfen werden. Ihre einzige Hoffnung ist, ihn zu durchwandern und einen Ausgang zu finden beziehungsweise sein Mysterium zu lösen. Dabei ist der Dungeon unterteilt in mehrere Ebenen, immer musst du die Treppe in die nächstuntere finden.
Das beginnt simpel, mit wenigen langsamen Gegnern. Doch es zieht stetig an: Teleporter und Fallen kommen hinzu, mehr und stärkere Gegnertypen gilt es zu besiegen, mit immer besserer Ausrüstung und versteckten Schätzen (oft verborgen durch schwer zu sehende Schalter an den Wänden). Du musst Nahrung sammeln und die Helden versorgen, aber das Inventar ist nicht unbegrenzt groß und das Gewicht wird auch zum Problem. Solche Survivalelemente sind passend fürs Genre, aber erst in den letzten Jahren wiederentdeckt worden. Dazu kommen schließlich kompliziert werdende Rätsel.
Rätsel in Spielen sind immer ein zweischneidiges Schwert, so auch hier. Zu simpel, und man hätte sie sich auch sparen können. Zu schwer, und sie bremsen den Spieler komplett aus und zerstören jeglichen Spielspaß. Grimrock schafft es meistens, die richtige Balance zu finden. Doch einzelne Rätsel sind kaum zu lösen. So gibt es einen zwei Quadrate breiten Gang, den man in der richtigen Abfolge links/rechts entlanglaufen muss, sonst teleportiert er die Gruppe an den Anfang. Die richtige Schriftrolle mit einer Erklärung ist zwar vorher zu finden, aber kein Hinweis, dass genau an dieser Stelle die beschriebene Kombination anzuwenden ist. Ich war blockiert. Und wurde danach direkt nochmal blockiert: Denn auf dieser Ebene geht es erst weiter, wenn aus drei verteilten in die Wand gehauenen Altaren Gegenstände entnommen werden. Den zweiten davon brauchte ich aber nicht, weil mein Magier nur Feuermagie konnte, die Rolle aber einen Luftmagiespruch anbot. Also legte ich ihn zurück - und war wieder blockiert, bis ich schließlich die Lösung suchen musste. Altmodisch oder nicht, das ist einfach schlechtes Spieledesign.
Andererseits ist das Spiel trotz seiner betonten Altbackenheit ansonsten fair. Rätsel haben normalerweise erkennbare Lösungen, hat man das Kampfsystem einmal verstanden sind die Monster fordernd, aber besiegbar. Und der frustrierende Moment war nach dieser Situation: Während ich nach einem Levelaufstieg über die Skillpunktverteilung haderte, nachdem ich gerade erst die Ausrüstung neu verteilt hatte und dabei nicht wusste, ob der bei einem Treffer mehr Schaden verursachende Ogerhammer trotz der schlechten Genauigkeit oder die schwächere Streitkeule ohne Genauigkeitsmalus die bessere Wahl war, merkte ich: Hey, das ist ja wirklich wie in einem regulären Rollenspiel. Und hey, das macht sogar Spaß!
Legend of Grimrock hat eben hinter all dem Retroexperiment auch die Tugenden eines guten Computerrollenspiels. Die Gruppe des Spielers wird immer stärker, bekommt tolle neue Ausrüstung, die stärker ist und auch besser aussieht. Vor allem der Effekt der Skillpunkte ist wie so oft toll, wenn dann durch neue automatisch ausgelöste Attacken die Gegner viel schneller besiegt werden. Das motiviert. Die Hintergrundgeschichte wird sehr dezent erzählt, mit Notizzetteln und Traumsequenzen, aber sie ist da und hilft ebenfalls. Die vielen versteckten Schätze zu entdecken macht Spaß, wobei das fortwährende Absuchen der Wände nach versteckten Schaltern irgendwann auch nervig wird. Vor allem aber wird der Spieler selbst besser: Wenn mit etwas Erfahrung das Leveldesign lesbar wird, zum Beispiel wenn der Aufbau der Monsterköpfe an den Wänden vor einer Bodendruckplatte klar macht, dass man dort jetzt besser nicht drauftritt, sondern erstmal einen Stein hinlegt und ausweicht.
Insgesamt empfand ich Legend of Grimrock zwar durchaus auch als etwas mühselig, an einigen Stellen arg sperrig und verbesserbar. Aber es überwog, dass ich es interessant fand und es mich bis zum Spielende fesseln konnte. Wenn auch erst im zweiten Anlauf.
Katzenfutterautomat Honeyguaridan
Man beachte das Update unten
Der Honeyguaridan A36 ist eine Fütterungsmaschine für Katzen und Hunde. Programmierbar mit den Buttons bei dem Display oben lässt sich einstellen, wann wieviel Trockenfutter aus der Maschine kommen soll. Es gibt dafür sechs Slots, also könnten die Tiere sechsmal am Tag essen. Wieviel rauskommt wird in Portionen eingestellt, jede entspricht ungefähr 10 Gramm. 5 Gramm wäre eine bessere Portionsgröße (unsere bekamen zuvor abends 15g), aber 10g ist noch okay. Vor dem Füttern wird eine Audioaufzeichnung abgespielt – das halte ich für wichtig, so bekommen die Katzen ein klares Signal und müssen nicht rätseln, wann die Maschine anspringt. Das macht das Ganze aber auch nochmal lauter als der Mechanismus sowieso ist.
Mir war es wichtig, dass die Katzen nicht ans Essen kommen, dass die Futtermenge immer gleich ist und dass die Maschine kein Wlan hat, also auch keine App braucht. Außerdem kommt sie ans Stromnetz, so werden keine Batterien verschwendet, wobei man die optional nutzen kann. Das alles deckt der A36 ab.
Zusatz von wegen Stabilität: Natürlich habe die Katzen die erste und zweite Nacht über die Automaten gründlich bearbeitet. In dieser Phase hatte ich schwere Kochbücher draufgelegt, damit die Tiere den Automaten nicht umwerfen können. Die Bücher sind jetzt wieder weg, mittlerweile haben beide Katzen aufgegeben, die Automaten haben kein Futter preisgegeben.
Die Bedienung ist nicht super intuitiv, zum Beispiel war nicht klar dass der Deckel auf sein muss damit die Buttons funktionieren (es fehlte der erklärende Aufkleber). Aber mithilfe dieses Erklärvideos klappte es dann:
Wobei laut den Fotos auf Amazon eine neue Version mit anderen Buttons verkauft wird. Meine Automaten sind gebraucht gekauft und daher die ältere im Video gezeigte Variante.
Ich hatte nicht gesehen, dass sie sogar einen Splitter verkaufen um mit einem Automat zwei Tiere zu versorgen. Allerdings war in meinem Test ohne Splitter bei einer alternativen zweigeteilten Schale die Futterausgabe links und rechts nicht gleichmäßig, ich bezweifle daher, dass der Splitter fair funktionieren kann. Selbst wenn bräuchte ich mich nicht zu ärgern, denn zum Glück war der gekaufte zweite Automat kaum teurer als der Splitter.
Diese Automaten sind praktisch. Es geht weniger darum, dass sie Arbeit sparen – das Nassfutter müssen wir ja sowieso noch selbst geben. Aber da jetzt der Automat den Morgen und den späten Abend abdeckt, haben die Katzen keinen Grund mehr uns morgens zu wecken bzw abends zu nerven. Bewahrt vor allem das Wochenende, an dem sie sonst wie werktags frühmorgens von uns Futter erwarten würden. Ich hatte vor dem Kauf lange gezögert, zu lange denke ich jetzt.
Update 07.04.2022: Mittlerweile sind die Automaten hier eine Weile in Benutzung und haben ihre Schwächen preisgegeben.
Die umständliche Bedienung wird zum Problem, wenn man zwei Automaten hat. Deren Uhr zu synchronisieren ist schwierig, man muss zu zweit sein und sich genau abstimmen. Das sollte nicht nötig sein.
Einer der beiden Automaten blockiert mittlerweile öfter. Es ist nicht klar warum, in beiden ist das gleiche Futter drin, die Größe der Brocken kann nicht das Problem sein. Der Automat verteilt dann einfach kein Essen, was die eine Katze irritiert zurücklässt. Es leuchtet dann das rote HG in der Mitte. Schläge helfen manchmal, aber nicht zuverlässig.
Der andere dagegen gibt manchmal ohne Anlass Essen aus – ohne Witz, sogar genau beim Schreiben dieses Updates passierte das wieder. Das ist selten genug, aber diese Unregelmäßigkeit ist vll auch ein Grund dafür, warum meine Katze lange Zeit vor der Fütterung vor dem Automaten auf den großen Moment wartet.
Eine meiner Katzen hat einen Weg gefunden, mit der Pfote in die Öffnung zu gehen und dem Automaten Futter zu entlocken. Das klappt nicht immer, sonst würde sie den Tag über nichts anderes machen, aber regelmäßig. Eine andere Methode ist das Umschmeißen des Automats, das dann irgendwann doch wieder begonnen hat. Jetzt liegen dementsprechend wieder Gewichte auf dem Gerät, was aber kein Allheimittel ist, denn auch die können von den Tieren heruntergeworfen werden, der Automat folgt dann. Es fehlt ein Ankermechanismus oder zumindest ein paar Kilo Gewicht.
Das ganze wird noch eine Weile beobachtet werden, vielleicht versuche ich den blockierenden mal auseinanderzunehmen und zu reparieren. Aber ansonsten werde ich einen anderen Futterautomaten probieren müssen. Den Honeyguaridan A36 kann ich daher inzwischen nicht mehr empfehlen.
Flutter: Ein tolles Framework für mobile Apps
Flutter ist ein Framework zur Anwendungsentwicklung. Fokus sind Android und iOS-Apps, aber man kann stattdessen auch für das Web oder mittlerweile sogar den Desktop entwickeln. Es ist ein Google-Projekt, was aber nicht wirklich ein Nachteil ist wenn man mit Android sowieso für eine Google-Plattform entwickelt.
Das Framework ist schon wegen der Konzepte eine ziemliche Umstellung zur gewöhnlichen Android-Entwicklung, zusätzlich schreibt man die Anwendung dann auch noch in einer neuen Sprache, Dart. Doch Dart entpuppt sich als großer Vorteil, dazu unten mehr.
Flutter-Code und Konzepte
Flutter mag insgesamt eine große Umstellung sein, doch der Einstieg ist super simpel. Alles ist ein Widget, jede Oberfläche ist ein Widgetbaum, im Baum kombiniert man die Widgets frei. Zum Beispiel ist das hier das mitgelieferte Hello-World-Beispiel:
import 'package:flutter/widgets.dart'; void main() => runApp( const Center( child: Text('Hello, world!', key: Key('title'), textDirection: TextDirection.ltr ) ) );
So sieht das aus:
Auch als Anfänger ist das problemlos lesbar, die Elemente machen genau genau was man erwartet. main()
ist der Startpunkt der Anwendung, runApp
startet die App, das Center-Widget
zentriert, Text
zeigt Text an. Würde man den Code in eine Material-App packen, würde die App auch direkt aussehen wie eine typische Android-Anwendung.
Aber es ist purer Code, während man bei der Entwicklung mit Android-Studio Oberflächen mit XML-Layouts zusammenbauen konnte. Die Trennung nicht zu haben birgt die Gefahr, UI-Code und Programmlogik zu verschmelzen – was ja aber auch bei regulären Androidanwendungen nur zu schnell passiert. Flutter, und mehr noch die Community drumrum, kompensiert diesen Nachteil über mit einem exzessiven Fokus auf Zustandsmanagement.
Zustandmanagement
Zustandsmanagement ist die Verwaltung des States, das sind einfach die lokalen und globalen Variablen, die Einfluss auf die Oberfläche haben. Flutter versucht generell eine deklarative UI-Entwicklung vorzugeben: Die UI wird immer wieder neu gezeichnet, und wenn der Zustand sich verändert hat sieht die Oberfläche entsprechend anders aus.
Zuerst aber gibt es StatelessWidgets, die keinen eigenen Zustand haben. Holen sie sich die Variablen nicht von außen sehen sie immer gleich aus.
class GreenFrog extends StatelessWidget { const GreenFrog({ Key key }) : super(key: key); @override Widget build(BuildContext context) { return Container(color: const Color(0xFF2DBD3A)); } }
Das hier wäre einfach ein grünes Fenster.
Dann gibt es StatefulWidgets, die ihre eigenen änderbaren Variablen haben können.
class YellowBird extends StatefulWidget { const YellowBird({ Key key }) : super(key: key); @override _YellowBirdState createState() => _YellowBirdState(); } class _YellowBirdState extends State<YellowBird> { @override Widget build(BuildContext context) { return Container(color: const Color(0xFFFFE306)); } }
Das zeigt jetzt auch nur einen farbigen Bereich an. Aber der State-Klasse könnte man jetzt Variablen hinzufügen. Die Doku zeigt dieses Beispiel:
class Bird extends StatefulWidget { const Bird({ Key key, this.color = const Color(0xFFFFE306), this.child, }) : super(key: key); final Color color; final Widget child; _BirdState createState() => _BirdState(); } class _BirdState extends State<Bird> { double _size = 1.0; void grow() { setState(() { _size += 0.1; }); } @override Widget build(BuildContext context) { return Container( color: widget.color, transform: Matrix4.diagonal3Values(_size, _size, 1.0), child: widget.child, ); } }
Das ist also ein Widget mit einer festen Größe, das eine Funktion mitbringt um zu wachsen. setState(() { });
muss immer dann aufgerufen werden, wenn die Oberfläche die Zustandsvariablen neu evaluieren soll.
GetX
Es gibt Unmengen Lösungsansätze für die Zustandsverwaltung. Zum einen weil sie wichtig ist, denn mit ihr steuert man ja direkt das Verhalten der App. Aber auch, weil da die Einflüsse der Entwicklergruppen kollidieren: Da kommt das übliche mentale Chaos aus dem Javascript-Land angeschwemmt, vermischt mit Enterprise-Architekturen – passt ja zu einem Google-Framework. GetX ist anders. Es ist ein pragmatisches Werkzeugset, das nur unter anderem Statemanagment löst. Mit dem Flutter-Modul kann man jeder Oberfläche einen Controller zur Seite stellen, und mit dem Obx
-Widget die Oberfläche immer neu zeichnen lassen wenn sich eine der Variablen ändert. Im Flutter-Kontext ist das Magie, das Resultat ist einfach sauberer Code. So ist das Counter-Beispiel aus der Readme elegant und verständlich:
Du hast einen Controller, in der die Variable und eine optionale Manipulierfunktion definiert wird:
class Controller extends GetxController{ var count = 0.obs; increment() => count++; }
Und dazu das Widget, bei dem ein Druck auf den Button die Variable erhöht, wodurch direkt die Anzeige aktualisiert wird:
class Home extends StatelessWidget { // Instantiate your class using Get.put() to make it available for all "child" routes there. final Controller c = Get.put(Controller()); @override Widget build(context) => Scaffold( // Use Obx(()=> to update Text() whenever count is changed. appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context body: Center(child: RaisedButton( child: Text("Go to Other"), onPressed: () => Get.to(Other()))), floatingActionButton: FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); } class Other extends StatelessWidget { // You can ask Get to find a Controller that is being used by another page and redirect you to it. final Controller c = Get.find(); @override Widget build(context){ // Access the updated count variable return Scaffold(body: Center(child: Text("${c.count}"))); } }
Das Beispiel zeigt noch zusätzlich die Navigationslösung, die man nicht nutzen muss. Trotzdem: Klarer geht es nicht.
GetX hat Nachteile. So sind die Details nicht ganz so simpel wie es zuerst scheint - wie zum Beispiel umsetzen, dass auf eine Objektvariable eines Listenelements reagiert wird, wenn doch List.obs
nur auf das Vergrößern und Verkleinern der Liste reagiert? Vor allem aber ist es ein junges Projekt, bei dem noch zu viele Commits hereinkommen, von zu wenigen Entwicklern, das Ding ist noch im Flux. Trotzdem ist es ein supermächtiges Werkzeug und erleichtert die Arbeit mit Flutter deutlich.
Paketverwaltung
Richtig nett an Flutter ist auch das darum aufgebaute Entwickleruniversum. Man findet Erklärvideos und -artikel. Am wichtigsten aber sind die Pakete. Auf https://pub.dev/ gibt es eine Suche, Module (für Flutter wie Dart) werden dort sauber vorgestellt, gewonnene Likes dienen als Orientierungshilfe. Bräuchte meine App beispielsweise eine animierbare Navigationszeile unten, ich könnte sie mit convex_bottom_bar direkt von dort beziehen. Eintragen in die pubspec.yaml, flutter pub get
ausführen, den Code einbauen, fertig. Eine solche Paketübersicht habe ich bei der direkten Androidentwicklung mit Java schmerzlich vermisst.
Dart
Dass Flutter direkt eine neue Programmiersprache erfordert ist erstmal total abschreckend. Doch Dart macht das ganz schnell wieder wett, denn die Sprache ist gelungen. Dart ist eine wilde Mischung, für mich fühlt es sich aber vor allem nach Ruby an. Was toll ist. Es fehlen allerdings die Blöcke. Dafür hat es async-Funktionen direkt mit dabei, samt await und Future. Wikipedia zählt Smalltalk und Erlang als weitere Einflüsse. Bestimmt ist da auch Python mit drin, Java und Javascript.
Dart hat mich bisher noch in keiner Situation enttäuscht. Die Sprache hat für mich als Ruby-Programmierer immer eine gute Lösung parat gehabt und mich seltenst negativ überrascht.
Die folgenden Beispiele kann man auch alle auf der Webseite ausprobieren.
Hallo-Welt:
main() { print("Hello, World!"); }
Zahlen:
int i = 1 + 2; print(i); // => 3
Strings:
final s = "abc" + "def"; print(s); // => abcdef
Es gibt Listen und Maps (Hashes):
var testliste = [1, 2, 3]; print(testliste[1]); // => 2 var testmap = {1: 'a', 2: 'b', 3: 'c'}; print(testmap[2]); // => b
Und map und fold:
var testliste = [1, 2, 3]; var result = testliste.map((element) => [element]); print(result); // => [[1], [2], [3]] var folded = result.fold(0, (prev, element) => prev + element.first); print(folded); // => 6
Dr ganze Bereich um async war ungewohnt und ist nicht einfach, aber das simple Beispiel ist klar:
Future<void> fetchUserOrder() { // Imagine that this function is fetching user info from another service or database. return Future.delayed(Duration(seconds: 2), () => print('Das hier folgt 2 Sekunden später')); } void main() { fetchUserOrder(); print('Das ist die erste Ausgabe.'); }
Und natürlich Objekte mit Funktionen:
class Sword { int damage = 5; use() => print("$this dealt $damage damage."); } main() { var sword = Sword(); sword.use(); // => Instance of 'Sword' dealt 5 damage. }
Dazu kommt noch viel mehr: Generic, Mixins, Named Parameters, Lambda hatte ich erwähnt, die Standardklassen haben hilfreiche Funktionen definiert, chaining mittels ..
– also das Aneinanderreihen von Funktionen an ein Objekt, obwohl die Funktionen eigentlich void
zurückgeben. Dart ist wirklich erstaunlich angenehm.
Und die Flutter-Programme, die mit Dart gebaut werden, laufen nicht etwa in einem Wrapper, sondern werden kompiliert und dann nativ auf dem Gerät ausgeführt. Dart kann auch nach Javascript transpilieren, was dann die Web-Unterstützung von Flutter erlaubt, aber das ist gefährlich – die so erstellten Webseiten sind bestimmt Javascript-Monster. Für einzelne Spezialfälle könnte aber auch das eine gute Lösung sein.
Fazit: Beachtenswert
Flutter verspricht, mobile Anwendungen viel schneller entwickelbar zu machen als wenn man sie mit den Bordmitteln schreibt. Wenn man das Framework bereits beherrscht mag das stimmen. Ist man neu, ist es mit der Fixierung auf indirekte Interaktivität nicht so einfach zu beherrschen und dieser Lernprozess dann auch nicht schnell. Aber: Dann ist es mächtig, und ich habe definitiv den Eindruck, dass man hiermit bessere Oberflächen und somit auch Apps bauen kann. Dass die dann auf beiden großen mobilen Betriebssystemen laufen können kommt noch dazu.
Dart ist dann die Krönung. Erwartet hatte ich ein alternatives Javascript – etwas, womit man arbeiten kann, aber woran man eher keine Freude hat. Stattdessen ist es nahe genug an Ruby und so ausgereift, dass ich fast frei meinen Programmcode schreiben kann. Sicher, mit der Zeit werden sich die Schwachstellen offenbaren, und eine so junge Sprache kann nicht an die Modulvielfalt von Ruby herankommen. Eine positive Überraschung war sie aber allemal.
Wenn Flutter die entsprechende Entwicklung stabilisiert (noch ist es alpha) könnte ich mir das glatt auch für Linuxanwendungen vorstellen. Die Entwicklung mit wxWidgets, GTK und Qt ist deutlich komplizierter. Derzeit greifen Entwickler dann stattdessen oft zu Electron und anderen Javascript-Desktopwrappern. Flutter mit Dart könnte die bessere Lösung sein. Ich bin gespannt, ob sich das bewahrheitet. Derzeit hat sich die Alpha an snap gekoppelt, was komplett inakzeptabel ist solange es die einzige Lösung bleibt. Aber Flutter-Appimages oder schlicht Binaries? Könnten eine tolle Sache sein.
Wer jetzt für Android entwickeln will, für den ist Flutter mit Dart auch jetzt schon einen Versuch wert.
Fallout New Vegas Jubiläumsartikel auf GamersGlobal
Auf GamersGlobal haben wir eine kleine Aktion umgesetzt. Zum zehnjährigen Jubiläum des Spiels haben wir zeitgleich zwei Artikel veröffentlicht. Einmal von SupArai einen Fast-Erstkontakt mit dem RPG-Klassiker, bei dem es darum ging ob dieser Fallout-Teil ihn heute noch fesseln konnte. Und ich schrieb über die vier Storyerweiterungen, stellte sie vor und ordnete sie ein.
Ich hatte ja auch hier im Blog über die Erweiterungen geschrieben, der GG-Artikel ist aber eigenständig. Wer noch mehr über die Addons lesen will kann sich die Blogartikel zusätzlich anschauen.
Wir waren fertig!
Jono Bacons Bemerkungen zur Brainstorm-Abschaltung haben bei mir eine Erinnerung freigesetzt. Als Ubuntu bekannt wurde war ich ja bei ubuntuusers aktiv, trat als Supporter dem Team bei und verbrachte viel Zeit in dem Forum. Und wenn ich natürlich nicht für alle reden kann, war zumindest bei mir die Grundeinstellung bezüglich dieses Linuxsystems: Das wars jetzt.
Ob Gnome 2, das damalige KDE oder die unbekannteren Fenstermanager: Die Desktopmetapher war perfektioniert. Seit Windows 95 hatte sich da nichts mehr getan, Microsoft produzierte Schrott (Vista! Wobei, das war etwas später), warum sollte sich da jetzt noch etwas ändern? Der Linuxkern untendrunter funktionierte gut, soweit wir sehen konnten. Es ging nur noch darum, die richtigen Standardeinstellungen zu finden, Bugs zu beheben, Workarounds umzusetzen, Konfigurationssoftware zu bauen.
Es ist diese Einstellung, die erklärt, warum ein Ziel wie "Fixt Suspend/Hibernate auf allen Laptops" richtig erschien. Was sonst sollte man machen? Die Iconfarben ändern?
Natürlich ist genau das passiert.
Auf der einen Seite stimmte die Einstellung damals: Es hat sich nichts mehr getan. Selbst das so disruptive Gnome 3 ist letzten Endes, von der Oberfläche her, Windows 95 kaum überlegen. Die Änderungen sind im Zweifel Änderungen, nicht Verbesserungen, was die Oberfläche besser macht sind Funktionen wie virtuelle Desktops, die die Linuxwelt schon vorher hatten. Compiz kam und verschwand wieder, der 3D-Desktop war genau so unbrauchbar wie er zuerst schien. Wir benutzen immer noch Maus und Tastatur und Monitor, und gerade bei den Eingabegeräten oft genug exakt die gleichen wie damals.
Aber andererseits war die Erwartung, dass nun zielgerichtet das System perfektioniert wird, komplett falsch. Stattdessen wurde umgekrempelt was umzukrempeln ging, kämpften die verschiedenen Distributionen und ihre technischen Initiativen um die Vorherrschaft. Ja, im Großen geht es vorwärts, sehen unsere Oberflächen nun hübscher aus als damals und haben Animationen. In manchen Bereichen wie der Spieleunterstützung ist der Fortschritt so massiv wie hervorragend. Aber es ist oft keine direkte Vorwärtsbewegung, es ist ein wildes Umherzucken und man muss bei jeder Bewegung froh sein, wenn nicht gerade kaputt geht was vorher perfekt funktionierte. Pulseaudio ließ hunterttausendfach Computersoundsysteme verstummen. Die beiden bekannten Desktopumgebungen entschieden nahezu zeitgleich, von null anzufangen und ihre stabilen Versionen mit instabilen und dem üblichen Deskop fernen Experimenten zu ersetzen, woran das Gnome-Projekt beinahe zugrunde gegangen wäre als die Nutzer rebellierten. X sollte ersetzt werden durch Mir und Wayland, Mir starb, Wayland versucht sich immer noch als schlechteren X-Ersatz. Systemd nistete sich als seitdem immer weiter wachsendes Krebsgeschwür unter dem Deckmantel eines Initsystem in die Distributionen ein, machte Logs binär und Startprozesse so instabil wie unwartbar. Und das sind ja nur die großen Beispiele, die üblichen Verdächtigen.
Diese Sichtweise erklärt dann auch die Abwehrbewegungen. Wer wie ich seit über zehn Jahren den gleichen Nischen-Fenstermanager einsetzt (wenn auch mit einem schöneren Design) hat kein Interesse daran, wenn das Fundament wackelig wird. Und genau: Die Linuxwelt hat sich getrennt, mit Extremen wie Fedora auf der einen Seite – die Wayland einsetzten, obwohl das System längst noch nicht als X-Ersatz taugte, und SELinux anschalteten, obwohl dann in vielen Situationen der unbedarfte Nutzer komplett blockiert wurde – und Anti-Systemd-Distributionen wie Devuan oder auch void auf der anderen, und dazwischen Distributionen wie Ubuntu, die nach schmerzhaften Ausbruchversuchen wie Unity generell der Masse folgen.
Aber wenigstens ist der vorher braune Desktophintergrund jetzt pink.
Reamde - Neal Stephenson
Wegen Stephenson würde man bei Reamde einen Cyberpunk-Roman erwarten. Doch mit Cyberpunk oder gar Science-Fiction hat Reamde nichts zu tun. Die Handlung spielt in der Jetztzeit, nur dass sich statt World of Warcraft ein anderes MMORPG einer anderen Firma durchgesetzt hat. Eines, das den Goldverkauf legitimiert hat und noch etwas bekannter geworden ist. Doch das ist nur ein Detail, denn eigentlich ist Reamde eine tausendseitige Actiongeschichte mit Entführungen, Gangstern, Geheimagenten und Terroristen, als wegen einer von Spielern gesteuerten Ransomware-Attacke fast zufällig die Nichte des Firmenchefs verschleppt wird.
Typisch ist da nur die lange zusammenhängende Handlung, bei der immer wieder mehrere Stränge parallel verlaufen. Diesmal bleiben die aber viel stärker bei der Haupthandlung als z.B. in Diamond Age. Eine weitere Ähnlichkeit ist, dass es mit dem Spiel so etwas wie einen Cyberspace gibt, der Auswirkungen auf die Echtwelt hat. Die Figuren ähneln auch noch den Cyberpunkfiguren; Wie die Charaktere sympathisch aufgebaut werden und wie sie immer unwahrscheinlich fähig und überdurchschnittlich interessant sind.
Wenn ich jetzt daran denke, wie wenig eigentlich in Reamde passiert, geht das absolut nicht mit der enormen Seitenzahl zusammen. Entsprechend hat es Unmengen an Längen und was erzählt wird ist breit ausgemalt, mit sehr vielen Hintergrundgeschichten sowie technischen Details über die Waffen und bei den Beschreibungen der Handlungsorte. Die Handlung hatte mich zwar irgendwann gepackt und ich wollte den Roman doch fertiglesen, aber so richtig gut fand ich ihn nicht. Die Actionfilm-Verwerfungen, die durch die Ransomware-Attacke ausgelöst werden sind zwar amüsant und kreativ. Aber so ein MMO ist verglichen mit Welten wie der aus Snow Crash eine verdammt schwache Scifikomponente, und da man über solche Spiele so viel weiß lädt sie nur dazu ein, die technischen Fehler des beschriebenen zu analysieren. Ohne diese kreative Komponente jedoch bleibt nur ein detailreicher Thriller über.
Ich finde Reamde zeigt gut, dass viele Details einen Thriller nicht spannender machen. Wäre er 500 Seiten dünner hätte ich ihn wahrscheinlich toll gefunden, so ist es eine überfrachtete Actiongeschichte mit ein paar mittelmäßig spannenden Technikelementen geworden.
Firefox Color
Ich habe gerade Firefox Color ausprobiert. Das ist eine Erweiterung für den Browser, mit der man komfortabel die Farben der Oberfläche anpassen kann. So sieht das aus:
Das tolle daran ist die interaktive Vorschau im Browser. Denn mit ihr ist der ganze Prozess sehr schnell, jede Farbänderung kannst du direkt prüfen. Besonders praktisch wenn man wie ich Treestyle-Tabs benutzt und da nicht ganz klar ist, welche Farbeinstellung für die verbliebenen Oberflächenelemente überhaupt noch wichtig ist.
Das Design kann auch noch problemlos geteilt werden. Das hier ist meines, ein Versuch die Oberfläche stärker in mein altes IceWM-Ambiance-Design einzubinden.
Pinetab, ein Ersteindruck
Das Konzept wirkt auch noch gut wenn man das Gerät in Händen hält. Das Pinetab ist ein 10.1" Tablet. Linux ist das Betriebssystem, optional gibt es eine ansteckbare Tastaturhülle (beleuchtet!), sie verwandelt das Tablet in ein kleines Laptop. Beim ersten Start führt ein Wizard durch die Einrichtung, der gleich auch vor den noch bestehenden Bugs warnt. Man solle doch bitte direkt updaten. Das hilft zwar nicht merklich, aber das kann ja noch werden.
Die Hardware hat auch ein paar Probleme. Das Display fühlt sich ganz anders an als andere Tablets (wie mein HP Touchpad) und zeigt sehr deutlich Fettspuren, vor allen auf den schwarzen Rändern. Die zwei Lautsprecherschlitze sind blödsinnigerweise hinten angebracht und der Ton ist relativ schwach, sollte auf dem Ding mal Youtube laufen mindestens nicht optimal. Und die Tastaturbeleuchtung ist sehr ungleichmäßig, sollte die Software mal als Laptopersatz taugen wird das nerven.
Zuerst dachte ich der Bildschirm wäre zu schlecht aufgelöst um Schrift ordentlich anzeigen zu können, stellt sich raus dass nur Ubuntu Touch keine ordentliche Systemschriftart hat (und auch Icons nicht sauber zeichnen kann). 1280×800 bei 10.1" sind an sich okay, im Browser wirkt das Bild dann auch besser.
Was nochmal zur Software führt. Ubuntu Touch hat ein ordentliches Bedienkonzept, die Gestensteuerung funktioniert. Aber halt noch nichts anderes. Immer wieder stirbt die Oberfläche, versucht etwas anzuzeigen und zeigt stattdessen auf einem ansonsten leeren Bildschirm nur einen Zipfel des Zielfensters. Der Browser hat kein ordentliches Tabinterface und keinen Adblocker. Youtubevideos kann er nicht flüssig abspielen. Es gibt einen Appstore, aber keine der getesteten Apps funktionierte (ich testete alle Youtubeapps sowie Telegram). Libertine, das System um reguläre Linuxanwendungen laufen zu lassen, starb bei der Testinstallation (von Firefox) in einer Endlosschleife.
Wenn man die Tastatur anschließt ist der vom Trackpad gesteuerte Mauszeiger nur in einem kleinen Teil des Bildschirms bewegbar. Das ist ein bekannter Bug.
Wir wurden ja vorgewarnt, dass es eine frühe Version des Tablets ist. Es ist eine sehr frühe. Ich hoffe, dass es im Laufe der Zeit besser wird. Ich würde gerne Youtube mit abspielen, ein brauchbarer Webbrowser wäre auch praktisch, als Alternative zum auch nicht jünger werdenden Touchpad. Und wenn dann später noch die Tastatur funktioniert (samt Linuxumgebung, Texteditor und Webbrowser), umso besser. Davon ist die Software aber noch weit weg.