Let’s play tennis, with TDD

TDD & Code Kata’s

Now I’m working since more than four months as a software engineer at bbv Software Services in Switzerland. Every new employee at bbv needs to attend several courses (bbv Academy) to improve and extend his skills towards a good software developer. After my Scrum Master course, the next one on my schedule was Test Driven Development.

In addition to the theory why TDD, clean code and pair programming is highly desirable the course was accompanied with hands-on code kata’s. For those who don’t know what a code kata is, here is a citation from Wikipedia:

A code kata is an exercise in programming which helps a programmer hone their skills through practice and repetition.

One kata of the course was the Tennis Scorer. The goal was to implement a mechanism, which prints the score of a single game (therefore there are no sets).

Our Referee

The rules given were the following:

  1. A game is won by the first player to have won at least four points in total and at least two points more than the opponent.
  2. The running score of each game is described in a manner peculiar to tennis: scores from zero to three points are described as “love”, “fifteen”, “thirty”, and “forty” respectively.
  3. If at least three points have been scored by each player, and the scores are equal, the score is “deuce”.
  4. If at least three points have been scored by each side and a player has one more point than his opponent, the score of the game is “advantage” for the player in the lead.

Our implementation should be based on the ITennisScorer interface, which of yourse was changed during the exercise.

</span>
<pre>namespace Tennis
{
    public interface ITennisScorer
    {
        void AchievesScore(Player player);

        string GameScore { get; }
    }

    public enum Player
    {
        PlayerA,
        PlayerB
    }
}

Because it was a TDD course, we needed to build up a TODO list of appropriate unit tests first (e.g. Game just started, no one scored so far, expected score “love”).

Then we implented the unit tests one by one. Each of them had to fail first. Then came the actual implementation, test should pass afterwards. Code Refactoring -> All tests should pass.

Our Players

My initial implementation was blotched with many if statements, handling all the special cases for the game score (deuce, advantage, …). I also had code duplication, because I needed to track and update the score of player A and B separately.

But here comes the ultimate advantage of TDD. You’re not afraid anymore to refactor your code to a better architecture and solution. Because you know you can (and should) always run your unit tests and see if everything is still behaving as desired. You can sleep comfortably without to fear the next morning from an upcoming design change. Ok, I know. Some can still sleep during the nights without TDD, but they will be haunted by bad dreams ;)

So I refactored my code and eliminated the code duplication. Instead of using an enum to track the actual player score, I simply use a two-dimensional array, which holds all the possible scores of a game.

namespace Tennis
{
    public class TennisScorer : ITennisScorer
    {
        private int scoreA;
        private int scoreB;

        private const string GameA = "gameA";
        private const string GameB = "gameB";
        private const string AdvantageA = "advantageA";
        private const string AdvantageB = "advantageB";

        private static readonly string[][] PlayerScores = new[]
            {
                new[] {"love",  "15:0",     "30:0",     "40:0",     GameA},
                new[] {"0:15",  "15:15",    "30:15",    "40:15",    GameA},
                new[] {"0:30",  "15:30",    "30:30",    "40:30",    GameA},
                new[] {"0:40",  "15:40",    "30:40",    "deuce",    AdvantageA},
                new[] { GameB,   GameB,     GameB,      AdvantageB}
            };

        public void AchievesScore(Player player)
        {
            switch (player)
            {
                case Player.PlayerA:
                    UpdateGameScore(ref scoreA, ref scoreB);
                    break;
                case Player.PlayerB:
                    UpdateGameScore(ref scoreB, ref scoreA);
                    break;
            }
        }

        public string GameScore
        {
            get { return PlayerScores[scoreB][scoreA]; }
        }

        private void UpdateGameScore(ref int playerToAddScore, ref int opponentScore)
        {
            if (GameScore == AdvantageA || GameScore == AdvantageB)
            {
                opponentScore--;
            }
            else if (GameScore != GameA && GameScore != GameB)
            {
                playerToAddScore++;
            }
        }
    }
}

The Regulating Authority

I also refactored my unit tests. There were many tests, testing all the possible game processes. But my course instructor gave me the hint to use Nunit’s RowTest. Instead of writing many, almost identical tests for each case, I wrote just one parametrized unit test and the many case were provided as a parameter.

namespace Tennis.Test
{
    using NUnit.Framework;
    using FluentAssertions;

    [TestFixture]
    public class TennisScorerTest
    {
        private TennisScorer testee;

        [SetUp]
        public void SetUp()
        {
            testee = new TennisScorer();
        }

        [TestCase("", "love")]
        [TestCase("A", "15:0")]
        [TestCase("AAB", "30:15")]
        [TestCase("AAAB", "40:15")]
        [TestCase("BBB", "0:40")]
        [TestCase("BBB", "0:40")]
        [TestCase("ABABAB", "deuce")]
        [TestCase("AAABBB", "deuce")]
        [TestCase("AABBAB", "deuce")]
        [TestCase("AAABBBA", "advantageA")]
        [TestCase("AAABBBB", "advantageB")]
        [TestCase("AAAA", "gameA")]
        [TestCase("AAAAA", "gameA")]
        [TestCase("AAAABBBBBB", "gameA")]
        [TestCase("AAABBBBB", "gameB")]
        [TestCase("ABABABABABABABABABABABAA", "gameA")]
        public void PlayerScores(string game, string expectedScores)
        {
            foreach (var currentScore in game)
            {
                switch (currentScore)
                {
                    case 'A':
                        testee.AchievesScore(Player.PlayerA);
                        break;
                    case 'B':
                        testee.AchievesScore(Player.PlayerB);
                        break;
                }
            }
            testee.GameScore.Should().Be(expectedScores);
        }
    }
}

References & Coaches

If you want to practice your programming skills, I can encourage you to do some code kata’s, or similar challenges, to stay fresh in your head.

Here is a list of some useful sites with some brain-teasers and, if given, their solutions:

My Tennis Scorer implementation is available on GitHub.

Category: C#, Coding  Tags: , ,  One Comment

Hirnzellen knacken beim Möbelpacken

Wer braucht schon Sudoku?

Also ehrlich. Wer braucht schon diese Rätselheftchen, die man im Kiosk für knapp 2 Franken kaufen kann.
Wer seine Gehirnmasse trainieren will, der kann uns das nächste Mal beim Zügeln helfen :-)

Da gibts nämlich die kniffligsten Aufgaben

Wo waren schon wieder diese IKEA Anleitungen…?

  • Aah, da sind sie ja. Wo sind aber die 64 Schrauben für die Schranktüren?
  • Warum musste ich mir einen überdimensionierten Schrank kaufen. Das Zeug kann man ja nur in senkrechter Position aufbauen.
  • Zwischen den Lippen finden 13 Schrauben Platz (Anzahl kann je nach Grösse der Klappe variieren)

Wie transportiere ich ein Sofa mit dem Lift?

  • Gar nicht! Blöder Pythagoras. Die Rechnung ging gar nicht auf.

Das Bett heisst Hopen, quietscht aber beim Poppen. Schlage IKEA vor diesen Namen zu ändern.

Ah ja, die Lampen. Kein Problem, kaufen wir doch neue. So energiesparende. Sind ja momentan ganz im Trend:

  • Ähm… ja. Energiesparlampe, stromsparende Halo Eugen Lampe, LED, Leuchtröhre.
  • 11 Watt entspricht 68 Watt. 764.4657 Lumen, kalt, warmweiss, blau, gelb (ist ja ein ganzer Farbkasten hier)
  • Leuchtet sofort 100%, manche erst nach 30 Sekunden (als ich sie anschloss leuchteten sie gar nicht)
  • Hält 2 Jahre, 6 Jahre, sogar 25 Jahre (will mal sehen wer so lange die Garantie aufbewahrt)

Strom und so

  • Phasenprüfer: Egal ob der Schalter auf ON oder OFF ist, der blöde Prüfer leuchtet andauernd.
  • Holen wir ein Multimeter: Wieso fliessen 78 Volt wenn der Schalter auf OFF ist?
  • Bohrmaschine läuft nicht wenn die Sicherungen draussen sind.
  • Sind diese Handschuhe gegen Stromschläge gedacht?
  • Im Wohnzimmer fehlt ein Draht. Man kann keine Lampe mit einem Draht anschliessen. Oder haben wir Wireless Strom verpasst?
  • 650 Watt Bohrmaschine reicht nicht um Löcher in die Decke der Küche zu bohren. Liebe Nachbarn: Wir bitten um Entschuldigung für die 40 Minuten um drei Löcher zu bohren.
  • Der Null-Leiter ist der blaue Draht, bei alten Systemen der braune Draht. Bei Conforama Lampen anscheinend der rote Draht.

Hausratversicherung

  • Befindet sich in der Nähe von 100 Metern ein Hydrant? Was weiss ich?!? Die Feuerwehr ist grad um die Ecke, reicht das?

Was ist der maximale Winkel beim Verlegen vom Netzwerkkabel, damit die Elektronen nicht aus der Kurve schiessen?

Wieviel 20 Räppler brauche ich um die Kochwäsche vollständig durchlaufen zu lassen?

Die absolute Knacknuss?

100 Punkte gehen an die gekaufte Lampe von Thailand.
Ich brauchte 1:20h um eine 30-teilige Lampe zusammenzubauen. Hey, immerhin eine halbe Stunde weniger als beim Lucerne Marathon.
Und ohne Fehler, musste nie von vorne anfangen. Hab mir auch schön viel Zeit genommen bzw. nehmen müssen.
Mein räumliches Denkvermögen hat sich vermutlich um 687% verbessert.

Seht aber am Besten selbst wie das Kunstwerk nun aussieht.

Category: Fun  Tags: ,  2 Comments

Debug- und Testcode haben nichts im Release zu suchen

Jaja, da hab ich mir doch die Sunrise Mein Konto App von Google Play runtergeladen. Mit der App kann man unter sein eigenes Sunrise Konto zugreifen und dabei laufende Kosten, Inklusivleistungen und Rechnungen der eigenen Produkte einsehen. Es ist wirklich eine gute App, teilweise umständlich zu navigieren aber ansonsten ist alles ersichtlich was man an Kontoinformationen braucht.

Und Windows Phone 7?

Da dachte ich mir doch: Hey, eine solche App muss ich auf dem Windows Phone 7 auch haben. Aber leider Fehlanzeige. Für WP7 gibts von Sunrise noch keine App.
Ja gut, dann schreib ich doch selber eine Sunrise Mein Konto App fürs WP7.

Doch so einfach ist das nicht: Die Verbindung zwischen App und Server ist mit SSL gesichert. Ich habe keine Ahnung welche Services (REST, SOAP?) an welchen Endpunkten aufgerufen werden. Was für Daten und in welcher Form (JSON, XML?) diese übertragen werden. Wie läuft der Login Vorgang, HTTP Authentication, GET/POST Variablen, selbstgemachtes Gemüse? Hier wurden die Hausaufgaben gut gemacht, der Datenverkehr ist verschlüsselt.

Aber ich möchte dennoch herausfinden was so vor sich geht. Machen wir doch eine Man in the Middle Attacke mit dem Emulator. Dafür werde ich meine persönlichen Login Daten opfern müssen.
Das Übliche halt:

  • Meinen PC als Proxy dazwischenschalten, am Besten mit Charles Web Debugging Proxy
  • Lokales Zertifikat erstellen wo www1.sunrise.ch als Common Name eingetragen ist
  • Das “Sunrise” in den Zertifikatsspeicher des Emulators oder eines echten Android Gerätes (Root Zugriff erforderlich) installieren
  • Applikation auf Emulator oder Android Gerät laufen lassen und mit LogCat zugleich noch den Output der App aufzeigen

Aber ich bin gerade auf Wohnungssuche, habe also keine Zeit und brauche eine schnellere Lösung ;)

Hey App, lass mich rein, ich bin Entwickler

Meine Faulheit muss ja bekanntlich belohnt werden. Und das wurde ich auch. :-D
Ich wollte sehen ob die App irgendwelchen Debug Output an LogCat sendet und habe die offizielle App von Google Play runtergeladen. Der Output war jedoch minimal. Einige Standardmeldungen wie “Login successful” kamen heraus aber nichts Auffschlussreiches über die Internals der App.

Also habe ich mich etwas am APK File zu schaffen gemacht. Mit dem APK MultiTool die App dekompiliert, und anschliessend das AppManifest.xml in Klartext geöffnet.
Folgendes ist mir aufgefallen:

  1. android:debuggable=”true” ist nicht gesetzt. Ist auch gut so, ist ja schliesslich ein Release und keine Debug Version.
  2. Eine Activity mit Namen Administration ist registriert. Lässt vermuten, dass es irgendwo in der ofiziellen App einen ServiceDialog o.ä. gibt.
Also schön das Debug Flag setzen und die XML Datei speichern. Mit dem APK MultiTool die “modifizierte” Applikation wieder in ein APK File builden und anschliessend noch erneut signieren.

Oh, ich bin ja schon drin

Und wer hätte das gedacht: Die Debug Statements wurden alle schön brav mit in die ofizielle App kompiliert. LogCat spuckte fröhlich alle möglichen Statements raus. JSON Objekte und Inhalt, Hostnamen und Pfade der jeweiligen Services, Login Infos uvm.

LogCat Output

Debug Infos im LogCat Output

Nun gut, aber was ist mit der registrierten Administration Activity? War nicht schwer herauszufinden. Sobald man im Login Screen ist, einfach mal den “Search” Button drücken (F5 im Emulator) und schon kommt man ins Service Menü, oder sollte ich besser sagen in den Test Dialog? Das neue APK File auf mein Android Gerät installiert. Übrigens: Die App lässt sich auch installieren, wenn “Installation von Nicht-Market Anwendungen zulassen” deaktiviert ist.

Fazit

Service Dialog

Service Dialog

Es ist nichts sensitives ans Tageslicht gerückt. Ich habe weder Zugriff auf vertrauliche Kundendaten erhalten oder sonstige Hinweise auf sicherheitskritische Bereiche. Da haben die Entwickler der App gute Arbeit geleistet.

Aber dennoch sollte man darum bemüht sein Debug Informationen, Testdaten, Testabläufe und sonstige interne Informationen nicht in den offiziellen Release zu veröffentlichen. Solche Daten verschwenden nicht nur zusätzlichen Speicher auf dem Phone, sondern sie können sicherheitskritische Informationen an jedermann preisgeben.

Testabläufe sollten auch möglichst mithilfe von Tools und Unit Tests vorgenommen werden und nicht mit echten Testern, welche auf Test Screens mit den Fingern herumdrücken. Solche Tests sind nicht immer einfach. Dies resultiert auch oft daraus, dass eine Entkopplung vom User Interface und der Business Logic nicht einfach zu bewerkstelligen ist. Ein guter Ansatz um eine gute Entkopplung zu erzielen und somit die Applikation “testbarer” zu machen wäre das Model View ViewModel (MVVM) Pattern.

Ich persönlich freue mich sehr über die ganze Sache. Dadurch habe ich genug Einblicke bekommen um meine Windows Phone App zu entwickeln. Die Authentisierung läuft über HTTP POST. Die Session wird mittels eines Login Keys, welcher vom Server zugewiesen wird, identifiziert und die Daten werden im JSON Format vom Server zurückgesandt.

Category: android, Coding  Tags: , ,  Leave a Comment

Biken nach der langen Reisepause

Hab ich’s noch drauf?

Mein achtmonatiger Asia-Pacific Trip ist nun seit zwei Wochen zu Ende. Es wird mal langsam Zeit wieder aktiv und regelmässig Sport zu betreiben. Ich hatte während den ersten vier Monaten in Australien Sport betrieben aber kaum in der gewohnten Regelmässigkeit wie in der Schweiz. In Südostasien wurde dies immer schwieriger. Velos konnte man nicht überall mieten, zum Joggen war’s oft zu heiss.

Biken Glaubenberg – Nahe der Passhöhe auf 1540m

Mein Mountainbike ist zwar eher in einem mässigen Zustand aber durch einige, von mir durchgeführte, Reparaturen lässt es sich wieder fahren. Also ab auf’s Bike. Wollte prüfen ob ich überhaupt noch annähernd so fit bin wie vor acht Monaten. Ich wollte zuerst keine anstrengende Route wählen aber dann schoss mir der Gedanke zum Glaubenberg zu fahren in den Kopf. Ich konnte mich mit der Idee anfreunden und erachtete es als ein realistisches Ziel.

Ich konnte jedoch erst um 15:30 Uhr starten und wusste, dass es dunkel werden könnte bevor ich wieder zu Hause ankomme, aber ich wollte es dennoch versuchen.
Zu meiner Überraschung habe ich meine Erwartungen übertroffen, was mir den Beweis gab, dass ich nicht all zuviel an meiner Fitness eingebüsst habe während meiner mehrmonatigen Reise. Freue mich bereits diese Strecke eines Tages mit einem Rennvelo zu fahren.

Leistungsdaten

Daten wie Geschwindigkeit und zurückgelegte Strecke (mit GPS) sowie Herzfrequenz (mit Brustgürtel) habe ich mit einer Polar RS800CX aufgezeichnet.
Unten sieht man die gefahrene Strecke in Google Maps sowie die Profile für Herzschlag, Geschwindigkeit und Höhe. Schön zur Anzeige gebracht wird dies über das WordPress XML Google Maps Plugin von Patrick Matusz.

Strecke: 74km (Littau – Malters – Finsterwald bei Entlebuch – Glaubenberg – Sarnen – Littau)
Dauer: 3:55h
Aufstieg: 1378m

Elevation Profile
Speed Profile
Heartrate Profile

Datenaufbereitung

Export und Aufbereitung der Daten von der Polar Personal Trainer 5 (PPT) Software für das WordPress Plugin ist etwas umständlich.
In der GPX Datei von PPT werden nur die üblichen GPS Daten festgehalten. Zusätzliche Daten wie Herzschlag, Kadenz, Höhe (Barometer) usw. werden in einer separaten HRM Datei gespeichert.
Die Zusatzdaten in der HRM Datei können mit dem Polar HRM to GPX Merger tracksbox.net in die GPX Datei eingebettet werden.

Category: Biken  Tags: , , ,  Leave a Comment

PADI Rescue Diver & EFR @ Perhentian Island

Die Reise geht langsam dem Ende zu. Noch knapp 10 Tage und dann geht’s wieder zurück in die Schweiz. Sabrina hatte leider bis zum heutigen Tage keine Tauchausbildung gemacht und das wollte ich natürlich noch ändern ;)
Auf der Trauminsel Langkawi in Malaysia haben wir ein schweizer Pärchen kennengelernt. Sie wollten ebenfalls den PADI Open Water machen und sie inspirierten uns unseren geplanten Trip durch Malaysia komplett umzusztellen und mit Ihnen nach Pulau Perhentian Kecil zu reisen um gemeinsam zu tauchen.
Sabi fühlte sich etwas unwohl was das Tauchen anbelangte. Den Discovery Dive, den sie in Vietnam gemacht hatte war eher schreckerregend statt vertrauenerweckend. Dort hatte sie nämlich keine detaillierte Schulung gekriegt und musste dem Material sozusagen blind vertrauen. Da hätte ich persönlich auch meine Bedenken gehabt. Dies sollte nun ganz anders aussehen und ich brachte Sabrina dazu sich für den Open Water anzumelden.
Damit mir nicht langweilig wurde währenddessen sie ihre Ausbildung absolvierte, gönnte ich mir die PADI Rescue Diver und Emergency First Responder (Nothelferkurs) Ausbildung für drei Tage. Fun Dives wollte ich anschliessend mit Sabi machen, sobald sie ihr Zertifikat in der Tasche hatte.

Mentale Stärke ist gefragt

Der einmonatige Ramadan wurde am Ende mit einem grossen Fest abgeschlossen. Darum war es sehr schwierig für unser gewünschtes Datum von der Westküste zur Ostküste zu gelangen. Schliesslich hatten wir es geschafft einen Busanbieter zu finden. Wir mussten zwar zwei Mal mitten in der Nacht umsteigen aber wir erreichten unser Ziel immerhin “nur” mit einem Tag Verspätung. Zum guten Glück kamen wir schon um 8 Uhr früh an. Die Hotels waren praktisch alles ausgebucht und wir konnten mit Glück ein nettes Bungalow finden. Eine Stunde später waren wir schon in der Tauchschule und fingen unseren Unterricht an. Da ich einen Tag zu spät kam sollte ich die ersten Kapitel am anschliessenden Abend nachbüffeln.

Schade, denn dadurch habe ich am ersten Schultag schon mal total versagt. Als wir von unseren gespielten Notfallübungen mit dem Boot zur Schule zurückfuhren, sprangen plötzlich zwei Insassen vom Boot ins Wasser und schrien um Hilfe. Das Ganze war natürlich gestellt. Nun wurde ich zusammen mit dem anderen Schüler, der übrigens erst 17 Jahre alt war, zur Hilfeleistung gefordert. Der andere Schüler sprang dann mal ins Wasser und ich wusste nicht wie weiter und machte es ihm nach. Grosser Fehler!!! Das habe ich aber am Abend beim Nachbüffeln erst erfahren.

Sobald ich ohne Flossen, Maske, Schnorchel und der ganzen Tauchausrüstung ins Wasser hinein sprang, fing der ganze Ärger erst richtig an. Dem Mitschüler befahl ich zu der “ertrinkenden” Frau, die natürlich total panisch um sich schlug, zu schwimmen und ihr zu helfen. Ich widmete mich meinem Instruktor zu, da er schwerer und grösser war und vermutlich eine Spur zu anstrengend für meinen Mitschüler gewesen wäre. Nun, mein Ausbildner wollte es mir auf die harte Tour beibringen. Er schlug dauernd um sich, versuchte mich unters Wasser zu kriegen und mich zu packen. Ich konnte mich mit den gelernten Techniken jeweils von einer sicherer Distanz aus von ihm entfernen. Aber nach einiger Zeit dachte ich mir ich müsse ihn doch endlich mal retten, tauchte unter Wasser und versuchte ihn von hinten zu packen und somit an der Oberfläche zu beruhigen. Sense, sobald ich ihn von hinten packte und zur Oberfläche schwamm nahm er mich in den Schwitzkasten. Kein Wunder, er hatte ja keine Tauchflasche am Rücken und deshalb funktionierte mein Trick um ihn festzuhalten nur teilweise.

In den Klauen des Opfers

Nun kam der anstrengendere Part: Zwar hatte ich den Taucher fest im Griff, er mich aber auch. Er benutzte meinen Körper regelrecht als Schwimmring und drückte mich dadurch immer wieder nach unten. Am Anfang war das keine grosse Sache, da ich genügend lange die Luft anhalten konnte. Aber nach jedem weiteren Versuch mich zu befreien kam ich schnell aus der Puste. Mein Mund war immer knapp über der Wasseroberfläche und jedesmal wenn eine Welle kam, bekam ich eine schöne Nasenspülung. Ich hatte immer mehr Mühe nach Luft zu schnappen. Auch wenn es nur eine Übung war, diese Situation strapazierte meine Nerven gewaltig. Ich wusste genau, dass im Ernstfall diese unvorteilhafte Lage mein sicheres Ertrinken bedeuten würde. Ich realisierte wie schnell aus einer vermeintlich ungefährlichen Situation innerhalb von wenigen Sekunden das eigene Leben in Gefahr stehen konnte. Mein Ausbildner lies mich dann los und erklärte uns anschliessend unsere gemachten Fehler. Ich büffelte die ersten Kapitel am Abend nach und wusste, dass praktisch alles was ich gemacht habe falsch war. Darin stand ganz gross

Stop, Breathe, Think, Act

Ich hatte mich direkt für den letzten Schritt entschieden, nämlich ins Wasser zu springen. Die ersten drei Schritte hätten mir geholfen die Lage zu analysieren und mit Scharfsinn entsprechende Rettungsmassnahmen einzuleiten. Ganz nach dem Motto: Safety first! Ganz einfach wäre gewesen, wenn ich vom Boot aus einen Schwimmring mit Seil zum Opfer geworfen hätte. Oder den Kapitän aufgefordert zur Unglücksstelle zu fahren und die Taucher mit einer Verlängerung (Stab, Seil, …) an Bord zu ziehen. Wenn alles nichts hilft, so sollte man erst dann die Möglichkeit ins Wasser zu springen in Erwägung ziehen. Aber immer mindestens mit Flossen, Maske und Schnorchel. Viel besser, man hat Zeit um seine Tauchausrüstung anzulegen, da man in diesem Fall die Tarierweste (BCD) für einen wesentlich erhöhten Auftrieb und die Luftflasche zum atmen sich als grosse Unterstützung erweisen. Können BCD und Luftflasche nicht angezogen werden, so mindestens etwas für den Auftrieb mitnehmen (Rettungsring, Benzinkanister, Tankflasche, Luftmatratze). Dies sind alles Gegenstände welche man der Person in Not reichen kann. Diese können sich daran festhalten und sich somit gegen Erschöpfung und Ertrinken schützen. Hat man nichts von alledem, so bleibt man auf sicherer Distanz zum Opfer und versucht dieses zu beruhigen. Im schlimmsten Falle wartet man solange bis das Opfer erschöpft oder bewusstlos ist und unter Wasser geht um es erst dann mit den entsprechenden Abschlepptechniken an eine sichere Stelle zu bringen.

Gut, muss ja gelernt sein. Habe im Nachstudium meine Fehler erkannt und die nächsten zwei gestellten, aber dennoch überraschend aufgetretenen, Notsituationen konnten wir dann besser meistern.

Fazit

Nun fühle ich mich viel sicherer im Wasser. Mit der Ausbildung, wie man Notsituationen erkennen, vermeiden oder damit umgehen kann geben einem zusätzliche Sicherheit im Wasser. Ich weiss, dass ich (hoffentlich) nicht hilflos ausgeliefert bin, wenn jemand (oder ich selber) in Not ist und man weiss was man tun kann um zu helfen. Denn: Jegliche Hilfe ist besser als keine Hilfe!
Und der zusätzliche Nothelferkurs war eine gute Auffrischung, damit man auch über Land in Notsituationen Hilfe leisten kann.

So, nun genug von Ausbildung. Das nachfolgende Video zeigt meinen ersten Fun Dive, den ich mit Sabrina als Buddy machen durfte. Jegliche Angst, die sie vor dem Tauchen hatte ist nun verflogen. Ihr gefällt’s, es macht ihr Spass und nun schwärmt sie schon davon mit mir im roten Meer zu tauchen ;)

Diving @ The Great Barrier Reef (9.-11.4.2012)

Nun sind knapp zwei erlebnisreiche Wochen mit StevO im Litchfield und Kakadu National Park im Northern Territory vergangen. Die Ostküste darf bei einem Australien Aufenthalt natürlich keinesfalls fehlen und darum gehts nun weiter mit dem Billigflieger nach Cairns in Queensland. Damit ja nicht langweilig wird treffen wir dort Magic P1450359.jpgmit seiner Freundin Marion, die gerade den weiten Weg von der Schweiz hinter sich haben, und Jonas, der ebenfalls in Perth die Sprachschule besucht hat. Nach wenigen Tagen Party machen, Sonne geniessen und einigen, teils erfolgreichen, Wakeboard-Versuchen kam als Nächstes das Great Barrier Reef ins Visier. So haben wir alle beschlossen einen zwei bzw. drei Tages Tauchtrip auf dem Schiff, der Kangaroo Explorer, zu verbringen. Da ich den Open Water bereits schon habe, entschloss ich mich zusammen mit Marion meine bevorstehenden zehn Tauchgänge mit der SSI Advanced Adventurist Prüfung zu ergänzen.

Alle Bilder des Liveaboard Trips gibts in meinem Picasa Album.

Tagesablauf auf der Kangaroo Explorer

Das Programm war eher locker teilweise aber auch sehr intensiv. Morgens um 05:15 ist der erste WakeUp Call. 15 Minuten später folgt der Zweite für die Schlafmützen, die noch im warmen Bettchen liegen. 06:10 bereits der erste Tauchgang ohne Morgenessen. P1450558.jpgDieses folgt anschliessend. Danach ein weiterer Tauchgang vormittags, einer nachmittags und um den Tag schön abklingen zu lassen folgt ein Nacht-Tauchgang. Letzteres war für mich absolutes Neuland als auch Highlight zugleich. Beim WakeUp Call stand bereits schon der Kameramann neben der Türe um die verschlafen dreinblickenden Gesichter aufzuzeichnen. Hat bei mir jedenfalls nicht geklappt. Am zweiten Morgen stand ich bereits schon vor der Türe und verpasste dem Anklopfer wohl den Schreck des Lebens. Mit soviel Energie um diese unchristliche Zeit hat wohl keiner gerechnet.

Say Cheese

_MG_0101.jpg Beim morgendlichen Tauchgang war ich erstaunt wie schnell die Sonne aufging. Unter Wasser herrschte bereits schon Hochbetrieb. Die Sicht war stets perfekt (>20m). Man konnte zur Mittagszeit auch Schnorcheln gehen und man sah fast ebenso viele Fische wie beim Tauchen. Bei den Tauchgängen wurde ich für die von mir gewählten Spezialitäten für die Advanced Prüfung geschult. Unterwasserfotografie, Navigation, Deep Dive (30m), Meereskunde und der Night Dive. Persönlich fand ich das Fotografieren unter Wasser das Anspruchsvollste. Stets den Körper und die Kamera ruhig halten um scharfe Bilder hinzukriegen. Die Lichtverhältnisse sind unter Wasser ebenfalls schwierig. Einerseits hat man weniger Licht unter Wasser und man muss vielmehr auf den optimalen Aufnahmewinkel achten. Andererseits verlieren die Farben schnell an Gewicht. Rot wird dabei am stärksten absorbiert und die Bilder wirken oft fad. Da ich keinen Rotfilter vor der Linse hatte und man keinen Live Weissabgleich machen konnte, wirken die Bilder manchmal farblos.

Wo ist Nemo?

Die Meereskunde war irgendwie verwirrend. Nach einer kurzen Einführung wie das Great Barrier Reef vermutlich entstanden ist wurden mir und meinem Buddy Marion mehrere Schablonen mit aufgedruckten Fischen und Pflanzen in die Hände gedrückt. P1450650.jpgDie Aufgabe war, einige dieser Arten unter Wasser zu finden und als Beweis zu fotografieren. Keine Zeit die gesuchten Arten vorher zu studieren. Kamera packen und ins Wasser. Wir hatten echt Mühe die Zielobjekte zu finden, hatten auch keine Ahnung wo man suchen soll. Zugleich mussten wir auch sparsam mit unserer Luft umgehen für einen möglichst langen Tauchgang um somit mehr Zeit für die gewünschten Aufnahmen zu haben. Erstaunlich was man so alles an einem Ankerstein kleben sieht. Da konnten wir auf ein Mal fast die Hälfte der gesuchten Pflanzen abknipsen.

Haste einen Rausch?

P1450690.jpg Am zweiten Morgen kam ich erst recht nicht auf die Höhe. 05:30 Uhr, Deep Dive auf unter 30m war angesagt. Bei dieser Tiefe wurden mir Rechenaufgaben gestellt, Koordination und Orientierung geprüft um zu ermitteln ob ich in einem Tiefenrausch verfallen bin. Eine Stickstoff-Narkose, auch Inert-Narkose genannt, kann bereits bei einer Tiefe von 30m vorkommen. Heute geht man davon aus, dass diese Nervenzellen in ihrer Funktion durch den gelösten Stickstoff in dieser Tiefe gestört werden. Dies wirkt sich aus indem der Taucher in seinem Urteilsvermögen stark eingeschränkt werden kann, visuelle und physische Einschränkungen bis hin zur Bewusstlosigkeit. Ein typisches Phänomen, welches sehr irrational wirkt, ist, wenn der Taucher in dieser Tiefe seinen Regulator aus dem Mund nimmt. Zum Glück war ich beim Test nicht von der Narkose betroffen und konnte die Tests mit Bravur meisten. Aber Achtung: Dies heisst nicht, dass ich nun immun gegen den Tiefenrausch bin. Dies hängt immer von der individuellen körperlichen Verfassung und aktuellem Zustand ab.

Tag & NachtP1450400.jpg

Ich hätte nie gedacht, wie interessant ein Nachttauchgang sein kann. Die meisten Fische schlafen in der Nacht. Sie können zu dieser Zeit kaum etwas sehen und sind leichte Beute. Deshalb verstecken sie sich unter Steinen, Riffspalten oder Höhlen. Aber dennoch steht nicht alles still. Einige Fische sind munter auf der Jagd. Ein kluger wie auch dummer Fisch zugleich war der Red Snapper. Man kann mit der Taschenlampe die Beute des Red Snappers anleuchten. Wenn der fast blinde Snapper diese erspäht beginnt er seine Jagd. Um ihn zu unterstützen muss man jedoch die Beute bei ihrer Flucht mit der Taschenlampe verfolgen. Mit etwas Glück frisst der Snapper sein Opfer vor den Augen des Tauchers. Wir haben es immerhin geschafft beim einten Nachttauchgang 2.5 Fische von Red Snappern fressen zu lassen. Der halbe Fisch dadurch, weil er nur angeknabert wurde.
Interessant war die Erkenntnis, dass ich in der Dunkelheit sparsamer mit der Luft umgehen. Irgendwie scheine ich mich wohl vom ruhigen nächtlichen Treiben in der Unterwasserwelt mehr zu entspannen.

Und wie weiter?

P1450710.jpgDie Ausbildung ist nach 3 Tagen und zwei Nächten auf der Kangaroo Explorer zu Ende. Die Tauchgänge habe ich pflichtbewusst ins Log-Buch eingetragen. Nun bin ich bereit für mehr Tauchgänge. Wer weiss, vielleicht nehme ich mir den Rescue Diver ins Visier für die nahe Zukunft.

Scambodia – von Thailand nach Kambodscha

Hello Sir, Motobike?

Wir sind uns schon Einiges gewohnt nach knapp drei Monaten Backpacking durch Südostasien. Es fing ja schon in Vietnam an, wo manipulierte Taxi-Meter bis zu sechs Mal schneller zählten. Erstaunlich wie man bereits nach 15 Minuten Fahrt in einer Stau geplagten Stadt wie Hanoi bereits schon 25.4 km auf dem Zähler hat. Wir haben uns mittlerweile darauf eingestellt, wie wir uns bei solchen Tricks und Maschen verhalten sollen um die Abzocke möglichst zu minimieren.

Unser thailändisches Visum war nur für zwei Wochen gültig anstatt den üblichen 30 Tagen, da wir über den Landweg in das Land eingereist und nicht über den Luftweg. Darum mussten wir das Land spätestens am 24. Juli verlassen um Strafgebühren zu vermeiden.

Darum ein dicht gedrängtes – von einem eintägigen “it’s coming out at both ends” Zwischenfall verzögertes – Programm. Die letzten zwei Tagen waren hauptsächlich damit gefüllt, mit dem Nightsleeper Bus von Chiang Mai nach Bangkok zu gelangen. Anschliessend mit einem überteuerten “VIP” Minivan über die Grenze nach Siem Reap, Kambodscha, wo wir das Weltkulturerbe Angkor Wat mit seinen atemberaubenden und enorm dimensionierten Tempelanlagen besichtigen wollten.

Nach der langen Busfahrt nach Bangkok, die Verspätungen mit sich brachte da einige Zylinder während der Fahrt ausfielen, fielen wir leider einem Scam zum Opfer. Total übermüdet wurden wir mit dem Tuk Tuk in ein angeblich ofizielles TAT (Tourism Authority of Thailand) Reisebüro gebracht. Dort wollte man uns die Fahrt nach Siem Reap für 45 USD andrehen. Ich habe den Preis auf 30 USD runtergehandelt, bis ich anschliessend feststellen musste, dass der ofizielle Preis bei 10 – 12 USD liegt. Naja, muss ehrlich zugeben, das Ganze war genial inszeniert. Ein sehr Vertrauen erweckender und freundlicher Agent, der einem knallhart ins Gesicht lügt ohne zu erröten und vor allem ein gelungen kopiertes Fake-Büro. Man kann ja schliesslich nicht immer gewinnen ;)

Scambodia

Was das Visum für Kambodscha anbelangt liessen wir uns nicht reinlegen an der Grenze zwischen Aranya Prathet in Thailand und Poipet in Kambodscha. Wir hatten bereits vorher in Erfahrung gebracht, dass das Hauptgeschäft in Aranya Prathet aus Visa Scams besteht, wo den unwissenden Touris völlig überteuerte Visa angedreht werden. Man hört von eingeweihten Bus- und Tuk Tuk Fahrern, die einem zu ausserordentlich gut nachgeahmten Visa-Büros bringen, wo einem alles Mögliche vorgelogen wird um das Visum zu kaufen. Um sich ein genaueres Bild zu machen empfehle ich diesen Blog-Artikel.

So wurden wir nach ca. vier Stunden Fahrt von Bangkok kurz vor der Grenze an einer Raststätte abgeladen. Dort sassen bereits ca. 20-30 Touris, die zu Mittag assen. Eine freundliche Dame drückte uns ein Gesuchsformular für ein Visum in die Hand. Ich habe die sie gefragt, wieviel den das Visum kostet und ihre Antwort war 1300 Baht (43 USD). Als ich ihr sagte das Visum koste 20 USD hat sie geantwortet es sei nicht möglich an der Grenze mit Dollars zu bezahlen. Wir entgegneten ihr, dass wir sowieso in Baht zahlen wollen. Da hat sie geantwortet, das Visum koste 1000 Baht (auf einmal 300 Baht weniger) oder eben 20 USD, aber es sei nicht möglich mit $ zu zahlen. Wir standen auf und forderten höflich, wie uns versprochen wurde, direkt zur Grenze geführt zu werden. Ich bin dann zu den Touris gegangen und habe ihnen gesagt der ofizielle Preis sei 20 USD. Noch bevor ich weiterreden konnte, kam ein Mann zu uns und fragte ob er uns helfen könne. Ich antwortete ihm er solle uns bitte zur Grenze bringen damit wir ein Visum kriegen. Er antwortete harsch wir sollen jetzt, auf gut Deutsch, die Klappe halten. Er sei nicht für Visaanfragen zuständig sondern für den Transport. Wir entgegneten ihm, dass seine Antwort nicht angemessen wäre für sein angebliches “Can I help you?” Hilfsangebot. Er erwähnte erneut wir sollen jetzt schweigen und ihn ausreden lassen. Ja gut, wir wollen ja schlussendlich in Siem Reap ankommen also haben wir nichts mehr gesagt. Da war er auf einmal super freundlich und sagte er würde uns jetzt mit dem Tuk Tuk zur Grenze bringen. Logisch war er aufgebracht, wir bedrohten ihm ja sein Tageseinkommen.

Google, wo bin ich?

Als wir an der Grenze ankamen hatten wir das Problem, das wir nicht mal wussten ob wir an der Grenze waren. Ein riesiger Markt, ein grosses Casino, viele Schilder ausschliesslich in Thai beschriftet. Keine Ahnung. Hätte gerne mein Smartphone genutzt um zu sehen wo ich bin aber ich hatte keine Datenverbindung. Zum Glück hatte man uns einen Führer zur Verfügung gestellt, der uns tatsächlich zur thailändischen Grenze brachte. Hätten wir ihn nicht gehabt hätten uns womöglich Dutzende ein Visa andrehen wollen. Als wir einen Stempel im Pass später die Thai Seite verliessen hatten wir immer noch keine Ahnung was genau abläuft. Ein unscheinbares Schild deutete darauf hin, dass eine Richtung für Leute mit Visum, eine für jene ohne Visum und die dritte für Casino-Besucher gedacht sei. Es ist eine übliche Abwechslung vieler Thais am Wochenende über (oder in die?) Grenze zu gehen und sein Vermögen zu verscherbeln. Wir fanden dann endlich die offizielle kambodschanische Visa-Austellbehörde. Aber was uns drin erwartete hätte ich nie für möglich gehalten. Kein Wunder schneidet Kambodscha im aktuellsten internationalen Corruption Perceptions Index (CPI2011) so schlecht ab. Platz 164 von 183. Über dem Schalter hing ein Schild, wo angeschrieben steht ein Visum koste 20 USD. Der Beamte jedoch verlangte tatsächlich 30 USD, da eben noch “gewisse Administrationsgebühren” dazukommen. Ich bin ja nicht naiv, Korruption ist allgegenwärtig. Ich kenne es leider aus meinem Heimatland (nicht die Schweiz).

Scambodian visa

Scambodian visa

Aber so offensichtlich?!? An einer offiziellen Grenze? Das hätte ich nicht erwartet.
Ich hatte aber schon etwas vorgesorgt und nur 1400 Baht (ca. 42 USD) ins Portemonnaie gepackt. Den Rest hatte meine Freundin. Dem Beamten sagte ich dann, ich hätte nicht mehr Geld dabei, ich hätte bereits schon alles an thailändischer Währung ausgegeben, da ich das Geld nicht mehr in Kambodscha benötigen könne. Nach einigen mahnenden Worten wurden wir verdonnert uns hinzusetzten und zu warten. Die Pässe hatten wir nicht mehr, die hat der Beamte uns abgezwackt. Wir wurden langsam nervös, da der Führer und der Bus auf der anderen Seite bereits auf uns warteten. Aber wir blieben cool, spielten die dummen armen Backpacker vor, und nach fünf Minuten kam der Beamte und drückte uns die Pässe mit gültigem Visa (und Autogramm vom Sith höchstpersönlich – möge die Macht mit uns sein ;)) in die Hand.

Gotcha!

Der weisse Tempel

Unsere Kuriosität und Erwartungen waren sehr hoch als wir bereits von mehreren Backpacker in Laos gehört haben wir sollen unbedingt den weissen Tempel (Wat Rong Khun) 13km südlich von Chiang Rai besuchen. Niemand wollte uns verraten was uns dort erwartet und die dadurch erweckte Neugier hinderte uns auch daran im Reiseführer mehr darüber in Erfahrung zu bringen.

FrontviewZum Glück! Als wir nach knapp einer Stunde mit unserem Ein-Gang-Velo den Tempel vom verqualmten Highway 1 (ist halt kein Veloland wie die CH) aus erblickten stieg die Spannung noch mehr an. Die Tempelanlage wirkt durch die weisse Farbe der Mauern surreal, gar märchenhaft.

Als ich mich weiter zum Komplex näherte dachte ich mir es würden womöglich jetzt Elfen und Einhörner herausspazieren. Aber nichts dergleichen, da waren keine edlen Wesen die uns am Eingang willkommen hiessen, sondern verzerrte Kreaturen, die direkt aus der Hölle zu kommen schienen. Dies erweckte einen sehr bizarren Eindruck.

Komplett überrascht von dem was wir vorfanden stellten wir fest, dass es sich hier um einen buddhistisch-hinduistische Tempel handelt. Im Gegensatz zu anderen Tempeln Thailands, begann die Konstruktion dieser Anlage erst 1997 unter der Leitung des berühmten Thai Künstlers Chalermchai Kositpipat. Der 61-jährige Künstler will den Komplex bis voraussichtlich 2070 mit insgesamt neun Bauwekren fertiggestellt haben (Time Magazine). Im Moment leisten ihm 69 Schüler Hilfe dieses hochgesteckte Ziel zu erreichen.

Ghoulish creatures try to escape hell

Traditionell ist Weiss in Thailand eine Farbe der Trauer, hier wird sie als die Reinheit Buddhas symbolisiert und als Buddhas Weisheit, die hell über der Erde und dem Universum scheint.

Um zum Inneren des Tempels zu gelangen muss man zuerst eine Brücke überqueren, welche den Übergang vom Zyklus der Wiedergeburt zum Raum Buddhas wiederspiegelt. Unterhalb der Brücke befindet sich die Hölle, durchsät mit unzähligen furchteinflössenden Kreaturen und ausgestreckten Händen nach oben zeigend, welche verzweifelt versuchen von der Hölle zu entkommen. Aber ob jemand in den Himmel aufgenommen wird entscheiden die zwei Wächter (soviel ich weiss sollen sie den Tod repräsentieren) am Tor zum Himmel. Bridge and Gate to HeavenHat man die Pforte durchquert (und die Schuhe schön brav ausgezogen und die Kamera versorgt) gelangt man in die Versammlungshalle der Mönche (Ubosot). Im Inneren sind drei von vier Wänden mit aufwendigen und teilweise lebensecht erscheinenden Malereien beschmückt. Die letzte Wand ist noch grau, welche daran erinnert, dass das Bauwerk noch nicht fertiggestellt ist. Die Malereien sind meiner Ansicht ein künstlerisches Meisterwerk. Viele Details in den Bildern beinhalten versteckte Botschaften und indirekte Beziehungen zum irdischen Leben.

9/11 illustrationEin Beispiel illustriert den 9/11 Anschlag. Es ist jedoch nicht ein Flugzeug, welches in den Tower geflogen ist sondern vermutlich ein Angry Bird. Wenn man genauer hinsieht erkennt man vor de rechten Tower Superman, der zur Hilfe eilt. Wir hätten uns womöglich Stunden in der Halle aufhalten können und interpretiert und gegrübelt was all die Bilder bedeuten sollen. Sieht man die Malereien als Ganzes an, so ist ersichtlich das zuunterst das Übel weilt und man im Zyklus der Wiedergeburt langsam nach oben steigt bis man zuletzt erleuchtet wird und man im Nirvana landet. Leider darf man im Inneren keine Fotos machen. Wir waren ebenfalls total überrascht als wir im Innern einen Mönch vorfanden. Wir hätten uns nicht vorstellen können, dass “Geistliche” sich in einem solch “modernen” und bizarren Tempel aufhalten würden, aber dies schien dem Mönch gar nichts auszumachen.

Alles bis ins letzte Details gestaltet. Selbst die Warnschilder entsprechen dem künstlerischen Stil. Das Symbol für das Hundeverbot ähnelt einem Schlangenkopf, neben dem Rauchverbot Schild sind Totenköpfe und vieles mehr. Ein absolutes Muss für jedermann, der sich in Chiang Rai aufhält oder sonst etwas Aussergewöhnliches sehen möchte.

Fliegende Gibbons im Dschungel Laos’

Wenn sogar im Lonely Planet steht, dass es in einer Grenzstadt nichts zu tun gibt, dann sollte man dem auch Glauben schenken.

Bevor Sabi und ich die Grenze zu Thailand überqueren wollten, haben wir einen Halt an der laotischen Grenzstadt Huay Xai gemacht.

Aber was gibt es denn dort zu tun? Nun ja, nebst dem ganzen Grenzhandel wo billige Ware aus China und Thailand verhökert wird, gibt es den sogenannten Gibbon Experience. Wilderei, Abholzung, Raubbau und Abbrennen von landwirtschaftlichen Flächen gehörten zu der Tagesordnung im Bokeo Naturreservat vor einigen Jahren. Dies hat sich zum Glück etwas geändert. Das Projekt konzentriert sich darauf, die Einheimischen davon zu überzeugen ihr Einkommen mit Tourismus statt mit umweltzerstörenden Machenschaften zu sichern. Anstatt die bedrohten Gibbons, die kurz vor der Ausrottung standen, zu jagen, haben sie sich nun darauf konzentriert Baumhäuser zu bauen und sogenannte ‘zip-lines’ quer durch den Dschungel zu verlegen.

Das Ziel ist es Abenteurern ein unvergessliches Erlebnis zu bieten. Das Ziel ist es nach mehrstündigem Trekking und mehrmaliges Gleiten auf den zip-lines das Baumhaus zu erreichen. Die längste Zip-Line ist 700m lang, die höchste befindet sich 200m über den darunterliegenden Baumwipfeln und ist vermutlich die effektivste Lösung die eigene Höhenangst zu verlieren :)

Das Baumhaus, welches ca. 40m über sicherem Boden steht, erreicht man natürlicherweise nur mittels zip-line. Ein authentisches Robinson Crusoe kommt da in einem hoch. Vor allem WC und Dusche sind ein Highlight: Zwar ist der Eingang zum Klo mit einem Vorhang abgeschottet, aber wenn man einmal drin ist, ist man vollkommen exponiert. Das wohl schönste Panorama, welches ich je während dem Duschen erleben durfte. Die einzigen Gibbons die wir gesehen haben waren leider nur wir selber, da viele Freude und Angst geschrien haben als sie die zip-lines benutzt haben, was umliegende Tiere aufschreckt.

Aber nun genug geschwatzt, überzeugt euch doch einfach mal selber vom Feeling, wenn man in atemberaubender Höhe durch den Dschungel gleitet. Ein absolutes Muss, wobei aber gesagt werden muss, dass die Attraktion total überteuert war und der Service und die Sicherheitsmassnahmen teils sehr zu wünschen liessen. Ihr könnt meine Bewertung auch gerne bei tripadvisor nachlesen.

St. Patricks day and some people sitting on a bus…

It was St. Patricks day and also my last day in Perth. I was heading down to Northbridge on a Transperth bus to celebrate my finished CAE exam. I was bored to death because I was the only passenger.
My boredom vanished quickly when after a few minutes some crazy ozzies jumped in and started a medley. For unknown reasons the bus driver didn’t really enjoy the show ;)