Es ist ganz schön lang her, dass das letzte Release (bei dem es nicht nur um Bugfixes ging) am 03.08.2022 veröffentlicht wurde. Seither hat sich einiges getan, viel unter der Haube, aber es gibt auch einige direkt sichtbaren Änderungen.
Auf jeden Fall ist es jetzt (endlich!) so weit: Muckturnier 3.6.0 ist fertig, und die Muckturnier-Saison 2024 kann losgehen :-) Ein Überblick über die wichtigesten Neuerungen:
Anmeldeseite überarbeitet
Wie bereits mehrfach kürzlich berichtet ([1], [2]) haben die Internas der Anmeldeseite (und auch gleich noch ein paar andere interne Strukturen) eine gründliche Überarbeitung bekommen. Abgesehen von Änderungen unter der Haube:
Hervorhebung der momentan ausgewählten Zeile
Eine der sichtbarsten Neuerungen ist die Hervorhebung der gerade bearbeiteten bzw. ausgewählten Zeile in der Anmeldeliste:
Der Rahmen bleibt auch nach einer Bearbeitung erhalten (natürlich nur, wenn der Eintrag nicht gelöscht wurde). Weiterhin wird der ausgewählte Eintrag jetzt auch dann angezeigt, wenn er durch eine Bearbeitung jetzt eigentlich ausgeblendet wäre.
Verbesserte Suche und einfachere Handhabung von Voranmeldungen
Es kann jetzt bei der Anmeldung direkt bei der Eingabe der Namen bzw. des Namens die Anmeldeliste durchsucht werden. Das ist insbesondere dann praktisch, wenn es Voranmeldungen gibt: Die Eingabe wird dann erst zum Suchen einer evtl. vorhandenen Voranmeldung benutzt, und wenn es keine passende gibt, gleich auch zum Anmelden.
Diese Funktion ist standardmäßig aktiviert und kann mit dem neuen „Beim Eingeben die Anmeldeliste durchsuchen“-Knopf (de)aktiviert werden:
Passend dazu gibt es jetzt die Funktion „Automatische Groß- und Kleinschreibung“:
Wenn diese Funktion aktiviert ist, wird die Groß- und Kleinschreibung der eingegebenen Namen automatisch korrigiert. Damit ist es dann kein Problem, wenn man nach einer Voranmeldung nur mit Kleinbuchstaben sucht, aber keine findet – und die Eingabe direkt zum Anmelden nutzt.
Die Funktion macht nicht einfach „doof“ den ersten Buchstaben jedes Wortes groß, sondern berücksichtigt diverse Namensbestandteile. Beispiel: Die Eingabe „karl-theodor von und zu guttenberg / valérie giscard d'estaing“ würde damit – korrekt – zu „Karl-Theodor von und zu Guttenberg / Valérie Giscard d'Estaing“ korrigiert werden.
Sonstige Änderungen an der Anmeldeseite
Wenn man mit Voranmeldungen arbeitet, kann man jetzt ein Paar bzw. einen Spieler direkt bei der Suche nach dem dem Namen als „gekommen“ markieren. Wenn die Suche während der Eingabe nur einen Treffer liefert, und dieser Treffer ist als „abwesend“ (also vorangemeldet) markiert, dann wird beim Anmelden der Eingabe gefragt, ob die Markierung für diesen Treffer auf „neue Anmeldung“ geändert werden soll.
Als Standardvorlage für Markierungen wird jetzt der Satz Markierungen benutzt, der sich im Realeinsatz für das Verwalten von Voranmeldungen, allein gekommener Spieler und der Auslosung bei der Anmeldung schon vielfach bewährt hat. Einzelspieler-Turniere bekommen eine abgewandelte Vorlage, da hier „allein da“ nicht sinnvoll anzuwenden ist.
Ungeachtet dessen wird natürlich eine individualisierte Vorlage benutzt, sofern eine gepeichert wurde.
Für Feste-Paare- und Einzelspieler-Turniere wird jetzt die Vorlage für Markierungen jeweils separat gespeichert.
Der „Paar-/Spielerliste exportieren“-Dialog zeigt jetzt die Namen mit den entsprechenden Markierungsfarben an. Die Markierungen haben jetzt auch die selbe Reihenfolge wie auf der Anmeldeseite (die Liste wird aber trotzdem weiterhin alphabetisch sortiert, entsprechend der Ausgabe).
Turnier-Zeitplan
Es gibt jetzt eine neue Extra-Seite: Den Turnier-Zeitplan. Damit kann man den Ablauf des Turniers planen, und sieht jederzeit, wie man in der Zeit liegt.
So sieht das Ganze aus:
In der „Aktuelle Zeiten“-Box sieht man auf einen Blick alle relevanten Zeiten: Wie lang die Runde schon läuft, wie lang sie noch dauert, wann die nächste beginnt etc. Eine Stoppuhr, wie es sie auch bisher gab, kann automatisch beim Starten einer Runde geöffnet werden und läuft dann synchron mit der „Aktuelle Zeiten“-Anzeige.
Strafpunkte-Anzeige
Ein weiteres optionales Feature sind die „Strafpunkte“. Es handelt sich hier nur um eine Anzeige – man kann damit machen, was man will (z. B. sie auch einfach ignorieren ;-). Die Idee ist folgende:
Wenn man mit einer Zeitbegrenzung spielt, dann kommt es immer wieder vor, dass sich ein Paar beschwert, es würde jetzt schon 10 Minuten auf die Gegner warten und verliert Kart-Zeit. Die Strafpunkte-Anzeige berechnet, wie viele Punkte bzw. Bobbl seit dem Rundenstart schon gespielt sein müssten, wenn man sie gleichmäßig auf die ganze Zeit verteilt.
Damit hätte man dann theoretisch die Möglichkeit, dass man dem „unschuldigen“ Paar bei notorisch trödelnden Gegnern Punkte gutschreibt, wenn es für diesen Tisch dann tatsächlich losgeht. Quasi als Disziplinierungsmaßnahme. Aber natürlich wie gesagt rein optional.
Info-Display
Außerdem gibt es die Möglichkeit, ein Info-Display anzuzeigen (auf einem zweiten Bildschirm, Beamer etc.), wo gut sichtbar die momentan laufende Runde, die verbleibende Zeit und der Start der nächsten Runde angezeigt werden.
Das sieht dann z. B. so aus:
Die Optik (Farben, Ränder, Größe, Aufteilung etc.) kann umfänglich individualisiert werden (über den Menü-Knopf links oben).
Fehlerkorrekturen und kleinere Änderungen
Abgesehen davon gibt es eine ganze Reihe an Fehlerkorrekturen und kleineren Änderungen (vgl. auch den ChangeLog für Muckturnier 3.6.0):
Wenn ein anderer Netzwerkteilnehmer jetzt eine Auslosung für ein Paar bzw. einen Spieler eingibt, für das gerade eine Auslosung eingegeben werden soll, dann wird nicht mehr das Popup aktualisiert, sondern es wird eine Warnung angezeigt, und das Popup wird geschlossen (denn der andere Netzwerkteilnehmer hat ja schon ausgelost).
Beim Verwenden von vertikalen Spielstandzetteln und mehr als zwei Bobbln wird jetzt versucht, alle Bobbl ohne Scrollbar anzuzeigen, sofern der Platz dafür ausreicht. Bisher wurde immer der Platz für zwei Bobbl angezeigt, und immer Scrollbars bei mehr als zwei.
Beim Anlegen neuer Markierungen werden bei der Suche nach gleich benannten vorhandenen Markierungen jetzt auch Umlaute etc. korrekt berücksichtigt.
Wenn das „Markieren“-Popup geöffnet ist, und ein anderer Netzwerkteilnehmer editiert Markierungen, dann wird jetzt das Popup korrekt aktualisiert.
Beim Zuweisen einer Auslosung wurde bisher nicht kontrolliert, ob zwischenzeitlich ein anderer Netzwerkteilnehmer die angefragte Auslosung vergeben hat. Potenziell hätte also bisher die selbe Auslosung an zwei Paare bzw. Spieler vergeben werden können. Das wird jetzt geprüft und im Falle einer Kollision wird das Setzen der Auslosung abgelehnt.
Wenn das Zuweisen einer Auslosung angefragt wird, und gleichzeitig ein anderer Netzwerkteilnehmer (schneller) eine Auslosung für das gerade bearbeitete Paar bzw. den gerade bearbeiteten Spieler eingegeben hat, dann wird diese Auslosung nicht mehr einfach überschrieben, sondern die Änderung abgelehnt.
Die Berechung der sichtbaren Zeilennummer, die für das Wiederherstellen der Anmeldeseite nach einer Netzwerkänderung benötigt wird, berücksichtigt jetzt auch durch eine Suche ausgeblendete Zeilen.
Wenn das Auslosungs-Popup auf der Anmeldeliste über das Kontextmenü aufgerufen wird, dann wird es jetzt an der Position des urprünglichen Mausklicks angezeigt (auf Höhe der Zeile, die bearbeitet wird) und nicht mehr auf Höhe des entsprechenden Menüeintrags (außerhalb der Zeile).
Beim Disqualifizieren bzw. Zurücknehmen einer Disqualifikation werden jetzt kollidierende Netzwerkänderung abgefangen (wenn das Paar bzw. der Spieler zwischenzeitlich gelöscht oder umbenannt wurde).
Wenn Einstellungen geändert und gespeichert werden, aber keine Turnierdatenbank geöffnet ist, stürzt das Programm jetzt nicht mehr ab.
Wenn im Einzelspielermodus ausgelost wird, werden jetzt bei der automatischen Tisch- bzw. Spielerauswahl die Spielernamen in derselben Reihenfolge innerhalb des Paars ausgewählt und angezeigt wie auf der Auslosungsübersicht.
Wenn im Einzelspielermodus bei aktivierter automatischer Tisch- bzw. Spielerauswahl der Name eines Spielers Nr. 1 in der zweiten Auswahlbox eingegeben wurde (oder entsprechend der des zweiten Spielers in der ersten), der Tisch aber bereits ausgewählt war, dann blieb der eigentlich in die andere Auswahlbox gehörende Name stehen und wurde doppelt angezeigt. Das ist jetzt korrigiert.
Die verbliebenen „Was ist das?“-Texte wurden in die vorhandenen Tool-Tips integriert und der „Was ist das?“-Eintrag aus dem Menü entfernt. Dieses Feature ist vermutlich den meisten Usern nicht geläufig, und wurde auch nur sporadisch genutzt.
Der Prüfsummen-Dialog wird jetzt nur noch bei einem Debug-Build gebaut und im Menü angezeigt.
Vor einiger Zeit habe ich ja Zweifel angekündigt, ob es mit dem Muckturnier auf dem Hofer Volksfest noch einmal was werden wird. Zwar tatsächlich etwas unerwartet, aber sehr erfreulich: Der neue Festwirt hat sich tatsächlich bei mir gemeldet und würde gern wieder ein Muckturnier machen!
Die Durchführung an sich wäre auch kein Problem. Was sich aber tatsächlich als Problem herausgestellt hat: Das Besorgen von vernünftigen Preisen. Die letzten Male gab es für den 1. Platz z. B. jeweils einen großen Smart-TV. Da braucht man nicht mit einem Meter oder einem Flaschenöffner anfangen ;-) Und wie sich herausgestellt hat, war leider der Vorlauf, um die Sponsoren zu aktivieren und die Preise zu besorgen doch etwas zu kurz. Und alles allein übers Startgeld zu bezahlen würde hier nur den Preis unnötig in die Höhe treiben.
Heißt also: 2023 wird es leider noch nicht wieder ein Muckturnier auf dem Hofer Volksfest geben. Aber wenn es gut läuft, dann nächstes Jahr, also 2024. Von langer Hand geplant, und ohne Zeitprobleme. Wäre jedenfalls super, ich würde mich sehr freuen, wenn ich mit meinem Team eine Neuauflage des vermutlich größten Muckturniers überhaupt abhalten könnte! Zumindest hat Herr Böckl definitiv Interesse daran geäußert, also gibt es Hoffnung.
Ich hoffe, man sieht sich auf dem Muckturnier auf dem Hofer Volksfest 2024 :-)
Wie kürzlich angekündigt habe ich mich endlich darüber gemacht, das interne Datenmodell für die Anmeldeseite zu überarbeiten und vernünftig zu implementieren. Und wenn man schon dabei ist, kann man das auch gleich für die Markierungen und die Rangliste machen. Das Ergebnis ist deutlich saubererer Code, mit dem es jetzt hoffentlich keine sporadischen Crashes mehr beim Netzwerkeinsatz gibt.
Augenscheinlich hat sich gar nicht so viel getan, aber unter der Haube dafür um so mehr: Der Patch zu Version 3.5.1 umfasst Stand jetzt knapp 6 500 geänderte (neue, gelöschte und editierte) Zeilen Code. So tiefgreifende Änderungen wollen natürlich intensiv getestet werden.
Stresstest
Zum Testen bietet sich, natürlich als Trockenübung, eine Anmeldung und Auslosung in der Größenordung Hofer Volksfest an. Für das Test-Setup habe ich die gleiche Ausstattung gewählt, die wir damals hatten: Zwei Notebooks für je eine Anmeldungsstelle und eines für die Auslosung. Es gibt eine Voranmeldungsliste (mit der Markierung „Vorangemeldet“). Wenn sich die Paare anmelden, werden sie als „Auslosung fehlt“ markiert. Allein gekommene Spieler werden ebenfalls angemeldet (und automatisch als „Allein da“ markiert). Sobald es geht (zwei allein gekommene Spieler angemeldet), werden aus den allein gekommenen Spielern Paare gebildet. Der dritte Rechner kümmert sich nur um die Auslosung (also um die als „Auslosung fehlt“ markierten Paare).
Ich habe eine Voranmeldungsliste mit 92 Paaren erstellt, die teilweise falsch geschrieben waren, teilweise anders als vorangemeldet „gekommen“ sind und teilweise auch gar nicht. Jeder der beiden Anmeldungsrechner bekam eine Liste mit 60 Paaren und auch allein gekommenen Spielern, die sich an der jeweiligen Stelle anmelden wollten. Der dritte Rechner loste, nach der „Fenster“-Vergabe mit +4 Tischen, die Paare zu.
Das Ergebnis: Alles hat 1A funktioniert. Erwartungsgemäß gab es, natürlich auch bedingt durch die viel höhere Eingabefrequenz (unter Realbedingungen würde es ja nicht so schnell gehen), ein paar Netzwerkkollisionen. Sprich eine Handvoll Änderungen mussten erneut angefragt werden, weil sie der Server aufgrund eines zwischenzeitlich geänderten Datenbestands abgelehnt hatte. Wie gesagt: Das war zu erwarten und kann systembedingt in seltenen Fällen passieren. Macht ja auch nichts, man muss ja einfach nur die Änderung nochmal losschicken. Aber was nicht passiert ist: Ein Crash. Es ist alles stabil gelaufen. Und zwar genau so, wie es laufen sollte.
Nebenbei noch anzumerken ist: Das Ergebnis der schon ordentlich zufälligen „Fenster“-Auslosung mit +4 Tischen war – ohne manuelles Eingreifen! – dass bei den am Schluss 112 angemeldeten Paaren an 56 Tischen nur das Umsetzen von zwei Paaren erforderlich war. Danach war die Auslosung fortlaufend und lückenlos. Das System ist also wirklich für den Realeinsatz geeignet, vor allem für große Turniere – denn zwei oder drei Paare kann man in zwei Minuten an einen anderen Tisch beodern. Und die 100 anderen sitzen schon da, wo sie hingehören.
Muckturnier 3.6.0 t. b. a.
Ein paar neue Features gibt es ja auch noch, und vor allem einen ganzen Haufen Fehlerkorrekturen (es ist immer wieder erstaunlich, was man alles findet ;-). Alles das wird demnächst als Muckturnier 3.6.0 veröffentlicht. Vielleicht direkt nach dem Muckturnier des ASV Leupoldsgrün, das würde ich dann noch als öffentlichen Betatest mitnehmen :-)
Auf dem Muckturnier der JU Leupoldsgrün (bei dem ich übrigens mit meinem Kartpartner Florian Ziehr bei 94 anderen Mitstreitern einen überragenden 13. Platz erringen konnte!) konnte das Muckturnier-Programm endlich mal wieder „richtig“ eingesetzt werden. Mit zwei Rechnern in einem Netzwerk und auch dem Nutzen vieler Features.
Und prompt gab es einen Speicherzugriffsfehler und das Programm stürzte ab. Gut, passiert ist dabei nichts, neu gestartet, neu verbunden und gut. Daten sind keine verlorenen gegangen, und hinterher war auch alles gut bis zum Schluss.
Aber das darf natürlich nicht passieren. Es darf Fehlermeldungen geben, ein Client darf aus dem Netzwerk fliegen … aber ein Absturz ist nicht akzeptabel. In weiser Voraussicht habe ich alle Instanzen in einem Debugger laufen lassen, so dass ich mit Hilfe des Backtraces genau herausfinden konnte, wo exakt der Crash passiert ist. An einer Stelle, wo das eigentlich überhaupt nicht hätte passieren dürfen, beim Speichern des aktuellen Zustands eines Namens-Editors vor einer Netzwerkänderung. Offensichtlich gab es den Editor zu dem Zeitpunkt nicht mehr.
Während ich auf der Suche nach der Ursache und vor allem der Korrektur des Problems war, fiel mir folgender Kommentar ins Auge (geschrieben von mir selber):
// TODO: Most probably, all this here would better implemented in a model/view infrastructure
// and not by messing with a QTableWidget and QTableWidgetItems. Well, at least, it works ;-)
… tut es eben nicht :-P
Die Anmeldeseite war am Anfang sehr einfach. Einfach eine Liste von Namen. Schritt für Schritt kam immer mehr dazu, und es wurde eine Tabelle. Für die Darstellung bot sich ein QTableWidget an, eine „Bequemlichkeits“-Klasse für die tabellarische Darstellung von Daten.
Und dann kam immer mehr Funktionalität dazu, und es wurde immer komplizierter – und das QTableWidget war immer weniger geeignet dafür. Wie bereits erkannt und per Kommentar festgehalten sollte man sowas mit einer eigenen Model-View-Implementierung lösen. Das kam mir aber damals recht kompliziert und schwierig vor, und deswegen habe immer mehr an dem, was da war, rumgebastelt und ein paar Sachen so gemacht, wie man sie eigentlich nicht machen sollte … mit dem Resultat, dass so ein Crash passiert, weil man eigentlich gar nicht mehr weiß, was wann und wo passiert.
Schluss mit lustig: Jetzt machen wir’s mal richtig
Also gut: Dann machen wir das eben so, wie’s eigentlich gehört. Mit einem eigenen Datenmodell, einer Tabellen-Anzeige dafür, und einem „Delegate“, was eine Klasse ist, die u. a. das genaue Zeichnen auf dem Bildschirm und das Editieren regelt. Man lernt ja dazu im Lauf der Zeit, und kennt sich irgendwann auch ein bisschen aus.
Die Daten so anzuzeigen war jetzt nicht das Problem. Aber das „ordentlich“, sinnvoll, sauber und vor allem netzwerkfähig zu machen stellte sich dann doch als ein riesen Fass heraus, das ich da aufgemacht habe. Auf dem Weg sind mir dann auch noch einige Fehler bzw. Unzulänglichkeiten der bisherigen Implementierung aufgefallen, die ich gleich mit behoben habe. Aber es musste viel geändert werden. Teilweise systemweit benutzte Datenstrukturen, Datenbankaufrufe etc. etc. – aber unterm Strich sollte die Anmeldeseite jetzt vernünftig und vor allem deutlich robuster implementiert sein.
Das vorher war in der Retrospektive ein Tanz auf dem Vulkan, wo das Funktionieren des Programms auch mal davon abhängig war, ob oder ob nicht zur richtigen Zeit ein bestimmter Anmeldelisteneintrag unter einem definierten Pixel auf dem Bildschirm zu finden war ;-)
Abgesehen davon ist jetzt einiges schöner, einfacher (auch codeseitig!) und vor allem benutzbarer – dazu aber mehr beim nächsten Release Announcement.
Beim ersten Code-Zustand, der komplett und funktionell aussah, spuckte diffstat für den Patch verglichen zu git master folgendes aus:
Wir reden also von gut 3 200 Zeilen geändertem Code. Das ist schon eine Hausnummer. Zum Vergleich: Die erste C++-Version (0.7), veröffentlicht am 09.01.2017, hatte insgesamt 3 684 Zeilen Code. Das ganze Programm.
Was jetzt natürlich noch fehlt, ist ein intensives Testen – insbesondere der Netzwerkfunktionalität. Da sind garantiert noch Fehler drin, bzw. neue dazugekommen.
Aber alles in allem sollte das Programm jetzt viel sauberer, robuster, und auch besser zu benutzen sein. Irgendwann wird das schon noch was ;-)