Montag, 11. November 2013

Implementierung des Flow Design Lösungsansatzes



Aufbauend auf den vorigen Eintrag Flow Design:


Ich konnte es nicht lassen und habe es nun nicht nur gezeichnet sondern auch implementiert. Dazu habe ich TypeScript verwendet, da ich raufinden wollte, wie das damit funktioniert und ob das Ergebnis einfach und übersichtlich wird.
Diese Kombination TypeScript – Flow Design – EventBasedComponents scheint mir noch zu wenig bearbeitet zu sein. Dies ist auch der Grund, warum ich meine Erkenntnisse zusammenschreibe. Vielleicht findet sich jemand, der Verbesserungen sieht oder vielleicht hilft es zumindest jemanden, der sich auch damit beschäftigen will.

Da ich bereits vor ein paar Wochen ein TypeScript Beispiel mit Event Based Components versucht habe, begann ich mit diesem Ansatz. Dazu kann man sehr gut die node.js Event-Loop einsetzen. Im Anschluss daran habe ich das Beispiel kopiert und versucht die node:event wieder rauszunehmen, und so nur mit gewöhnlichen Callback Funktionen zu arbeiten.

Die beiden Lösungen findet man auf github OrderedJobs-FD-Kata-TS.
(entspricht dem 3. Lösungsansatz vom vorhergehenden Eintrag: Flow Design)


Ich bin eigentlich auf der Suche, wie man so ein FD Diagramm möglichst einfach nach JavaScript bekommt. Dazu will ich mir ein paar Methoden aus dem Sourcecode rausholen, um es in Zukunft vielleicht einfacher zu haben.


1. Lösung mit Callbacks:


1.1 Eine ganz einfache Transformation, mit nur einem Ein- und Ausgang:




    function generateOrderString(
             jobDefinitionList: jd.Domain.JobDefinition[],
             outCallback: (string) => void): void {

        var orderString = "";
        jobDefinitionList.sort(function (left, right) {
                return left.order === right.order ?
                0 : (left.order < right.order ? -1 : 1)
            });
        jobDefinitionList.forEach(function (jobDefinition) {
            orderString += jobDefinition.job;
        });
        outCallback(orderString);
    }


1.2 Zwei Ausgänge - auch kein Problem:


    function forAllJobDefinitions(
             jobDefinitionList: jd.Domain.JobDefinition[],
             outCallback: (IJobDefinition) => void,
              afterCallback: (any) => void): void {
        var self = this;
        jobDefinitionList.forEach(function (jobDefinition) {
            outCallback(jobDefinition);
        });
        afterCallback(jobDefinitionList);
    }





1.3 Mehrere Eingänge


Das klappt so nicht, dazu muss man dann schon eine Klasse schreiben.



    class CompareWithLastNumberAndMaxCount {
        private numberOfSortedJobs: number;
        private maxJobsCount: number;
        private _jobDefinitionList: jd.Domain.JobDefinition[];
        public initialize(jobDefinitionList: jd.Domain.JobDefinition[]): void {
            this.numberOfSortedJobs = 0;
            this.maxJobsCount = jobDefinitionList.length;
            this._jobDefinitionList = jobDefinitionList;
        }
 

        public process(
             jobsAreSortedCount: number,
             outAllDoneCallback: (any) => void,
             notAllDoneButIncreasedCallback: (any) => void): void {
            var LastNumberOfSortedJobs = this.numberOfSortedJobs;
            this.numberOfSortedJobs = jobsAreSortedCount;
             ...
         
        }
    }





1.4 "Verdrahten":



    function sort(outCallback: (string) => void): void {
        createJobDefinitionList(
            function (jobDefinitionList: jd.Domain.IJobDefinition[]) {
                sortJobDefinitions(jobDefinitionList, outCallback);
            });
        }



Bei mehreren Callbacks in einem Aufruf wird diese Schreibweise jedoch sehr verwirrend. Dazu ein komplexeres Beispiel:



    function forEachJobMarkOrderIfPossible(
             jobDefinitionList: jd.Domain.JobDefinition[],
             jobDefinitionListCallback: (any) => void): void {
        var setOrderAndIncrement = new SetOrderAndIncrement();
        var testIfAllPreJobsAreDone = new TestIfAllPreJobsAreDone();
        testIfAllPreJobsAreDone.initialize(jobDefinitionList);
        forAllJobDefinitions(jobDefinitionList, function (jobDefinition) {
            testIfJobIsSorted(jobDefinition, function (jobDefinition) {
                testIfAllPreJobsAreDone.process(jobDefinition,
                    function (jobDefinition) {
                        setOrderAndIncrement.process(jobDefinition,
                            function () { });
                    });
                })
            }, function (jobDefinitionList: jd.Domain.JobDefinition[]): void {
                jobDefinitionListCallback(jobDefinitionList);
            });
    }




Man sieht in diesem Beispiel auch, dass hier die "Kästchen" mit mehreren Eingängen, dann instanziiert werden müssen. Man könnte sie aber auch global instanziieren, allerdings hat man dann immer noch das "Problem", dass die Methode (in unserem Beispiel die Methode process) aufgerufen werden muss und man so wieder kein einheitliches Bild erhält.

       testIfJobIsSorted(jobDefinition, function () { });


       setOrderAndIncrement().process(jobDefinition, function () { });   




2. Lösung mit Event Based Components:



Wie oben schon erwähnt, wurde dazu die Node.js Event-Loop verwendet. Dazu braucht man eine Referenz auf node.

/// <reference path='../../../DefinitelyTyped/node/node.d.ts'/>


import events = require("events");


(Diese Referenzen werden angeblich mit Visual Studio Unterstützung selbst aufgelöst.)

Dieselben Beispiele wie oben, bei der Callback Variante:


2.1 Eine ganz einfache Transformation, mit nur einem Ein- und Ausgang:



    class GenerateOrderString extends events.EventEmitter {
        public process(jobDefinitionList: jd.Domain.JobDefinition[]): void {
            var orderString = "";
            jobDefinitionList.sort(function (left, right) {
                return left.order === right.order ?
                    0 : (left.order < right.order ? -1 : 1)
            });
            jobDefinitionList.forEach(function (jobDefinition) {
                orderString += jobDefinition.job;
            });
            this.emit('out', orderString);
        }
    }




2.2 Zwei Ausgänge:


    class ForAllJobDefinitions extends events.EventEmitter {
        public process(jobDefinitionList: jd.Domain.JobDefinition[]): void {
            var self = this;
            jobDefinitionList.forEach(function (jobDefinition) {
                self.emit('out', jobDefinition);
            });
            this.emit('after', jobDefinitionList);
        }
    }




2.3 Mehrere Eingänge


Das ist im Gegensatz zu oben kein Ausreißer, sondern sieht aus wie alle anderen Klassen. Man hat eben eine Methode mehr.


    class CompareWithLastNumberAndMaxCount extends events.EventEmitter {
        private numberOfSortedJobs: number;
        private maxJobsCount: number;
        private _jobDefinitionList: jd.Domain.JobDefinition[];
        public initialize(jobDefinitionList: jd.Domain.JobDefinition[]): void {
            this.numberOfSortedJobs = 0;
            this.maxJobsCount = jobDefinitionList.length;
            this._jobDefinitionList = jobDefinitionList;
        }
        public process(jobsAreSortedCount: number): void {
            var LastNumberOfSortedJobs = this.numberOfSortedJobs;
            this.numberOfSortedJobs = jobsAreSortedCount;
            if (jobsAreSortedCount === this.maxJobsCount) {
                this.emit('allDone', this._jobDefinitionList);
            } else {
             ...
            }
        }
    }




2.4 "Verdrahten"


Das sieht jetzt ganz anders aus wie in der Callback Variante und meiner Meinung nach viel übersichtlicher.


    export class Sort extends events.EventEmitter {
        constructor() {
            var createJobDefinitionList = new CreateJobDefinitionList();
            var sortJobDefinitions = new SortJobDefinitions();
            this._firstTask = createJobDefinitionList;
            createJobDefinitionList.on("jobDefinitionList", 
                 sortJobDefinitions.process.bind(sortJobDefinitions));
            sortJobDefinitions.on("out", this.result.bind(this));
            super();
        }

        private result(sortedJobs: string): void {
            this.emit('out', sortedJobs);
        }

        private _firstTask: ICreateJobDefinitionList;
        public process(): void {
            this._firstTask.process();
        }

    }



Eine Schwierigkeit dabei ist dieses JavaScript Problem mit dem this Pointer. Leider wurde es auch unter TypeScript nicht versteckt. (Zumindest bisher noch nicht - ist ja noch in Version 0.9.1.1, aber ich befürchte, dass es auch nicht gelöst wird)
Will man in der process Methode auch den richtigen this Pointer zugreifen, weil man die Methode _firstTask aufrufen will, dann muss man dies, bei der Definition des Events mitgeben!
Statt
            createJobDefinitionList.on("jobDefinitionList", 
                sortJobDefinitions.process);

also
            createJobDefinitionList.on("jobDefinitionList", 
                sortJobDefinitions.process.bind(sortJobDefinitions));


Das macht es schon sehr unschön. Vielleicht gibt es da eine einfache Lösung, die ich noch nicht gesehen habe.



Es ist in dieser Variante, der Schreibaufwand zwar größer, aber es ist immer gleich und auch bei komplexeren "Verdrahtungen" einfach zu verstehen:

 

    class ForEachJobMarkOrderIfPossible extends events.EventEmitter {

        constructor() {
            var forAllJobDefinitions = new ForAllJobDefinitions();
            var testIfJobIsSorted = new TestIfJobIsSorted();
            var testIfAllPreJobsAreDone = new TestIfAllPreJobsAreDone();
            var setOrderAndIncrement = new SetOrderAndIncrement();
            this._firstTask = forAllJobDefinitions;
            this._testIfAllPreJobsAreDone = testIfAllPreJobsAreDone;
            forAllJobDefinitions.on("out",
                testIfJobIsSorted.process.bind(testIfJobIsSorted));
            testIfJobIsSorted.on("notSorted",
                testIfAllPreJobsAreDone.process.bind(testIfAllPreJobsAreDone));
            testIfAllPreJobsAreDone.on("allPreJobsDone",
                setOrderAndIncrement.process.bind(setOrderAndIncrement));
            forAllJobDefinitions.on("after", this.result.bind(this));
            super();
        }

        private _firstTask: IForAllJobDefinitions;
        private _testIfAllPreJobsAreDone: ITestIfAllPreJobsAreDone;
        private result(jobDefinitionList: jd.Domain.JobDefinition[]): void {
            this.emit('jobDefinitionList', jobDefinitionList);
        }

        public process(jobDefinitionList:
            { job: string; preJobs: string[]; order: number }[]): void {
                this._testIfAllPreJobsAreDone.initialize(jobDefinitionList);
                this._firstTask.process(jobDefinitionList);
        }

    }


Für JavaScript Programmierer ist die erste Variante mit den Callbacks inzwischen sehr üblich, auch durch die asynchroner Programmierung (mit Promises z.B.).

Mir gefällt aber im Moment doch die EBC Variante besser.
Allerdings sollte man bedenken: Hätte ich von dieser Methodik noch nie gehört und würde mir den Code ansehen, ich würde ihn für sehr eigenartig halten.


Leider scheint sich TypeScript für die FlowDesign Implementierung nicht besser zu eignen, als C#.
Vielleicht bin ich aber auch noch nicht tief genug in TypeScript eingetaucht und es gibt noch Notationen, die praktischer sind.

Montag, 4. November 2013

Flow Design


Flow Design finde ich wirklich toll und bin überzeugt, dass man damit bessere Programme schreiben kann (wartbarer, verständlicher, testbarer). Immer wieder lese ich in Ralf Westphals Blogs (z.B. One Man Think Tank Gedanken) darüber und habe auch schon manchmal probiert das umzusetzen.

Doch es sind immer nur kleine Ausflüge. In der täglichen Arbeit mache ich es noch nicht. Da arbeite ich wild drauf los, mache funktionale Abhängigkeiten nach der Reihe und habe all die Probleme, die Flow Design lösen würde. Was habe ich so schon alles verbrochen?! :-)

Der Grund, warum ich nicht diesen FD Richtlinien folge, ist wohl, dass ich noch zu unsicher bin und es in der Umsetzung in C# oder Javascript auch ein wenig umständlich ist. Nein, das stimmt so nicht. Es ist eher ungewöhnlich für mich. Es ist mir einfach noch nicht in Fleisch und Blut übergegangen.

Ich brauche Übung und somit habe ich das Angebot von Ralf Westphal sehr gerne angenommen, ein Design abzuliefern und hoffe bald Anmerkungen dafür zu erhalten.

Die Aufgabenstellung:


Mein Lösungsansatz:
Ich habe nicht nach einer Rekursion gesucht, keinen Baum aufgebaut und ihn flachgeklopft und nicht mal auf Geschwindigkeit getrimmt. Ich habe eine Lösung verfolgt, wie ich es händisch relativ einfach machen könnte.

Was mir schon ein wenig im Hinterkopf rumschwebte, war, dass ich irgendwann eine schöne Fehlermeldung erhalten will, welche Abhängigkeiten Probleme machen und so war es mir wichtig, die vermutlich dazu nötige Infos, dann zur Verfügung zu haben.

Kurz erklärt:
Bei register() wird eine Liste aufgebaut, die dann als Start für sort() verwendet wird.
Und bei sort() wird zuerst eine Vereinfachung der Jobliste durchgeführt, sodass es für jeden Job nur einen Eintrag gibt.
Diese Liste wird dann nach der Reihe abgearbeitet und jene Jobs werden durchnummeriert, die ausgeführt werden können, weil sie keine Abhängigkeiten haben, bzw. die abhängigen Jobs bereits erledigt sind. Am Ende wird überprüft, ob es noch nicht sortierte Jobs gibt, dann wird die Liste ein zweites Mal abgearbeitet. Das wird so lange wiederholt, bis alle Jobs sortiert sind oder in einer Runde keine neuen Jobs mehr nummeriert werden konnten, dann wird eine Exception geworfen. Ansonsten muss die Jobliste dann nur mehr anhand der Nummerierung ausgegeben werden.

Donnerstag, 17. Oktober 2013

Windows 8 als Windows 7 betreiben

Nachdem mein Artikel vom letzten Jahr Windows 8 - Ein paar Tipps und meine Meinung dazu, so häufig aufgerufen wurde, ist es vielleicht eine gute Idee, zur Veröffentlichung von Windows 8.1 wieder was zu posten.

"Diese Kacheloptik will ich gar nicht sehen und dass ich ein Microsoft Konto brauche, beim Einloggen, nur damit ich in diversen Apps personalisierte Werbung ansehen muss, das will ich schon gar nicht. Das neue Notebook wird jetzt aber diesen Windows 8 Schrott draufhaben, was kann ich machen, dass es so ist wie Windows 7?"
So ähnlich wurde ich neulich nach meiner Meinung gefragt.



Ich finde diese Frage duchaus berechtigt und interessant, wie kann man "Windows 8 als Windows 7 betreiben"?

Leute die sehr vorsichtig sind im Umgang mit allen Online Aktivitäten, also z.B. keinen Facebook Account haben, das Android Handy speziell installieren, um keinen Abgleich mit dem Google Account zu haben, anonyme Zahlungsmittel bevorzugen, usw., denen kann man wohl nur eines raten:

Ein Notebook mit Windows 7 kaufen oder doch mit Windows 8 Pro, aber dann die Downgrade Option nutzen (Windows 8 Pro erlaubt kostenlose Downgrades).


Denn ich glaube, man wird sonst nicht glücklich, wenn man immer das Gefühl hat, das System überwacht einen und liefert Infos an Microsoft.


Trotzdem beschäftigt mich die Frage und habe ein wenig recherchiert, vor allem auch im Hinblick auf das Erscheinen von Windows 8.1.


Wenn jemand Windows 8 so verwenden will, wie wenn er Windows 7 hat, wie geht das?

Ich mache das eigentlich auch selbst, zwar in einer virtuellen Maschine, die ich zum Entwickeln verwende, aber doch.



Microsoft Account


Wichtig dabei ist mal, dass man ein lokales Konto verwendet und nicht einen Windows Account anlegt bei der Installation.

Die Option bei der Installation, die noch in der Windows 8 Version vorhanden war, sich mit einem lokalen Konto anzumelden, erscheint unter Windows 8.1 nur, wenn man ohne Netzwerk installiert oder eine nicht existierende Mail Adresse und irgendein Passwort eintippt, also sowas wie "aaa@aaa.aaa" als Email Adresse eintippen. Die gefundenen Beispiele im Internet sind kreativer und dienen wohl gleichzeitig dem Frustabbau. :-)
- Wie auch immer, dann kommt in der Fehlermeldung diese Möglichkeit zum Anklicken der Option 'mit lokalem Konto anmelden'.

Man kann später übrigens immer noch wechseln (Microsoft Account <-> lokalen Account).




Warum braucht man eigentlich einen Microsoft Account und was ist das?


Das Microsoft Konto (früher Live-ID, noch früher Passport genannt) ist ein kostenloser Account, den Microsoft dazu verwendet, den Benutzer zu identifizieren. Dazu kann man eine neue Email Adresse anlegen, man kann aber auch seine bisherige verwenden, also z.B. die gmail Adresse.
Damit werden gewisse Daten und Einstellungen, die man am Computer macht, bei Microsoft gespeichert und verwendet man dann einen anderen (Zweit-) Computer und loggt sich dort wieder mit diesem Microsoft Account an, dann hat man da die abgeglichenen Einstellungen: Der Email Account, das Adressbuch, das Hintergrundbild, usw.

Diese Sachen muss natürlich die jeweilige Applikation unterstützen und das sind vor allem die Betriebssystem Komponenten und die Windows Store Apps.

Die Windows Store Apps, die unser Freund von oben ja sowieso nicht benutzen will ("Kachelzeugs"), sind ohne Microsoft Account sehr eingeschränkt. Man kann die verwenden, die bereits bei der Installation dabei sind, man bekommt auch Updates dafür, aber über den Store bekommt man ansonsten keine zusätzlichen Apps. Wählt man eine App im Store zur Installation aus, muss man sich via Microsoft Account einloggen, dies gilt auch für kostenlose Apps.

Manche der bereits installierten Apps wie SkyDrive sind natürlich so auch nicht verwendbar, denn die greifen ja auf einen Microsoft Dienst zu.
Das wird einen aber nicht stören, denn man will sowieso Programme anderer Hersteller (am Desktop) einsetzen für Email usw.

SkyDrive

Trotzdem nochmals zu SkyDrive. Man bekommt mit Windows 8 und dem Microsoft Account einen online Platz zum Ablegen eigener Dateien geschenkt. 25GB mit Windows 8.1, wenn ich richtig informiert bin. Darauf verzichtet man natürlich auch, bzw. man könnte sich den Account ja auch extra holen, aber zumindest die Integration ins Betriebssystem ist so eingeschränkt.

Die einzelnen Applikationen (auch Desktop) sind natürlich ebenfalls zu überprüfen. Denn verwendet man z.B. Skype, das ja mittlerweile zu Microsoft gehört, ist die Verbindung wieder gegeben. Andererseits nicht so stark und auf Skype wollen viele nicht verzichten und verwenden dann die Version von Skype für Windows Desktop und nicht die App (Ich bin mir jetzt nicht sicher, ob die überhaupt vorinstalliert ist).


Personalisierte Werbung

Die Suche, auch wenn man nach Applikationen oder Dateien sucht, versucht ihr Glück auch über Bing. Das muss man also mal wegkonfigurieren, sonst hat Microsoft natürlich die Möglichkeit die Werbeeinschaltungen, die manche Apps anbieten zu personalisieren.
Dass auch mitgelieferte Apps diese Werbeeinschaltungen haben, finde ich auch sehr unangebracht. Allerdings gefällt mir die Möglichkeit als App Entwickler natürlich sehr gut und diese Microsoft Apps dienen uns Entwickler auch als Anschauungsprojekte, wie man es machen könnte.

Synchronisation

Übrigens kann man ganz einfach die Synchronisation der einzelnen Daten in den PC-Einstellungen deaktivieren, auch relativ feingranular (Spracheinstellungen, Passwörter, ...). Aber wie schon erwähnt ist die Synchronisation nur aktiviert, wenn man sich über das Microsoft Konto anmeldet.
Ich persönlich finde das ja sehr praktisch und doch manchmal auch überraschend, dass dann schon meine typischen Explorer Einstellungen eingetragen sind, obwohl ich mich zum ersten Mal auf einem anderen Gerät einlogge.

Kacheloptik verstecken

Kann man nicht! Auch unter Windows 8.1 ist dies der Startschirm und das Startmenü. Wobei man jetzt auch direkt in den Desktop booten kann und auch einen Startbutton gibt es wieder, dieser führt jedoch in das Kachelmenü. Man kann die Kacheln jetzt sehr klein machen und wenn man noch den Bildschirmhintergrund vom Desktop übernimmt, ist der Stilbruch nicht so auffällig. Diese Einstellungen findet man in den Taskleisteneigenschaften (rechte Maustaste auf Taskleiste -> Eigenschaften oder in der Systemsteuerung suchen), Reiter Navigation.
Auch kann man einstellen, beim Schließen einer Kachel App wieder gleich in den Desktop zu kommen und landet nicht am Starschirm.

Manche Dateitypen sind mit Apps verbunden, z.B. der PDF Viewer, allerdings erledigt sich das, wenn man dann eine andere Applikation dafür installiert, bzw. man kann auch einstellen, welche App bzw. Applikation man damit verbindet (darüber habe ich schon mal geschrieben).

Das praktische Menü, das man mit Windows-X erhält, ist unter 8.1 jetzt auch mit rechter Maustaste auf den Startbutton zu bekommen.


Als Entwickler

Als App Entwickler freut man sich mal, dass sich Windows 8 trotz der vielen negativen Berichte, sich so stark durchgesetzt hat. Man ärgert sich aber auch über die Änderungen in den APIs. Natürlich ist es toll, wenn man immer stärker vereinheitlicht (Windows Phone, XBox, Windows), aber irgendwelche Klassen in andere Bibliotheken verpacken und ein wenig ändern, das ist mühsam.
Bei den Vorgaben fürs Design ist man auch draufgekommen, dass man einen Suchbutton braucht, weil die Anwender den Suchbutton in der Charms bar noch nicht finden. Leider ist das auch noch so bei anderen praktischen Sachen, wie Semantic Zoom (Ctrl + Mausrad). Das braucht halt seine Zeit und mit den Fingern am Touch Device haben die Leute das vielleicht dann schneller im Griff.



Jetzt bin ich ein wenig abgeschweift:

Worauf muss man überhaupt verzichten, wenn man noch Windows 7 oder Vista verwendet?

Ja, es sind mal die Kleinigkeiten, die Microsoft sicher auch einfach nachziehen könnte, aber sie sind eben mal in Windows 8 gelandet und werden nicht rückportiert.
So wie das schnelle Screenshot machen, der äußerst praktische Dialog zum Dateikopieren/-verschieben, ISO Dateien Support, Taskmanager, Ribbon beim Explorer.
Und die Sicherheitsthemen: Wiederherstellung von Dateien, SecureBoot, SmartScreen, Virenscanner Windows Defender.
Das komplette Backup, von den Vorgängern bekannte Backup, gibt es auch nach wie vor und wurde unter Windows 8.1 jetzt auch umbenannt auf "Wiederherstellungslaufwerk erstellen". Unter Windows 8 hieß es noch: Windows-7-Dateiwiederherstellung!
Hyper-V ist in der Pro Variante enthalten, das ich auch sehr stark nutze und dafür VMWare nicht mehr (Beides klappt ja leider nicht.).

Ob man den eingebauten Virusscanner verwenden soll, oder sich doch einen zusätzlichen kaufen soll, weiß ich auch noch immer nicht. Das Praktische am Beigefügten ist, gegenüber anderen kostenlosen Varianten, dass er so leise ist und sich nicht alle paar Tage mit Werbung auf die Pro Version meldet. Bei den Tests liegt der Microsoft Virusscanner aber meist abgeschlagen nicht an erster Stelle!

Jemand dem Sicherheit sehr wichtig ist wird vermutlich auch zu einem kostenpflichtigen Virenscanner greifen..

Family Safty benutze ich am Rechner, den mein Sohn benutzt, das gab es aber, glaube ich zumindest, auch unter Windows Vista schon.
(Interessante Anleitung zum Thema: Family Safety und Kaufen im Windows Store )


Enterprise Umfeld

Da ist das mit den Microsoft Accounts wieder etwas anders. Man hat hier auch üblicherweise keine lokalen Accounts, sondern Domänen Accounts.
Ob man Apps aus dem Store installieren darf, hängt von den Einstellungen in den Gruppenrichtlinien ab, die der Administrator am Windows Server 2012 festgelegt hat.
Und es ist auch zu empfehlen, dass zunächst die Infrastruktur auf Windows Server 2012 gebracht wird und dann erst die Clients auf Windows 8.
Ein großes Thema bei Microsoft ist auch das 'bring your own device (BYOD) - Nutzung und Einbindung privater mobiler Endgeräte im Unternehmen'. Doch da habe ich mich noch nicht eingelesen, bin auch kein Administrator. Auch gibt es zu dem Thema passend in Windows 8.1 für das Enterprise Umfeld zusätzliche VPN Clients.
Ein anderes Szenario ist natürlich auch, wenn das Active Directory in der Cloud steht, weil man Office365 nutzt.
Wie auch immer, da muss man noch an anderer Stelle suchen, da weiß ich zu wenig Bescheid. Anscheinend ist Windows 8 sowieso noch kein Thema in großen Unternehmen, die versuchen jetzt mal auf Windows 7 zu kommen.


Upgrade auf Windows 8.1


Für Windows 8 Benutzer:
Dass Windows 8 Benutzer das kostenlose Update auf Windows 8 nutzen werden ist klar, die sehen es als Service Pack.

Windows 7 Benutzer:
Könnte man dann wohl jetzt machen, wenn man sich bei Windows 8 noch nicht getraut hat und lieber auf das erste "Service Pack" warten wollte.
Vielleicht gibt es ja wieder so ein günstiges Angebot, wie beim Windows 8 Antritt.

Windows XP Benutzer:
Ja, Zeit wird es sich was zu überlegen. Die Leistung (inkl. Speicher, Harddisk) von den meisten Windows XP Rechnern (zumindest wenn er mit damals brandneuem Windows XP Ende 2001 gekauft wurde) wird aber für Windows 8 womöglich nicht ausreichen und somit steht in vielen Fällen auch ein Hardwarekauf im Raum. Vor allem für paranoide und sicherheitsbewusste Leute, ist höchste Eisenbahn. Falls es nicht nochmals verschoben wird, läuft der Support für Windows XP Anfang nächsten Jahres aus und dann ist es aus mit Updates und somit kein Stopfen mehr von Sicherheitslöchern und wenn man seine privaten/dienstlichen Daten und seine Internetbandbreite nicht mit Kriminellen teilen will, wird man wohl den Netzwerkstecker dann möglichst bald ziehen müssen.


Umstieg auf Linux am Desktop:
Für viele scheint das der richtige Zeitpunkt zu sein. Vielleicht waren es auch die bekanntgewordenen Geheimdienstaktivitäten, die den Anstieg des Marktanteils erklären.


Desptop Applikation - App - Web Applikation

Windows entwickelt sich in Richtung iPad. Zumindest will Microsoft diesen Markt nicht ganz verpassen. Und die eingeschlagene Strategie, auch die Desktop Anwender mit der Tablet Oberfläche zu ärgern, indem sie das gleiche Betriebssystem für Tablets und Desktops verwenden, finde ich persönlich schlau von Microsoft. Denn man gewöhnt die Leute daran. Und wer Windows 8 benutzt, wird bemerken, dass das nicht so störend ist, wie manche behaupten. Mir gefällt es, dass man auch auf normalen Rechnern (ohne Touch, kein Tablet) in die App Welt schnuppern kann. Ich benutze sie aber kaum (Das TV Programm finde ich ganz praktisch.), auch ich lebe in der Desktop Oberfläche und benutze den Browser. - Am Smartphone ist das ganz anders.
Die Philosophie hinter Apps ist eine andere, als die für Desktop Applikationen. Eine Desktop Anwendung ist ein großes Teil das alle möglichen Funktionen anbietet. Eine App dagegen ist viel leichtgewichtiger und erledigt eine spezielle Aufgabe. Diese ist dann auch oft verknüpft mit anderen Diensten oder Informationen, sodass es eine komplettere Funktion für den speziellen Anwendungsfall darstellt. Als Beispiel wird da immer so eine Reiseapplikation genannt, die viel Infos über das Land bietet, aber auch Buchungen zulässt, aktuelles Wetter, usw. darstellt. Aber gut, Apps kennt man eh vom Smartphone. Im Gegensatz zu einer Web Applikation speichert sie auch den Zustand ganz praktisch. Bei Web Applikationen, die das machen, wie feedly z.B., fühle ich mich immer sehr beobachtet (verwende es trotzdem :-) ), bei einer App dagegen habe ich nicht das Gefühl, dort gehört das dazu.


Beim Lesen der Kommentare über Artikel zu dem Thema: Windows 8 und Microsoft Account, fällt einem immer diese Angst und Abneigung auf, wenn Microsoft alles von einem sammelt. Die sind einem immer suspekt, mir geht es auch so. Beim Handy akzeptiert man die Synchronisation des Adressbuchs ohne weiteres. Am Desktop fühlt man sich dadurch überwacht. Inzwischen wissen wir, dass alles ausspioniert wird und Windows 8 mit der Verknüpfung zur Cloud ist da sicher praktischer (aus Geheimdienst Sicht). Aber verzichten wir stattdessen auf die Vorteile? Wir benutzen eben nicht Skydrive (Heißt das überhaupt noch so, muss ja geändert werden, weil sich Sky beschwert hat.) sondern Dropbox, nicht hotmail sondern andere Email Provider, und eben lieber noch Windows 7 als 8. Aber ist das wirklich geheimer?

Windows 8.2 oder 9

Ausblick: Schwierig. Wie wird Windows 9 sein? Das erste Betriebssystem in der Cloud, wo die Tablets nur mehr "dumme" Clients sind und alles in der Cloud stattfindet. Man installiert ein Programm nicht mehr lokal, sondern aktiviert den Service in seinem Cloud Desktop. Speichert die Daten nicht lokal, sondern im Blob Speicher der redundant gespeichert wird? Der Client ist entweder der Browser oder eine App. Bezahlt wird nach verbrauchten Ressourcen und Zeit.
Die Desktop Sicht ist vielleicht noch für Entwickler interessant, aber auch der Rechner läuft irgendwo in der Cloud und die Sicht darauf ist eine App (Remote Desktop).
- Ja, so wird es wohl sein. So ist es für die Benutzung von mehr als ein Device praktisch, vermutlich günstiger, vielleicht auch ressourcenschonender.
Das ist eigentlich Windows RT (und Windows Phone 8). Doch die Zeit war noch nicht ganz reif dafür, aber vielleicht nächstes Jahr.

Ist das die Zukunft? - Nein, eigentlich ist es jetzt schon fast so. Die meisten benutzen wohl den Desktop nur um den Browser zu starten oder Office. Die Office Applikationen gibt es noch nicht so ganz als App. Im Firmenumfeld ist Outlook noch zu mächtig. Aber eigentlich leicht durch ein paar Apps ersetzbar. Die Fileverwaltung? - Inzwischen wird viel gesucht und wo das jetzt liegt, ist auch nicht mehr so wichtig. Man ist froh, wenn das Dokument schließlich am (SharePoint) Server abgelegt wird, dann ist ein anderer Schuld, wenn es nicht mehr auffindbar ist.

Wird sich Microsoft wirklich diesen großen Brocken vom Geschäft entgehen lassen? Kein Office und Windows mehr? - Es wird sich nicht als Client Betriebssystem/Desktop Applikation verkaufen, sondern als Service in der Cloud oder vielleicht doch als Client System, aber mit großem, dazugehörigem Cloud Dienst dahinter (so wie die nächste XBox). Die Anstrengungen und Aufwendungen, die Microsoft in ihre Cloud Strategie: Windows Azure und Office365 steckt, sind enorm.


Verunsicherung

Aber wird es keine Änderungen im Verhalten durch die Aufdeckungen im Geheimdienstumfeld gegeben? - Nein, ich glaube nicht. Es ist zu praktisch. Vielleicht wird der eine oder andere Cloud Dienst etwas teurer, weil versprochen wird, dass die Daten sicherer sind als anderswo. Aber die meisten, befürchte ich, haben noch immer das Gefühl, dass nur wer was anstellt in die Fänge kommen kann und ändern daher nichts.



Wie bin ich persönlich mit Windows 8 zufrieden?

Sehr gut. Schnell, hat alles, was ich brauche. Stürzt nicht ab. Ich komme gut damit zurecht.
Mein größtes Problem war bisher ein Fehler, den ich bei der Media Center Installation auf einem Zweitrechner machte (und dabei zweimal denselben Key verwendet habe, wenn ich mich recht erinnere). Da hätte ich fast neu installieren müssen. Die Media Center Installation ist keine Kleinigkeit! Nächstes mal ein Backup davor machen, oder besser gar nicht installieren, brauch' ich sowieso nicht.


Zusammenfassend:

Viel zu viel geschrieben!

Man kann derzeit Windows 8 noch ganz gut so hintrimmen, dass es sich fast wie Windows 7 anfühlt.
Doch bevor man sich ständig ärgert, weil man doch wieder mal einen Dialog vorgesetzt bekommt, dass man sich via Microsoft Account einloggen soll, um die aufgerufene Funktion durchzuführen und Angst hat, dass zuviel Daten von einem übers Netz wandern, wer sich mit der Cloud nicht anfreunden kann, sollte vielleicht bei Windows 7 bleiben, auf die paar Vorteile von Windows 8 verzichten und langfristig auf eine ausgewählte Linux Distribution wechseln. Da scheint es noch traditionellere Betriebssysteme zu geben.

Links:


  • Informationen über das Microsoft Konto im Zusammenhang mit Windows 8 findet man auch bei Microsoft.
  • Wie Windows 8, gibt es auch 8.1 als Testversion und zwar die ganz große Edition, die Enterprise:
    Winfuture.de: Windows 8.1 Enterprise RTM: 90-Tage-Trial 

  • Update von 8.0 auf 8.1 geht normalerweise über den Store, doch wenn man mehrere Rechner updaten will, kann man sich auch alles zuerst downloaden, auf einen USB Stich z.B. speichern und dann updaten (Ist ein Trick, aber funktioniert! Vielleicht vorher auch die Kommentare zu folgendem Artikel überfliegen, damit man Fehler vermeidet.):
    Chip.de: Windows 8.1 ISO: Download ohne Windows Store


    So ein Update auf 8.1 ist eine große Sache und daher empfiehlt sich davor unbedingt ein Backup zu machen (z.B. mit Windows-7-Dateiwiederherstellung, zu finden in der Systemsteuerung)!