Ralf Westphal: Konstruktivistische Softwareentwicklung für mehr Wandelbarkeit

Code sei ein Mittel, um die Realität abzubilden. Zumindest scheint mir das ein wesentlicher Antrieb hinter der Objektorientierung zu sein. Mit Objekten sollte es endlich möglich sein, Dinge und Verhältnisse der Welt möglichst 1:1 in Code zu fassen. Das ist eine platonische Sichtweise der Welt. Sie geht davon aus, dass es etwas unabhängig von Code gibt, das irgendwie ist. Und dieses So-sein kann

Jürgen Gutsch: CodeLens Indicators for Git in VS 2013 Ultimate Update 3

Nachdem ich gestern endlich mal das Update 3 für Visual Studio 2013 installiert habe, ist mir heute endlich auch aufgefallen, dass die CodeLense Indicators erweitert wurden:

Neu sind an zweiter und dritter Stelle der letzte Änderer und der Zeitpunkt der letzten Änderung, sowie die Anzahl der Änderungen. Diese Angaben stammen in meinem Fall aus Git.

Klickt man auf die zweite oder dritte Stelle so sieht man die die Änderungen mit wunderhübschen, denglischen Commit Messages, Datum, User und kann auch direkt die entsprechende Version in den Editor holen

Ein Maus-Over auf der einzelnen Zeile gibt dabei weitere Informationen preis.

Ein bisschen Recherche hat mich zu einem ausführlichen Blogartikel von Jean-Marc Prieur gebracht: Code Lens for Git in Visual Studio 2013 Ultimate Update 3

Jetzt muss die Git Integration im VS nur noch für große Projekte performanter werden, dann würde ich die nicht immer gleich ausschalten ;)

Kay Giza [MS]: Einladung: Technical Summit 2014 in Berlin im November

Es ist mir eine freude auf das Microsoft Technical Summit 2014, in Berlin im November 2014 aufmerksam zu machen! Denn: Microsoft lädt zum Gipfeltreffen der technischen Experten nach Berlin ein. Top Speaker des Technical Summit 2014 ist sicherlich der neue Microsoft Chief Executive Officer (CEO) Satya Nadella. Microsoft lädt IT-Professionals und Entwickler vom 11. bis 13. November in Berlin zum „Technical Summit 2014“. Die ersten beiden Tage stehen im Zeichen der Konferenz mit ihren insgesamt rund 40 Sessions und Live-Demos, Tag 3 ist... [... mehr auf Giza-Blog.d]


This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2013 Kay Giza. All rights reserved. Legal

ppedv Team Blog: Angular Listen Filtern mit Hash

Beim stöbern in SPA Anwendungsfällen bin ich der Idee verfallen, Listen anhand der Url bzw den enthaltenen Hash Wertes zu filtern. Eine Url setzt sich laut RFC 3986 wie folgt zusammen.

foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose

Der letzte Teil, das Fragment, wird beim HTTP Request vom Browser nicht zum Server übermittelt. Dies macht sich unter anderem Angular.js zu Nutze, um ein Client seitiges Routing der Views durchzuführen. Das ganze recht ähnlich zu ASP.NET MVC, nur eben nach dem # Zeichen, hier als Hash Key bezeichnet. So ist es möglich, die Ergebnismenge direkt per Link anzuspringen.

Im folgenden Beispiel, soll mit einer Art Navigationsleiste eine Filterung einer Liste durchgeführt werden. Um den Browser nicht zu überfordern, sollen jeweils AJAX Call Backs zum ASP.NET Web Api basierten Service durchgeführt werden, in dem der Hashkey als Parameter angegeben wird.

Der Service liefert Chatnachrichten anhand eines benannten Chatrooms. Das VB.NET Web Api Sample, decodiert die URL um z.B. Sonderzeichen korrekt zu behandeln.

   1:   Function Getchatmessage(room As String) As IQueryable(Of chatmessage)
   2:       Dim r = HttpUtility.UrlDecode(room)
   3:       Return db.chatmessage.Where(Function(c) c.room.roomname = r)
   4:   End Function

 

Folgendes wahnsinnig aufregendes UI, bietet dem Benutzer drei Optionen.

image

Die Links werden in der Form ASPX Seite in der FriendlyUrl Notation ohne Erweiterung, gefolgt vom # und Wert erzeugt.

image

Erste Lektion: Angular fügt nach dem Hash Zeichen einen Slash (Schrägstrich) in die URL im Browser ein, obwohl im HTML Source ohne.

image

Ich habe recherchiert dazu und herausgefunden, das es einen Hashbang Mode oder HMTL5 Mode gibt, Der genaue Grund ist noch ungeklärt. Später wird ein JavaScript Replace das wieder gerade biegen.

Um die HTML Inhalte zu erstellen, wurde eine Server rendering Methode gewählt. Hier sogar mit Webforms. Dies ist einfacher und erlaubt auch besseres Caching, also schnellere Ausführung.

Bereits vorbereitend wird eine Angular App samt dazu gehörigen Controller definiert. Die Anzeige des Hash per Databinding {{}} dient nur Kontrollzwecken. Das Listview Web Server Steuerelement lässt sich  per Model Binding an die Room Liste binden. Der VB.NET Codebehind Source Code findet sich im nächsten Listing.

Der Name des Rooms wird Url passenden Encodiert. Wenn der Benutzer diesen Link clickt, passiert faktisch nichts, außer das die URL im Browser um den Hash Wert ergänzt wird.

   1:  <body ng-app="App">
   2:      <form id="form1" runat="server">
   3:          <div ng-controller="chatController">
   4:              <div>Hash:{{target}}</div>
   5:              <div>
   6:                  <asp:ListView ID="roomlist" runat="server" 
ItemType="Concorde.room"
   7:                      SelectMethod="roomlist_GetData">
   8:                      <ItemTemplate>
   9:                          <a href='/chat#<%#HttpUtility.UrlEncode(Item.roomname)%>'>
  10:                              <%#Item.roomname%>
  11:                          </a>| 
  12:                  
  13:                      </ItemTemplate>
  14:                  </asp:ListView>

Inhalt der dazu gehörigen aspx.vb Datei. Es kommt ein Entity Framework Code First Model zum Einsatz,

   1:   Public Function roomlist_GetData() As IQueryable(Of room)
   2:          Dim db As New ConcordeContext
   3:          Return db.room
   4:   End Function

 

Kommt nun der spannende Teil, der Angular.js Controller. Dieser wird einen Callback per $http ausführen und dabei den Hash Wert aus der URL als Parameter übergeben. Dabei hilft $location, das per Path (eigentlich sollte es hash() sein) den passenden Wert aus der URL liefert. Nach Aufruf des REST Services stehen die JSON Daten in der Variable data (Zeile 20) und werden direkt der Chatmessages Eigenschaft im $Scope zugewiesen.

Das Besondere an diesem Angular Beispiel ist, das ein Watcher (Zeile 5) auf dem Viewmodell gesetzt wird, der die Änderung der URL als Event Geber nutzt und den Service Call initiiert. Ohne diesen, wird der Controller nur einmalig durchlaufen.

   1:  angular.module('App', [])
   2:    .controller('chatController',
function ($scope, $http,$location,$window) {
   3:      $scope.chatMessages = [];
   4:      $scope.location = $location;
   5:      $scope.$watch('location.absUrl()', function () {
   6:          $scope.target = $location.path(); 
   7:          $scope.ladeMessages();
   8:      }, true);
   9:      $scope.ladeMessages = function () {
  10:          if ($scope.target != null) { 
var para = $scope.target.replace('/', ''); };
  11:       
  12:          $http(
  13:       {
  14:           method: 'GET',
  15:           url: 'api/chatmessages',
  16:           params: {
  17:               room: para
  18:           }
  19:       })
  20:      .success(function (data, status) {
  21:          $scope.chatMessages =  data;
  22:      })
  23:      };
  24:   
  25:  });
  26:   

Fehlt noch der deklarative HTML5 Teil, der entweder eine Meldung für leere Daten oder die Liste anzeigt. Dies ist fast der einfachste Teil. Der Scope enthält die Liste der ChatMessages, die mit der ng-repeat Direktive durchlaufen wird. Ganz wie ein ASP.NET Repeater Control, nur eben Client Seitig.

   1:   <div ng-show="chatMessages.length==0">
   2:                keine Daten...
   3:   </div>
   4:    <div ng-repeat="msg in chatMessages">
   5:                      {{msg.Message}}
   6:   </div>

Holger Schwichtenberg: Satya Nadella kommt zu Microsofts Technology Summit 2014 nach Berlin

Die Anmeldung zu der vom 11. bis 13. November 2014 gehenden Konferenz ist jetzt eröffnet.

Holger Sirtl: Satya Nadella kommt zum Microsoft Technical Summit 2014

Wer heute die Webseite zum Microsoft Technical Summit gesehen hat, hat’s sicher gesehen: Satya Nadella, Microsoft CEO wird da sein und eine Keynote halten!!!

image

Jetzt gibt’s also keine Ausrede mehr… schnell anmelden!

Hier nochmal die wichtigsten Eckdaten

Microsoft Technical Summit

Termin:
11./12. November 2014 (Konferenz)
13. November 2014 (Workshops)

Ort:
Best Western Premier Hotel MOA Berlin
Stephanstrasse 41
10559 Berlin Moabit

Web:
www.technical-summit.de

Ich hoffe, wir sehen uns da!!!

codefest.at [MS]: Visual Studio Online – die Cloud auch für Entwickler

Einleitung

Möglicherweise habt ihr schon den Microsoft Team Foundation Server (TFS) in einem eurer Projekte eingesetzt. Vielleicht nur als reines Source Code Verwaltungstool, oder ihr habt auch mehr davon verwendet, z. B. die Prozessvorlagen für die agile Softwareentwicklung, oder Scrum. Vermutlich habt ihr damit auch Work Items zugewiesen, Bug Tracking verwendet und Builds automatisiert.

Diesen TFS habt ihr vermutlich in einem Windows Server in eurem (Firmen-)Netzwerk installiert. Das Entwicklungsteam verwendet Visual Studio, um sich an den TFS anzuhängen. Das bedeutet, dass die Hardware angeschafft, das Server OS lizenziert und installiert werden musste (bzw. eine VM zur Verfügung gestellt wurde) und jemand eine bestimmte Version des TFS installiert hat. Kurz gesagt, es fallen Kosten an: für die Hardware, die Software und die Wartung des (eigenen) Systems (z. B. Updates des Server OS bzw. des TFS müssen selbst eingespielt werden).

Falls ihr den TFS überhaupt noch nicht in Verwendung hattet, so ist möglicherweise ein anderes Source Code Verwaltungstool, wie z. B. Git, Tortoise, oder Jira im Einsatz. Alle aufgezählten Varianten haben Vorteile, aber auch verschiedene Nachteile.

In einem meiner Entwicklungsteams haben wir eine Menge Source Code und Zeit verloren, da das Infrastruktur-Team geschlampt hat. Wie? Nun ja, trotz mehrmaliger Rückfragen meinerseits, ob es ein funktionierendes Backup unseres Servers gibt, war im Ernstfall leider keines vorhanden. Obwohl diese Anfrage zuvor mehrmals positiv beantwortet worden war…..

Nun…ja….seither verlasse ich mich äußerst ungerne auf Infrastruktur-Teams und sehe mich gerne nach alternativen Lösungen zu dem In-House Hosting unseres Source-Codes um.

Als erste Variante gibt es natürlich den gehosteten TFS. Mehr Informationen findet Ihr z. B. hier:

http://www.discountasp.net/tfs/

Ihr entscheidet euch für eine Version des TFS (2010, 2012, oder 2013) und für die Basic (Source Control und Work Item Tracking), oder die Full Variante (Basic features und mit Sharepoint und Reporting).

Diese Variante hat bestimmt ihren Reiz, ich möchte euch aber eine weitere Möglichkeit erläutern: Visual Studio Online (VS Online).

VS Online – Allgemein

Wieder ein neues Produkt werdet Ihr euch jetzt möglicherweise denken, das ist aber so nicht ganz korrekt. Mit beiden Produkten könnt ihr:

· Euren Source Code in verschiedenen Versionen verwalten
· Work Items verwalten
· Bugs tracken
· Backlogs verwalten

Also im Großen und Ganzen all das, was ein gutes Application Lifecycle Management (ALM) Produkt können sollte.

Wie man anhand dieser Auflistung sehen kann, sind die Core-Funktionalitäten von TFS und VS Online gleich. Eigentlich ist es das selbe Produkt, allerdings mit unterschiedlichen Versionssprüngen und der zugehörigen Updates (VS Online hieß früher auch Team Foundation Service). TFS wird in eigenständigen Versionen ausgeliefert, aktuell 2013, davor 2012 und 2010. Dies kennt ihr z. B. von Visual Studio selbst, oder auch vom SQLServer, oder Office her. Immer, wenn ein neues Release am Markt ist, entscheidet ihr euch diese zu installieren und eure bestehende Software upzugraden (oder eben auch nicht).

VS Online kennt diesen Produktzyklus in dieser Form nicht. Es gibt keine Version 2013, 2012, oder 2010, stattdessen wird VS Online automatisch auf den neuesten Stand gebracht. Schön und gut, aber wer macht dann die Updates? VS Online steht „in der Cloud“ zur Verfügung. Microsoft’s Cloud Lösung heißt Azure und bietet mittlerweile eine Menge an Diensten, einer davon ist eben VS Online.

VS Online – Features

Es gibt zwei verschiedene Varianten von VS Online: Basic und Professional. Gemeinsam ist den beiden, dass keine eigene Infrastruktur, wie z. B. ein eigener Server zur Verfügung gestellt werden muss. Der Source Code liegt in der Cloud und ist von überall – von berechtigten Personen – abrufbar (ohne lästiger VPN Clients auf den Entwickler-Notebooks). Sehen wir uns einmal die beiden Versionen an.

Ich möchte euch zuerst die Features vorstellen, die mich überzeugt haben, mit meinem Entwicklungsteam auf VS Online umzusteigen.

Jeder VS Online Zugang verfügt über

. fünf kostenlose Benutzer (weitere Benutzer sind dann allerdings kostenpflichtig),
· eine unbegrenzte Anzahl von Projekten (im Team, oder „privat“ – also für einen Entwickler),
· gehostete Code-Repositories mit der Team Foundation-Versionskontrolle oder Git in unbegrenzter Größe.

Somit ist sichergestellt, dass auf den Source Code von allen Entwicklern immer und überall zugegriffen werden kann und so jederzeit Source Code eingecheckt werden kann. Sowohl mit einer unbegrenzten Anzahl von Projekten als auch einer unbegrenzten Größe dieser Projekte!

Weitere Vorteile der gebotenen Features für die gemeinsame Entwicklung innerhalb des Teams:

· Über sogenannte Teamräume wird jeder Entwickler über den aktuellen Projektstand informiert.
· Aufgliedern und Planen komplexer Projekte erfolgt mittels der agilen Portfolioverwaltung:

o Erfassen von Product-Backlogs.
o Definition und Verfolgung von Sprints.
o Zuweisen und Tracken von Work-Items.
o Einholen und Nachverfolgen von Feedback für Projektbeteiligte (mit dem Microsoft Feedback Client).

· Erstellen von Testplänen und Test Cases.
· Integriertes Bug-Tracking.
· Verwenden der Auslastungstests (bis zu 15.000 virtuelle Benutzerminuten pro Monat).

Des Weiteren inkludiert VS Online eine Version von Visual Studio Express für das Web, Windows oder Windows Desktop, aber als eingefleischte Entwickler habt ihr vermutlich schon eine der höherwertigeren Desktop Varianten der Visual Studio Editionen installiert. VS Online funktioniert allerdings auch mit Eclipse oder XCode, ist also nicht an Visual Studio gebunden.

All diese aufgezählten Punkte sind bereits in der VS Online – Basic Version enthalten und stehen zur freien Nutzung bereit. Solltet ihr euch mehr Features punkto Projektplanung wünschen, dann solltet ihr einen Blick auf die VS Online Advanced Variante legen, diese kostet allerdings $60,-- pro Benutzer im Monat. Eine VS Online Professional Variante ist ebenfalls erhältlich, diese umfasst ein monatliches Abonnement für die Visual Studio Professional IDE und schlägt mit $ 45,-- zu Buche.

Aber zu Beginn sollte die VS Online Basic Variante durchaus ausreichen, möglicherweise benötigt Ihr mehr Benutzer, dann kostet jeder weitere Benutzer (über die inkludierten 5 hinaus) $ 20,-- im Monat.

Kommen wir aber nun zur Anwendung von VS Online und legen ein Beispielprojekt an und checken auch gleich einmal (vorhandenen) Source Code ein.

Dazu sind folgende Schritte notwendig:

· Anlegen des VS Online Kontos.
· Anlegen eines neuen Projektes.
· Einchecken des lokalen Source Codes.

Drei kleine Schritte, mal sehen, ob es wirklich so einfach ist. In circa 10 Minuten könnt ihr selbst darüber urteilen……legen wir also los, die Zeit läuft!

VS Online – Anwendung

Das VO Online - Konto

Zur Verwendung von VS Online wird ein VS Online-Konto benötigt. Das klappt schnell und problemlos mit dem Browser und folgendem Link: http://go.microsoft.com/fwlink/?LinkId=307137&clcid=0x407

image_thumb1

Nach erfolgreicher Anmeldung ist euer Konto jederzeit unter folgender Adresse im Browser erreichbar: .visualstudio.com">.visualstudio.com">.visualstudio.com">http://<kontoname>.visualstudio.com

Eine zweite Variante steht euch auch noch über das Azure Managementportal zur Verfügung: http://manage.windowsazure.com bzw. https://portal.azure.com/

image_thumb30

Wie auch immer ihr euren VS Online Zugang anlegt, auf jeden Fall seid ihr nun glücklicher Besitzer eines VS Online Zugangs.

Nach erfolgreicher Anmeldung werdet ihr aufgefordert, ein neues Projekt anzulegen. Sehr gut, denn das ist es ja auch, was wir im nächsten Schritt machen wollen. Das ist allerdings nur beim ersten Mal so, nächstes Mal befindet ihr euch im VS Online DashBoard, wo ihr die Zusammenfassung eures Accounts einsehen könnt.

image_thumb32

Anlegen eines neuen Projektes

Ich habe in letzter Zeit an einigen mobilen Projekten mit Xamarin in Visual Studio gearbeitet und eines dieser Projekte würde ich gerne zu VS Online deployen, um damit die die Source Code Verwaltung durchzuführen. Das bedeutet also, dass ich lokal bereits ein Projekt habe, in VS Online existiert dieses aber noch nicht – es muss also angelegt werden, danach dieses VS Online Projekt mit meinem lokalen Verzeichnis verbunden werden, dann kann der Source Code eingecheckt werden. Das klappt natürlich auch umgekehrt, also zuerst das VS Online Projekt erstellen, danach erst in das Codieren einsteigen. Wie auch immer, das VS Online Projekt muss angelegt werden.

Falls ihr gerade euer VS Online Konto erstellt habt, dann seid ihr schon auf der richtigen Eingabemaske. So legt nun ein neues Projekt an, der „New“-Button lädt gerade dazu ein, gedrückt zu werden.

Auf jeden Fall müssen nun ein paar Angaben zu dem Projekt gemacht werden:

  1. Der Name des Projektes ist einzutragen,
  2. optional kann dazu eine Beschreibung erfasst werden.
  3. Als Scrum Master kommt mir das „Microsoft Visual Studio Scrum 2013.3“ Template gerade recht (andere Optionen sind: MSF for Agile Software Development 2013.3 und MSF for CMMI Process Improvement 2013.3).
  4. Als Versions-Kontrolle setze ich auf die „Team Foundation Version Control“, da ich damit jahrelange (gute)Erfahrungen habe, die andere Option wäre Git - SVN wird leider nicht unterstützt.

Wie bereits erwähnt, habe ich das Projekt auf meinem lokalen Rechner, ich habe es also einfach mit den einzugebenden Werten (jaja, wie lange grübelt man normalerweise am Projektnamen…) wie man nachfolgend sehen kann:

image_thumb17

Mit dem „Create Project“ Button ist dieser Schritt auch schon so gut wie abgeschlossen. Den Rest der Arbeit erledigt VS Online, welches das Projekt und den zugehörigen Team Room anlegt und zur Verfügung stellt, wo ihr euch später mit den anderen Teammitgliedern über das Projekt austauschen könnt..

Mit „Navigate to project“ gelangen wir zur Detailansicht, bzw. öffnet sich diese von selbst, wenn ihr das erste Mal ein Projekt angelegt habt.

image_thumb18

Hier ist natürlich noch nicht allzu viel zu sehen, als sehr hilfreich wird sich gleich die rechte obere Ecke erweisen, wenn wir zum nächsten Schritt gelangen.

Mappen und Einchecken des lokalen Source Codes

Bevor Ihr den VS Online Account mit eurem lokalen Projekt verbinden könnt, überlegt bitte noch einmal kurz, ob eure lokale Visual Studio 2013 Installation mit eurem Microsoft Account verbunden ist – gegebenenfalls kontrolliert das bitte, bzw. führt die Anmeldung – rechts oben - im Visual Studio 2013 durch.

image_thumb22

Wenn ihr schon dabei seid, könnt Ihr noch in Visual Studio 2013 kontrollieren, ob Ihr Team Foundation Server als momentanes Source Control plug-in verwendet. Dazu einfach das Menü Tools -> Options und Source Control aufrufen und gegebenenfalls die ComboBox anpassen.

image_thumb25

Nun ist es an der Zeit den VS Online Account mit einem (lokalen) Projekt zu verbinden. Dazu verwendet man am einfachsten den ‚Open in Visual Studio‘ Button im rechten oberen Bereich.

image_thumb11image_thumb14

Sobald dieser gedrückt wird und ihr die Abfrage bestätigt, dass eine lokale Applikation geöffnet werden soll (ich empfehle euch die kleine CheckBox anzuklicken, damit diese Meldung in Zukunft nicht mehr gezeigt wird), öffnet sich auf dem lokalen Rechner Visual Studio 2013. Angezeigt wird der Team Explorer, der darauf wartet, dass das VS Online Projekt mit einem lokalen Projekt gemapped wird.

Dazu führt ihr folgende Schritte durch (in den Bildern unten der Reihe nach dargestellt):

  • Drücken des Links bei der Meldung “configure your workspace”
  • Jetzt muss das VS Online Projekt ($/Azure Informer) auf das lokale Verzeichnis gemappt werden, bei mir liegt der Source Code unter „C:\Development\Mobile\AzureInformer“.
  • Nachdem der “Map & Get” Button gedrückt wurde, ist VS Online mit dem lokalen Projekt verbunden.

image_thumb10image_thumb23image_thumb24

Nachdem diese Schritte erledigt wurden, kann das Projekt unter Source Code-Verwaltung gestellt werden. Spätestens jetzt solltet ihr euer Projekt in Visual Studio 2013 öffnen. Einchecken ist nun keine große Sache mehr, das gelingt mit der rechten Maustaste an eurer Solution im Solution Explorer und der Auswahl von „Add Solution to Source Control…“. Das gleiche Spielchen noch einmal, allerdings wird nun „Check In…“ angewählt.

image_thumb26 image_thumb28

Die Ansicht wechselt wieder auf den „Team Explorer“, jetzt noch schnell ein Kommentar für das Einchecken des Source Codes eingeben, den Check-In Button drücken und der Source Code ist in guten Händen, immer und überall für mein Team und mich erreichbar.

image_thumb19 image_thumb20

Geschafft, der Source Code ist bei VS Online hinterlegt. Die nächsten Schritte wären nun, weitere Team Mitglieder einzutragen, danach Work Items zu erfassen und an das Team zu verteilen. Die faszinierende Reise mit VS Online kann für mein Team und mich beginnen!

Zusammenfassung

Ich durfte in meinem Arbeitsleben bisher 3 Entwicklungsteams leiten und ich hätte mir jedes Mal die unproblematische Möglichkeit der Kollaboration innerhalb des Teams, sowie die jederzeitige Verfügbarkeit des Source Codes von jedem Ort der Welt gewünscht. VS Online macht es möglich eine unlimitierte Anzahl von Projekten mit unlimitierter Größe zu verwalten. Für Entwicklerteams mit bis zu 5 Leuten ohne jeglicher Kosten. Microsoft ist hier wieder ein hervorragendes Stück Software gelungen, einfach verpackt, ready to use for everyone!


Berndt Hamböck ist seit 2007 MCT, darüber hinaus befasst er sich mit Lösungen für komplexe Anwendungsszenarien mit den neuesten Microsoft Technologien. Die Erfahrungen aus der Projektarbeit gibt er in Vorträgen und Trainings weiter und begleitet Entwicklerteams in Softwareunternehmen bei Projekten im Microsoft Umfeld.

„Das ist ein Gastbeitrag. Die Meinung des Autors muss sich nicht mit jener von Microsoft decken. Durch den Artikel ergeben sich keinerlei Handlungsempfehlungen. Microsoft übernimmt keine Gewähr für die Richtigkeit oder Vollständigkeit der Angaben.“

Sven Hubert: New feature for AIT Apply Company Policy: include and exlude projects

Coding guidelines are very useful and should be enforced wherever possible. The free tool AIT Apply Company Policy (ACP), which we already presented in another blog entry, can help here. But there might be some guidelines or rules that should be applied to only some projects or to all except some projects. This is now possible with the new version of AIT Apply Company Policy, which is available in the download section.

For example one could create an ACP package that will be applied to all projects, but for all test projects the documentation should not be created. Then the respective section in the CompanyPolicy.config could look like this:

<Documentation exclude="*.Test"> 
    <Configuration Name="Debug" enabled="true" /> 
    <Configuration Name="Release" enabled="true" />    
    <Configuration Name="Staging" enabled="true" /> 
</Documentation>

The exclude attribute determines that in all projects ending with “.Test” the documentation will not be created.

In another scenario one could create an ACP package which should be applied only to test projects, e.g. specific rules for the static code analysis, and one has to make sure that this package can really be applied only to test projects. This is possible using the following entry:

<StaticCodeAnalysis includeOnly="*.Test"> 
    <Configuration Name="Debug" enabled="true" ruleSet="AIT.ruleset" /> 
    <Configuration Name="Release" enabled="true" ruleSet="AIT.ruleset" />     
    <Configuration Name="Staging" enabled="true" ruleSet="AIT.ruleset"/> 
</StaticCodeAnalysis>

Here the includeOnly attribute defines that the rules for the static code analysis is applied only to projects ending with “.Test”.

Furthermore it is possible to combine both of these attributes. This way, one can apply rules e.g. only to projects whose name contains “Infrastructure” but does not end with “.Test”.

New feature for AIT Apply Company Policy: include and exlude projects is a post from: AIT Blog

ppedv Team Blog: Windows Tipp - Wochentag in der Startleiste anzeigen

Selten mag man sich die Frage stellen, kann Windows auch den Wochentag in der Startleiste darstellen? Wenn jemand dies jedoch als Einstellung vorgenommen hat, finden es die meisten Benutzer gut und wollen wissen wie es geht, da es schon sehr praktisch ist.

So wird's gemacht

Die Einstellung vornehmen

Drücken Sie die Windows-Taste + R und geben "intl.cpl" ein, gefolgt von OK, danach wählen Sie Weitere Einstellungen… und den Reiter Datum.

clip_image001

Anpassung der Datumsdarstellung

Sie möchten, dass der Wochentag ausgeschrieben sein soll, dann geben Sie in das Feld Datum (kurz) statt "TT.MM.JJJ" "TTTT, TT.MM.JJJJ" ein.

clip_image002

Unterhalb der Felder stehen Erläuterungen zur Bedeutung der Buchstaben und deren Auswirkungen auf die Anzeige.

clip_image003

Bestätigen Sie die Einstellungen mit OK und der Wochentag erscheint wie gewünscht unten in der Startleiste.

clip_image005

Fertig

Jürgen Gutsch: Agile Bodensee Konferenz am 01. und 02 Oktober 2014

Auch auf der diesjährigen Agile Bodensee Konferenz bin ich wieder dabei. Dieses mal – am 1. Oktober – mit einem Workshop mit dem Titel “TDD Extreme

Was sich dahinter verbirgt? Vor allem provokante Aussagen meinerseits und um das Thema TDD die ich versuche anhand von Beispielen und Übungen zu Beweisen ;)

Interessiert? Dann schreibt doch einfach eine Twitter-PM an @sharpcms oder eine Nachricht per Facebook an juergen.gutsch mit dem Stichwort “TDD@abkon”. Ihr erhaltet dann einen Rabattcode mit dem ihr 10% Rabatt auf ALLE Ticket-Kategorien bekommt und könnt so etwas günstiger an dem Workshop teilnehmen :)

Weitere Informationen zur Agile Bodensee Konferenz 2014 und vor allem die komplette Agenda über die zwei Tage erhaltet ihr direkt auf der Website: www.agile-bodensee.com

ppedv Team Blog: Windows 8.1 ohne Microsoft-Konto installieren

Wer ein lokales Benutzerkonto verwendet (damit keine Daten bei Microsoft gespeichert werden), wird beim Update auf Windows 8.1 während der Installation ein Microsoft-Konto anlegen müssen, damit es klappt. Es gibt dennoch eine Möglichkeit, die Registrierung zu umgehen, Sie müssen kein neues Konto, wie suggeriert, anlegen.

Wie Sie dabei vorgehen lesen Sie hier.

Update Starten:

Das Update auf Windows 8.1 ist im Windows-Store zu finden. Mit der „Windows-Taste“ gelangen Sie auf die Kacheloberfläche, klicken Sie hier auf Store, es erscheint die Kachel Kostenloses Update auf Windows 8.1.

image

Unter Umständen erscheint noch die Meldung, dass Sie Updates installieren müssen, was Sie entsprechend tun.

Die verborgene Einstellung auswählen:

Jetzt wird das Update heruntergeladen, der Computer startet neu, danach bestätigen Sie wie üblich die Lizenzbedingungen und klicken dann auf Express-Einstellungen verwenden.

Wenn „Melden Sie sich bei Ihrem Microsoft-Konto an“ erscheint, klicken Sie unterhalb auf die nahe unsichtbare Zeile Neues Konto erstellen und auf Mit einem vorhandenen Konto fortfahren.

image

Sie lassen alles Weitere durchlaufen und installieren.

Das ist alles, so klappt es!

Golo Roden: Konsole & …: Rekursion

Die Fähigkeit einer Funktion in JavaScript, sich rekursiv aufrufen zu können, scheint nichts Besonderes zu sein. Dennoch gibt es dabei ein paar Aspekte zu beachten, insbesondere im Hinblick auf die kommende Version der Sprache: ECMAScript 6.

Karsten Kempe: TFS loves Git: Pull Requests

Der Pull Request ist ein Mechanismus, mit den Entwickler andere Teammitglieder über die Fertigstellung eines Features informieren, zu einem Review auffordern oder zur Zustimmung für die Aufnahme in einen integrierten Source Code Stand bitten können. Dieser Workflow kommt in Open Source Plattformen wie GitHub oder Bitbucket stark zum Einsatz und war bislang ein vermisstes Feature im TFS und Visual Studio Online. Seit ein paar Wochen gibt es diesen Mechanismus jetzt auch für Git Projekte in Visual Studio Online und bald auch im TFS on-prem.

Ein Entwickler entwickelt ein Feature in einem dedizierten Branch auf einem lokalen Repository. Sobald er seinem Team eine Version zur Verfügung stellen will, pusht der Entwickler den Branch in ein öffentliches Repository in Visual Studio Online. Dort kann er dann einen Pull-Request absetzen und das Team zum Review auffordern. Das Team wird daraufhin den Code untersuchen, darüber diskutieren und kommentieren. Am Ende wird der bereitgestellte Code von einem Verantwortlichen aus dem öffentlichen Feature Repository in das Master Repository überführt. Wenn die Entwicklung des Features komplett abgeschlossen ist, wird das öffentliche Repository gelöscht.

TFS Git Pull Requests

Abbildung 1: Pull Request Workflow

In folgendem Video könnt Ihr Euch ansehen, wie dieser Vorgang in Visual Studio Online funktioniert.

Fazit:

Pull-Requests erleichtern die Zusammenarbeit in weit verteilten Teams, in denen oftmals nur isoliertes Arbeiten möglich und meistens auch gewünscht ist. Damit der integrierte Master-Stand nicht zerstört wird, setzen viele Open Source Communities auf diesen Mechanismus. Dadurch wird die Code-Qualität des Master Repositories stabilisiert und die Qualität des ganzen Teams verbessert.

Jürgen Gutsch: Geplanter Umzug meines Blogs

Im Zuge des Umbaus meiner eigenen Website, habe ich mich dazu entschlossen, auch meinen Blog umzuziehen. Nicht weil das System auf dem Community Server von ASP.NET Zone schlecht wäre, sondern eher deshalb, weil ich mein Blog enger in meine Website integrieren möchte. In den vergangenen Monaten wurde die Website wieder immer mehr eine persönliche Portfolio Seite und das Blog soll der hauptsächliche Content-Lieferant der Website werden.

Auch vorher hatte ich bereits die Idee, dass ich mein Blog mehr in meine Kontrolle holen möchte. Allerdings läuft das bisherige System gut und stabil und es gab keinen zwingenden Grund für einen Umzug. Dennoch hatte ich mir einige vorhandene Systeme angeschaut, die mir aber alle zu umfangreich sind, um sie in meine Website zu integrieren. In vielen Fällen fehlte mir jedoch die MetaWeblog API um das Blog per Windows Live Writer zu bedienen, den ich immer noch sehr gerne verwende. (Tipps und Hinweise zu modernen Blog APIs und modernen Authoring-Tools nehme ich hier sehr gerne entgegen.) Sehr gerne schreibe ich morgens oder Abends offline im Zug um die Posts dann später zu veröffentlichen.

Bis ich nun ein wirklich passendes System finde, tendiere ich dazu ein kleines Blog-Framework zu schreiben, dass ich beliebig in jedes ASP.NET Projekt integrieren kann. Für den Anfang soll der SimpleObjectStore die Persistierung übernehmen. Da für dieses Tool beliebige DataProvider bereitgestellt werden können, kann das Framework dann auch bei Bedarf auf eine SQL Database gehen. Ich für meinen Teil werde den DataProvider für den Azure Table Storage verwenden, da die Website selber auf einer Azure Website gehosted wird.

Ziel ist es eine Bibliothek bereitzustellen, welche die nötigen Controller und Models bereitstellt. Die zugehörigen Views muss dann jeder Nutzer dieser Bibliothek selber bereitstellen:

Controller:

  • BlogController
    • Für Artikel-Listen und Kommentare
  • MetaWeblog Controller
    • Für den Windows Live Writer
    • ggf. per API Controller
  • BlogML Controller
    • Import/Export
  • RSS Controller
    • per API Controller

Models:

  • BlogArticleList
  • BlogArticle
  • Comment
  • Tag

Das wird wohl in den nächsten Monaten meine Beschäftigung neben der Arbeit und Familie sein. Mal sehen wie weit ich damit gehe.

Warum selber machen?

Na, um zu lernen. :) In den letzten Monaten sind interessante Neuerungen zu ASP.NET herausgekommen, die ich natürlich gerne genauer anschauen und umsetzen möchte.

Auch hier gilt: Für Vorschläge zu einer alternativen leichtgewichtigen Lösung bin ich immer zu haben.

codefest.at [MS]: V-Play -- Cross-Plattform 2D Spiele-Engine

Spiele-Entwickler kennen Sie wahrscheinlich schon: die österreichische Game Engine V-Playermöglicht die Erstellung von 2D Spielen, die man dann für verschiedene Plattformen deployen kann. Der Gründer von V-Play, Christian Feldbacher, hat schon beim letzten Mobile Developer After-Workdie Engine vorgestellt und demonstriert, wie man damit entwickeln kann.

Die gute Nachricht ist, dass es seit letzter Woche nun auch Support für die Windows Runtimegibt. Das heißt, Spiele, die ihr mit der Engine erstellt, könnt ihr nun auch als Windows Phone und Windows Store Apps deployen. Eine detaillierte Anleitung, wie ihr das machen könnt, findet ihr auf dem V-Play Blog.

Die V-Play Engine gibt es als 14-tätige Trial-Version gratis als Download. Probiert es mal mit einem ersten Spiel aus. Wenn ihr auf dem Geschmack gekommen seid, so könnt ihr in den nächsten Wochen noch interessante Infos zum Thema Gaming auf diesem Blog erwarten.

Ralf Westphal: Warnung vor dem Microservice – Versuch einer Definition

Services sind wieder im Trend. Jetzt unter der Bezeichnung Microservice oder kurz: µService. Das empfinde ich grundsätzlich als Fortschritt. Schon vor einer “Moore-Periode” :-) (also 18 Monaten) habe ich das als konsequente Entwicklung beschrieben unter dem Titel “Software als Web of Services”. Und noch weiter zurück, im Jahr 2005, hatte ich mir in einer Artikelserie unter der Überschrift “

Dirk Primbs [MS]: The zombie apocalypse

“Daddy, why do you always say that the Zombie apocalypse will come and why don’t we prepare for it?”
This question coming from our youngest recently reminded us to flag our pop culture humour more clearly, especially when joking about the potential end of the world.

Zombies are quite in fashion these days. I’m myself a huge fan of “The Walking Dead”, the series _and_ the original comic preceding it. I also watched World War Z, read through the Zombie Survival Guide and I really love the idea to be stranded with my family on a deserted island with tropical fruits growing all around me and a fully equipped yet autarc mansion in the middle of it when it happens.

This (and the tendency to creepy humour which my wife and I share) leads us to referencing zombies every now and then and making fun of the sort “don’t throw away this broken [whatever], what if the zombie apocalypse strikes and you’re in need of a deadly weapon?” or like “in case of the Z.A. we’ll barricade in the children’s rooms. The zombies never make it through that mess without a guide”. Turns out our children wonder how much truth is in the fiction (or alternatively wonder if adults really can believe in such a crazy szenario).

The fact of the matter is that I loved the theme from very early on. A book that I read ages ago and of which I can’t recall the title phantasized that all adults are whiped off the earth by some strange virus and books of that kind were on my reading lists ever since…

Just to name a few:
The Stand
I am legend (must read!)
World War Z (as mentioned)

I guess what fascinated me most was the question how we could hope to strive if no foundation exists anymore. Heck, I’m not even knowledgable enough to repair my shoes, let alone pull something off as a full scale farm (without the help of experienced farmers that is). Truth is, I’m not skilled in anything really useful. I can program, I can create online videos and podcasts, I studied psychology and business administration to some degree and I know how to navigate inside large tech corporations… I’d look into a brisk post-apocalyptic future indeed.

And if you look closely then you’ll discover that in our extremely specialized world almost no one knows enough about the processes around us to restart something remotely resembling civilization, or, to stay at a smaller scale, at least a comfortable living for a few selected survivors.

Since it makes a fascinating thought experiment though – what is necessary to enable mankind to restart quickly – a scholar found the time to write a book on it. (Yep, I’m reading a lot :-))

The Knowledge starts with the assumption that earth has been ripped of 70+% of humans and the survivors need to restart. This means basic knowledge of machinery, medicine, agriculture, etc. is in short supply and the book takes a stab to provide a fascinating and educating overview. I’ll have to admit after reading through my last book – How to create a mind (Ray Kurzweil) – it is quite a shock to get thrown back from envisioning humankinds next evolutionary step to basic survival but, boy, it is fun!

To circle back to the intro: I’ll stash that book for the certain zombie apocalypse, right next to my fully charged laptop, just in case anyone needs either a programmer or someone who simply read a lot, after humankind has been whiped out :-)

Picture credit

The post The zombie apocalypse appeared first on Dirk Primbs Online.

Fabian Deitelhoff: dotnetpro: Screencasts der Rubrik “Frameworks” jetzt online verfügbar

Vor einiger Zeit war das Team der dotnetpro so freundlich, die Screencasts zur Rubrik “Frameworks” auch online zur Verfügung zu stellen. Dass freut mich sehr, ist es ab jetzt doch um einiges einfacher, sich die Videos anzuschauen.

Verlinkt sind die einzelnen Screencasts immer beim jeweiligen Artikel im Online-Portal. Beispielsweise hier für den Artikel “Geschwindigkeitsrausch”. Dafür ist allerdings ein Abo und ein Login auf der Webseite erforderlich. Abbildung 1 zeigt einen Screenshot des eingebetteten Videos.

Abb. 1: Eingebetteter Screencast auf der dotnetpro Webseite.

Abb. 1: Eingebetteter Screencast auf der dotnetpro Webseite.

Zusätzlich besteht die Möglichkeit, jeden Screencast als WMV- oder MP4-Datei herunterzuladen. Wer also bis jetzt keine Lust auf den Datenträger hatte, der jeder Ausgabe beiliegt, kann sich die Screencasts nun auch online ansehen.

Und wie immer gilt: ich freue mich über konstruktives Feedback jeder Art!

Sven Hubert: ALM kompakt: Prüfung eines Work Item Feldes auf ein bestimmtes Textmuster

Bei der Anpassung von Process Templates kann es vorkommen, dass die Möglichkeiten von AllowedValues oder SuggestedValues (siehe All FIELD XML elements reference in der MSDN) nicht ausreichend sind. Wenn man z.B. die freie Texteingabe ermöglichen möchte, diese jedoch einem bestimmten Muster folgen soll. Ein einfaches Beispiel dafür ist die Eingabe einer MAC-Adresse.

Das MATCH-Element

Man könnte also auf die Idee kommen, eine Feldvalidierung mittels regulärer Ausdrücke durchzuführen. Die Konfigurierbarkeit von TFS Process Templates sieht hierfür eine eingeschränkte Variante vor: Das MATCH Element. Dieses ermöglicht eine sehr einfache Musterdefinition. Es wird nach folgender Syntax verwendet:

<MATCH pattern="patternValue" for="userGroupName" not="userGroupName" />

Laut MSDN sind folgende Pattern Values möglich:

  • “A” represents an alphabetical character.
  • “N” represents a numeric character.
  • “X” represents any alphanumeric character.

(siehe Online-Dokumentation in der MSDN)

Das Beispiel der MAC-Adresse lässt sich in der Work Item Type Definition konfigurieren, wie in Abbildung 1 dargestellt.

Abbildung 1: MATCH Element für eine MAC-Adresse

Abbildung 1: MATCH Element für eine MAC-Adresse

Für den Anwender der Work Items äußert es sich so, dass eine Hinweismeldung angezeigt wird, wenn der eingegebene Wert nicht definierten Textmuster entspricht (siehe Abbildung 2).

Abbildung 2: Verstoß gegen das Textmuster

Abbildung 2: Verstoß gegen das Textmuster

Einschränkungen

Wie vorher beschrieben, bietet das MATCH-Element eine sehr einfache Möglichkeit der Musterdefinition. Von “echten” regulären Ausdrücken ist dies weit entfernt. Wenn man beispielsweise prüfen möchte, ob ein Testfeld ein bestimmtes Präfix hat, reicht diese Möglichkeit bereits nicht mehr aus. Eine weitere Einschränkung ist der Feldtyp, auf den das MATCH-Element anwendbar ist. Es ist ausschließlich für die Verwendung mit String-Feldern vorgesehen. Da sich insbesondere für Beschreibungen die HTML-Felder immer größerer Beliebtheit erfreuen, lassen sich diese Felder mit dem MATCH-Element ebenfalls nicht überprüfen.

Erweiterungen

Wer weitergehende Prüfungen der Feldinhalte benötigt, muss sich wohl mit der TFS API auseinandersetzen. Eine Möglichkeit in einer standardisierten Form Erweiterungen für den TFS bereitzustellen, die serverseitig geprüft werden, bietet TFS ASAP. Mit dieser Plattform lassen sich Regeln ereignisbasiert (z.B. mit dem Speichern eines Work Items) sowie zeitgesteuert (z.B. einmal stündlich) ausführen. Dabei bietet sie bereits bewährte Mechanismen zur Integration serverseitiger Erweiterungen in den TFS. Im Falle der erweiterten Prüfung auf Textmuster mit regulären Ausdrücken könnte man beispielsweise eine E-Mail an den Verursacher versenden lassen oder die Änderung sogar wieder rückgängig machen. Mehr Informationen zu TFS ASAP sowie den Bezug einer Testlizenz gibt es unter http://www.tfsasap.com

ALM kompakt: Prüfung eines Work Item Feldes auf ein bestimmtes Textmuster is a post from: AIT Blog

ppedv Team Blog: Mehr Infos während Laufzeit oder Debug einer Web-Anwendung

Wer mit Visual Studio eine ASP.NET Anwendung schreibt, nutzt in der Regel den Debugger. Man kann aber auch Informationen über den Fluss in der Console ausgeben, sowohl server- als auch clientseitig.

Die Idee kam mir, während ich mit VB.NET Timer Code geschrieben habe und das Ticking beobachten wollte, ohne Breakpoints zu setzen. ASP.NET Servercode einfach mit

   1:   Debug.WriteLine("tick...")

Und schon tickt's im Visual Studio Output Window.

image

Mit JavaScript und diversen Frameworks wird das Thema noch schwieriger, weil Breakpoints manchmal in unüberschaubaren Code-Konstrukten enden. Auch hier kann man Log Messages ausgeben lassen und diese in den Developertools von Chrome oder IE mit F12 betrachten. Wer noch ein Alert verwendet, sollte schnellstens umstellen.

   1:    <script>
   2:          var myVar = setInterval(function () { myTimer() }, 1000);
   3:   
   4:          function myTimer() {
   5:              console.warn("tick..");
   6:              console.log("tick...");
   7:              
   8:          }
   9:      </script>

 

Im Internet Explorer 11:

image

dasselbe in Chrome:

image

Es existiert auch noch eine Methode Console.error mit dann rot gefärbter Ausgabe.

ppedv Team Blog: Auswertung zum StoragePool-Benchmark

Dies ist ein Update zu meinem vorherigen Beitrag über die Storage-Pools im Windows Server 2012 R2

http://blog.ppedv.de/post/2014/08/13/windows-server-2012-r2-storage-pools-mit-ssd-tiering.aspx

Ich habe noch ein paar weitere Tests bezüglich der Storage-Pools gemacht und diese in einer Tabelle ausgewertet:

Benchmark-Ergebnisse

 

Zusammenfassend kann man hier nun also sehen:

  • In den lesenden Disziplinen ist ein “echtes” RAID0 mittels RAID-Controller und den beiden SSDs am schnellsten
  • In den schreibenden Disziplinen ist der Storage-Pool mit einem Simple-Laufwerk am LSI-Controller am besten – dabei auch deutlich schneller als das controllereigene RAID0 von LSI und HP mit den SSDs
  • Der direkte Vergleich zwischen den Storage-Pools am HP-Controller und am LSI-Controller geht erstaunlicherweise zu Gunsten des LSI-Controllers aus und dies auch durchweg, obwohl der LSI-Controller (im Gegensatz zum HP-Controller) über keinen eigenen Cache verfügt (mit aktiviertem BBWC würde der HP-Controller wohl beim Schreiben noch deutlich besser werden)
  • Geht es um Datenredundanz (hier also RAID1 o.ä.), dann ist der Storage-Pool im Mirror-Modus mit der Kombination HDD plus SSD am besten!
  • Ein Storage-Pool mit 2 HDDs im Mirror-Mode ist fast genau so gut (oder genau so schlecht) wie die RAID1-Implementierung des HP- oder des LSI-Controllers

ppedv Team Blog: Microsoft Azure: Wartungsarbeiten in der Region Westeuropa

An diesem Wochenende führt Microsoft Wartungsarbeiten an der Netzwerkhardware in den Rechenzentren der Region Westeuropa durch. Dabei wird es zu Reboots der virtuellen Maschinen kommen, die zwischen 30 und 45 Minuten dauern können. Betroffen davon sind Instanzen von virtuellen Maschinen und Clouddiensten. Die Wartungsarbeiten finden am Freitag ab 20 Uhr und am Samstag ab 20 Uhr statt. An einem Tag sind die virtuellen Maschinen betroffen, während am nächsten Tag die Clouddienste betroffen sind.

Wie Microsoft am Freitag Abend bekannt gab, werden die Wartungsarbeiten für die Region Nordeuropa am kommenden Wochenende (22./23.08) zu den selben Zeiten durchgeführt.

Martin Hey: Attribute in Metadaten prüfen

Heute wurde mir eine gute Frage zu einem Problem gestellt, das ich bisher als trivial abgetan habe: Wie ermittle ich in ASP.NET für eine Eigenschaft des Models, ob dort ein bestimmtes Attribut gesetzt ist? Solche Attribute (insbesondere die vom Typ ValidationAttribute) werden ja verwendet, um Eingabevalidierung vorzunehmen.


Einstiegspunkt soll eine ExtensionMethod auf HtmlHelper sein, wie man sie in ASP.NET häufig findet und die einfach nur einen Text in der Html-Seite ausgeben soll.
public static MvcHtmlString RequiredMark<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression)
{
    var required = expression.IsRequired();
    return new MvcHtmlString((!required ? "kein " : string.Empty) + "Pflichtfeld");
}
Spannender Teil daran ist jetzt die schon verwendete ExtensionMethod IsRequired, die für die eigentliche Magie zuständig ist. Diese ist auch noch recht trivial: Sie prüft die Eingabe und ruft die noch zu erstellende Methode HasAttribute auf, die dann die eigentliche Prüfung auf das gesuchte Attribute durchführt:
private static bool IsRequired<T, V>(this Expression<Func<T, V>> expression)
{
    var memberExpression = expression.Body as MemberExpression;
    if (memberExpression == null)
        throw new InvalidOperationException("Expression must be a member expression");

    return HasAttribute(memberExpression.Member, typeof(RequiredAttribute));
}
Auch diese Methode ist recht einfach implementiert - schließlich gibt es in der Klasse Attribute eine statische Methode IsDefined, die dafür verwendet werden kann:
private static bool HasAttribute([NotNull] MemberInfo memberInfo, [NotNull] Type attributeType)
{
    if (memberInfo == null)
    {
        throw new ArgumentNullException();
    }

    var isDefinedOnMember = Attribute.IsDefined(memberInfo, attributeType);

    return isDefinedOnMember;
}
Funktioniert super ..... Funktioniert super und deswegen hören hier die meisten Lösungsvorschläge in einschlägigen Foren auch schon auf.... Funktioniert super, so lange man das Attribut direkt auf dem Model definiert. Allerdings gibt es auch die Möglichkeit, Metadatentypen zu definieren, die dann die Attribute beinhalten. Das ist immer dann sinnvoll, wenn das eigentliche Modell automatisch generiert wird - aus einem Designer oder aus einem T4-Template.

Schauen wir uns ein Beispiel an:
public class MyViewModel
{
    [Required]
    public string Name { get; set; }
}
Dafür funktioniert die bisher erstellte Lösung. Aber bei dem folgenden Beispiel schlägt unsere Prüfung fehl:
[MetadataType(typeof(MyViewModelMetaData))]
public class MyViewModel
{
    public string Name { get; set; }
}

public class MyViewModelMetaData
{
    [Required]
    public string Name { get; set; }
}

Wie kann das Problem gelöst werden? Ganz einfach - zusätzlich zu der schon erstellten Prüfung auf direkt gesetzte Attribute muss nun noch dem Metadatenattribut auf dem Typ gefolgt werden und in diesem Typ geprüft werden welche Attribute auf dem gleichnamigen Member gesetzt sind:
private static bool HasAttribute([NotNull] MemberInfo memberInfo, [NotNull] Type attributeType)
{
    if (memberInfo == null)
    {
        throw new ArgumentNullException();
    }

    // hier prüfe ich direkt gesetzte Attribute
    var isDefinedOnMember = Attribute.IsDefined(memberInfo, attributeType);
    if (isDefinedOnMember)
    {
        return true;
    }

    // jetzt wird noch der Metadatentyp geprüft
    var type = GetMetadataType(memberInfo);
    if (type == null)
    {
        return false;
    }

           
    return type.GetProperties().Any(prop => prop.Name.Equals(memberInfo.Name, StringComparison.OrdinalIgnoreCase) && Attribute.IsDefined(prop, attributeType));
}
Nun liefert die erstellte Methode auch in diesem Fall korrekte Ergebnisse.

Happy coding.

codefest.at [MS]: Visual Studio 14 CTP 2 in Azure - Virtuelle Computer einfach erstellen

Da ich noch auf das Gehäuse für meinen neuen Hyper-V PC warte, ich aber unbedingt Visual Studio 14 CTP2 ausprobieren wollte, stand ich kurzfristig vor einem Dilemma. Ich könnte natürlich mein Entwickler-Notebook missbrauchen, aber für eine CTP möchte ich mir die Arbeit, die dann vermutlich auf mich wartet, um wieder produktiv zu sein, nicht wirklich antun.

Des Weiteren ist ein ATX Unternehmen einer meiner Auftraggeber - der leider noch kein Windows 8/8.1 im Einsatz hat – bei dem das Interesse an Windows Phone 8/8.1 und Windows Store Applikationen aber vorhanden, bzw. sehr groß ist, wofür aber eben Windows 8/8.1 im Einsatz sein sollte. Tja, was tun, eine kleine Ewigkeit hat sich Ratlosigkeit breit gemacht…….bis…ja, bis mir eine wirklich gute Idee gekommen ist.

Zum Glück kommt mir nämlich wieder einmal Microsofts Cloud Lösung – Azure - zu Hilfe (das ist wirklich nicht das erste Mal, aber das werdet Ihr in weiteren Blog Einträgen bestimmt noch nachlesen können), genauer gesagt, die VMs, die bereits fix und fertig zur Verfügung stehen und auf eine Verwendung unsererseits nur warten.

Und genau das ist die Lösung meines momentanen Problems: Das risikolose Testen der neuen Visual Studio Version und das Entwickeln für den Windows Store in der Cloud. Also, nichts wie ran an das Aufsetzen eines virtuellen Computers.

Einrichten der VM mit VS 14 CTP 2

Mit einer bestehenden Azure Subscription sind die Anzahl der Schritte überschaubar, die man braucht, um an eine VM mit VS 14 CTP 2 zu gelangen. Da ich eine MSDN-Subscription mein Eigen nennen darf, kann ich auch jedes Monat Azure im Wert von €150,-- dank Microsoft kostenfrei nutzen.

Die Schritte, die notwendig sind kurz zusammengefasst:

1. Anmelden am Management Portal unter https://manage.windowsazure.com 
2. Anlegen eines virtuellen Computers
3. Konfiguration des virtuellen Computers
4. Start des virtuellen Computers
5. Verbinden mit Remote Desktop

Klingt relativ einfach - ist es auch - wie wir gleich sehen werden.

Anmelden im Portal

Nehmt den Browser eurer Wahl und navigiert zu https://manage.windowsazure.com. Dort meldet Ihr euch mit eurer Microsoft ID und dem Passwort an, danach landet Ihr (wie gewohnt) im Management Portal.

image

Nach der Anmeldung wollen wir den virtuellen Computer mit Visual Studio 14 CTP 2 anlegen.

Virtuellen Computer anlegen

Wählt nun auf der linken Seite ‚virtuelle Computer‘ an und klickt auf ‚virtuellen Computer erstellen‘.

image

In dem neuen Fenster wählt Ihr nun ‚aus Katalog‘ aus.

image

Es öffnet sich ein Fenster, wo alle vorhandenen virtuellen Maschinen aufgelistet sind, die Ihr installieren könnt. Wir sind auf der Suche nach dem Visual Studio 14 CTP 2 Image, dazu habe ich in der Suchleiste das Suchkriterium ‚visual studio‘ eingegeben, dementsprechend wird die Liste der verfügbaren Images eingeschränkt. Voila, Visual Studio Professional 14 CTP 2 steht an erster Stelle.

image

Dieses Image habe ich angewählt und danach den image Button gedrückt um die VM zu konfigurieren, oder besser gesagt, konfigurieren zu lassen. Ach, wie schön ist es doch, Arbeit delegieren zu können…..

Konfiguration des virtuellen Computers

Die Konfiguration ist eine recht einfache Sache - geschieht in drei einfachen Schritten.

Im ersten Schritt sollte man vorsichtig sein, hier ist folgendes einzugeben:

· Der Name des virtuellen Computers. Unter diesem Namen (plus der Erweiterung .cloudapp.net) ist später derselbe über Remote Desktop erreichbar. Der Name muss weltweit eindeutig sein und ist später nicht mehr änderbar.

· Die zweite Auswahl betrifft die Art und Größe der zugrunde liegenden Hardware. Je stärker, umso mehr Kosten fallen pro Monat an. Ich habe den Vorschlag auf A1 zurück gesetzt, das bedeutet 1 Core mit 1.75 GB RAM und (maximale) Kosten von €45,-- pro Monat (dazu aber später noch etwas mehr).

Im zweiten Schritt kann die Region des virtuellen Computers angepasst werden. Diesen habe ich auf Westeuropa geändert. Besondere Beachtung sollte man den Ports widmen, diese werden später zur Herstellung der Verbindung benötigt.

imageimage

Im abschließenden dritten Schritt erkennt Ihr die rechtlichen Bestimmungen von Microsoft an, danach kann es auch schon losgehen.

image

Unser Job ist getan, jetzt sind wir nur noch wenige Minuten davon entfernt, unseren virtuellen Computer auszuführen.

Start des virtuellen Computers

Nach dem Klick auf image wird der virtuelle Computer angelegt, was in der Statusanzeige sehr schön ersichtlich ist.

image

Nach einigen Minuten ist der virtuelle Computer bereit, die Statusanzeige wechselt auf ‚wird ausgeführt‘.

image

Das war es auch schon. Jetzt werden wir uns noch mit Remote Desktop an den soeben erstellten virtuellen Computer verbinden.

Verbinden mit Remote Desktop

Auf meinem lokalen Notebook starte ich Remote Desktop und stelle eine Verbindung zu meinem vorhin angelegten virtuellen Computer her.

imageimage

Das dauert ein paar Sekunden, danach kann ich Visual Studio 14 CTP 2 starten und gleich einmal auf meine Person aktivieren.

image

Voila, einem ersten Test von Visual Studio 14 CTP 2 steht nun nichts mehr im Wege – und das ganz ohne eigenes Risiko eine (bestehende) Installation durch die CTP unbrauchbar zu machen….

Kosten der VM

Das Ganze hat natürlich auch seinen Preis. Ich habe das einmal herausgesucht, Ihr könnt das gerne selbst kontrollieren unter: http://azure.microsoft.com/en-us/pricing/details/virtual-machines/

image

Die Kosten von €45,-- pro Monat sind  für die gebotene Leistung an sich schon eine feine Sache. Wenn ich diesen virtuellen Computer aber gerade nicht benötige, kann ich diesen jederzeit im Management Portal herunterfahren, um Kosten zu sparen.

Stoppen der virtuellen Maschine

Mittlerweile wird von Microsoft eine minutengenaue Abrechnung durchgeführt und gestoppte VMs produzieren keinerlei Kosten. Das Herunterfahren ist ganz einfach mit dem Button imageim Management Portal zu bewerkstelligen.

image

Das bedeutet, dass es sich durchaus lohnt, virtuellen Maschinen im Azure Management Portal herunterzufahren, denn damit lassen sich die Gesamtkosten für die Infrastruktur verringern. Viele Server müssen nämlich nur während der regulären Bürozeiten im Betrieb sein und können über Nacht beendet werden. Ähnlich verhält es sich natürlich mit der hier vorgestellten Entwickler VM, diese kann zu Zeiten, wo der Entwickler sich seinen wohl verdienten Schlaf gönnt, heruntergefahren werden.

Azure SDK 2.4 und Azure VMs in VS 2013

Mit der neuen Version 2.4 des Azure SDKs (und dem Update 3 von Visual Studio 2013) ist es nun möglich, den virtuellen Computer direkt in Visual Studio 2013 zu konfigurieren. Die zuvor erstellte VM wird im Server Explorer im Azure/Virtual Machines Knoten aufgelistet.

imageimage

Starten, Stoppen, Konfigurieren und sogar Debuggen ist schon länger möglich, der „Configure…“ Menüeintrag ist allerdings neu und öffnet ein neues Fenster mit zahlreichen Einstellungsmöglichkeiten.

image

Perfekt, so muss man nicht in das Azure Portal wechseln, wenn man Einstellungen kontrollieren, oder anpassen möchte. Ich frage mich gerade ernsthaft, ob ich meinen neuen, gerade bestellten Server nicht gleich wieder zurück schicken soll…..

Zusammenfassung

Ich denke Microsoft hat eine sehr elegante und auch kostengünstige Lösung für Entwicklungsteams geschaffen, um „schnell einmal etwas auszuprobieren“ – wie etwa Beta Versionen, neue Major Releases, oder einfach nur vorgefertigte virtuelle Computer, die ein bestimmtes Thema abdecken, an dem man gerade interessiert ist (z. B. BI mit dem SQLServer 2014).

Als kleine Randnotiz möchte ich noch anfügen, dass ich parallel zur Erstellung des oben beschriebenen virtuellen Computers auf meinem Notebook das Update 3 für Visual Studio 2013 installiert habe. Es war ein knappes Rennen, der virtuelle Computer mit Visual Studio 14 CTP 2 war aber um einige Minuten schneller verfügbar. Ich kann nur sagen: Echt beeindruckend!


Berndt Hamböck ist seit 2007 MCT, darüber hinaus befasst er sich mit Lösungen für komplexe Anwendungsszenarien mit den neuesten Microsoft Technologien. Die Erfahrungen aus der Projektarbeit gibt er in Vorträgen und Trainings weiter und begleitet Entwicklerteams in Softwareunternehmen bei Projekten im Microsoft Umfeld.

„Das ist ein Gastbeitrag. Die Meinung des Autors muss sich nicht mit jener von Microsoft decken. Durch den Artikel ergeben sich keinerlei Handlungsempfehlungen. Microsoft übernimmt keine Gewähr für die Richtigkeit oder Vollständigkeit der Angaben.“

Ralf Westphal: Software systematisch wachsen lassen

Mir gefällt die Metapher von der “wachsenden Software”. Ein schöner bildlicher Gegenentwurf zur Hausbaumetapher. Aber bisher hat mir dabei immer etwas gefehlt. Wie funktioniert denn das mit dem Wachsen genau? Software wächst ja nicht von allein, sondern durch unseren Eingriff von außen. Das Buch “Growing Object-Oriented Software Guided by Tests” (GOOS) hat versucht, diesen Wachstumsprozess, nein,

ppedv Team Blog: CRUD mit Angular und ASP.NET Web API

Es gibt schon eine Reihe von Blogeinträgen, die sich mit Angular, dem Controller, Listen, Suche und dem Sortieren beschäftigen. Auch wie man einen REST Service erstellt, auf Basis von Web API, habe ich bereits beschrieben. Schon etwas länger liegt ein fertiges Create, Read, Update und Delete-Beispiel auf meiner Festplatte. Allerdings muss klar gesagt werden, dass dies mit hohen Risiken verbunden ist. Eine transparente API für z.B. das Löschen von Datensätzen wird irgendwann immer missbraucht. Schutz kann nur Verschlüsselung, Authentifizierung und ein zusätzliches Token-System bieten. Ganz generell sehe ich erhebliche Risken bei einem reinen SPA Ansatz. Shawn Wildermuth schreibt dazu “I dont believe in SPA”.

Trotzdem möchte ich rein akademisch ein End to End-Beispiel zeigen. Daten aus der Northwind SQL Server Datenbank werden über eine ASP.NET Web API als REST-Service zur Verfügung gestellt. Ein HTML5 basiertes UI lädt mit Hilfe von Angular die Daten und bindet sie dem MVx Pattern folgend. Ebenso werden die Events im Viewmodel erstellt und an Buttons gebunden.

Das UI könnte aus der Feder des Lada Tiger Designers stammen: es ist zweckmäßig schlicht. Im oberen Bereich kann ein neuer Customer erzeugt werden. Darunter findet sich eine Liste. Eine Reihe kann in einen Edit-Modus versetzt werden.

image

Zuerst wird ein Entity Model aus der Datenbank generiert und danach per Scaffolding ein neuer Web API Controller aus dem Modell. Schon mehrfach beschrieben. Der so erzeugte VB.NET Code bedarf keiner Änderungen.

   1:  Imports System.Data
   2:  Imports System.Data.Entity
   3:  Imports System.Data.Entity.Infrastructure
   4:  Imports System.Linq
   5:  Imports System.Net
   6:  Imports System.Net.Http
   7:  Imports System.Web.Http
   8:  Imports System.Web.Http.Description
   9:  Imports Angular1Learn
  10:  Imports System.Web.Http.OData
  11:   
  12:  Namespace Controllers
  13:      Public Class CustomersController
  14:          Inherits ApiController
  15:   
  16:          Private db As New NorthwindEntities
  17:   
  18:          ' GET: api/Customers
  19:   
  20:          Function GetCustomers() As IQueryable(Of Customers)
  21:              Return db.Customers
  22:          End Function
  23:   
  24:          ' GET: api/Customers/5
  25:          <ResponseType(GetType(Customers))>
  26:          Function GetCustomers(ByVal id As String) As IHttpActionResult
  27:              Dim customers As Customers = db.Customers.Find(id)
  28:              If IsNothing(customers) Then
  29:                  Return NotFound()
  30:              End If
  31:   
  32:              Return Ok(customers)
  33:          End Function
  34:   
  35:          ' PUT: api/Customers/5
  36:          <ResponseType(GetType(Void))>
  37:          Function PutCustomers(ByVal id As String, ByVal customers As Customers) As IHttpActionResult
  38:              If Not ModelState.IsValid Then
  39:                  Return BadRequest(ModelState)
  40:              End If
  41:   
  42:              If Not id = customers.CustomerID Then
  43:                  Return BadRequest()
  44:              End If
  45:   
  46:              db.Entry(customers).State = EntityState.Modified
  47:   
  48:              Try
  49:                  db.SaveChanges()
  50:              Catch ex As DbUpdateConcurrencyException
  51:                  If Not (CustomersExists(id)) Then
  52:                      Return NotFound()
  53:                  Else
  54:                      Throw
  55:                  End If
  56:              End Try
  57:   
  58:              Return StatusCode(HttpStatusCode.NoContent)
  59:          End Function
  60:   
  61:          ' POST: api/Customers
  62:          <ResponseType(GetType(Customers))>
  63:          Function PostCustomers(ByVal customers As Customers) As IHttpActionResult
  64:              If Not ModelState.IsValid Then
  65:                  Return BadRequest(ModelState)
  66:              End If
  67:   
  68:              db.Customers.Add(customers)
  69:   
  70:              Try
  71:                  db.SaveChanges()
  72:              Catch ex As DbUpdateException
  73:                  If (CustomersExists(customers.CustomerID)) Then
  74:                      Return Conflict()
  75:                  Else
  76:                      Throw
  77:                  End If
  78:              End Try
  79:   
  80:              Return CreatedAtRoute("DefaultApi", New With {.id = customers.CustomerID}, customers)
  81:          End Function
  82:   
  83:          ' DELETE: api/Customers/5
  84:          <ResponseType(GetType(Customers))>
  85:          Function DeleteCustomers(ByVal id As String) As IHttpActionResult
  86:              Dim customers As Customers = db.Customers.Find(id)
  87:              If IsNothing(customers) Then
  88:                  Return NotFound()
  89:              End If
  90:   
  91:              db.Customers.Remove(customers)
  92:              db.SaveChanges()
  93:   
  94:              Return Ok(customers)
  95:          End Function
  96:   
  97:          Protected Overrides Sub Dispose(ByVal disposing As Boolean)
  98:              If (disposing) Then
  99:                  db.Dispose()
 100:              End If
 101:              MyBase.Dispose(disposing)
 102:          End Sub
 103:   
 104:          Private Function CustomersExists(ByVal id As String) As Boolean
 105:              Return db.Customers.Count(Function(e) e.CustomerID = id) > 0
 106:          End Function
 107:      End Class
 108:  End Namespace

 

Mit dem $http Service, der per Dependency Injection in den Controller injiziert wird, wird ein GET auf die REST URL abgesetzt. Im Erfolgsfall reicht eine direkte Zuweisung der Rückgabe an das Customers Array.

Hier wird eine Sucess und eine Error-Methode verwendet. In der Angular-Dokumentation wird dies als Promise bezeichnet. Technisch sind das Objekte, die Callback Methoden besitzen, die asynchron aufgerufen werden.

   1:  var url = 'api/Customers/';
   2:  angular.module('kunden2App', [])
   3:  .controller('CRUDController', function ($scope, $http) {
   4:      $scope.customers = [];
   5:       $http.get(url).success(function (data) {
   6:          $scope.customers = data;
   7:      })
   8:      .error(function (data) {
   9:          $scope.error = "An Error has occured while loading posts! " + data.ExceptionMessage;
  10:      });
  11:  });
  12:   

Mit ähnlicher Taktik wird als nächstes ein Datensatz gelöscht, hier mit der ID des Customers als Parameter in der URL. Ebenso wird eine Success und Error-Methode angelegt.

Allerdings muss nach dem Löschvorgang der Datensatz auch aus dem lokalen Viewmodel im Browser entfernt werden, genauer gesagt, aus allen Browsern, die diese Liste aktuell anzeigen. Wir wollen aber beim Machbaren bleiben. Nach einigen Tests mit unterschiedlichen Varianten wird das ganz klassische JavaScript verwendet, um die Liste im Scope zu durchlaufen und die ID des Customers zu vergleichen. Ist sie ident, hat der dazugehörige Customer im Array nichts mehr zu suchen.

   1:   $scope.delcustomer = function () {
   2:          var currentCustomer = this.customer;
   3:          $http.delete(url + currentCustomer.CustomerID).success(function (data) {
   4:              alert("gelöscht")
   5:              //foreach faktor x langsamer http://jsperf.com/angular-foreach-vs-native-for-loop/3
   6:              for (i = $scope.customers.length - 1; i >= 0; i--){
   7:                  if ($scope.customers[i].CustomerID === currentCustomer.CustomerID) {
   8:                      $scope.customers.splice(i, 1);
   9:                      return false;
  10:                  }
  11:   
  12:              }
  13:            
  14:          }).error(function (data) {
  15:              $scope.error = "Fehler " + data.ExceptionMessage;
  16:          });
  17:      };

 

Ich bin kein Freund von multifunktionalen Grids im Browser, aber die Menschheit ist Excel gewohnt und möchte in der Liste direkt editieren können. Dazu muss aber ein bzw. mehrere INPUT-Elemente dynamisch ein bzw. ausgeblendet werden. Die DataGrid-Darstellung benötigt einen Edit Modus, der als Property dem ViewModel hinzugefügt wird, hier benannt als addMode. Das Gleiche gilt für die Anzeige des Add Modus.

Der REST Service erwartet ein HTTP PUT Kommando mit der CustomerID als Key und dem kompletten Customer Objekt als Daten. Nach erfolgreichem Speichern wird der Modus umgeschalten und damit alle Felder sozusagen in Labels dargestellt.

   1:  angular.module('kunden2App', [])
   2:  .controller('CRUDController', function ($scope, $http) {
   3:      $scope.customers = [];
   4:      $scope.addMode = false;
   5:      $scope.toggleEdit = function () {
   6:          this.customer.editMode = !this.customer.editMode;
   7:      };
   8:      $scope.toggleAdd = function () {
   9:          $scope.addMode = !$scope.addMode;
  10:      };
  11:   
  12:      $scope.save = function () {
  13:          var cust = this.customer;
  14:          $http.put(url + cust.CustomerID,cust).success(function (data) {
  15:              cust.editMode = false;
  16:          }).error(function (data) {
  17:              $scope.error = "Fehler " + data.ExceptionMessage;
  18:          });
  19:      };

 

Außerdem werden andere Buttons eingeblendet.

image

Das Neuanlegen eines Datensatzes funktioniert auf Angular-Seite fast identisch, lediglich ein HTTP-Post ohne explizite ID, aber mit dem kompletten Customer-Objekt, wird übermittelt.

   1:  $scope.add = function () {
   2:       $http.post(url, this.newcustomer).success(function (data) {
   3:              $scope.addMode = false;
   4:              $scope.customers.push(data);
   5:          }).error(function (data) {
   6:              $scope.error = "Fehler " + data.ExceptionMessage;
   7:          });
   8:      };

 

Am Ende muss dem $Scope Customer Array noch der Kunde hinzugefügt werden, um ihn auch sichtbar zu haben.

image

Fehlt lediglich noch der HTML5 View. Die Events werden per ng-click an das Viewmodell bzw. die passenden Methoden gebunden. Dabei wird das Customer-Objekt als Parameter übergeben. Mit ng-hide wird das Ein- bzw. Ausblenden von Teilen der UI bezüglich des Viewmodell-Status sichergestellt. Das alles klappt mit der Angular-Zwei-Wege-Datenbindung per ng-model Attribut oder {{}} sehr einfach,

   1:    <body ng-app="kunden2App">
   2:          <div ng-controller="CRUDController">
   3:              <h2>Customers</h2>
   4:              <strong>{{ error }}</strong>
   5:            
   6:              <p ng-hide="addMode"><a ng-click="toggleAdd()" href="">Neu</a></p>
   7:   
   8:              <form name="Form1" ng-show="addMode">
   9:                  Name<input type="text" ng-model="newcustomer.CompanyName" required />
  10:                  CustomerID<input type="text" ng-model="newcustomer.CustomerID" required maxlength="5"/>
  11:                  <br />
  12:   
  13:                  <input type="submit" value="Add" ng-click="add()" ng-disabled="!Form1.$valid" />
  14:                  <input type="button" value="Cancel" ng-click="toggleAdd()" />
  15:   
  16:              </form>
  17:              <hr />
  18:   
  19:             Name Suchen <input type="text" ng-model="search.CompanyName" />
  20:              <table >
  21:                  <tr>
  22:                      <th>#</th>
  23:                      <th> <a href="" ng-click="reverse=!reverse;order('CompanyName', reverse)">Name <img ng-src="img/down{{reverse}}.gif"&lt;/a></</th>
  24:                      <th></th>
  25:                  </tr>
  26:               
  27:                  </tr>
  28:                  <tr ng-repeat="customer in customers | filter:search | orderBy:'CustomerID':reverse" >
  29:                      <td><strong ng-hide="customer.editMode">{{ customer.CustomerID }}</strong></td>
  30:                      <td>
  31:                          <p ng-hide="customer.editMode">{{ customer.CompanyName }}</p>
  32:                          <p ng-show="customer.editMode">
  33:                              <input type="text" ng-model="customer.CompanyName" />
  34:                          </p>
  35:                      </td>
  36:                      <td></td>
  37:                      <td>
  38:                          <p ng-hide="customer.editMode">
  39:                              <a ng-click="toggleEdit(customer)" href="">Edit</a> |
  40:                              <a ng-click="delcustomer(customer)" href="">Delete</a>
  41:                          </p>
  42:                          <p ng-show="customer.editMode">
  43:                              <a ng-click="save(customer)" href="">Speichern</a> |
  44:                              <a ng-click="toggleEdit(customer)" href="">Cancel</a>
  45:                          </p>
  46:                      </td>
  47:                  </tr>
  48:              </table>
  49:    

codefest.at [MS]: SIGGRAPH 2014 Report

Zurzeit findet im kanadischen Vancouver mit der 41. Ausgabe der ACM SIGGRAPH (International Conference on Computer Graphics and Interactive Techniques) eine der bedeutendsten wissenschaftlichen Konferenzen zum Thema Grafik, Animation und Gaming statt. 

Ich bin vor Ort und werde somit live für euch die wichtigsten Trends zusammenfassen. Da die Exibition erst kürzlich gestartet ist mache ich den Anfang mit einem Report aus der "Emerging Technologies Hall" in welcher Universitäten und Forschungsteams aus aller Herren Länder ihre neuesten Forschungsergebnisse präsentieren, wobei ich mich aufgrund der großen Zahl an vorgestellten Projekten auf die meiner Meinung nach wichtigsten beschränken muss.

Den Anfang machen wir mit der ETH Zürich (Disney Research), welche eine neue Methode zur Kommunikation vorstellt. LEDs bieten die Eigenschaft dass sie Lichtsignale nicht nur aussenden sonder auch empfangen können. Diesen Effekt machen sich die Wissenschaftler zu nutze, in dem sie mehrere LEDs in unglaublich kurzer Zeit sowohl als Lichtquelle als auch Lichtsensor arbeiten lassen. Dem menschlichen Betrachter fallen diese Änderungen nicht auf, für ihn leuchten die LEDs permanent. In Wahrheit nutzen sie die kurzen Empfangsphasen dazu, sich gegenseitig Nachrichten auszutauschen. Ein potentielles Einsatzgebiet hierfür ist etwa interaktives Spielzeug. 

Viele Projekte widmen sich 3D Displays ohne Brillen. Beim Spheree von der University of British Columbia beleuchten mehrere Projektoren eine Art Globus von innen - der Betrachter kann sich stufenlos um ihn herumbewegen und dreidimensionale Objekte erkunden. 

CYBERITH verspricht ein realistisches First-Person Gesamterlebnis

Gamer unter euch dürfte vor allem Cyberith interessieren - das Kickstarter Projekt aus Deutschland hat mit seinem dreidimensionalen Bewegungskäfig bereits sein Ziel erreicht und wird laut den Betreibern wohl um weniger als 1000 Euros erhältlich sein. Dann wird sich zeigen ob das Produkt seinen Einzug ins Wohnzimmer findet. Das Herumlaufen funktioniert an sich blendend, trotzdem fühlte sich die Bewegung aufgrund des Beschleunigungsausgleichs nicht zwingend natürlich an, hier zählt wohl der Trainingscharakter - man wird einige Zeit brauchen um einen Shooter einen Abend lang ohne Muskelkater zu bewältigen. 

Eines der Highlights ist neben dem Lumiconsense, einem von Microsoft Research geförderten Bildsensor der JKU Linz, dem ich bereits einen Beitrag gewidmet habe, der Bird Simulator. Virtual Reality Brille auf einem mechanischen Flugeingabegerät vermitteln dem Spieler ein vollständiges Vogelerlebnis - Flügelschlag und vom Ventilator gesteuerter Gegenwind inklusive. 

Der Bird Simulator in Aktion

In der ersten Halle der #SIGGRAPH2014 befanden sich außerdem eine Reihe von Kunstprojekten aus dem Video und Audiobereich. Zum Abschluss muss ich euch noch vom größten jemals geschossenen Bild berichten. Von diesem von den Konferenzbesuchern gestalteten Mandala aus Essenszutaten werden über sechshunderttausend HDR Bilder geschossen - wie viel Speicher das finale Bild benötigt steht noch nicht fest, Schätzungen gehen von mehr als 3 Terrabyte aus. Und das wars auch schon wieder mit dem ersten Teil meines Liveberichts, morgen werde ich mich für euch auf die Exibition begeben.

Mehrere Kameras schießen mehrmals pro Sekunde Teile des Trillion-Pixel Fotos

ppedv Team Blog: Windows 7/8 Tipp – Ungebetene Gäste aussperren

Hat man als Benutzer den Verdacht, jemand versucht sich am eigenen Rechner anzumelden, gibt es für einen solchen Fall eine entsprechende Abhilfe. Leider erlaubt Windows beliebig viele Anmeldeversuche, potentielle Angreifer können es also problemlos mehrmals probieren. Mit der nachfolgend beschriebenen Anleitung sperren Sie die Anmeldung für 30 Minuten, wenn eine bestimmte Anzahl misslungener Versuche erreicht worden ist.

So öffnen Sie die Eingabeaufforderung:

  • in Windows 7 drücken Sie die Windows-Taste und tippen cmd ein, anschließend mit der rechten Maustaste auf cmd.exe, dann auf Als Administrator ausführen und Ja.
  • In Windows 8 drücken Sie die Windows-Taste + X, klicken auf Eingabeaufforderung (Administrator) und Ja.

Sperrung festlegen:

Hierzu geben Sie folgenden Befehl ein: net accounts /lockoutthreshold:3 und Enter

Hinweis: „3“ steht für die Anzahl falscher Anmeldungen

Windows meldet anschließend „Der Befehl wurde erfolgreich ausgeführt“. Ab jetzt wird der Rechner für 30 Minuten gesperrt, sofern die Eingabe drei Mal falsch erfolgt.

 

clip_image002

 

Sperrung aufheben:

Hierzu geben Sie folgenden Befehl ein: net accounts /lockoutthreshold:0

 

clip_image004

Das ist alles, fertig!

Viel Spaß damit

Holger Sirtl: FTP-Zugriff auf Microsoft Azure Blob Storage via Cloud Service

Vor knapp 2 Jahren habe ich in einem Blog Artikel beschrieben wie sich mit Hilfe einer auf CodePlex bereitgestellten FTP to Azure Blob Storage Bridge ein FTP-Zugriff auf Microsoft Azure Blob Storage realisieren lässt. Die Architektur dieser Lösung war wie folgt:

image

Abb 1: Architektur der FTP-Bridge-Lösung

Die in einer Cloud Service Worker Role betriebene Bridge fungiert als Mittler zwischen einem FTP-Client, der die Bridge über Port 21 anspricht und dem Blob Storage, der die Daten hält.

Problem einer veralteten Worker Role Konfiguration

Seit besagtem Blog Artikel hat sich in Microsoft Azure einiges getan, und wenngleich man heute FTP-Zugriff auf Blob Storage ggf. anders implementieren würde (z.B. über eine Virtual Machine, in der ein IIS entsprechend konfiguriert wird), ist es doch eine funktionierende Lösung. Leider setzten die in der Bridge-Lösung verwendeten Konfigurationsdateien ein heute nicht mehr unterstütztes VM-Image für die Worker Role voraus. Deshalb lässt sich die Lösung heute so nicht mehr betreiben.

Aktualisierung der Worker Role Konfiguration

In ein paar wenigen Schritten lässt sich die Blob Storage Bridge allerdings in eine neue, aktuelle Visual Studio Solution übertragen, von wo aus sie dann in eine aktuelle Worker Role deployt werden kann.

Voraussetzungen

Folgende Softwarepakete müssen auf dem Rechner installiert sein:

Darüber hinaus ist ein Microsoft Azure Account erforderlich.

Anlegen eines Storage Accounts

Das Vorgehen hierzu ist identisch zu dem im ursprünglichen Blog Artikel beschriebenen.

Erstellen einer aktuellen Visual Studio Solution

Zum Erstellen einer aktuellen Visual Studio Solution, die auf aktuelle Worker Role VMs deployt werden kann führen Sie folgende Schritte durch:

  1. Öffnen Sie Visual Studio 2013 und wählen Sie den Menüpunkt File/New/Project…
  2. Wählen Sie als Projektvorlage Templates/Visual Studio C#/Cloud/Azure Cloud Service.
     
    image
     
  3. Fügen Sie dem Cloud Service eine Worker Role hinzu und benennen Sie diese mit FTPServerRole.
     
    image
     
  4. Wechseln Sie in den Windows Explorer. Kopieren Sie aus der Visual Studio Solution der FTP to Azure Blob Storage Bridge das Verzeichnis AzureFtpServer in das Verzeichnis der in Schritt 2 angelegten Cloud Service Solution (also “neben” das Verzeichnis FTPServerRole).
  5. Fügen Sie das AzureFtpServer-Projekt der Visual Studio Solution hinzu. Wählen Sie in Visual Studio im Solution Explorer im Kontextmenü (Klick mit der rechten Maustaste auf die Solution) den Eintrag Add/Existing Project… und wählen Sie im Verzeichnis AzureFtpServer die Projektdatei AzureFtpServer.csproj. Die Solution sollte danach drei Projekte enthalten: Das Cloud Service Projekt, die Worker Role und das Ftp-Server-Projekt.
     
    image
  6. Damit die Worker Role den Ftp-Server nutzen kann, fügen Sie in der Worker Role eine Referenz auf den Ftp-Server ein. Klicken Sie in der Worker Role im Eintrag References im Kontextmenü auf Add Reference… Wählen Sie unter Solution/Projects das AzureFtpServer-Projekt und bestätigen Sie mit OK.
     
    image
     
  7. Implementieren Sie nun die Logik der Worker Role. Im Wesentlichen ist dies eine Kopie des Codes, der bereits in der Visual Studio Solution der FTP to Azure Blob Storage Bridge in der dortigen Worker Role enthalten war.
     
    Fügen Sie folgende using-Statements in die Datei WorkerRole.cs: 

    using AzureFtpServer.Azure;
    using AzureFtpServer.Ftp;
    using AzureFtpServer.Provider;
    Definieren Sie in der Klasse Worker Role eine private Variable für den Ftp-Server:
    private FtpServer _server;
    Implementieren Sie die Methode OnStart() wie folgt:
    public override bool OnStart()
    {
    // Set the maximum number of concurrent connections
    ServicePointManager.DefaultConnectionLimit = 12;

    // For information on handling configuration changes
    // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
    RoleEnvironment.Changing += RoleEnvironmentChanging;

    if (_server == null)
    _server = new FtpServer(new AzureFileSystemFactory());

    _server.NewConnection += ServerNewConnection;

    bool result = base.OnStart();

    Trace.TraceInformation("FTPServerRole has been started");

    return result;
    }
    Implementieren Sie die Methode ServerNewConnection() wie folgt:
    static void ServerNewConnection(int nId)
    {
    Trace.WriteLine(String.Format("Connection {0} accepted", nId), "Connection");
    }
    Implementieren Sie die Methode RoleEnvironmentChanging() wie folgt:
    private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
    {
    // If a configuration setting is changing
    if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))
    {
    // Set e.Cancel to true to restart this role instance
    e.Cancel = true;
    }
    }
    Implementieren Sie die Methode RunAsync() wie folgt:
    private async Task RunAsync(CancellationToken cancellationToken)
    {
    while (!cancellationToken.IsCancellationRequested)
    {
    Trace.TraceInformation("Working");
    if (_server.Started)
    {
    await Task.Delay(1000);
    //Trace.WriteLine("Server is alive.", "Information");
    }
    else
    {
    _server.Start();
    Trace.WriteLine("Server starting.", "Control");
    }
    }
    }

Damit ist die Implementierung abgeschlossen. Was fehlt, sind die Konfigurationsparameter sowie die Definition der für Ftp benötigten Endpunkte.

Setzen der Konfigurationsparameter

Klicken Sie nun im Solution Explorer auf die FTPServerRole und wechseln Sie bei den Einstellungen in den Reiter Settings. Fügen Sie dort die einzelnen Settings wie sie in meinem ursprünglichen Blog Artikel beschrieben sind, hinzu. Klicken Sie jeweils auf Add Setting, wählen den Namen und die zugehörigen Werte. Nach Fertigstellung sollte die Seite wie folgt aussehen:

image

Definieren der benötigten Endpunkte

Wechseln Sie in den Reiter Endpoints und konfigurieren Sie dort die beiden benötigten Endpunkte. Das Ergebnis sollte wie folgt aussehen:

image

Damit ist die eigentliche Implementierung abgeschlossen. Das Ganze kann im Azure Emulator getestet werden. An dieser Stelle soll gleich mit dem Deploment nach Microsoft Azure weiter gemacht werden.

Deloyment der FTP-Bridge-Lösung in einen Cloud Service Container

Aus Visual Studio heraus kann nun via Publish-Befehl (aus dem Kontextmenü der Solution) das Deployment-Paket (eine CSPKG- und eine CSCFG-Datei) erstellt werden, das dann entsprechend der Beschreibung in meinem  ursprünglichen Blog Artikel in Microsoft Azure deployt werden kann.

Alternativ kann aus Visual Studio heraus direkt das Deployment vorgenommen werden. Führen Sie hierzu folgende Schritte aus:

  1. Klicken Sie mit der rechten Maustaste auf das Cloud Service Projekt und wählen im Kontextmenü den Eintrag Publish.
  2. Wählen Sie zunächst die Azure-Subscription, in die der Cloud Service installiert werden soll (bzw. konfigurieren Sie zunächst die Subscription).
     
    image
     
  3. Wählen Sie einen Namen und eine Region, in der der Cloud Service bereitgestellt werden soll.

    image
     
  4. Bestätigen Sie die Eingaben mit Publish.

Daraufhin installiert Visual Studio die FTP-Bridge in einen Microsoft Azure Cloud Service.

Zugriff über einen FTP-Client

Das Vorgehen hierzu ist identisch zu dem im ursprünglichen Blog Artikel beschriebenen.

Weitere Informationen

ppedv Team Blog: Windows Server 2012 R2: Storage Pools mit SSD-Tiering

Seit dem Windows Server 2012 beherrschen die Microsoft-Server-Systeme die Möglichkeit, so genannte “Storage Pools” (Speicherpools) zu bilden. Dabei handelt es sich um einen Zusammenschluss verschiedener lokal angebundener oder als LUN eingebundener Datenträger, z.B. via SAS, SATA oder auch USB. Bei den LUNs stehen iSCSI und FiberChannel zur Verfügung.

Die grundsätzliche Idee ist hier, eine Art Storage abzubilden, quasi eine “Storage-Virtualisierung”. Aus einem gebildeten Storage-Pool können anschließend logische Laufwerke, sogenannte “Speicherplätze” (Storage Spaces), gebildet werden. Dabei kann die Organisation des Speichers gewählt werden. Zur Verfügung stehen “Simple” (eine Art RAID0, keine Datensicherheit, aber eine Erhöhung des Durchsatzes durch die gleichzeitige Nutzung aller beteiligter Festplatten), “Mirror” (Eine Art RAID1 mit einfacher oder doppelter Spiegelung der Blöcke um ein Erhalten der Daten auch bei Ausfall einer Festplatte sicherzustellen) und “Parity” (Funktioniert wie RAID5; Paritätsdaten, die ein Wiederherstellen der Daten bei Ausfall einer Festplatte möglich machen, werden über alle beteiligten Datenträger verteilt). Dabei spielen Größe, Hersteller, Bus-Typ und Co. der Festplatten nahezu keine Rolle – ein Faktor, der die Storage Pools deutlich von klassischen RAID-Controllern unterscheidet.

spool7b2

Ein weiterer Faktor, der Storage-Pools von üblichen “lokalen” Speichertechnologien abgrenzt, ist die Möglichkeit, nachträglich Festplatten hinzuzufügen oder durch größere auszutauschen, um den zur Verfügung stehenden Speicherplatz zu erhöhen.

Seit dem zweiten Release des Server 2012 wird diese Technologie noch erweitert: Der Windows Server 2012 R2 beherrscht das sogenannte “SSD-Tiering” (Speicherebenen). Hierbei werden klassische HDDs und SSDs gemeinsam in einem Pool genutzt und die häufig gelesenen Daten auf die SSD verschoben, die seltener genutzten Daten bleiben auf der HDD. Alternativ kann man SSDs auch als Write-Back-Cache einsetzen.

spool6b

(Eine Anleitung, wie das genau eingerichtet werden kann, werde ich in Kürze ebenfalls veröffentlichen.)

Diese Möglichkeit – sowie Speicherpools insgesamt – sind in meinen Augen vor allem für kleinere und mittlere IT-Landschaften interessant, in denen keine “ausgewachsenen” SANs zum Einsatz kommen (können). Daher war für mich interessant, wie gut diese Technologie funktioniert und welche Geschwindigkeitsvorteile hierbei erzielt werden können. Daher habe ich diverse Test-Messungen unternommen, welche ich nun hier auswerten möchte. Zum Einsatz kam ein Fujitsu-Siemens-Server mit einem 4-Kern-Xeon-Prozessor und 8GB RAM, dazu 2 SATA-Festplatten von Western Digital und 2 SATA-SSDs von Crucial, jeweils mit etwa 250GB Speicher.

Zuerst habe ich die Festplatten einzeln getestet, um Vergleichswerte zu haben:

CrystalDiskMark_Pool_einzelne_HDD CrystalDiskMark_Pool_einzelne_SSD
hdtach_einzelne_HDD hdtach_einzelne_SSD

Hier ist natürlich zu erkennen, dass die SSD (rechts) deutlich schneller als die HDD (links) ist – und zwar in allen Disziplinen.

Weiterhin habe ich den Server-eigenen LSI RAID-Controller getestet (jeweils im RAID0, links 2x HDD, rechts 2x SSD):

CrystalDiskMark_2xHDD_RAID0_Controller CrystalDiskMark_2xSSD_RAID0_Controller
hdtach_2xHDD_RAID0_Controller hdtach_2xSSD_RAID0_Controller

Beim Lesen schafft der Controller sogar etwa doppelt so schnelle Werte – beim Schreiben brechen die Werte dafür dann recht ordentlich ein, der Betrieb ist also langsamer als eine einzelne Platte!

Und nun im direkten Vergleich ein Betrieb via Storage-Pool im “Simple”-Modus (links) und im “Mirror”-Modus (rechts):

CrystalDiskMark_Pool_mitSSD_Tearing_RAID0 CrystalDiskMark_Pool_mitSSD_Tearing_RAID1
hdtach_Pool_mitSSD_Tearing_RAID0 hdtach_Pool_mitSSD_Tearing_RAID1

Hier sieht man zunächst (CrystalDiskMark) etwa folgende Ergebnisse:

- Im Simple-Modus erreicht der Pool fast die Lese-Raten des RAID0 aus 2x SSD am Controller, übertrifft die Schreibraten aber deutlich

- Auch bei den wahlfreien Zugriffen sind durchweg bessere Werte zu sehen als beim RAID0 oder den einzelnen Platten

- Beim Mirror-Modus sind die Leseraten in etwa so wie beim Simple-Modus, beim Schreiben dafür aber nur etwa halb so hoch

- Insgesamt ist der Mirror-Modus aber besser als die beiden SSDs im RAID0 des Controllers

Wenn man nun aber noch HD Tach mit betrachtet, dann sieht man recht deutlich, dass die hohen Raten nur anfänglich erreicht werden (nämlich bis zu der Stelle, an der zwischen den SSDs und den HDDs gewechselt wird, hier etwa bei der Hälfte. Dennoch sind die Daten im “HDD-Bereich” recht gut!

Ich denke diese Ergebnisse zeigen, dass die Technologie zu hohen Geschwindigkeiten fähig ist, die selbst mit (zumindest einfacheren) RAID-Controllern nicht erreicht werden. Ich werde zeitnah noch eine tabellarische Gegenüberstellung der Werte ausarbeiten.

In diesem Beitrag habe ich weitere Tests und eine Auswertung in Tabellenform veröffentlicht: http://blog.ppedv.de/post/2014/08/15/Auswertung-zum-StoragePool-Benchmark.aspx  

ppedv Team Blog: HTML Input mit Bootstrap Edit Template umranden per Angular

Wer umfangreiche Formulare für den Webbrowser erstellt, wird sich bald wünschen weniger Code tippen zu müssen. Ein HTML Input wird mit Attributen versehen, einer Fehlermeldung, einem Label und einigen Klassen.

   1:  <div class="form-group">
   2:      <label class="col-xs-2 control-label" for="text1">Label</label>
   3:      <div class="col-xs-10">
   4:          <input type="text" id="text1" class="form-control" />
   5:          <span class="help-block">Fehlermeldung</span>
   6:      </div>
   7:  </div>

 

Tippen möchte ich aber nur etwas in der Form

 
   1:  <input type="text" id="text1" label="Name:" 
fehlermeldung="bitte füllen" required />

 

Der HTML Code außen rum soll sich automatisch daraus generieren. Ein Anwendungsfall für eine Angular.js Direktive. Das folgende Beispiel ist also der Prototyp zum Prototyp einer zukünftigen SPA Anwendung.

image

Dazu wird eine Angular App im HTML Code deklariert, samt zugehörigem Controller.

   1:  <body ng-app="App">
   2:      <div ng-controller="ExampleController">
   3:          <div formulargruppe data-label="Firmenname" 
data-fehlermeldung="Da muss was rein">
   4:              <input type="text" required name="feld1" 
ng-model="Customer.CompanyName"
   5:                      placeholder="Firma"/>
   6:          </div>
   7:      </div>

Wer sehr korrekt sein will, setzt ein data- vor die Eigenschaftsattribute wie fehlermeldung oder label. Es geht auch ohne. In Zeile 3 wird die Direktive Formulargruppe eingebunden. Auf keinen Fall in Direktiven einen Bindestrich im Namen verwenden, da dieser intern per Konvention entfernt wird.

Direktiven würde ich mit Behaviours aus XAML vergleichen. Damit lassen sich einem UI Element neue Eigenschaften, Visualisierung und Events zuordnen.

Das Ziel ist um jedes bestehende INPUT-Element eine Bootstrap-passende Formatierung zu legen und die Attribute aus dem INPUT weiter zu verwenden.

Die Direktive formulargruppe liefert mit einer Art Konstruktormethode Daten zurück. Mit restrict A ist die Nutzung nur als Attribut zulässig. Transclude ersetzt das bestehende DIV (Zeile 3 obiges Listing) mit dem Inhalt aus dem Template (Zeile 10 folgendes Listing). Das Input Element wandert dann an die Stelle ng-transclude, aus dem HTML Template.

Der besondere Gag ist die Datenbindung an einen lokalen Scope. Nicht zu verwechseln mit dem $Scope aus dem Viewmodel. Die Attribute label und Fehlermeldung und deren Werte aus der HTML-Seite (Zeile 3), werden durch de Zuweisung scrope: zu Eigenschaften. Diese können dann in Zeile 11 und 14 im Template frei gebunden werden. Das erinnert ein wenig an die ContentTemplates aus XAML und die Bindinglogik.

   1:     <script src="Scripts/angular.js"></script>
   2:      <script>
   3:          angular.module('App', [])
   4:           .directive('formulargruppe', function () {
   5:               return {
   6:                   restrict: 'A',
   7:                   transclude: true,
   8:                   replace: true,
   9:                   scope: { label: '@', fehlermeldung: '@' },
  10:                   template: '<div class="form-group">' +
  11:           '<label class="col-xs-2 control-label" for="text1">
{{label}}</label>' +
  12:           '<div class="col-xs-10">' +
  13:           ' <div ng-transclude ></div>' +
  14:           ' <span class="help-block">{{fehlermeldung}}</span> </div></div>',
  15:                              }
  16:   
  17:               }
  18:           })
  19:          .controller('ExampleController', ['$scope', function ($scope) {
  20:          ...
  21:          }]);

 

Das bleibt ein nicht unerhebliches Problem. Bootstrap braucht im Input-Element, für die runden Ecken, eine CSS Klasse form-control. Man könnte diese Klasse im Ausgangs-HTML-Code definieren, schöner wäre aber ein Automatismus über die Direktive. Allerdings ist im HTML Template kein INPUT vorhanden.

Genau für diesen Zweck, nämlich per Logik, das Template zu manipulieren, wurde die Link-Eigenschaft geschaffen. Im folgenden JavaScript Code wird das erste und einzige INPUT-Element selektiert. Dieses muss in einen Angular-Elementtyp umgewandelt werden, um die Jquery-Methode addClass nutzen zu können.

   1:  link: function (scope, element, attrs {
   2:          var input1 = element[0].querySelector("input");
   3:          angular.element(input1).addClass('form-control');

 

Letztendlich noch ein Blick auf den erzeugten HTML Code. Es fällt auf, dass ein zusätziches DIV um das INPUT Element gerendert wird. Erkennbar am Attribut ng-transclude. In meinen Tests mit allen möglichen Varianten Direktive als Element oder Attribut wurde auch ein  <span class="ng-scope">hannes</span> eingefügt.

   1:  <div ng-transclude="">
   2:            
   3:    <input name="feld1" class="ng-scope ng-pristine ng-untouched 
   4:  form-control ng-invalid ng-invalid-required" required=""
   5:   type="text" placeholder="Firma" 
   6:  ng-model="Customer.CompanyName">
   7:   
   8:  </div>

Dies ist nur der Anfang für ein vollständiges Angular-Formular mit Validierung und Bootstrap Design. Gezeigt wurde der Einsatz einer Direktive mit HTML Template und Binding. Mehr lernen Sie in meinem ppedv Angular Workshop auf der #ADCX.

codefest.at [MS]: Visual Studio 2013 Update 3 (2013.3) RTM - August 4

Ganz rasch, ganz frisch: Visual Studio 2013 Update 3 (2013.3) RTM - August 4 ist verfügbar! Nebenbei ist heute auch ein großer Microsoft Patchday August updates for Windows 8.1 and Windows Server 2012 R2. Also viel zu aktualisieren… Das zuvor erwartete “Windows 8.1 Update 2” wird es nicht geben, stattdessen kommen – wie gewohnt - viele kleine Updates: Patches. Neue Features (wie etwa das neue alte Startmenu, welches auf Build 2014 gezeigt wurde) kommt dann wohl erst mit “Treshold”…

Das Update kann direkt aus VS installiert werden…

image

…oder hier per Web-Installer oder als ISO bezogen werden, siehe Download. Das ISO ist satte 4GB groß.

image

Einige Neuerungen von VS 2013 Update 3 auf einen Blick zusammengefasst finden sich im Visual Studio Blog:

Visual Studio 2013 Update 3 (2013.3) RTM - August 4

image

Viel Spaß mit den Neuerungen!

ppedv Team Blog: Windows zeitgesteuert herunterfahren

Sie wollen längst nach Hause, der Rechner ist jedoch noch nicht fertig mit der Arbeit. Dateien werden noch kopiert oder Inhalte heruntergeladen. Sie wollen, anstatt zu warten, dass der Rechner z.B. in 20 Min automatisch herunterfährt.

Mit einer kleinen Textdatei sorgen Sie dafür, dass Ihr Rechner, so wie Sie es wollen, zukünftig selbstständig herunterfährt.

Das sind die nötigen Schritte:

Schritt 1: Dokument erstellen:

Sie drücken die Tastenkombination „Windows-Taste“ + „R“, tippen Notepad ein und bestätigen mit OK.

clip_image001

Geben Sie nun folgenden Text ein:

@echo off

set /p eingabe="Minuten bis zum Herunterfahren:"

set /a sekunden=%eingabe%*60

shutdown /s /t %sekunden%

exit

image

Danach klicken Sie auf Datei, Speichern unter und wählen einen Speicherort aus (am besten auf dem Desktop) und benennen die Datei als Herunterfahren.cmd und speichern diese ab.

Schritt 2: Timer einstellen:

Um Ihren PC herunterzufahren, klicken Sie doppelt auf die eben auf dem Desktop gespeicherte Datei Herunterfahren.cmd. Im Dialogfenster geben Sie die Zeit in Minuten ein, wann der PC herunterfahren soll und bestätigen die Eingabe mit Enter.

clip_image003

Der sog. Countdown beginnt sofort und läuft auch weiter, auch wenn Sie das Fenster schließen. Nach Ablauf der Zeit fährt der PC herunter.

clip_image005

Viel Spaß damit

Holger Sirtl: Microsoft Azure Caching - welchen Service soll ich nehmen?

Wer für seine Azure-basierte Anwendung einen Caching Service nutzen möchte wird nach Studium der entsprechenden MSDN-Seiten möglicherweise etwas verunsichert bleiben. So gibt es in Microsoft Azure (Stand August 2014) sage und schreibe vier Alternativen für die Umsetzung von Caching:

Hinweise zur Auswahl des geeigneten Azure Cache Service finden sich auf der MSDN-Seite Which Azure Cache offering is right for me?

Ohne das Ergebnis der Empfehlungen komplett vorweg nehmen zu wollen, lässt sich daraus ableiten:

  1. Wann immer möglich (insbesondere bei neuen Projekten) sollte Azure Redis Cache als Cache verwendet werden.
  2. Sofern Redis nicht möglich ist, sollte vom Shared Cache kurzfristig (bis 01.09.2014) zum Managed Cache Service migriert werden.
  3. Für Cloud Services sind sowohl der Redis Cache als auch der In-Role-Cache sinnvoll.

Azure Redis Cache

Azure Redis Cache basiert auf dem Open Source Redis Cache Framework. Dieser wird von Microsoft verwaltet auf Azure bereitgestellt und von beliebigen Azure Anwendungen (Websites, Cloud Services, Virtual Machines) heraus zugreifbar. Redis Cache (Preview) ist in zwei Ausbaustufen verfügbar: Basic (ein Knoten, verschiedene Größen) und Standard (zwei Knoten (Master/Slave), mehrere Größen, 99,9% SLA). Während die anderen Cache Services nur einfache Schlüssel-Wert-Paare verwalten können, kann der Redis Cache auch mit Datenstrukturen wie Strings, Hashes, Listen, Sets und Sortierte Sets umgehen. Darüber hinaus unterstützt er Transaktionen, Pub/Sub-Pattern, Lua Scripting und Schlüssel mit begrenzter Lebensdauer.

Weitere Informationen zum Redis Cache unter:

Managed Cache Service

Der Managed Cache Service ist ein zentral bereitgestellter Cache Service, der – anders als der In-Role-Cache – von Cloud Services, Websites und Virtual Machines heraus zugänglich ist. Er basiert auf der AppFabric Cache Engine in Azure. Der Managed Cache wird in drei Ausbaustufen, die sich in Größenoptionen und einigen Funktionen unterscheiden (z.B. Notifications) angeboten: Basic, Standard und Premium. Das Anlegen eines Managed Cache Service ist derzeit (August 2014) nur über PowerShell möglich.

Weitere Informationen zum Managed Cache Service:

In-Role Cache

Dieser Cache läuft innerhalb von Cloud Service Rollen. Hierzu können entwicklerseitig entweder dedizierte Cache Rollen definiert werden, bei denen die gesamte Leistung der Rolleninstanzen für den Cache reserviert wird (dedicated), oder anteilig Leistung regulärer Web oder Worker Rollen für den Cache reserviert werden (co-located). Sofern eine Umkonfiguration des Cache erforderlich ist, muss der Cloud Service neu deployt werden. Durch die flexible Bereitstellung von Rollen und Instanzen sind quasi beliebige Cache-Größen möglich. Der In-Role Cache kann nur innerhalb von Cloud Services genutzt werden.

Weitere Informationen zum In-Role Cache:

Shared Cache

Dies ist der erste, in Microsoft Azure (damals noch Windows Azure genannt) angebotene Caching-Dienst. Dieser stellt an zentraler Stelle Caching-Funktionalität für Key-Value-Paare bereit. Nachdem dieser Cache als Multi-Mandanten-Dienst implementiert war (d.h. mehrere Azure Kunden sind zwar durch die Plattform voneinander getrennt, teilen sich aber die gleichen Ressourcen), kann die Performanz variieren (abhängig davon wie das Zugriffsverhalten der einzelnen Kunden ist).

Der Shared Cache wird am 01.09.2014 eingestellt. Kunden, die diesen Dienst nutzen, müssen ihre Anwendungen bis dahin auf einen der anderen Caching-Dienste migriert haben. Informationen hierzu:

Zusammenfassung

Folgende Tabelle gibt einen schnellen Überblick über die Caching Alternativen in Microsoft Azure:

Caching Service Eigenschaften Roadmap
Azure Redis Cache
  • Zentral bereitgestellt
  • Nutzbar von Websites, Cloud Services, Vitual Machines
  • Ablage von Schlüssel-Wert-Paaren, wobei Schlüssel Datenstrukturen wie Strings, Hashes, Listen, Sets und Sortierte Sets enthalten können
  • Unterstützung von Transaktionen, Pub/Sub, Notifications, Lua Scripting
  • Wählbare Lebensdauer von Schlüsseln
Empfehlung für alle neuen Projekte mit Caching Bedarf.
Managed Cache
  • Zentral bereitgestellt
  • Nutzbar von Websites, Cloud Services, Vitual Machines
  • Ablage von Schlüssel-Wert-Paaren
 
In-Role Cache
  • Caching-Funktion wird in Cloud Service Rollen bereitgestellt
  • Nutzbar nur aus Cloud Services.
  • Ablage von Schlüssel-Wert-Paaren
 
Shared Cache
  • Zentral bereitgestellt
  • Multi-Mandanten-Umgebung
  • Nutzbar von Websites, Cloud Services, Virtual Machines
  • Ablage von Schlüssel-Wert-Paaren
Wird am 01.09.2014 eingestellt.

Weitere Informationen

Sven Hubert: Neues Feature für AIT Apply Company Policy: Projekte ausschließen und einbeziehen

Entwicklungsrichtlinien sind sinnvoll und sollten nach Möglichkeit durchgesetzt werden. Dabei hilft das kostenlose Tool AIT Apply Company Policy (ACP), welches wir schon in einem anderen Beitrag vorgestellt haben. Allerdings gibt es vielleicht manche Richtlinien, die nur auf ganz bestimmte oder gerade auf bestimmte Projekte nicht angewandt werden sollen. Dies ist mit der neuen Version von AIT Apply Company Policy möglich, welche im Downloadbereich zur Verfügung steht.

Zum Beispiel könnte man ein ACP-Paket erstellen, was auf alle Projekte angewandt wird, nur die Dokumentation soll in Testprojekten nicht erstellt werden. Dann könnte der entsprechende Abschnitt in der CompanyPolicy.config so aussehen:

<Documentation exclude="*.Test"> 
    <Configuration Name="Debug" enabled="true" /> 
    <Configuration Name="Release" enabled="true" />    
    <Configuration Name="Staging" enabled="true" /> 
</Documentation>

Das exclude-Attribut bestimmt, dass in allen Projekten, die auf “.Test” enden, nicht die Dokumentation erstellt wird.

Es ist auch denkbar, dass man ein ACP-Paket erstellt, welches nur für Testprojekte gelten soll, z. B. bestimmte Regeln für die statische Codeanalyse, und man möchte sicherstellen, dass dieses Paket auch wirklich nur auf Testprojekte angewandt werden kann. Dies ist mit folgendem Eintrag möglich:

<StaticCodeAnalysis includeOnly="*.Test"> 
    <Configuration Name="Debug" enabled="true" ruleSet="AIT.ruleset" /> 
    <Configuration Name="Release" enabled="true" ruleSet="AIT.ruleset" />     
    <Configuration Name="Staging" enabled="true" ruleSet="AIT.ruleset"/> 
</StaticCodeAnalysis>

Das includeOnly-Attribut definiert hier, dass die Regeln für die statische Codeanalyse nur auf Projekte angewandt werden, welche auf “.Test” enden.

Darüber hinaus ist es möglich, diese beiden Attribute zu kombinieren. Damit kann man z. B. Regeln nur auf Projekte anwenden, die “Infrastructure” im Namen haben aber nicht auf “.Test” enden.

Neues Feature für AIT Apply Company Policy: Projekte ausschließen und einbeziehen is a post from: AIT Blog

Christian Giesswein: Roslyn Live - Roslyn in der Cloud

Letztens wollte ich die neuen Features von Roslyn ausprobieren, und damit meinte ich die neusten, von neuen Features wie zum Beispiel den „Null Propagation Operator“ der mit C# 6.0 kommen wird. Dieses Feature ist leider nicht in der Preview von Microsoft enthalten. Ich könnte nun natürlich mir den Quellcode von Roslyn herunterladen, Compilieren und in der Roslyn-Hive installieren, jedoch ist dies relativ viel Aufwand. Dementsprechend kam ich auf die Idee – Warum nicht eine kleine Website bauen die dies übernimmt? Gesagt,.. getan,… erledigt! Damit habe ich http://roslynlive.azurewebsites.net ins Leben gerufen. Dabei wird die neuste Version von Roslyn verwendet (vom 04. August also knappe 9 Tage alt) und man kann dort die Features sauber ausprobieren. Nachdem in meinen bisherigen Sessions und Vorträgen zu diesem Thema immer wieder die Frage aufgetaucht ist, wie denn der IL Code dafür aussehen würde, habe ich diesen gleich mitausgewertet um damit zu sehen was der Compiler denn daraus macht.

Der Compiler in der Cloud...

Damit kann man natürlich wahnsinnig schnell mal eben die Sprachfeatures von C# 6.0 ausprobieren und sieht auch den IL Code davon.
Persönlich finde ich gerade das neue Null-Propagating Operator Feature doch recht nützlich wenn man es mal verwendet.

Falls dazu wer Fragen hat, oder es nützlich findet aber es fehlt einem ein Feature würde es mich freuen wenn ich dazu eine kurze Mail an mail@giesswein-apps.at erhalt
oder per Twitter an @giessweinweb.

Fabian Deitelhoff: Let Me Introduce: The Twitter Trends Terminator

The Mighty Twitter Trends TerminatorI love Twitter. I really do. Its a great source of information for me. Especially in the area of software development. But I have to admit that I hate those Twitter trends. Those words, tiny sentences or hashtags. They try to tell me what’s important or hipp. But in most cases, in fact 99.9% of those cases, I just found them very annoying. Not useful, inspiring, funny or whatever. Just stupid and annoying.

Of course thats just my opinion and I think there are dozens of teens people out there crying when they’re watching some of “their” topics trending right now. Completely fine for me. But I just don’t want to see them any more.

That was the birth of the mighty Twitter Trends Terminator. Send back through space and time, awoken naked somewhere out there to hunt those Twitter trends down. Forever. Not just hiding them somewhere. Just as my old friend Darth Sidious told me long ago:

Wipe Them Out. All of Them! Darth Sidious (YouTube)

The Chrome Extension

The extensions wasn’t really complicated to implement. There was just some research necessary when I started the project, because this is my first Chrome extension. One major obstacle was to change the Document Object Model after the Twitter main page is completely loaded. Thats important, because the Twitter Trends and the Who to Follow box are loaded asynchronously. At this time, the Document Object Model is completely available. But the div elements for the trends and the follower suggestions are still missing.

My solution depends on a background task and an inject task. Lets have a look at the background task first.

/*
 * Listens on the complete event of a tab reload and executes the inject.js script.
 */
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
  if (changeInfo.status == 'complete') {
	chrome.tabs.executeScript(tab.id, {
	  file: "src/inject/inject.js"
	})
  }
})

This code adds a new listener to the onUpdated event of every Chrome tab. If a website in a new or existing tab gets updated and after this update process completes, the code within the if statement gets executed. This injects and executes a new script in the context of the page inside the particular tab.

This Inline.cs file does the whole magic. The code is listed below.

/*
 * Searches for the 'module trends' class name, which is used for the Twitter trends div element.
 * If this div is found, it gets removed from the document DOM.
 */
 
// Some magic string constants
var trendsClassName = 'module trends'
var whoToFollowClassName = 'module roaming-module wtf-module js-wtf-module'
 
chrome.storage.sync.get({
    trends: true,
    whoToFollow: false
}, function(items) {
    
	var trends = items.trends
	var whoToFollow = items.whoToFollow
	
	var trendsElement = document.getElementsByClassName(trendsClassName)
    var whoToFollowElement = document.getElementsByClassName(whoToFollowClassName)
	
	if (trendsElement.length == 1 && trends) {
        trendsElement[0].remove()
    }
	
    if (whoToFollowElement.length == 1 && whoToFollow) {
	    whoToFollowElement[0].remove()
    }
})

First the two options are loaded so the user can decide if the Twitter Trends and/or the Who to Follow box are terminated or not. Next the DOM is searched by the getElementsByClassName method to find those special div elements. If they’re found and the option says the element should get removed, the DOM is manipulated.

Thats all. Nothing more, nothing less. About 40 lines of JavaScript code get rid of the Twitter Trends and the Who to Follow box.

Of course there’s a little bit more JavaScript and HTML code for the option page but thats not much. I just refer to the GitHub repository Twitter-Trends-Terminator because this Chrome extensions is open source.

Installation

Since yesterday, the extension is listed in the Chrome Web Store. Just access it through this link and search for the extension called Twitter Trends Terminator. You should get a page like showing in image 1.

Image 1: The Twitter Trends Terminator in Google Chrome Web Store.

Image 1: The Twitter Trends Terminator in Google Chrome Web Store.

Because I don’t know how long this extension is available in the store – maybe Twitter don’t like it :) – you can download a Chrome package via the GitHub repository.

Results On The Twitter Page

After this extension is activated, the Twitter homepage just needs a single refresh. For example by hitting F5 in Chrome. Maybe this behavior gets updated someday, so that the page is refreshed automatically.

Image 2 contains a screenshot of the new Twitter homepage. In this case without the trends and the Who to Follow box.

Image 2: The Twitter Trends Terminator in action.

Image 2: The Twitter Trends Terminator in action.

Those div elements gets removed from the page every time you refresh the page. And of course only on the Twitter homepage, because the extension only has access to the Twitter URL.

Conclusion

After some time of research it was very easy to implement the removal of those two div elements. I’m not quite sure if I want to add more functionality. At this time I don’t think I’ll add much more. Maybe some improvements for the options and some other features that can change the Twitter page in another way.

But the code demonstrates how its possible to change the DOM of any page. It’s easy to remove special tweets just to mention another example.

Happy using and coding :). Don’t hesitate to provide some feedback or create an issue on the issue page of the repository if somethings not working.

Martin Richter: Was nicht alles mit dem schönen alten CMD.EXE geht: Ein Verzeichnis mit dem Datum im Format YYYY.MM.DD anlegen

Man lernt nie, aus. In dem Fall betrifft es ein wenig die Batch-Programmierung mit CMD.EXE.

Für einen Batch, der einen Teil eine Datensicherung eines Hyper-V Servers machen sollte benötigte ich ein Verzeichnis mit dem Tagesdatum, aber im Format YYYY-MM-DD. %date war mir bekannt und auf unseren Rechner liefert das aber, DD.MM.YYYY.

Ein wenig Suche im Netz brachte mich zu Substring-Funktionen bei der Variablenersetzung, die ich noch gar nicht kannte. Hängt man hinter eine Variable Doppelpunkt und Tilde kann man Startposition und Länge eines Substrings angeben.

Entsprechend ist der Batch also ganz schnell geschrieben ;) :

SETLOCAL
SET TargetDir=D:\BackupHyperV %date:~6,4%.%date:~3,2%.%date:~0,2%
MD "%TargetDir%"

Copyright © 2010 Martin Richter
Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.
(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)

ppedv Team Blog: Windows 7/8 zeitgesteuert hochfahren

Back-up-Programme sollen z.B. Daten dann sichern, wenn man nicht am PC arbeitet. Den Rechner hierzu nachts zu einer bestimmten Uhrzeit hochzufahren ist die Lösung - wie es geht, erfahren Sie hier.

Aufgabenplanung starten:

Start anklicken, bzw. in Windows 8 die Windows-Taste drücken, Aufgaben planen eingeben und im neuen Dialogfenster rechts in der Leiste Aufgabe erstellen auswählen.

 

clip_image002 clip_image004

Nun geben Sie einen Namen im Feld „Name“ ein, z.B. „Zeitschaltuhr“, wählen Sie aus „Unabhängig von der Benutzeranmeldung ausführen“ und aktivieren Sie „Mit den höchsten Privilegien ausführen“.

clip_image006

Wecker einstellen:

Begeben Sie sich nun zum Reiter „Trigger“ und klicken Sie auf „Neu“. Nun wählen Sie aus, an welchen Tagen zu welcher Uhrzeit der PC starten soll.

clip_image007

Nun wählen Sie den Reiter „Aktionen“ aus und „Neu“. „Programm starten“ muss als Aktion eingestellt sein. Im Feld „Programm/Skript“ geben Sie ein: /c “exit“, klicken auf OK und Ja.

clip_image008

Jetzt klicken Sie den Reiter „Bedingungen“ an und aktivieren die Option:
Computer zum Ausführen der Aufgabe reaktivieren“ und OK.

Einstellung „Aufgabe nur starten, falls Computer im Netzbetrieb ausgeführt wird“ deaktivieren Sie.

clip_image010

Abschließend wird eine Kennworteingabe nötig sein, um den Vorgang abzuschließen.

clip_image011

Energieoptionen ändern:

Drücken Sie die Windows-Taste und geben Sie das Wort: „Energie“ ein, um den Befehl „Energiesparplaneinstellungen ändern“ auszuwählen.

clip_image013

Es folgen ein Klick auf „Energiespareinstellungen ändern“ und „Erweiterte Energieeinstellungen ändern“.

Im Dialogfenster klicken Sie vor das Pluszeichen „Energie sparen“ und klappen „Zeitgeber zur Aktivierung zulassen“ an, um „Aktivieren“ auszuwählen.

clip_image015

Nach dieser Einstellung wählen Sie im oberen Bereich des Fensters „Zurzeit nicht verfügbare Einstellungen ändern“ aus, um dann abschließend die Einstellung „Kennwort bei Reaktivierung anfordern“ auf „Nein“ zu setzen.

clip_image017

clip_image019

Den Ruhezustand nutzen:

Damit das Aufwachen des PC ausgeführt werden kann, beenden Sie nun die Windows-Sitzung, indem Sie in den Ruhezustand wechseln. Sofern nicht konfiguriert, nehmen Sie im Dialogfenster Energieoptionen die folgenden Einstellungen vor.

clip_image021

Fertig!

Viel Spaß beim Anwenden

Holger Schwichtenberg: Microsoft Technical Summit 11.+13.11.2014 in Berlin

Microsoft veranstaltet unter dem Namen "Microsoft Technical Summit 2014" am 11.-13.11.2014 in Berlin eine Konferenz für Softwareentwickler und Infrastrukturexperten.

ppedv Team Blog: SPA Formulare mit Angular.js

Das Formular ist nach wie vor der Standard-Anwendungsfall jeder Geschäftsanwendung. Dank der wirklich intelligenten Binding Engine von Angular und den dynamischen Eigenschaften von JavaScript geht das auch mit minimalem Programmieraufwand von der Hand.

Dem MVx Entwurfsmuster folgend, werden die Daten über einen Controller (à la ViewModel) der HTML5-Sicht zu Verfügung gestellt. Ein Controller ist ein Stück JavaScript Code, das in der Regel in einer eigenen Datei ausgelagert wird. In diesem Fall befindet sich der Code innerhalb des HTML Dokuments. Wenn es sich um wenige Code-Zeilen handelt, könnte das sogar die bessere bzw. schnellere Option sein.

Startpunkt einer SPA ist das Modul, das einen oder mehrere Controller enthält.  Der Controller verweist auf die (in diesem Fall willkürlich) ident benannte Methode. Diese ist sozusagen der Constructor, wird also einmalig und automatisch aufgerufen, wenn der Controller im HTML referenziert wird. Wie in JavaScript typisch, wird einem Objekt, das hier $Scope genannt wird, dem DataContext entspricht, eine Eigenschaft und ein Methodenzeiger saveMe zugewiesen.

   1:     <script src="Scripts/angular.js"></script>
   2:      <script>
   3:          angular
   4:          .module('App', [])
   5:          .controller('myController', myController);
   6:          function myController($scope)
   7:          {
   8:              $scope.person = {};
   9:              $scope.saveMe=function(person)
  10:              {
  11:  alert(person.name);
  12:              };
  13:          }
  14:      </script>
  15:  </body>

 

Die HTML Seite beginnt mit dem ng-app Attribut und dem ng-Controller, der auf den Controller-Namen verweist.

Binding wird ähnlich zu XAML mit {} deklariert, nur eben in doppelter Form. Da JavaScript-Objekte nicht streng typisiert sind, kann man nun einfach ein fiktives Objekt, hier einfach person genannt, verwenden. Das ist für den Objektorientierten oder Prozeduralen Entwickler kaum zu akzeptieren. Dem fiktiven Element kann man auch Eigenschaften andichten. Aus fiktiv wird in Zeile 4 aber Ernst. Diese Zeile dient nur zur Demonstration der Binding-Funktion. Diese wird adhoc aktualisiert, wenn sich der Wert ändert.

In dem Eingabefeld wird die Bindung per ng-model an das idente (Achtung: case-sensitiv) person-Objekt vorgenommen. Sobald der Benutzer etwas tippt, wird auch die Anzeige im Div refreshed.

   1:  <body ng-app="App">
   2:      <div ng-controller="myController">
   3:          <form name="form1" novalidate>
   4:              <div>{{person.id}} -{{person.name}} -
{{form1.$invalid}}</div>
   5:              <input required ng-model="person.id" /><br />
   6:              <input required ng-model="person.name" 
ng-minlength="2" /><br />
   7:              <button ng-click="saveMe(person)"
   8:                      ng-disabled="form1.$invalid">
   9:                  Speichern
  10:              </button>
  11:          </form>
  12:    </div>

Die Eingaben müssen überprüft werden, bevor die Daten über einen REST Calll an den Server geschickt werden. Für diesen Form Validation Prozess gibt es leider viel zu viele Möglichkeiten. HTML Form Input Validation, hier mit dem Attribut required. Diverse JQuery Plugins und auch Angular hat Validierungsattribute. ng-minlength ist eine Direktive, die darüber wacht, dass die Aktualisierung des Models Person erst erfolgt, wenn sie mindestens zwei Zeichen lang ist.

Allerdings passiert das völlig im Hintergrund. Die Visualisierung der Regeln und das Feedback zum Benutzer muss selbst erstellt werden. Über eine Bindung zum Form und der $invalid-Eigenschaft, kann man z. B.  den Submit-Button deaktivieren. Aus UX-Sicht ist das jedoch keine gute Praxis, da der Grund nicht leicht erkennbar ist.

Drückt der Benutzer auf Speichern, wird das person-Objekt als Parameter in der Save-Methode übergeben. Diese wird ebenfalls per Angular Directive erstellt.

Dies und noch einiges mehr wird Thema des Single Page Application Workshops mit Angular und ASP.NET sein, den ich auf der #ADCX halten werde.

Norbert Eder: Anforderungen an die Produktentwicklung

Produktentwicklung ist eine richtig schwierige Angelegenheit und birgt zahlreiche Gefahren in sich. Da bedarf es nicht nur ordentlicher finanzieller Mittel, sondern auch einiges an Mut. Mut zu Entscheidungen, die gerade den ersten Kunden nicht wirklich gefallen werden.

The post Anforderungen an die Produktentwicklung appeared first on Norbert Eder.

Holger Sirtl: eBook: Developing Big Data Solutions on Microsoft Azure HDInsight

Die Microsoft Patterns & Practices Group hat vor kurzem ein interessantes eBook zum Thema Microsoft Azure HDInsight veröffentlicht. Dieses behandelt die in Microsoft Azure implementierte Variante des Open-Source Apache Hadoop Frameworks.

Das Buch gliedert sich in drei Abschnitte:

  • Kapitel 1: Understanding Microsoft big data Solutions
    Hier beschreiben die Autoren, was es mit Big Data Lösungen auf sich hat, und gehen auf die Unterschiede zu traditionellen Datenbanklösungen ein. Der Abschnitt enthält grundlegende Empfehlungen für den Entwurf von Big Data Lösungen. Dabei wird auch die Frage behandelt, wann Big Data Lösungen sinnvoll sind.
  • Kapitel 2: Designing big data solutions using HDInsight
    Dieser Abschnitt beschreibt ganz allgemein den Entwurf von Batch-basierter Datenverarbeitung. Auch wenn später kein HDInsight eingesetzt wird, gibt dieses Kapitel wertvolle Empfehlungen zum Aufbau eigener Big Data Lösungen.
  • Kapitel 3: Implementing big data solutions using HDInsight
    In diesem Kapitel wird detailliert beschrieben, wie sich HDInsight Datenverarbeitung implementieren lässt und wie die Ergebnisse zu Visualisierungstools und Datenspeicher (Datenbanken, Data Warehouses, Enterprise BI Systeme) weiterleiten lassen.

Folgende Zugriffsoptionen stehen für das eBook zur Verfügung:

Ilker Cetinkaya: Skill Of Refactoring

Refactoring is not a task, it is a skill. As simple as it is, as hard it is.

Refactoring is often referred to as "improving things". Many developers explicitly mention it. "We need to refactor this", "This cries for refactoring", "We need time to refactor" or even "Let's refactor this later" are sentences developers say and here often in their daily worklife. Those sentences are full of misunderstandings and lack of knowledge.

Semantics

First of all, let's define refactoring. To put it simple, refactoring is changing the code without changing the behavior. A refactoring changes the structure (or layout) of the code without changing the functionality of the code in question.

Apart of that, many developers refer to "refactoring" but mean something different. The term "refactoring" is used often to denote substantial technical changes, such as redefining interfaces, changing the system component infrastruture or even replacing old code with a new implementation.

However, all of those things are no refactoring at all. They're simply "rewriting" things. A rewrite is a partial or complete reimplementation of an existing implementation. It involves ditching old stuff and replacing it with new stuff. In contrast, a refactoring is transforming the old code step by step.

Skill Of Refactoring

One important thing about refactoring surely is the ability to refactor. Although this topic is easy to cover, it is often widely misunderstood.

There is no ability for refactoring. Every developer who is able to write code is able to refactor as well. There is no such thing as developers not being able to refactor. There are only developers who do not refactor for various other reasons. Lack of understanding, lack of trust, lack of time, lack of tests, lack of motivation. To put it very straight: there is no developer who is not able to refactor.

That being sorted out, it still often is the case that nobody does refactoring although everybody is developing. How come? We have a manifold of possible answers to this question, but there surely are common scenarios for the lack of refactoring.

Top 3 Reasons Refactoring Is Not Done

  • "We don't have time to refactor"
    One might surely think that this is just a lame excuse. And in fact, sometimes it really is a lame excuse. Sometimes, however, it is not a lame excuse but an evidence of damaging pressure upon the developer (or team). This is a rather frequent scenario. The business is in need of features, fast release cycles and constant innovation. How does refactoring fit into such a tight schedule at all? It starts to fit into the schedule when pressure is replaced by demand.
  • "We are going to rewrite this spaghetti later"
    Another classic excuse. In the credo of "let sleeping dogs lie", the muddy bits aren't going to be touched at all. The business version of this reason is "It satisfies our requirements. We have other priorities.". The truth behind this argument is simple: There is no understanding and consensus about quality, mostly even at both sides of the river.
  • "I didn't write this code"
    Another classic, frequent saying. Contrary to the previous reasons, this really is no excuse at all, but a very clear sign that the developer has an improper understanding of his job objectives and economic justification. A professional developer does not own a single line of code he is writing. He is just there to write code for other people who are not able or willing to do so on their own. That's it. That being said, it becomes very clear that collective code ownership is a promise for quality of the development team for their business sponsors.

Now the vital point here is to ask "How can we establish continuous and merciless refactoring?". Again, we have plenty of valid answers to this question. Let's investigate options which prove to be useful in many different scenarios.

Top 3 Measures To Establish Refactoring

  • Define the "quality of code"
    Make an open, transparent definition about the quality of code (per product or project). If developers don't know what quality is expected, desired and payed for, every developer will work on the quality level he thinks to be appropiate for that code. Without a proper definition of quality demands from business, there is no point to go for any kind of quality activity, refactoring included.
  • Require refactoring for every task
    In agile world, this is a standard. Sometimes stated very explicitly using a definition of done, otherwise implicitly using agressive pair programming and software craftsmanship culture. The crucial point here is simply to put the refactoring of a program to the same level as the coding of a program. In simple words: restructuring existing code has the same (business) value as creating new code.
  • Do pair programming
    One of the most simple, yet most effective measures is to do pair programming. If a developer has a buddy during his task, he will be challanged and supported by him. This in fact does not only foster common understanding and share of knowledge. As a matter of fact, pair programming implicitly lowers the value of the single developer in favor of raising the value of the code being developed. Hence, the probability of refactoring is at least a few times higher with pair programming applied as in contrast to single-headed programming.

Finally, and probably most importantly, one single question is at least to be considered on the topic of refactoring: Why should we do refactoring?. In other words: why is changing the structure of a program as important as creating it?

Top 3 Reasons For Refactoring

  • Maintenance
    The topmost reason for refactoring is maintenance of software. Refactoring adresses several perspectives of maintenance. First, it raises the value of existing software to the same level as new software. Both from technical and business point of view. Even more, it lowers the cost of maintenance significantly by demanding a certain quality of readability and simplicity for the code.
  • Speed Of Development
    This is an argument which is often misunderstood or ignored. The practice of refactoring does not slow down software development, but does in fact increase the speed of software development. There is a simple metaphor to explain it: If you are a chef of a cuisine, you need to deliver high quality dishes in reasonably fast time. In order to deliver this performance, you need a great level of organization and hygiene in your kitchen. However, if you don't constantly care about cleaning up your desk, washing your tools and having your pans and pots at the right place, both your performance and your results will suffer - or even become practically without value in economic terms.
  • Flexibility
    Code crafted with continuous refactoring most often is a lot more flexible than code with no refactoring applied. The reasons for this observation are reduced complexity and size of code, improved modularization or composition of software components and constant questioning of system design on low abstraction levels. The non-surprising results are flexibility both in terms of changing the software as well as integrating new business demands into existing software.

Conclusion

Every serious and professional software engineering needs to consider refactoring as a key component for successful software development. Apart from the obvious technical benefits, the business value of refactoring can be considerably high or even can be a significant dimension to the overall success of the product. Refactoring (or the lack thereof) most often is not depending on the capabilities of the software development forces, but is depending on the quality demands of the business and organizational excellence on operational level.

I for one think that refactoring is a skill. It is a skill of any developer. More than that, refactoring is a skill of the entire organization. All stakeholders need to be aware of the consequences and benefits refactoring brings to the table. Especially the business sponsors play a vital role to utilize refactoring and benefit from this modern practice of software development.

I think refactoring is crucial for successful software.

Sven Hubert: Neues WordToTFS-Release (4.2) verfügbar

Zunächst einmal vielen Dank an die Nutzer von AIT WordToTFS für das konstruktive Feedback und natürlich auch das große Interesse daran. Wir fühlen uns erneut bestätigt, dass wir mit der kostenfreien Word-Erweiterung für den Team Foundation Server einen Mehrwert bieten können. Heute hat die Version 4.2 das Licht der Welt erblickt und wir möchten die Gelegenheit nutzen, auf ein paar nennenswerte Neuerungen aufmerksam zu machen.

Den Schwerpunkt setzen wir mit dieser Version auf den Bereich Test Management und die damit verbundenen Report-Möglichkeiten.

Test Specification Report auf Basis einer Work Item Query

Die Möglichkeit, eine Testspezifikation zu erstellen, ist mit dem aktuellen Release um eine Möglichkeit reicher geworden. Bisher konnte man eine Testspezifikation auf Basis eines Testplans mit seinen Testsuiten erzeugen (siehe Abbildung 1).

Abbildung 1: Test Spezifikation auf Basis eines Testplans

Abbildung 1: Test Spezifikation auf Basis eines Testplans

Wie man jedoch Testpläne strukturiert, ist sehr unterschiedlich und hängt vom jeweiligen Szenario ab. Um bei der Erzeugung der Testspezifikation etwas flexibler zu sein, kann man diese nun auch mittels einer Work Item Query erstellen. Dann ist das generierte Dokument nicht an die Struktur im Test Plan gebunden. Hierfür gibt es im WordToTFS Ribbon einen neuen Menüpunkt Test Spec Report By Query (siehe Abbildung 2).

Abbildung 2: Neuer Menüpunkt Test Spec Report By Query

Abbildung 2: Neuer Menüpunkt Test Spec Report By Query

Die neue Möglichkeit zur Test Spec Generierung lässt sich ähnlich der Get Work Items Funktionalität bedienen. Man kann Work Items wahlweise per Work Item Query, ID oder Suche nach dem Titel auswählen (siehe Abbildung 3).

image

Abbildung 3: Neues Fenster Test Specification Report By Query

 

Neue Optionen für den Test Result Report

Während der Test Specification Report eine Beschreibung der durchzuführenden Tests in Dokumentenform beschreibt, bietet der Test Result Report die Möglichkeit die Testergebnisse in einem Word-Dokument darzustellen. Hierbei haben wir zwei wesentliche Erweiterungen vorgenommen.

Mit der Option Include Test Configurations konnte man bereits in den bisherigen Versionen eine Tabelle in das Dokument einfügen lassen, welche die im Testplan verwendeten Test Configurations anzeigt. Je nach Umfang des Testplans kann es sein, dass die wiederholte Darstellung der Test Configurations sinnvoll ist. Zum Beispiel erleichtert dies bei einem sehr langen Dokument die Lesbarkeit, weil man nicht immer zurückspringen muss. Im regulierten Umfeld, z.B. im medizintechnischen Bereich, kann es sogar sein, dass ein Test Result Report von verschiedenen Personen unterzeichnet werden muss. Je nach Zuständigkeit kann man diese Trennung dann mittels der Test Suites abbilden. Um dazu die Test Configurations bei jeder Test Suite anzuzeigen, gibt es die neue Auswahlmöglichkeit zwischen Above TestPlan und Beneath TestSuites zu unterscheiden (siehe Abbildung 4).

Abbildung 4: Neues Option bei Include Test Configurations

Abbildung 4: Neues Option bei Include Test Configurations

Eine weitere Neuerung im Test Result Report ist, die letzten Test Results verschiedener Test Configurations anzuzeigen. Bislang konnte sich der Anwender entscheiden, ob man alle verfügbaren oder nur die aktuellsten Test Results anzeigen möchte. Da in vielen Fällen bei wiederholter Testausführung nur die letzten Testergebnisse von Bedeutung für die Dokumentengenerierung sind, wurde die Möglichkeit auf die letzten Testergebnisse zu filtern, gerne genutzt.

Doch wie geht man damit um, wenn man verschiedene Test Configurations hat? Z.B. führt man den Test auf unterschiedlichen Betriebssystemen durch. Dies bildet man typischerweise mit den Test Configurations im Testplan ab. Um auch hier etwas mehr Flexibilität zu bieten, kann man die Einschränkung, dass man nur die letzten Testergebnisse sehen möchte, noch näher spezifizieren. Mit der Checkbox For all selected configurations (siehe Abbildung 5) erhält man die letzten Test Results je Test Configuration.

image

Abbildung 5: Anzeige der letzten Testergebnisse je Test Configuration

Die letzte Neuigkeit bei den Test Result Reports bezieht sich auf die Anzeige von Bugs, die mit den Test Cases verknüpft sind. Auch wenn wir uns alle wünschen, dass Tests immer den Status Passed erhalten, so kommt es in der Praxis doch hin und wieder vor, dass ein Test fehlschlägt. Da der Tester von heute in diesem Falle gleich ein entsprechendes Work Item (z.B. Bug) anlegt, möchte man dem Test Result Report auch diese Information entnehmen können. Auch dies hat in der bisherigen Ausbaustufe bereits funktioniert, jedoch konnte man als Konsument des Reports lediglich erkennen, dass es entsprechende Bugs zu einem bestimmten Test Case gibt.

Wenn man jedoch wie oben beschrieben, mit unterschiedlichen Test Configurations testet, so kann man in dem Report nun auch darstellen, zu welchem einzelnen Test Run ein Bug gehört. Dies ist insbesondere für manuelle Nachtests, nach Beseitigung des Problems sehr hilfreich.

 

Neue Pre- und PostOperation

Zur besseren Formatierung der Test Specification Reports sowie der Test Result Reports ist eine neue Operation hinzugekommen. Neben den existierenden Operations, die sich vor (Per) oder nach (Post) einem Template ausführen lassen, wie z.B. InsertParagraph, DeleteCharacterLeft & Co., kann man mit der neuen Operation InsertNewPage einen Seitenumbruch erzwingen. Abbildung 6 zeigt einen aktuellen Ausschnitt aus der WordToTFS-Dokumentation in der alle nun verfügbaren Operations aufgelistet sind.

image

Abbildung 6: Verfügbare Pre- und Post-Operations

Dies dient ebenfalls der Lesbarkeit, da man so z.B. mit jeder Test Suite eine neue Seite beginnen kann. Abbildung 7 zeigt exemplarisch die generelle Verwendung der Pre- und Post-Operations.

image

Abbildung 7: Generelle Verwendung der Pre- und Post-Operations

Weitere Verbesserungen

Neben den vorher aufgeführten Neuerungen ist auch noch einige Verbesserung in existierenden Funktionen zu verzeichnen. Wir hatten mehrfach Rückmeldungen zu s.g. Ghost Revisions. Dabei wurde die Revisionsnummer eines Work Items erhöht, ohne dass es eine für den Anwender sichtbare Veränderung gegeben hat. Ursächlich für dieses Verhalten sind die Unterschiede in der Behandlung von HTML-Feldern.

Außerdem wurden bestimmte Inhalte in den Test Steps nicht richtig dargestellt. Auch an dieser Stelle sind in dieser Version Verbesserungen enthalten.

Zum Schluss freuen wir uns, dass die Performance beim Publish von Work Items aus Word in den TFS deutlich gestiegen ist. Insbesondere bei der s.g. Publish Selected Funktion, bei dem gezielt nur einzelne Work Items zum TFS übertragen werden (siehe Abbildung 8), sind massive Verbesserungen erzielt worden.

image

Abbildung 8: Publish Selected

Update laden

ACHTUNG: Das Update bezieht sich ausschließlich auf die Hauptversion 4. Details zu den Versionen sind auf der Webseite http://www.aitgmbh.de/wordtotfs zu finden.

Wer WordToTFS noch nicht installiert hat, kann sich unter vorher genannter URL kostenfrei registrieren und die Anwendung herunterladen.

Für alle Nutzer der Versionen 4.0 oder 4.1:

WordToTFS sucht in der Standardinstallation regelmäßig nach Updates. Wenn Ihnen diese Zeit zu lange dauert, können Sie das Update auch manuell starten. Dazu einfach in Word im WordToTFS Ribbon den Update Button (siehe Abbildung 9) betätigen.

image

Abbildung 9: Update manuell starten

Sie können ganz leicht feststellen, ob die aktuelle Version installiert ist. Dazu einfach den About-Dialog über das WordToTFS Ribbon öffnen. Sehen Sie dort die Version 4.2.* (siehe Abbildung 10), wurde das Update bereits erfolgreich installiert.

image

Abbildung 10: About-Dialog mit der neuen Versionsnummer

 

Wir freuen uns über jegliches Feedback zu WordToTFS. Gerne stehen wir Ihnen zur Seite, sprechen Sie uns einfach an.

Neues WordToTFS-Release (4.2) verfügbar is a post from: AIT Blog

ppedv Team Blog: Weitere neue Dienste in Microsoft Azure

Azure Storage bietet jetzt einen zonenredundanten Speicher (ZRS Zone Redundant Storage). Dieser Speicher ist zwischen dem Lokal Redundanten Speicher (LRS) und dem Geographisch Redundanten Speicher (GRS) einzuordnen. Bei dem Zonenredundanten Speicher werden mehrere Kopien der Daten repliziert. Mehr Informationen finden Sie unter http://azure.microsoft.com/en-us/services/storage/.

Die Azure SQL Datenbank unterstützt nun folgende neuen Dienste:

  • Geo-Restore: Damit können Sie im Katastrophenfall Ihre SQL-Datenbank in jeder beliebigen Azureregion wieder herstellen. Geo-Restore verwendet dabei georedundanten Azure Blobspeicher für tägliche Backups der Datenbank und ist in allen Editionen enthalten.
  • Standard Georeplikation: Mit dieser Option können Sie alle Ihre Daten asynchron in eine zweite Datenbank replizieren, die in einem mindestens 500 Meilen entfernten Rechenzentrum liegt. Im Katastrophenfall können Sie sofort auf dieser weiteren Datenbank weiterarbeiten. Der Preis für die zweite Datenbank liegt bei 75 % der Kosten der primären Datenbank. Diese Option ist nur für die Standard und Premium Version von SQL Azure verfügbar, nicht für die Basic-Edition.
  • Auditing: Das neue Audit Feature protokolliert alle Ereignisse, die auf der Datenbank auftreten. Mit Dashboardansichten und Berichten können Sie sich jederzeit einen Überblick darüber verschaffen, was auf Ihrer Datenbank passiert. Die Auditereignisse werden in Azure Storage gespeichert (für diesen Storage fallen zusätzliche Kosten an), der extra dafür eingerichtet wird. Dieses Feature ist in allen Editionen von SQL Azure verfügbar.

Die Preise für den Notification Hub werden zum 1. September deutlich reduziert. In der Basic Version wird der Preis um 95 % und in der Standardversion um 50 % gesenkt. Die kostenlose Version unterstützt nun bis zu 1 Million kostenlose Pushnachrichten. Die genaue Preisinformation finden Sie unter http://azure.microsoft.com/en-us/pricing/details/notification-hubs/.

 

 

Holger Sirtl: Save the Date: Microsoft Technical Summit 2014 am 11./12. November 2014 in Berlin

Gleich mal vormerken: Am 11. und 12. November veranstaltet Microsofts  Developer Experience and Evangelism Group (DX) den ersten Microsoft Technical Summit in Berlin. Dabei führen wir unsere beiden wichtigsten Zielgruppen – Entwickler ung IT Pros – zusammen und stellen hierfür ein spannendes und interessantes Vortrags- und Workshop-Angebot zusammen. Wir werden alle brandaktuellen Themen abdecken, unter anderem:

  • Microsoft Azure IaaS und PaaS
  • Public, Private und Hybrid Cloud
  • .NET – what’s new, what’s coming
  • Windows Server und Windows Client
  • Big Data
  • und vieles mehr.

Die Vorträge finden sich in vier Tracks:

  • Data Platform and Business Intelligence
  • Datacenter and (Client) Infrastructure Management
  • Developer Platform and Tools
  • Apps & Devices

Hier nochmal die wichtigsten Eckdaten

  Microsoft Technical Summit
Termin: 11./12. November 2014 (Konferenz)
13. November 2014 (Workshops)
Ort: Best Western Premier Hotel MOA Berlin
Stephanstrasse 41
10559 Berlin Moabit
Web: www.technical-summit.de

Ich hoffe, wir sehen uns da!!!

Smiley 

Sven Hubert: TFS 2013 Update 3 (2013.3) – einige Neuerungen im Überblick

Einige Benutzer des Microsoft Team Foundation Servers 2013 haben bereits in den vergangenen Wochen den Release Candidate des Update 3 installiert. Nachdem in dieser Woche die finale Version (RTM) des Update 3 veröffentlicht wurde, werfen wir einen Blick einige der Neuerungen. Außerdem berichten wir über unsere Erfahrungen mit den ersten Updateinstallationen.

Genauer gesagt sind gleich mehrere Updates von Microsoft veröffentlicht worden. In diesem Beitrag fokussieren wir uns auf den Team Foundation Server. Einen ersten Eindruck über das Visual Studio 2013.3 Update bietet der Beitrag von Christian Schlag im TFS-Blog.

Umfang der im Product Backlog eingeblendeten Elemente

Der erste Punkt, den auch wir in unseren Kundenprojekten immer wieder diskutiert haben, ist die Entscheidung, wann ein Backlog Item aus dem Product Backlog verschwindet. Die mit TFS 2012 eingeführten neuen Product Backlog Ansichten hatten ein Backlog Item aus dem Product Backlog ausgeblendet, sobald dieses einer konkreten Iteration zugeordnet worden ist und es den initialen Zustand verlassen hatte (z.B. von Zustand von New nach Approved verändert beim Product Backlog Item des Process Templates Microsoft Visual Studio Scrum). Mit der Version 2013 (RTM) des TFS hat Microsoft dieses Verhalten verändert, was bei einigen Anwendern für Verwirrung gesorgt hatte. Ab diesem Zeitpunkt wurden die Elemente solange im Product Backlog verblieben, bis sie ihren finalen Zustand (z.B. Done).

Wichtige Erkenntnis aus den Diskussionen: Beide Verhaltensweisen haben ihre Existenzberechtigung. Es gibt für beide Spielarten Pro- und Contra-Argumente. Diese wollen wir hier nicht diskutieren. Jedoch hat auch Microsoft dieses Feedback aufgenommen und dieses Verhalten in der TFS Version 2013.3 konfigurierbar gestaltet.

Wie in nachfolgend dargestellt kann man in der Backlogansicht mittels der Einstellung “In progress items” entscheiden, ob man diese noch im Product Backlog sehen möchte (Abbildung 1, “Show”) …

Abbildung 1: Show in progress items

Abbildung 1: Show in progress items

… oder ob man die Elemente, die bereits in Bearbeitung sind aus dem Product Backlog ausgeblendet haben möchte (Abbildung 2, “Hide”).

Abbildung 2: Hide in progress items

Abbildung 2: Hide in progress items

Die Standardeinstellung entspricht dem Verhalten, welches mit TFS 2013 RTM eingeführt wurde: “Show”. Ändert man diese Einstellung, so ist dies eine benutzerbezogene Änderung, die für den aktuell angemeldeten User und für die spezifische Backlogansicht im aktuellen Team gültig ist. Die verschiedenen Backlogebenen (Feature, Backlog Items) werden ebenso getrennt behandelt wie auch die Backlogansichten anderer Teams.

Konfigurierbarkeit von Test Plan und Test Suite

Eine weitere lang ersehnte Änderung ist die Konfigurierbarkeit der Objekttypen Test Plan und Test Suite. Hierfür hat Microsoft unter der Motorhaube einen größeren Umbau durchgeführt und die beiden Delinquenten auf den rechten Weg der Work Items geführt. Dadurch ergeben sich viele nützliche Möglichkeiten. Neben der Anpassung über die gewohnten Mechanismen z.B. mittels des Kommandozeilenwerkzeuges witadmin lassen sich Test Plans und Test Suites nun auch mittels Work Item Query erreichen.

Ein Blick in die Datei WorkItems.xml des Process Templates gibt letztlich Gewissheit, dass die beiden Typen nun tatsächlich als Work Item implementiert sind (siehe Abbildung 3).

Abbildung 3: Auszug der Datei WorkItems.xml

Abbildung 3: Auszug der Datei WorkItems.xml

Aus Anwendersicht äußert sich die Änderung wie folgt. Im Test Manager ist neben dem Properties-Menü des Test Plans noch ein scheinbar neues Menü namens Run Settings dazugekommen. Außerdem ist das Kontextmenü einer Test Suite um den Menüpunkt Open test suite reicher geworden (siehe Abbildung 4). Aber eins nach dem anderen…

Abbildung 4: Veränderte Menüs im MTM

Abbildung 4: Veränderte Menüs im MTM

Öffnet man die Properties eines Test Plans erhält man eine deutlich andere Ansicht als vor dem Update. Hier ist es jedoch entscheidend, auch den Client (MTM, Microsoft Test Manager) auf Update 3 zu aktualisieren. Zum Vergleich sind in Abbildung 5 beide Ansichten vor und nach dem Update dargestellt.

Abbildung 5: Test Plan Properties im MTM

Abbildung 5: Test Plan Properties im MTM

Auf der linken Seite sieht man die Test Plan Properties vor dem Update 3, auf der rechten Seite danach. Die Ähnlichkeit zu all den anderen Work Item Ansichten ist hierbei auf der rechten Seite deutlich erkennbar. Dies erklärt nun auch den neuen Menüpunkt Run Settings. Diese mit ihren Einstellungen für Diagnoseadapter & Co. waren bislang in den Test Plan Properties angezeigt. In dem Menü Run Settings haben diese Einstellungen nun eine neue Heimat gefunden.

Die Test Suite lässt sich nun ebenfalls einzeln mit ihren Metadaten anzeigen. Dafür ist der neue Kontextmenüeintrag Open test suite aus Abbildung 4 zuständig. Auch hierbei lässt sich die neu gewonnene Verwandtschaft zu den Work Items nicht mehr leugnen (siehe Abbildung 6).

Abbildung 6: Test Suite im MTM geöffnet

Abbildung 6: Test Suite im MTM geöffnet

Auch wenn sich die clientseitigen Ansichten massiv verändert haben, so kann man jedoch immer noch mit der “alten” Test Manager Version arbeiten, auch wenn der TFS bereits das Update 3 erhalten hat. Ändert man beispielsweise in einem Test Manager der Version 2013 RTM den Namen eines Test Plans, so funktioniert dies nach wie vor und im Hintergrund ändert sich das Title-Attribut des Test Plan Work Items. Es besteht also trotz der größeren Änderung an dieser Stelle nicht die Notwendigkeit auf einmal mit allen Clients umzusteigen. Detaillierte Informationen zur Kompatibilität zwischen Client- und Serverversionen sind in der MSDN dokumentiert. Aus der Erfahrung heraus ist es jedoch ratsam die Clients nach Möglichkeit mit der Serverversion einigermaßen synchron zu halten.

Man kann nun die Test Suite mit weiteren Attributen ausstatten und so z.B. für nachfolgende Bearbeitungsschritte verwenden. Ein möglicher Anwendungsfall ist dabei die Dokumentengenerierung mit dem kostenfreien Werkzeug WordToTFS bzw. die damit möglichen Test Reports. In wieweit man den Zustandsautomaten der Test Suites sinnvoll einsetzen kann, wird die Praxis zeigen. Aktuell hat das Test Suite Work Item in allen drei mit dem TFS ausgelieferten Process Templates die Zustände In Planning, In Progress und Completed. Wir sind schon auf die ersten Anwendungsfälle gespannt, die sich in den Projekten ergeben.

Erste Erfahrungen mit der Durchführung des Updates

Wir haben mittlerweile eigene Testumgebungen sowie erste Kundeninstallationen mit dem Update TFS 2013.3 ausgestattet. Zeitlich hat es dabei keinen spürbaren Unterschied gemacht, ob man von TFS 2013 RTM oder TFS 2013.2 gestartet ist. Auf einer virtuellen Testumgebung, gehostet über Hyper-V auf einem einigermaßen aktuellen Notebook mit SSD hat das Update ca. 1h gedauert. In einer relativ jungen Produktivumgebung mit noch sehr geringem Datenbankinhalt auf einem extrem gut ausgestatteten TFS, bei dem bereits das App Tier einen Xeon Quad Core 2,8 GHz mit 128 GB hat, konnte das Update sogar in 30 min durchgeführt werden. Ein entscheidender Punkt bei der Dauer ist jedoch die Datenbankgröße. Die entstehenden Updatezeiten können also auch deutlich größer ausfallen.

Dazu kommt dann noch die evtl. erforderliche Konfiguration neuer Features. Dabei ist je nachdem, von welcher Version man das Update startet mehr oder weniger zu tun. Diese Arbeiten sind jedoch weniger kritisch, da sie nicht zu einer Downtime des Gesamtsystems führen. Solange dieser Schritt nicht durchgeführt ist, können jedoch manche Features noch nicht genutzt werden, wie im nachfolgenden Beispiel zu sehen ist (siehe Abbildung 7).

image

Abbildung 7: Funktion noch nicht verfügbar

Im Beispiel aus Abbildung 7 ist das Update 3 auf eine TFS 2013 RTM Instanz installiert worden. Die bereits mit dem Update 2 zur Verfügung gestellte Funktionalität der Shared Parameters ist direkt nach dem Update noch nicht verfügbar. Hierfür ist mittels des integrierten Wizards nachzuhelfen, der über den Link Funktion konfigurieren erreichbar ist. Je nachdem, wie stark die verwendeten Process Templates angepasst sind, kann der Wizard auch an seine Grenzen kommen, so dass man manuell nachhelfen muss.

Weitere Links

Hier noch eine Liste, welche die direkten Links zu den aktuellen Versionen der einzelnen Produkte in der Visual Studio ALM Landschaft zur Verfügung stellt:

Ausführliche Beschreibungen weiterer Neuigkeiten sind unter anderem in den Blogs von S. Somasegar und Brian Harry sowie auf der Visual Studio Webseite zu lesen.

TFS 2013 Update 3 (2013.3) – einige Neuerungen im Überblick is a post from: AIT Blog

codefest.at [MS]: Introduction to Office 365 Development

Für schnell entschlossene Entwickler, die gerade nicht im Urlaub weilen, gibt es morgen, am 8. August, in der MVA (Microsoft Virtual Academy) ein sehr interessantes Live-Event mit dem Titel Introduction to Office 365 Development.

image

Die Online-Kurse liefern einen Überblick über Development für Office 365, von Apps für Office und SharePoint bis zu Full Trust Apps und Einblicke in die neue Office 365 API (siehe auch hier).

Das Event startet bei uns am Freitag, den 8. August, um 18 Uhr und dauert bis Mitternacht.

Das Team der Vortragenden kann sich sehen lassen: Jeremy Thake , Brian Jones, Richard diZerega, Scot Hillier und Steve Walker – alles bekannte Größen aus dem Office 365 Developer-Umfeld.

image

Viel Spaß!

ppedv Team Blog: Praktische Tastaturbefehle für Windows 8.1

In Windows 8.1 gibt es sehr viele einstellbare Optionen, welche teilweise, wenn man sich nur auf die Maus verlässt, erst nach unzähligen Menüs und Untermenüs zu erreichen sind. Um diesen Prozess zu verkürzen und zu erleichtern, bietet Windows die Möglichkeit an, einige wichtige Menüs, Einstellungen oder Funktionen mithilfe der Windows-Taste sofort aufzurufen.

Hier eine kleine (unvollständige) Auflistung einiger dieser Shortcuts.

 

Windows-Taste

wechselt zum Metro-Startmenü. Bei erneutem Drücken wechselt der PC zurück zur zuletzt verwendeten App.

image

 

 

Windows + D

zeigt den Windows Desktop an. Bei der Arbeit auf dem Desktop werden alle Fenster minimiert. Innerhalb der Metro-Oberfläche oder einer App wird auf die Desktop-Oberfläche gewechselt.

image

 

Windows + I

öffnet das Einstellungsmenü auf der rechten Seite.

image

 

Windows + X

öffnet das Menü, welches auch über einen Rechtsklick auf den Windows-Button erreichbar ist.

image

 

Windows + L

meldet den Benutzer ab. Sowohl von der Metro-Oberfläche aus, als auch vom Desktop.

 

Windows 8.1 Lockscreen

 

Windows + Q / Windows + W / Windows + F

bietet eine schnelle Suche nach allem (Q), Einstellungen (W) oder Dateien (F).

image

friends header

bloggers headline

links header

 
Don't contact us via this (fleischfalle@alphasierrapapa.com) email address.