Norbert Eder: Buch: Langlebige Software-Architekturen

Software-Architekturen werden gerne einmal vernachlässigt, in vielen Fällen gibt es auch keinen expliziten Architekten mehr. Microservices sind cool, also werden diese einfach eingesetzt – oder eine angelehnte Form derselben. Doch so einfach ist das nicht. Viele Projekte leben weit länger als gedacht – und das mit Problemen, die bereits in der Anfangszeit des Projektes gemacht wurden. Wie kann man diese erkennen und zielführend ausmerzen. Dieses Buch ist dabei eine große Hilfe.

Wenn man lange genug in der Branche ist, neigt man zu denken, man wüsste doch schon alles und hätte schon so gut wie alles gesehen. Dieses Buch zeigt aber eigene Schwächen lückenlos auf und bietet immer wieder einen passenden Ansatz um architekturell einen Schritt vorwärts zu machen.

Das kurzweilige Leseerlebnis macht es zudem einfach, dieses Buch auch mal zwischendurch zu lesen, oder ohne Ermüdung länger an einem Stück.

Von ganz besonderem Interesse sind die beschriebenen Praxisbeispiele, die tiefe Einblicke in Projekte und der notwendigen Herangehsenweise geben.

Wer nun Interesse hat, der kann sich das Buch gleich hier bestellen (Achtung, Amazon!): Langlebige Software-Architekturen: Technische Schulden analysieren, begrenzen und abbauen von Carola Lilienthal.

The post Buch: Langlebige Software-Architekturen appeared first on Norbert Eder.

MSDN Team Blog AT [MS]: Hier lernst Du kostenlos wie Du mit C#/XAML programmierst! (Update)

Du interessierst dich für die Entwicklung mit Xamarin? Du willst eine mobile Anwendung für alle mobilen Betriebssysteme entwickeln? Du verfolgst zufällig meine neue Xamarin University Serie auf Codefest? In diesem Beitrag wollen wir Dir eine kurze Zusammenfassung geben wo du am Besten und kostenlos lernen kannst mit C#/XAML zu programmieren. Ganz gleich, ob du ein Anfänger bist und einfach nur schnuppern willst oder ob Du Deine Fertigkeiten vertiefen willst. Du bist hier richtig!

Microsoft Virtual Academy (https://mva.microsoft.com/)snip_20170220151537

Die Microsoft Virtual Academy bietet dir 100+ kostenlose IT-Kurse von Experten an. Diese Kurse richten sich an Entwickler, IT-Profis, Daten Profis aber auch an Studenten. Für uns sehr interessant sind die Entwickler Kurse. Dabei steht Dir eine große Auswahl von Themengebieten zur Verfügung.

Die kostenlose C#/XAML Kurse findest du HIER. C# ist einfach, aber leistungsstark und ermöglicht das Erstellen von Windows-Apps, Webdiensten und weiteren Anwendungen. XAML vereinfacht das Erstellen der Benutzeroberfläche.

Dazu passend empfehlen wir Dir auch die Visual Studio Kurse. In diesen Visual Studio-Schulungen mit vielen Demos wirst Du Visual Studio verwenden um Windows Store-Apps, Desktop-Apps, mobilen Apps, ASP.NET-Web-Apps und XML-Webdiensten zu erstellen. Du lernst außerdem, wie du ALM-Funktionen (Application Lifecycle Management) in Visual Studio anwendest.

HIER nochmal der Link um zu den Downloads von den verschiedenen Visual Studio Versionen zu gelangen.

Hier ein kleiner Ausschnitt an ausgewählten Kursen:

Programmieren für Beginner mit C#

Der Kurs “Programmieren für Beginner mit C#” führt euch durch die ersten Schritte des Programmierens. In 8 Videos lernt ihr, wie ihr mit Hilfe von C# und Visual Studio eigene Programmierprojekte erstellen könnt und diese mit interessanten Funktionen ausstatten könnt.

01 | Einführung: Dieses Video gibt euch eine kurze Einführung in den Kurs.
02 | Vorbereitung und Grundlagen: Dieses Video macht euch kurz mit den Grundlagen zum Programmieren mit Visual Studio vertraut und zeigt die Installation von Visual Studio 2013 Express.
03 | Mein erstes Programm: In diesem Video lernt ihr, eure erste Konsolenanwendung in C# zu erstellen. Dazu wird eine C# Konsolenanwendung in VisualStudio 2013 Express erstellt und die Grundlagen der Visual Studio Oberfläche erklärt.
04 | Variablen und Werte: In diesem Video werden kurz die Grundlagen zu Variablen in C# erklärt und wie man mit diesen arbeitet. Ihr lernt verschiedene Datentypen von Variablen kennen und wie man mit diesen arbeitet.
05 | Entscheidungen: In diesem Video werden euch kurz die Entscheidungen vorgestellt, um euer Programm interaktiv zu gestalten. Es werden die 3 Entscheidungsanweisungen: if , if-else und switch vorgestellt und die jeweilige Funktionalität an Beispielen in einer Konsolenanwendung erläutert.
06 | Schleifen und Wiederholungen: In diesem Video werden euch Schleifen bzw. Wiederholungen vorgestellt, die es euch ermöglichen, effizienter und übersichtlicher Code zu schreiben. Dazu werden die 3 Schleifen: while, do-while und for vorgestellt und anhand von Beispielen in der Konsole die Vor-und Nachteile jedes Typs erläutert.
07 | Klassenstrukturen: In diesem Video lernt ihr Klassen und deren Inhalte zu erstellen und somit, effizienter und strukturierter Code zu schreiben. Anhand der selbst erstellten „Vehicle“-Klasse lernt ihr den Aufbau von Klassen kennen und lernt, wie man diese effektiv einsetzen kann.
08 | Grafische Anwendungen: In diesem letzten Video lernt ihr die Grundlagen im Umgang mit XAML in Verbindung mit C#. Hierbei wird eine WPF-Anwendung in XAML und C# erstellt, in die Elemente wie Buttons, Labels und Textboxen eingefügt werden. Danach werden die Eigenschaften dieser Elemente grundlegend erläutert und anhand von Beispielen erklärt. Als praktisches Beispiel wird ein kleiner Taschenrechner erstellt.

Xamarin für Anfänger

Du willst dein neues Wissen C# anwenden? HIER ein Anfänger Kurs über Xamarin, ebenfalls kostenlos verfügbar auf der MVA Plattform. In dieser Xamarin-Schulung für Anfänger erfährst Du mehr über die ersten Schritte. Von unseren Experten Heiko Zimmermann und Christoph Becker erhältst Du Informationen zu Installation und Einrichtung. Zudem werden die Grundlagen einer Xamarin-App behandelt. Du kannst dir ein Xamarin-Projekt ansehen, kannst Dich über die Verwendung von Emulatoren informieren und wirst die Themen Debugging und Bereitstellung durchgehen. Verpasse nicht diese Gelegenheit, Xamarin kennenzulernen!

01 | Wieso Xamarin?: In diesem Modul wird vorgestellt, wie Xamarin die traditionelle mobile Entwicklung verbessern kann sowie welche Vorteile und Produkte es bietet.
02 | Xamarin installieren: In diesem Modul sehen wir uns an, welche unterschiedlichen Lizenzen Xamarin anbietet sowie wie man die Software erhält und installiert.
03 | Xamarin nutzen: In diesem Modul wollen wir uns die Editoren Visual Studio und Xamarin Studio ansehen sowie unsere eigenen Geräte für die Entwicklung vorbereiten.
04 | Programmieren mit Xamarin.Android: In diesem Modul implementieren wir ein kleines Beispielprojekt als Android App.
05 | Shared Code und Shared Data: In diesem Modul erweitern wir unser vorangegangenes Beispielprojekt. Wir extrahieren unsere Logik in eine projektunabhängige Bibliothek und fügen eine Serververbindung hinzu.
06 | Programmieren mit Xamarin.iOS und Xamarin Forms: In diesem Modul wiederholen wir die Implementierung unseres Beispielprojekts in Xamarin.iOS und Xamarin Forms mithilfe unserer zuvor erstellten Bibliothek.

Spielerisch C# Lernen mit Windows 10

Du willst Dein erstes Spiel entwickeln und ganz nebenbei lernen, wie das mit den Windows 10-Apps und mit C# funktioniert? Dann bist du hier richtig! Hier ein Kleiner Überblick was dich erwartet:

01 | Projekt & Startseite erstellen: In unserem ersten Kapitel laden wir Visual Studio, erstellen ein neues Projekt und schauen uns die Werkzeuge an, mit denen Ihr Gestaltungselemente einbauen könnt.
02 | Ein Spielfeld mit Maulwurf: Zunächst brauchen wir ein Spielfeld, auf dem wir einen Maulwurf anzeigen. Deshalb lernen wir, wie wir zu diesem Zweck mit Grids arbeiten und wie wir ein eigenes Maulwurf-Objekt erstellen.
03 | Maulwurf wegklicken und Punkte zählen: Nachdem wir das Spielfeld mit Maulwurf erstellt haben, sollen Spieler den Maulwurf auch wegklicken können und dafür Punkte sammeln.
04 | Dem Spieler Leben geben und abziehen: In diesem kleinen Kapitel erweitern wir das Spielerobjekt um Leben, die wir mit Hilfe eines eigenen Steuerelements im Frontend anzeigen lassen.
05 | Spannung reinbringen und Game Over: Letztes Kapitel! Jetzt lassen wir noch mehr Maulwürfe auftauchen und geben dem Spieler dadurch die Gelegenheit, auch zu verlieren. Was soll passieren, wenn es heißt “Game Over”?


Du hast schon Deine ersten Erfahrungen mit Xamarin und C# gemacht dann schau vorbei auf unser neuen Xamarin University Facebook Seite für die neuesten Updates. Gerne bist Du eingeladen Deine Tipps und Tricks zu teilen.

Golo Roden: includes-Funktion in ES2016: Zurück zu den Grundlagen

Eine der beiden Neuerungen von ES2016 ist die includes-Funktion, mit der sich ermitteln lässt, ob ein Array ein gegebenes Element enthält. Zuvor musste man auf die indexOf-Funktion und den binären NOT-Operator zurückgreifen. Wie und warum hat das funktioniert?

Marco Scheel: Links for 2017-02-21 [del.icio.us]

Manfred Steyer: Der Router in Angular im Detail betrachtet: Unterlagen von Vortrag auf BASTA! Spring 2017 in Frankfurt

Nachfolgend die Unterlagen zu meinem Vortrag "Der Router in Angular im Detail betrachtet" von der BASTA! Spring 2017 in Frankfurt. Das Beispiel zeigt:

  • Hierarchisches Routing mit Child Routes
  • Aux Routes
  • Guards
  • Lazy Loading

Downloads:

Manfred Steyer: Durch die Schallmauer: Hochperformante Anwendungen mit Angular - Unterlagen von Vortrag auf der BASTA! Spring 2017 in Frankfurt

Nachfolgend findet man die Unterlagen meines Vortrags "Durch die Schallmauer: Hochperformante Anwendungen mit Angular" von der BASTA! Spring 2017 in Frankfurt. Die Beispiele zeigen:

  • Einsatz von Lazy Loading
  • Einsatz von Preloading
  • Datenbindungsperformance mit OnPush
  • AOT und Tree Shaking
  • Caching mit Service Worker
  • Serverside Rendering (Angular Universal)

Downloads:

Stefan Lieser: [Video] Softwareentwicklung ohne Abhängigkeiten – OOP 2017

Auf der diesjährigen OOP in München habe ich meinen Vortrag zum Thema Softwareentwicklung ohne Abhängigkeiten gehalten.

Der Beitrag [Video] Softwareentwicklung ohne Abhängigkeiten – OOP 2017 erschien zuerst auf Refactoring Legacy Code.

MSDN Team Blog AT [MS]: MARMIND – Die innovative Marketing Cloud Lösung auf Microsoft Azure

Wie erzeugen wir Aufmerksamkeit für unsere Produkte? Wo sollen wir unser Budgets investieren? Wie schaffen wir unseren täglichen Arbeitsaufwand? – Herausforderungen, vor denen Marketer jeden Tag stehen.

Was ist MARMIND?

MARMIND ist eine Marketing Software Lösung auf Microsoft Azure. MARMIND verbindet Kampagnen, Budgets und Ergebnissen zu einem zentralen Marketingplan.


Mehrmehrt & Vorteile

  • Kontrolle über Ihre Ausgaben
    Die Integration der Kampagnen, Kosten und Ergebnisse in ein System führt zu besseren Investments und erhöht die Marketing Performance
  • Standardisierung Ihrer Marketing Prozesse
    Die Standardisierung von Daten, Systemen und Technologien ermöglicht effizienteres Arbeiten und mehr Zeit für Kreatives
  • Effektive Kommunikation mit allen Teams
    Klare Verantwortlichkeiten im Team sorgt dafür, dass Kunden und Leads mit relevantem Inhalt angesprochen werden und erhöht die Verkaufschancen

MARMIND im Überblick

Der Kern von MARMIND ist ein zentraler Marketing Plan

Die verschiedenen Plan-Ansichten ermöglichen eine einfache Online Marketing Planung in der Cloud. Alle Projekte inklusive einzelner Aktivitäten, Kosten und Ergebnisse werden zentral verwaltet und im Team online abgestimmt.

marmind-1

 

 

 

 

 

 

 

 

 

 

Projektpläne für die übersichtliche Planung und Abstimmung von Projekten und To-dos

 

marmind-2

 

 

 

 

 

 

 

 

 

 

Kalenderansichten für die Übersicht über alle laufenden und geplanten Aktivitäten

 

Kosten und Ergebnisse in Echtzeit auswerten

Mit MARMIND können Sie einfach und übersichtlich Marketing Budgets und Kosten planen und den Erfolg der Kampagnen auswerten. Viele Datenquellen – von Social Media bis Website Tracking sind integriert. Auch externe Lösungen für E-Mail-Marketing, Social Media Monitoring etc. können via API angebunden werden.

marmind-3

 

 

 

 

 

 

 

 

 

Planung und Auswertung von Budgets, Kosten, Zielen und Ergebnissen

 

Effektive Kommunikation in Teams

Für die Planung und Umsetzung von Marketingmaßnahmen bietet MARMIND einfache Kommunikations- und Kollaborationsfunktionen. So lassen sich Aufgaben, Termine, Mitteilungen und Media Assets in gemeinsamen Listen verwalten und abstimmen.

marmind-4

 

 

 

 

 

 

 

 

 

Einfache Projektstrukturen und einfache Abstimmung in gemeinsamen To-do-Listen

 

Probieren Sie MARMIND aus!

Sie können MARMIND auf www.marmind.com in einer Trial Variante bis zu 3 Benutzern kostenlos testen. Die Varianten reichen von monatlich erweiterten Public Cloud Varianten ab 80,00 EUR pro Monat bis zu individuellen Enterprise Varianten (Private- oder Hybrid Cloud).

Für Fragen und Feedback steht das Team von UPPER Network gerne unter +43 1 804 88 333 50 oder support@marmind.com zur Verfügung, oder Sie können sich auch an Ihren Microsoft Ansprechpartner wenden.

MARMIND ist eine Software Produkt von UPPER Network©

UPPER Network ist seit 16 Jahren international erfolgreicher Anbieter von Software Technologien. Das Ziel von UPPER Network ist es, mit innovativen Lösungen und exzellenter Betreuung zu begeistern – vom Start-Up Unternehmen bis zum internationalen Konzern.

 

Viel Spaß beim Ausprobieren der Lösung auf Microsoft Azure.

Marco Scheel: Links for 2017-02-20 [del.icio.us]

Norbert Eder: Per Code mit TFS-WorkItems arbeiten

Installation TFS API Libraries

Um auf den TFS zugreifen zu können, ist das NuGet-Paket TeamFoundation.11 zu installieren.

PM> Install-Package TeamFoundation.11

Zugriff auf den TFS

Ist am Rechner ein Workspace bereits vorhanden, kann mit dem folgenden Code alles Notwendige für den Zugriff auf die WorkItems erstellt werden:

var collectionSource = new Uri("http://tfs-server:port/tfs/MyCollection");
var collection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(collectionSource);
var store = collection.GetService<WorkItemStore>();

Auch eine Authentifizierung mittels Username und Passwort ist möglich, hierzu sind die ClientCredentials der Collection zu setzen und die Authentfizierung manuell zu triggern:

NetworkCredential netCred = new NetworkCredential("UserName", "Password");
WindowsCredential winCred = new WindowsCredential(netCred);
TfsClientCredentials tfsCred = new TfsClientCredentials(winCred);

collection.ClientCredentials = tfsCred;
collection.Authenticate();

WorkItems vom TFS abfragen

Nun kann man sich mit der TFS WorkItem Query sämtliche WorkItems abfragen.

var query = "SELECT [System.Id], [System.Title] FROM WorkItems WHERE [System.ID] > 1000";
var items = store.Query(query);

In diesem Fall werden Id und Titel abgefragt und “als geöffnet” markiert. Änderungen an diesen Eigenschaften können somit vorgenommen werden.

Ein andere Möglichkeit besteht darin, sich alle Felder zurückgeben zu lassen.

var query = "SELECT * FROM WorkItems WHERE [System.ID] > 1000";
var items = store.Query(query);

Hier werden alle Informationen geladen, allerdings wird keine Eigenschaft “als geöffnet” markiert. Wird eine Eigenschaft aktualisiert und gespeichert, kommt es zu nachfolgender Ausnahme:

Microsoft.TeamFoundation.WorkItemTracking.Client.ValidationException: TF400276: You have tried to set a value for a field of a work item which is not opened or partial opened. You cannot set a value for a field of a work item which is not opened or partial opened.

Dies kann nun umgangen werden, indem zu aktualisierende Eigenschaften explizit in der Query angegeben werden, oder aber, indem das jeweilige Item mittels Aufruf der Methode Open geöffnet wird.

Auf benutzerdefinierte Eigenschaften zugreifen

Der TFS erlauft die Konfiguration von benutzerdefinierten Eigenschaften. Diese sind natürlich im Objektmodell nicht explizit bekannt. Das WorkItem bietet die Auflistung Fields an. Darüber können auch diese Felder abgerufen werden. Die Abbildung in der Datenbank sieht wie folgt aus:

TFS - benutzerdefinierte Eigenschaften

TFS – benutzerdefinierte Eigenschaften

Die benutzerdefinierten Felder werden fortlaufend nummeriert. Start ist 10000. Als Prefix wird für die DB “Fld” vergeben.

Um nun auf ein derartiges Feld zugreifen zu können, stellt die Auflistung Fields die Methode GetById zur Verfügung.

// item is WorkItem
var customFieldVal = item.Fields.GetById(10000).Value;

WorkItem speichern

Vorgenommene Änderungen können natürlich auch gespeichert werden. Dazu bietet das WorkItem die Methode Save an.

try {
  item.Save();
}
catch (ValidationException ex) {
  // handle exception
}

Beim Speichern werden Validierungsregeln angewandt und bei Nichterfüllung eine entsprechende Ausnahme geworfen.

Eine Prüfung im Vorfeld kann mittels IsValid und Validate (beides am WorkItem verfügbar) durchgeführt werden.

Sollen viele WorkItems aktualisiert werden, bietet sich eine Batch-Aktualisierung an, diese kann über den WorkItemStore durchgeführt werden:

var query = "SELECT * FROM WorkItems WHERE [System.ID] > 1000";
var items = store.Query(query);

...

store.BatchSave(items);

Finger weg von der Datenbank

Immer wieder findet man Beiträge, die Änderungen in der Datenbank vorschlagen. Davon ist Abstand zu nehmen, da die WorkItems über mehrere Tabellen hinweg gehalten werden (WorkItemsAre, WorkItemsLatest, WorkItemsWere). Direkte Änderungen können sich schnell fatal auswirken. Daher empfehle ich, immer über die API zu gehen.

Fazit

Dieser Beitrag hat zahlreiche Hilfsmittel für die Verwendung der TFS-API aufgezeigt. Damit sollten viele hilfreiche Szenarien einfach abzubilden sein. Ich denke hierbei an diverse Statistiken, Migrationen, Prozesse, die Informationen bei WorkItems hinterlegen usw. Tests sollten immer gegen ein entsprechendes Testsystem durchgeführt werden, aber das versteht sich von selbst.

The post Per Code mit TFS-WorkItems arbeiten appeared first on Norbert Eder.

Golo Roden: Einführung in Node.js, Folge 7: Callbacks verstehen

In Node.js gehört der Umgang mit asynchronem Code zum Alltag. Dazu greift man in der Regel auf den Einsatz von Callbacks zurück. Doch der Umkehrschluss gilt nicht: Nicht alle Callbacks sind asynchron. Woran erkennt man asynchrone Callbacks, und worauf gilt es bei ihrer Verwendung zu achten?

AIT: Neu in Visual Studio und TFS "15" / 2017: Neues fürs Testen in Update 1

In vorhergehenden Beiträgen unserer Serie zum Thema “Neu in TFS und Visual Studio 2017” wurden bereits zahlreiche neue Features für den Bereich des Testens beschrieben. Vor wenigen Tagen wurde nun wurde RC2 für Update 1 veröffentlicht, welcher wiederum zahlreiche Neuerungen mit sich bringt. Auf welche neuen Möglichkeiten Sie sich freuen dürfen, möchten wir Ihnen in diesem Blogbeitrag vorstellen.

 

Test Management

Für den Bereich des Test Managements bringt Update 1 im Wesentlichen zwei neue Features mit: Die erste Neuerung erleichtert die Arbeit mit einer Vielzahl an Test Plänen innerhalb eines Projektes.  So ist es nun möglich Test Pläne als Favoriten zu markieren (vgl. Abb. 1 (1)) um diese schneller wiederzufinden. Als Favoriten markierte Test Pläne können dann im Tab Favorites in der Test Plan-Auswahl (vgl. Abb. 1 (2)) und auf der neuen Account Home Page (vgl. Abb. 1 (3)) direkt ausgewählt werden.

Abb. 1:  Test Plan Favoriten

Die zweite Neuerung erlaubt es dem Nutzer Test Artefakte dauerhaft zu löschen.  Zu diesen gehören Test Pläne, Test Suiten, Test Cases, Shared Parameter wie auch Shared Steps. Um ein solches Test Artefakt zu löschen kann sowohl im Test– als auch im Work-Hub die Option Permanently delete des Kontextmenüs genutzt werden. Dabei werden alle mit dem Test Artefakt verbundenen Test Ergebnisse und im Falle von Test Plänen bzw. Test Suiten die darunterliegenden Test Suiten ebenfalls gelöscht (vgl. Abb. 2).

Die neue Funktion geht mit der neuen, zugehörige Berechtigung Delete test artifacts einher. Um von der neuen Funktion Gebrauch machen zu können muss diese auf Allow gesetzt sein und dem User muss das Access Level Advanced zugewiesen sein.

image

Abb. 2:  Löschen von Test Artefakten

 

Testausführung

Im Bereich der Testausführung bringt das Update ein lang ersehntes Feature mit sich. Bislang musste ein weiterer Tab oder ein weiteres Browserfenster parallel zur Testausführung geöffnet werden, um die Description des auszuführenden Test Cases lesen zu können. Mit dem neuen Update ist es nun endlich möglich diese während der Ausführung direkt im Test Runner ein-und auszublenden (vgl. Abb. 3). Dies ist besonders in Szenarien hilfreich, in denen zusätzliche, für die Testausführung benötigte Informationen im Description-Feld wie z.B. zu erfüllende Voraussetzungen oder Abhängigkeiten, dokumentiert sind.

SNAGHTML5b136ef

Abb. 3:  Einblenden der Test Case Description im Test Runner

Eine weitere nützliche Neuerung betrifft die Verlinkung von Bugs aus der Testausführung heraus. War es bislang aus dem Test Runner nur möglich neue Bugs anzulegen, so können nun auch bereits bestehende Bugs um Informationen aus dem Testlauf erweitert werden (vgl. Abb.4). Analog zum Anlegen neuer Bugs werden die Informationen über die bisher ausgeführten Schritte und die zugehörigen Ergebnisse in der Description festgehalten. Ist bereits eine Description vorhanden, so werden die Informationen am Ende angehängt. Des Weiteren werden der Test Case, das entsprechende Test Result sowie alle zusätzlichen Anhänge wie z.B. Action Log oder Screenshots, mit dem Bug verlinkt bzw. angehängt.

SNAGHTML5b2cbd7

Abb. 4:  Bestehende Bugs aus Test Runner verknüpfen

Möchte man nun zu einem späteren Zeitpunkt die Behebung eines aus einem Testlauf heraus verknüpften Bugs verifizieren, so bietet das Update 1 auch hier eine Lösung. Anstatt wie bislang zum verknüpften Test Case in der zugehörigen Test Suite zu navigieren , lässt sich der Test Case direkt aus der Bug Work Item-Form mittels der Option Verify ausführen (vgl. Abb. 5 (1)). Darüber hinaus kann im Anschluss an die Testausführung der Bug direkt im Test Runner aktualisiert werden, um so die neu gewonnen Ergebnisse direkt im Bug widerzuspiegeln (vgl. Abb.5 (2)).

image

Abb. 5:  Verify Bug

Für die Ausführung von automatisierten Tests innerhalb von JSON-Builds bringt das Update eine Preview der Version 2.* für den Task Visual Studio Test mit sich. Dieser enthält die neue Möglichkeit der Test Impact Analyse, wobei hierfür die neueste Visual Studio-Version vorausgesetzt wird (vgl. Abb. 6). Ist die neue Option aktiviert, werden nur Tests  im jeweiligen Build ausgeführt, welche benötigt werden um alle seit dem letzten Build eingecheckten Codeänderungen zu validieren. Hierbei lässt sich auch konfigurieren, nach welcher Anzahl ausgeführter Builds alle Tests ausgeführt werden sollen.

image

Abb. 6:  Test Impact Analyse

Auch für den Task Deploy Test Agent wird eine Preview der Version 2.* bereitgestellt. Diese erlaubt es Test Agents für Visual Studio 2017 RC zu installieren.

Nicht zuletzt bleibt im Bereich der Testausführung zu erwähnen, dass die Test & Feedback-Extension, welche erweiterte Möglichkeiten für die Testausführung wie z.B. exploratives Testen anbietet, jedoch bislang nur für Chrome verfügbar war nun auch für Firefox bereit steht.

 

REST API und Erweiterungen

Auch im Bereich der REST API hat sich mit Update 1 ein Schritt voran getan. So ist nun möglich Test Steps und Test Step Attachments per Hilfsklassen des REST-Clients neu anzulegen, zu modifizieren sowie diese auch wieder zu löschen. Ein Beispiel dafür ist auf GitHub zu finden.

Über den Ausbau der REST-Clients hinaus gibt es eine weitere Neuerung, welche im Zusammenhang mit der Programmierung steht. Das Update stellt einen neuen Extension Point (ms.vss-test-web.test-plan-pivot-tabs”) zur Verfügung, welcher es erlaubt eigene Extensions in Form von Tabs innerhalb des Test Plan-Tabs zu implementieren.

 

Fazit

Update 1 bringt eine Vielzahl an nützlichen Features mit sich, welche den Testing-Alltag erleichtern und die Integration zu anderen Bereichen weiter voranbringt. Da RC2 wie auch bereits RC1 eine Go-Live-Freigabe besitzt und somit auch in Produktivumgebungen installiert werden kann, können Sie also bereits jetzt von den zahlreichen Neuerungen profitieren.

 

Manfred Steyer: Demo-Projekt vom Angular Workshop, BASTA! Spring 2017 in Frankfurt

Nachfolgend das durchgängige Demo-Projekt aus dem heutigen Workshop zu Angular von der BASTA! Spring 2017 in Frankfurt:

Marco Scheel: Links for 2017-02-19 [del.icio.us]

Marco Scheel: Links for 2017-02-18 [del.icio.us]

  • fakeupdate.net
    Working on updates 0% complete.Don't turn off your PC. This will take a while. via Pocket

Marco Scheel: Links for 2017-02-17 [del.icio.us]

Holger Schwichtenberg: Eine Web- und Cross-Plattform-Desktop-Anwendung mit HTML, TypeScript und Angular

Das Architekturbeispiel "MiracleList" läuft sowohl im Browser als auch als Desktop-Client auf Windows, Linux und macOS sowie Android und iPhone/iPad.

MSDN Team Blog AT [MS]: So entwickelst Du mobile Anwendungen für Windows Mobile, iOS und Android!

Du wolltest schon immer eine mobile Anwendung für Windows Mobile, iOS und Android entwickeln? Wie Du Zeit sparen kannst und dabei aber auf kein Feature der jeweiligen Plattform verzichten musst werden wir Dir hier in diesem Beitrag erklären. Wir dürfen vorstellen: Xamarin. Mit der Programmiersprache C# kannst du iOS, Android und Windows-Apps schreiben. Dabei kann der Quellcode für alle Plattformen genutzt werden. Um dir bei der Entwicklung mit Xamarin zu helfen, gibt es Xamarin University. Wir werden jeden Freitag einen Beitrag zu den dort angebotenen Kursen liefern damit du einen Überblick bekommst was dich in dem jeweiligen Kurs erwartet.

Für alle die mit C# noch recht wenig anfangen können hier ein kostenloser Einstieg auf unserer Microsoft Virtual AcademyIn diesen Kursen zu C# und XAML erlernen Sie das Entwickeln von Apps für eine Reihe von Szenarien. C# ist einfach, aber leistungsstark und ermöglicht das Erstellen von Windows-Apps, Webdiensten und weiteren Anwendungen. XAML vereinfacht das Erstellen der Benutzeroberfläche.

Hier einmal ein kurzer Überblick über die Themen die dich in den nächsten Wochen erwarten:

Xamarin.com

Los geht’s: Heute wird sich alles um den Einstieg auf Xamarin University drehen bevor wir dann nächste Woche Freitag in die verschiedenen Themen eintauchen werden.

Dazu kannst du dich kostenlos für eine Probezeit von 30 Tagen auf https://www.xamarin.com/university registrieren. Ein kleiner Tipp um Zeit zu sparen: Falls Du noch keine Visual Studio Version auf deinem Rechner installierst hast, dann schau vorbei auf https://www.visualstudio.com/downloads/ und lade Dir eine für dich passende Version herunter. Wir empfehlen dir: Visual Studio Community 2015

Xamarin University

Nach einer erfolgreichen Registration kannst du dich kurz mit der Oberfläche von Xamarin University vertraut machen. Du kannst hier zwischen den verschiedenen Kursen wählen, dir Live-Vorträge in deinen Kalender eintragen, dein Profil bearbeiten und dir deinen Zertifikat Fortschritt ansehen. Du kannst auf Xamarin University ein Zertifikat bekommen wenn Du bestimmte Kurse erfolgreich abschließt. Zum Thema Zertifikat wird nächstes Woche Freitag auch einiges auf unserem Blog zu lesen sein.

Xamarin UniversityWenn Du auf “Get Started” klickst, dann bekommst Du auch schon die erste Kurs Einheit zur Verfügung gestellt. Du kannst nun zwischen einem “Self-Guided” Kurs oder einem Live-Vortrag wählen. Ein “Self-Guided” Kurs stellt dir Video Material und Dokumentation für ein Selbststudium zur Verfügung. Ein Live-Kurs wird von einem unserer ausgewählten Experten gehalten. Dabei gibt es mehrere Angebote jedoch sind die verschiedenen Kurszeiten zu beachten.

Was erwartet Dich/Was wirst Du lernen in der Einheit “Introdution to Xamarin Development”:

1. Die unterschiedlichen Ansätze eine mobile Anwendung zu entwickeln
2. Der Mobile Software Development Lifecycle (SDLC) mit Xamarin
3. Installation von Xamarin
4. Aktualisierung deiner Entwicklungswerkzeuge
5. Arbeiten mit Visual Studio auf der Windows- und macOS Plattform.

Nach einem erfolgreichem Abschluss eines Kurses kannst Du in Deinem Profil Deinen Fortschritt beobachten.

My Profile

Gratulation an alle die es schon so weit geschafft haben. Ich hoffe die Anmeldung auf Xamarin University hat geklappt und Du hast schon die ersten Erfahrungen mit Xamarin gesammelt. Du hast Fragen zu Xamarin University? Dann bitte entweder als Kommentar auf unserem Blog oder persönlich als E-mail: t-nidobi@microsoft.com.

Für die neuesten Updates schau doch auch auf unser neuen Xamarin University Facebook Seite vorbei: https://www.facebook.com/Xamarin-University-247178372403551/


Nächste Woche Freitag (24.02) werden wir uns mit Xamarin.Android beschäftigen. Ein kleiner Teaser: Es wird ein Gewinnspiel geben. Dazu wird ein erfolgreicher Abschluss der 1. Einheit sowie die Installation der Entwicklungswerkzeuge vorausgesetzt.

Die Microsoft DX Österreich wünscht Dir ein erholsames Wochenende!

 

Marco Scheel: Links for 2017-02-16 [del.icio.us]

MSDN Team Blog AT [MS]: Keine Karten für die Build bekommen? Hier kannst Du die Build kostenlos sehen!

image

Der Kartenverkauf hat begonnen und schon sind alle Karten ausverkauft! Keine Karten für die Build bekommen? Dann haben wir für euch genau das Richtige!

Für alle die nicht persönlich zur Build fliegen können bringen wir daher die Build nach Österreich. Es gibt also auch heuer wieder die Möglichkeit in Österreich quasi live dabei zu sein

Komm doch auch Du zu einem unserer beliebten Keynotestreamings!! image

Die Teilnahme ist kostenlos. Daher melde Dich noch heute an, denn auch hier sind die Plätze begrenzt!

Holger Sirtl: Public IP Addresses of Azure Datacenters

For all of you being interested in IP address ranges of Microsoft Azure Datacenters (for setting up firewall configuration etc.), Microsoft publishes lists of all public IP address ranges, ready to be downloaded:

Marco Scheel: Links for 2017-02-15 [del.icio.us]

Golo Roden: HTTP/2 in Node.js

Alle gängigen Webbrowser unterstützen inzwischen das HTTP/2-Protokoll. Auch ohne besondere Vorkehrungen ist das Protokoll für Webentwickler interessant, beispielsweise wegen des Bündelns von Verbindungen. Wie lässt sich eine Node.js-Anwendung auf HTTP/2 umstellen?

MSDN Team Blog AT [MS]: Microsoft Azure Marketplace

Haben Sie schon vom Microsoft Azure Marketplace gehört?

Wenn nicht – gar kein Problem! Der Azure Marketplace ist Ihr Onlineshop für Tausende von zertifizierten Open Source- und Community-Softwareanwendungen, Entwicklerdiensten und Daten – allesamt vorkonfiguriert für Microsoft Azure. In dem globalen Online-Store profitieren die Unternehmen mit qualitativen Softwarelösungen in der eigenen Azure Umgebung und haben somit viele verschiedene Auswahlmöglichkeiten das eigene Umfeld bestmöglich zu gestalten und mit Microsoft Partner Lösungen zu verbessern.

Welche Vorteile bekomme ich dadurch?

  • Kostenersparnis auf Grund der Skalierbarkeit
  • Skalierbarkeit weil eine Lösung jederzeit verwendet und bei Nichtgebrauch wieder abgedreht werden kann
  • Schneller Zugriff zu diversen Software Lösungen von A-Z
  • Cross-Industry Lösungen für jede Branche/für jeden Zweck
  • Einfacher Download in der eigenen Azure Umgebung inkl. Support der Software Anbieter
  • Die gesamte IT wird vereinfacht -> Somit wird weniger Zeit für wiederholende Aufgaben verwendet und mehr Konzentration auf strategische Geschäftsanforderungen gelegt

JETZT LOSLEGEN mit einer unserer TOP 10 LÖSUNGEN:

  • Barracuda
    Barracuda NextGen Firewalls bieten für Hybrid-Netzwerke, Remote-Standorten sowie in Public und Private Cloud-Umgebungen Sicherheit und Netzwerk-Intelligenz.
  • Bitnami
    Bitnami ist eine Sammlung von Installations Programmen und Software Paketen für Web Anwendungen und virtuelle Machinen. Bitnami Stacks werden dazu verwendet um Software auf Linux, Windows, Mac OS X und Solaris zu installieren.
  • Check Point
    Check Point Produkte bieten End-to-End Security von der Firma in die Cloud bis zu den mobilen Arbeitsgeräten. Mehrere Produkte von Ceck Point stehen am Azure Marketplace zum Download für Sie bereit.
  • Citrix
    Citrix NetScaler ist ein all-in-one Web Application Delivery Controller & Ihr Networking Power Player. Er stellt Business-Anwendungen für jedes Endgerät an jedem Standort bereit – mit unerreichter Sicherheit.
  • Cloudera
    Cloudera bietet eine Plattform mit bester Leistung und geringen Kosten für Big Data Management und Analytics, damit das Firmenergebnis verbessert wird.
  • Hanu Insight
    Hanu Insight ist eine IT Governance und Financial Management Lösung für Microsoft Azure. Sparen Sie dadurch nicht nur Zeit, sondern auch Geld indem Sie vorkonfigurierte Templates einsetzen.
  • Hortonworks
    Hortonworks Data Platform (HDP) dient zur Analyse, Speicherung und Bearbeitung großer Datenmengen -> Big Data Management. Vorteile von Hadoop Cluster können somit genutzt werden.
  • Redhat Enterprise Linux
    Egal ob Sie neue Anwendungen herausbringen, Umgebungen virtualisieren oder eine Open Hybrid-Umgebung erstellen: Red Hat Enterprise Linux Server bildet ein solides Fundament, auf dem Sie Ihr Unternehmen weiterentwickeln können.
  • Tenable
    Tenable Nessus schützt vor Attacken, indem es die Schadenanfälligkeit und Einstellungsoptionen prüft oder nach Malware im eigenen Netzwerk sucht.
  • Veeam
    Veeam Cloud Connect bietet Veeam-Kunden die Möglichkeit, ihre Backup-Infrastruktur ganz einfach in die Cloud zu erweitern.

Starten Sie jetzt in Ihrer eigenen Azure Subscription!

MSDN Team Blog AT [MS]: Kostenloses Webinar: Native Cross-Platform Entwicklung mit Xamarin

image

Wir dürfen vorstellen: Ein kostenloses Webinar als Einführung in die Entwicklung mit Xamarin. Eine gemeinsame Code-Basis für iOS, Android und Windows – der Traum eines jeden Entwicklers wird wahrer denn je. Mit modernen Technologien wie Xamarin wird es möglich, 100% native Apps für alle Plattformen zu erstellen und so viel Code wie möglich zwischen diesen zu teilen. In Kombination mit Microsoft Azure können zudem mit wenigen Klicks mächtige Cloud-Backends erstellt und in die Apps integriert werden. UI-Tests auf hunderten physikalischer Geräte in der Xamarin Test Cloud runden das ganze ab. In unserem Praxis Webinar zeigen wir, wie einfach native, multiplattform Entwicklung aussehen kann und stellen die wichtigsten Tipps, Tricks und Funktionalitäten vor.

Hier geht es zur Anmeldung zum Webinar:

 

New_robin_10202016

Robin-Manuel Thiel
Technical Evangelist, Microsoft Deutschland


Du hast schon Deine ersten Erfahrungen mit Xamarin und C# gemacht dann schau vorbei auf unser neuen Xamarin University Facebook Seite für die neuesten Updates. Gerne bist Du eingeladen Deine Tipps und Tricks zu teilen. 

MSDN Team Blog AT [MS]: TopConf Linz 2017

 

Am 28.2., 1.3. und 2.3.2017 findet in Linz wieder die TopConf Linz statt. Die 3-tägige Konferenz bietet viele spannende Vorträge aus den Bereichen Programmiersprachen, DevOps, UX, Mobile & Devices, und vieles mehr. Auch von unserer Seite könnt ihr spannende Vorträge zu Microsoft Technologien erwarten. Wenn ihr in Linz und Umgebung seid, ist das sicher auch eine gute Möglichkeit mit uns in Kontakt zu treten.

Das Event findet im OÖ Kulturquartier statt. Anmelden könnt ihr euch auf Eventbrite.

See you in Linz!

gool

047_rina-ahmed

014_rainer-stropek

 

Code-Inside Blog: Create NuGet packages with Cake

This blogpost is a follow up to these Cake (C# Make) related blogpost:

Scenario

x

Let’s say we have this project structure. The “Config”, “Result” and “Engine” projects contains a corresponding .nuspec, like this:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>Sloader.Config</id>
    <version>0.1.0</version>
    <title>Sloader.Config</title>
    <authors>Code Inside Team</authors>
    <owners>Code Inside Team</owners>
    <licenseUrl>https://github.com/Code-Inside/Sloader/blob/master/LICENSE</licenseUrl>
    <projectUrl>https://github.com/Code-Inside/Sloader</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Sloader Config</description>
    <releaseNotes>
      ## Version 0.1 ##
      Init
    </releaseNotes>
    <copyright>Copyright 2017</copyright>
    <tags>Sloader</tags>
    <dependencies />
  </metadata>
</package>

Nothing fancy - pretty normal NuGet stuff.

Goal

The goal is to create a NuGet package for each target project with Cake.

build.cake

The usage in Cake is pretty much the same as with the normal nuget.exe pack command The sample only shows the actual cake target - see the older blogposts for a more complete example:

Task("BuildPackages")
    .IsDependentOn("Restore-NuGet-Packages")
	.IsDependentOn("RunTests")
    .Does(() =>
{
    var nuGetPackSettings = new NuGetPackSettings
	{
		OutputDirectory = rootAbsoluteDir + @"\artifacts\",
		IncludeReferencedProjects = true,
		Properties = new Dictionary<string, string>
		{
			{ "Configuration", "Release" }
		}
	};

    MSBuild("./src/Sloader.Config/Sloader.Config.csproj", new MSBuildSettings().SetConfiguration("Release"));
    NuGetPack("./src/Sloader.Config/Sloader.Config.csproj", nuGetPackSettings);
    MSBuild("./src/Sloader.Result/Sloader.Result.csproj", new MSBuildSettings().SetConfiguration("Release"));
    NuGetPack("./src/Sloader.Result/Sloader.Result.csproj", nuGetPackSettings);
    MSBuild("./src/Sloader.Engine/Sloader.Engine.csproj", new MSBuildSettings().SetConfiguration("Release"));
    NuGetPack("./src/Sloader.Engine/Sloader.Engine.csproj", nuGetPackSettings);
});

Easy, right? The most interesting part here is the NuGetPack command. Before we invoke this command we need to make sure that we build the last recent version - to enforce that we just rebuild each project in release mode.

Result

x

The console output should make the flow pretty clear:

PS C:\Users\Robert\Documents\GitHub\Sloader> .\build.ps1 -t BuildPackages
Preparing to run build script...
Running build script...
Analyzing build script...
Processing build script...
Installing tools...
Compiling build script...

========================================
Clean
========================================
Executing task: Clean
Cleaning directory C:/Users/Robert/Documents/GitHub/Sloader/artifacts
Finished executing task: Clean

========================================
Restore-NuGet-Packages
========================================
Executing task: Restore-NuGet-Packages
MSBuild auto-detection: using msbuild version '14.0' from 'C:\Program Files (x86)\MSBuild\14.0\bin'.
All packages listed in packages.config are already installed.
Finished executing task: Restore-NuGet-Packages

========================================
BuildTests
========================================
Executing task: BuildTests
Start Building Test: Sloader.Config.Tests
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

  Sloader.Config -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Config.Tests\Sloader.Config.dll
  Sloader.Config.Tests -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Config.Tests\Sloader.Config
  .Tests.dll
Start Building Test: Sloader.Result.Tests
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

  Sloader.Result -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Result.Tests\Sloader.Result.dll
  Sloader.Result.Tests -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Result.Tests\Sloader.Result
  .Tests.dll
Start Building Test: Sloader.Engine.Tests
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

  Sloader.Config -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Config.dll
  Sloader.Result -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Result.dll
  Sloader.Engine -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Engine.dll
  Sloader.Engine.Tests -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Engine
  .Tests.dll
Finished executing task: BuildTests

========================================
RunTests
========================================
Executing task: RunTests
Start Running Tests
xUnit.net Console Runner (64-bit .NET 4.0.30319.42000)
  Discovering: Sloader.Config.Tests
  Discovered:  Sloader.Config.Tests
  Starting:    Sloader.Config.Tests
  Finished:    Sloader.Config.Tests
  Discovering: Sloader.Engine.Tests
  Discovered:  Sloader.Engine.Tests
  Starting:    Sloader.Engine.Tests
  Finished:    Sloader.Engine.Tests
  Discovering: Sloader.Result.Tests
  Discovered:  Sloader.Result.Tests
  Starting:    Sloader.Result.Tests
  Finished:    Sloader.Result.Tests
=== TEST EXECUTION SUMMARY ===
   Sloader.Config.Tests  Total: 23, Errors: 0, Failed: 0, Skipped: 0, Time: 0.554s
   Sloader.Engine.Tests  Total: 17, Errors: 0, Failed: 0, Skipped: 0, Time: 1.070s
   Sloader.Result.Tests  Total:  4, Errors: 0, Failed: 0, Skipped: 0, Time: 1.061s
                                --          -          -           -        ------
                   GRAND TOTAL: 44          0          0           0        2.684s (5.697s)
Finished executing task: RunTests

========================================
BuildPackages
========================================
Executing task: BuildPackages
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 2017-02-19 22:00:09.
The target "_ConvertPdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,37)" does not exist in the project, and will be ignored.
The target "_CollectPdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,70)" does not exist in the project, and will be ignored.
The target "_CollectMdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (41,38)" does not exist in the project, and will be ignored.
The target "_CopyMdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common
.targets\ImportAfter\Xamarin.Common.targets (41,71)" does not exist in the project, and will be ignored.
Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Config\Sloader.Config.csproj" on node 1 (Build target(s))
.
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the i
nput files.
CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
CopyFilesToOutputDirectory:
  Sloader.Config -> C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Config\bin\Release\Sloader.Config.dll
Done Building Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Config\Sloader.Config.csproj" (Build target
(s)).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.22
Attempting to build package from 'Sloader.Config.csproj'.
MSBuild auto-detection: using msbuild version '14.0' from 'C:\Program Files (x86)\MSBuild\14.0\bin'.
Packing files from 'C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Config\bin\Release'.
Using 'Sloader.Config.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies
Successfully created package 'C:\Users\Robert\Documents\GitHub\Sloader\artifacts\Sloader.Config.0.2.1.nupkg'.
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 2017-02-19 22:00:10.
The target "_ConvertPdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,37)" does not exist in the project, and will be ignored.
The target "_CollectPdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,70)" does not exist in the project, and will be ignored.
The target "_CollectMdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (41,38)" does not exist in the project, and will be ignored.
The target "_CopyMdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common
.targets\ImportAfter\Xamarin.Common.targets (41,71)" does not exist in the project, and will be ignored.
Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Result\Sloader.Result.csproj" on node 1 (Build target(s))
.
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the i
nput files.
CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
CopyFilesToOutputDirectory:
  Sloader.Result -> C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Result\bin\Release\Sloader.Result.dll
Done Building Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Result\Sloader.Result.csproj" (Build target
(s)).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.24
Attempting to build package from 'Sloader.Result.csproj'.
MSBuild auto-detection: using msbuild version '14.0' from 'C:\Program Files (x86)\MSBuild\14.0\bin'.
Packing files from 'C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Result\bin\Release'.
Using 'Sloader.Result.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies
Successfully created package 'C:\Users\Robert\Documents\GitHub\Sloader\artifacts\Sloader.Result.0.2.1.nupkg'.
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 2017-02-19 22:00:12.
The target "_ConvertPdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,37)" does not exist in the project, and will be ignored.
The target "_CollectPdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,70)" does not exist in the project, and will be ignored.
The target "_CollectMdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (41,38)" does not exist in the project, and will be ignored.
The target "_CopyMdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common
.targets\ImportAfter\Xamarin.Common.targets (41,71)" does not exist in the project, and will be ignored.
The target "_ConvertPdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,37)" does not exist in the project, and will be ignored.
The target "_CollectPdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,70)" does not exist in the project, and will be ignored.
The target "_CollectMdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (41,38)" does not exist in the project, and will be ignored.
The target "_CopyMdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common
.targets\ImportAfter\Xamarin.Common.targets (41,71)" does not exist in the project, and will be ignored.
Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Engine\Sloader.Engine.csproj" on node 1 (Build target(s))
.
Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Engine\Sloader.Engine.csproj" (1) is building "C:\Users\R
obert\Documents\GitHub\Sloader\src\Sloader.Config\Sloader.Config.csproj" (2) on node 1 (default targets).
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the i
nput files.
CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
CopyFilesToOutputDirectory:
  Sloader.Config -> C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Config\bin\Release\Sloader.Config.dll
Done Building Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Config\Sloader.Config.csproj" (default targ
ets).

The target "_ConvertPdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,37)" does not exist in the project, and will be ignored.
The target "_CollectPdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (34,70)" does not exist in the project, and will be ignored.
The target "_CollectMdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Com
mon.targets\ImportAfter\Xamarin.Common.targets (41,38)" does not exist in the project, and will be ignored.
The target "_CopyMdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common
.targets\ImportAfter\Xamarin.Common.targets (41,71)" does not exist in the project, and will be ignored.
Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Engine\Sloader.Engine.csproj" (1) is building "C:\Users\R
obert\Documents\GitHub\Sloader\src\Sloader.Result\Sloader.Result.csproj" (3) on node 1 (default targets).
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the i
nput files.
CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
CopyFilesToOutputDirectory:
  Sloader.Result -> C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Result\bin\Release\Sloader.Result.dll
Done Building Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Result\Sloader.Result.csproj" (default targ
ets).

BclBuildEnsureBindingRedirects:
Skipping target "BclBuildEnsureBindingRedirects" because all output files are up-to-date with respect to the input file
s.
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the i
nput files.
CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
_CopyAppConfigFile:
Skipping target "_CopyAppConfigFile" because all output files are up-to-date with respect to the input files.
CopyFilesToOutputDirectory:
  Sloader.Engine -> C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Engine\bin\Release\Sloader.Engine.dll
Done Building Project "C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Engine\Sloader.Engine.csproj" (Build target
(s)).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.54
Attempting to build package from 'Sloader.Engine.csproj'.
MSBuild auto-detection: using msbuild version '14.0' from 'C:\Program Files (x86)\MSBuild\14.0\bin'.
Packing files from 'C:\Users\Robert\Documents\GitHub\Sloader\src\Sloader.Engine\bin\Release'.
Using 'Sloader.Engine.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies
Successfully created package 'C:\Users\Robert\Documents\GitHub\Sloader\artifacts\Sloader.Engine.0.2.1.nupkg'.
Finished executing task: BuildPackages

Task                          Duration
--------------------------------------------------
Clean                         00:00:00.1083837
Restore-NuGet-Packages        00:00:00.7808530
BuildTests                    00:00:02.6296445
RunTests                      00:00:05.9397822
BuildPackages                 00:00:05.2679058
--------------------------------------------------
Total:                        00:00:14.7265692

Holger Schwichtenberg: Pläne und Bugliste für die Windows Universal Platform

Microsoft gewährt für die Windows Universal Apps in Windows 10 erstmals Einblicke in das eigene Backlog.

Golo Roden: Einführung in Node.js, Folge 6: Auf das Dateisystem zugreifen

Kaum eine Anwendung kommt ohne Zugriff auf das Dateisystem aus. Für das Laden von JavaScript- und JSON-Dateien lässt sich zwar die require-Funktion verwenden, doch für andere Dateitypen werden andere Funktionen benötigt. Wie funktioniert das, und wie geht man mit Pfaden, Encodings & Co. um?

MSDN Team Blog AT [MS]: MeetUp: Logik Apps

MeetUp Azure

Gemeinsam mit der User Group Visual Studio treffen wir uns um Logik Apps genauer zu betrachten und zu diskutieren. Mit Logik Apps kann du im Handumdrehen leistungsfähige Integrationslösungen erstellen. Dabei wollen wir den Focus aus Azure als auch Visual Studio Sicht legen.

Datum und Uhrzeit:
30.03.2017 | 18:00 – 22:00 Uhr

Ort: Ppedv GmbH, Märzstrasse 1, 1150 Wien

Weitere Informationen zu diesem MeetUp findest unter folgendem Link:
https://aka.ms/meetup/logikapps


Über MeetUp:
MeetUp ist ein Online Portal, das “Offline” Gruppentreffen an verschiedenen Orten auf der ganzen Welt ermöglicht. MeetUp ermöglicht es Mitgliedern, Gruppen zu finden und Gruppen von einheitlichen durch ein gemeinsames Interesse, wie Politik, Bücher, Spiele, Filme, Gesundheit, Haustiere, Karriere oder Hobbys vereint. Mehr Informationen unter: https://www.meetup.com/de-DE/

AIT: Aktuelle Fachartikel aus der dotnetpro und windows.developer

In den Ausgaben der dotnetpro vom Januar (01/2017) wie auch der windows.developer (01/2017) finden Sie Artikel von der AIT. Im Beitrag „Zwei Lösungen eine App“ geht es um das Zusammenspiel von Xamarin in Verbindung mit Azure, die anhand von Beispielen die einfache Umsetzung zeigt. Im Artikel der dotnetpro hingegen können Sie sich über den praktischen Einsatz von SonarQube, einem Tool zur Analyse von technischer Schuld, im Enterprise Umfeld informieren.

Beide Artikel stehen für Sie in unserem Downloadbereich zum Herunterladen bereit.

windows.developerdotnetpro

Manfred Steyer: Lazy Loading [like a Viking] with Angular - Slides and samples from my talk at ngVikings in Copenhagen, Feb 2017

Please find below the slides and samples from my talk about lazy loading with Angular at ngVikings in Copenhagen (Feb 2017). It shows:

  • Lazy Loading
  • Preloading
  • Custom Preloading Strategies
  • Lazy Loading and Shared Modules

Downloads:

Holger Schwichtenberg: Konferenztermine für .NET- und Webentwickler 2017

Eine Übersicht der Veranstaltung für .NET- und Webentwickler in 2017.

Jürgen Gutsch: BrowserLink causes an error in a new ASP.NET Core web

Using the latest bits of Visual Studio 2017 and the latest SDK of .NET Core, you will possibly get an error while starting your ASP.NET Core Web in Visual Studio 2017 or using dotnet run.

In Visual Studio 2017 the browser opens on pressing F5, but with wired HTML code in the address bar. Debugging starts and stops a few seconds later. Using the console you'l get a more meaningful error message:

This error means, something is missing the system.runtime.dll ("System.Runtime, Version=4.2.0.0") which is not referenced or used somewhere directly. I had a deeper look into the NuGet references and couldn't found it.

Because I often had problems with BrowserLink in the past, I removed the NuGet reference from the project and all worked fine. I added it again, to be sure that the removal didn't clean up anything. The error happened again.

It seams that the current Version of BrowserLink is referencing a library which is not supported by the app. Remove it, if you get the same or a similar error.

BrowserLink in general is a pretty cool feature, it refreshes the browser magically if anything changes on the server. With this tool, you are able to edit your CSS files and preview it directly in the browser without doing a manual refresh. It is a VisualStudio Add-in and uses NuGet-Packages to extend your app to support it.

MSDN Team Blog AT [MS]: Windows Developer Day: Recap

Developer Platform BacklogFür all diejenigen, die gestern nicht den Windows Developer Day mitverfolgt haben, hier eine kurze Zusammenfassung:

Windows SDK Verfügbarkeit:
Werde ein Windows Insider und erhalte noch heute die neuesten Updates zum Windows 10 Creators Update SDK.

Dokumentation:
Zum ersten Mal werden alle Microsoft-Entwickler-Dokumentation an einem Ort (http://docs.microsoft.com/) gesammelt, wo es einfacher zu finden und zu verwenden.

Developer Platform Backlog:
Microsoft hat angekündigt, transparenter und intuitiver den Fortschritt der Arbeiten an der Windows 10 UWP Platform zu kommunizieren. Zu diesem Zweck hat das Unternehmen einen öffentlich zugänglichen Windows-Plattform-Bugtracker vorgestellt, der auch eine UWP-Roadmap enthält, um einen Blick auf die kommenden Features zu werfen, an denen es arbeitet. Mehr Informationen findest du unter: https://developer.microsoft.com/windows/platform.

Telerik Controls:
Die Telerik UWP-Control Library ist nun Open Source und auf GitHub und als NuGet-Pakete verfügbar. Erfahre mehr unter telerik.com/uwp.

Cortana Skills Kit:
Das Cortana Skills Kit wird Anfang Februar in die Open Developer Preview eingegliedert.

Rome SDK für Android:
Dies ist ein neues SDK, welches die geräteübergreifenden Dienste von “Project Rome” auf Android-Geräte bringt und so eine einfache und leistungsstarke Integration mit Windows ermöglicht. Probiere das SDK jetzt aus unter https://github.com/Microsoft/project-rome.

UWP Community Toolkit 1.3:
Auch das Community Toolkit hat ein Update bekommen. Dieses enthält nun auch neue Beiträge unserer Entwickler Community. http://www.uwpcommunitytoolkit.com/en/master/#uwp-community-toolkit-documentation

Windows SDK für Google Analytics:
Dieses neue SDK, das jetzt verfügbar ist, ermöglicht Windows-Entwicklern (UMP, Xamarin, WPF und WinForms) Zugriff auf eine der populäreren und leistungsfähigeren Realzeitanalytik-Suiten. Mehr dazu unter https://github.com/dotnet/windows-sdk-for-google-analytics.

Windows SDK für Facebook:
Mit einer Milliarde Nutzer bietet Facebook eines der leistungsfähigsten Tools für dich, um neue Benutzer für deine App oder Spiel zu erwerben. Das neueste SDK findest du unter: https://developers.facebook.com/docs/app-ads/windows-sdk.

Holger Sirtl: Neue, regelmäßige Azure News auf der Microsoft TechWiese

Nachdem ich selbst leider nicht mehr die zeitliche Kapazität habe, eine regelmäßige Azure-News-Serie zu unterhalten, freut es mich umso mehr, dass es nun tollen Ersatz gibt: Die…

Azure News on Monday
auf der Microsoft TechWiese und dem IT Pro Hub

Meine Kollegen rund um Markus Zeischke listen dort jeden Montag die aktuellen News zu Azure und der Microsoft Cloud auf.

Zwei Folgen sind bereits online:

Norbert Eder: Datum in Batch-Dateien verarbeiten

Für wiederkehrende Aufgaben schreibe ich mir häufig Batch-Dateien und lasse diese dann durch den Aufgabenplaner ausführen. So auch für ein ganz einfaches Backup, dass mir täglich die wichtigsten Files zippt und auf gemapptes Laufwerk schiebt. Dafür ist es hilfreich, den Dateinamen mit einem Datum zu versehen.

Per

echo %date%

kann man sich in der Konsole das aktuelle Datum ausgeben lassen. Allerdings besteht auch die Möglichkeit, sich ein anderes Format via Substrings zusammen zu bauen:

echo %date:~6,4%%date:~3,2%%date:~0,2%

Bei einem Eingangsdatum 09.02.2017 entspräche das dann der Formatierung YYYYmmdd und einer entsprechenden Ausgabe von 20170209.

Verpackt in ein kleines Batch-Script, das oben beschriebenes Szenario mittels 7-Zip realisiert und als Parameter das Zielverzeichnis entgegen nimmt, kann das so aussehen:

rem echo %date% -> 09.02.2017
set BACKUPNAME=%date:~6,4%%date:~3,2%%date:~0,2%-backup.7z
set TARGETPATH=%1\%BACKUPNAME%

7z a -t7z -spf %TARGETPATH% -ir@filelist.txt

Das Script geht davon aus, dass im selben Verzeichnis eine Datei filelist.txt liegt, welche alle zu sichernden Dateien und Verzeichnisse enthält. Der Inhalt sieht dann in etwa so aus:

C:\Projekte\*
C:\Beispiele\*
C:\Temp\eine-bestimmte-datei.txt

Viel Spaß :)

The post Datum in Batch-Dateien verarbeiten appeared first on Norbert Eder.

MSDN Team Blog AT [MS]: MeetUp: Windows 10 Anniversary Update UWP

MeetUp: Windows 10 UWP

Das 2. große Update für Windows 10 genannt „Anniversary Update“ wurde bereits letztes Jahr veröffentlicht. Statt der bisherigen neuen Versionen, die riesige Dimensionen hatten und die Anwender oft vor große Probleme stellten, sollen Updates künftig in kleinen Portionen regelmäßig über das Internet eingespielt werden, ohne die Benutzer zu belästigen. Neuerungen an den Schnittstellen gehen dabei oftmals unter. Dabei sind es gerade die API die Windows 10 so umfangreich und spannend machen. Windows 10 bildet demnach eine Basis für eine breite Palette an Hardware. Xbox, Hololens, Desktop, Windows Mobile, IoT. Native Apps können damit wesentlich mehr leisten, als z.B. ein HTML5 basiertes Frontend.

Wir wollen euch demnach einladen an einem Vortrag teilzunehmen der euch zeigt was alles mit der Universal Windows Plattform alles möglich ist (und du dazu nie verwenden würdest).

Datum und Uhrzeit:

23.02.2017 | 18:00 Uhr

Ort: Ppedv GmbH, Märzstrasse 1, 1150 Wien

Vortragender: Hannes Preishuber

Weitere Informationen zu diesem MeetUp findest unter folgendem Link:
https://aka.ms/meetup/windows10uwp


Über MeetUp:
MeetUp ist ein Online Portal, das “Offline” Gruppentreffen an verschiedenen Orten auf der ganzen Welt ermöglicht. MeetUp ermöglicht es Mitgliedern, Gruppen zu finden und Gruppen von einheitlichen durch ein gemeinsames Interesse, wie Politik, Bücher, Spiele, Filme, Gesundheit, Haustiere, Karriere oder Hobbys vereint. Mehr Informationen unter: https://www.meetup.com/de-DE/

Golo Roden: Docker for AWS lokal steuern

Mit Docker for AWS fällt das Einrichten eines Docker-Swarm-Clusters in der Cloud leicht. Allerdings lässt sich Docker von Haus aus nur lokal ansprechen, man muss sich also stets zunächst per SSH anmelden, was einige Nachteile mit sich bringt. Wie lässt sich das besser lösen?

Jürgen Gutsch: Using Dependency Injection in .NET Core Console Apps

The Dependency Injection (DI) Container used in ASP.NET Core is not limited to ASP.NET Core. You are able to use it in any kind of .NET Project. This post shows how to use it in an .NET Core Console application.

Create a Console Application using the dotnet CLI or Visual Studio 2017. The DI Container is not available by default, bit the IServiceProvider is. If you want to use an Custom or third party DI Container, you should provide an implementation if an IServiceProvider, as an encapsulation of a DI Container.

In this post I want to use the DI Container used in the ASP.NET Core projects. This needs an additional NuGet package "Microsoft.Extensions.DependencyInjection" (currently it is version 1.1.0)

Since this library is a .NET Standard Library, it should also work in a .NET 4.6 application. You just need to add a reference to "Microsoft.Extensions.DependencyInjection"

After adding that package we can start to use it. I created two simple classes which are dependent to each other, to show the how it works in a simple way:

public class Service1 : IDisposable
{
  private readonly Service2 _child;
  public Service1(Service2 child)
  {
    Console.WriteLine("Constructor Service1");
    _child = child;
  }

  public void Dispose()
  {
    Console.WriteLine("Dispose Service1");
    _child.Dispose();
  }
}

public class Service2 : IDisposable
{
  public Service2()
  {
    Console.WriteLine("Constructor Service2");
  }

  public void Dispose()
  {
    Console.WriteLine("Dispose Service2");
  }
}

Usually you would also use interfaces and create the relationship between this two classes, instead of the concrete implementation. Anyway, we just want to test if it works.

In the static void Main of the console app, we create a new ServiceCollection and register the classes in a transient scope:

var services = new ServiceCollection();
services.AddTransient<Service2>();
services.AddTransient<Service1>();

This ServiceCollection comes from the added NuGet package. Your favorite DI container possibly uses another way to register the services. You could now share the ServiceCollection to additional components, who wants to share some more services, in the same way ASP.NET Core does it with the AddSomething (e. g. AddMvc()) extension methods.

Now we need to create the ServiceContainer out of that collection:

var provider = services.BuildServiceProvider();

We can also share the ServiceProvider in our application to retrieve the services, but the proper way is to use it only on a single entry point:

using (var service1 = provider.GetService<Service1>())
{
  // so something with the class
}

Now, let's start the console app and look at the console output:

As you can see, this DI container is working in any .NET Core app.

Code-Inside Blog: Build & run xUnit tests with Cake

Last year I already covered the basic usage of Cake, which stands for “C# Make”. This time we want to build and run xUnit tests with Cake.

Scenario

x

Let’s say we have this project structure. Be aware that all our tests have the suffix “Tests” in the project name.

The files are organized like this, so we have all “Tests” in a “tests” folder and the actual code under “src”:

src/Sloader.Config
src/Sloader.Engine
src/Sloader.Hosts.Console
src/Sloader.Result
tests/Sloader.Config.Tests
tests/Sloader.Engine.Tests
tests/Sloader.Result.Tests
.gitignore
build.cake
build.ps1
LICENSE
Sloader.sln

Goal

Now we want to build all tests projects and run them with the xUnit console runner. Be aware that there are multiple ways of doing it, but I found this quite good.

build.cake

#tool "nuget:?package=xunit.runner.console"
//////////////////////////////////////////////////////////////////////
// ARGUMENTS
//////////////////////////////////////////////////////////////////////

var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");

//////////////////////////////////////////////////////////////////////
// PREPARATION
//////////////////////////////////////////////////////////////////////

// Define directories.
var artifactsDir  = Directory("./artifacts/");
var rootAbsoluteDir = MakeAbsolute(Directory("./")).FullPath;

//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////

Task("Clean")
    .Does(() =>
{
    CleanDirectory(artifactsDir);
});

Task("Restore-NuGet-Packages")
    .IsDependentOn("Clean")
    .Does(() =>
{
    NuGetRestore("./Sloader.sln");
});

Task("Build")
    .IsDependentOn("Restore-NuGet-Packages")
    .Does(() =>
{

     
});

Task("BuildTests")
    .IsDependentOn("Restore-NuGet-Packages")
    .Does(() =>
{
	var parsedSolution = ParseSolution("./Sloader.sln");

	foreach(var project in parsedSolution.Projects)
	{
	
	if(project.Name.EndsWith(".Tests"))
		{
        Information("Start Building Test: " + project.Name);

        MSBuild(project.Path, new MSBuildSettings()
                .SetConfiguration("Debug")
                .SetMSBuildPlatform(MSBuildPlatform.Automatic)
                .SetVerbosity(Verbosity.Minimal)
                .WithProperty("SolutionDir", @".\")
                .WithProperty("OutDir", rootAbsoluteDir + @"\artifacts\_tests\" + project.Name + @"\"));
		}
	
	}    

});

Task("RunTests")
    .IsDependentOn("BuildTests")
    .Does(() =>
{
    Information("Start Running Tests");
    XUnit2("./artifacts/_tests/**/*.Tests.dll");
});

//////////////////////////////////////////////////////////////////////
// TASK TARGETS
//////////////////////////////////////////////////////////////////////

Task("Default")
    .IsDependentOn("RunTests");

//////////////////////////////////////////////////////////////////////
// EXECUTION
//////////////////////////////////////////////////////////////////////

RunTarget(target);

Explanation: BuildTests?

The default target “Default” will trigger “RunTests”, which depend on “BuildTests”.

Inside the “BuildTests”-target we use a handy helper from Cake and we parse the .sln file and search all “Test”-projects. With that information we can build each test individually and don’t have to worry over “overlapping” files. The output of this build will be saved at “artifacts/_tests”.

Running xUnit

To run xUnit we have to include the runner at the top of the cake file:

#tool "nuget:?package=xunit.runner.console"

Now we can just invoke XUnit2 and scan for all Tests.dlls and we are done:

XUnit2("./artifacts/_tests/**/*.Tests.dll");

Result

The console output should make the flow pretty clear:

PS C:\Users\Robert\Documents\GitHub\Sloader> .\build.ps1
Preparing to run build script...
Running build script...
Analyzing build script...
Processing build script...
Installing tools...
Compiling build script...

========================================
Clean
========================================
Executing task: Clean
Creating directory C:/Users/Robert/Documents/GitHub/Sloader/artifacts
Finished executing task: Clean

========================================
Restore-NuGet-Packages
========================================
Executing task: Restore-NuGet-Packages
MSBuild auto-detection: using msbuild version '14.0' from 'C:\Program Files (x86)\MSBuild\14.0\bin'.
All packages listed in packages.config are already installed.
Finished executing task: Restore-NuGet-Packages

========================================
BuildTests
========================================
Executing task: BuildTests
Start Building Test: Sloader.Config.Tests
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

  Sloader.Config -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Config.Tests\Sloader.Config.dll
  Sloader.Config.Tests -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Config.Tests\Sloader.Config
  .Tests.dll
Start Building Test: Sloader.Result.Tests
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

  Sloader.Result -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Result.Tests\Sloader.Result.dll
  Sloader.Result.Tests -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Result.Tests\Sloader.Result
  .Tests.dll
Start Building Test: Sloader.Engine.Tests
Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

  Sloader.Config -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Config.dll
  Sloader.Result -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Result.dll
  Sloader.Engine -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Engine.dll
  Sloader.Engine.Tests -> C:\Users\Robert\Documents\GitHub\Sloader\artifacts\_tests\Sloader.Engine.Tests\Sloader.Engine
  .Tests.dll
Finished executing task: BuildTests

========================================
RunTests
========================================
Executing task: RunTests
Start Running Tests
xUnit.net Console Runner (64-bit .NET 4.0.30319.42000)
  Discovering: Sloader.Config.Tests
  Discovered:  Sloader.Config.Tests
  Starting:    Sloader.Config.Tests
  Finished:    Sloader.Config.Tests
  Discovering: Sloader.Engine.Tests
  Discovered:  Sloader.Engine.Tests
  Starting:    Sloader.Engine.Tests
  Finished:    Sloader.Engine.Tests
  Discovering: Sloader.Result.Tests
  Discovered:  Sloader.Result.Tests
  Starting:    Sloader.Result.Tests
  Finished:    Sloader.Result.Tests
=== TEST EXECUTION SUMMARY ===
   Sloader.Config.Tests  Total: 22, Errors: 0, Failed: 0, Skipped: 0, Time: 0.342s
   Sloader.Engine.Tests  Total:  9, Errors: 0, Failed: 0, Skipped: 0, Time: 0.752s
   Sloader.Result.Tests  Total:  4, Errors: 0, Failed: 0, Skipped: 0, Time: 0.475s
                                --          -          -           -        ------
                   GRAND TOTAL: 35          0          0           0        1.569s (3.115s)
Finished executing task: RunTests

========================================
Default
========================================
Executing task: Default
Finished executing task: Default

Task                          Duration
--------------------------------------------------
Clean                         00:00:00.0155255
Restore-NuGet-Packages        00:00:00.5065704
BuildTests                    00:00:02.1590662
RunTests                      00:00:03.2443534
Default                       00:00:00.0061325
--------------------------------------------------
Total:                        00:00:05.9316480

Norbert Eder: So stellst du das Target-Framework in großen .NET-Solutions schnell um

Ich weiß schon, offiziell gibt es sie nicht, diese großen Solutions mit 100+ Projekten darin. Wer aber doch mit einer solchen zu tun hat und die Target-Version des .NET Frameworks umstellen möchte, der hat sehr viel Handarbeit vor sich.

Mit dem entsprechenden Tooling geht es leichter: Target Framework Migrator.

Es handelt sich dabei um eine Visual Studio Extension, die es für 2010, 2013 und 2015 gibt und via Extensions and Updates installiert werden kann:

Target Framework Migrator Installation

Target Framework Migrator Installation

Nach der Installation muss Visual Studio neu gestartet werden. Danach findet sich unter Tools / Target Framework Migrator das Tool:

Target Framework Migrator in Action

Target Framework Migrator in Action

Darin sieht man alle Projekte der Solution und deren aktuelles Target Framework. Es ist einfach die neue Target-Version auszuwählen. Danach die umzustellenden Projekte markieren und Migrate wählen. Danach zurücklehnen oder Kaffee trinken gehen. Der Vorgang dauert, da jedes Projekt geschlossen, aktualisiert und wieder geöffnet wird. Sind wirklich sehr viele Projekte betroffen, empfiehlt es sich, diesen Vorgang in Pakete zu unterteilen (mir ist bei > 100 Projekten das Visual Studio abgeschmiert).

Es ist zwar nicht die perfekte Lösung, funktioniert aber für mittelgroße Projekte ganz gut.

The post So stellst du das Target-Framework in großen .NET-Solutions schnell um appeared first on Norbert Eder.

AIT: HoloLens: Evaluierung der 3D Grafikleistung

Im Gegensatz zu normalen Desktopanwendungen ist die Bildwiederholungsrate bei Virtual – und Augmented Reality Anwendungen kritisch. Je geringer die Bildwiederholungsrate ist, desto stärker hängt das virtuelle Bild der Realität nach. Dieser Effekt führt zur sogenannten Simulator Sickness. Um virtuelle Anwendungen nicht nur für kurze Tests, sondern auch über längere Zeitspannen verwenden zu können, ist eine konstant hohe Bildwiederholungsrate von hoher Wichtigkeit. Hoch detaillierte Modelle und komplexe Shader, wie sie heutzutage Standardmäßig eingesetzt werden, stehen dabei im genauen Widerspruch zur vergleichsweise leistungsschwachen Hardware in der HoloLens. In diesem Blogpost wird gezeigt, wie viel grafische Rechenleistung in der Augmented Reality Brille steckt. Die Ergebnisse sollen eine Orientierung für die Konzeption von Anwendungen für die HoloLens bieten.

Zur Evaluierung der Grafikleistung der HoloLens werden verschiedene Einsatzszenarien mit jeweils unterschiedlicher Komplexität betrachtet. Ziel ist es dabei herauszufinden bis zu welcher Komplexität die Bildwiederholungsrate von 60Hz nicht unterschritten wird. Natürlich geben diese simplen Tests keine genaue Auskunft über die Grafikleistung. Es genügt aber um ein Gefühl für die Möglichkeiten der HoloLens Hardware zu bekommen.

In HoloLens Anwendungen treten immer wieder ähnliche Einsatzszenarien auf. Um ein realistischeres Ergebnis zu erhalten werden verschiedene dieser Einsatzszenarien getestet. Die getesteten Einsatzszenarien sind:

  • Reine Visualisierung: Dieses Szenario deckt Anwendungen ab, welche keine Interaktion zulassen und nur über die Fähigkeit zum Betrachten eines virtuellen Objekts verfügen.
  • Klassisches (AR/VR-) Einsatzszenario: Dieses Szenario ist die Grundlage für einen Großteil der HoloLens Anwendungen. Neben dem Betrachten von Hologrammen sind Interaktionen über Handgesten und Spracherkennung möglich. Zusätzlich wird ein interaktiver Zeiger angezeigt.
  • Verdeckung durch reale Objekte. Dieses Szenario verfügt über alle Eigenschaften des vorherigen Szenarios, es werden aber zusätzlich die von der HoloLens generierten Dreiecksmesh Spatial Mapping Informationen eingelesen und zur Verdeckung von eigenen Objekten verwendet. Es wird so ermöglicht, dass virtuelle Objekte, die sich hinter einem realen Objekt befinden, ausgeblendet werden.
  • Anzeigen von Spatial Mapping (Dreiecksnetz). In diesem Szenario werden die Spatial Mapping Informationen der HoloLens mit Hilfe eines Drahtgitters visualisiert, sodass die Platzierung von virtuellen Objekten im Raum für den Benutzer erleichtert wird.

clip_image002

Jedes dieser Szenarien wurde mit verschiedenen Dreiecksanzahlen und Shadern getestet. Die Benchmark-Anwendung besteht aus einer sich bewegenden Punktlichtquelle und texturierten Kugeln (siehe Screenshot). Die Kugeln werden zufällig im Sichtfeld der Hololens verteilt, sodass immer alle Kugeln zu sehen sind. Zu Beginn eines Tests werden die für die Dreiecksanzahl benötigten Kugeln initialisiert. Nach einer kurzen Verzögerung zur Stabilisierung der Anwendung wird für sechzig Sekunden die Bildwiederholungsrate gemessen. Nach Abschluss des Tests wird die durchschnittliche Bildwiederholungsrate ausgegeben.

Ergebnisse der Messungen

Das Display der HoloLens arbeitet mit 60Hz. Da die Anwendung auf die vertikale Synchronisation des Displays wartet, kann die Frequenz von 60Hz nicht überschritten werden. Außerdem ist zu beobachten, dass die Frequenz sich in den meisten Fällen auf 60Hz, 30Hz oder 20Hz festsetzt. Dies ist dadurch zu erklären, dass ein Berechnungszyklus immer ähnlich lange dauert und deshalb entweder jeden, jeden zweiten oder jeder dritten Zyklus des Displays der Bildspeicher aktualisiert wird. Zwischen diesen Werten existieren instabile Zwischenwerte. Bei einer Bildwiederholungsrate von beispielsweise 45Hz benötigt der Render-Zyklus in 50% der Fälle kurzer als einen Displayzyklus und in 50% der Fälle länger. Die Gefahr besteht darin, dass eine geringe Erhöhung der Komplexität dazu führt, dass der Render-Zyklus immer länger als einen Display-Zyklus benötigt und die Bildwiederholungsrate sehr schnell auf 30Hz abfällt.

clip_image004

Zum Vergleich der einzelnen Shader eignet sich das erste Szenario am besten, da es unabhängig von Umgebungen und sonstigen Einflüssen ist. Mit dem HoloToolkit werden mehrere angepasste Shader mitgeliefert, so auch der Standard Fast Shader. Dieser ist eine auf HoloLens angepasst Variante des Unity Standard Shaders. In den Ergebnissen zeigt sich aber, dass dieser Shader nicht signifikant schneller ist.

Im Vergleich zu diesen beiden hochqualitativen Shadern bringt der Einsatz eines einfachen Vertex Lit Shaders einen enormen Geschwindigkeitsvorteil. Der damit verbundene Qualitätsverlust ist vor allem bei großen Dreiecken sichtbar.

Der Einsatz eines Unlit Shaders kann die Geschwindigkeit weiter steigern. Die Beleuchtung spielt allerdings bei der Erfassung eines Modells oder einer kompletten Szene eine besondere Rolle. Durch das Verzichten auf Beleuchtung können Strukturen und relative Positionen der Modelle trotz 3D Sicht der Brille nicht verlässlich erkannt werden. Aus diesem Grund sollte der Unlit Shader nur mit Vorsicht eingesetzt werden.

Die Anzahl der maximal darstellbaren Dreiecke reicht von circa 60000 für den Standard Shader bis zu circa 100000 für den Unlit Shader. Die geringe Anzahl bedeutet nicht das nur so viele Dreiecke in der Szene sein dürfen, sondern das nicht mehr Dreiecke auf einmal im Sichtfeld angezeigt werden können. Durch verschiedene Verfahren wie zum Beispiel LOD kann die Komplexität einer Szene verringert und so beherrschbar für die HoloLens werden.

clip_image006

clip_image008

clip_image010

Durch Betrachtung der verschiedenen Szenarios ist zu sehen, dass neben dem Rendering auch die Gesten und Spracherkennung sowie der interaktive Zeiger nicht außer Acht gelassen werden können. Selbst im klassischen Einsatzszenario muss die Komplexität der Szene reduziert werden.

Ein besonderes Augenmerk muss dabei auf das Einlesen und Anzeigen des generierten Dreiecksnetzes der Umgebung gelegt werden. Durch die Unvorhersehbarkeit der Größe und Komplexität des Raumes kann der Einfluss auf die Performance stark variieren. Selbst in einem durchschnittlichen Büro ist die HoloLens oft nur durch das Anzeigen des Dreiecksnetzes schon ausgelastet, sodass nur wenige weitere Objekte gerendert werden können.

Fazit

Um die Bildwiederholungsrate auf konstanten 60Hz zu halten, muss bei jedem Objekt versucht werden auf komplexe Geometrie zu verzichten und wenn möglich Vertex Shader oder sogar Unlit Shader zu verwenden. Die Diagramme in diesem Kapitel können als Richtwert beim Design einer Anwendung dienen. Die grafische Komplexität und die damit verbundene Bildwiederholungsrate sollten im kompletten Entwicklungsprozess dauerhaft überwacht werden um nicht am Ende eine unbefriedigende Anwendungserfahrung zu erhalten.

Hans-Peter Schelian: Neuer Server neues Glück – Blog Umzug ist vollzogen

Nachdem es lange Zeit "sehr" still rund um meinen Blog war, möchte ich den gerade vollzogenen Umzug meines Blog auf einen neuen Server auch dazu nutzen wieder regelmäßig zu bloggen.

Mit dem Umzug auf den neuen Server habe ich auch gleich das Zertifikat Thema aktualisiert.

Ab sofort setze ich hier im Blog ein Zertifikat von Letsencrypt ein.

Golo Roden: Einführung in Node.js, Folge 5: Middleware

Express enthält die Basisfunktionen für das Entwickeln von Web-APIs. Zum Erweitern der Funktionalität kennt Express das Konzept der Middleware, die Cross-Cutting-Concerns behandelt. Einige der verfügbaren Middleware-Module benötigt man immer wieder, unter anderem für Cookies und Session-Handling – ein Überblick.

Sebastian Seidel: How to workaround Xamarin.Androids VersionCode limitation

We recently faced a problem that a customer published a version of his app that has a version code higher than 65.535 defined in the manifest file. All new builds have to have greater version codes. But building an Xamarin.Android app with that requirement will fail with the message: Error executing task Aapt: VersionCode is outside 0, 65535 interval. In this post I describe possible ways to work around this Xamarin.Android magic number when resetting the build-systems build number isn't an option.

Norbert Eder: Legacy Code und der Mensch

Zum Thema Legacy Code gibt es schon wirklich sehr viele Artikel und Bücher und dennoch ist es immer wieder ein großes Thema, wie damit umgegangen werden soll. Auch ich habe mich im Beitrag Wie gehe ich mit Legacy Code um mit diesem Thema beschäftigt. Es gibt neben dem technischen, aber auch noch einen menschlichen Aspekt. Diesen möchte ich in diesem Artikel beleuchten.

Technisch gesehen ist das Thema Legacy Code im Grunde recht einfach. Es gilt Zyklen zu finden und diese aufzulösen. Klare Schnittstellen wollen geschaffen werden, vor allem auch, nicht nur um zu entkoppeln, sondern auch automatisiert testen zu können. Mit kleinen Änderungen soll begonnen werden, aber irgendwann dann ist alles gut.

Große Projekte – lange Historie

Wer einmal an richtig großen, über viele Jahre gewachsenen, Projekten mitgearbeitet hat, der weiß, was da alles dahintersteckt. Da geht es nicht nur um Sourcecode, Architektur und Patterns. Es geht um Menschen, deren Geschichten, Sympathie oder Antipathie, Teamgeist oder aber auch Egoismus. Wer sich durchsetzt, prägt das Projekt. Auf Seiten der Entwicklung können mindestens folgende Typen identifiziert werden:

Der Nerd

Er sucht nach neuen Libraries, Tools und Frameworks und integriert dies in kürzester Zeit ins Projekt. Damit werden in bestimmten Bereichen zwar schnelle Fortschritte erzielt (mit denen er im Management punktet), die Fertigstellung muss allerdings durch andere passieren, da bereits das nächste neue “Thing” wartet.

Der Enterprise-Architekt

Jeder mögliche Fall wird durch den Enterprise-Architekten entlarvt und in ein Software-Design gepresst. Nichts wird dem Zufall überlassen. Das Projekt wird dadurch komplex, dafür ist für alle Eventualitäten vorgesorgt. Wird etwas doch nicht gebraucht, dann hat man es zumindest doch berücksichtigt, denn irgendwann, ja irgendwann, braucht es bestimmt jemand. Ganz sicher.

Der Dampfplauderer

Ideen gibt es viele und auch vieles davon ist bereits in Umsetzung und was nicht gerade in Umsetzung ist, wird gerade geplant und auf Papier gebracht. Doch nichts davon wird jemals konkret definiert sein und dem Projekt weiterhelfen. Es dreht sich alles um den positiven Schein der eigenen Person. Die Entwickler sind sich selbst überlassen.

Keiner der angesprochenen Typen bleibt ewig. Sie widmen sich entweder neuen Themen, oder verlassen das Unternehmen um neue Chancen wahr zu nehmen. Übrig bleiben diejenigen, die mit den angehäuften “Schulden” umgehen müssen.

Aufarbeitung der Schulden

Anleitungen zur Aufarbeitung der Schulden gibt es viele. In der Regel beschreiben sie jedoch nur die ideale Herangehensweise. In der Praxis ist das allerdings weit komplizierter. Warum?

Projektdruck

Besonders negativ wird sich Projektstress auf die Entwicklung aus, vor allem, wenn es schon eine Menge technischer Schulden gibt und das Entwicklungsteam dadurch bereits mit besonderen Herausforderungen zu kämpfen hat. Dabei ist es in der Regel irrelevant, wodurch dieser Stress/Druck entsteht (Planung, mangelndes Anforderungsmanagement, übertriebene Architekturen/Umsetzungen in der Entwicklung). Je höher der Produktcharakter des “Projektes” umso mehr (unterschiedliche) Kundenanforderungen beeinflussen die Umsetzung. Wenn diesbezüglich keine klaren Vorgaben bestehen (und von Beginn an umgesetzt wurden), entsteht schnell ein Wildwuchs an Umsetzungsvarianten, der eine Pflege und Erweiterung immer aufwändiger gestaltet.

Frust

Im Laufe der Jahre wird Software (wenn nicht permanent entgegengesteuert wird) immer komplexer und die Wartung sowie Integration neuer Features immer langwieriger. Ich definiere Legacy Code als Code, der nicht durch automatisierte Tests abgesichert ist. Änderungen und Erweiterungen bringen somit unerkannt Probleme an zuvor funktionierenden Stellen mit sich. Durch das Fehlen von Tests fällt das natürlich nicht sofort auf. Je nach Größe und Komplexität der Software fällt ein etwaiges Problem erst beim Kunden auf und muss dann unter Zeitdruck behoben werden. Das artet in Stress und über einen längeren Zeitraum in Frust aus. Frust motiviert bekanntlich nicht und schon befindet man sich in einer Teufelsspirale, aus der es kaum ein Entrinnen gibt.

Oftmals müssen sich Entwickler auch mit Problemen herumschlagen, für die sie sich nicht verantwortlich fühlen, weil sie frühere Entscheidungen nicht mitgetragen haben weil sie noch nicht teil des Entwicklungsteams waren oder aber überstimmt wurden.

Dem Frust folgt langsam aber sicher Resignation und die oft zitierte innere Kündigung. Gerne auch von der tatsächlichen Kündigung gefolgt. Das Projekt beginnt unter einer hohen Fluktuation an Entwicklern zu leiden.

Schwindendes Know-how

Eine hohe Fluktuation bedeutet zwangsweise auch einen hohen Schwund an Know-how. Wenn wir von ausgeprägtem Legacy Code sprechen, dann finden wir in der Regel auch ganz selten eine wirklich gute technische Dokumentation. Ich kenne Projekte, die mit einer ordentlich beschriebenen Architektur gestartet sind, aber getroffene Entscheidungen wurden nicht mehr ausreichend dokumentiert und konnten daher zu einem späteren Zeitpunkt durch die anwesenden Entwickler nicht mehr nachvollzogen werden. Das ist ein großes Problem, gerade wenn das vorgefundene Design merkwürdig erscheint und die Funktionsweise nicht eindeutig nachvollzogen werden kann.

Menschliche Herausforderung

Der Umgang mit Legacy Code ist also nicht bloß eine technische Herausforderung, sondern auch eine menschliche. Neben einer hohen Motivation und Frustresistenz muss selbst in stressigen Zeiten Ruhe bewahrt werden. Das höchste Ziel muss es sein, die Situation nicht noch zusätzlich verschlechtern, selbst wenn ein weiterer Workaround eigentlich gar nicht mehr ins Gewicht fallen würde.

Zusätzlich braucht es jede Menge Mut zur Veränderung. Kleine Rückschläge dürfen nicht für Verunsicherung sorgen. Das sagt sich leichter als es umgesetzt werden kann und genau hierbei sehe ich das wahre Problem an Legacy Code.

Der ständige Spagat zwischen “Das alles muss bis xx.xx fertig sein” und “Wenn wir hier nicht eine Änderung herbeiführen, dann wird es niemals besser” ist nicht einfach zu bewerkstelligen.

Deine Erfahrung?

Für mich ist es essentiell, alle Beteiligten immer wieder zu motivieren und anzuhalten, im schlimmsten Fall die “technischen Schulden” stabil zu halten, also zumindest keine Verschlechterung zuzulassen. Ein Allheilmittel hätte ich allerdings noch nicht gefunden, denn Frust oder eine zeitweise Aussichtslosigkeit (gerade wenn mehrere Probleme auftreten, oder Projektstress herrscht) kann schnell zuschlagen und nicht alle können (auf Dauer) damit gut umgehen.

Wie ist deine Erfahrung mit diesem Thema? Wie gehst du mit den menschlichen Herausforderungen zum Thema Legacy Code um? Welche Wege hast du, andere zu motivieren? Habt ihr Mechanismen etabliert, um auch in Extremsituationen die technischen Schulden nicht noch weiter zu erhöhen?

Wenn du dazu eine Meinung oder Erfahrungen hast, bitte ich dich um ein paar Minuten deiner Zeit für einen Kommentar.

The post Legacy Code und der Mensch appeared first on Norbert Eder.

Golo Roden: Logging für Cloud-Anwendungen

Die Entwicklung von Anwendungen für die Cloud folgt anderen Richtlinien als die für serverseitige Webanwendungen. Welche Auswirkungen hat das auf das Schreiben von Lognachrichten?

Manfred Steyer: 5 things you wouldn't necessarily expect when using AOT and Tree Shaking in Angular

AOT speeds up the application especially the startup because templates are already compiled during build. In addition to this, tree shaking reduces the needed file size by removing unused code. But there are some things, one wouldn't necessarily expect. This article presents five of them, we discovered and researched when working with it.

This article has been written after some very insightful conversations with Carmen Popoviciu. She pointed out issues regarding AOT and Tree Shaking, helped me to discover them and their origins and reviewed this article. Big thanks for this.

The most obvious: EcmaScript Modules

Let's start here with the most obvious and least surprising fact: You need sources based on EcmaScript 2015 for tree shaking. At least you need to use EcmaScript Modules introduced with EcmaScript 2015. Those modules use the well known import and export statements which allow for a static code analysis which is the foundation for finding unused code.

It is possible to use a combination of EcmaScript 5 and EcmaScript Modules to support a wider range of tools like webpack 2 which - at the time of this writing - does not support EcmaScript 2015 but leverages import and export statements for tree shaking.

Currently, the product team ships the Angular modules using this exact combination (besides additional UMD bundles). As the next section shows, this has a drawback, as there are some limitations when it comes to analyzing EcmaScript 5 code for tree shaking.

Current Limitations for Tree Shaking

Examples for Tree Shaking clearly show that it brings benefits in terms of file size. But at the time of this writing, there is much room for improvement. This mostly has to do with the fact that tools for tree shaking like Rollup and webpack2 cannot guarantee for every situation that removing unused code is safe. This is especially the case in situations where the code could introduce side effects, like changing a global variable. Therefore, these tools don't remove as much code as possible.

As a matter of fact, this holds true for the Object.defineProperty method, which mutates the first passed object. Unfortunately, this very method is used when transpiling class members down to EcmaScript 5 and therefore affects several parts of Angular as well as libraries like Angular Material.

One can find such parts of code by activating output warning within the webpack configuration for instance. This makes UglifyJS list every part of the bundle which it doesn't remove because of the mentioned reason:

new webpack.optimize.UglifyJsPlugin({
    compress: {
        warnings: true
    },
    output: {
        comments: true
    },
    sourceMap: false
}),

Another interesting experiment is to import a library like Angular Material into the AppModule without using it at all. Normally, one would expect that it is tree shaken but for the reason discussed here this leads to a bigger bundle.

Further information about this can be found inside the issues of webpack and rollup.

The myth about smaller bundles

In general, one would expect smaller bundles as the result of AOT and Tree Shaking. While this should be true for tree shaking, AOT compiles templates down to JavaScript code that is bigger. In small projects this isn't necessarily noticed, as the usage of AOT allows for omitting the code for JIT compilation. But with a growing number of templates the increase in file size due to the larger emitted JavaScript code outweighs this.

SASS and other Stylesheet Languages

As we found out, there is also an issue when using the AOT compiler together with SASS and SCSS. It cannot deal with it and yields errors. The webpack-plugin discussed here automatically deals with this situation when there is a webpack loader for it.

Libraries need to support AOT and Tree Shaking

In order to shake unused code off from libraries and to use them with AOT, they also have to support it. This not only means that they have to provide the code using EcmaScript Modules. They also have to provide some meta data, especially meta data for Angular's AOT compiler.

None other than Minko Gechev wrote a wonderful article about this. At the end, it also provides a check list with all the things one should consider.

Manfred Steyer: Slides and Sample from my talk about Lazy Loading with Angular from Angular Munich in Jan 2017

Below, you find my slides and samples from my talk about lazy loading with Angular I did at Angular Munich in Jan 2017:

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