I’m with stupid

Hin und wieder kommt man in die Situation, dass man eigentlich was anderes machen sollte, und – schwupps – hat man wieder etwas völlig anderes programmiert, das die Menschheit einen weiteren kleinen Schritt voran bringt. Bei mir war es mal wieder soweit.

I’m with stupid ist ein Spiel, das man auch gut in Internetforen spielen kann. Die Regeln sind simpel:

Da Rulez1

In jeder Runde stellt die Spielleitung eine bestimmte Anzahl Fragen. Die Mitspielerinnen und Mitspieler geben nun geheim ihre Antworten ab.

Haben alle ihre Antworten abgegeben, so wird ausgezählt: Jede Antwort ist genau so viele Punkte wert, wie oft sie insgesamt abgegeben wurde – unabhängig davon, ob sie wahr ist. Ein Beispiel:

Frage: Welcher ist der größte Kontinent?
Antworten: 5x Afrika, 3x Asien, 1x Antarktis, 1x Pangäa.

Wer ‘Afrika’ geantwortet hat, bekommt also 5 Punkte gutgeschrieben, wer ‘Asien geantwortet hat 3 Punkte, ‘Antarktis’ und ‘Pangäa’ geben je 1 Punkt.

Die Punkte werden addiert und somit ein Rundensieger bzw. eine Rundensiegerin ermittelt (halt wer in der Runde die höchste Punktzahl hat, is klar).

Wer am Ende des Spiels die meisten Punkte hat, gewinnt.

Natürlich sagt vor Ende einer Runde niemand, was er/sie geantwortet hat, um die Spannung nicht zu zerstören. Bei ähnlichen Antworten (z. B. ‘Holland’/’Niederlande’) entscheidet die Spielleitung in ihrer allgütigen Weisheit, ob die Antworten zusammengefasst oder als unterschiedlich behandelt werden.

Das Problem

Wie man sich leicht vor Augen führen kann, ist die manuelle Auswertung mordsaufwändig: Für jede Person die mitspielt müssen die Antworten zur Berechnung der Punktzahlen zunächst mitgezählt werden, dann die Punktzahlen für jede Antwort errechnet und anschließend rückwärts die errechneten Punktzahlen für jede Antwort den entsprechenden Mitspielerinnen und Mitspielern gutgeschrieben werden. Bei X Personen bedeutet eine Änderung von einem einzigen Wert schlimmstenfalls die Anpassung von O(X) weiteren Werten. Vor Rundenschluss schon mal Teilergebnisse berechnen ist also auch nicht sinnvoll.

Lässt sich das Ganze automatisieren? Okay, das war eine rhetorische Frage. Eine kurze Recherche förderte leider keine fertigen out-of-the-box-I’m-with-stupid-Auswertungslösungen zu Tage. Doch die Problemstellung hatte mich gepackt, ein bedienbares Programm musste her.

Die Lösung

I’m with stupid schreit förmlich nach einer Datenbankanwendung mit Aggregatsfunktionen und Gruppierung (COUNT(), SUM() und GROUP BY) – SQL ist schon was tolles. 6 Datenbanktabellen ein bisschen PHP drumrum, und fertig ist die Multiuser-Multigame-I’m-with-stupid-Umgebung für die faule Spielleitung. Es folgen ein paar Screenshots. Geplant ist, das noch irgendwie öffentlich spielbar zugänglich zu machen, dazu muss ich allerdings noch austüfteln, auf welchem Server unter welcher Domain das laufen soll.

Nach dem Login wird man von einer Übersicht über alle eigenen Spiele begrüßt. Mehrere Personen können gleichzeitig mehrere Spiele leiten.

Nach dem Login wird man von einer Übersicht aller eigenen Spiele begrüßt. Mehrere Personen können gleichzeitig mehrere eigene Spiele leiten.

Hier lassen sich Spieler anlegen und löschen

Hier lassen sich Spieler anlegen und löschen. Die Rundenverwaltung ist übrigens in jedem Menü verfügbar.

Das Kernstück der Anwendung. Hier lassen sich für die Mitspielerinnen und Mitspieler die Antworten eintragen, sobald sie eintreffen. Eine Autovervollständigung hilft dabei, bereits vorhandene ähnliche Antworten zu erkennen.

Das Kernstück der Anwendung. Hier lassen sich für die Mitspielerinnen und Mitspieler die Antworten eintragen, sobald sie eintreffen. Eine Autovervollständigung hilft dabei, bereits vorhandene ähnliche Antworten zu erkennen.

Die Fragen lassen sich im entsprechenden Menüpunkt erstellen und notfalls wieder löschen.

Die Fragen lassen sich im entsprechenden Menüpunkt erstellen und notfalls wieder löschen.

Eine Übersicht über alle Antworten gibt es im Menü 'Antworten verwalten'.

Eine Übersicht über alle Antworten gibt es im Menü ‘Antworten verwalten’.

Was vor allem interessiert, sind natürlich die Ergebnisse. Hier haben wir Runden-...

Was vor allem interessiert, sind natürlich die Ergebnisse. Hier haben wir Runden-…

... und Gesamtpunktzahl im Angebot. Die Punkte werden immer frisch aus der Datenbank berechnet. Die Liste mit den Runden- und Gesamtplatzierungen lässt sich einfach herauskopieren.

… und Gesamtpunktzahl im Angebot. Die Punkte werden immer frisch aus der Datenbank berechnet. Die Liste mit den Runden- und Gesamtplatzierungen lässt sich einfach herauskopieren.

Detaillierte Rundenübersichten gibt es auch noch.

Detaillierte Rundenübersichten gibt es auch noch.

Die Entwicklung war schon spaßig. Das Ganze gibt es bereits im Quellcode auf GitHub, allerdings ist da eigentlich noch ein Refactoring nötig. Aber hey, es läuft 😉

Update: Natürlich will man auch wissen, wie viele Punkte die Antworten gebracht haben…

Die Punkteverteilung kann direkt mit leichter BBCode-Formatierung in beispielsweise einen Forenbeitrag kopiert werden.

Die Punkteverteilung kann direkt mit leichter BBCode-Formatierung in beispielsweise einen Forenbeitrag kopiert werden.

Update, 13.09.2013: Unter http://hscmi.de/iws/ kann man sich das ganze nun auch live und in Farbe ansehen.

  1. Ich wollte das schon immer mal schreiben!

Wie rechnet der Wahl-O-Mat?

Vor den letzten Wahlen war der Wahl-O-Mat der Bundeszentrale für politische Bildung (bpb) immer ein nettes Spielzeug. Was mich aber schon immer gestört hat: Nirgends lässt sich die Information finden, nach welchem System der Wahl-O-Mat die Ähnlichkeitsberechnung vornimmt. Nur bei den angezeigten Balkendiagrammen findet sich in Form eines Tooltips ein Hinweis darauf, dass das alles irgendwie auf einem Punktesystem basiert.

Durch hartnäckiges Reverse-Engineering kann ich nun hier the one and only Punktesystem des Wahl-O-Mat der bpb präsentieren:

Die Antworten der Testperson (das bist du) werden mit den vorgegebenen Antworten der Parteien abgeglichen.

  • Stimmt die Antwort überein, werden der Partei 2 Punkte gutgeschrieben;
  • Weicht die Antwort leicht ab (Zustimmung/Neutral oder Neutral/Ablehnung), wird der Partei 1 Punkt gutgeschrieben;
  • Sind die Antworten entgegengesetzt, gibt es keine Punkte für die Partei;
  • (Vermutung, da Situation sehr unwahrscheinlich:) Hat eine Partei eine Frage nicht beantwortet, gibt es ebenfalls keinen Punkt.

Eine Frage, die die Testperson übersprungen hat, wird nicht gewertet. Entsprechend gibt es dann insgesamt weniger Punkte zu erreichen.

Eine Frage, die doppelt gewichtet werden soll, wird doppelt gewichtet, das heißt, für sie wird die doppelte Punktzahl gutgeschrieben (0/2/4). Entsprechend gibt es insgesamt mehr Punkte zu erreichen.

Wer am Ende die meisten Punkte hat, gewinnt, und darf in der Übersicht ganz links stehen.

So einfach ist das. Hätte man auch selber draufkommen können.

Spieglein Spieglein auf dem Zweitserver

Am 22. Mai war folgendes:

Gestern war die Seite erneut nicht erreichbar. Praktischerweise liegt elitecenter.de anscheinend auf dem selben Server, so dass ich mir ziemlich sicher sein kann, dass ich nix kaputt gemacht habe. Man kommt also zum folgenden Ergebnis:

…und fragt sich, frei nach Zeus: Was tun?

Die erste Überlegung war, das gesamte Blogdings komplett auf einen zweiten Server zu spiegeln. Eine kurze Recherche im Internet ergab jedoch, dass es für WordPress keine 08/15-Lösung mit wenig Aufwand dafür zu geben scheint.

Der zweite Gedanke war dann, lediglich eine HTML-Kopie auf den Zweitserver zu packen und die automatisch aktualisieren zu können.

Von früher™ kannte ich zum Glück noch httrack, das recht annehmbare Offline-Kopien von Webseiten erstellt. Wie sich herausgestellt hat, reicht ein einfaches httrack http://hszemi.de, um eine simple Kopie nach meinen Vorstellungen erstellen zu lassen. Ist sie einmal erstellt, kann sie per httrack –update aktualisiert werden.

Den Upload wird dann von lftp übernommen, das praktischerweise einen mirror-Befehl mitbringt.

Das Shellskript liegt im httrack-Projektordner und sieht also recht kurz aus:

#! /bin/bash

httrack --update
lftp -c "open -u ftp_user,ftp_pass ftp.example.com; mirror -n -R local_project_dir /www/remote_clone_dir; exit"

Wie das ganze aussieht, sieht man auf hszemi.ticklive.de hscmi.de/hszemi.de.