Legend of Grimrock, altmodischer Crawler in neu
Monday, 26. October 2020
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
Friday, 23. October 2020
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
Monday, 19. October 2020
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.
Wir waren fertig!
Monday, 12. October 2020
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.
Firefox Color
Monday, 5. October 2020
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
Friday, 2. October 2020
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.
GMDX unter Proton installieren
Monday, 21. September 2020
GMDX, ein patchartiger Mod für Deus Ex, ist unter Linux nicht so einfach installierbar wie unter Windows. Und leider nicht auf Steam. Mein Vorgehen war so:
Zuerst lud ich die Version 10 auf moddb herunter. Dieser Forenpost beschreibt dann, wie man den Installer per wine am richtigen Ort ausführt und danach die Dateien in den eigentlichen Spieleordner schiebt:
cp ~/Downloads/GMDXv10_Setup_100520.exe ~/.local/share/Steam/steamapps/compatdata/6910/pfx/drive_c/ WINEPREFIX=~/.local/share/Steam/steamapps/compatdata/6910/pfx winetricks shell wine GMDXv10_Setup_100520.exe cp -R ~/.local/share/Steam/steamapps/compatdata/6910/pfx/drive_c/Program\ Files\ \(x86\)/Steam/steamapps/common/Deus\ Ex/System/* ~/.local/share/Steam/steamapps/common/Deus\ Ex/System/ cp -R ~/.local/share/Steam/steamapps/compatdata/6910/pfx/drive_c/Program\ Files\ \(x86\)/Steam/steamapps/common/Deus\ Ex/Help/ ~/.local/share/Steam/steamapps/common/Deus\ Ex/Help/ cp -R ~/.local/share/Steam/steamapps/compatdata/6910/pfx/drive_c/Program\ Files\ \(x86\)/Steam/steamapps/common/Deus\ Ex/GMDXv10/ ~/.local/share/Steam/steamapps/common/Deus\ Ex/
Schließlich noch bei Steam den Startparameter anpassen:
Startparameter: INI=GMDXv10Default.ini USERINI=GMDXv10DefUser.ini
Im verlinkten Post wird statt winetricks protontricks verwendet, bei mir funktionierte das nicht.
Corona-Warn-App auf LineageOS 17.1 mit microG aktivieren
Friday, 11. September 2020
Update 12.2021: Die Anleitung unten sollte noch funktionieren, aber es ist wesentlich einfacher den freien Fork der Covid-Warn-App mit F-Droid zu installieren. MicroG muss dann nicht mehr manuell installiert werden (wird aber genutzt wenn vorhanden).
Mit microG kann jetzt die Corona-Warn-App auch ohne die Google-Dienste aktiviert werden. Dafür muss microG installiert werden, damit microG funktioniert muss Signature-Spoofing aktiviert sein. Das kann LineageOS so nicht, aber es kann aktiviert werden.
Vorgehen:
- Installiere Magisk
- Aktiviere in Magisk den NanoDroid-Patcher
- Nach einem Neustart installiere per F-Droid microG, microG Services Framework Proxy und den FakeStore
- Gebe microG die notwendigen Rechte. Insbesondere braucht der FakeStore die Permission für Signature-Spoofing, was unter Einstellungen -> Apps vergeben werden kann
- Installiere die Corona-Warn-App (z.B. per Aurora Store) und aktiviere das Tracing
- Prüfe in der microG-Anwendung ob IDs gesammelt werden.
Mehr Informationen finden sich in diesem Reddit-Thread und auf Mastodon. Ich beschreibe im Folgenden aber auch nochmal jeden Schritt mit mehr Details.
Magisk Installieren
Magisk ist ein Android-Programm, mit dem das System grundlegend verändert werden kann. Es hakt sich in den Startvorgang und lädt Module, die dann zum Beispiel neue Funktionen bereitstellen. Es ist ein komfortabler erster Schritt um Signature-Spoofing aktiviert zu bekommen.
Lade von der Github-Releaseseite das neueste Magisk-vX.Y.zip herunter, momentan ist das Magisk-v20.4.zip. Telefon ausschalten und das Recovery-Programm starten (normalerweise Lautstärke-unten und Power beim Anschalten gedrückt halten, eben wie bei der Lineage-Installation). Dann sideloading starten, Telefon per USB-Kabel mit dem PC verbinden und Magisk transferieren:
onli@fallout:~/Downloads$ adb sideload Magisk-v20.4.zip
Nach einem Neustart sollte Magisk in der Appliste auftauchen.
Signature-Spoofing per NanoDroid-Patcher aktivieren
Magisk nutzen wir nun um Signature-Spoofing zu aktivieren, denn nur wenn das an ist lässt sich die Corona-Warn-App dazu herab statt mit Google-Diensten mit microG zu reden. NanoDroid kann eigentlich noch viel mehr und könnte uns auch direkt microG installieren, aber bei mir funktionierte dann die Corona-App nicht. Also ziehen wir das aus F-Droid und nutzen von NanoDroid nur den Patcher.
Er ist bei den Releasedateien gelistet. Herunterladen und auf Telefon transferieren:
onli@fallout:~/Downloads$ adb push NanoDroid-patcher-22.9.20200910.zip /sdcard/Download/
Dann in der Magisk-App unter "Modules -> Plus-Icon" auswählen, werkeln lassen, neustarten.
microG installieren
Mit F-Droid lässt sich nun microG installieren.
Zuerst muss in F-Droid das microG-Repository hinzugefügt werden. Einfach die URL eintippen.
microG besteht aus mehreren Komponenten. Die erste heißt microG Services Core. Dazu kommt microG Services Framework Proxy. Und zusätzlich ein Platzhalter für den Play-Store namens FakeStore.
Rechte vergeben
Die App microG taucht jetzt bei den Anwendungen auf. Ihr erster Menüpunkt ist ein Self-Check. In diesem Menü lassen sich viele der notwendigen Rechte vergeben und einsehen was noch fehlt. Überraschen und vom Menü nicht direkt abgedeckt ist die notwendige Signature-Spoofing-Permission, die der FakeStore braucht. Dafür geht man in die App-Liste unter Einstellungen, sucht nach FakeStore, drückt auf Permissions und dann auf die Signature-Permission.
Jetzt sollten bei microG alle Haken gesetzt sein.
Corona-Warn-App installieren und starten
In F-Droid gibt es die App Aurora Store. Mit ihr lassen sich Apps aus dem Play-Store installieren, eben auch die Corona-Warn-App.
ID-Sammlung prüfen
Ob nun die IDs gesammelt werden zeigt wieder die microG-App an, im untersten Menüpunkt.
Komplett unklar, ob das zuverlässig auf allen Smartphones funktioniert und ob auch die Meldung einer Infektion klappt bzw ankäme. So bekomme ich gerade eine Fehlermeldung von der Corona-App:
CAUSE: 3
Something went wrongError during communication with Google Interface (8)
Ich kann nur hoffen, dass sie trotzdem gut genug funktioniert um etwas zu bewirken.
Und natürlich ist das aufwändiger als ideal. Aber vielleicht gibt es bald einfachere Lösungen. Wenigstens gibt es jetzt überhaupt eine erste Möglichkeit, ohne Google-Dienste die Corona-Warn-App anzuwerfen.
iFixit Mako Precision Bit Set
Friday, 4. September 2020
Das Mako ist ein gutes Schraubendreherset für kleinteilige Arbeiten. Einen Metallschraubenzieher samt einer flexiblen Verlängerung gibt es zusammen mit 64 Aufsätzen für den Schraubendreher, von Phillips 000 bis zum Simkartendrücker.
Bei ein paar der Reparaturen in letzter Zeit sind wir an die Grenzen meiner Werkzeugsammlung gekommen. Gerade bei kleinen Schrauben und besonders bei Mini-Kreutzschlitzschrauben funktionierte was ich hier hatte nur mühselig oder gar nicht. So wollten die Mainboardschrauben vom LG G5 sich einfach nicht lösen lassen. Mit dem neuen Werkzeug ging das dann problemlos.
Die Bits und der Schraubendreher machen einen guten Eindruck, auch wenn ich jetzt natürlich nicht alle der Aufsätze ausprobiert habe. Am schwächsten am Set ist die Plastikhülle (weil eben billiges Plastik statt Metall), wobei die Einlage mit den Markierungen wiederum gut durchdacht ist.
Das Set kostet im iFixit-Laden 35€ plus Versand, ich habe es auf ebay-kleinanzeigen gebraucht gekauft. Das Essential Electronics Toolkit für 25€ wäre eine Alternative, die wichtigsten Bits sind da auch dabei und die Öffnungswerkzeuge sind nett, aber der Schraubendreher des günstigeren Sets ist nicht aus Metall.
Zusätzliche Serendipity-Plugins: Entrystats, Simplepodcast, Simplestaticpage und Schema.org
Monday, 31. August 2020
Diese vier Plugins sind in unterschiedlichen Entwicklungsstadien. Allen vier gemein ist, dass ich beim Aufräumen über sie gestolpert bin und sie nicht in Spartacus sind. Ich habe sie jetzt auf Github hochgeladen. Es folgt eine Kurzvorstellung und die Frage: Was soll mit ihnen geschehen?
Entrystats
Unfertig. Es sollte eine Alternative zum Statistik-Plugin werden, das nur Artikelaufrufe zählt, dafür nur eine Zeile pro Artikel anlegt und daher nicht die Datenbank aufbläht. Ich kam wohl nicht weit, das SQL wird nur mit MySQL funktionieren. Statistiken führe ich hier nicht (mehr), aber den Ansatz eines solchen simplen Zählers finde ich immer noch interessant.
Besteht Interesse hierdran? Oder haben wir genug bessere Statistiklösungen, bzw benutzt der Großteil wie ich gar keine?
Github: serendipity_event_entrystats
Simplepodcast
Das Podcastplugin war sogar schon auf Github. Ich entwickelte es vor etwa anderthalb Jahren während der Serendipity-Entwicklungswoche, weil ein einfacher zu bedienendes Podcastplugin mit Podlove-Player gewünscht wurde. Das Plugin liefert das, samt angepasstem RSS-Feed, aber ich dachte damals es fehlt der Feinschliff um es in Spartacus zu packen.
Hier bräuchte es einen Serendipity-Blogger mit Podcasterfahrung, der das Plugin nutzt und mitentscheidet ob noch was fehlt und wenn ja, welche Funktionen gebraucht werden. Oder sie direkt einbaut natürlich.
Github: simplepodcast
Simplestaticpage
Das Staticpage-Plugin ist vom Code her schwierig zu warten und auch die Benutzung ist nicht ideal. Ich weiß, dass ich mich zweimal schon an einer Lösung probiert habe: Einmal wollte ich ein neues Plugin schreiben, das die alten Datenbankeinträge übernimmt; Ein andermal eine eigenständige einfache Alternative bauen. Ich verlor wohl das Interesse und weckte den Kommentaren zufolge auch keines (an anderer Stelle möglicherweise schon).
Das ist Kernfunktionalität, gleichzeitig ist unklar ob die Blogsoftware Serendipity so ein CMS-Feature braucht. Um das in Richtung Es braucht solch ein Plugin aufzulösen bräuchte es einen Entwickler, der mit einem solchen Plugin Seiten in seinem Blog einrichten will und das Ganze mit einem Auge auf Benutzerfreundlichkeit umsetzt.
Github: serendipity_event_simple_staticpage
Schema.org
Das Schema.org-Plugin ist relativ neu und auch hier im Blog in Benutzung. Es funktioniert meines Wissens einwandfrei. So hat es in den Eintrag der Pluginvorstellung diesen Code eingebaut:
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BlogPosting", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://www.onli-blogging.de/1937/Schema.org-Plugin-fuer-Serendipity.html" }, "headline": "Schema.org-Plugin für Serendipity", "image": "/uploads/Screenshot_2020-06-05_Rich_Results_Test_-_Google_Search_Console.serendipityThumb.png", "datePublished": "2020-06-05T10:02:00+0000", "dateModified": "2020-06-08T09:51:09+0000", "author": { "@type": "Person", "name": "onli" }, "publisher": { "@type": "Organization", "name": "onli", "logo": { "@type": "ImageObject", "width": 100, "height": 100, "url": "https://www.onli-blogging.de/favicon_100.png" } } } </script>
Allerdings greift Google dieses Markup nicht auf. Zumindest den Webmastertools zufolge hat es keinen Effekt. Jetzt ist die Frage: Geben wir also dieses Plugin auf, oder fügen wir es trotzdem Spartacus hinzu?
Github: serendipity_event_schema
Sollte jemand Lust haben eines der Plugins weiterzuentwickeln: Sehr gerne, deswegen sind sie auf Github. Sollte starkes Interesse an einem der Plugins bestehen könnte auch ich nochmal Zeit hineinstecken, wobei es meist mehr bringt wenn es jemand entwickelt der die Funktionen auch nutzen will. Beim Schema.org-Plugin will ich das, da weiß ich nur nicht ob es nach Spartacus soll – seht ihr darin einen Nutzen?
Hardwarebeschleunigte Videos bei Firefox aktivieren
Friday, 28. August 2020
Seit Firefox 80 kann der Browser endlich auch unter Linux zum Abspielen von Videos die Hilfe der Grafikkarte via VA-API in Anspruch nehmen. Das ist total wichtig auf älteren Systemen mit schwachem Prozessor, aber auch bei modernen Systemen hilft es dabei die Prozessorlast und damit den Lüfterlärm niedrig zu halten. Die Grafikkarte hat mit solcher Videodekodierung normalerweise null Probleme.
Das funktioniert nur mit einer AMD-Grafikkarte, vielleicht auch mit nouveau als freiem Nvidia-Treiber, aber auf jeden Fall bisher nicht mit dem proprietären Treiber von Nvidia. Das sollte angesichts Nvidias Linuxfeindlichkeit keine Überraschung sein.
Auf meinem System halbierte die Beschleunigung im ersten Test die Prozessorlast des Firefox-Videothreads, ohne dass die Grafikkarte auch nur den Lüfter hochregelte.
htop zeigte zuerst 50%:
Mit aktivierter VA-API sank die Last auf 25%:
Aber das Ergebnis war nicht stabil. In späteren Tests behauptete Firefox zwar, VA-API sei aktiv. Während des Abspielens kamen aber nur noch vereinzelte Dekodierungsausgaben vom Start des Videos ins Log. Bei 1440p- und 4K-Videos sind sie wieder konstant da, aber solche Videos sehen gerade so aus:
Die Funktion ist also mit gutem Grund auch unter Firefox 80 noch nicht als Standard aktiv.
Beschleunigung aktivieren
Wer die Beschleunigung trotzdem aktivieren will: Im Bugtracker wird der Großteil erklärt.
Stell erstmal sicher, dass VA-API auf dem System installiert sind. Bei mir unter void gab es dafür drei Pakete:
- libva
- libva-intel-driver (Für Intel-Grafikkarten)
- mesa-vaapi (Für AMD-Grafikkarten)
Nun zu Firefox selbst. In about:config müssen zwei Einstellungen aktiviert werden:
media.ffmpeg.vaapi.enabled media.ffmpeg.dmabuf-textures.enabled
Gleichzeitig musst du aufgrund eines Bugs
media.ffvpx.enabled
deaktivieren.
Zudem muss wegen einer Sandbox-Funktion seit Firefox 86
media.rdd-vpx.enabled
deaktiviert werden.
Doch das reicht noch nicht. Beim Start von Firefox muss man zudem MOZ_X11_EGL=1
voranstellen. Außerdem muss das neue WebRender-Backend aktiv sein. Das kann mit MOZ_WEBRENDER=1
beim Start erzwungen werden (via).
Start und Test
Um das ganze zu testen starte Firefox so:
MOZ_WEBRENDER=1 MOZ_X11_EGL=1 MOZ_LOG="PlatformDecoderModule:5" firefox 2>&1 | grep 'VA-API'
Wenn dann beim Abspielen von Videos Zeilen wie diese auftauchen funktioniert es:
8946:[Child 20521: MediaPDecoder #2]: D/PlatformDecoderModule DMABUF/VA-API Got one frame output with pts=42000000dts=41999999 duration=33333 opaque=-9223372036854775808
Bevor ich WebRender aktiviert hatte sah ich dagegen diese Fehlermeldung:
41:[Child 18537: MediaController #2]: D/PlatformDecoderModule DMA-Buf/VA-API can't be used, WebRender/DMA-Buf is disabled
Es ist toll, dass die Grafikkartenbeschleunigung endlich auch Linux-Firefox erreicht und nochmal besser, dass dabei auch an X11 gedacht wird und sie nicht im nicht praxistauglichen Wayland verschwindet. Schade, dass die Funktion noch nicht stabil ist, aber das dürfte sich jetzt angesichts der generellen Verfügbarkeit schnell ändernMittlerweile funktioniert die Beschleunigung auch stabil, was toll ist.
Edit 02.03.2021: Ergänzt um Hinweise zu Intel-Grafikkarten und die nötige Deaktivierung von media.rdd-vpx.enabled
, Fazit angepasst.
Dungeon Souls
Friday, 21. August 2020
Dungeon Souls ist ein Roguelike mit Pixelgrafik.
Zu Spielbeginn wählt man aus einem der Charaktere, anfangs sind das ein Barbar, ein Dieb und ein Bogenschütze. In einem kleinen Dungeon gilt es dann immer ein paar Siegel zu berühren, um das Tor zum nächsten Dungeonlevel zu öffnen. Gegner und Fallen erschweren diese Aufgabe, dazu kommen Zwischenbosse. Um gegen die eine Chance zu haben sollte man fleißig aufleveln und Gegenstände sammeln, welche die Charakterwerte verbessern oder andere Boni geben, z.B. ein Dornenschild um den Charakter aufbauen. Mit etwas Spielfortschritt werden dann auch weitere Charaktere freigeschaltet, den Totenbeschwörer fand ich am angenehmsten zu spielen.
Für Genrefans ist das bestimmt nett, aber ich kam mit Dungeon Souls nicht zurecht. Die Grafik ist mir zu sehr ein Pixelbrei. In Gegnermassen wird es unmöglich, den eigenen Charakter zu erkennen, wenn dann noch viele leuchtende Projektile hinzukommen ist alles verloren. Also muss Abstand gehalten werden, aber dann wiederum bin ich mehrfach gestorben weil Gegner aus dem Nichts erschienen und meinen Charakter angriffen, während ich auf die größere Gegnergruppe achtete.
Mit einem besseren Interface, mehr Trefferfeedback und ohne die dauernd neuspawnenden Gegner könnte das Spiel trotz der Pixelgrafik funktionieren, aber so ist es zu mühselig.
Stand der Corona-Warn-App ohne Play Store
Thursday, 20. August 2020
Die deutsche Corona-Warn-App zielt nur auf die Mehrheit der Android-Telefone und benutzt eine API, die Google den Gapps hinzugefügt hat. Diese API übernimmt die Bluetooth-Kontaktverfolgung, also schaut welche anderen Telefone in der Nähe sind. Da dies nicht Teil von Android ist, sondern Teil der proprietären Google-Dienste, ist es für Nutzer von LineageOS und anderen freien Android-Versionen (und entsprechend auch Linux-Smartphones) nicht verfügbar, solange sie nicht diese Google-Abhängigkeiten installieren. Wozu ich zum Beispiel nicht bereit bin.
Nachdem ein erstes Issue zum Thema geschlossen wurde gibt es nun im Repo eine interessante Diskussion. Und sie zeigt zwei gute Entwicklungen:
- CoraLibre-android-sdk ist eine freie Implementierung der Exposure API.
- Zu microG wurde eine alternative API bereits hinzugefügt.
Es gibt hier also ganz konkrete Entwicklungen, die es bald freien Android-Telefonen ermöglichen könnten beim Covid-Tracing mitzumachen. Das Ziel wäre erreicht, wenn in Roms wie LineageOS die API enthalten ist oder nachinstalliert werden kann, und wenn dann die Corona-Warn-App bzw ein Fork in F-Droid landet.
Pillars of Eternity 2: Deadfire ist wieder toll. Viele Stärken, ein paar Schwächen
Wednesday, 19. August 2020
Jahre nach den Geschehnissen im ersten Pillars of Eternity erwacht in Pillars of Eternity 2: Deadfire der Gott Eothas als Titanenstatue. Leider ist er unter der ergatterten Burg begraben, in welcher der Watcher seinen Lebensabend verbringt. Eothas zerstört die Burg und tötet den Spielercharakter – der aber wird von einem anderem Gott wiedererweckt und als sein Herold auf die Spur von Eothas gesetzt.
In diesem Prolog kann der Spielstand des Vorgängers importiert werden. Irritierenderweise ist damit nicht der Charakter gesetzt, seine Klasse und sein Aussehen kann und muss frei gewählt werden. Aber mit dem Import werden die Entscheidungen übernommen, was auf die Welt und Begleiter wohl einige Auswirkungen hat. Noch ein paar Fragen mehr und es beginnt das Spiel, indem der Spielercharakter in seiner Kapitänskajüte aufwacht.
Passend, denn Schiffe spielen im Spiel eine wichtige Rolle. Der Titel Deadfire bezieht sich auf das neue Gebiet, in dem der Spieler mit seiner Gruppe unterwegs ist. Das Deadfire Archipelago ist eine Insellandschaft. Man selbst hat ein Schiff und das im Vorgänger klassischer anmutende Fantasy-Szenario wird mit Piraten durchmischt. Im ersten Moment ist das irritierend und es war wohl nicht verkaufsfördernd.
Abseits der Schiffe spielt sich Deadfire wieder sehr wie der Vorgänger und damit wie andere klassische Computerrollenspiele. Im Laufe der Story stolpert der Spieler über viele Nebenquests. Viele davon führen zu Kämpfen, andere beinhalten kleine Rätsel oder können durch Gespräche gelöst werden. In Gesprächen gibt es oft Skillchecks, also die Möglichkeit mithilfe der Fähigkeiten der Gruppe oder des eigenen Charakters alternative Antworten zu geben. Die kleine Gruppe wird im Laufe der Zeit größer, wobei nur vier der Begleiter mitgenommen werden können und der Rest auf dem Schiff verweilt, eine Auswahl die ich immer noch als stressig empfinde.
Stärken: Das ganze Spiel
Ob das Spiel gut ist hängt also stark davon ab, wie gut die Geschichte, die aufgebaute Welt und wie interessant die Quests sind. Meiner Meinung nach ist das zweite Pillars of Eternity hier hervorragend. Es profitiert davon, dass mit dem Vorgänger die Spielwelt schon ausgebaut ist. Es gibt also mehr dem Spieler bekannte Hintergründe, denen es sich bedienen kann. Bemerkte ich im ersten Teil noch, dass die angelegte Bedeutungsschwere der Geschichte das Spiel überforderte, ist sie nun im zweiten Teil sehr viel passender. Aber auch die hier speziell aufgebaute Spielwelt mit ihren Fraktionen, die auf der Inselwelt um die Vorherrschaft kämpfen, ist spannend und gut erzählt und viele der Charaktere sind toll geschrieben.
Die Gegenstände mit ihren magischen Eigenschaften funktionieren meinem Eindruck nach besser als im Vorgänger. Noch immer gibt es viele von ihnen, doch hatte ich weniger oft die Situation, dass ein neuer und vermeintlich mächtiger Gegenstand komplett uninteressant war. Vielleicht sind die Effekte etwas kreativer, oder durch die Spezialisierung auf einzelne Waffen gab es pro Charakter insgesamt weniger.
Das Kampfsystem funktioniert auch richtig gut. Zu Spielbeginn kann Autobalancing aktiviert, deaktiviert oder nur das Herunterskalieren der Gegnerlevel zugelassen werden. Ich hatte es deaktiviert. Die Kämpfe waren danach genau so wie sie sein sollen: Fordernd, wenn die Gegner höherlevelig waren, ansonsten meist einfach. Die Gruppen-KI erledigt einfache Gegnergruppen automatisch, kann aber deaktiviert werden, und bei schwierigeren Kämpfen sollte man das mindestens für einzelne Charaktere auch tun und selbst die Befehle geben. Es gibt für alle Klassen genug Fähigkeiten, um es interessant zu machen wenn man die Kämpfe selbst steuert. Mittlerweile gibt es sogar ein alternatives Rundenkampfsystem, das habe ich aber nicht ausprobiert.
Beim Levelaufstieg gibt es allgemeine Fähigkeiten, dann klassenspezifische aktive und passive Fähigkeiten, dazu kommen alle paar Level noch Waffenspezialisierungen. Das System ermöglicht weiterhin gut eine Spezialisierung auf bestimmte Rollen, ist aber nicht übermäßig bestrafend wenn man nicht allzu überlegt an die Gruppenplanung herangeht. Aber es ist schon sinnvoll und in den Kämpfen spürbar, wenn man zumindest einen zähen defensiven Kämpfer baut, ihm einen heilenden Unterstützer zur Seite stellt und einen spezialisierten Schadensverursacher hat.
Zu den Kämpfen kommen noch Schiffskämpfe. Das Piratenszenario ermöglicht diese und wird so zur Bereicherung: Die rundenbasierten Schiffskämpfe sind eine nette Abwechslung, das Entdecken von Inseln ebenfalls. Und es gibt dem gesammelten Gold einen Zweck: Denn das Schiff kann aufgerüstet werden, neue Segel, Hülle und Kanonen verbessern die Chancen im Seekampf. Der kann sonst aber auch umgangen werden, für simple Enterschlachten auf den beiden Schiffen.
Dazu gibt das ganze dem Fraktionsreputationssystem Gewicht. Mit den Entscheidungen des Spielers verbessert oder verschlechtert sich das Verhältnis zu den Fraktionen, wobei es vier Hauptfraktionen und ein paar kleinere Gruppen gibt. Das ist zusätzlich zur eigenen Reputation als clever oder hinterlistig, worauf manche Gesprächspartner ebenfalls reagieren, genauso wie auf die eigene Rasse und Klasse. Für die Hauptmission kann dann eine der Fraktionen als Partner gewählt werden. Es ist nicht ganz so ausgereift wie in Fallout: New Vegas, aber einzelne Begleiter reagieren deutlich und das alles hat Auswirkungen auf die im Outro erzählte Story. Man würde auch Auswirkungen in einem dritten Teil erwarten, aber ob es den je geben wird ist fraglich.
Schwächen
Story, Quests, Kämpfe und auch die Grafik ist gut, was für Schwächen kann ein solches Spiel noch haben? Es gibt dann doch ein paar.
Die Linuxversion funktionierte bei mir nicht stabil. Nach den ersten einwandfreien Spielstunden blieb sie immer wieder beim Gebietswechsel hängen. Mit Proton verschwand das Problem. Allerdings lief ich mit Proton in zwei Situationen, in denen eine Ingame-Zwischensequenz hängenblieb und das Spiel abgeschossen werden musste. Einmal war nach dem Neuladen die Situation erledigt und damit das Problem umgangen, das zweite mal aber war der Speicherpunkt vor der Sequenz gesetzt, blieb das Spiel immer wieder an der Stelle hängen. Ich konnte daher eine der Erweiterungen nicht abschließen, sondern musste einen älteren Spielstand laden. Und Thema Laden: Die Ladezeiten sind trotz SSD zu lang, auch und gerade beim Gebietswechsel.
Die Begleiter sind stark ausgestaltet, aber diese Ausgestaltung ist immer noch schwächer als in einem Baldur's Gate 2 oder Mass Effect. So lassen sich Romanzen anbahnen, aber dann passiert nichts. Keine Folgegespräche, keine Quests, höchstens einen veränderten Audiokommentar habe ich bemerkt. Die Priesterin ist da ein Extremfall, sie findet nacheinander Gefallen an mehreren Begleitern, ohne dass die Situation aufgelöst wird. Und auch die regulären Begleiterquests sind konsequenzenlos. Nichts ist auch nur annähernd auf dem Level des archetypischen Begleiterquests eines Paladins, der aufgrund von Spielereignissen seinen Gott und seine ganze Haltung wechselt und daraufhin andere Fähigkeiten hat. Nur im Epilog werden die Entscheidungen nochmal erwähnt.
Ich verstehe auch nicht, warum es angesichts dieser Schwäche zusätzlich zu den Hauptbegleitern noch Nebenbegleiter gibt, die weniger ausgestaltet sind und nur einzelne Missionen stärker kommentieren. Welchen positiven Effekt soll das haben?
Auf zwei kleinen Inseln entdeckte ich Riesenmonster, gegen die ich auch auf dem Maximallevel mit guter Ausrüstung völlig chancenlos war. Dem Spiel ist zugute zu halten, dass das nicht in Hauptmissionen, nichtmal in Nebenmissionen geschah. Das waren wohl völlig optionale Gegner. Aber wenn eine Gruppe wie die meine bei denen so chancenlos ist, dann stimmt da das Balancing nicht.
Vielleicht spielt da ein anderes Problem mit rein: Das Maximallevel ist zu niedrig. Stufe 20 ist weit vor dem Spielende erreichbar, was demotiviert.
Es gibt nicht nur zu viele Erfahrungspunkte. Was auch zum Problem gehört: Generell ist die Verteilung von Nebenquests und Hauptquests nicht optimal. Die Hauptstory ist schlicht zu kurz verglichen mit all den anderen Aktivitäten. Dann steht man vor der finalen Mission, hat aber noch so viel anderes zu erledigen, ist aber schon auf dem Maximallevel. Weiterzuspielen fühlt sich dann nicht mehr rein wie ein Spiel an, sondern teils wie Pflichterfüllung – wobei ich in der Phase noch ein paar gute Nebenmissionen erlebt habe. Wäre das Maximallevel nicht schon erreicht wäre der Effekt sicher nicht so gravierend. Aber selbst dann wären die Nebenmissionen gemessen an der Hauptgeschichte erdrückend.
Insgesamt stark
Ich hoffe es wird deutlich, dass die Schwächen keinesfalls das Spiel beherrschen. Es sind vielmehr Macken in einem sehr guten und hübschen klassischen Computerrollenspiel, die seiner Perfektion im Wege stehen. Das ist ein bisschen überraschend: Von Obsidian und als zweiten Teil eines bereits sehr guten Vorgängers hätte ich von Deadfire genau die erwartet, die vorhandenen Schwächen sind nur in diesem Kontext teils sehr überraschend. Wenn die Verkaufszahlen wirklich schlecht waren ist das schade. Egal, ob es am Piratenszenario lag oder vielleicht daran, dass nach der Wiedergeburt des Genres der Bedarf erst einmal gesättigt war: Deadfire hätte trotzdem einen Verkaufserfolg verdient gehabt.
Spamblock-Bayes 1.0 als reduzierte modernisierte Version
Monday, 17. August 2020
Das Bayes-Plugin hat ein Update auf die Version 1.0 bekommen. Die neue Variante des Anti-Spamplugins für Serendipity hat weniger unnötige Funktionen, benutzt die neueste Version des b8-Filters und sollte alles in allem stabiler funktionieren.
Die erste Version des Plugins entstand 2009. Es ist dann eine ganze Weile gewachsen, bekam z.B. ein Backendinterface. Zwischendurch hatte ich sogar Pläne, die Spamdatenbank zwischen Blogs hin- und herzuschicken, sodass eine dezentrale geteilte Datenbank entsteht, aber damals fehlten mir dazu die Mittel das richtig umzusetzen und am Laufen zu halten.
Bayes wird immer noch benutzt, hier im Blog zum Beispiel, aber mittlerweile hat sich seine Rolle herauskristallisiert. Es ist meistens die letzte Verteidigungslinie. Die anderen Spamblockmaßnahmen sind oft genug, um den Großteil der Spamkommentare aus dem Blog herauszuhalten.
Jetzt hatte das Plugin schon länger keine größeren Updates gesehen und ein paar Sachen störten:
- Wir hatten damals den Bayesfiltercode in das Plugin integriert. b8 ist aber mittlerweile in der Lage, sich in andere Datenbanken einzuhaken und hat seine Berechnungen verbessert. Es wäre besser, es als externe Abhängigkeit zu nutzen und so von diesen Weiterentwicklungen zu profitieren.
- Das Admininterface war im Grunde unnötig, außer um mal den Papierkorb zu überprüfen musste man da als Blogbesitzer fast nie reinschauen.
- Es war zu viel Code. Die vorherige Version hatte über 2000 Zeilen PHP-Code in der serendipity_event_spamblock_bayes.php, dazu kam dann noch Smarty-Code, CSS, HTML und Javascript für das Backend
- Das enthaltene SQL und somit das Plugin funktionierte nicht mit PostgreSQL als Datenbank.
Die Version 1.0 ist daher eine große Aufräumaktion. Relativ wenig alter Code wurde übernommen, im Grunde nur der für den Papierkorb nötige und ein paar Helferfunktionen. Ich habe unseren Filtercode herausgeschmissen und stattdessen die neueste Version von b8 integriert. Damit das auch mit SQLite funktioniert brauchte das Projekt ein neues Datenbankbackend, das habe ich geschrieben und upstream zukommen lassen. PostgreSQL könnte man genau so nachrüsten, wenn sich ein Tester findet. Das Javascript für die Kommentarliste ist neu und nutzt jQuery, es sind nun ganz wenige Zeilen. Das Menü im Backend ist auch reduziert, dort findet sich nur noch der Papierkorb. Gleichzeitig funktioniert dessen Styling nun ordentlich im neuen Backenddesign.
Insgesamt dürfte das Plugin verlässlicher funktionieren. Auf jeden Fall ist der Code besser wartbar und es gibt weniger Fallstricke wie überflüssige und somit verwirrende Menüs.
Das Update ist schon in Spartacus. Die alte Spamdatenbank wird beim Update nicht übernommen.