Mittwoch, Januar 11, 2012

Gastbeitrag bei black-mesa.de

Direkt aus der Mittagspause eine kleine Meldung. Ich heute wurde mein erster Gastbeitrag auf dem Blog eines guten Freundes noch aus WoW-Zeiten veröffentlicht. Auf seinem Blog dreht es sich so wie bei mir auch oft um DotNET und C#. Für meinen ersten Gastbeitrag dort habe ich meinen Eintrag hier über die Implementierung von IEnumerable in nur 2 Zeilen übertragen. 
Den Beitrag findet ihr unter www.black-mesa.de.
In Zukunft hoffe ich noch mehr Beiträg dort veröffentlichen zu können. Wobei es sich in aller Regel um gespiegelte Beiträge die hier erscheinen handeln wird.
Den WebBlog von Pawel findet ihr auch ab sofort in meiner Linkliste.

Dienstag, Januar 10, 2012

WCF-Service: self hosted

Das hat ja nicht so lange gedauert, bis zum nächsten eintrag aber dieses Video ist einfach verbreitenswert. Ganz kurz umrissen: Ein Tutorial-Video wie man einen WCF-Service programmiert um ihn lokal auf dem Rechner zu hosten, also self hosted.

2012 – Starting Post

2012 hat begonnen und ich sitze wieder im Büro und habe keinen Uni-Stress mehr. Das bedeutet ich habe auch wieder mehr Zeit mich meinem Blog zu widmen und mit diesem Post gebe ich einen Überblick darüber, was mich im Moment umtreibt und worauf ich mich im Jahr 2012 freue!

Was mache ich den ganzen Tag? Nun ja, ich sitze im Büro und genieße die Vorzüge der Praxisphase. Täglich lerne ich nützliche und neue Dinge in Bereichen in denen die Duale Hochschule versagt hat. Dazu kommt noch, dass mich diese neuen Dinge endlich mal interessieren und mit einem gewissen Eigeninteresse präsentiert werden! Da macht es doch gleich wieder Spaß zu lernen.
Und wenn ich nicht im Büro hocke? Ich sitze daheim rum. Ich verbringe die meiste Zeit dann damit ein Leben zu führen. Mit allem was dazu gehört: Freundin, Haushalt, Hygiene und Lebenserhaltung. Ach ja, die Eigenunterhaltung nicht zu vergessen. Es haben sich immerhin 3 Spiele auf meinen Schreibtisch verirrt die gespielt werden wollen: Einmal etwas Altes: Dragon Age Origins. Dann etwas Neues: The Elder Scrolls V – Skyrim. Und etwas Altes in neuem Gewand: Halo Anniversary.
Irgendwie muss man sich ja davon ablenken, das Diablo 3 immer noch kein bestätigten Releasetermin hat.
Und wenn das alles immer noch nicht ausreicht dann schriebe ich an meinem aktuellsten Software-Projekt. Und diesmal ist es auch ein Software-Projekt, das ich auch durchziehen werde! Stehe ich doch diesmal kurz vor einer ersten wirklich lauffähigen Alpha, Beta, Gamma Version. Genaueres zum Projekt wird hier folgen, nur so viel: es wird kostenlos sein und für die meisten eher uninteressant bis total unnützlich.
Desweiteren geistern noch einige Weitere Dinge und Ideen in meinem Kopf, die ich für 2012 geplant habe. Immerhin habe ich mir für dieses Jahr einige gute Vorsätze gefasst, die auch mal umgesetzt werden sollen. Darunter auch der Klassiker „regelmäßig Blogeinträge verfassen“. Aber das wird auch dieses Jahr wohl wieder eher nichts werden. Deshalb versuche ich einfach jeden Monat mehr Einträge zu verfassen als den Monat des Vorjahres. Und das scheint dank der mageren Ausbeute des Jahres 2011 nicht sonderlich schwer zu werden. Ich werde meinen Themen treu bleiben und über so ziemlich alles schreiben.
Abschließend noch an alle, die an den Weltuntergang in diesem Jahr glauben. Ich kann euch beruhigen. Es ist längst unwiderlegbar bewiesen worden, dass dieses Jahr die Welt NICHT untergehen wird. Denn Marti McFly hat bereits das Jahr 2015 bereist.

Donnerstag, Oktober 27, 2011

Die EA-Origin EULA

Der Publisher Electronic Arts hat eine eigene Online-Plattform. Sie hört auf den Namen Origin. Aber was ist Origin? Gut, kurz gesagt ist Origin nichts anderes als Steam, nur mit einem Unterschied: Origin ist für EA-Titel exklusiv entwickelt und wird benötigt um zum Beispiel Battlefield 3 oder auch das bald erscheinende Mass Effect 3 zu spielen. Ok ein weiterer Publisher hat so eine Software veröffentlich, eigentlich kein Grund für einen BlogPost. Aber dies ist ja noch nicht alles...


Mit einer solchen Software, mit der nicht nur Spiele gespielt werden, sondern auch Spiele online bezogen werden können, kommt immer eine EULA mit. EULA ist allerdings ein sehr schwammiger Begriff. Um es juristisch korrekt zu benennen, ist es eine AGB. Und diese hat es in sich!

Um es kurz zu umreißen: Electronic Arts nimmt es sich heraus Daten von euren Computern zu erfassen, personenbezogene und nicht-personenbezogene. Leitet Daten an Drittanbieter weiter und nutzt diese um euch Werbung vor die Nase zu setzen. Desweiteren prüft EA über diverse Daten auf euren Rechnern ob ihr Spiele von EA installiert habt, die keine gültige Lizenz besitzen (Kopierschutz). Und bevor ich weiter interessante Stellen dieser EULA kurz umreiße: Origin ist eine Spyware!
Diese Tatsache, oder besser gesagt diese EULA, hat in der Szene für großen Aufschrei geführt und die Gamer in Deutschland auf die Barrikaden gebracht. Tausende haben Battlefield 3 gekauft und wollten es ja nun auch spielen. Aber dann so eine AGB. Nun entweder AGB annehmen, damit leben und Battlefield 3 spielen oder AGB ablehnen und Battlefield 3 nicht spielen. Und das obwohl die Spieler natürlich für das Spiel bezahlt haben!

Aber keine Sorge! Hier ist ein interessanter Artikel von GameStar. Dieser nimmt sich diese AGB mit Hilfe eines Anwalts zur Brust und zeigt, dass diese AGB gegen viele deutsche Gesetze verstößt!

Dazu hier das Fazit des Artikels:

Die Nutzungsbedingungen und der Endbenutzer-Lizenzvertrag von Origin sowie die Datenschutz-Richtlinien von Electronic Arts enthalten umfangreiche Verstöße gegen Verbraucher- und Datenschutzrechte. EA nimmt sich über die Nutzungsbedingungen das Recht heraus, einen umfangreichen Kopierschutz einzuführen, der in seiner Wirkung einer Spyware gleich kommt.
Ferner räumt sich EA das Recht ein, praktisch alle Daten über die Nutzer, über deren Computer sowie deren Verhalten zu erfassen und zu verarbeiten. Nach den ersten Protesten wurde zumindest die Klausel entfernt, nach der diese Daten für Marketingzwecke genutzt und weiter gegeben werden durften. Trotzdem sind aufgrund des hier an den Tag gelegten Datenschutzverständnisses von EA massive Datenschutzverstöße zu erwarten. Auch wenn EA sagen sollte, dass sie nicht soweit gehen werden, wie es in den EULA steht, dann bleibt die Frage: Wozu brauchen sie diese Rechte dann überhaupt?
Man nennt so etwas auch »Defective by design«. Wenn etwa ein EA-Mitarbeiter sich fragt, im welchen Umfang er die Nutzerdaten verwenden darf, dann schaut er in die EULA. Und wenn dort die derzeitigen Erlaubnisse stehen, ist anzunehmen, dass er davon ausgeht, dass sie den Rahmen des Erlaubten darstellen. EA versucht zudem den Nutzern an der Durchsetzung ihrer Rechte zu hindern, indem das Unternehmen alle Gewährleistung und Haftung ausschließt, zum Teil sagt, dass Nutzer sich nur durch Kündigung ihres Kontos wehren oder nur auf englisches Recht berufen und in England klagen dürfen. - GameStar.de 25.10.2011

In dem Fazit des GameStar-Artikels steht zwar, " dass Nutzer sich nur durch Kündigung ihres Kontos wehren oder nur auf englisches Recht berufen und in England klagen dürfen " , aber auch dies wird im Artikel entkräftet!

Mein persönliches Fazit: Ich habe Electronic Arts schon immer mit einem misstrauischen Blick angesehen und dieses Misstrauen wurde bestätigt. Ich will nun die Arbeit des Publishers nicht komplett verteufeln, aber trotzdem scharf kritisieren! Ich halte diese AGB für absolut rechtswidrig und sollte schleunigst an das deutsche Recht angepasst werden!
Für mich gibt es bereits eine Konsequenz: Vorerst keine Spiele von EA mehr auf meinem Computer zu spielen. Wofür habe ich eine XBOX 360?


Mittwoch, Oktober 05, 2011

Beta-Tester

In einem "gewöhnlichen" Spielerleben erhält man oft irgendwelche Beta-Zugänge und nur selten gehört der Zugang zu einem Spiel, das einen wirklich interessiert. Für mich ist heute einmal der Tag, an dem einen ein Zugang, genauer gesagt ein Beta-Key zu einem Spiel erreicht hat, welches mich wirklich interessiert.


Sobald ich in Erfahrung gebracht habe, ob ich Beta-Informationen publizieren darf oder nicht werde ich hier natürlich einen entsprechenden Post einstellen :D

Mittwoch, August 31, 2011

Reactive Extensions

Wie im voran gegangenen Post schon erwähnt, kommt nun ein kurzer Post zu Reactive Extensions, kurz: Rx.

Reactive Extensions sind wie der Name schon sagt, reaktive Erweiterungen für das .NET-Framework, aber was bedeutet das genau?  Oder was ist reaktives Programmieren ??

Wikipedia beschreibt es so:
In computing, reactive programming is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow.

Ich würde es wie folgt beschreiben: Als Beispiel nehmen wir mal ein Beispiel aus meiner aktuellen privaten Arbeit, eine Windows Phone 7 - App. Diese Application muss natürlich mit Daten gefüttert werdem, aus dem Internet, aus einer Datenbank oder vielleicht auch von einer Benutzereingabe! Und wie diese App an Daten kommt, ist der bisher übliche Weg gewesen, nach diesen Daten zu fragen. Ein sehr einfaches und gutes Beispiel, dass auch in vielen WebCasts genannt wird ist Console.ReadLine();. Dies ist interaktiv, interaktives Programmieren. Nun aber genau da kann folgendes passieren: Was ist wenn die Daten noch auf sich warten lassen ??? Unser Programm verfällt in eine Starre die viele auch so kennen: keine Rückmeldung. Gerade vielleicht in einer WPF-Anwendung mit einem DataGrid, welches ein komplexes DataTable-Objekt erwartet passiert das schnell.
Also warum interaktiv nach den Daten fragen und auf sie warten wenn wir doch auf die Daten reagieren könnten wenn sie bereit sind?? Und genau darum geht es in der reaktiven Programmierung und was die Reactive Extensions umsetzen für das .NET-Framework.

Wie die Entwickler von Rx dabei vorgegangen sind, bassiert auf einfachen logischen Gesetzen aus der Mathematik. Ganz grob erklärt: Wenn wir vorher eine Methode hatten die keine Parameter erwartete und einen Rückgabewert hatte, haben wir nun mit Rx eine Methode der wir etwas geben via Parameter, die Methode allerdings den Rückgabewert void hat. Sie liefert uns schlicht nichts zurück!
ABER eigentlich schon :D Im falle des DataTable-Objekts eben genau dann wenn die Daten bereit sind. Wir brauchen nur noch darauf zu reagieren -> reactive programming.

Wie das genau funktioniert würde nun zu tief gehen, ich möchte allerdings auf einige sehr gute WebCasts verweisen:

Gregor Biswanger (MVP) - Reactive Extensions (Rx) - Einstieg in die Programmierung asynchroner und event-basierter Anwendungen

E2E: Erik Meijer and Wes Dyer - Reactive Framework (Rx) Under the Hood 1 of 2

E2E: Erik Meijer and Wes Dyer - Reactive Framework (Rx) Under the Hood 2 of 2

Rx Wokshop - Introduction 

Rx Workshop - Event Processing 

Rx Workshop - Observables versus Events 

Rx workshop - Unified Programming Model 

Rx Workshop - Writing queries 

Rx Workshop - Schedulers



Und um das ganze nicht einfach so zu beenden ist hier noch ein kleines Code-Beispiel. Achtung, LINQ (und die Lambda-Expressions) sind Grundlagen.
Wichtig für das Beispiel, nicht vergessen, die System.Reactive.dll als Reference hinzuzufügen und natürlich auch das entsprechende using zu setzen



class Program
{
    static void Main(string[] args)
    {
        var result = GetInput().ToObservable();


        result.Subscribe(x => Console.WriteLine("Ausgabe: " + x));
    }


    public static IEnumerable<string> GetInput()
    {
        while (true)
        {
            yield return Console.ReadLine();
        }
    }
}


Und so sieht die das ganze dann in der Console aus:



Das Beispiel ist ohne große Erklärung recht schwer zu verstehen, deshalb noch ein wenig Erklärung. Wir "subscriben" uns auf die Variable result die von der Methode GetInput() gefüttert wird. Diese verfällt in eine Endlosschleife und liefert und immer wieder die Eingabe aus der Console. Auf diese reagieren wir und geben sie wieder auf der Console aus. Und wenn intern die MoveNexT() Methode verwendet wird landen wir dankt des yield Schlüsselwortes wieder in der Schleife zum nächsten Schleifenschritt zurück. Ihr seht es ist ganz gut IEnumerable einmal selbst implementiert zu haben!
Dieses Beispiel habe ich, angepasst, aus einem der oben verlinkten WebCasts übernommen.

PC oder Konsole: Eine Glaubensfrage!

Es ist eine Frage die sich jeder Gamer einmal stellt in seinem Leben: PC oder Konsole? Auch für mich gilt dieser Tage: PC oder Konsole? Und das obwohl ich diese Frage für mich eigentlich schon längst abgehakt hatte. Für mich stand schon immer fest, ich bin PC-Spieler. Und dies aus ganz einfachen Gründen: Mit der Bedienung Maus/Tastatur kam ich schon immer besser zurecht. Zielen ist in Shootern einfacher, bei Strategie-Spielen ist diese Steuerung sowieso im Vorteil. Dazu waren meine liebsten Games alle auf dem PC. Diablo, diverse Strategie-Spiele, Shooter und Rollenspiele, die auch fast alle PC exklusiv entwickelt wurden. Dazu ist der Computer den Konsolen schon immer einen grafischen Schritt voraus gewesen und die Hardware ist jederzeit einfach zu wechseln. Auch in einzelnen Komponenten. Eine Konsole war für mich sonst nur die ultimative Plattform für Sportspiele, vorallem mit Freunden zusammen vorm Fernseher.
Aber spätestens mit dem Auszug merke ich wo hier der Haken ist. Der PC ist teuer! Dauernd neue Hardware kaufen und mit den Spielen mithalten zu können ist finanziell einfach nicht mehr drin. Dazu kommt das ein Computer ziemlich groß ist und sich schlecht einfach mitnehmen lässt zum Beispiel auf Reisen oder in die Uni. Deshalb musste ein Laptop her, aber um hier einen Gamer-Model kaufen können, müssen gleich mal mehrere 1000 Euro auf den Tisch. Und dann ist es auch nicht so einfach diesen dann aufzurüsten. Dazu kommt, dass ich mit der Zeit und dem richtigen Konsolen-Shooter ganz gut am Joystick geworden bin und natürlich auch Spiele heute oftmals sowohl für die Konsolen, als auch für den PC entwickelt werden. Ich habe meine XBOX 360 vor einem Jahr gekauft und kann mit ihr ohne Probleme alle Spiele spielen. Spiel rein und los gehts! Einfach und unkompliziert und dank XBOX Live auch ohne Probleme online gegen Spieler auf der ganzen Welt und/oder mit Freunden zusammen.
So ist es also passiert. Vom PC-Spieler hin zum "Konsolero". Aber ganz komme ich dann doch nicht vom PC los. Immerhin ist Diablo2 immernoch PC exclusive und Diablo3 erscheint zwar auch für die Konsolen aber was soll das denn bitte ?? :-)

Er noch eine nette Kolumne zu dem Thema lesen möchte klickt einfach hier. Daniel Visarius, der Hardware-Guru von GameStar kommentiert den neuen Abgesang auf den PC.

Dienstag, August 23, 2011

IEnumerable<T> in 2 Zeilen implementieren...

Vorspann: Wieso eine Klasse erstellen die IEnumerable<T> implementiert ??
Vor kurzen wurden die Reactive Extensions(Rx) für das .NET-Framework releast und diese sind ein wenig komplex :) In diesem Post soll es auch weniger um Reactive Extensions gehen als viel mehr um die Implementation von IEnumerable<T>. Diese Schnittstelle einmal selber zu implementieren und natürlich auch zu verstehen wie es funktioniert ist ein guter Anfang um sich mit der Arbeits- und Funktionsweise von Rx vertraut zu machen.

Wofür dient IEnumerable<T>? Implementiert eine Klasse diese Schnittstelle ist es möglich mit einer foreach-Schleife über sie zu iterieren. Des weiteren kann man außerdem mit LINQ, Abfragen auf die Klasse schreiben. Dies gilt allerdings nur für die generische Schnittstelle, da diese Typsicherheit bietet!


Meine Klasse, die IEnumerable<T> implementiert, ist in dem Beispiel die Klasse GenericData mit einem Property elements:

public class GenericData<TSource> : IEnumerable<TSource>
{
     private TSource[] elements;

Implementiert man also IEnumerable<T> muss man folgende Methoden mit Code füllen.


public IEnumerator<TSource> GetEnumerator()
{
     throw new NotImplementedException();
}

IEnumerator IEnumerable.GetEnumerator()
{
     throw new NotImplementedException();
}


Um diese Beiden Methoden zu implementieren, benötigen wir eine innere Klasse, die IEnumerator<T> implemetiert. Ich habe dies folgendermaßen getan.

private class DataEnumerator : IEnumerator<TSource>
{
    public GenericData<TSource> internalData;
    public int index = -1;


    public DataEnumerator(GenericData<TSource> data)
    {
        internalData = data;
    }


    public TSource Current
    {
        get
        {
            return internalData.elements[index];
        }
    }


    public void Dispose()
    {
        this.Reset();
    }


    object IEnumerator.Current
    {
        get { return this.Current; }
    }


    public bool MoveNext()
    {
        index++:
        if (index < internalData.elements.Length - 1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }


    public void Reset()
    {
        this.index = -1;
    }
}


Ist dies getan können wir unsere beiden zuvor implementierten Methoden wie folgt mit Code füllen


public IEnumerator<TSource> GetEnumerator()
{
    return new DataEnumerator(this);
}
IEnumerator IEnumerable.GetEnumerator()
{
    return this.GetEnumerator();
}


Ist dies erledigt könne wir über eine Instanz unserer Klasse mit einer foreach-Schleife iterieren uns sogar LINQ auf sie anwenden, aber dies ist noch nicht der springende Punkt auf den ich hinaus möchte. Das alles war jetzt schon ein wenig viel Code im Vergleich dessen wie leicht und schnell man es sich eigentlich machen kann!!

Mit dem Schlüsselwort yield ist es möglich auf die innere Klasse zu verziechten und benötigt lediglich 2 Zeilen Code um das selbe Ergebnis zu erzielen:

public class GenericData<TSource> : IEnumerable<TSource>
{
    private TSource[] elements;
    private int elementsCount = 0;

    public void Add(TSource item)[...]
  
    public IEnumerator<TSource> GetEnumerator()
    {
        foreach (TSource element in elements)
        {
            yield return element;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }   
}


So einfach ist es! Wenn man nun mit einer foreach-Schleife über eine Instanz dieser Klasse iteriert landet man in der Schleife in der GetEnumerator-Methode. In dieser wird in jedem Schleifen-Schritt nun mit dem Schlüsselwort yield ein Element zurückgegeben für welches dann der Code in der ersten foreach-Schleife ausgeführt wird.

Dies ist ein guter Einstieg bzw. es ist ein guter Rat dies nachzuvollziehen um sich mit den komplexen Reactive Extensions auseinander zu setzen. Zu diesen werde ich vielleicht auch nochmal ein Wort hier verlieren, wenn ich schon eine mehr oder weniger Minieinleitung gebe :D

Mittwoch, August 03, 2011

Lauf nach München - Fazit

So seit gestern bin ich nun zurück von meinem kleinen Urlaub. Und nachdem ich mich erstmal ausgeschlafen habe und mir eben mal die Comments unter meinen Facebook-Meldungen durchgelesen habe, kommt jetzt ein kleines Fazit mit Bericht wie was wann...

Gleich am Anfang möchte ich etwas loswerden: Es ist mein Urlaub gewesen und der Stand unter dem Motto nach München laufen und das habe ich auch gemacht allerdings habe ich auch 2 mal die angebotene Hilfe, mitgenommen zu werden, wahrgenommen! Wieso? Weil meine Füße/Knie es mir befohlen haben. Es ist mein Urlaub und ich entscheide wie ich ihn verbringe und jetzt frage ich mich warum ich mich eigentlich rechtfertige ...

Anyway...

Der erste Tag meiner Tour begann also in Karlsruhe, genauer gesagt vom Fuße des Turmbergs in Durlach. Von dort bin ich ca halb 10 losgelaufen und bin dann ungefähr um halb 3 in Pforzheim bzw. auf Höhe Pforzheims angekommen. Dort gabs eine kleine Pause bevor ich mich weiter auf machte Richtung Stuttgart. Gelaufen bin ich an diesem Tage noch ca bis um halb 10. Dann baute ich mein Zelt irgendwo zwischen Pforzheim und Stuttgart auf. Sowohl der Aufstieg Richtung Pforzheim als auch der Richtung Stuttgart hatten mir schon ziemlich zugesetzt und mir fiel direkt wieder ein wie es bei der Bundeswehr war längere Strecken zu marschieren und wie man sich danach fühlte...

Problem am ersten Tag: Mir fiel auf was ich alles vergessen hatte. Unter anderem ein Feuerzeug um den Gaskocher anzuzünden weshalb es am ersten Abend schonmal nichts zu essen gab ... Hurra (Dabei bemerkte ich nicht, dass sich in der Verpackung unter der Anleitung eine Schachtel Streichhölzer lagen ...)
Die Nacht war auch extrem kurz, wieso kann ich nicht beantworten. Ich wurde jedenfalls um 4 Uhr wach und konnte nicht schlafen. Also blieb mir nichts über als weiter zu laufen.
Und dann traf ich auch kurz vor Stuttgart meiner erste Mitfahrgelegenheit. Ein Renter sammelte mich an einer größeren Straße auf und fragte ob er mich mitnehmen kann und ich dachte an meine Füße und stieg ein. Er erzählte mir, dass er selbst gerne wandert und auch früher als er junge war dies gerne getan hat. Er setzte mich hinter Stuttgart ab wo er ein Schrebergarten besitzt :)
Es ging von dort also weiter Richtung Ulm und bis dahin dachte ich die Aufstiege zu Pforzheim und Stuttgart wären hart aber dann kam die Schwäbische Alb und ich fluchte einmal alle 100 Meter!
Sonntag war es dann ungefähr 15:30? Ich weiss es nicht mehr genau aber ich war in Ulm bzw in der Nähe von Ulm und bezog dort eine Herberge.
Dies entpuppte sich als beste Entscheidung, die ich in den 5 Tagen meiner Reise traf.
Hier habe ich nicht nur die beiden Studenten (Jonathan und David aus England unterwegs mit dem Auto durch Europa) getroffen die mir anboten mich am nächsten Tag mitzunehmen sondern teilte mir auch mein Zimmer mit einem französischen Reise-Journalisten, der mit dem Fahrrad größere Touren unternimmt und danach große Reisereportagen schreibt. Dass die daraus resultierende Unterhaltung sehr interessant war, brauche ich wohl nicht extra erwähnen.
Am nächsten Morgen ging es dann also mit den beiden Studenten bis nach Augsburg und sie hätten mich noch weiter mitgenommen, wenn ich nicht dazu abgesagt hätte. Immerhin wollte ich laufen. Und so lief ich mit einer Übernachtung auf einer Bauernwiese bis nach München, wo ich am Mittag dann einen Zug Richtung Karlsruhe nahm. Die Stadt habe ich mir nicht weiter angeschaut aus Zeit, Lust und finanziellen - Gründen. Aber es wird nachgeholt.

Es gibt natürlich noch mehr zu erzählen aber schon jetzt ist der Beitrag hier relativ lang.

Ich komme zu meinem persönlichen Abschluss: Die Idee nach München zu laufen war dämlich! Mir schmerzen die Füße, Knie - generell die gesamten Beine, Schultern, Nacken und Rücken. Ich bin trotz langes Schlafes, letzte Nacht, immernoch müde. Aber es hat auch irgendwie ein wenig Spaß gemacht auch wenn ich nun weiß: NIE WIEDER!
Andererseits weiß ich nun auch, dass ich öfter Urlaub alleine machen muss!