Golo Roden: Gelesen: "Zero to One"

Der US-amerikanische Investor und Unternehmer Peter Thiel, der unter anderem PayPal und Palantir gegründet hat, hat ein Buch geschrieben: "Zero to One". Darin beschreibt er, warum Technologie und nicht Globalisierung die treibende Kraft für die Zukunft ist und worauf beim Aufbau eines Start-ups zu achten sei.

Christian Dennig [MS]: Einstieg in Azure Resource Manager

Moderne Applikationen, die in Azure gehostet werden, bestehen aus vielen verschiedenen Komponenten / Services, die untereinander kommunizieren, Daten austauschen und zwischen denen eine mehr oder minder große Abhängigkeit besteht. Schon einfache Anwendungen bestehen aus einer Datenbank, einem Cache, einer API, einer Webseite usw.  – also vielen einzelnen Komponenten, die gemanaget sein wollen.

Azure Portal

Um die oben genannten Dienste in Azure zu erstellen und zu verwalten, stellt Microsoft als ersten Anlaufpunkt das Azure Portal bereit. Die Oberfläche bietet eine komfortable UI, mit der man alle von Azure angebotenen Services erstellen und managen kann. Es eignet sich hervorragend für Entwickler, die schnell einen Service ausprobieren möchten, für das Erstellen einfacher Prototypen oder einen Proof-Of-Concept – auch kleinere Projekte lassen sich ausreichend gut über das Portal verwalten.

portal
Azure Portal

Es hat jedoch auch seine Nachteile – gerade dann, wenn ein Projekt größer wird und mehrere Personen gleichzeitig an der Infrastruktur arbeiten. Wer kann nachvollziehen, wieso diese eine Einstellung, die aktuell Probleme verursacht, vor zwei Wochen über das Portal an der Web-App gemacht wurde?! Wer hat die Anzahl der Instanzen innerhalb eines VM Scale Sets von „4“ auf „6“ gestellt – und vor allem wieso? Wieso wurde diese eine Resource gelöscht und wer weiß, wie sie nun wiederhergestellt werden kann? Ja, für solche Dinge gibt es auch „Role-Based Access Control„, um zu verhindern, dass bestimmte Personen / Rollen Einstellungen vornehmen können. Spätestens jedoch, wenn die ganze Infrastruktur neu erstellt werden muss (mit allen Abhängigkeiten untereinander), kommt man zu der Einsicht, dass man seine Umgebung auf eine andere Art und Weise managen muss.

Azure Resource Manager / Templates

Bevor man in den Azure Resource Manager und die dazugehörigen Templates einsteigen kann, muss man zunächst einige Begrifflichkeiten klären:

  • Resource – ein über Azure verwaltbares Element. Beispiel: eine virtuelle Maschine, eine Datenbank, eine Web App, Einstellungen einer Web App usw.
  • Resource Group – ein Container für Resources. Eine Ressource kann ohne eine Resource Group (RG) nicht in Azure existieren. Deployments von Ressourcen werden immer auf einer RG ausgeführt. Typischerweise werden Ressourcen mit dem gleichen Lifecycle in eine Gruppe gepackt.
  • Resource Provider – ein Dienst zum Erstellen einer Ressource über den Azure Resource Manager. Beispiel „Microsoft.Web“, um eine Web App zu erstellen. „Microsoft.Storage“, zur Erstellung eines Storage Accounts usw.
  • Azure Resource Manager (ARM) Templates – eine JSON Datei, die eine oder mehrere Ressourcen beschreibt, die über ein Deployment in eine Resource Group bereitgestellt werden. Die Vorlage kann zum konsistenten und wiederholten Bereitstellen der Ressourcen verwendet werden.

Wie nun aus den oben bereitgestellten Informationen abgeleitet werden kann, ist der Azure Resource Manager (ARM) die Komponente in der Azure Cloud, die sich um das Bereitstellen und Verwalten von Ressourcen kümmert. Über ARM werden einzelne Dienste oder Gruppen von Ressourcen gemanaget. Auch können ARM Templates verwendet werden, um eine Infrastruktur wiederholt zu deployen.

Ein, wie ich finde, großer Vorteil bei der Verwendung von ARM Templates ist die Nachvollziehbarkeit von Änderungen an der Infrastruktur. Denn Templates können gemeinsam mit dem Quellcode der Applikation in die jeweilige Source Code Verwaltung abgelegt werden. Hat man im Entwicklungsprozess Continuous Integration/Deployment etabliert, kann man z.B. aus Jenkins, TeamCity oder Visual Studio Team Services heraus das Deployment der Infrastruktur erledigen und niemand muss sich mehr um ein Update der Umgebung kümmern – Web Apps, Datenbanken, Caches usw. werden bereitgestellt, danach erfolgt das Deployment der eigentlichen Applikation (entweder in einem Schritt oder separat) – es sind keinerlei manuelle Schritte mehr notwendig.

Aber – first things first – wie sieht ein einfaches ARM Template aus? Hier ein Beispiel einer einfachen Web App:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "hostingPlanName": {
      "type": "string",
      "defaultValue": "mytestappplan",
      "minLength": 1
    },
    "skuName": {
      "type": "string",
      "defaultValue": "S1",
      "allowedValues": [
        "S1",
        "S2",
        "S3"
      ],
      "metadata": {
        "description": "Describes plan's pricing tier and capacity. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/"
      }
    },
    "skuCapacity": {
      "type": "int",
      "defaultValue": 1,
      "minValue": 1,
      "metadata": {
        "description": "Describes plan's instance count"
      }
    }
  },
  "variables": {
    "webSiteName": "[concat('webSite', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "apiVersion": "2015-08-01",
      "name": "[parameters('hostingPlanName')]",
      "type": "Microsoft.Web/serverfarms",
      "location": "[resourceGroup().location]",
      "tags": {
        "displayName": "HostingPlan"
      },
      "sku": {
        "name": "[parameters('skuName')]",
        "capacity": "[parameters('skuCapacity')]"
      },
      "properties": {
        "name": "[parameters('hostingPlanName')]"
      }
    },
    {
      "apiVersion": "2015-08-01",
      "name": "[variables('webSiteName')]",
      "type": "Microsoft.Web/sites",
      "location": "[resourceGroup().location]",
      "tags": {
        "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]": "Resource",
        "displayName": "Website"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
      ],
      "properties": {
        "name": "[variables('webSiteName')]",
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
      }
    }
  ]
}

 

Zugegeben, auf den ersten Blick sieht ein solches Template wild aus und für eine einzelne Webseite wohl auch aufwandstechnisch übertrieben, bei genauerer Betrachtung (und umfangreichen Infrastrukturen) allerdings, löst sich dieser Eindruck schnell wieder auf.

Ein ARM Template besteht in der Regel aus mehreren Teilen:

  • Parameters – Parameter, die von außen an das Template weitergereicht werden. Beispiel im oben genannten Template: „hostingPlanName“. Parameter können typisiert und mit Default-Werten oder erlaubten Werten („allowedValues“) ausgestattet sein.
  • Variables – Variablen zur internen Verwendung. Typischerweise werden Parameter „aufbereitet“, z.B. Namen konkateniert, und in Variablen zur späteren Verwendung gespeichert. Beispiel im oben genannten Template: „webSiteName“.
  • Resources – die eigentlichen Ressourcen, die erstellt werden sollen
  • Outputs – Ausgabe-Parameter, die nach der Erstellung der Ressourcen an den Aufrufer zurückgegeben werden.

Im Template können einfache Funktionen, wie z.B. concat, uniqueString oder toLower verwendet werden, um mit Variablen zu arbeiten. Eine genaue Übersicht der möglichen Funktionen findet sich hier: https://docs.microsoft.com/de-de/azure/azure-resource-manager/resource-group-template-functions

Für die Erstellung der Ressourcen ist wie oben bereits erwähnt, der Abschnitt „Resources“ im Template zuständig. Hier werden die für den Resource Provider geltenden Einstellungen definiert. Jeder Provider Typ bietet verständlicherweise andere Parameter und Abschnitte zur Konfiguration der zu erstellenden Ressource an – die entsprechenden Dokumentationen pro Provider findet man hier unter dem Punkt Reference: https://docs.microsoft.com/en-us/azure/templates/

Im Beispiel-Template wird u.a. eine Web-App erstellt – der zuständige Resource Provider ist hier „Microsoft.Web/sites„. Ein wichtiges Element im hier erwähnte Abschnitt ist der Punkt „dependsOn“. Über dieses Array können unter Angaben der Resource-Id Abhängigkeiten untereinander definiert werden. In diesem speziellen Fall bedeutet…

"dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
]

…dass die Web-App abhängig vom App-Service Plan („Microsoft.Web/serverfarms/„) ist, in den die App deployt wird – was auch logisch erscheint. Über die dependsOn-Angaben kann der Azure Resource Manager einen Deployment-Tree aufbauen und so mit Erstellung der Ressourcen zuerst beginnen, auf die andere eine Abhängigkeit haben.

Das Template kann schlussendlich über verschiedene Wege an den Resource Manager übergeben werden:

  • Powerhell
  • Azure CLI
  • REST
  • Visual Studio

Ich arbeite gerne mit der Azure CLI, da diese plattformübergreifend auf MacOS, Linux und Windows zur Verfügung steht, deshalb hier nun das Beispiel mit der CLI:

Zunächst muss eine Resource Group erstellt werden (falls nicht vorhanden):

az group create --name testdeployment --location westeurope

Nach erfolgreicher Ausführung sollte die Ausgabe folgendermaßen aussehen:

{
  "id": "/subscriptions/[subscriptionid]/resourceGroups/testdeployment",
  "location": "westeurope",
  "managedBy": null,
  "name": "testdeployment",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Im Anschluss kann das eigentliche Deployment durchgeführt werden („WebSite.json“ ist das Template-File mit den oben dargestellten Inhalten im aktuellen Verzeichnis):

az group deployment create --mode complete --resource-group testdeployment --template-file .\WebSite.json --verbose

Im hier verwendeten Beispiel wird der Modus „complete“ benutzt, um das Template anzuwenden. Es gibt zwei Modi, die verwendet werden können:

  • Complete – Ressourcen, die nicht in der Vorlage vorhanden sind, aber in der Resource Group existieren, werden gelöscht.
  • Incremental – Ressourcen, die nicht in der Vorlage vorhanden sind, aber in der Resource Group existieren, bleiben unverändert

Beide Modi haben Vor- bzw. Nachteile und man muss den für sich passenden Modus herausfinden. Complete sagt mir persönlich mehr zu, da man mit diesem Modus die komplette Infrastruktur beschreibt, wie sie nach dem Deployment aussehen soll.

Nach kurzer Zeit ist das Deployment erfolgreich durchgeführt und das Kommando liefert die Ergebnisse vom Azure Resource Manager zurück.

{
  "id": "/subscriptions/[subscriptionid]/resourceGroups/testdeployment/providers/Microsoft.Resources/deployments/WebSite",
  "name": "WebSite",
  "properties": {
    "correlationId": "1fbfa8f1-44dd-483c-ab9b-38296cd834b7",
    "debugSetting": null,
    "dependencies": [
      {
        "dependsOn": [
          {
            "id": "/subscriptions/[subscriptionid]/resourceGroups/testdeployment/providers/Microsoft.Web/serverfarms/mytestappplan",
            "resourceGroup": "testdeployment",
            "resourceName": "mytestappplan",
            "resourceType": "Microsoft.Web/serverfarms"
          }
        ],
        "id": "/subscriptions/[subscriptionid]/resourceGroups/testdeployment/providers/Microsoft.Web/sites/webSitesycktqb3r6rze",
        "resourceGroup": "testdeployment",
        "resourceName": "webSitesycktqb3r6rze",
        "resourceType": "Microsoft.Web/sites"
      }
    ],
    "mode": "Complete",
    "outputs": null,
    "parameters": {
      "hostingPlanName": {
        "type": "String",
        "value": "mytestappplan"
      },
      "skuCapacity": {
        "type": "Int",
        "value": 1
      },
      "skuName": {
        "type": "String",
        "value": "S1"
      }
    },
    "parametersLink": null,
    "providers": [
      {
        "id": null,
        "namespace": "Microsoft.Web",
        "registrationState": null,
        "resourceTypes": [
          {
            "aliases": null,
            "apiVersions": null,
            "locations": [
              "westeurope"
            ],
            "properties": null,
            "resourceType": "serverfarms"
          },
          {
            "aliases": null,
            "apiVersions": null,
            "locations": [
              "westeurope"
            ],
            "properties": null,
            "resourceType": "sites"
          }
        ]
      }
    ],
    "provisioningState": "Succeeded",
    "template": null,
    "templateLink": null,
    "timestamp": "2017-05-23T16:20:27.645497+00:00"
  },
  "resourceGroup": "testdeployment"
}

Ausblick

Mit dem oben gezeigten Beispiel ist ein erster Einstieg in das Thema „Azure Resource Manager“ und den dazugehörigen Templates geschafft. Wer tiefer einsteigen möchte, kann sich über die folgenden Ressourcen informieren:

Im nächsten Artikel werde ich genauer auf Templates eingehen und ein fortgeschrittenes Szenario aufzeigen, in dem die komplette Infrastruktur für eine Cloud App beschrieben wird (API App inkl. Deployment Slots, SQL DB, Redis Cache, Azure Search, AppInsights…), inklusive Abhängigkeiten der Ressourcen untereinander.

Bis dahin…viel Spaß mit Azure! 🙂


Kazim Bahar: 5 kostenlose eBooks über Machine Learning

Tagtäglich erscheinen Artikel zu Thema Künstliche Intelligenz bzw. Machine Learning. Was hat das aber mit UI-Design und...

MSDN Team Blog AT [MS]: Next Generation Apps am Mobile Developer After Work Nr 15

Das nächste Mobile Developer After Work findet diesmal an der FH St. Pölten am 8. Juni 2017 statt und steht ganz im Zeichen der nächsten Generation von innovativen Apps.

mdawlogo

Das Programm kann sich wieder sehen lassen:

17:40 – 18:10: Azure Machine Learning (30 min)
Rina Ahmed, Microsoft

18:10 – 18:40: Managing Tech Performance in a Portfolio Company like ProSiebenSat.1
If you can measure it, you can manage it (30 min)
Gerald Madlmayr, ProSiebenSat.1 Media SE

18:40 – 18:55: Angular(JS) Jumpstart (15 min)
Georg Beischlager, Tieto

19:10 – 19:35: Robuste Personaleinsatzplanung im (IT-)Projektmanagement (25 min)
Thomas Felberbauer, FH St. Pölten

19:35 – 20:10: Mixing Reality – Bessere Hologramme (35 min)
Philipp Lütge, Philipp Lütge Development

Nähere Infos zu den Vorträgen, sowie den Anmeldelink findet ihr auf der Eventseite. Viel Spaß

Christian Dennig [MS]: Nach Update: Sharing von Laufwerken mit Docker nicht mehr möglich

Das Problem

Ich setze Docker schon eine ganze Weile sowohl privat, als auch beruflich für die unterschiedlichsten Themen ein und bin mit dem Tooling unter Windows mittlerweile sehr zufrieden. Docker integriert sich unauffällig in das Windows Betriebssystem und läuft in der Regel reibungslos.

Vor kurzem wurde jedoch nach einem Windows Update beim Start eines Containers, welcher Dateien aus einem lokalen Windows Folder mit dem Container teilt, von Docker gemeldet, dass ich zuerst Laufwerke mit dem Docker Host teilen muss, bevor ich Verzeichnisse/Dateien in den Container mounten kann. Die Meldung hat mich stutzig gemacht, da ich dies nach der Installation von Docker bereits erledigt hatte. Hat man in diesem Zustand dann versucht, das Laufwerk nochmal zu teilen, wurde von Docker gemeldet, dass die Firewall den entsprechenden Port blockiert und man nach der Docker-Doku bitte vorgehen soll.

docker_firewall

Das Problem ist, dass selbst nach der Durchführung der angegebenen Schritte in der Doku, das Ergebnis das selbe ist: Docker kann nicht auf das jeweilige Laufwerk zugreifen.

Workaround – Step by Step

Nach einigen Recherchen bin ich auf mehrere Lösungsvorschläge gestoßen. Was mir schlussendlich geholfen hat, nun hier – Schritt für Schritt…

Öffnen des Control Panels –> Network and Sharing Center

control_center

Öffnen der Verbindung vEthernet (DockerNAT)

net_share_vEthernet

In den Properties  dann einfach den Haken bei „File and Printer Sharing for Microsoft Networksentfernen und speichern. Danach die gleiche Prozedur nochmal durchführen und den Haken erneut setzen.

net_share_props

Im Anschluss kann man erneut in die Docker Settings gehen und das jeweilige Laufwerk ohne Fehler teilen.

docker_share

 


MSDN Team Blog AT [MS]: Mai Update der PowerShell Community in Österreich

Patrick Wahlmüller war für euch auf der PowerShell Conference EU 2017 und hat während des Events bei zwei Vorträgen mitgeschrieben:

  1. http://www.powershell.co.at/psconf-europe-2017-dsc-at-the-bmw-group/
  2. http://www.powershell.co.at/psconf-europe-2017-preconference-powershell-security-fundamentals/

Zum Thema Installation von Nanoserver auf Blech gibt es einen Eintrag von Roman Stadlmair http://www.powershell.co.at/baremetal-nanoserver-boot-media-preperation-sd-card/

Zudem gibt es die wöchentlichen Newsletter, vulgo die “Schnipseljagd”, mit den folgenden Themen:

http://www.powershell.co.at/powershell-schnipseljagd-1817/

  • Einstieg in PowerShell Klassen
  • Top 50 PowerShell Blogs weltweit
  • Daten am SQL Server loggen (one-liner)
  • Erzeugen von “OldSchool” Kommentaren wie z.B.:

______                      _____ _          _ _
| ___ \                    /  ___| |        | | |
| |_/ /____      _____ _ __\ `–.| |__   ___| | |
|  __/ _ \ \ /\ / / _ \ ‘__|`–. \ ‘_ \ / _ \ | |
| | | (_) \ V  V /  __/ |  /\__/ / | | |  __/ | |
\_|  \___/ \_/\_/ \___|_|  \____/|_| |_|\___|_|_|

http://www.powershell.co.at/powershell-schnipseljagd-1717/

  • Write-LogEvent: Vereinfachtes Logging für eigene Funktionen
  • Die kompakteste Tippsammlung die ich bis jetzt kenne
  • Wie man Dienste inklusive Pfadnamen zu Exe Files in eine Datei schreibt.
  • Infos zu Ausnahmen und Fehlern

http://www.powershell.co.at/powershell-schnipseljagd-1617/

  • PowerShell Klassen Youtube VIDEO
  • Verwendung von Visual Studio Code für PowerShell
  • Script als Administrator laufen lassen
  • Verteidigen gegen PowerShell Attacken VIDEO

http://www.powershell.co.at/powershell-schnipseljagd-1517/

  • Reporting von entfernten Systemen
  • Passwörter generieren lassen
  • Fremde “Security principals” in der eigenen Domain aufräumen
  • Excel in CSV auf der Befehlszeile umwandeln
  • Powershell im Administratormodus starten

Für alle Veranstaltungstiger hier noch ein paar vergangene Veranstaltungen zum nachlesen:

    • 1. Mai 2017 Experts Live Event Schweiz http://www.expertslive.ch/
    • 10 Österreicher bei der www.psconf.eu : Wir hatten dort die Möglichkeit dem PowerShell Team die Ehrenmitgliedschaft in der Usergroup zu verleihen. Fotos und Infos gibt’s hier:

http://www.powershell.co.at/en-new-honorary-members-in-the-ps-usergroup-at/

und klarerweise auch die kommenden Veranstaltungen:

Die PowerShell UserGroup Austria: www.powershell.co.at

MSDN Team Blog AT [MS]: Der .NET Stammtisch Linz öffnet seine Pforten

 

Für alle .NET Begeisterten im Großraum Linz gibt es eine gute Nachricht. Ab sofort, genauer 23.5., gibt es einen NET Stammtisch. Also ein Meetup für das Thema .NET mit allem was dazugehört, egal ob es sich um Azure, Xamarin oder andere dazu passende Themen handelt.

Der erste .NET Stammtisch Linz startet am 23. Mai um 18:30 bei Dynatrace mit den folgenden Themen:

  • Christoph Neumüller: How we automated .NET Crash Dump Analysis
    .NET Memory Dump Analyse sind eine Wissenschaft für sich. Die entsprechenden Tools (zb. WinDbg) erfordern einiges an Fachwissen. Wir haben ein Web-Basiertes Tool names *SuperDump* entwickelt, das diese Analysen nicht nur erleichtert, sondern komplett automatisiert (Open Source!). Ich möchte darüber erzählen wie wir dieses auf Basis von .NET Core entwickelt haben und es mittlerweile sogar für Linux Coredump Analysen verwenden.
  • Gergely Kalapos: Build 2017 Zusammenfassung
    Ich hatte heuer die Ehre in Seattle live dabei zu sein. Die konkreten Themen stehen noch nicht fest aber mein Ziel ist, dass ich euch eine ~25-Minütige Zusammenfassung mit starkem Fokus auf .NET Entwicklung (was wurde auf der Build angekündigt, was ist neu, usw.) präsentiere. Also kein Marketingstuff, sondern viel Code, Tools, und Best-Practices.

Zum .NET Stammtisch Linz anmelden

Der .NET Stammtisch Linz ist ein reines Community-Event welches von Christoph und Gergely in ihrer Freizeit organisiert und durchgeführt wird. Also unterstützt sie mit reger Teilnahme und festem Weitererzähöen!!

Johannes Renatus: Out of Memory Exception beim EF Debuggen im IIS Express

Bisher noch nie vorgekommen, aber es gibt immer ein erstes mal. Heute hatte ich beim Abrufen großer Datenmengen um einen Cache zu befüllen auf einmal eine “Out of Memory” Exception, obwohl mein Visual Studio vom RAM her sehr gut aussah und auch noch genug RAM zur Verfügung stand. Leider gibt die Fehlermeldung auch nicht mehr […]

Golo Roden: JavaScript schöner machen

Ein schöner Aspekt von Go ist, dass die Sprache vorgibt, wie Code zu formatieren ist. Diskussionen über die Optik von Code gehören damit der Vergangenheit an. Für JavaScript steht mit prettier seit Kurzem nun auch ein Modul zur Verfügung, das die Formatierung vorgibt.

Holger Schwichtenberg: Die Build-Nachrichten in der Kurzzusammenfassung

Vom 10. bis 12. Mai fand in Seattle Microsofts Entwicklerkonferenz Build 2017 statt mit Neuigkeiten zu .NET, Visual Studio, Azure, PowerShell und Windows.

Johannes Renatus: ngModel like two-way-databinding für Komponenten in Angular

Da es sich bei Angular nur noch im Komponenten handelt, ist es hier natürlich auch wichtig wie man Daten an Komponenten weitergibt und auch wieder zurückgeben kann. Dafür gibt es zwei wichtige Dekoratoren “@Input” um Daten an eine Komponenten zu übergeben und “@Output“ um Daten wieder “zurückzugeben”. Um ein two-way-databinding zu erstellen gibt es mindestens […]

Golo Roden: Einführung in Node.js, Folge 18: Eigene Streams schreiben

Zusätzlich zu den in Node.js integrierten Streams lassen sich auch eigene schreiben. Zur Wahl stehen außer les- und scheibbaren Streams auch die sogenannten Transform-Streams, die Daten verändern und aggregieren können. Wie funktioniert das?

AIT: Pushing Azure IoT to the Edge @ MSBuild 2017

Die Keynotes der ersten beiden Tage waren voller Highlights. In den folgenden Breakout-Sessions werden einige Ankündigungen im Detail vorgestellt. Hier und da gab es auch noch weitere Überraschungen. Auf diese werden wir in den kommenden Tagen gezielt eingehen.

Einen großen Block in den Sessions nahm natürlich das Thema Azure IoT ein. Für Azure IoT Edge wurden die verfügbaren Module (Azure Machine Learning, Azure Stream Analytics, Azure Functions und Cognitive Services) gezeigt. Als Anwendungsszenarien sieht Microsoft vor allem das Filtern und Aggregieren von Daten, bevor diese an den IoT-Hub gesendet werden und die schnellere Reaktionszeit z.B. bei Fehlerinvervention.

clip_image002

Dabei stellt sich natürlich sofort die Frage, wie leistungsfähig ein Endgerät sein muss, um Azure IoT Edge nutzen zu können. Die Anforderungen sind dabei verblüffend gering. Ein Rechenkern und 128 MB RAM sind ausreichend. Es gilt jedoch zu beachten, dass Azure IoT Edge eine containerbasierte Lösung ist, was vom Betriebssystem unterstützt werden muss. Aktuell wurde Azure IoT Edge erfolgreich unter Ubuntu 14.04, Ubuntu 15.10, Yocto Linux 3.0 on Intel Edison, Windows 10 und Wind River 7.0 getestet. Das SDK steht auf GitHub zum Ausprobieren bereit und bringt auch genug Beispiele mit, um direkt loslegen zu können.

clip_image004

Bei dem Thema Geräte geht es auch gleich weiter. Viele Ideen und Prototypen funktionieren mit einem oder wenigen Endgeräten fantastisch. In realistischen Szenarien kommen jedoch mehrere hundert oder tausend Geräte zum Einsatz. Die Provisionierung (initiale Konfiguration und Verbindung mit dem richtigen IoT Hub) der Geräte kann zu einem Alptraum werden. Mit der Enrollment List soll das Ganze nun deutlich einfacher werden. Ein neues IoT-Device meldet sich mit seiner ID beim IoT Hub Device Provisioning Service an und wird entsprechend der Enrollment List mit dem passenden IoT-Hub verbunden. Dieser IoT-Hub führt nun die initiale Konfiguration durch, indem ein passender Device Twin ausgerollt wird. Über die Device Twins kann ab diesem Zeitpunkt die Konfiguration für jedes angemeldete Gerät gesteuert werden. So wird sichergestellt, dass sobald ein Gerät online ist, die neuste Konfiguration verteilt wird. Die Konfiguration von IoT-Devices sollte ausschließlich über den Device Twin und seine Desired Properties durchgeführt werden – dieser Tipp ist wohl einer der Wichtigsten aus der Device Management Session. Die Nutzung von Cloud-to-Device-Messages oder Direct Methods ist aufgrund der zu geringen TTL und des interaktiven Verhaltens nicht zu empfehlen.

clip_image006

Wenn das Device nun verbunden und konfiguriert ist, müssen die anfallenden Daten auch sinnvoll ausgewertet werden. Einer der gebräuchlichsten Wege läuft aktuell vom IoT Hub über Azure Stream Analytics in Power BI Dashboards. Wesentliche Nachteile dieser Lösung können die Verdichtung der Daten via Analytics Stream und die vorkonfigurierten Auswertungen in Power BI sein.

clip_image008

Um zum Beispiel Analysten eine uneingeschränkte Sicht auf Daten zur Auswertung geben zu können, steht mit Azure Time Series Insights eine neue Alternative zur Verfügung. In Azure Time Series Insights werden die Roh-Daten vom IoT-Hub gespeichert und zur Auswertung steht ein umfangreiches Web-UI mit den Daten der letzten 30 Tage zur Verfügung. Der Zeitraum kann aktuell auf maximal 100 Tage erweitert werden. Sehr beeindruckend war die Performance bei der Auswertung. Datenmengen von mehreren hundertmillionen Datenpunkten pro Tag stellen keinerlei Probleme für das System dar. Um eine bessere Auswertung zu ermöglichen, können Referenzdaten aus verschiedensten Quellen genutzt werden. Alternative Darstellungen wie zum Beispiel Heat-Maps sind ein weiterer Schritt hin zu einer einfachen und schnellen Auswertbarkeit von großen Datenmengen.

clip_image010

clip_image012

Diese drei Neuerungen zeigen, dass Microsoft die Schmerzen und Hürden erkennt, die bei der Entwicklung von IoT-Szenarien auftreten und diese versucht zu beheben. Jetzt ist es an uns Entwicklern, die Technologien zum Einsatz zu bringen. Also schauen wir mal, ob die Versprechen auch alle gehalten werden können.

Manfred Steyer: Slides and Sample for my Angular Talk at WAD 2017 in Vienna

Please find below the slides and the sample from my Talk about Angular I did at We Are Developers in Mai 2017 in Vienna:

AIT: We are all creators – Tag 2 @ MSBuild 2017

Die große Frage am Morgen des zweiten Tages auf der BUILD war: “Kann der erste Tag noch getoppt werden?“. Die Antwort war nach den ersten 30 Minuten der Keynote klar: „Ja!“. Aber beginnen wir von vorne…

Die erste Ankündigung der Keynote war das Windows 10 Fall Creators Update, welches im dritten Quartal des Jahres kommen wird. Was in diesem alles enthalten ist, war zu dem Zeitpunkt noch längst nicht absehbar. Doch das änderte sich schnell.

clip_image002

Mit Windows Story Remix wurde die erste neue App des Updates vorgestellt. Es handelt sich dabei um einen Filmeditor, der jedoch deutlich mehr kann, als alles was der normale Windows Benutzer bisher kennt. Durch Machine Learning erkennt die App, welche Videos und Bilder relevant sind, schneidet diese in sinnvolle Szenen und kombiniert das Ganze mit Musik. Es können einzelne Personen als „Star“ definiert werden, wodurch sich der gesamte Film um diese Personen zentriert. Möglich wird dies durch die Gesichtserkennung in Bildern und Videos. Durch Remix 3D können 3D-Modelle, die von der Internet-Community erstellt wurden, in die eigenen Videos integriert werden. Dadurch ergibt sich ein Mixed Reality Erlebnis von besonderem Wert. Das verblüffendste an dieser App ist wie einfach diese Videos erstellt werden können. Es braucht keinerlei Erfahrung. Hier ist das Video aus der Keynote zu finden.

Mit dem kommenden Windows Update wird der Austausch von Daten zwischen mehreren Geräten um ein Vielfaches erleichtert. Wer kennt es nicht. Man hat ein Bild auf dem Handy gemacht und möchte dieses nun auf dem Desktop Rechner haben. Was vorher umständlich über das Zusenden an die eigene E-Mail-Adresse passierte, ist dank dem Cloud-powered Clipboard nun direkt möglich. Hierbei kann nicht nur Text, sondern auch Bilder und Datei können bequem zwischen Geräten kopiert und eingefügt werden. Durch OneDrive Files On-Demand können nun Dateien bequem in der Cloud gespeichert und bei Bedarf nachgeladen werden. Die nötigen Anpassungen wurden direkt in Windows gemacht und nicht über eine Applikation installiert. Somit findet der Mechanismus der On-Demand-Synchronisation komplett im Hintergrund statt, ohne Auswirkung auf die Anwendungen welche auf die entsprechenden Dateien zugreifen.

clip_image004

Um die Entwicklung für unterschiedliche Endgeräte zu erleichtern, wurde der Xamarin Live Player angekündigt. Mit dem Xamarin Live Player ist es nun möglich, eine Xamarin App direkt auf einem iOS oder Android Gerät zu debuggen. Darüber hinaus ist es zur Debug-Zeit möglich, die Logik und die UI der App zu verändern, während die Änderungen direkt dargestellt werden. Die Entwicklung von Oberflächen für mehre Endgeräte auf unterschiedlichen Plattformen soll in Zukunft durch den angekündigten XAML Standard 1.0 ebenfalls vereinfacht werden.

Mit dem neuen Timeline Feature ist es möglich, eine Zeitachse für die letzten verwendeten Dokumente und Apps zu bekommen. Dadurch hat man immer alles auf einen Blick, was man als letztes verwendet hat und kann direkt dort einsteigen. In Verbindung mit Pick off where you left with Cortana wird das Arbeiten mit mehreren Endgeräten eine komplett neue Erfahrung. Dank Microsoft Graph und Project Rome ist die intelligente Assistentin Cortana nun in der Lage zu merken, was man als letztes oder in der Vergangenheit gemacht hat. Diese Aktionen können dann auf anderen Geräten fortgesetzt werden. Fängt man also auf dem Desktop Rechner an, einen Blog Post zu lesen, kann man diesen bequem auf dem Handy weiterlesen. Sofern die passende App nicht verfügbar ist, bietet Cortana direkt an, diese zu installieren.

Die Cross-Plattform und Cross-Device-Strategie von Microsoft wird nun auch im Windows Store ersichtlich. So ging ein großes Raunen durch die Menge, als Microsoft bekannt gab, dass iTunes zukünftig im Windows Store verfügbar ist. Als wichtige Lektion nehmen wir hieraus mit: Um Innovation zu fördern, muss man Kooperationen eingehen, statt zu konkurrieren. Zusätzlich zu Ubuntu für die Windows Bash werden in Zukunft noch SUSE und Fedora im Windows Store verfügbar sein.

clip_image008

Das größte Highlight ist jedoch die Präsentation des Fluent Design System. Light, Depth, Motion, Material, Scale – das sind die neuen Konzepte, die hinter Microsoft Fluent Design System stehen. Auf einfache Art und Weise und mit wenig Zeilen Code, können Entwickler die Oberfläche ihrer UWP Apps verbessern. Durch Light werden Elemente rund um den Cursor hervorgeben. Depth ermöglicht es z.B. über Parallex Scrolling eine zusätzliche Tiefe einzubringen, um aus der zwei dimensionalen Welt auszubrechen. Motion lässt Navigation und Transitionen in Anwendungen flüssig aussehen, in dem z.B. Elemente von einer Ansicht in die nächste Ansicht animiert werden. Bei Material gibt es das neue Acrylic Design, bei dem gewisse Bereiche einer App wie z.B. die Navigation einen transparenten Blureffekt erhalten. Mit Scale soll sich nicht nur auf eine zwei dimensionale Welt beschränkt werden. In Zeiten von Mixed Reality gibt es die Möglichkeit, in die drei dimensionalen Welt zu skalieren. Zusätzlich legt Microsoft großen Wert auf Windows Ink, durch das mit einem digitalen Pen gezeichnet oder geschrieben werden kann.

clip_image010

Mixed Reality ist keine kleine Idee mehr. Es ist die Zukunft der Softwareentwicklung. Dieses Bild wurde von Alex Kipman ganz klar herausgestellt. Schaut man sich an was in den HoloLens-Communities weltweit passiert, fällt es auch nicht schwer das zu glauben. So passt es auch sehr gut ins Bild, dass mit den Acer und HP Mixed Reality Headsets zwei preisgünstige Alternativen zur HoloLens vorgestellt wurden. Beide sind ab sofort für 399$ in den USA und Kanada verfügbar. Als eindrucksvolles Beispiel für die Anwendung von Mixed Reality wurde die Bühnenplanung vom Cirque du Soleil gezeigt.

clip_image012

Wer bei bisherigen Anwendungsszenarien Probleme mit der Gestensteuerung bei der HoloLens hatte, kann nun dank zweier Motion Controller seine Steuerung erweitern. Durch ein Touchpad, einen analogen Stick und mehrere Knöpfen, können verschiedene Aktionen ausgeführt werden. Zusätzlich befinden sich LEDs an den Ringen um die Griffe, mit denen die Controller getracked werden können.

Das war noch längst nicht alles vom zweiten Tag. Weitere Highlights wie Details zu Azure IoT Edge, Azure Service Fabric oder VSTS folgen im nächsten Post. Also bis später…

AIT: With great opportunity comes great responsibility – Tag 1 @ MSBuild 2017

Es gibt eine Menge Entwicklerkonferenzen, und es gibt die BUILD. Keine andere Konferenz im Microsoft Umfeld wird Jahr für Jahr so sehnlich erwartet wie diese. Die Teilnehmer werden dieses Jahr an einem völlig neuen Standort, dem Washington State Convention Center, Downtown Seattle begrüßt.

clip_image002

Die Keynote zu Beginn wurde von CEO Satya Nadella eröffnet und steht unter dem Motto “Opportunity & Responsibility”. Die Inhalte können weltweit im Livestream verfolgt werden. Die enorme Größe dieser Veranstaltung kann dabei jedoch nur erahnt werden.

clip_image004

Die ersten Highlights kommen, wie könnte es auch anders sein, aus dem Azure-Bereich. Mit Azure IoT Edge bietet Microsoft die Möglichkeit, Azure Funktionalität wie Machine Learning oder Azure Functions von der Cloud auf IoT Devices zu übertragen. Diese werden dann in einem eigenen Docker Container auf dem Gerät gehostet.

clip_image006

Durch den entfallenden Roundtrip zur Cloud werden Antwortzeiten enorm verringert, was bei der Erkennung von Fehlerfällen und einem automatischen Gegensteuern von großem Vorteil ist. Aber auch Use Cases, bei denen die Cloud nicht erreichbar ist, können somit abgedeckt werden. Mehr Informationen gibt es hier.

Wer bei der Umsetzung von IoT Szenarien lieber eine Private Cloud der Public Cloud vorzieht, hat mit Azure Stack nun die Möglichkeit, seine eigene Azure Cloud auf seinen eigenen Servern zu betreiben. Dabei ist es aber nicht nur bei sensiblen Daten relevant, sondern auch wenn kein Internetzugriff zu Azure garantiert werden kann. Die Preview 3 von Azure Stack steht als Single-Server-Installation bereit. Für den produktiven Einsatz von Azure Stack ist Microsoft mit Hardwareherstellern wir DELL und Lenovo in Kontakt um Komplettlösungen in jeglichen Größenordnungen liefern zu können.

In Zeiten von Mixed Reality & Co. schaffte es Scott Hanselman das Publikum im Anschluss mit der Vorstellung eines neuen Command Line Interfaces zu begeistern. So wurde das Azure Web Portal um eine Cloud Shell erweitert, die vorkonfiguriert mit der Azure CLI zur Verfügung gestellt wird. Hier können unter anderem Skripte zur Automatisierung zentral abgelegt und ausgeführt werden. Wer auch auf seinem mobilen Endgerät seine Azure Cloud verwalten möchte, hat nun die Möglichkeit dies per App für Android und iOS Geräte zu machen. Und ja, auch in der App kann die Azure Shell genutzt werden!

clip_image008

Die nächsten zwei Highlights waren das Azure Snapshot Debugging und die generelle Verfügbarkeit von Visual Studio for Mac – it’s no longer a preview! Mit Azure Snapshot Debugging ist es nun möglich Fehler auf einer produktiven Umgebung zu debuggen OHNE diese Umgebung zu beeinflussen. Um dies zu ermöglichen werden Abbilder des Produktivsystems gemacht, sobald eine bestimmte Codestelle durchlaufen wird. Diesen Snapshot kann man dann bequem debuggen, ohne Auswirkungen auf die produktive Umgebung. WOW!

Der nächste große Themenblock der Keynote drehte sich rund um das Thema Datenbanken in der Cloud. Mit Cosmos DB erblickte ein völlig neues Datenbankkonzept das Licht der Welt. Microsoft stellt hierbei eine Datenbank zur Verfügung, die nicht nur eine geringe Latenzzeit garantiert, sondern auch mit einem Klick in andere Länder repliziert werden kann. Zusätzlich kann man bei der Struktur zwischen Documents, Key-Value, Graph und Column Family und bei der API zwischen Document DB SQL, Mongo DB, Azure Tables und Gremlin frei wählen. Durch die frei wählbare API ist es umso einfacher, Cosmos DB in bestehenden Anwendungen zu integrieren, da jede Bibliothek welche die gewählte API versteht, verwendet werden kann. Mehr Informationen zu Azure Cosmos DB gibt es hier.

clip_image010

Neben Cosmos DB als völlig neues Datenbank-System können nun auch PostgreSQL und MySQL in Azure gehostet werden. Mit dem Azure Database Migration Service ist es in Zukunft noch einfacher, eine on-premise Datenbank (SQL Server, Oracle oder MySQL) in die Azure Cloud zu bekommen. Mit dem Database Migration Assessment Tool kann die aktuelle Datenbankstruktur auf mögliche Probleme geprüft werden wie z.B. abweichende Features zwischen on-premise und Cloud. Danach können sowohl die Strukturen als auch Daten direkt in die Cloud-Datenbank migriert werden.

Der dritte Teil der Keynote widmete sich dem omnipräsenten Thema Artificial Intelligence. Artificial Intelligence ist DAS Zukunftsthema schlechthin und mit Cognitive Services stellt Microsoft eine enorme Plattform zur Verfügung, um AI zum Leben erwachen zu lassen.

clip_image012

Als die Geschichte von Haiyan Zhang und Emma Lawton dem Publikum präsentiert wurde, gab es mit Sicherheit mehr als ein paar feuchte Augen im Saal. Zu sehen wie mit all diesen Technologien einem kranken Menschen neue Lebensqualität geschenkt werden kann, war einfach unglaublich. Eine Beschreibung mit Worten ist nicht ausreichend für dieses Projekt – hier ist das Video.

Mit den vorgestellten Bot Framework Adaptive Cards bietet Microsoft die Möglichkeit, das Aussehen von Antworten eines Bots in verschiedenen Kanälen (z.B. Skype oder Slack) einheitlich festzulegen. Dadurch werden Nachrichten je nach Kanal automatisch formatiert und versendet. Natürlich muss eine Keynote mit einem Spektakel beendet werden. Der PowerPoint Live Translator übersetzt, wie der Name vermuten lässt, in Echtzeit den gesprochenen Inhalt einer Präsentation in textuelle Form. Es war also sehr leicht dem Vortrag zu folgen als die Sprache auf einmal ins spanische wechselte und dann noch chinesische Kommentare eingeworfen wurden.

Während im Anschluss die einzelnen Sessions starteten, wurde im „Hub“, der zentralen Ausstellungsfläche, der Betrieb aufgenommen. Jede Produktgruppe von Microsoft ist hier vertreten, um im direkten Austausch mit den Teilnehmern ihre Ideen zu erklären und Feedback einzusammeln. Besonders beeindruckend war der Besuch am DevOps-Stand. Auf großen Whiteboards werden Ideen und Schmerzpunkte gesammelt und diskutiert. Dieser direkte Austausch mit Microsoft ist der eigentliche Gewinn der Veranstaltung.

clip_image014     clip_image016

Das war’s vom ersten Tag. Zwei weitere folgen mit hoffentlich nicht weniger Highlights – so stay tuned!

Norbert Eder: SQL Server und CLR Assemblies

In manchen Fällen ist es ganz praktisch, Stored Procedures oder Functions für den SQL Server via CLR zur Verfügung zu stellen. Nachdem dies schon ein alter Hut ist, findet man auch zahlreiche Infos zu diesem Thema, aber nicht in einem Artikel.

Verwaltung von Assemblies

Für den Umgang mit Assemblies im SQL Server gibt es doch einiges, was es zu wissen gilt. Nachfolgend die wichtigsten Informationen, damit der erste Start schnell gelingt.

Erstellen von Assemblies

Damit Assemblies im SQL Server verwendet werden können, müssen sie hinzugefügt/registriert werden:

CREATE ASSEMBLY TestAssembly
FROM 'C:\Path\To\Assembly.dll'
WITH PERMISSION_SET = SAFE;

Wichtig ist hierbei das PERMISSION_SET. Hier gibt es drei unterschiedliche Einstellungen:

  • SAFE: Das ist die restriktivste Einstellung. Externe Ressourcen (Dateien, Netzwerk, Umgebungsvariablen etc.) dürfen nicht verwendet werden.
  • EXTERNAL_ACCESS: Der Zugriff auf einige externe Ressourcen (Dateien, Netzwerk, Umgebungsvariablen, Registry) ist möglich.
  • UNSAFE: Uneingeschränkten Zugriff auf externe und interne Ressourcen. Unmanaged Code kann ebenfalls ausgeführt werden.

Werden externe Ressourcen benötigt, ist zusätzlich die TRUSTWORTHY-Einstellung auf ON zu setzen. Hierfür ist ein Benutzer mit der Serverrolle sysadmin notwendig:

ALTER DATABASE test SET TRUSTWORTHY ON;

Ab SQL Server 2017 ändert sich da ein wenig, siehe CLR strict security. Im Grunde wird die Code Access Security (CAS) nicht mehr länger unterstützt. Deswegen kann es auch bei der Einstellung SAFE dazu kommen, dass Zugriff auf externe Ressourcen besteht. Es wurde eine Option clr strict security (siehe sp_configure) eingeführt.

  • Disabled: Das bisherige Verhalten wird verwendet
  • Enabled: PERMISSION_SET wird ignoriert und Assemblies werden immer als UNSAFE interpretiert. Das ist der Standard für SQL Server 2017

Ist CLR strict security aktiviert, sind folgende Berechtigungen notwendig, damit eine Assembly erstellt werden kann:

  • Der Benutzer muss die CREATE ASSEMBLY Berechtigung besitzen
  • Die Assemly wurde mit einem asymmetischen Schlüssel signiert, zu dem auch ein entsprechendes Login mit der Berechtigung UNSAFE ASSEMBLY besteht ODER
  • die Datenbank-Einstellung TRUSTWORTHY wird auf ON gestellt und die Datenbank besitzt einen Owner mit UNSAFE ASSEMBLY Berechtigung.

Weitere Details sind unter CREATE ASSEMBLY zu finden.

Aktualisierung einer Assembly

Wurde eine Assembly bereits erstellt, kann diese auch aktualisiert werden:

ALTER ASSEMBLY TestAssembly
FROM 'C:\Path\To\Assembly.dll'

Das geht sogar so weit, dass Dateien zur Assembly hinzugefügt werden können:

ALTER ASSEMBLY TestAssembly
ADD FILE FROM 'C:\Path\To\Class.dll'

Auch die Berechtigung kann verändert werden:

ALTER ASSEMBLY TestAssembly WITH PERMISSION_SET = EXTERNAL_ACCESS;

Weitere Informationen gibt es unter ALTER ASSEMBLY.

Löschen einer Assembly

Eine Assembly kann folgendermaßen entfernt werden:

DROP ASSEMBLY TestAssembly

Zu beachten ist, dass keine Funktionalität der Assembly mehr verwendet werden darf, bevor sie gelöscht werden kann.

Die vollständige Dokumentation findet sich unter DROP ASSEMBLY.

Verwenden einer Stored Procedure

Damit eine in der Assembly enthaltene Stored Procedure verwendet werden kann, muss diese am SQL Server noch erstellt werden:

CREATE PROCEDURE dbo.sp_ReadDataFromWebservice @url nvarchar(255)
WITH EXECUTE AS CALLER AS EXTERNAL NAME TestAssembly.StoredProcedures.ReadData;

Im Endeffekt wird hier eine Stored Procedure mit einem Parameter erstellt. Der externe Name ist der volle Namespace inkl. Methoden-Name der CLR Stored Procedure.

Ein Aufruf erfolgt so:

exec sp_ReadDataFromWebservice @url='http://hier.ist-mein.webservice'

Vertiefende Informationen sind unter CREATE PROCEDURE zu finden.

Unterstützendes Tooling

Visual Studio kann uns allerdings unterstützen. So gibt es im Kontextmenü zum CLR-Datenbankprojekt die Möglichkeit Publish Database zu wählen. Damit wird nachfolgender Dialog geöffnet:

Publish Database | Visual Studio

Publish Database | Visual Studio

Hier können wir uns ein passendes Script generieren oder aber die Änderungen direkt in die gewählte Connection einspielen lassen. Unter Advanced verstecken sich zahlreiche Einstellungen, die Beachtung finden sollten.

Sind mehrere Datenbanken betroffen bietet sich die Arbeit mit Profilen an. Diese können über denselben Dialog verwaltet werden. Ein Profil wird im jeweiligen Projekt als XML-Datei abgespeichert und kann jederzeit geladen und für eine Veröffentlichung genutzt werden.

Fazit

Dieser Beitrag hat die wichtigsten Informationen, um ans Ziel zu kommen, aufgezeigt. Für entsprechende Vertiefungen empfiehlt es sich, den ausgehenden Links zu folgen.

Happy Coding!

The post SQL Server und CLR Assemblies appeared first on Norbert Eder.

Golo Roden: Node.js kompiliert

Die JavaScript-Laufzeitumgebung Node.js verwendet intern zwar Googles V8 als Compiler, kann aber trotzdem keine Binärpakete erstellen. Das von dem Unternehmen Zeit entwickelte Modul pkg ändert das. Wie funktioniert das Modul, und was leistet es?

Jürgen Gutsch: ASP.NET Core in trouble

ASP.NET Core today

Currently ASP.NET Core - Microsoft's new web framework - can be used on top of .NET Core and on top of the .NET Framework. This fact is pretty nice, because you are able to use all the new features of ASP.NET Core with the power of the huge but well known .NET Framework. On the other hand, the new cross-platform .NET Core is even nice, but with a smaller set of features. Today you have the choice between of being x-plat or to use the full .NET Framework. This isn't really bad.

Actually it could be better. Let's see why:

What is the issue?

Microsoft removed the support of the full .NET Framework for ASP.NET Core 2.0 and some developers are not really happy about that. See this Github Issue thread. ASP.NET Core 2.0 will just run on .NET Core 2.0. This fact results in a hot discussion within that GitHub issue.

It also results in some misleading and confusing headlines and contents on some German IT news publishers:

While the discussion was running, David Fowler said on Twitter that it's the best to think of ASP.NET Core 2.0 and .NET Core 2.0 as the same product.

Does this makes sense?

I followed the discussion and thought a lot about it. And yes, it starts to make sense to me.

NET Standard

What many people don't recognize or just forget about, is the .NET Standard. The .NET Standard is a API definition that tries to unify the APIs of .NET Core, .NET Framework and Xamarin. But it actually does a little more, it provides the API as a set of Assemblies, which forwards the types to the right Framework.

Does it make sense to you? (Read more about the .NET Standard in this documentation)

Currently ASP.NET Core runs on top of .NET Core and .NET Framework, but actually uses a framework that is based on .NET Standard 1.4 and higher. All the referenced libraries, which are used in ASP.NET Core are based on .NET Standard 1.4 or higher. Let's call them ".NET Standard libraries" ;) This libraries contain all the needed features, but doesn't reference a specific platform, but the .NET Standard API.

You are also able to create those kind of libraries with Visual Studio 2017.

By creating such libraries you provide your functionality to multiple platforms like Xamarin, .NET Framework and .NET Core (depending on the .NET Standard Version you choose). Isn't that good?

And in .NET Framework apps you are able to reference .NET Standard based libraries.

About runtimes

.NET Core is just a runtime to run Apps on Linux, Mac and Windows. Let's see the full .NET Framework as a runtime to run WPF apps, Winforms apps and classic ASP.NET apps on Windows. Let's also see Xamarin as a runtime to run apps on iOS and Android.

Let's also assume, that the .NET Standard 2.0 will provide the almost full API of the .NET Framework to your Application, if it is finished.

Do we really need the full .NET Framework for ASP.NET Core, in this case? No, we don't really need it.

What if ...

  • ... .NET Framework, .NET Core and Xamarin are just runtimes?
  • ... .NET Standard 2.0 is as complete as the .NET Framework?
  • .. .NET Standard 2.0 libraries will have the same features as the .NET Framework?
  • .. ASP.NET 2.0 Core uses the .NET Standard 2.0 libraries?

Do we really need the full .NET Framework as a runtime for ASP.NET Core?

I think, no!

Does it also makes sense to use the full .NET Framework as a runtime for Xamarin Apps?

I also think, no.

Conclusion

ASP.NET Core and .NET Core shouldn't be really shipped as one product, as David said. Because it is on top of .NET Core and maybe another technology could also be on top of .NET Core in the future. But maybe it makes sense to ship it as one product, to tell the people that ASP.NET Core 2.0 is based on top of .NET Core 2.0 and needs the .NET Core runtime. (The classic ASP.NET is also shipped with the full .NET Framework.)

  • .NET Core, Xamarin and the full .NET Framework are just a runtimes.
  • The .NET Standard 2.0 will almost have the same API as the .NET Framework.
  • The .NET Standard 2.0 libraries will have the same set of features as the .NET Framework
  • ASP.NET Core 2.0 uses NET Standard 2.0 libraries as a framework.

With this facts, Microsoft's decision to run ASP.NET Core 2.0 on .NET Core 2.0 only, doesn't sound that evil anymore.

From my perspective, ASP.NET is not in trouble and it's all fine and it makes absolutely sense. The troubles are only in the discussion about that on GitHub and on Twitter :)

What do you think? Do you agree?

Let's see what Microsoft will tell us about it at the Microsoft Build conference in the next days. Follow the live stream: https://channel9.msdn.com/Events/Build/2017

[Update 2017-05-11]

Yesterday in an official blog post of announcing ASP.NET Core 2.0 preview1, (Announcing ASP.NET 2.0.0-Preview1 and Updates for .NET Web Developers) Jeff Fritz wrote, that the preview 1 is limited to .NET Core 2.0 only. The overall goal is to put ASP.NET Core 2.0 on top of .NET Standard 2.0. This means it will be possible to run ASP.NET Core 2.0 apps on .NET Core, Mono and the full .NET Framework.

Manfred Steyer: Using Angular and AOT with Webpack

The Angular CLI provides AOT compilation out of the box. To make use of it, just create a production build:

ng build --prod

Under the hoods, the CLI uses the package @ngtools/webpack which provides a loader for compiling TypeScript as well as a Plugin for AOT. One can easily use these mechanisms directly with webpack. The easiest way to do this is to create a project with the CLI and then eject the CLI. Ejecting means that the CLI is blasted away and instead of this webpack is used directly:

ng eject

If there is an existing webpack configuration it can also be extended by the mentioned mechanisms quite easily. First of all, install the @ngtools/webpack package:

npm i @ngtools/webpack --save-dev

If the usage of @ngtools/webpack yields errors one should check the referenced Angular version. In general, this packages works best with the version the CLI is using currently. Other versions could cause issues.

After this, TypeScript files can be loaded with the @ngtools/webpack loader:

module: {
    rules: [
        [...]
        { test: /\.ts$/, loaders: ['@ngtools/webpack']}
    ],
}, 

For AOT, just add the AOT plugin:

var AotPlugin = require('@ngtools/webpack').AotPlugin;

[...]

plugins: [
    new AotPlugin({
        tsConfigPath: './tsconfig.json',
        entryModule: 'app/app.module#AppModule'
    }),
    new webpack.optimize.UglifyJsPlugin({
        compress: {
            warnings: false
        },
        output: {
            comments: false
        },
        sourceMap: false
    }),
    [...]
}

One very nice side effect of this is, that you don't have to write an own file to bootstrap Angular in AOT mode. Instead of this the Plugin is generating the code necessary for this.

Manfred Steyer: Hochperformante Anwendungen mit Angular: Unterlagen von JAX 2017 in Mainz

Nachfolgend meine Unterlagen von der JAX 2017 in Mainz:

Manfred Steyer: Angular Performance Tuning (Roundup)

Angular is fast by default. In order to make it even faster one can leverage several techniques. In the last months, I've written some article about those techniques:

Manfred Steyer: JavaScript-Steuerelemente mit Angular: Fallstudie mit Live-Coding, Material von JAX 2017 in Mainz

Nachfolgend meine Unterlagen zur Session "JavaScript-Steuerelemente mit Angular: Fallstudie mit Live-Coding":

Golo Roden: Einführung in Node.js, Folge 17: Streams verwenden

Der in der Community bekannte Entwickler Dominic Tarr hat einmal gesagt, Streams seien das beste und zugleich das am wenigsten verstandene Konzept von Node.js. Daher lohnt es sich, die Grundlagen von Streams kennenzulernen. Wie funktionieren Streams, was können sie leisten, und worauf gilt es zu achten?

Jürgen Gutsch: Adding a custom dependency injection container in ASP.NET Core

ASP.NET Core is pretty flexible, customizable and extendable. You are able to change almost everything. Even the built-in dependency injection container can be replaced. This blog post will show you how to replace the existing DI container with another one. I'm going to use Autofac as a replacement.

Why should I do this?

There are not many reasons to replace the built-in dependency injection container, because it works pretty well for the most cases.

If you prefer a different dependency injection container, because of some reasons, you are able to do it. Maybe you know a faster container, if you like the nice features of Ninject to load dependencies dynamically from an assembly in a specific folder, by file patterns, and so on. I really miss this features in the built in container. It is possible to use another solution to to load dependencies from other libraries, but this is not as dynamic as the Ninject way.

Setup the Startup.cs

In ASP.NET Core the IServiceProvider is the component that resolves and creates the dependencies out of a IServiceCollection. The IServiceCollection needs to be manipulated in the method ConfigureServices within the Startup.cs if you want to add dependencies to the IServiceProvider.

The solution is to read the contents of the IServiceCollections to the own container and to provide an own implementation of a IServiceProvider to the application. Reading the IServiceCollection to the different container isn't that trivial, because you need to translate the different mappings types, which are probably not all available in all containers. E. g. the scoped registration (per request singleton) is a special one, that is only needed in web applications and not implemented in all containers.

Providing a custom IServiceprovider is possible by changing the method ConfigureServices a little bit:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  // Add framework services.
  services.AddMvc();

  return services.BuildServiceProvider();
}

The method now returns a IServiceprovider, which is created in the last line out of the IServiceCollection. It is needed to add the contents of the service collection to the container you want to use, because ASP.NET actually adds around 40 dependencies before this method is called:

1: Singleton - Microsoft.AspNetCore.Hosting.IHostingEnvironment => Microsoft.AspNetCore.Hosting.Internal.HostingEnvironment
2: Singleton - Microsoft.Extensions.Logging.ILogger`1 => Microsoft.Extensions.Logging.Logger`1
3: Transient - Microsoft.AspNetCore.Hosting.Builder.IApplicationBuilderFactory => Microsoft.AspNetCore.Hosting.Builder.ApplicationBuilderFactory
4: Transient - Microsoft.AspNetCore.Http.IHttpContextFactory => Microsoft.AspNetCore.Http.HttpContextFactory
5: Singleton - Microsoft.Extensions.Options.IOptions`1 => Microsoft.Extensions.Options.OptionsManager`1
6: Singleton - Microsoft.Extensions.Options.IOptionsMonitor`1 => Microsoft.Extensions.Options.OptionsMonitor`1
7: Scoped - Microsoft.Extensions.Options.IOptionsSnapshot`1 => Microsoft.Extensions.Options.OptionsSnapshot`1
8: Transient - Microsoft.AspNetCore.Hosting.IStartupFilter => Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter
9: Transient - Microsoft.Extensions.DependencyInjection.IServiceProviderFactory`1[[Microsoft.Extensions.DependencyInjection.IServiceCollection, Microsoft.Extensions.DependencyInjection.Abstractions, Version=1.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] => Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory
10: Singleton - Microsoft.Extensions.ObjectPool.ObjectPoolProvider => Microsoft.Extensions.ObjectPool.DefaultObjectPoolProvider
11: Transient - Microsoft.Extensions.Options.IConfigureOptions`1[[Microsoft.AspNetCore.Server.Kestrel.KestrelServerOptions, Microsoft.AspNetCore.Server.Kestrel, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] => Microsoft.AspNetCore.Server.Kestrel.Internal.KestrelServerOptionsSetup
12: Singleton - Microsoft.AspNetCore.Hosting.Server.IServer => Microsoft.AspNetCore.Server.Kestrel.KestrelServer
13: Singleton - Microsoft.AspNetCore.Hosting.IStartup => Microsoft.AspNetCore.Hosting.ConventionBasedStartup
14: Singleton - Microsoft.AspNetCore.Http.IHttpContextAccessor => Microsoft.AspNetCore.Http.HttpContextAccessor
15: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.AzureWebAppRoleEnvironmentTelemetryInitializer
16: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.DomainNameRoleInstanceTelemetryInitializer
17: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.ComponentVersionTelemetryInitializer
18: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.ClientIpHeaderTelemetryInitializer
19: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.OperationIdTelemetryInitializer
20: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.OperationNameTelemetryInitializer
21: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.SyntheticTelemetryInitializer
22: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.WebSessionTelemetryInitializer
23: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.WebUserTelemetryInitializer
24: Singleton - Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer => Microsoft.ApplicationInsights.AspNetCore.TelemetryInitializers.AspNetCoreEnvironmentTelemetryInitializer
25: Singleton - Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration => Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration
26: Singleton - Microsoft.ApplicationInsights.TelemetryClient => Microsoft.ApplicationInsights.TelemetryClient
27: Singleton - Microsoft.ApplicationInsights.AspNetCore.ApplicationInsightsInitializer => Microsoft.ApplicationInsights.AspNetCore.ApplicationInsightsInitializer
28: Singleton - Microsoft.ApplicationInsights.AspNetCore.DiagnosticListeners.IApplicationInsightDiagnosticListener => Microsoft.ApplicationInsights.AspNetCore.DiagnosticListeners.HostingDiagnosticListener
29: Singleton - Microsoft.ApplicationInsights.AspNetCore.DiagnosticListeners.IApplicationInsightDiagnosticListener => Microsoft.ApplicationInsights.AspNetCore.DiagnosticListeners.MvcDiagnosticsListener
30: Singleton - Microsoft.AspNetCore.Hosting.IStartupFilter => Microsoft.ApplicationInsights.AspNetCore.ApplicationInsightsStartupFilter
31: Singleton - Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet => Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet
32: Singleton - Microsoft.ApplicationInsights.AspNetCore.Logging.DebugLoggerControl => Microsoft.ApplicationInsights.AspNetCore.Logging.DebugLoggerControl
33: Singleton - Microsoft.Extensions.Options.IOptions`1[[Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration, Microsoft.ApplicationInsights, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] => Microsoft.Extensions.DependencyInjection.TelemetryConfigurationOptions
34: Singleton - Microsoft.Extensions.Options.IConfigureOptions`1[[Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration, Microsoft.ApplicationInsights, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] => Microsoft.Extensions.DependencyInjection.TelemetryConfigurationOptionsSetup
35: Singleton - Microsoft.Extensions.Options.IConfigureOptions`1[[Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions, Microsoft.ApplicationInsights.AspNetCore, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] => Microsoft.AspNetCore.Hosting.DefaultApplicationInsightsServiceConfigureOptions
36: Singleton - Microsoft.Extensions.Logging.ILoggerFactory => Microsoft.Extensions.Logging.LoggerFactory
37: Singleton - System.Diagnostics.DiagnosticListener => System.Diagnostics.DiagnosticListener
38: Singleton - System.Diagnostics.DiagnosticSource => System.Diagnostics.DiagnosticListener
39: Singleton - Microsoft.AspNetCore.Hosting.IApplicationLifetime => Microsoft.AspNetCore.Hosting.Internal.ApplicationLifetime

140 more services gets added by the AddMvc() method. And even more, if you want to use more components and frameworks, like Identity and Entity Framework Core.

Because of that, you should use the common way to add framework services to the IServiceCollection and read the added services to the other container afterwards.

The next lines with dummy code, shows you how the implementation could be look like:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  // Add framework services.  
  services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));

  services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

  services.AddMvc();
  services.AddOtherStuff();

  // create custom container
  var container = new CustomContainer();
  
  // read service collection to the custom container
  container.RegisterFromServiceCollection(services);

  // use and configure the custom container
  container.RegisterSingelton<IProvider, MyProvider>();

  // creating the IServiceProvider out of the custom container
  return container.BuildServiceProvider();
}

The details of the implementation depends on how the container works. E. g. If I'm right, Laurent Bugnion's SimpleIOC already is a IServiceProvider and could be returned directly. Let's see how this works with Autofac:

Replacing with Autofac

Autofac provides an extension library to support this container in ASP.NET Core projects. I added both the container and the extension library packages from NuGet:

Autofac, 4.5.0
Autofac.Extensions.DependencyInjection, 4.1.0

I also added the related usings to the Startup.cs:

using Autofac;
using Autofac.Extensions.DependencyInjection;

Now I'm able to create the Autofac container in the ConfigureServices method:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  // Add framework services.  
  services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));

  services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

  services.AddMvc();
  services.AddOtherStuff();
  
  // create a Autofac container builder
  var builder = new ContainerBuilder();

  // read service collection to Autofac
  builder.Populate(services);

  // use and configure Autofac
  builder.RegisterType<MyProvider>().As<IProvider>();

  // build the Autofac container
  ApplicationContainer = builder.Build();
  
  // creating the IServiceProvider out of the Autofac container
  return new AutofacServiceProvider(ApplicationContainer);
}

// IContainer instance in the Startup class 
public IContainer ApplicationContainer { get; private set; }

With this implementation, Autofac is used as the dependency injection container in this ASP.NET application.

If you also want to resolve the controllers from the container, you should add this to the container too Otherwise the framework will resolve the Controllers and some special DI cases are not possible. A small call adds the Controllers to the IServiceColection:

services.AddMvc().AddControllersAsServices();

That's it.

More about Autofac: http://docs.autofac.org/en/latest/integration/aspnetcore.html

Conclusion

Fortunately Autofac supports the .NET Standard 1.6 and there is this nice extension library to get it working in ASP.NET too. Some other containers don't and it needs some more effort to get it running.

Manfred Steyer: Authentifizierung und Autorisierung mit Angular, OAuth2 und OIDC: Material von Session auf dotnetcologne, Mai 2017

Nachfolgend das Material von meiner Session zu Angular, OAuth2 und OIDC:

Jürgen Gutsch: How to add custom logging in ASP.NET Core

ASP.NET Core is pretty flexible, customizable and extendable. You are able to change almost everything. Even the logging. If you don't like the built-in logging, you are able to plug in your own logger or an existing logger like log4net, NLog, Elmah. In this post I'm going to show you how to add a custom logger.

The logger I show you, just writes out to the console, but just for one single log level. The feature is to configure different font colors per LogLevel. So this logger is called ColoredConsoleLogger.

General

To add a custom logger, you need to add an ILoggerProvider to the ILoggerFactory, that is provided in the method Configure in the Startup.cs:

loggerFactory.AddProvider(new CustomLoggerProvider(new CustomLoggerConfiguration()));

The ILoggerProvider creates one or more ILogger which are used by the framework to log the information.

The Configuration

The idea is, to create different colored console entries per log level and event ID. To configure this we need a configuration type like this:

public class ColoredConsoleLoggerConfiguration
{
  public LogLevel LogLevel { get; set; } = LogLevel.Warning;
  public int EventId { get; set; } = 0;
  public ConsoleColor Color { get; set; } = ConsoleColor.Yellow;
}

This sets the default level to Warning and the color to Yellow. If the EventId is set to 0, we will log all events.

The Logger

The logger gets a name and the configuration passed in via the constructor. The name is the category name, which usually is the logging source, eg. the type where the logger is created in:

public class ColoredConsoleLogger : ILogger
{
  private readonly string _name;
  private readonly ColoredConsoleLoggerConfiguration _config;

  public ColoredConsoleLogger(string name, ColoredConsoleLoggerConfiguration config)
  {
    _name = name;
    _config = config;
  }

  public IDisposable BeginScope<TState>(TState state)
  {
    return null;
  }

  public bool IsEnabled(LogLevel logLevel)
  {
    return logLevel == _config.LogLevel;
  }

  public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
  {
    if (!IsEnabled(logLevel))
    {
      return;
    }

    if (_config.EventId == 0 || _config.EventId == eventId.Id)
    {
      var color = Console.ForegroundColor;
      Console.ForegroundColor = _config.Color;
      Console.WriteLine($"{logLevel.ToString()} - {eventId.Id} - {_name} - {formatter(state, exception)}");
      Console.ForegroundColor = color;
    }
  }
}

We are going to create a logger instance per category name with the provider.

The LoggerProvider

The LoggerProvider is the guy who creates the logger instances. Maybe it is not needed to create a logger instance per category, but this makes sense for some Loggers, like NLog or log4net. Doing this you are also able to choose different logging output targets per category if needed:

  public class ColoredConsoleLoggerProvider : ILoggerProvider
  {
    private readonly ColoredConsoleLoggerConfiguration _config;
    private readonly ConcurrentDictionary<string, ColoredConsoleLogger> _loggers = new ConcurrentDictionary<string, ColoredConsoleLogger>();

    public ColoredConsoleLoggerProvider(ColoredConsoleLoggerConfiguration config)
    {
      _config = config;
    }

    public ILogger CreateLogger(string categoryName)
    {
      return _loggers.GetOrAdd(categoryName, name => new ColoredConsoleLogger(name, _config));
    }

    public void Dispose()
    {
      _loggers.Clear();
    }
  }

There's no magic here. The method CreateLogger creates a single instance of the ColoredConsoleLogger per category name and stores it in the dictionary.

Usage

Now we are able to use the logger in the Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
  loggerFactory.AddConsole(Configuration.GetSection("Logging"));
  loggerFactory.AddDebug();
  // here is our CustomLogger
  loggerFactory.AddProvider(new ColoredConsoleLoggerProvider(new ColoredConsoleLoggerConfiguration
  {
    LogLevel = LogLevel.Information,
    Color = ConsoleColor.Blue
  }));
  loggerFactory.AddProvider(new ColoredConsoleLoggerProvider(new ColoredConsoleLoggerConfiguration
  {
    LogLevel = LogLevel.Debug,
    Color = ConsoleColor.Gray
  }));

But this doesn't really look nice from my point of view. I want to use something like this:

loggerFactory.AddColoredConsoleLogger(c =>
{
  c.LogLevel = LogLevel.Information;
  c.Color = ConsoleColor.Blue;
});
loggerFactory.AddColoredConsoleLogger(c =>
{
  c.LogLevel = LogLevel.Debug;
 c.Color = ConsoleColor.Gray;
});

This means we need to write at least one extension method for the ILoggerFactory:

public static class ColoredConsoleLoggerExtensions
{
  public static ILoggerFactory AddColoredConsoleLogger(this ILoggerFactory loggerFactory, ColoredConsoleLoggerConfiguration config)
  {
    loggerFactory.AddProvider(new ColoredConsoleLoggerProvider(config));
    return loggerFactory;
  }
  public static ILoggerFactory AddColoredConsoleLogger(this ILoggerFactory loggerFactory)
  {
    var config = new ColoredConsoleLoggerConfiguration();
    return loggerFactory.AddColoredConsoleLogger(config);
  }
  public static ILoggerFactory AddColoredConsoleLogger(this ILoggerFactory loggerFactory, Action<ColoredConsoleLoggerConfiguration> configure)
  {
    var config = new ColoredConsoleLoggerConfiguration();
    configure(config);
    return loggerFactory.AddColoredConsoleLogger(config);
  }
}

With this extension methods we are able to pass in an already defined configuration object, we can use the default configuration or use the configure Action as shown in the previous example:

loggerFactory.AddColoredConsoleLogger();
loggerFactory.AddColoredConsoleLogger(new ColoredConsoleLoggerConfiguration
{
  LogLevel = LogLevel.Debug,
  Color = ConsoleColor.Gray
});
loggerFactory.AddColoredConsoleLogger(c =>
{
  c.LogLevel = LogLevel.Information;
  c.Color = ConsoleColor.Blue;
});

Conclusion

This is how the output of that nonsense logger looks:

Now it's up to you to create a logger that writes the entries to a database, log file or whatever or just add an existing logger to your ASP.NET Core application.

Manfred Steyer: Hochperformante Anwendungen mit Angular: Unterlagen von Session auf dotnet cologne, Köln, Mai 2017

Nachfolgend die Unterlagen zu meiner Session über Performance und Angular:

Golo Roden: Go in Freiburg

Vergangene Woche fand das erste Meetup in Freiburg zur Programmiersprache Go statt. Mit knapp 30 Teilnehmern war die Veranstaltung gut besucht, wobei Einsteiger ebenso anzutreffen waren wie erfahrene Entwickler.

MSDN Team Blog AT [MS]: Roundtables für ISVs auf der BUILD 2017

Vor kurzem wurden für die BUILD auch einige Roundtables (für ISVs) angekündigt in denen die Produktgruppen/Microsoft Entwickler für Fragen & Feedback zur Verfügung stehen.

Anmeldung & Details: ISV Expo

AIT: Eindrücke von der Hannover Messe 2017

Vom 24.04.2017 bis 28.04.2017 war Hannover wieder der Schmelztiegel von industrieller Innovation. Alle Schlüsseltechnologien und Kernbereiche der Industrie sind auf der Leistungsschau vertreten. Auch wir waren vor Ort. Unser Ziel diesmal: Validieren der Innovationsschritte, die wir mit unseren Kunden gehen. Unter diesem Fokus haben wir uns insbesondere die Bereiche Augmented Reality und  Virtual Reality, sowie Internet of Things, insbesondere im Hinblick auf IaaS-, PaaS- und SaaS-Lösungen angesehen. Aber eins nach dem anderen.

Augmented und Virtual Reality

Zuerst werfen wir einen Blick auf Virtual (VR) und Augmented Reality (AR). Datenbrillen, egal ob VR oder AR waren reichlich vorhanden. Allein auf dem Microsoft-Stand waren laut Aussage von Dr. Robert Nahm, Industry Manager für deutsche Automotive-Kunden bei Microsoft, mehr als 50 Brillen verfügbar. Aber auch andere Anbieter wie Epson, Vuzix, DAQRI oder Intel sind auf den Ständen zahlreich vertreten. Auffällig ist, und dies spiegelt sehr stark unsere Erfahrung aus Kundenprojekten und Kundensprächen wider, dass das Thema AR weitaus relevanter für die Industrie scheint. Es fanden sich wesentlich weniger VR- als AR-Szenarien auf den Ständen der Aussteller. Eines der besseren Szenarien zeigte Dassault Systemes mit einem virtuellen Rundgang durch eine Produktionsanlage. Im Gegensatz zu vielen ähnlichen VR-Szenarien überzeugt die Anwendung von Dassault Systems durch hohe Frameraten bei guter optischer Qualität.

VR Demo bei Dassault Systems

Spannender waren jedoch die vielen AR-Szenarien. Auf Basis von einfachen AR-Brillen wurden insbesondere Remote-Support, Training und Supervision dargestellt. Die Brillen basieren dabei zumeist auf Android-Plattformen, die Anwendungen schwanken von nativen bis zu Web-Applikationen. In beiden Ausprägungen lässt sich noch immer erkennen, dass Entwickler und Anwender nach Best Practices für die Gestaltung von User Interfaces und insbesondere User Experience suchen. Dabei werden anscheinend vor lauter Spielerei die Basics vergessen. So verwirrte mich die Bedienung einer Intel-Brille, bei der man mittels Wisch-Gesten an der Brille durch die Applikation navigiert, dabei aber die Richtung der Wischgeste entgegengesetzt zur Navigation war.

Im Bereich der Mixed Reality Devices gab es neben Microsoft HoloLens auch weitere Vertreter. So waren Prototypen chinesischer Hersteller auf Basis von Windows Mixed Reality zu sehen. Darüber  hinaus zeigte DAQRI sowohl seinen Helm als auch seine neue Datenbrille. Beide basieren auf der nahezu gleichen Hard- und Softwareplattform.

Internet of Things

Das Modewort IoT fand man an nahezu jedem Stand. Die Interpretation ist dabei aber noch immer sehr breit gefächert. Für uns und unsere Kunden sind insbesondere die Cloud-Dienstleister wie Amazon und Microsoft, aber auch die Spezialisten wie Bosch, Siemens oder GE interessant. Alle versprechen mit ihren Suiten einen schnellen Start bei der Entwicklung eigener IoT-Lösungen. Während sich die meisten dabei auf PaaS und IaaS-Szenarien beschränken, zeigte Microsoft mit Micosoft IoT Central eine SaaS-Lösung, die auf der bestehenden Microsoft Azure IoT Suite aufsetzt und den Zugang zur Verwaltung von und Interaktion mit Geräten sowie die Beschaffung und Auswertung von Daten und die sich daran anschließenden Verarbeitungen sowie Inter- und Reaktionen wesentlich vereinfacht.

Wichtiges Instrument für die Realisierung ist bei allen Lösungsanbieter OPC UA. Auf der am 25.04.2017 gehaltenen Pressekonferenz konnte die OPC Foundation daher auch zwei großartige Bekanntmachungen tätigen. Zum einen verwies Stefan Hoppe, OPC Foundation Global Vice President, auf die Relevanz von Datensicherheit und auf die vom Bundesamt für Sicherheit in der Informationsindustrie (BSI) durchgeführte Analyse der OPC UA Spezifikation sowie einer zugehörigen Referenzimplementierung. Die Analyse bestätigt, dass Sicherheit eine der Säulen von OPC UA ist.

 

Darüber hinaus konnte im Laufe des vergangenen Jahres die bisherige OPC UA Referenzimplementierung durch eine neue, insbesondere von Microsoft getriebene und auf .NET Standard basierende Referenzimplementierung ersetzt werden, welche allen Interessierten auf GitHub zur Verfügung steht. Wer kommerziellen Support für den OPC UA .NET Standard Stack sucht, wird voraussichtlich ab Q4 2017 bei Softing Industrial fündig, wie das Unternehmen im Rahmen der Pressekonferenz verlautbaren ließ.

Gleichzeitig zeigte sich, das Microsoft auch im Rahmen von OPC UA einer der größten Mitwirkenden für Open Source Software ist. So stehen nun neben. .NET und .NET Standard auch Stacks in Java und AnsiC zur Verfügung.

 

Suchen auch Sie einen herausragenden Partner bei der Umsetzung Ihrer IoT- oder AR-Lösungen, so sprechen Sie uns an. Wir freuen uns darauf, mit unserem Wissen und Können zum Gelingen Ihrer Lösung beitragen zu können.

Golo Roden: Einführung in Node.js, Folge 16: Node.js und Docker

Für das Deployment einer in Node.js entwickelten Anwendung gilt es, verschiedene Herausforderungen zu meistern. Eine der wichtigsten Aspekte ist das Erstellen einer auf Tastendruck reproduzierbaren Installation. Die Container-Plattform Docker kann helfen, das Ziel zu erreichen.

Norbert Eder: Was hat Lego mit Softwareentwicklung zu tun?

Eine neue Lego-Box. Alles sauber geordnet, alle Anleitungen sind vorhanden. Viele Packungen und Spielwochenenden später sieht das anders aus.

Beim Spielen bricht mal hier ein Stück ab, mal wo anders. Nicht alles gelangt sofort wieder an seine (originale) Stelle. Hin und wieder fällt ein ganzes Lego-Spielzeug auf den Boden und zerspringt in alle Einzelteile. Nicht selten haben Kinder dann keine Lust, es wieder komplett zusammen zu bauen.

Das Ergebnis lässt sich Wochen oder Monate später zeigen:

Lego-Ruine

Lego-Ruine

Von den mit Freude zusammengebauten Lego-Spielen bestehen nur mehr Ruinen und Einzelteile. Kaum etwas ist noch vollständig. Schuld daran war der wenig liebevolle Umgang damit und dass Schäden nicht sofort vollständig behoben wurden.

Wer dies nun wieder auf die Reihe bekommen möchte, sieht sich einer schier unendlichen Aufgabe bevor. Die einzige Möglichkeit, einigermaßen schnell Resultate zu erzielen ist die Auftrennung nach Farben (und ähnlichen Teilen, siehe Männchen, Autoteile, etc.):

Zusammenfassen gleicher Teile

Zusammenfassen gleicher Teile

Ist diese Aufteilung erfolgt, gelingt beim Zusammenbauen das Finden der gesuchten Bauteile wieder viel einfacher. Immerhin müssen nicht alle Steine durchsucht werden.

Durch das korrekte Zusammensetzen kann nun der alte Zustand wieder hergestellt werden. Voraussetzung hierfür ist die Verfügbarkeit aller notwendigen Teile. In manchen Fällen kann ein Lego-Spielzeug nicht mehr Vollständig gebaut werden. Teile müssen nachbestellt oder von anderen Spielzeugen auseliehen werden.

Der zu betreibende Aufwand ist immens. Dies ist an der Ausdauer der Kinder zu bemerken. Schon nach einigen Minuten sortieren und suchen verlässt sie die Motivation. Viel lieber werden neue Figuren erschaffen. Die Vernichtung beginnt von vorne.

Vollständige Lego-Figur

Vollständige Lego-Figur

Es ist viel Disziplin und Motivation notwendig, um wieder alle Lego-Figuren vollständig aufzubauen. Müssen Kinder durch diese Erfahrung durch, gehen sie danach (nicht immer, aber doch) vorsichtiger mit ihrem Lego um. Achtet man in regelmäßigen Abständen darauf, dass wieder repariert wird, kommt es nie wieder zum Ergebnis aus Bild 1.

Genauso verhält es sich mit unserer Software. Wenn wir nicht auf sie achten und lieber nur Neues bauen, alten Sourcecode aber nicht hegen und pflegen, dann stehen wir nach nicht allzulanger Zeit ebenso vor einer Ruine, die nur sehr mühsam wieder aufgebaut werden kann. Werden jedoch regelmäßig Wartungsarbeiten daran vorgenommen, kommt es erst gar nie zu diesem Verfall.

Happy Coding!

The post Was hat Lego mit Softwareentwicklung zu tun? appeared first on Norbert Eder.

AIT: Dependency Manager – new version available

Today a new version of our Dependency Manager 2015 (14.7.17117.1) was released.
It is based on the sources of the GitHub repository and contains some minor fixes.

Get the binaries from Visual Studio (Tools -> Extension and Updates) or directly from the marketplace.

Norbert Eder: C#: Private Typen in ein XML serialisieren

Eigentlich ist es ja ein alter Hut (und XML ist für viele out), aber aus Gewohnheit bin ich heute selbst wieder in diese Falle getappt. Es geht um eine kleine Library, die eine möglichst kleine Schnittstelle nach außen bieten soll. Diese dient dazu, um einige Konfigurationen vornehmen zu können. Diese werden im Hintergrund in XML-Dateien persistiert. Soweit kein Ding.

Nun liegt es in meiner Natur, dass in meinen Libraries nur die Klassen/Typen öffentlich zugänglich sind, die auch tatsächlich von anderen verwendet werden dürfen. Alle Typen, die mir intern helfen, alles geregelt zu bekommen, bleiben dabei nur innerhalb der Assembly sichtbar.

Damit möchte ich einigen Problemen vorbeugen:

  • Fehlverwendung der Library durch einen falschen Einstiegspunkt oder mit inkorrektem Setup
  • Fehlverhalten der Library (eben durch erstere Nutzung)
  • Streuung der Interna und damit verbundene Schwierigkeiten bei Updates (Änderungen der Sichtbarkeit, der Funktionalität, usw.)
  • Vereinfachte Verwendung der Library – je weniger öffentlich angeboten wird, desto leichter findet man sich zurecht

Soweit aber alles noch kein Thema.

Aus Gewohnheit habe ich dann zum XmlSerializer gegriffen. Alles was darüber serialisiert werden soll, muss allerdings öffentlich sein (es wird im Hintergrund Code generiert). Das wiederspricht meinem Vorhaben.

Zum Glück gibt es den DataContractSerializer als Alternative. Mittels DataContract kann eine Klasse als „Vertrag“ markiert werden, zu serialisierende Member/Properties sind mit Attribut DataMember zu versehen. Siehe als Beispiel:

[DataContract]
internal class Setting
{
    [DataMember]
    public string SubSetting1 { get; set; }
    [DataMember]
    public string SubSetting2 { get; set; }
}

So kann man das dann in ein XML serialisieren:

var serializer = new DataContractSerializer(typeof(Setting));
using (var stream = new XmlTextWriter(path, Encoding.Unicode))
{
    serializer.WriteObject(stream, objectToSerialize);
}

Und so wird das XML deserialisiert:

var serializer = new DataContractSerializer(typeof(Setting));
using (var stream = new XmlTextReader(path))
{
    Setting config = serializer.ReadObject(stream) as Setting;
    return config;
}

Viel mehr Hexerei ist das nicht und schon bleibt nur das Notwendige in unserer Library öffentlich sichtbar und deren Verwendung vereinfacht sich ungemein.

Happy Coding!

The post C#: Private Typen in ein XML serialisieren appeared first on Norbert Eder.

MSDN Team Blog AT [MS]: Xamarin Dev Days (Wien & Graz) UPDATE

Wir bringen die Xamarin Dev Days nach Österreich. Dazu wollen wir euch auf 2 Events hinweisen bei denen wir als Microsoft Österreich mithelfen.

image

Xamarin Dev Day – 24.05.2017, Wien

Datum: 24.05.2017
Ort: Microsoft Zentrale, Am Euro Platz 3, 1120, Wien (Karte)

Proramm:
08:30 – Einlass
09:00 – 09:15 – Begrüßung der Teilnehmer und Einführung (Hannes Preishuber)
09:15 – 10:00 – Intro to Xamarin (Andreas Willich)
10:00 – 11:00 – Mobile X – Plattform DevOps (Gerwald Oberleitner & Nikolas Dobiasch)
11:15 – 12:15 – Xamarin Forms (Michael Zöhling)
12:10 – 13:00 – Mittagessen
13:00 – 14:00 – Xamarin + Azure (Hannes Preishuber)
14:15 – 15:00 – Neues von der Build (Raoul Holzer)
15:00 – 16:30 – Hands on Lab / Workshop / Clinic for Advance
16:30 – 17:00 – Wetterabhängig Beer&BBQ

JETZT KOSTENLOST ANMELDEN (Wien)

image

Xamarin Dev Day – 20.05.2017, Graz

Es freut uns sehr, dass wir Kerry W. Lothrop (Xamarin MVP aus Frankfurt) als Speaker gewinnen konnten.

Datum: 20.05.2017
Ort: Aula X Space, Georgigasse 85, Graz (Karte)

08:30 – 09:00 Registration and breakfast
09:00 – 09:20 Welcome (Bernd Hirschmann)
09:20 – 10:10 Intro to Xamarin (Kerry W. Lothrop)
10:10 – 11:00 Xamarin Forms (Hannes Hasenauer)
11:10 – 12:00 Xamarin + Azure (Ivan Culjak)
12:00 – 13:00 Lunch
13:00 – 13:50 Mobile, X-Platform DevOps (Nikolas Dobiasch)
13:50 – 14:30 News from Build (Bernd Hirschmann)
14:30 – 16:30 Hands on Lab / Ask your Questions
16:30 – 17:30 Beer and Networking

JETZT KOSTENLOS ANMELDEN (Graz)

Jürgen Gutsch: Error while starting Docker for Windows

The last couple of months I wanted to play around with Docker for Windows. It worked just twice. Once at the first try for just one or two weeks. Then I got an error, when Docker tries to initialize right after Windows starts. After I reinstalled Docker for Windows it runs the second time for a two or three weeks. I tried to reinstall all that stuff but I didn't get it running again on my machine.

The error shown on this dialog is not really meaningful:

Object reference not set to an instance of an object...

Even the log didn't really help:

Version: 17.03.1-ce-win5 (10743)
Channel: stable
Sha1: b18e2a50ccf296bcd637b330c0ca9faaab9d790c
Started on: 2017/04/28 21:49:37.965
Resources: C:\Program Files\Docker\Docker\Resources
OS: Windows 10 Pro
Edition: Professional
Id: 1607
Build: 14393
BuildLabName: 14393.1066.amd64fre.rs1_release_sec.170327-1835
File: C:\Users\Juergen\AppData\Local\Docker\log.txt
CommandLine: "Docker for Windows.exe"
You can send feedback, including this log file, at https://github.com/docker/for-win/issues
[21:49:38.182][GUI            ][Info   ] Starting...
[21:49:38.669][GUI            ][Error  ] Object reference not set to an instance of an object.
[21:49:45.081][ErrorReportWindow][Info   ] Open logs

Today I found some time to search for a solution and fortunately I'm not the only one who faced this error. I found an issue on GitHub which described exactly this behavior: https://github.com/docker/for-win/issues/464#issuecomment-277700901

The solution is to delete all the files inside of that folder:

C:\Users\<UserName>\AppData\Roaming\Docker\

Now I just needed to restart docket for Windows, by calling the Docker for Windows.exe in C:\Program Files\Docker\Docker\

Finally I can continue playing around with Docker :)

Christian Dennig [MS]: Cloud Application Development

Wer sich immer schon gefragt hat, wie man die „Reise in die Cloud“ beginnen soll und vor einem riesigen Berg an Fragezeichen stand („Welche Services benötige ich?“, „Wie entwerfe ich meine Lösung, damit diese auf Azure unter Last skaliert?“, „Wie erstelle ich die komplette Cloud Infrastruktur auf Knopfdruck?“, „Welche Datenbank soll ich verwenden?“ usw.), der sich nicht auf die Schnelle aufgelöst hat, dem sei der folgende Microsoft Virtual Academy Kurs ans Herz gelegt:

Cloud Application Development

Der Kurs von Colim Dembovsky und Steven Borg dauert nur wenige Stunden und behandelt viele, viele Themen, die man für eine moderne Application und deren Betrieb in der Cloud benötigt:

  • Web und API Apps
  • Mobile / Xamarin
  • SQL Server
  • Redis Cache
  • DocumentDB
  • Search
  • Container
  • DevOps
  • …und vieles mehr

Natürlich geht der Kurs in der angesprochenen Zeit nicht allzu sehr in die Tiefe, man bekommt jedoch einen umfangreichen Einblick in die Themen und Problemstellungen, die einem beim Entwurf einer Cloud Lösung begegnen werden.

Zu diesem Video gibt es außerdem umfangreiche Begleitmaterialien, die man sich aus der MVA herunterladen kann. Außerdem wird dort auch auf ein GitHub Repository mit einer entsprechenden Beispiel-Applikation verwiesen. Ein rundum-sorglos Paket und perfekter Start zu einer Cloud Lösung also 🙂

Viel Spaß damit!


Golo Roden: Gelesen: "Wie Elon Musk die Welt verändert"

"Ich würde gerne auf dem Mars sterben, nur nicht bei der Landung", hat Elon Musk einmal gesagt. Er hat den Zahlungsdienstleister PayPal sowie das Weltraumunternehmen SpaceX gegründet und leitet außerdem die Geschicke des Elektroauto-Herstellers Tesla Motors. Ashlee Vance hat seine Biografie geschrieben. Lohnt sich die Lektüre?

AIT: Pull Request auf GitHub über einen Fork

Haben Sie sich bei der Verwendung von Software-Projekten auf GitHub auch schon mal gefragt: „Was ist ein Pull Reqest?“, „Wie erstelle ich eigentlich einen Pull Request?“ und „Wieso benötige ich manchmal einen Fork oder eben nicht?“ Im folgenden Blog Post gehen wir auf alle drei Fragestellungen ein und erklären dies am Beispiel des AIT Dependency Managers auf GitHub.

Ein Pull Request ist im Prinzip nichts anderes als eine Anfrage die gestellt wird, um Änderungen am Code in den Master-Branch übernehmen zu lassen (vereinfacht: „git merge“). Die eigenen Änderungen werden dazu in einem getrennten Feature-Branch vorbereitet und anschließend zur Übernahme beim Repository-Verantwortlichen angemeldet. Der Verantwortliche prüft die Änderungen und überträgt anschließend die Änderungen in das Quell-Repository. An den Commits werden für gewöhnlich keine Änderungen direkt vorgenommen, sodass Metadaten wie der Original-Autor, Commit-Datum, etc. erhalten bleiben. Diese Art der Code-Integration und -Review wird durch verschiedene Plattformen und Tools (z.B. GitHub, Visual Studio) unterstützt und nennt sich Pull Request. Als gutes Vorgehen hat sich dabei etabliert, dass der Entwickler Kommentare hinzufügt, die dem Repository-Verantwortlichen schnell einen Überblick geben, was mit dem Pull Request erreicht werden soll.

Eine Besonderheit bei der Verwaltung bzw. Erstellung der Feature-Branches ist das Fork Konzept. Ein Feature-Branch im Rahmen eines Pull-Requests kann ich als Entwickler entweder im Original-Repository oder in einer Repository-Kopie durchführen. Der Ort hängt schlussendlich von meiner Vertrauensstellung zum Repository ab. Als Mitarbeiter einer Organisation vertraut meistens der Repository-Verantwortlicher mir als Organisationsmitglied mehr als einem externen Mitarbeiter. Der Hintergrund einer niedrigeren Vertrauensstellung ist z.B. fehlendes Wissen über Architektur-Konzepte bzw. Code-Stil(e) oder potentiell negative Auswirkungen auf andere Teile der Applikation.

Um die Vertrauensfrage zu adressieren, wurde das Fork Konzept eingeführt, d.h. dank Git kann jeder Entwickler auf einer 1:1 Kopie seine Arbeit mit Branches, Commits, etc. eigenverantwortlich organisieren, aber kontrolliert seine Änderungen wieder an das Original-Repository übertragen. Das Fork-Konzept hat hier die Aufgabe der Isolation, sodass Entwickler Änderungen in kompletter Isolation auf einer 1:1 Kopie des Repositories vorbereiten und aufbereiten können und anschließend die Änderungen auf sehr einfache Art und Weise vom Quell-Repository-Autor übernommen werden können. Durch die Isolation bleibt hier das Orginal-Repository in einen aufgeräumten Zustand. Eine gute Diskussion zum Thema wann ist „Forken“ sinnvoll und wann nicht finden sie im Artikel von Willy-Peter.

Fork erstellen und Klonen

Die ersten Schritte im Pull Request Prozess sind das Forken und Klonen des gewünschten GitHub Repositories (hier AIT.DependencyManager). Klicken Sie dafür auf der GitHub Repository Webseite ganz oben rechts auf die unscheinbare Schaltfläche „Fork“.

Im Anschluss daran haben Sie in Ihrem GitHub-Account einen eigenen Fork, den Sie wie jedes andere Git Repository klonen können (z.B. : https://github.com/YourGitHubAccount/AIT.DependencyManager).
Für das Klonen haben sie je nach Geschmack mehre Optionen. Klicken Sie zunächst auf die grüne Schaltfläche „Clone or download“. Wenn Sie die GitHub-Extensions for Visual Studio installiert haben, wird Ihnen die Schaltfläche „Open in Visual Studio“ angezeigt, so wie im folgenden Screenshot dargestellt. Über einen Klick wird in einer neuen Visual Studio-Instanz die Eingabemaske für das Klonen eines Repositories geöffnet, die bereits den Link zu Ihrem Fork enthält. Haben Sie die Extension nicht installiert oder möchten Sie eine andere IDE oder die Kommandozeile verwenden, so können den Link zum Repository mit einem Klick auf das Symbol hinter der URL in die Zwischenablage kopieren.

Im Visual Studio ist es beim Klonen empfehlenswert das Repository an einem geeigneten Platz auf Ihrer Festplatte abzulegen und nicht den Standardwert im Windows-Profil-Ordner zu verwenden (siehe Vorschlag im Screenshot: C:\Repos ).

Branchen

Bevor Sie mit dem Entwickeln beginnen, ist es ratsam sich einen eigenen Branch zu erstellen. Das Erstellen eines Branches in Git ist sehr leichtgewichtig. So hat sich in Git das Vorgehen etabliert jedes Feature in einem eigenen lokalen Branch zu entwickeln. Dadurch kann die Sicherheit, Nachvollziehbarkeit, Übersichtlichkeit und schlussendlich auch Wartbarkeit während der Entwicklungsphase durch regelmäßiges commiten erreicht werden. Trotzdem bleibt der Code und die Historie das Urspung-Branches sauber, in dem der Code erst dann zurückfließt, wenn dieser das gewünschte Qualitätsniveau erreicht hat.

Das Erstellen eines Branches in einem öffentlichen GitHub Repository in Visual Studio funktioniert identisch wie bei Branches in einem privaten Repositories Git-Server (z.B. TFS, VSTS, etc.) auch. Klicken Sie zunächst in der Statuszeile auf den Pfeil beim aktuellen Branch (siehe Screenshot – in diesem Fall „master“). Mit einem weiteren Klick auf „New Branch…“ öffnet sich die Eingabemaske, in der noch ein Branch-Name vergeben und der Ursprungs-Branch ausgewählt werden muss.

Commit und Publish

Nach der Codeänderung wird der Code mit einem „Commit“ in das lokale Repository eingecheckt.

Das Remote-Repository (in diesem Fall GitHub) hat zu diesem Zeitpunkt noch keine Kenntnis, dass offline ein Branch erstellt wurde und Änderungen eingecheckt wurden. Wie im folgenden Screenshot zu sehen ist, werden Sie beim ersten „Push“ aufgefordert, Ihren Branch auf GitHub zu veröffentlichen (Outgoing Commits -> „Publish“).

Jetzt haben Sie Ihre Quellcodeänderung in Ihrem GitHub-Account in einem Branch innerhalb Ihres Forks veröffentlicht und können den Pull Request Prozess beginnen.

Pull Request

Den Abschluss bildet das Übermitteln der Änderungen via Pull Request. Zum Auslösen des Pull Requests melden Sie sich zunächst in Ihren GitHub-Account an und öffnen Sie ihren Fork. Klicken Sie auf die Schaltfläche „Compare & pull request“

Vor dem Abschicken geben Sie als letzten Schritt noch eine Beschreibung für Ihren Pull Request an und schicken ihn ab.

Als Ergebnis Ihres Pull Requests erhält der Verwalter des Repositories eine Benachrichtigung, dass ein neuer Pull Request eingegangen ist. Er wird jetzt Ihre Änderungen prüfen und entscheiden, ob er die Codeänderung(en) akzeptiert oder ablehnt. Der Prozess aus Sichtweise des Repository-Verwalters wird in einem extra Blog-Post behandelt.

Fazit

Im Rahmen dieses Blogposts wurde vorgestellt, dass Pull Requests kein Hexenwerk sind und jeder Entwickler mit einfachen Schritten sich an GitHub Projekten beteiligen kann. Sie haben dabei sowohl für den Entwickler als auch den Projekt-Verwalter mehrere Vorteile. Der Projektverantwortliche auf der einen Seite kann vor der Übernahme neuen Code auf diverse Aspekte prüfen und nur „guten“ Code integrieren. Der externe Projektmitarbeiter hingegen kann durch Rückmeldung(en) vom Projektverantwortlichen lernen (Bsp.: neue Code-Stile, Patterns, Architektur, Codequalität, etc.). Aufgrund der Isolation kann der neue Projektmitarbeiter zudem durch seine Änderungen keinen direkten Schaden anrichten und geniest durch die Isolation auch eine Art von Schutz.

MSDN Team Blog AT [MS]: Neuigkeiten von unseren Powershell Experten

Und auch diesen Monat haben unsere Powershell Experten Patrick und Roman wieder fleißig Infos für Euch zu Powershell gesammelt,

Ihr trefft unsere PowerShell Experten bei den folgenden Veranstaltungen:

  • Wien: 23.5.2017 Experts Live Café Wien bei Microsoft Wien – Anmeldung
  • Linz: 8.6.2017 Experts Live Café Linz bei Secureguard – Anmeldung und Agenda (Meetup)
  • PowerShell Einsteiger Workshop am 23. Juni 2017 in Wien.

Weitere infos zu PowerShell:

http://www.powershell.co.at/powershell-schnipseljagd-0817/

  • Wie wichtig ist Scripting und wieso mit PowerShell?
  • PowerShell Survival Guide
  • File Catalog bearbeiten
  • Wie man mit PowerShell etwas in die Zwischenablage legt
  • PowerShell Security Tools

http://www.powershell.co.at/powershell-schnipseljagd-1117/

  • Parallel Ping Monitor
  • Details einer AD Gruppe
  • Auslesen installierter Software von Remote-Computern
  • Welcher Monitor ist angeschlossen
  • Verwendungsmöglichkeiten von $_

http://www.powershell.co.at/powershell-schnipseljagd-1217/

  • Azure Key Vault als Passwortspeicher für dich und dein Team
  • Gedanken zur PowerShell Remoting Security
  • Etwas AI mit PowerShell?
  • PowerShell Remoting – mit Linux und Windows

http://www.powershell.co.at/powershell-schnipseljagd-1317/

  • ADSI
  • Suchen in Excel
  • Typen-Beschleuniger
  • Ein altes PowerShell Geheimnis: Befehle ohne Verb aufrufen

http://www.powershell.co.at/powershell-schnipseljagd-1417/

  • NTFS Berechtigungen verwalten
  • SQL Admin Tipps
  • PowerShell Einzeiler
  • Wieder etwas AI – Cognitive Services

Gordon Breuer: Casually using a Proxy with Bash on Ubuntu on Windows

With the Microsoft Windows 10 Anniversary Update (1607) we also got an integrated Linux Subsystem and the so called Bash on Ubuntu on Windows, providing us with a familiar Bash shell and Linux environment in which you can run most Linux command-line tools, directly on Windows, unmodified, without needing an entire Linux virtual machine.

Norbert Eder: Buch: Das Industrie 4.0 Arbeitsbuch

Das Industrie 4.0 Arbeitsbuch Industrie 4.0 ist ja in aller Munde, also muss eine entsprechende Lektüre her. Zwar sind Digitalisierung, Industrie 4.0 und Disruption nicht neu (siehe Rationalisierung), aber ein Blick schadet sicherlich nicht.

Das Buch durchaus gut, bietet zahlreiche Informationen und Fragestellungen. Der Autor weiß, wovon er schreibt. Mit einer gewissenhaften Beantwortung und Erarbeitung (es hat also den Titel Arbeitsbuch tatsächlich verdient) bekommt man einen recht guten Überblick der für sich und seinem Unternehmen notwendigen Schritte.

Ein paar Schlagworte, um die Inhalte klassifizieren zu können: Unterschiedliche Typen von Mitarbeitern (Owner, Creator, Broker), Disruption, Innovation, Digitales Manifest, Moonshot-Abteilungen/-Projekte, Musterwechsel, Stabilität usw.

Einen großen Negativpunkt ist mit diesem Buch aber verbunden: Beim Suchen & Ersetzen scheint gröber etwas schief gegangen zu sein, wodurch das ansonsten gut geschriebene Buch unheimlich an Lesefluss verliert und teilweise überhaupt keinen Spaß macht. Nichts desto trotz lohnt sich ein Blick.

Bei Interesse (Achtung Amazon): Das Industrie 4.0 Arbeitsbuch

The post Buch: Das Industrie 4.0 Arbeitsbuch appeared first on Norbert Eder.

Holger Schwichtenberg: Häufigere Updates für Visual Studio 2017 und "Fast Ring" für Previews

Anstelle der quartalsweisen Updates werden neue Versionen nun im Abstand weniger Tage und Wochen bereitgestellt. Außerdem gibt es jetzt noch häufiger Vorabversionen, die sich eigenständig aktualisieren und parallel installieren lassen.

MSDN Team Blog AT [MS]: Augmensys – die Augmented Reality Software UBIK

UBIK – Mobiles Datenmanagement und Cloud Services für die Industrie 

Die notwendigen Daten, zur rechten Zeit am richtigen Ort, für den jeweiligen Anwender!

Die Augmented Reality Software UBIK von Augmensys ist ein mächtiges Tool für die gesamte Industrie – branchenunabhängig und anwendungsorientiert.

Mit UBIK stellen viele unterschiedliche Quellsysteme (CAD, CAE, DMS, ERP, DCM,…) aufgrund einer effizient abgewickelten Datenkonsolidierung kein Problem dar.

Während der gesamten Anlagenlebensdauer (Errichtung, Inbetriebnahme, Betrieb, Instandhaltung, Shutdown-Management) bietet UBIK mittels mobiler Endgeräte einen intuitiven, aktuellen, papierlosen und eindeutigen Zugang zu den digitalen Systemen der gesamten Anlage für Kontrollorgane, Instandhalter, Techniker und Betreiber. Mobile Eingabemöglichkeiten für Quell- und Zielsysteme, Rückmeldungen von Fotos und Sprachnotizen sowie das Ablesen von Messwerten schaffen ein hochwirksames und effizientes Arbeiten in und mit der Industrieanlage.

Aber UBIK® identifiziert nicht nur was die Anwender sehen, es hilft ihnen auch zum Ort des Geschehens zu gelangen. Mittels Augmented-Reality-unterstützter Navigation werden externe Mitarbeiter und Kontraktoren effizient und vorallem sicher durch die komplexen Anlagen geführt.

 

Vorteile – auf einen Blick

UBIK ist SCHNELL

Grenzenloser Informationsaustausch spart wichtige Zeit und Geld.

UBIK ist EINFACH

Intuitive App-Bedienung erleichtert den Industriealltag.

UBIK ist MOBIL

Mobile Endgeräte als unumgängliches Werkzeug für das Management der gesamten Unternehmensdaten.

UBIK ist KOSTENNEUTRAL

Die Investition finanziert sich in kürzester Zeit selbst – dank der schlanken Implementierungsmethodik, garantiert!

UBIK ist ÜBERSICHTLICH

Durch rollenorientiertes Filtern der Daten, kommt nur die benötigte Information zum jeweiligen Anwender.

UBIK ist AKZEPTIERT

Schnelligkeit, Einfachheit, Übersichtlichkeit, Mobilität und papierloses Arbeiten überzeugen das
Management wie auch die Mitarbeiter umgehend.

 

UBIK für die Industrie

  • Augmented Reality
  • Cloud-Service
  • Navigation
  • Bidirektionalität
  • Support
  • Tracking

 

UBIK meets Microsoft AzureTM

“Aufgrund der tiefen Einbindung von UBIK in die Technologien und Produkte von Microsoft ist es absolut sinnvoll für uns, in erster Linie die die leistungsstarke Cloud-Plattform Windows Azure zu nutzen“ – Jürgen Kneidinger, CEO Augmensys

UBIK ist natürlich in der Lage die von Windows Azure bereitgestellten SQL Services zu nutzen. Das heißt, dass eine UBIK Datenbank einfach nach Azure portiert werden kann. Dasselbe gilt für das Dateisystem: anstelle einer klassischen Dateiablagestruktur kann ein UBIK Administrator nun den Azure Blob Service konfigurieren. Das dritte Feature, die UBIK Webservices, können ebenfalls auf der Azure Plattform laufen und die Features können auch gemischt werden, also z.B. nur den Blob Speicher verwenden und den Rest im eigenen Haus hosten. Auf Wunsch kann die komplette UBIK Lösung in der Cloud betrieben werden, inklusive so sinnvoller Dinge wie geographischer Datenreplikation und Hochgeschwindigkeitszugang von jedem Kontinent dieses Planeten aus.

 

Vorteile auf einen Blick

Globaler Zugriff – Weltweiter high-speed Zugriff auf Unternehmensdaten – jederzeit!

Zuverlässig und vorhersehbar – Microsoft Azure ist die zuverlässige Plattform, für die wertvollen Daten unserer Industriekunden

Safe and Secure – Microsoft Azure sorgt nicht nur dafür, dass Daten mobil werden, sondern auch dafür, dass dies sicher und geschützt passiert.

 

Haben wir Ihr Interesse geweckt?

Helmut Guggenbichler, CEO & Sales Contact

+43 660 7080802

sales@augmensys.com

Sehen Sie mehr darüber hier.

augmensysubik_ar

 

Alexander Schmidt: ASP.NET Identity over REST – Screencast-Serie auf Youtube-Channel

Ein kurzes Wrap-Up meiner neuen Screencast-Serie zu ASP.NET Identity auf Youttube.

Golo Roden: Einführung in Node.js, Folge 15: Integrationstests schreiben

Unit-Tests überprüfen einzelne Funktionseinheiten isoliert, Integrationstests hingegen prüfen das Zusammenspiel verschiedener Komponenten im Verbund. Allerdings haben sie häufig auch externe Abhängigkeiten, beispielsweise auf das Dateisystem oder das Netzwerk. Wie lassen sich solche Tests in Node.js schreiben?

Code-Inside Blog: .NET CultureInfo in Windows 10

Did you know that the CultureInfo behavior with “unkown” cultures has changed with Windows 10?

I stumbled two times about this “problem” - so this is enough to write a short blogpost about it.

Demo Code

Lets use this democode:

    try
    {


        // ok on Win10, but not on pre Win10 if culture is not registred
        CultureInfo culture1 = new CultureInfo("foo");
        CultureInfo culture2 = new CultureInfo("xyz");
        CultureInfo culture3 = new CultureInfo("en-xy");

        // not ok even on Win 10 - exception
        CultureInfo culture4 = new CultureInfo("foox");

    }
    catch (Exception exc)
    {

    }

Windows 10 Case

If you run this code under Windows 10 it should fail for the “foox” culture, because it doesn’t seem to be a valid culture anyway.

“culture1”, “culture2”, “culture3” are all valid cultures in the Windows 10 world, but are resolved with Unkown Locale and LCID 4096.

I guess Windows will look for a 2 or 3 letter ISO style language, and “foox” doesn’t match this pattern.

Pre Windows 10 - e.g. running on Win Server 2012R2

If you would run the code unter Windows Server 2012 R2 it would fail on the first culture, because there is no “foo” culture registred.

“Problem”

The main “problem” is that this behavior could lead to some production issues if you develop with Windows 10 and the software is running on a Win 2012 server.

If you are managing “language” content in your application, be aware of this “limitation” on older Windows versions.

I discovered this problem while debugging our backend admin application. With this ASP.NET frontend it is possible to add or manage “localized” content and the dropdown for the possible language listed a whole bunch of very special, but “Unkown locale” cultures. So we needed to filter out all LCID 4096 cultures to ensure it would run under all Windows versions.

MSDN

This behavior is also documented on MSDN

The “Unkown culture” LCID 4096 was introduced with Windows Vista, but only with Windows 10 it will be “easy” usable within the .NET Framework.

Stefan Henneken: IEC 61131-3: Methods, Properties and Inheritance

Object-oriented programming (OOP) is a proven way of keeping the complexity of software systems in check. Until recently the preserve of languages such as C++, Java and C#, IEC 61131-3 introduces the concept to PLC programming.

Methods

Previously, a function block consisted of internal, input and output variables. There was only one opportunity to modify internal variables from outside the function block. Instances of the function block were called with the relevant input variables. Different sections within the function block would be executed depending on the value of these input variables, which in turn affected the value of internal variables. For example:

Start engine:

fbEngine(bStart := true, bStop := false, nGear := 1, fVelocity := 7.5);

Stop engine:

fbEngine(bStart := false, bStop := true);

Code within the function block listens for the values of bStart and bStop to switch from FALSE to TRUE. The function block user needs to know that bStart needs to be set to FALSE when stopping the engine. Failure to do so would mean that there would be no switch from FALSE to TRUE on attempting to restart the engine. The user also needs to know that they need to specify a value for the nGear parameter when starting the engine (but not when stopping it).

The OOP extensions introduce a clearer separation between internal variables and the ability to modify them. It is now possible to define additional sub-functions (methods) within a function block, which are available to be called by the user.

Picture01

Methods are comparable to actions, except that parameters can be passed to a method when it is called. Just like functions, methods can also contain local variables. Using methods, the above example can be realised thus:

Start engine:

fbEngine.Start(nGear := 1, fVelocity := 7.5);

Stop engine:

fbEngine.M_Stop();

The Start() and Stop() methods can access internal function block variables, but can also contain variables which can neither be modified from the outside nor be modified by other methods within the function block. This ensures that they cannot be inadvertently overwritten.

Methods can also include a return value, which is returned to the calling entity. If required, it is also possible to declare additional output variables between VAR_OUTPUT and END_VAR. Since TwinCAT 3, functions have also had this capability. Again since TwinCAT 3, it has also been possible to declare functions and methods with no return value.

Only FUNCTION_BLOCK and PROGRAM POUs can contain methods – this option is not available to FUNCTION POUs.

When calling a method, all parameters must be specified. Parameter names can be omitted if required:

fbEngine.Start(1, 7.5);

Where parameter names are used, parameters can be given in any order:

fbEngine.Start(fVelocity := 7.5, nGear := 1);

In the graphical languages, methods are depicted using a separate box:

Picture02

Some programming languages offer the ability to define multiple methods with the same name. Which method is executed is determined by the parameters specified when the method is called (signature). This is known as overloading. Currently, methods in IEC 61131-3 cannot be overloaded. It is not possible to differentiate between methods using signatures. Method names must be unique.

Access specifiers

The method declaration may include an optional access specifier. This restricts access to the method.

PUBLIC The method can be called by anyone – there are no restrictions.
PRIVATE The method is available from within the POU only. It cannot be called from outside the POU.
PROTECTED Only its own POU or POUs derived from it can access the method. Derivation is discussed below.
INTERNAL The method is accessible from within the same namespace only. This allows methods to be available from within a certain library only, for example.
FINAL The method cannot be overwritten by another method. Overwriting of methods is described below.

The default setting where no access specifier is defined is PUBLIC.

A method declaration therefore has the following structure:

METHOD <Access specifier> <Name> : <Datatype return value>

Properties

Previously, the only way of passing parameters was to call a function block with input variables. State information was returned to the calling entity via output variables. Properties offer a defined way of passing general parameters and state information outside of the function block call.

Properties are distinguished by the fact that access is via a pair of special methods. There is one method for writing and one for reading the property. These methods are designated setters (write) and getters (read). Together they are referred to as accessors. These accessor methods can also perform function such as range checking or unit conversion.

Setters and getters can contain local variables, but no additional inputs or outputs. On exiting the setter or getter method, the values of these local variables are, however, lost. In this respect they behave like functions. The setter therefore needs to provide an appropriate mechanism to ensure that the value of the property is preserved. This can, for example, be achieved by declaring a local variable in the function block.

FUNCTION_BLOCK PUBLIC FB_Engine
VAR
  myPropertyInternalValue : LREAL := 50;
END_VAR

The setter method assigns the value of the MyProperty property to the local variable.

myPropertyInternalValue := MyProperty;

The getter does the opposite and reassigns the value of the local variable to the property.

MyProperty := myPropertyInternalValue;

The local variable myPropertyInternalValue can be used within the function block for internal calculations. Access to this variable is exclusively via the MyProperty property.

Let us add three further properties to the above example, one to specify the maximum permissible velocity (MaxVelocity) and two more to output the current temperature (Temperature) and velocity (Velocity).

In the graphical languages, properties are not shown on the relevant box. To access a property, we use the name of the instance and of the property separated by a dot.

fbEngine(); 
bError := fbEngine.Temperature > 130;

Picture03

There does not have to be both a getter and a setter. In the absence of a setter, for example, the property will be read-only. In TwinCAT 3, the function block definition, including methods and properties, looks like this:

Picture04 

Access specifiers

As with methods, properties can also take the following access specifiers: PUBLIC, PRIVATE, PROTECTED, INTERNAL and FINAL. Where no access specifier is defined, the property is PUBLIC. In addition, an access specifier can also be specified for each setter and getter. This takes priority over the property’s own access specifier.

A property declaration therefore has the following structure:

PROPERTY <Access specifier> <Name> : <Datatype>

Inheritance

Function blocks are an excellent means of keeping program sections separate from each other. This improves software structure and significantly simplifies reuse. Previously, extending the functionality of an existing function block was always a delicate undertaking. This meant either modifying the code or programming a new function block around the existing block (i.e. the existing function block was effectively embedded within a new function block.) In the latter case, it was necessary to create all input variables anew and assign them to the input variables for the existing function block. The same was required, in the opposite direction, for output variables.

TwinCAT 3 introduces the concept of inheritance. Inheritance is one of the fundamental principles of object-oriented programming. Inheritance involves deriving a new function block from an existing function block. The new block can then be extended. To the extent permitted by the parent function block’s access specifiers, the new function block inherits all properties and methods from the parent function block. Each function block can have any number of child function blocks, but only one parent function block. Derivation of a function block occurs in the new function block declaration. The name of the new function block is followed by the keyword EXTENDS followed by the name of the parent function block. For example:

FUNCTION_BLOCK PUBLIC FB_NewEngine EXTENDS FB_Engine

The new, derived function block (FB_NewEngine) possesses all of the properties and methods of its parent (FB_Engine). Methods and properties are, however, only inherited where the access specifier permits.

The child function block also inherits all local variables, VAR_INPUT, VAR_OUTPUT, and VAR_IN_OUT from the parent function block. This behaviour cannot be modified using access specifiers.

If methods or properties in the parent function block have been declared as PROTECTED, the child function block (FB_NewEngine) is able to access them, but they cannot be accessed from outside FB_NewEngine.

Inheritance applies only to POUs of type FUNCTION_BLOCK.

Access specifiers

FUNCTION_BLOCK, FUNCTION or PROGRAM declarations can include an access specifier. This restricts access and, where applicable, the ability to inherit.

PUBLIC Anyone can call or create an instance of the POU. In addition, if the POU is a FUNCTION_BLOCK, it can be used for inheritance. No restrictions apply.
INTERNAL The POU can only be used within its own namespace. This allows POUs to be available from within a certain library only, for example.
FINAL The FUNCTION_BLOCK cannot serve as a parent function block. Methods and properties in this POU cannot be inherited. FINAL is only permissible for POUs of type FUNCTION_BLOCK.

The default setting where no access specifier is defined is PUBLIC. The access specifiers PRIVATE and PROTECTED are not permitted in POU declarations.

If you plan to utilise inheritance, the function block declaration will therefore have the following structure:

FUNCTION_BLOCK <Access specifier> <Name> EXTENDS <Name basis function block>

Overwriting methods

The new FUNCTION_BLOCK FB_NewEngine, which is derived from FB_Engine, can contain additional properties and methods. For example, we can add the property Gear. This property can be used to query and change the current gear. Getters and setters for this property need to be set up.

However, we also need to ensure that the nGear parameter from the Start() method is passed to this property. Because the parent function block FB_Engine does not have access to this new property, a new method with exactly the same parameters needs to be created in FB_NewEngine. We copy the existing code to the new method and add new code so that the nGear parameter is passed to the property Gear.

METHOD PUBLIC Start
VAR_INPUT
  nGear : INT := 2;
  fVelocity : LREAL := 8.0;
END_VAR 
 
IF (fVelocity < MaxVelocity) THEN
  velocityInternal := fVelocity;
ELSE
  velocityInternal := MaxVelocity;
END_IF
Gear := nGear; // new

Line 12 copies the nGear parameter to the Gear property.

Where a method or property which is already present in the parent function block is redefined within the child function block, this is referred to as overwriting. The function block FB_NewEngine overwrites the Start() method.

FB_NewEngine therefore has the new property Gear and overwrites the Start() method.

Picture05

fbNewEngine.Start(1, 7.5);

calls the Start() method in FB_NewEngine, since this method has been redefined (overwritten) in FB_NewEngine.

Whilst

fbNewEngine.Stop();

calls the Stop() method from FB_Engine. The Stop() method has been inherited by FB_NewEngine from FB_Engine.

Polymorphism

In addition to inheritance, another fundamental property of object-oriented programming is polymorphism (Greek for ‘having many forms’). This means that a variable can take different data types depending on how it is used. Previously, variables were always assigned a type. Polymorphism always occurs in the context of inheritance and interfaces.

We will illustrate polymorphism using the above example with inheritance. We create one instance each of FB_Engine and FB_NewEngine. A reference is assigned to these instances depending on a variable (bInput).

PROGRAM MAIN
VAR
  fbEngine     : FB_Engine;
  fbNewEngine  : FB_NewEngine;
  bInput       : BOOL;
  refEngine    : REFERENCE TO FB_Engine;
END_VAR
 
IF (bInput) THEN
  refEngine REF= fbEngine;
ELSE
  refEngine REF= fbNewEngine;
END_IF
refEngine.Start(2, 7.5);

A variable of type REFERENCE TO FB_Engine can take an instance of type FB_Engine (line 10), but can also take all function blocks which are derived from FB_Engine – including therefore FB_NewEngine (line 12).

Line 14 then calls the Start() method. It is not possible to determine from this line alone whether the Start() method from FB_Engine or from FB_NewEngine will be executed.

This ambiguity is frequently used in object-oriented programming to make programs more flexible and expandable. To this end, the parameters for a function may be defined as references to a function block. All FBs which are derived from this function block can then be passed to this function.

Interfaces are also important in this context and this is explored in my post IEC 61131-3: Object composition using interfaces.

SUPER pointer

In the above example, we created a new Start() method in FB_NewEngine and copied the existing code from FB_Engine into the new method. This is not always possible, and it also runs counter to the principle of reuse.

Consequently, every function block which is derived from another function block has access to a pointer called SUPER. This can be used to access elements (methods, properties, local variables, etc.) from the parent function block.

METHOD PUBLIC Start
VAR_INPUT
  nGear      : INT := 2;
  fVelocity  : LREAL := 8.0;
END_VAR 
 
SUPER^.Start(nGear, fVelocity); // calls Start() of FB_Engine
Gear := nGear;

Instead of copying code from the parent function block to the new method, the SUPER pointer can be used to call the method from the FB_Engine function block. This does away with the need to copy the code.

In the CFC editor, SUPER is called as follows:

Picture06

The SUPER pointer always has to be written in upper case.

THIS pointer

The THIS pointer is available to all function blocks and points to the current function block instance. This pointer is required whenever a method contains a local variable which obscures a variable in the function block.

An assignment statement within the method sets the value of the local variable. If we want the method to set the value of the local variable in the function block, we need to use the THIS pointer to access it.

nTest := 1; // changes the value of the local variable in the method
THIS^.nTest := 2; // changes the value of the variable in the function block

As with the SUPER pointer, the THIS pointer must likewise always be upper case.

Sample (TwinCAT 3.1.4020)

Effect of FINAL on performance

A method or POU declared with the access specifier FINAL is not able to act as a parent function block. All calls to its methods are direct. This has the effect that there is no longer any need for polymorphism. The compiler is able to take this into account during code generation and optimise the code accordingly. Depending on the application, this optimisation can have a significant effect at runtime. Here, an example:

A function block has two completely identical methods. The only difference is the access specifier. One method has been declared as PUBLIC, the other as FINAL. In a PLC task, first one and then a little later the other method is called.

IF (bSwitch) THEN
  FOR n := 1 TO 50000 DO
    fbTest.MethodFinal(0.534, 1.78, -2.43);
  END_FOR
ELSE
  FOR n := 1 TO 50000 DO
    fbTest.MethodPublic(0.534, 1.78, -2.43);
  END_FOR
END_IF

As we can see, the execution time changes significantly.

Picture07

If the method declared as FINAL is called 50,000 times, the running time for the PLC task on my test device is about 6.9 ms. This rises to about 7.5 ms for the method declared as PUBLIC.

Of course, our example program is rather abstract, as it does almost nothing but call the methods. Nonetheless, this is worth taking into account when selecting an access specifier.

UML diagrams

The inheritance hierarchy can be depicted diagrammatically. Unified Modelling Language (UML) is the established standard in this area. UML defines various diagram types which describe both the structure and behaviour of software.

A good tool for describing the function block inheritance hierarchy is the class diagram.

UML diagrams can be created directly in TwinCAT 3. Changes to the UML diagram have a direct effect on the POUs. Function blocks can thus be modified and amended via the UML diagram.

Picture08

Each box stands for one function block and is always divided into three horizontal sections. The top section shows the name of the function block, the middle section lists its properties and the lower section lists all its methods. In this example, the arrows show the direction of inheritance and always point towards the parent function block.


Norbert Eder: .NET Transaction: Timeout via Config setzen

Für Transaktionen im .NET Framework (siehe System.Transactions.Transaction) kann ein Timeout gesetzt werden. Programmatisch ist dies über die TransactionOptions und der dort angebotenen Eigenschaft Timeout möglich.

Allerdings ist auch eine Konfiguration des Timeouts möglich. Zu diesem Thema finden sich aber unterschiedliche Aussagen im Internet.

Das Default-Timeout einer Transaction liegt bei 10 Minuten. Kann die Transaktion innerhalb dieser Zeit nicht abgeschlossen werden, erfolgt ein Abbruch derselben.

Default-Timeout verändern

Das Default-Timeout kann für jede Anwendung in der app.config verändert werden. Dazu ist folgender Eintrag notwendig:

<system.transactions>
  <defaultSettings timeout="00:15:00"/>
</system.transactions>

Diese Einstellung erhöht das Default-Timeout auf 15 Minuten.

Wird ein Timeout programmatisch gesetzt, wird das konfigurierte Timeout überschrieben.

Es kann zwar ein beliebiges Default-Timeout gesetzt werden, allerdings gibt es auch ein maximales Timeout.

Maximales Transaction Timeout konfigurieren

An vielen Stellen wird die Konfiguration dieses Timeouts über die app.config gezeigt. Dies ist nicht richtig. Das maximale Timeout muss über die machine.config gesetzt werden. Diese liegt sowohl für 32bit als auch für 64bit Kompilate vor, daher rate ich zur Anpassung beider Dateien. Zu finden sind sie hier:

%windir%\Microsoft.NET\Framework\v4.0.30319\config\machine.config
%windir%\Microsoft.NET\Framework64\v4.0.30319\config\machine.config

Die neue Einstellung kann folgendermaßen gesetzt werden:

<system.transactions>
  <machineSettings maxTimeout="00:20:00"/>
</system.transactions>

Zu beachten ist, dass diese Einstellung die allerletzte innerhalb der machine.config sein muss (direkt vor ), da es sonst zu Problemen kommt und die Einstellung nicht verwendet wird.

Viel Erfolg!

The post .NET Transaction: Timeout via Config setzen appeared first on Norbert Eder.

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