Vor einiger Zeit kam mir der Gedanke, mein Leben zu gamifizieren.
Der Gedanke kam mir kurz vorm Entruempeln eines Schreibtisches und ich dachte
an die erfolgreiche Gamifizierung von Lernplattformen wie
Codecademy, Khan Academy, Memrise und Duolingo - um nur
einige zu nennen - und bei Spielen generell (vgl. Steam).
Also: wir spielen Sims oder irgendein Spiel um dort voran zu kommen
bzw. einen Character zu verbessern, trainieren usw., sitzen aber selbst
leider nur vor diesem Kasten und bewegen lediglich die Haende ..
Spiele sind nicht grundlegend schlecht, ja sind sogar teilweise gut fuer
uns, aber was bringt es, wenn mein virtueller Charakter in einem
Spiel die Hoechststufe erreicht hat, wenn wir selbst dahinvegetieren?
Naja, jedenfalls dachte ich mir, ich hab ja schonmal eine Website
gebaut mit ein bisschen Gamifizierung, ich kann sowas ja nochmal
machen, diesmal aber auf mein Leben anwenden.
Die Anforderungen waren dabei eine Website, in der TODOs usw.
eingetragen werden koennen und es bei Erfuellung dieser eine Belohnung
in Form von Abzeichen oder aehnliches gibt. Dabei soll das ganze lokal
laufen koennen, aber auch zentral, um sich durch einen optionalen
Wettbewerb mit anderen zu messen.
Ich wollte mich aber zuerst noch vergewissern, dass es sowas nicht
schon gibt und hab mal in der Suchmaschine meiner Wahl danach gesucht.
Und natuerlich gibt es solch eine Website schon: HabitRPG :D
Dabei werden sogar alle Features umgesetzt, die ich auch bei mir
angedacht habe. HabitRPG kann - dank Open Source - lokal aufgesetzt
werden, laeuft aber auch zentral und die Spieler*innen koennen sich in
optionalen Wettbewerben miteinander messen. Zudem wird die
Gamifizierung sehr schoen umgesetzt, es ist naemlich kein einfaches
Belohnungssystem sondern an ein Role Play Game (RPG) angelehnt,
d.h. es gibt einen Charakter, der durch "Aufbauen" von
Gewohnheiten (Habits) sowie Erledigung von taeglichen (Dailies) und
einmaligen Aufgaben (TO-DOs) Erfahrungspunkte sammeln kann um dann mit
genuegend Punkten ein Level aufzusteigen.
Einige Level schalten dabei verschiedene Dinge frei, so koennen ab
Level 2 Haustiere und Reittiere aufgezogen werden und ab Level 10 eine
neue Klasse gewaehlt werden.
Soziale Interaktion ist im Gasthaus oder in Gilden bzw. Gruppen
moeglich um sich bspw. mit anderen zu messen.
Mehr dazu im Wiki von HabitRPG.
[Hinweis zum Bild: ich wollte erst verpixeln, aber daraus koennen die
urspruenglichen Informationen wieder hergestellt werden. Daher am
Besten: ausschneiden, schwaerzen oder zufaellig verwischen.]
Jedenfalls wollte ich HabitRPG natuerlich lokal aufsetzen, weil ich ja
die Kontrolle ueber meine doch privaten Daten haben will. Gerade in
Zeiten der Ueberwachung ist das auch ziemlich sinnvoll und wichtig.
Allerdings habe ich nicht mit diesem Aufwand gerechnet (zuerst mal
MongoDB und NodeJS-Umgebung bauen) und den leider
vielen Bugs. Zumindest als ich es ausgetestet habe, fehlten
anscheinend die ganzen Mediadaten wie Bilder und die Sprachdateien.
D.h. es ging einfach nichts und ich hatte nach ein paar Stunden und
dank nicht so toller Dokumentation keine Lust mehr und hab
mich auf der zentralen Seite angemeldet.
Aber gut, dass ich nicht so leicht aufgebe, ich habe es wieder
versucht. Und nach ein paar Stunden hat dann auch alles so
funktioniert, wie ich das wollte. Allerdings ist die Doku immer noch
schlecht ;)
Daher hier eine moeglichst umfangreiche Anleitung (fuer Arch Linux).
Danach geht es normal weiter im Text ;)
HabitRPG lokal aufsetzen
Die Anleitung im Wiki von HabitRPG gibt schon einige Sachen
vor (und ist ausfuehrlicher als die auf GitHub), aber ich
will die einzelnen Schritte etwas genauer und an Arch Linux angepasst auflisten.
MongoDB installieren und aufsetzen (Quelle)
# pacman -S mongodb
MongoDB starten (und optional bei jedem Systemstart starten lassen)
# systemctl start mongodb
# systemctl enable mongodb
Installation von NodeJS und Git
# pacman -S nodejs git
Beziehen des Codes von HabitRPG (von GitHub) und Wechseln in das
neue Verzeichnis (kann spaeter z.B. nach ~/repos
verschoben werden)
$ cd
$ git clone https://github.com/HabitRPG/habitrpg.git
$ cd habitrpg
Auf richtigen Branch testen (sollte develop
sein)
$ git branch
Wenn es nicht develop
ist, zu develop
wechseln
$ git checkout develop
grunt-cli
und bower
global installieren
# npm install -g grunt-cli bower
Am Besten noch die Rechte der letzten beiden Pakete richtig setzen
# chmod -R 755 /usr/lib/node_modules/grunt-cli /usr/lib/node_modules/bower
Restliche Abhaengigkeiten installieren
$ npm install
$ bower install
Konfigurationsdatei erstellen
$ cp config.json.example config.json
Das SESSION_SECRET
in config.json
aendern, z.B. mit pwgen
, der
Rest der Datei kann so belassen werden
$ pwgen -s 50 1
Datenbank mit Initialwerten befuellen
$ node src/seed.js
Starten der Anwendung
$ npm start
Im Browser http://localhost:3000 aufrufen
- Auf
Play
klicken und unter Register
anmelden oder ein schon
vorhandenes Konto beim offiziellen HabitRPG exportieren und in
der lokalen Instanz importieren (Anleitung siehe unten)
HabitRPG updaten
Ab und zu gibt es am offiziellen HabitRPG Aenderungen, die dann
natuerlich auch genutzt werden koennen.
Dazu folgende Schritte ausfuehren (Quelle):
Ins Verzeichnis mit dem Code von HabitRPG wechseln und den Code
updaten
$ cd /path/to/habitrpg
$ git pull origin develop
Updates installieren
$ npm install
$ bower install -f
Wenn du weisst was du tust, kannst du auch die Abhaengigkeiten
updaten:
$ npm update
$ bower update
Und HabitRPG wieder starten :)
$ npm start
Datenexport und -import (zentral nach lokal)
Um ein schon vorhandenes Konto im offiziellen HabitRPG im lokalen zu
nutzen, muessen die Daten erst exportiert werden. Dazu am Besten alle drei Dateien unter Export
(history.csv
, userdata.xml
, userdata.json
) herunterladen.
Da in den Daten kein Passwort vorhanden ist, kann ein temporaeres
Passwort (in diesem Fall test
) in userdata.json
eingefuegt werden, um sich damit einloggen
zu koennen. Das Passwort sollte danach direkt wieder geaendert
werden!
Dazu die Datei userdata.json
mit einem Texteditor oeffnen und die
Zeile mit dem Wort email
suchen. An das Ende der Zeile dann ein
Komma anhaengen und folgendes in die naechsten zwei Zeilen schreiben:
"salt" : "f45185359d",
"hashed_password" : "b04475ce5a970087602f702ffec1af6e4a2eb73e"
Danach die Datei schliessen und mit folgendem Befehl in MongoDB
importieren (zuerst gab es bei mir eine Fehlermeldung beim Import,
daher am Besten noch --jsonArray
anhaengen (Quelle)):
$ mongoimport --db habitrpg --collection users --file userdata.json --jsonArray
Nun kann sich ganz normal eingeloggt werden (mit dem Benutzernamen wie
bei der offiziellen Version und dem Passwort test
).
Datensicherung
Was manuell geht, geht natuerlich auch automatisch: die
Sicherung der Daten.
Die koennen jetzt direkt per mongodump und einem Cronjob gesichert
werden und ggf. per mongorestore wieder eingespielt werden.
$ mongodump --db habitrpg --out ~/backup
Der Cronjob koennte so aussehen:
$ crontab -e
@daily mongodump --db habitrpg --out $HOME/backup
Und die Backupdateien koennten dann z.B. in einem Gitrepository gesichert
werden.
[An dieser Stelle schwand etwas meine Lust ;)]
Update (2014-07-18): Eingespielt werden koennen die Daten ueber folgenden Befehl
(Quelle):
$ mongorestore --drop ~/backup/habitrpg
HabitRPG auf einem Server mit SSL aufsetzen
Das wollte ich heute (2014-07-18) mal nachholen, bin aber klaeglich
gescheitert. Es existiert dafuer natuerlich wieder keine Doku, und
auch herumprobieren (eher stochern) hat mich nicht weitergebracht.
Ueber jegliche Hilfe bin ich sehr dankbar! :)
Allerdings war mein erstes Problem, dass ich nichtmal die
unverschluesselte Version mit Chromium aufrufen konnte, was an
HSTS lag :(
Warum gibt es da nicht die Moeglichkeit, die Ports oder auch nur
einzelne Ports/Subdomains zu ignorieren?
Naja, geloescht werden kann die jeweilige Domain in den Einstellungen
von Chromium, dazu einfach folgendes in die Adressleiste eingeben
(Quelle):
chrome://net-internals/#hsts
Unter "Delete domain" kann die Domain nun entfernt werden.
Update (2014-07-19): Hehe, neuer Tag, neues Glueck - so schnell
gebe ich nicht auf ;)
Habe es nun hinbekommen. Den entscheidenden Tipp fand ich in diesem
Blog, nach einer kurzen Suche nach "lighttpd npm" :)
Bei gleichbleibender config.json
muss nur folgendes in die
Konfigurationsdatei von lighttpd
(siehe dazu auch mein Artikel zum
absichern von lighttpd):
server.modules += ( "mod_proxy" )
$HTTP["host"] == "subdomain.domain.tld" {
proxy.server = ( "" => ( (
"host" => "127.0.0.1",
"port" => "3000" )
) )
}
Und lighttpd
neustarten:
systemctl restart lighttpd
Damit nun nicht mehr via http und Port 3000 auf HabitRPG zugegriffen
werden kann, einfach den Port in der Firewall zumachen
(Quelle) ;)
HabitRPG sollte auf dem Server am Besten unter einem extra User
laufen, der z.B. so erstellt werden kann:
# useradd -d /home/habitrpg -s /bin/nologin habitrpg
Um direkt mit dem System zu starten, reicht bei systemd folgendes
(z.B. in /etc/systemd/system/habitrpg.service
):
[Unit]
Description=HabitRPG
After=syslog.target network.target
[Service]
Type=simple
User=habitrpg
WorkingDirectory=/home/habitrpg
ExecStart=/usr/bin/npm start
ExecStop=/usr/bin/npm stop
[Install]
WantedBy=multi-user.target
Aktivieren und starten dann mit folgenden Befehlen:
# systemctl enable habitrpg.service
# systemctl start habitrpg.service
Update (2014-08-17): Nach laengerem Laufen haben wir
festgestellt, dass der Service das Log zuspammt (einzusehen via
journalctl -e
). Dies kann durch zwei Wege verhindert werden: alles nach
/dev/null
, also ins Nichts leiten oder (praeferiert) HabitRPG im
Produktivmodus laufen lassen (bisher lief es im Entwicklungsmodus).
Fuer beide Wege gilt: erst mal den Service stoppen:
# systemctl stop habitrpg.service
Ersteres laesst sich dann durch folgende ergaenzende Zeile (bei [Service]
) in
/etc/systemd/system/habitrpg.service
bewerkstelligen:
StandardOutput=null
Zweiteres durch den Austausch der ExecStart
-Zeile durch folgende
Zeilen ...
ExecStartPre=/home/habitrpg/node_modules/.bin/grunt build:prod
ExecStart=/home/habitrpg/node_modules/.bin/grunt nodemon
... und den Austausch der NODE_ENV
-Zeile in
/home/habitrpg/config.json
durch folgende Zeile (also quasi
development
in production
aendern):
"NODE_ENV":"production"
In beiden Faellen dann den Service neuladen und starten:
# systemctl daemon-reload
# systemctl start habitrpg.service
HabitRPG sollte nun nicht mehr das Log zuspammen und/oder im
Produktivmodus laufen :)
Es war uebrigens wieder ein K(r)ampf, das alles herauszufinden, da der
Produktivmodus ueberhaupt nicht dokumentiert ist ..
Letztendlich geholfen hat das Lesen des Codes (Gruntfile.js und
Procfile) ..
Update (2014-11-13): Ein paar Mal hab ich inzwischen auf die
neueste Version geupdated, dabei ist die best practice, den
HabitRPG-Ordner zu verschieben (mv habitrpg habitrpg.bak-$(date
+%F)
), neu zu klonen (git clone
https://github.com/HabitRPG/habitrpg.git
), Abhaengigkeiten zu
installieren (cd habitrpg ; npm install ; bower install
) und die alte
Konfigurationsdatei zu kopieren (cp ../habitrpg.bak-.../config.json
.
). Ggf. die Konfigurationsdatei an die neue Example-Datei anpassen
(diff config.json config.json.example
).
Beim jetzigen Mal wollte HabitRPG aber einfach nicht starten (weder
mit npm start
(und development) noch mit ./node_modules/.bin/grunt
build:prod;./node_modules/.bin/grunt nodemon;
(und production)).
Der Fehler war dieser hier:
/home/habitrpg/node_modules/winston/lib/winston/logger.js:435
var instance = created ? transport : (new (transport)(options));
^
TypeError: undefined is not a function
at Logger.add (/home/habitrpg/node_modules/winston/lib/winston/logger.js:435:41)
at Object.<anonymous> (/home/habitrpg/src/logging.js:11:16)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/home/habitrpg/src/server.js:7:15)
at Module._compile (module.js:456:26)
[nodemon] app crashed - waiting for file changes before starting...
Ich hab nicht wirklich Ahnung vom Code, daher tippe ich einfach mal,
dass das Problem an New Relic liegt, was ich aber nicht nutze (die Angaben
in der Konfigurationsdatei habe ich so gelassen).
Einfachster Weg ist hier, den Logger einfach nicht zu aktivieren.
Dazu wird in der Datei src/logging.js
folgende Zeile
logger.add(winston.transports.newrelic, {});
durch diese ersetzt:
// logger.add(winston.transports.newrelic, {});
Danach laesst sich HabitRPG wie gewohnt starten. Natuerlich habe ich
auch diesmal nichts im Internet gefunden, und ich glaube auch, dass
dieser Eintrag der einzige im Internet ist, der die
Produktivinstallation von HabitRPG halbwegs nutzbar beschreibt (ausser
vielleicht interne Firmendokumentationen ;)). Naja ;)
Erweiterte Rechte
Der Vorteil bei einer lokalen Installation ist nicht nur der
Datenschutzaspekt, sondern auch die erweiterten Rechte ;)
So kann das eigene Konto mit Adminrechten und Edelsteinen ausgestattet
werden, um alles machen zu koennen, was normalerweise Geld kostet.
Das soll natuerlich nicht fuer alles genutzt werden, sonst macht das
nicht mehr so viel Sinn ;)
Dazu folgende Schritte ausfuehren:
User-ID z.B. hier finden und kopieren. Eine Beispiel-ID
ist:
05e3c0da-f47f-4cb4-be3c-7ab12093ceaf
In der Datenbank einloggen (Quelle)
$ mongo habitrpg
Adminrechte setzen:
> db.users.update({_id: '05e3c0da-f47f-4cb4-be3c-7ab12093ceaf'}, {$set: {contributor: {"admin":1}}})
Nun koennen in der Halle der Helden noch einige Einstellungen
veraendert werden, unter anderem koennen bei Saldo
Edelsteine
verliehen werden oder die Werbung abgeschaltet werden.
Noch ein Einwurf, dann gehts weiter im Text ;)
Diese Website waere ja langweilig, wenn es nicht noch ein bisschen
geekiger gaenge, so bin ich eben ueber HabitRPG fuer die
Kommandozeile gestolpert :D
Getestet habe ich es noch nicht, es steht aber als TODO in meiner
lokalen HabitRPG-Instanz ;)
.. und weiter im Text ..
Nach einiger Eingewoehnungszeit finde ich HabitRPG bisher sehr gut. Es laeuft
nun seit ca. einem Monat und ich bin sehr zufrieden damit.
Insgesamt bin ich der Meinung, dass dieses Programm wirklich hilft,
denn der Anreiz, den Charakter zu leveln und Straehnen-Bonus/Perfekte
Tage zu bekommen, ist recht hoch.
Auch der Wettbewerb mit anderen hilft dabei, Dinge auch tatsaechlich
umzusetzen.
Es macht jedenfalls viel mehr Spass, die TODO-Liste abzuarbeiten und Gewohnheiten zu
veraendern, als wenn es keine "Belohnung" gibt.
Natuerlich ist aber der erste Schritt, die Gewohnheit zu bilden,
HabitRPG zu nutzen, ansonsten bringt auch die ganze Gamifizierung
nichts ;) Allerdings war das fuer mich kein Problem: ich glaube, es liegt an
meiner Begeisterung :D
Es hilft, die Website immer offen zu lassen und z.B. bei Chromium als
"pinned Tab" zu nutzen.
Ein paar Tipps:
- meiner Meinung nach sind die taeglichen Aufgaben besser dafuer
geeignet, eine Gewohnheit aufzubauen, da diese quasi Pflicht sind und
bei Nichterledigung Punkte abziehen, waehrend bei "Gewohnheiten"
einfach nichts passiert.
- fuer unterwegs gibt es eine App fuer Android und iOS
- am Anfang moeglichst wenig Geld ausgeben fuer die Belohnungen (also
Schwerter oder Ausruestung), da ab Level 10 die Klasse gewechselt
werden kann und nur bei der Klasse Krieger diese Belohnungen etwas
nutzen. Alle anderen Klassen bekommen andere Belohnungen
freigeschaltet.
- nutzt den Wettbewerb mit anderen Leuten bzw. schaut euch in der
Liste mit allen Wettbewerben um, vielleicht entdeckt ihr ja
etwas neues.
Ich finde es jedenfalls erstaunlich, wie gut ich mich damit selbst
austricksen kann und von mir vorgegebene Dinge auch wirklich
umsetze. Das hat bisher immer nicht so gut geklappt (ausser bei
wirklich grossen Dingen wie vegetarisch zu leben oder so).
Obwohl ich einige Blogs lese, die ueber Produktivitaet und
Persoenlichkeitsentwicklung im Allgemeinen schreiben (wie Steve
Pavlina, Leo Babauta, Markus Cerenak, ..), sowie einige Buecher zu diesen Themen
wie focus, Zen To Done oder 52 Changes gelesen habe,
gelang es mir auf Dauer nicht, gewisse Dinge auch wirklich umzusetzen.
Das wird sich nun aendern ;)
Ein Beispiel: ich hatte mir schon laenger vorgenommen, nur noch mit 10 Fingern zu
schreiben. In Verbindung mit Tipp10 wurden meine Fortschritte schon
besser, allerdings bin ich nie dauerhaft dabei geblieben, was ich nun
aber tue. Grossartig. Und das nach nur ein paar Wochen :)
Ein positiver Aspekt hat die Nutzung von HabitRPG noch: da die deutsche
Uebersetzung an einigen Stellen noch ziemlich mies ist, hab ich dabei
geholfen, HabitRPG zu uebersetzen :)
So, und nun viel Spass beim Unprokrastinieren ;)