Montag, 21. Dezember 2015

Die Beerdigung der Fußballerzitate


Abbildung 1: Die (Fußballerzitate) Welt wird untergehen
Viele viele Anfrage gab es für die Zitate, die ich mit Freuden beantwortet habe. Sie haben mir gezeigt, wieviel Spaß (und kreative Ansätze) die Finder beim Lösen hatten.
Unzählige Logs haben sich in Dosen und online angesammelt.


Abbildung 2: Auch wenn die Runde archiviert wird, das Leben geht weiter
Doch auch hier ist irgendwann Schluss. Mehr und mehr Verstecke sind "verbrannt", werden immer wieder gemuggelt, sodass nun das Ende erreicht ist und die Runde am 01.01.16 archiviert wird.


Abbildung 3: Wir haben fertig
Für all diejenigen, die noch eine letzte Chance wahren wollen, treffen wir uns am Neujahrstag um 10 Uhr am Asbacher Sportplatz

N 50° 39.636 E 7° 25.805

von wo aus wir die Runde starten wollen.

Montag, 8. Juni 2015

Die Zitate des Herr Seppberger

Nach unbestätigten Informationen wurde 1954 in Bern nicht nur der Name des deutschen Dosennationaltrainer, nein auch die Sportart und vorallem die Zitate wurden falsch überliefert.

Hier die "korrigierte Fassung":
  • "Nach dem Event ist vor dem Event"
  • "Das Blaue muss ins Eckige im Runden"
  • "Die nächste Dose ist immer die schwerste"
  • "Die Dose ist rund und ein Event dauert 90 Evmis *"
  • "11 Dosen müsst ihr sein"
  • ...
Wer noch weitere Infos über die "Originalzitate" besitzt, kann mir diese gerne zukommen lassen, vielleicht gibt es dann wieder ne Mysteryseria à la Fußballerzitate

* Evmis sind Eventminuten, eine flexible Zeiteinheit, die von 45 Sekunden beim Mittagspausenevent bis zu 64 Minuten beim Viertageswanderevent gehen kann. Selbst Minus 45 Sekunden für das Zeitumstellungsevent nachts um 3 bis nachts um 2 sind möglich

Samstag, 7. März 2015

Koordinaten ermitteln und automatisch umrechnen lassen

Ich stand letzte Woche wieder vor dem Problem schnell ne Koordinate aus GoogleMaps auszulesen und diese dann in das passende lua-Format zu wandeln.
Auch die Eingabe in Uriwgo ist immer noch mit ein wenig Fleiß verbunden. Zwar bietet dieser Editor zwar mittlerweile das Minutenformat an, aber die ° Grad Zeichen müssen noch entfernt werden und die N bzw E Himmelsrichtungen ans Ende gepackt werden. Das kann schon nervig werden.

Viel schöner wäre es doch, wenn man diese Schritte verkürzen könnte.
Ich habe mir zu diesem Zwecke eine kleine WebSite angelegt, die man unter JSFiddle jederseit online nutzen kann.
Was sie kann und wie man sie bedient, möchte ich Euch hier einmal vorstellen:


Abbildung 1: Beim Start versucht sich die Karte auf den aktuellen Standort zu zentrieren.
Beim Start versucht die WebSite den aktuellen Standort des Benutzers zu ermitteln und fragt ihn dazu um Erlaubnis. Hier empfehle ich "Zulassen" auszuwählen.
Alternativ kann man aber auch die Eingabemaske nutzen um die Karte an die richtige Stelle springen zu lassen und den Schiebeaufwand zu verringern.

Abbildung 2: Einfache Eingabe von Orts- und Straßenname um die Karte grob auszurichten
Einfach in das Suchfeld ("Search Box") Ort und Straße eintragen und Enter drücken. Schon sind wir an der richtigen Stelle.
Zumindest grob. Den Rest können wir durch Verschieben der Karte erreichen.


Abbildung 3: Mit der rechten Maustaste werden die Koors in die Header-Felder geschrieben
Wenn die gewünschte Stelle erreicht ist, so genügt ein einfacher rechter Mausklick auf den gesuchten Wald / Parkplatz oder was auch immer sonst ausgemessen werden soll.
In den Header-Feldern erscheinen nun die Koors im Dezimalminutenformat, in der von Urwigo gewünschtne Schreibweise und als Wherigo.Zonepoint wie ihr ihn benötigt, wenn die Koordinate direkt in lua eingetragen werden soll.


Abbildung 4: Eine Änderung im Dezimalminutenfeld führt zur Anpassung des Urwigo- und lua-Feldes
Jetzt reicht es bei Parkplatzkoordinaten ja meistens aus mit GoogleMaps zu messen. Bei vielen Station möchte man aber die vor Ort mit dem GPSr ermittelten Koors verwenden.
Um diese in die beiden Wherigo-Formate zu bekommen, könnt ihr einfach das Dezimalminutenfeld anpassen und die Werte aktualisieren sich automatisch
Jetzt per Copy&Paste nach Urwigo übernehmen und fertig ist der nächst Wherigo. Zumindest was die Koors betrifft....

Mittwoch, 18. Februar 2015

Stillstand bei Uriwgo?

Wie viele Wherigo-Entwickler wurde auch ich eben mit einem Urwigo-Problem konfrontiert, dass man sonst nur hat, wenn man das Cartridge zu schnell startet.

Nachdem ich das Programm mehrere Male neu gestartet, schließlich neu installiert habe .... und immer noch nix lief, hab ich dann mal in den Geoclub geschaut. Und siehe da: Wie vermutet liegt es am GoogleMaps Zugriff. Lt. Charlenni arbeitet Uriwgo wohl schon länger mit der als Deprecated deklarierten V2 der Google Maps API anstatt auf die V3 upzugraden. Und heute schon Google aus Deprecated ==> Unavailable gemacht zu haben. Jedenfalls funktioniert der API Zugriff nicht mehr.
Hoffen wir, dass die Urwigo Entwickler nun endlich das Update auf die V3 vollziehen.

Quelle: https://forum.geoclub.de/viewtopic.php?f=74&t=76575

Montag, 2. Februar 2015

Auf den Spuren vom Rühmanns Heinz...

Nur noch ein paar mal schlafen, dann ist es endlich soweit. Mitten in der Karnevalszeit sozusagen als Auszeit und Abwechslung startet in der Weltstadt Birnbach das

Jaja, es ist alle geboten. Beamer, Leinwand, DVD, ne gemütliche Grillhütte.
Auch der Birnbacher Flughafen wird geöffnet haben. Jedenfalls wird Louping Louie dort desöfteren starten und laden...

Sonntag, 9. November 2014

Nachrichten asynchron anzeigen mit einer Messag-Queue

Voraussetzung: "Der Einstieg in lua“

Abbildung 1: Wenn die Nachricht unpassend ist, wird sie später angezeigt

In diesem Beitrag geht es um asynchrone Nachrichtenverarbeitung. Klingt komplizierter als es ist, deswegen will ich es mal an einem einfachen Beispiel erklären:

Stellt euch vor in eurem Wherigo-Spiel geschieht gerade ein längerer Dialog. Der Spieler muss 3-4 Fragen beantworten auf die er jeweils direkt eine Antwort bekommt.

Dazu habt ihr einen Timer der im Hintergrund einmal pro Minute etwas prüft und gegebenenfalls eine Nachricht anzeigt "Die Löwen sind wieder hungrig und möchten gefüttert werden"
Nicht nur dass die Nachricht Umlaute enthält, nein sie würde auch im aktuellen schwierigen Dialog stören bzw. wichtige Informationen überlagern.

Stellt euch vor, der Spieler erhält gerade die dringende Nachricht "Gehe schnell zum Affengehege" als der Timer anspringt und sofort mit der wenig dringenden Löwennachricht überlagert. Da wüsste der Spieler gar nicht, dass er zuerst du den Affen soll.

Um dass zu verhindern nutze ich eine Mesage-Queue in die ich Nachrichten einstelle (Zeile 174), wenn sie gerade unpassend sind. Wenn sie gerade nicht stören, also hideMessage auf false steht können sie auch direkt angezeigt werden.
Die msgQueue besteht aus einer Tabelle in die mit table.insert ein Text sowie ein Bild eingefügt wird, um später die Nachricht darzustellen.
Zusätzlich hält das Array-Objekt noch einen Pointer, der auf die nächste darzustellende Nachricht zeigt.

Wenn dann die kritische Situation vorbei ist (Der Dialog ist beendet, oder immer wenn der Spieler eine Zone verlässt) wird printMessageFromQueue aufgerufen. Diese Methode prüft ob neue Nachrichten vorhanden sind (dann wenn mehr Nachrichten im Array sind als der Pointer groß ist) und gibt die Nachricht aus auf die der Pointer zeigt.
Nach Drücken von "OK" durch den Spieler wird der Pointer einen weitergesetzt und printMessageFromQueue rekursiv aufgerufen. Solange bis alle Nachricht abgearbeitet, also angezeigt wurden.


Abbildung 2: Während der Dialog mit dem Spieler etwas länger dauert, springt der Timer an und schiebt die Nachricht in die Queue
Abb. 2 zeigt uns die Anwendung im Code. Die Methode doLongDialog soll den komplizierten Frage-Antwort-Dialog simulieren. Bevor der Dialog startet wird hideMessage auf true gesetzt. Ab jetzt gehen alle Nachrichten in die Queue.
Zeile 206 bis 208 zeigen uns den Timerfall. Während der Timer anspringt ist hideMessage positiv und die Nachricht wird eingereiht.

Nachdem der Dialog vorbei ist, wird (!!! Im Callback des letzten Dialogs / MessageBox !!!) hideMessage wieder auf false gesetzt, damit ab jetzt wieder live angezeigt werden kann, da die kritische Situation vorbei ist.

Wenn es in eurem Spiel keinen festdefinierten Zeitpunkt gibt, wann die Nachrichten nachgeholt werden können, könnt ihr mit einem weiteren Timer arbeiten, der alle 60 Sekunden prüft ob hideMessage auf false steht und dann printMessageFromQueue aufruft.


Abbildung 3: Egal ob direkt oder später, die Nachricht erscheint als MessageBox

Samstag, 8. November 2014

Doppelte Logeinträge mit GSAK finden

Wer kennt es nicht das Problem. Man hat 2-3 Wochen bzw. 50 Caches lang keine Statistik mehr generiert und dann nachdem man mal wieder die Graphiken aktualisert hat, kommt das Horrorszenario: 2047 Funde bei 2046 Caches.


Abbildung 1: Der Horror - Bei einem Cache hab ich aus versehen doppelt geloggt
OK, es müssen nicht genau 2047 Funde sein, aber das Problem hatten die meisten schonmal. Bei irgendeinem Cache ist doppelt geloggt wurden. Entweder hat der Groundspeak Server gehangen und man hat doppelt losgeschickt, man hat einmal vom Smartphone und einmal am PC geloggt oder beim nachträglichen Ändern des Logs (Text / Datum) ist was schiefgegangen.
Schlimmer als die Frage WARUM ist "WO habe ich doppelt geloggt?" Da kann es schon ein wenig mühselig sein die letzten 50 Caches durchzugehen. Vorallem wenn man zwischendurch ganz alte Einträge nachholt. "Ach ja, das Event von letztem Jahr muss ich auch noch nachloggen."

Abbildung 2: Sqlite Manager als Datenbank-Tool starten
Aber warum soll man selber suchen und nicht suchen lassen.

Anmerkung: Nach Veröffentlichung des Posts wurde ich durch Kommentare aufmerksamer Leser darauf hingewiesen, dass man das Problem mittlerweile durch GSAK-Bordmittel lösen kann. (Siehe Kommentare). Hier erfolgt der Ansatz über die Datenbank, der für das Doppelte-Logs-Problem etwas komplizierter ist, dafür aber einen guten Einstieg gibt, wie man Infos aus der zugrunde liegenden Datenbank sqlite ziehen kann
Wir werfen dazu einen Blick auf die Datenbank, genau genommen der Datenbestand, der alle Founds enthält und von wo aus die Statistik generiert wird.
Um einen direkten Datenbankzugriff zu bekommen nutzen wir das von GSAK mitgelieferte Tool Sqlite Manager. Dies ist über Tools in der Menüleiste zu erreichen.
Wer mit alternativem Tools wie z.B. DBVisualizer unterwegs ist kann auch direkt die Sqlite Datei .db3 öffnen aber das GSAK integrierte Tool tut es hier vollkommen.


Abbildung 3: Die richtige Datenbank auswählen
Wichtig ist, dass ihr die richtige Datenbank auswählt. Bei mir heißt die Datenbank für die Funde foundDB, folglich liegt die Datenbankdatei unter data/foundDB/sqlite.db3


Abbildung 4: Durch geschickten Select auf die Logs Tabelle bekommt man alle doppelten Einträge heraus
Sobald die richtige Datenbank geöffnet ist, geht es los.
Zuerst selektiert man alle Zeilen deren Log-Type Found it und deren Finder man selbst ist. Krolock müsst ihr natürlich durch Euren Nickname ersetzen, ansonsten sehr ihr nur, ob ich doppelt geloggt haben
Um nicht mit unnötig vielen Daten weiterzuarbeiten wird nur die Spalte lParent geladen. Dies ist der GCCode des Caches den ihr gefunden habt. Der SQL-Befehl lautet bisher
SELECT lParent FROM Logs where lType = 'Found it' and lBy = 'Krolock'
Es müssten nach unserem Beispiel 2047 Zeilen ausgegeben werden.
Jetzt kommt der entscheidene Schritt, die Gruppierung. Dazu ergänzen wir im select Part ein Count(*) und gruppiern auf lParent
SELECT count(*) c, lParent FROM Logs where lType = 'Found it' and lBy = 'Krolock' group by lParent liefert nun 2046 Zeilen bei dem überall die Zählspalte c den Wert 1 besitzt.
"Ganz Gallien?" - Nein in einer Zeile steht ein 2, das ist die gesuchte Zeile. Um die Einserwerte zu eleminieren bauen wir noch ein Select um das Zwischergebnis herum, indem wir mit where c > 1 nur die Mehrfachnennungen aufzeigen und -falls ihr so richtig Mist beim Loggen hinbekommen habt- sortieren wir noch nach c absteigend

Zu kompliziert?

Solltest du jetzt denken " .... HÄ ???? .... ", so kann ich dich beruhigen.
Nimm einfach folgenden Code und ersetzte Krolock durch deinen Nickname.
Drücke dann auf F9 und schon siehst du den GCCode der Caches bei denen du doppelt geloggt hast.
select * from (SELECT count(*) c, lParent FROM Logs where lType = 'Found it' and lBy = 'Krolock' group by lParent) where c > 1 order by c desc