Angular.JS ohne $scope

In Angular ist der Scope die technische Implementierung des Viewmodels. Obwohl einfach zu verstehen und verwenden ist angekündigt mit der Version 2.0 darauf zu verzichten. In der Tat ist ein Fehler in der Scope Hierarchie mitunter schwer zu finden.

Folgender Blog Artikel ist rein akademisch und zeigt zwei Wege auf einen Controller in Angular.js zu schreiben bzw Daten deklarativ in HTML zu binden.

   1:  <form id="form1" runat="server" ng-app="app">
   2:          <div ng-controller="myController">
   3:              <input ng-model="person.name" />
   4:<input ng-click="myclick()" type="button" value="click" />
   5:          </div>
   6:   </form>
   7:   
   8:   <script>
   9:         var app = angular.module('app', []);
  10:          app.controller('myController', ['$scope', function ($scope) {
  11:             $scope.person = { name: 'Hannes' };
  12:             $scope.myclick = function () {
  13:             $scope.person.name = "Franz";
  14:              };
  15:       }]);
  16:   </script>

 

Die Scope freie Alternative: Durch die Nutzung der Controller AS Syntax im HTML Teil entfällt $scope als Instanz des Viewmodels. Im Controller kann kann per this auf Methoden und Eigenschaften zugegriffen werden. Über die Extend Methode wird das JavaScript Objekt erweitert.

   1:  <form id="form1" runat="server" ng-app="app">
   2:    <div ng-controller="myController as alias">
   3:        <input ng-model="alias.person.name" />
   4:        <input ng-click="alias.myclick()" type="button" value="click" />
   5:  </div>
   6:  </form>
   7:   
   8:  <script>
   9:     var app = angular.module('app', []);
  10:     app.controller('myController',myCtrl);
  11:     function myCtrl() { };
  12:     angular.extend(myCtrl.prototype, {
  13:              person : { name: 'Hannes' },
  14:              myclick: function () {
  15:              this.person.name="Frnaz";
  16:          }
  17:     });
  18:  </script>

 

Nach einer weile nachdenken, noch eine einfachere Scope freie Version eines Angular Controllers.

   1:  var app = angular.module('app', []);
   2:          app.controller('myController', [function () {
   3:              var vm = this;
   4:              vm.person = { name: 'Hannes' };
   5:              vm.myclick = function () {
   6:                  vm.person.name = "Franz";
   7:              };
   8:          }]);

 

Den gewöhnlichen Teilnehmer einer Angular Schulung überfordert dies eindeutig. In meinem Angular Training bleibe ich bei der Scope Variante.

Stand-by-modus aussetzen

Wie vielleicht jeder schon einmal erlebt hat sorgen Windows Media Player und Co. dafür dass Computer nicht in den Ruhezustand wechseln. Ein C# Programm sorgt für sich genommen nicht dafür das dass Betriebssystem aktiv bleibt.
Hier präsentiere ich eine Möglichkeit den Stand-by-Modus auszusetzen. Dafür muss durch P/Invoke die Funktion SetThreadExecutionState() eingebunden werden.
Dafür ist folgende Einstellung interessant:

ES_SYSTEM_REQUIRED : Bedeutet, das System darf nicht abgeschaltet werden.

Eine Funktion mit diesem Status aufzurufen sorgt nur dafür das etwaige Timer zurückgesetzt werden, eine Dauerlösung ist das nicht.

Um jetzt eine permanentere Lösung zu generieren ist es nötig die Funktion entweder periodisch aufzurufen oder den Status per Oder mit ES_CONTINOUS zu verknüpfen.

Diese kleine Snippet zeigt wie man den Stand-by-Modus dauerhaft aussetzt:


namespace MyWindowsFormsApplication
{
public partial class MyForm : Form
    {
public enum EXECUTION_STATE : uint
        {
            ES_CONTINUOUS = 0x80000000,
            ES_DISPLAY_REQUIRED = 0x00000002,
            ES_SYSTEM_REQUIRED = 0x00000001
        }
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
.
.
.

private void Form1_Load(object sender, EventArgs e)
        {
            SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED);
        }
    }
}


Vergleich siehe MSDN

Wie immer viel Spaß beim tüfteln, und wer mehr Wissen will wendet sich an die ppedv.

If you pay Peanuts- you get Monkeys

Gerne zitierte Phrase im Zusammenhang mit mäßig motivierten Mitarbeitern. Unabhängig davon das ich den direkten Zusammenhang zwischen Geld und Leistung bisher in der Praxis nicht erfahren habe, stellt sich die Frage, wie korreliert Bezahlung und Motivation genau. Natürlich hat jeder Mensch Grundbedürfnisse, die erfüllt sein müssen. Aber alles was darüber hinaus, geht schlägt sich nicht immer in ein mehr an Motivation nieder. Manchmal sogar ins Gegenteil.

Aus der Sicht des Arbeitgebers stehen allerdings Kosten und Leistung sehr wohl in einer starken Abhängigkeit. Je nach Region und Geschäftsmodell muss der Ertrag eines Mitarbeiters seine direkte Kosten (ca  Jahresbrutto *1,35) mindestens um den Faktor 2-3 übersteigen um überhaupt in die Gewinnzone zu kommen.  Darin unterscheidet sich rein kaufmännisch betrachtet eine menschliche nicht von einer sonstigen Ressource. Wenn die Rechnung nicht stimmt, ist über kurz oder lang jeder Arbeitsplatz weg. Industriebranchen wie Textil oder Stahl gehen an dieser simplen Formel zugrunde.  Folglich muss jedem Berufseinsteiger bewusst sein, je höher sein Verhandlungserfolg, desto wahrscheinlicher sein Scheitern.

Trotzdem klafft häufig eine Lücke zwischen selbst Wahrnehmung und dem Jahres Brutto. Genau dann kommt aus der Mitarbeitersicht der Widerstand auf. Man ist häufiger krank und bringt in der übrigen Zeit den Tag auf Facebook hinter sich. Braucht sich der Chef nicht zu wundern. If you pay Peanuts – you get Monkeys.

Vergeblich habe ich versucht die Quelle oder den Urheber des Zitats zu finden, um den ursprünglichen Kontext wieder herzustellen. Nun werfe ich mal als Gendanken eine alternative Interpretation auf.

Warum machen Menschen irgendwas, in einer in allen Bedürfnissen übersättigten Zeit? Jedes Jahr ein neues iPhone kaufen? Aber Menschen gehen nach wie vor zur Arbeit, sind bei der Freiwilligen Feuerwehr oder helfen einem Freund beim Haus bauen.

Schlicht weil sie es wollen, also intrinsisch motiviert. Wenn man nun jemanden für etwas was er regelmäßig und gerne macht, kleine Belohnungen in Aussicht stellt, wird das Ergebnis ganz kurz besser und dann bestenfalls gleicht gut funktionieren. Wenn die Sonderleistung (die Erdnuss) gestrichen wird, wird sich die Einstellung durchsetzen, in einer Art Trotzreaktion, die Leistung zu verweigern. Unzählige Studien beschäftigen sich mit der Thematik intrinsische und extrinsische Motivation und deren Auswirklungen. Die Ergebnisse deuten alle in die selbe Richtung. Nur wenn der finanzielle Sonderreiz sehr hoch ist, also deutlich mehr als eine Erdnuss, wird sich jemand auch gesondert bemühen.

Wenn man also einem Menschen für bewertbare Leistungen (zb. Rasenmähen), kleine Bonis gewährt (5€) wird der Mensch zum dressierten Affen, der ohne diese Zuwendung passiv wie ein Affe verharren wird.

Moderne Management Systeme versuchen über Ziele und  Kennzahlen die Mitarbeiter zu managen und versprechen dabei bei Erfüllung entweder sehr viel oder aus Sicht des Mitarbeiters lediglich Peanuts. Das ist eine moderne Art von Zirkusdressur. Dagegen wehren sich moderne gebildete Menschen.

Was denkst Du? Follow up an hannesp@ppedv.de

Warum c#? oder Was will Ich eigentlich?

Wer sich entscheidet eine Softwarelösung zu entwickeln muss im Voraus viele Fragen klären.
Früher oder später wird immer die Frage zu klären sein in welcher Programmiersprache sich denn eine konkrete Aufgabenstellung am schnellsten, elegantesten oder effizientesten lösen lässt.
Also ist in diesem Kontext zu klären für welche Aufgabenstellungen C# das Mittel der Wahl sein kann.

Wer als Entwickler auf Kenntnisse in C, C++ oder COM zurückgreifen kann wird die Möglichkeit jene weiter zu verwenden nicht ungenutzt lassen wollen. Die .NET Common Language Runtime ist selbst bekanntermaßen komponentenbasiert, und C# zielt im Kern darauf ab alle Objekte möglichst einfach als Komponenten darzustellen. Im Vergleich zu einigen anderen Programmiersprachen die auf Objekten basieren sind C# Komponenten vollständig selbstbeschreibend und müssen nicht gesondert registriert werden was besonders in dem zu berücksichtigen ist wenn man an bereits existenten Anwendung arbeitet. C# im Gegensatz zu anderen Hochsprachen ermöglicht durch den unsafe-Modus Lowlevelzugriffe womit man alte performante  Lösungsansätze mit der Eleganz einer modernen Programmiersprache vereinen kann.

Für Annehmlichkeit sorgen die .NET Common Language Runtime mit massiver Bibliotheksunterstützung und Visual Studio als mächtiges und trotzdem recht intuitives Tool. Zwei Features des C# sind besonders hervor zu heben:

LINQ (Language Integrated Query), vereinheitlicht den Zugriff auf externe und interne Quellen auf die man sonst mit jeweils ihren eigenen Methoden zugreifen müsste. Im Unterschied zu SQL kann mit LINQ auch auf hierarchische und Netzwerk-Strukturen zugegriffen werden. Wichtig ist das LINQ Code vom Compiler direkt auf Fehler geprüft werden kann und so die Fehleranalyse massiv vereinfacht.LINQ bsp

Lambda-Ausdrücke, sind anonyme Funktionen mit denen lokale Funktionen geschrieben werden können welche als Argumente übergeben oder als Wert von Funktionsaufrufen zurückgegeben werden können. Auf der linken Seite des Lambda Operators => müssen etwaige Eingabeparameter stehen und auf der anderen der Ausdruck oder Anweisungsblock.
Lambdabsp



Am ehesten muss C# sich also mit Java und C++ vergleichen lassen, in folgenden Blogeinträgen werde ich auf die Unterschiede detaillierter eingehen.
Wer jetzt sofort mehr über C# samt LINQ und Lambda-Ausdrücken erfahren will hat die besten Chancen dazu in einem Kurs der ppedv.

Bedeutung von Open Source in 2015

Bei einem Bier Gespräch mit Norbert Eder, kam das Thema auf meine aktuelle Meinung zu Open Source. In der Community ist ein Blog Eintrag vor ca zweieinhalb Jahren durchaus heftig diskutiert worden. Fazit daraus, die Verfügbarkeit von Quellcode unter OS Lizenz hat keine Bedeutung für mein Business. In  der Zwischenzeit ist viel passiert, einiges was meine damalige Meinung stützt und anderes was meine Sicht auf die Dinge verändert hat.

Open Source basierte Software ist nicht besser oder sicherer als Closed Source. Dieses Thema hatte ich anlässlich des Sicherheits Problems Heartbleed aufgegriffen. Es fehlt schlicht jeder Beweis für die häufig vertretene These, das hunderte Entwickler den Code prüfen und damit Sicherheitsprobleme sofort auffallen und gelöst werden.

Aus der Sicht als Microsoft Kunde, hat die Veröffentlichung des Quellcodes in der Vergangenheit praktisch meist das Ende des Produktes bedeutet. In jedem Fall wurden Developer Ressourcen abgezogen und die Qualität leidet.

Mein Bedürfnis Quellcode einer Bibliothek zu lesen und vielleicht sogar einen Bug zu fixen hält sich erheblich in Grenzen. Gleiches gilt für Consumer und sicher auf in weiten Teilen für den Enterprise Kunden. Norbert führte ins Feld, das er die Möglichkeit nutzt und auch schon mal Code zurück geleifert hat, neudeutsch contributed. Für mich habe ich dies in den Anfängen von .NET mit ildasm ab und angenutzt um IL Code zurück zu Compilieren und auch mal eine Klasse mit diesem Fragmenten neu zu schreiben. Mit steigender Funktion und Stabilität von .net hat sich dies erübrigt.

Nur ein sehr kleiner Teil der Community ist fähig und willig Code zu contributen. Aus einer konkreten Problemstellung in Angular, kann man auf github nachvollziehen, das es mit der Innovation und den kurzen Zyklen nicht immer so weit her ist. Konkret fehlt eine häufig gewünschte Funktion seit fast drei Jahren.  Angular ist ohnehin ein Spezialfall, weil Google getrieben und bezahlt. Trotzdem wird nur  Support von ca 18 Monaten angekündigt. Im Vergleich dazu bei Microsoft Silverlight zehn Jahre. Wie die Erfahrung zeigt, kann das Ende in jedem Fall schnell und überraschen kommen- in dieser Hinsicht steht es 1:1.

Dabei gibt es durchaus eine Reihe von Leuten die außerhalb des Angular Projektes den Aufwand getrieben haben und dieses fehlende Feature entwickelt haben. Dazu gehöre auch ich. Allerdings findet sich meine Lösung als Blog Beitrag, schlicht weil ich den Aufwand mit Github nicht treiben möchte und auch Zweifel habe ob meine Lösung wirklich optimal ist. Was ich definitiv nicht brauche ist emotionale Diskussion bis hin zum Shitstorm meiner Arbeit, Norbert Eder fordert in diesem Kontext mehr Mut und verspricht sich davon die persönliche weiter Entwicklung.

Welche Auswüchse die Selbstorganisation von Open Source Projekten annehmen kann, sieht man an Node.js oder Angular 2. Erst passiert längere Zeit nichts, dann gibt es eine Abspaltung, Fork genannt und keiner weis so recht, wie es weiter geht. Durchaus häufig Bloggen Core Entwickler Ihren Unmut und die Beweggründe für Ihren Ausstieg, was dem Projekt nicht zuträglich ist. Natürlich kann das bei Unternehmen auch passieren, allerdings sind diese für Ihre Produkte haftbar. Das kann richtig ins Geld gehen. Open Source Projekte sind da fein raus, da haftet niemand. Mitarbeiter sind überdies Vertraglich zur Verschwiegenheit verpflichtet.

OS Bibliotheken werden in der Regel völlig Enthusiastisch von der Community aufgenommen  und über Nacht zum defacto Standard deklariert. Wer Zweifel äußert, hat nicht verstanden oder sich noch nicht hoch genug in die spirituellen Welten begeben.

Wenn Monate später Design oder Performance Ziele nicht erreicht wurden, wird still und heimlich eine neue JavaScript Sau durchs Dorf getrieben. Da bleibt keine Zeit für Manöver Kritik und Analyse des Scheiterns. Hintergründe sind bestenfalls einer Handvoll Insidern bekannt.

In einem User Group Vortrag von Mike Bild zum Thema Microservices, fiel nebenbei die Bemerkung “mit dem alten Zeugs, bekommst schlicht keine Entwickler mehr”.  Das geht sogar soweit, das jeder Service mit einer eigenen Technologie gebaut werden kann. Ein Gedanke der sich mit der generellen Veränderung des Weltbildes der heutigen Berufseinsteiger gut deckt. Mann will selbstbestimmt leben. Ein Pflichtenheft degradiert dabei zum Code Monkey. Das bedeutet das es Technologie Entscheidungen gibt, die die Anzahl der Bewerber erheblich steigern können. Richtig- die ganze Java Script Welt scheint  aus diesen Nektar zu sprießen. Die agilen Methoden liefern genau dafür Management freie Umgebungen. Jeder tut was er kann und will. Der Kontrollverlust ist Horrorvorstellung für fast jeden Entscheider.

Microsoft setzt seit einigen Jahren auf Open Source, weit über das Ajax Control Toolkit hinaus. Man fragt sich warum. Wo wird dadurch Geld verdient? Speziell da sich der Redmonder Hersteller diesen Projekten regelrecht anbiedert und dabei die gestandenen Microsoft Kunden gefühlt im Regen stehen lässt. Seit Windows 8, also schon vier Jahre, werden JavaScript und co propagiert. Der einzige Zweck kann nur sein, Teile der nicht Microsoft Welt abzuholen. Gefühlt ohne große Resultate, dafür aber plötzlich mit einem Migrationspfad, der weg von Microsoft führt. In der Tat sind einige MVP’s in der Zwischenzeit stolze Mac User mit veränderten Entwicklungsfocus.

Gern zitiertes Argument pro Shared und damit Quell Offener Software ist der letztendlich verlorene Kampf der Microsoft Encarta vs Wikipedia. In erster waren viele Entwickler und Autoren beschäftigt und bezahlt. Wikipedia arbeitet kostenfrei und sogar (fast) ohne Werbung.

image

Auch Wikipedia kennt die Community üblichen Grabenkämpfe zwischen der für Reinheit kämpfenden Elite und anderen Autoren. Auch Wikipedia braucht Geld. Das allerschlimmste aber, es ist nur Platz für ein einziges Wikipedia. Es kann keine Konkurrenz und damit auch keine Innovation mehr gegeben. Die Zukunft wird eine Welt der Monopole bringen.

Die Microsoft Openess gipfelt in der Veröffentlichung von Kern Teilen des .NET Frameworks, Ich könnte meinen ASP.NET 5 Code nun teilweise auf einem iOS hosten. Warum sollte ich das? Ich würde mir mehr wünschen, das Silverlight auf iOS oder Android läuft. Aber das ist eine andere Geschichte.

Die neue selbstbestimmte Generation findet also sich und den Shared Gedanken in Open Source wieder. Diese Mitarbeiter sind damit intrinsisch motiviert und schaffen auf Vertrauensbasis. Soweit das Ideal. Allerdings wechselt Motivation und unterliegt der Tagesverfassung. Man hat Sorgen, Krankheit  oder einen blöden Chef der das alles nicht versteht. Produkte müssen trotzdem fertig werden. Den durchaus nicht neuen agilen Gedanken findet man als Vorgehensmodell in SCRUM definiert. Den größten Vorwurf den ich z.B. Scrum mache ist, das von einer idealen Welt ausgegangen wird. Der krank feiernde Kollege existiert darin nicht.

Auch Open Source enthält Übles und wir haben keine Mechanismen damit umzugehen. Paket Manager werfen gnadenlos zehntausende Zeilen Code in das Projekt. Selbst wenn man alles validieren würde, erlauben es die extrem kurzen Zyklen nicht, den Code Fehlerfrei zu halten. Enterprise Kunden stiegen dann aus npm und nuget aus und pflegen ihren veralteten Open Source Code selber weiter. Persönlich erwarte ich den ein oder anderen Sicherheitsgau auf uns zukommen.

Allerdings hat Open Source wesentliche Impulse geliefert um in diesem Umfeld überhaupt Software produzieren zu können. Das öffnen einer Issue List für jedermann, die kurzen Zyklen und das ggf. direkte Eingreifen in den Code findet man in Wasserfall basierenden Modellen nirgends. Diese dafür entwickelten Konzepte erlauben es nun viel schneller Produkte in den Markt zu bringen. Der vorläufige Höhepunkt aus der Open Source Community ist DevOps mit Vermischung von Administration und Programmierung. Die Release Zyklen gehen dabei bis in den Minutenbereich und erlauben dann kaum noch automatisierte Tests.  Codieren sozusagen am offenen Herzen. Nichts desto trotz sind die Vorgehensweisen essentiell beim Fixen on Hot Bugs in stark genutzten Web Anwendungen. Einen mehrstündige Down kann sich eine Azure Cloud nicht leisten.

Open Source wird weiter das Business aufrollen. Getrieben vom Trend der Shareconomy. Persönlich sehe ich das nur als schmalen Aspekt einer tiefgreifenden gesellschaftlichen und wirtschaftlichen Veränderung. Welche Risiken und Veränderungen sich daraus ergeben, lässt sich nicht einmal im Ansatz abschätzen. Bei weiten Teilen der Community spielt Risiko Betrachtung aktuell gar keine Rolle mehr. Letztendlich bleibt auch die Frage offen wie unsere Geschäftsmodelle der Zukunft aussehen werden, wenn plötzliche keine Software Lizenzen  mehr verkauft werden.

Windows Server 2012 R2: WSUS automatisch bereinigen

Mit der Zeit sammeln sich auf einem WSUS (Windows Server Update Service) einige Updates an. Da können auch schnell mehrere hundert Gigabyte an Daten zusammenkommen. Nicht jedes Update, welches auf dem WSUS gespeichert ist, wird aber noch benötigt. Daher ist es aus Gründen der Speicherplatzeffizienz sinnvoll, von Zeit zu Zeit etwas aufzuräumen. Dafür gibt es schon seit längerem einen passenden Assistenten in der WSUS-Konsole:

wsus_cleanup_00

Dieser Assistent ließ sich “früher” (also z.B. unter Windows Server 2008 R2, WSUS 3.0 SP2) nur manuell oder über komplizierte Skripte ausführen.

wsus_cleanup_01

wsus_cleanup_02

Seit Windows Server 2012 lässt sich WSUS aber auch über PowerShell steuern. Hier gibt es ein passendes Commandlet “Invoke-WsusServerCleanup”, welches die Bereinigung durchführt. Als Parameter kann verwendet werden:

Invoke-WsusServerCleanup [-CleanupObsoleteComputers] [-CleanupObsoleteUpdates]

[-CleanupUnneededContentFiles] [-CompressUpdates] [-DeclineExpiredUpdates]

[-DeclineSupersededUpdates] [-UpdateServer <IUpdateServer> ] [-Confirm] [-WhatIf]

 

Damit lässt sich unkompliziert steuern, welche Komponenten beräumt werden sollen.

wsus_cleanup_03

Dieses PowerShell-Commandlet kann nun z.B. im Rahmen eines kleinen Skriptes regelmäßig und automatisch (z.B. per Aufgabenplanung) ausgeführt werden. Damit spart man sich die regelmäßige, manuelle (aufwändige) Bereinigung mit Hilfe des Assistenten.

Die komplette Syntax zum angesprochenen PowerShell-Commandlet findet sich hier: http://technet.microsoft.com/en-us/library/hh826162.aspx

Boostrap Toogle Switch mit Angular Direktive

Was Jquery Mobile mit dem Flipswitch kennt, sucht man bei Bootstrap vergeblich.

image

Da es ziemlich naheliegend ist, fordert die Community auf Github von Bootstrap seit drei Jahren das Feature. Irgendwie vergeblich. Da Open Source, kann man das natürlich selber schreiben und ins Projekt einchecken. Viele tun das scheinbar nicht. Man findet jede Menge Lösungen offsite, die allerdings in Funktion und Qualität nicht ganz den Ansprüchen genügen. Also selber machen.

Das Layout könnte im HTML Code z.B. so gelöst werden

   1:  <div class="btn-group">
   2:       <a class="btn btn-xs btn-primary active">Wert</a>
   3:       <a class="btn btn-xs btn-default">Wert2</a>
   4:  </div>

Ist optisch nicht ganz ein Flipswitch, aber leicht anpassbar.

image

Für den Zustandswechsel wird ein Stück JavaScript benötigt, das die Klassen btn-primary und btn-default austauscht.

Hier wird aber weiter gedacht. Der Wert soll an ein Viewmodel eines Angular.js Controllers gebunden werden.

   1:    .controller('myController', ['$scope', function ($scope) {
   2:                 $scope.wert = true;

 

Der HTML Teil wird mit einer Angular Direktive erstellt. Als Parameter werden die beiden Beschriftungen übergeben.

   1:  <div class="btn-group" 
   2:     my-toggle my-text1="meins" my-text2="public" model="wert">
   3:  </div>

 

In meinem Angular Trainings lernt man die genauen Details zu Direktiven. Auf einige Angular Stolpersteine soll hier aber hingewiesen werden.

Mit dem Template wird HTML Code in der Page erzeugt, der die beiden Buttons enthält. Komplizierter ist die Gültigkeit des Scope, der das Viewmodel aus dem Controller hält und letztendlich den checked Wert enthält. Wie kann man aus einer Direktive auf den Scope des Controllers zugreifen und diesen auch verändern? Da es mehrere geschachtelte Scopes gibt, somit auf den Parent Scope.

Mit Chrome und der Batarang Erweiterung kann die Internas der Scope Hierarchie auch darstellen.

image

image

Im HTML Code wurde vorher das Attribut model eingeführt, das auf die Property wert (also $scope.wert) bindet. Leider verhält sich die Bindung auf den my-text obwohl optisch ident völlig anders.

In der Direktive wird gesteuert, welche Attribute (@) und Bindungen (=) in den privaten Scope übernommen werden. Nun kann in der Click Funktion des DIV! der Parent Scope ($scope.wert) per Child Scope (scope.model) geändert werden, weil das = eine zwei Wege Bindung bewirkt.

   1:  .directive('myToggle', function () {
   2:         return {
   3:                    restrict: 'A',
   4:                      scope: {
   5:                             model: '=',
   6:                             myText1: "@",
   7:                             myText2: "@"
   8:                         },
   9:                         template: '<a class="btn btn-xs active" 
ng-class="model ? \'btn-primary\' : \'btn-default\'">{{myText1}}</a>'
+
  10:                        ' <a class="btn btn-xs " 
ng-class="model ? \'btn-default\' : \'btn-primary\'">{{myText2}}</a>'
,
  11:                         link: function (scope, element, attr) {
  12:                             element.bind('click', function () {
  13:                                 scope.model = !scope.model;
  14:                                 scope.$apply();
  15:                             });
  16:                 }
  17:           }
  18:     })

Hyper-V VMs werden angehalten, wenn der Speicherplatz knapp wird

Auch wenn die Tatsache selbst nicht neu ist möchte ich den folgenden Fakt etwas genauer beleuchten, da immer mehr Unternehmen Hyper-V für produktive Virtualisierungszwecke verwenden.

Eine Hyper-V VM wird vom System angehalten, wenn der Speicherplatz auf dem Laufwerk, welches von der VM für die virtuelle Festplatte verwendet wird, knapp wird. Dies geschieht in erster Linie nur dann, wenn die VM mit einer dynamisch wachsenden VHD oder VHDX arbeitet. Auf Grund eines Bugs waren aber bei früheren Hyper-V Versionen (2008 / 2008 R2) auch VMs mit statischen VHDs betroffen.

Das Anhalten der VM geschieht, um einen Absturz des Gastbetriebssystemes auf Grund von Speicherplatzmangel zu vermeiden (die VM “glaubt” noch reichlich Speicherplatz zu haben und versucht, diesen zu belegen, u.a. auch für die Auslagerungsdatei, in Wahrheit ist der Speicherplatz auf dem Datenträger bereits fast vollständig belegt).

Das Anhalten der VM wird dann mit dem Status “Angehalten – Kritisch” markiert (“Paused – Critical” auf englischen Systemen):

HVFreeSpace01

Insbesondere wenn viele VMs mit dynamisch wachsenden VHDs das selbe Plattensystem nutzen ist das Risiko, dass dies geschieht, relativ groß.

Glücklicherweise kündigt sich das bereits vorab an:

HVFreeSpace03

Im Ereignisprotokoll wird unterhalb von “Microsoft / Windows / Hyper-V-VMMS / Admin” ein Ereignis 16050 protokolliert, welches auf den zur Neige gehenden Speicherplatz hinweist.

Das Problem dabei: Dies geschieht erst, wenn der freie Speicherplatz unter 2GB fällt und benötigt auch einige Sekunden nach dem diese Grenze erreicht wurde, bis der Eintrag protokolliert wird.

Wenn der Speicherplatz dann noch knapper wird und eine oder mehrere VMs angehalten wurden wir dies ebenfalls vermerkt:

HVFreeSpace04

Hier wird im selben Protokoll das Ereignis 16060 vermerkt. Dieses weist nun also auch auf die Tatsache hin, dass eine VM angehalten wurde. Dies geschieht allerdings erst, wenn nur noch 200MB oder weniger zur Verfügung stehen!

HVFreeSpace02

(Hinweis: Die Screenshots stammen von einem Testsystem; Es wird ausdrücklich nicht empfohlen, Hyper-V Daten auf dem Betriebssystem-Laufwerk abzulegen!)

Wenn man mit Snapshots / Checkpoints arbeitet, dann sollte man noch beachten, dass die Daten nach dem Snapshot evtl. auf einem anderen Laufwerk abgelegt werden als vorher!

Mittels “Aufgabe an dieses Ereignis anfügen…” kann man z.B. ein Skript oder eine E-Mail auslösen, wenn die betreffenden Ereignisse eintreten:

HVFreeSpace05

(Dazu muss dann das betreffende Ereignis mittels Rechtsklick angeklickt werden, im Screenshot habe ich ein beliebiges anderes Ereignis gewählt)

Bootstrap mehrfach Navbar

Einige Zeit habe ich über der Usability einer Web Anwendung gegrübelt. Aktuell verwenden wir das Projekt um Realtime Feedback, vor während und nach Konferenz Sessions, zu bekommen. Die Idee ist einen lernen-wissen-teilen Zyklus weit über die eigentliche Konferenz hinaus zu etablieren.

Nächste Woche auf der GUI&DESIGN in Berlin, wird das Projekt wieder eingesetzt. Da wir unter anderem mobile Devices mit dieser Web App adressieren, folgt das UX dem responsive Design Paradigma. Framework ist Bootstrap.

Jede Konferenz Session kann einzeln von Teilnehmer  mit bis 5 Sternen bewertet oder mit Text Kommentaren versehen werden. Das Problem ist der begrenzte Bildschirm. Wie präsentiert man bis zu 30 Sessions gleichzeitig auf einem Smartphone? Nach einem Pair UX Review mit Martin Hoppe von Maximago, kam der Gedanke auf, das von der Bedienung wie eine Bootstrap Navar zu lösen.

Damit waren folgenden Anforderungen definiert

  • Mehrstufige Navbar
  • Navbar Toogle Button dauerhaft anzeigen
  • Menüpunkte nur bei Drop Down
  • Menü schließen bei Auswahl
  • mehrspaltiger Navbar Collapse Bereich

Da fertige UI auf einem iPhone Emulator

image

Und der nicht ganz perfekte multi drop down Navbar Anwendungsfall

image

Die Steuerung des AufZu einer Navbar, wird über ein UI Element mit dem Attribut data-toggle ausgelöst. Das Ziel ist eine Klasse oder ID eines DIV Elements, hier als collapse2 bezeichnet um einen Unterschied zu navbar-collapse des Top Menüs zu haben. Der Z Index  ermöglicht der Top Navbar sich über die zweite Reihe Navbar zu entfalten. Der Abstand top entspricht der Höhe der Top Navbar.

   1: <nav class="navbar navbar-inverse navbar-fixed-top always-open" 
style="top: 50px;z-index:999;">
   2:    <div class="navbar-header">
   3:      <a class="navbar-brand" href="#">Room {{target}}</a>
   4:        <button type="button" class="navbar-toggle"
   5:           data-toggle="collapse" data-target=".navbar-collapse2">
   6:           <span class="icon-bar"></span>
   7:           <span class="icon-bar"></span>
   8:           <span class="icon-bar"></span>
   9:       </button>
  10:     </div>
  11:              
  12:  <div class=" navbar-collapse2 collapse" >

Die ASPX Seite setzt sich aus einer Masterpage und einer Content Page zusammen. In der Content Page (gern auch View) wird das CSS  von Bootstrap in einem Style Block überschrieben und ergänzt. Ziel ist es das Verhalten der Second Navbar zu ändern (always-open). Diese ist dann nicht mehr Responsive, sondern verhält sich so wie eine Navbar im Smart Device Modus.

   1:  .navbar {
   2:     margin-bottom: 0 !important;
   3:          }
   4:  .navbar.always-open {
   5:     border-radius: 0;
   6:           }
   7:  .navbar.always-open .navbar-header {
   8:     float: none;
   9:           }
  10:  .navbar.always-open .navbar-toggle {
  11:     display: block;
  12:           }
  13:  .navbar.always-open .navbar-collapse {
  14:     border-top: 1px solid transparent;
  15:     box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
  16:            }
  17:  .navbar.always-open .navbar-collapse.collapse {
  18:     display: none !important;
  19:            }
  20:  .navbar.always-open .navbar-nav {
  21:     float: none !important;
  22:     margin: 7.5px -15px;
  23:             }
  24:  .navbar.always-open .navbar-nav > li {
  25:             float: none;
  26:             }
  27:  .navbar.always-open .navbar-nav > li > a {
  28:     padding-top: 10px;
  29:     padding-bottom: 10px;
  30:             }
  31:  .navbar-collapse2 {
  32:     padding-right: 15px;
  33:     padding-left: 15px;
  34:     overflow-x: visible;
  35:     -webkit-overflow-scrolling: touch;
  36:     border-top: 1px solid transparent;
  37:     -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
  38:     box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
  39:           }
  40:   
  41:  body {
  42:     padding-top: 100px !important;
  43:          }

 

Die beiden Attribute Data-Toggle und data-target werden dann in den einzelnen Listen Einträgen verwendet, um die Navbar nach Selektion auch wieder einzuklappen. Die Navbar Collapse Liste setzt sich dabei in der Regel aus UL und LI Elementen zusammen. Die LI Element werden einfach in der Breite geschrumpft. Für drei  spaltig auf einen Wert <33% und auf block formatiert.

   1:  <li  title="<%#Item.roomname%>" style=" width:32.6%; display: inline-block">
   2:  <a href='/chat#<%#HttpUtility.UrlEncode(Item.shortname)%>'
   3:  data-toggle="collapse" data-target=".navbar-collapse2"

 

und so sieht der normale Browser Benutzer die Web App

image

Viel Freude damit.

Azure News

Auditing für SQL-Database

Mittels Auditing kann man nun sämtliche Events (sämtliche CRUD-Operationen) die in einer Azure Datenbank stattfinden protokollieren. Auditing stand bislang nur über das Preview Portal zur Verfügung. Nun ist es allgemein verfügbar und kann mittels dem normalen Portal aber auch mittels PowerShell-Befehlen verwaltet werden. Das Protokoll wird in einem Azure Storage-Konto, für das natürlich Kosten anfallen, gespeichert. Weitere Informationen erhalten Sie unter: http://azure.microsoft.com/de-de/documentation/articles/sql-database-auditing-get-started/

Operational Insights in der öffentlichen Vorschau

Mit Azure Operational Insights steht ein Analysedienst zur Verfügung mit dessen Hilfe Administratoren schnell Einblick in lokale sowie auch cloudbasierte Umgebungen erhalten können.  Für die Datenanalyse stehen dabei von Microsoft und der Community entwickelte Muster zur Verfügung. Operational Insights enthält Suchfunktionen um Fehler schneller analysieren zu können. Problembehebungen können automatisiert über verschiedene Datenquellen hinweg durchgeführt werden. Somit können Adminsitratoren auf einfache Art und Weise und ohne eine einzige Zeile Code zu erstellen sehr schnell interaktive Ergebnisse. Nehr Informationen erhalten Sie unter: http://azure.microsoft.com/en-us/services/operational-insights/. Die Preisdetails finden Sie unter http://azure.microsoft.com/en-us/pricing/details/operational-insights/

Abkündigung von Diensten

Die beiden Dienste Windows Azure Media Packager und Azure Media Encryptor sind nur noch bis zum 1. November 2015 verfügbar. Kunden die diese Dienste nutzen haben nun fast ein Jahr Zeit auf andere Dienste umzustellen, da nach dem 1.11.2015 eine vollständige Deaktivierung der Services stattfindet. Die Dienste wurden bislang verwendet um Dateipaketformate zu konvertieren und zu Verschlüsseln. Diese Aufgabe übernimmt jetzt die dynamische Paketkomponente von Azure Media Services. Mehr Informationen dazu erhalten Sie unter http://msdn.microsoft.com/de-de/library/azure/jj889436.aspx.

Änderungen bei Azure Verträgen

Seit November werden die Azure Verträge im Microsoft Online Services Agreement (MOSA) zusammengefasst. Somit haben Kunden die auch andere Onlinedienste wie Office 365, Dynamics Online verwenden eine einheitliche Vertragsplattform.

Training, Schulung, Sharepoint

Month List